<?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-rfc2629 version 1.6.2 (Ruby 3.0.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-opaque-08" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.3 -->
  <front>
    <title abbrev="OPAQUE">The OPAQUE Asymmetric PAKE Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-08"/>
    <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>Algorand Foundation</organization>
      <address>
        <email>hugokraw@gmail.com</email>
      </address>
    </author>
    <author initials="K." surname="Lewi" fullname="Kevin Lewi">
      <organization>Novi Research</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="2022" month="March" day="07"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes the OPAQUE protocol, a secure asymmetric
password-authenticated key exchange (aPAKE) that supports mutual
authentication in a client-server setting without reliance on PKI and
with security against pre-computation attacks upon server compromise.
In addition, the protocol provides forward secrecy and the ability to
hide the password from the server, even during password registration.
This document specifies the core OPAQUE protocol and one instantiation
based on 3DH.</t>
    </abstract>
    <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>
    <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, a PKI-free secure aPAKE that is secure
against pre-computation attacks. 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="_3DH"/>. 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.</t>
      </section>
      <section anchor="notation">
        <name>Notation</name>
        <t>The following functions are used throughout this document:</t>
        <ul spacing="normal">
          <li>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.</li>
          <li>concat(x0, ..., xN): Concatenate byte strings. For example,
<tt>concat(0x01, 0x0203, 0x040506) = 0x010203040506</tt>.</li>
          <li>random(n): Generate a cryptographically secure pseudorandom byte string of length <tt>n</tt> bytes.</li>
          <li>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.</li>
          <li>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>.</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>Oblivious Pseudorandom Function (OPRF); <xref target="deps-oprf"/></li>
        <li>Key Derivation Function (KDF); <xref target="deps-symmetric"/></li>
        <li>Message Authentication Code (MAC); <xref target="deps-symmetric"/></li>
        <li>Cryptographic Hash Function; <xref target="deps-hash"/></li>
        <li>Key Stretching Function (KSF); <xref target="deps-hash"/></li>
        <li>Key Recovery Mechanism; <xref target="deps-keyrec"/></li>
        <li>Authenticated Key Exchange (AKE) protocol; <xref target="deps-ake"/></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 such that the client learns the PRF output and neither party learns
the input of the other. This specification depends on the prime-order OPRF construction specified
in <xref target="OPRF"/>, draft version -09, 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>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 this blinding process, denoted <tt>blind</tt>.</li>
          <li>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>.</li>
        </ul>
        <t>Moreover, the following OPRF server APIs:</t>
        <ul spacing="normal">
          <li>Evaluate(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 Evaluate function described in <xref section="3.3.1" sectionFormat="comma" target="OPRF"/>, where <tt>k</tt> is the private key parameter.</li>
          <li>DeriveKeyPair(seed, info): Derive a private and public key pair deterministically
from a seed, as described in <xref section="3.2" sectionFormat="comma" target="OPRF"/>. In this specification,
the info parameter to DeriveKeyPair is set to "OPAQUE-DeriveKeyPair".</li>
        </ul>
        <t>Finally, this specification makes use of the following shared APIs and parameters:</t>
        <ul spacing="normal">
          <li>SerializeElement(element): Map input <tt>element</tt> to a fixed-length byte array <tt>buf</tt>.</li>
          <li>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.</li>
          <li>Noe: The size of a serialized OPRF group element output from SerializeElement.</li>
          <li>Nok: The size of an OPRF private key as output from DeriveKeyPair.</li>
        </ul>
        <t>This specification uses the OPRF mode (0x00) from <xref section="3.1" sectionFormat="comma" target="OPRF"/>.</t>
      </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>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>.</li>
          <li>Expand(prk, info, L): Expand a pseudorandom key <tt>prk</tt> using optional string <tt>info</tt>
into <tt>L</tt> bytes of output keying material.</li>
          <li>Nx: The output size of the <tt>Extract()</tt> function in bytes.</li>
        </ul>
        <t>This specification also makes use of a collision resistant Message Authentication Code
(MAC) with the following API and parameters:</t>
        <ul spacing="normal">
          <li>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.</li>
          <li>Nm: The output size of the <tt>MAC()</tt> function in bytes.</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>Hash(msg): Apply a cryptographic hash function to input <tt>msg</tt>, producing a
fixed-length digest of size <tt>Nh</tt> bytes.</li>
          <li>Nh: The output size of the <tt>Hash()</tt> function in bytes.</li>
        </ul>
        <t>A Key Stretching Function (KSF) is a slow and expensive cryptographic hash function
with the following API:</t>
        <ul spacing="normal">
          <li>Stretch(msg, params): Apply a key stretching function with parameters
<tt>params</tt> to stretch the input <tt>msg</tt> and harden it against offline
dictionary attacks. This function also needs to satisfy collision resistance.</li>
        </ul>
      </section>
      <section anchor="deps-keyrec">
        <name>Key Recovery Method</name>
        <t>OPAQUE relies on a key recovery mechanism for storing authentication
material on the server and recovering it on the client. This material
is encapsulated in an envelope, whose structure, encoding,
and size must be specified by the key recovery mechanism. The size of
the envelope is denoted <tt>Ne</tt> and may vary between mechanisms.</t>
        <t>The key recovery storage mechanism takes as input a private seed and outputs
an envelope. The retrieval process takes as input a private seed and envelope
and outputs authentication material. The signatures for these functionalities
are as follows:</t>
        <ul spacing="normal">
          <li>Store(private_seed): build and return an <tt>Envelope</tt> structure and the client's
public key.</li>
          <li>Recover(private_seed, envelope): recover and return the authentication
material for the AKE from the Envelope. This function raises an error if the
private seed cannot be used for recovering authentication material from the
input envelope.</li>
        </ul>
        <t>The key recovery mechanism MUST return an error when trying to recover
authentication material from an envelope with a private seed that was not used
in producing the envelope.</t>
        <t>Moreover, it MUST be compatible with the chosen AKE. For example, the key
recovery mechanism specified in <xref target="key-recovery"/> directly recovers a private key
from a seed, and the cryptographic primitive in the AKE must therefore support
such a possibility.</t>
        <t>If applications implement <xref target="preventing-client-enumeration"/>, they MUST use the
same mechanism throughout their lifecycle in order to avoid activity leaks due
to switching.</t>
      </section>
      <section anchor="deps-ake">
        <name>Authenticated Key Exchange (AKE) Protocol</name>
        <t>OPAQUE additionally depends on a three-message Authenticated Key Exchange (AKE)
protocol which satisfies the forward secrecy and KCI properties discussed in
<xref target="security-considerations"/>.</t>
        <t>The AKE must define three messages <tt>AuthInit</tt>, <tt>AuthResponse</tt> and <tt>AuthFinish</tt>
and provide the following functions for the client:</t>
        <ul spacing="normal">
          <li>Start(): Initiate the AKE by producing message <tt>AuthInit</tt>.</li>
          <li>ClientFinish(client_identity, client_private_key,
server_identity, server_public_key, <tt>AuthInit</tt>): upon receipt of the server's
response <tt>AuthResponse</tt>, complete the protocol for the client, produce
<tt>AuthFinish</tt>.</li>
        </ul>
        <t>The AKE protocol must provide the following functions for the server:</t>
        <ul spacing="normal">
          <li>Response(server_identity, server_private_key, client_identity,
client_public_key, <tt>AuthInit</tt>): upon receipt of a client's request <tt>AuthInit</tt>,
engage in the AKE.</li>
          <li>ServerFinish(<tt>AuthFinish</tt>): upon receipt of a client's final AKE message
<tt>AuthFinish</tt>, complete the protocol for the server.</li>
        </ul>
        <t>Both ClientFinish and ServerFinish return an error if authentication failed.
In this case, clients and servers MUST NOT use any outputs from the protocol,
such as <tt>session_key</tt> or <tt>export_key</tt> (defined below).</t>
        <t>Prior to the execution of these functions, both the client and the server MUST
agree on a configuration; see <xref target="configurations"/> for details.</t>
        <t>This specification defines one particular AKE based on 3DH;
see <xref target="ake-protocol"/>. 3DH assumes a prime-order group as described in
<xref section="2.1" sectionFormat="comma" target="OPRF"/>.</t>
      </section>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <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
its credential file on the server. In the second 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>Previously to both stages, the client and server agree on a configuration, which
fully specifies the cryptographic algorithm dependencies necessary to run the
protocol; see <xref target="configurations"/> for details.
The client chooses its password, and the server chooses its own pair
of keys (server_private_key and server_public_key) for the
AKE, and chooses a seed (oprf_seed) of Nh bytes for the OPRF.
The server can use the same pair of keys with multiple
clients and can opt to use multiple seeds (so long as they are kept consistent for
each client).</t>
      </section>
      <section anchor="offline-registration">
        <name>Offline Registration</name>
        <t>Registration is the only part in OPAQUE that requires a server-authenticated
and confidential channel, either physical, out-of-band, PKI-based, etc.</t>
        <t>The client inputs its credentials, which includes its password and user
identifier, and the server inputs its parameters, which includes 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., 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 client
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>Record</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):</t>
        <ul spacing="normal">
          <li>
            <tt>KE1</tt> is composed of the <tt>CredentialRequest</tt> and <tt>AuthInit</tt> messages</li>
          <li>
            <tt>KE2</tt> is composed of the <tt>CredentialResponse</tt> and <tt>AuthResponse</tt> messages</li>
          <li>
            <tt>KE3</tt> represents the <tt>AuthFinish</tt> message</li>
        </ul>
        <t>The <tt>CredentialRequest</tt> and <tt>CredentialResponse</tt> message contents and wire
format are specified in <xref target="cred-retrieval"/>, and those of <tt>AuthInit</tt>,
<tt>AuthResponse</tt> and <tt>AuthFinish</tt> are specified in <xref target="ake-messages"/>.</t>
        <t>The rest of this document describes the details of these stages in detail.
<xref target="client-material"/> describes how client credential information is
generated, encoded, stored on the server on registration, and recovered on
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>Future variants of OPAQUE may use different key recovery mechanisms. See <xref target="key-recovery"/> for details.</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>client_private_key: The encoded client private key for the AKE protocol.</li>
        <li>client_public_key: The encoded client public key for the AKE protocol.</li>
        <li>server_public_key: The encoded server public key for the AKE protocol.</li>
        <li>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.</li>
        <li>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.</li>
      </ul>
      <t>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 key using the
<tt>DeriveAuthKeyPair()</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 unique nonce of length <tt>Nn</tt> used to protect this Envelope.</t>
          <t>auth_tag: 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.</t>
          <artwork><![CDATA[
Store

Input:
- randomized_pwd, 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_pwd, server_public_key, server_identity, client_identity):
  envelope_nonce = random(Nn)
  masking_key = Expand(randomized_pwd, "MaskingKey", Nh)
  auth_key = Expand(randomized_pwd, concat(envelope_nonce, "AuthKey"), Nh)
  export_key = Expand(randomized_pwd, concat(envelope_nonce, "ExportKey"), Nh)
  seed = Expand(randomized_pwd, concat(envelope_nonce, "PrivateKey"), Nseed)
  (_, client_public_key) = DeriveAuthKeyPair(seed)

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

  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_pwd, 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.
- export_key, an additional client key.

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

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

  cleartext_creds = CreateCleartextCredentials(server_public_key,
                      client_public_key, server_identity, client_identity)
  expected_tag = MAC(auth_key, concat(envelope.nonce, cleartext_creds))
  If !ct_equal(envelope.auth_tag, expected_tag)
    raise EnvelopeRecoveryError
  return (client_private_key, export_key)
]]></artwork>
        </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>password: client password.</li>
        <li>creds: client credentials, as described in <xref target="client-material"/>.</li>
      </ul>
      <t>The server inputs the following values:</t>
      <ul spacing="normal">
        <li>server_private_key: server private key for the AKE protocol.</li>
        <li>server_public_key: server public key for the AKE protocol.</li>
        <li>credential_identifier: unique identifier for the client's
