<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.35 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-vos-cfrg-pqpake-01" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="Hybrid PQ-PAKE">Hybrid Post-Quantum Password Authenticated Key Exchange</title>
    <seriesInfo name="Internet-Draft" value="draft-vos-cfrg-pqpake-01"/>
    <author initials="J." surname="Vos" fullname="Jelle Vos">
      <organization>Apple, Inc.</organization>
      <address>
        <email>jelle_v_vos@apple.com</email>
      </address>
    </author>
    <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
      <organization>University of California, Irvine</organization>
      <address>
        <email>sjarecki@ics.uci.edu</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Apple, Inc.</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2026" month="April" day="01"/>
    <abstract>
      <?line 124?>

<t>This document describes the CPaceOQUAKE+ protocol, a hybrid asymmetric
password-authenticated key exchange (aPAKE) that supports mutual
authentication in a client-server setting secure against
quantum-capable attackers. CPaceOQUAKE+ is the result of a KEM-based
transformation from the hybrid symmetric PAKE protocol called CPaceOQUAKE
that is also described in this document. This document recommends
configurations for CPaceOQUAKE+.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://example.com/LATEST"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-vos-cfrg-pqpake/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        CFRG Crypto Forum Research Group mailing list (<eref target="mailto:WG@example.com"/>),
        which is archived at <eref target="https://example.com/WG"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/USER/REPO"/>.</t>
    </note>
  </front>
  <middle>
    <?line 134?>

<section anchor="introduction">
      <name>Introduction</name>
      <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 a public key infrastructure (PKI) and without
disclosing passwords to servers or other entities other than the client
machine. The only stage where PKI is required is during a client's registration.</t>
      <t>In the asymmetric PAKE setting, the client first registers a password
verifier with the server. A verifier is a value that is derived from the
password and which the server will later use to verify the client
knowledge of the password. After registration, the client uses its password
and the server uses the corresponding verifier to establish an authenticated
shared secret such that the server learns nothing of the client's password.</t>
      <t>OPAQUE-3DH <xref target="OPAQUE"/> and SPAKE2+ <xref target="SPAKE2PLUS"/>
are two examples of specified aPAKE protocols. These protocols provide
security in classical threat models. However, in the presence
of a quantum-capable attacker, both OPAQUE and SPAKE2+ fail to provide the
desired level of security. Both protocols are vulnerable to a Harvest Now, Decrypt
Later attack executed by a quantum-capable attacker, in which the attacker learns the shared secret and uses it
to compromise application traffic. Upgrading both protocols to provide
post-quantum security is non-trivial, especially as there are no known efficient
constructions for certain building blocks used in these protocols (such as the OPRF
used in OPAQUE-3DH). As the threat of quantum-capable attackers looms, the
viability of existing aPAKE protocols in practice diminishes in time.</t>
      <t>This document describes the CPaceOQUAKE+ protocol, an aPAKE that supports mutual
authentication in a client-server setting secure against
quantum-capable attackers. CPaceOQUAKE+ is the result of a KEM-based transformation
from the hybrid symmetric PAKE protocol called CPaceOQUAKE.
The design securely composes multiple existing primitives <xref target="VJWYMS25"/>.</t>
      <t>This document fully specifies CPaceOQUAKE+ and all dependencies necessary
to implement it. <xref target="configurations"/> provides recommended configurations.
<!-- and {{test-vectors}} provides test vectors to assist in checking implementation correctness. -->
      </t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<section anchor="notation-and-terminology">
        <name>Notation and Terminology</name>
        <t>The following functions and operators are used throughout the document.</t>
        <ul spacing="normal">
          <li>
            <t>The function <tt>random(n)</tt> generates a cryptographically secure pseudorandom
byte string of length <tt>n</tt> bytes.</t>
          </li>
          <li>
            <t>The associative binary operator <tt>||</tt> denotes concatenation of two byte strings.</t>
          </li>
          <li>
            <t>The binary function <tt>XOR(a, b)</tt> denotes an element-wise XOR operation between
two byte strings <tt>a</tt> and <tt>b</tt> of the same length.</t>
          </li>
          <li>
            <t>The functions <tt>bytes_to_int</tt> and <tt>int_to_bytes</tt> convert
byte strings to and from non-negative integers. bytes_to_int and int_to_bytes
are implemented as OS2IP and I2OSP as described in <xref target="RFC8017"/>, respectively.</t>
          </li>
          <li>
            <t>The function <tt>lv_encode</tt> encodes a byte string with a two-byte, big-endian
length prefix. For example, lv_enode((0x00, 0x01, 0x02)) = (0x00, 0x03, 0x00, 0x01, 0x02).
The function <tt>lv_decode</tt> parses a byte string that is expected to be encoded
with a two-byte length preceding the remaining bytes, e.g.,
<tt>lv_decode((0x00, 0x03, 0x00, 0x01, 0x02)) = (0x00, 0x01, 0x02)</tt>. Note that <tt>lv_decode</tt>
can fail when the length of the actual bytes does not match that encoded in the
prefix. For example, <tt>lv_decode((0xFF, 0xFF, 0x00))</tt> will fail.</t>
          </li>
          <li>
            <t>The notation <tt>bytes[l..h]</tt> refers to the slice of byte array <tt>bytes</tt> starting
at index <tt>l</tt> and ending at index <tt>h-1</tt>. For example, given <tt>bytes = (0x00, 0x01, 0x02)</tt>, then <tt>bytes[0..1] = 0x00</tt> and <tt>bytes[0..3] = (0x00, 0x01, 0x02)</tt>. Similarly, the notation <tt>bytes[l..]</tt> refers to the slice of the byte
array <tt>bytes</tt> starting at <tt>l</tt> until the end of <tt>bytes</tt>, i.e.., <tt>bytes[l..] = bytes[l..len(bytes)]</tt>.</t>
          </li>
        </ul>
        <t>All algorithms and procedures described in this document are laid out
in a Python-like pseudocode. Each function takes a set of inputs and parameters
and produces a set of output values. Parameters become constant values once
the protocol variant and the configuration are fixed.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>This document aims to specify two protocols: a symmetric and an asymmetric hybrid PAKE.
In the symmetric PAKE setting, the client and server share a password and use it to
establish an authenticated shared secret. In the asymmetric PAKE setting, the client first
registers a password verifier with the server. A verifier is a value that is derived
from the password and which the client will later use to demonstrate knowledge of the password.
After registration, the client uses its password and the server uses the corresponding
verifier to establish an authenticated shared secret such that the server learns nothing
of the client's password.</t>
      <t>The aPAKE specified in this document is composed of multiple smaller protocols, including
the hybrid symmetric PAKE protocol called CPaceOQUAKE. CPaceOQUAKE is in turn a composition of two other
PAKE protocols: the existing CPace <xref target="CPACE"/> and a new post-quantum PAKE called OQUAKE.
To achieve the asymmetric property, the aPAKE also builds upon a password
confirmation sub-protocol as specified in <xref target="pcp"/>.</t>
      <t>We refer to the fully composed aPAKE as CPaceOQUAKE+.
An abstract overview of the composition of this protocol is shown in the figure below.
In the subsequent sections we break down the sub-protocols into even smaller building blocks.</t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="376" viewBox="0 0 376 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 104,32 L 104,320" fill="none" stroke="black"/>
            <path d="M 128,64 L 128,240" fill="none" stroke="black"/>
            <path d="M 128,272 L 128,288" fill="none" stroke="black"/>
            <path d="M 144,96 L 144,144" fill="none" stroke="black"/>
            <path d="M 144,176 L 144,224" fill="none" stroke="black"/>
            <path d="M 232,96 L 232,144" fill="none" stroke="black"/>
            <path d="M 232,176 L 232,224" fill="none" stroke="black"/>
            <path d="M 248,64 L 248,240" fill="none" stroke="black"/>
            <path d="M 248,272 L 248,288" fill="none" stroke="black"/>
            <path d="M 272,32 L 272,320" fill="none" stroke="black"/>
            <path d="M 104,32 L 272,32" fill="none" stroke="black"/>
            <path d="M 128,64 L 248,64" fill="none" stroke="black"/>
            <path d="M 144,96 L 232,96" fill="none" stroke="black"/>
            <path d="M 80,144 L 96,144" fill="none" stroke="black"/>
            <path d="M 144,144 L 232,144" fill="none" stroke="black"/>
            <path d="M 280,144 L 296,144" fill="none" stroke="black"/>
            <path d="M 144,176 L 232,176" fill="none" stroke="black"/>
            <path d="M 144,224 L 232,224" fill="none" stroke="black"/>
            <path d="M 128,240 L 248,240" fill="none" stroke="black"/>
            <path d="M 144,256 L 232,256" fill="none" stroke="black"/>
            <path d="M 72,288 L 104,288" fill="none" stroke="black"/>
            <path d="M 272,288 L 304,288" fill="none" stroke="black"/>
            <path d="M 144,304 L 232,304" fill="none" stroke="black"/>
            <path d="M 104,320 L 272,320" fill="none" stroke="black"/>
            <path d="M 144,256 C 135.16936,256 128,263.16936 128,272" fill="none" stroke="black"/>
            <path d="M 232,256 C 240.83064,256 248,263.16936 248,272" fill="none" stroke="black"/>
            <path d="M 144,304 C 135.16936,304 128,296.83064 128,288" fill="none" stroke="black"/>
            <path d="M 232,304 C 240.83064,304 248,296.83064 248,288" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="312,288 300,282.4 300,293.6" fill="black" transform="rotate(0,304,288)"/>
            <polygon class="arrowhead" points="288,144 276,138.4 276,149.6" fill="black" transform="rotate(180,280,144)"/>
            <polygon class="arrowhead" points="104,144 92,138.4 92,149.6" fill="black" transform="rotate(0,96,144)"/>
            <polygon class="arrowhead" points="80,288 68,282.4 68,293.6" fill="black" transform="rotate(180,72,288)"/>
            <g class="text">
              <text x="164" y="52">CPaceOQUAKE+</text>
              <text x="184" y="84">CPaceOQUAKE</text>
              <text x="184" y="116">CPace</text>
              <text x="36" y="132">Client's</text>
              <text x="188" y="132">protocol</text>
              <text x="36" y="148">password</text>
              <text x="340" y="148">Verifier</text>
              <text x="188" y="196">OQUAKE</text>
              <text x="188" y="212">protocol</text>
              <text x="188" y="276">Password</text>
              <text x="32" y="292">Session</text>
              <text x="188" y="292">confirmation</text>
              <text x="344" y="292">Session</text>
              <text x="32" y="308">key</text>
              <text x="344" y="308">key</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
            +--------------------+
            | CPaceOQUAKE+       |
            |  +--------------+  |
            |  | CPaceOQUAKE  |  |
            |  | +----------+ |  |
            |  | |  CPace   | |  |
Client's    |  | | protocol | |  |
password -->|  | +----------+ |  |<-- Verifier
            |  |              |  |
            |  | +----------+ |  |
            |  | |  OQUAKE  | |  |
            |  | | protocol | |  |
            |  | +----------+ |  |
            |  +--------------+  |
            |   .------------.   |
            |  |   Password   |  |
Session <---+  | confirmation |  +---> Session
  key       |   '------------'   |       key
            +--------------------+
]]></artwork>
      </artset>
      <t>We note that this standard only specifies the composition of CPace and OQUAKE.
It is not necessarily true that one can securely compose all PAKEs this way.</t>
      <t>The rest of this document specifies CPaceOQUAKE+ and its dependencies. <xref target="CPaceOQUAKE"/>
specifies the CPaceOQUAKE protocol, and <xref target="CPaceOQUAKEplus"/> specifies the CPaceOQUAKE+ protocol,
incorporating the former protocol. Each of these pieces build upon the cryptographic dependencies
specified in <xref target="crypto-deps"/>.</t>
    </section>
    <section anchor="crypto-deps">
      <name>Cryptographic Dependencies</name>
      <t>The protocols in this document have four primary dependencies:</t>
      <ul spacing="normal">
        <li>
          <t>Key Encapsulation Mechanism (KEM); <xref target="deps-kem"/></t>
        </li>
        <li>
          <t>Splittable Binary Key Encapsulation Mechanism with specific uniformity properties (binary UPK-ANO-KEM, or BUA-sKEM); <xref target="deps-BUA-sKEM"/></t>
        </li>
        <li>
          <t>Key Derivation Function (KDF); <xref target="deps-symmetric"/></t>
        </li>
        <li>
          <t>Key Stretching Function (KSF); <xref target="deps-ksf"/></t>
        </li>
      </ul>
      <t><xref target="configurations"/> specifies different combinations of each of these dependencies
that are suitable for implementation.</t>
      <section anchor="deps-kem">
        <name>Key Encapsulation Mechanism</name>
        <t>A Key Encapsulation Mechanism (KEM) is an algorithm that is used for exchanging
a secret from one party to another. We require an IND-CCA-secure KEM with key
derivation from a seed. It consists of the following syntax.</t>
        <ul spacing="normal">
          <li>
            <t>DeriveKeyPair(seed): Deterministic algorithm to derive a key pair
<tt>(sk, pk)</tt> from the byte string <tt>seed</tt>, where <tt>seed</tt> <bcp14>MUST</bcp14> have <tt>Nseed</tt> bytes.</t>
          </li>
          <li>
            <t>Encaps(pk): Randomized algorithm to generate an ephemeral,
fixed-length symmetric key (the KEM shared secret) and
a fixed-length encapsulation of that key that can be decapsulated
by the holder of the secret key corresponding to <tt>pk</tt>. This function
can raise an <tt>EncapsError</tt> on encapsulation failure.</t>
          </li>
          <li>
            <t>Decaps(ct, sk): Deterministic algorithm using the secret key <tt>sk</tt>
to recover the ephemeral symmetric key (the KEM shared secret) from
its encapsulated representation <tt>ct</tt>. This function can raise a
<tt>DecapsError</tt> on decapsulation failure.</t>
          </li>
          <li>
            <t>Nseed: The length in bytes of the seed used to derive a key pair.</t>
          </li>
          <li>
            <t>Nct: The length in bytes of an encapsulated key produced by this KEM.</t>
          </li>
          <li>
            <t>Npk: The length in bytes of a public key for this KEM.</t>
          </li>
        </ul>
        <t>This specification uses X-Wing <xref target="XWING"/>.</t>
      </section>
      <section anchor="deps-BUA-sKEM">
        <name>Splittable binary UPK-ANO-KEM</name>
        <t>A binary UPK-ANO-KEM supports the same functions as defined above for
a KEM, and it must also be IND-CCA secure, but it must also achieve
two additional security properties. Namely, in addition to IND-CCA
security, a binary UPK-ANO-KEM requires that:</t>
        <ol spacing="normal" type="1"><li>
            <t>Public keys are indistinguishable from random strings of bytes (of
the same length), i.e. uniform public keys (UPK); and</t>
          </li>
          <li>
            <t>Ciphertexts are anonymous in the presence of chosen ciphertext
attack (ANO-CCA), i.e. anonymous ciphertexts (ANO).</t>
          </li>
        </ol>
        <t>These additional properties are crucial for the security of OQUAKE. In
other words, one <bcp14>MUST NOT</bcp14> use a KEM that has no uniform public keys
and/or no anonymous ciphertexts in place of a UPK-ANO-KEM.</t>
        <t>In this specification, we also require a third property: the KEM must be splittable. A splittable KEM (sKEM) implements the <tt>Split(pk) -&gt; (t, ⍴)</tt> function and its inverse, which takes a public key and splits it into a part <tt>⍴</tt> that is indepdendent of the KEM's secret key and can therefore be made public, and a part <tt>t</tt> that does depend on the secret key. This property allows parties to perform variable-time operations on <tt>⍴</tt> without revealing information about the secret key. We use N⍴ to denote the byte-length of ⍴ and Nt to denote the byte-length of t. We use <tt>Combine(t, ⍴) -&gt; pk</tt> to refer to the inverse operation of <tt>Split</tt>.</t>
        <t>In the remainder of this specification, we abbreviate 'splittable binary UPK-ANO-KEM' as BUA-sKEM.
This specification uses a variant of ML-KEM1024 <xref target="FIPS203"/>, which we therefore denote by ML-BUA-sKEM1024. It is specified in <xref target="ML-BUA-sKEM"/>.
This is instantiated with "KemeleonNR - ML-KEM1024" <xref target="KEMELEON"/>. Note that, while
Kemeleon provides uniform encoding for KEM ciphertexts and public keys, we only
require uniform enoding for public keys. Future specifications can replace ML-BUA-sKEM1024 with another splittable binary UPK-ANO-KEM that is more efficient if one becomes available.</t>
      </section>
      <section anchor="deps-symmetric">
        <name>Key Derivation Function</name>
        <t>A Key Derivation Function (KDF) is a function that takes some source of initial
keying material and uses it to derive one or more cryptographically strong keys.
This specification uses a KDF with the following API and parameters:</t>
        <ul spacing="normal">
          <li>
            <t>Extract(salt, ikm): Extract a pseudorandom key of fixed length <tt>Nx</tt> bytes from
input keying material <tt>ikm</tt> and an optional byte string <tt>salt</tt>.</t>
          </li>
          <li>
            <t>Expand(prk, info, L): Expand a pseudorandom key <tt>prk</tt> using the optional string <tt>info</tt>
into <tt>L</tt> bytes of output keying material.</t>
          </li>
          <li>
            <t>Nx: The output size of the <tt>Extract()</tt> function in bytes.</t>
          </li>
        </ul>
      </section>
      <section anchor="deps-ksf">
        <name>Key Stretching Function</name>
        <t>This specification makes use of a Key Stretching Function (KSF), which is a slow
and expensive cryptographic hash function with the following API:</t>
        <ul spacing="normal">
          <li>
            <t>Stretch(msg, salt, L): Apply a key stretching function to stretch the input <tt>msg</tt>
and salt <tt>salt</tt>, hardening it against offline dictionary attacks. This function also
needs to satisfy collision resistance. The output is a string of L bytes.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="ML-BUA-sKEM">
      <name>ML-BUA-sKEM: A BUA-sKEM around ML-KEM</name>
      <section anchor="splittable-ml-kem">
        <name>Splittable ML-KEM</name>
        <t>ML-KEM <xref target="FIPS203"/> is already specified in a way that allows one to separate out the part of the public key that does not depend on the secret key; this feature is also used in Kemeleon <xref target="KEMELEON"/>. The Split function is defined as follows for ML-KEM <xref target="TEMPO"/>. The part of the public key that does not depend on the secret key represents the final 32 bytes. For this reason, Nt = ML-KEM.Npk - 32 and N⍴ = 32.</t>
        <artwork><![CDATA[
ML-KEM.Split

Input:
- pk, an ML-KEM public key, a byte string of ML-KEM.Npk bytes

Output:
- t, part of the public key that depends on the secret key
- ⍴, part of the public key that does NOT depend on the secret key

def Split(pk):
  t = pk[0 : ML-KEM.Npk - 32]
  ⍴ = pk[ML-KEM.Npk - 32 : ML-KEM.Npk]
  return t, ⍴
]]></artwork>
        <t>For ML-KEM, the inverse of the split operation is concatenation.</t>
        <artwork><![CDATA[
ML-KEM.Combine

Input:
- t, part of the public key that depends on the secret key
- ⍴, part of the public key that does NOT depend on the secret key

Output:
- pk, an ML-KEM public key, a byte string of ML-KEM.Npk bytes

def Combine(t, ⍴):
  return t || ⍴
]]></artwork>
      </section>
      <section anchor="ml-bua-skem-key-derivation">
        <name>ML-BUA-sKEM Key Derivation</name>
        <t>The design of ML-BUA-sKEM is such that it does not change the internals of ML-KEM; it only uses the Split function. To ensure that the public key generated by ML-BUA-sKEM.DeriveKeyPair is binary and uniform, it uses Kemeleon <xref target="KEMELEON"/> to (re-)encode ML-KEM's public keys. In the PAKEs described in this specification, it is crucial that this happens in constant time. For this reason, ML-BUA-sKEM uses the non-rejection sampling variants of Kemeleon, as denoted by <tt>VectorEncodeNR</tt> and <tt>VectorDecodeNR</tt>. ML-BUA-sKEM is defined as follows.</t>
        <artwork><![CDATA[
ML-BUA-sKEM.DeriveKeyPair

Input:
- seed, a random byte string of ML-BUA-sKEM.Nseed bytes

Output:
- sk, a secret decapsulation key, a byte string
- upk, a uniform public key for encapsulation, a byte string

Parameter:
- Kemeleon.sec_param, a security parameter that tunes the bias of the produced upk

def DeriveKeyPair(seed):
  (sk, pk) = ML-KEM.DeriveKeyPair(seed)
  (t, ⍴) = ML-KEM.Split(pk)
  ut = VectorEncodeNR(t)
  upk = ut || ⍴
  return sk, upk
]]></artwork>
        <t>The uniform public keys produced by ML-BUA-sKEM are longer than those produced by ML-KEM. The final 32 bytes of the public key still represent the part that does not depend on the secret key.</t>
        <artwork><![CDATA[
ML-BUA-sKEM.Split

Input:
- upk, an ML-BUA-sKEM public key, a byte string of ML-BUA-sKEM.Npk bytes

Output:
- ut, part of the uniform public key that depends on the secret key
- ⍴, part of the uniform public key that does NOT depend on the secret key

def Split(upk):
  ut = upk[0 : ML-BUA-sKEM.Nt]
  ⍴ = upk[ML-BUA-sKEM.Nt : ML-BUA-sKEM.Npk]
  return ut, ⍴
]]></artwork>
        <t>For ML-BUA-sKEM, the inverse of the split operation is concatenation.</t>
        <artwork><![CDATA[
ML-BUA-sKEM.Combine

Input:
- ut, part of the uniform public key that depends on the secret key
- ⍴, part of the uniform public key that does NOT depend on the secret key

Output:
- upk, an ML-BUA-sKEM public key, a byte string of ML-BUA-sKEM.Npk bytes

def Combine(ut, ⍴):
  return ut || ⍴
]]></artwork>
      </section>
      <section anchor="ml-bua-skem-encapsulation-decapsulation">
        <name>ML-BUA-sKEM Encapsulation &amp; Decapsulation</name>
        <t>ML-BUA-sKEM encapsulation undoes the uniform encoding performed during key derivation before calling ML-KEM.Encaps on the non-uniform public key.</t>
        <artwork><![CDATA[
ML-BUA-sKEM.Encaps

Input:
- upk, an ML-BUA-sKEM public key

Output:
- k, a symmetric shared secret, a byte string
- ct, an anonymous ciphertext encapsulating k, a byte string

Parameter:
- Kemeleon.sec_param, a security parameter that tunes the bias of the consumed upk

def Encaps(upk):
  (ut, ⍴) = ML-BUA-sKEM.Split(upk)
  t = VectorDecodeNR(ut)
  pk = ML-KEM.Combine(t, ⍴)
  return ML-KEM.Encaps(pk)
]]></artwork>
        <t>The decapsulation procedure for ML-BUA-sKEM is exactly the same as for ML-KEM.</t>
        <artwork><![CDATA[
ML-BUA-sKEM.Decaps

Input:
- ct, an anonymous ciphertext encapsulating k, a byte string
- sk, a secret decapsulation key, a byte string

Output:
- k, a symmetric shared secret, a byte string

def Decaps(ct, sk):
  return ML-KEM.Decaps(ct, sk)
]]></artwork>
      </section>
    </section>
    <section anchor="CPaceOQUAKE">
      <name>CPaceOQUAKE Protocol</name>
      <t>The hybrid, symmetric PAKE protocol, denoted CPaceOQUAKE consists of CPace <xref target="CPACE"/>
