<?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.23 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-guo-pake-pha-tls-01" category="std" consensus="true" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.27.0 -->
  <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-01"/>
    <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="2025" month="February" day="25"/>
    <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-18}}  {{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 <xref target="I-D.draft-irtf-cfrg-opaque-18"/>, 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. In this document, four PAKE algorithms are considered: CPace <xref target="I-D.draft-irtf-cfrg-cpace-13"/>, SPAKE2 <xref target="RFC9382"/>, OPAQUE <xref target="I-D.draft-irtf-cfrg-opaque-18"/> and SPAKE2+ <xref target="RFC9383"/>. The former two are symmetric PAKE algorithms and the latter two are asymmetric PAKE algorithms.</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: <tt>PAKEClientHello</tt>, <tt>PAKEHelloRetryRequest</tt>, <tt>PAKEClientHello</tt>, <tt>PAKEServerHello</tt>, server <tt>PAKEFinished</tt>, client <tt>PAKEFinished</tt>.</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><tt>pake_client_hello</tt>: The <tt>PAKEClientHello</tt> 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><tt>pake_server_hello</tt>: The <tt>PAKEServerHello</tt> message is used by the server to send its PAKE share for the negotiated algorithm suite to the client.</t>
        <t><tt>pake_hello_retry_request</tt>: If the server does not support PAKE algorithm suites selected by the client in the <tt>PAKEClientHello</tt> message but supports other PAKE algorithm suites listed by the client, the server <bcp14>MUST</bcp14> use the <tt>PAKEHelloRetryRequest</tt> message to send a PAKE algorithm suite that is supported by both parties to the client.</t>
        <t><tt>pake_finished</tt>: The <tt>PAKEFinished</tt> 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><tt>pake_status</tt>: The <tt>PAKEStatus</tt> 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><tt>pake_message_hash</tt>: When the server responds to a <tt>PAKEClientHello</tt> message with a <tt>PAKEHelloRetryRequest</tt> message, the value of the <tt>PAKEClientHello1</tt> message is replaced with a specific synthetic handshake message of handshake type "pake_message_hash" containing <tt>Hash(PAKEClientHello1)</tt>.</t>
        <section anchor="pake_client_hello">
          <name>PAKE Client Hello</name>
          <t>Structure of the <tt>PAKEClientHello</tt> 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>;
  } PAKEClientHello;
]]></artwork>
          <ul spacing="normal">
            <li>
              <t><tt>supported_pake_algorithms</tt>: A list of all PAKE algorithm suites supported by the client. The structure of <tt>PAKEAlgorithm</tt> is defined in <xref section="3.1.1" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-01"/>, 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>
            </li>
          </ul>
          <!-- 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. -->