credential, generated by the server.</li>
        <li>oprf_seed: seed used to derive per-client OPRF keys.</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) = FinalizeRequest(response,
                                        server_identity,
                                        client_identity)

                        record
              ------------------------->
]]></artwork>
      <t><xref target="registration-functions"/> describes details of the functions and the
corresponding parameters referenced above.</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>
        <artwork><![CDATA[
struct {
  uint8 blinded_message[Noe];
} RegistrationRequest;
]]></artwork>
        <dl>
          <dt>data</dt>
          <dd>
            <t>A serialized OPRF group element.</t>
          </dd>
        </dl>
        <artwork><![CDATA[
struct {
  uint8 evaluated_message[Noe];
  uint8 server_public_key[Npk];
} RegistrationResponse;
]]></artwork>
        <dl>
          <dt>data</dt>
          <dd>
            <t>A serialized OPRF group element.</t>
          </dd>
          <dt>server_public_key</dt>
          <dd>
            <t>The server's encoded public key that will be used for the online authenticated key exchange stage.</t>
          </dd>
        </dl>
        <artwork><![CDATA[
struct {
  uint8 client_public_key[Npk];
  uint8 masking_key[Nh];
  Envelope envelope;
} RegistrationRecord;
]]></artwork>
        <dl>
          <dt>client_public_key</dt>
          <dd>
            <t>The client's encoded public key, corresponding to the private key <tt>client_private_key</tt>.</t>
          </dd>
          <dt>masking_key</dt>
          <dd>
            <t>An encryption key used by the server to preserve confidentiality of the envelope during login
