<?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.4 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-opaque-13" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="OPAQUE">The OPAQUE Asymmetric PAKE Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-13"/>
    <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="2023" month="December" day="18"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 272?>

<t>This document describes the OPAQUE protocol, a secure asymmetric
password-authenticated key exchange (aPAKE) that supports mutual
authentication in a client-server setting without reliance on PKI and
with security against pre-computation attacks upon server compromise.
In addition, the protocol provides forward secrecy and the ability to
hide the password from the server, even during password registration.
This document specifies the core OPAQUE protocol and one instantiation
based on 3DH.</t>
    </abstract>
    <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>Asymmetric (or Augmented) 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="OPRF"/>, draft version -21, using the OPRF mode (0x00) from <xref section="3.1" sectionFormat="comma" target="OPRF"/>.</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="OPRF"/>, 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="OPRF"/>.</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="OPRF"/>
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 different seeds for each client,
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="offline-registration">
        <name>Offline 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="offline-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="offline-phase">
      <name>Offline 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 negligibile 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, application 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="offline-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 and servers 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 negligibile 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="OPRF"/>. The public value from DeriveKeyPair
is encoded using SerializeElement from <xref section="2.1" sectionFormat="of" target="OPRF"/>.</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="OPRF"/>.</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="OPRF"/>. The public value from DeriveKeyPair
is encoded using SerializeElement from <xref section="2.1" sectionFormat="of" target="OPRF"/>.</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="OPRF"/>.</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="OPRF"/> 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="offline-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 which 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
which 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 offline 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="offline-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="offline-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.</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 dictionnary 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="I-D.irtf-cfrg-voprf"/>. This specification also delegates OPRF group
choice and operations to <xref target="I-D.irtf-cfrg-voprf"/>. 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="I-D.irtf-cfrg-voprf"/>, which
is identical to the DH-OPRF functionality in <xref target="JKX18"/> and, concretely, uses
the hash-to-curve functions in <xref target="I-D.irtf-cfrg-hash-to-curve"/>. All hash-to-curve
methods in <xref target="I-D.irtf-cfrg-hash-to-curve"/> 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><tt> to the OPRF input
provides domain separation for clients that reuse the same </tt>client_identity`
across different server instantiations.</t>
      </section>
      <section anchor="related-protocols">
        <name>Related Protocols</name>
        <t>Despite the existence of multiple designs for (PKI-free) aPAKE protocols,
none of these protocols are secure against pre-computation attacks.
This includes protocols that have recent analyses in the UC model such
as AuCPace <xref target="AuCPace"/> and SPAKE2+ <xref target="SPAKE2plus"/>. In particular, none
of these protocols can use the standard technique against pre-computation
that combines secret random values ("salt") into the one-way password mappings.
Either these protocols do not use a salt at all or, if they do, they
transmit the salt from server to client in the clear, hence losing the
secrecy of the salt and its defense against pre-computation.</t>
        <t>We note that as shown in <xref target="JKX18"/>, these protocols, and any aPAKE
in the model from <xref target="GMR06"/>, can be converted into an aPAKE secure against
pre-computation attacks at the expense of an additional OPRF execution.</t>
        <t>Beyond AuCPace and SPAKE2+, the most widely deployed PKI-free aPAKE is SRP <xref target="RFC2945"/>,
which is vulnerable to pre-computation attacks, lacks proof of security, and is
less efficient than OPAQUE. Moreover, SRP requires a ring as it mixes addition and
multiplication operations, and thus does not work over standard elliptic curves.
OPAQUE is therefore a suitable replacement for applications that use SRP.</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="OPRF"/> 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
offline 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 at 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 against 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 of 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 for enforcing 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>
    <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="OPRF">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="21" month="February" year="2023"/>
            <abstract>
              <t>   An Oblivious Pseudorandom Function (OPRF) is a two-party protocol
   between client and 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="Internet-Draft" value="draft-irtf-cfrg-voprf-21"/>
        </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="I-D.irtf-cfrg-voprf">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="21" month="February" year="2023"/>
            <abstract>
              <t>   An Oblivious Pseudorandom Function (OPRF) is a two-party protocol
   between client and 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="Internet-Draft" value="draft-irtf-cfrg-voprf-21"/>
        </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="I-D.irtf-cfrg-hash-to-curve">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Sam Scott" initials="S." surname="Scott">
              <organization>Cornell Tech</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby" initials="R. S." surname="Wahby">
              <organization>Stanford University</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="15" month="June" year="2022"/>
            <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="Internet-Draft" value="draft-irtf-cfrg-hash-to-curve-16"/>
        </reference>
        <reference anchor="RFC2945">
          <front>
            <title>The SRP Authentication and Key Exchange System</title>
            <author fullname="T. Wu" initials="T." surname="Wu"/>
            <date month="September" year="2000"/>
            <abstract>
              <t>This document describes a cryptographically strong network authentication mechanism known as the Secure Remote Password (SRP) protocol. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2945"/>
          <seriesInfo name="DOI" value="10.17487/RFC2945"/>
        </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 2296?>

<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, Payman Mohassel, 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 similar 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
draft-21 of <xref target="OPRF"/>. 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:
H4sIAAAAAAAAA+y92Xrb6JkweP5dBSIfhPpD0lpcFZcr1flleVN5U1uuVLoz
HQskQREtEmAAUDKjcZ6+hzmZOZtrmUvpK5l3/TaAlOyqSvpffGBJJPCt774O
BgPT5M08e5S8n2XJ29Ojf/7haXJUrxeLrKnycXJ69PJpclqVTTku5yYdjars
6pE8ZybluEgX8O6kSqfNIK+a6WA8rS4G5TL9yyob7B+aSdpkj8wY/r8oq/Wj
JC+mpTH5snqUNNWqbg729r7ZOzCX2fq6rCaPkpOiyaoiawZPcEhj6iYtJh/S
eVnANOusNsv8UfInWE0/qcuqqbJpDb+tF/jLvxmTrppZWT0yycAk8C8v6kfJ
k2HyuFxVkyr7K33IS36SFnk2D7/JFmk+h93899G6gd+HVRYM9GKYvKzS6/Ff
15feQC9WF2X4eVldwOB/TZu8LB4lRz+e+YPP4PFLePq/X+Dfw3G5COZ4OUxe
Zde5N/7L7Cov3Ifh4K+zJvVHn8Njw0t8Y3i5YYbjYXI0TH4sy4k3yfGsyuum
XM6yKvg2nO14Xq4m03laZX24qPHQn3kMW5pl6TIvLkZ5Uw/hDuGe4barBbx9
BUCQJCeDJ8NLOakAUPYOH9FYnwGK9HhaXWQNnGnTLOtH9+8DsKVNlY4vs2qY
Z810CMu/D0B6f9Ys5vcZSDfMb2BAnGBwls2zMW3XX9Hxs3fPeQG1fp8sq3Kc
1XVSZcuyzhsA785FXeTNbDXCa7iPU95fppfZwI6C8z4u11mx900w4c4LnO1R
cprWNWJGcgSQnRVNPqa7SM6y8arKkvQihUttkuOqrOvBWd5kyQ813OHJYplV
dVnQwzs0sEUN+jeQnwIUfxzyKuynDBZ/TK9yGI2/ou9g8Dyr8V7hUKr1sinn
5cU6ASRN3mQNrPSSl5Y366R3fPTmbJdeIzKQILLThp/vPWhdOGA67C55kk+n
eTZ4kc3ni5QOeTTPFrfvALG8Kq/jHQiavwO0Ch+IXocHnqfztGii99+Vo6xq
klP7desU8J7hmrNllRfNME/HFYEd7PXB/cO9r8PtP8D3j1NAjibf2w9v/IcC
0KSq0/l8nQC0AFClsHWYi48TKElSZNfJMq3SSX6xSAC1kjFdwUWVLmf52CwF
Oeo73DhsWNYR7xhOXb9pbfbk6dOnydkaF5evFgkA4rNyVUwIzOqknCbHsPAV
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
i6j/yidf1GZgKcLjUnFetkE5fyLsGysvwDP+936/9aLT0+tJI5KB4r/fNyMp
iqijwwr6QREwz9+5PZwMDWp+EVAUxmzRVcm7l0Bnjn+kuBGKG/UL1ObNrjpv
gpPorNIemFaI0HBlOjYajypMDPdlTaCuqQKzgosVJzX9MJCz1Qjj2zXJptCI
JZ47g3Zn2apj1SvZSu1v0f7nK5K2Gp0k11IvIbSLuHr7WHPIgOgDqjI3/svZ
3IAcsZd35aBwdyRS3sjApsYt28RVrSsyqi1b4Sa1Jr8Ga8OTDdFP4qU8B1CJ
iKgFhDU5Y+Jwc8+vR0MBLR3FVfjgScrx6CLvYgDksS/ShZb1YqO2bBrFDSWU
lvDaevnyhCWlyTkoEukCCPu5mKh4co5w8ZzN0vkV9Y5p/hGk62QHh97xq/fs
wNp2EvjKZrlRcyI4lL/97W9GJ8KQ6rIArOjxCFjJJf53cvD27LQ3z4pW+Hs/
Odjtx5GrXUO8fLq/feQ4ZJ5Hjj7tHvlg6BUktc1oNzxK4T/WaSXjF9hy+7Pe
cEG1pN/u0pka7TSA93ry8rVfMJQvUgwJyRGm+IZlklqMIxmv4WDHRoqITblq
VMKhkEspcZNjucriAn595cyXMpco4OewkvOw9SEudvVruPpeVl/+kPwmWSX/
x38DlvnDLrp+kqXBxeO3y8sz/AZ+/Lne/fPq17zNV/llht4H16L8TjPWOuMZ
zFjzjGftGX/gGX/482r3z7XMeFKw2UPafJ6vzl06tsw6aU+I4Q4cvGWB3AEc
ziRQhr923b4HnhhAKU/jr7c8vcM3sSNv2D/NClbyAlbVs0vj/b+KD/a8/ll2
eOZ2ePbz7pBv3u5Q/zT19h3iV1oulRLMw4DDVe1KXFCIdJzBphWbHGYNQSSu
Nb5IcAFZDja+3mVP+ShzZV1fDSVgTxMUte8gB1P4AVW9VBLzvWi/T7tUoRET
20i+RpO7l5nEuXdRrDNLcS7SSAKxRWju4kzAinzBPGJI2tGLOyxUsCsJqiEJ
xTEm8a6H4rXZIKT7nCOMHGvFoRImAmXkQj9PD41gf1qhmbI9dt8BsJrDwgK0
rT48tfGcW90OOiTIWuQ3DGtEJazvCZakk9XGRyILWHhMkuwT8GHeEUn1SrLD
HvV35NzmFs6N7HlH7nkD85bENqapfo6/Ew1sWkS2RJUX0y99oNTcpsnmTqek
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

-->

</rfc>
