<?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.8 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-opaque-14" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.1 -->
  <front>
    <title abbrev="OPAQUE">The OPAQUE Augmented PAKE Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-14"/>
    <author initials="D." surname="Bourdrez" fullname="Daniel Bourdrez">
      <organization/>
      <address>
        <email>d@bytema.re</email>
      </address>
    </author>
    <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
      <organization>AWS</organization>
      <address>
        <email>hugokraw@gmail.com</email>
      </address>
    </author>
    <author initials="K." surname="Lewi" fullname="Kevin Lewi">
      <organization>Meta</organization>
      <address>
        <email>lewi.kevin.k@gmail.com</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare, Inc.</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2024" month="March" day="24"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 272?>

<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.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/cfrg/draft-irtf-cfrg-opaque"/>.</t>
    </note>
  </front>
  <middle>
    <?line 283?>

<section anchor="intro">
      <name>Introduction</name>
      <t>Password authentication is ubiquitous in many applications. In a common
implementation, a client authenticates to a server by sending its client
ID and password to the server over a secure connection. This makes
the password vulnerable to server mishandling, including accidentally
logging the password or storing it in plaintext in a database. Server
compromise resulting in access to these plaintext passwords is not an
uncommon security incident, even among security-conscious organizations.
Moreover, plaintext password authentication over secure channels such as
TLS is also vulnerable to cases where TLS may fail, including PKI
attacks, certificate mishandling, termination outside the security
perimeter, visibility to TLS-terminating intermediaries, and more.</t>
      <t>Augmented (or Asymmetric) Password Authenticated Key Exchange (aPAKE)
protocols are designed to provide password authentication and
mutually authenticated key exchange in a client-server setting without
relying on PKI (except during client registration) and without
disclosing passwords to servers or other entities other than the client
machine. A secure aPAKE should provide the best possible security for a
password protocol. Indeed, some attacks are inevitable, such as
online impersonation attempts with guessed client passwords and offline
dictionary attacks upon the compromise of a server and leakage of its
credential file. In the latter case, the attacker learns a mapping of
a client's password under a one-way function and uses such a mapping to
validate potential guesses for the password. Crucially important is
for the password protocol to use an unpredictable one-way mapping.
Otherwise, the attacker can pre-compute a deterministic list of mapped
passwords leading to almost instantaneous leakage of passwords upon
server compromise.</t>
      <t>This document describes OPAQUE, an aPAKE that is secure against
pre-computation attacks (as defined in <xref target="JKX18"/>). OPAQUE provides forward
secrecy with respect to password leakage while also hiding the password from
the server, even during password registration. OPAQUE allows applications
to increase the difficulty of offline dictionary attacks via iterated
hashing or other key-stretching schemes. OPAQUE is also extensible, allowing
clients to safely store and retrieve arbitrary application data on servers
using only their password.</t>
      <t>OPAQUE is defined and proven as the composition of three functionalities:
an oblivious pseudorandom function (OPRF), a key recovery mechanism,
and an authenticated key exchange (AKE) protocol. It can be seen
as a "compiler" for transforming any suitable AKE protocol into a secure
aPAKE protocol. (See <xref target="security-considerations"/> for requirements of the
OPRF and AKE protocols.) This document specifies one OPAQUE instantiation
based on <xref target="TripleDH"/>. Other instantiations are possible, as discussed in
<xref target="alternate-akes"/>, but their details are out of scope for this document.
In general, the modularity of OPAQUE's design makes it easy to integrate
with additional AKE protocols, e.g., TLS or HMQV, and with future ones such
as those based on post-quantum techniques.</t>
      <t>OPAQUE consists of two stages: registration and authenticated key exchange.
In the first stage, a client registers its password with the server and stores
information used to recover authentication credentials on the server. Recovering these
credentials can only be done with knowledge of the client password. In the second
stage, a client uses its password to recover those credentials and subsequently
uses them as input to an AKE protocol. This stage has additional mechanisms to
prevent an active attacker from interacting with the server to guess or confirm
clients registered via the first phase. Servers can use this mechanism to safeguard
registered clients against this type of enumeration attack; see
<xref target="preventing-client-enumeration"/> for more discussion.</t>
      <t>The name OPAQUE is a homonym of O-PAKE where O is for Oblivious. The name
OPAKE was taken.</t>
      <t>This draft complies with the requirements for PAKE protocols set forth in
<xref target="RFC8125"/>.</t>
      <section anchor="requirements-notation">
        <name>Requirements Notation</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" 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.
<?line -6?>
        </t>
      </section>
      <section anchor="notation">
        <name>Notation</name>
        <t>The following functions are used throughout this document:</t>
        <ul spacing="normal">
          <li>
            <t>I2OSP and OS2IP: Convert a byte string to and from a non-negative integer as
described in Section 4 of <xref target="RFC8017"/>. Note that these functions operate on
byte strings in big-endian byte order.</t>
          </li>
          <li>
            <t>concat(x0, ..., xN): Concatenate byte strings. For example,
<tt>concat(0x01, 0x0203, 0x040506) = 0x010203040506</tt>.</t>
          </li>
          <li>
            <t>random(n): Generate a cryptographically secure pseudorandom byte string of length <tt>n</tt> bytes.</t>
          </li>
          <li>
            <t>zeroes(n): Generate a string of <tt>n</tt> bytes all equal to 0 (zero).</t>
          </li>
          <li>
            <t>xor(a,b): Apply XOR to byte strings. For example, <tt>xor(0xF0F0, 0x1234) = 0xE2C4</tt>.
It is an error to call this function with arguments of unequal length.</t>
          </li>
          <li>
            <t>ct_equal(a, b): Return <tt>true</tt> if <tt>a</tt> is equal to <tt>b</tt>, and false otherwise.
The implementation of this function must be constant-time in the length of <tt>a</tt>
and <tt>b</tt>, which are assumed to be of equal length, irrespective of the values <tt>a</tt>
or <tt>b</tt>.</t>
          </li>
        </ul>
        <t>Except if said otherwise, random choices in this specification refer to
drawing with uniform distribution from a given set (i.e., "random" is short
for "uniformly random"). Random choices can be replaced with fresh outputs from
a cryptographically strong pseudorandom generator, according to the requirements
in <xref target="RFC4086"/>, or pseudorandom function. For convenience, we define <tt>nil</tt> as a
lack of value.</t>
        <t>All protocol messages and structures defined in this document use the syntax from
<xref section="3" sectionFormat="comma" target="RFC8446"/>.</t>
      </section>
    </section>
    <section anchor="dependencies">
      <name>Cryptographic Dependencies</name>
      <t>OPAQUE depends on the following cryptographic protocols and primitives:</t>
      <ul spacing="normal">
        <li>
          <t>Oblivious Pseudorandom Function (OPRF); <xref target="deps-oprf"/></t>
        </li>
        <li>
          <t>Key Derivation Function (KDF); <xref target="deps-symmetric"/></t>
        </li>
        <li>
          <t>Message Authentication Code (MAC); <xref target="deps-symmetric"/></t>
        </li>
        <li>
          <t>Cryptographic Hash Function; <xref target="deps-hash"/></t>
        </li>
        <li>
          <t>Key Stretching Function (KSF); <xref target="deps-hash"/></t>
        </li>
      </ul>
      <t>This section describes these protocols and primitives in more detail. Unless said
otherwise, all random nonces and seeds used in these dependencies and the rest of
the OPAQUE protocol are of length <tt>Nn</tt> and <tt>Nseed</tt> bytes, respectively, where
<tt>Nn</tt> = <tt>Nseed</tt> = 32.</t>
      <section anchor="deps-oprf">
        <name>Oblivious Pseudorandom Function</name>
        <t>An Oblivious Pseudorandom Function (OPRF) is a two-party protocol between
client and server for computing a PRF, where the PRF key is held by the server
and the input to the function is provided by the client.  The client does not
learn anything about the PRF other than the obtained output and the server
learns nothing about the client's input or the function output.
This specification depends on the prime-order OPRF construction specified
in <xref target="RFC9497"/>, using the OPRF mode (0x00) from <xref section="3.1" sectionFormat="comma" target="RFC9497"/>.</t>
        <t>The following OPRF client APIs are used:</t>
        <ul spacing="normal">
          <li>
            <t>Blind(element): Create and output (<tt>blind</tt>, <tt>blinded_element</tt>), consisting of a blinded
representation of input <tt>element</tt>, denoted <tt>blinded_element</tt>, along with a value to revert
the blinding process, denoted <tt>blind</tt>.</t>
          </li>
          <li>
            <t>Finalize(element, blind, evaluated_element): Finalize the OPRF evaluation using input <tt>element</tt>,
random inverter <tt>blind</tt>, and evaluation output <tt>evaluated_element</tt>, yielding output <tt>oprf_output</tt>.</t>
          </li>
        </ul>
        <t>Moreover, the following OPRF server APIs are used:</t>
        <ul spacing="normal">
          <li>
            <t>BlindEvaluate(k, blinded_element): Evaluate blinded input element <tt>blinded_element</tt> using
input key <tt>k</tt>, yielding output element <tt>evaluated_element</tt>. This is equivalent to
the BlindEvaluate function described in <xref section="3.3.1" sectionFormat="comma" target="RFC9497"/>, where <tt>k</tt> is the private key parameter.</t>
          </li>
          <li>
            <t>DeriveKeyPair(seed, info): Create and output (<tt>sk</tt>, <tt>pk</tt>), consisting of a private and public key derived
deterministically from a <tt>seed</tt> and <tt>info</tt> parameter, as described in <xref section="3.2" sectionFormat="comma" target="RFC9497"/>.</t>
          </li>
        </ul>
        <t>Finally, this specification makes use of the following shared APIs and parameters:</t>
        <ul spacing="normal">
          <li>
            <t>SerializeElement(element): Map input <tt>element</tt> to a fixed-length byte array.</t>
          </li>
          <li>
            <t>DeserializeElement(buf): Attempt to map input byte array <tt>buf</tt> to an OPRF group element.
This function can raise a DeserializeError upon failure; see <xref section="2.1" sectionFormat="comma" target="RFC9497"/>
for more details.</t>
          </li>
          <li>
            <t>Noe: The size of a serialized OPRF group element output from SerializeElement.</t>
          </li>
          <li>
            <t>Nok: The size of an OPRF private key as output from DeriveKeyPair.</t>
          </li>
        </ul>
      </section>
      <section anchor="deps-symmetric">
        <name>Key Derivation Function and Message Authentication Code</name>
        <t>A Key Derivation Function (KDF) is a function that takes some source of initial
keying material and uses it to derive one or more cryptographically strong keys.
This specification uses a KDF with the following API and parameters:</t>
        <ul spacing="normal">
          <li>
            <t>Extract(salt, ikm): Extract a pseudorandom key of fixed length <tt>Nx</tt> bytes from
input keying material <tt>ikm</tt> and an optional byte string <tt>salt</tt>.</t>
          </li>
          <li>
            <t>Expand(prk, info, L): Expand a pseudorandom key <tt>prk</tt> using the optional string <tt>info</tt>
into <tt>L</tt> bytes of output keying material.</t>
          </li>
          <li>
            <t>Nx: The output size of the <tt>Extract()</tt> function in bytes.</t>
          </li>
        </ul>
        <t>This specification also makes use of a random-key robust Message Authentication Code
(MAC). See <xref target="rkr-mac"/> for more details on this property. The API and parameters for
the random-key robust MAC are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>MAC(key, msg): Compute a message authentication code over input <tt>msg</tt> with key
<tt>key</tt>, producing a fixed-length output of <tt>Nm</tt> bytes.</t>
          </li>
          <li>
            <t>Nm: The output size of the <tt>MAC()</tt> function in bytes.</t>
          </li>
        </ul>
      </section>
      <section anchor="deps-hash">
        <name>Hash Functions</name>
        <t>This specification makes use of a collision-resistant hash function with the following
API and parameters:</t>
        <ul spacing="normal">
          <li>
            <t>Hash(msg): Apply a cryptographic hash function to input <tt>msg</tt>, producing a
fixed-length digest of size <tt>Nh</tt> bytes.</t>
          </li>
          <li>
            <t>Nh: The output size of the <tt>Hash()</tt> function in bytes.</t>
          </li>
        </ul>
        <t>This specification makes use of a Key Stretching Function (KSF), which is a slow
and expensive cryptographic hash function with the following API:</t>
        <ul spacing="normal">
          <li>
            <t>Stretch(msg): Apply a key stretching function to stretch the input <tt>msg</tt> and
harden it against offline dictionary attacks. This function also needs to
satisfy collision resistance.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>OPAQUE consists of two stages: registration and authenticated key exchange (AKE).
In the first stage, a client registers its password with the server and stores
its credential file on the server. In the second stage (also called the
"login" or "online" stage), the client recovers its authentication material and uses it to
perform a mutually authenticated key exchange.</t>
      <section anchor="setup">
        <name>Setup</name>
        <t>Prior to both stages, the client and server agree on a configuration that
fully specifies the cryptographic algorithm dependencies necessary to run the
protocol; see <xref target="configurations"/> for details.
The server chooses a pair of keys (<tt>server_private_key</tt> and <tt>server_public_key</tt>)
for the AKE, and chooses a seed (<tt>oprf_seed</tt>) of <tt>Nh</tt> bytes for the OPRF.
The server can use <tt>server_private_key</tt> and <tt>server_public_key</tt> with multiple
clients. The server can also opt to use a different seed for each client
(i.e. each client can be assigned a single seed), so long as they are maintained
across the registration and online AKE stages, and kept consistent for each
client (since an inconsistent mapping of clients to seeds could leak information
as described in <xref target="preventing-client-enumeration"/>).</t>
      </section>
      <section anchor="registration">
        <name>Registration</name>
        <t>Registration is the only stage in OPAQUE that requires a server-authenticated
channel with confidentiality and integrity: either physical, out-of-band, PKI-based, etc.</t>
        <t>The client inputs its credentials, which include its password and user
identifier, and the server inputs its parameters, which include its private key
and other information.</t>
        <t>The client output of this stage is a single value <tt>export_key</tt> that the client
may use for application-specific purposes, e.g., as a symmetric key used to encrypt
additional information for storage on the server. The server does not have access to this
<tt>export_key</tt>.</t>
        <t>The server output of this stage is a record corresponding to the client's
registration that it stores in a credential file alongside other clients
registrations as needed.</t>
        <t>The registration flow is shown below:</t>
        <artwork><![CDATA[
    creds                                   parameters
      |                                         |
      v                                         v
    Client                                    Server
    ------------------------------------------------
                registration request
             ------------------------->
                registration response
             <-------------------------
                      record
             ------------------------->
   ------------------------------------------------
      |                                         |
      v                                         v
  export_key                                 record
]]></artwork>
        <t>These messages are named <tt>RegistrationRequest</tt>, <tt>RegistrationResponse</tt>, and
<tt>RegistrationRecord</tt>, respectively. Their contents and wire format are defined in
<xref target="registration-messages"/>.</t>
      </section>
      <section anchor="online-authenticated-key-exchange">
        <name>Online Authenticated Key Exchange</name>
        <t>In this second stage, a client obtains credentials previously registered
with the server, recovers private key material using the password, and
subsequently uses them as input to the AKE protocol. As in the registration
phase, the client inputs its credentials, including its password and user
identifier, and the server inputs its parameters and the credential file record
corresponding to the client. The client outputs two values, an <tt>export_key</tt>
(matching that from registration) and a <tt>session_key</tt>, the latter of which
is the primary AKE output. The server outputs a single value <tt>session_key</tt>
that matches that of the client. Upon completion, clients and servers can
use these values as needed.</t>
        <t>The authenticated key exchange flow is shown below:</t>
        <artwork><![CDATA[
    creds                             (parameters, record)
      |                                         |
      v                                         v
    Client                                    Server
    ------------------------------------------------
                   AKE message 1
             ------------------------->
                   AKE message 2
             <-------------------------
                   AKE message 3
             ------------------------->
   ------------------------------------------------
      |                                         |
      v                                         v
(export_key, session_key)                  session_key
]]></artwork>
        <t>These messages are named <tt>KE1</tt>, <tt>KE2</tt>, and <tt>KE3</tt>, respectively. They carry the
messages of the concurrent execution of the key recovery process (OPRF) and the
authenticated key exchange (AKE), and their corresponding wire formats are
specified in <xref target="ake-messages"/>.</t>
        <t>The rest of this document describes the specifics of these stages in detail.
<xref target="client-material"/> describes how client credential information is
generated, encoded, and stored on the server during registration, and recovered during
login. <xref target="registration-phase"/> describes the first registration stage of the protocol,
and <xref target="online-phase"/> describes the second authentication stage of the protocol.
<xref target="configurations"/> describes how to instantiate OPAQUE using different
cryptographic dependencies and parameters.</t>
      </section>
    </section>
    <section anchor="client-material">
      <name>Client Credential Storage and Key Recovery</name>
      <t>OPAQUE makes use of a structure called <tt>Envelope</tt> to manage client credentials.
The client creates its <tt>Envelope</tt> on registration and sends it to the server for
storage. On every login, the server sends this <tt>Envelope</tt> to the client so it can
recover its key material for use in the AKE.</t>
      <t>Applications may pin key material to identities if desired. If no identity is given
for a party, its value MUST default to its public key. The following types of
application credential information are considered:</t>
      <ul spacing="normal">
        <li>
          <t>client_private_key: The encoded client private key for the AKE protocol.</t>
        </li>
        <li>
          <t>client_public_key: The encoded client public key for the AKE protocol.</t>
        </li>
        <li>
          <t>server_public_key: The encoded server public key for the AKE protocol.</t>
        </li>
        <li>
          <t>client_identity: The client identity. This is an application-specific value,
e.g., an e-mail address or an account name. If not specified, it defaults
to the client's public key.</t>
        </li>
        <li>
          <t>server_identity: The server identity. This is typically a domain name, e.g., example.com.
If not specified, it defaults to the server's public key. See <xref target="identities"/> for
information about this identity.</t>
        </li>
      </ul>
      <t>A subset of these credential values are used in the <tt>CleartextCredentials</tt> structure as follows:</t>
      <artwork><![CDATA[
struct {
  uint8 server_public_key[Npk];
  uint8 server_identity<1..2^16-1>;
  uint8 client_identity<1..2^16-1>;
} CleartextCredentials;
]]></artwork>
      <t>The function CreateCleartextCredentials constructs a <tt>CleartextCredentials</tt> structure given
application credential information.</t>
      <artwork><![CDATA[
CreateCleartextCredentials

Input:
- server_public_key, the encoded server public key for the AKE protocol.
- client_public_key, the encoded client public key for the AKE protocol.
- server_identity, the optional encoded server identity.
- client_identity, the optional encoded client identity.

Output:
- cleartext_credentials, a CleartextCredentials structure.

def CreateCleartextCredentials(server_public_key, client_public_key,
                               server_identity, client_identity):
  # Set identities as public keys if no application-layer identity is provided
  if server_identity == nil
    server_identity = server_public_key
  if client_identity == nil
    client_identity = client_public_key

  Create CleartextCredentials cleartext_credentials with
    (server_public_key, server_identity, client_identity)
  return cleartext_credentials
]]></artwork>
      <section anchor="key-recovery">
        <name>Key Recovery</name>
        <t>This specification defines a key recovery mechanism that uses the stretched OPRF
output as a seed to directly derive the private and public keys using the
<tt>DeriveDiffieHellmanKeyPair()</tt> function defined in <xref target="key-creation"/>.</t>
        <section anchor="envelope-structure">
          <name>Envelope Structure</name>
          <t>The key recovery mechanism defines its <tt>Envelope</tt> as follows:</t>
          <artwork><![CDATA[
struct {
  uint8 nonce[Nn];
  uint8 auth_tag[Nm];
} Envelope;
]]></artwork>
          <t>nonce: A randomly-sampled nonce of length <tt>Nn</tt>, used to protect this <tt>Envelope</tt>.</t>
          <t>auth_tag: An authentication tag protecting the contents of the envelope, covering
the envelope nonce and <tt>CleartextCredentials</tt>.</t>
        </section>
        <section anchor="envelope-creation">
          <name>Envelope Creation</name>
          <t>Clients create an <tt>Envelope</tt> at registration with the function <tt>Store</tt> defined
