<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.4.14 -->
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-opaque-07" category="info" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 2.42.0 -->
  <front>
    <title abbrev="OPAQUE">The OPAQUE Asymmetric PAKE Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-07"/>
    <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</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2021" month="October" day="25"/>
    <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" numbered="true" toc="default">
      <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 hardening 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" format="default"/> for requirements of the
OPRF and AKE protocols.) This document specifies one OPAQUE instantiation
based on 3DH <xref target="SIGNAL" format="default"/>. Other instantiations are possible, as discussed in
<xref target="alternate-akes" format="default"/>, 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.</t>
      <t>This draft complies with the requirements for PAKE protocols set forth in
<xref target="RFC8125" format="default"/>.</t>
      <section anchor="requirements-notation" numbered="true" toc="default">
        <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&nbsp;14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
      <section anchor="notation" numbered="true" toc="default">
        <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" format="default"/>. 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" format="default"/>, 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" format="default"/>.</t>
        <t>The name OPAQUE is a homonym of O-PAKE where O is for Oblivious. The name
OPAKE was taken.</t>
      </section>
    </section>
    <section anchor="dependencies" numbered="true" toc="default">
      <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" format="default"/></li>
        <li>Key Derivation Function (KDF); <xref target="deps-symmetric" format="default"/></li>
        <li>Message Authenticate Code (MAC); <xref target="deps-symmetric" format="default"/></li>
        <li>Cryptographic Hash Function; <xref target="deps-hash" format="default"/></li>
        <li>Memory-Hard Function (MHF); <xref target="deps-hash" format="default"/></li>
        <li>Key Recovery Mechanism; <xref target="deps-keyrec" format="default"/></li>
        <li>Authenticated Key Exchange (AKE) protocol; <xref target="deps-ake" format="default"/></li>
      </ul>
      <t>This section describes these protocols and primitives in more detail. Unless said
otherwise, all random nonces and key derivatio 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" numbered="true" toc="default">
        <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 uses the the OPRF defined in <xref target="I-D.irtf-cfrg-voprf" format="default"/>,
Version -08, with the following API and parameters:</t>
        <ul spacing="normal">
          <li>Blind(x): Convert input <tt>x</tt> into an element of the OPRF group, randomize it
by some scalar <tt>r</tt>, producing <tt>M</tt>, and output (<tt>r</tt>, <tt>M</tt>).</li>
          <li>Evaluate(k, M, info): Evaluate input element <tt>M</tt> using private key <tt>k</tt> and
public input (or metadata) <tt>info</tt>, yielding output element <tt>Z</tt>.</li>
          <li>Finalize(x, r, Z, info): Finalize the OPRF evaluation using input <tt>x</tt>,
random scalar <tt>r</tt>, evaluation output <tt>Z</tt>, and public input (or metadata)
<tt>info</tt>, yielding output <tt>y</tt>.</li>
          <li>DeriveKeyPair(seed): Derive a private and public key pair deterministically
from a seed.</li>
          <li>Noe: The size of a serialized OPRF group element.</li>
          <li>Nok: The size of an OPRF private key.</li>
        </ul>
        <t>The public input <tt>info</tt> is currently set to nil.</t>
        <t>Note that we only need the base mode variant (as opposed to the verifiable mode
variant) of the OPRF described in <xref target="I-D.irtf-cfrg-voprf" format="default"/>. The implementation of
DeriveKeyPair based on <xref target="I-D.irtf-cfrg-voprf" format="default"/> is below:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
DeriveKeyPair(seed)

Input:
- seed, pseudo-random byte sequence used as a seed.

Output:
- private_key, a private key.
- public_key, the associated public key.

Steps:
1. private_key = HashToScalar(seed, dst="OPAQUE-DeriveKeyPair")
2. public_key = ScalarBaseMult(private_key)
3. Output (private_key, public_key)
]]></artwork>
        <t>HashToScalar(msg, dst) is as specified in <xref section="2.1" sectionFormat="comma" target="I-D.irtf-cfrg-voprf" format="default"/>.</t>
      </section>
      <section anchor="deps-symmetric" numbered="true" toc="default">
        <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 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" numbered="true" toc="default">
        <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 Memory Hard Function (MHF) is a slow and expensive cryptographic hash function
with the following API:</t>
        <ul spacing="normal">
          <li>Harden(msg, params): Repeatedly apply a memory-hard function with parameters
<tt>params</tt> to strengthen the input <tt>msg</tt> against offline dictionary attacks.
This function also needs to satisfy collision resistance.</li>
        </ul>
      </section>
      <section anchor="deps-keyrec" numbered="true" toc="default">
        <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" format="default"/> 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" format="default"/>, they MUST use the
same mechanism throughout their lifecycle in order to avoid activity leaks due
to switching.</t>
      </section>
      <section anchor="deps-ake" numbered="true" toc="default">
        <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" format="default"/>.</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" format="default"/> for details.</t>
        <t>This specification defines one particular AKE based on 3DH;
see <xref target="ake-protocol" format="default"/>. 3DH assumes a prime-order group as described in
<xref section="2.1" sectionFormat="comma" target="I-D.irtf-cfrg-voprf" format="default"/>.</t>
      </section>
    </section>
    <section anchor="protocol-overview" numbered="true" toc="default">
      <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. For both stages, client and server agree on a configuration, which
fully specifies the cryptographic algorithm dependencies necessary to run the
protocol; see <xref target="configurations" format="default"/> for details.</t>
      <section anchor="registration" numbered="true" toc="default">
        <name>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 name="" type="" align="left" alt=""><![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" format="default"/>.</t>
      </section>
      <section anchor="online-authentication" numbered="true" toc="default">
        <name>Online Authentication</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 name="" type="" align="left" alt=""><![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" format="default"/>, and those of <tt>AuthInit</tt>,
<tt>AuthResponse</tt> and <tt>AuthFinish</tt> are specified in <xref target="ake-messages" format="default"/>.</t>
        <t>The rest of this document describes the details of these stages in detail.
<xref target="client-material" format="default"/> describes how client credential information is
generated, encoded, stored on the server on registration, and recovered on
login. <xref target="offline-phase" format="default"/> describes the first registration stage of the protocol,
and <xref target="online-phase" format="default"/> describes the second authentication stage of the protocol.
<xref target="configurations" format="default"/> describes how to instantiate OPAQUE using different
cryptographic dependencies and parameters.</t>
      </section>
    </section>
    <section anchor="client-material" numbered="true" toc="default">
      <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" format="default"/> 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" format="default"/> for
information about this identity.</li>
      </ul>
      <t>These credential values are used in the <tt>CleartextCredentials</tt> structure as follows:</t>
      <artwork name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![CDATA[
CreateCleartextCredentials(server_public_key, client_public_key,
                           server_identity, client_identity)

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

Steps:
1. if server_identity == nil
2.    server_identity = server_public_key
3. if client_identity == nil
4.    client_identity = client_public_key
5. Create CleartextCredentials cleartext_credentials
   with (server_public_key, server_identity, client_identity)
6. Output cleartext_credentials
]]></artwork>
      <section anchor="key-recovery" numbered="true" toc="default">
        <name>Key Recovery</name>
        <t>This specification defines a key recovery mechanism that uses the hardened 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" format="default"/>.</t>
        <section anchor="envelope-structure" numbered="true" toc="default">
          <name>Envelope Structure</name>
          <t>The key recovery mechanism defines its <tt>Envelope</tt> as follows:</t>
          <artwork name="" type="" align="left" alt=""><![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" numbered="true" toc="default">
          <name>Envelope Creation</name>
          <t>Clients create an <tt>Envelope</tt> at registration with the function <tt>Store</tt> defined
below.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
Store(randomized_pwd, server_public_key, server_identity, client_identity)

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, a key used by the server to encrypt the
  envelope during login.
- export_key, an additional client key.

Steps:
1. envelope_nonce = random(Nn)
2. masking_key = Expand(randomized_pwd, "MaskingKey", Nh)
3. auth_key = Expand(randomized_pwd, concat(envelope_nonce, "AuthKey"), Nh)
4. export_key = Expand(randomized_pwd, concat(envelope_nonce, "ExportKey"), Nh)
5. seed = Expand(randomized_pwd, concat(envelope_nonce, "PrivateKey"), Nseed)
6. _, client_public_key = DeriveAuthKeyPair(seed)
7. cleartext_creds = CreateCleartextCredentials(server_public_key, client_public_key, server_identity, client_identity)
8. auth_tag = MAC(auth_key, concat(envelope_nonce, cleartext_creds))
9. Create Envelope envelope with (envelope_nonce, auth_tag)
10. Output (envelope, client_public_key, masking_key, export_key)
]]></artwork>
        </section>
        <section anchor="envelope-recovery" numbered="true" toc="default">
          <name>Envelope Recovery</name>
          <t>Clients recover their <tt>Envelope</tt> during login with the <tt>Recover</tt> function
defined below.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
Recover(randomized_pwd, server_public_key, envelope,
                server_identity, client_identity)

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, when the envelope fails to be recovered

Steps:
1. auth_key = Expand(randomized_pwd, concat(envelope.nonce, "AuthKey"), Nh)
2. export_key = Expand(randomized_pwd, concat(envelope.nonce, "ExportKey", Nh)
3. seed = Expand(randomized_pwd, concat(envelope.nonce, "PrivateKey"), Nseed)
4. client_private_key, client_public_key = DeriveAuthKeyPair(seed)
5. cleartext_creds = CreateCleartextCredentials(server_public_key,
                      client_public_key, server_identity, client_identity)
6. expected_tag = MAC(auth_key,
                      concat(envelope.nonce, inner_env, cleartext_creds))
7. If !ct_equal(envelope.auth_tag, expected_tag),
     raise KeyRecoveryError
8. Output (client_private_key, export_key)
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="offline-phase" numbered="true" toc="default">
      <name>Offline Registration</name>
      <t>This section describes the registration flow, message encoding, and helper functions.
In a setup phase, the client chooses its password, and the server chooses its own pair
of private-public AKE keys (server_private_key, server_public_key) for use with the
AKE, along with a Nh-byte oprf_seed. 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). These steps can happen offline, i.e., before the registration phase.</t>
      <t>Once complete, 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" format="default"/>.</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 name="" type="" align="left" alt=""><![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" format="default"/> 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" format="default"/> 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" format="default"/>.</t>
      <section anchor="registration-messages" numbered="true" toc="default">
        <name>Registration Messages</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  uint8 data[Noe];
} RegistrationRequest;
]]></artwork>
        <dl>
          <dt>