to defend against client enumeration attacks.</t>
          </dd>
          <dt>envelope</dt>
          <dd>
            <t>The client's <tt>Envelope</tt> structure.</t>
          </dd>
        </dl>
      </section>
      <section anchor="registration-functions">
        <name>Registration Functions</name>
        <section anchor="createregistrationrequest">
          <name>CreateRegistrationRequest</name>
          <artwork><![CDATA[
CreateRegistrationRequest

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

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

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>
          <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.

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

  blinded_element = DeserializeElement(request.blinded_message)
  evaluated_element = Evaluate(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>FinalizeRequest</name>
          <t>To create the user record used for further authentication, the client executes
the following function.</t>
          <artwork><![CDATA[
FinalizeRequest

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 FinalizeRequest(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, params)
  randomized_pwd = Extract("", concat(oprf_output, stretched_oprf_output))

  (envelope, client_public_key, masking_key, export_key) =
    Store(randomized_pwd, response.server_public_key,
          server_identity, client_identity)
  Create RegistrationUpload record with (client_public_key, masking_key, envelope)
  return (record, export_key)
]]></artwork>
          <t>See <xref target="online-phase"/> for details about the output export_key usage.</t>
          <t>Upon completion of this function, the client MUST send <tt>record</tt> to the server.</t>
        </section>
      </section>
      <section anchor="finalize-registration">
        <name>Finalize Registration</name>
        <t>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>
      </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
ke1, ke2, and ke3, where ke1 and ke2 include key exchange shares, e.g., DH values, sent
by the client and server, respectively, and ke3 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>password: client password.</li>
        <li>client_identity: client identity, as described in <xref target="client-material"/>.</li>
      </ul>
      <t>The server inputs the following values:</t>
      <ul spacing="normal">
        <li>server_private_key: server private for the AKE protocol.</li>
        <li>server_public_key: server public for the AKE protocol.</li>
        <li>server_identity: server identity, as described in <xref target="client-material"/>.</li>
        <li>record: RegistrationUpload corresponding to the client's registration.</li>
        <li>credential_identifier: an identifier that uniquely represents the credential.</li>
        <li>oprf_seed: seed used to derive per-client OPRF keys.</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"/>. The output
<tt>export_key</tt> MUST NOT be used in any way before the protocol completes
successfully. 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 = ClientInit(password)

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

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

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

    (ke3,
    session_key,
    export_key) = ClientFinish(client_identity, password,
                              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 may have the following named fields:</t>
      <ul spacing="normal">
        <li>password, the input password; and</li>
        <li>blind, the random blinding inverter returned by <tt>Blind()</tt>; and</li>
        <li>client_ake_state, the client's AKE state if necessary.</li>
      </ul>
      <t>The server state may have the following fields:</t>
      <ul spacing="normal">
        <li>server_ake_state, the server's AKE state if necessary.</li>
      </ul>
      <t>The rest of this section describes these authenticated key exchange messages
and their parameters in more detail. <xref target="cred-retrieval"/> discusses internal
functions used for retrieving client credentials, and <xref target="ake-protocol"/> discusses
how these functions are used to execute the authenticated key exchange protocol.</t>
      <section anchor="opaque-client">
        <name>Client Authentication Functions</name>
        <artwork><![CDATA[
ClientInit

State:
- state, a ClientState structure.

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

Output:
- ke1, a KE1 message structure.

def ClientInit(password):
  request, blind = CreateCredentialRequest(password)
  state.blind = blind
  ake_1 = Start(request)
  Output KE1(request, ake_1)
]]></artwork>
        <artwork><![CDATA[
ClientFinish

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 ClientFinish(client_identity, server_identity, ke2):
  (client_private_key, server_public_key, export_key) =
    RecoverCredentials(state.password, state.blind, ke2.CredentialResponse,
                       server_identity, client_identity)
  (ke3, session_key) =
    ClientFinalize(client_identity, client_private_key, server_identity,
                    server_public_key, ke2)
  return (ke3, session_key)
]]></artwork>
      </section>
      <section anchor="opaque-server">
        <name>Server Authentication Functions</name>
        <artwork><![CDATA[
ServerInit

Input:
- server_identity, the optional encoded server identity, which is set to
  server_public_key if nil.
- 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 encoded client identity.

Output:
- ke2, a KE2 structure.

def ServerInit(server_identity, server_private_key, server_public_key,
               record, credential_identifier, oprf_seed, ke1, client_identity):
  response = CreateCredentialResponse(ke1.request, server_public_key, record,
    credential_identifier, oprf_seed)
  ake_2 = Response(server_identity, server_private_key,
    client_identity, record.client_public_key, ke1, response)
  return KE2(response, ake_2)
]]></artwork>
        <t>Since the OPRF is a two-message protocol, KE3 has no element of the OPRF. We can
therefore call the AKE's <tt>ServerFinish()</tt> directly. The <tt>ServerFinish()</tt> function
MUST take KE3 as input and MUST verify the client authentication material it contains
before the <tt>session_key</tt> value can be used. This verification is paramount in order to
ensure forward secrecy against active attackers.</t>
        <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.</t>
      </section>
      <section anchor="cred-retrieval">
        <name>Credential Retrieval</name>
        <section anchor="credential-retrieval-messages">
          <name>Credential Retrieval Messages</name>
          <artwork><![CDATA[
struct {
  uint8 blinded_message[Noe];
} CredentialRequest;
]]></artwork>
          <dl>
            <dt>data</dt>
            <dd>
              <t>A serialized OPRF group element.</t>
            </dd>
          </dl>
          <artwork><![CDATA[
struct {
  uint8 evaluated_message[Noe];
  uint8 masking_nonce[Nn];
  uint8 masked_response[Npk + Ne];
} CredentialResponse;
]]></artwork>
          <dl>
            <dt>data</dt>
            <dd>
              <t>A serialized OPRF group element.</t>
            </dd>
            <dt>masking_nonce</dt>
            <dd>
              <t>A nonce used for the confidentiality of the masked_response field.</t>
            </dd>
            <dt>masked_response</dt>
            <dd>
              <t>An encrypted form of the server's public key and the client's <tt>Envelope</tt>
structure.</t>
            </dd>
          </dl>
        </section>
        <section anchor="credential-retrieval-functions">
          <name>Credential Retrieval Functions</name>
          <section anchor="create-credential-request">
            <name>CreateCredentialRequest</name>
            <artwork><![CDATA[
CreateCredentialRequest

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

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

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>There are two scenarios to handle for the construction of a CredentialResponse
object: either the record for the client exists (corresponding to a properly
registered client), or it was never created (corresponding to a client that has
yet to register).</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 CredentialResponse:</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 = Evaluate(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 + Ne)
  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 CreateCredentialResponse function with a fake client record
argument that is configured so that:</t>
            <ul spacing="normal">
              <li>record.client_public_key is set to a randomly generated public key of length Npk</li>
              <li>record.masking_key is set to a random byte string of length Nh</li>
              <li>record.envelope is set to the byte string consisting only of zeros of length Ne</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 locate
the record in 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 credential_identifier.</t>
          </section>
          <section anchor="recover-credentials">
            <name>RecoverCredentials</name>
            <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 client's private key for the AKE protocol.
- server_public_key, the public key of the server.
- 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, params)
  randomized_pwd = Extract("", concat(oprf_output, stretched_oprf_output))

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

  return (client_private_key, server_public_key, export_key)
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="ake-protocol">
        <name>AKE 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 AKE client state <tt>client_ake_state</tt> mentioned in <xref target="online-phase"/> has the
following named fields:</t>
        <ul spacing="normal">
          <li>client_secret, an opaque byte string of length Nsk; and</li>
          <li>ke1, a value of type KE1.</li>
        </ul>
        <t>The server state <tt>server_ake_state</tt> mentioned in <xref target="online-phase"/> has the
following fields:</t>
        <ul spacing="normal">
          <li>expected_client_mac, an opaque byte string of length Nm; and</li>
          <li>session_key, an opaque byte string of length Nx.</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="ake-messages">
          <name>AKE Messages</name>
          <artwork><![CDATA[
struct {
  uint8 client_nonce[Nn];
  uint8 client_keyshare[Npk];
} AuthInit;
]]></artwork>
          <t>client_nonce : A fresh randomly generated nonce of length Nn.</t>
          <t>client_keyshare : Client ephemeral key share of fixed size Npk.</t>
          <artwork><![CDATA[
struct {
  uint8 server_nonce[Nn];
  uint8 server_keyshare[Npk];
  uint8 server_mac[Nm];
} AuthResponse;
]]></artwork>
          <t>server_nonce : A fresh randomly generated nonce of length Nn.</t>
          <t>server_keyshare : Server ephemeral key share of fixed size Npk, where Npk
depends on the corresponding prime order group.</t>
          <t>server_mac : An authentication tag computed over the handshake transcript
computed using Km2, defined below.</t>
          <artwork><![CDATA[
struct {
  uint8 client_mac[Nm];
} AuthFinish;
]]></artwork>
          <t>client_mac : An authentication tag computed over the handshake transcript
computed using Km2, defined below.</t>
        </section>
        <section anchor="key-creation">
          <name>Key Creation</name>
          <t>We assume the following functions to exist for all candidate groups in this
setting:</t>
          <ul spacing="normal">
            <li>DeriveAuthKeyPair(seed): Derive a private and public authentication key pair
deterministically from the input <tt>seed</tt>. This function is implemented as
DeriveKeyPair(seed, "OPAQUE-DeriveAuthKeyPair"), where DeriveKeyPair is
as specified in <xref section="3.2" sectionFormat="comma" target="OPRF"/>.</li>
            <li>GenerateAuthKeyPair(): Return a randomly generated private and public key
pair. This can be implemented by invoking DeriveAuthKeyPair with <tt>Nseed</tt>
random bytes as input.</li>
            <li>SerializeElement(element): A member function of the underlying group that
maps <tt>element</tt> to a unique byte array, mirrored from the definition of the
similarly-named function of the OPRF group described in
<xref section="2.1" sectionFormat="comma" target="OPRF"/>.</li>
          </ul>
        </section>
        <section anchor="key-schedule-functions">
          <name>Key Schedule Functions</name>
          <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 Label parameter is not a NULL-terminated string.</t>
            <t>OPAQUE-3DH can optionally include 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.
- ke2, a KE2 message structure.

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

def Preamble(client_identity, ke1, server_identity, ke2):
  preamble = concat("RFCXXXX",
                     I2OSP(len(context), 2), context,
                     I2OSP(len(client_identity), 2), client_identity,
                     ke1,
                     I2OSP(len(server_identity), 2), server_identity,
                     ke2.credential_response,
                     ke2.AuthResponse.server_nonce, ke2.AuthResponse.server_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>
          <artwork><![CDATA[
Start

Parameters:
- Nn, the nonce length.

State:
- state, a ClientState structure.

Input:
- credential_request, a CredentialRequest structure.

Output:
- ke1, a KE1 structure.

def Start(credential_request):
  client_nonce = random(Nn)
  (client_secret, client_keyshare) = GenerateAuthKeyPair()
  Create KE1 ke1 with (credential_request, client_nonce, client_keyshare)
  Populate state with ClientState(client_secret, ke1)
  return (ke1, client_secret)
]]></artwork>
          <artwork><![CDATA[
ClientFinalize

State:
- state, a ClientState structure.

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

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

Exceptions:
- ServerAuthenticationError, the handshake fails.

def ClientFinalize(client_identity, client_private_key, server_identity,
                   server_public_key, ke2):

  dh1 = SerializeElement(state.client_secret * ke2.server_keyshare)
  dh2 = SerializeElement(state.client_secret * server_public_key)
  dh3 = SerializeElement(client_private_key  * ke2.server_keyshare)
  ikm = concat(dh1, dh2, dh3)

  preamble = Preamble(client_identity, state.ke1, server_identity, ke2.inner_ke2)
  Km2, Km3, session_key = DeriveKeys(ikm, preamble)
  expected_server_mac = MAC(Km2, Hash(preamble))
  if !ct_equal(ke2.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>
          <artwork><![CDATA[
Response

Parameters:
- Nn, the nonce length.

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.
- client_identity, the optional encoded client identity, which is set to
  client_public_key if not specified.
- client_public_key, the client's public key.
- ke1, a KE1 message structure.

Output:
- ke2, a KE2 structure.

def Response(server_identity, server_private_key, client_identity,
             client_public_key, ke1, credential_response):
  server_nonce = random(Nn)
  (server_private_keyshare, server_keyshare) = GenerateAuthKeyPair()
  Create inner_ke2 ike2 with (ke1.credential_response, server_nonce, server_keyshare)
  preamble = Preamble(client_identity, ke1, server_identity, ike2)

  dh1 = SerializeElement(server_private_keyshare * ke1.client_keyshare)
  dh2 = SerializeElement(server_private_key * ke1.client_keyshare)
  dh3 = SerializeElement(server_private_keyshare * client_public_key)
  ikm = concat(dh1, dh2, dh3)

  Km2, Km3, session_key = DeriveKeys(ikm, preamble)
  server_mac = MAC(Km2, Hash(preamble))
  expected_client_mac = MAC(Km3, Hash(concat(preamble, server_mac))
  Populate state with ServerState(expected_client_mac, session_key)
  Create KE2 ke2 with (ike2, server_mac)
  return ke2
]]></artwork>
          <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.

Exceptions:
- ClientAuthenticationError, the handshake fails.

def ServerFinish(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>The OPRF protocol uses the "base mode" variant of <xref target="OPRF"/> and implements
the interface in <xref target="dependencies"/>. Examples include OPRF(ristretto255, SHA-512) and
OPRF(P-256, SHA-256).</li>
        <li>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.</li>
        <li>The KSF has fixed parameters, chosen by the application, and implements the
interface in <xref target="dependencies"/>. Examples include Argon2 <xref target="ARGON2"/>,
scrypt <xref target="SCRYPT"/>, and PBKDF2 <xref target="PBKDF2"/> with fixed parameter choices.</li>
        <li>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 OPRF(ristretto255, SHA-512),
then Group SHOULD be ristretto255.</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>OPRF(ristretto255, SHA-512), HKDF-SHA-512, HMAC-SHA-512, SHA-512, Scrypt(32768,8,1), internal, ristretto255</li>
        <li>OPRF(P-256, SHA-256), HKDF-SHA-256, HMAC-SHA-256, SHA-256, Scrypt(32768,8,1), internal, P-256</li>
      </ul>
      <t>Future configurations may specify different combinations of dependent algorithms,
with the following considerations:</t>
      <ol spacing="normal" type="1"><li>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.</li>
        <li>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.</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>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.</li>
        <li>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.</li>
        <li>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 an identity, applications SHOULD set these identities to nil
and rely solely on public key information.</li>
        <li>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 in order 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.</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 against 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, implementations can incorporate the client identity alongside the
password as input to the OPRF. This provides additional client-side entropy
which can supplement the entropy that should be introduced by the server during
an honest execution of the protocol. This also provides domain separation
between different clients that might otherwise share the same password.</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 in order to learn the client's password.
Implementations and deployments of OPAQUE SHOULD consider additional checks to
mitigate this type of attack: for instance, by ensuring that there is a
server-authenticated channel over which OPAQUE registration and login is run.</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 specifiation, along with conditions that lead
to each error, are as follows:</t>
        <ul spacing="normal">
          <li>EnvelopeRecoveryError: The envelope Recover function failed to produce any
authentication key material; <xref target="envelope-recovery"/>.</li>
          <li>ServerAuthenticationError: The client failed to complete the authenticated
key exchange protocol with the server; <xref target="ake-client"/>.</li>
          <li>ClientAuthenticationError: The server failed to complete the authenticated
key exchange protocol with the client; <xref target="ake-server"/>.</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 implementaton 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 stores a secret private key at the
server 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>[[RFC EDITOR: Please delete this section before publication.]]</t>
        <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>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. An upcoming
paper 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.</li>
          <li>Envelopes do not contain encrypted credentials. Instead, envelopes contain
information used to derive client private key material for the AKE. This
variant is also analyzed in the new paper referred to in the previous item.
This change improves the assumption behind the protocol by getting rid of
equivocability and random key robustness for the encryption function. The
latter property is only required for authentication and achieved by a
collision-resistant MAC. This change was made for two reasons. First, it
reduces the number of bytes stored in envelopes, which is an helpful
improvement for large applications of OPAQUE with many registered users.
Second, it removes the need for client applications to generate authentication
keys during registration. Instead, this responsibility is handled by OPAQUE,
thereby simplifying the client interface to the protocol.</li>
          <li>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.</li>
          <li>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.</li>
          <li>The protocol outputs an export key for the client in addition to shared
session key that can be used for application-specific purposes. This key
is a pseudorandom value independent of other values in the protocol and
has no influence in 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 use of OPAQUE for end-to-end encrypted backups;
see <xref target="WhatsAppE2E"/>.</li>
          <li>The protocol admits optional application-layer client and server identities.
In the absence of these identities, 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.</li>
          <li>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 as for domain separation between different
applications of the protocol. This change was made to allow different
applications to use OPAQUE without risk of cross-protocol attacks.</li>
          <li>Servers use a separate identifier for computing OPRF evaluations and
indexing into the password file 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 OPRF have different PRF inputs, the
protocol is secure. The choice of such inputs is up to the application.</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>
            <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 using 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"/>.</li>
          <li>
            <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.</li>
          <li>
            <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.</li>
          <li>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="ake-protocol"/> 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"/>.</li>
          <li>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"/>.</li>
        </ul>
      </section>
      <section anchor="security-analysis">
        <name>Security Analysis</name>
        <t>Jarecki et al. <xref target="JKX18"/> proved the security of OPAQUE
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. In turn, the
security of the OPRF protocol from <xref target="OPRF"/> is proven
in the random oracle model under the One-More Diffie-Hellman assumption <xref target="JKKX16"/>.</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>
      </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>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 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 to 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 server is expected to maintain any
client-side secrets which require a password to access, then this export key
can be used to encrypt these secrets so that they remain hidden from the
server.</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="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="oprf-key-stretching">
        <name>OPRF Key Stretching</name>
        <t>Applying a key streching 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 that balance cost and complexity. Note that in
OPAQUE, the key stretching function is executed by the client, as opposed to
the server. 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
extra information about the behavior of clients that have registered with
the server. There are two types of attacks we consider:</t>
        <t>1) An attacker tries to learn whether a given client identity is registered
with a server, and
2) An attacker tries to learn whether a given client identity has recently
completed registration, re-registered (e.g. after a password change), or
changed its identity.</t>
        <t>OPAQUE prevents these attacks during the authentication flow. The first is
prevented by requiring servers to act with unregistered client identities in a
way that is indistinguishable from its 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 both
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>Preventing the second type of attack requires the server to supply a
credential_identifier value for a given client identity, consistently between
the registration response and credential response; see <xref target="create-reg-response"/>
and <xref target="create-credential-response"/>. Note that credential_identifier can be set
to client_identity for simplicity.</t>
        <t>In the event of a server compromise that results in a re-registration of
credentials for all compromised clients, the oprf_seed value MUST be resampled,
resulting in a change in the oprf_key value for each client. Although this
change can be detected by an adversary, it is only leaked upon password rotation
after the exposure of the credential files, and equally affects all registered
clients.</t>
        <t>Finally, applications must use the same key recovery mechanism when using this
prevention throughout their lifecycle. The envelope size may vary between
mechanisms, so a switch could then be detected.</t>
        <t>OPAQUE does not prevent either 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="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 aPAKE protocol. (OPAQUE enables defense against such
offline dictionary attacks by distributing the server so that an offline attack is only
possible if all - or a minimal number of - servers are compromised <xref target="JKX18"/>.) Furthermore,
if the server does not sample this OPRF key 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. Applications should move such checks to the client. Note that
limited checks at the server are possible to implement, e.g., detecting repeated
passwords.</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>
        <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">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd">
              <organization/>
            </author>
            <author fullname="J. Schiller" initials="J." surname="Schiller">
              <organization/>
            </author>
            <author fullname="S. Crocker" initials="S." surname="Crocker">
              <organization/>
            </author>
            <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">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Nick Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="8" month="February" year="2022"/>
            <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 secret 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
   secret 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.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-09"/>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <author fullname="M. Bellare" initials="M." surname="Bellare">
              <organization/>
            </author>
            <author fullname="R. Canetti" initials="R." surname="Canetti">
              <organization/>
            </author>
            <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">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Nick Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="8" month="February" year="2022"/>
            <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 secret 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
   secret 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.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-09"/>
        </reference>
      </references>
      <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="Euroctypt 2006" 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="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="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
        </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="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="_3DH">
          <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://scontent.whatsapp.net/v/t39.8562-34/241394876_546674233234181_8907137889500301879_n.pdf/WhatsApp_Security_Encrypted_Backups_Whitepaper.pdf?ccb=1-5&amp;_nc_sid=2fbf2a&amp;_nc_ohc=Y3PFzd-3LG4AX9AdA8_&amp;_nc_ht=scontent.whatsapp.net&amp;oh=01_AVwwbFhPNWAn-u9VV4wqetjL2T9rX2pDmXwlk0aus4YrKA&amp;oe=620029BC">
          <front>
            <title>Security of End-to-End Encrypted Backups</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC2945">
          <front>
            <title>The SRP Authentication and Key Exchange System</title>
            <author fullname="T. Wu" initials="T." surname="Wu">
              <organization/>
            </author>
            <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="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <author fullname="P. Eronen" initials="P." surname="Eronen">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <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="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty">
              <organization/>
            </author>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski">
              <organization/>
            </author>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson">
              <organization/>
            </author>
            <author fullname="A. Rusch" initials="A." surname="Rusch">
              <organization/>
            </author>
            <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="ARGON2">
          <front>
            <title>Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications</title>
            <author fullname="A. Biryukov" initials="A." surname="Biryukov">
              <organization/>
            </author>
            <author fullname="D. Dinu" initials="D." surname="Dinu">
              <organization/>
            </author>
            <author fullname="D. Khovratovich" initials="D." surname="Khovratovich">
              <organization/>
            </author>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Sam Scott">
              <organization>Cornell Tech</organization>
            </author>
            <author fullname="Nick Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby">
              <organization>Stanford University</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="18" month="February" 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-14"/>
        </reference>
      </references>
    </references>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The OPAQUE protocol and its analysis is joint work of the author with Stanislaw
Jarecki and Jiayu Xu. 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, Eric Crockett, Paul Grubbs, Fredrik Kuivinen,
Payman Mohassel, Jason Resch, Greg Rubin, and Nick Sullivan.</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, provided these mechanisms adhere to the requirements
specified in <xref target="deps-keyrec"/>. 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 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 of application data encrypted
under session_key (or a key derived from it) with a quantum-safe encryption function.</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.AuthResponse.server_nonce, KE2.AuthResponse.server_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>
      </section>
      <section anchor="sigma-i-instantiation-sketch">
        <name>SIGMA-I Instantiation Sketch</name>
        <t>A 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 key shares 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 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-09 of <xref target="OPRF"/>.</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: 0001
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: 2ed630416cb2e532804133133e7ee6836c8515752e24bb44d323fef4ea
d34cde967798f2e9784f69d233b1a6da7add58b2c95a57bc213aca920c14553ed2d83
3
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: 36168448f9c5ec75a8cd571370add249e99cb8a8c43f6ef05610a
c6e354642bf
masking_nonce: 13573601f2e727c90ecc19d448cf3145a662e0065f157ba524df0d
3e56ad6236
server_private_key: 51da1f6c3ea07fa00c7cbfdc1fdc70659f1a1092402da749d
938c1a6a570f103
server_public_key: 583f7bccccbc1907ae1506bac950d08266eb3b33ba452b8df7
061a390ffd736e
server_nonce: a88904fe660061c4fac7e452066b8b0f90da7d8d4a19f1cc41fb6fa
5479b467d
client_nonce: 400ceac0fbfb16005928335518be6f930a113c6c0814521262e17ec
c3cdc9f91
server_keyshare: 5cc9fd06a5917ab66a6ef5537a65525a428f768840d81a00d82a
23fc5491b53c
client_keyshare: da25553da9ac142b36332dbd487713ae6712432fb317a6e00b2b
17525bbe6912
server_private_keyshare: eb7216a0ad73af2e84aeeeeb39a9e3549f0817e1732b
5faffc5e0f5abf269e08
client_private_keyshare: a2582d86bf4476a413caa6ee0d3daf7fb6908909036e
1423170d0072aad0d00f
blind_registration: f349de058878adaf864afedb28cf6a6b0f7083a11c34f9543
9c5cb44edb7fd09
blind_login: 146538c20e42b5182766e71c26d4e3a4d1b9c493f7c94bea0bb4f9d6
31181c08
]]></artwork>
          </section>
          <section anchor="intermediate-values">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: eabdf39b4f22d045f80477d5571bae4c40e13377bcb410c6d8
6d86eab281eb15
auth_key: ca657130e970f04883cb6e1d25414c2e6b790521d2589eedbb28f88c2a0
cd1d47a451af444604838acc7ed0eb06cd15265a8f2008f6c00a01471c30d0dce45e0
randomized_pwd: 46dac5eed750784bf22be60303312d53fd6ec61cc19bec55c136c
3629366b1916e8e6a1b09ad9e079da2aa9ce0cde3aea3f28d835b2f67c8bf6e5139e5
e3cc03
envelope: 36168448f9c5ec75a8cd571370add249e99cb8a8c43f6ef05610ac6e354
642bf72e2cdbb55ab0d0cdfcf1cfb9344d3ccbfbcb1b69f975e2e58f25749214ddb7a
11ec03ed7d3f04f05c0c822bd2a4d6cd61c7911035ce117e34f6bc4d8d27ba95
handshake_secret: 71d30b66205d8f3d35415facfa654c45c778ccb1a1522b0cc38
fe88f0eba0e47e4ffbd13cee0bdf0b4cf4b97fb50417bb799d4cfeb58471abc2302dd
264dbe9d
server_mac_key: 6ce3829a4eb1758bbbb9263da5c989b6060851fcae76d10af1a1a
17a627121cc327ac65add4a93d1f3fb289d4b741481dbcbda570a03d156a0c805e287
487db8
client_mac_key: ce946912e6fa49c11068184bdfb0c1d7cb0bb69d2d4ba15dcdc28
bba18021850d296c5c72fa68848ea4c8927d28065c4807fc8163275f0781bffccca18
72ba31
oprf_key: e4af4ba0d3e3d3340848000b77ab12e736fb1662ffbe529ec92163d37ae
26601
]]></artwork>
          </section>
          <section anchor="output-values">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: ba1a2238a29a33dea928801e0257bd644f34bcc12f3e6ed
eba3a5015b45d6e33
registration_response: 1c5078bb63f7623d65926a6ef82a4ee7d1b62225d5f8a3
59f603475654f4453b583f7bccccbc1907ae1506bac950d08266eb3b33ba452b8df70
61a390ffd736e
registration_upload: eabdf39b4f22d045f80477d5571bae4c40e13377bcb410c6
d86d86eab281eb15ae21afa59b900243876169f04c46a5833b8168cd87ce9e5a5c04b
ea74eb523bdbeab479e62632bb24f6e4a16fa3ae2132fcd2d4ffcb5cafce1cc8394a8
c3eb3436168448f9c5ec75a8cd571370add249e99cb8a8c43f6ef05610ac6e354642b
f72e2cdbb55ab0d0cdfcf1cfb9344d3ccbfbcb1b69f975e2e58f25749214ddb7a11ec
03ed7d3f04f05c0c822bd2a4d6cd61c7911035ce117e34f6bc4d8d27ba95
KE1: c021ab3bca8c7c7949f7090d2af149523c5029d6c5c45b59997f8c306ccbdf75
400ceac0fbfb16005928335518be6f930a113c6c0814521262e17ecc3cdc9f91da255
53da9ac142b36332dbd487713ae6712432fb317a6e00b2b17525bbe6912
KE2: 1aaae8c352e89557d73dd57152f10983ba4871675d5307c71fc8f8d808103707
13573601f2e727c90ecc19d448cf3145a662e0065f157ba524df0d3e56ad62366311e
350706148302b24efbafa041792c5b79e78c43aa24b44c6e81dde926692d9a9095273
212a862729bad5a9e5258e7f1bf656045dc2842d331d183cc7425c1953a5cd8dd3b4e
83638980d0a85a2c2204eb8d3879421a43450d7eed4bd203b99e16526b8933fc46a62
4a1fec3caf6a5eebe2dfe9689b847716b330098638d1a88904fe660061c4fac7e4520
66b8b0f90da7d8d4a19f1cc41fb6fa5479b467d5cc9fd06a5917ab66a6ef5537a6552
5a428f768840d81a00d82a23fc5491b53ca3e00703736229ba774fb92ba77dc2a2236
e408b99cd8b8e2b0fa2a92ac132100f807b3e44ff1c60d3939ac6b6e8719a4ddf2b37
83f4650fce842ea5c63ccc19
KE3: c5cceaabc721066f2332edcc8cb70c49b8930639f31c6f3ebd8b9e232d35462e
a00bb0bcfa0b703d8b20f06d3428ee7089c299829b737f42a32a26519e33e2bb
export_key: 421f6315d5a2dd7d17eb13c596e69a4455b99209264be00181e99dedf
f76d5a5f55e9cc1340a078f8b307c9dcd95d391193b1ebf648c98378871d087620a0b
a2
session_key: fc56461df9021851b65b29169b0666e3af085c217079db4fe4881073
d9796a2a9add0878ec647f841d2e6d8aecb4d3df8fbc13970a1647b743d29fc5cc892
dab
]]></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: 0001
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: 4f8c9a5c6576fe6cb958f149fec78f4d8a2875bb40615f6f44ecc2fe30
635396b708ddb7fc10fb73c4e3a9258cd9c3f6f761b2c227853b5def228c850fdbf1e
2
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: 39886c5188df91d7e03ab3f513b828850a017408ffdf4fe072d40
d012f55f6ac
masking_nonce: 983deeb54c9c6337fdd9e120de85343dc7887f00248f1acacc4a83
19d50e29b5
server_private_key: 7f02b3727a18c1d885605e9e09482e22555110f5d2f31a63f
7f8c17f6a985d0b
server_public_key: c0c1fba5133d9b9b5055287de8c8dea9dfbebe10d12ebdf4bd
8ed249886cc67e
server_nonce: c6d04efaee8370c45fa1dfad70201edd140cec8ed6c73b5fcd15c47
7408184fa
client_nonce: e8f5bbbaa7ad3dce15eb299eb2a5b34875ff421b1d63d7a2cfd9096
1b35150da
server_keyshare: 2c3dd46ee4b31250f28ead72fe3d8268ef89d25c9c6318189b9d
04cc729abe51
client_keyshare: 8824e44af3cdc7a29880ff532751b7ccc6a8875ac14e08964942
473de9484f7b
server_private_keyshare: 7f5fbe5a989043f533b588f3c89b21c9dc7991b89ddd
28cde4be79afdb83170f
client_private_keyshare: 9909ef87bfd10d3148a64f98e619251074345b023f19
931b1652c9934a933104
blind_registration: 45075e8ec6743c394e85e3f81ce383ddf78791d163b457fbe
c78c58c0a55050b
blind_login: 6a7637875c6c59544c262523812302dbec1fc73a01abcdbeadfe898e
54dcfe05
]]></artwork>
          </section>
          <section anchor="intermediate-values-1">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: ee597ed63b18ccc6e5b77ae703e3bd4cfd574650284b21c64e