combined with OQUAKE <xref target="ABJ25"/>. OQUAKE is a PAKE built from a BUA-sKEM and KDF, using a
2-rounds of Feistel network to password-encrypt the BUA-sKEM public key.
The OQUAKE protocol is based on the "NoIC" protocol analyzed in <xref target="ABJ25"/>.</t>
      <t>The CPaceOQUAKE protocol is based on the `Sequential PAKE Combiner' protocol proposed by
<xref target="HR24"/>. A very close variant of this protocol was also analyzed in <xref target="LL24"/>.</t>
      <t>At a high level, CPaceOQUAKE is a two-round protocol that runs between client and server
wherein, upon completion, both parties share the same session key if they agree
on the password-related string (PRS). Otherwise, they obtain random session keys.
This is summarized in the diagram below.</t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="536" viewBox="0 0 536 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 104,32 L 104,192" fill="none" stroke="black"/>
            <path d="M 224,48 L 224,96" fill="none" stroke="black"/>
            <path d="M 224,128 L 224,176" fill="none" stroke="black"/>
            <path d="M 312,48 L 312,96" fill="none" stroke="black"/>
            <path d="M 312,128 L 312,176" fill="none" stroke="black"/>
            <path d="M 432,32 L 432,192" fill="none" stroke="black"/>
            <path d="M 104,32 L 432,32" fill="none" stroke="black"/>
            <path d="M 224,48 L 312,48" fill="none" stroke="black"/>
            <path d="M 80,96 L 96,96" fill="none" stroke="black"/>
            <path d="M 224,96 L 312,96" fill="none" stroke="black"/>
            <path d="M 440,96 L 456,96" fill="none" stroke="black"/>
            <path d="M 224,128 L 312,128" fill="none" stroke="black"/>
            <path d="M 72,160 L 104,160" fill="none" stroke="black"/>
            <path d="M 432,160 L 456,160" fill="none" stroke="black"/>
            <path d="M 224,176 L 312,176" fill="none" stroke="black"/>
            <path d="M 104,192 L 432,192" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="464,160 452,154.4 452,165.6" fill="black" transform="rotate(0,456,160)"/>
            <polygon class="arrowhead" points="448,96 436,90.4 436,101.6" fill="black" transform="rotate(180,440,96)"/>
            <polygon class="arrowhead" points="104,96 92,90.4 92,101.6" fill="black" transform="rotate(0,96,96)"/>
            <polygon class="arrowhead" points="80,160 68,154.4 68,165.6" fill="black" transform="rotate(180,72,160)"/>
            <g class="text">
              <text x="160" y="52">CPaceOQUAKE</text>
              <text x="264" y="68">CPace</text>
              <text x="36" y="84">Client's</text>
              <text x="268" y="84">protocol</text>
              <text x="500" y="84">Server's</text>
              <text x="36" y="100">password</text>
              <text x="500" y="100">password</text>
              <text x="268" y="148">OQUAKE</text>
              <text x="32" y="164">Session</text>
              <text x="268" y="164">protocol</text>
              <text x="496" y="164">Session</text>
              <text x="32" y="180">key</text>
              <text x="496" y="180">key</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
            +----------------------------------------+
            | CPaceOQUAKE  +----------+              |
            |              |  CPace   |              |
Client's    |              | protocol |              |    Server's
password -->|              +----------+              |<-- password
            |                                        |
            |              +----------+              |
            |              |  OQUAKE  |              |
Session <---+              | protocol |              +--> Session
  key       |              +----------+              |      key
            +----------------------------------------+
]]></artwork>
      </artset>
      <t>CPaceOQUAKE composes CPace and OQUAKE by first running CPace between
client and server, and then incorporating the CPace session key into
the password before running OQUAKE between the server and client. We
explain the composition in more detail in <xref target="cpacequake-composition"/>.</t>
      <t>As describes in <xref target="cpace"/> and <xref target="quake"/>, both CPace and OQUAKE take
as input optional client and server identifiers, denoted U and S,
respectively. See <xref target="identities"/> for more discussion about these
identities and how they are chosen in practice.</t>
      <section anchor="cpace">
        <name>CPace Specification</name>
        <t>CPace is a classical elliptic curve-based PAKE <xref target="CPACE"/>. This section wraps the CPace specification in a consistent interface.
We use an interactive version of CPace that takes two rounds, in which there is a designated initiator and responder.
In other words, the responder only starts executing the protocol after it received the first message from the initiator.</t>
        <t>The flow of the protocol consists of three messages sent between initiator and responder, produced by the functions
Init, Respond, and Finish, described below. Both parties take as input a password-related
string PRS, an optional unique shared session identifier sid, and an optional client identifier
U and server identifier S (e.g., a device identifier, an IP address, or URL pertaining to the
client and server). Upon completion, both parties obtain matching session keys if their PRS, sid, key
length (specified by N), and client and server identifiers match. Otherwise, they obtain random keys.
In exceptional cases, the protocol aborts.</t>
        <section anchor="initiation">
          <name>Initiation</name>
          <t>The initiator starts the protocol using its password-related string PRS.
Additionally, it may bind the session to an existing shared session identifier sid.
CPace also allows to bind the session to an existing channel identifier.
To remain consistent with the other PAKEs in this specification, the channel identifier is the concatenation
of optional client and server identifiers.</t>
          <artwork><![CDATA[
CPace.Init

Input:
- PRS, password-related string, a byte string
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- ya, discrete logarithm intended to be stored in secret until the protocol finishes
- Ya, public point, intended to be sent to the responder

Parameters:
- G, a group environment as specified in CPace

def Init(PRS, sid, U, S):
  g = G.calculate_generator(H, PRS, U || S, sid)
  ya = G.sample_scalar()
  Ya = G.scalar_mult(ya, g)
  return ya, Ya
]]></artwork>
        </section>
        <section anchor="response">
          <name>Response</name>
          <t>The responder performs the same actions as the initiator.
Since it already received the initiator's message, it can immediately finish its execution of the protocol.
It outputs the shared secret and a message Yb intended to be sent to the initiator.</t>
          <artwork><![CDATA[
CPace.Respond

Input:
- PRS, password-related string, a byte string
- Ya, public point, received from the initiator
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- ISK, the established shared secret
- Yb, public point, intended to be sent to the initiator

Parameters:
- G, a group environment as specified in CPace
- H, a hash function as specified in CPace

Exceptions:
- CPaceError, raised when an invalid value was encountered in CPace

def Respond(PRS, Ya, sid, U, S):
  g = G.calculate_generator(H, PRS, U || S, sid)
  yb = G.sample_scalar()
  Yb = G.scalar_mult(yb, g)

  K = G.scalar_mult_vfy(yb, Ya)
  If K = G.I, raise CPaceError

  ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(Ya, Yb))

  return ISK, Yb
]]></artwork>
          <t>The functions <tt>lv_cat</tt> and <tt>transcript</tt> are defined in <xref target="CPACE"/>.</t>
        </section>
        <section anchor="finish">
          <name>Finish</name>
          <t>The initiator finishes the protocol by combining the discrete logarithm ya generated by CPace.Init and the message Yb received
from the responder.</t>
          <artwork><![CDATA[
CPace.Finish

Input:
- ya, discrete logarithm that was generated using CPace.Init
- Yb, public point, received from the responder
- sid, session identifier, a byte string

Output:
- ISK, the established shared secret

Parameters:
- G, a group environment as specified in CPace
- H, a hash function as specified in CPace

Exceptions:
- CPaceError, raised when an invalid value was encountered in CPace

def Finish(ya, Yb, sid):
  K = G.scalar_mult_vfy(ya, Yb)
  If K = G.I, raise CPaceError

  ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(Ya, Yb))

  return ISK
]]></artwork>
        </section>
      </section>
      <section anchor="quake">
        <name>OQUAKE Specification</name>
        <t>OQUAKE is a PAKE built on a BUA-sKEM and KDF.  If the BUA-sKEM provides security against quantum-enabled attacks,
then so does OQUAKE. It consists of three messages sent between initiator and responder, produced by
the functions Init, Respond, and Finish, described below. Both parties take as input a password-related
string PRS, an optional session identifier sid, and an optional client identifier U and server
identifier S. Upon completion, both parties obtain matching session keys if their PRS, sid, key length
(specified by N), and client and server identifiers match. Otherwise, they obtain random session keys.</t>
        <t>The shared session identifier has the following requirements. If a client and server identifier are provided:</t>
        <ul spacing="normal">
          <li>
            <t>The session identifier must match between the client and server</t>
          </li>
          <li>
            <t>This session identifier has not been used before in a session between the client and server</t>
          </li>
        </ul>
        <t>If no client and server identifiers are provided:</t>
        <ul spacing="normal">
          <li>
            <t>The session identifier must match between the client and server</t>
          </li>
          <li>
            <t>This session identifier has not been used before by the client or server in any session with any other party</t>
          </li>
        </ul>
        <t>These requirements originate from the security proof for OQUAKE. If these requirements are not met, the proof
does not apply, but this does not mean that the protocol becomes vulnerable.</t>
        <t>The specification follows the design as presented in <xref target="VJWYMS25"/>, with the splittable KEM technique described
in <xref target="TEMPO"/>, which prevents timing attacks caused by rejection sampling in ML-KEM. See <xref target="timing-and-tempo"/>
for more information on the timing attack and this fix.</t>
        <section anchor="initiation-1">
          <name>Initiation</name>
          <t>Init takes as input the initiator's PRS, an optional session identifier sid, and optional client and server identifiers
U and S. It produces a context for the initiator to store, as well as a protocol message that is sent to
the responder. Its implementation is as follows.</t>
          <artwork><![CDATA[
OQUAKE.Init

Input:
- PRS, password-related string, a byte string
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- context, opaque state for the initiator to store
- msg, an encoded protocol message for the initiator to send to the responder

Parameters:
- BUA-sKEM, a BUA-sKEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

def Init(PRS, sid, U, S):
  seed = random(BUA-sKEM.Nseed)
  (pk, sk) = BUA-sKEM.DeriveKeyPair(seed)
  (ut, ⍴) = BUA-sKEM.Split(pk)

  r = random(3 * Nsec)

  fullsid = encode_sid(sid, U, S)

  // T = XOR(t, H(fullsid, PRS, ⍴, r))
  prk_T_pad = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || ⍴ || r)
  T_pad = KDF.Expand(prk_T_pad, DST || "T_pad", BUA-sKEM.Nt)
  T = XOR(ut, T_pad)

  // s = XOR(r, H(fullsid, PRS, ⍴, T))
  prk_s_pad = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || ⍴ || T)
  s_pad = KDF.Expand(prk_s_pad, DST || "s_pad", 3 * Nsec)
  s = XOR(r, s_pad)

  init_msg = s || T || ⍴

  return Context(PRS, sk, pk, s, T, fullsid), init_msg
]]></artwork>
          <t>The encode_sid function is defined below.</t>
          <artwork><![CDATA[
encode_sid

Input:
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- fullsid, a byte string

Parameters:
- BUA-sKEM, a BUA-sKEM instance
- KDF, a KDF instance

def encode_sid(sid, U, S):
  fullsid =
    bytes_to_int(len(sid), 4) || sid ||
    bytes_to_int(len(U), 4) || U ||
    bytes_to_int(len(S), 4) || S
  return fullsid
]]></artwork>
        </section>
        <section anchor="response-1">
          <name>Response</name>
          <t>Respond takes as input the PRS, the initiator's protocol message, an optional session identifier, and optional client and server identifiers.
It produces a 32-byte symmetric key and a protocol message intended to be sent to the initiator. Its implementation
is as follows.</t>
          <artwork><![CDATA[
OQUAKE.Respond

Input:
- PRS, password-related string, a byte string
- init_msg, encoded protocol message, a byte string
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- ss, output shared secret, a byte string of 32 bytes
- resp_msg, encoded protocol message, a byte string

Parameters:
- BUA-sKEM, a BUA-sKEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

def Respond(PRS, init_msg, sid, U, S):
  (s, T, ⍴) = init_msg[0 : (3 * Nsec)], init_msg[(3 * Nsec) : (6 * Nsec)], init_msg[(6 * Nsec) : (6 * Nsec) + N⍴]

  fullsid = encode_sid(sid, U, S)
  prk_s_pad = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || ⍴ || T)
  s_pad = KDF.Expand(prk_s_pad, DST || "s_pad", 3 * Nsec)
  r = XOR(s, s_pad)

  prk_T_pad = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || ⍴ || r)
  T_pad = KDF.Expand(prk_T_pad, DST || "T_pad", BUA-sKEM.Nt)
  ut = XOR(T, T_pad)

  pk = BUA-sKEM.Combine(ut, ⍴)
  (ct, k) = BUA-sKEM.Encaps(pk)

  prk_sk = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || s || T || pk || ct || k)
  key = KDF.Expand(prk_sk, DST || "sk", Nkey)

  h = KDF.Expand(prk_sk, DST || "confirm", Nkc)

  resp_msg = ct || h

  return resp_msg, key
]]></artwork>
        </section>
        <section anchor="quake-finish">
          <name>Finish</name>
          <t>Finish takes as input the initiator-created context that is output from Init
as well as the responder's reply message resp_msg. It produces a symmetric key
that is output to the initiator. Its implementation
is as follows.</t>
          <artwork><![CDATA[
OQUAKE.Finish

Input:
- context, opaque state for the initiator to store
- resp_msg, encoded protocol message, a byte string

Output:
- ss, output shared secret, a byte string of 32 bytes

Parameters:
- BUA-sKEM, a BUA-sKEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

Exceptions:
- AuthenticationError, raised when the key confirmation fails

def Finish(context, resp_msg):
  (PRS, sk, pk, s, T, fullsid) = context
  ct, h = resp_msg[0..Nct], resp_msg[Nct..]

  try:
    k = BUA-sKEM.Decaps(sk, ct)
    prk_sk = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || s || T || pk || ct || k)

    key = KDF.Expand(prk_sk, DST || "sk", Nkey)

    h_expected = KDF.Expand(prk_sk, DST || "confirm", Nkc)
    if h != h_expected:
      return random(Nkey)

    return key
  catch DecapsError:
    return random(Nkey)
]]></artwork>
        </section>
      </section>
      <section anchor="cpacequake-composition">
        <name>Composition of CPace &amp; OQUAKE</name>
        <t>CPaceOQUAKE is a sequential composition of CPace (see <xref target="cpace"/>) and
OQUAKE (see <xref target="quake"/>). Whereas running CPace and OQUAKE in parallel realizes
a worst-of-both worlds PAKE, this sequential composition realizes a
best-of-both worlds PAKE. In other words, CPaceOQUAKE remains as secure
as the strongest PAKE, resisting attacks that break the classical CPace
(e.g. by a quantum-capable attacker) or attacks that break the
quantum-resistant OQUAKE (e.g. by a flaw in the BUA-sKEM). This assumes that
OQUAKE is instantiated with a quantum-resistant BUA-sKEM.</t>
        <t>The reason a parallel combiner does not achieve best-of-both-worlds security
is that it requires both constituent PAKEs to be unconditionally password
hiding, meaning that the password must not be learnable even if all
computational assumptions underlying the PAKE break. Intuitively, if one
PAKE is not unconditionally password hiding, an attacker that breaks its
computational assumptions can recover the password, and knowing the password
is sufficient to then defeat the other PAKE as well. CPace is unconditionally
password hiding in the sense that, even if the Diffie-Hellman assumption
fails, the protocol transcript (including the exchanged group elements) is
statistically independent of the password-related string PRS: PRS is only
used to derive a generator, while the transmitted points are fresh random
scalar multiples of this generator and hence are uniformly distributed in the
group. OQUAKE, however, is not unconditionally password hiding: an attacker
that can break the D-MLWE assumption can distinguish ML-KEM public keys and
ciphertexts from random bitstrings and thereby mount offline dictionary
attacks to recover the password. Because no currently known post-quantum
PAKE built on standard primitives such as ML-KEM achieves unconditional
password hiding, a parallel combiner cannot provide the desired hybrid
security guarantee.</t>
        <t>The sequential combiner overcomes this limitation. Instead of running OQUAKE
on the original password-related string PRS, CPaceOQUAKE feeds OQUAKE the
derived value from CPace, which binds the original PRS to the CPace session
key. Even if an attacker breaks D-MLWE and can distinguish OQUAKE public keys
and ciphertexts, offline dictionary attacks against the original PRS are
infeasible because the CPace-derived session key material is computationally
indistinguishable from a random value (under the gap Diffie-Hellman assumption).
The sequential composition is analyzed in <xref target="HR24"/> and a close variant is analyzed in <xref target="LL24"/>.</t>
        <t>To be precise, CPaceOQUAKE first runs CPace using password-related string PRS,
establishing a session key SK1 with the associated transcript tr1. It
then initiates OQUAKE using the password-related string <tt>H(fullsid, PRS, tr1, SK1)</tt>;
a secret derived from the the original password-related string and the outputs from
the CPace instance. Here, <tt>fullsid</tt> is the output of encode_sid(sid, U, S).
The final session key is then a hash of fullsid, the original password-related string,
both CPace and OQUAKE transcripts (tr1 and tr2, respectively), and both session keys
output from CPace and OQUAKE (SK1 and SK2, respectively), i.e.,
H(fullsid, tr1, tr2, SK1, SK2).</t>
        <t>This is outlined in the diagram below. In CPaceOQUAKE, CPace is initiated by the
first party, while OQUAKE is initiated by the other party. This results in a protocol
that requires three messages.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="848" viewBox="0 0 848 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 104,32 L 104,56" fill="none" stroke="black"/>
              <path d="M 104,72 L 104,152" fill="none" stroke="black"/>
              <path d="M 104,168 L 104,192" fill="none" stroke="black"/>
              <path d="M 216,64 L 216,128" fill="none" stroke="black"/>
              <path d="M 296,80 L 296,128" fill="none" stroke="black"/>
              <path d="M 376,48 L 376,96" fill="none" stroke="black"/>
              <path d="M 376,128 L 376,176" fill="none" stroke="black"/>
              <path d="M 464,48 L 464,96" fill="none" stroke="black"/>
              <path d="M 464,128 L 464,176" fill="none" stroke="black"/>
              <path d="M 480,80 L 480,112" fill="none" stroke="black"/>
              <path d="M 592,64 L 592,104" fill="none" stroke="black"/>
              <path d="M 592,120 L 592,128" fill="none" stroke="black"/>
              <path d="M 672,112 L 672,128" fill="none" stroke="black"/>
              <path d="M 744,32 L 744,56" fill="none" stroke="black"/>
              <path d="M 744,72 L 744,152" fill="none" stroke="black"/>
              <path d="M 744,168 L 744,192" fill="none" stroke="black"/>
              <path d="M 104,32 L 744,32" fill="none" stroke="black"/>
              <path d="M 376,48 L 464,48" fill="none" stroke="black"/>
              <path d="M 80,64 L 240,64" fill="none" stroke="black"/>
              <path d="M 272,64 L 368,64" fill="none" stroke="black"/>
              <path d="M 472,64 L 488,64" fill="none" stroke="black"/>
              <path d="M 520,64 L 768,64" fill="none" stroke="black"/>
              <path d="M 296,80 L 376,80" fill="none" stroke="black"/>
              <path d="M 464,80 L 480,80" fill="none" stroke="black"/>
              <path d="M 376,96 L 464,96" fill="none" stroke="black"/>
              <path d="M 480,112 L 672,112" fill="none" stroke="black"/>
              <path d="M 376,128 L 464,128" fill="none" stroke="black"/>
              <path d="M 312,144 L 368,144" fill="none" stroke="black"/>
              <path d="M 472,144 L 488,144" fill="none" stroke="black"/>
              <path d="M 72,160 L 112,160" fill="none" stroke="black"/>
              <path d="M 352,160 L 376,160" fill="none" stroke="black"/>
              <path d="M 464,160 L 488,160" fill="none" stroke="black"/>
              <path d="M 728,160 L 768,160" fill="none" stroke="black"/>
              <path d="M 376,176 L 464,176" fill="none" stroke="black"/>
              <path d="M 104,192 L 744,192" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="776,160 764,154.4 764,165.6" fill="black" transform="rotate(0,768,160)"/>
              <path class="jump" d="M 744,168 C 738,168 738,152 744,152" fill="none" stroke="black"/>
              <path class="jump" d="M 744,72 C 738,72 738,56 744,56" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="680,128 668,122.4 668,133.6" fill="black" transform="rotate(90,672,128)"/>
              <polygon class="arrowhead" points="600,128 588,122.4 588,133.6" fill="black" transform="rotate(90,592,128)"/>
              <path class="jump" d="M 592,120 C 586,120 586,104 592,104" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="480,144 468,138.4 468,149.6" fill="black" transform="rotate(180,472,144)"/>
              <polygon class="arrowhead" points="480,64 468,58.4 468,69.6" fill="black" transform="rotate(180,472,64)"/>
              <polygon class="arrowhead" points="376,144 364,138.4 364,149.6" fill="black" transform="rotate(0,368,144)"/>
              <polygon class="arrowhead" points="376,64 364,58.4 364,69.6" fill="black" transform="rotate(0,368,64)"/>
              <polygon class="arrowhead" points="304,128 292,122.4 292,133.6" fill="black" transform="rotate(90,296,128)"/>
              <polygon class="arrowhead" points="224,128 212,122.4 212,133.6" fill="black" transform="rotate(90,216,128)"/>
              <path class="jump" d="M 104,168 C 110,168 110,152 104,152" fill="none" stroke="black"/>
              <path class="jump" d="M 104,72 C 110,72 110,56 104,56" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="80,160 68,154.4 68,165.6" fill="black" transform="rotate(180,72,160)"/>
              <g class="text">
                <text x="36" y="52">Client's</text>
                <text x="160" y="52">CPaceOQUAKE</text>
                <text x="812" y="52">Server's</text>
                <text x="36" y="68">password</text>
                <text x="256" y="68">PRS</text>
                <text x="416" y="68">CPace</text>
                <text x="504" y="68">PRS</text>
                <text x="812" y="68">password</text>
                <text x="420" y="84">protocol</text>
                <text x="156" y="148">H(fullsid,</text>
                <text x="220" y="148">PRS,</text>
                <text x="260" y="148">tr1,</text>
                <text x="296" y="148">SK1</text>
                <text x="420" y="148">OQUAKE</text>
                <text x="532" y="148">H(fullsid,</text>
                <text x="596" y="148">PRS,</text>
                <text x="636" y="148">tr1,</text>
                <text x="676" y="148">SK1)</text>
                <text x="32" y="164">Session</text>
                <text x="156" y="164">H(fullsid,</text>
                <text x="220" y="164">tr1,</text>
                <text x="260" y="164">tr2,</text>
                <text x="300" y="164">SK1,</text>
                <text x="336" y="164">SK2</text>
                <text x="420" y="164">protocol</text>
                <text x="532" y="164">H(fullsid,</text>
                <text x="596" y="164">tr1,</text>
                <text x="636" y="164">tr2,</text>
                <text x="676" y="164">SK1,</text>
                <text x="712" y="164">SK2</text>
                <text x="808" y="164">Session</text>
                <text x="32" y="180">key</text>
                <text x="808" y="180">key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
            +-------------------------------------------------------------------------------+
Client's    | CPaceOQUAKE                     +----------+                                  |    Server's
password ---)-------------+---PRS------------>|  CPace   +<--PRS---------+------------------(--- password
            |             |         +---------+ protocol +-+             |                  |
            |             |         |         +----------+ |             |                  |
            |             |         |                      +-------------(---------+        |
            |             v         v         +----------+               v         v        |
            | H(fullsid, PRS, tr1, SK1)------>|  OQUAKE  +<--H(fullsid, PRS, tr1, SK1)      |
Session <---)-H(fullsid, tr1, tr2, SK1, SK2)--+ protocol +---H(fullsid, tr1, tr2, SK1, SK2)-(--> Session
  key       |                                 +----------+                                  |      key
            +-------------------------------------------------------------------------------+
]]></artwork>
        </artset>
        <t>Unlike OQUAKE, CPaceOQUAKE does not require a shared session identifier sid, although this
is strongly recommended. If no sid is provided, CPace will run without an sid, and OQUAKE
will use a random string generated with random material provided by both parties. If an
sid is provided, both CPace and OQUAKE will use this sid.</t>
        <t>An overview of the protocol flow is shown below. The protocol has four functions. Init and
InitiatorFinish are intended to be called by the initiator, and Respond and ResponderFinish
are intended to be called by the responder. The following subsections specify these functions.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="432" width="520" viewBox="0 0 520 432" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 112,96 L 112,240" fill="none" stroke="black"/>
              <path d="M 112,288 L 112,392" fill="none" stroke="black"/>
              <path d="M 352,56 L 352,144" fill="none" stroke="black"/>
              <path d="M 352,184 L 352,336" fill="none" stroke="black"/>
              <path d="M 72,48 L 392,48" fill="none" stroke="black"/>
              <path d="M 120,128 L 344,128" fill="none" stroke="black"/>
              <path d="M 120,224 L 344,224" fill="none" stroke="black"/>
              <path d="M 120,320 L 344,320" fill="none" stroke="black"/>
              <path d="M 72,400 L 392,400" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="352,320 340,314.4 340,325.6" fill="black" transform="rotate(0,344,320)"/>
              <polygon class="arrowhead" points="352,128 340,122.4 340,133.6" fill="black" transform="rotate(0,344,128)"/>
              <polygon class="arrowhead" points="128,224 116,218.4 116,229.6" fill="black" transform="rotate(180,120,224)"/>
              <g class="text">
                <text x="32" y="36">Client:</text>
                <text x="112" y="36">PRS,sid,U,S</text>
                <text x="240" y="36">Server:</text>
                <text x="320" y="36">PRS,sid,U,S</text>
                <text x="64" y="68">ctx1,</text>
                <text x="108" y="68">(s1,</text>
                <text x="152" y="68">msg1)</text>
                <text x="184" y="68">=</text>
                <text x="120" y="84">CPaceOQUAKE.Init(PRS,sid,U,S)</text>
                <text x="204" y="116">(s1,</text>
                <text x="248" y="116">msg1)</text>
                <text x="264" y="164">ctx2,</text>
                <text x="308" y="164">(s2,</text>
                <text x="352" y="164">msg2,</text>
                <text x="400" y="164">msg3)</text>
                <text x="432" y="164">=</text>
                <text x="324" y="180">CPaceOQUAKE.Respond(PRS,(s1,msg1),sid,U,S)</text>
                <text x="184" y="212">s2,</text>
                <text x="224" y="212">msg2,</text>
                <text x="268" y="212">msg3</text>
                <text x="80" y="260">client_key,</text>
                <text x="148" y="260">msg4</text>
                <text x="176" y="260">=</text>
                <text x="132" y="276">CPaceOQUAKE.InitiatorFinish(PRS,</text>
                <text x="280" y="276">...</text>
                <text x="56" y="292">(ctx1,s1),(s2</text>
                <text x="192" y="292">msg2,msg3),sid,U,S)</text>
                <text x="228" y="308">msg4</text>
                <text x="340" y="356">server_key</text>
                <text x="392" y="356">=</text>
                <text x="336" y="372">CPaceOQUAKE.ResponderFinish(ctx2,</text>
                <text x="496" y="372">msg4)</text>
                <text x="352" y="388">|</text>
                <text x="68" y="420">output</text>
                <text x="140" y="420">client_key</text>
                <text x="316" y="420">output</text>
                <text x="388" y="420">server_key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
Client: PRS,sid,U,S       Server: PRS,sid,U,S
        -----------------------------------------
     ctx1, (s1, msg1) =                    |
CPaceOQUAKE.Init(PRS,sid,U,S)              |
             |                             |
             |         (s1, msg1)          |
             |---------------------------->|
             |                             |
             |                ctx2, (s2, msg2, msg3) =
             |     CPaceOQUAKE.Respond(PRS,(s1,msg1),sid,U,S)
             |                             |
             |       s2, msg2, msg3        |
             |<----------------------------|
             |                             |
    client_key, msg4 =                     |
CPaceOQUAKE.InitiatorFinish(PRS, ...       |
(ctx1,s1),(s2,msg2,msg3),sid,U,S)          |
             |            msg4             |
             |---------------------------->|
             |                             |
             |                       server_key =
             |           CPaceOQUAKE.ResponderFinish(ctx2, msg4)
             |                             |
        -----------------------------------------
     output client_key              output server_key
]]></artwork>
        </artset>
        <section anchor="client-initiation">
          <name>Client Initiation</name>
          <t>The client initiates a CPace exchange with the server using input PRS, an optional session identifier sid,
and optional client and server identifiers U and S. The output of this process is some context for
completing the protocol and a protocol message. The client sends this message to the server.</t>
          <artwork><![CDATA[
CPaceOQUAKE.Init

Input:
- PRS, password-related string, a byte string
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- context, opaque state for the initiator to store
- msg, an encoded protocol message for the initiator to send to the responder

Parameters:
- CPace, parameterized instance of CPace

def Init(PRS, sid, U, S):
  ctx1, msg1 = CPace.Init(PRS, sid, U, S)
  s1 = random(32)
  init_msg = s1 || lv_encode(msg1)

  return (ctx1, s1), init_msg
]]></artwork>
        </section>
        <section anchor="server-response">
          <name>Server Response</name>
          <t>The server processes the client message using its input PRS, an optional session identifier sid, and
optional client and server identifiers U and S. The first output of this function is a context that
is used to finish the protocol later. The second output is a protocol message intended for the client.</t>
          <t>The server responds to the CPace session that the client initiated, and it initiates a new OQUAKE
session using both the PRS and the key established by CPace.</t>
          <t>The server <bcp14>MUST</bcp14> ensure that exactly one of <tt>s1</tt> and <tt>sid</tt> exists. It <bcp14>MUST</bcp14> abort if the message does
not have the correct length.</t>
          <artwork><![CDATA[
CPaceOQUAKE.Respond

Input:
- PRS, password-related string, a byte string
- init_msg, the message received from the client
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- context, opaque state for the responder to store
- msg, an encoded protocol message for the responder to send to the initiator

Parameters:
- CPace, parameterized instance of CPace
- OQUAKE, parameterized instance of OQUAKE
- DST, domain separation tag, a byte string

def Respond(PRS, init_msg, sid, U, S):
  s1, msg1 = init_msg[0..32], lv_decode(init_msg[32..])

  key1, msg2 = CPace.Respond(PRS, msg1, sid, U, S)
  key1A = KDF.Expand(key1, DST || "prskey", Nkey)
  key1B = KDF.Expand(key1, DST || "outputkey", Nkey)

  s2 = random(32)
  prk_extended_sid = KDF.Extract(s1 || s2, DST || "CPaceOQUAKE")
  extended_sid = KDF.Expand(prk_extended_sid, DST || "SID", 32)

  fullsid = encode_sid(extended_sid, U, S)

  prk_PRS2 = KDF.Extract(PRS, DST || "CPaceOQUAKE" || fullsid || msg1 || msg2 || key1A)
  PRS2 = KDF.Expand(prk_PRS2, DST || "PRS2", Nkey)

  ctx2, msg3 = OQUAKE.Init(PRS2, extended_sid, U, S)

  resp_msg = s2 || lv_encode(msg2) || lv_encode(msg3)

  return Context(fullsid, PRS, msg1, msg2, msg3, key1B, ctx2), resp_msg
]]></artwork>
        </section>
        <section anchor="client-finish">
          <name>Client Finish</name>
          <t>The client finishes the protocol by processing the server response. The client obtains a
shared secret and a final message intended for the server. It does so by finishing the
CPace session and responding to the OQUAKE session.</t>
          <t>The client must ensure that exactly one of (s1, s2) and sid exists.
The client should abort when the message does not have the correct length.</t>
          <artwork><![CDATA[
CPaceOQUAKE.InitiatorFinish

Input:
- PRS, password-related string, a byte string
- (ctx1, s1), the context generated by CPaceOQUAKE.Init
- resp_msg, the message received from the server
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- key, an N-byte shared secret
- msg, an encoded protocol message for the initiator to send to the responder

Parameters:
- CPace, parameterized instance of CPace
- OQUAKE, parameterized instance of OQUAKE
- DST, domain separation tag, a byte string

def InitiatorFinish(PRS, (ctx1, s1), resp_msg, sid, U, S):
  s2 = resp_msg[0..32]
  msg2 = lv_decode(resp_msg[32..])
  msg3 = lv_decode(resp_msg[32+len(msg2)..])

  key1 = CPace.Finish(ctx1, msg2, sid)
  key1A = KDF.Expand(key1, DST || "prskey", Nkey)
  key1B = KDF.Expand(key1, DST || "outputkey", Nkey)

  prk_extended_sid = KDF.Extract(s1 || s2, DST || "CPaceOQUAKE")
  extended_sid = KDF.Expand(prk_extended_sid, DST || "SID", 32)

  fullsid = encode_sid(extended_sid, U, S)
  prk_PRS2 = KDF.Extract(PRS, DST || "CPaceOQUAKE" || fullsid || msg1 || msg2 || key1A)
  PRS2 = KDF.Expand(prk_PRS2, DST || "PRS2", Nkey)

  key2, msg4 = OQUAKE.Respond(PRS2, msg3, extended_sid, U, S)

  prk_sessionkey = KDF.Extract(PRS, DST || "CPaceOQUAKE" || fullsid || msg1 || msg2 || msg3 || msg4 || key1B || key2)
  client_key = KDF.Expand(prk_sessionkey, DST || "sessionkey", Nkey)

  return client_key, msg4
]]></artwork>
        </section>
        <section anchor="server-finish">
          <name>Server Finish</name>
          <t>The server finishes the protocol by finising OQUAKE using the client's response, outputting a shared secret of N bytes.
It should abort when the message does not have the correct length.</t>
          <artwork><![CDATA[
CPaceOQUAKE.ResponderFinish

Input:
- ctx, context from the server's Response
- msg4, the message received from the server, a byte string

Output:
- key, an N-byte shared secret

Parameters:
- OQUAKE, parameterized instance of OQUAKE
- DST, domain separation tag, a byte string

def ResponderFinish(ctx, msg4):
  (fullsid, PRS, msg1, msg2, msg3, key1B, ctx2) = ctx

  key2 = OQUAKE.Finish(ctx2, msg4)

  prk_sessionkey = KDF.Extract(PRS, DST || "CPaceOQUAKE" || fullsid || msg1 || msg2 || msg3 || msg4 || key1B || key2)
  server_key = KDF.Expand(prk_sessionkey, DST || "sessionkey", Nkey)

  return server_key
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="CPaceOQUAKEplus">
      <name>CPaceOQUAKE+ Protocol</name>
      <t>CPaceOQUAKE+ is the 5 message aPAKE resulting from applying a KEM-based
PAKE-to-aPAKE transformation to CPaceOQUAKE. At a high level, this
involves running CPaceOQUAKE on a verifier of the client's password.
To ensure that the client does indeed know the password pertaining
to that verifier, there is an additional password confirmation
stage that uses seed derived from the password. Both the verifier and
the seed are derived from the password using a key stretching function.
The seed is later used to derive a KEM public key. We refer to the collection
of the verifier and this public key as 'the verifiers'.</t>
      <t>The CPaceOQUAKE+ protocol can be seen as a close variant (and a specific
instance) of the `augmented PAKE' construction presented in <xref target="LLH24"/> and in <xref target="Gu24"/>.</t>
      <section anchor="registering-clients">
        <name>Registering Clients</name>
        <t>This subsection specifies functions for generating the verifiers and