data  </dt>
          <dd>
            <t>A serialized OPRF group element.</t>
          </dd>
        </dl>
        <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  uint8 data[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 name="" type="" align="left" alt=""><![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>A key used by the server to preserve confidentiality of the envelope during login.</t>
          </dd>
          <dt>
envelope  </dt>
          <dd>
            <t>The client's <tt>Envelope</tt> structure.</t>
          </dd>
        </dl>
      </section>
      <section anchor="registration-functions" numbered="true" toc="default">
        <name>Registration Functions</name>
        <section anchor="createregistrationrequest" numbered="true" toc="default">
          <name>CreateRegistrationRequest</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
CreateRegistrationRequest(password)

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

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

Steps:
1. (blind, M) = Blind(password)
2. Create RegistrationRequest request with M
3. Output (request, blind)
]]></artwork>
        </section>
        <section anchor="create-reg-response" numbered="true" toc="default">
          <name>CreateRegistrationResponse</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
CreateRegistrationResponse(request, server_public_key, credential_identifier,
                            oprf_seed)

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.

Steps:
1. seed = Expand(oprf_seed, concat(credential_identifier, "OprfKey"), Nseed)
2. (oprf_key, _) = DeriveKeyPair(seed)
3. Z = Evaluate(oprf_key, request.data, nil)
4. Create RegistrationResponse response with (Z, server_public_key)
5. Output response
]]></artwork>
        </section>
        <section anchor="finalize-request" numbered="true" toc="default">
          <name>FinalizeRequest</name>
          <t>To create the user record used for further authentication, the client executes
the following function.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
FinalizeRequest(password, blind, response, server_identity, client_identity)

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 encoded client identity.

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

Steps:
1. y = Finalize(password, blind, response.data, nil)
2. randomized_pwd = Extract("", concat(y, Harden(y, params)))
3. (envelope, client_public_key, masking_key, export_key) =
    Store(randomized_pwd, response.server_public_key,
                    server_identity, client_identity)
4. Create RegistrationUpload record with (client_public_key, masking_key, envelope)
5. Output (record, export_key)
]]></artwork>
          <t>See <xref target="online-phase" format="default"/> 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" numbered="true" toc="default">
        <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" format="default"/>. The <tt>server_private_key</tt>
may be unique for each client.</t>
      </section>
    </section>
    <section anchor="online-phase" numbered="true" toc="default">
      <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" format="default"/>.
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" format="default"/>.</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" format="default"/>.</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" format="default"/>. The output
<tt>export_key</tt> MUST NOT be used in any way before the protocol completes
successfully. See <xref target="alternate-key-recovery" format="default"/> 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 name="" type="" align="left" alt=""><![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 scalar returned by <tt>Blind()</tt>, of length Nok; 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" format="default"/> discusses internal
functions used for retrieving client credentials, and <xref target="ake-protocol" format="default"/> discusses
how these functions are used to execute the authenticated key exchange protocol.</t>
      <section anchor="opaque-client" numbered="true" toc="default">
        <name>Client Authentication Functions</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
ClientInit(password)

State:
- state, a ClientState structure.

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

Output:
- ke1, a KE1 message structure.

Steps:
1. request, blind = CreateCredentialRequest(password)
2. state.blind = blind
3. ake_1 = Start(request)
4. Output KE1(request, ake_1)
]]></artwork>
        <artwork name="" type="" align="left" alt=""><![CDATA[
ClientFinish(client_identity, server_identity, ke2)

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.

Steps:
1. (client_private_key, server_public_key, export_key) =
    RecoverCredentials(state.password, state.blind, ke2.CredentialResponse,
                       server_identity, client_identity)
2. (ke3, session_key) =
    ClientFinalize(client_identity, client_private_key, server_identity,
                    server_public_key, ke2)
3. Output (ke3, session_key)
]]></artwork>
      </section>
      <section anchor="opaque-server" numbered="true" toc="default">
        <name>Server Authentication Functions</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
ServerInit(server_identity, server_private_key, server_public_key,
           record, credential_identifier, oprf_seed, ke1, client_identity)

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.

Steps:
1. response = CreateCredentialResponse(ke1.request, server_public_key, record,
    credential_identifier, oprf_seed)
2. ake_2 = Response(server_identity, server_private_key,
    client_identity, record.client_public_key, ke1, response)
3. Output 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" numbered="true" toc="default">
        <name>Credential Retrieval</name>
        <section anchor="credential-retrieval-messages" numbered="true" toc="default">
          <name>Credential Retrieval Messages</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  uint8 data[Noe];
} CredentialRequest;
]]></artwork>
          <dl>
            <dt>
data  </dt>
            <dd>
              <t>A serialized OPRF group element.</t>
            </dd>
          </dl>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  uint8 data[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" numbered="true" toc="default">
          <name>Credential Retrieval Functions</name>
          <section anchor="create-credential-request" numbered="true" toc="default">
            <name>CreateCredentialRequest</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
CreateCredentialRequest(password)

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

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

Steps:
1. (blind, M) = Blind(password)
2. Create CredentialRequest request with M
3. Output (request, blind)
]]></artwork>
          </section>
          <section anchor="create-credential-response" numbered="true" toc="default">
            <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 name="" type="" align="left" alt=""><![CDATA[
CreateCredentialResponse(request, server_public_key, record,
                         credential_identifier, oprf_seed)

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.

Steps:
1. seed = Expand(oprf_seed, concat(credential_identifier, "OprfKey"), Nok)
2. (oprf_key, _) = DeriveKeyPair(seed)
3. Z = Evaluate(oprf_key, request.data, nil)
4. masking_nonce = random(Nn)
5. credential_response_pad = Expand(record.masking_key,
     concat(masking_nonce, "CredentialResponsePad"), Npk + Ne)
6. masked_response = xor(credential_response_pad,
                         concat(server_public_key, record.envelope))
7. Create CredentialResponse response with (Z, masking_nonce, masked_response)
8. Output 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" numbered="true" toc="default">
            <name>RecoverCredentials</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
RecoverCredentials(password, blind, response,
                   server_identity, client_identity)

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.

Steps:
1. y = Finalize(password, blind, response.data, nil)
2. randomized_pwd = Extract("", concat(y, Harden(y, params)))
3. masking_key = Expand(randomized_pwd, "MaskingKey", Nh)
4. credential_response_pad = Expand(masking_key,
     concat(response.masking_nonce, "CredentialResponsePad"), Npk + Ne)
5. concat(server_public_key, envelope) = xor(credential_response_pad,
                                              response.masked_response)
6. (client_private_key, export_key) =
    Recover(randomized_pwd, server_public_key, envelope,
                    server_identity, client_identity)
7. Output (client_private_key, server_public_key, export_key)
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="ake-protocol" numbered="true" toc="default">
        <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" format="default"/>.</t>
        <t>The AKE client state <tt>client_ake_state</tt> mentioned in <xref target="online-phase" format="default"/> 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" format="default"/> 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" format="default"/> and <xref target="ake-server" format="default"/> specify the inner workings of client and
server functions, respectively.</t>
        <section anchor="ake-messages" numbered="true" toc="default">
          <name>AKE Messages</name>
          <artwork name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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" numbered="true" toc="default">
          <name>Key Creation</name>
          <t>We assume the following functions to exist for all candidate groups in this
setting:</t>
          <ul spacing="normal">
            <li>RecoverPublicKey(private_key): Recover the public key related to the input
<tt>private_key</tt>.</li>
            <li>DeriveAuthKeyPair(seed): Derive a private and public authentication key pair
deterministically from the input <tt>seed</tt>.</li>
            <li>GenerateAuthKeyPair(): Return a randomly generated private and public key
pair. This can be implemented by generating a random private key <tt>sk</tt>, then
computing <tt>pk = RecoverPublicKey(sk)</tt>.</li>
          </ul>
          <t>The implementation of DeriveAuthKeyPair is as follows:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
DeriveAuthKeyPair(seed)

Input:
- seed, pseudo-random byte sequence used as a seed.

Output:
- private_key, a private key.
- public_key, the associated public key.

Steps:
1. private_key = HashToScalar(seed, dst="OPAQUE-HashToScalar")
2. public_key = ScalarBaseMult(private_key)
3. Output (private_key, public_key)
]]></artwork>
          <t>HashToScalar(msg, dst) is as specified in <xref section="2.1" sectionFormat="comma" target="I-D.irtf-cfrg-voprf" format="default"/>.</t>
        </section>
        <section anchor="key-schedule-functions" numbered="true" toc="default">
          <name>Key Schedule Functions</name>
          <section anchor="transcript-functions" numbered="true" toc="default">
            <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" format="default"/>.</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[