c16926da7e2851
auth_key: 0fa176059cf53854c38c9841f8c5d5a756b297528729b4a4b5b7894eec9
7b1d9dacb29c337a48cbc276db45452adaeb77e1b4f4990b8d0ef4c03413d3af4a274
randomized_pwd: 15490043fad1f612a0cd72f7571f720f2e5bff138b6c0f9a3f8c7
feb028761ca6bb602028e4228cbc1bcd9b1a8dc3500a7701d9351864595a765ba6a4c
c1b2f3
envelope: 39886c5188df91d7e03ab3f513b828850a017408ffdf4fe072d40d012f5
5f6acef003030d52697e8bfd717c1db8c5ff7a2c0112d7484f1a567c942612c718b5f
010978c806fdaf6892c7ec16d50f80fa12e33daf798e96a71064c72942478bc6
handshake_secret: 540feab4c07eb9263b828c4c20a6138adb46541de1633da67ce
1393a03c1f5e04167a8b0336b45e8aa2a1c3d8c9452f9aed7b0d54545adfcaaa0aaca
35b0a573
server_mac_key: d8775d094511b77e17f4433d6cbc53f4b34b69db34a16c8feeffe
573f70175fb0e16f61ab8ccfddf3599f46ccaa95898b8cefc24c3e73d8a900ea4f0c6
bdbf86
client_mac_key: b7e1601a00b647a559a25a2f30eec8f1105ff51dbebcaa506d943
ec2032c0d85c07673c3784c1008493b8a794a1cd2ef8d4972e9472a665c3abee685f2
03f629
oprf_key: 671cd2624e173c4df9ff81295c41007bf64fe10dec3cf9fd90365040ba6
e290c
]]></artwork>
          </section>
          <section anchor="output-values-1">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: 3e054b6596da6f0da124baa2c095a29c3a6b48571aae699