a protocol for registering clients.</t>
        <section anchor="gen-verifiers">
          <name>Generating Verifiers</name>
          <t>Verifiers are random-looking value derived from password-related strings
from which it is computionally impractical to derive the password-related
string. To make verifiers unique between different users with the same
password or servers that they interact with, we employ a salt, a user
account identifier, and an optional server identifier. The material
required for the verifiers is generated as follows:</t>
          <artwork><![CDATA[
GenVerifierMaterial

Input:
- PRS, password-related string, a byte string
- salt, client-specific salt, a byte string
- U and S, client and server identifiers

Output:
- ss, output shared secret, a byte string of 32 bytes
- resp_msg, encoded protocol message, a byte string

Parameters:
- KEM, a KEM instance
- KSF, a parameterized KSF instance
- DST, domain separation tag, a byte string

def GenVerifierMaterial(PRS, salt, U, S):
  verifier_seed = KSF.Stretch(DST || PRS || U || S, salt, Nverifier + KEM.Nseed)
  verifier = verifier_seed[0:Nverifier]
  seed = verifier_seed[Nverifier:Nverifier + KEM.Nseed]
  return verifier, seed
]]></artwork>
          <t>To derive an actual public key from the verifier material, we use the following function:</t>
          <artwork><![CDATA[
GenVerifiers

Input:
- PRS, password-related string, a byte string
- salt, client-specific salt, a byte string
- U and S, client and server identifiers

Output:
- ss, output shared secret, a byte string of 32 bytes
- resp_msg, encoded protocol message, a byte string

Parameters:
- KEM, a KEM instance

def GenVerifiers(PRS, salt, U, S):
  verifier, seed = GenVerifierMaterial(PRS, salt, U, S)
  (pk, sk) = KEM.DeriveKeyPair(seed)
  return verifier, pk
]]></artwork>
          <t>The server <bcp14>MUST</bcp14> store pk; it <bcp14>MUST NOT</bcp14> store seed.</t>
        </section>
        <section anchor="registration">
          <name>Registration</name>
          <t>The registration phase consists of one message sent from the client to the server. This message
contains the verifier, a public key, and 32-byte salt. The server stores this information corresponding to
the client for future use in the verification flow. This phase requires a secure channel from client to
server in order to transfer the password verifier and public key.
The salt can be sent in plain text.</t>
          <t>We recommend that the salt is a random byte string: <tt>salt = random(32)</tt>. However, in practice this
may require an additional communication flow, used by the server to send the salt to the client
before protocol CPaceOQUAKE+ starts. Instead, one may consider deriving the salt from some
client-specific value that it knows and can retain locally.</t>
          <t>A high level flow overview of the registration flow is below.</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="440" viewBox="0 0 440 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 104,80 L 104,168" fill="none" stroke="black"/>
                <path d="M 328,80 L 328,168" fill="none" stroke="black"/>
                <path d="M 64,48 L 368,48" fill="none" stroke="black"/>
                <path d="M 112,112 L 320,112" fill="none" stroke="black"/>
                <path d="M 64,176 L 368,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="328,112 316,106.4 316,117.6" fill="black" transform="rotate(0,320,112)"/>
                <g class="text">
                  <text x="32" y="36">Client:</text>
                  <text x="84" y="36">PRS,</text>
                  <text x="128" y="36">salt,</text>
                  <text x="164" y="36">U,</text>
                  <text x="184" y="36">S</text>
                  <text x="328" y="36">Server:</text>
                  <text x="376" y="36">N/A</text>
                  <text x="24" y="68">(v,</text>
                  <text x="56" y="68">pk)</text>
                  <text x="80" y="68">=</text>
                  <text x="160" y="68">GenVerifiers(PRS,</text>
                  <text x="256" y="68">salt,</text>
                  <text x="292" y="68">U,</text>
                  <text x="316" y="68">S)</text>
                  <text x="160" y="100">salt,</text>
                  <text x="196" y="100">v,</text>
                  <text x="224" y="100">pk,</text>
                  <text x="252" y="100">U,</text>
                  <text x="272" y="100">S</text>
                  <text x="256" y="148">Store</text>
                  <text x="304" y="148">(salt</text>
                  <text x="348" y="148">v,</text>
                  <text x="376" y="148">pk,</text>
                  <text x="404" y="148">U,</text>
                  <text x="428" y="148">S)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client: PRS, salt, U, S              Server: N/A
       ---------------------------------------
 (v, pk) = GenVerifiers(PRS, salt, U, S)
            |                           |
            |    salt, v, pk, U, S      |
            |-------------------------->|
            |                           |
            |                Store (salt, v, pk, U, S)
            |                           |
       ---------------------------------------
]]></artwork>
          </artset>
        </section>
      </section>
      <section anchor="pcp">
        <name>The Password Confirmation Stage</name>
        <t>In the password confirmation (PC) stage, the client proves knowledge
of its password without revealing it. It uses the registered verifiers from the
previous subsection. To do so securely, it uses the key established by CPaceOQUAKE,
which allows it to realize a confidential but unauthenticated channel.
In other words, this password confirmation stage cannot be used by itself.
This PC stage is parameterized by a KEM, KDF, KSF, and is additionally bound
to the preceding protocol via an agreed-upon transcript (tx); see <xref target="configurations"/>
for specific parameter configurations.</t>
        <t>The password confirmation is a two-round challenge-response flow between the
server and client. In particular, the server challenges the client to prove
knowledge of its password. More precisely, it challenges the client to prove
knowledge of a seed, derived from the GenVerifierMaterial function (and
in turn derived from the password using a key stretching function).
Both client and server share a symmetric key as input. Additionally, the server
has the client's public key and salt stored from the previous registration flow.</t>
        <t>A high level overview of this flow is below.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="568" viewBox="0 0 568 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 104,80 L 104,128" fill="none" stroke="black"/>
              <path d="M 104,160 L 104,208" fill="none" stroke="black"/>
              <path d="M 328,80 L 328,128" fill="none" stroke="black"/>
              <path d="M 328,160 L 328,208" fill="none" stroke="black"/>
              <path d="M 64,48 L 368,48" fill="none" stroke="black"/>
              <path d="M 112,112 L 320,112" fill="none" stroke="black"/>
              <path d="M 112,192 L 320,192" fill="none" stroke="black"/>
              <path d="M 64,256 L 368,256" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="328,192 316,186.4 316,197.6" fill="black" transform="rotate(0,320,192)"/>
              <polygon class="arrowhead" points="120,112 108,106.4 108,117.6" fill="black" transform="rotate(180,112,112)"/>
              <g class="text">
                <text x="32" y="36">Client:</text>
                <text x="80" y="36">SK,</text>
                <text x="112" y="36">tx,</text>
                <text x="152" y="36">seed,</text>
                <text x="196" y="36">sid,</text>
                <text x="228" y="36">U,</text>
                <text x="248" y="36">S</text>
                <text x="328" y="36">Server:</text>
                <text x="376" y="36">SK,</text>
                <text x="408" y="36">tx,</text>
                <text x="440" y="36">pk,</text>
                <text x="476" y="36">sid,</text>
                <text x="508" y="36">U,</text>
                <text x="528" y="36">S</text>
                <text x="100" y="68">ctx,</text>
                <text x="160" y="68">challenge</text>
                <text x="208" y="68">=</text>
                <text x="284" y="68">PC-Challenge(SK,</text>
                <text x="368" y="68">tx,</text>
                <text x="400" y="68">pk,</text>
                <text x="436" y="68">sid,</text>
                <text x="468" y="68">U,</text>
                <text x="492" y="68">S)</text>
                <text x="216" y="100">challenge</text>
                <text x="48" y="148">client_key,</text>
                <text x="132" y="148">response</text>
                <text x="176" y="148">=</text>
                <text x="248" y="148">PC-Response(SK,</text>
                <text x="328" y="148">tx,</text>
                <text x="368" y="148">seed,</text>
                <text x="436" y="148">challenge,</text>
                <text x="500" y="148">sid,</text>
                <text x="532" y="148">U,</text>
                <text x="556" y="148">S)</text>
                <text x="212" y="180">response</text>
                <text x="172" y="228">server_key</text>
                <text x="224" y="228">=</text>
                <text x="292" y="228">PC-Verify(ctx,</text>
                <text x="392" y="228">response)</text>
                <text x="104" y="244">|</text>
                <text x="328" y="244">|</text>
                <text x="44" y="276">output</text>
                <text x="116" y="276">client_key</text>
                <text x="276" y="276">output</text>
                <text x="348" y="276">server_key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
Client: SK, tx, seed, sid, U, S      Server: SK, tx, pk, sid, U, S
       ---------------------------------------
          ctx, challenge = PC-Challenge(SK, tx, pk, sid, U, S)
            |                           |
            |         challenge         |
            |<--------------------------|
            |                           |
client_key, response = PC-Response(SK, tx, seed, challenge, sid, U, S)
            |                           |
            |         response          |
            |-------------------------->|
            |                           |
                server_key = PC-Verify(ctx, response)
            |                           |
       ---------------------------------------
  output client_key            output server_key
]]></artwork>
        </artset>
        <section anchor="server-challenge">
          <name>Server Challenge</name>
          <t>To construct the challenge, the server encapsulates to the client's public
key. From the resulting shared secret, it then derives password confirmation
values and a new shared secret. The challenge message is the ciphertext encrypted
using a one-time pad derived from the shared secret. The password confirmation
values are byte strings of length <tt>Nkc</tt>.</t>
          <t>The implementation <bcp14>MUST NOT</bcp14> reveal server_key from the context.</t>
          <artwork><![CDATA[
PC-Challenge

Input:
- SK, 32-byte symmetric key, a byte string
- transcript, the transcript from previously executed protocols to which this protocol is bound, a byte string
- pk, client-registered public key, a KEM public key
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- context, opaque state for the server to store values to complete the protocol
- challenge, an encoded protocol message for the server to send to the client

Parameters:
- KEM, a KEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

def PC-Challenge(SK, transcript, pk, sid, U, S):
  (c, k) = KEM.Encaps(pk)
  r = KDF.Expand(SK, DST || "OTP", Nct)
  enc_c = XOR(c, r)

  confirm_input = encode_sid(sid, U, S) || enc_c || transcript

  prk_k_h1 = KDF.Extract(SK, DST || "h1" || confirm_input)
  prk_k_h2 = KDF.Extract(SK, DST || "h2" || confirm_input || k)

  // Derive h1 from the full transcript excluding k
  client_confirm = KDF.Expand(prk_k_h1, DST || "client_confirm", Nkc)

  // Derive h2 || SK from the full transcript including k
  server_confirm = KDF.Expand(prk_k_h2, DST || "server_confirm", Nkc)
  server_key = KDF.Expand(prk_k_h2, DST || "key", Nkey)

  challenge = (enc_c, client_confirm)

  return Context(server_confirm, server_key), challenge
]]></artwork>
        </section>
        <section anchor="client-response">
          <name>Client Response</name>
          <t>Upon receipt of the challenge, the client recovers the KEM ciphertext by decrypting
the one-time pad ciphertext included in the challenge, using the key derived from the shared secret.
It then uses the seed to re-derive the KEM key pair, using the same procedure followed during
the registration flow. The client then decapsulates the KEM ciphertext to recover
the shared secret and derive the same password confirmation values and new
shared secret as the server.</t>
          <t>The client then checks that the server-provided confirmation value matches its
own and aborts if not. Otherwise, it returns its own password confirmation value.
The client outputs the new shared secret as its output.</t>
          <artwork><![CDATA[
PC-Response

Input:
- SK, 32-byte symmetric key, a byte string
- transcript, the transcript from previously executed protocols to which this protocol is bound, a byte string
- seed, seed used to derive KEM public key
- challenge, an encoded protocol message for the server to send to the client
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- client_key, a 32-byte string
- response, an encoded protocol message for the client to send to the server

Exceptions:
- AuthenticationError, raised when the password confirmation values do not match

Parameters:
- KEM, a KEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

def PC-Response(SK, transcript, seed, challenge, sid, U, S):
  (enc_c, client_confirm_target) = challenge
  r = KDF.Expand(SK, DST || "OTP", Nct)
  c = XOR(enc_c, r)

  (pk, sk) = KEM.DeriveKeyPair(seed)

  try:
    k = KEM.Decaps(sk, c)

    confirm_input = encode_sid(sid, U, S) || enc_c || transcript

    prk_k_h1 = KDF.Extract(SK, DST || "h1" || confirm_input)
    prk_k_h2 = KDF.Extract(SK, DST || "h2" || confirm_input || k)

    // Derive h1 from the full transcript excluding k
    client_confirm = KDF.Expand(prk_k_h1, DST || "client_confirm", Nkc)

    // Derive h2 || SK from the full transcript including k
    server_confirm = KDF.Expand(prk_k_h2, DST || "server_confirm", Nkc)
    client_key = KDF.Expand(prk_k_h2, DST || "key", Nkey)

    if client_confirm != client_confirm_target:
      raise AuthenticationError

    return client_key, server_confirm
  catch DecapsError:
    raise AuthenticationError
]]></artwork>
        </section>
        <section anchor="server-verify">
          <name>Server Verify</name>
          <t>Upon receipt of the response, the server validates that the password confirmation
