<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-guo-pake-pha-tls-00" category="std" consensus="true" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="PAKE-based PHA for TLS 1.3">Post-Handshake Authentication via PAKE for TLS 1.3</title>
    <seriesInfo name="Internet-Draft" value="draft-guo-pake-pha-tls-00"/>
    <author initials="W." surname="Guo" fullname="Wei Guo">
      <organization>Huawei Technologies</organization>
      <address>
        <email>guowei90@huawei.com</email>
      </address>
    </author>
    <author initials="L." surname="Xia" fullname="Liang Xia">
      <organization>Huawei Technologies</organization>
      <address>
        <email>frank.xialiang@huawei.com</email>
      </address>
    </author>
    <author initials="J." surname="Li" fullname="Ji Li">
      <organization>Huawei Technologies</organization>
      <address>
        <email>liji100@huawei.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="21"/>
    <area>General</area>
    <workgroup>Internet Engineering Task Force</workgroup>
    <keyword>keyword1</keyword>
    <keyword>keyword2</keyword>
    <keyword>keyword3</keyword>
    <abstract>
      <?line 48?>

<t>This document provides a mechanism that uses password-authenticated key exchange (PAKE) as a post-handshake authentication for TLS 1.3, and that supports PAKE algorithms negotiation and optional channel binding.</t>
    </abstract>
  </front>
  <middle>
    <?line 52?>

<section anchor="intro">
      <name>Introduction</name>
      <!-- 
Note that there are already some early works about PAKE with TLS: {{I-D.draft-irtf-cfrg-opaque-17}}  {{RFC9383}}. -->