96f0e079067ac4172
registration_response: c45804cfaa87737d2309164bf7fc0567358c9fef629afd
47a17440d7d43ee71ac0c1fba5133d9b9b5055287de8c8dea9dfbebe10d12ebdf4bd8
ed249886cc67e
registration_upload: ee597ed63b18ccc6e5b77ae703e3bd4cfd574650284b21c6
4ec16926da7e2851dffc6e3207fd7ad90fb974e8f35d17a1f60c0fc9e6cbc49375917
556413a1dac4f9c719e6f63055055276c46d5a308dd4c3f07ca3061176a7ef9200b9c
4a451239886c5188df91d7e03ab3f513b828850a017408ffdf4fe072d40d012f55f6a
cef003030d52697e8bfd717c1db8c5ff7a2c0112d7484f1a567c942612c718b5f0109
78c806fdaf6892c7ec16d50f80fa12e33daf798e96a71064c72942478bc6
KE1: 7002a52fa6c2916c49c1fff952e818e458c7f7799139b243918c97758f463a47
e8f5bbbaa7ad3dce15eb299eb2a5b34875ff421b1d63d7a2cfd90961b35150da8824e
44af3cdc7a29880ff532751b7ccc6a8875ac14e08964942473de9484f7b
KE2: 6e78c98f76160c8cb4df1d0cf3fa038a32b900a1f208901b69b7fb695c28001d
983deeb54c9c6337fdd9e120de85343dc7887f00248f1acacc4a8319d50e29b5f9f61
75f37e8a0718398038dd5159f049f6e7f96be9754907827de30738109889169846cea
a7eee3a6109334a84fd6ec3bb5d462d5b87359f1d909ca5e9b0e7b43000dba44fb4df
9f1629bbe20dd92de2972072ac4ddae968c2dadba8614afa8f0f29cd67ba8e18ced81
49290e67f772f4ff6984a1fd4f163dc2325841eb723bc6d04efaee8370c45fa1dfad7
0201edd140cec8ed6c73b5fcd15c477408184fa2c3dd46ee4b31250f28ead72fe3d82
68ef89d25c9c6318189b9d04cc729abe513ce37681b1db692d3f47e486c31c22e4390
95dc9a4155dca22a5d2e6b8a517f2f7a5d8cb0df01673030683f72a0f62bb0941350c
68d9dc7c449aaa0140bba686
KE3: 4f74844e0c86abbc9189cb03f57e807e2034bdd07f17e67233010a6cacd9ef11
0f153418cafca68e0f8f4f48234d705089f64a7b47bacd0abea3f2a574da5629
export_key: 5c54270bf510936861ea01444d70a7204a6fe1de33ca9613d41e02d30
0d1e6a90b15cabee67a0129629f6b3aac173e1483dfc43457d72fe6df6524a639f89a
1f
session_key: 391db76593cd7f7766b68de34f99b8c0253e86914dbb18177c011d3e
05d611a3a2d0ef7a2b58468c1549444f81a60afbf635d2f6f878fc63061ecc94cfb27
ba8
]]></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: 0003
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-2">
            <name>Input Values</name>
            <artwork><![CDATA[
oprf_seed: 380d78c283bf98e26334038293e47865922a3b54d3722d8e9ced1c8729
c42f5a
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: a994c5c01c1855151c467aa331d70f59d9bb63e9afa1e314672a9
c7c6e460d5d
masking_nonce: 848bdf20ed725f0fa3b58e7d8f3eab2a0aace261f61193c7f85709
e9794357fb
server_private_key: 63b448daf85853343c35ec32253326810d0d88f0936c712d3
e901b42cb792f37
server_public_key: 02217c73e50ebf9f8ea0e080a2ecbaf594ca7d5828984e8d5d
455d42ac8531e4f1
server_nonce: 84ff1f2a310fe428d9de5819bf63b3942dbe09f991ca0cf545e33a8
fa17ab9c6
client_nonce: 72721898ef81cc0a76a0b5508f2f7bb817e86f1dd05ca013190a686
02c7af25f
server_keyshare: 0212d788fc5776bd88b7aa01e72ad0d147d8c8a3d9e47d94ca79
10e29f11297b34
client_keyshare: 03a51c7c3d3a69f5217c0f8de4efa242b0cf4ba35cc67c820e57
b69e7a4f53cd69
server_private_keyshare: b3c02a66ef9a72d48cca6c1f9afc1fedea22567b0868
140b482123652ea37c7f
client_private_keyshare: 5d25f85613f5838cd7c6b1697f27bb5e8018e88ecfc5
3891529278c47239f8ff
blind_registration: 7b5d31d5e3ebdb127f92416a3cbcda76e24b2be8d08c79074
a5520292916911b
blind_login: 47401b35db40bdc28cd90b502b3390d3cfea5814c105ca7b460cdf8a
7012c76d
]]></artwork>
          </section>
          <section anchor="intermediate-values-2">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: 030068ab6e722bb6593382a86becf60ed8290650402470c21d