value matches its own value. If the value does not match, the server aborts.
Otherwise, the server outputs the new shared secret as its output.</t>
          <artwork><![CDATA[
PC-Verify

Input:
- context, opaque context produced by Challenge
- server_confirm_target, client's response message, a byte string

Output:
- server_key, a 32-byte string

Exceptions:
- AuthenticationError, raised when the password confirmation values do not match

Parameters:

def PC-Verify(context, server_confirm_target):
  (server_confirm, server_key) = context
  if server_confirm != server_confirm_target:
    raise AuthenticationError
  return server_key
]]></artwork>
        </section>
      </section>
      <section anchor="composition-of-cpaceoquake-password-confirmation">
        <name>Composition of CPaceOQUAKE &amp; Password Confirmation</name>
        <t>The composition of CPaceOQUAKE and the password confirmation stage is
strictly sequential. First, the parties run CPaceOQUAKE using the verifier.
The client recovers this verifier using the <tt>GenVerifierMaterial</tt> function.
After that, the parties proceed with password confirmation, which is
initiated by the server using the stored public key. The client uses the
seed that was also produced by <tt>GenVerifierMaterial</tt> to prove knowledge of
the password. This seed <bcp14>MUST</bcp14> remain secret to prevent impersonation. An
overview of the composition is below.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="400" width="584" viewBox="0 0 584 400" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 96,32 L 96,88" fill="none" stroke="black"/>
              <path d="M 96,104 L 96,344" fill="none" stroke="black"/>
              <path d="M 96,360 L 96,384" fill="none" stroke="black"/>
              <path d="M 168,112 L 168,320" fill="none" stroke="black"/>
              <path d="M 200,112 L 200,144" fill="none" stroke="black"/>
              <path d="M 296,208 L 296,240" fill="none" stroke="black"/>
              <path d="M 296,272 L 296,304" fill="none" stroke="black"/>
              <path d="M 312,64 L 312,240" fill="none" stroke="black"/>
              <path d="M 312,272 L 312,288" fill="none" stroke="black"/>
              <path d="M 312,336 L 312,352" fill="none" stroke="black"/>
              <path d="M 328,96 L 328,144" fill="none" stroke="black"/>
              <path d="M 328,176 L 328,224" fill="none" stroke="black"/>
              <path d="M 416,96 L 416,144" fill="none" stroke="black"/>
              <path d="M 416,176 L 416,224" fill="none" stroke="black"/>
              <path d="M 432,64 L 432,240" fill="none" stroke="black"/>
              <path d="M 432,272 L 432,288" fill="none" stroke="black"/>
              <path d="M 432,336 L 432,352" fill="none" stroke="black"/>
              <path d="M 448,208 L 448,240" fill="none" stroke="black"/>
              <path d="M 448,272 L 448,304" fill="none" stroke="black"/>
              <path d="M 472,32 L 472,136" fill="none" stroke="black"/>
              <path d="M 472,152 L 472,312" fill="none" stroke="black"/>
              <path d="M 472,328 L 472,344" fill="none" stroke="black"/>
              <path d="M 472,360 L 472,384" fill="none" stroke="black"/>
              <path d="M 96,32 L 472,32" fill="none" stroke="black"/>
              <path d="M 312,64 L 432,64" fill="none" stroke="black"/>
              <path d="M 136,80 L 280,80" fill="none" stroke="black"/>
              <path d="M 80,96 L 112,96" fill="none" stroke="black"/>
              <path d="M 328,96 L 416,96" fill="none" stroke="black"/>
              <path d="M 136,112 L 280,112" fill="none" stroke="black"/>
              <path d="M 200,144 L 216,144" fill="none" stroke="black"/>
              <path d="M 288,144 L 304,144" fill="none" stroke="black"/>
              <path d="M 328,144 L 416,144" fill="none" stroke="black"/>
              <path d="M 440,144 L 488,144" fill="none" stroke="black"/>
              <path d="M 328,176 L 416,176" fill="none" stroke="black"/>
              <path d="M 296,208 L 312,208" fill="none" stroke="black"/>
              <path d="M 432,208 L 448,208" fill="none" stroke="black"/>
              <path d="M 328,224 L 416,224" fill="none" stroke="black"/>
              <path d="M 312,240 L 432,240" fill="none" stroke="black"/>
              <path d="M 328,256 L 416,256" fill="none" stroke="black"/>
              <path d="M 296,304 L 312,304" fill="none" stroke="black"/>
              <path d="M 432,304 L 448,304" fill="none" stroke="black"/>
              <path d="M 168,320 L 216,320" fill="none" stroke="black"/>
              <path d="M 256,320 L 312,320" fill="none" stroke="black"/>
              <path d="M 432,320 L 488,320" fill="none" stroke="black"/>
              <path d="M 72,352 L 312,352" fill="none" stroke="black"/>
              <path d="M 432,352 L 496,352" fill="none" stroke="black"/>
              <path d="M 328,368 L 416,368" fill="none" stroke="black"/>
              <path d="M 96,384 L 472,384" fill="none" stroke="black"/>
              <path d="M 136,80 C 127.16936,80 120,87.16936 120,96" fill="none" stroke="black"/>
              <path d="M 280,80 C 288.83064,80 296,87.16936 296,96" fill="none" stroke="black"/>
              <path d="M 136,112 C 127.16936,112 120,104.83064 120,96" fill="none" stroke="black"/>
              <path d="M 280,112 C 288.83064,112 296,104.83064 296,96" fill="none" stroke="black"/>
              <path d="M 328,256 C 319.16936,256 312,263.16936 312,272" fill="none" stroke="black"/>
              <path d="M 416,256 C 424.83064,256 432,263.16936 432,272" fill="none" stroke="black"/>
              <path d="M 328,368 C 319.16936,368 312,360.83064 312,352" fill="none" stroke="black"/>
              <path d="M 416,368 C 424.83064,368 432,360.83064 432,352" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="504,352 492,346.4 492,357.6" fill="black" transform="rotate(0,496,352)"/>
              <path class="jump" d="M 472,360 C 466,360 466,344 472,344" fill="none" stroke="black"/>
              <path class="jump" d="M 472,328 C 466,328 466,312 472,312" fill="none" stroke="black"/>
              <path class="jump" d="M 472,152 C 466,152 466,136 472,136" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="448,144 436,138.4 436,149.6" fill="black" transform="rotate(180,440,144)"/>
              <polygon class="arrowhead" points="440,320 428,314.4 428,325.6" fill="black" transform="rotate(180,432,320)"/>
              <polygon class="arrowhead" points="440,304 428,298.4 428,309.6" fill="black" transform="rotate(180,432,304)"/>
              <polygon class="arrowhead" points="320,320 308,314.4 308,325.6" fill="black" transform="rotate(0,312,320)"/>
              <polygon class="arrowhead" points="320,304 308,298.4 308,309.6" fill="black" transform="rotate(0,312,304)"/>
              <polygon class="arrowhead" points="312,144 300,138.4 300,149.6" fill="black" transform="rotate(0,304,144)"/>
              <polygon class="arrowhead" points="120,96 108,90.4 108,101.6" fill="black" transform="rotate(0,112,96)"/>
              <path class="jump" d="M 96,360 C 102,360 102,344 96,344" fill="none" stroke="black"/>
              <path class="jump" d="M 96,104 C 102,104 102,88 96,88" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="80,352 68,346.4 68,357.6" fill="black" transform="rotate(180,72,352)"/>
              <g class="text">
                <text x="156" y="52">CPaceOQUAKE+</text>
                <text x="36" y="84">Client's</text>
                <text x="368" y="84">CPaceOQUAKE</text>
                <text x="36" y="100">password</text>
                <text x="208" y="100">GenVerifierMaterial</text>
                <text x="368" y="116">CPace</text>
                <text x="372" y="132">protocol</text>
                <text x="252" y="148">Verifier</text>
                <text x="532" y="148">Verifier</text>
                <text x="372" y="196">OQUAKE</text>
                <text x="372" y="212">protocol</text>
                <text x="292" y="260">SK</text>
                <text x="452" y="260">SK</text>
                <text x="372" y="308">Password</text>
                <text x="236" y="324">seed</text>
                <text x="372" y="324">confirmation</text>
                <text x="524" y="324">Public</text>
                <text x="568" y="324">key</text>
                <text x="32" y="356">Session</text>
                <text x="536" y="356">Session</text>
                <text x="32" y="372">key</text>
                <text x="536" y="372">key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
           +----------------------------------------------+
           | CPaceOQUAKE+                                 |
           |                          +--------------+    |
Client's   |   .-------------------.  | CPaceOQUAKE  |    |
password --)->| GenVerifierMaterial + | +----------+ |    |
           |   '----+---+----------'  | |  CPace   | |    |
           |        |   |             | | protocol | |    |
           |        |   +--Verifier-->| +----------+ |<---(-- Verifier
           |        |                 |              |    |
           |        |                 | +----------+ |    |
           |        |                 | |  OQUAKE  | |    |
           |        |               +-+ | protocol | +-+  |
           |        |               | | +----------+ | |  |
           |        |               | +--------------+ |  |
           |        |              SK  .------------.  SK |
           |        |               | |              | |  |
           |        |               | |              | |  |
           |        |               +->   Password   <-+  |
           |        +------seed-------> confirmation <----(-- Public key
           |                          |              |    |
Session <--)--------------------------+              +----(--> Session
  key      |                           '------------'     |      key
           +----------------------------------------------+
]]></artwork>
        </artset>
        <t>Upon successful completion of the entire protocol, the client and server will share a
symmetric key that was authenticated by knowledge of the password. The protocol
aborts if the password did not match. The protocol flows are shown below.
Note here that if the client does not know the salt, the server must send
it to the client before the protocol starts, which it can do in plain text.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="608" width="568" viewBox="0 0 568 608" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 104,96 L 104,224" fill="none" stroke="black"/>
              <path d="M 104,272 L 104,432" fill="none" stroke="black"/>
              <path d="M 104,480 L 104,568" fill="none" stroke="black"/>
              <path d="M 384,56 L 384,320" fill="none" stroke="black"/>
              <path d="M 384,384 L 384,448" fill="none" stroke="black"/>
              <path d="M 384,480 L 384,536" fill="none" stroke="black"/>
              <path d="M 88,48 L 400,48" fill="none" stroke="black"/>
              <path d="M 112,128 L 376,128" fill="none" stroke="black"/>
              <path d="M 112,208 L 376,208" fill="none" stroke="black"/>
              <path d="M 112,304 L 376,304" fill="none" stroke="black"/>
              <path d="M 112,416 L 376,416" fill="none" stroke="black"/>
              <path d="M 112,512 L 376,512" fill="none" stroke="black"/>
              <path d="M 88,576 L 400,576" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="392,168 380,162.4 380,173.6" fill="black" transform="rotate(90,384,168)"/>
              <polygon class="arrowhead" points="384,512 372,506.4 372,517.6" fill="black" transform="rotate(0,376,512)"/>
              <polygon class="arrowhead" points="384,304 372,298.4 372,309.6" fill="black" transform="rotate(0,376,304)"/>
              <polygon class="arrowhead" points="384,128 372,122.4 372,133.6" fill="black" transform="rotate(0,376,128)"/>
              <polygon class="arrowhead" points="120,416 108,410.4 108,421.6" fill="black" transform="rotate(180,112,416)"/>
              <polygon class="arrowhead" points="120,208 108,202.4 108,213.6" fill="black" transform="rotate(180,112,208)"/>
              <g class="text">
                <text x="32" y="36">Client:</text>
                <text x="132" y="36">PRS,salt,U,S,sid</text>
                <text x="272" y="36">Server:</text>
                <text x="356" y="36">v,pk,U,S,sid</text>
                <text x="16" y="68">(v,</text>
                <text x="56" y="68">seed)</text>
                <text x="88" y="68">=</text>
                <text x="232" y="68">GenVerifierMaterial(PRS,salt,U,S)</text>
                <text x="24" y="84">ctx1,</text>
                <text x="68" y="84">msg1</text>
                <text x="96" y="84">=</text>
                <text x="216" y="84">CPaceOQUAKE.Init(v,sid,U,S)</text>
                <text x="244" y="116">msg1</text>
                <text x="136" y="164">ctx2,</text>
                <text x="180" y="164">msg2</text>
                <text x="208" y="164">=</text>
                <text x="300" y="164">CPaceOQUAKE.Respond(</text>
                <text x="444" y="164">,msg1,sid,U,S)</text>
                <text x="244" y="196">msg2</text>
                <text x="16" y="244">SK,</text>
                <text x="52" y="244">msg3</text>
                <text x="80" y="244">=</text>
                <text x="204" y="244">CPaceOQUAKE.InitiatorFinish(</text>
                <text x="100" y="260">v,ctx1,msg2,sid,U,S)</text>
                <text x="244" y="292">msg3</text>
                <text x="228" y="340">SK</text>
                <text x="248" y="340">=</text>
                <text x="412" y="340">CPaceOQUAKE.ResponderFinish(ctx2,msg3)</text>
                <text x="228" y="356">tx</text>
                <text x="248" y="356">=</text>
                <text x="276" y="356">msg1</text>
                <text x="308" y="356">||</text>
                <text x="340" y="356">msg2</text>
                <text x="372" y="356">||</text>
                <text x="404" y="356">msg3</text>
                <text x="232" y="372">ctx3,</text>
                <text x="276" y="372">chal</text>
                <text x="304" y="372">=</text>
                <text x="436" y="372">PC-Challenge(SK,tx,pk,sid,U,S)</text>
                <text x="244" y="404">chal</text>
                <text x="60" y="452">tx</text>
                <text x="80" y="452">=</text>
                <text x="108" y="452">msg1</text>
                <text x="140" y="452">||</text>
                <text x="172" y="452">msg2</text>
                <text x="204" y="452">||</text>
                <text x="236" y="452">msg3</text>
                <text x="48" y="468">client_key,</text>
                <text x="116" y="468">resp</text>
                <text x="144" y="468">=</text>
                <text x="300" y="468">PC-Response(SK,tx,seed,chal,sid,U,S)</text>
                <text x="244" y="500">resp</text>
                <text x="300" y="548">server_key</text>
                <text x="352" y="548">=</text>
                <text x="424" y="548">PC-Verify(ctx2,</text>
                <text x="512" y="548">resp)</text>
                <text x="384" y="564">|</text>
                <text x="76" y="596">output</text>
                <text x="148" y="596">client_key</text>
                <text x="348" y="596">output</text>
                <text x="420" y="596">server_key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
Client: PRS,salt,U,S,sid      Server: v,pk,U,S,sid
          ----------------------------------------
(v, seed) = GenVerifierMaterial(PRS,salt,U,S)  |
ctx1, msg1 = CPaceOQUAKE.Init(v,sid,U,S)       |
            |                                  |
            |               msg1               |
            |--------------------------------->|
            |                                  |
            | ctx2, msg2 = CPaceOQUAKE.Respond(v,msg1,sid,U,S)
            |                                  |
            |               msg2               |
            |<---------------------------------|
            |                                  |
SK, msg3 = CPaceOQUAKE.InitiatorFinish(        |
  v,ctx1,msg2,sid,U,S)                         |
            |                                  |
            |               msg3               |
            |--------------------------------->|
            |                                  |
            |              SK = CPaceOQUAKE.ResponderFinish(ctx2,msg3)
            |              tx = msg1 || msg2 || msg3
            |             ctx3, chal = PC-Challenge(SK,tx,pk,sid,U,S)
            |                                  |
            |               chal               |
            |<---------------------------------|
            |                                  |
      tx = msg1 || msg2 || msg3                |
client_key, resp = PC-Response(SK,tx,seed,chal,sid,U,S)
            |                                  |
            |               resp               |
            |--------------------------------->|
            |                                  |
            |                   server_key = PC-Verify(ctx2, resp)
            |                                  |
          ----------------------------------------
      output client_key                 output server_key
]]></artwork>
        </artset>
      </section>
    </section>
    <section anchor="configurations">
      <name>CPaceOQUAKE+ Configurations</name>
      <t>CPaceOQUAKE+ is instantiated by selecting a configuration of a group and hash function
for the CPace protocol, a KEM, KDF, KSF, for password confirmation, and a KEM and KDF
for CPaceOQUAKE, and a general purpose cryptographic hash function H. The KEM, KDF,
are not required to be the same, so they are distinguished by "PC-" and "PAKE-"
prefixes, e.g., PC-KDF and PAKE-KDF are the KDFs for the password confirmation stage
and the CPaceOQUAKE protocol, respectively.</t>
      <t>The <bcp14>RECOMMENDED</bcp14> configuration is below.</t>
      <ul spacing="normal">
        <li>
          <t>CPace-Group: CPACE-RISTR255-SHA512 <xref section="4" sectionFormat="of" target="CPACE"/></t>
        </li>
        <li>
          <t>CPace-Hash: SHA-512</t>
        </li>
        <li>
          <t>KEM: X-Wing <xref target="XWING"/>, where Nseed = 32, Nct = 1120, and Npk = 1216.</t>
        </li>
        <li>
          <t>PC-KDF: HKDF-SHA-256</t>
        </li>
        <li>
          <t>PC-KSF: Argon2id(S = zeroes(16), p = 4, T = Nh, m = 2^21, t = 1, v = 0x13, K = nil, X = nil, y = 2) <xref target="ARGON2"/></t>
        </li>
        <li>
          <t>BUA-sKEM: ML-BUA-sKEM1024 <xref target="deps-BUA-sKEM"/>, where Kemeleon.sec_param = 256, Nseed = 64, Npk = 1594, and Nct = 1568.</t>
        </li>
        <li>
          <t>PAKE-KDF: HKDF-SHA-256</t>
        </li>
        <li>
          <t>H: SHA256</t>
        </li>
        <li>
          <t>DST: "1b3abc3cd05e8054e8399bc38dfcbc1321d2e1b02da335ed1e8031ef5199f672" (a randomly generated 32-byte string)</t>
        </li>
      </ul>
      <t>The <bcp14>RECOMMENDED</bcp14> parameters are (see <xref target="params"/>):</t>
      <ul spacing="normal">
        <li>
          <t>Nverifier = 32</t>
        </li>
        <li>
          <t>Nkc = 64</t>
        </li>
        <li>
          <t>Nsec = 32</t>
        </li>
        <li>
          <t>Nkey = 32, this is achieved by choosing H in CPace with H.b_in_bytes = 32</t>
        </li>
      </ul>
      <t>Other documents can define configurations as needed for their use case, subject to the following requirements:</t>
      <ol spacing="normal" type="1"><li>
          <t>KEM <bcp14>MUST</bcp14> be a hybrid KEM, i.e., one that achieves both classical and post-quantum security.</t>
        </li>
        <li>
          <t>The parameters must be chosen so they correspond with this KEM. E.g., Nseed must have the correct length.</t>
        </li>
      </ol>
      <t>For instance, one possible additional configuration is as follows.</t>
      <ul spacing="normal">
        <li>
          <t>CPace-Group: CPACE-P256<em>XMD:SHA-256_SSWU_NU</em>-SHA256 <xref section="4" sectionFormat="of" target="CPACE"/></t>
        </li>
        <li>
          <t>CPace-Hash: SHA-256</t>
        </li>
        <li>
          <t>KEM: X-Wing <xref target="XWING"/>, where Nseed = 32, Nct = 1120, and Npk = 1216.</t>
        </li>
        <li>
          <t>PC-KDF: HKDF-SHA-256</t>
        </li>
        <li>
          <t>PC-KSF: Scrypt(N = 32768, r = 8, p = 1) <xref target="SCRYPT"/></t>
        </li>
        <li>
          <t>BUA-sKEM: ML-BUA-sKEM1024 <xref target="deps-BUA-sKEM"/>, where Kemeleon.sec_param = 256, Nseed = 64, Npk = 1594, and Nct = 1568.</t>
        </li>
        <li>
          <t>PAKE-KDF: HKDF-SHA-256</t>
        </li>
        <li>
          <t>H: SHA256</t>
        </li>
        <li>
          <t>DST: "b840fa4d4b4caec9e25d13d8c016cfe93e7468d54e936490bd0b0a3ffca1a01b" (a randomly generated 32-byte string)</t>
        </li>
      </ul>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <t>Some functions included in this specification are fallible (as noted by their ability
to raise exceptions). The explicit errors generated
throughout this specification, along with conditions that lead to each error,
are as follows:</t>
      <ul spacing="normal">
        <li>
          <t>AuthenticationError: The PC protocol fails password confirmation checks at the
client or server; <xref target="pcp"/></t>
        </li>
      </ul>
      <t>Beyond these explicit errors, CPaceOQUAKE+ implementations can produce implicit errors.
For example, if protocol messages sent between client and server do not match
their expected size, an implementation should produce an error.</t>
      <t>The errors in this document are meant as a guide for implementors. They are not an
exhaustive list of all the errors an implementation might emit. For example, an
implementation might run out of memory.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This section discusses security considerations for the protocols specified in
this document.</t>
      <section anchor="hybrid-design">
        <name>Hybrid Design</name>
        <t>CPaceOQUAKE and CPaceOQUAKE+ are hybrid PAKE protocols, meaning that the overall
protocol remains secure so long as either the classical assumptions underlying
CPace, i.e., the gap Diffie-Hellman assumption, or the post-quantum assumptions,
i.e., D-MLWE used by OQUAKE, hold. This protects against vulnerabilities in
either the classical or post-quantum components.</t>
        <t>Moreover, OQUAKE does not unconditionally hide the password. If the underlying
security assumptions were to break, then the password would be revealed to the
attacker. The reason for this is that an attacker that can break the D-MLWE
assumption can distinguish actual ML-KEM public keys and ciphertexts from
random bitstrings. For OQUAKE, this would allow the attacker to perform offline
dictionary attacks on the password. This is also the reason a parallel
combiner cannot provide the desired hybrid security (see <xref target="cpacequake-composition"/>):
if one PAKE is not unconditionally password hiding, breaking its underlying
assumption can yield the password, and learning the password is sufficient to
also break the other PAKE. In contrast, the sequential hybrid variants do not
suffer from the same weakness: the input to OQUAKE is <tt>PRS2</tt>, derived via
<tt>KDF.Extract/Expand</tt> over <tt>(fullsid, msg1, msg2, key1A)</tt>, not the original PRS.
Performing an offline dictionary attack against the original PRS would require
the attacker to also guess <tt>key1A</tt>, the CPace-derived key, which is computationally
indistinguishable from a random value under the gap Diffie-Hellman assumption.</t>
        <t>The benefits of this hybrid protection come at the cost of protocol and round
complexity. From a protocol perspective, beyond two independent PAKEs treated
nearly as black boxes, additional protocol logic is needed to combine the PAKEs
together and produce a shared secret based on both PAKEs. From a round
perspective, the hybrid PAKE introduces another round trip, complicating integration
into higher-level protocols like TLS. Specifically, integrating CPaceOQUAKE+ into
TLS would require the following five messages:</t>
        <ul spacing="normal">
          <li>
            <t>Client -&gt; Server: ClientHello carrying msg1</t>
          </li>
          <li>
            <t>Server -&gt; Client: ServerHello carrying msg2</t>
          </li>
          <li>
            <t>Client -&gt; Server: ClientPAKEMessage carrying msg3 (this is a new message, but sent in an existing round)</t>
          </li>
          <li>
            <t>Server -&gt; Client: Finished</t>
          </li>
          <li>
            <t>Client -&gt; Server: Finished</t>
          </li>
        </ul>
        <t>Compared to the basic TLS handshake, which has three messages:</t>
        <ul spacing="normal">
          <li>
            <t>Client -&gt; Server: ClientHello</t>
          </li>
          <li>
            <t>Server -&gt; Client: ServerHello...Finished</t>
          </li>
          <li>
            <t>Client -&gt; Server: Finished</t>
          </li>
        </ul>
        <t>Finally, the hybrid protocol is comparatively new and has not yet received significant
