<?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-01" 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-01"/>
    <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:</t>
      <ul spacing="normal">
        <li>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.</li>
        <li>Successfull authentication does not grant the server enough information to impersonate the client.</li>
        <li>Mutual authentication is implicit and required. A successfull authentication always strongly authenticates both sides of the exchange.</li>
        <li>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.</li>
        <li>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.</li>
      </ul>
    </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>A future revision of this document will request a new registry for the OPAQUE family of SASL mechanism, outlining all required details on the primitives used by the 'OPAQUE-A255SHA' variant.</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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
LBfjyzEnYlwu4KSdknjrECwd1gyZy2iCg62FJXwlL7zzwTU7Qao0bUinKAqn
IyXYRVTplvLURZgJumXlhsRCWC1qcYKFlQHfOd+hzX3S7r4U2VZpXfYVFXht
wMOsodjeEfMmLgwlDCT/cl0XCp9BGkozQBDGs7k4uNNe1Arj2/rpYnWxVKfH
KhsMshMuJhcn313rg0f8w+RYzU6+m01JNR8NzMl3bGLKR4MbWjR65Hav6Ovh
o17vCRnIQah7LjAAcNuMaN/JI+jJhYOxejoZqSsdJ2RmJG8gWkssncaLltXq
MMQxlIhe0/FiPKCY+UrytiY8Rlbzm43TrIUebq9bXJypPSLfxdm+M11EKFpt
iSvuzONhLS+iusYTuhAcAIGJ2ayBTPtUWEw/GTZw7iJrYvtQFhtytp3JJiEz
7ysIbHt/kBSHdhfrXzfewxksiqbYxFJFvrS1YNasVl4WEmLkCVHtpoSg9UdJ
QTLxcnwq+fauMM47HMR787iQUkFoyzhl79iBgK7tNHyP40aLiERbTYThexxa
Ynju20iHRHGHJKwpMRwi96yv+o4FlH7i6oMnkGd2EwG6VI3Y4NM7Er3Ilh6a
RMlmTZ6D7EMtk5poNJfA1fy21WfHbZWNA4XFpm1yBlNU6pQUk/jjG2ieF3tM
t8N9MgjwG3+IH7tcdmPJKvjgaV3p0pXH9cwWxjkBZWcR+0UUCnE/miq6JvOB
OBspU3DN0mYP+MaBlpK0bajGOKm5jrtNCDS0ejeJxpPTiwv424rJLYWpUkfU
1WbfJI4c1LHAQUzdYlYgUrEASBN0PqX/6MrAlGNzleZak+XXcWlEXOMkRmiG
uIiupOTAiQsdLWcwEcM6LQh5mXPERnET3Gga81l2OVVJCrK7ZGxbwMG1OqBB
k4aGYLUGFFypcpCEWyUEoTA3iGISXZpFxunOKi+lJaawHkiuVdASytYCDjyh
CwxiWeyaP8hQy5pqBj7ClR3W5jXEoe6cio+lDkd1msAjeHCZjfiRwgNnV8gZ
BRX5bjPAVdW5swDPQnl2t2HjnZEPIrnM0TAMuHpuD6iVwNseDKkDQHBnFu4G
UJcHynkcoAaeCVTPy6BcYkKZa+v8XnwNPe/WLaw/7Ns2nlR69gU351O46UwW
p0kp/hSSyw0k8QVGkQyAgD6vuShhmSq9dcBk+z9BcGUNBYwTwQiVnLHme/vG
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
RAAA

-->

</rfc>