c90bd0ea9da0f19b
auth_key: 8813ac116d6d46df161221d53ba5ec3bd68baca857c9ee8e3eecb7fc162
08fe0
randomized_pwd: f19aa5337d0ef8c7f728787df75f9abb6a0d06c854960d0646844
c8d68dcc3f2
envelope: a994c5c01c1855151c467aa331d70f59d9bb63e9afa1e314672a9c7c6e4
60d5d6465561f86591334921a1c4402ecbfab336a9945ce398848eff0990b44f4b6a0
handshake_secret: 019dee3711ac01beb7674207a7ed2814f67658d10c52cd71d71
6b87e4204d9a0
server_mac_key: 922a759956ae32addb64e55343677c08538eeddcba9a8b4e861f2
1e9c3849d5c
client_mac_key: ba64564e701ed14b35c6c0d124f6dc98ee1a138c40b4267079363
7419654cd28
oprf_key: 7ad47c7aa69dc3700c91449472d4bd09b15543683560870c7dd21b78398
0f7bf
]]></artwork>
          </section>
          <section anchor="output-values-2">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: 0347ed9a28ccf8baae3b312837378fbd4f994bf601a2522
0bc404102bd1cd9e4a0
registration_response: 027818306df41ac75916146c9d0f06d842e83f232a61da
40b660ee5d670cf77b8202217c73e50ebf9f8ea0e080a2ecbaf594ca7d5828984e8d5
d455d42ac8531e4f1
registration_upload: 030068ab6e722bb6593382a86becf60ed8290650402470c2
1dc90bd0ea9da0f19b4344705e052a843c4cced8ce7c87478555cff1323fc64063301
9423a19455e53a994c5c01c1855151c467aa331d70f59d9bb63e9afa1e314672a9c7c
6e460d5d6465561f86591334921a1c4402ecbfab336a9945ce398848eff0990b44f4b
6a0
KE1: 0226bc3aeccce9c813eaec852599fe76eafe611467a054e738441d4a3b7922aa
ba72721898ef81cc0a76a0b5508f2f7bb817e86f1dd05ca013190a68602c7af25f03a
51c7c3d3a69f5217c0f8de4efa242b0cf4ba35cc67c820e57b69e7a4f53cd69
KE2: 02745cdd4d8336647d5de1715fff6a639b8799e3c6ad951faae59203f4bd97b7
89848bdf20ed725f0fa3b58e7d8f3eab2a0aace261f61193c7f85709e9794357fbd6b
dad9096bf4fa824a2e78e8f36209c9a7fbac3ccd0d56c2b6ea9a0cca3ec7691594eaa
bafbcb4b8b32b65dd8e9fe7e903d9639d67787a2ef7d88d06d257f791eaa59fb7a8b3
d8ec4186c6707b2942dc6ef990e8b958d79c27587f73d371a7cc884ff1f2a310fe428
d9de5819bf63b3942dbe09f991ca0cf545e33a8fa17ab9c60212d788fc5776bd88b7a
a01e72ad0d147d8c8a3d9e47d94ca7910e29f11297b344439d99f9408b8047da08d4d
6ea017e571a26a9a1d80440ed9e4793684dd463d
KE3: a453c142682a3247cea48735543911b07c7498c1c3a7908b8b60c8e1fb90adf1
export_key: feda4a04aa974c1ef9c9d047eb2909ee175851f1c0f5ba37929673f0e
46235e4
session_key: 3585c6e3365b8ad1daa5fd7c3878de2930e6d844bdc8fb13f09debce
b82fde22
]]></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: 0003
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-3">
            <name>Input Values</name>
            <artwork><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: b19c2b0ccd8ba22218b6c772e19c4174dc8f436b55b69a4fd701d69873