peer review (compared to the non-hybrid PAKEs). However, the backing analysis has
been independently analyzed by at least three different groups, improving overall confidence
in the design.</t>
      </section>
      <section anchor="identities">
        <name>Identities</name>
        <t>Client and server identities are essential to authenticated key exchange protocols,
and PAKEs are no exception. This section discusses the role and importance of
identities in the PAKE protocols specified in this document.</t>
        <section anchor="symmetric-identities">
          <name>Symmetric PAKE identities</name>
          <t>PAKEs are often analyzed in the universal composability (UC) framework,
which imposes several requirements on the protocols: (1) the existence
of a globally-unique session identifer associated with each protocol invocation,
and (2) unique party identifiers. Both are considered as inputs to PAKEs, along
with the password itself. In practice, however, computing or agreeing on session
and party identifiers is non-trivial and cumbersome. For example, agreeing on a
globally unique session identifier requires a protocol to run before the PAKE.
Moreover, assigning identifiers to parties -- especially in symmetric PAKE settings --
is problematic as there are rarely pragmatic choices to be made for each party's
identifier. IP addresses are not always unique, PKI or some other registry
mechanism for assigning names may not exist, and so on.</t>
          <t>Intuitively, in symmetric settings, passwords are the only secret input to the
PAKE protocol; party identities are assumed to be public. As such, an adversary
is assumed to know these identifiers. Fortunately, there exists a UC
model in which symmetric PAKEs such as CPace are proven secure
without requiring party or session identifiers -- the bare PAKE
model <xref target="BARE-PAKE"/>.
The UC bare PAKE model, and proof of security for CPace in this model,
demonstrate that PAKEs are universally composable without relying on
unique party or session identifiers. We believe that the current proof
of security of OQUAKE in <xref target="ABJ25"/> can be extended to show that NoIC,
the basis of OQUAKE, realizes the Bare PAKE model as well, although
we note that that this proof has not been published yet.</t>
          <t>As such, for the PAKEs in <xref target="CPaceOQUAKE"/>, both the party and session identifier
are optional. Applications are free to choose values for these identifiers
if applicable, but they are not required for security.</t>
          <t>[[OPEN ISSUE: adjust the requirements for the identities in OQUAKE on the basis on the bare PAKE analysis]]</t>
        </section>
        <section anchor="asymmetric-identities">
          <name>Asymmetric PAKE identities</name>
          <t>In contrast to the symmetric PAKE setting, party identities in the asymmetric
PAKE setting play a different role. The very nature of the asymmetric PAKE
is that one server, with many different registered passwords, can authenticate
many different clients. Consequently, when the protocol runs, the server
needs some way to determine which password registration to use in the protocol.
Beyond ensuring that the server is authenticating the correct client, the
client's identity is what helps the server make this selection.</t>
          <t>However, the server identifier carries a similar burden. Indeed,
the server identifier is used to distinguish distinct server instances
from each other so, for example, a client cannot mistakenly authenticate
with server A when communicating with server B. This is especially
important if the client re-uses their identifier across server instances,
since a password registration for server A would then be valid for server B
if the server identity were not incorporated into the protocol.</t>
          <t>Based on this, client and server identities are <bcp14>RECOMMENDED</bcp14> for the asymmetric
PAKEs specified in this document (in <xref target="CPaceOQUAKEplus"/>). Both
client and server identities can be long-lived, e.g., a client identity
could be an email address and a server identity could be a domain name.</t>
          <t>Practically, applications should be mindful of what happens when these
identities change. Since they are both included in the password verifier
(see <xref target="gen-verifiers"/>), changing either identifier will require the
veirifer to be re-computed and the client to be re-registered. For a single
client, this change is minimal, but for a single server, which can have
many registered clients, this change can be expensive. Applications therefore
ought to consider the longevitiy and uniqueness of their party identifiers
when instantiating these protocols.</t>
        </section>
      </section>
      <section anchor="timing-and-tempo">
        <name>Timing Attacks and Tempo</name>
        <t>OQUAKE (without the fix from <xref target="TEMPO"/>) is subject to a timing attack
due to how the ML-KEM expands the key-generation seed (rho) to a matrix (A).
An internal function — SampleNTT — uses rejection sampling based on the seed
and therefore is variable time. In NoIC / OQUAKE, after a sender password-encrypts
a public key, an attacker can perform an offline dictionary attack based on
this key in the following way:</t>
        <ol spacing="normal" type="1"><li>
            <t>Password-decrypt the authenticated public key using a candidate password.</t>
          </li>
          <li>
            <t>Time the seed-to-matrix expansion step using this candidate public key and
compare it against the known timing target.</t>
          </li>
        </ol>
        <t>The Tempo fix addresses this issue by ensuring that input to SampleNTT is not
secret-dependent.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="FIPS203" target="https://csrc.nist.gov/pubs/fips/203/final">
          <front>
            <title>Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="CPACE">
          <front>
            <title>CPace, a balanced composable PAKE</title>
            <author fullname="Michel Abdalla" initials="M." surname="Abdalla">
              <organization>Nexus - San Francisco</organization>
            </author>
            <author fullname="Björn Haase" initials="B." surname="Haase">
              <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
            </author>
            <author fullname="Julia Hesse" initials="J." surname="Hesse">
              <organization>IBM Research Europe - Zurich</organization>
            </author>
            <date day="22" month="March" year="2026"/>
            <abstract>
              <t>   This document describes CPace which is a protocol that allows two
   parties that share a low-entropy secret (password) to derive a strong
   shared key without disclosing the secret to offline dictionary
   attacks.  The CPace protocol was tailored for constrained devices and
   can be used on groups of prime- and non-prime order.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-20"/>
        </reference>
        <reference anchor="XWING">
          <front>
            <title>X-Wing: general-purpose hybrid post-quantum KEM</title>
            <author fullname="Deirdre Connolly" initials="D." surname="Connolly">
              <organization>SandboxAQ</organization>
            </author>
            <author fullname="Peter Schwabe" initials="P." surname="Schwabe">
              <organization>MPI-SP &amp; Radboud University</organization>
            </author>
            <author fullname="Bas Westerbaan" initials="B." surname="Westerbaan">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   This memo defines X-Wing, a general-purpose post-quantum/traditional
   hybrid key encapsulation mechanism (PQ/T KEM) built on X25519 and ML-
   KEM-768.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-connolly-cfrg-xwing-kem-10"/>
        </reference>
        <reference anchor="KEMELEON">
          <front>
            <title>Kemeleon Encodings</title>
            <author fullname="Felix Günther" initials="F." surname="Günther">
              <organization>IBM Research Europe - Zurich</organization>
            </author>
            <author fullname="Douglas Stebila" initials="D." surname="Stebila">
              <organization>University of Waterloo</organization>
            </author>
            <author fullname="Shannon Veitch" initials="S." surname="Veitch">
              <organization>ETH Zurich</organization>
            </author>
            <date day="29" month="November" year="2024"/>
            <abstract>
              <t>   This document specifies Kemeleon encoding algorithms for encoding ML-
   KEM public keys and ciphertexts as random bytestrings.  Kemeleon
   encodings provide obfuscation of public keys and ciphertexts, relying
   on module LWE assumptions.  This document specifies a number of
   variants of these encodings, with differing failure rates, output
   sizes, and performance profiles.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-veitch-kemeleon-00"/>
        </reference>
        <reference anchor="ARGON2">
          <front>
            <title>Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications</title>
            <author fullname="A. Biryukov" initials="A." surname="Biryukov"/>
            <author fullname="D. Dinu" initials="D." surname="Dinu"/>
            <author fullname="D. Khovratovich" initials="D." surname="Khovratovich"/>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="September" year="2021"/>
            <abstract>
              <t>This document describes the Argon2 memory-hard function for password hashing and proof-of-work applications. We provide an implementer-oriented description with test vectors. The purpose is to simplify adoption of Argon2 for Internet protocols. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9106"/>
          <seriesInfo name="DOI" value="10.17487/RFC9106"/>
        </reference>
        <reference anchor="SCRYPT">
          <front>
            <title>The scrypt Password-Based Key Derivation Function</title>
            <author fullname="C. Percival" initials="C." surname="Percival"/>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document specifies the password-based key derivation function scrypt. The function derives one or more secret keys from a secret string. It is based on memory-hard functions, which offer added protection against attacks using custom hardware. The document also provides an ASN.1 schema.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7914"/>
          <seriesInfo name="DOI" value="10.17487/RFC7914"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="Gu24" target="https://www.escholarship.org/uc/item/7qm0220s">
          <front>
            <title>New Paradigms For Efficient Password Authentication Protocols</title>
            <author initials="Y." surname="Gu" fullname="Yanqi Gu">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="LLH24" target="https://eprint.iacr.org/2024/1400">
          <front>
            <title>Efficient Asymmetric PAKE Compiler from KEM and AE</title>
            <author initials="Y." surname="Lyu" fullname="You Lyu">
              <organization/>
            </author>
            <author initials="S." surname="Liu" fullname="Shengli Liu">
              <organization/>
            </author>
            <author initials="S." surname="Han" fullname="Shuai Han">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="LL24" target="https://eprint.iacr.org/2024/1630">
          <front>
            <title>Hybrid Password Authentication Key Exchange in the UC Framework</title>
            <author initials="Y." surname="Lyu" fullname="You Lyu">
              <organization/>
            </author>
            <author initials="S." surname="Liu" fullname="Shengli Liu">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HR24" target="https://eprint.iacr.org/2024/1621">
          <front>
            <title>PAKE Combiners and Efficient Post-Quantum Instantiations</title>
            <author initials="J." surname="Hesse" fullname="Julia Hesse">
              <organization/>
            </author>
            <author initials="M." surname="Rosenberg" fullname="Michael Rosenberg">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ABJ25" target="https://eprint.iacr.org/2025/231">
          <front>
            <title>NoIC: PAKE from KEM without Ideal Ciphers</title>
            <author initials="A." surname="Arriaga" fullname="Afonso Arriaga">
              <organization/>
            </author>
            <author initials="M." surname="Barbosa" fullname="Manuel Barbosa">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="TEMPO" target="https://eprint.iacr.org/2025/1399">
          <front>
            <title>Tempo: ML-KEM to PAKE Compiler Resilient to Timing Attacks</title>
            <author initials="A." surname="Arriaga" fullname="Afonso Arriaga">
              <organization/>
            </author>
            <author initials="M." surname="Barbosa" fullname="Manuel Barbosa">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="VJWYMS25" target="https://eprint.iacr.org/2025/1343">
          <front>
            <title>A Hybrid Asymmetric Password-Authenticated Key Exchange in the Random Oracle Model</title>
            <author initials="J." surname="Vos" fullname="Jelle Vos">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
              <organization/>
            </author>
            <author initials="C." surname="Yun" fullname="Cathie Yun">
              <organization/>
            </author>
            <author initials="S." surname="Myers" fullname="Steve Myers">
              <organization/>
            </author>
            <author initials="Y." surname="Sierra" fullname="Yannick Sierra">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="OPAQUE">
          <front>
            <title>The OPAQUE Augmented PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>AWS</organization>
            </author>
            <author fullname="Kevin Lewi" initials="K." surname="Lewi">
              <organization>Meta</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="21" month="November" year="2024"/>
            <abstract>
              <t>   This document describes the OPAQUE protocol, an augmented (or
   asymmetric) password-authenticated key exchange (aPAKE) that supports
   mutual authentication in a client-server setting without reliance on
   PKI and with security against pre-computation attacks upon server
   compromise.  In addition, the protocol provides forward secrecy and
   the ability to hide the password from the server, even during
   password registration.  This document specifies the core OPAQUE
   protocol and one instantiation based on 3DH.  This document is a
   product of the Crypto Forum Research Group (CFRG) in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-18"/>
        </reference>
        <reference anchor="SPAKE2PLUS">
          <front>
            <title>SPAKE2+, an Augmented Password-Authenticated Key Exchange (PAKE) Protocol</title>
            <author fullname="T. Taubert" initials="T." surname="Taubert"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes SPAKE2+, a Password-Authenticated Key Exchange (PAKE) protocol run between two parties for deriving a strong shared key with no risk of disclosing the password. SPAKE2+ is an augmented PAKE protocol, as only one party has knowledge of the password. This method is simple to implement, compatible with any prime-order group, and computationally efficient.</t>
              <t>This document was produced outside of the IETF and IRTF and represents the opinions of the authors. Publication of this document as an RFC in the Independent Submissions Stream does not imply endorsement of SPAKE2+ by the IETF or IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9383"/>
          <seriesInfo name="DOI" value="10.17487/RFC9383"/>
        </reference>
        <reference anchor="BARE-PAKE">
          <front>
            <title>Bare PAKE: Universally Composable Key Exchange from Just Passwords</title>
            <author fullname="Manuel Barbosa" initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author fullname="Kai Gellert" initials="K." surname="Gellert">
              <organization/>
            </author>
            <author fullname="Julia Hesse" initials="J." surname="Hesse">
              <organization/>
            </author>
            <author fullname="Stanislaw Jarecki" initials="S." surname="Jarecki">
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="Lecture Notes in Computer Science" value="pp. 183-217"/>
          <seriesInfo name="DOI" value="10.1007/978-3-031-68379-4_6"/>
          <seriesInfo name="ISBN" value="[&quot;9783031683787&quot;, &quot;9783031683794&quot;]"/>
          <refcontent>Springer Nature Switzerland</refcontent>
        </reference>
      </references>
    </references>
    <?line 1694?>

<section anchor="params">
      <name>Deriving parameters</name>
      <t>This section discusses how to generate parameters, given an upper bound on an adversary's advantage in breaking the hybrid (a)PAKE. The parameters in this standard correspond to a classical hardness of 117 bits (considering the attacker can break CPace) and a quantum hardness of 100 bits. We assume that an adversary can perform at most 2^qq queries to random oracles or (a)PAKE sessions. We use qq = 64. The derivation below uses some approximations, ignoring small constants in the exponent such as 1 and 1.6. We also only study dominant terms in the advantage equations.</t>
      <section anchor="parameters-for-cpaceoquake">
        <name>Parameters for CPaceOQUAKE+</name>
        <t>We have the following requirements:</t>
        <ul spacing="normal">
          <li>
            <t>Nseed * 8 + Nverifier * 8 &gt;= 2 * qq + classical hardness</t>
          </li>
          <li>
            <t>Nverifier * 8 &gt;= qq + classical hardness</t>
          </li>
          <li>
            <t>Nkc * 8 &gt;= qq + classical hardness</t>
          </li>
          <li>
            <t>KEM failure &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>KEM ind vs classical &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>KEM ind vs quantum &lt;= -qq - quantum hardness</t>
          </li>
          <li>
            <t>CPaceOQUAKE vs classical &lt;= classical hardness</t>
          </li>
          <li>
            <t>CPaceOQUAKE vs quantum &lt;= quantum hardness</t>
          </li>
        </ul>
        <t>For ML-KEM we have Nseed = 32.
For consistency, the spec uses Nverifier = 32.
ML-KEM1024's failure probability is 2^-175.2. This is slightly too large, but we deem it acceptable: the chance that an adversary encounters a failure is purely statistical and very small.</t>
        <t>The following subsection discusses the parameters and hardness of CPaceOQUAKE.</t>
      </section>
      <section anchor="parameters-for-cpaceoquake-1">
        <name>Parameters for CPaceOQUAKE</name>
        <t>For the security of CPaceOQUAKE+, we require that CPaceOQUAKE provides:</t>
        <ul spacing="normal">
          <li>
            <t>CPaceOQUAKE vs classical &lt;= classical hardness</t>
          </li>
          <li>
            <t>CPaceOQUAKE vs quantum &lt;= quantum hardness</t>
          </li>
        </ul>
        <t>We have the following requirements when CPaceOQUAKE relies on CPace's security:</t>
        <ul spacing="normal">
          <li>
            <t>CPace vs classical &lt;= classical hardness</t>
          </li>
          <li>
            <t>Nkey * 8 &gt;= qq + classical hardness</t>
          </li>
          <li>
            <t>KEM failure &lt;= -qq - classical hardness</t>
          </li>
        </ul>
        <t>We have the following requirements when CPaceOQUAKE relies on OQUAKE's security:</t>
        <ul spacing="normal">
          <li>
            <t>OQUAKE vs classical &lt;= classical hardness</t>
          </li>
          <li>
            <t>OQUAKE vs quantum &lt;= quantum hardness</t>
          </li>
          <li>
            <t>Nkey * 8 &gt;= 2*qq + classical hardness</t>
          </li>
        </ul>
        <t>So, the smallest Nkey = 32.
We ignore the KEM failure following the same reasoning as above.</t>
        <t>The following subsections discuss the parameters and hardness of CPace and OQUAKE.</t>
      </section>
      <section anchor="parameters-for-cpace">
        <name>Parameters for CPace</name>
        <t>We refer to the CPace <xref target="CPACE"/>. This standard requires Nkey, the number of bytes in
CPace's session key, to be 32, so one must set H.bmax_in_bytes = 32.</t>
      </section>
      <section anchor="parameters-for-oquake">
        <name>Parameters for OQUAKE</name>
        <t>We have the following requirements:</t>
        <ul spacing="normal">
          <li>
            <t>BUA-sKEM ind vs classical &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>BUA-sKEM ind vs quantum &lt;= -qq - quantum hardness</t>
          </li>
          <li>
            <t>BUA-sKEM public key uniformity vs classical &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>BUA-sKEM public key uniformity vs quantum &lt;= -qq - quantum hardness</t>
          </li>
          <li>
            <t>BUA-sKEM ciphertext uniformity vs classical &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>BUA-sKEM ciphertext uniformity vs quantum &lt;= -qq - quantum hardness</t>
          </li>
          <li>
            <t>BUA-sKEM key * 8 &gt;= qq + classical hardness</t>
          </li>
          <li>
            <t>KEM failure &lt;= -qq - classical hardness</t>
          </li>
        </ul>
        <t>For ML-BUA-sKEM, if we set Kemeleon.sec_param to 256, it is as hard or harder to break public key and ciphertext uniformity as it is to break indistinguishability, so we discuss all three properties at once.</t>
        <t>For ML-BUA-sKEM1024, the resistance to classical attacks is approximately <tt>253 - qq</tt> bits of security. So for qq = 64, classical hardness is approximately 189 bits of security. The resistance to quantum attacks is approximately <tt>230 - qq</tt> bits of security. So for qq = 64, quantum hardness is approximately 166 bits of security.</t>
        <t>The ML-BUA-sKEM key is 32 bytes, so this satisfies the requirements.
We ignore the KEM failure following the same reasoning as above.</t>
        <!--
# Test Vectors {#test-vectors}

This section contains test vectors for the algorithms and protocols specified
in this document. The test vectors correspond to the configuration specified
in {{configurations}}.


## Password Confirmation Protocol Test Vectors {#tv-PCP}

This section contains test vectors for the PCP protocol specified in {{pcp}}.
Each vector consists of the following entries:

- seed: 32-byte seed for KEM encapsulation, encoded as a hexadecimal string;
- salt: 32-byte salt for password verification registration, encoded as a hexadecimal string;
- PRS: password reference string, encoded as a hexadecimal string;
- SID: optional session ID, encoded as a hexadecimal string;
- pk: derived KEM public key from PC-Init, serialized using SerializePublicKey and encoded as a hexadecimal string;
- SK: 32-byte shared secret for the PC protocol, encoded as a hexadecimal string;
- challenge: protocol message output from Challenge, encoded as a hexadecimal string;
- response: protocol message output from Response, encoded as a hexadecimal string; and
- key: derived shared secret output from the Challenge and Response for server and client, respectively, encoded as a hexadecimal string.

For these test vectors, the KSF is SHA-256. The vectors are below.