below. Note that <tt>DeriveDiffieHellmanKeyPair</tt> in this function can fail with negligible
probability. If this occurs, servers should re-run the function, sampling a
new <tt>envelope_nonce</tt>, to completion.</t>
          <artwork><![CDATA[
Store

Input:
- randomized_password, a randomized password.
- server_public_key, the encoded server public key for
  the AKE protocol.
- server_identity, the optional encoded server identity.
- client_identity, the optional encoded client identity.

Output:
- envelope, the client's Envelope structure.
- client_public_key, the client's AKE public key.
- masking_key, an encryption key used by the server with the sole purpose
  of defending against client enumeration attacks.
- export_key, an additional client key.

def Store(randomized_password, server_public_key, server_identity, client_identity):
  envelope_nonce = random(Nn)
  masking_key = Expand(randomized_password, "MaskingKey", Nh)
  auth_key = Expand(randomized_password, concat(envelope_nonce, "AuthKey"), Nh)
  export_key = Expand(randomized_password, concat(envelope_nonce, "ExportKey"), Nh)
  seed = Expand(randomized_password, concat(envelope_nonce, "PrivateKey"), Nseed)
  (_, client_public_key) = DeriveDiffieHellmanKeyPair(seed)

  cleartext_credentials =
    CreateCleartextCredentials(server_public_key, client_public_key,
                               server_identity, client_identity)
  auth_tag = MAC(auth_key, concat(envelope_nonce, cleartext_credentials))

  Create Envelope envelope with (envelope_nonce, auth_tag)
  return (envelope, client_public_key, masking_key, export_key)
]]></artwork>
        </section>
        <section anchor="envelope-recovery">
          <name>Envelope Recovery</name>
          <t>Clients recover their <tt>Envelope</tt> during login with the <tt>Recover</tt> function
defined below.</t>
          <artwork><![CDATA[
Recover

Input:
- randomized_password, a randomized password.
- server_public_key, the encoded server public key for the AKE protocol.
- envelope, the client's Envelope structure.
- server_identity, the optional encoded server identity.
- client_identity, the optional encoded client identity.

Output:
- client_private_key, the encoded client private key for the AKE protocol.
- cleartext_credentials, a CleartextCredentials structure.
- export_key, an additional client key.

Exceptions:
- EnvelopeRecoveryError, the envelope fails to be recovered.

def Recover(randomized_password, server_public_key, envelope,
            server_identity, client_identity):
  auth_key = Expand(randomized_password, concat(envelope.nonce, "AuthKey"), Nh)
  export_key = Expand(randomized_password, concat(envelope.nonce, "ExportKey"), Nh)
  seed = Expand(randomized_password, concat(envelope.nonce, "PrivateKey"), Nseed)
  (client_private_key, client_public_key) = DeriveDiffieHellmanKeyPair(seed)

  cleartext_credentials = CreateCleartextCredentials(server_public_key,
                      client_public_key, server_identity, client_identity)
  expected_tag = MAC(auth_key, concat(envelope.nonce, cleartext_credentials))
  If !ct_equal(envelope.auth_tag, expected_tag)
    raise EnvelopeRecoveryError
  return (client_private_key, cleartext_credentials, export_key)
]]></artwork>
          <t>In the case of <tt>EnvelopeRecoveryError</tt> being raised, all previously-computed
intermediary values in this function MUST be deleted.</t>
        </section>
      </section>
    </section>
    <section anchor="registration-phase">
      <name>Registration</name>
      <t>The registration process proceeds as follows. The client inputs
the following values:</t>
      <ul spacing="normal">
        <li>
          <t>password: The client's password.</t>
        </li>
        <li>
          <t>creds: The client credentials, as described in <xref target="client-material"/>.</t>
        </li>
      </ul>
      <t>The server inputs the following values:</t>
      <ul spacing="normal">
        <li>
          <t>server_public_key: The server public key for the AKE protocol.</t>
        </li>
        <li>
          <t>credential_identifier: A unique identifier for the client's
credential, generated by the server.</t>
        </li>
        <li>
          <t>client_identity: The optional client identity as described in <xref target="client-material"/>.</t>
        </li>
        <li>
          <t>oprf_seed: A seed used to derive per-client OPRF keys.</t>
        </li>
      </ul>
      <t>The registration protocol then runs as shown below:</t>
      <artwork><![CDATA[
  Client                                         Server
 ------------------------------------------------------
 (request, blind) = CreateRegistrationRequest(password)

                        request
              ------------------------->

 response = CreateRegistrationResponse(request,
                                       server_public_key,
                                       credential_identifier,
                                       oprf_seed)

                        response
              <-------------------------

 (record, export_key) = FinalizeRegistrationRequest(response,
                                                    server_identity,
                                                    client_identity)

                        record
              ------------------------->
]]></artwork>
      <t><xref target="registration-messages"/> describes the formats for the above messages, and
<xref target="registration-functions"/> describes details of the functions and the
corresponding parameters referenced above.</t>
      <t>At the end of this interaction, the server stores the <tt>record</tt> object as the
credential file for each client along with the associated <tt>credential_identifier</tt>
and <tt>client_identity</tt> (if different). Note that the values <tt>oprf_seed</tt> and
<tt>server_private_key</tt> from the server's setup phase must also be persisted.
The <tt>oprf_seed</tt> value SHOULD be used for all clients; see <xref target="preventing-client-enumeration"/>.
The <tt>server_private_key</tt> may be unique for each client.</t>
      <t>Both client and server MUST validate the other party's public key before use.
See <xref target="validation"/> for more details. Upon completion, the server stores
the client's credentials for later use. Moreover, the client MAY use the output
<tt>export_key</tt> for further application-specific purposes; see <xref target="export-key-usage"/>.</t>
      <section anchor="registration-messages">
        <name>Registration Messages</name>
        <t>This section contains definitions of the <tt>RegistrationRequest</tt>,
<tt>RegistrationResponse</tt>, and <tt>RegistrationRecord</tt> messages exchanged between
client and server during registration.</t>
        <artwork><![CDATA[
struct {
  uint8 blinded_message[Noe];
} RegistrationRequest;
]]></artwork>
        <t>blinded_message: A serialized OPRF group element.</t>
        <artwork><![CDATA[
struct {
  uint8 evaluated_message[Noe];
  uint8 server_public_key[Npk];
} RegistrationResponse;
]]></artwork>
        <t>evaluated_message: A serialized OPRF group element.</t>
        <t>server_public_key: The server's encoded public key that will be used for
the online AKE stage.</t>
        <artwork><![CDATA[
struct {
  uint8 client_public_key[Npk];
  uint8 masking_key[Nh];
  Envelope envelope;
} RegistrationRecord;
]]></artwork>
        <t>client_public_key: The client's encoded public key, corresponding to
the private key <tt>client_private_key</tt>.</t>
        <t>masking_key: An encryption key used by the server with the sole purpose
of defending against client enumeration attacks.</t>
        <t>envelope: The client's <tt>Envelope</tt> structure.</t>
      </section>
      <section anchor="registration-functions">
        <name>Registration Functions</name>
        <t>This section contains definitions of the functions used by client and server
during registration, including <tt>CreateRegistrationRequest</tt>, <tt>CreateRegistrationResponse</tt>,
and <tt>FinalizeRegistrationRequest</tt>.</t>
        <section anchor="createregistrationrequest">
          <name>CreateRegistrationRequest</name>
          <t>To begin the registration flow, the client executes the following function. This function
can fail with an <tt>InvalidInputError</tt> error with negligible probability. A different input
password is necessary in the event of this error.</t>
          <artwork><![CDATA[
CreateRegistrationRequest

Input:
- password, an opaque byte string containing the client's password.

Output:
- request, a RegistrationRequest structure.
- blind, an OPRF scalar value.

Exceptions:
- InvalidInputError, when Blind fails

def CreateRegistrationRequest(password):
  (blind, blinded_element) = Blind(password)
  blinded_message = SerializeElement(blinded_element)
  Create RegistrationRequest request with blinded_message
  return (request, blind)
]]></artwork>
        </section>
        <section anchor="create-reg-response">
          <name>CreateRegistrationResponse</name>
          <t>To process the client's registration request, the server executes
the following function. This function can fail with a <tt>DeriveKeyPairError</tt>
error with negligible probability. In this case, applications can
choose a new <tt>credential_identifier</tt> for this registration record
and re-run this function.</t>
          <artwork><![CDATA[
CreateRegistrationResponse

Input:
- request, a RegistrationRequest structure.
- server_public_key, the server's public key.
- credential_identifier, an identifier that uniquely represents the credential.
- oprf_seed, the seed of Nh bytes used by the server to generate an oprf_key.

Output:
- response, a RegistrationResponse structure.

Exceptions:
- DeserializeError, when OPRF element deserialization fails.
- DeriveKeyPairError, when OPRF key derivation fails.

def CreateRegistrationResponse(request, server_public_key,
                               credential_identifier, oprf_seed):
  seed = Expand(oprf_seed, concat(credential_identifier, "OprfKey"), Nok)
  (oprf_key, _) = DeriveKeyPair(seed, "OPAQUE-DeriveKeyPair")

  blinded_element = DeserializeElement(request.blinded_message)
  evaluated_element = BlindEvaluate(oprf_key, blinded_element)
  evaluated_message = SerializeElement(evaluated_element)

  Create RegistrationResponse response with (evaluated_message, server_public_key)
  return response
]]></artwork>
        </section>
        <section anchor="finalize-request">
          <name>FinalizeRegistrationRequest</name>
          <t>To create the user record used for subsequent authentication and complete the
registration flow, the client executes the following function.</t>
          <artwork><![CDATA[
FinalizeRegistrationRequest

Input:
- password, an opaque byte string containing the client's password.
- blind, an OPRF scalar value.
- response, a RegistrationResponse structure.
- server_identity, the optional encoded server identity.
- client_identity, the optional encoded client identity.

Output:
- record, a RegistrationRecord structure.
- export_key, an additional client key.

Exceptions:
- DeserializeError, when OPRF element deserialization fails.

def FinalizeRegistrationRequest(password, blind, response, server_identity, client_identity):
  evaluated_element = DeserializeElement(response.evaluated_message)
  oprf_output = Finalize(password, blind, evaluated_element)

  stretched_oprf_output = Stretch(oprf_output)
  randomized_password = Extract("", concat(oprf_output, stretched_oprf_output))

  (envelope, client_public_key, masking_key, export_key) =
    Store(randomized_password, response.server_public_key,
          server_identity, client_identity)
  Create RegistrationRecord record with (client_public_key, masking_key, envelope)
  return (record, export_key)
]]></artwork>
          <t>See <xref target="online-phase"/> for details about the output <tt>export_key</tt> usage.</t>
        </section>
      </section>
    </section>
    <section anchor="online-phase">
      <name>Online Authenticated Key Exchange</name>
      <t>The generic outline of OPAQUE with a 3-message AKE protocol includes three messages:
<tt>KE1</tt>, <tt>KE2</tt>, and <tt>KE3</tt>, where <tt>KE1</tt> and <tt>KE2</tt> include key exchange shares, e.g., DH values, sent
by the client and server, respectively, and <tt>KE3</tt> provides explicit client authentication and
full forward security (without it, forward secrecy is only achieved against eavesdroppers,
which is insufficient for OPAQUE security).</t>
      <t>This section describes the online authenticated key exchange protocol flow,
message encoding, and helper functions. This stage is composed of a concurrent
OPRF and key exchange flow. The key exchange protocol is authenticated using the
client and server credentials established during registration; see <xref target="registration-phase"/>.
In the end, the client proves its knowledge of the password, and both client and
server agree on (1) a mutually authenticated shared secret key and (2) any optional
application information exchange during the handshake.</t>
      <t>In this stage, the client inputs the following values:</t>
      <ul spacing="normal">
        <li>
          <t>password: The client's password.</t>
        </li>
        <li>
          <t>client_identity: The client identity, as described in <xref target="client-material"/>.</t>
        </li>
      </ul>
      <t>The server inputs the following values:</t>
      <ul spacing="normal">
        <li>
          <t>server_private_key: The server's private key for the AKE protocol.</t>
        </li>
        <li>
          <t>server_public_key: The server's public key for the AKE protocol.</t>
        </li>
        <li>
          <t>server_identity: The server identity, as described in <xref target="client-material"/>.</t>
        </li>
        <li>
          <t>record: The <tt>RegistrationRecord</tt> object corresponding to the client's registration.</t>
        </li>
        <li>
          <t>credential_identifier: An identifier that uniquely represents the credential.</t>
        </li>
        <li>
          <t>oprf_seed: The seed used to derive per-client OPRF keys.</t>
        </li>
      </ul>
      <t>The client receives two outputs: a session secret and an export key. The export
key is only available to the client and may be used for additional
application-specific purposes, as outlined in <xref target="export-key-usage"/>.
Clients MUST NOT use the output <tt>export_key</tt> before
authenticating the peer in the authenticated key exchange protocol.
See <xref target="alternate-key-recovery"/> for more details about this
requirement. The server receives a single output: a session secret matching the
client's.</t>
      <t>The protocol runs as shown below:</t>
      <artwork><![CDATA[
  Client                                         Server
 ------------------------------------------------------
  ke1 = GenerateKE1(password)

                         ke1
              ------------------------->

  ke2 = GenerateKE2(server_identity, server_private_key,
                    server_public_key, record,
                    credential_identifier, oprf_seed, ke1)

                         ke2
              <-------------------------

    (ke3,
    session_key,
    export_key) = GenerateKE3(client_identity,
                               server_identity, ke2)

                         ke3
              ------------------------->

                       session_key = ServerFinish(ke3)
]]></artwork>
      <t>Both client and server may use implicit internal state objects to keep necessary
material for the OPRF and AKE, <tt>client_state</tt> and <tt>server_state</tt>, respectively.</t>
      <t>The client state <tt>ClientState</tt> may have the following fields:</t>
      <ul spacing="normal">
        <li>
          <t>password: The client's password.</t>
        </li>
        <li>
          <t>blind: The random blinding inverter returned by <tt>Blind()</tt>.</t>
        </li>
        <li>
          <t>client_ake_state: The <tt>ClientAkeState</tt> defined in <xref target="protocol-3dh"/>.</t>
        </li>
      </ul>
      <t>The server state <tt>ServerState</tt> may have the following fields:</t>
      <ul spacing="normal">
        <li>
          <t>server_ake_state: The <tt>ServerAkeState</tt> defined in <xref target="protocol-3dh"/>.</t>
        </li>
      </ul>
      <t>Both of these states are ephemeral and should be erased after the protocol completes.</t>
      <t>The rest of this section describes these authenticated key exchange messages
and their parameters in more detail. <xref target="ake-messages"/> defines the structure of the
messages passed between client and server in the above setup. <xref target="ake-functions"/>
describes details of the functions and corresponding parameters mentioned above.
<xref target="cred-retrieval"/> discusses internal functions used for retrieving client
credentials, and <xref target="protocol-3dh"/> discusses how these functions are used to execute
the authenticated key exchange protocol.</t>
      <section anchor="ake-messages">
        <name>AKE Messages</name>
        <t>In this section, we define the <tt>KE1</tt>, <tt>KE2</tt>, and <tt>KE3</tt> structs that make up
the AKE messages used in the protocol. <tt>KE1</tt> is composed of a <tt>CredentialRequest</tt>
and <tt>AuthRequest</tt>, and <tt>KE2</tt> is composed of a <tt>CredentialResponse</tt>
and <tt>AuthResponse</tt>.</t>
        <artwork><![CDATA[
struct {
  uint8 client_nonce[Nn];
  uint8 client_public_keyshare[Npk];
} AuthRequest;
]]></artwork>
        <t>client_nonce: A fresh randomly generated nonce of length <tt>Nn</tt>.</t>
        <t>client_public_keyshare: A serialized client ephemeral public key of fixed size <tt>Npk</tt>.</t>
        <artwork><![CDATA[
struct {
  CredentialRequest credential_request;
  AuthRequest auth_request;
} KE1;
]]></artwork>
        <t>credential_request: A <tt>CredentialRequest</tt> structure.</t>
        <t>auth_request: An <tt>AuthRequest</tt> structure.</t>
        <artwork><![CDATA[
struct {
  uint8 server_nonce[Nn];
  uint8 server_public_keyshare[Npk];
  uint8 server_mac[Nm];
} AuthResponse;
]]></artwork>
        <t>server_nonce: A fresh randomly generated nonce of length <tt>Nn</tt>.</t>
        <t>server_public_keyshare: A server ephemeral public key of fixed size <tt>Npk</tt>, where <tt>Npk</tt>
depends on the corresponding prime order group.</t>
        <t>server_mac: An authentication tag computed over the handshake transcript
computed using <tt>Km2</tt>, defined below.</t>
        <artwork><![CDATA[
struct {
  CredentialResponse credential_response;
  AuthResponse auth_response;
} KE2;
]]></artwork>
        <t>credential_response: A <tt>CredentialResponse</tt> structure.</t>
        <t>auth_response: An <tt>AuthResponse</tt> structure.</t>
        <artwork><![CDATA[
struct {
  uint8 client_mac[Nm];
} KE3;
]]></artwork>
        <t>client_mac: An authentication tag computed over the handshake transcript
of fixed size <tt>Nm</tt>, computed using <tt>Km2</tt>, defined below.</t>
      </section>
      <section anchor="ake-functions">
        <name>AKE Functions</name>
        <t>In this section, we define the main functions used to produce the AKE messages
in the protocol. Note that this section relies on definitions of subroutines defined
in later sections:</t>
        <ul spacing="normal">
          <li>
            <t><tt>CreateCredentialRequest</tt>, <tt>CreateCredentialResponse</tt>, <tt>RecoverCredentials</tt>
defined in <xref target="cred-retrieval"/></t>
          </li>
          <li>
            <t><tt>AuthClientStart</tt>, <tt>AuthServerRespond</tt>, <tt>AuthClientFinalize</tt>, and <tt>AuthServerFinalize</tt>
defined in <xref target="ake-client"/> and <xref target="ake-server"/></t>
          </li>
        </ul>
        <section anchor="generateke1">
          <name>GenerateKE1</name>
          <t>The <tt>GenerateKE1</tt> function begins the AKE protocol and produces the client's <tt>KE1</tt>
output for the server.</t>
          <artwork><![CDATA[
GenerateKE1

State:
- state, a ClientState structure.

Input:
- password, an opaque byte string containing the client's password.

Output:
- ke1, a KE1 message structure.

def GenerateKE1(password):
  request, blind = CreateCredentialRequest(password)
  state.password = password
  state.blind = blind
  ke1 = AuthClientStart(request)
  return ke1
]]></artwork>
        </section>
        <section anchor="generateke2">
          <name>GenerateKE2</name>
          <t>The <tt>GenerateKE2</tt> function continues the AKE protocol by processing the client's <tt>KE1</tt> message
and producing the server's <tt>KE2</tt> output.</t>
          <artwork><![CDATA[
GenerateKE2

State:
- state, a ServerState structure.

Input:
- server_identity, the optional encoded server identity, which is set to
  server_public_key if not specified.
- server_private_key, the server's private key.
- server_public_key, the server's public key.
- record, the client's RegistrationRecord structure.
- credential_identifier, an identifier that uniquely represents the credential.
- oprf_seed, the server-side seed of Nh bytes used to generate an oprf_key.
- ke1, a KE1 message structure.
- client_identity, the optional encoded client identity, which is set to
  client_public_key if not specified.

Output:
- ke2, a KE2 structure.

def GenerateKE2(server_identity, server_private_key, server_public_key,
               record, credential_identifier, oprf_seed, ke1, client_identity):
  credential_response = CreateCredentialResponse(ke1.credential_request, server_public_key, record,
    credential_identifier, oprf_seed)
  cleartext_credentials = CreateCleartextCredentials(server_public_key,
                      record.client_public_key, server_identity, client_identity)
  auth_response = AuthServerRespond(cleartext_credentials, server_private_key,
                      record.client_public_key, ke1, credential_response)
  Create KE2 ke2 with (credential_response, auth_response)
  return ke2
]]></artwork>
        </section>
        <section anchor="generateke3">
          <name>GenerateKE3</name>
          <t>The <tt>GenerateKE3</tt> function completes the AKE protocol for the client and