<ul spacing="normal">
            <li>
              <t><tt>client_identity</tt>: A client's identity used in the PAKE algorithm.</t>
            </li>
            <li>
              <t><tt>client_shares</tt>: A list of offered <tt>PAKEShareEntry</tt> values in descending order of client preference. The structure of <tt>PAKEShareEntry</tt> is defined in <xref section="3.1.2" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-01"/>.</t>
            </li>
          </ul>
          <t>Note that the concatenation of the "random" value of the ClientHello message (see <xref section="4.1.2" sectionFormat="of" target="RFC8446"/>) and the "random" value of the ServerHello message (see <xref section="4.1.3" sectionFormat="of" target="RFC8446"/>) can be used as a unique session identifier <tt>sid</tt> of the CPace algorithm (see <xref section="3.1" sectionFormat="of" target="I-D.draft-irtf-cfrg-cpace-13"/>).</t>
        </section>
        <section anchor="pake-server-hello">
          <name>PAKE Server Hello</name>
          <t>Structure of the <tt>PAKEServerHello</tt> message is defined as follows:</t>
          <artwork><![CDATA[
  struct {
      opaque server_identity<0..2^16-1>;
      PAKEShareEntry server_share;
  } PAKEServerHello;
]]></artwork>
          <ul spacing="normal">
            <li>
              <t><tt>server_identity</tt>: A server's identity used in the PAKE algorithm.</t>
            </li>
            <li>
              <t><tt>server_share</tt>: A single <tt>PAKEShareEntry</tt> value that is in the same PAKE algorithm suite as one of the client’s shares. The structure of <tt>PAKEShareEntry</tt> is defined in <xref section="3.1.2" sectionFormat="of" target="I-D.draft-guo-pake-in-tls-01"/>.</t>
            </li>
          </ul>
        </section>
        <section anchor="pake-hello-retry-request">
          <name>PAKE Hello Retry Request</name>
          <t>Structure of the <tt>PAKEHelloRetryRequest</tt> message is defined as follows:</t>
          <artwork><![CDATA[
  struct {
      PAKEAlgorithm selected_pake_algorithm;
  } PAKEHelloRetryRequest;
]]></artwork>
          <ul spacing="normal">
            <li>
              <t><tt>selected_pake_algorithm</tt>: A PAKE algorithm suite selected by the server to correct mismatch algorithm suites with the client.</t>
            </li>
          </ul>
        </section>
        <section anchor="pake_finished">
          <name>PAKE Finished</name>
          <t>Structure of the <tt>PAKEFinished</tt> message is defined as follows:</t>
          <artwork><![CDATA[
  struct {
      opaque pake_verify_data[MAC.length];
  } PAKEFinished;
]]></artwork>
          <ul spacing="normal">
            <li>
              <t><tt>pake_verify_data</tt>: 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"/>. <tt>MAC</tt> is the MAC function negotiated in the PAKE algorithm suite, and <tt>MAC.length</tt> is its output length in bytes.</t>
            </li>
          </ul>
        </section>
        <section anchor="pake-status">
          <name>PAKE Status</name>
          <t>Structure of the <tt>PAKEStatus</tt> 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><tt>pake_success_notify</tt>: This status notifies the client of the successful validation of its PAKEFinished message.</t>
          <t><tt>pake_unexpected_message</tt>: 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><tt>pake_handshake_failure</tt>: 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><tt>pake_illegal_parameter</tt>: 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><tt>pake_decode_error</tt>: 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><tt>pake_decrypt_error</tt>: A PAKE handshake cryptographic operation failed, including being unable to correctly verify a <tt>PAKEFinished</tt> message.</t>
          <t><tt>pake_insufficient_security</tt>: 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><tt>pake_internal_error</tt>: 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">
        <name>Channel Binding</name>
        <t>This document defines two types for channel binding, which can be distinguished by the second byte of PAKE algorithm suites (see <xref target="pake_client_hello"/>). The meaning of the types and the corresponding <tt>channel_binding_secret</tt> are described as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The "without_channel_binding" type means that no channel binding is used in the PAKE-based authentication, then the <tt>channel_binding_secret</tt> is a 0-byte value.</t>
          </li>
          <li>
            <t>The "with_channel_binding" type means that a channel binding is used in the PAKE-based authentication, then the <tt>channel_binding_secret</tt> is a 32-byte value. The computation of this secret is defined in <xref section="7.5" sectionFormat="of" target="RFC8446"/> for TLS 1.3, and the corresponding inputs are defined in <xref section="2" sectionFormat="of" target="RFC9266"/>.</t>
          </li>
        </ul>
        <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 secret in this document. According to the channel binding type of "tls-exporter" defined in <xref target="RFC9266"/>, the channel binding secret is computed as follows.</t>
        <artwork><![CDATA[
channel_binding_secret = HKDF-Expand-Label(Derive-Secret(Secret, label, ""), "exporter", Hash(context_value), key_length)
]]></artwork>
        <t>Where <tt>Secret</tt> is the "exporter_master_secret" value in TLS 1.3 key schedule (see <xref section="7.1" sectionFormat="of" target="RFC8446"/>), the <tt>label</tt> is the ASCII string "EXPORTER-Channel-Binding", the <tt>context_value</tt> is a zero-length string, the <tt>key_length</tt> is 32 bytes. The functions <tt>HKDF-Expand-Label</tt> and <tt>Derive-Secret</tt> 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 channel binding secret. If the channel binding is selected, then this secret will be used as another 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 secrets respectively. Therefore, when the client and server execute the PAKE protocol with these inconsistent secrets, both parties 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, and constructs the "client_shares" field by selecting its perferred PAKE algorithm suites and computing their corresponding PAKE shares. The computation of PAKE shares <bcp14>SHOULD</bcp14> conform to the specification of the selected PAKE algorithms. 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 <tt>PAKEClientHello</tt> message to the server.</t>
        <t>(2) After receiving the <tt>PAKEClientHello</tt> message, the server first parses it to obtain "supported_pake_algorithms", "client_identity" and "client_shares" 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), and constructs the "server_share" field by setting the negotiated PAKE algorithm suite and computing its corresponding PAKE share. Based on the received client's share and its own secret, the server first derives a PAKE shared secret, and then derives a session key and a MAC key as follows.</t>
        <artwork><![CDATA[
session_key || mac_key = KDF(pake_shared_secret || channel_binding_secret, Hash(PAKEClientHello || PAKEServerHello), "TLS13PostHandshakeAuthPAKE", L)
]]></artwork>
        <t>Here, <tt>KDF(ikm, salt, info, L)</tt> is the key-derivation function (KDF) negotiated in the PAKE algorithm suite and the derived key length <tt>L</tt> relies on the underlying encryption function and MAC function; the PAKE shared secrets for different PAKEs are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>For CPace, this secret indicates the value <tt>ISK</tt> in <xref section="6.2" sectionFormat="of" target="I-D.draft-irtf-cfrg-cpace-13"/>.</t>
          </li>
          <li>
            <t>For SPAKE2, this secret indicates the concatenated value <tt>Ke || Ka</tt> in <xref section="3.3" sectionFormat="of" target="RFC9382"/>.</t>
          </li>
          <li>
            <t>For OPAQUE, this secret indicates the concatenated value <tt>Km2 || Km3 || session_key</tt> in Section <xref target="I-D.draft-irtf-cfrg-opaque-18" section="6.4.3" sectionFormat="bare"/> and Section <xref target="I-D.draft-irtf-cfrg-opaque-18" section="6.4.4" sectionFormat="bare"/> of <xref target="I-D.draft-irtf-cfrg-opaque-18"/>.</t>
          </li>
          <li>
            <t>For SPAKE2+, this secret indicates the value <tt>K_main</tt> in <xref section="3.3" sectionFormat="of" target="RFC9383"/>.</t>
          </li>
        </ul>
        <t>Finally, the server computes its "pake_verify_data" value as follows, and sends <tt>PAKEServerHello</tt> and server <tt>PAKEFinished</tt> messages to the client.</t>
        <artwork><![CDATA[
server_pake_verify_data = MAC(mac_key, Hash(PAKEClientHello || PAKEServerHello))
]]></artwork>
        <t>(3) After receiving the <tt>PAKEServerHello</tt> and server <tt>PAKEFinished</tt> messages, the client first parses the former to obtain the "server_identity" and "server_share" fields, and parses the later to obtain the "pake_verify_data" field. Based on the received server's share and its own secret, the client derives a PAKE shared secret, and then derives a session key and a 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 <tt>PAKEFinished</tt> message to the server.</t>
        <artwork><![CDATA[
client_pake_verify_data = MAC(mac_key, Hash(PAKEClientHello || PAKEServerHello || server PAKEFinished))
]]></artwork>
        <t>Otherwise, the client sends a <tt>PAKEStatus</tt> message with a "pake_decrypt_error" alert to the server.</t>
        <t>(4) After receiving the client <tt>PAKEFinished</tt> 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 <tt>PAKEStatus</tt> message with a "pake_success_notify" status to the client, otherwise sends a <tt>PAKEStatus</tt> 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 <tt>PAKEClientHello</tt> message, the server corrects the mismatch with a <tt>PAKEHelloRetryRequest</tt> message which contains a "selected_pake_algorithm" field, and the client needs to restart the handshake with a second <tt>PAKEClientHello</tt> 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 <tt>0xFE</tt> as defined in <xref target="pake_handshake_messages"/>, and <tt>Hash.length</tt> is the output length of the negotiated hash function in bytes.</t>
        <artwork><![CDATA[
server_pake_verify_data = MAC(mac_key, Hash(pake_message_hash || 00 00 Hash.length || Hash(PAKEClientHello1) || PAKEHelloRetryRequest || PAKEClientHello2 || PAKEServerHello))
]]></artwork>
        <artwork><![CDATA[
client_pake_verify_data = MAC(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>
        <!-- Exception 1: The CBV SHOULD be additionally used to derive a password-based group generator or password-based secrets or an initial keying material. For CPace (see {{Section 6.2 of I-D.draft-irtf-cfrg-cpace-13}}), the password-based group generator SHOULD be derived by g = G.calculate_generator(H, PRS, CI, sid, CBV). For SPAKE2 (see Section 3.2 of {{RFC9382}}), the password-based secret SHOULD be derived by w = MHF(pw \|\| CBV) mod p. For OPAQUE (see {{Sections 6.4.3 and 6.4.4 of I-D.draft-irtf-cfrg-opaque-18}}), the initial keying material SHOULD be given by ikm = concat(dh1, dh2, dh3, CBV). For SPAKE2+ (see {{Section 3.2 of RFC9383}}), the password-based secrets SHOULD be derived by w0s \|\| w1s = PBKDF(len(pw) \|\| pw \|\| len(idProver) \|\| idProver \|\| len(idVerifier) \|\| idVerifier \|\| len(CBV) \|\| CBV). -->

<!-- Exception 2: The transcript(Ya, ADa, Yb, ADb) used to derive ISK in CPace (see {{Section 6.2 of 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 {{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 {{Section 6.4.2.1 of I-D.draft-irtf-cfrg-opaque-18}}), the len(idProver) \|\| idProver \|\| len(idVerifier) \|\| idVerifier \|\| len(shareP) \|\| shareP \|\| len(shareV) \|\| shareV used to derive K_main in SPAKE2+ (see {{Section 3.4 of RFC9383}}), all SHOULD be replaced with the transcript PAKEClientHello \|\| PAKEServerHello. In case of the PAKEHelloRetryRequest message, these transcripts SHOULD be replaced with the transcript pake_message_hash \|\| 00 00 Hash.length \|\| Hash(PAKEClientHello1) \|\| PAKEHelloRetryRequest \|\| PAKEClientHello2 \|\| PAKEServerHello. -->

<!-- This derivation process SHOULD conform to the specification of the negotiated PAKE algorithm, with one exception that the original transcript used to derive these keys SHOULD be replaced with the transcript PAKEClientHello \|\| PAKEServerHello (see Exception 2 for more details). -->

<!-- {{Section 3.2 of RFC9382}} {{Section 4 of RFC9382}} -->

</section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document describes how to execute PAKE-based post-handshake authentication for TLS 1.3. This execution deviates from the original PAKE protocols in two important ways: 1) the original keys of PAKEs are replaced with the <tt>session_key</tt> and <tt>mac_key</tt> in <xref target="pake_based_pha"/>; 2) the key confirmation messages required in PAKEs are replaced with the <tt>PAKEFinished</tt> messages in <xref target="pake_based_pha"/>. The former is because the <tt>session_key</tt> and <tt>mac_key</tt> are derived from a transcript, which includes the parameters required for PAKEs' key derivation; the latter is because the <tt>PAKEFinished</tt> messages compute a MAC over a transcript, which is a superset of the transcript required for PAKEs' key confirmation.</t>
      <!-- # IANA Considerations

This document has no IANA actions. -->

</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="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>
        <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.draft-irtf-cfrg-opaque-18">
          <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="21" month="November" 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-18"/>
        </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-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>
        <reference anchor="I-D.draft-guo-pake-in-tls-01">
          <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="24" month="February" year="2025"/>
            <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-01"/>
        </reference>
      </references>
    </references>
    <?line 321?>

<!-- # 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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

-->

</rfc>