~~~
seed: 40e5a6554eb988ee21e84a593f744e611ededff48dfb0e43c763b3a8b0315bb
a11af1e05e840a1521987ecf82a37fdbbb0216ecbc85ce51005fc61b83d7c0929
salt:  b33f867d93433ff91557e6ecad9d934935cf8da580538c0e444eee15c86c32
04
PRS:  746573742070617373776f7264
SID:  4c43fe04b479f5b41eab59f18d93d5a9
pk:  67f7248ab55a3a35c6e9e1acece73d69d50a67f87b0a1c4aef942953567b6d7a
101ce75dfe04c5f7979f93d1749fd98c92dcb75c975d2830ac04a387b78a13573b076
ee3505a66c58c3a404a202c1f0b7d4a2b1bdd6696e1caa35bf89df6ec3f54d786b3b7
7f26ab3a3af755ee96c6f155088721966cb732e1c40f2e78a614b8abfc030c6d61399
f804531c90ce50275cec8035b77c3e8b7b049793d51b022690088e7eab901198b6e09
071dc946e67732c7a4bbb394714a61402dc64a28bab16f111ce34149a8150b19fbca9
36c45311020fe357300801ecb8b5513ab12e48592f6d922666a72229c9bfad3c92f15
0e2223154db9b50fb07fc0748fbef872ea9b5e3c22447487c1805ca0af8725573828d
40aacac9759ed48664c12a8641577cb8c5aa1a501fccc2149d123a4c48592fc6c9089
54f0e383996b8687d658a94a18a242274c08839b306b81270b1c717dfcb36c10809b8
ee5b70c724ba761b2c5e4ab43823725fb5fc46b17007038266b258ad19ac4369e8cd4
53c566a6aa85677056933bd926d466a5f4a9b0dcaab0d3f8a5e603681f960b099a5d1
ef8b677a27b02b9ae84a34f1f24445788be59752a68b4777613598786a50d42568675
82ad9a5a79e7663b5b28303959f5c5a69f5173d702bda6b6a0e0656613e58ad9e75aa
b353b8a570b88a79d3e020ad50738a4e17b82b0852544b212990843076a070323a491
8bf1f3144a70ac156232d83773d3d5c1137907e83b0c68165f71a1128122418669565
9293caf20512c73b3fd2a4d85f99d422c5829685138c921468126709187eb408668e6
a9e023565899ca69a53f1f79c70d2c525c7919289247278021387351ead1122fa5c7f
ac0022a0ab4413437d091804e543d3deaace3360978e926cb71bb32280b2948cb061b
7eb6187ee020602037144b93bbdacc1c5f362dc2c7a738057e5c973e0cf77f3023461
1052e949b22e0a32d67d68e5ea28c7e95493419732f249aa28c08e9509b9940845625
5e46fbc46898c61a6408b97b00ee1a868b2128266bcc7bca38e214b43364b408c0c54
67b472e592f1165aa9612b863b511ce31795fe320a0ab6f6851ca4f896675fc02eeb8
4f3d01ba691b51396a42eec0ab32f77eb061a72c902f3f45ba424088444c4857913be
91bb31e161245f3cde1aacfdce5a866224f3db0bcd53529b1da2be6020d1489839e00
04071a5607f33f890b386d6835792788e3c794136503f0c4269afa031ef6305d010b0
35a1325a8909179ce57972375e5b9284cc328b66f6e076d1ba085e38c9cedf29f2913
470f6051f1fa6a3880bd45e5784f019a93f37789880eb01c3fb9cc3ddb096968675a5
d65acb99571de52bf5d282731f34d5e69c070da3795202f65354034e65f35267b74a6
b3ea469936230f493c4235365d4357629e9429c2ab9edcb279be2688f690849e0b1be
d94b7a0d1113c6c372d247cd7b46b9cb492324c9e705692e888a7ffe52ca9f00f5dc8
2888370b09db519e8aa743052142e34294423a29e30428ccc94859693d07b5cdf6115
e176fe8da8dae1b4bc7a5c5b752a52e5ccdced571fbeb3b0f14a5fd2a397406980fd8
078e8786d70b2738187747658f58658b14d2b14d1f04ca18347a044c9b21b0bdb035e
33d2aeee45ab3106c4d8ba8ec9c9dc3eb4167db9965d92765c9b4522bb08cf35fd56c
1a19c426d38a6263c45728
SK:  75e99907f38993c973b58599ca73122e568baa5cfa2736e5049dd079f295362e
challenge:  3a27df1e4b119f391ec2e83cd864658df3b4cec728b32ff704cfc24fb
af3cf72a31c6a115f1fb58269c36d5256e6cf92f62de157b4b3e5669d09982391be43
6038da6950b09b2f6a860b793be2e670b723a5066e854bd505e7634f18fdae30e2ee7
2467132a56bbf22b854286ef7ea3c5b508088d78ebcc0db57ca7afebff377f233f10a
34ab5bbda3c200a0f1127127eaa89c621a39c67335c308869e7c100f9a98d94ebf264
698a6b24ab316347b62e2e4408bbb4241ad2430a156147914132ca937cc43dc2d37ea
1cf7ecf285195ab7dd2d6583b1ddfaed1c3d87bdea64f015e7dfaf6f5ea727b23bce6
3ea5e0614fbd345e01839983291ad7b696d1a08e262efde487e85a44384ed610704b4
9fa9d00c27ceeee88733bcefbb6b5f975eab85069988bc58883ba380c42b0d8dec070
8f9e1c6d0705606c0c0f82d10c9eb2ea17556897ba953819e717e3117f8b0f753bffa
4357d8f94b4b25acba72580682d3cd7d65d28286200bf4d2cd75dd4df4d94baf64fbb
3e57ac127f07164b99db146f29cddc404e313baabbecee1bd8393da7539da7b15f08b
7a8208d29c636257bae5fed04cd3935d1e342bc7eb29ccdc68a71a47c5f06fcbdd492
a0b80fbf23731d501c32c5fc28d974288f2c926b5eec29d4c905518d3e3bab3cdb411
842c3e2e1a3a414aff34f627b11db5f58d5d1e29e21294407c48f44f0b1c01237756f
4ed85032b5acdb7ee5cda80383fc8621b713b17472c549b362f9afd208ca2f6d4bd67
5f8a6af2c047f261b83b6e40bceac3416f7f749b81b780475c0a636d0ddb9eb49fd30
630b07dcd9ef2af3809bd251a94da40881b5116b27ab9f0d84f12072bf050d7d15e86
9770397fcf4508861f76ea461378d236ed99ab903a4026d19a22038e58f349d251e7b
d6148030f530d1c7e84a1a15febd2c21030c11a8bd2fe52bc629b650b330a7431c3e4
d6111eba76abdc95dd3af8f5839317bc2fa737107b9610280841d3af9c5b0dc69032c
f23bee87fdbde6c39a100994e5c2df3b3e70f9f52f388c9d65079ec15154bb731e6b1
3c33f438779572d23a67f5b421db648b27dcab657ba03dd355ee90dff8c4c8ef7bd2f
ed0b0dbbf7db006f0b5c045b92e77b84e9da9fdf4290a00ed8fb4d634f34ff6d84b71
951d2181c990bd374f47fd170b46fe61756b0a6011b41e4577a7e985feefbb312ed12
c2151cdcf633d3ef175ffc2f23ab28f3a80e39eea740683601a6498f4b97ad8f78884
592e3c8524d278a9a26801e813e73d228b76026f236d4cef2165ae9988ada31cca20a
f029d14969ecbd169d01de04ff946db136ecdefcaff840e21b18b6b14a1a1a3315e17
701ff74fb07f4c1d35bb6bc641ccc84a3d37aecb6fee530554d267195119da7f44e1b
a3aed0c67c07395d9e75a4e690ed0164787fa6a63b8cdd38fa090ea23982871fa1e9a
bf90712985d70e965402e1b0d4382b7be3b72e41282fdf44984a8901bdb0c5f3ce602
6d371738970a0ebc12cbe06f495b76b82217eef79908c52b8e557c47ea289255ac477
f3d9e19ff2325ae771d04195d5424c86f40a31869c31f2f585f53e924b6de8db4c812
2f02e76a2d09dc8ae767eddca309fce33f50b770f7dd5cfdd4f46c2112bee16f93499
5fa0b2f5e69dd9958f4fcc73840598e13f
response:  37fb1b659261093758f48f540f337893076b8819ef5f556696fa9ba8f8
717d91
key:  eebae83892d72a88e2d53b2a3b3f5ac0c24c9c69c8416312557f77008db9cc1
e

32 1120 32
32
seed: 3b30129132073b2a61e29403e2d57f60e530fe823ddeed80ee218a6c931f805
7764f38b1eb5665ab5972c9db8a5d8e06388a1296e440d7975639e71a37993d30
salt:  3c8fd7ae7c9aa2b2d1c4789f046f8b3155a76c566829df38d6cff98ca2ef5a
07
PRS:  746573742070617373776f7264
SID:  773d45f4506bff8e1cd2e9d062b8a23e
pk:  8e3292fd769532243b141b0c922b76ec63c6f2128faa9687c2196c7c99347d96
07c765a3e0faaea43829e8134c54a4c7bda82231999c61053cf29b2ef6fa91f5da948
4ac33f0fa510b8b324697686bc1c4dcf2b4ebe636f2957b8626c823a9c92b8b9b2401
2cf65cbda16038a8911c7488c76326b5cc4648a62b8bb476bffa79a523347c7443a2d
7432ca7f016e9100620264eb9e05250e18cbfd02347f3681b513eaadb6d7067984d9b
5692f703273c6e19f16e757a45adabcc4d3a3ef1eab1890a0959a93c88627f057b78f
94940a29a65fbc0ce96276d9c334edbca17d18404a996594efa0672ab2e1bd078e0fa
6611127835e9757b5c8033d67a318b01d07a536732742efbcac9c90830e30b4caa116
39c5681a4c16fe703d2e68b26cb6628a74b039344b6c58ed0d7ab63809940c393c463
6cd8836b9327c052d839d6bc503484303ad84d36fc98625ac457ca2d50969ccd31560
ea465abfa8d0240c20bc17aa95309dae53ec510b78b4143b3f97333aa7166d80a67b9
8f9d78ac64003b90595c330aae1ba15f1c733392ab89c21213e20c273d958311d4314
ad21593859e3bb9c12b26c916c27fad4ccbea3a916bbb481012b8fd6600bf23365b07
6be7f8b3d128426f5269a355bc4c628663e96154a65fa8ea357eca432360979218775
9d248bee2593ae47071486a9b05913534b2f6e94111c76488fca850798715cbb32664
c9352c5793f69fd9f3c9a4604aa86466f6008f94d7c719aac8bc5a2471a50f4a6b3db
010656e3544f1e940e1f6233d7c4595d8355b5055ec7c3c029407d0ac5b40357bf3ca
09a1743ef9d16a3212767b12b388148e94c13612112deeb34078b33ef8976501867b8
2965f1933123910a0da81b396dc32d66485b18748b0e2b0cb760fc42770766a401761
b08c3b7784167fd1983575f94c09b32f38a684f126312a9ab96f29c66812903107bdb
47bcdb226404e50a2c3360a15f95e115654062974322905db67a17eda1c190219e4e9
15a8189bb07a0441e37851312348c488f6514ffe35332ef99da4371025e53bf531202
3b199da26b05af08f54e2280b5594d498519060129117c0c396853f3a4edc42b91cd7
0dd9c53e7843963d033b7cd384e91353526941c7a4ada76a90dfecb0e6cc243393af7
572cda8654b68d99a3c8176c8897ec7076b39e7978bc0427ee8908e9648b75913f610
5e5128aea2552ac547375217aee72104d244cc50585749b9011651c5f408c9b4076c5
a256429f582f58502dea8a12bbb4f644c93845aa72f46109bd3ac3ec224c17a4e7eac
83296c0e803c7090cab15688c78bb733f284bfc03646c8984943c29be0601bb77b604
8c418981a0099221679696ee917cc47e17d5c56ad4c11c02e3b7fd4c1624bec169ab9
16adc07e53870c46a8cba3a4784d9c53af537e6931bf96aa6e3e80cc5be359ab67a01
8797eb5f670f488c103254e5bb539cdd4560e0a2a19e86a3fe0767359014ea57ac9ba
0d5366ce17e3c4a6280136cb3c42960ed0887f1e9019064683d75708c71b9e14118be
bfb6c394c5279d38380a7a920ac08ab8b5477a4174469aad57435792c5e784b0a8005
3a50600891a84a7fb0ceada135936877d6f2fdf320cbd88d62311b60a73d482319811
4d094af545fce5335a145011115721d2bf9ad6e22dd012bf4244733737bf74bfe349b
d2d91e0f8b60c0dd863f2c
SK:  000a7035444b5505dceaabc0494c435631abb144ca0242d450d463f792325e5e
challenge:  afd063e56a36a60fa0520e132f583b75fd82d0c823240e94f85dbf464
098c503af451d9e91d253d1f2ee3da15d00370a80a1f7328e8b4f2135878dcff0a579
86a7617774d64c00aab8e3dca2732857cb3635dc3e788e7ecf07d115db713a8d42a4d
6e17dbb1af37d1dffc789344631cf38ff80534d18e8769bdebe2b2a7d77f7f8cd802e
c644d596186b696144df96a3cd14c5177be93a9c7b2b4cb152f1f3313f69bd5fa206c
317b6d5bbeb578b0241d21d5ccee07aa055dce6f969d921f448ce455287ea6eba1833
6155b4c7fae472445d2f30588084bc7225fa07a887db6e586e4d4f44af1c294cb112d
84536b877c570053a365780e2f3ccfdc92be8cfb527eaa3ac87e2c02aac6d129d04e1
81a404354c9fc2eb4d73513131bb437048e974f3e6907d2b28d56493634e5b9edb8f7
e356854119dbede512f6cc52794d1c15059bbc59d3783b07088c55b48f8b4b69fba9f
5dbe845eeb86034ef3b6d0765f1bcf361952fcd94f9ca33dcf2f5cae6943518fc87ba
aa4acc5d8ef056bd65e60ac52617254681e41b31bdb51803d1a27731dc4183255ebb9
4db1b45e7a84821e358a3ce0bbfc8f982bfb7ad1deb61e6b8718875c6cf6549dab765
45da0d71891f7fb95d51bdb7aa362e7e27706761da2f78a70f00aeec0d6d2f710720e
2431c6c35e3760b93051d2e83c6c68c125e895973555a9de6b736ea8d38d913f2d0ec
9d7d41fd23ae1f999af5e1e3f10d4dd2753f7f83b550139848bf582833bd34248c424
5f01f3131176eec196dc4ecb6c6517a7cec94dde2806af44557c5ec07d63e6efa219a
723bec5f4e2470e5a57b021b395fd1f8d36826d99a9b0eaf1458d25fd52ae499a1587
0197f4ecde53cdd7b076b44bded65e6a291b8a1722af52bfff782173d06f65678a186
095fc48d1be339ce280c21d356c298a60ebfa9ca421ca091ab5e2f28f5167b641c0de
1cba4c5ddcf27950350134701696fe5b6063b3a21d7690a2c2406a949db2f88c2d205
e20f92012618ae0698e071c2fc6d81bad5c791dfb8e391b4138edd92bcbd05cab4566
160421165406b4fe3e17f87e80af03e942396c8dcf590da6b9b30f0d08802df320c84
c88d46251cfb77f3b94a7908caa718ce2deb31209c00dcd0c990c31c1da93f4755cd8
97685c1234e3cb92b08ea6ff7ce035bd2372552e29fa98e7ef9890ae9d61c83c8b275
9f3edee6cebbd97f1b6b063efffcdc792e64343bd368a99166d313f6c7757182d89a2
9c9f6f32947d95dccd47164184c51b555e303fce895f9750f2938d94912fe40e7cf2a
3b5cd9c486906f9f76744de9269c4dd3e1469cd0dd720ddb59f5effe454da764a99f1
1fee3abe86ff00a190c1de28965fc9b3a42ceb6f41659c140773abdc2e0902a8a0c56
117a25c6f7b19c5e5d9c421daae445c402a500c0fdee03dce2f5dfd6d74613de7096a
ac90db5ebbcdd92837f9fad8ae397d7fefdf10aebdf6df4b27f5f61c5ffc47016fd5b
8f0456c858d92aa3f0188dad5b271779ca0ae479d0bcc301be32397aa9905b164b788
7136b5b33a39e49bc6a9f9f57482b2aec082faecadeb0eeceda3fb6ccc07132c37601
f7849711dd4d5d5a27ea3f43f32a1dee7b773fea55cc4b6ca3e46efae52259d1aa079
2fbaa62a0e7f126eb9d80ebe44064e008c
response:  5d30fbc51d341e49c0cdc96ccfe18a25372cea8cd7eed01acae245d402
6bde16
key:  ee7ac0f6a0ab18483d203aae52aa893b746ab54df182ff2e2e0d1d4f73605d5
0
~~~

## OQUAKE Protocol Test Vectors {#tv-OQUAKE}

This section contains test vectors for the OQUAKE protocol specified in {{quake}}.
Each vector consists of the following entries:

- PRS: password reference string, encoded as a hexadecimal string;
- SID: optional session ID, encoded as a hexadecimal string;
- init_msg: output message from Init, encoded as a hexadecimal string;
- resp_msg: output message from Respond, encoded as a hexadecimal string; and
- key: derived shared secret shared between client and server, respectively, encoded as a hexadecimal string.

The vectors are below.

~~~
PRS: 4b6cf40f371bc801e81b8f2b26cd5a0f
SID:  652b728f66e2ee44a5354dfb7236cdca
init_msg:  59fb9e82387ce589dc8e2f4a2759eb9402ad30968545a119419e9a36bd
eb4d712489761cc7cd4e8856289840903e871a12c9ecf199e7e2e4e43816fe6049a6c
9ae29ea00a0bd58411bfd9a789c9b57ad7d7e45a867e7565bdd21ef79a708f27f4b92
918bc8967d35c609e6acae596b994719f9a84388d9c2707bf8db15ed13f42ca327844
c42e331ee892847bda3a21e9b9d56e47374374e94a0bf3301b09bed0d9813af3d7b52
fb85e50063917c63070000213f24e8af110197a1a8186ef62fd59dc3dffc1d0dd7819
722950694195694b97f8d62dab464321433134f4bc140c6e107b282a3e71dfa3645d1
4f7e4da70fd99e89be47f1f26b7c3a33e005a43abb71813a1fef959dc7acb109e3323
e4241f35596dfef0715e0c0106d9530af464c4699b2e3925a6dd6e996e97eb42ce57a
187c8e94d901510d462e02f0092622a67edd3a612b78fad83aa9b557ed42ebc0bcb7e
9b72bfff81916f232085c7b0d618411d39ccbac4c3091f3506d246de2d5ead0a5b184
ca5b36dd408419edc21742d6b141e9cb647a55bb0797fb3308ad49cc567a4d0338049
44cba3303de1bc088f240a45f9526bece4c372c9a50e83a669e1bece4ae92e3736f95
99d4f1f65434db5c5b7cfedbbbb9c2620f2f0e9804046ef53b5c47f0876be57970c93
74eeff829bbeb265afffed437f1c23b60af5a5210bef5f76b334bd269ae17b890320d
5e54051985cd7b67ae9a7472d70fb6eb0575a5bd44b64ab55b2cade147c6f4aa2aefb
dcb4b1662eb6c0fd292877d688cc5df46f39189869cd8c027b405833d10ed3b3f75d0
55f49e4bea1267e2635a0d182df59862fa31bee58318be03310e9d5eabd404fe91e8c
179af9c0a64d4b02d68d4f23ebb01d9674581d06d6211f47afadaf94f94eca7855ad6
10f68e4c39c045f4c41740ae668f203b712cb29607a824bf9d3a7a09455676fbbafd1
c6dc3b35837a7a6f9ae8b47237c2f9d462f9f068135190a9bac33575f8bfdde1d0775
f156db3731619ed0e06f00fb597688bd6d4e5364e02c91870cfdb593c6ed88e072a18
bd13bebe80942db9c317b7d7b9461d168295fe4ceb262a343393c8e76d214236dd807
46a98da9dd89ce75ce70155426b7d79186c526c0bdf37e27b683e9183da95d38d9159
d00a1d6382d18a96a571e2a94dbf0271f04dde59029b7e8c5a606e1833cbbd85e8d07
93b016113049d011a94a0f7530cb152894eee984541efd7d79c67495b11358d270bcd
809734860461989bf21f5cb2b87ae7b59865465eae9275b7ef904d5425d459f0c185a
eaddd3e76b4177b2171bddb9af2568f62c19c5a08491e1c690d7631cd938381488993
4923a0a2f12fd93623b762b6284f7eea3f9e2890970a851d1afe57d617f94d40aab58
85c10cd3dde1b0444ac20368f0e6ec5f3912558c9c2f23ab0a2ced9043a84291cb5c9
41a2ffbab5a7d355fb0b86a888290bcf77414f0aec23ed728803454b1be26b3f365cc
2a5986b8f85359a1d8c205946ca9e7875647cc11d02db5d7a1e588f56f9fcb971be59
246d2aefe07a420d156aedcbdbc8892958d0b7957508f94d1c97d9a80242f383d5da5
5c8dc41ef43f1cac4877b4417ddb0df0c30cfbccb7dc3a15105322ce2ff15e8c00615
9d073af55e8de553bc1b1d3cc1eef9c515e3daa6be4320e076213cafc87c4c9c4dbb3
7c9f31d1a69efa63560091c2b69de070a131755a871913ecc4e7cd9046f9d7e9ad690
45102f34f9896f3b9c66fe6fd57d14830a1bd9e4be02cb3dfa57fde56a53aca03e84d
f1a502c32646852947
resp_msg:  3c69d8f3bdbec6939b033a0cff661a5f90b3ec64dcdf0bdf3adeeae196
08affa26fe752f3e555ecdbe86f94d97429aba9bb0f2919a126b9640d480d5898c0f1
09c2594359298cfae0042d602836f3011bafd355d145999bfec12856f9a268a980cc6
cf0f428048e34b147215b3e710c252730ad3e55992f020c36953e2dad702d53a2b6ba
683d9dad12dcd4b02c8b5db9dbf7947797ab349a3567130bd7c69fa034b366e3b2144
a3be4def379dd68ce5c2127e50d6084f5e602c901af8dc245fca25f211a5c7b52b1c1
bda95dae0c32f457ea4159dbff55c0d30f709d848e0aa099bc769c2f477826b60810b
2be56b85d05f3c2a21a4b992323b3dac596d8386b0b8520d7c382ef0a33066f706464
24087d18907c8cb18c867af40479fb5d0d07440bbecef42ecdd52eb86002af611d34a
239d843e86491e6cac35954dc24a7fce979de6533996e46866e6ef66804ae7f9b3c49
b5372aa4143b08093cfb18057558083788c45cea615d4d44c7ba55938743fc4e7dfeb
eb1558556adcf19a0cdecf56f09da2c56cbe3d94d6157e8425b421080a890ca3cb52b
c909889b6e108f483b46e36e7443944345cc64a8973fbaf0b42359e7d505dc4442273
fe7da0568358a17817b7af22af9344e44cb43a83af27255a04d0a77d7c0c78231c7b1
ac2f0c3bd106ea5243d556ba5b6e0671723238ab82573247030b4f8c65dc3a075d713
2db25843ba711800b7a28dc1301e19d9a5750622149e8892523ae40ca1390e19b3bba
a92b4ffc87dbd2d9c6a3479ff802c02b54d85e91fb94c458fcd1158df8f7b20e274a6
a15866d33926189ce9c02798bf89e15943fbc73d6ca679c0773304aff40eb12836988
75e7ba4bf8058f67ef53cd5e924d8be307a57b037938adb6b198edc2c4c3136de60c6
aedf6df29028576ed39e84f6b4b8c4bff4971123039e3fb2dcb0c742e3bb213740740
52e02cab1f460880ff5335c4b1dcd9335ef213e36a51f6cb94550b3423d72c18df738
283faa8c419186acc853f08eea3e981ec9e131221fd93bd4dec2e7037b39330a5863a
cedbcbf5b069198194405d1498448a17303f0e963cac45ba981ce512b2a2cf1e0b54b
ce01f366b22c366b7bff5a56c094e005f9115ba3e6497274874e3ae62424d9f206d3b
b2e13976c345f1cb6b730f40103a6dad5b5db0689478139240b547926d41854837786
a753f0276e50ad4d8758fb8c59d46829000b81cb3e0a8d8a416008613495086f40d72
ca2d2184f8634c9c24961265dc54fa7bcd64057c0462c3cc476574ab7ec52a28799d4
747b2ea046da24703209a2bb437ebfafe144d87e2af44831fd29e72cf3f991885ac55
72366a7d363520713879bd1294c0f4130870aad78902ef083572672220e4d565e82a1
ea97b99d25954843f0293e64e37a367a08ff46f11bad769e56f41024332ea16085086
244368d75eda13117d37df5e388d2e198704c2e7f9349ac82014fe0da23c74be0a8a2
5c07b48689b92dbf6f328f998c32af4bdfd2f1add5285161983b58e5c86413e15b2b1
410dacf4daa116b9a9663ea40a3383375033ee94893
key:  e795ba6852ff724c76b21a65e3e0c889ec75b5c0f1a59c8abb3ebb414a5b9af
a
~~~

## CPaceOQUAKE Protocol Test Vectors {#tv-CPaceOQUAKE}

This section contains test vectors for the CPaceOQUAKE protocol specified in {{quake}}.
Each vector consists of the following entries:

- PRS: password reference string, encoded as a hexadecimal string;
- SID: optional session ID, encoded as a hexadecimal string;
- respond_seed: 64-byte seed used by the Respond function, encoded as a hexadecimal string;
- client_respond_seed: 32-byte seed used by the Finish function, encoded as a hexadecimal string;
- init_msg: output message from Init, encoded as a hexadecimal string;
- resp_msg: output message from Respond, encoded as a hexadecimal string;
- finish_msg: output message from Finish, encoded as a hexadecimal string; and
- key: derived shared secret shared between client and server, respectively, encoded as a hexadecimal string.

The vectors are below.

