<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.17 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bar-cfrg-spake2plus-07" category="info" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.11.1 -->
  <front>
    <title abbrev="spake2plus">SPAKE2+, an Augmented PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-bar-cfrg-spake2plus-07"/>
    <author initials="T." surname="Taubert" fullname="Tim Taubert">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>ttaubert@apple.com</email>
      </address>
    </author>
    <author initials="C.A." surname="Wood" fullname="Christopher A. Wood">
      <organization/>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date/>
    <keyword>Internet-Draft</keyword>
    <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 is 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>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/chris-wood/draft-bar-cfrg-spake2plus"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <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 makes direct use of the password during the execution of the protocol.
The other party only needs a record corresponding to the other party's registration at the time of the protocol execution instead of the password.
This record can be computed once, during an offline registration phase.
The party using the password directly would typically be a client, and acts as a prover,
while the other party would be a server, and acts as verifier.</t>
      <t>The protocol is augmented in the sense that it provides some resilience to the compromise or extraction of the registration record.
The design of the protocol forces the adversary to recover the password from the record to successfully execute the protocol.
Hence this protocol can be advantageously combined with a salted Password Hashing Function to increase the cost of the recovery and slow down attacks.
The record cannot be used directly to successfully run the protocol as a prover,
making this protocol more robust than balanced PAKEs which don't benefit from Password Hashing Functions to the same extent.</t>
      <t>This augmented property is especially valuable in scenarios where the execution of the protocol is constrained
and the adversary cannot not query the salt of the password hash function ahead of the attack.
Constraints may consist in being in physical proximity through a local network or
when initiation of the protocol requires a first authentication factor.</t>
      <t>This document has content split out from a related document specifying SPAKE2 <xref target="I-D.irtf-cfrg-spake2" format="default"/>,
which is a symmetric PAKE protocol, where both parties have knowledge of the password.
SPAKE2+ is the asymmetric or augmented version of SPAKE2, wherein only one party has knowledge of the password.
SPAKE2+ is specified separately in this document because the use cases for symmetric and augmented PAKEs
are different, and therefore warrant different technical specifications. Neither SPAKE2 nor SPAKE2+
was selected as the result of the CFRG PAKE selection competition. However, this password-based key exchange
protocol appears in <xref target="TDH" format="default"/> and is proven secure in <xref target="SPAKE2P-Analysis" format="default"/>. It is compatible with any
prime-order group and relies only on group operations, making it simple and computationally efficient.
Thus, it was felt that publication was beneficial to make the protocol available for wider consideration.</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>
    </section>
    <section anchor="requirements-notation" numbered="true" toc="default">
      <name>Requirements Notation</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP
14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they appear in all
capitals, as shown here.</t>
    </section>
    <section anchor="definition-of-spake2" numbered="true" toc="default">
      <name>Definition of SPAKE2+</name>
      <t>Let G be a group in which the computational Diffie-Hellman (CDH)
problem is hard. Suppose G has order p*h where p is a large prime;
h will be called the cofactor. Let I be the unit element in
G, e.g., the point at infinity if G is an elliptic curve group. We denote the
operations in the group additively. We assume there is a representation of
elements of G as byte strings: common choices would be SEC1
uncompressed or compressed <xref target="SEC1" format="default"/> for elliptic curve groups or big
endian integers of a fixed (per-group) length for prime field DH.
We fix a generate P of (large) prime-order subgroup of G. P is specified
in the document defining the group, and so we do not repeat it here.</t>
      <t>|| denotes concatenation of strings. We also let len(S) denote the
length of a string in bytes, represented as an eight-byte little
endian number. Finally, let nil represent an empty string, i.e.,
len(nil) = 0.</t>
      <t>KDF is a key-derivation function that takes as input a salt, intermediate
keying material (IKM), info string, and derived key length L to derive a
cryptographic key of length L.
MAC is a Message Authentication Code algorithm that takes a secret key and
message as input to produce an output.
Let Hash be a hash function from arbitrary strings to bit strings of a fixed length. Common choices
for Hash are SHA256 or SHA512 <xref target="RFC6234" format="default"/>.
<xref target="Ciphersuites" format="default"/> specifies variants of KDF, MAC, and Hash
suitable for use with the protocols contained herein.</t>
      <t>Let there be two parties, a prover and a verifier. Their identities, denoted as
idProver and idVerifier, may also have digital representations such as Media Access Control addresses
or other names (hostnames, usernames, etc). The parties may share additional data
(the context) separate from their identities which they may want to include in
the protocol transcript.
One example of additional data is a list of supported protocol versions if SPAKE2+ were
used in a higher-level protocol which negotiates the use of a particular PAKE. Another
example is the inclusion of the application name. Including those would ensure that
both parties agree upon the same set of supported protocols and therefore prevent downgrade and
cross-protocol attacks. Specification of precise context values is out of scope for this document.</t>
      <section anchor="protocol-overview" numbered="true" toc="default">
        <name>Protocol Overview</name>
        <t>SPAKE2+ is a two round protocol that establishes a shared secret with an
additional round for key confirmation. Prior to invocation, both parties are
provisioned with information such as the input password needed to run the
protocol. The registration phase may include communicating identities, protocol
version and other parameters related to the registration record; see
<xref target="offline-registration" format="default"/> for details.</t>
        <t>During the first round, the prover sends a public share shareP to the verifier, which in turn
responds with its own public share shareV. Both parties then derive a shared secret
used to produce encryption and authentication keys. The latter are used during the second
round for key confirmation. (<xref target="keys" format="default"/> details the key derivation and confirmation steps.)
In particular, the verifier sends a key confirmation message confirmV to the prover,
which in turn responds with its own key confirmation message confirmP.
(Note that shareV and confirmV MAY be sent in the same message.)
Both parties MUST NOT consider the protocol complete prior to receipt and
validation of these key confirmation messages.</t>
        <t>A sample trace is shown below.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
                 Prover                     Verifier

                   |        (registration)     |
                   |<- - - - - - - - - - - - ->|
                   |                           |
                   |       (setup protocol)    |
(compute shareP)   |            shareP         |
                   |-------------------------->|
                   |            shareV         | (compute shareV)
                   |<--------------------------|
                   |                           |
                   |       (derive secrets)    | (compute confirmV)
                   |           confirmV        |
                   |<--------------------------|
(compute confirmP) |           confirmP        |
                   |-------------------------->|

]]></artwork>
      </section>
      <section anchor="offline-registration" numbered="true" toc="default">
        <name>Offline Registration</name>
        <t>The registration phase computes the values w0 and w1, as well as the registration
record L=w1*P. w0 and w1 are derived by hashing the password pw with the identities
of the two participants. w0 and the record L are then shared with the verifier and
stored as part of the registration record associated with the prover. The prover
SHOULD derive w0 and w1 from the password before the protocol begins. Both w0 and
w1 are derived using a function with range [0, p-1], which is modeled as a random
oracle in <xref target="SPAKE2P-Analysis" format="default"/>.</t>
        <t>The registration phase also produces two random elements M and N in the prime-order
subgroup of G. The algorithm for selecting M and N is defined in <xref target="pointgen" format="default"/>.
Importantly, this algorithm chooses M and N such that their discrete logs are not
known. Pre-computed values for M and N are listed in <xref target="Ciphersuites" format="default"/> for each
group. Applications MAY use different M and N values provided they are computed,
e.g., using different input seeds to the algorithm in <xref target="pointgen" format="default"/>, as random elements
for which the discrete log is unknown.</t>
        <t>Applications using this specification MUST define the method used to compute w0 and w1.
For example, it may be necessary to carry out various forms of normalization of the
password before hashing <xref target="RFC8265" format="default"/>. This section contains requirements and default
recommendations for computing w0 and w1.</t>
        <t>The RECOMMENDED method for generating w0 and w1 is via a Password-Based Key
Derivation Function (PBKDF), which is a function designed to slow down brute-force
attackers. Brute-force resistance may be obtained through various computation hardness
parameters such as memory or CPU cycles, and are typically configurable.
Scrypt <xref target="RFC7914" format="default"/> and Argon2id <xref target="RFC9106" format="default"/> are common examples of PBKDFs.
Absent an application-specific profile, RECOMMENDED parameters (N, r, p)
for Scrypt are (32768,8,1), and RECOMMENDED parameters for Argon2id
are in Section 4 of <xref target="RFC9106" format="default"/>.</t>
        <t>Each half of the output of the PBKDF will be interpreted as an integer and reduced
modulo p. To control bias, each half must be of length at least ceil(log2(p)) + k
bits, with k &gt;= 64. Reducing such integers mod p gives bias at most 2^-k for any
p; this bias is negligible for any k &gt;= 64.</t>
        <t>The minimum total output length of the PBKDF then is 2 * (ceil(log2(p)) + k) bits.
For example, given the prime order of the P-256 curve, the output of the PBKDF
SHOULD be at least 640 bits or 80 bytes.</t>
        <t>Given a PBKDF, password pw, and identities idProver and idVerifier, the RECOMMENDED
method for computing w0 and w1 is as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
w0s || w1s = PBKDF(len(pw) || pw ||
                   len(idProver) || idProver ||
                   len(idVerifier) || idVerifier)
w0 = w0s mod p
w1 = w1s mod p
]]></artwork>
        <t>If an identity is unknown at the time of computing w0s or w1s, its length is given
as zero and the identity itself is represented as the empty octet string. If both
idProver and idVerifier are unknown, then their lengths are given as zero and both
identities will be represented as empty octet strings. idProver and idVerifier are
included in the transcript TT as part of the protocol flow.</t>
      </section>
      <section anchor="online-authentication" numbered="true" toc="default">
        <name>Online Authentication</name>
        <t>The online SPAKE2+ protocol runs between the prover and verifier to produce a
single shared secret upon completion. To begin, the prover selects x uniformly
at random from the integers in [0, p-1], computes the public share shareP=X,
and transmits it to the verifier.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
x <- [0, p-1]
X = x*P + w0*M
]]></artwork>
        <t>Upon receipt of X, the verifier checks the received element for group membership
and aborts if X is not in the large prime-order subgroup of G; see <xref target="security" format="default"/>
for details. The verifier then selects y uniformly at random from the integers
in [0, p-1], computes the public share shareV=Y and transmits it to the prover.
Upon receipt of Y, the prover checks the received element for group membership
and aborts if Y is not in the large prime-order subgroup of G.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
y <- [0, p-1]
Y = y*P + w0*N
]]></artwork>
        <t>Both participants compute Z and V that are now shared as common values.
The prover computes:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
Z = h*x*(Y - w0*N)
V = h*w1*(Y - w0*N)
]]></artwork>
        <t>The verifier computes:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