Expand-Label(Secret, Label, Context, Length) =
    Expand(Secret, CustomLabel, Length)
]]></artwork>
            <t>Where CustomLabel is specified as:</t>
            <artwork name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![CDATA[
Preamble(client_identity, ke1, server_identity, ke2)

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.

Steps:
1. 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)
2. Output preamble
]]></artwork>
          </section>
          <section anchor="shared-secret-derivation" numbered="true" toc="default">
            <name>Shared Secret Derivation</name>
            <t>The OPAQUE-3DH shared secret derived during the key exchange protocol is
computed using the following functions.</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[
TripleDHIKM(sk1, pk1, sk2, pk2, sk3, pk3)

Input:
- skx, scalar to be multiplied with their corresponding pkx.
- pkx, element to be multiplied with their corresponding skx.

Output:
- ikm, input key material.

Steps:
1. dh1 = SerializePublicKey(sk1 * pk1)
2. dh2 = SerializePublicKey(sk2 * pk2)
3. dh3 = SerializePublicKey(sk3 * pk3)
4. Output concat(dh1, dh2, dh3)
]]></artwork>
            <artwork name="" type="" align="left" alt=""><![CDATA[
DeriveKeys(ikm, preamble)

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.

Steps:
1. prk = Extract("", ikm)
2. handshake_secret = Derive-Secret(prk, "HandshakeSecret", Hash(preamble))
3. session_key = Derive-Secret(prk, "SessionKey", Hash(preamble))
4. Km2 = Derive-Secret(handshake_secret, "ServerMAC", "")
5. Km3 = Derive-Secret(handshake_secret, "ClientMAC", "")
6. Output (Km2, Km3, session_key)
]]></artwork>
          </section>
        </section>
        <section anchor="ake-client" numbered="true" toc="default">
          <name>3DH Client Functions</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
Start(credential_request)

Parameters:
- Nn, the nonce length.

State:
- state, a ClientState structure.

Input:
- credential_request, a CredentialRequest structure.

Output:
- ke1, a KE1 structure.