<t>In some cases, it is desirable to use PAKE-based post-handshake authentication over TLS channel to execute password authentication between a client and a server, because this does not need to change the current TLS 1.3 <xref target="RFC8446"/> protocol stack and can defend against password leakages caused by a potential man-in-the-middle (MITM) attack on the underlying TLS channel. This strategy is often called defense-in-depth, the security of application-layer password authentication is still guaranteed even if the security of the underlying TLS-layer is broken. Optionally, this post-handshake authentication can be binded to the underlying TLS channel in order to strength password authentication, where the PAKE-based authentication will fail if the underlying TLS channel is broken. In addition, this post-handshake authentication is able to hide the client's identity from the network if the underlying TLS channel is secure.</t>
      <t>Note that the post-handshake authentication via OPAQUE has been discussed in <xref target="I-D.draft-sullivan-tls-opaque-01"/>, which utilizes the mechanism of Exported Authenticators in TLS 1.3 <xref target="RFC9261"/>. However, this mechanism is only applicable to these PAKE protocols, such as OPAQUE, where both the client and server own their long-term secret/public keys. This document provides a mechanism that uses PAKE as a post-handshake authentication for TLS 1.3 (called PAKE-based PHA for TLS 1.3) to achieve application-layer password authentication, which does not require two parties of PAKE protocols to possess long-term key pairs and supports PAKE algorithms negotiation and optional channel binding.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document uses terminology such as client, server, handshake and peer that are defined in <xref section="1.1" sectionFormat="of" target="RFC8446"/>.</t>
    </section>
    <section anchor="tls_pake_pha">
      <name>Post-Handshake Authentication via PAKE for TLS 1.3</name>
      <t>This section describes details of PAKE-based post-handshake authentication for TLS 1.3.</t>
      <section anchor="pake_handshake_messages">
        <name>PAKE Handshake Messages</name>
        <t>To use PAKE as an application-layer password authentication over TLS 1.3 <xref target="RFC8446"/>, we define PAKEHandshake messages which are used to negotiate PAKE algorithms and key exchange parameters and to complete PAKE-based authentication. The expected order of PAKE handshake messages is: PAKEClientHello, PAKEHelloRetryRequest, PAKEClientHello, PAKEServerHello, server PAKEFinished, client PAKEFinished.</t>
        <artwork><![CDATA[
  enum {
      pake_client_hello (0),
      pake_server_hello (1),
      pake_hello_retry_request (2),
      pake_finished (3),
      pake_status (4),
      pake_message_hash (254),
      (255)
  } PAKEHandshakeType;
]]></artwork>
        <artwork><![CDATA[
  struct {
      PAKEHandshakeType msg_type;           /* PAKE message type */
      uint24 length;                        /* bytes in message */
      select (PAKEHandshake.msg_type) {
          case pake_client_hello:           PAKEClientHello;
          case pake_server_hello:           PAKEServerHello;
          case pake_hello_retry_request:    PAKEHelloRetryRequest;
          case pake_finished:               PAKEFinished;
          case pake_status:                 PAKEStatus;
    };
  } PAKEHandshake;
]]></artwork>
        <t>pake_client_hello: The PAKEClientHello message is used by the client to send its supported PAKE algorithm suites and PAKE shares for selected algorithm suites to the server.</t>
        <t>pake_server_hello: The PAKEServerHello message is used by the server to send its PAKE share for the negotiated algorithm suite to the client.</t>
        <t>pake_hello_retry_request: If the server does not support PAKE algorithm suites selected by the client in the PAKEClientHello message but supports other PAKE algorithm suites listed by the client, the server <bcp14>MUST</bcp14> use the PAKEHelloRetryRequest message to send a PAKE algorithm suite that is supported by both parties to the client.</t>
        <t>pake_finished: The PAKEFinished message is used by the client or server to send a message authentication code (MAC) to its peer for identity authentication, key confirmation, and handshake integrity.</t>
        <t>pake_status: The PAKEStatus message is used by the client or server to send the execution status of the PAKE protocol to its peer, indicating whether the PAKE protocol has been successfully executed.</t>
        <t>pake_message_hash: When the server responds to a PAKEClientHello message with a PAKEHelloRetryRequest message, the value of the PAKEClientHello1 message is replaced with a specific synthetic handshake message of handshake type "pake_message_hash" containing Hash(PAKEClientHello1).</t>
        <section anchor="pake-client-hello">
          <name>PAKE Client Hello</name>
          <t>Structure of the PAKEClientHello message is defined as follows:</t>
          <artwork><![CDATA[
  struct {
      PAKEAlgorithm supported_pake_algorithms<2..2^16-1>;
      opaque client_identity<0..2^16-1>;
      PAKEShareEntry client_shares<0..2^16-1>;
      PAKEExtension pake_extensions<0..2^16-1>;
  } PAKEClientHello;
]]></artwork>
          <t>supported_pake_algorithms: A list of all PAKE algorithm suites supported by the client. The structure of PAKEAlgorithm is defined in <xref section="3.1.1" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-00"/>, where the second bytes "0x00~0x7F" can be used to represent ciphersuites without channel binding and the second bytes "0x80~0xFF" can be used to represent ciphersuites with channel binding.</t>
          <!-- session_identifier: For the CPace algorithm, it represents an unique byte string of session identifier randomly generated by the initiator (e.g., the client); for the SPAKE2 algorithm, this byte string is empty, and the server MUST ignore it. The length of this byte string is RECOMMENDED at least 16 bytes. -->