Z = h*y*(X - w0*M)
V = h*y*L
]]></artwork>
        <t>The multiplication by the cofactor h prevents small subgroup confinement attacks.
All proofs of security hold even if the discrete log of the fixed group element
N is known to the adversary. In particular, one MAY set N=I, i.e. set N to the
unit element in G.</t>
        <t>It is essential that both Z and V be used in combination with the transcript to
derive the keying material. The protocol transcript encoding is shown below.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
TT = len(Context) || Context
  || len(idProver) || idProver
  || len(idVerifier) || idVerifier
  || len(M) || M
  || len(N) || N
  || len(shareP) || shareP
  || len(shareV) || shareV
  || len(Z) || Z
  || len(V) || V
  || len(w0) || w0
]]></artwork>
        <t>Context is an application-specific customization string shared between both
parties and MUST precede the remaining transcript. It might contain the
name and version number of the higher-level protocol, or simply the name and version
number of the application. The context MAY include additional data such as the
chosen ciphersuite and PBKDF parameters like the iteration count or salt.
The context and its length prefix MAY be omitted.</t>
        <t>If an identity is absent, its length is given as zero and the identity itself
is represented as the empty octet string. If both identities are absent, then
their lengths are given as zero and both are represented as empty octet strings.
In applications where identities are not implicit, idProver and idVerifier SHOULD always be
non-empty. Otherwise, the protocol risks Unknown Key Share attacks (discussion
of Unknown Key Share attacks in a specific protocol is given in <xref target="RFC8844" format="default"/>).</t>
        <t>Upon completion of this protocol, both parties compute shared secrets K_auth,
K_enc, K_confirmP, and K_confirmV as specified in <xref target="keys" format="default"/>. The verifier MUST send a key
confirmation message confirmV to the prover so both parties can confirm that they
agree upon these shared secrets. After receipt and verification of the verifier's
confirmation message, the prover MUST respond with its confirmation message.
The verifier MUST NOT send application data to the prover until it has received
and verified the confirmation message. Key confirmation verification requires
recomputation of confirmP or confirmV and checking for equality against that which was
received.</t>
      </section>
      <section anchor="keys" numbered="true" toc="default">
        <name>Key Schedule and Key Confirmation</name>
        <t>The protocol transcript TT, as defined in <xref target="online-authentication" format="default"/>, is unique and secret to
the participants. Both parties use TT to derive the shared symmetric secret K_main from the
protocol. The length of K_main is equal to the length of the digest output, e.g., 256 bits
for Hash() = SHA-256. The confirmation keys K_confirmP and K_confirmV, as well as the shared
key K_shared are derived from K_main.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
K_main = Hash(TT)
K_confirmP || K_confirmV = KDF(nil, K_main, "ConfirmationKeys")
K_shared = KDF(nil, K_main, "SharedKey")
]]></artwork>
        <t>Neither K_main nor its derived confirmation keys are used for anything except key
derivation and confirmation and MUST be discarded after the protocol execution.
Applications MAY derive additional keys from K_shared as needed.</t>
        <t>The length of each confirmation key is dependent on the MAC function of the chosen
ciphersuite. For HMAC, the RECOMMENDED key length is equal to the output length of
the digest output, e.g., 256 bits for Hash() = SHA-256. For CMAC-AES, each
confirmation key MUST be of length k, where k is the chosen AES key size,
e.g., 128 bits for CMAC-AES-128.</t>
        <t>Both endpoints MUST employ a MAC that produces pseudorandom tags for key confirmation.
K_confirmP and K_confirmV are symmetric keys used to compute tags confirmP and
confirmV over the public key shares received from the other peer earlier.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
confirmP = MAC(K_confirmP, shareV)
confirmV = MAC(K_confirmV, shareP)
]]></artwork>
        <t>Once key confirmation is complete, applications MAY use K_enc as an authenticated
shared secret as needed. For example, applications MAY derive one or more AEAD
keys and nonces from K_enc for subsequent application data encryption.</t>
      </section>
    </section>
    <section anchor="Ciphersuites" numbered="true" toc="default">
      <name>Ciphersuites</name>
      <t>This section documents SPAKE2+ ciphersuite configurations. A ciphersuite
indicates a group, cryptographic hash algorithm, and pair of KDF and MAC functions, e.g.,
P256-SHA256-HKDF-HMAC-SHA256. This ciphersuite indicates a SPAKE2+ protocol instance over
P-256 that uses SHA256 along with HKDF <xref target="RFC5869" format="default"/> and HMAC <xref target="RFC2104" format="default"/>
for G, Hash, KDF, and MAC functions, respectively. Since the choice of PBKDF
and its parameters for computing w0 and w1 and distributing does not affect
interoperability, the PBKDF is not included as part of the ciphersuite.</t>
      <t>If no MAC algorithm is used in the key confirmation phase, its respective column
in Table 1 can be ignored and the ciphersuite name will contain no MAC
identifier.</t>
      <table align="center">
        <thead>
          <tr>
            <th align="left">G</th>
            <th align="center">Hash</th>
            <th align="center">KDF</th>
            <th align="center">MAC</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">P-256</td>
            <td align="center">SHA256 <xref target="RFC6234" format="default"/></td>
            <td align="center">HKDF-SHA256 <xref target="RFC5869" format="default"/></td>
            <td align="center">HMAC-SHA256 <xref target="RFC2104" format="default"/></td>
          </tr>
          <tr>
            <td align="left">P-256</td>
            <td align="center">SHA512 <xref target="RFC6234" format="default"/></td>
            <td align="center">HKDF-SHA512 <xref target="RFC5869" format="default"/></td>
            <td align="center">HMAC-SHA512 <xref target="RFC2104" format="default"/></td>
          </tr>
          <tr>
            <td align="left">P-384</td>
            <td align="center">SHA256 <xref target="RFC6234" format="default"/></td>
            <td align="center">HKDF-SHA256 <xref target="RFC5869" format="default"/></td>
            <td align="center">HMAC-SHA256 <xref target="RFC2104" format="default"/></td>
          </tr>
          <tr>
            <td align="left">P-384</td>
            <td align="center">SHA512 <xref target="RFC6234" format="default"/></td>
            <td align="center">HKDF-SHA512 <xref target="RFC5869" format="default"/></td>
            <td align="center">HMAC-SHA512 <xref target="RFC2104" format="default"/></td>
          </tr>
          <tr>
            <td align="left">P-521</td>
            <td align="center">SHA512 <xref target="RFC6234" format="default"/></td>
            <td align="center">HKDF-SHA512 <xref target="RFC5869" format="default"/></td>
            <td align="center">HMAC-SHA512 <xref target="RFC2104" format="default"/></td>
          </tr>
          <tr>
            <td align="left">edwards25519</td>
            <td align="center">SHA256 <xref target="RFC6234" format="default"/></td>
            <td align="center">HKDF-SHA256 <xref target="RFC5869" format="default"/></td>
            <td align="center">HMAC-SHA256 <xref target="RFC2104" format="default"/></td>
          </tr>
          <tr>
            <td align="left">edwards448</td>
            <td align="center">SHA512 <xref target="RFC6234" format="default"/></td>
            <td align="center">HKDF-SHA512 <xref target="RFC5869" format="default"/></td>
            <td align="center">HMAC-SHA512 <xref target="RFC2104" format="default"/></td>
          </tr>
          <tr>
            <td align="left">P-256</td>
            <td align="center">SHA256 <xref target="RFC6234" format="default"/></td>
            <td align="center">HKDF-SHA256 <xref target="RFC5869" format="default"/></td>
            <td align="center">CMAC-AES-128 <xref target="RFC4493" format="default"/></td>
          </tr>
          <tr>
            <td align="left">P-256</td>
            <td align="center">SHA512 <xref target="RFC6234" format="default"/></td>
            <td align="center">HKDF-SHA512 <xref target="RFC5869" format="default"/></td>
            <td align="center">CMAC-AES-128 <xref target="RFC4493" format="default"/></td>
          </tr>
        </tbody>
      </table>
      <t>The following points represent permissible point generation seeds for the groups listed
in Table 1, using the algorithm presented in <xref target="pointgen" format="default"/>. These bytestrings are
compressed points as in <xref target="SEC1" format="default"/> for curves from <xref target="SEC1" format="default"/> and <xref target="RFC8032" format="default"/>. Note that
these values are identical to those used in the companion SPAKE2 specification <xref target="I-D.irtf-cfrg-spake2" format="default"/>.</t>
      <t>For P256:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
M =
02886e2f97ace46e55ba9dd7242579f2993b64e16ef3dcab95afd497333d8fa12f
seed: 1.2.840.10045.3.1.7 point generation seed (M)

N =
03d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4f98baa1292b49
seed: 1.2.840.10045.3.1.7 point generation seed (N)
]]></artwork>
      <t>For P384:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
M =
030ff0895ae5ebf6187080a82d82b42e2765e3b2f8749c7e05eba366434b363d3dc
36f15314739074d2eb8613fceec2853
seed: 1.3.132.0.34 point generation seed (M)

N =
02c72cf2e390853a1c1c4ad816a62fd15824f56078918f43f922ca21518f9c543bb
252c5490214cf9aa3f0baab4b665c10
seed: 1.3.132.0.34 point generation seed (N)
]]></artwork>
      <t>For P521:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
M =
02003f06f38131b2ba2600791e82488e8d20ab889af753a41806c5db18d37d85608
cfae06b82e4a72cd744c719193562a653ea1f119eef9356907edc9b56979962d7aa
seed: 1.3.132.0.35 point generation seed (M)

N =
0200c7924b9ec017f3094562894336a53c50167ba8c5963876880542bc669e494b25
32d76c5b53dfb349fdf69154b9e0048c58a42e8ed04cef052a3bc349d95575cd25
seed: 1.3.132.0.35 point generation seed (N)
]]></artwork>
      <t>For edwards25519:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
M =
d048032c6ea0b6d697ddc2e86bda85a33adac920f1bf18e1b0c6d166a5cecdaf
seed: edwards25519 point generation seed (M)

N =
d3bfb518f44f3430f29d0c92af503865a1ed3281dc69b35dd868ba85f886c4ab
seed: edwards25519 point generation seed (N)
]]></artwork>
      <t>For edwards448:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
M =
b6221038a775ecd007a4e4dde39fd76ae91d3cf0cc92be8f0c2fa6d6b66f9a12
942f5a92646109152292464f3e63d354701c7848d9fc3b8880
seed: edwards448 point generation seed (M)