produces the client's <tt>KE3</tt> output for the server, as well as the <tt>session_key</tt>
and <tt>export_key</tt> outputs from the AKE.</t>
          <artwork><![CDATA[
GenerateKE3

State:
- state, a ClientState structure.

Input:
- client_identity, the optional encoded client identity, which is set
  to client_public_key if not specified.
- server_identity, the optional encoded server identity, which is set
  to server_public_key if not specified.
- ke2, a KE2 message structure.

Output:
- ke3, a KE3 message structure.
- session_key, the session's shared secret.
- export_key, an additional client key.

def GenerateKE3(client_identity, server_identity, ke2):
  (client_private_key, cleartext_credentials, export_key) =
    RecoverCredentials(state.password, state.blind, ke2.credential_response,
                       server_identity, client_identity)
  (ke3, session_key) =
    AuthClientFinalize(cleartext_credentials, client_private_key, ke2)
  return (ke3, session_key, export_key)
]]></artwork>
        </section>
        <section anchor="serverfinish">
          <name>ServerFinish</name>
          <t>The <tt>ServerFinish</tt> function completes the AKE protocol for the server, yielding the <tt>session_key</tt>.
Since the OPRF is a two-message protocol, <tt>KE3</tt> has no element of the OPRF, and it, therefore,
invokes the AKE's <tt>AuthServerFinalize</tt> directly. The <tt>AuthServerFinalize</tt> function
takes <tt>KE3</tt> as input and MUST verify the client authentication material it contains
before the <tt>session_key</tt> value can be used. This verification is necessary to ensure
forward secrecy against active attackers.</t>
          <artwork><![CDATA[
ServerFinish

State:
- state, a ServerState structure.

Input:
- ke3, a KE3 structure.

Output:
- session_key, the shared session secret if and only if ke3 is valid.

def ServerFinish(ke3):
  return AuthServerFinalize(ke3)
]]></artwork>
          <t>This function MUST NOT return the <tt>session_key</tt> value if the client authentication
material is invalid, and may instead return an appropriate error message such as
<tt>ClientAuthenticationError</tt>, invoked from <tt>AuthServerFinalize</tt>.</t>
        </section>
      </section>
      <section anchor="cred-retrieval">
        <name>Credential Retrieval</name>
        <t>This section describes the sub-protocol run during authentication to retrieve and
recover the client credentials.</t>
        <section anchor="credential-retrieval-messages">
          <name>Credential Retrieval Messages</name>
          <t>This section describes the <tt>CredentialRequest</tt> and <tt>CredentialResponse</tt> messages exchanged
between client and server to perform credential retrieval.</t>
          <artwork><![CDATA[
struct {
  uint8 blinded_message[Noe];
} CredentialRequest;
]]></artwork>
          <t>blinded_message: A serialized OPRF group element.</t>
          <artwork><![CDATA[
struct {
  uint8 evaluated_message[Noe];
  uint8 masking_nonce[Nn];
  uint8 masked_response[Npk + Nn + Nm];
} CredentialResponse;
]]></artwork>
          <t>evaluated_message: A serialized OPRF group element.</t>
          <t>masking_nonce: A nonce used for the confidentiality of the
<tt>masked_response</tt> field.</t>
          <t>masked_response: An encrypted form of the server's public key and the
client's <tt>Envelope</tt> structure.</t>
        </section>
        <section anchor="credential-retrieval-functions">
          <name>Credential Retrieval Functions</name>
          <t>This section describes the <tt>CreateCredentialRequest</tt>, <tt>CreateCredentialResponse</tt>,
and <tt>RecoverCredentials</tt> functions used for credential retrieval.</t>
          <section anchor="create-credential-request">
            <name>CreateCredentialRequest</name>
            <t>The <tt>CreateCredentialRequest</tt> is used by the client to initiate the credential
retrieval process, and it produces a <tt>CredentialRequest</tt> message and OPRF state.
Like <tt>CreateRegistrationRequest</tt>, this function can fail with an <tt>InvalidInputError</tt>
error with negligible probability. However, this should not occur since
registration (via <tt>CreateRegistrationRequest</tt>) will fail when provided the same
password input.</t>
            <artwork><![CDATA[
CreateCredentialRequest

Input:
- password, an opaque byte string containing the client's password.

Output:
- request, a CredentialRequest structure.
- blind, an OPRF scalar value.

Exceptions:
- InvalidInputError, when Blind fails

def CreateCredentialRequest(password):
  (blind, blinded_element) = Blind(password)
  blinded_message = SerializeElement(blinded_element)
  Create CredentialRequest request with blinded_message
  return (request, blind)
]]></artwork>
          </section>
          <section anchor="create-credential-response">
            <name>CreateCredentialResponse</name>
            <t>The <tt>CreateCredentialResponse</tt> function is used by the server to process the client's
<tt>CredentialRequest</tt> message and complete the credential retrieval process, producing
a <tt>CredentialResponse</tt>.</t>
            <t>There are two scenarios to handle for the construction of a <tt>CredentialResponse</tt>
object: either the record for the client exists (corresponding to a properly
registered client), or it was never created (corresponding to an unregistered
client identity, possibly the result of an enumeration attack attempt).</t>
            <t>In the case of an existing record with the corresponding identifier
<tt>credential_identifier</tt>, the server invokes the following function to
produce a <tt>CredentialResponse</tt>:</t>
            <artwork><![CDATA[
CreateCredentialResponse

Input:
- request, a CredentialRequest structure.
- server_public_key, the public key of the server.
- record, an instance of RegistrationRecord which is the server's
  output from registration.
- credential_identifier, an identifier that uniquely represents the credential.
- oprf_seed, the server-side seed of Nh bytes used to generate an oprf_key.

Output:
- response, a CredentialResponse structure.

Exceptions:
- DeserializeError, when OPRF element deserialization fails.

def CreateCredentialResponse(request, server_public_key, record,
                             credential_identifier, oprf_seed):
  seed = Expand(oprf_seed, concat(credential_identifier, "OprfKey"), Nok)
  (oprf_key, _) = DeriveKeyPair(seed, "OPAQUE-DeriveKeyPair")

  blinded_element = DeserializeElement(request.blinded_message)
  evaluated_element = BlindEvaluate(oprf_key, blinded_element)
  evaluated_message = SerializeElement(evaluated_element)

  masking_nonce = random(Nn)
  credential_response_pad = Expand(record.masking_key,
                                   concat(masking_nonce, "CredentialResponsePad"),
                                   Npk + Nn + Nm)
  masked_response = xor(credential_response_pad,
                        concat(server_public_key, record.envelope))
  Create CredentialResponse response with (evaluated_message, masking_nonce, masked_response)
  return response
]]></artwork>
            <t>In the case of a record that does not exist and if client enumeration prevention is desired,
the server MUST respond to the credential request to fake the existence of the record.
The server SHOULD invoke the <tt>CreateCredentialResponse</tt> function with a fake client record
argument that is configured so that:</t>
            <ul spacing="normal">
              <li>
                <t><tt>record.client_public_key</tt> is set to a randomly generated public key of length <tt>Npk</tt></t>
              </li>
              <li>
                <t><tt>record.masking_key</tt> is set to a random byte string of length <tt>Nh</tt></t>
              </li>
              <li>
                <t><tt>record.envelope</tt> is set to the byte string consisting only of zeros of length <tt>Nn + Nm</tt></t>
              </li>
            </ul>
            <t>It is RECOMMENDED that a fake client record is created once (e.g. as the first user record
of the application) and stored alongside legitimate client records. This allows servers to retrieve
the record in a time comparable to that of a legitimate client record.</t>
            <t>Note that the responses output by either scenario are indistinguishable to an adversary
that is unable to guess the registered password for the client corresponding to <tt>credential_identifier</tt>.</t>
          </section>
          <section anchor="recover-credentials">
            <name>RecoverCredentials</name>
            <t>The <tt>RecoverCredentials</tt> function is used by the client to process the server's