dacfeb
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: 3f1640a6645455ac63788ee075c245690f9669a9af5699e8b23d6
d1fa9e697ae
masking_nonce: f1029631944beed3594c283c581ac468101aee528cc6b69daac7a9
0de8837d49
server_private_key: 31ae68b478bfc59f5ef534d4e0092e8ef1bfe338aaa4b65c0
563d42fe20626a0
server_public_key: 025cbe5babe2fb2b94ee2527bcdc66fd3a62f4b7e724bdb3ef
4a41cfee527434f3
server_nonce: df174426b40de97e2fabc448b1f4ab66a1a3149df447696d2838463
8319c3819
client_nonce: a2912bab9b6a62cddf7d5e3209a2859e5947586f69259e0708bdfab
794f689ee
server_keyshare: 02ad94bd9a2bb46d8e8ea26ae480a24e2825f58560a20d583a3c
c5078849bdfb8b
client_keyshare: 038744dec9da18441e1ef78ff9b2e5d62c713e56eee7aa326a9b
e577365f919d6c
server_private_keyshare: 711c04899739c0620dc94323d026011ac6def373c257
5400d4018ae26bb2437c
client_private_keyshare: 708e76310767cbe4af18594dfcd436216c2658300d05
18d56d002be476bd06c8
blind_registration: b4526267d942b842e4426e429d05ea84aa6ab34552f0c4a3b
9efdcacbf50daec
blind_login: 12176d4f7ab74fa5fadace604308682dc1bdab92ff91bb1a5fc5bc08
4223fe44
]]></artwork>
          </section>
          <section anchor="intermediate-values-3">
            <name>Intermediate Values</name>
            <artwork><![CDATA[
client_public_key: 02bef9b16c148b03218e5f8b01a4b52d5cea4a51ddbc76743a
13ba2fa5d1631b33
auth_key: 6dd41a206a9f6a75e02e80e7bb4e696ee2ba68e01e1f96c65e1afc9556a
e1ec8
randomized_pwd: 95847555e29a90ecd2af4e26343be5c65e1c347f1d921be48ba9d
f4e61fad23d
envelope: 3f1640a6645455ac63788ee075c245690f9669a9af5699e8b23d6d1fa9e
697aebc8f31f964da8a9c11a21b359f7522ae50bc02c85362e7dbf051bdf3bf113d98
handshake_secret: 19b7cd9abb29842a0786aec00a574d29f6080cf128840c4867e
2077ba430b621
server_mac_key: 700c2b8c1797a44829e511aef4c66a49ea43aa5ef2847e4993946
798d8d7cbdf
client_mac_key: dfc3af348aa8baf3e95eb904fdfdb11cf8606b961f14dfd5d6881
7658b4d7178
oprf_key: 0a663cda294cc97edada43ff06235a23ac53bf55c439ecc664c01e44738
74e65
]]></artwork>
          </section>
          <section anchor="output-values-3">
            <name>Output Values</name>
            <artwork><![CDATA[
registration_request: 024cd26832a141c12564716b57b3101d281193c3a2cfaf4
b4d0217b98c69a6e356
registration_response: 034b85dfb783b81cfdcc2255b6ba440479439c17e5f566
690de0dff23ab08bb153025cbe5babe2fb2b94ee2527bcdc66fd3a62f4b7e724bdb3e
f4a41cfee527434f3
registration_upload: 02bef9b16c148b03218e5f8b01a4b52d5cea4a51ddbc7674
3a13ba2fa5d1631b33f8295762da035ff51f6ae4c07fac29e73b900f39a6be5a222d1
43e466282bff13f1640a6645455ac63788ee075c245690f9669a9af5699e8b23d6d1f
a9e697aebc8f31f964da8a9c11a21b359f7522ae50bc02c85362e7dbf051bdf3bf113
d98
KE1: 03ff69ee0b845955eafc817acf721fdecccc94977c4aa0841ec33bf5060375e3
a4a2912bab9b6a62cddf7d5e3209a2859e5947586f69259e0708bdfab794f689ee038
744dec9da18441e1ef78ff9b2e5d62c713e56eee7aa326a9be577365f919d6c
KE2: 026c5dfb5840f9e18b49a2553083bf600b23d73a5352a289223d2a1175d36c9f
b0f1029631944beed3594c283c581ac468101aee528cc6b69daac7a90de8837d49b76
72e17bcd95b17b4d599321921a0ff1d3783624edb14480c018bf39e7a7bab84752a79
7ced451076a5542cf5b0b8433d2b8cd5ceaf9ef7c5f9c1ac13a3e9ff6242362de7710
c5106109ea6a6889388a62a44c932e225c18d649bb44df09b0fffdf174426b40de97e
2fabc448b1f4ab66a1a3149df447696d28384638319c381902ad94bd9a2bb46d8e8ea
26ae480a24e2825f58560a20d583a3cc5078849bdfb8b3d44038b2e740b28519d83f3
8b58cfc221a4421bca2eb74efd05f5c31b34190b
KE3: 6ad96f7b8b167c3482babae788482ddd2ef417eff9ad5617ae49f6c35613b723
export_key: 7284190bd6a6e175cf38846f1374b5f81a481200f774482d89bdb93e0
3674f15
session_key: 4114f3f9ddb7d6f84fc479ab1cbf2e6470540e814b75329661d22fc5
5a8eadff
]]></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-4">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: 0001
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-4">
            <name>Input Values</name>
            <artwork><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: 28885f5b834484836667b5ffb0ecf900c07c55d70e9894af0231f52c54