N =
6034c65b66e4cd7a49b0edec3e3c9ccc4588afd8cf324e29f0a84a072531c4db
f97ff9af195ed714a689251f08f8e06e2d1f24a0ffc0146600
seed: edwards448 point generation seed (N)
]]></artwork>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>No IANA action is required.</t>
    </section>
    <section anchor="security" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>SPAKE2+ appears in <xref target="TDH" format="default"/> and is proven secure in <xref target="SPAKE2P-Analysis" format="default"/>.</t>
      <t>The ephemeral randomness used by the prover and verifier MUST be
generated using a cryptographically secure PRNG.</t>
      <t>Elements received from a peer MUST be checked for group membership: failure to
properly deserialize and validate group elements can lead to attacks. An endpoint
MUST abort the protocol if any received public value is not a member of the
large prime-order subgroup of G. Multiplication of a public value V by the
cofactor h will yield the identity element I whenever V is an element of a
small-order subgroup. Consequently, prover and verifier MUST abort the protocol
upon of any received value V such that V*h = I. Failure to do so may lead to subgroup
confinement attacks.</t>
    </section>
    <section anchor="acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>Thanks to Ben Kaduk and Watson Ladd, from which this specification originally emanated.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="TDH">
          <front>
            <title>The Twin-Diffie Hellman Problem and Applications</title>
            <author>
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <seriesInfo name="EUROCRYPT 2008, Volume 4965 of Lecture notes in Computer Science, pages 127-145, Springer-Verlag, Berlin, Germany" value=""/>
        </reference>
        <reference anchor="SPAKE2P-Analysis" target="https://eprint.iacr.org/2020/313.pdf">
          <front>
            <title>Security analysis of SPAKE2+</title>
            <author>
              <organization/>
            </author>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="SEC1" target="https://secg.org/sec1-v2.pdf">
          <front>
            <title>Elliptic Curve Cryptography, Standards for Efficient Cryptography Group, ver. 2</title>
            <author>
              <organization/>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="I-D.irtf-cfrg-spake2">
          <front>
            <title>SPAKE2, a PAKE</title>
            <author fullname="Watson Ladd">
              <organization>Sealance</organization>
            </author>
            <author fullname="Benjamin Kaduk">
              <organization>Akamai Technologies</organization>
            </author>
            <date day="8" month="February" year="2022"/>
            <abstract>
              <t>   This document describes SPAKE2 which is a protocol for two parties
   that share a password to derive a strong shared key without
   disclosing the password.  This method is compatible with any group,
   is computationally efficient, and SPAKE2 has a security proof.  This
   document predated the CFRG PAKE competition and it was not selected,
   however, given existing use of variants in Kerberos and other
   applications it was felt publication was beneficial.  Applications
   that need a symmetric PAKE (password authenticated key exchange) and
   where hashing onto an elliptic curve at execution time is not
   possible can use SPAKE2.  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-spake2-26"/>
        </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">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd">
              <organization/>
            </author>
            <author fullname="T. Hansen" initials="T." surname="Hansen">
              <organization/>
            </author>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC8265">
          <front>
            <title>Preparation, Enforcement, and Comparison of Internationalized Strings Representing Usernames and Passwords</title>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre">
              <organization/>
            </author>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov">
              <organization/>
            </author>
            <date month="October" year="2017"/>
            <abstract>
              <t>This document describes updated methods for handling Unicode strings representing usernames and passwords.  The previous approach was known as SASLprep (RFC 4013) and was based on Stringprep (RFC 3454). The methods specified in this document provide a more sustainable approach to the handling of internationalized usernames and passwords.  This document obsoletes RFC 7613.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8265"/>
          <seriesInfo name="DOI" value="10.17487/RFC8265"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <author fullname="P. Eronen" initials="P." surname="Eronen">
              <organization/>
            </author>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications.  The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions.  This document is not an Internet  Standards Track specification; it is published for informational  purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <author fullname="M. Bellare" initials="M." surname="Bellare">
              <organization/>
            </author>
            <author fullname="R. Canetti" initials="R." surname="Canetti">
              <organization/>
            </author>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key.  The cryptographic strength of HMAC depends on the properties of the underlying hash function.  This memo provides information for the Internet community.  This memo does not specify an Internet standard of any kind</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </reference>
        <reference anchor="RFC4493">
          <front>
            <title>The AES-CMAC Algorithm</title>
            <author fullname="JH. Song" initials="JH." surname="Song">
              <organization/>
            </author>
            <author fullname="R. Poovendran" initials="R." surname="Poovendran">
              <organization/>
            </author>
            <author fullname="J. Lee" initials="J." surname="Lee">
              <organization/>
            </author>
            <author fullname="T. Iwata" initials="T." surname="Iwata">
              <organization/>
            </author>
            <date month="June" year="2006"/>
            <abstract>
              <t>The National Institute of Standards and Technology (NIST) has recently specified the Cipher-based Message Authentication Code (CMAC), which is equivalent to the One-Key CBC MAC1 (OMAC1) submitted by Iwata and Kurosawa.  This memo specifies an authentication algorithm based on CMAC with the 128-bit Advanced Encryption Standard (AES). This new authentication algorithm is named AES-CMAC. The purpose of this document is to make the AES-CMAC algorithm conveniently available to the Internet Community.  This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4493"/>
          <seriesInfo name="DOI" value="10.17487/RFC4493"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara">
              <organization/>
            </author>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA).  The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves.  An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="RFC5480">
          <front>
            <title>Elliptic Curve Cryptography Subject Public Key Information</title>
            <author fullname="S. Turner" initials="S." surname="Turner">
              <organization/>
            </author>
            <author fullname="D. Brown" initials="D." surname="Brown">
              <organization/>
            </author>
            <author fullname="K. Yiu" initials="K." surname="Yiu">
              <organization/>
            </author>
            <author fullname="R. Housley" initials="R." surname="Housley">
              <organization/>
            </author>
            <author fullname="T. Polk" initials="T." surname="Polk">
              <organization/>
            </author>
            <date month="March" year="2009"/>
            <abstract>
              <t>This document specifies the syntax and semantics for the Subject Public Key Information field in certificates that support Elliptic Curve Cryptography.  This document updates Sections 2.3.5 and 5, and the ASN.1 module of "Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile", RFC 3279.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5480"/>
          <seriesInfo name="DOI" value="10.17487/RFC5480"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC7914">
          <front>
            <title>The scrypt Password-Based Key Derivation Function</title>
            <author fullname="C. Percival" initials="C." surname="Percival">
              <organization/>
            </author>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document specifies the password-based key derivation function scrypt.  The function derives one or more secret keys from a secret string.  It is based on memory-hard functions, which offer added protection against attacks using custom hardware.  The document also provides an ASN.1 schema.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7914"/>
          <seriesInfo name="DOI" value="10.17487/RFC7914"/>
        </reference>
        <reference anchor="RFC9106">
          <front>
            <title>Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications</title>
            <author fullname="A. Biryukov" initials="A." surname="Biryukov">
              <organization/>
            </author>
            <author fullname="D. Dinu" initials="D." surname="Dinu">
              <organization/>
            </author>
            <author fullname="D. Khovratovich" initials="D." surname="Khovratovich">
              <organization/>
            </author>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <date month="September" year="2021"/>
            <abstract>
              <t>This document describes the Argon2 memory-hard function for password hashing and proof-of-work applications.  We provide an implementer-oriented description with test vectors.  The purpose is to simplify adoption of Argon2 for Internet protocols.  This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9106"/>
          <seriesInfo name="DOI" value="10.17487/RFC9106"/>
        </reference>
        <reference anchor="RFC8844">
          <front>
            <title>Unknown Key-Share Attacks on Uses of TLS with the Session Description Protocol (SDP)</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson">
              <organization/>
            </author>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="January" year="2021"/>
            <abstract>
              <t>This document describes unknown key-share attacks on the use of Datagram Transport Layer Security for the Secure Real-Time Transport Protocol (DTLS-SRTP). Similar attacks are described on the use of DTLS-SRTP with the identity bindings used in Web Real-Time Communications (WebRTC) and SIP identity.  These attacks are difficult to mount, but they cause a victim to be misled about the identity of a communicating peer.  This document defines mitigation techniques that implementations of RFC 8122 are encouraged to deploy.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8844"/>
          <seriesInfo name="DOI" value="10.17487/RFC8844"/>
        </reference>
      </references>
    </references>
    <section anchor="pointgen" numbered="true" toc="default">
      <name>Algorithm used for Point Generation</name>
      <t>This section describes the algorithm that was used to generate
the points M and N in the table in <xref target="Ciphersuites" format="default"/>. This algorithm
produces M and N such that they are indistinguishable from two random
points in the prime-order subgroup of G, where the discrete log
of these points is unknown. See <xref target="SPAKE2P-Analysis" format="default"/> for additional
details on this requirement.</t>
      <t>For each curve in the table below, we construct a string
using the curve OID from <xref target="RFC5480" format="default"/> (as an ASCII
string) or its name,
combined with the needed constant, for instance "1.3.132.0.35
point generation seed (M)" for P-512.  This string is turned
into a series of blocks by hashing with SHA256, and hashing that
output again to generate the next 32 bytes, and so on.  This
pattern is repeated for each group and value, with the string
modified appropriately.</t>
      <t>A byte string of length equal to that of an encoded group
element is constructed by concatenating as many blocks as are
required, starting from the first block, and truncating to the
desired length.  The byte string is then formatted as required
for the group.  In the case of Weierstrass curves, we take the
desired length as the length for representing a compressed point
(section 2.3.4 of <xref target="SEC1" format="default"/>),
and use the low-order bit of the first byte as the sign bit.
In order to obtain the correct format, the value of the first
byte is set to 0x02 or 0x03 (clearing the first six bits
and setting the seventh bit), leaving the sign bit as it was
in the byte string constructed by concatenating hash blocks.
For the <xref target="RFC8032" format="default"/> curves a different procedure is used.
For edwards448 the 57-byte input has the least-significant 7 bits of the
last byte set to zero, and for edwards25519 the 32-byte input is
not modified.  For both the <xref target="RFC8032" format="default"/> curves the
(modified) input is then interpreted
as the representation of the group element.
If this interpretation yields a valid group element with the
correct order (p), the (modified) byte string is the output.  Otherwise,
the initial hash block is discarded and a new byte string constructed
from the remaining hash blocks. The procedure of constructing a
byte string of the appropriate length, formatting it as
required for the curve, and checking if it is a valid point of the correct
order, is repeated
until a valid element is found.</t>
      <t>The following python snippet generates the above points,
assuming an elliptic curve implementation following the
interface of Edwards25519Point.stdbase() and
Edwards448Point.stdbase() in Appendix A of <xref target="RFC8032" format="default"/>:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
def iterated_hash(seed, n):
  h = seed
  for i in range(n):
    h = hashlib.sha256(h).digest()
  return h