<tt>CredentialResponse</tt> message and produce the client's private key, server public
key, and the <tt>export_key</tt>.</t>
            <artwork><![CDATA[
RecoverCredentials

Input:
- password, an opaque byte string containing the client's password.
- blind, an OPRF scalar value.
- response, a CredentialResponse structure.
- server_identity, The optional encoded server identity.
- client_identity, The encoded client identity.

Output:
- client_private_key, the encoded client private key for the AKE protocol.
- cleartext_credentials, a CleartextCredentials structure.
- export_key, an additional client key.

Exceptions:
- DeserializeError, when OPRF element deserialization fails.

def RecoverCredentials(password, blind, response,
                       server_identity, client_identity):
  evaluated_element = DeserializeElement(response.evaluated_message)

  oprf_output = Finalize(password, blind, evaluated_element)
  stretched_oprf_output = Stretch(oprf_output)
  randomized_password = Extract("", concat(oprf_output, stretched_oprf_output))

  masking_key = Expand(randomized_password, "MaskingKey", Nh)
  credential_response_pad = Expand(masking_key,
                                   concat(response.masking_nonce, "CredentialResponsePad"),
                                   Npk + Nn + Nm)
  concat(server_public_key, envelope) = xor(credential_response_pad,
                                              response.masked_response)
  (client_private_key, cleartext_credentials, export_key) =
    Recover(randomized_password, server_public_key, envelope,
            server_identity, client_identity)

  return (client_private_key, cleartext_credentials, export_key)
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="protocol-3dh">
        <name>3DH Protocol</name>
        <t>This section describes the authenticated key exchange protocol for OPAQUE using
3DH, a 3-message AKE which satisfies the forward secrecy and KCI properties
discussed in <xref target="security-considerations"/>.</t>
        <t>The client AKE state <tt>ClientAkeState</tt> mentioned in <xref target="online-phase"/> has the
following fields:</t>
        <ul spacing="normal">
          <li>
            <t>client_secret: An opaque byte string of length <tt>Nsk</tt>.</t>
          </li>
          <li>
            <t>ke1: A value of type <tt>KE1</tt>.</t>
          </li>
        </ul>
        <t>The server AKE state <tt>ServerAkeState</tt> mentioned in <xref target="online-phase"/> has the
following fields:</t>
        <ul spacing="normal">
          <li>
            <t>expected_client_mac: An opaque byte string of length <tt>Nm</tt>.</t>
          </li>
          <li>
            <t>session_key: An opaque byte string of length <tt>Nx</tt>.</t>
          </li>
        </ul>
        <t><xref target="ake-client"/> and <xref target="ake-server"/> specify the inner workings of client and
server functions, respectively.</t>
        <section anchor="key-creation">
          <name>3DH Key Exchange Functions</name>
          <t>We assume the following functions to exist for all Diffie-Hellman key exchange
variants:</t>
          <ul spacing="normal">
            <li>
              <t>DeriveDiffieHellmanKeyPair(seed): Derive a private and public Diffie-Hellman
key pair deterministically from the input <tt>seed</tt>. The type of the private key
depends on the implementation, whereas the type of the public key is a
byte string of <tt>Npk</tt> bytes.</t>
            </li>
            <li>
              <t>DiffieHellman(k, B): A function that performs the Diffie-Hellman operation
between the private input <tt>k</tt> and public input <tt>B</tt>.
The output of this function is a unique, fixed-length byte string.</t>
            </li>
          </ul>
          <t>It is RECOMMENDED to use Elliptic Curve Diffie-Hellman for this key exchange protocol.
Implementations for recommended groups in <xref target="configurations"/>, as well as groups
covered by test vectors in <xref target="test-vectors"/>, are described in the following sections.</t>
          <section anchor="dh-ristretto255">
            <name>3DH ristretto255</name>
            <t>This section describes the implementation of the Diffie-Hellman key exchange functions based on ristretto255,
as defined in <xref target="RISTRETTO"/>.</t>
            <ul spacing="normal">
              <li>
                <t>DeriveDiffieHellmanKeyPair(seed): This function is implemented as
DeriveKeyPair(seed, "OPAQUE-DeriveDiffieHellmanKeyPair"), where DeriveKeyPair is
as specified in <xref section="3.2" sectionFormat="comma" target="RFC9497"/>. The public value from DeriveKeyPair
is encoded using SerializeElement from <xref section="2.1" sectionFormat="of" target="RFC9497"/>.</t>
              </li>
              <li>
                <t>DiffieHellman(k, B): Implemented as scalar multiplication as described in
<xref section="4" sectionFormat="of" target="RISTRETTO"/> after decoding <tt>B</tt> from its encoded input using
the Decode function in <xref section="4.3.1" sectionFormat="of" target="RISTRETTO"/>. The output is then
encoded using the SerializeElement function of the OPRF group described in
<xref section="2.1" sectionFormat="comma" target="RFC9497"/>.</t>
              </li>
            </ul>
          </section>
          <section anchor="dh-p-256">
            <name>3DH P-256</name>
            <t>This section describes the implementation of the Diffie-Hellman key exchange functions based on NIST P-256,
as defined in <xref target="NISTCurves"/>.</t>
            <ul spacing="normal">
              <li>
                <t>DeriveDiffieHellmanKeyPair(seed): This function is implemented as
DeriveKeyPair(seed, "OPAQUE-DeriveDiffieHellmanKeyPair"), where DeriveKeyPair is
as specified in <xref section="3.2" sectionFormat="comma" target="RFC9497"/>. The public value from DeriveKeyPair
is encoded using SerializeElement from <xref section="2.1" sectionFormat="of" target="RFC9497"/>.</t>
              </li>
              <li>
                <t>DiffieHellman(k, B): Implemented as scalar multiplication as described in
<xref target="NISTCurves"/>, after decoding <tt>B</tt> from its encoded input using
the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="NISTCurves"/>.
The output is then encoded using the SerializeElement function of the OPRF
group described in <xref section="2.1" sectionFormat="comma" target="RFC9497"/>.</t>
              </li>
            </ul>
          </section>
          <section anchor="dh-curve25519">
            <name>3DH Curve25519</name>
            <t>This section describes the implementation of the Diffie-Hellman key exchange functions based on Curve25519,
as defined in <xref target="Curve25519"/>.</t>
            <ul spacing="normal">
              <li>
                <t>DeriveDiffieHellmanKeyPair(seed): This function is implemented by returning the private
key <tt>k</tt> based on seed (of length <tt>Nseed = 32</tt> bytes), as described in <xref section="5" sectionFormat="of" target="Curve25519"/>,
as well as the result of DiffieHellman(k, B), where B is the base point of Curve25519.</t>
              </li>
              <li>
                <t>DiffieHellman(k, B): Implemented using the X25519 function in <xref section="5" sectionFormat="of" target="Curve25519"/>.
The output is then used raw, with no processing.</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="key-schedule-functions">
          <name>Key Schedule Functions</name>
          <t>This section contains functions used for the AKE key schedule.</t>
          <section anchor="transcript-functions">
            <name>Transcript Functions</name>
            <t>The OPAQUE-3DH key derivation procedures make use of the functions below,
re-purposed from TLS 1.3 <xref target="RFC8446"/>.</t>
            <artwork><![CDATA[
Expand-Label(Secret, Label, Context, Length) =
    Expand(Secret, CustomLabel, Length)
]]></artwork>
            <t>Where CustomLabel is specified as:</t>
            <artwork><![CDATA[
struct {
  uint16 length = Length;
  opaque label<8..255> = "OPAQUE-" + Label;
  uint8 context<0..255> = Context;
} CustomLabel;

Derive-Secret(Secret, Label, Transcript-Hash) =
    Expand-Label(Secret, Label, Transcript-Hash, Nx)
]]></artwork>
            <t>Note that the <tt>Label</tt> parameter is not a NULL-terminated string.</t>
            <t>OPAQUE-3DH can optionally include application-specific, shared <tt>context</tt> information in the
transcript, such as configuration parameters or application-specific info, e.g.
"appXYZ-v1.2.3".</t>
            <t>The OPAQUE-3DH key schedule requires a preamble, which is computed as follows.</t>
            <artwork><![CDATA[
Preamble

Parameters:
- context, optional shared context information.

Input:
- client_identity, the optional encoded client identity, which is set
  to client_public_key if not specified.
- ke1, a KE1 message structure.
- server_identity, the optional encoded server identity, which is set
  to server_public_key if not specified.
- credential_response, the corresponding field on the KE2 structure.
- server_nonce, the corresponding field on the AuthResponse structure.
- server_public_keyshare, the corresponding field on the AuthResponse structure.

Output:
- preamble, the protocol transcript with identities and messages.

def Preamble(client_identity, ke1, server_identity, credential_response,
             server_nonce, server_public_keyshare):
  preamble = concat("OPAQUEv1-",
                     I2OSP(len(context), 2), context,
                     I2OSP(len(client_identity), 2), client_identity,
                     ke1,
                     I2OSP(len(server_identity), 2), server_identity,
                     credential_response,
                     server_nonce,
                     server_public_keyshare)
  return preamble
]]></artwork>
          </section>
          <section anchor="shared-secret-derivation">
            <name>Shared Secret Derivation</name>
            <t>The OPAQUE-3DH shared secret derived during the key exchange protocol is
computed using the following helper function.</t>
            <artwork><![CDATA[
DeriveKeys

Input:
- ikm, input key material.
- preamble, the protocol transcript with identities and messages.

Output:
- Km2, a MAC authentication key.
- Km3, a MAC authentication key.
- session_key, the shared session secret.

def DeriveKeys(ikm, preamble):
  prk = Extract("", ikm)
  handshake_secret = Derive-Secret(prk, "HandshakeSecret", Hash(preamble))
  session_key = Derive-Secret(prk, "SessionKey", Hash(preamble))
  Km2 = Derive-Secret(handshake_secret, "ServerMAC", "")
  Km3 = Derive-Secret(handshake_secret, "ClientMAC", "")
  return (Km2, Km3, session_key)
]]></artwork>
          </section>
        </section>
        <section anchor="ake-client">
          <name>3DH Client Functions</name>
          <t>The <tt>AuthClientStart</tt> function is used by the client to create a
<tt>KE1</tt> structure.</t>
          <artwork><![CDATA[
AuthClientStart

Parameters:
- Nn, the nonce length.

State:
- state, a ClientAkeState structure.

Input:
- credential_request, a CredentialRequest structure.

Output:
- ke1, a KE1 structure.

def AuthClientStart(credential_request):
  client_nonce = random(Nn)
  client_keyshare_seed = random(Nseed)
  (client_secret, client_public_keyshare) = DeriveDiffieHellmanKeyPair(client_keyshare_seed)
  Create AuthRequest auth_request with (client_nonce, client_public_keyshare)
  Create KE1 ke1 with (credential_request, auth_request)
  state.client_secret = client_secret
  state.ke1 = ke1
  return ke1
]]></artwork>
          <t>The <tt>AuthClientFinalize</tt> function is used by the client to create a <tt>KE3</tt>
message and output <tt>session_key</tt> using the server's <tt>KE2</tt> message and
recovered credential information.</t>
          <artwork><![CDATA[
AuthClientFinalize

State:
- state, a ClientAkeState structure.

Input:
- cleartext_credentials, a CleartextCredentials structure.
- client_private_key, the client's private key.
- ke2, a KE2 message structure.

Output:
- ke3, a KE3 structure.
- session_key, the shared session secret.

Exceptions:
- ServerAuthenticationError, the handshake fails.

def AuthClientFinalize(cleartext_credentials, client_private_key, ke2):

  dh1 = DiffieHellman(state.client_secret, ke2.auth_response.server_public_keyshare)
  dh2 = DiffieHellman(state.client_secret, cleartext_credentials.server_public_key)
  dh3 = DiffieHellman(client_private_key, ke2.auth_response.server_public_keyshare)
  ikm = concat(dh1, dh2, dh3)

  preamble = Preamble(cleartext_credentials.client_identity,
                      state.ke1,
                      cleartext_credentials.server_identity,
                      ke2.credential_response,
                      ke2.auth_response.server_nonce,
                      ke2.auth_response.server_public_keyshare)
  Km2, Km3, session_key = DeriveKeys(ikm, preamble)
  expected_server_mac = MAC(Km2, Hash(preamble))
  if !ct_equal(ke2.auth_response.server_mac, expected_server_mac),
    raise ServerAuthenticationError
  client_mac = MAC(Km3, Hash(concat(preamble, expected_server_mac)))
  Create KE3 ke3 with client_mac
  return (ke3, session_key)
]]></artwork>
        </section>
        <section anchor="ake-server">
          <name>3DH Server Functions</name>
          <t>The <tt>AuthServerRespond</tt> function is used by the server to process the client's
<tt>KE1</tt> message and public credential information to create a <tt>KE2</tt> message.</t>
          <artwork><![CDATA[
AuthServerRespond

Parameters:
- Nn, the nonce length.

State:
- state, a ServerAkeState structure.

Input:
- cleartext_credentials, a CleartextCredentials structure.
- server_private_key, the server's private key.
- client_public_key, the client's public key.
- ke1, a KE1 message structure.

Output:
- auth_response, an AuthResponse structure.

def AuthServerRespond(cleartext_credentials, server_private_key, client_public_key, ke1, credential_response):
  server_nonce = random(Nn)
  server_keyshare_seed = random(Nseed)
  (server_private_keyshare, server_public_keyshare) = DeriveDiffieHellmanKeyPair(server_keyshare_seed)
  preamble = Preamble(cleartext_credentials.client_identity,
                      ke1,
                      cleartext_credentials.server_identity,
                      credential_response,
                      server_nonce,
                      server_public_keyshare)

  dh1 = DiffieHellman(server_private_keyshare, ke1.auth_request.client_public_keyshare)
  dh2 = DiffieHellman(server_private_key, ke1.auth_request.client_public_keyshare)
  dh3 = DiffieHellman(server_private_keyshare, client_public_key)
  ikm = concat(dh1, dh2, dh3)

  Km2, Km3, session_key = DeriveKeys(ikm, preamble)
  server_mac = MAC(Km2, Hash(preamble))

  state.expected_client_mac = MAC(Km3, Hash(concat(preamble, server_mac)))
  state.session_key = session_key
  Create AuthResponse auth_response with (server_nonce, server_public_keyshare, server_mac)
  return auth_response
]]></artwork>
          <t>The <tt>AuthServerFinalize</tt> function is used by the server to process the client's
<tt>KE3</tt> message and output the final <tt>session_key</tt>.</t>
          <artwork><![CDATA[
AuthServerFinalize

State:
- state, a ServerAkeState structure.

Input:
- ke3, a KE3 structure.

Output:
- session_key, the shared session secret if and only if ke3 is valid.

Exceptions:
- ClientAuthenticationError, the handshake fails.

def AuthServerFinalize(ke3):
  if !ct_equal(ke3.client_mac, state.expected_client_mac):
    raise ClientAuthenticationError
  return state.session_key
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="configurations">
      <name>Configurations</name>
      <t>An OPAQUE-3DH configuration is a tuple (OPRF, KDF, MAC, Hash, KSF, Group, Context)
such that the following conditions are met:</t>
      <ul spacing="normal">
        <li>
          <t>The OPRF protocol uses the "base mode" variant of <xref target="RFC9497"/> and implements
the interface in <xref target="dependencies"/>. Examples include ristretto255-SHA512 and
P256-SHA256.</t>
        </li>
        <li>
          <t>The KDF, MAC, and Hash functions implement the interfaces in <xref target="dependencies"/>.
Examples include HKDF <xref target="RFC5869"/> for the KDF, HMAC <xref target="RFC2104"/> for the MAC,
and SHA-256 and SHA-512 for the Hash functions. If an extensible output function
such as SHAKE128 <xref target="FIPS202"/> is used then the output length <tt>Nh</tt> MUST be chosen
to align with the target security level of the OPAQUE configuration. For example,
if the target security parameter for the configuration is 128 bits, then <tt>Nh</tt> SHOULD
be at least 32 bytes.</t>
        </li>
        <li>
          <t>The KSF is determined by the application and implements the interface in
<xref target="dependencies"/>. As noted, collision resistance is required. Examples for KSF
include Argon2id <xref target="ARGON2"/>, scrypt <xref target="SCRYPT"/>, and PBKDF2
<xref target="PBKDF2"/> with fixed parameter choices. See <xref target="app-considerations"/>
for more information about this choice of function.</t>
        </li>
        <li>
          <t>The Group mode identifies the group used in the OPAQUE-3DH AKE. This SHOULD
match that of the OPRF. For example, if the OPRF is ristretto255-SHA512,
then Group SHOULD be ristretto255.</t>
        </li>
      </ul>
      <t>Context is the shared parameter used to construct the preamble in <xref target="transcript-functions"/>.
This parameter SHOULD include any application-specific configuration information or
parameters that are needed to prevent cross-protocol or downgrade attacks.</t>
      <t>Absent an application-specific profile, the following configurations are RECOMMENDED:</t>
      <ul spacing="normal">
        <li>
          <t>ristretto255-SHA512, HKDF-SHA-512, HMAC-SHA-512, SHA-512,
  Argon2id(S = zeroes(16), p = 4, T = Nh, m = 2^21, t = 1, v = 0x13, K = nil, X = nil, y = 2), ristretto255</t>
        </li>
        <li>
          <t>P256-SHA256, HKDF-SHA-256, HMAC-SHA-256, SHA-256,
  Argon2id(S = zeroes(16), p = 4, T = Nh, m = 2^21, t = 1, v = 0x13, K = nil, X = nil, y = 2), P-256</t>
        </li>
        <li>
          <t>P256-SHA256, HKDF-SHA-256, HMAC-SHA-256, SHA-256, scrypt(N = 32768, r = 8, p = 1), P-256</t>
        </li>
      </ul>
      <t>The above recommended configurations target 128-bit security.</t>
      <t>Future configurations may specify different combinations of dependent algorithms,
with the following considerations:</t>
      <ol spacing="normal" type="1"><li>
          <t>The size of AKE public and private keys -- <tt>Npk</tt> and <tt>Nsk</tt>, respectively -- must adhere
to the output length limitations of the KDF Expand function. If HKDF is used, this means
Npk, Nsk &lt;= 255 * Nx, where Nx is the output size of the underlying hash function.
See <xref target="RFC5869"/> for details.</t>
        </li>
        <li>
          <t>The output size of the Hash function SHOULD be long enough to produce a key for
MAC of suitable length. For example, if MAC is HMAC-SHA256, then <tt>Nh</tt> could be
32 bytes.</t>
        </li>
      </ol>
    </section>
    <section anchor="app-considerations">
      <name>Application Considerations</name>
      <t>Beyond choosing an appropriate configuration, there are several parameters which
applications can use to control OPAQUE:</t>
      <ul spacing="normal">
        <li>
          <t>Credential identifier: As described in <xref target="registration-phase"/>, this is a unique
handle to the client's credential being stored. In applications where there are alternate
client identities that accompany an account, such as a username or email address, this
identifier can be set to those alternate values. For simplicity, applications may choose
to set <tt>credential_identifier</tt> to be equal to <tt>client_identity</tt>. Applications
MUST NOT use the same credential identifier for multiple clients.</t>
        </li>
        <li>
          <t>Context information: As described in <xref target="configurations"/>, applications may include
a shared context string that is authenticated as part of the handshake. This parameter
SHOULD include any configuration information or parameters that are needed to prevent
cross-protocol or downgrade attacks. This context information is not sent over the
wire in any key exchange messages. However, applications may choose to send it alongside
key exchange messages if needed for their use case.</t>
        </li>
        <li>
          <t>Client and server identities: As described in <xref target="client-material"/>, clients
and servers are identified with their public keys by default. However, applications
may choose alternate identities that are pinned to these public keys. For example,
servers may use a domain name instead of a public key as their identifier. Absent
alternate notions of identity, applications SHOULD set these identities to nil
and rely solely on public key information.</t>
        </li>
        <li>
          <t>Configuration and envelope updates: Applications may wish to update or change their
configuration or other parameters that affect the client's RegistrationRecord over
time. Some reasons for changing these are to use different cryptographic algorithms,
e.g., a different KSF with improved parameters, or to update key material that is
cryptographically bound to the RegistrationRecord, such as the server's public key
(server_public_key). Any such change will require users to re-register to create a
new RegistrationRecord. Supporting these types of updates can be helpful for applications
that anticipate such changes in their deployment setting.</t>
        </li>
        <li>
          <t>Password hardening parameters: Key stretching is done to help prevent password disclosure
in the event of server compromise; see <xref target="key-stretch"/>. There is no ideal or default
set of parameters, though relevant specifications for KSFs give some reasonable
defaults.</t>
        </li>
        <li>
          <t>Enumeration prevention: As described in <xref target="create-credential-response"/>, if servers
receive a credential request for a non-existent client, they SHOULD respond with a
"fake" response to prevent active client enumeration attacks. Servers that
implement this mitigation SHOULD use the same configuration information (such as
the oprf_seed) for all clients; see <xref target="preventing-client-enumeration"/>. In settings
where this attack is not a concern, servers may choose to not support this functionality.</t>
        </li>
        <li>
          <t>Handling password changes: In the event of a password change, the client and
server can run the registration phase using the new password as a
fresh instance (ensuring to resample all random values). The resulting
registration record can then replace the previous record corresponding to
the client's old password registration.</t>
        </li>
      </ul>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <t>This section documents considerations for OPAQUE implementations. This includes
implementation safeguards and error handling considerations.</t>
      <section anchor="implementation-safeguards">
        <name>Implementation Safeguards</name>
        <t>Certain information created, exchanged, and processed in OPAQUE is sensitive.
Specifically, all private key material and intermediate values, along with the
outputs of the key exchange phase, are all secret. Implementations should not
retain these values in memory when no longer needed. Moreover, all operations,
particularly the cryptographic and group arithmetic operations, should be
constant-time and independent of the bits of any secrets. This includes any
conditional branching during the creation of the credential response, as needed
to mitigate client enumeration attacks.</t>
        <t>As specified in <xref target="registration-phase"/> and <xref target="online-phase"/>, OPAQUE only requires
the client password as input to the OPRF for registration and authentication.
However, if <tt>client_identity</tt> can be bound to the client's registration record
(in that the identity will not change during the lifetime of the record),
then an implementation SHOULD incorporate <tt>client_identity</tt> alongside the
password as input to the OPRF. Furthermore, it is RECOMMENDED to incorporate
<tt>server_identity</tt> alongside the password as input to the OPRF. These
additions provide domain separation for clients and servers; see
<xref target="security-analysis"/>.</t>
        <t>Finally, note that online guessing attacks (against any aPAKE) can be done from
both the client side and the server side. In particular, a malicious server can
attempt to simulate honest responses to learn the client's password.
While this constitutes an exhaustive online attack, hence as expensive as an
online guessing attack from the client side, it can be mitigated when the channel
between client and server is authenticated, e.g., using server-authenticated TLS.
In such cases, these online attacks are limited to clients and the authenticated server
itself. Moreover, such a channel provides privacy of user information, including identity
and envelope values.</t>
      </section>
      <section anchor="error-considerations">
        <name>Error Considerations</name>
        <t>Some functions included in this specification are fallible. For example, the
authenticated key exchange protocol may fail because the client's password was
incorrect or the authentication check failed, yielding an error. The explicit
errors generated throughout this specification, along with conditions that lead
to each error, are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>EnvelopeRecoveryError: The envelope Recover function failed to produce any
authentication key material; <xref target="envelope-recovery"/>.</t>
          </li>
          <li>
            <t>ServerAuthenticationError: The client failed to complete the authenticated
key exchange protocol with the server; <xref target="ake-client"/>.</t>
          </li>
          <li>
            <t>ClientAuthenticationError: The server failed to complete the authenticated
key exchange protocol with the client; <xref target="ake-server"/>.</t>
          </li>
        </ul>
        <t>Beyond these explicit errors, OPAQUE implementations can produce implicit errors.
For example, if protocol messages sent between client and server do not match
their expected size, an implementation should produce an error. More generally,
if any protocol message received from the peer is invalid, perhaps because the
message contains an invalid public key (indicated by the AKE DeserializeElement
function failing) or an invalid OPRF element (indicated by the OPRF DeserializeElement),
then an implementation should produce an error.</t>
        <t>The errors in this document are meant as a guide for implementors. They are not an
exhaustive list of all the errors an implementation might emit. For example, an
implementation might run out of memory.</t>
        <!--
TODO(caw): As part of https://github.com/cfrg/draft-irtf-cfrg-opaque/issues/312, address
the failure case that occurs when Blind fails, noting that this is an exceptional case that
happens with negligible probability
-->

</section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>OPAQUE is defined as the composition of two functionalities: an OPRF and
an AKE protocol. It can be seen as a "compiler" for transforming any AKE
protocol (with KCI security and forward secrecy; see below)
into a secure aPAKE protocol. In OPAQUE, the client derives a private key
during password registration and retrieves this key each time
it needs to authenticate to the server. The OPRF security properties
ensure that only the correct password can unlock the private key
while at the same time avoiding potential offline guessing attacks.
This general composability property provides great flexibility and
enables a variety of OPAQUE instantiations, from optimized
performance to integration with existing authenticated key exchange
protocols such as TLS.</t>
      <section anchor="notable-design-differences">
        <name>Notable Design Differences</name>
        <t>The specification as written here differs from the original cryptographic design in <xref target="JKX18"/>
and the corresponding CFRG document <xref target="I-D.krawczyk-cfrg-opaque-03"/>, both of which were used
as input to the CFRG PAKE competition. This section describes these differences, including
their motivation and explanation as to why they preserve the provable security of OPAQUE based
on <xref target="JKX18"/>.</t>
        <t>The following list enumerates important functional differences that were made
as part of the protocol specification process to address application or
implementation considerations.</t>
        <ul spacing="normal">
          <li>
            <t>Clients construct envelope contents without revealing the password to the
server, as described in <xref target="registration-phase"/>, whereas the servers construct
envelopes in <xref target="JKX18"/>. This change adds to the security of the protocol.
<xref target="JKX18"/> considered the case where the envelope was constructed by the
server for reasons of compatibility with previous UC modeling. <xref target="HJKW23"/>
analyzes the registration phase as specified in this document. This
change was made to support registration flows where the client chooses the
password and wishes to keep it secret from the server, and it is compatible
with the variant in <xref target="JKX18"/> that was originally analyzed.</t>
          </li>
          <li>
            <t>Envelopes do not contain encrypted credentials. Instead, envelopes contain
information used to derive client private key material for the AKE.
This change improves the assumption behind the protocol by getting rid of
equivocality and random key robustness for the encryption function.
The random-key robustness property defined in <xref target="deps-symmetric"/> is only
needed for the MAC function. This change was made for two reasons. First, it
reduces the number of bytes stored in envelopes, which is a helpful
improvement for large applications of OPAQUE with many registered users.
Second, it removes the need for client applications to generate private
keys during registration. Instead, this responsibility is handled by OPAQUE,
thereby simplifying the client interface to the protocol.</t>
          </li>
          <li>
            <t>Envelopes are masked with a per-user masking key as a way of preventing
client enumeration attacks. See <xref target="preventing-client-enumeration"/> for more
details. This extension is not needed for the security of OPAQUE as an aPAKE
but only used to provide a defense against enumeration attacks. In the
analysis, the masking key can be simulated as a (pseudo) random key. This
change was made to support real-world use cases where client or user
enumeration is a security (or privacy) risk.</t>
          </li>
          <li>
            <t>Per-user OPRF keys are derived from a client identity and cross-user PRF seed
as a mitigation against client enumeration attacks. See
<xref target="preventing-client-enumeration"/> for more details. The analysis of OPAQUE
assumes OPRF keys of different users are independently random or
pseudorandom. Deriving these keys via a single PRF (i.e., with a single
cross-user key) applied to users' identities satisfies this assumption.
This change was made to support real-world use cases where client or user
enumeration is a security (or privacy) risk. Note that the derivation of the
OPRF key via a PRF keyed by <tt>oprf_seed</tt> and applied to the unique
<tt>credential_identifier</tt> ensures the critical requirement of the per-user OPRF keys
being unique per client.</t>
          </li>
          <li>
            <t>The protocol outputs an export key for the client in addition to a shared
session key that can be used for application-specific purposes. This key
is a pseudorandom value derived from the client password (among other values) and
has no influence on the security analysis (it can be simulated with a
random output). This change was made to support more application use cases
for OPAQUE, such as the use of OPAQUE for end-to-end encrypted backups;
see <xref target="WhatsAppE2E"/>.</t>
          </li>
          <li>
            <t>The protocol admits optional application-layer client and server identities.
In the absence of these identities, the client and server are authenticated
against their public keys. Binding authentication to identities is part
of the AKE part of OPAQUE. The type of identities and their semantics
are application-dependent and independent of the protocol analysis. This
change was made to simplify client and server interfaces to the protocol
by removing the need to specify additional identities alongside their
corresponding public authentication keys when not needed.</t>
          </li>
          <li>
            <t>The protocol admits application-specific context information configured
out-of-band in the AKE transcript. This allows domain separation between
different application uses of OPAQUE. This is a mechanism for the AKE
component and is best practice for domain separation between different
applications of the protocol. This change was made to allow different
applications to use OPAQUE without the risk of cross-protocol attacks.</t>
          </li>
          <li>
            <t>Servers use a separate identifier for computing OPRF evaluations and
indexing into the registration record storage, called the credential_identifier.
This allows clients to change their application-layer identity
(client_identity) without inducing server-side changes, e.g., by changing
an email address associated with a given account. This mechanism is part
of the derivation of OPRF keys via a single PRF. As long as the derivation
of different OPRF keys from a single PRF has different PRF inputs, the
protocol is secure. The choice of such inputs is up to the application.</t>
          </li>
          <li>
            <t><xref target="JKX18"/> comments on a defense against offline
dictionary attacks upon server compromise or honest-but-curious servers.
The authors suggest implementing the OPRF phase as a threshold OPRF <xref target="TOPPSS"/>,
effectively forcing an attacker to act online or to control at least t key
shares (among the total n), where t is the threshold number of shares necessary
to recombine the secret OPRF key, and only then be able to run an offline dictionary
attack. This implementation only affects the server and changes nothing for the client.
Furthermore, if the threshold OPRF servers holding these keys are separate from
the authentication server, then recovering all n shares would still not suffice
to run an offline dictionary attack without access to the client record database.
However, this mechanism is out of scope for this document.</t>
          </li>
        </ul>
        <t>The following list enumerates notable differences and refinements from the original
cryptographic design in <xref target="JKX18"/> and the corresponding CFRG document
<xref target="I-D.krawczyk-cfrg-opaque-03"/> that were made to make this specification
suitable for interoperable implementations.</t>
        <ul spacing="normal">
          <li>
            <t><xref target="JKX18"/> used a generic prime-order group for the DH-OPRF and HMQV operations,
and includes necessary prime-order subgroup checks when receiving attacker-controlled
values over the wire. This specification instantiates the prime-order group used for
3DH using prime-order groups based on elliptic curves, as described in
<xref section="2.1" sectionFormat="comma" target="RFC9497"/>. This specification also delegates OPRF group
choice and operations to <xref target="RFC9497"/>. As such, the prime-order group as used
in the OPRF and 3DH as specified in this document both adhere to the requirements as
<xref target="JKX18"/>.</t>
          </li>
          <li>
            <t><xref target="JKX18"/> specified DH-OPRF (see Appendix B) to instantiate
the OPRF functionality in the protocol. A critical part of DH-OPRF is the
hash-to-group operation, which was not instantiated in the original analysis.
However, the requirements for this operation were included. This specification
instantiates the OPRF functionality based on the <xref target="RFC9497"/>, which
is identical to the DH-OPRF functionality in <xref target="JKX18"/> and, concretely, uses
the hash-to-curve functions in <xref target="RFC9380"/>. All hash-to-curve
methods in <xref target="RFC9380"/> are compliant with the requirement
in <xref target="JKX18"/>, namely, that the output be a member of the prime-order group.</t>
          </li>
          <li>
            <t><xref target="JKX18"/> and <xref target="I-D.krawczyk-cfrg-opaque-03"/> both used HMQV as the AKE
for the protocol. However, this document fully specifies 3DH instead of HMQV
(though a sketch for how to instantiate OPAQUE using HMQV is included in <xref target="hmqv-sketch"/>).
Since 3DH satisfies the essential requirements for the AKE as described in <xref target="JKX18"/>
and <xref target="I-D.krawczyk-cfrg-opaque-03"/>, as recalled in <xref target="security-analysis"/>, this change
preserves the overall security of the protocol. 3DH was chosen for its
simplicity and ease of implementation.</t>
          </li>
          <li>
            <t>The DH-OPRF and HMQV instantiation of OPAQUE in <xref target="JKX18"/>, Figure 12 uses
a different transcript than that which is described in this specification. In particular,
the key exchange transcript specified in <xref target="protocol-3dh"/> is a superset of the transcript
as defined in <xref target="JKX18"/>. This was done to align with best practices, such as is
done for key exchange protocols like TLS 1.3 <xref target="RFC8446"/>.</t>
          </li>
          <li>
            <t>Neither <xref target="JKX18"/> nor <xref target="I-D.krawczyk-cfrg-opaque-03"/> included wire format details for the
protocol, which is essential for interoperability. This specification fills this
gap by including such wire format details and corresponding test vectors; see <xref target="test-vectors"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="security-analysis">
        <name>Security Analysis</name>
        <t>Jarecki et al. <xref target="JKX18"/> proved the security of OPAQUE (modulo the
design differences outlined in <xref target="notable-design-differences"/>)
in a strong aPAKE model that ensures security against pre-computation attacks
and is formulated in the Universal Composability (UC) framework <xref target="Canetti01"/>
under the random oracle model. This assumes security of the OPRF
function and the underlying key exchange protocol.</t>
        <t>OPAQUE's design builds on a line of work initiated in the seminal
paper of Ford and Kaliski <xref target="FK00"/> and is based on the HPAKE protocol
of Xavier Boyen <xref target="Boyen09"/> and the (1,1)-PPSS protocol from Jarecki
et al. <xref target="JKKX16"/>. None of these papers considered security against
pre-computation attacks or presented a proof of aPAKE security
(not even in a weak model).</t>
        <t>The KCI property required from AKE protocols for use with OPAQUE
states that knowledge of a party's private key does not allow an attacker
to impersonate others to that party. This is an important security
property achieved by most public-key-based AKE protocols, including
protocols that use signatures or public key encryption for
authentication. It is also a property of many implicitly
authenticated protocols, e.g., HMQV, but not all of them. We also note that
key exchange protocols based on shared keys do not satisfy the KCI
requirement, hence they are not considered in the OPAQUE setting.
We note that KCI is needed to ensure a crucial property of OPAQUE: even upon
compromise of the server, the attacker cannot impersonate the client to the
server without first running an exhaustive dictionary attack.
Another essential requirement from AKE protocols for use in OPAQUE is to
provide forward secrecy (against active attackers).</t>
        <t>In <xref target="JKX18"/>, security is proven for one instance (i.e., one
key) of the OPAQUE protocol, and without batching. There is currently no
security analysis available for the OPAQUE protocol described in this
document in a setting with multiple server keys or batching.</t>
        <t>As stated in <xref target="implementation-safeguards"/>, incorporating <tt>client_identity</tt>
adds domain separation, in particular against servers that choose the same
OPRF key for multiple clients. The <tt>client_identity</tt> as input to the OPRF
also acts as a key identifier that would be required for a proof of the
protocol in the multi-key setting; the OPAQUE analysis in <xref target="JKX18"/> assumes
single server-key instances. Adding <tt>server_identity</tt> to the OPRF input
provides domain separation for clients that reuse the same <tt>client_identity</tt>
across different server instantiations.</t>
      </section>
      <section anchor="identities">
        <name>Identities</name>
        <t>AKE protocols generate keys that need to be uniquely and verifiably bound to a pair
of identities. In the case of OPAQUE, those identities correspond to client_identity and server_identity.
Thus, it is essential for the parties to agree on such identities, including an
agreed bit representation of these identities as needed.</t>
        <t>Note that the method of transmission of client_identity from client to server is outside
the scope of this protocol, and it is up to an application to choose how this identity
should be delivered (for instance, alongside the first OPAQUE message, or perhaps agreed upon before
the OPAQUE protocol begins).</t>
        <t>Applications may have different policies about how and when identities are
determined. A natural approach is to tie client_identity to the identity the server uses
to fetch the envelope (hence determined during password registration) and to tie server_identity
to the server identity used by the client to initiate an offline password
registration or online authenticated key exchange session. server_identity and client_identity can also
be part of the envelope or be tied to the parties' public keys. In principle, identities
may change across different sessions as long as there is a policy that
can establish if the identity is acceptable or not to the peer. However, we note
that the public keys of both the server and the client must always be those defined
at the time of password registration.</t>
        <t>The client identity (client_identity) and server identity (server_identity) are
optional parameters that are left to the application to designate as aliases for
the client and server. If the application layer does not supply values for these
parameters, then they will be omitted from the creation of the envelope
during the registration stage. Furthermore, they will be substituted with
client_identity = client_public_key and server_identity = server_public_key during
the authenticated key exchange stage.</t>
        <t>The advantage of supplying a custom client_identity and server_identity (instead of simply relying
on a fallback to client_public_key and server_public_key) is that the client can then ensure that any
mappings between client_identity and client_public_key (and server_identity and server_public_key)
are protected by the authentication from the envelope. Then, the client can verify that the
client_identity and server_identity contained in its envelope match the client_identity
and server_identity supplied by the server.</t>
        <t>However, if this extra layer of verification is unnecessary for the application, then simply
leaving client_identity and server_identity unspecified (and using client_public_key and
server_public_key instead) is acceptable.</t>
      </section>
      <section anchor="export-key-usage">
        <name>Export Key Usage</name>
        <t>The export key can be used (separately from the OPAQUE protocol) to provide
confidentiality and integrity to other data which only the client should be
able to process. For instance, if the client wishes to store secrets with a
third party, then this export key can be used by the client to encrypt these
secrets so that they remain hidden from a passive adversary that does not have
access to the server's secret keys or the client's password.</t>
      </section>
      <section anchor="static-diffie-hellman-oracles">
        <name>Static Diffie-Hellman Oracles</name>
        <t>While one can expect the practical security of the OPRF function (namely,
the hardness of computing the function without knowing the key) to be in the
order of computing discrete logarithms or solving Diffie-Hellman, Brown and
Gallant <xref target="BG04"/> and Cheon <xref target="Cheon06"/> show an attack that slightly improves
on generic attacks. For typical curves, the attack requires an infeasible
number of calls to the OPRF or results in insignificant security loss;
see <xref target="RFC9497"/> for more information. For OPAQUE, these attacks
are particularly impractical as they translate into an infeasible number of
failed authentication attempts directed at individual users.</t>
      </section>
      <section anchor="rkr-mac">
        <name>Random-Key Robust MACs</name>
        <t>The random-key robustness property for a MAC states
that, given two random keys k1 and k2, it is infeasible to find a message m
such that MAC(k1, m) = MAC(k2, m). Note that in general, not every MAC function
is key-robust. In particular, GMAC (which underlies GCM) does not satisfy
key-robustness, whereas HMAC with a collision-resistant hash function does
satisfy key-robustness.</t>
        <t>An application can choose to use a non-key-robust MAC within the AKE portion of
the protocol described in <xref target="protocol-3dh"/>, but it MUST use a key-robust MAC
for the creation of the <tt>auth_tag</tt> parameter in <xref target="envelope-creation"/>.</t>
      </section>
      <section anchor="validation">
        <name>Input Validation</name>
        <t>Both client and server MUST validate the other party's public key(s) used
for the execution of OPAQUE. This includes the keys shared during the
registration phase, as well as any keys shared during the online
key agreement phase. The validation procedure varies depending on the
type of key. For example, for OPAQUE instantiations
using 3DH with P-256, P-384, or P-521 as the underlying group, validation
is as specified in Section 5.6.2.3.4 of <xref target="keyagreement"/>. This includes
checking that the coordinates are in the correct range, that the point
is on the curve, and that the point is not the point at infinity.
Additionally, validation MUST ensure the Diffie-Hellman shared secret is
not the point at infinity.</t>
      </section>
      <section anchor="key-stretch">
        <name>OPRF Key Stretching</name>
        <t>Applying a key stretching function to the output of the OPRF greatly increases the cost of an offline
attack upon the compromise of the credential file on the server. Applications
SHOULD select parameters for the KSF that balance cost and complexity across
different client implementations and deployments. Note that in OPAQUE, the
key stretching function is executed by the client, as opposed to the server in
traditional password hashing scenarios. This means that applications must consider
a tradeoff between the performance of the protocol on clients (specifically low-end
devices) and protection against offline attacks after a server compromise.</t>
      </section>
      <section anchor="preventing-client-enumeration">
        <name>Client Enumeration</name>
        <t>Client enumeration refers to attacks where the attacker tries to learn whether
a given user identity is registered with a server or whether a re-registration
or change of password was performed for that user. OPAQUE counters these
attacks by requiring servers to act with unregistered client identities in a
way that is indistinguishable from their behavior with existing registered clients.
Servers do this by simulating a fake CredentialResponse as specified in
<xref target="create-credential-response"/> for unregistered users, and also encrypting
CredentialResponse using a masking key. In this way, real and fake CredentialResponse
messages are indistinguishable from one another.
Implementations must also take care to avoid side-channel leakage (e.g., timing
attacks) from helping differentiate these operations from a regular server
response. Note that this may introduce possible abuse vectors since the
server's cost of generating a CredentialResponse is less than that of the
client's cost of generating a CredentialRequest. Server implementations
may choose to forego the construction of a simulated credential response
message for an unregistered client if these client enumeration attacks can
be mitigated through other application-specific means or are otherwise not
applicable for their threat model.</t>
        <t>OPAQUE does not prevent this type of attack during the registration flow.
Servers necessarily react differently during the registration flow between
registered and unregistered clients. This allows an attacker to use the server's
response during registration as an oracle for whether a given client identity is
registered. Applications should mitigate against this type of attack by rate
limiting or otherwise restricting the registration flow.</t>
      </section>
      <section anchor="protecting-the-registration-masking-key">
        <name>Protecting the Registration Masking Key</name>
        <t>The user enumeration prevention method described in this document uses a
symmetric encryption key, masking_key, generated and sent to the server
by the client during registration. This requires a confidential channel
between client and server during registration, e.g., using TLS <xref target="RFC8446"/>.
If the channel is only authenticated (this is a requirement for correct
identification of the parties), a confidential channel can be established
using public-key encryption, e.g., with HPKE <xref target="RFC9180"/>. However, the details
of this mechanism are out of scope for this document.</t>
      </section>
      <section anchor="password-salt-and-storage-implications">
        <name>Password Salt and Storage Implications</name>
        <t>In OPAQUE, the OPRF key acts as the secret salt value that ensures the infeasibility
of pre-computation attacks. No extra salt value is needed. Also, clients never
disclose their passwords to the server, even during registration. Note that a corrupted
server can run an exhaustive offline dictionary attack to validate guesses for the client's
password; this is inevitable in any (single-server) aPAKE protocol. It can be avoided in
the case of OPAQUE by resorting to a multi-server threshold OPRF implementation,
e.g., <xref target="TOPPSS"/>. Furthermore, if the server does not
sample the PRF seed with sufficiently high entropy, or if it is not kept hidden from an
adversary, then any derivatives from the client's password may also be susceptible to an
offline dictionary attack to recover the original password.</t>
        <t>Some applications may require learning the client's password to enforce password
rules. Doing so invalidates this important security property of OPAQUE and is
NOT RECOMMENDED, unless it is not possible for applications to move such checks
to the client. Note that limited checks at the server are possible to implement, e.g.,
detecting repeated passwords upon re-registrations or password change.</t>
        <t>In general, passwords should be selected with sufficient entropy to avoid being susceptible
to recovery through dictionary attacks, both online and offline.</t>
      </section>
      <section anchor="ake-private-key-storage">
        <name>AKE Private Key Storage</name>
        <t>Server implementations of OPAQUE do not need access to the raw AKE private key. They only require
the ability to compute shared secrets as specified in <xref target="key-schedule-functions"/>. Thus, applications
may store the server AKE private key in a Hardware Security Module (HSM) or
similar. Upon compromise of the OPRF seed and client envelopes, this would prevent an
attacker from using this data to mount a server spoofing attack. Supporting implementations
need to consider allowing separate AKE and OPRF algorithms in cases where the HSM is
incompatible with the OPRF algorithm.</t>
      </section>
      <section anchor="client-authentication-using-credentials">
        <name>Client Authentication Using Credentials</name>
        <t>For scenarios in which the client has access to private state that can be persisted across
registration and login, the client can back up the <tt>randomized_password</tt> variable (as
computed in <xref target="finalize-request"/>) so that upon a future login attempt, the client can
authenticate to the server using <tt>randomized_password</tt> instead of the original password.
This can be achieved by supplying an arbitrary password as input to
<tt>CreateCredentialRequest</tt> in the login phase, and then using <tt>randomized_password</tt> from
the backup in <tt>RecoverCredentials</tt> (invoked by <tt>GenerateKE3</tt>) rather than computing it from
the password.</t>
        <t>This provides an advantage over the regular authentication flow for login
in that if <tt>randomized_password</tt> is compromised, an adversary cannot use this value to
successfully impersonate the server to the client during login. The drawback is that it is
only applicable to settings where <tt>randomized_password</tt> can be treated as a credential
which can be stored securely after registration and retrieved upon login.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes no IANA requests.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="J. Schiller" initials="J." surname="Schiller"/>
            <author fullname="S. Crocker" initials="S." surname="Crocker"/>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts. However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities. The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult. This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities. It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications. 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="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key. The cryptographic strength of HMAC depends on the properties of the underlying hash function. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </reference>
        <reference anchor="RFC9497">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) Using Prime-Order Groups</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>An Oblivious Pseudorandom Function (OPRF) is a two-party protocol between a client and a server for computing the output of a Pseudorandom Function (PRF). The server provides the PRF private key, and the client provides the PRF input. At the end of the protocol, the client learns the PRF output without learning anything about the PRF private key, and the server learns neither the PRF input nor output. An OPRF can also satisfy a notion of 'verifiability', called a VOPRF. A VOPRF ensures clients can verify that the server used a specific private key during the execution of the protocol. A VOPRF can also be partially oblivious, called a POPRF. A POPRF allows clients and servers to provide public input to the PRF computation. This document specifies an OPRF, VOPRF, and POPRF instantiated within standard prime-order groups, including elliptic curves. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9497"/>
          <seriesInfo name="DOI" value="10.17487/RFC9497"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.krawczyk-cfrg-opaque-03" target="https://datatracker.ietf.org/doc/html/draft-krawczyk-cfrg-opaque-03">
          <front>
            <title>The OPAQUE Asymmetric PAKE Protocol</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="PAKE-Selection" target="https://github.com/cfrg/pake-selection">
          <front>
            <title>CFRG PAKE selection process repository</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Boyen09">
          <front>
            <title>HPAKE: Password Authentication Secure against Cross-Site User Impersonation</title>
            <author initials="X." surname="Boyen" fullname="Xavier Boyen">
              <organization/>
            </author>
            <date year="2009"/>
          </front>
          <seriesInfo name="Cryptology and Network Security (CANS)" value=""/>
        </reference>
        <reference anchor="BG04">
          <front>
            <title>The static Diffie-Hellman problem</title>
            <author initials="D." surname="Brown" fullname="Daniel R. L. Brown">
              <organization/>
            </author>
            <author initials="R." surname="Galant" fullname="Robert P. Galant">
              <organization/>
            </author>
            <date year="2004"/>
          </front>
          <seriesInfo name="http://eprint.iacr.org/2004/306" value=""/>
        </reference>
        <reference anchor="Canetti01">
          <front>
            <title>Universally composable security: A new paradigm for cryptographic protocols</title>
            <author initials="R." surname="Canetti" fullname="Ran Canetti">
              <organization/>
            </author>
            <date year="2001"/>
          </front>
          <seriesInfo name="IEEE Symposium on Foundations of Computer Science (FOCS)" value=""/>
        </reference>
        <reference anchor="Cheon06">
          <front>
            <title>Security analysis of the strong Diffie-Hellman problem</title>
            <author initials="J. H." surname="Cheon" fullname="Jung Hee Cheon">
              <organization/>
            </author>
            <date year="2006"/>
          </front>
          <seriesInfo name="Eurocrypt" value=""/>
        </reference>
        <reference anchor="FK00">
          <front>
            <title>Server-assisted generation of a strong secret from a password</title>
            <author initials="W." surname="Ford" fullname="Warwick Ford">
              <organization/>
            </author>
            <author initials="B. S." surname="Kaliski, Jr" fullname="Burton S. Kaliski, Jr">
              <organization/>
            </author>
            <date year="2000"/>
          </front>
          <seriesInfo name="WETICE" value=""/>
        </reference>
        <reference anchor="FIPS202" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">
          <front>
            <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="GMR06">
          <front>
            <title>A method for making password-based key exchange resilient to server compromise</title>
            <author initials="C." surname="Gentry" fullname="Craig Gentry">
              <organization/>
            </author>
            <author initials="P." surname="MacKenzie" fullname="Phil MacKenzie">
              <organization/>
            </author>
            <author initials="" surname="Z, Ramzan" fullname="Zulfikar Ramzan">
              <organization/>
            </author>
            <date year="2006"/>
          </front>
          <seriesInfo name="CRYPTO" value=""/>
        </reference>
        <reference anchor="HJKW23">
          <front>
            <title>Password-Authenticated TLS via OPAQUE and Post-Handshake Authentication</title>
            <author initials="J." surname="Hesse" fullname="Julia Hesse">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
              <organization/>
            </author>
            <author initials="C." surname="Wood" fullname="Christopher Wood">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
          <seriesInfo name="EUROCRYPT" value=""/>
        </reference>
        <reference anchor="AuCPace">
          <front>
            <title>AuCPace: Efficient verifier-based PAKE protocol tailored for the IIoT</title>
            <author initials="B." surname="Haase" fullname="Bjorn Haase">
              <organization/>
            </author>
            <author initials="B." surname="Labrique" fullname="Benoit Labrique">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
          <seriesInfo name="http://eprint.iacr.org/2018/286" value=""/>
        </reference>
        <reference anchor="keyagreement">
          <front>
            <title>Recommendation for pair-wise key-establishment schemes using discrete logarithm cryptography</title>
            <author fullname="Elaine Barker" initials="E." surname="Barker">
              <organization/>
            </author>
            <author fullname="Lily Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <author fullname="Allen Roginsky" initials="A." surname="Roginsky">
              <organization/>
            </author>
            <author fullname="Apostol Vassilev" initials="A." surname="Vassilev">
              <organization/>
            </author>
            <author fullname="Richard Davis" initials="R." surname="Davis">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </reference>
        <reference anchor="JKX18">
          <front>
            <title>OPAQUE: An Asymmetric PAKE Protocol Secure Against Pre-Computation Attacks</title>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
              <organization/>
            </author>
            <author initials="J." surname="Xu" fullname="Jiayu Xu">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
          <seriesInfo name="Eurocrypt" value=""/>
        </reference>
        <reference anchor="JKKX16">
          <front>
            <title>Highly-efficient and composable password-protected secret sharing (or: how to protect your bitcoin wallet online)</title>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <author initials="A." surname="Kiayias" fullname="Aggelos Kiayias">
              <organization/>
            </author>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
              <organization/>
            </author>
            <author initials="J." surname="Xu" fullname="Jiayu Xu">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="IEEE European Symposium on Security and Privacy" value=""/>
        </reference>
        <reference anchor="LGR20" target="https://eprint.iacr.org/2020/1491.pdf">
          <front>
            <title>Partitioning Oracle Attacks</title>
            <author initials="J." surname="Len" fullname="Julia Len">
              <organization/>
            </author>
            <author initials="P." surname="Grubbs" fullname="Paul Grubbs">
              <organization/>
            </author>
            <author initials="T." surname="Ristenpart" fullname="Thomas Ristenpart">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HMQV">
          <front>
            <title>HMQV: A high-performance secure Diffie-Hellman protocol</title>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
              <organization/>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="CRYPTO" value=""/>
        </reference>
        <reference anchor="SIGMA-I">
          <front>
            <title>SIGMA: The ‘SIGn-and-MAc’ Approach to Authenticated Diffie-Hellman and its Use in the IKE Protocols</title>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
              <organization/>
            </author>
            <date year="2003"/>
          </front>
          <seriesInfo name="https://www.iacr.org/cryptodb/archive/2003/CRYPTO/1495/1495.pdf" value=""/>
        </reference>
        <reference anchor="SPAKE2plus">
          <front>
            <title>Security Analysis of SPAKE2+</title>
            <author initials="V." surname="Shoup" fullname="Victor Shoup">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="http://eprint.iacr.org/2020/313" value=""/>
        </reference>
        <reference anchor="TripleDH">
          <front>
            <title>Simplifying OTR deniability</title>
            <author>
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="https://signal.org/blog/simplifying-otr-deniability" value=""/>
        </reference>
        <reference anchor="WhatsAppE2E" target="https://www.whatsapp.com/security/WhatsApp_Security_Encrypted_Backups_Whitepaper.pdf">
          <front>
            <title>Security of End-to-End Encrypted Backups</title>
            <author initials="" surname="WhatsApp" fullname="WhatsApp">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="TOPPSS">
          <front>
            <title>TOPPSS: Cost-minimal Password-Protected Secret Sharing based on Threshold OPRF</title>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <author initials="A." surname="Kiayias" fullname="Aggelos Kiayias">
              <organization/>
            </author>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
              <organization/>
            </author>
            <author initials="J." surname="Xu" fullname="Jiayu Xu">
              <organization/>
            </author>
            <date year="2017"/>
          </front>
          <seriesInfo name="Applied Cryptology and Network Security – ACNS 2017" value=""/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC8125">
          <front>
            <title>Requirements for Password-Authenticated Key Agreement (PAKE) Schemes</title>
            <author fullname="J. Schmidt" initials="J." surname="Schmidt"/>
            <date month="April" year="2017"/>
            <abstract>
              <t>Password-Authenticated Key Agreement (PAKE) schemes are interactive protocols that allow the participants to authenticate each other and derive shared cryptographic keys using a (weaker) shared password. This document reviews different types of PAKE schemes. Furthermore, it presents requirements and gives recommendations to designers of new schemes. It is a product of the Crypto Forum Research Group (CFRG).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8125"/>
          <seriesInfo name="DOI" value="10.17487/RFC8125"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </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="RISTRETTO">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="Henry de Valence" initials="H." surname="de Valence">
         </author>
            <author fullname="Jack Grigg" initials="J." surname="Grigg">
         </author>
            <author fullname="Mike Hamburg" initials="M." surname="Hamburg">
         </author>
            <author fullname="Isis Lovecruft" initials="I." surname="Lovecruft">
         </author>
            <author fullname="George Tankersley" initials="G." surname="Tankersley">
         </author>
            <author fullname="Filippo Valsorda" initials="F." surname="Valsorda">
         </author>
            <date day="5" month="September" year="2023"/>
            <abstract>
              <t>   This memo specifies two prime-order groups, ristretto255 and
   decaf448, suitable for safely implementing higher-level and complex
   cryptographic protocols.  The ristretto255 group can be implemented
   using Curve25519, allowing existing Curve25519 implementations to be
   reused and extended to provide a prime-order group.  Likewise, the
   decaf448 group can be implemented using edwards448.

   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-ristretto255-decaf448-08"/>
        </reference>
        <reference anchor="NISTCurves">
          <front>
            <title>Digital Signature Standard (DSS)</title>
            <author>
              <organization/>
            </author>
            <date month="July" year="2013"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.186-4"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </reference>
        <reference anchor="Curve25519">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="ARGON2">
          <front>
            <title>Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications</title>
            <author fullname="A. Biryukov" initials="A." surname="Biryukov"/>
            <author fullname="D. Dinu" initials="D." surname="Dinu"/>
            <author fullname="D. Khovratovich" initials="D." surname="Khovratovich"/>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="September" year="2021"/>
            <abstract>
              <t>This document describes the Argon2 memory-hard function for password hashing and proof-of-work applications. We provide an implementer-oriented description with test vectors. The purpose is to simplify adoption of Argon2 for Internet protocols. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9106"/>
          <seriesInfo name="DOI" value="10.17487/RFC9106"/>
        </reference>
        <reference anchor="SCRYPT">
          <front>
            <title>The scrypt Password-Based Key Derivation Function</title>
            <author fullname="C. Percival" initials="C." surname="Percival"/>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document specifies the password-based key derivation function scrypt. The function derives one or more secret keys from a secret string. It is based on memory-hard functions, which offer added protection against attacks using custom hardware. The document also provides an ASN.1 schema.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7914"/>
          <seriesInfo name="DOI" value="10.17487/RFC7914"/>
        </reference>
        <reference anchor="PBKDF2">
          <front>
            <title>PKCS #5: Password-Based Cryptography Specification Version 2.0</title>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <date month="September" year="2000"/>
            <abstract>
              <t>This document provides recommendations for the implementation of password-based cryptography, covering key derivation functions, encryption schemes, message-authentication schemes, and ASN.1 syntax identifying the techniques. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2898"/>
          <seriesInfo name="DOI" value="10.17487/RFC2898"/>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
      </references>
    </references>
    <?line 2295?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>We are indebted to the OPAQUE reviewers during CFRG's
aPAKE selection process, particularly Julia Hesse and Bjorn Tackmann.
This draft has benefited from comments by multiple people. Special thanks
to Richard Barnes, Dan Brown, Matt Campagna, Eric Crockett, Paul Grubbs,
Fredrik Kuivinen, Stefan Marsiske, Payman Mohassel, Marta Mularczyk,
Jason Resch, Greg Rubin, and Nick Sullivan. Hugo Krawczyk wishes to thank
his OPAQUE co-authors Stas Jarecki and Jiayu Xu without whom this work
would have not been possible.</t>
    </section>
    <section anchor="alternate-key-recovery">
      <name>Alternate Key Recovery Mechanisms</name>
      <t>Client authentication material can be stored and retrieved using different key
recovery mechanisms. Any key recovery mechanism that encrypts data
in the envelope MUST use an authenticated encryption scheme with random
key-robustness (or key-committing). Deviating from the key-robustness
requirement may open the protocol to attacks, e.g., <xref target="LGR20"/>.
This specification enforces this property by using a MAC over the envelope
contents.</t>
      <t>We remark that export_key for authentication or encryption requires
no special properties from the authentication or encryption schemes
as long as export_key is used only after authentication material is successfully
recovered, i.e., after the MAC in RecoverCredentials passes verification.</t>
    </section>
    <section anchor="alternate-akes">
      <name>Alternate AKE Instantiations</name>
      <t>It is possible to instantiate OPAQUE with other AKEs, such as HMQV <xref target="HMQV"/> and <xref target="SIGMA-I"/>.
HMQV is similar to 3DH but varies in its key schedule. SIGMA-I uses digital signatures
rather than static DH keys for authentication. Specification of these instantiations is
left to future documents. A sketch of how these instantiations might change is included
in the next subsection for posterity.</t>
      <t>OPAQUE may also be instantiated with any post-quantum (PQ) AKE protocol that has the message
flow above and security properties (KCI resistance and forward secrecy) outlined
in <xref target="security-considerations"/>. Note that such an instantiation is not quantum-safe unless
the OPRF is quantum-safe. However, an OPAQUE instantiation where the AKE is quantum-safe,
but the OPRF is not, would still ensure the confidentiality and integrity of application data encrypted
under session_key (or a key derived from it) with a quantum-safe encryption function.
However, the only effect of a break of the OPRF by a future quantum attacker would be
the ability of this attacker to run at that time an exhaustive dictionary
attack against the old user's password and only for users whose envelopes were
harvested while in use (in the case of OPAQUE run over a TLS channel with the
server, harvesting such envelopes requires targeted active attacks).</t>
      <section anchor="hmqv-sketch">
        <name>HMQV Instantiation Sketch</name>
        <t>An HMQV instantiation would work similarly to OPAQUE-3DH, differing primarily in the key
schedule <xref target="HMQV"/>. First, the key schedule <tt>preamble</tt> value would use a different constant prefix
-- "HMQV" instead of "3DH" -- as shown below.</t>
        <artwork><![CDATA[
preamble = concat("HMQV",
                  I2OSP(len(client_identity), 2), client_identity,
                  KE1,
                  I2OSP(len(server_identity), 2), server_identity,
                  KE2.credential_response,
                  KE2.auth_response.server_nonce,
                  KE2.auth_response.server_public_keyshare)
]]></artwork>
        <t>Second, the IKM derivation would change. Assuming HMQV is instantiated with a cyclic
group of prime order p with bit length L, clients would compute <tt>IKM</tt> as follows:</t>
        <artwork><![CDATA[
u' = (eskU + u \* skU) mod p
IKM = (epkS \* pkS^s)^u'
]]></artwork>
        <t>Likewise, servers would compute <tt>IKM</tt> as follows:</t>
        <artwork><![CDATA[
s' = (eskS + s \* skS) mod p
IKM = (epkU \* pkU^u)^s'
]]></artwork>
        <t>In both cases, <tt>u</tt> would be computed as follows:</t>
        <artwork><![CDATA[
hashInput = concat(I2OSP(len(epkU), 2), epkU,
                   I2OSP(len(info), 2), info,
                   I2OSP(len("client"), 2), "client")
u = Hash(hashInput) mod L
]]></artwork>
        <t>Likewise, <tt>s</tt> would be computed as follows:</t>
        <artwork><![CDATA[
hashInput = concat(I2OSP(len(epkS), 2), epkS,
                   I2OSP(len(info), 2), info,
                   I2OSP(len("server"), 2), "server")
s = Hash(hashInput) mod L
]]></artwork>
        <t>Hash is the same hash function used in the main OPAQUE protocol for key derivation.
Its output length (in bits) must be at least L.</t>
        <t>Both parties should perform validation (as in <xref target="validation"/>) on each other's
public keys before computing the above parameters.</t>
      </section>
      <section anchor="sigma-i-instantiation-sketch">
        <name>SIGMA-I Instantiation Sketch</name>
        <t>A <xref target="SIGMA-I"/> instantiation differs more drastically from OPAQUE-3DH since authentication
uses digital signatures instead of Diffie-Hellman. In particular, both KE2 and KE3
would carry a digital signature, computed using the server and client private keys
established during registration, respectively, as well as a MAC, where the MAC is
computed as in OPAQUE-3DH.</t>
        <t>The key schedule would also change. Specifically, the key schedule <tt>preamble</tt> value would
use a different constant prefix -- "SIGMA-I" instead of "3DH" -- and the <tt>IKM</tt> computation
would use only the ephemeral public keys exchanged between client and server.</t>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section contains real and fake test vectors for the OPAQUE-3DH specification.
Each real test vector in <xref target="real-vectors"/> specifies the configuration information,
protocol inputs, intermediate values computed during registration and authentication,
and protocol outputs.</t>
      <t>Similarly, each fake test vector in <xref target="fake-vectors"/> specifies
the configuration information, protocol inputs, and protocol
outputs computed during the authentication of an unknown or unregistered user. Note that <tt>masking_key</tt>,
<tt>client_private_key</tt>, and <tt>client_public_key</tt> are used as additional inputs as described in
<xref target="create-credential-response"/>. <tt>client_public_key</tt> is used as the fake record's public key, and
<tt>masking_key</tt> for the fake record's masking key parameter.</t>
      <t>All values are encoded in hexadecimal strings. The configuration information
includes the (OPRF, Hash, KSF, KDF, MAC, Group, Context) tuple, where the Group
matches that which is used in the OPRF. These test vectors were generated using
<xref target="RFC9497"/>. The KSF used for each test vector is the identity function
(denoted Identity), which returns as output the input message supplied to the function
without any modification, i.e., msg = Stretch(msg).</t>
      <section anchor="real-vectors">
        <name>Real Test Vectors</name>
        <section anchor="opaque-3dh-real-test-vector-1">
          <name>OPAQUE-3DH Real Test Vector 1</name>
          <section anchor="configuration">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: ristretto255-SHA512
Hash: SHA512
KSF: Identity
KDF: HKDF-SHA512
MAC: HMAC-SHA512
Group: ristretto255
Context: 4f50415155452d504f43
Nh: 64
Npk: 32
Nsk: 32
Nm: 64
Nx: 64
Nok: 32
]]></artwork>
          </section>
          <section anchor="input-values">
            <name>Input Values</name>
            <artwork><![CDATA[
oprf_seed: f433d0227b0b9dd54f7c4422b600e764e47fb503f1f9a0f0a47c6606b0
54a7fdc65347f1a08f277e22358bbabe26f823fca82c7848e9a75661f4ec5d5c1989e
f
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: ac13171b2f17bc2c74997f0fce1e1f35bec6b91fe2e12dbd323d2
3ba7a38dfec
masking_nonce: 38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80
f612fdfc6d
server_private_key: 47451a85372f8b3537e249d7b54188091fb18edde78094b43
e2ba42b5eb89f0d
server_public_key: b2fe7af9f48cc502d016729d2fe25cdd433f2c4bc904660b2a
382c9b79df1a78
server_nonce: 71cd9960ecef2fe0d0f7494986fa3d8b2bb01963537e60efb13981e
138e3d4a1
client_nonce: da7e07376d6d6f034cfa9bb537d11b8c6b4238c334333d1f0aebb38
0cae6a6cc
client_keyshare_seed: 82850a697b42a505f5b68fcdafce8c31f0af2b581f063cf
1091933541936304b
server_keyshare_seed: 05a4f54206eef1ba2f615bc0aa285cb22f26d1153b5b40a
1e85ff80da12f982f
blind_registration: 76cfbfe758db884bebb33582331ba9f159720ca8784a2a070
a265d9c2d6abe01
blind_login: 6ecc102d2e7a7cf49617aad7bbe188556792d4acd60a1a8a8d2b65d4
b0790308
]]></artwork>
          </section>
          <section anchor="intermediate-values">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: 76a845464c68a5d2f7e442436bb1424953b17d3e2e289ccbac
cafb57ac5c3675
auth_key: 6cd32316f18d72a9a927a83199fa030663a38ce0c11fbaef82aa9003773
0494fc555c4d49506284516edd1628c27965b7555a4ebfed2223199f6c67966dde822
randomized_password: aac48c25ab036e30750839d31d6e73007344cb1155289fb7
d329beb932e9adeea73d5d5c22a0ce1952f8aba6d66007615cd1698d4ac85ef1fcf15
0031d1435d9
envelope: ac13171b2f17bc2c74997f0fce1e1f35bec6b91fe2e12dbd323d23ba7a3
8dfec634b0f5b96109c198a8027da51854c35bee90d1e1c781806d07d49b76de6a28b
8d9e9b6c93b9f8b64d16dddd9c5bfb5fea48ee8fd2f75012a8b308605cdd8ba5
handshake_secret: 81263cb85a0cfa12450f0f388de4e92291ec4c7c7a0878b6245
50ff528726332f1298fc6cc822a432c89504347c7a2ccd70316ae3da6a15e0399e6db
3f7c1b12
server_mac_key: 0d36b26cfe38f51f804f0a9361818f32ee1ce2a4e5578653b5271
84af058d3b2d8075c296fd84d24677913d1baa109290cd81a13ed383f9091a3804e65
298dfc
client_mac_key: 91750adbac54a5e8e53b4c233cc8d369fe83b0de1b6a3cd85575e
eb0bb01a6a90a086a2cf5fe75fff2a9379c30ba9049510a33b5b0b1444a88800fc3ee
e2260d
oprf_key: 5d4c6a8b7c7138182afb4345d1fae6a9f18a1744afbcc3854f8f5a2b4b4
c6d05
]]></artwork>
          </section>
          <section anchor="output-values">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: 5059ff249eb1551b7ce4991f3336205bde44a105a032e74