Steps:
1. client_nonce = random(Nn)
2. client_secret, client_keyshare = GenerateAuthKeyPair()
3. Create KE1 ke1 with (credential_request, client_nonce, client_keyshare)
4. Populate state with ClientState(client_secret, ke1)
6. Output (ke1, client_secret)
]]></artwork>
          <artwork name="" type="" align="left" alt=""><![CDATA[
CLientFinalize(client_identity, client_private_key, server_identity,
               server_public_key, ke2)

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:
- HandshakeError, when the handshake fails

Steps:
1. ikm = TripleDHIKM(state.client_secret, ke2.server_keyshare,
    state.client_secret, server_public_key, client_private_key, ke2.server_keyshare)
2. preamble = Preamble(client_identity, state.ke1, server_identity, ke2.inner_ke2)
3. Km2, Km3, session_key = DeriveKeys(ikm, preamble)
4. expected_server_mac = MAC(Km2, Hash(preamble))
5. If !ct_equal(ke2.server_mac, expected_server_mac),
     raise HandshakeError
6. client_mac = MAC(Km3, Hash(concat(preamble, expected_server_mac))
7. Create KE3 ke3 with client_mac
8. Output (ke3, session_key)
]]></artwork>
        </section>
        <section anchor="ake-server" numbered="true" toc="default">
          <name>3DH Server Functions</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
Response(server_identity, server_private_key, client_identity,
         client_public_key, ke1, credential_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.

Steps:
1. server_nonce = random(Nn)
2. server_secret, server_keyshare = GenerateAuthKeyPair()
3. Create inner_ke2 ike2 with (ke1.credential_response, server_nonce, server_keyshare)
4. preamble = Preamble(client_identity, ke1, server_identity, ike2)
5. ikm = TripleDHIKM(server_secret, ke1.client_keyshare,
                    server_private_key, ke1.client_keyshare,
                    server_secret, client_public_key)
6. Km2, Km3, session_key = DeriveKeys(ikm, preamble)
7. server_mac = MAC(Km2, Hash(preamble))
8. expected_client_mac = MAC(Km3, Hash(concat(preamble, server_mac))
9. Populate state with ServerState(expected_client_mac, session_key)
10. Create KE2 ke2 with (ike2, server_mac)
11. Output ke2
]]></artwork>
          <artwork name="" type="" align="left" alt=""><![CDATA[
ServerFinish(ke3)

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:
- HandshakeError, when the handshake fails

Steps:
1. if !ct_equal(ke3.client_mac, state.expected_client_mac):
2.    raise HandshakeError
3. Output state.session_key
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="configurations" numbered="true" toc="default">
      <name>Configurations</name>
      <t>An OPAQUE-3DH configuration is a tuple (OPRF, KDF, MAC, Hash, MHF, 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="I-D.irtf-cfrg-voprf" format="default"/> and implements
the interface in <xref target="dependencies" format="default"/>. 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" format="default"/>.
Examples include HKDF <xref target="RFC5869" format="default"/> for the KDF, HMAC <xref target="RFC2104" format="default"/> for the MAC,
and SHA-256 and SHA-512 for the Hash functions. If an extensible output function
such as SHAKE128 <xref target="FIPS202" format="default"/> 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 MHF has fixed parameters, chosen by the application, and implements the
interface in <xref target="dependencies" format="default"/>. Examples include Argon2 <xref target="ARGON2" format="default"/>,
scrypt <xref target="SCRYPT" format="default"/>, and PBKDF2 <xref target="PBKDF2" format="default"/> 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" format="default"/>.
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" format="default"/> 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" numbered="true" toc="default">
      <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" format="default"/>, 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" format="default"/>, 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" format="default"/>, 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" format="default"/>, 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" format="default"/>. In settings
where this attack is not a concern, servers may choose to not support this functionality.</li>
      </ul>
    </section>
    <section anchor="implementation-considerations" numbered="true" toc="default">
      <name>Implementation Considerations</name>
      <t>Implementations of OPAQUE should consider addressing the following:</t>
      <ul spacing="normal">
        <li>Clearing secrets out of memory: All private key material and intermediate values,
including the outputs of the key exchange phase, should not be retained in memory after
deallocation.</li>
        <li>Constant-time operations: 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,
to support implementations which provide mitigations against client enumeration attacks.</li>
        <li>Deserialization checks: When parsing messages that have crossed trust boundaries (e.g.
a network wire), implementations should properly handle all error conditions covered in
<xref target="I-D.irtf-cfrg-voprf" format="default"/> and abort accordingly.</li>
        <li>Additional client-side entropy: OPAQUE supports the ability to incorporate the
client identity alongside the password to be 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.</li>
        <li>Server-authenticated channels: Note that online guessing attacks
(against any Asymmetric PAKE) 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. This means that additional checks should be considered in
a production deployment of OPAQUE: for instance, ensuring that there is a
server-authenticated channel over which OPAQUE registration and login is run.</li>
      </ul>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <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="security-analysis" numbered="true" toc="default">
        <name>Security Analysis</name>
        <t>Jarecki et al. <xref target="OPAQUE" format="default"/> 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" format="default"/>
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="I-D.irtf-cfrg-voprf" format="default"/> is proven
in the random oracle model under the One-More Diffie-Hellman assumption <xref target="JKKX16" format="default"/>.</t>
        <t>OPAQUE's design builds on a line of work initiated in the seminal
paper of Ford and Kaliski <xref target="FK00" format="default"/> and is based on the HPAKE protocol
of Xavier Boyen <xref target="Boyen09" format="default"/> and the (1,1)-PPSS protocol from Jarecki
et al. <xref target="JKKX16" format="default"/>. 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" numbered="true" toc="default">
        <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" format="default"/> and SPAKE2+ <xref target="SPAKE2plus" format="default"/>. 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>sWe note that as shown in <xref target="OPAQUE" format="default"/>, these protocols, and any aPAKE
in the model from <xref target="GMR06" format="default"/>, 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" format="default"/>,
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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <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" format="default"/> and Cheon <xref target="Cheon06" format="default"/> 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="I-D.irtf-cfrg-voprf" format="default"/> 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" numbered="true" toc="default">
        <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" format="default"/>. 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-hardening" numbered="true" toc="default">
        <name>OPRF Hardening</name>
        <t>Hardening 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 hardening 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" numbered="true" toc="default">
        <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 for an unregistered client by simulating a fake
CredentialResponse as specified in <xref target="create-credential-response" format="default"/>.
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" format="default"/>
and <xref target="create-credential-response" format="default"/>. 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" numbered="true" toc="default">
        <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="OPAQUE" format="default"/>.) 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" numbered="true" toc="default">
        <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" format="default"/>. 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" numbered="true" toc="default">
      <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" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="BCP" value="14"/>
            <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>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="BCP" value="14"/>
            <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>
        </reference>
        <reference anchor="RFC4086" target="https://www.rfc-editor.org/info/rfc4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <seriesInfo name="DOI" value="10.17487/RFC4086"/>
            <seriesInfo name="RFC" value="4086"/>
            <seriesInfo name="BCP" value="106"/>
            <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>
        </reference>
        <reference anchor="I-D.irtf-cfrg-voprf" target="https://www.ietf.org/archive/id/draft-irtf-cfrg-voprf-08.txt">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups</title>
            <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-08"/>
            <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="25" month="October" year="2021"/>
            <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.
   A Partially-Oblivious PRF (POPRF) is an OPRF that allows client and
   server to provide public input to the PRF.  OPRFs and POPRFs can also
   satisfy a notion of 'verifiability'.  In this setting, clients can
   verify that the server used a specific private key during the
   execution of the protocol.  This document specifies a POPRF protocol
   with optional verifiability instantiated within standard prime-order
   groups, including elliptic curves.

              </t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC2104" target="https://www.rfc-editor.org/info/rfc2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <seriesInfo name="DOI" value="10.17487/RFC2104"/>
            <seriesInfo name="RFC" value="2104"/>
            <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>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="Boyen09">
          <front>
            <title>HPAKE: Password Authentication Secure against Cross-Site User Impersonation</title>
            <seriesInfo name="Cryptology and Network Security (CANS)" value=""/>
            <author initials="X." surname="Boyen" fullname="Xavier Boyen">
              <organization/>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="BG04">
          <front>
            <title>The static Diffie-Hellman problem</title>
            <seriesInfo name="http://eprint.iacr.org/2004/306" value=""/>
            <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>
        </reference>
        <reference anchor="Canetti01">
          <front>
            <title>Universally composable security: A new paradigm for cryptographic protocols</title>
            <seriesInfo name="IEEE Symposium on Foundations of Computer Science (FOCS)" value=""/>
            <author initials="R." surname="Canetti" fullname="Ran Canetti">
              <organization/>
            </author>
            <date year="2001"/>
          </front>
        </reference>
        <reference anchor="Cheon06">
          <front>
            <title>Security analysis of the strong Diffie-Hellman problem</title>
            <seriesInfo name="Euroctypt 2006" value=""/>
            <author initials="J.H." surname="Cheon" fullname="Jung Hee Cheon">
              <organization/>
            </author>
            <date year="2006"/>
          </front>
        </reference>
        <reference anchor="FK00">
          <front>
            <title>Server-assisted generation of a strong secret from a password</title>
            <seriesInfo name="WETICE" value=""/>
            <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>
        </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>
            <seriesInfo name="CRYPTO" value=""/>
            <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>
        </reference>
        <reference anchor="AuCPace">
          <front>
            <title>AuCPace: Efficient verifier-based PAKE protocol tailored for the IIoT</title>
            <seriesInfo name="http://eprint.iacr.org/2018/286" value=""/>
            <author initials="B." surname="Haase" fullname="Bjorn Haase">
              <organization/>
            </author>
            <author initials="B." surname="Labrique" fullname="Benoit Labrique">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
        </reference>
        <reference anchor="keyagreement">
          <front>
            <title>Recommendation for pair-wise key-establishment schemes using discrete logarithm cryptography</title>
            <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
            <seriesInfo name="National Institute of Standards and Technology" value="report"/>
            <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>
        </reference>
        <reference anchor="OPAQUE">
          <front>
            <title>OPAQUE: An Asymmetric PAKE Protocol Secure Against Pre-Computation Attacks</title>
            <seriesInfo name="Eurocrypt" value=""/>
            <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>
        </reference>
        <reference anchor="JKKX16">
          <front>
            <title>Highly-efficient and composable password-protected secret sharing (or: how to protect your bitcoin wallet online)</title>
            <seriesInfo name="IEEE European Symposium on Security and Privacy" value=""/>
            <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>
        </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>
            <seriesInfo name="CRYPTO" value=""/>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
              <organization/>
            </author>
            <date year="2005"/>
          </front>
        </reference>
        <reference anchor="SPAKE2plus">
          <front>
            <title>Security Analysis of SPAKE2+</title>
            <seriesInfo name="http://eprint.iacr.org/2020/313" value=""/>
            <author initials="V." surname="Shoup" fullname="Victor Shoup">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="SIGNAL">
          <front>
            <title>Simplifying OTR deniability</title>
            <seriesInfo name="https://signal.org/blog/simplifying-otr-deniability" value=""/>
            <author>
              <organization/>
            </author>
            <date year="2016"/>
          </front>
        </reference>
        <reference anchor="RFC2945" target="https://www.rfc-editor.org/info/rfc2945">
          <front>
            <title>The SRP Authentication and Key Exchange System</title>
            <seriesInfo name="DOI" value="10.17487/RFC2945"/>
            <seriesInfo name="RFC" value="2945"/>
            <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>
        </reference>
        <reference anchor="RFC5869" target="https://www.rfc-editor.org/info/rfc5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <seriesInfo name="DOI" value="10.17487/RFC5869"/>
            <seriesInfo name="RFC" value="5869"/>
            <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>
        </reference>
        <reference anchor="RFC8125" target="https://www.rfc-editor.org/info/rfc8125">
          <front>
            <title>Requirements for Password-Authenticated Key Agreement (PAKE) Schemes</title>
            <seriesInfo name="DOI" value="10.17487/RFC8125"/>
            <seriesInfo name="RFC" value="8125"/>
            <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>
        </reference>
        <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <seriesInfo name="DOI" value="10.17487/RFC8446"/>
            <seriesInfo name="RFC" value="8446"/>
            <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>
        </reference>
        <reference anchor="RFC8017" target="https://www.rfc-editor.org/info/rfc8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <seriesInfo name="DOI" value="10.17487/RFC8017"/>
            <seriesInfo name="RFC" value="8017"/>
            <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>
        </reference>
        <reference anchor="ARGON2" target="https://www.rfc-editor.org/info/rfc9106">
          <front>
            <title>Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications</title>
            <seriesInfo name="DOI" value="10.17487/RFC9106"/>
            <seriesInfo name="RFC" value="9106"/>
            <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>
        </reference>
        <reference anchor="SCRYPT" target="https://www.rfc-editor.org/info/rfc7914">
          <front>
            <title>The scrypt Password-Based Key Derivation Function</title>
            <seriesInfo name="DOI" value="10.17487/RFC7914"/>
            <seriesInfo name="RFC" value="7914"/>
            <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>
        </reference>
        <reference anchor="PBKDF2" target="https://www.rfc-editor.org/info/rfc2898">
          <front>
            <title>PKCS #5: Password-Based Cryptography Specification Version 2.0</title>
            <seriesInfo name="DOI" value="10.17487/RFC2898"/>
            <seriesInfo name="RFC" value="2898"/>
            <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>
        </reference>
      </references>
    </references>
    <section anchor="acknowledgments" numbered="true" toc="default">
      <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" numbered="true" toc="default">
      <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" format="default"/>. 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" format="default"/>.
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" numbered="true" toc="default">
      <name>Alternate AKE Instantiations</name>
      <t>It is possible to instantiate OPAQUE with other AKEs, such as HMQV <xref target="HMQV" format="default"/> 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" format="default"/>. 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-instantiation-sketch" numbered="true" toc="default">
        <name>HMQV Instantiation Sketch</name>
        <t>An HMQV instantiation would work similar to OPAQUE-3DH, differing primarily in the key
schedule <xref target="HMQV" format="default"/>. First, the key schedule <tt>preamble</tt> value would use a different constant prefix
-- "HMQV" instead of "3DH" -- as shown below.</t>
        <artwork name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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 name="" type="" align="left" alt=""><![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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
      <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" format="default"/> 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" format="default"/> 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" format="default"/>. <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, MHF, EnvelopeMode, Group) tuple, where the Group
matches that which is used in the OPRF. These test vectors were generated using
draft-06 of <xref target="I-D.irtf-cfrg-voprf" format="default"/>.</t>
      <section anchor="real-vectors" numbered="true" toc="default">
        <name>Real Test Vectors</name>
        <section anchor="opaque-3dh-real-test-vector-1" numbered="true" toc="default">
          <name>OPAQUE-3DH Real Test Vector 1</name>
          <section anchor="configuration" numbered="true" toc="default">
            <name>Configuration</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
OPRF: 0001
Hash: SHA512
MHF: 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" numbered="true" toc="default">
            <name>Input Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
oprf_seed: 5c4f99877d253be5817b4b03f37b6da680b0d5671d1ec5351fa61c5d82
eab28b9de4c4e170f27e433ba377c71c49aa62ad26391ee1cac17011d8a7e9406657c
8
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: 71b8f14b7a1059cdadc414c409064a22cf9e970b0ffc6f1fc6fdd
539c4676775
masking_nonce: 54f9341ca183700f6b6acf28dbfe4a86afad788805de49f2d680ab
86ff39ed7f
server_private_key: 16eb9dc74a3df2033cd738bf2cfb7a3670c569d7749f284b2
b241cb237e7d10f
server_public_key: 18d5035fd0a9c1d6412226df037125901a43f4dff660c0549d
402f672bcc0933
server_nonce: f9c5ec75a8cd571370add249e99cb8a8c43f6ef05610ac6e354642b
f4fedbf69
client_nonce: 804133133e7ee6836c8515752e24bb44d323fef4ead34cde967798f
2e9784f69
server_keyshare: 6e77d4749eb304c4d74be9457c597546bc22aed699225499910f
c913b3e90712
client_keyshare: f67926bd036c5dc4971816b9376e9f64737f361ef8269c18f69f
1ab555e96d4a
server_private_keyshare: f8e3e31543dd6fc86833296726773d51158291ab9afd
666bb55dce83474c1101
client_private_keyshare: 4230d62ea740b13e178185fc517cf2c313e6908c4cd9
fb42154870ff3490c608
blind_registration: c62937d17dc9aa213c9038f84fe8c5bf3d953356db01c4d48
acb7cae48e6a504
blind_login: b5f458822ea11c900ad776e38e29d7be361f75b4d79b55ad74923299
bf8d6503
]]></artwork>
          </section>
          <section anchor="intermediate-values" numbered="true" toc="default">
            <name>Intermediate Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
client_public_key: 60c9b59f46e93a2dc8c5dd0dd101fad1838f4c4c026691e9d1
8d3de8f2b3940d
auth_key: 72c837a116b444f86229d432ea48221327339704fd2451704766bb3d42d
10796a2be4083998a78f31f52f3d2fff6ace6b9c2fa9dae1ce64ee36cc867f6cc9e48
randomized_pwd: 024d0bc2c5e95421951227ee87d8c5488e6dc537b2bf014452edb
714bb98f0ef9590b1cca3345f2a1d0afff79967875306e07326b311662d5975b24e82
07594e
envelope: 71b8f14b7a1059cdadc414c409064a22cf9e970b0ffc6f1fc6fdd539c46
767750a343dd3f683692f4ed987ff286a4ece0813a4942e23477920608f261e1ab6f8
727f532c9fd0cde8ec492cb76efdc855da76d0b6ccbe8a4dc0ba2709d63c4517
handshake_secret: 01d81a6ba7c31a2c7c7ff4dab19db55d1f0290905645004bc2b
b8d703f00e486a34c15095df96d6524901eeac1d6c46d94a2ee390dcc5625c6b0baba
fe40e504
server_mac_key: 5ee8f006713979257342d86a1541545b59e4e628b8be4b2f01438
83cb9ce2cd9b6caded5733919739bd889b9426a03ad7c23db8b26ad13d2ad179e56dd
cfe76d
client_mac_key: 5b14da362ce9eaf3492ad315997911d9db3264f0e22e2a4cfb501
f6f336c4e5e3d448f4c1b558101563c55a31e992aab92459c67231ca68de19ab12470
4ca0f9
oprf_key: 3f76113135e6ca7e51ac5bb3e8774eb84709ad36b8907ec8f7bc3537828
71906
]]></artwork>
          </section>
          <section anchor="output-values" numbered="true" toc="default">
            <name>Output Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
