<?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.6.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-reitzenstein-kitten-opaque-00" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.0 -->
  <front>
    <title abbrev="OPAQUE Authentication">A SASL and GSS-API Mechanism family using the asymmetric password-authenticated key agreement OPAQUE</title>
    <seriesInfo name="Internet-Draft" value="draft-reitzenstein-kitten-opaque-00"/>
    <author initials="N." surname="von Reitzenstein Čerpnjak" fullname="Nadja von Reitzenstein Čerpnjak">
      <organization/>
      <address>
        <email>me@dequbed.space</email>
      </address>
    </author>
    <date year="2022" month="October" day="06"/>
    <area>AREA</area>
    <workgroup>WG Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This specification describes a family of Simple Authentication and Security Layer (SASL, RFC4422) authentication mechanisms based on the OPAQUE asymmetric password-authenticated key agreement (PAKE) algorithm.</t>
      <t>They offer two distinct advantages over the SCRAM family of mechanisms. The underlying OPAQUE algorithm provides the ability for clients to register without the servers getting access to the clear text password of an user, preventing password exfiltration at registration. Secondly a successful authentication produces a long-term secret key only known to the client that can be used to access encrypted server-side data without needing to share keys between clients via a side-band mechanism.</t>
      <t>When used in combination with TLS or an equivalent security layer these mechanisms allow for secure channel binding.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Common Authentication Technology Next Generation Working Group mailing list (kitten@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/kitten/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/dequbed/draft-reitzenstein-auth-opaque"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</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>
    </section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This specification describes a family of authentication mechanisms called OPAQUE, based on the asymmetric PAKE of the same name. The mechanisms provide strong mutual authentication and allow binding the authentication to an pre-existing underlying encrypted transport.</t>
      <t>OPAQUE as specified in this document is a Simple Authentication and Security Layer (SASL) mechanism compatible to the bridge between SASL and the Generic Security Services Application Programming Interface (GSS-API) called "GS2" <xref target="RFC5801"/>. This means that the mechanism can be used as either a SASL mechanism or a GSS-API mechanism.</t>
      <t>The OPAQUE algorithm provides the following features which this mechanism makes use of:
* The authentication information stored in an authentication database on the server is not sufficient to impersonate the client. It is additionally salted and bound to a private key of the server, making pre-stored dictionary attack impossible.
* Successfull authentication does not grant the server enough information to impersonate the client.
* Mutual authentication is implicit and required. A successfull authentication always strongly authenticates both sides of the exchange.
* A successfull authentication provides both parties with an emphemeral shared secret. This secret has high entropy and can be used to establish a trusted encrypted channel without deriving trust from a 3rd party.
* A successfull authentication additionally provides the client with a constant secret. This secret is only known to the client and the same for every authentication. It can be used to e.g. store encrypted data on the server without having to manage keys locally.</t>
    </section>
    <section anchor="opaque-algorithm-overview">
      <name>OPAQUE Algorithm Overview</name>
      <t>The Authenticated Key Exchange defined by OPAQUE consists of three messages -- KE1, KE2 and KE3 -- send by the client (KE1, KE3) and server (KE2) respectively. A client knows the outcome of the authentication after receiving KE2, the server after receiving KE3.</t>
      <t>The following is a description of a full SASL OPAQUE authentication exchange. Nothing in OPAQUE prevents sending the first client response with the SASL authentication request as defined by an application protocol ("initial client response"). See <xref target="RFC4422"/> for more details.</t>
      <t>The OPAQUE client starts by being in posession of an username and password. It uses the password to generate a KE1 structure as per OPAQUE <xref target="I-D.irtf-cfrg-opaque"/>, and sends it and the username to the server.
The server retrieves the corresponding authentication information, i.e. registration record, OPRF seed, server private key, and the key-stretching function (KSF) parameters used at registration. It uses the first three to generate a KE2 structure as per OPAQUE <xref target="I-D.irtf-cfrg-opaque"/> and sends that, channel binding data (if any) and the KSF parameters to the client.</t>
      <t>The client authenticates the server using KE2 and the KSF parameters, also showing the integrity of the channel binding data in the process, and generates a final KE3 it can return to the server.</t>
      <t>The three messages KE1, KE2 and KE3 are generated using the following functions specified in OPAQUE <xref target="I-D.irtf-cfrg-opaque"/>:</t>
      <artwork><![CDATA[
KE1 := ClientInit(password)

KE2 := ServerInit(server_identity, server_private_key, server_public_key, record, credential_identifier, oprf_seed, KE1, client_identity)

KE3 := ClientFinish(client_identity, server_identity, KE2)
]]></artwork>
      <t>The values of <tt>client_identity</tt> and <tt>server_identity</tt> are set to:</t>
      <artwork><![CDATA[
client_identity := client-first-message + "," + client_public_key

server_identity := server-message-bare + "," + server_public_key
]]></artwork>
      <t>With the values and encodings of the remaining parameters per the OPAQUE specification, and <tt>+</tt> indicating concatenation.</t>
      <t>Upon receipt of KE3 the server can validate the authentication exchange including integrity of the channel binding data it sent previously, and extract a session key that strongly authenticates the client to the server.</t>
    </section>
    <section anchor="opaque-mechanism-names">
      <name>OPAQUE Mechanism Names</name>
      <t>An OPAQUE mechanism name is the string "OPAQUE-" followed by an uppercase identifier for the cryptographic primitives being used. The identifier is limited to 7 octets (20 - len("OPAQUE-") - len("-PLUS")) which is too short to contain the full names of all cryptographic primitives used. Thus OPAQUE mechanisms using new groups of primitives <bcp14>SHOULD</bcp14> be registered with IANA to allow implementers to identify all required primitives.</t>
      <t>The PLUS suffix is only used when the authenticating parties support channel binding. If the server supports channel binding it <bcp14>SHOULD</bcp14> advertise both the "bare" and "plus" version of whichever OPAQUE variant it support. If the server does not it will only advertise the "bare" version.</t>
    </section>
    <section anchor="opaque-authentication-exchange">
      <name>OPAQUE Authentication Exchange</name>
      <artwork><![CDATA[
C: n,,n=user,r=<ke1>
S: c=<cbdata>,i=<params>,v=<ke2>
C: p=<ke3>
]]></artwork>
      <t>First, the client sends the "client-first-message" containing:</t>
      <ul spacing="normal">
        <li>A GS2 header consisting of a flag indicating channel binding support and usage, and an optional SASL authorization identity.</li>
        <li>The authentication ID (AuthID) of the user.</li>
        <li>OPAQUE KE1, containing the OPRF credential request, a nonce, and an ephemeral public key.</li>
      </ul>
      <t>In response the server sends the "server-message" containing:</t>
      <ul spacing="normal">
        <li>An encoding of requested channel binding data</li>
        <li>Parameters for the KSF that needs to be used by the client</li>
        <li>OPAQUE KE2, containting the OPRF credential response, a nonce, and an ephemeral public key.</li>
        <li>A MAC proving the integrity of the exchange so far and cryptographically authenticating the server to the client (also contained in KE2)</li>
      </ul>
      <t>The client then recovers a long term private key and client-only export key from the OPRF response using the defined KSF with the user-provided password and parameters sent by the server.</t>
      <t>To finalize the authentication a client sends a "client-final-message" containing itself a MAC over the exchange (in KE3), thus cryptographically authenticating the client to the server.</t>
      <section anchor="opaque-attributes">
        <name>OPAQUE Attributes</name>
        <t>This section details all attributes permissible in messages, their use and their value format. All Attributes a single US-ASCII letters and case-sensitive. The selection of letters used for attributes is based on SCRAM <xref target="RFC5802"/> to make it easier to adapt extensions defined for SCRAM to this mechanism.</t>
        <t>Note that similar to SCRAM the order of attributes is fixed for all messages, except for extension attributes which are limited to designated positions but may appear in any order. Implementations <bcp14>MUST NOT</bcp14> assume a specific ordering of extensions.</t>
        <ul spacing="normal">
          <li>a: This is an optional attribute and is part of the GS2 <xref target="RFC5801"/> bridge between GSS-API and SASL. Its specification and usage is the same as defined in <xref section="5.1" sectionFormat="comma" target="RFC5802"/>.</li>
          <li>n: This attribute specifies the name of the user whose password is used for authentication (aka "authentication identity" <xref target="RFC4422"/>). Its encoding, preparation, and usage is the same as defined in <xref section="5.1" sectionFormat="comma" target="RFC5802"/>.</li>
          <li>m: This attribute is reserved for future extensibility. In this version of OPAQUE its presence in a client or server message <bcp14>MUST</bcp14> cause authentication failure when the attribute is parsed by the other end.</li>
          <li>r: This attribute specifies a base64-encoded serialization of the KE1 message as specified by <xref target="OPAQUE"/>.</li>
          <li>c: This <bcp14>REQUIRED</bcp14> attribute specifies the base64-encoded GS2 header and channel binding data. Its specification is the same as defined in <xref section="5.1" sectionFormat="comma" target="RFC5802"/>, however it is sent by the server to the client instead of the other way around as in SCRAM.</li>
          <li>i: This attribute specifies base64-encoded parameters for the KSF to be used. The format of the parameters is specific to the KSF in use.</li>
          <li>v: This attribute specifies a base64-encoded serialization of the KE2 message as specified by <xref target="OPAQUE"/>.</li>
          <li>p: This attribute specifies a base64-encoded serialization of the KE3 message as specified by <xref target="OPAQUE"/>.</li>
          <li>Further as of now unspecified mandatory and optional extensions. Mandatory extensions are encoded using the "m" attribute, optional attributes may use any unassigned attribute name. Unknown optional attributes <bcp14>MUST</bcp14> be ignored upon receipt.</li>
        </ul>
      </section>
      <section anchor="sasl-mechanism-requirements">
        <name>SASL Mechanism Requirements</name>
        <t>This section describes the required information for SASL mechanisms as laid out in <xref section="5" sectionFormat="comma" target="RFC4422"/>.</t>
        <t>1) "OPAQUE-A255SHA" and "OPAQUE-A255SHA-PLUS"</t>
        <t>2a) OPAQUE is a client-first mechanism</t>
        <t>2b) OPAQUE does not send any additional data to indicate a successful outcome. All authentication exchanges take 3 messages regardless of success.</t>
        <t>3) OPAQUE can transfer authorization identities from the client to the server.</t>
        <t>4) OPAQUE does not offer security layers but allows channel binding.</t>
        <t>5) OPAQUE uses a MAC to protect the integrity of the entire authentication exchange including the authzid.</t>
      </section>
    </section>
    <section anchor="channel-binding">
      <name>Channel Binding</name>
      <t>OPAQUE supports binding the authentication to an underlying secure transport. Support for channel binding is optional, therefore the usage of channel binding is negotiable.</t>
      <t>The negotiation of channel binding is performed as defined in <xref section="6" sectionFormat="comma" target="RFC5802"/> with the following differences:</t>
      <ul spacing="normal">
        <li>The non-PLUS and PLUS variants of the mechanism are instead named OPAQUE-&lt;variant&gt; and OPAQUE-&lt;variant&gt;-PLUS respectively.</li>
        <li>As it is the server who sends the channel binding data the client is responsible to verify this data by constructing the expected value of the "c=" attribute and comparing it to the received one. This comparison <bcp14>SHOULD</bcp14> be implemented to be constant-time.</li>
      </ul>
      <section anchor="default-channel-binding">
        <name>Default Channel Binding</name>
        <t>'tls-exporter' is the default channel binding type for any application that do not specify one.</t>
        <t>Servers <bcp14>MUST</bcp14> implement the 'tls-exporter' <xref target="RFC9266"/> channel binding type if they implement any channel binding and use TLS. Clients <bcp14>SHOULD</bcp14> implement the 'tls-exporter' <xref target="RFC9266"/> channel binding type if they implement any and use TLS.</t>
        <t>Servers <bcp14>MUST</bcp14> use the channel binding type indicated by the client, or fail authentication if they do not support it.</t>
      </section>
    </section>
    <section anchor="opaque-a255sha-plus">
      <name>OPAQUE-A255SHA(-PLUS)</name>
      <t>TODO: Define one set of primitives; probably OPAQUE-A255SHA(-PLUS), using HKDF, HMAC, ristretto255, SHA-512 and Argon2i(d?)</t>
    </section>
    <section anchor="formal-syntax">
      <name>Formal Syntax</name>
      <t>The following syntax specification is written in Augmented Backus-Naur Form (ABNF) notation as specified in <xref target="RFC5234"/>. The non-terminals "UTF8-2", "UTF8-3" and "UTF8-4" are defined in <xref target="RFC3629"/>.</t>
      <t>The syntax is based in large parts on <xref section="7" sectionFormat="comma" target="RFC5802"/>, which may be referenced for clarification. If this specification and <xref target="RFC5802"/> are in conflict, this speification takes priority.</t>
      <t>Used definitions from <xref target="RFC5802"/> are reproduced here for convenience:</t>
      <artwork><![CDATA[
ALPHA = <as defined in RFC 5234 appendix B.1>
DIGIT = <as defined in RFC 5234 appendix B.1>
UTF8-2 = <as defined in RFC 3629 (STD 63)>
UTF8-3 = <as defined in RFC 3629 (STD 63)>
UTF8-4 = <as defined in RFC 3629 (STD 63)>

attr-val        = ALPHA "=" value
                 ;; Generic syntax of any attribute sent
                 ;; by server or client

value           = 1*value-char

value-safe-char = %x01-2B / %x2D-3C / %x3E-7F /
                 UTF8-2 / UTF8-3 / UTF8-4
                 ;; UTF8-char except NUL, "=", and ",".

value-char      = value-safe-char / "="

printable       = %x21-2B / %x2D-7E
                 ;; Printable ASCII except ",".
                 ;; Note that any "printable" is also
                 ;; a valid "value".

base64-char     = ALPHA / DIGIT / "/" / "+"

base64-4        = 4base64-char

base64-3        = 3base64-char "="

base64-2        = 2base64-char "=="

base64          = *base64-4 [base64-3 / base64-2]

posit-number = %x31-39 *DIGIT
                 ;; A positive number.

saslname        = 1*(value-safe-char / "=2C" / "=3D")
                 ;; Conforms to <value>.

authzid         = "a=" saslname
                 ;; Protocol specific.

cb-name         = 1*(ALPHA / DIGIT / "." / "-")
                  ;; See RFC 5056, Section 7.
                  ;; E.g., "tls-server-end-point" or
                  ;; "tls-unique".

gs2-cbind-flag  = ("p=" cb-name) / "n" / "y"
                  ;; "n" -> client doesn't support channel binding.
                  ;; "y" -> client does support channel binding
                  ;;        but thinks the server does not.
                  ;; "p" -> client requires channel binding.
                  ;; The selected channel binding follows "p=".

gs2-header      = gs2-cbind-flag "," [ authzid ] ","
                  ;; GS2 header for OPAQUE

username        = "n=" saslname
                  ;; Usernames are prepared using SASLprep.

reserved-mext  = "m=" 1*(value-char)
                  ;; Reserved for signaling mandatory extensions.
                  ;; The exact syntax will be defined in
                  ;; the future.

channel-binding = "c=" base64
                  ;; base64 encoding of cbind-input.

cbind-data    = 1*OCTET

cbind-input   = gs2-header [ cbind-data ]
                  ;; cbind-data MUST be present for
                  ;; gs2-cbind-flag of "p" and MUST be absent
                  ;; for "y" or "n".
]]></artwork>
      <t>The following definitions are specific to OPAQUE:</t>
      <artwork><![CDATA[
client-first-message-bare =
            [reserved-mext ","] username "," auth-request
            ["," extensions]

client-first-message = gs2-header client-first-message-bare

validator = "v=" base64

server-message-bare =
            [reserved-mext ","] channel-binding "," ksf-params ","
            credentials-response ["," extensions]

server-message = server-message-bare "," validator

client-final-message = "p=" base64
]]></artwork>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The KSF parameters and channel bindings aren't authenticated before KSF usage, allowing a DoS of a client by an malicious actor posing as the server.</t>
      <t>If not used with a secure channel providing confidentiality this mechanism leaks the authid and authzid of an authenticating user to any passive observer.</t>
      <t>The cryptographic security of this mechanism is not increased over the one provided by the underlying OPAQUE algorithm, so all security considerations applying to that specification also apply to this one.</t>
    </section>
    <section anchor="open-issues">
      <name>Open Issues</name>
      <ul spacing="normal">
        <li>OPAQUE allows for a static context to be bound into generated keys to prevent cross-protocol and downgrade attacks. We should probably set that to the mechanism name (e.g. 'OPAQUE-A255SHA')</li>
        <li>With the current design the KSF parameters can not be MAC-verified until after they have been used. This is bad. The only other option is using the ephemeral keypair to generate a MAC key and use that. This may impact security.</li>
        <li>This mechanism should be extended to also become a GSS-API mechanism like SCRAM is.</li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>The IANA is requested to add the following family of SASL mechanisms to the SASL Mechanism registry established by <xref target="RFC4422"/>:</t>
      <t>To: iana@iana.org