7d21bf382e75f7a71
registration_response: 7408a268083e03abc7097fc05b587834539065e86fb0c7
b6342fcf5e01e5b019b2fe7af9f48cc502d016729d2fe25cdd433f2c4bc904660b2a3
82c9b79df1a78
registration_upload: 76a845464c68a5d2f7e442436bb1424953b17d3e2e289ccb
accafb57ac5c36751ac5844383c7708077dea41cbefe2fa15724f449e535dd7dd562e
66f5ecfb95864eadddec9db5874959905117dad40a4524111849799281fefe3c51fa8
2785c5ac13171b2f17bc2c74997f0fce1e1f35bec6b91fe2e12dbd323d23ba7a38dfe
c634b0f5b96109c198a8027da51854c35bee90d1e1c781806d07d49b76de6a28b8d9e
9b6c93b9f8b64d16dddd9c5bfb5fea48ee8fd2f75012a8b308605cdd8ba5
KE1: c4dedb0ba6ed5d965d6f250fbe554cd45cba5dfcce3ce836e4aee778aa3cd44d
da7e07376d6d6f034cfa9bb537d11b8c6b4238c334333d1f0aebb380cae6a6cc6e29b
ee50701498605b2c085d7b241ca15ba5c32027dd21ba420b94ce60da326
KE2: 7e308140890bcde30cbcea28b01ea1ecfbd077cff62c4def8efa075aabcbb471
38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80f612fdfc6dd6ec6
0bcdb26dc455ddf3e718f1020490c192d70dfc7e403981179d8073d1146a4f9aa1ced
4e4cd984c657eb3b54ced3848326f70331953d91b02535af44d9fedc80188ca46743c
52786e0382f95ad85c08f6afcd1ccfbff95e2bdeb015b166c6b20b92f832cc6df01e0
b86a7efd92c1c804ff865781fa93f2f20b446c8371b671cd9960ecef2fe0d0f749498
6fa3d8b2bb01963537e60efb13981e138e3d4a1c4f62198a9d6fa9170c42c3c71f197
1b29eb1d5d0bd733e40816c91f7912cc4a660c48dae03e57aaa38f3d0cffcfc21852e
bc8b405d15bd6744945ba1a93438a162b6111699d98a16bb55b7bdddfe0fc5608b23d
a246e7bd73b47369169c5c90
KE3: 4455df4f810ac31a6748835888564b536e6da5d9944dfea9e34defb9575fe5e2
661ef61d2ae3929bcf57e53d464113d364365eb7d1a57b629707ca48da18e442
export_key: 1ef15b4fa99e8a852412450ab78713aad30d21fa6966c9b8c9fb3262a
970dc62950d4dd4ed62598229b1b72794fc0335199d9f7fcc6eaedde92cc04870e63f
16
session_key: 42afde6f5aca0cfa5c163763fbad55e73a41db6b41bc87b8e7b62214
a8eedc6731fa3cb857d657ab9b3764b89a84e91ebcb4785166fbb02cedfcbdfda215b
96f
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-real-test-vector-2">
          <name>OPAQUE-3DH Real Test Vector 2</name>
          <section anchor="configuration-1">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: ristretto255-SHA512