registration_request: ac7a6330f91d1e5c87365630c7be58641885d59ffe4d3f8
a49c094271993331d
registration_response: 5c7d3c70cf7478ead859bb879b37cce78baef3b9d81e04
f4c790ce25f2830e2e18d5035fd0a9c1d6412226df037125901a43f4dff660c0549d4
02f672bcc0933
registration_upload: 60c9b59f46e93a2dc8c5dd0dd101fad1838f4c4c026691e9
d18d3de8f2b3940d7981498360f8f276df1dfb852a93ec4f4a0189dec5a96363296a6
93fc8a51fb052ae8318dac48be7e3c3cd290f7b8c12b807617b7f9399417deed00158
281ac771b8f14b7a1059cdadc414c409064a22cf9e970b0ffc6f1fc6fdd539c467677
50a343dd3f683692f4ed987ff286a4ece0813a4942e23477920608f261e1ab6f8727f
532c9fd0cde8ec492cb76efdc855da76d0b6ccbe8a4dc0ba2709d63c4517
KE1: e4e7ce5bf96ddb2924faf816774b26a0ec7a6dd9d3a5bced1f4a3675c3cfd14c
804133133e7ee6836c8515752e24bb44d323fef4ead34cde967798f2e9784f69f6792
6bd036c5dc4971816b9376e9f64737f361ef8269c18f69f1ab555e96d4a
KE2: 1af11be29a90322dc16462d0861b1eb617611fe2f05e5e9860c164592d4f7f62
54f9341ca183700f6b6acf28dbfe4a86afad788805de49f2d680ab86ff39ed7f76011
9ed2f12f6ec4983f2c598068057af146fd09133c75b229145b7580d53cac4ba581155
2e6786837a3e03d9f7971df0dad4a04fd6a6d4164101c91137a87f4afde7dae72daf2
620082f46413bbb3071767d549833bcc523acc645b571a66318b0b1f8bf4b23de3542
8373aa1d3a45c1e89eff88f03f9446e5dfc23b6f8394f9c5ec75a8cd571370add249e
99cb8a8c43f6ef05610ac6e354642bf4fedbf696e77d4749eb304c4d74be9457c5975
46bc22aed699225499910fc913b3e907120638f222a1a08460f4e40d0686830d3d608
ce89789489161438bf6809dbbce3a6ddb0ce8702576843b58465d6cedd4e965f3f81b
92992ecec0e2137b66eff0b4
KE3: 1c0c743ff88f1a4ff07350eef61e899ae25d7fb23d555926b218bac4c1963071
5038c56cca247630be8a8e66f3ff18b89c1bc97e1e2192fd7f14f2f60ed084a3
export_key: 8408f92d282c7f4b0f5462e5206bd92937a4d53b0dcdef90afffd015c
5dee44dc4dc5ad35d1681c97e2b66de09203ac359a69f1d45f8c97dbc907589177ccc
24
session_key: 05d03f4143e5866844f7ae921d3b48f3d611e930a6c4be0993a98290
085110c5a27a2e5f92aeed861b90de068a51a952aa75bf97589be7c7104a4c30cc357
506
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-real-test-vector-2" numbered="true" toc="default">
          <name>OPAQUE-3DH Real Test Vector 2</name>
          <section anchor="configuration-1" numbered="true" toc="default">
            <name>Configuration</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
OPRF: 0001
Hash: SHA512
MHF: 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" numbered="true" toc="default">
            <name>Input Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: db5c1c16e264b8933d5da56439e7cfed23ab7287b474fe3cdcd58df089
a365a426ea849258d9f4bc13573601f2e727c90ecc19d448cf3145a662e0065f157ba
5
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: d0c7b0f0047682bd87a87e0c3553b9bcdce7e1ae3348570df20bf
2747829b2d2
masking_nonce: 30635396b708ddb7fc10fb73c4e3a9258cd9c3f6f761b2c227853b
5def228c85
server_private_key: eeb2fcc794f98501b16139771720a0713a2750b9e528adfd3
662ad56a7e19b04
server_public_key: 8aa90cb321a38759fc253c444f317782962ca18d33101eab2c
8cda04405a181f
server_nonce: 3fa57f7ef652185f89114109f5a61cc8c9216fdd7398246bb7a0c20
e2fbca2d8
client_nonce: a6bcd29b5aecc3507fc1f8f7631af3d2f5105155222e48099e5e608
5d8c1187a
server_keyshare: ae070cdffe5bb4b1c373e71be8e7d8f356ee5de37881533f1039
7bcd84d35445
client_keyshare: 642e7eecf19b804a62817486663d6c6c239396f709b663a4350c
da67d025687a
server_private_keyshare: 0974010a8528b813f5b33ae0d791df88516c8839c152
b030697637878b2d8b0a
client_private_keyshare: 03b52f066898929f4aca48014b2b97365205ce691ee3
444b0a7cecec3c7efb01
blind_registration: a66ffb41ccf1194a8d7dda900f8b6b0652e4c7fac4610066f
e0489a804d3bb05
blind_login: e6f161ac189e6873a19a54efca4baa0719e801e336d929d35ca28b5b
4f60560e
]]></artwork>
          </section>
          <section anchor="intermediate-values-1" numbered="true" toc="default">
            <name>Intermediate Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
client_public_key: 3036af4744effe59eb7ee5db0ebcb653bd4a1c7ad0c56c78af
1288f1e8538d1c
auth_key: 8820ff275662bf91d4ebcca74c9b90913eb3ee8151047926ad754da823e
98800db56a79c68b44d76ad906d26ed8b9e25d8ea862cfc6c2f0da86c623f6a24961a
randomized_pwd: 16decdbba6912903b7ae38de7040a79ebc59c9fbbac04add8a710
0ff8aedbb9530c4e664bd08b2689a607e99923e80563a8379ddfdb37801718ed043fb
7bca07
envelope: d0c7b0f0047682bd87a87e0c3553b9bcdce7e1ae3348570df20bf274782
9b2d24117867ef8aa569ed6fa8ad1b3749b0df472d431ce92da7775e44623d6c36f7e
9396d16ac58060704e9d42b37f09642ed7ee49008b4b81dc65d282ddcec0ab97
handshake_secret: eef528fc4e46c387ef2bd68c06eb135ea18d743bcb632233594
b213eb4eefaa4010b0f00785a204c77456f9007d8f7645fdc0c6795f486150a53fe17
e6608179
server_mac_key: ff6eeffbe0e88a966bdb39fa4fc933a488c0b802f913a7a6950d1
c2eda0fc6acce6fdf7b060aa0be02efddb5a127e4dd893d3666e9b54d6fd6c85f52c9
13138e
client_mac_key: 4babec778469dfed06cd89c6673b8511f337e27ce565a2fd68cb6
2a04df035fabc2097ba33018a4cd858dc399a0563950d7ce8ffe26c223328023e4c70
a16c8e
oprf_key: 531b0c7b0a3f90060c28d3d96ef5fecf56e25b8e4bf71c14bc770804c3f
b4507
]]></artwork>
          </section>
          <section anchor="output-values-1" numbered="true" toc="default">
            <name>Output Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