Subject: Registration of new SASL family OPAQUE</t>
      <t>SASL mechanism name (or prefix for the family): OPAQUE-
Security Considerations: See this document
Published Specification: See this document
For futher information: Contact the authors of this document.
Owner/Change controller: the IETF
Note: None</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC5801">
        <front>
          <title>Using Generic Security Service Application Program Interface (GSS-API) Mechanisms in Simple Authentication and Security Layer (SASL): The GS2 Mechanism Family</title>
          <author fullname="S. Josefsson" initials="S." surname="Josefsson">
            <organization/>
          </author>
          <author fullname="N. Williams" initials="N." surname="Williams">
            <organization/>
          </author>
          <date month="July" year="2010"/>
          <abstract>
            <t>This document describes how to use a Generic Security Service Application Program Interface (GSS-API) mechanism in the Simple Authentication and Security Layer (SASL) framework.  This is done by defining a new SASL mechanism family, called GS2.  This mechanism family offers a number of improvements over the previous "SASL/ GSSAPI" mechanism: it is more general, uses fewer messages for the authentication phase in some cases, and supports negotiable use of channel binding.  Only GSS-API mechanisms that support channel binding and mutual authentication are supported.  [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5801"/>
        <seriesInfo name="DOI" value="10.17487/RFC5801"/>
      </reference>
      <reference anchor="RFC5802">
        <front>
          <title>Salted Challenge Response Authentication Mechanism (SCRAM) SASL and GSS-API Mechanisms</title>
          <author fullname="C. Newman" initials="C." surname="Newman">
            <organization/>
          </author>
          <author fullname="A. Menon-Sen" initials="A." surname="Menon-Sen">
            <organization/>
          </author>
          <author fullname="A. Melnikov" initials="A." surname="Melnikov">
            <organization/>
          </author>
          <author fullname="N. Williams" initials="N." surname="Williams">
            <organization/>
          </author>
          <date month="July" year="2010"/>
          <abstract>
            <t>The secure authentication mechanism most widely deployed and used by Internet application protocols is the transmission of clear-text passwords over a channel protected by Transport Layer Security (TLS). There are some significant security concerns with that mechanism, which could be addressed by the use of a challenge response authentication mechanism protected by TLS.  Unfortunately, the challenge response mechanisms presently on the standards track all fail to meet requirements necessary for widespread deployment, and have had success only in limited use.</t>
            <t>This specification describes a family of Simple Authentication and Security Layer (SASL; RFC 4422) authentication mechanisms called the Salted Challenge Response Authentication Mechanism (SCRAM), which addresses the security concerns and meets the deployability requirements.  When used in combination with TLS or an equivalent security layer, a mechanism from this family could improve the status quo for application protocol authentication and provide a suitable choice for a mandatory-to-implement mechanism for future application protocol standards.  [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5802"/>
        <seriesInfo name="DOI" value="10.17487/RFC5802"/>
      </reference>
      <reference anchor="RFC5234">
        <front>
          <title>Augmented BNF for Syntax Specifications: ABNF</title>
          <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker">
            <organization/>
          </author>
          <author fullname="P. Overell" initials="P." surname="Overell">
            <organization/>
          </author>
          <date month="January" year="2008"/>
          <abstract>
            <t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="68"/>
        <seriesInfo name="RFC" value="5234"/>
        <seriesInfo name="DOI" value="10.17487/RFC5234"/>
      </reference>
      <reference anchor="RFC3629">
        <front>
          <title>UTF-8, a transformation format of ISO 10646</title>
          <author fullname="F. Yergeau" initials="F." surname="Yergeau">
            <organization/>
          </author>
          <date month="November" year="2003"/>
          <abstract>
            <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems.  The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo.  UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values.  This memo obsoletes and replaces RFC 2279.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="63"/>
        <seriesInfo name="RFC" value="3629"/>
        <seriesInfo name="DOI" value="10.17487/RFC3629"/>
      </reference>
      <reference anchor="RFC9266">
        <front>
          <title>Channel Bindings for TLS 1.3</title>
          <author fullname="S. Whited" initials="S." surname="Whited">
            <organization/>
          </author>
          <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="I-D.irtf-cfrg-opaque" target="https://github.com/cfrg/draft-irtf-cfrg-opaque">
        <front>
          <title>The OPAQUE Asymmetric PAKE Protocol</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </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">
            <organization/>
          </author>
          <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">
            <organization/>
          </author>
          <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="RFC4422">
        <front>
          <title>Simple Authentication and Security Layer (SASL)</title>
          <author fullname="A. Melnikov" initials="A." role="editor" surname="Melnikov">
            <organization/>
          </author>
          <author fullname="K. Zeilenga" initials="K." role="editor" surname="Zeilenga">
            <organization/>
          </author>
          <date month="June" year="2006"/>
          <abstract>
            <t>The Simple Authentication and Security Layer (SASL) is a framework for providing authentication and data security services in connection-oriented protocols via replaceable mechanisms.  It provides a structured interface between protocols and mechanisms.  The resulting framework allows new protocols to reuse existing mechanisms and allows old protocols to make use of new mechanisms.  The framework also provides a protocol for securing subsequent protocol exchanges within a data security layer.</t>
            <t>This document describes how a SASL mechanism is structured, describes how protocols include support for SASL, and defines the protocol for carrying a data security layer over a connection.  In addition, this document defines one SASL mechanism, the EXTERNAL mechanism.</t>
            <t>This document obsoletes RFC 2222.  [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4422"/>
        <seriesInfo name="DOI" value="10.17487/RFC4422"/>
      </reference>
      <reference anchor="OPAQUE">
        <front>
          <title>The OPAQUE Asymmetric PAKE Protocol</title>
          <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
          <author fullname="Dr. Hugo Krawczyk" initials="H." surname="Krawczyk">
            <organization>Algorand Foundation</organization>
          </author>
          <author fullname="Kevin Lewi" initials="K." surname="Lewi">
            <organization>Novi Research</organization>
          </author>
          <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
            <organization>Cloudflare, Inc.</organization>
          </author>
          <date day="6" month="July" year="2022"/>
          <abstract>
            <t>   This document describes the OPAQUE protocol, a secure 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.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-09"/>
      </reference>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thank you to Daniel Bourdrez, Hugo Krawczyk, Kevin Lewi, and C. A. Wood for their work on the OPAQUE PAKE that this mechanism is based on.
Thank you to Abhijit Menon-Sen, Alexey Melnikov, Nicolas Williams, and Chris Newman for their work on the SCRAM RFC, most of which this draft oh so blatanly steals for its own gain.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Hmk89VdSsZI02kHd2GVsAPb/At/CB/OCRQAA

-->

</rfc>