Hash: SHA512
KSF: Identity
KDF: HKDF-SHA512
MAC: HMAC-SHA512
Group: ristretto255
Context: 4f50415155452d504f43
Nh: 64
Npk: 32
Nsk: 32
Nm: 64
Nx: 64
Nok: 32
]]></artwork>
          </section>
          <section anchor="input-values-1">
            <name>Input Values</name>
            <artwork><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: f433d0227b0b9dd54f7c4422b600e764e47fb503f1f9a0f0a47c6606b0
54a7fdc65347f1a08f277e22358bbabe26f823fca82c7848e9a75661f4ec5d5c1989e
f
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: ac13171b2f17bc2c74997f0fce1e1f35bec6b91fe2e12dbd323d2
3ba7a38dfec
masking_nonce: 38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80
f612fdfc6d
server_private_key: 47451a85372f8b3537e249d7b54188091fb18edde78094b43
e2ba42b5eb89f0d
server_public_key: b2fe7af9f48cc502d016729d2fe25cdd433f2c4bc904660b2a
382c9b79df1a78
server_nonce: 71cd9960ecef2fe0d0f7494986fa3d8b2bb01963537e60efb13981e
138e3d4a1
client_nonce: da7e07376d6d6f034cfa9bb537d11b8c6b4238c334333d1f0aebb38
0cae6a6cc
client_keyshare_seed: 82850a697b42a505f5b68fcdafce8c31f0af2b581f063cf
1091933541936304b
server_keyshare_seed: 05a4f54206eef1ba2f615bc0aa285cb22f26d1153b5b40a
1e85ff80da12f982f
blind_registration: 76cfbfe758db884bebb33582331ba9f159720ca8784a2a070
a265d9c2d6abe01
blind_login: 6ecc102d2e7a7cf49617aad7bbe188556792d4acd60a1a8a8d2b65d4
b0790308
]]></artwork>
          </section>
          <section anchor="intermediate-values-1">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: 76a845464c68a5d2f7e442436bb1424953b17d3e2e289ccbac
cafb57ac5c3675
auth_key: 6cd32316f18d72a9a927a83199fa030663a38ce0c11fbaef82aa9003773
0494fc555c4d49506284516edd1628c27965b7555a4ebfed2223199f6c67966dde822
randomized_password: aac48c25ab036e30750839d31d6e73007344cb1155289fb7
d329beb932e9adeea73d5d5c22a0ce1952f8aba6d66007615cd1698d4ac85ef1fcf15
0031d1435d9
envelope: ac13171b2f17bc2c74997f0fce1e1f35bec6b91fe2e12dbd323d23ba7a3
8dfec1ac902dc5589e9a5f0de56ad685ea8486210ef41449cd4d8712828913c5d2b68
0b2b3af4a26c765cff329bfb66d38ecf1d6cfa9e7a73c222c6efe0d9520f7d7c
handshake_secret: 5e723bed1e5276de2503419eba9da61ead573109c4012268323
98c7e08155b885bfe7bc93451f9d887a0c1d0c19233e40a8e47b347a9ac3907f94032
a4cff64f
server_mac_key: dad66bb9251073d17a13f8e5500f36e5998e3cde520ca0738e708
5af62fd97812eb79a745c94d0bf8a6ac17f980cf435504cf64041eeb6bb237796d2c7
f81e9a
client_mac_key: f816fe2914f7c5b29852385615d7c7f31ac122adf202d7ccd4976
06d7aabd48930323d1d02b1cc9ecd456c4de6f46c7950becb18bffd921dd5876381b5
486ffe
oprf_key: 5d4c6a8b7c7138182afb4345d1fae6a9f18a1744afbcc3854f8f5a2b4b4
c6d05
]]></artwork>
          </section>
          <section anchor="output-values-1">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: 5059ff249eb1551b7ce4991f3336205bde44a105a032e74