registration_request: d81b76a8a78b8b0758f7ceffaa5c3cb4ac76c0517759ad8
077ed87857e585f79
registration_response: a48835aa277db6d7d501addbd431100a548867e3f1ee6f
d6ae4aacd817a66e4c8aa90cb321a38759fc253c444f317782962ca18d33101eab2c8
cda04405a181f
registration_upload: 3036af4744effe59eb7ee5db0ebcb653bd4a1c7ad0c56c78
af1288f1e8538d1cedbc931daab2331b192808768f149499a04c6dffa4eae66a6e0d3
399547c8b9e9a743a3cd20f08ce07adf84b27c9ca879d730bcc41823cbd60411fbde6
c7faf2d0c7b0f0047682bd87a87e0c3553b9bcdce7e1ae3348570df20bf2747829b2d
24117867ef8aa569ed6fa8ad1b3749b0df472d431ce92da7775e44623d6c36f7e9396
d16ac58060704e9d42b37f09642ed7ee49008b4b81dc65d282ddcec0ab97
KE1: 8a32b2985d824b0e42b7d3c5091774acd64386f8a762678422f0b5cbabeda12b
a6bcd29b5aecc3507fc1f8f7631af3d2f5105155222e48099e5e6085d8c1187a642e7
eecf19b804a62817486663d6c6c239396f709b663a4350cda67d025687a
KE2: da642966461f20090d1e8d6b1f63ea70dc94fc6e0ea0bad46d011e906cc03c03
30635396b708ddb7fc10fb73c4e3a9258cd9c3f6f761b2c227853b5def228c8594543
768891810f779604eb9e07dcd37635def358e2f4531f464a4e0b3726c150d7872785c
9b6a22f00fe3527d9e938d4b503047484723585ee390925ab9d97e30f0860caef1243
0459d8ca24e5ff1a2029c363ed00f2f3cd09ead304f217290d8915183c2667959d420
175bfca3bbec3d603844ca0d5b5892888f0de19dc3b83fa57f7ef652185f89114109f
5a61cc8c9216fdd7398246bb7a0c20e2fbca2d8ae070cdffe5bb4b1c373e71be8e7d8
f356ee5de37881533f10397bcd84d354454f08b6c37449cf70cac0babb85d5302dc59
a0ae16b2e54865642b8bb985f48444d49ad89a6a0707dd46c2d53b8b73dff46ac7176
a6167f39818f605e3c39d22c
KE3: b9487ca4b1308ce593d765739992e19c10d63c47f4f2d3eb4bfd0ffa101b6959
114b4f6051305652e0f48ad219a696f3f12fad685f8d6e371dddc10fda2ec87e
export_key: 258d525e93a07c17dd9e41afc4fbfe316152afad02c54a6d3d201fd77
487903143ca2ef27718a1e48b2ade5dc614b027b8a46fd334b701df5d385aaef2b1bd
16
session_key: 021c0c3f15940f3e898f2925949aa8bc262248fae7b9ed7d33a2900e
866548ed24760c2244a2c14bfc196a00ffd66ebf54839850b101bc5e617c37ccad45a
68a
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-real-test-vector-3" numbered="true" toc="default">
          <name>OPAQUE-3DH Real Test Vector 3</name>
          <section anchor="configuration-2" numbered="true" toc="default">
            <name>Configuration</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
OPRF: 0003
Hash: SHA256
MHF: 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" numbered="true" toc="default">
            <name>Input Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
oprf_seed: 77bfc065218c9a5593c952161b93193f025b3474102519e6984fa64831
0dd1bf
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: 2527e48c983deeb54c9c6337fdd9e120de85343dc7887f00248f1
acacc4a8319
masking_nonce: cb792f3657240ce5296dd5633e7333531009c11ee6ab46b6111f15
6d96a160b2
server_private_key: 87ef09986545b295e8f5bbbaa7ad3dce15eb299eb2a5b3487
5ff421b1d63d7a3
server_public_key: 025b95a6add1f2f3d038811b5ad3494bed73b1e2500d8dadec
592d88406e25c2f2
server_nonce: 8018e88ecfc53891529278c47239f8fe6f1be88972721898ef81cc0
a76a0b550
client_nonce: 967fcded96ed46986e60fcbdf985232639f537377ca3fcf07ad4899
56b2e9019
server_keyshare: 0242bc29993976185dacf6be815cbfa923aac80fad8b7f020c9d
4f18e0b6867a17
client_keyshare: 03358b4eae039953116889466bfddeb40168e39ed83809fd5f0d
5f2de9c5234398
server_private_keyshare: b1c0063e442238bdd89cd62b4c3ad31f016b68085d25
f85613f5838cd7c6b16a
client_private_keyshare: 10256ab078bc1edbaf79bee4cd28dd9db89179dcc921
9bc8f388b533f5439099
blind_registration: d50e29b581d716c3c05c4a0d6110b510cb5c9959bee817fde
b1eabd7ccd74fee
blind_login: 503d8495c6d04efaee8370c45fa1dfad70201edd140cec8ed6c73b5f
cd15c478
]]></artwork>
          </section>
          <section anchor="intermediate-values-2" numbered="true" toc="default">
            <name>Intermediate Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
client_public_key: 030f9b896400f6efd57c69a41b05ffedc456f041cb54a2ab56
8f5595c586070708
auth_key: 4e01ca008eb4f84b8cee1b84b3abfaeb4f2c7fb41d2c8ad0f4fe89d74e6
f0fc5
randomized_pwd: c741d0a042e653ee4ccf24648aee4e3b4c500cc28feb3a72eea0f
24f69006693
envelope: 2527e48c983deeb54c9c6337fdd9e120de85343dc7887f00248f1acacc4
a83190f798f947d61d060cb102e5eeb9bd698bec5d1e1b6788860ec7c2d2e590121b0
handshake_secret: 78bedd3ee950e1795ddeca4e0d4f4267a971ace52e6f876d9b2
c8a349ec2be2a
server_mac_key: c8e62b9aee6ae6e2199db70f16631a302e9269f27d5f6ef954572
f8ca05f8d01
client_mac_key: 31e3581fcfbb7d6b10b5cf78399fb844ab7afe42cf94f8b72178a
1618711bb25
oprf_key: d153d662a1e7dd4383837aa7125685d2be6f8041472ecbfd610e46952a6
a24f1
]]></artwork>
          </section>
          <section anchor="output-values-2" numbered="true" toc="default">
            <name>Output Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
registration_request: 037aa042e317344246ebb94c38fe9989e01f7265413ade1
f7ffaa706a81f58cf19
registration_response: 03c0b3e621cadf1a56aa48305e3101efedb6248157708c
7ba70af396fa62d29bf7025b95a6add1f2f3d038811b5ad3494bed73b1e2500d8dade
c592d88406e25c2f2
registration_upload: 030f9b896400f6efd57c69a41b05ffedc456f041cb54a2ab
568f5595c5860707085e76cb3c849637cfd386d9cc762050a476a58da7c24b8a39084
4689d8d6482bd2527e48c983deeb54c9c6337fdd9e120de85343dc7887f00248f1aca
cc4a83190f798f947d61d060cb102e5eeb9bd698bec5d1e1b6788860ec7c2d2e59012
1b0
KE1: 0320fee3e9c08dfd30d00ce524cee6595d9bd7387629efa0cb9eba1ba82ec465
13967fcded96ed46986e60fcbdf985232639f537377ca3fcf07ad489956b2e9019033
58b4eae039953116889466bfddeb40168e39ed83809fd5f0d5f2de9c5234398
KE2: 03f629c1a3a5a3dc83af63c52d3bd58bbd78d5054caee7731381e967a7c381fa
20cb792f3657240ce5296dd5633e7333531009c11ee6ab46b6111f156d96a160b22c1
7f819537c821604229b8c07798c56f14b5104729a1336f153510f58ea921758f8a486
13ec4ee3e5675dc8be14776c0bb6458bf0d3f76dd24af8b43b49c8fbfcb5229c0bbe3
a37c440bdca76ce404b215ceb8842e95e81138416e161ea02c2648018e88ecfc53891
529278c47239f8fe6f1be88972721898ef81cc0a76a0b5500242bc29993976185dacf
6be815cbfa923aac80fad8b7f020c9d4f18e0b6867a1764573de6cf3b1b7737e7e56a
181fe0ec8754940adce33c4712bd35e7e9e08e7c
KE3: d9108b70e4ff4955911162ed1cec6df65c880aad120bbf10fd7f32eea71b1a04
export_key: 086cd26a64f469f2d22ab0b5f0c524b10321c4019018b004d0f8383c0
24059be
session_key: 36d1125dbf5ea45568e586645841efb6c5f53d357cdffb79edf1bb8d
b0b843a9
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-real-test-vector-4" numbered="true" toc="default">
          <name>OPAQUE-3DH Real Test Vector 4</name>
          <section anchor="configuration-3" numbered="true" toc="default">
            <name>Configuration</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
OPRF: 0003
Hash: SHA256
MHF: 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" numbered="true" toc="default">
            <name>Input Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: 482123652ea37c7e4a0f9f1984ff1f2a310fe428d9de5819bf63b3942d
be09f9
credential_identifier: 31323334
password: 436f7272656374486f72736542617474657279537461706c65
envelope_nonce: 75c245690f9669a9af5699e8b23d6d1fa9e697aeb4526267d942b
842e4426e42
masking_nonce: 5947586f69259e0708bdfab794f689eec14c7deb7edde68c816451
56cf278f21
server_private_key: c728ebf47b1c65594d77dab871872dba848bdf20ed725f0fa
3b58e7d8f3eab2b
server_public_key: 029a2c6097fbbcf3457fe3ff7d4ef8e89dab585a67dfed0905
c9f104d909138bae
server_nonce: 581ac468101aee528cc6b69daac7a90de8837d49708e76310767cbe
4af18594d
client_nonce: 46498f95ec7986f0602019b3fbb646db87a2fdbc12176d4f7ab74fa
5fadace60
server_keyshare: 022aa8746ab4329d591296652d44f6dfb04470103311bacd7ad5
1060ef5abac41b
client_keyshare: 02a9f857ad3eabe09047049e8b8cee72feea2acb7fc487777c0b
22d3add6a0e0c0
server_private_keyshare: 48a5baa24274d5acc5e007a44f2147549ac8dd675564
2638f1029631944beed4
client_private_keyshare: 161e3aaa50f50e33344022969d17d9cf4c88b7a9eec4
c36bf64de079abb6dc7b
blind_registration: 9280e203ef27d9ef0d1d189bb3c02a66ef9a72d48cca6c1f9
afc1fedea22567c
blind_login: 4308682dc1bdab92ff91bb1a5fc5bc084223fe4369beddca3f1640a6
645455ad
]]></artwork>
          </section>
          <section anchor="intermediate-values-3" numbered="true" toc="default">
            <name>Intermediate Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