~~~
PRS: 95fdc24f9330e38e226b6169c9b76243
SID:  019ffb301f2cd83a7fe4f20cca7b8a1d
respond_seed:  4af73379f88cee47ac4a34a41204603cb673304b00b471777a8ba0
abbadea6481d1f03f00b20571b9b3f9019430a9f6ca807bfd9877844ea2c846b7a691
c4429
client_respond_seed:  a1359fa55ee62e45abc989df0ebbf1f9d6d77799271944b
b7f161b1318edf4ae
init_msg:  0470fb7f997079372fadf64cc0bea52b60a25aa2a75eb613c8c6ecff48
382cbbe1ee710fdd7761b8998d4c81ac001c2e1a186bba88dfe3046b7ba26085714d7
eb4d79c6d58b61b99272ed87b7180bd96c3e9bbe02c59dfeda84c95d06f3a7fdf11
resp_msg:  04d8ac3a98d80ba2e26c9afa92eea9ca6eb28fbd0661a1086a04062432
64b9c021efb7e8a4a81599ca92e0a9d6e713f379c9133fdcce8829510f7106c9007e9
48b3f865a6ce7365c86f540ad587dfc79fc3ef81708ede611e79009fe13fa5a08dead
3b519a73394e1c965aff84a27f83cc28940ae0c517c3450f09761a2b5ecd53069e76c
f63c084c3d0965f4a624cd4c916156b92966cc7a2c78a809a8d611cb387c5f5a4cca5
cd98edd163df78c8c6ed204b3e6defb7f2e8cb5d45157fded7ac8190fe45bb7481401
1c59fc02ce5a91dbb003b8ec39018a1b47d59ce6f748b40523e3a8c4a9625439506f8
56cc4025269c608fa8d6358c292d4e2e2d41e26199b2b61d0b12ce780518c663fe641
b1af74ca57178e1666dcdef7a50d474a47519cf565f5b3045c36c9c8752246cd6d7b1
376c0c7688453b5c120a70503a8d407287bae71e976f3e0ce54ee2ce1e2c7d3fb2937
b34a6c40b4608dcf615e628f0c56fc31921a25a4261593022c5f222bcd9e08f4b3e09
1c466d4f62ffeb48538f79574b04c0d181ad30f9488aee97153bb5b570b40b425a60f
2d42b88cf8a434c7eb9f844358c49a0d6c35dbb87c39da659e4567607f9211ae45b87
303754211bc799952ee027ca93913997547a20d17c70f012f26db4562476010c82101
9825365e732c113695302ae82fad948cefa6c1527b4e7867db3060b9d5106ebc154eb
69d0454d5040789e5593a4a3290305d9f780798e750c6c56f2ef1653e9271aeeee7db
5850b7ee6f54e7e865f485832aecd3a1f75ad2f0fe9f0b0e9db2a84fe2bde39c240b9
b16b4241a585e579444e4212f7f047360b6750bc88d9b682892fc21fac3c6ae27d7fc
46773424f931ffc325e098157899226498beca1ea65370f314c3b78fc963edb7ff1fb
cc1554df08cc46d7438d96ae91b9e5038bbeeabff2fda5d242e678e19959a5d7c4491
9fcc63e41232b4b674f0f9d03777a4d06286e55b6bebc67e6def1c64abf758e5fe2a1
f490312ed5715fe6a3659c1067c69630801d1d75bfe9a4e67b6ea638ee6452cecb96f
8ffbd99ab95b067e1fc25f847024e25822ca42d5676bb66e17e71bf72900134ac3597
5c559faf239ecf1ab465f1613d3cb184186e831c1b8b2448145f05b35e7a0215b2a81
4e53fe4c2108833f050fee8c2239dc1bf67c87dd2c6f1332d06e8f337644ed7685bc6
79d8dd8786915756f2705a4d1f97179943934ae6823b36c8d2096165d70506b595659
ac1452449f1ca3a35fcd08c793df9f8798830dab531e9147d1a7847eb564d1eaf5290
c612b3e282fe661f5530f692ec362eebdf4acf6308f588e9729bebd1d22407541d464
68cc8f85c492e9a575e7a406b01482bde89c60e43720682bb8fd8f14627dc262d1d1c
86ca004672368b4d008cc3d2bb205f62c431f5f29763bb0452058edf265f5a2b14ea7
d65a75ecb763e3581dd5b329b3e7ca9c4cb128c7f4e61abe7c6d9e428f687c261fadd
772bf9db759d7f07c3de34a85fee53bfb9e7acd93dfe597d716f2471c65b3d905a108
4f485e5beb0b5e03de550a476bd2f38455ecf1b324c906caeb3ed38e2135e6817c291
8fa430d1fc042dfea4325f6f0ffe5632277e56bc615f3448dc0f3c22ea154edea2081
31730e1dc06548d92d224e598ded68052276c68833f4018e0e6c2758ad18306a10aae
b2ef65d04f41c948a082a7125129aa55930e4408e807287c89d8938c1c5580d44ac3e
a34629ece428be94edcc530eb481516d99e5796f3c807604cb3b1cbb181323da06b81
6e82555674e2aaad11fd42b0b523fc5ab9534a32591ecead66af7bab26357d6c0a1f7
39ee6ea87cce2ec3a76744fb3420d8973607a82e017d1f815fab2905e6a1daf724326
563e31de4e3be87ab4e7765822bd833c1e80a6704655951519b44db6d04aa4c130991
ec4b0
finish_msg:  ede54396ba16d1bbaa128dec29f4b6c4ae3fcbe358c7e3039c328f3e
d6329be53cc00acbbb29779dafd66ddcf9cc646cae3342c27c268dc1cf30e17cac3d2
7ef67e57be40dc8407fb3604c9953066191cb814829efb83f8dc1eca01e5d11cc2982
0a7bfe2905e48207ed4531413a671f2798771c1b134aae989222590839ee3a9d325ee
364ceb5fe151e79c1ada732ad1f16332b125b80a24338a9198746e5c482208355fd71
1eb9883b7178b0b30d8fbefdfd6476ad59937809ece53dda7159b1fc9681f882e02e3
f7ca4c6d347faab6a3c2bee9fb40b2b128d1515835278bbbb39fd128d09fcb9244bb5
0eaf45a3737851845faeb8be99f56e5133cb9e64247296823ad1957385e521e714ca3
f3bd5a20b2d0d7062a7b1d39ca26b6535ecc8b540748d1e9e1ec7ebe3567ee9d74ac1
3cfafa9c4dbc9ece8e95873f7804d2aaa9c1ae9b258ad9bf235065b9404f6b977dd7d
382f94a7f8222a479f38dbe62d6b6c18725b7cc54f52a8b391f8d4bf2aab5555aaa43
ed39363011975d9c0ee518d1ed101e6972c728c4f7c697d89b3ff30352c85c10574ee
7d25e340c68149d48358aeda8cc0120234613ee5c62be2313a83e6c5dd943ee2b8029
ad5ccab1fac80ba26df5186ea7f077b0ea907fa787624a2bc723c91a0dde8e347eb25
921a8b1fe0c63101b8e95611656d1dcd3950a19412b3e380031131fd11dfbe6b6c5ec
8910e267a997a8141a883c6bb160abca75bf0175b2dd8f5d64cd21b9c824b49e0dbf4
24fb11334c35c9e34b13bb00a6cb4f88e3524b3db4b7a4e412b492dae2f5de34720bf
7165e240113839c390d4152b89c26f6abffb75d7c65e6ccc8b827299c76e26a8767ef
4f7f812345cbc0f87a3ca4185b2cb1d0493d4868c76b82b498d25735cda0d8fa1af98
3a0650da133afb581a73b4c0c2efae82f394269af4826dcf8b5c40b3a3f73ce5c447d
441416fa8429fbee319cc8f3abba7c0942908d6b5f8be4670b418c8ac5a33a24fbd19
471bc9de44f56a0c1b9a02156049c8679c2287a8c99045eb31eb04c9aed7c64d4652f
1b6c230ebbe56e34d2e02f8f9025fd85f254f232a1c9599913513950d24bbee7a9a6c
f49bb5c4bcb90bed2d1745e29c50b858297c1e8efcd7f38a9eb4ee54484f5b3403e77
979900c97296c3b79f4b6c8473496715d1d21e4ece8c2a7c3b0c02c052529ee5460c7
106730c4782a5557caed41f0578056c6d5e894dd14880bb14cf85562b79f18b937576
28a1a61722f6dade684638fb2047576e692b206905749fb362ed7d6e5af17be94b2f8
7e2236e53a7fa521172a7c395a4842d21ad69d0689689c92943669f63f9652b86ecf0
b120ab0bb280934cb67db883f0d2f210224cf3f7f2f1254a689aab54a8366ad264852
8edfb014e0de56aaf2415a50b6d446c83178ba76fdcf86f1c9b336449d346c1d44216
6de28f89b33063ab3f493af1ec393e665fff1ee4acbed39fa9b05169c256a5670ff0d
7d7afbd56308bf997f78e5ec9035117f7495c09d7d6539f63ce4af995eca7d27a4f4c
35bfd9d2def1792cce03c67547618e31c75fa11568c7d
key:  ffd24aec545e3a8c651d25d31dd8ece89aca16c41f4a7688f126702faf27ef5
e
~~~

## CPaceOQUAKE+ Protocol Test Vectors {#tv-CPaceOQUAKEplus}

This section contains test vectors for the CPaceOQUAKE+ protocol specified in {{quake}}.
Each vector consists of the following entries:

- PRS: password reference string, encoded as a hexadecimal string;
- SID: optional session ID, encoded as a hexadecimal string;
- pcp_salt: 32-byte salt used for in PC registration phase, encoded as a hexadecimal string;
- respond_seed: 64-byte seed used by the Respond function, encoded as a hexadecimal string;
- client_respond_seed: 32-byte seed used by the Finish function, encoded as a hexadecimal string;
- pcp_init_seed: 64-byte seed used by the Challenge function, encoded as a hexadecimal string;
- init_msg: output message from Init, encoded as a hexadecimal string;
- resp_msg: output message from Respond, encoded as a hexadecimal string;
- finish_msg: output message from Finish, encoded as a hexadecimal string;
- challenge: protocol message output from Challenge, encoded as a hexadecimal string;
- response: protocol message output from Response, encoded as a hexadecimal string; and
- key: derived shared secret shared between client and server, respectively, encoded as a hexadecimal string.

The vectors are below.

~~~
PRS: 41ac73f17f60eec0ee8cce874a4f9a7c
SID:  0744270cab992ae77c1cbea2ebb4c03f
pcp_salt:  9f5b52b091f6cea43c531ab526c6380ba665482eae33fc5c7e8f321572
3db2cc
respond_seed:  9ca72674368b8e8eb3b8868ac7be437a081a46be2480166e128ebb
048583324c8cc54cf679fd91e98f99567204e49517d745c4ed5d54913fb55c084e9ef
4ecab
client_respond_seed:  9bf12f1a9d1edd3e5aca33042fe51a2d42c37fb2f979812
ab150d8fc3e1811ca
pcp_init_seed:  6e410475f8c923df6420589ff93cc60f21a523f1f4d0de7b4bb62
d7078fc7e74f2c9a84a5b5d893fb75cb89711d8d83ef188f63c64d3106bdaa5331deb
db21f3
init_msg:  042d6e23f15b0ca7c0854f57ef4d12b855b74c04e29f6c73424f1f0100
3d7c26577f39c922ea3cdaf212603f462cd2bd774270c87d1997820c1a05f59ff2fe3
3d7ac9d31530e9fdb4cd0c76c893afb570bd6444f63e9dcee3c3bfea04f3b287da8
resp_msg:  0473c52c05586d8c1fc3c83ea8713c575fcbc176a23d4fdd92408c758c
f2d455da463d75b015cec7bb421c5e9dcb49873f3c4ee92e1dbb66f32c5d480d09971
e1fd6f48b5a7221b97444d46c555fc41cc17c2809afb8cf9c4aabb5d41378e98505ac
c2553b27572898d72c52ba345d24239565b5aaeeb23fedbcf4bd11db9a81088e35438
b196b8c42702111579ef5c66b0df7937aef44b24f8178f0a2d731f8d0eafcb32ab3c8
e0dac5b162a02773e15f280998091d0418c6679093a668f5f3f84877509224dcf84b0
f0aaf79ee5903682c9c3a34c6541dd85fb2e11f640f2f178cbfe963d44d2a41b6bdae
e83d3391a9e84c3b7add5759eec7cc8002d6405ddaca1f84c45d6526826b5db09c49b
d0b2d291777dec859e276304ecdb6dbe0e84c8aa7e564c59c4a36185137163349d779
9f9fbbe584801c7b1e4683f332a4b08e9892172de0bd2f1bbcd213284b1303c5cb6f9
5a1e31b7833be5e0a1330a8a0b03701871c234e0a8c3b5f1471579c05ba6f42283a0d
65d0ca7a5058a5b93a7a11d9d75d08764517fbb07a1ecdeab00d4f6e2058011bcf5ac
94d51ba21fc1dedb59bbd851ac0e6be58485c835ce439b58615080982985aeb73f272
59119384c94630d8a8ec7300d5f0b71db3ef5469b26fe8ee3c6b19cbffbb85531b81e
c4df164fc5e52bac40d084142c39504e55668626886b225fcf263c345c9155d805d1e
679907b8b3cbef82bd3bbfc6ba66047f79f284d7c401f5910c11fd1ac7523057c65c0
8802b525996874f748a529f1d4717827bf202a0ba8dbd3eae5cedf25bfb6b5f7d4e1b
bbe27d00d0fa120584c93899220579270bad126182384e5e42fece3439b9f87302127
de09ef6f0d6f01ecc7e1c779fab4bf3753d77d2a1af21a73d3da03de568dbb533da5c
1319bfc51ad887124bec5742acc2db42d91527c5f03913e8a388341db1f5df395e237
44e5ea29799fca3e2953da5aac19ade8bca6039bcbf4363ba0412d239b9fae4ddf527
ac62d6d060fcf152e84c568b17f232f2755ae6307459935dd761b56f50075188173a0
b1a708e0c463feea1addfd2110d131853596bd24940566c27cf5ace6582a116d72250
f5d2c5cba3939b60364a29e22652c299ec274135cfe1c7483a76b57f51278f342e47b
0efa6b02624a7263184a7148cb500c19b6dcc4d8d0fa4864bcd48d2c982850587b8e4
cc97f1a21e3a1306a9797f00a2e2db20c4a5ba2b3063a231b00bd21b63ffe1856def7
00b583bb1dee0b68e3c5c0713136f4cce803c4e206a18de44e9010138a19eb56efc79
28de6681ef3e7c780bcfe18a120c581ed02980f1f94638281208ddb52f293ccd717be
b4fd1db30467d9c3e0eb6dacfb333479cf984a2f536cedf29b2fe4a060a44026d96d8
522f808a8af156e0da559cf795d5c87cc2aedfa872e4a8f9cbbdd197651f128b1e314
51bd97d1086fb97178a1a35510fe90c56d5fa1692e17a9226134db1de8e00480ab964
f81b8fc07744af32f31d6290d8d62d9c353356d3ce61a76f6f486b6069c92de0826cb
67ec5567fc43b03dd3c3c1213f389d27df91e5b6135518cfc252ef80d26c41b96a738
35c280381dcc2bba3e8174fc953fe9d0beff59bb993a00bf791bf6b8eb1e1deaa541b
f444f3fcb6388612585ca5e0d2b9e3e015a93dffd6f9e8d078310099d3cc848e8df8c
e1b3c574f161ba6c188aba22ebc3578054426e2dd6a587e93fc82c2ba672cd2b5b4d3
ef3a1b15ee89321977074fd413281978049f0404dc3691bb0a05dac4b0448787febea
dcb8fc5389573f95f3070b0119d629aefd228367e25dc0b39e48bdcf9f69be9ceeee8
5265935ce91743bb1f7af5f77a027ade15345c6dc31bfe6b146503ad2c0ebb0d0bffb
cc46f49a0ffe089ad53a70fed545862ae88cb3f05d3801de7c648dc2f5e485a685a25
a9466
finish_msg:  6b5cb16f05cce347ef09985934b84aa864525eed628bf4f629eb5a4e
00e79dc9af0369524728b4b02fb35340735afe1982e9630276cc11507aa867b08f1a8
b4b334b77e5dfc0490b28a37a24db5ee81dc83b7e62ca5309277384191c50491c6239
8113a9a97ea10d394a87a7695960ccbe696ba9ccc66e8798d7f6993cb7166c3782e54
e306cf726afb1e2608c4bc0478ab210d63b99111262ab45da115c44b233a2c5e000e1
b533741ee1ee4fc61663c33f4f642e2e44687334a1ff89eaba2e81d10b0ab62c80379
9846a732cce5aff1e0cfa15ff25c9ef7b736a9bd8e687202b6689971c5c80642386a0
9309dc0c2848b8255d1b8621ad36df2fef748bae6075a7a7a3b5d53cc0dce36ca71b2
70380fb4c27be9327dc0fd6cee07bb626d989e4ed31bfb09247d92fd954fa238b037b
2a1bceca482db496a43e2c1ce75d4897bbabae60b61f9e3720cf912b42f0895326147
f4ecdbd84263a839a8f4279f41d01ca221340141218b6bcbecc0a45fbc1611dc1db20
cf5b6eef0838ca41ffe9ac0ceccf19dcecd8195998f5ab2f79da7b1e32aa64ea39a82
4ea12e9c0f435ee4fc6648a90e6d8fb2d0f68b0d921aa8d3eccbc7ffa06a12c06cf49
6c12eaf93f160ab4cfcf120cbd9561e5a98f15432d25f04c01210c657efb8f195c7db
66fe449e1cdfa806b216d8d3956f683438c323a9f119e69152032f548faaf349288d2
f1be03dd489073ac60ff78013cd36a4d14041a57925065978eef792eb7acf8de709bc
960dda900a362ef2711e07b50613ce91dc5d01900780bd1a5615091993b27aa362516
fe0a9622ee5baaf06584190324d8be291d7f696eef2afcc3df1e9d6b7dd7eee874e30
487ade9bf79e4766976228880bc8a72d23f4550ea6822e071230db6343b833cb44072
ca144ad94fe14283ec2b98c80e6be4aaf518e6a9db3b6bac9cc0b80100968bd614bc4
8109ecc5ebfb56ec3a3455872bcd2d1ce8b30d57c4960f6389d504bb22f0092121132
df9192bff2ef8bd3fd12a6ed1191643e79000bcbde5cd47f1581f46f82ebbba3f0d03
913bca0498ff384be79a485aad91fe75cdbe4dbb6a884f8ea9237ab4f3ac54817f1d8
0b1100d4a022325e8a144e13873c4ce5604f8cdfd3e5b21c04ed0deaaab9406381212
b9be4f1b216fc3790b2abd521ae18ba9fa8375f96a9b4963722864230cbb598902360
798fceb7c7fc8c672c7b6c362fde5f08d04b85e744a870e2d3dc3520bddf38d5bd50d
274571313789d8efd9c32a6155609abcde0287f374c89e60487fd8e4882bd24491996
0c048984e2e14464afe449032b560c3a2a93896dfcea0d04960cda6e2858b0291709e
7a1cc61f33b65f05d4d84ac4e48ee8e86ae11750102dffc96473db257e445b821fa5b
8ca563acbd5711e07c643e2840f4a0491d4e3df82952aaeabf0adce061d2c7d54540c
a22e22dfdf4332fdcc949e6af3a9d1d0c5bb0506e94f63083241ec57a435719850fbf
802187d700d4088694db7e188971a9184f741d70603b5f784cc826835d4da0725fa77
f0e78d787959b4e66be1732b7cfcf0d28323daa3f198b
challenge:  4902871a0bd91409647c036591ccbf0f6a794d0ad20aeed41e1920888
0a8bd5ec184c0206e37257b788417bc1f8fc49d6ae783378859166328f07754548b53
7a08d0b23cb5addbdcadee252524c964da28a518cf57f947358fd7275b10d48cfccc2
506b81858446a8490e62d17596c6a5e508044177bbb0b398fe55e6e4183dcd330dced
4f9fc8db636f14fcb8213a95f79d32e3b4baec543189dcb0f2f1c8a92d406eabc4cc5
301a5f7dd05a0dcdcaffbb0f66ff5d6c862daf56940fbcd658bf738af27285c6bbe29
70439a52912cbe78a1462d1e34553e757809c4a4ea5467dc47b8272f5027f61363212
d8d23e29c6f4d5f701395ab5a67229291e8c6a24f34ace8c6ceeaf71b9f7c5e2f134e
97960bad15746462c35bddcf07bcd0871b0dd1ab40334f160d57d05772244df5be8b6
66add46870abc4579653df10c6e363ee38aa572fa4e31c3c569f1e636c27bcba4c806
3a0b0547c793acef5240602049aa19e4a3524e3382a803f215824e69bca890ec4d838
4582d5739ece314e346cf5b9ed59a252ba84edac83ff10af3b3531ce6d628f9215d7b
21c79001cd81c9cc42d9dd38c2c338c52062990a6858ec6eaee5352c4d35de8f7a6d0
d38ef7b556581bffe57a7ffcb47b62f74b4d5b9d2c2167bba8456326b6a6aaded31bd
6234e6accd4f65602f3cd31f8e4314bea25ff56876b1cc3f6884091c296285c6c6aa0
7ca143282b267064de7d15212388a9b1a8af395ec76f4e699d4e445666ff19c55fba0
ab02bb1cc0ce769c61f4e950c866796fc34d9adf50320f95256fd2bcd498683d1a923
c8155f1afa09a67ef5205bb4337da9b848a3855ca544470fde7426087f46e86584ece
d565cccb803e418c06f76e7fe5c85becf2b3cf2e6ee55bb00d367373619067c9379c0
3017c201a03ba783f183cc7f2d620aca9a58dc9bc0fa3a770859ea021a597a4938ea8
f098edbd3231a2eb9b05e13b4366567097c1bcdeeb4de7ff2f4935028eea7eeab3065
95dddae916057039cca50cf0ed1f392526979a8636aca9d6459536f014a21024fde3e
7d53690cb660f6baa8b93f37d054d59ec7c3d0420de912abbf33e018762ce1c1158e7
3420e520eba03c804cef703add7a9ec9cedcf200b8b8c8a37f7d25d5c60484a067106
aa6900857c6c68a2ec51241352bf9223947ddaa9273429dc5f624d6e6b82ae245e139
c91e3fb26c07e2a50122240401782b982fdabdba1d773d559c3429d68564c379d433e
fb54aa0548de8f115f69b2d6e93a7a9fbc8115e2f17ab2e67fd1583cbbdf71f03561e
2477af18d14d25fc47befc3b6f53dd980bd55cf1607e042d312d8b629101f4be66266
20e21326d1bfd832c1d54035ae1160d1bab5120e2b33b2e3f29e5a94e19dbfd02b7f9
675ae056dd58bf8d62ad8192280b71148e080091efa793b37be7614aec16d0203bf6f
fe68e9d0c33a93226c95758f85f974a5d44800e029380b510d30f20c34519114ad793
8a581d82dea7dc56e3e66d27ac03e6a1350c63043274be8ea4b5a0150d888804b37ec
5ad0ac43846cb4cac7ddfddeccca5ace739febdd9aa7c383d3c47d88f0bfaf43900a2
fd846e0dbdc9065923fe7c97566e112318e0b7acc4430c470cdeae0ce8dd03b74a08f
52b8a2a3dc72c945a00ac470c0934e1820
response:  0302cb4f4b3679b8d66ff3ca9d5c1c7571ab48f3741d69eb8aebccdc36
b1f680
key:  20a66324c9db64f2907bbe5171856e6c38f6575c431535a4c733a4f92d1698d
c
~~~

-->

<!--
# Acknowledgments
{:numbered="false"}

TODO acknowledge.
-->