<t>client_identity: A client's identity used in the PAKE algorithm.</t>
          <t>client_shares: A list of offered PAKEShareEntry values in descending order of client preference. The structure of PAKEShareEntry is defined in <xref section="3.1.2" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-00"/>.</t>
          <t>pake_extensions: A list of PAKE extensions allowed in the PAKEClientHello message. The structure of PAKEExtension and three PAKE extension types are defined in the fourth part of <xref section="3.1.2" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-00"/>. The "session_identifier" extension <bcp14>SHOULD</bcp14> only be presented in this message when the CPace algorithm is selected and the CPace's first message is sent by the client, and <bcp14>MUST NOT</bcp14> be used in other cases. The "nonce" extension <bcp14>SHOULD</bcp14> only be presented in this message when the OPAQUE algorithm is selected, and <bcp14>MUST NOT</bcp14> be used with other PAKE algorithms that don't need it. The "pake_extension_data" fields of these two extensions are given in the fourth part of <xref section="3.1.2" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-00"/>.</t>
        </section>
        <section anchor="pake-server-hello">
          <name>PAKE Server Hello</name>
          <t>Structure of the PAKEServerHello message is defined as follows:</t>
          <artwork><![CDATA[
  struct {
      opaque server_identity<0..2^16-1>;
      PAKEShareEntry server_share;
      PAKEExtension pake_extensions<0..2^16-1>;
  } PAKEServerHello;
]]></artwork>
          <t>server_identity: A server's identity used in the PAKE algorithm.</t>
          <t>server_share: A single PAKEShareEntry value that is in the same PAKE algorithm suite as one of the client’s shares. The structure of PAKEShareEntry is defined in <xref section="3.1.2" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-00"/>.</t>
          <t>pake_extensions: A list of PAKE extensions allowed in the PAKEServerHello message. The structure of PAKEExtension and three PAKE extension types are defined in the fourth part of <xref section="3.1.2" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-00"/>. The "session_identifier" extension <bcp14>SHOULD</bcp14> only be presented in this message when the CPace algorithm is selected and the CPace's first message is sent by the server, and <bcp14>MUST NOT</bcp14> be used in other cases. The "nonce" extension <bcp14>SHOULD</bcp14> only be presented in this message when the OPAQUE algorithm is selected, and <bcp14>MUST NOT</bcp14> be used with other PAKE algorithms that don't need it. The "credential_response" extension <bcp14>SHOULD</bcp14> only be presented in this message when the OPAQUE algorithm is negotiated, and <bcp14>MUST NOT</bcp14> be used with other PAKE algorithms that don't need it. The "pake_extension_data" fields of these three extensions are given in the fourth part of <xref section="3.1.2" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-00"/>.</t>
        </section>
        <section anchor="pake-hello-retry-request">
          <name>PAKE Hello Retry Request</name>
          <t>Structure of the PAKEHelloRetryRequest message is defined as follows:</t>
          <artwork><![CDATA[
  struct {
      PAKEAlgorithm selected_pake_algorithm;
  } PAKEHelloRetryRequest;
]]></artwork>
          <t>selected_pake_algorithm: A PAKE algorithm suite selected by the server to correct mismatch algorithm suites with the client.</t>
        </section>
        <section anchor="pake-finished">
          <name>PAKE Finished</name>
          <t>Structure of the PAKEFinished message is defined as follows:</t>
          <artwork><![CDATA[
  struct {
      opaque pake_verify_data[Hash.length];
  } PAKEFinished;
]]></artwork>
          <t>pake_verify_data: A MAC value calculated by the client or server to provide to its peer for identity authentication, key confirmation and handshake integrity, and more details about this calculation will be given in <xref target="pake_based_pha"/>. Hash is the hash algorithm negotiated in the PAKE algorithm suite, and Hash.length is its output length in bytes.</t>
        </section>
        <section anchor="pake-status">
          <name>PAKE Status</name>
          <t>Structure of the PAKEStatus message is defined as follows:</t>
          <artwork><![CDATA[
  enum {
      pake_success_notify (0)
      pake_unexpected_message (1),
      pake_handshake_failure (2), 
      pake_illegal_parameter (3),
      pake_decode_error (4), 
      pake_decrypt_error (5), 
      pake_insufficient_security (6), 
      pake_internal_error (7),
      (255)
  } PAKEStatusDescription;
]]></artwork>
          <artwork><![CDATA[
  struct {
      PAKEStatusDescription description;
  } PAKEStatus;
]]></artwork>
          <t>pake_success_notify: This status notifies the client of the successful validation of its PAKEFinished message.</t>
          <t>pake_unexpected_message: An inappropriate message (e.g., the wrong PAKE handshake message, etc.) was received. A peer which receives a PAKE handshake message in an unexpected order <bcp14>MUST</bcp14> abort the handshake with an "pake_unexpected_message" alert. This alert should never be observed in communication between proper implementations.</t>
          <t>pake_handshake_failure: Receipt of a "pake_handshake_failure" alert message indicates that the sender was unable to negotiate an acceptable PAKE algorithm suite given the options available.</t>
          <t>pake_illegal_parameter: A field in the PAKE handshake was incorrect or inconsistent with other fields. This alert is used for errors which conform to the formal protocol syntax but are otherwise incorrect.</t>
          <t>pake_decode_error: A message could not be decoded because some field was out of the specified range or the length of the message was incorrect. This alert is used for errors where the message does not conform to the formal protocol syntax. This alert should never be observed in communication between proper implementations, except when messages were corrupted in the network.</t>
          <t>pake_decrypt_error: A PAKE handshake cryptographic operation failed, including being unable to correctly verify a PAKEFinished message.</t>
          <t>pake_insufficient_security: Returned instead of "pake_handshake_failure" when a negotiation has failed specifically because the server requires PAKE parameters more secure than those supported by the client.</t>
          <t>pake_internal_error: An internal error unrelated to the peer or the correctness of the protocol (such as a memory allocation failure) makes it impossible to continue.</t>
        </section>
      </section>
      <section anchor="channel-binding-value-derivation">
        <name>Channel Binding Value Derivation</name>
        <t>Assume that a TLS channel has been established between a client and a server, from which both parties can derive a unique secret that we call a channel binding value (CBV) in this document. Recall that a "tls-exporter" channel binding type for TLS 1.3 has been defined in <xref target="RFC9266"/>. According to this type, a CBV is computed as follows if they hope channel binding for PAKE-based authentication.</t>
        <artwork><![CDATA[
CBV = HKDF-Expand-Label(Derive-Secret(Secret, label, ""), "exporter", Hash(context_value), key_length)
]]></artwork>
        <t>Where Secret is the "exporter_master_secret" value in TLS 1.3 key schedule (see <xref section="7.1" sectionFormat="of" target="RFC8446"/>), the label is the ASCII string "EXPORTER-Channel-Binding", the context_value is a zero-length string, the key_length is 32 bytes. The functions HKDF-Expand-Label and Derive-Secret were defined in <xref section="7.1" sectionFormat="of" target="RFC8446"/>.</t>
      </section>
      <section anchor="pake_based_pha">
        <name>PAKE-based Post-Handshake Authentication</name>
        <t>After the TLS channel is established, if there is no MITM attack, the client and server can derive a same CBV. If the channel binding is selected, then the CBV will be used as another secret input to PAKE algorithms except for the password and thus take effect on the PAKE authentication process. If there is a MITM attack during the TLS channel establishment, that is, the client establishes a TLS channel A with the MITM attacker and the MITM attacker establishes a TLS channel B with the server, then the client and server will derive two different CBVs respectively. Therefore, when the client and server execute the PAKE protocol with these inconsistent CBVs, both parties will not be able to derive a same session key and can not pass the PAKE authentication successfully.</t>
        <!-- ### CPace over TLS 1.3