client_public_key: 03ce71710d0d366e44e4a7e92cb111fc41353d4244cac1ce4d
8a622acaab9effc6
auth_key: b894fa35f63413029fcc70e80a0d1b59d1c90c3c255bfb11cf7b58fb136
d2aee
randomized_pwd: 0588794becaf8f5fee7921cb467e4ce8b3c048e7b42d815ed306d
ef278c231d3
envelope: 75c245690f9669a9af5699e8b23d6d1fa9e697aeb4526267d942b842e44
26e42cb65c94629db9811649cd4f3ff92e5d2c67f7486203ea5e471f2655f363f9f19
handshake_secret: 8a2547abef351fc1f94fb19a886c2e5ca16aba3b2bfe0b4a8cc
086dd47b62c08
server_mac_key: fa7c99e15ca1036738b9b48799515be78e471a2d06c3c3920d6a3
703d11c0360
client_mac_key: d480fde6de5e91a08179d9780bf6db0d1b959ae2fa394c09acdc6
07b993410c2
oprf_key: f14e1fc34ba1218bfd3f7373f036889bf4f35a8fbc9e8c9c07ccf2d2388
79d9c
]]></artwork>
          </section>
          <section anchor="output-values-3" numbered="true" toc="default">
            <name>Output Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
registration_request: 02baa002c856f4b0d49542dcb1391f240f836178702f835
819fd221bcf9b6e9eec
registration_response: 03864f4590c09b4c4155f0cbb731c5aab554ab1bc930c3
28e7a58bd6227933d54f029a2c6097fbbcf3457fe3ff7d4ef8e89dab585a67dfed090
5c9f104d909138bae
registration_upload: 03ce71710d0d366e44e4a7e92cb111fc41353d4244cac1ce
4d8a622acaab9effc66c5d2844e32ed930c56080fa523c15ec6d85f7db1bbd02c4692
14b31e27f6c5775c245690f9669a9af5699e8b23d6d1fa9e697aeb4526267d942b842
e4426e42cb65c94629db9811649cd4f3ff92e5d2c67f7486203ea5e471f2655f363f9
f19
KE1: 038469dadcb23317fa577317079c82bad1e20be41c783cd0ecad6bef3de1b16b
1446498f95ec7986f0602019b3fbb646db87a2fdbc12176d4f7ab74fa5fadace6002a
9f857ad3eabe09047049e8b8cee72feea2acb7fc487777c0b22d3add6a0e0c0
KE2: 036297ebd0b53dabaae6377cb1c3ba1bdd942a67a5ce019b363f26cd11ae3707
ac5947586f69259e0708bdfab794f689eec14c7deb7edde68c81645156cf278f21308
4ce22d007db399a17af864b5ea826f4086f3d477ce236cacf7867de174692940b103b
367ccb8b5aee6ef352079bf95c5961442cf400432de4d904815d1a8a20f64f3e8447b
82c27f4c9b798769db0fb5ab8d29ea0ee54c1e371105388a7ae7c581ac468101aee52
8cc6b69daac7a90de8837d49708e76310767cbe4af18594d022aa8746ab4329d59129
6652d44f6dfb04470103311bacd7ad51060ef5abac41bfa6b8e732462d3de6bdb3ef3
edcf4595b478a6704d578fde4eaf922e1c1e8504
KE3: cd11b70f1ed59d101ec20a73745d3d654c3772236ed2c365a730ef8ee51da6d2
export_key: 8e1eb57bcde2d58d805b16fa045811679c68b0ec2817b9ac61786786a
9032837
session_key: b1f3da97388d6171719c3e2281e88da75b68d6945189f460db841cc6
92f7e164
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="fake-vectors" numbered="true" toc="default">
        <name>Fake Test Vectors</name>
        <section anchor="opaque-3dh-fake-test-vector-1" numbered="true" toc="default">
          <name>OPAQUE-3DH Fake Test Vector 1</name>
          <section anchor="configuration-4" numbered="true" toc="default">
            <name>Configuration</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
OPRF: 0001
Hash: SHA512
MHF: 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" numbered="true" toc="default">
            <name>Input Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: 98ee70b2c51d3e89d9c08b00889a1fa8f3947a48dac9ad994e946f408a
2c31250ee34f9d04a7d85661bab11c67048ecfb7a68c657a3df87cff3d09c6af9912a
1
credential_identifier: 31323334
masking_nonce: 7cb33db5ba8082e4f4bfb830e8e3f525b0ddcb70469b34224758d7
25ce53ac76
client_private_key: 21c97ffc56be5d93f86441023b7c8a4b629399933b3f845f5
852e8c716a60408
client_public_key: 5cc46fdc0337a684e126f8663deacc67872a7daffc75312a1d
6377783935f932
server_private_key: 030c7634ae24b9c6d4e2c07176719e7a246850b8e019f1c71
a23af6bdb847b0b
server_public_key: 1ac449e9cdd633788069cca1aaea36ea359d7c2d493b254e5f
fe8d64212dcc59
server_nonce: cae1f4fee4ee4ba509fda550ea0421a85762305b1db20e37f4539b2
327d37b80
server_keyshare: 5e5c0ac2904c7d9bf38f99e0050594e484b4d8ded8038ef6e0c1
41a985fa6b35
server_private_keyshare: a4abffe3bef8082b78323ea4507fbb0ce8105ca62b38
1919a35767deaa699709
masking_key: 077adba76f768fd0979f8dc006ca297e7954ebf0e81a893021ee24ac
c35e1a3f4b5e0366c15771133082ec21035ae0ef0d8bcd0e59d26775ae953b9552fdf
bf2
KE1: 88303c5318f93d39bb8afde6df62593869ba4eec265b980e3843c013401e6c5a
8837b6c0709160251cbebe0d55e4423554c45da7a8952367cf336eb623379e80dae2f
1e0cd79b733131d499fb9e77efe0f235d73c1f920bdc5816259ad3a7429
]]></artwork>
          </section>
          <section anchor="output-values-4" numbered="true" toc="default">
            <name>Output Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
KE2: 8a003351892efcf8615128a241e2bf091433fab5a080d7512b156f53e8602a20
7cb33db5ba8082e4f4bfb830e8e3f525b0ddcb70469b34224758d725ce53ac76094c0
aa800d9a0884392e4efbc0479e3cb84a38c9ead879f1ff755ad762c06812b9858f82c
9722acc61b8eb1d156bc994839bf9ed8a760615258d23e0f94fa2cffadc655ed0d6ff
6914066427366019d4e6989b65d13e38e8edc5ae6f82aa1b6a46bfe6ca0256c64d0cf
db50a3eb7676e1d212e155e152e3bbc9d1fae3c679aacae1f4fee4ee4ba509fda550e
a0421a85762305b1db20e37f4539b2327d37b805e5c0ac2904c7d9bf38f99e0050594
e484b4d8ded8038ef6e0c141a985fa6b35ad4627117ba6a8cfe2a7c9d100800a62c84
aacc83ed786d722921ee7037abf71b4af7381cdc3d40c4d9e4fc9f6dc2bb2fc15c8e3
aa9eca8a83332841dda4524f
]]></artwork>
          </section>
        </section>
        <section anchor="opaque-3dh-fake-test-vector-2" numbered="true" toc="default">
          <name>OPAQUE-3DH Fake Test Vector 2</name>
          <section anchor="configuration-5" numbered="true" toc="default">
            <name>Configuration</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
OPRF: 0003
Hash: SHA256
MHF: 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" numbered="true" toc="default">
            <name>Input Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
client_identity: 616c696365
server_identity: 626f62
oprf_seed: f7664fae89be455ee3350b04a85eab390b2dc63256fbd311d8de944b45
b859e6
credential_identifier: 31323334
masking_nonce: 21cd364318a92b2afbfccea5d80d337f07defe40d92673a52f3844
058f5d949a
client_private_key: 41ffab7c86e2b0916361fb6a69f9a097e3ef2f83f8fd5f95c
c79432eabf3e020
client_public_key: 0251bc2a7e0cb7c043eec5ee7d1b769b69f85b0fa19d1ae907
5416e93fa01689de
server_private_key: 61764783412278e6ce3c6c66f1995a2a30b5824be6a6d31ca
d35a578ec3d9353
server_public_key: 03727dd31712275905b1a3cca3bbb33bc71034a1d0c3801be0
20541933dd497f18
server_nonce: 2b772c1eb569cc2b57741bf3be630e377c8245b11d0b6ad1fe1d606
490c27208
server_keyshare: 02a59205c836a2ab86e19dbd9a417818052179e9a5c99221e2d1
d8a780dfe4734d
server_private_keyshare: e8c25741b201c2ba00abe390e5a3933a75efdb71b50e
1e0087cc7235f6f9448a
masking_key: 5bb4d884375d7dcbd562a62190cc569ccc809cff9d5aa5e176d48e96
46b558eb
KE1: 0320dd7cff999858fb63be5d11db9c3fafbacbedb775303324d8859bfb31f6dc
dba91c9485d74c9010185f462ce1eec52f588a8e392f36915849b6bfcb6bd5b904037
6a35db8f7e582569dba2e573c4af1462f91c59a9bdee253ed13f60108746252
]]></artwork>
          </section>
          <section anchor="output-values-5" numbered="true" toc="default">
            <name>Output Values</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