</section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y97XbbRrY2+B9XgXbWOpHaJI0vAoS60+c4thO7kzg6lt3p
rJ4cqwAUJLQpUk2QstWOz5obmH9zAXMRcwVzKe+VzLN3faAAkrJsJ9191nq9
ElsiC4WqXfvj2bt27RqPx966Wc/lkX/n8XWxair/eNmux/+5EYv15sI/Fm37
ermq/Pub9blcrJtSrGXlfyOv/UdvynOxOJN3PFEUK3nl9PCf4+P73zy641Hj
s+Xq+shvFvXS86pluRAXeFe1EvV6fLVsx2W9Ohtf/u1SvJLjIPTaTXHRtG2z
XKyvL9HwybPnX3noOvYWm4tCro68Cn0eeVdyscE/vn+2Wm4uj/wHXz37Gr+p
hx6sri/XS/+r5QozeCZbKVbluf81tUSbC9HMj/wfvv4P+UZcXM7lpFxe4GNq
c+Sfr9eX7dG9e853936gns+a9fmmOPJfnDx6du/Zo+Pv8dkcQ2nXux/69v7z
RyfPPU+AbksM2x/jAR90aI/8P078Py1b/l2R449yPpf2s+XqTCyav4s1qHDk
379ElyP/yaKc8LdSjf+v9MjLq5eg4X+ISzsN5y0nE/+PYiXLV43zppM1um7n
4nXvu/4bXyyaK7lqm/W1v6z9B2Le1MvVohEYxOqqWUh3GO1fVTf/0ZTtZFM2
E1lteqN4MPHvT/wflsvKGcWD81XTrpeX53LV+/ZWMy/F6/84l+KyWZwVzbqd
LOTa87zFcnWB566YKb56cnwSBdERP2bY++Tx/XHMBKjEqjryj+XqYrPmd42/
FC24+rFoz318DdZeS7Qq5nL8/WZ9uVn7X20WJbVs76g+xepMOiu/uJpfbgqM
BdOanC2v7tEP9Mk9Gsq9p09Onk/opwlGNbmsau6EORmCdTbyoyCc8meWXfjP
WP/LlDnyn/JgxRwkaTGrzVrSApkZtTz057I8Xyzny7Nr/4Bee2jJEffJ8d2y
2mB+34o1hFpqCkCux48WpbhsN3N+mf+dJClv2gv7nt0UKNtV2U2fp143l+09
vBc/YNDbU46SX2vKHqkbhx++3kRJf/ZP5WvotpWomrOLljSF/6ium7KBitup
84gUx6vlelku53t44PXr1xPZlufLuVi1583lBBO4tynvNWt5cS/720UQRUF7
44yVcPwoFn9rMGR8/O23j4cD74Z5v72+uJDrVVP6pG39B8uLy2YOiapXywv/
m0ffMXHuP9o9Wnm5ahbrSSPKFQ+UluNemATBbUa43PjfXm/2fHsCmp3NG//b
Zn+LjWggbQue4nCGxojsWQXX9EDF+PjSf/HA/2qFrtH+1YdMN41/6ek+fjac
jlmbAppzpRjWYTXX1hKL46dG3KBo9swjCm8xjz9u5o3wH8u2lXtafNeArnLu
P1u2cgFre4bv73/5x2g6EJ7lkwdHiuksr72GfVxCUT6pJKT1QUO6/fZzmN6L
4ttM4X4Nyiz9+6tVI87EvlkIYIO5/6VYFct2X6NdhvD5o++Ov+9P9bm8uFyi
y2/HNEmAir6oAVw0c15JfPW8uYBN8u+v16J89SFzD+M8/6dP/k9//OHH704G
S33f19LoKhstmOP9kNDI5TNwO/jj+5UogW9gceT8Q6iSxLfh6h52ut1cd7Xb
h0l2tBTr80b6P24We18przDda0jAfh2/aMpX/kkjVysB+DIej31RtGtQCmjm
+XnT+gDLmwtirQpWZdUUsmWaPjgWpfz+P1+AD+/6l9okjXzhn6uVEnalvEuz
UqK3Uq+wUtKs1IEgjj5E12Ltt5vLy+Vq3foARhuYbNFXvVhV4ZfM7+NWrgAS
/VYCPoDpW1luVtIHXwL1rb2/KZU2BpIgFOULlgnQY9Iff6PmtJLAG2uy7IKU
ybggMOKBGItW23G8nVUNtdYTHZg/QwrgQzBE5b7H48nhXWIO+THkrBSXOpSe
+H3Cg12WeMeiar1yuaibs81K6WYfo+pNZKJW8KKpqrn0vM+gy9crACzGjJ7n
SM8BngT+of5ldXgb/8oskWdmiHmA1JhGc7ZAW2gefHPVVNI3C+4PFg5i6Kkl
nV/7NzDDDQus9bu3kvNr+p169QHz5pgT9QHEtRLgX0yZGOHg+Jsnh2zszINV
05bzZUvPmmG2NHb1nhZwz1+uSfhobOsG3K5+xdopZaLG5V2I8hymlNYKWHCB
CcFqYuyv0Vj6eC0t9Er+bdOsaImxnJsVvdRM7HP69qwhUSPaYOWeqP7FgKH0
zEfOy/26WbVr/TxbczsXeKSrpoY484T5GTUz+D++/Y540L8S8430DU9W+O4K
IzXs7XWLSNQ7h0l2ekPv8zk7nit/00oiIHd+7ZLo1WL5GiJwxliZPjddYiw1
PekSoDc/dNn6cKq6adEgnNdzA35guYLUXi4XFRHXThDjgUsMmW/Yleozm9ee
C1oUKIuVJG3DUwMZnBfM4axDwBZYfGaz2hne5924sGzfH9//zxePxvHDx/7b
t/+ufvviyfjhpFmtaxVXWF6Kv23ku3dMyhNa1eguNVY/Hn/74uSLZ189yONZ
/O6dR0K1fo3xKy++pXe3l7KkiWExekqmZfYD/TuZ1DLosSYk3xnCVM4xXMx9
jkmsJCZ6QSYQDz9evoaJWI2MobwELeWilB6rwH3ac+QXIIuvptqbUw3P2FUE
xEekIIjac7xpzpPRI5v4X1I3fXVytZkDn/Lr0A9gosBygNefLl+P/IdYsOvL
tfct850aDuiE/kiFFNc3jhlT7LjYfGzWmVe+xxU0Lc2GHkYCDYyBXjSgNYU5
jEYD8xKInvgvLs/IiwOrFP1JddTwLgll6wH63foQly3GEPirRsCCSl5spSJ5
YGTP8P9i6ZNALXxpYDtZA6XqrDEo5WoN0+cXm2auRjNfAgTSTLSd6XPLATO/
eg8W9NlXnmnZsfUhxFU10NyDNdxrWP35cnnRsjB7mE8BWKriN/INRJ0VYJ+D
6V2XBDfg/fsVQVeIrOSP182FnHwcClno1/zrwQm/Dye8j4cTE49Mj7K/eqTg
GWLUJfHtBd7dQIF0lAe6vWgoFtFC+Ric/e7dFonrDTGf0Tltf24kFxgK3nsJ
RAJlQS0WsoQ7J1bXJCoNqS3uqAGUefu2j1mgBbU8tB2wwcT6rSbe739DUBQv
e/uWopvjK1mul6ve4/S5rz9nbQElh09I4Z0TwsaU7VjUUrO1KNcLDHbij8d/
IIj0YLm4Im4gEaL3PZQ1eJB/95jCBCsUTLjz3YuT53dG6l//6ff887NH//ni
ybNHD+nnk8f3v/3W/uDpFiePv3/x7cPup+7JB99/992jpw/Vw/jU733k3fnu
/o93RjyqO98fP3/y/dP7397ZgousHTD9goATFCOUOKlD0Xo9iPnlg+P/7/8J
E9DzNzA2URjmoKX6ZRZmCX4BdFmotzGeUb+CNa89qDzoSZaUObHiZbMGhh2R
4mjPSSeRlgIf/fYvRJmfjvzfF+VlmPxBf0AT7n1oaNb7kGm2/cnWw4qIOz7a
8RpLzd7nA0r3x3v/x97vhu7Oh7//9zmQnz8OZ/8ODvI++wzWaW0Rrv9crqDF
OBCoGKhezufL18SOtQnfKipfwtIx89IKsuKFhl1uzjiCQTrBegTA9Qw0TQf+
6Yp92oPF4al/JslkQhpIj/GeA2zR5TkZfJJjpcMuW7mpluopeIHF9RoWb73S
4GYuF2cwW6eLU/4G8qfeB5Falg0HMP2iWUDC7aj9059/PoUaAETCmyG+hK0W
igwElwBhnJfYHnUv3UT+/P2zAwFIcdh1BvUtldiOX5PFRRP9WnqikOvXUpLT
O3yHfypOmbKnxamBbC0cXT29yYCIaM+TfblevoTk6EfxE33A35zSvGAQ1n2K
KW2z0GCZrPdCnikikQSesUVwu+bGbse80SM79cTy6n9/Ej055rZPou9Pjumj
nghraQ3C7N27EZkXqGh66/x6ODX/dH71EsoZOO/UV/8Sd7irzv6BIBqO6WOs
QHM2hi5uOB6qGQK6pG7eTDgyrQHpyOeu0ePBQfAmCEY+/g757+jw0P/C7z6N
+e9+C9pD2RppJdVIL8Wq3Rqo8VDkG5qu8jSh69SsKDgymIkz9lJWqgcyxhcw
4gyJaAGAsyZnkxGe7t5/cPPI+3Mzn55OSPq1H+XMBT2X4GNGxKRJeRB6ZJo1
AXoAR9R4IOqS3Q0fuMD4I3qKGrihx53L0Z/AV1/RwNTfQXAIqWJXjcZhmGRh
tJVi/7/MJ5Pzn05BoVoqQ8pyMydAhpEyScVqJa51+1PydFeEKIiLyd5W8g1G
oeRHKk+s+/x8HJ4ORnwGnjVv301Utjt2gMFkEv6EhtTOCLj5Iv5p37KcAO3M
xWp+rVzLHbPeP2n6hZqxnO6aus+rfepvgBzm3FySRq9NQ/gbEzmZjNy3YaD2
F3DCAf9y+NMptPt9LJGYny3hEZxfKOsAmAP2hepubwgVsRaZC+BGim0wkj2+
Xp9DI82bV0bpE2tM/EcCbGWlbi1esaAB6dKom8XlZq3fK2gLg8IKnh5GtSnd
tku1FcnhA+i5Y9seUgk8Rz652kHQTYAm4FEq91KD2SuxaoRWi8qLd8Afzwls
Lsm7/sz/Hvr3qpGvhyhVNBcqcMM49ZqNgfUqjmi4FkkzZl24kRUNto8ZRuvA
yy3iLtSRcRHIW3QCL8ZhBOjFqLz90Ye+nznxPzTs4+0K+/ifGPbp3JA9YR89
gu2wTyUv2AvFZ/7+gI/3oQEf/1YBH+92AR//gwM+3g0BH8ZFao1sWGZLLpvW
eGKsFawz1l6QH7fqOJUCE+V8w7P5ODfQ/YXeS2PZrNip5RE0LiTjYKbXd8GP
lP4ybiJ3R1jjwfH9B8NQVnmJL3UkS8Dve+33ohrcsR6j9VKBlcrzhvYiBoyO
EQDVrbWCVjTl2DiHL1p/c6nCuyYIyGrCxOHbTTG2ZCFHxF2Mt28vy0t2bX+Q
SscbFa+cW7s2+qXtIIx+f2G3QfylVkA2CDigKq27HUhjPCIdUWO1Blsi4QF0
mmZTtPJvG+KTVmoo+hqNVlK8Agu9tq3GbpiEWJzspmGhQYwHc/3v//5vX4j2
6sxu89Cfu+Mdf+72mvzc9/H1h4Mmw47u7mjS60h9st3krtvH7ib4S7Gh/uVn
74GRxK6JJbpuYnUHPPvdL/r9eOz/SauM7Zf6w08+dujd9Pc1GQ79w190i8Xw
J26Lya4lpVZ270dP+kRy4pv/e92t3xM7/eo/+LoZeqQASffSz92Xfu53hEWz
2/AlmJildmFRNUtYq3Nt9F6LDU7tkEjFOaShjAp6slZh1rWNVDXoZL0yhnAJ
d57Q+jCKxuEO0hCtGsRrca0NwIpiT0b6rda/IWZGxs2NmVFkzGn07p3Xn5Mr
R25gs+o/dznfUExs77NOVBTwEMbzcknmVztFFIZ0jJEGiUrPUZy4IWopRaOU
MVPbDTH05uQNdLBqOUaTlnXxZzol0jz70I0hvv3Mba6o3IsS90l9Lq5o/JsV
hzUppOCO5IgCJrx7uSeL7OCbR98d/g5jpLeNX8kLLMDYP7mcN+s1x3a/VHGK
m/pgqKWnXMIToPzECwp3a7tGszrQ8Y4Xx9+M7z/9ntI3RrTH+OWL++O2Nwbz
CQ+EXvuQoJl6p0n7w7AfftU9Yi2pfeZkDYBT8paV88yJ88yrtkZrb0dYtuOh
qqlhMYnKJScM6d1miuL3+KO39ixIhInbTaNISBsS/QDshKNlN9H07Wd2QeAV
vX8JGdMuOt/JAlsOp9XsdfKuMuErYRAgo10Sejg7WC+O5jAymviMF3jXlvp9
8vTh+MEDLIwKopkMI9ZlVbc+3B/1Dp/Ff7JmDwhoqjWQoYsAttcgxRuO5/H6
SszwWDSrA3r28Agfrjl8SFisdKe11FAdryF9e4lnKHhx0L4a+Zev4OZbBO/G
Tk6pWzijalda/eZzSJbl5/Sp+sTG/BStD9Dhkc6aaf5OKMkdhwk3cpju8hyr
uxJziqSwzzbWMY4O5dFwD2hgRL0eEuedeXKx+4/K3oIzCbGm1A3/QIq6IOYz
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
RVSIYErh0kEouVIXCa71OV+1NMRM602jEkpHukSMKputC8nuG7FvRkynWswt
Y92ac5XzG0akSt10VQBNt8qbowLrNmHSkIiz6m01G2WzqWgflW4YJGCZmKWu
Gc51Mvvz8AbzMGwHr641NYIMbenzhw3eLMeP0ekFl9g3U/HYJg3y5LodR//A
lj1XW7367sfKbOPqql9UNMcjmMCVFJnSXJCrX4/rhtS5I/qLMQ0VItoqRWhz
H3TpIxW5pmFeNGvqife41U5BDTY+10raU/u0trB7a0+D2B5VIjHXkBNd7SNM
gMrcrZpis+6u9uBJm2M5I0o/1vfy3YrZjlxm87oimVZnPRx/9+0Pj5zV4e+d
cnvbJQk4D9pzqzu51fjoxntdkE8nJqwkVNUF7XjvqMniWeW33MndE/9LyXsR
vJW1WVHtWUxT3XfnFpj3+tvLtii0c7WZudFOz0jrqwGjD9l8tFPpgUhEfec2
Q9/cZqhObHW3LJ5t8DTQk93w6dkx1R1NW+0PMaPMacjqMCzfuS0FXxXQz+Q3
R3H0btf8JlbvW7yaS92YNHu+iFHd8KlSFHg1ub3ZJKLMz7b/MhId7QT0ziJ4
XCHukdGxjqbTSs4wnC6L53KaOaTVr0bo1hEb3VDVx6YGbI0TMuY1Cyi9tuH6
X5qh7NjHZv7ueQpbakrf12CVMnTFnnqUtrKBouMB2xB+zZm43K8PDyc7+KI7
ddEOzoypg2c65NY/drbV1p4ve862lO494r30HjeYQynmzMqmdwXuLm7q7jBh
NNSj28k3YbcpaS4Jk5Wr4NerkPxFT59tYdfOJms4hbf2DeF0GNlHhyN68eHp
7zzn1Gf/2trbCYtJpjKJllyFrONy48hN/MeSdvpO9UBOTUay9imXeyLPaqlV
+YPe6Z1W2WadfERb1GaGtxn2yNtzhsYSvfUPQCU1vVXUvyJMJ2RwF25KhedG
Fbb6PqCV5nDnN9v9Uc3TkeesEy8RvxmP0V/RoSmxq6IKc5NJt946+Ufw3eHY
UQdRDPOY8xeeYmZODTBm20W+/dZuIoHGzOpizlalWRhwouymU6fWzR769HOJ
tz5s1j9Q2Du+uOPP/mNvu/7sPXc4PuyPAv9D5tyP/uAcgrz7+/7XO4hwML7d
8cTut66T7s4CfHh3T/Puo1v1vus96maNX7b33p+7WyQZrNRNvV/t+OmG1d7R
fNj7XoXarbA9KIsV3tvc9O6e5zwc36wGBqs6fl/zg1se+7yZ6rcViU84HXrL
P/oQ6YsF38vWU3Ga5tbD7goov++Q15yq+p6dM5xkN5BjGfNr92JdTn0CqqZQ
WmOvB6+MeuULvQALbIlgugXF5NBoCMptVG3pXjFuJ0+YsYD+0mIq8y5SxG6W
ocrCW3hbQ9pt3uzrVYCITi7R/UzDa5m6gzB0BtDew6SNy3O3xTkHrDerLrtz
4pska++JiULrSL0qTd7b4tQXXGn7YsPWimhmX9f5Weq+vPf25WQIPe9lMfKV
UToT1d54xwlt3RzYRikTpYwI+74jWs4XoxPN2Er7976xjH9rblZPlOs3ENeD
Fn9dtGchRZB3CZgbiJzY9Bn97sNh413CuU909zV2hrS38U3T+8MvMwz9B2SK
iEwRj0n9HR/qlITBYy6p3I1VmhFPyNLtFxhhf0T7Gv/+Jkp9BKHUpvlLLtCC
9ya7uWYH2zhCqTYNJpOJbXzAzNiCQERonhWTeQef3TRmHtD2mLtf/3Fso/+o
xIKXvMmx/4kdfGOUzoHiP5rZRzLNB6oF7U9069zv1+zH2Xkpy8ibpkptbZ2g
NQnu1okU2kqYqOHw1ktzqpb3Vm+bNurdPl/Gt2mjz3veoCkHQ3eMsQnS16Ga
XFLPJN5vHXrfmVqjutcjaaUKzzRtl2O6dObsHvn532mjH5A2qoNgtnSXLk6j
QgB2d+zm7E9lCklDQ511x6WGTSlTJHSSN6PDQUJgSBuP9uruA1b5Tq6B0nI+
qblB/h+Lj7LtgxOveik0V5ob89RSGeJ1h9A/TGQYMH2MyCgPfiA4btKi6CU/
eOZCL6ylPkXbEx++kXaiTzVQmLdXvXt/xpphGl0XpUcwzS/tzgBotw810E2V
vYnH1VZ0T6oG06YDRXJGvDrlz0alSGW6R9/sQcDe+PjWF7eirinGxvcB1P5p
G+oDjRy54gP8Lad/8JNcssDs4hjCkA/ikQ/Ct4Px9OjarHKtD/ns0DG/XKae
O5DtI4WKzv9MvdQdHf8YvdR/2tFLe88c31Ivja03ub+l5r1fJ7ev7TRfl9g3
mcTRTyO/u5refhVHk8lPrNTA5+rRyCrN3gup04H2pEfu97M2VC8mZ+Ny1eID
m++hnvjypieUpnAfojlFQy1NySHgDdYbL1VOoZvFojQ3IWrTryMkd6iDnQ/b
vBP3266PkycPKV0w2p/d33/OpvlTl6BhdFOujTvAQcINL6f6N+JUGyI7TaLX
px08fdr1S7+5tLT4M8aTAzcQX+yZgZNz10ZbVjE63PooPtyRQd+PYCmG6lye
keKOEQ/xsMtt6rL4NCB1z3nbu9j3HPLWhra758+xJm0f0qlzjpTUsqvKg9o/
2GuzzP3uT3TpWrryzdSY0C/3+jbLOeraleoxURbdaNKbJOdW3GBj2NFuo0Ol
W5vKWBm3j/Z8uZlX2t7YFDbX4vgfZnEGvuBHWx4XTKkXK8CxfQLfhdNuRuLN
FsselfwVLZYqc7rwn+p8/UHxi38+av41rdPOoIC7qt1KDSxWNEhtVDdYaEvU
2SzbRNss32ixnU3u0ikQ1k2ugbOmrfPGrQ7S5TX+UUbtf5AJ+9eyYPg3ssGq
7eictSY3GGMt/m6u6qdNiDlR/ZuYCX6pf2DA4sRftrNc7WicLFn7mTt1bU+H
QbvOQmqf07WQWmXttZD8hVOssssFKM3epzGXJn17rVMQemYSquOpuY7pya9g
aIbRe7dq9ZtRF9fpK3yM3jrgrIGT2xmKm8pV36TlB3r5V3cG3LiiDityavmH
QC0+SPHGiFYnVDsilv80+XEDr58sP8NoZ682+N09xcEv55u2n8d91ySgTC07
iWOV3kwZDXy1GucoUd0CJTLfPPpOlRnl1LnxejlWT3DSSHdmH+beZX1/q1S1
2mNcXC3nlEzXS/vWYsyZw5ilCg+ZWvdGom2qn7fjIiCNd1hGKb1TqlTXfqJv
V2XSY3CCZ83bRioD0VwG79ywax52j0tQPqk5oc+X7PDZ7a1MIic50URp7Owo
7qVEl6rScJGoPU+b0un7rsAzaWGS90I5kLV9Yfagerq6pN65KJVusVO7g56m
uztSHZZ2rr5t/c/dRu3n21XUne16feF6SxU9RLuVj3ag3BVT4sIzuubQXn0o
NmcXqrIFsd7nKgt8tSn1BQO9shfffvvYZr7xB19vdHYbn549o+qSvPmsXLPW
XIho90dtHafWKd5DOFfjemNr7OR5MZ0oIbVdOS9SzGmqe37d9fIn28Pbz9D5
2PYIoe2+I+5QkYTxfLl8pW5umm8GLLPHa2lVbS99ZeO6S1M0mcDNha5JTDdO
WY7ZlVenywzxRVx0YaRDAF1T1pR8qZoavEUCCUbE193mCixKlzVkS7i0VpCv
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
hlNXpPxU7PJJ6OUXwC8fh2B+MQzzKSjml8IxN6d33ohkuIjpgBS/+WI3A9vi
pnzd2A757pU4dRVPf+A3VD7d2/PQ41cRit2QqNNpjurlC9m06R8Wjdz2g12r
ykZSmUNzWZlO2bH3/1Dj3tvMFcD9u6zMtx9lSc2M95ZPNhmo7v3UnYs9HiyC
XtNRF/WwwadbVFK2yHWHUfkH2gGjr028ylBk51R16fn9ILxX8xhiMRBOiMXO
ft/HuvvTPneX89UJlP+2e4dKY8b9z5lzozdtu3AVTaAuOrzT1aCb+F/RQVxd
pVPfAUfVYNzuO1RutqZ6INFxPICz7JZ499Tpji2AUyf/8T5f+K5Ki7rjYPhv
asvsnJupXMiZqYOqX71CAPyBita7aZTOLIyf4ik/xdyEyZdju+K1ezJmT8R3
90S8fhKpvjAN3XDoTF+YrTUAd8B3dFGcDdRcLnRlyPsLb7h3PSgc6OwZbBco
+8A6RnfdZ3/u7+e/78/P/Wf3/hkM6a561il7Rs9OdgxuslUQ7Wf1rFPI7JDK
WO3ac6JaX9ulv7bG/Dl/Oe7VNPucvnLKn/2851n7w7BM2M8dvn7vs3ivGTuX
5OqPmTY/DsZjm3q6t5v+n593/Lp/CMPGtyDb3medmmLvnbr75y6/yiEbV4K7
3bM/b4/559s/u8Wet30WKLDPthP+7PZj3v7g13/27vgP+NvaHd///X46a8qQ
DtMz/EPf1PDWHLHncec47+po+89uBnUKzPXrE24rEHdGahA7y8fdtIn1udvp
527zwTw+WKeq0m+EW9tNSYeD4SQ4d7AavU422cmm6oX3HLef66HpnW2vv7Pd
2a1etkZx3TNM/tAwObsCXRyphyiqpuoQ2aCaWs0pJDQct+Ka93QJgMinMlTS
lnsepAPS9piHygpyLDefPaagg9cM0s7MjaLudobONht1qfJcd3i5lXW3u0Qa
vfzFiKuSqTU2W+pXI7jd+huHB2679h4leLFzfkPSqHn7Ie9Lb1WScY/MXw3r
Wd1+D/hWD/B7b3zgvVP+gG3pPUOyx7+iAQnMmcsrroW2uxTaL0GC6OYHbqyI
xn8+ggQU/tCni28qfOYO6WrEzMKH7HaX07v1pD/4Abdi3O4H/gGM0vvDt5+/
tw6aKhRxQzfrN+hm12HBGx5Cz7GKEe5Iklm/IRXy6/Aqv/LGB34VXlX/7qXU
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

-->

</rfc>