dd29cccdae5fae5b60c92fa3cd7e6f042429c7c9e946f5351292fa08f4e99e395c30a
9
credential_identifier: 31323334
masking_nonce: 59d26775ae953b9552fdfbf2ab6f469f2f153f9a88aacb7ed434ae
d9fd7ac1ab
client_private_key: 11e4c3344def24f8f55f46f9b72584b36ce931e2a11299afc
6093dff0fbf470f
client_public_key: 020693a36a55d62c38bd2d5f1aaeac2a918e90e1df44a12f48
ce800f7f6e5764
server_private_key: f5002870ce2c5117d0ada53bf11fd7144f72510098b8d477f
ba67a07e5d1640b
server_public_key: 463499017daf13c3915d866656576a8920e15aaf860568d68d
4e1edbc5452802
server_nonce: 7954ebf0e81a893021ee24acc35e1a3f4b5e0366c15771133082ec2
1035ae0ef
server_keyshare: 42a889e6b6d90e31ce452e2ecf4d14ec0c5f5205981d828ae380
90fdcae8bc25
server_private_keyshare: 8d39667010ba488071c889447a547931809e3723b66e
33cf672395a8b48b980a
masking_key: 1bad1c8b6ad879e348e15bd698ee70b2c51d3e89d9c08b00889a1fa8
f3947a48dac9ad994e946f408a2c31250ee34f9d04a7d85661bab11c67048ecfb7a68
c65
KE1: 943a149cf304878367fa2dce5cb30eac23cfd1358e5cc0efdbd4361a9e7bd72d
c26fead2a8b3d5910e25fd29402530b5c7e852585f843f3b939993624b8a7c3b58106
2b0e8e90db4798adbb49581f016034e0855b6d6199aceb56a71c9bd4866
]]></artwork>
          </section>
          <section anchor="output-values-4">
            <name>Output Values</name>
            <artwork><![CDATA[
KE2: d0b9756ee8cdf900c4120b84b2fcb9c1961b4272fa7d393a33ffa273587f547a
59d26775ae953b9552fdfbf2ab6f469f2f153f9a88aacb7ed434aed9fd7ac1abd4709
ea9ca3ff1bd89374fc6132b7c027593dc7f0ce02da216dde6e90c9a75da99aea9e1e6
c8de0cdd29d54df90584fa83be96c22436b80aed30ea658c79c40cee00730b9d866c2
db24145be6911b530631f5e279ee3fb0b801c3d0c0c3c7de54c745f219fde845a5b9c
415facd45b670dea221104a2a73dab32a0cd951d20a67954ebf0e81a893021ee24acc
35e1a3f4b5e0366c15771133082ec21035ae0ef42a889e6b6d90e31ce452e2ecf4d14
ec0c5f5205981d828ae38090fdcae8bc258ce81724ca613428f82a6f9376f03904f34
dd85794caaaafb55abedfddd35e785e5f7543a8b52964b290869bdd9b786d2c412e50
72784ee403eee9acfa8a5b9e
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-fake-test-vector-2">
          <name>OPAQUE-3DH Fake Test Vector 2</name>
          <section anchor="configuration-5">
            <name>Configuration</name>
            <artwork><![CDATA[
OPRF: 0003
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: 94384ca183c8e6f639ab29b5d2a81ef4305df9a67cb33db5ba8082e4f4
bfb830
credential_identifier: 31323334
masking_nonce: 375d7dcbd562a62190cc569ccc809cff9d5aa5e176d48e9646b558
eb41ffab7c
client_private_key: 9ecb5dc678e429e1a01ad6fe5d45301484d12c2a2cf2278fa
c0a0a2cf96eef57
client_public_key: 035951b821e6e1e449933fdba30c7e2e8b6e8f42f4c7a54c80
010a339e72cb2253
server_private_key: 7154525469c4fbae6c9907f4ff26a6386c0a4077f512138e2
203f247d56cbe91
server_public_key: 02acadb2750e036bfcbdb3c5aacad0f55c832631cc8f8e26a6
bc65f7e53525ae79
server_nonce: e0d04374ad9a276620c681abfca7bdb432e63509e5ec96ed2ec5542
f6fc7db23
server_keyshare: 02ffe33c6d938b4d10afeb4ad5ba108ad228317ecab3d6a78a3b
4e2494dc7ec8fb
server_private_keyshare: 034ce43e75362936d67055acf8301fbb910e2afd8769
c4334721fc4ff6bab1d7
masking_key: 1db20e37f4539b2327d37b80c00b98a2cfea9156e5e889b4efa3556e
9f0d24ce
KE1: 0258384d63ae4bbddde6d00d41b0e7174695ff6234563e16fc284aa589c7de93
f9b8bb2700cdd47e339d95404519f2fb3da58c93d84cbb4d51de6757a31919382b026
30e46a94b7f8f66071d24794c37f605055c098afc04d637caf9b1bc714bd15c
]]></artwork>
          </section>
          <section anchor="output-values-5">
            <name>Output Values</name>
            <artwork><![CDATA[
KE2: 02d0866ee88ab8dc2eb5e39e859e55fa96dca50dc2d280e66dc747f21a14c015
f9375d7dcbd562a62190cc569ccc809cff9d5aa5e176d48e9646b558eb41ffab7c7d6
5027823b4a13e0a19c738eed6ccf3ee141697d93ffe7192a32d1cf803557cc1627fe1
1ccc933dffb662c2d8bbaa97c375287cb172d942c0f0252be71c74f367bd69bc17a7a
7d1e5e25dd1528e81a65f3b8a266c45f0dbf66486c1c65749ff06e0d04374ad9a2766
20c681abfca7bdb432e63509e5ec96ed2ec5542f6fc7db2302ffe33c6d938b4d10afe
b4ad5ba108ad228317ecab3d6a78a3b4e2494dc7ec8fb120aed0e35ab8f67a2a723fe
bf5e5f590d57c08245419972555a59b058240c46
]]></artwork>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
EGXVs8v6zhdIKqqd/hek/B8JQ/O2nboBAA==

-->

</rfc>