KE2: 03cac8c1654bba83a122227e503e5e5d1a094def98d6835be289421cdc08d549
a121cd364318a92b2afbfccea5d80d337f07defe40d92673a52f3844058f5d949a604
39294e7567fc29643e0d5c8799d0dffbbfc8609558b982012fa90aef2ce52b1ffdd8f
96bda49f5306ae346cd745812d3a953ff94712e4ed0acc67c99b432860e337fe3234b
ba88415ac55368b938106cca4049b5c13496fe167d3a092bd990e2b772c1eb569cc2b
57741bf3be630e377c8245b11d0b6ad1fe1d606490c2720802a59205c836a2ab86e19
dbd9a417818052179e9a5c99221e2d1d8a780dfe4734d04a0d4911decc97ece7f24af
58f767090bf16677af9468a4026efbab99877399
]]></artwork>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAA0d2EAA9y9634byXUv+r2fosP5YDIBYKAbVzqTbI6kGckaSYyosR37
JMO+VJMdgmgEDUiitZVnOc9ynuz811pV1VWNBklp7B1ny/4NSaC7LqvW/Vb9
fj/YltulOg3fXavwzfnZv/z0LDyr725v1XZTZuH52ctn4fmm2lZZtQySNN2o
96f6uSCvslVyi3fzTVJs++VmW/SzYnPVr9bJf+5UfzgL8mSrToMM/72qNnen
YbkqqiAo15vTcLvZ1dtoOFwMo+BG3X2oNvlp+GK1VZuV2vaf0pBBUG+TVf5z
sqxWmOZO1cG6PA3/hNX0wrrabDeqqPHb3S398m9BkOy219XmNAj7QYh/5ao+
DZ8Owu+q3SbfqD/zh7Lkp8mqVEv/G3WblEvs5n+ld1v8Ptgob6Dng/DlJvmQ
/fnuxhno+e6q8j+vNlcY/M/JtqxWp+HZEjvHJsLvq90q5w/dya7x+g3e/l9X
9Pcgq269OV8Owh/Vh9KZ76V6X66aD/3JXlfvy/CtqlWyya7daZZ4fnBDrw5u
Dkz1ZBCeDcLfV1XuzPbkelPW22p9rTbet/60T5bVLi+WCQGsmTPDrq5Vsi5X
V2m5rQc4Vhw9EGBzi/feAy/w9HfVnVoNF6f8okbFo+eEdqfheVLXhBbhGY5V
rbZlxvOFFyrbbVSYXCVY+DZ8sqnqun9RblX4U411vrhdq01drfjhIx7Y4gX/
6+ufeuN/GMgq7Key9T8k70uMJl/xdxi8VDXtAFve3K231bK6ugvpcF+rLVZ6
I0srt3fh8ZOz1xcn/BrTQEiYzhv+YTj2dkuEBzTH7sKnZVGUqv9cLZe3ySpc
b6p0qW4f3gGh+Kb60N6BxvG3wCH/gdbreOCHZJmstq3331ap2mzDc/v1HhSu
t9v16a9/rdabcrUdlEm2GQAzfo29jn8dD6f+9sf0/pMEaLAthyP/xH9aASE2
dbJc3oVAzHVVJ9g65hJwgozClfoQrpNNkpdXtyGQKMz4CK42yfq6zIK1ZlL1
I04cG9braO8YUDff7G32xbNnz8KLO1pcubsNgYgNSddhVYRPsPAd+Fd4kZVq
lanw+Ps3T9pIMGIoXKtqNZx6MLCok6yS5V1d8pBbRo5Ntbr6auT47YA4F8/Y
2u1vdxj2uVL6y70NP9ttqmwLINO6W4c5pce/fzkctvawwTH2QbfgGioPr9RK
bYRosZnEbAXHulHbsNhUt/hwrcn84a38fgCQ6webbfw+2Xwosxv3q9Z73w3C
CzDvZFnWN2Uv/O2mNcJ3u82W+Ir/zB48fv/s3Ysnz3w4DBkOL84vomHko/TF
87N+HF6QAEtItJ2rze1uy8Dof5fUgM7zpL5m7vHs41bhKZxn/81uCxwKv9+t
MsYrweZtsrlSW6G3GgS3er9c71KwVIB5cFW9/zX9Qp/8mpby69cvLt4N6LcB
VjVY54Wz5rPdVQ8LH03uBTeoGNKEF5ssIZVr7AqoTadodlTz0t+p7HolfPCY
pj0hePzw6m0LuY/OQmgU11XOlHub3EAo2IPvpwwOKAGh+phdJ6srFW4A9CWo
aBtuKzoEoBUzBqBMWatH0DjE2Q94fXPXOusnm6S88r9qvQl+9yrJXqrVn0vV
evn8ulzufdl6/Y89sJHbPydtavvjblmUN8nGfLsvUt7+6/m7Nx1kdrZ7cp5k
qgVQ/WH4DGwhY0gBRiVYxEbDk3U3wxaBQuWy2ig5AGIrL15U7x4BR9DO8wTj
tUnmP6rNyvtm/70fk3RTQhFsv6pWVbltvn28VBnNfx3NfUY0mtP7QJ3kaqPU
LcAAuffmxWA0HEyH0VxI4eJ8MB8O+5Pp2Samx0V/9eGpPwvPVgf1X6N4nGnF
43yj+sLzhcWdbbdJdqNJ9htsSTGg/3NXbRWoJa3eq3+GpqBynEKqsmRXK8Pj
1W2qcvoc01SrwcPHAl71W+hb2U1bhBF5lvUy+dD6vvV+W5ltBthXaLtEyh92
bWFSJnc78/GeFCFR3XFuv3358g+jFqd4Xl5dL+/6yqI1sRlHJ7Bcg1BbZSRm
tDypr5MN8ZVjQC28rj4Q69APhXdQ9EOooVkF7fkD9Aw8X62W5Uqd/I84Lyjf
LwHhMqlb759dXallVbe+/W87bVaS6MjXCkqKpy05Cg6Y06Z8n2R3Pk4wt/vx
h7eRr1WcJxv8Bgqjw32zSTJggaa1Tum4zzii4a9H48XIisKHFKYf96yB3+6W
ZeJ8vi8zftjs0rR9OufJbul/03rx3SB8S7rSCqptW/9+d13dJrX//fNX//K7
Fr3QJ9CPr0E3fVg+bF+R9lkLt9rXG5mZPYL1PxZrHiXJJvTYBfHTaL3c1S1d
yaDGmaP7ysP/8IiF/g763XW1W7dW+bsy20LYyVePlzJAlngUe6uPWM27ePHD
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
juAlNNdH0G1SnJ1G15P5/uwDrXHLrdGI6sBxTlx6TZwlAqGvfSUs1l5dnsY6
GnXzOe714PS0D9Sq3m06esFrf3Yit+XKjSnSHca/vcH6U5xrIbrWVxaHN9yY
XOwp5yy8xklE61CJe8VFsqYW9RtudyNttPXpax23CUW9tXd6cO6Iq8TbbJP9
Z01G3GMS3/aUyL9W2psJSHaULNNXKv/ZEAwliYX/EL7eX+DXpcR5M/MbUovp
ZbodyNRqLU0MQD2m8zmNujI1pDLqbbs9vptx177PxMnwCvwMrwNHbDUDfuab
QxZBk3LUME0nNcNpW3GPLfHXT/XaX/dfM9Frf7YvT/Pqgng7y8sDuU32esfh
RDKEuU96plbJpqzYkUPRkqVyUVLAoOPnSQctBOIHOjX9sNmPIpqJX4YANZ37
sx/vOfkTfWHG8i5oup2aShW+BbvU97woHediI71rID0VazgQXcGd3Ipphj0x
USDFtwLoKzd5YRIia1IaZP/uBI2oDw5E3L18ZrDh6ka1gzjO/WWBvm6iE6yn
h2jjESl59zlaw8fpL515eQ8QyQH11mE6Hj9ydVzST1dyLxg91KHlWs3cZWh0
47yQyV5L1r9tZfhA2l8HLf/1kv6qm79ayp8n7/yOA1TT2SzObP7ndeLWnYq6
6yYQCS7r3XnDY1f7YDtPct6jFuNcvNkWpN+GH6vN8YHF3Ec8soiDdDewuU5c
ydnB8g8mP7Y21lrxiVPK6WdCtlmaYWSM27b/PbM5Fvy2E1DopM+EJrlGlF3d
xa4XOCxN3+zFHNFGJBvlwAgxfFOQ8s7220euQMxsuoAGkuvw1rk/wjD5oYOi
zb/VMJF5mugrld0kmyvpqyld92t7ZQUZ/BV/yu7zQ0ZVY/4TIBlzwRiamjmf
n5kIwPqmGdJtqbE/mKevOCNcNwO4N/zptwkqLUWn1lKLI8UY6M9qU9XuiOTP
ZAi8ffbkzatXz14/ffZUoNIFOAaVFq1Mt8eUSGSy06R9p5M7G+jzdELNJ83d
J7lzn8ESbHlbkoXiT2iSZxIuB9XIwGrIsiI3fOCoEtQmrrzV97Vtmoh4oi8i
OjSHdxe2jCeYVBvJkd4ZzcVoQqwaUQSIwbuDcWrmY68lLZKiXAa9divz9dWO
r5awxZCsxthO5y1taE956eTZA63r7Ts0ucKCP3TUPFNq1OH/PJyI3MXq/oZz
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
mXBoQYkBAA==

-->

</rfc>