In the CPace protocol {{I-D.draft-irtf-cfrg-cpace-13}}, a password-related string (PRS) is shared between a client and a server in advance. PRS can be a low-entropy secret itself, or any string derived from the secret by use of a password-based key derivation function. CPace offers some OPTIONAL inputs: channel identifier (CI) and session identifer (sid). CI can be used to bind a session key exchanged with CPace to a specific networking channel which interconnects the protocol parties, and sid is an unique session identifier for the CPace protocol. In this document, CI is set to the above CBV, and sid is randomly chosen by the initiator (e,g., the client) and sent to the responder (e,g., the server) together with the first CPace message.

In the CPace protocol {{I-D.draft-irtf-cfrg-cpace-13}}, G denotes an elliptic curve group and H denotes a hash function. In this document we use multiplicative notation for the group operation.  -->

<t>The protocol of PAKE-based post-handshake authentication for TLS 1.3 is described as follows.</t>
        <t>(1) When PAKE-based post-handshake authentication for TLS 1.3 needs to be performed, it is <bcp14>REQUIRED</bcp14> to send the PAKEClientHello as a first PAKE handshake message. The client sets the "supported_pake_algorithms" field to a list of its supported PAKE algorithm suites, sets the "client_identity" field to its identity used to authenticate, constructs the "client_shares" field by selecting its perferred PAKE algorithm suites and computing their corresponding PAKE shares, and uses the "pake_extensions" field to optionally send extended data to the server. The computation of PAKE shares <bcp14>SHOULD</bcp14> conform to the specification of the selected PAKE algorithms, with one exception that if the channel binding is selected the CBV <bcp14>SHOULD</bcp14> be additionally used to derive a password-based group generator or password-based secrets or an initial keying material (see Exception 1 for more details). Similar to TLS 1.3, the client <bcp14>MAY</bcp14> provide a single share or multiple shares in the "client_shares" field. The client then sends the PAKEClientHello message to the server.</t>
        <t>(2) After receiving the PAKEClientHello message, the server first parses it to obtain "supported_pake_algorithms", "client_identity", "client_shares" and "pake_extensions" fields, uses the "client_identity" value to search a match password or password file, and negotiates a PAKE algorithm suite based on the "pake_algorithm" values included in the "client_shares" field. The server then sets the "server_identity" field to its identity (e.g., its host name), constructs the "server_share" field by setting the negotiated PAKE algorithm suite and computing its corresponding PAKE share by the same way as the client side, and uses the "pake_extensions" field to optionally send extended data to the client. Based on the received client's share and the PAKE extensions as well as its own secret, the server first derives a PAKE shared secret, and then derives a session key and a MAC key mac_key. This derivation process <bcp14>SHOULD</bcp14> conform to the specification of the negotiated PAKE algorithm, with one exception that the original transcript used to derive these keys <bcp14>SHOULD</bcp14> be replaced with the transcript PAKEClientHello || PAKEServerHello (see Exception 2 for more details). Finally, the server computes its "pake_verify_data" value as follows, and sends PAKEServerHello and server PAKEFinished messages to the client.</t>
        <artwork><![CDATA[
server_pake_verify_data = HMAC(mac_key, Hash(PAKEClientHello || PAKEServerHello))
]]></artwork>
        <t>(3) After receiving the PAKEServerHello and server PAKEFinished messages, the client first parses the former to obtain the "server_identity", "server_share" and "pake_extensions" fields, and parses the later to obtain the "pake_verify_data" field. Based on the received server's share and the PAKE extensions as well as its own secret, the client derives a PAKE shared secret, and then derives a session key and a MAC key mac_key using the same way as the server side. The client then authenticates the server by verifying the server "pake_verify_data" value. If this verification succeeds, the client computes its "pake_verify_data" value as follows, and sends the client PAKEFinished message to the server.</t>
        <artwork><![CDATA[
client_pake_verify_data = HMAC(mac_key, Hash(PAKEClientHello || PAKEServerHello || server PAKEFinished))
]]></artwork>
        <t>Otherwise, the client sends a PAKEStatus message with a "pake_decrypt_error" alert to the server.</t>
        <t>(4) After receiving the client PAKEFinished message, the server first parses it to obtain the "pake_verify_data" field, then authenticates the client by verifying the client "pake_verify_data" value. If this verification succeeds, the server sends a PAKEStatus message with a "pake_success_notify" status to the client, otherwise sends a PAKEStatus message with a "pake_decrypt_error" alert to the client.</t>
        <t>If the client has not provided a sufficient "client_shares" field (e.g., it includes only PAKE algorithm suites unacceptable to or unsupported by the server) in the first PAKEClientHello message, the server corrects the mismatch with a PAKEHelloRetryRequest message which contains a "selected_pake_algorithm" field, and the client needs to restart the handshake with a second PAKEClientHello message which <bcp14>MUST</bcp14> contain an appropriate "client_shares" field. In this case, the computation method of "pake_verify_data" values is changed as follows, where the "pake_message_hash" value represents 1 byte 0xFE as defined in <xref target="pake_handshake_messages"/>, and Hash.length is the output length of the negotiated hash algorithm in bytes.</t>
        <artwork><![CDATA[
server_pake_verify_data = HMAC(mac_key, Hash(pake_message_hash || 00 00 Hash.length || Hash(PAKEClientHello1) || PAKEHelloRetryRequest || PAKEClientHello2 || PAKEServerHello))
]]></artwork>
        <artwork><![CDATA[
client_pake_verify_data = HMAC(mac_key, Hash(pake_message_hash || 00 00 Hash.length || Hash(PAKEClientHello1) || PAKEHelloRetryRequest || PAKEClientHello2 || PAKEServerHello || server PAKEFinished))
]]></artwork>
        <t>If no common PAKE parameters can be negotiated, the server <bcp14>MUST</bcp14> abort the handshake with either a "pake_handshake_failure" or "pake_insufficient_security" alert.</t>
        <t>Exception 1: The CBV <bcp14>SHOULD</bcp14> be additionally used to derive a password-based group generator or password-based secrets or an initial keying material. For CPace (see <xref section="6.2" sectionFormat="of" target="I-D.draft-irtf-cfrg-cpace-13"/>), the password-based group generator <bcp14>SHOULD</bcp14> be derived by g = G.calculate_generator(H, PRS, CI, sid, CBV). For SPAKE2 (see Section 3.2 of <xref target="RFC9382"/>), the password-based secret <bcp14>SHOULD</bcp14> be derived by w = MHF(pw || CBV) mod p. For OPAQUE (see Sections <xref target="I-D.draft-irtf-cfrg-opaque-17" section="6.4.3" sectionFormat="bare"/> and <xref target="I-D.draft-irtf-cfrg-opaque-17" section="6.4.4" sectionFormat="bare"/> of <xref target="I-D.draft-irtf-cfrg-opaque-17"/>), the initial keying material <bcp14>SHOULD</bcp14> be given by ikm = concat(dh1, dh2, dh3, CBV). For SPAKE2+ (see <xref section="3.2" sectionFormat="of" target="RFC9383"/>), the password-based secrets <bcp14>SHOULD</bcp14> be derived by w0s || w1s = PBKDF(len(pw) || pw || len(idProver) || idProver || len(idVerifier) || idVerifier || len(CBV) || CBV).</t>
        <t>Exception 2: The transcript(Ya, ADa, Yb, ADb) used to derive ISK in CPace (see <xref section="6.2" sectionFormat="of" target="I-D.draft-irtf-cfrg-cpace-13"/>), the len(A) || A || len(B) || B || len(pA) || pA || len(pB) || pB used to derive Ke and Ka in SPAKE2 (see Section 4 of <xref target="RFC9382"/>), the concat(I2OSP(len(client_identity), 2), client_identity, ke1, I2OSP(len(server_identity), 2), server_identity, credential_response, server_nonce, server_public_keyshare) used to derive handshake_secret and session_key in OPAQUE (see <xref section="6.4.2.1" sectionFormat="of" target="I-D.draft-irtf-cfrg-opaque-17"/>), the len(idProver) || idProver || len(idVerifier) || idVerifier || len(shareP) || shareP || len(shareV) || shareV used to derive K_main in SPAKE2+ (see <xref section="3.4" sectionFormat="of" target="RFC9383"/>), all <bcp14>SHOULD</bcp14> be replaced with the transcript PAKEClientHello || PAKEServerHello. In case of the PAKEHelloRetryRequest message, these transcripts <bcp14>SHOULD</bcp14> be replaced with the transcript pake_message_hash || 00 00 Hash.length || Hash(PAKEClientHello1) || PAKEHelloRetryRequest || PAKEClientHello2 || PAKEServerHello.</t>
        <!-- {{Section 3.2 of RFC9382}} {{Section 4 of RFC9382}} -->