def bighash(seed, start, sz):
  n = -(-sz // 32)
  hashes = [iterated_hash(seed, i) for i in range(start, start + n)]
  return b''.join(hashes)[:sz]

def canon_pointstr(ecname, s):
  if ecname == 'edwards25519':
    return s
  elif ecname == 'edwards448':
    return s[:-1] + bytes([s[-1] & 0x80])
  else:
    return bytes([(s[0] & 1) | 2]) + s[1:]

def gen_point(seed, ecname, ec):
  for i in range(1, 1000):
    hval = bighash(seed, i, len(ec.encode()))
    pointstr = canon_pointstr(ecname, hval)
    try:
      p = ec.decode(pointstr)
      if p != ec.zero_elem() and p * p.l() == ec.zero_elem():
        return pointstr, i
    except Exception:
      pass
]]></artwork>
    </section>
    <section anchor="testvectors" numbered="true" toc="default">
      <name>Test Vectors</name>
      <t>This section contains various test vectors for SPAKE2+.
(Choice of PBKDF is omitted and values for w0 and w1 are provided directly.)
All points are encoded using the uncompressed format, i.e., with a 0x04 octet
prefix, specified in <xref target="SEC1" format="default"/>. idProver and idVerifier identity strings
are provided in the protocol invocation.</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
[Context=b'SPAKE2+-P256-SHA256-HKDF-SHA256-HMAC-SHA256 Test Vectors
']
[idProver=b'client']
[idVerifier=b'server']
w0 = 0xbb8e1bbcf3c48f62c08db243652ae55d3e5586053fca77102994f23ad9549
1b3
w1 = 0x7e945f34d78785b8a3ef44d0df5a1a97d6b3b460409a345ca7830387a74b1
dba
L = 0x04eb7c9db3d9a9eb1f8adab81b5794c1f13ae3e225efbe91ea487425854c7f
c00f00bfedcbd09b2400142d40a14f2064ef31dfaa903b91d1faea7093d835966efd
x = 0xd1232c8e8693d02368976c174e2088851b8365d0d79a9eee709c6a05a2fad5
39
shareP = 0x04ef3bd051bf78a2234ec0df197f7828060fe9856503579bb17330090
42c15c0c1de127727f418b5966afadfdd95a6e4591d171056b333dab97a79c7193e3
41727
y = 0x717a72348a182085109c8d3917d6c43d59b224dc6a7fc4f0483232fa6516d8
b3
shareV = 0x04c0f65da0d11927bdf5d560c69e1d7d939a05b0e88291887d679fcad
ea75810fb5cc1ca7494db39e82ff2f50665255d76173e09986ab46742c798a9a6843
7b048
Z = 0x04bbfce7dd7f277819c8da21544afb7964705569bdf12fb92aa388059408d5
0091a0c5f1d3127f56813b5337f9e4e67e2ca633117a4fbd559946ab474356c41839
V = 0x0458bf27c6bca011c9ce1930e8984a797a3419797b936629a5a937cf2f11c8
b9514b82b993da8a46e664f23db7c01edc87faa530db01c2ee405230b18997f16b68
TT = 0x38000000000000005350414b45322b2d503235362d5348413235362d484b4
4462d5348413235362d484d41432d534841323536205465737420566563746f72730
600000000000000636c69656e7406000000000000007365727665724100000000000
00004886e2f97ace46e55ba9dd7242579f2993b64e16ef3dcab95afd497333d8fa12
f5ff355163e43ce224e0b0e65ff02ac8e5c7be09419c785e0ca547d55a12e2d20410
000000000000004d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4f9
8baa1292b4907d60aa6bfade45008a636337f5168c64d9bd36034808cd564490b1e6
56edbe7410000000000000004ef3bd051bf78a2234ec0df197f7828060fe98565035
79bb1733009042c15c0c1de127727f418b5966afadfdd95a6e4591d171056b333dab
97a79c7193e341727410000000000000004c0f65da0d11927bdf5d560c69e1d7d939
a05b0e88291887d679fcadea75810fb5cc1ca7494db39e82ff2f50665255d76173e0
9986ab46742c798a9a68437b048410000000000000004bbfce7dd7f277819c8da215
44afb7964705569bdf12fb92aa388059408d50091a0c5f1d3127f56813b5337f9e4e
67e2ca633117a4fbd559946ab474356c4183941000000000000000458bf27c6bca01
1c9ce1930e8984a797a3419797b936629a5a937cf2f11c8b9514b82b993da8a46e66
4f23db7c01edc87faa530db01c2ee405230b18997f16b682000000000000000bb8e1
bbcf3c48f62c08db243652ae55d3e5586053fca77102994f23ad95491b3
K_main = 0x4c59e1ccf2cfb961aa31bd9434478a1089b56cd11542f53d3576fb6c2
a438a29
K_confirmP = 0x871ae3f7b78445e34438fb284504240239031c39d80ac23eb5ab9
be5ad6db58a
K_confirmV = 0xccd53c7c1fa37b64a462b40db8be101cedcf838950162902054e6
44b400f1680
HMAC(K_confirmP, shareV) = 0x926cc713504b9b4d76c9162ded04b5493e89109
f6d89462cd33adc46fda27527
HMAC(K_confirmV, shareP) = 0x9747bcc4f8fe9f63defee53ac9b07876d907d55
047e6ff2def2e7529089d3e68
K_shared = 0x0c5f8ccd1413423a54f6c1fb26ff01534a87f893779c6e68666d772
bfd91f3e7

[Context=b'SPAKE2+-P256-SHA512-HKDF-SHA512-HMAC-SHA512 Test Vectors
']
[idProver=b'client']
[idVerifier=b'server']
w0 = 0x1cc5207d6e34b8f7828206fb64b86aa9c712bc952abf251bb9f5856b24d8c
8cc
w1 = 0x4279649e62532b01dc27d2ed39100ba350518fb969672061a01edce752d0e
672
L = 0x043a348ad475d2200d46df876f1eb2e136056da31dafff52cc7762bf3be84d
e0097c4e69b0b9321326af1f0af4a14561a9c7b640cb5afd6822d14cb34830fc4511
x = 0xb586ab83f175c1a2b56b6a1b6a283523f88a9befcf11e22efb48e2ee1fe69a
23
shareP = 0x04a7928c4b47f6b8657a5b8ebcb6f1bd266192e152fb9745a4180c946
57a2f323b4d50d536c0325cdb0ec42c9bd8db8d7af3ff6dc85edb4b5365375c62e09
def4a
y = 0xac1fb828f041782d452ea9cc00c3fa34a55fa8f7f98c04be45a3d607b092d4
41
shareV = 0x04498c29e37dbd53ebf8db76679901d90c6be3af57f46ac3025b32420
839f0489c6c3b6bf5ddc8ecbc3d7c83d0891ad814a00ad23eba13197c9d96a5b1027
5e35d
Z = 0x04a81e31be54283cee81bf7bdc877764b6b2ac6a399f1176380aac8a82172c
18051aa17dfcf438896ad253f53b52cd45ec2c7399488a919bcfcfecc0261cbf5284
V = 0x04de0a53f96cbe4abcd31c1e0a23ea6f169c162dc5a007393c8fcddd2abd5d
518bb2d9734b1d2dfce3fd916e991ab9dc3a2760d439c083eb39b65408857d2bb4aa
TT = 0x38000000000000005350414b45322b2d503235362d5348413531322d484b4
4462d5348413531322d484d41432d534841353132205465737420566563746f72730
600000000000000636c69656e7406000000000000007365727665724100000000000
00004886e2f97ace46e55ba9dd7242579f2993b64e16ef3dcab95afd497333d8fa12
f5ff355163e43ce224e0b0e65ff02ac8e5c7be09419c785e0ca547d55a12e2d20410
000000000000004d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4f9
8baa1292b4907d60aa6bfade45008a636337f5168c64d9bd36034808cd564490b1e6
56edbe7410000000000000004a7928c4b47f6b8657a5b8ebcb6f1bd266192e152fb9
745a4180c94657a2f323b4d50d536c0325cdb0ec42c9bd8db8d7af3ff6dc85edb4b5
365375c62e09def4a410000000000000004498c29e37dbd53ebf8db76679901d90c6
be3af57f46ac3025b32420839f0489c6c3b6bf5ddc8ecbc3d7c83d0891ad814a00ad
23eba13197c9d96a5b10275e35d410000000000000004a81e31be54283cee81bf7bd
c877764b6b2ac6a399f1176380aac8a82172c18051aa17dfcf438896ad253f53b52c
d45ec2c7399488a919bcfcfecc0261cbf5284410000000000000004de0a53f96cbe4
abcd31c1e0a23ea6f169c162dc5a007393c8fcddd2abd5d518bb2d9734b1d2dfce3f
d916e991ab9dc3a2760d439c083eb39b65408857d2bb4aa20000000000000001cc52
07d6e34b8f7828206fb64b86aa9c712bc952abf251bb9f5856b24d8c8cc
K_main = 0x527613439c279a375c116342a4216a8d92441d2fe1921dd1e60f140b2
855916ccac7db4dbf22bd56e344a8cd506d08949bde1e9d83c24d68ff4246458dc14
288
K_confirmP = 0x0aa129d7b82067c2a9607677c9c4fdedc1cd7cfed9ff72c54c0ae
bb2b1a8aa915b96834b2986725c6040852ceaafbb17d638a715198f795654eac89bf
0739878
K_confirmV = 0xa1f1038de30a8c12d43d06c27d362daa9699249e941faa2d5cbc5
9a9683bf42aed9537818245677fdb54b5274506542994f4a83455f6d7b3af5ec017f
aa58f61
HMAC(K_confirmP, shareV) = 0x6b2469b56cf8ac3f94a8d0b533380ea6b3d0f46
b3e12ee82550d49e129c2412728c9437a64ee5f80c8cdc5e8a30faa0a6deb8a52513
46ba81bb6fc955b2304fc
HMAC(K_confirmV, shareP) = 0x154174fc278a935e290b3352ba877e179fa9281
c0a76928faea703c72d383b267511a5cf084cb07147efece94e3cfd91944e7baab85
6858fbebc087167b0f409
K_shared = 0x11887659d9e002f34fa6cc270d33570f001b2a3fc0522b643c07327
d09a4a9f47aab85813d13c585b53adf5ac9de5707114848f3dc31a4045f69a2cc197
2b098

[Context=b'SPAKE2+-P384-SHA256-HKDF-SHA256-HMAC-SHA256 Test Vectors
']
[idProver=b'client']
[idVerifier=b'server']
w0 = 0x097a61cbb1cee72bb654be96d80f46e0e3531151003903b572fc193f23377
2c23c22228884a0d5447d0ab49a656ce1d2
w1 = 0x18772816140e6c3c3938a693c600b2191118a34c7956e1f1cd5b0d519b56e
a5858060966cfaf27679c9182129949e74f
L = 0x04f27dd5384d6b9beb4c5022c94b1978d632779e1d3abe458611e734a529d0
04e25053398e5dc9eeaa4ffa59743ca7ddbc0e7ce69155295cb2b846da83ee6a4449
0dd8e96bb0b0f6645281bfd978dd5f6836561ea0d8b2c045ff04cef2e5873d2c
x = 0x2f1bdbeda162ff2beba0293d3cd3ae95f663c53663378c7e18ee8f56a4a48b
00d31ce0ef43606548da485058f12e8e73
shareP = 0x049fb0404ca7ce71fb85d3aaa8fd05fa054affac996135bc245149be0
9571e43e2bf76e00d6d52ac452b8224f6b9da31420a4f5e214b377546daad4d61da5
ca0cfdea59a5a92ebdb6b42da5d14663b8d1f9eb97050139ab89788e0ada27b048fc
f
y = 0xbbcaf02404a16ed4fa73b183f703a8d969386f3d34f5e98b3a904e760512f1
1757f07dfcf87a2ada8fc6d028445bd53e
shareV = 0x0493b1c1f6a30eac4ac4a15711e44640bae3576787627ee2541104298
1e94b2e9604b9374f66bb247bc431759212ef3fa0a20c087863b89efb32219e1337c
e94be2175f8cb9fd50cf0b84772717fd063c52b69de1229a01ab840b55993287f32e
d
Z = 0x048cd880e5147e49b42b5754c1bc6d2091ad414789bc3b030f2d787ea480f3
e35d0fa0d02d0dd06fee7f242b702a2d984efd79c76d99ab35b99e359a205cea56bb
a8dd8f995c101a69a5157686d1cf6a7288d7cff2f2a9748db99b24f646ea7b37
V = 0x041c3c9cc38b03a06a49cf17cc5e7754cf1ccbbc6fffc0ddf1a6e23f57294a
25d96f7da5ce4ac0a617c78502f2f235a5fcf2f76a62385434ed2b6e95521b41eff3
c4ce93ecf8fb32005dd76335d0a7c78153257288d7fde1a22d404f5d73d068e2
TT = 0x38000000000000005350414b45322b2d503338342d5348413235362d484b4
4462d5348413235362d484d41432d534841323536205465737420566563746f72730
600000000000000636c69656e7406000000000000007365727665726100000000000
000040ff0895ae5ebf6187080a82d82b42e2765e3b2f8749c7e05eba366434b363d3
dc36f15314739074d2eb8613fceec285397592c55797cdd77c0715cb7df2150220a0
119866486af4234f390aad1f6addde5930909adc67a1fc0c99ba3d52dc5dd6100000
00000000004c72cf2e390853a1c1c4ad816a62fd15824f56078918f43f922ca21518
f9c543bb252c5490214cf9aa3f0baab4b665c10c38b7d7f4e7f320317cd717315a79
7c7e02933aef68b364cbf84ebc619bedbe21ff5c69ea0f1fed5d7e3200418073f406
100000000000000049fb0404ca7ce71fb85d3aaa8fd05fa054affac996135bc24514
9be09571e43e2bf76e00d6d52ac452b8224f6b9da31420a4f5e214b377546daad4d6
1da5ca0cfdea59a5a92ebdb6b42da5d14663b8d1f9eb97050139ab89788e0ada27b0
48fcf61000000000000000493b1c1f6a30eac4ac4a15711e44640bae3576787627ee
25411042981e94b2e9604b9374f66bb247bc431759212ef3fa0a20c087863b89efb3
2219e1337ce94be2175f8cb9fd50cf0b84772717fd063c52b69de1229a01ab840b55
993287f32ed6100000000000000048cd880e5147e49b42b5754c1bc6d2091ad41478
9bc3b030f2d787ea480f3e35d0fa0d02d0dd06fee7f242b702a2d984efd79c76d99a
b35b99e359a205cea56bba8dd8f995c101a69a5157686d1cf6a7288d7cff2f2a9748
db99b24f646ea7b376100000000000000041c3c9cc38b03a06a49cf17cc5e7754cf1
ccbbc6fffc0ddf1a6e23f57294a25d96f7da5ce4ac0a617c78502f2f235a5fcf2f76
a62385434ed2b6e95521b41eff3c4ce93ecf8fb32005dd76335d0a7c78153257288d
7fde1a22d404f5d73d068e23000000000000000097a61cbb1cee72bb654be96d80f4
6e0e3531151003903b572fc193f233772c23c22228884a0d5447d0ab49a656ce1d2
K_main = 0x61370f8bf65e0df7e9a7b2c2289be1ee4b5dd6c21f4b85165730700c4
4ce30af
K_confirmP = 0x2c8940419d94e53d5d240801e702c4658531aa7a9f14ec75f0d67
f12fa84196c
K_confirmV = 0x8e74afe16c53a44590ad6bf43aa89324978b8f20014336675f618
387f99f3fdc
HMAC(K_confirmP, shareV) = 0x7ae825e242a5a1f86ad7db172c2c12fcb458b6a
2b1ddfc96b2b7cfd2eed5f7ab
HMAC(K_confirmV, shareP) = 0x1581062167d6a3d14493447cd170d408f6fdc58
e31225438db86214167426a7a
K_shared = 0x99758e838ae1a856589689fb55b6befe4e2382e6ebbeca1a6232a68
f9dc04c1a

[Context=b'SPAKE2+-P384-SHA512-HKDF-SHA512-HMAC-SHA512 Test Vectors
']
[idProver=b'client']
[idVerifier=b'server']
w0 = 0xb8d44a0982b88abe19b724d4bdafba8c90dc93130e0bf4f8062810992326d
a126fd01db53e40250ca33a3ff302044cb0
w1 = 0x2373e2071c3bb2a6d53ece57830d56f8080189816803c22375d6a4a514f9d
161b64d0f05b97735b98b348f9b33cc2e30
L = 0x049ca7217ff6456bb2e2bcf71b31d9b1e5ed6e0c9700936ae617e990cee87e
e1ce3a03629dd5532948c39b89f38b39f13c7f513c5b1ada00f6533a4a8b02b9cd04
e1b2a5db1f24ec5fe959198a19666037e04b768cc02e75ac9da0048736db6e5b
x = 0x5a835d52714f30d2ef539268b89df9558628400063dfa0e41eb979066f4caf
409bbf7aab3ddddea13f1b070a1827d3d4
shareP = 0x042f382eef464a2c9aecfdf4b81d25c4de2de113ba67405ce336c762c
69217ae7e27bda875144140d7536c4cc08b9b4dace5f872a6a2ed57f34042688ad3c
5d446c187dc0caf9cea812df3a4dd6fdbc64b9d7d7d7ff4bf6965abb06eeb108d55e
e
y = 0xc883ee5b08cf7ba122038c279459ab1a730f85f2d624a02732d519faab56a4
98e773a8dec6c447ed02d5c00303a18bc4
shareV = 0x04d72e11eee332305062454c0a058b8103a3304785d445510cd8d101e
9cb44cfb159cb7b72123abaf719ab1c42e0558c84c14b0886e8b446e4c880bff2f4b
291fafafc748cb4115824e66732bdeba7fae176388e228ab9d7546255994ca3fb5a5
2
Z = 0x043cb63f5fcb573cf3e2ee40bca5fbc1f00ff2554caab3790329184c45ed69
c39b2e1323bc13c8f821b844feb5921b1470e7b3f70bd10508e5de6db157305badf8
20fa28d68742d8287fb201383a8deec70d5bcf2a61498a481290ed8cc94ab3a0
V = 0x0468604d188f4da560ddaaece126abe40f5de255f8af093c7c3aff71f95d90
92804426127d73d46a817085e9095de6bcf30733a5124a98f567148efe92a7134994
0c7244623247d33a8b78cbc9a53cd45bb22430f318a635084d1840c905f236c8
TT = 0x38000000000000005350414b45322b2d503338342d5348413531322d484b4
4462d5348413531322d484d41432d534841353132205465737420566563746f72730
600000000000000636c69656e7406000000000000007365727665726100000000000
000040ff0895ae5ebf6187080a82d82b42e2765e3b2f8749c7e05eba366434b363d3
dc36f15314739074d2eb8613fceec285397592c55797cdd77c0715cb7df2150220a0
119866486af4234f390aad1f6addde5930909adc67a1fc0c99ba3d52dc5dd6100000
00000000004c72cf2e390853a1c1c4ad816a62fd15824f56078918f43f922ca21518
f9c543bb252c5490214cf9aa3f0baab4b665c10c38b7d7f4e7f320317cd717315a79
7c7e02933aef68b364cbf84ebc619bedbe21ff5c69ea0f1fed5d7e3200418073f406
100000000000000042f382eef464a2c9aecfdf4b81d25c4de2de113ba67405ce336c
762c69217ae7e27bda875144140d7536c4cc08b9b4dace5f872a6a2ed57f34042688
ad3c5d446c187dc0caf9cea812df3a4dd6fdbc64b9d7d7d7ff4bf6965abb06eeb108
d55ee610000000000000004d72e11eee332305062454c0a058b8103a3304785d4455
10cd8d101e9cb44cfb159cb7b72123abaf719ab1c42e0558c84c14b0886e8b446e4c
880bff2f4b291fafafc748cb4115824e66732bdeba7fae176388e228ab9d75462559
94ca3fb5a526100000000000000043cb63f5fcb573cf3e2ee40bca5fbc1f00ff2554
caab3790329184c45ed69c39b2e1323bc13c8f821b844feb5921b1470e7b3f70bd10
508e5de6db157305badf820fa28d68742d8287fb201383a8deec70d5bcf2a61498a4
81290ed8cc94ab3a061000000000000000468604d188f4da560ddaaece126abe40f5
de255f8af093c7c3aff71f95d9092804426127d73d46a817085e9095de6bcf30733a
5124a98f567148efe92a71349940c7244623247d33a8b78cbc9a53cd45bb22430f31
8a635084d1840c905f236c83000000000000000b8d44a0982b88abe19b724d4bdafb
a8c90dc93130e0bf4f8062810992326da126fd01db53e40250ca33a3ff302044cb0
K_main = 0x571af2e9a0bf4b354cca18d713f8a84315a46c999ceb92ca6a88b8a6d
615795140862dbccd6fdc0abecc5956c43f8ab40343a22fc1b91752cb7c2737dab90
41e
K_confirmP = 0x6c8c7fc6becf3bc07f081b4f7f867bec76fd8eeddbd7968356723
bae701e04f35f800e647dfa013b2876958efe0ce68e7595ba46f1de0b17adfc02dfe
3f18a18
K_confirmV = 0x2d0c9702a0f5536bacddd596eb6ea365d17f176db30081b97b83e
05bb87e9a36c0565b7616251c93bc76c76fc5c3531a28db40779d986d4e7b71a24c4
3fbc731
HMAC(K_confirmP, shareV) = 0x7f806ae56ea3e49a8b16ffee528086489418913
641f529d50ff92aa456ad4648e522f9540b403bff6bd94ee1adc95c7d1b2666f7ba6
f9c10748bc7bfb4181d27
HMAC(K_confirmV, shareP) = 0x8daa262decb79cceda4421f4f8dacf22ec027c0
8e036f071beea563c8e00813a29807963ff9d7d6bbff48dd5bdcdd9ca9fd7ffc272b
162258d981913f7253dcb
K_shared = 0x31e0075a823b9269af5769d71ef3b2f5001cbfe044584fe8551124a
217dad078415630bf3eda16b5a38341d418a6d72b3960f818a0926f0de88784b59d6
a694b

[Context=b'SPAKE2+-P521-SHA512-HKDF-SHA512-HMAC-SHA512 Test Vectors
']
[idProver=b'client']
[idVerifier=b'server']
w0 = 0x009c79bcd7656716314fca5a6e2c5cda7ef86131399438e012a043051e863
f60b5aeb3c101731e1505e721580f48535a9b0456b231b9266ae6fff49ee90d25f72
f5f
w1 = 0x01632c15f51fcd916cd79e19075f8a69b72b0099922ad62ff8d540b469569
f0aa027047aed2b3f242ea0ac4288b4e4db6a4e5946d8ad32b42192c5aa66d9ef8e1
b33
L = 0x040135072d0fa36f9e80031294cef5c3c35b882a0efa2c66570d64a49f8bec
6c66435bf65bb7c7b2a3e7dece491e02b4d567e7087dbc32fe0fae8af417dcb50be6
d704012a194588b690e6d3db492656f72ddea01fc1c7fcec0f5d34a5af0102939f6f
deae39c20cff74fcdb7f09855f0fc9520d20b0520b0b096b8d42c7c3d68b4a66f751
x = 0x00b69e3bb15df82c9fa0057461334e2c66ab92fc9b8d3662eec81216ef5ddc
4a43f19e90dedaa2d72502f69673a115984ffcf88e03a9364b07102114c5602cd93c
69
shareP = 0x0400a14431edf6852ff5fe868f8683e16e9e0a45d9e27f9a96442285a
c6b161fc0bf267362a5ffb06f9cbd14b7a37e492146d77cae4c77812df00a91dbae0
9e27e1fac00ae019317ef9768548325bca35ce258e6206fe03c6338b2eb889d09d9f
11400a36cf6328a7e1f81c6c7a2af7ff1d9b5210768318f27e57b75b39b9fbfc7b37
a60ab
y = 0x0056d01c5246fbde964c0493934b7ece89eafd943eb27d357880a2a2202249
9e249528c5707b1afe8794c8a1d60ceedaeed96dd0dd904ea075f096c9fec5da7de4
96
shareV = 0x0401aa5af0f3027f63b7170572db5ff06dd1f3d6ea8ea771b26b434fb
bc6c9de7d80975131c9c2e94d30c0ed2d62449c4c1b7e95037a85ed7598e415a2591
26365e89500d0f2156b551b70416d719944736990f346f6f9ba4fbaf2f63e0987369
0bcf730582e0a7b03ffede50f5787b631d5021a94287f0a29a081b62b9f5a3bf393b
001b3
Z = 0x0401e3015bf2811891a518d342c63541294dc80e0ee210e8220a5b9cab010d
77945724ef1185d739a62847fdada9da9b1bca6b9fa173fa551185c6084c3db26d3a
f0ac01f9356d01beebebd5ff026ca19f9df5d614355f3498816ac20b63bc936eed82
8a7039d1e17dba740471d9afc0e0b4427d65b2d27a57a87e42300004e2b4620c23c9
V = 0x0401058b21ca71e4439281579d6df3b86ae874d70742fe8eae2de60e77e07e
6e1c31b9c277de36b38531f5b769e9e4030ba09258f510c83c5c21957610355ce920
1fe600672db35efd1d0903bc285d4e27e9fb4472c30f17118dfa028f182bc9361c6a
749f560e31b9c404624d24e68010f064101d4a1154e77be8f2105dbeb8b0349adb0e
TT = 0x38000000000000005350414b45322b2d503532312d5348413531322d484b4
4462d5348413531322d484d41432d534841353132205465737420566563746f72730
600000000000000636c69656e7406000000000000007365727665728500000000000
00004003f06f38131b2ba2600791e82488e8d20ab889af753a41806c5db18d37d856
08cfae06b82e4a72cd744c719193562a653ea1f119eef9356907edc9b56979962d7a
a01bdd179a3d547610892e9b96dea1eab10bdd7ac5ae0cf75aa0f853bfd185cf782f
894301998b11d1898ede2701dca37a2bb50b4f519c3d89a7d054b51fb84912192850
00000000000000400c7924b9ec017f3094562894336a53c50167ba8c596387688054
2bc669e494b2532d76c5b53dfb349fdf69154b9e0048c58a42e8ed04cef052a3bc34
9d95575cd2501c62bee650c9287a651bb75c7f39a2006873347b769840d261d17760
b107e29f091d556a82a2e4cde0c40b84b95b878db2489ef760206424b3fe7968aa8e
0b1f33485000000000000000400a14431edf6852ff5fe868f8683e16e9e0a45d9e27
f9a96442285ac6b161fc0bf267362a5ffb06f9cbd14b7a37e492146d77cae4c77812
df00a91dbae09e27e1fac00ae019317ef9768548325bca35ce258e6206fe03c6338b
2eb889d09d9f11400a36cf6328a7e1f81c6c7a2af7ff1d9b5210768318f27e57b75b
39b9fbfc7b37a60ab85000000000000000401aa5af0f3027f63b7170572db5ff06dd
1f3d6ea8ea771b26b434fbbc6c9de7d80975131c9c2e94d30c0ed2d62449c4c1b7e9
5037a85ed7598e415a259126365e89500d0f2156b551b70416d719944736990f346f
6f9ba4fbaf2f63e09873690bcf730582e0a7b03ffede50f5787b631d5021a94287f0
a29a081b62b9f5a3bf393b001b385000000000000000401e3015bf2811891a518d34
2c63541294dc80e0ee210e8220a5b9cab010d77945724ef1185d739a62847fdada9d
a9b1bca6b9fa173fa551185c6084c3db26d3af0ac01f9356d01beebebd5ff026ca19
f9df5d614355f3498816ac20b63bc936eed828a7039d1e17dba740471d9afc0e0b44
27d65b2d27a57a87e42300004e2b4620c23c985000000000000000401058b21ca71e
4439281579d6df3b86ae874d70742fe8eae2de60e77e07e6e1c31b9c277de36b3853
1f5b769e9e4030ba09258f510c83c5c21957610355ce9201fe600672db35efd1d090
3bc285d4e27e9fb4472c30f17118dfa028f182bc9361c6a749f560e31b9c404624d2
4e68010f064101d4a1154e77be8f2105dbeb8b0349adb0e4200000000000000009c7
9bcd7656716314fca5a6e2c5cda7ef86131399438e012a043051e863f60b5aeb3c10
1731e1505e721580f48535a9b0456b231b9266ae6fff49ee90d25f72f5f
K_main = 0xf672a73216568d20cc3433247bc43a3b875a421cbdba76cf1db8bfe57
2b658bf3f7a4ef8cc9ff1f6a2827ff7b19860454b775a4097009040f3b36b7420407
16e
K_confirmP = 0xa211c60ea8d4b3b294bd6ca9515663b77f3caac28af3658b34fe1
512f25077f2f64b8de426caa662b4cbbdc9c2f8f12347993c8d57fdf68c177732d7d
da7277b
K_confirmV = 0x0e9bf6b9a37339144cb32a78a872f50b10839f81eda6c09a827dd
bb158c47162bec274af920cdf809f162b98fa701efebada26cdfbeac408b5a35b052
d18f0c6
HMAC(K_confirmP, shareV) = 0xf0f5c903dfa42fe367659656a26058cd984b76a
8e91ae4d0fa4c13db149008e2ae57713fb230a627761174fefd263b9c10e9a4b6a37
46cde59c5943040c17133
HMAC(K_confirmV, shareP) = 0xa8f7ab43f3a800171d3a3fb26d742e1ed236c2d
5804ecd328f220a7d245cd2e3bfb6c0526983bff9229c94f70fe64ba9bb5a4d0dc10
afcda64a4c96d4c3d81ad
K_shared = 0xd1c170e4e55efacb9db8abad286293ebd1dcf24f13973427b9632bb
c323e42e447afca2aa7f74f2af3fb5f51684ec543db854b7002cde6799c330b032ba
8820a

[Context=b'SPAKE2+-P256-SHA256-HKDF-SHA256-CMAC-AES-128 Test Vector
s']
[idProver=b'client']
[idVerifier=b'server']
w0 = 0x9aad90c603cf16cec4ee40d81acd7a865130b28cc6d0664ae2e0f406aa47e
d61
w1 = 0x872be859cec1e78d191882bd9c2f032af018a25016813788fe8954bfffc58
c8e
L = 0x04d79a53698c5dd79e14b426e73b4a7f1b42469815fe24e8f53ce01579e902
eb198d59f05bc451c41826b88e3db5476a69e197fdf474c75b387f6d40361c3fda35
x = 0x9d39a3511a007a7d3fe6af5555cf60301bcda503f2bf6634b2caf9e4fd0743
a1
shareP = 0x04788218027ba4b17f7279ef0aef47a8733cf88b5bf65d6127ecadc78
b8a0f65b9001f7e54719fb63c072ddd1e1a4adfb376dde37ba1aa2082362b6c2ca14
a8e53
y = 0x9c3219841626325c68d89c22fb6c55611e3136442daa8b9b784db7242afff3
ed
shareV = 0x04c05953ea9d1cd6248b8c61becd7d55e46237526d8b1e23495ea7566
b7f6bc24b3da1cfb2e88a975fcfb5dc4e72b5cbea509b1cfdd1ef8f8195fa8bf2bd5
ca1e5
Z = 0x049444a17ad5909548a084fa182275a89a496ec6669bd08892aa9c64a512d4
0212147e6005bf1d510e3bbcfee8efc38243acaf4c5f2decffa009341b1e330b0442
V = 0x0457a8919af393e2da1de209a01fdda275eab0a682d8931b0e6ee1b9339794
63a25ccbcda1956a6a555706f0b062aa880617bd219d09391ad8576d3a73e9233f57
TT = 0x39000000000000005350414b45322b2d503235362d5348413235362d484b4
4462d5348413235362d434d41432d4145532d313238205465737420566563746f727
30600000000000000636c69656e74060000000000000073657276657241000000000
0000004886e2f97ace46e55ba9dd7242579f2993b64e16ef3dcab95afd497333d8fa
12f5ff355163e43ce224e0b0e65ff02ac8e5c7be09419c785e0ca547d55a12e2d204
10000000000000004d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4
f98baa1292b4907d60aa6bfade45008a636337f5168c64d9bd36034808cd564490b1
e656edbe7410000000000000004788218027ba4b17f7279ef0aef47a8733cf88b5bf
65d6127ecadc78b8a0f65b9001f7e54719fb63c072ddd1e1a4adfb376dde37ba1aa2
082362b6c2ca14a8e53410000000000000004c05953ea9d1cd6248b8c61becd7d55e
46237526d8b1e23495ea7566b7f6bc24b3da1cfb2e88a975fcfb5dc4e72b5cbea509
b1cfdd1ef8f8195fa8bf2bd5ca1e54100000000000000049444a17ad5909548a084f
a182275a89a496ec6669bd08892aa9c64a512d40212147e6005bf1d510e3bbcfee8e
fc38243acaf4c5f2decffa009341b1e330b044241000000000000000457a8919af39
3e2da1de209a01fdda275eab0a682d8931b0e6ee1b933979463a25ccbcda1956a6a5
55706f0b062aa880617bd219d09391ad8576d3a73e9233f5720000000000000009aa
d90c603cf16cec4ee40d81acd7a865130b28cc6d0664ae2e0f406aa47ed61
K_main = 0x6002da6b2740056f2836ac0316ae9e02e2b24c5c109883136e90ed868
b2fcf62
K_confirmP = 0x857d0db7f5e06385853bf4b8abd43b5a
K_confirmV = 0x268c75933332157118063550c6bfe846
CMAC(K_confirmP, shareV) = 0xd340bc94a03feafd14491e316514ca5f
CMAC(K_confirmV, shareP) = 0x2b42d0fe76bcf9ccc208d06d60082f96
K_shared = 0xe832094adfc028bf288e49ab902fc208b7eeff084f259da7613c047
9869d4fc9

[Context=b'SPAKE2+-P256-SHA512-HKDF-SHA512-CMAC-AES-128 Test Vector
s']
[idProver=b'client']
[idVerifier=b'server']
w0 = 0x56e0299ac95739b616a973276c1338e3651285345dde2f7faf74c25c0b50e
b90
w1 = 0x462fe5b522a17d3d35b27323113bdd252de9cbfdd6f264b35721bf59a9a74
f0b
L = 0x040540332ffec8a2faa8d17ae6da5973c11e078b8c10c89fd6af996726b802
3513eff2914c3ced64fbedd4e261438fb0ea6ef9fc1faef4ba1ead780636faac1bc1
x = 0x254dd22780eeb6af2464dd6a2bd026b46a34966d6933607f1be956314f74b0
ea
shareP = 0x049661cfdb0f7bd24b637f8d1d0f464c17f0b9c15129ea31156dcc581
da6c840240b275d72f28ea73a5c088c99d73896af24a5ae26e036eb2dedaf26e511a
24a48
y = 0x695beec24305fbd5660bc200228598e7c891fdf60a55df4bdd3a57debc3847
4a
shareV = 0x0461f580eb3eb4b2f412d5c07491f360ad6e4492d8f23e346f0ba999f
bbcb9715a3c2485c3b250a6672e6698da3c9a9725645f607ee90a9b1b34fd44b9df6
e551a
Z = 0x0406f77a4bca254219dc3eeca9989f377037407105540bfddc5bdeff3d27a8
7d68442e69d543a000077bd4c42e33930f890d29fb4be5e8dcc627f6811ace96c274
V = 0x0442952a531a2937e03808e74f6d65afbedb4cfb7fcf91991498f77db21b14
6f5c2249e727e374de03f32848465aba5c5ebfe6501d3537d09160c7f42e4b3f133d
TT = 0x39000000000000005350414b45322b2d503235362d5348413531322d484b4
4462d5348413531322d434d41432d4145532d313238205465737420566563746f727
30600000000000000636c69656e74060000000000000073657276657241000000000
0000004886e2f97ace46e55ba9dd7242579f2993b64e16ef3dcab95afd497333d8fa
12f5ff355163e43ce224e0b0e65ff02ac8e5c7be09419c785e0ca547d55a12e2d204
10000000000000004d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4
f98baa1292b4907d60aa6bfade45008a636337f5168c64d9bd36034808cd564490b1
e656edbe74100000000000000049661cfdb0f7bd24b637f8d1d0f464c17f0b9c1512
9ea31156dcc581da6c840240b275d72f28ea73a5c088c99d73896af24a5ae26e036e
b2dedaf26e511a24a4841000000000000000461f580eb3eb4b2f412d5c07491f360a
d6e4492d8f23e346f0ba999fbbcb9715a3c2485c3b250a6672e6698da3c9a9725645
f607ee90a9b1b34fd44b9df6e551a41000000000000000406f77a4bca254219dc3ee
ca9989f377037407105540bfddc5bdeff3d27a87d68442e69d543a000077bd4c42e3
3930f890d29fb4be5e8dcc627f6811ace96c27441000000000000000442952a531a2
937e03808e74f6d65afbedb4cfb7fcf91991498f77db21b146f5c2249e727e374de0
3f32848465aba5c5ebfe6501d3537d09160c7f42e4b3f133d200000000000000056e
0299ac95739b616a973276c1338e3651285345dde2f7faf74c25c0b50eb90
K_main = 0x111790ae23de3fc5bb43bdc1f63106461dbd8d86360adf056bf117164
8bfb231503853db2625275b7136b5a823dd5a94482514fce7f791c4daca2b21c7bde
756
K_confirmP = 0xb234d2e152a03168b76c6474d5322070
K_confirmV = 0x683d62024626fe0c5126ef4df58b88ee
CMAC(K_confirmP, shareV) = 0x0dc514d262e37470eb43e058e0d615f4
CMAC(K_confirmV, shareP) = 0xde076589efcd5d96c2ea6061d96772d9
K_shared = 0x488a34663d6be5e02590bb8e9ad9ad3e0f580dec41e8b99ed4ae4b7
34da49287638cac4c9f17fe3c3ae18dda0d6d7f14c17e4640d5a2aaab959efa0cbea
4e546
]]></artwork>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAG55BmIAA+29eXccx7Hm/X9+ihr5nDEoA3DtC+9o3qGpjUfrSLS8aPz6
5Er0K6Abt7shkpZ0P/v7i8yq7uoGuIDynXPnzJUtCuiuyiUy4oknIiOTZ2dn
arvYXvqH2bdfP/rso/J3p5leZo9unl355da7TD5U2pi1//FhtrnWP/jy+vJm
o9zKLvUVr7m1Dtszo9dnNqyfne0fOcs75fSWR3768NHTj35Rll+erdYvH2aL
ZVgptbheP8y265vNtszzIS/VD/7l89XaPcye0PV66bdnH0rjSm22eun+ri9X
S1p76TfqevEw+367sqfZZrXern3Y8NPLq/QDQ7vS19eL5bO/KaVvther9UOV
namMfxbLzcPs6Xn2VN8Yv97Gz9I8ni6uDj5drZ89zB5dX196hmPP42cbuvLb
h9lXSz9+9bVe/5D9Sb+MX9vFlsk9vrmmjcVydZo91peLsFovFzobmryo01Or
m+VWpPDH5UIk/O0WuWyyVcgeXfn1wur4lL/Si0vEs01D+h9auju3q6uDmTw+
zx6dZ39ardxsJo8v1ovNdnV94dcH345NWv38f1x4LfIxi+3mHDkrtVytr/R2
8aNHUtnTDz99GN8YNeO9pxc+e/p8sTz7cBHCwmef+svLK9Tk6/XKXPorNMZF
eTD47WK13LyXpMVs/EbW+mH20R+/+erxN3/5+mnGWven2Xery5srn9VD28jM
P/d2e7P22XIlolgss8erq+sblCD71i780vrT7Fo/46ui7M6KujnNvr1eMwG/
PvvOry/1s9PsD/x3sTzNPvHMZJkWJKmf9Bh/TbqwSXPLsrMkww/PWafNxeGH
H51nny0ut/84/PS78+zbi9XNNZ8ma/n67NFSX77cLDaHAvvW25s12oBk0tcy
ydHAknC2ev1MVOliu73ePPz9773MZ3u+0HZ9jur9vszL/PdVUZ1fu3AwlzJ/
zVzmA/zocXE4qI8uLxfX24VFQ9c/+uzx+uX1dvVsra8vXp6KFi6dXrtNhsJm
H7HMIvjtwVPZJ2vaPs1+9OvzrLx7Hhtvn8UJ8ENx9mN5a/z5oNTZ2VmmDdak
Lbr39AL5YLQ3AjmZ8xu7XhjWeg9ImNlmI9AAMG0veEoUDdP5zL/MPnphLzSa
kJ3I4w+y6/UKYFhdqvXNMjN++9z7ZbZ9vkKBsEqf5udQzR/RH5pmFCt+2Fzo
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
1ZvtmYw8+jFa68Za9ol9TOsxCk5qYZLqhqP4J7ZXlfNeMG6hNJOJoo4ysFhH
8aqJSacn0wsPdu0klZ8dilC7o4lHtwXttX9iLOeS+o6Iv3s/PRz5j8gyEr3D
l3Y4oyYFS8p3cv0g6dhskLetc7pwJZuV56hUKLuIFYT7hY5bqPs93VicsvTP
X6Uzanaz5lSYNteaqX5w1IhURZFejharjkBxLCqbkHM09dMJXcar22IZRUKY
Xb5vPChxUI8BwV2kmrxRpsktTfsRSZIqSvJ0jvcq1ZdMb80AOMjZ/fNbecqX
2wvxccsF8cvO7U3MyMA7R6IA5sgFU+O1sEeXPO3uYh4vCto1L8sedSXotK3z
0UzPI2M732yd3MN38iDuk360s7Xjb0GAR9eyQQ6ePEpwuNP5MWR2PoxVdt79
XdbyRHz3abZ8IJd/C9+V3/kxun9pMR4JPUnfpyfktcuFOYd+4aFPLh6cpz3x
EznkjMLLTQIXKnZlFs9mnUQfxX/+ERuTioqzk7PNP7Lf/x5blpflWS9nR76/
a4yLB8ejmhqU/2S/YxJ/24/A/Pa35/8fAjpJjT74/uHmH39LowJ7Vsu/p0Xb
rk98/KsJaCYOC7VKH2QffJD9dg46v00iGNvf8Iu/vPNplubo2e8fnhV/y36X
aMnJ95vv5df/ikfo8789iA1t/MEb44Mnm+9zebCQo9zl3+Sw0eb74uE4D1Qx
zWIU0DQRb+NMjoRVnGZFnufTQqL9CPpwgRansfzV2/NEUk4ePEgH1ydZ8cYr
hCftpWflLysYT+1c8zyNOR8bm96ZzsIju+vsv8QnBOn/LpaYdJzP38+uzy+l
iuL4+4e7E0GjqKZmGX76ewtSnctH8T/Y2m4wWOeU63gqJRzfeQlQJVkh2f8f
02/HgdDuQOd0aFGezcaHo4jH9Ma5Onl8uDUbb7tJ9ah7UpneOTzHvjuuO13x
e/4gVa6Pew9rvyON+wDg4LK5iZDEy8qme4rhG3UqFFWpSPb0uHIxkaVXn+/Z
herj5og6GO0uwNptl0835YwlGOr7sXL6A/PbUUpnt/bnp59nG2jz1VG//Zv6
fhof7aRrsdOH0zj5OF13zcfx8Ff+whhJdRobKlv3oS1t3jtT1lXblNo3jav4
o2/zpgpWd12Rl8NQh7LSbmjqQRWmSsfG8hedH+omVLXr+q5vTK8rH+ra5S40
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
2ClUSFIF8DHMD6tDYUoLky86hCrcsuzhi2UUCrarVYcjALR8HA0SQU2dRG49
80PfazymqwX0YHid3GHIEjeE3Ub2wOBtUut7j2wOP+Gb/sNlc/rmdjbn190z
qiRF+2vvGVU4TQPkSOUrFEJWvx9AFQOq8bInPidy5UHIAYECQ4FaBFTJoA3Y
kJTeBiU3jIL5AxS7cLIVARzAPwoH6oPdRpx4jZ4RLzsm1Llcqj9ldx0KINQD
6RxXsb/TXabq4DLTd7zLVM0uM8V3gFvet43cANp3cpwaFgP9B8WkLpmoHY/f
iVkRvjqiZoTZtblCcF287BIP2RBSQJBKuR8TKday/W0It+C/ciRPtsx5RY65
M+EqeIngNA4ApMUZVPWB8ozSeWtfr+bO/l19vZo7+3f19Wru7N/V16u5s4++
/g7pvMnFqrt97P1crLrbx97Pxaq7fez9XKy628dGF3uXdO70teqtnO0bfK16
K2f7Bl+r3srZvsHXqrdytndJZ+Z11T3d7p1eV93T7d7pddU93e6dXlfd0+3W
xwcvJEhW7xolz4Nk9a5RsgTJs0RdQEy6q4ismlY8pgW/q2osUcIOehwWwS3g
hoqANYUcCA5ACZ6ilUPbVZAbleW07ADmBDlJCWQE2P4gOVScRSdN5HHPW3Zg
KsOyCjGo806BtMeJOk2UhraDLQ4sN1iTHMbSQwMQCBLhOKxGmQlwKxkBuEO0
LUW4eBu+BQVqgkZkz1sEnSirNcYJEgUpYsbZDHLGRrL+Av4WdyO7sJ1TyB+9
M8eJuhx3LvVnQHtVDYUkOyuE1mMTktaRjD/xcY8v0a3NBy073E5JaNtbbEr8
H/pc64BuWqLdHPAWoOmDluRi8EbKz1q+MlJdlveS+mkkkFaQgSAHqV6bqAOn
GwuvRIvFpqpWTiawnkKIGILUYmE+WvUerPJSyaBBYLCkqIc8770cZ+8kNStH
MUAj3G8hpy0wHbDYSGbOD7o2LQJQNeP0zQBrQC/rHOkRsb8+UScnTzUOIlQa
+skLThLHgmSogUdskq8unUKLa2/lavAgmNnBcoVDeLlOXJKdJRRB8ohDWQ52
qEOXY+i1QecRmNy5I3YBfrEMNTOEgQli9oV2h4k6VzBqjNM3oIO2ZkCnNWtQ
9nLcDySFd4WyDlhhRwjVweUqOJiyMGPUilCioxfcrO4kDVLK2TnTxLN9UnJR
I9le9D6XRIOX83C2ArZyGmEReqZ2r6uPDv7OjFmmTm3eLVM3aB1P58Eq0EPr
bS0bNiInuXy8h6AxWGJ2qV5vkaTHhcomndY1cRFeZUqyof7gHrrgbeFhYoXc
YFEaJ5bGZCV11GuhgHJFRNf3QZx6baT0rumVhZ59vqtikH0Nlle2OCVRR7RR
EhFUBl4eCiPnvQa8SPA4TpC/skAjPgVUK5UXqHHNIPU5cthbrpiAkBACVHJK
SqqtJfUn1l530LHGSDEYypEL0lc43qoZs1KDwx1XclRILorvHFSy1aHhH1gW
rgfP7DSsJZRGzlHAkWV70NfB4c4qpYvDhBJzLgk70CCsBw4OusBU4Xxy/kd4
r2SoTMzsOdkt8lY72/UKdZTSHoN1FgHeBojgsVo5RFQ6OUFX6FoLJe9aucle
ykzkjF+PHZVyaQQcoFZwM1xnSuOggDhJwrMWg5bzbD1hhC1LsSu4dSFnJiuh
uA7WbAa5VMLJ7lApB/IrNf2NZPu7j5pBYiPIgxVK15vettAQ9Ed2PmXXqsNa
HeGMB2+HRm4zaVtl5PCqFYrudGFBAC+nKDupqjSNQw9RqMYCgk0OC7JBpgpm
9/j3oOWCEEiOYnK+2eU9IIM44U6z/jnKheD6OkiRUSmZeFBraD0RjdxmkkOd
Sznb2Eppl5x7hwGWUv0KW2ARoIQAXSU3fniISbAVgWSlWeHaSsGOt0GSlENV
F8wrWjQS2999xJISOWphjnAaXRDC5VKNyzTkCgtCQcBVig3g+3JE2Xt8NA4F
QqjaCkOxVtSLyaKx0L6mg/vTCTGGJjhri844VhEyU8XzsXAegLSroDyVVLDu
YvzhjTH+Pe8+qqYYnz+lLs1JjI90XhXlq+o4kn+HE+JjPPvrToirovz1J8Rv
Vye8wwlxdfAX1rzjCXHl21eeEH9rsFGHaPNuYKMO0SaCzV23H70WKNSrkOI+
QKFehRQRKG6P6U7EUG8JGa9FDPWWkHHH7Ud77FD3Bo87sEPdGzyOAxVIgnp3
liAkYV5UDhOClBlIsGwoEDdXhKN5Vcjfv+JzqZItERj0jUhVPJGP9RktnrCU
8xjlrduPmg66h5Zgri0hYsyn1cLiACvI4K2tdmyqa5AXoU08uIFEwAS5yQRS
Urfq8ev4NbF9bqRWBMcv2x1StC0eExnUUuZy9PYR+5XNQSi376TuQ/46Fxw1
IsP+MaEwtIfc1PcVC1+n4gFRZGgMCIJ1IgneNJ33UsQG7WwG4hWCRYvtK4Kt
wRFLDve6eeifTS0BJ7kGS1sCcrmFgAUe5NxzS7hBOAvQF1IlV8PywPQuaPiz
RXmJa3OvpHJjunqoJZBpTFOWchuD3IdlpFS2kpovRyCLaQ3WBKnGKlspMCEI
NqEZ9EDgrlD8/dZrA8+rSvkLLHu5opKwUgrEWienc4mkC58LBkqZWz8EB90b
5Doj+CPUEipYIe6SoM/iO1xbE6I5ySFIbqUPRs7G+zAEuTYLoDWS8XWdaFdL
V3KWZtrwLJuagZd85z2RVJAbDBi+BqlySZ8RXAE88hc0VeC+kF6PMUt+oKtN
rrw+OnfbtgJ7JpfbLQBKfG/oJdMhFXOEN4iAuA1xD17L4ZDWWUh3oSRE7Ws5
5opAG/woGgbmVppF6Hs74LQqufZC/r6gBqNupXjCG7moi8/wv3BjVcpZ4ZFa
tkNjpPhRshRy21vbYiugiWRLpZgZqRYSZ+cwGqngc8AO1usNWIne1vqQWrZF
IAz0hjAMdh3qIlY/d7Vcq9XKSQ+irwEYDKXcuScQp4dhCHJPmxm6gsCZofSN
rQyBB9F/V3qQvIfjW5Sjww7kKH3eSUIkptoqyHst1XyhVbALZrfbUoPLdPhS
Ir1G9vedrZgo3Uk9Pl4etiObyo0UDqCJtjFOzv9IvqxX+PceqPdYJQGhjjyH
laqlWA/YliJwychIIsr4xvcsTyup1h75Wj/I1RD7q4fqUm7iiCU9g1TwV5AC
Ob2OtkB3pMZSqgM7oBInMkiVGyN3JtbPqTY0VjZj8Zkd7ltuIyESL3sYnhQt
svBSDCsJeuLypgJYh6LNbRck0jUVUXDl3plavnH76D+p5f8B1PKtwUYdos27
gY06RJsINrfH9AagUK9CivsAhXoVUkSguD2mOxFDvSVkvBYx1FtCxh2XNO2x
Q90bPO7ADnVv8DimlnI1x7uzBCEJM2pZFEXH+hA8EJsEBGoggE7O6lZFLn9n
n5Mbrvo2Oo8gd7fKvU9FWyvIlaTJ5a8kbOK+Cqyia0wH/TSxiM+5RhMs9KWc
A7OeiGqQv24Pdl/K9gZr4xXByjE3pVE5F1AgdWG4MDasuUZ2gpF5lx9z07av
CI0wkraUrT7L5EGc2gUpCu/Rn9dy0xwlAgkYvaxPh3zqyudN73M4eBPq13NT
1rOTM4M+AAROVAg+Q7DAjx3R39GlN3LnVSXHqF0rCpjDQOMtqYN2/J9uxSKJ
eerC93LY1xEV1AbIRmi1bP5C1a22tR0CmOErW2lf9E5ux20djEegxMuBagRP
2CKIy8h0LoGeqonl2nht/P8PueiCEmXCAAA=

-->

</rfc>