7d21bf382e75f7a71
registration_response: 7408a268083e03abc7097fc05b587834539065e86fb0c7
b6342fcf5e01e5b019b2fe7af9f48cc502d016729d2fe25cdd433f2c4bc904660b2a3
82c9b79df1a78
registration_upload: 76a845464c68a5d2f7e442436bb1424953b17d3e2e289ccb
accafb57ac5c36751ac5844383c7708077dea41cbefe2fa15724f449e535dd7dd562e
66f5ecfb95864eadddec9db5874959905117dad40a4524111849799281fefe3c51fa8
2785c5ac13171b2f17bc2c74997f0fce1e1f35bec6b91fe2e12dbd323d23ba7a38dfe
c1ac902dc5589e9a5f0de56ad685ea8486210ef41449cd4d8712828913c5d2b680b2b
3af4a26c765cff329bfb66d38ecf1d6cfa9e7a73c222c6efe0d9520f7d7c
KE1: c4dedb0ba6ed5d965d6f250fbe554cd45cba5dfcce3ce836e4aee778aa3cd44d
da7e07376d6d6f034cfa9bb537d11b8c6b4238c334333d1f0aebb380cae6a6cc6e29b
ee50701498605b2c085d7b241ca15ba5c32027dd21ba420b94ce60da326
KE2: 7e308140890bcde30cbcea28b01ea1ecfbd077cff62c4def8efa075aabcbb471
38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80f612fdfc6dd6ec6
0bcdb26dc455ddf3e718f1020490c192d70dfc7e403981179d8073d1146a4f9aa1ced
4e4cd984c657eb3b54ced3848326f70331953d91b02535af44d9fea502150b67fe367
95dd8914f164e49f81c7688a38928372134b7dccd50e09f8fed9518b7b2f94835b3c4
fe4c8475e7513f20eb97ff0568a39caee3fd6251876f71cd9960ecef2fe0d0f749498
6fa3d8b2bb01963537e60efb13981e138e3d4a1c4f62198a9d6fa9170c42c3c71f197
1b29eb1d5d0bd733e40816c91f7912cc4a292371e7809a9031743e943fb3b56f51de9
03552fc91fba4e7419029951c3970b2e2f0a9dea218d22e9e4e0000855bb6421aa361
0d6fc0f4033a6517030d4341
KE3: 7a026de1d6126905736c3f6d92463a08d209833eb793e46d0f7f15b3e0f62c76
43763c02bbc6b8d3d15b63250cae98171e9260f1ffa789750f534ac11a0176d5
export_key: 1ef15b4fa99e8a852412450ab78713aad30d21fa6966c9b8c9fb3262a
970dc62950d4dd4ed62598229b1b72794fc0335199d9f7fcc6eaedde92cc04870e63f
16
session_key: ae7951123ab5befc27e62e63f52cf472d6236cb386c968cc47b7e34f
866aa4bc7638356a73cfce92becf39d6a7d32a1861f12130e824241fe6cab34fbd471
a57
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-real-test-vector-3">
          <name>OPAQUE-3DH Real Test Vector 3</name>
          <section anchor="configuration-2">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: ristretto255-SHA512
Hash: SHA512
KSF: Identity
KDF: HKDF-SHA512
MAC: HMAC-SHA512
Group: curve25519
Context: 4f50415155452d504f43
Nh: 64
Npk: 32
Nsk: 32
Nm: 64
Nx: 64
Nok: 32
]]></artwork>
          </section>
          <section anchor="input-values-2">
            <name>Input Values</name>
            <artwork><![CDATA[
oprf_seed: a78342ab84d3d30f08d5a9630c79bf311c31ed7f85d9d4959bf492ec67
a0eec8a67dfbf4497248eebd49e878aab173e5e4ff76354288fdd53e949a5f7c9f7f1
b
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: 40d6b67fdd7da7c49894750754514dbd2070a407166bd2a5237cc
a9bf44d6e0b
masking_nonce: 38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80
f612fdfc6d
server_private_key: c06139381df63bfc91c850db0b9cfbec7a62e86d80040a41a
a7725bf0e79d564
server_public_key: a41e28269b4e97a66468cc00c5a57753e192e1527669897706
88aa90486ef031
server_nonce: 71cd9960ecef2fe0d0f7494986fa3d8b2bb01963537e60efb13981e
138e3d4a1
client_nonce: da7e07376d6d6f034cfa9bb537d11b8c6b4238c334333d1f0aebb38
0cae6a6cc
client_keyshare_seed: 82850a697b42a505f5b68fcdafce8c31f0af2b581f063cf
1091933541936304b
server_keyshare_seed: 05a4f54206eef1ba2f615bc0aa285cb22f26d1153b5b40a
1e85ff80da12f982f
blind_registration: c575731ffe1cb0ca5ba63b42c4699767b8b9ab78ba39316ee
04baddb2034a70a
blind_login: 6ecc102d2e7a7cf49617aad7bbe188556792d4acd60a1a8a8d2b65d4
b0790308
]]></artwork>
          </section>
          <section anchor="intermediate-values-2">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: 0936ea94ab030ec332e29050d266c520e916731a052d05ced7
e0cfe751142b48
auth_key: 7e880ab484f750e80e6f839d975aff476070ce65066d85ea62523d1d576
4739d91307fac47186a4ab935e6a5c7f70cb47faa9473311947502c022cc67ae9440c
randomized_password: 3a602c295a9c323d9362fe286f104567ed6862b25dbe30fa
da844f19e41cf40047424b7118e15dc2c1a815a70fea5c8de6c30aa61440cd4b4b5e8
f3963fbb2e1
envelope: 40d6b67fdd7da7c49894750754514dbd2070a407166bd2a5237cca9bf44
d6e0b20c1e81fef28e92e897ca8287d49a55075b47c3988ff0fff367d79a3e350ccac
150b4a3ff48b4770c8e84e437b3d4e68d2b95833f7788f7eb93fa6a8afb85ecb
handshake_secret: 178c8c15e025252380c3edb1c6ad8ac52573b38d536099e2f86
5786f5e31c642608550c0c6f281c37ce259667dd72768af31630e0eb36f1096a2e642
1c2aa163
server_mac_key: f3c6a8e069c54bb0d8905139f723c9e22f5c662dc08848243a665
4c8223800019b9823523d84da2ef67ca1c14277630aace464c113be8a0a658c39e181
a8bb71
client_mac_key: b1ee7ce52dbd0ab72872924ff11596cb196bbabfc319e74aca78a
de54a0f74dd15dcf5621f6d2e79161b0c9b701381d494836dedbb86e584a65b34267a
370e01
oprf_key: 62ef7f7d9506a14600c34f642aaf6ef8019cc82a6755db4fded5248ea14
6030a
]]></artwork>
          </section>
          <section anchor="output-values-2">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: 26f3dbfd76b8e5f85b4da604f42889a7d4b1bc919f65538
1a67de02c59fd5436
registration_response: 506e8f1b89c098fb89b5b6210a05f7898cafdaea221761
e8d5272fc39e0f9f08a41e28269b4e97a66468cc00c5a57753e192e15276698977068
8aa90486ef031
registration_upload: 0936ea94ab030ec332e29050d266c520e916731a052d05ce
d7e0cfe751142b486d23c6ed818882f9bdfdcf91389fcbc0b7a3faf92bd0bd6be4a1e
7730277b694fc7c6ba327fbe786af18487688e0f7c148bbd54dc2fc80c28e7a976d9e
f53c3540d6b67fdd7da7c49894750754514dbd2070a407166bd2a5237cca9bf44d6e0
b20c1e81fef28e92e897ca8287d49a55075b47c3988ff0fff367d79a3e350ccac150b
4a3ff48b4770c8e84e437b3d4e68d2b95833f7788f7eb93fa6a8afb85ecb
KE1: c4dedb0ba6ed5d965d6f250fbe554cd45cba5dfcce3ce836e4aee778aa3cd44d
da7e07376d6d6f034cfa9bb537d11b8c6b4238c334333d1f0aebb380cae6a6cc10a83
b9117d3798cb2957fbdb0268a0d63dbf9d66bde5c00c78affd80026c911
KE2: 9a0e5a1514f62e005ea098b0d8cf6750e358c4389e6add1c52aed9500fa19d00
38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80f612fdfc6d22cc3
1127d6f0096755be3c3d2dd6287795c317aeea10c9485bf4f419a786642c19a8f151c
eb5e8767d175248c62c017de94057398d28bf0ed00d1b50ee4f812fd9afddf98af8cd
58067ca43b0633b6cadd0e9d987f89623fed4d3583bdf6910c425600e90dab3c6b351
3188a465461a67f6bbc47aeba808f7f7e2c6d66f5c3271cd9960ecef2fe0d0f749498
6fa3d8b2bb01963537e60efb13981e138e3d4a141f55f0bef355cfb34ccd468fdacad
75865ee7efef95f4cb6c25d477f720502676f06a3b806da262139bf3fa76a1090b94d
ac78bc3bc6f8747d5b35acf94eff3ec2ebe7d49b8cf16be64120b279fe92664e47be5
da7e60f08f12e91192652f79
KE3: 550e923829a544496d8316c490da2b979b78c730dd75be3a17f237a26432c19f
bba54b6a0467b1c22ecbd6794bc5fa5b04215ba1ef974c6b090baa42c5bb984f
export_key: 9dec51d6d0f6ce7e4345f10961053713b07310cc2e45872f57bbd2fe5
070fdf0fb5b77c7ddaa2f3dc5c35132df7417ad7fefe0f690ad266e5a54a21d045c9c
38
session_key: fd2fdd07c1bcc88e81c1b1d1de5ad62dfdef1c0b8209ff9d671e1fac
55ce9c34d381c1fb2703ff53a797f77daccbe33047ccc167b8105171e10ec962eea20
3aa
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-real-test-vector-4">
          <name>OPAQUE-3DH Real Test Vector 4</name>
          <section anchor="configuration-3">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: ristretto255-SHA512
Hash: SHA512
KSF: Identity
KDF: HKDF-SHA512
MAC: HMAC-SHA512
Group: curve25519
Context: 4f50415155452d504f43
Nh: 64
Npk: 32
Nsk: 32
Nm: 64
Nx: 64
Nok: 32
]]></artwork>
          </section>
          <section anchor="input-values-3">
            <name>Input Values</name>
            <artwork><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: a78342ab84d3d30f08d5a9630c79bf311c31ed7f85d9d4959bf492ec67
a0eec8a67dfbf4497248eebd49e878aab173e5e4ff76354288fdd53e949a5f7c9f7f1
b
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: 40d6b67fdd7da7c49894750754514dbd2070a407166bd2a5237cc
a9bf44d6e0b
masking_nonce: 38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80
f612fdfc6d
server_private_key: c06139381df63bfc91c850db0b9cfbec7a62e86d80040a41a
a7725bf0e79d564
server_public_key: a41e28269b4e97a66468cc00c5a57753e192e1527669897706
88aa90486ef031
server_nonce: 71cd9960ecef2fe0d0f7494986fa3d8b2bb01963537e60efb13981e
138e3d4a1
client_nonce: da7e07376d6d6f034cfa9bb537d11b8c6b4238c334333d1f0aebb38
0cae6a6cc
client_keyshare_seed: 82850a697b42a505f5b68fcdafce8c31f0af2b581f063cf
1091933541936304b
server_keyshare_seed: 05a4f54206eef1ba2f615bc0aa285cb22f26d1153b5b40a
1e85ff80da12f982f
blind_registration: c575731ffe1cb0ca5ba63b42c4699767b8b9ab78ba39316ee
04baddb2034a70a
blind_login: 6ecc102d2e7a7cf49617aad7bbe188556792d4acd60a1a8a8d2b65d4
b0790308
]]></artwork>
          </section>
          <section anchor="intermediate-values-3">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: 0936ea94ab030ec332e29050d266c520e916731a052d05ced7
e0cfe751142b48
auth_key: 7e880ab484f750e80e6f839d975aff476070ce65066d85ea62523d1d576
4739d91307fac47186a4ab935e6a5c7f70cb47faa9473311947502c022cc67ae9440c
randomized_password: 3a602c295a9c323d9362fe286f104567ed6862b25dbe30fa
da844f19e41cf40047424b7118e15dc2c1a815a70fea5c8de6c30aa61440cd4b4b5e8
f3963fbb2e1
envelope: 40d6b67fdd7da7c49894750754514dbd2070a407166bd2a5237cca9bf44
d6e0bb4c0eab6143959a650c5f6b32acf162b1fbe95bb36c5c4f99df53865c4d3537d
69061d80522d772cd0efdbe91f817f6bf7259a56e20b4eb9cbe9443702f4b759
handshake_secret: 13e7dc6afa5334b9dfffe26bee3caf744ef4add176caee464cd
eb3d37303b90de35a8bf095df84471ac77d705f12fe232f1571de1d6a001d3e808998
73a142dc
server_mac_key: a58135acfb2bde92d506cf59119729a6404ad94eba294e4b52a63
baf58cfe03f21bcf735222c7f2c27a60bd958be7f6aed50dc03a78f64e7ae4ac1ff07
1b95aa
client_mac_key: 1e1a8ba156aadc4a302f707d2193c9dab477b355f430d450dd407
ce40dc75613f76ec33dec494f8a6bfdcf951eb060dac33e6572c693954fe92e33730c
9ab0a2
oprf_key: 62ef7f7d9506a14600c34f642aaf6ef8019cc82a6755db4fded5248ea14
6030a
]]></artwork>
          </section>
          <section anchor="output-values-3">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: 26f3dbfd76b8e5f85b4da604f42889a7d4b1bc919f65538
1a67de02c59fd5436
registration_response: 506e8f1b89c098fb89b5b6210a05f7898cafdaea221761
e8d5272fc39e0f9f08a41e28269b4e97a66468cc00c5a57753e192e15276698977068
8aa90486ef031
registration_upload: 0936ea94ab030ec332e29050d266c520e916731a052d05ce
d7e0cfe751142b486d23c6ed818882f9bdfdcf91389fcbc0b7a3faf92bd0bd6be4a1e
7730277b694fc7c6ba327fbe786af18487688e0f7c148bbd54dc2fc80c28e7a976d9e
f53c3540d6b67fdd7da7c49894750754514dbd2070a407166bd2a5237cca9bf44d6e0
bb4c0eab6143959a650c5f6b32acf162b1fbe95bb36c5c4f99df53865c4d3537d6906
1d80522d772cd0efdbe91f817f6bf7259a56e20b4eb9cbe9443702f4b759
KE1: c4dedb0ba6ed5d965d6f250fbe554cd45cba5dfcce3ce836e4aee778aa3cd44d
da7e07376d6d6f034cfa9bb537d11b8c6b4238c334333d1f0aebb380cae6a6cc10a83
b9117d3798cb2957fbdb0268a0d63dbf9d66bde5c00c78affd80026c911
KE2: 9a0e5a1514f62e005ea098b0d8cf6750e358c4389e6add1c52aed9500fa19d00
38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80f612fdfc6d22cc3
1127d6f0096755be3c3d2dd6287795c317aeea10c9485bf4f419a786642c19a8f151c
eb5e8767d175248c62c017de94057398d28bf0ed00d1b50ee4f812699bff7663be3c5
d59de94d8e7e58817c7da005b39c25d25555c929e1c5cf6c1b82837b1367c839aab56
a422c0d97719426a79a16f9869cf852100597b23b5a071cd9960ecef2fe0d0f749498
6fa3d8b2bb01963537e60efb13981e138e3d4a141f55f0bef355cfb34ccd468fdacad
75865ee7efef95f4cb6c25d477f72050267cc22c87edbf3ecaca64cb33bc60dc3bfc5
51e365f0d46a7fed0e09d96f9afbb48868f5bb3c3e05a86ed8c9476fc22c58306c5a2
91be34388e09548ba9d70f39
KE3: d16344e791c3f18594d22ba068984fa18ec1e9bead662b75f66826ffd627932f
cd1ec40cd01dcf5f63f4055ebe45c7717a57a833aad360256cf1e1c20c0eae1c
export_key: 9dec51d6d0f6ce7e4345f10961053713b07310cc2e45872f57bbd2fe5
070fdf0fb5b77c7ddaa2f3dc5c35132df7417ad7fefe0f690ad266e5a54a21d045c9c
38
session_key: f6116d3aa0e4089a179713bad4d98ed5cb57e5443cae8d36ef78996f
a60f3dc6e9fcdd63c001596b06dbc1285d80211035cc0e485506b3f7a650cbf78c5bf
fc9
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-real-test-vector-5">
          <name>OPAQUE-3DH Real Test Vector 5</name>
          <section anchor="configuration-4">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: P256-SHA256
Hash: SHA256
KSF: Identity
KDF: HKDF-SHA256
MAC: HMAC-SHA256
Group: P256_XMD:SHA-256_SSWU_RO_
Context: 4f50415155452d504f43
Nh: 32
Npk: 33
Nsk: 32
Nm: 32
Nx: 32
Nok: 32
]]></artwork>
          </section>
          <section anchor="input-values-4">
            <name>Input Values</name>
            <artwork><![CDATA[
oprf_seed: 62f60b286d20ce4fd1d64809b0021dad6ed5d52a2c8cf27ae6582543a0
a8dce2
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: a921f2a014513bd8a90e477a629794e89fec12d12206dde662ebd
cf65670e51f
masking_nonce: 38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80
f612fdfc6d
server_private_key: c36139381df63bfc91c850db0b9cfbec7a62e86d80040a41a
a7725bf0e79d5e5
server_public_key: 035f40ff9cf88aa1f5cd4fe5fd3da9ea65a4923a5594f84fd9
f2092d6067784874
server_nonce: 71cd9960ecef2fe0d0f7494986fa3d8b2bb01963537e60efb13981e
138e3d4a1
client_nonce: ab3d33bde0e93eda72392346a7a73051110674bbf6b1b7ffab8be4f
91fdaeeb1
client_keyshare_seed: 633b875d74d1556d2a2789309972b06db21dfcc4f5ad51d
7e74d783b7cfab8dc
server_keyshare_seed: 05a4f54206eef1ba2f615bc0aa285cb22f26d1153b5b40a
1e85ff80da12f982f
blind_registration: 411bf1a62d119afe30df682b91a0a33d777972d4f2daa4b34
ca527d597078153
blind_login: c497fddf6056d241e6cf9fb7ac37c384f49b357a221eb0a802c989b9
942256c1
]]></artwork>
          </section>
          <section anchor="intermediate-values-4">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: 03b218507d978c3db570ca994aaf36695a731ddb2db272c817
f79746fc37ae5214
auth_key: 5bd4be1602516092dc5078f8d699f5721dc1720a49fb80d8e5c16377abd
0987b
randomized_password: 06be0a1a51d56557a3adad57ba29c5510565dcd8b5078fa3
19151b9382258fb0
envelope: a921f2a014513bd8a90e477a629794e89fec12d12206dde662ebdcf6567
0e51fad30bbcfc1f8eda0211553ab9aaf26345ad59a128e80188f035fe4924fad67b8
handshake_secret: 83a932431a8f25bad042f008efa2b07c6cd0faa8285f335b636
3546a9f9b235f
server_mac_key: 13e928581febfad28855e3e7f03306d61bd69489686f621535d44
a1365b73b0d
client_mac_key: afdc53910c25183b08b930e6953c35b3466276736d9de2e9c5efa
f150f4082c5
oprf_key: 2dfb5cb9aa1476093be74ca0d43e5b02862a05f5d6972614d7433acdc66
f7f31
]]></artwork>
          </section>
          <section anchor="output-values-4">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: 029e949a29cfa0bf7c1287333d2fb3dc586c41aa652f507