<!-- # Security Considerations

This document does not introduce any new security considerations. -->

<!-- # IANA Considerations

This document has no IANA actions. -->

</section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9383">
          <front>
            <title>SPAKE2+, an Augmented Password-Authenticated Key Exchange (PAKE) Protocol</title>
            <author fullname="T. Taubert" initials="T." surname="Taubert"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes SPAKE2+, a Password-Authenticated Key Exchange (PAKE) protocol run between two parties for deriving a strong shared key with no risk of disclosing the password. SPAKE2+ is an augmented PAKE protocol, as only one party has knowledge of the password. This method is simple to implement, compatible with any prime-order group, and computationally efficient.</t>
              <t>This document was produced outside of the IETF and IRTF and represents the opinions of the authors. Publication of this document as an RFC in the Independent Submissions Stream does not imply endorsement of SPAKE2+ by the IETF or IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9383"/>
          <seriesInfo name="DOI" value="10.17487/RFC9383"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9261">
          <front>
            <title>Exported Authenticators in TLS</title>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>This document describes a mechanism that builds on Transport Layer Security (TLS) or Datagram Transport Layer Security (DTLS) and enables peers to provide proof of ownership of an identity, such as an X.509 certificate. This proof can be exported by one peer, transmitted out of band to the other peer, and verified by the receiving peer.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9261"/>
          <seriesInfo name="DOI" value="10.17487/RFC9261"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9266">
          <front>
            <title>Channel Bindings for TLS 1.3</title>
            <author fullname="S. Whited" initials="S." surname="Whited"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>This document defines a channel binding type, tls-exporter, that is compatible with TLS 1.3 in accordance with RFC 5056, "On the Use of Channel Bindings to Secure Channels". Furthermore, it updates the default channel binding to the new binding for versions of TLS greater than 1.2. This document updates RFCs 5801, 5802, 5929, and 7677.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9266"/>
          <seriesInfo name="DOI" value="10.17487/RFC9266"/>
        </reference>
        <reference anchor="RFC9382">
          <front>
            <title>SPAKE2, a Password-Authenticated Key Exchange</title>
            <author fullname="W. Ladd" initials="W." surname="Ladd"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes SPAKE2, which is a protocol for two parties that share a password to derive a strong shared key without disclosing the password. This method is compatible with any group, is computationally efficient, and has a security proof. This document predated the Crypto Forum Research Group (CFRG) password-authenticated key exchange (PAKE) competition, and it was not selected; however, given existing use of variants in Kerberos and other applications, it was felt that publication was beneficial. Applications that need a symmetric PAKE, but are unable to hash onto an elliptic curve at execution time, can use SPAKE2. This document is a product of the Crypto Forum Research Group in the Internet Research Task Force (IRTF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9382"/>
          <seriesInfo name="DOI" value="10.17487/RFC9382"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.draft-irtf-cfrg-opaque-17">
          <front>
            <title>The OPAQUE Augmented PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>AWS</organization>
            </author>
            <author fullname="Kevin Lewi" initials="K." surname="Lewi">
              <organization>Meta</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="27" month="September" year="2024"/>
            <abstract>
              <t>   This document describes the OPAQUE protocol, an augmented (or
   asymmetric) password-authenticated key exchange (aPAKE) that supports
   mutual authentication in a client-server setting without reliance on
   PKI and with security against pre-computation attacks upon server
   compromise.  In addition, the protocol provides forward secrecy and
   the ability to hide the password from the server, even during
   password registration.  This document specifies the core OPAQUE
   protocol and one instantiation based on 3DH.  This document is a
   product of the Crypto Forum Research Group (CFRG) in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-17"/>
        </reference>
        <reference anchor="I-D.draft-sullivan-tls-opaque-01">
          <front>
            <title>OPAQUE with TLS 1.3</title>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>IBM Research</organization>
            </author>
            <author fullname="Owen Friel" initials="O." surname="Friel">
              <organization>Cisco</organization>
            </author>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <date day="22" month="February" year="2021"/>
            <abstract>
              <t>   This document describes two mechanisms for enabling the use of the
   OPAQUE password-authenticated key exchange in TLS 1.3.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-sullivan-tls-opaque-01"/>
        </reference>
        <reference anchor="I-D.draft-guo-pake-in-tls-00">
          <front>
            <title>PAKE Usage in TLS 1.3</title>
            <author fullname="Wei Guo" initials="W." surname="Guo">
              <organization>Huawei Technologies</organization>
            </author>
            <author fullname="Liang Xia" initials="L." surname="Xia">
              <organization>Huawei Technologies</organization>
            </author>
            <author fullname="Ji Li" initials="J." surname="Li">
              <organization>Huawei Technologies</organization>
            </author>
            <date day="29" month="September" year="2024"/>
            <abstract>
              <t>   This document provides a mechanism that uses password-authenticated
   key exchange (PAKE) as an authentication and key establishment in TLS
   1.3, and that supports PAKE algorithms negotiation.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-guo-pake-in-tls-00"/>
        </reference>
        <reference anchor="I-D.draft-irtf-cfrg-cpace-13">
          <front>
            <title>CPace, a balanced composable PAKE</title>
            <author fullname="Michel Abdalla" initials="M." surname="Abdalla">
              <organization>Nexus - San Francisco</organization>
            </author>
            <author fullname="Björn Haase" initials="B." surname="Haase">
              <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
            </author>
            <author fullname="Julia Hesse" initials="J." surname="Hesse">
              <organization>IBM Research Europe - Zurich</organization>
            </author>
            <date day="14" month="October" year="2024"/>
            <abstract>
              <t>   This document describes CPace which is a protocol that allows two
   parties that share a low-entropy secret (password) to derive a strong
   shared key without disclosing the secret to offline dictionary
   attacks.  The CPace protocol was tailored for constrained devices and
   can be used on groups of prime- and non-prime order.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-13"/>
        </reference>
      </references>
    </references>
    <?line 305?>

<!-- # Acknowledgements
{:numbered="false"}

The authors would like to thank... -->

<section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <t>Yong Li <br/>
  Huawei Technologies <br/>
  Yong.Li1@huawei.com</t>
      <t>Hui Ye <br/>
  Huawei Technologies <br/>
  yehui.ustc@huawei.com</t>
      <t>Feng Geng <br/>
  Huawei Technologies <br/>
  gengfeng@huawei.com</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
8eIOABBvLOam+uu7/wO0zdqoUFoAAA==

-->

</rfc>