0d26a5315a1b50229f8
registration_response: 0350d3694c00978f00a5ce7cd08a00547e4ab5fb5fc2b2
f6717cdaa6c89136efef035f40ff9cf88aa1f5cd4fe5fd3da9ea65a4923a5594f84fd
9f2092d6067784874
registration_upload: 03b218507d978c3db570ca994aaf36695a731ddb2db272c8
17f79746fc37ae52147f0ed53532d3ae8e505ecc70d42d2b814b6b0e48156def71ea0
29148b2803aafa921f2a014513bd8a90e477a629794e89fec12d12206dde662ebdcf6
5670e51fad30bbcfc1f8eda0211553ab9aaf26345ad59a128e80188f035fe4924fad6
7b8
KE1: 037342f0bcb3ecea754c1e67576c86aa90c1de3875f390ad599a26686cdfee6e
07ab3d33bde0e93eda72392346a7a73051110674bbf6b1b7ffab8be4f91fdaeeb1022
ed3f32f318f81bab80da321fecab3cd9b6eea11a95666dfa6beeaab321280b6
KE2: 0246da9fe4d41d5ba69faa6c509a1d5bafd49a48615a47a8dd4b0823cc147648
1138fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80f612fdfc6d2f0
c547f70deaeca54d878c14c1aa5e1ab405dec833777132eea905c2fbb12504a67dcbe
0e66740c76b62c13b04a38a77926e19072953319ec65e41f9bfd2ae26837b6ce688bf
9af2542f04eec9ab96a1b9328812dc2f5c89182ed47fead61f09f71cd9960ecef2fe0
d0f7494986fa3d8b2bb01963537e60efb13981e138e3d4a103c1701353219b53acf33
7bf6456a83cefed8f563f1040b65afbf3b65d3bc9a19b50a73b145bc87a157e8c58c0
342e2047ee22ae37b63db17e0a82a30fcc4ecf7b
KE3: e97cab4433aa39d598e76f13e768bba61c682947bdcf9936035e8a3a3ebfb66e
export_key: c3c9a1b0e33ac84dd83d0b7e8af6794e17e7a3caadff289fbd9dc769a
853c64b
session_key: 484ad345715ccce138ca49e4ea362c6183f0949aaaa1125dc3bc3f80
876e7cd1
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-real-test-vector-6">
          <name>OPAQUE-3DH Real Test Vector 6</name>
          <section anchor="configuration-5">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: P256-SHA256
Hash: SHA256
KSF: Identity
KDF: HKDF-SHA256
MAC: HMAC-SHA256
Group: P256_XMD:SHA-256_SSWU_RO_
Context: 4f50415155452d504f43
Nh: 32
Npk: 33
Nsk: 32
Nm: 32
Nx: 32
Nok: 32
]]></artwork>
          </section>
          <section anchor="input-values-5">
            <name>Input Values</name>
            <artwork><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: 62f60b286d20ce4fd1d64809b0021dad6ed5d52a2c8cf27ae6582543a0
a8dce2
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: a921f2a014513bd8a90e477a629794e89fec12d12206dde662ebd
cf65670e51f
masking_nonce: 38fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80
f612fdfc6d
server_private_key: c36139381df63bfc91c850db0b9cfbec7a62e86d80040a41a
a7725bf0e79d5e5
server_public_key: 035f40ff9cf88aa1f5cd4fe5fd3da9ea65a4923a5594f84fd9
f2092d6067784874
server_nonce: 71cd9960ecef2fe0d0f7494986fa3d8b2bb01963537e60efb13981e
138e3d4a1
client_nonce: ab3d33bde0e93eda72392346a7a73051110674bbf6b1b7ffab8be4f
91fdaeeb1
client_keyshare_seed: 633b875d74d1556d2a2789309972b06db21dfcc4f5ad51d
7e74d783b7cfab8dc
server_keyshare_seed: 05a4f54206eef1ba2f615bc0aa285cb22f26d1153b5b40a
1e85ff80da12f982f
blind_registration: 411bf1a62d119afe30df682b91a0a33d777972d4f2daa4b34
ca527d597078153
blind_login: c497fddf6056d241e6cf9fb7ac37c384f49b357a221eb0a802c989b9
942256c1
]]></artwork>
          </section>
          <section anchor="intermediate-values-5">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: 03b218507d978c3db570ca994aaf36695a731ddb2db272c817
f79746fc37ae5214
auth_key: 5bd4be1602516092dc5078f8d699f5721dc1720a49fb80d8e5c16377abd
0987b
randomized_password: 06be0a1a51d56557a3adad57ba29c5510565dcd8b5078fa3
19151b9382258fb0
envelope: a921f2a014513bd8a90e477a629794e89fec12d12206dde662ebdcf6567
0e51f4d7773a36a208a866301dbb2858e40dc5638017527cf91aef32d3848eebe0971
handshake_secret: 80bdcc498f22de492e90ee8101fcc7c101e158dd49c77f7c283
816ae329ed62f
server_mac_key: 0f82432fbdb5b90daf27a91a3acc42299a9590dba1b77932c2207
b4cb3d4a157
client_mac_key: 7f629eb0b1b69979b07ca1f564b3e92ed22f07569fd1d11725d93
e46731fbe71
oprf_key: 2dfb5cb9aa1476093be74ca0d43e5b02862a05f5d6972614d7433acdc66
f7f31
]]></artwork>
          </section>
          <section anchor="output-values-5">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: 029e949a29cfa0bf7c1287333d2fb3dc586c41aa652f507
0d26a5315a1b50229f8
registration_response: 0350d3694c00978f00a5ce7cd08a00547e4ab5fb5fc2b2
f6717cdaa6c89136efef035f40ff9cf88aa1f5cd4fe5fd3da9ea65a4923a5594f84fd
9f2092d6067784874
registration_upload: 03b218507d978c3db570ca994aaf36695a731ddb2db272c8
17f79746fc37ae52147f0ed53532d3ae8e505ecc70d42d2b814b6b0e48156def71ea0
29148b2803aafa921f2a014513bd8a90e477a629794e89fec12d12206dde662ebdcf6
5670e51f4d7773a36a208a866301dbb2858e40dc5638017527cf91aef32d3848eebe0
971
KE1: 037342f0bcb3ecea754c1e67576c86aa90c1de3875f390ad599a26686cdfee6e
07ab3d33bde0e93eda72392346a7a73051110674bbf6b1b7ffab8be4f91fdaeeb1022
ed3f32f318f81bab80da321fecab3cd9b6eea11a95666dfa6beeaab321280b6
KE2: 0246da9fe4d41d5ba69faa6c509a1d5bafd49a48615a47a8dd4b0823cc147648
1138fe59af0df2c79f57b8780278f5ae47355fe1f817119041951c80f612fdfc6d2f0
c547f70deaeca54d878c14c1aa5e1ab405dec833777132eea905c2fbb12504a67dcbe
0e66740c76b62c13b04a38a77926e19072953319ec65e41f9bfd2ae268d7f10604202
1c80300e4c6f585980cf39fc51a4a6bba41b0729f9b240c729e5671cd9960ecef2fe0
d0f7494986fa3d8b2bb01963537e60efb13981e138e3d4a103c1701353219b53acf33
7bf6456a83cefed8f563f1040b65afbf3b65d3bc9a19b84922c7e5d074838a8f27859
2c53f61fb59f031e85ad480c0c71086b871e1b24
KE3: 46833578cee137775f6be3f01b80748daac5a694101ad0e9e7025480552da56a
export_key: c3c9a1b0e33ac84dd83d0b7e8af6794e17e7a3caadff289fbd9dc769a
853c64b
session_key: 27766fabd8dd88ff37fbd0ef1a491e601d10d9f016c2b28c4bd1b0fb
7511a3c3
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="fake-vectors">
        <name>Fake Test Vectors</name>
        <section anchor="opaque-3dh-fake-test-vector-1">
          <name>OPAQUE-3DH Fake Test Vector 1</name>
          <section anchor="configuration-6">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: ristretto255-SHA512
Hash: SHA512
KSF: Identity
KDF: HKDF-SHA512
MAC: HMAC-SHA512
Group: ristretto255
Context: 4f50415155452d504f43
Nh: 64
Npk: 32
Nsk: 32
Nm: 64
Nx: 64
Nok: 32
]]></artwork>
          </section>
          <section anchor="input-values-6">
            <name>Input Values</name>
            <artwork><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: 743fc168d1f826ad43738933e5adb23da6fb95f95a1b069f0daa0522d0
a78b617f701fc6aa46d3e7981e70de7765dfcd6b1e13e3369a582eb8dc456b10aa53b
0
credential_identifier: 31323334
masking_nonce: 9c035896a043e70f897d87180c543e7a063b83c1bb728fbd189c61
9e27b6e5a6
client_private_key: 2b98980aa95ab53a0f39f0291903d2fdf04b00c167f081416
9922df873002409
client_public_key: 84f43f9492e19c22d8bdaa4447cc3d4db1cdb5427a9f852c47
07921212c36251
server_private_key: c788585ae8b5ba2942b693b849be0c0426384e41977c18d2e
81fbe30fd7c9f06
server_public_key: 825f832667480f08b0c9069da5083ac4d0e9ee31b49c4e0310
031fea04d52966
server_nonce: 1e10f6eeab2a7a420bf09da9b27a4639645622c46358de9cf7ae813
055ae2d12
client_keyshare_seed: a270dc715dc2b4612bc7864312a05c3e9788ee1bad1f276
d1e15bdeb4c355e94
server_keyshare_seed: 360b0937f47d45f6123a4d8f0d0c0814b6120d840ebb8bc
5b4f6b62df07f78c2
masking_key: 39ebd51f0e39a07a1c2d2431995b0399bca9996c5d10014d6ebab445
3dc10ce5cef38ed3df6e56bfff40c2d8dd4671c2b4cf63c3d54860f31fe40220d690b
b71
KE1: b0a26dcaca2230b8f5e4b1bcab9c84b586140221bb8b2848486874b0be448905
42d4e61ed3f8d64cdd3b9d153343eca15b9b0d5e388232793c6376bd2d9cfd0ab641d
7f20a245a09f1d4dbb6e301661af7f352beb0791d055e48d3645232f77f
]]></artwork>
          </section>
          <section anchor="output-values-6">
            <name>Output Values</name>
            <artwork><![CDATA[
KE2: 928f79ad8df21963e91411b9f55165ba833dea918f441db967cdc09521d22925
9c035896a043e70f897d87180c543e7a063b83c1bb728fbd189c619e27b6e5a632b5a
b1bff96636144faa4f9f9afaac75dd88ea99cf5175902ae3f3b2195693f165f11929b
a510a5978e64dcdabecbd7ee1e4380ce270e58fea58e6462d92964a1aaef72698bca1
c673baeb04cc2bf7de5f3c2f5553464552d3a0f7698a9ca7f9c5e70c6cb1f706b2f17
5ab9d04bbd13926e816b6811a50b4aafa9799d5ed7971e10f6eeab2a7a420bf09da9b
27a4639645622c46358de9cf7ae813055ae2d1298251c5ba55f6b0b2d58d9ff0c88fe
4176484be62a96db6e2a8c4d431bd1bf27fe6c1d0537603835217d42ebf7b25819827
32e74892fd28211b31ed33863f0beaf75ba6f59474c0aaf9d78a60a9b2f4cd24d7ab5
4131b3c8efa192df6b72db4c
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-fake-test-vector-2">
          <name>OPAQUE-3DH Fake Test Vector 2</name>
          <section anchor="configuration-7">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: ristretto255-SHA512
Hash: SHA512
KSF: Identity
KDF: HKDF-SHA512
MAC: HMAC-SHA512
Group: curve25519
Context: 4f50415155452d504f43
Nh: 64
Npk: 32
Nsk: 32
Nm: 64
Nx: 64
Nok: 32
]]></artwork>
          </section>
          <section anchor="input-values-7">
            <name>Input Values</name>
            <artwork><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: 66e650652a8266b2205f31fdd68adeb739a05b5e650b19e7edc75e734a
1296d6088188ca46c31ae8ccbd42a52ed338c06e53645387a7efbc94b6a0449526155
e
credential_identifier: 31323334
masking_nonce: 9c035896a043e70f897d87180c543e7a063b83c1bb728fbd189c61
9e27b6e5a6
client_private_key: 288bf63470199221847bb035d99f96531adf8badd14cb1571
b48f7a506649660
client_public_key: 3c64a3153854cc9f0c23aab3c1a19106ec8bab4730736d1d00
3880a1d5a59005
server_private_key: 30fbe7e830be1fe8d2187c97414e3826040cbe49b893b6422
9bab5e85a588846
server_public_key: 78b3040047ff26572a7619617601a61b9c81899bee92f00cfc
aa5eed96863555
server_nonce: 1e10f6eeab2a7a420bf09da9b27a4639645622c46358de9cf7ae813
055ae2d12
client_keyshare_seed: a270dc715dc2b4612bc7864312a05c3e9788ee1bad1f276
d1e15bdeb4c355e94
server_keyshare_seed: 360b0937f47d45f6123a4d8f0d0c0814b6120d840ebb8bc
5b4f6b62df07f78c2
masking_key: 79ad2621b0757a447dff7108a8ae20a068ce67872095620f415ea611
c9dcc04972fa359538cd2fd6528775ca775487b2b56db642049b8a90526b975a38484
c6a
KE1: b0a26dcaca2230b8f5e4b1bcab9c84b586140221bb8b2848486874b0be448905
42d4e61ed3f8d64cdd3b9d153343eca15b9b0d5e388232793c6376bd2d9cfd0ac059b
7ba2aec863933ae48816360c7a9022e83d822704f3b0b86c0502a66e574
]]></artwork>
          </section>
          <section anchor="output-values-7">
            <name>Output Values</name>
            <artwork><![CDATA[
KE2: 6606b6fedbb33f19a81a1feb5149c600fe77252f58acd3080d7504d3dad4922f
9c035896a043e70f897d87180c543e7a063b83c1bb728fbd189c619e27b6e5a67db39
8c0f65d8c298eac430abdae4c80e82b552fb940c00f0cbcea853c0f96c1c15099f3d4
b0e83ecc249613116d605b8d77bb68bdf76994c2bc507e2dcae4176f00afed68ad25c
f3040a0e991acece31ca532117f5c12816997372ff031ad04ebcdce06c501da24e7b4
db95343456e2ed260895ec362694230a1fa20e24a9c71e10f6eeab2a7a420bf09da9b
27a4639645622c46358de9cf7ae813055ae2d122d9055eb8f83e1b497370adad5cc2a
417bf9be436a792def0c7b7ccb92b9e275d7c663104ea4655bd70570d975c05351655
d55fbfb392286edb55600a23b55ce18f8c60e0d1960c960412dd08eabc81ba7ca8ae2
b04aad65462321f51c298010
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-fake-test-vector-3">
          <name>OPAQUE-3DH Fake Test Vector 3</name>
          <section anchor="configuration-8">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: P256-SHA256
Hash: SHA256
KSF: Identity
KDF: HKDF-SHA256
MAC: HMAC-SHA256
Group: P256_XMD:SHA-256_SSWU_RO_
Context: 4f50415155452d504f43
Nh: 32
Npk: 33
Nsk: 32
Nm: 32
Nx: 32
Nok: 32
]]></artwork>
          </section>
          <section anchor="input-values-8">
            <name>Input Values</name>
            <artwork><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: bb1cd59e16ac09bc0cb6d528541695d7eba2239b1613a3db3ade77b362
80f725
credential_identifier: 31323334
masking_nonce: 9c035896a043e70f897d87180c543e7a063b83c1bb728fbd189c61
9e27b6e5a6
client_private_key: d423b87899fc61d014fc8330a4e26190fcfa470a3afe59243
24294af7dbbc1dd
client_public_key: 03b81708eae026a9370616c22e1e8542fe9dbebd36ce8a2661
b708e9628f4a57fc
server_private_key: 34fbe7e830be1fe8d2187c97414e3826040cbe49b893b6422
9bab5e85a5888c7
server_public_key: 0221e034c0e202fe883dcfc96802a7624166fed4cfcab4ae30
cf5f3290d01c88bf
server_nonce: 1e10f6eeab2a7a420bf09da9b27a4639645622c46358de9cf7ae813
055ae2d12
client_keyshare_seed: a270dc715dc2b4612bc7864312a05c3e9788ee1bad1f276
d1e15bdeb4c355e94
server_keyshare_seed: 360b0937f47d45f6123a4d8f0d0c0814b6120d840ebb8bc
5b4f6b62df07f78c2
masking_key: caecc6ccb4cae27cb54d8f3a1af1bac52a3d53107ce08497cdd362b1
992e4e5e
KE1: 0396875da2b4f7749bba411513aea02dc514a48d169d8a9531bd61d3af3fa9ba
ae42d4e61ed3f8d64cdd3b9d153343eca15b9b0d5e388232793c6376bd2d9cfd0a021
47a6583983cc9973b5082db5f5070890cb373d70f7ac1b41ed2305361009784
]]></artwork>
          </section>
          <section anchor="output-values-8">
            <name>Output Values</name>
            <artwork><![CDATA[
KE2: 0201198dcd13f9792eb75dcfa815f61b049abfe2e3e9456d4bbbceec5f442efd
049c035896a043e70f897d87180c543e7a063b83c1bb728fbd189c619e27b6e5a6fac
da65ce0a97b9085e7af07f61fd3fdd046d257cbf2183ce8766090b8041a8bf28d79dd
4c9031ddc75bb6ddb4c291e639937840e3d39fc0d5a3d6e7723c09f7945df485bcf9a
efe3fe82d149e84049e259bb5b33d6a2ff3b25e4bfb7eff0962821e10f6eeab2a7a42
0bf09da9b27a4639645622c46358de9cf7ae813055ae2d12023f82bbb24e75b8683fd
13b843cd566efae996cd0016cffdcc24ee2bc937d026f80144878749a69565b433c10
40aff67e94f79345de888a877422b9bbe21ec329
]]></artwork>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
KfFnZP3LtXa2cJonu/UruDo0VRtbplNSkCVv1oBCa+xQo6t7P9I4V7eLBDp8
VSDsM0UIz0BcFNiztmUr0fatxI2tuKuItJdFuJc2w8iMI9jQMktmkkYgpav/
jZyQn1E/0goagp38KS3FfGNEoRGZermebeUV7eeq22Ht1u0xn8PWGdRyIwoz
HTlXK/ayMmiJkbcXA5D+O25LH0OjMUEGyInAC+4KVLxCykDO04/JFC5xiUSu
xlOXWi2dlxl5mR89VPf6xCX7GLgO/z2F/4hsfce5EKfcY2A/rteUdGGpGT0Q
UXas6QOodfZc7vmWSq+/J8uHh5ZUKtVGchFFjpy8M94KxtObvibcG9SFa4nn
MeU4NAeqB58UOOyZleN5eWUKrIArEQiv5ogg/E1jLU0WrzgJzLCmVnWO1bmm
TkNvNsEtq0sQOyTnoQd/ifL3DmlLQNY8yoJP3XMpVPhGfEiP3MMbsXfLwhce
8WNsUYDz1sXRV18NLl6cfHV4RFLO41j+gKN8/P+3d2Y7dh3Zmb6Pp+AjxDzw
urvRQKOrDBuGfSesmG4Khg0YDdTj+/tPkhTJTKkoJiypS0kJTGbmOXvHsNY/
rB0R59N4OKb6/bv/zd8fX8u0v3/s7Pr4g8cMf3ld9yEe3r/Lt/gcSigll7j5
983J/Ymb1ez+9B9/ef8uRfen//zw9d+efvzXpy///vTThwx7dOnT1qj/p/2j
+vmnD/F5/47rpu1jbNPPsXfJt62cY5zV+9NqPrndWXy64Q7z11tuq1Zfp3cl
W7t71ZJ4TTDfb2ztxJhKn9PmifX2mO6yHlfruZ9hrdQabj6r7LLC6OO46178
ZAX6EFJMKeVPq6cYlVRviy3WUlPLuT++S7XkWEPLLdfC96PwO773laa5j4WE
J+/3/p2tkEILM97Q5qJheYx2/V0nnHBTmWfVOcI98YS456YNO7o0rVnq+57l
PmLNhwumfk8Zdv2+XG3c0mZv3cfWbzFGL5VyuXLnpmEwp6OE1b27NcS776o/
7gL/EXnpacslWKcr8faZ+HpiHrvNkkPvngbO0M/eh1uNPAmOE6flOMuZfdCY
53vL37+j06fZHTf3tYqP24fa4tj8OJa1N6FAH/JctJM5ntFcYu7GbGMzwa27
z330+3ctrD1G9WedyzX89pfhzIN5sbT7jHP6MOqj9byKJqfRw3Eh9ZN2tvDx
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
AA==

-->

</rfc>
