<?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.6.14 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-06" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.0 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-06"/>
    <author initials="M." surname="Abdalla" fullname="Michel Abdalla">
      <organization>DFINITY - Zurich</organization>
      <address>
        <email>michel.abdalla@gmail.com</email>
      </address>
    </author>
    <author initials="B." surname="Haase" fullname="Bjoern Haase">
      <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
      <address>
        <email>bjoern.m.haase@web.de</email>
      </address>
    </author>
    <author initials="J." surname="Hesse" fullname="Julia Hesse">
      <organization>IBM Research Europe - Zurich</organization>
      <address>
        <email>JHS@zurich.ibm.com</email>
      </address>
    </author>
    <date year="2022" month="July" day="24"/>
    <keyword>Internet-Draft</keyword>
    <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,
is compatible with any cyclic group of prime- and non-prime order.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Crypto Forum Research Group mailing list (cfrg@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/search/?email_list=cfrg"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/cfrg/draft-irtf-cfrg-cpace"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes CPace which is a balanced Password-Authenticated-Key-Establishment (PAKE)
protocol for two parties where both parties derive a cryptographic key
of high entropy from a shared secret of low-entropy.
CPace protects the passwords against offline dictionary attacks by requiring
adversaries to actively interact with a protocol party and by allowing
for at most one single password guess per active interaction.</t>
      <t>The CPace design was tailored considering the following main objectives:</t>
      <ul spacing="normal">
        <li>Efficiency: Deployment of CPace is feasible on resource-constrained devices.</li>
        <li>Versatility: CPace supports different application scenarios via versatile input formats, and by supporting applications with and without clear initiator and responder roles.</li>
        <li>Implementation error resistance: CPace avoids common implementation pitfalls already by-design, and it does not offer incentives for insecure speed-ups. For smooth integration into different cryptographic library ecosystems, this document provides a variety of cipher suites.</li>
        <li>Post-quantum annoyance: CPace comes with mitigations with respect to adversaries that become capable of breaking the discrete logarithm problem on elliptic curves.</li>
      </ul>
      <section anchor="outline-of-this-document">
        <name>Outline of this document</name>
        <ul spacing="normal">
          <li>
            <xref target="ApplicationPerspective"/> describes the expected properties of an application using CPace, and discusses in particular which application-level aspects are relevant for CPace's security.</li>
          <li>
            <xref target="CipherSuites"/> gives an overview over the recommended
cipher suites for CPace which were optimized for different types of cryptographic
library ecosystems.</li>
          <li>
            <xref target="Definition"/> introduces the notation used throughout this document.</li>
          <li>
            <xref target="protocol-section"/> specifies the CPace protocol.</li>
          <li>The final section provides explicit reference implementations and test vectors of all of the
functions defined for CPace in the appendix.</li>
        </ul>
        <t>As this document is primarily written for implementers and application designers, we would like to refer the theory-inclined reader to the scientific paper <xref target="AHH21"/> which covers the detailed security analysis of the different CPace instantiations as defined in this document via the cipher suites.</t>
      </section>
    </section>
    <section anchor="requirements-notation">
      <name>Requirements Notation</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
    </section>
    <section anchor="ApplicationPerspective">
      <name>High-level application perspective</name>
      <t>CPace enables balanced password-authenticated key establishment. CPace requires a shared secret octet string, the password-related string (PRS), is available for both parties A and B. PRS can be a low-entropy secret itself, for instance a clear-text password encoded according to <xref target="RFC8265"/>, or any string derived from a common secret, for instance by use of a password-based key derivation function.</t>
      <t>Applications with clients and servers where the server side is storing account and password information in its persistent memory are recommended to use augmented PAKE protocols such as OPAQUE <xref target="I-D.irtf-cfrg-opaque"/>.</t>
      <t>In the course of the CPace protocol, A sends one message MSGa to B and B sends one message MSGb to A. CPace does not mandate any ordering of these two messages. We use the term "initiator-responder" for CPace where A always speaks first, and the term "symmetric" setting where anyone can speak first.</t>
      <t>CPace's output is an intermediate session key (ISK), but any party might abort in case of an invalid received message. A and B will produce the same ISK value only if both sides did initiate the protocol using the same protocol inputs, specifically the same PRS string and the same value for the optional input parameters CI, ADa, ADb and sid that will be specified in the upcoming sections.</t>
      <t>The naming of ISK key as "intermediate" session key highlights the fact that it is RECOMMENDED that applications process ISK by use of a suitable strong key derivation function KDF (such as defined in <xref target="RFC5869"/>) before using the key in a higher-level protocol.</t>
      <section anchor="optional-cpace-inputs">
        <name>Optional CPace inputs</name>
        <t>For accomodating different application settings, CPace offers the following OPTIONAL inputs, i.e. inputs which MAY also be the empty string:</t>
        <ul spacing="normal">
          <li>Channel identifier (CI). CI can be used to bind a session key exchanged with CPace to a specific networking channel which interconnects the protocol parties. Both parties are required to have the same view of CI. CI will not be publicly sent on the wire and may also include confidential information.</li>
          <li>
            <t>Associated data fields (ADa and ADb).
These fields can be used to authenticate public associated data alongside the CPace protocol. The values ADa (and ADb, respectively) are guaranteed to be authenticated in case both parties agree on a key.  </t>
            <t>
ADa and ADb can for instance include party identities or protocol
version information of an application protocol (e.g. to avoid downgrade attacks).  </t>
            <t>
If party identities are not encoded as part of CI, party identities SHOULD be included in ADa and ADB
 (see <xref target="sec-considerations-ids"/>).
In a setting with clear initiator and responder roles, identity information in ADa
sent by the initiator can be used by the responder for choosing the right PRS string (respectively password) for this identity.</t>
          </li>
          <li>
            <t>Session identifier (sid).
CPace comes with a security analysis <xref target="AHH21"/> in the framework of universal composability.
This framework allows for modular analysis of a larger application protocol which uses CPace as a building block. For such analysis
the CPace protocol is bound to a specific session of the larger protocol by use of a sid string that is globally unique. As a result, when used with a unique sid, CPace instances remain secure when running concurrently with other CPace instances, and even arbitrary other protocols.  </t>
            <t>
For this reason, it is RECOMMENDED that applications establish a unique session identifier sid
prior to running the CPace protocol. This can be implemented by concatenating random bytes produced by A
with random bytes produced by B. If such preceding round is not an option but
parties are assigned clear initiator-responder roles, it is RECOMMENDED to let the initiator A choose a fresh
random sid and send it to B together with the first message.
If a sid string is used it SHOULD HAVE a length of at least 8 bytes.</t>
          </li>
        </ul>
      </section>
      <section anchor="responsibilities-of-the-application-layer">
        <name>Responsibilities of the application layer</name>
        <t>The following tasks are out of the scope of this document and left to the application layer</t>
        <ul spacing="normal">
          <li>
            <t>Setup phase:  </t>
            <ul spacing="normal">
              <li>The application layer is responsible for the handshake that makes parties agree on a common CPace cipher suite.</li>
              <li>The application layer needs to specify how to encode the CPace byte strings Ya/Yb and ADa/ADb defined in section
 <xref target="protocol-section"/>
for transfer over the network.
For CPace it is RECOMMENDED to encode network messages by using MSGa = lv_cat(Ya,ADa) and MSGb = lv_cat(Yb,ADb)
using the length-value concatenation function lv_cat
speficied in <xref target="notation-section"/>.
This document provides test vectors for lv_cat-encoded messages.
Alternative network encodings, e.g., the encoding method
used for the client hello and server hello messages of the TLS protocol, MAY be used
when considering the guidance given in <xref target="sec-considerations"/>.</li>
            </ul>
          </li>
          <li>This document does not specify which encodings applications use for the mandatory PRS input and the optional inputs
CI, sid, ADa and ADb. If PRS is a clear-text password or an octet string derived from a clear-text password,
e.g. by use of a key-derivation function, the clear-text password SHOULD BE encoded according to <xref target="RFC8265"/>.</li>
          <li>The application needs to settle whether CPace is used in the initiator-responder or the symmetric setting, as in the symmetric
setting transcripts must be generated using ordered string concatenation. In this document we will provide test vectors
for both, initiator-responder and symmetric settings.</li>
        </ul>
      </section>
    </section>
    <section anchor="CipherSuites">
      <name>CPace cipher suites</name>
      <t>In the setup phase of CPace, both communication partners need to agree on a common cipher suite.
Cipher suites consist of a combination of a hash function H and an elliptic curve environment G.</t>
      <t>For naming cipher suites we use the convention "CPACE-G-H". We RECOMMEND the following cipher suites:</t>
      <ul spacing="normal">
        <li>CPACE-X25519-SHA512. This suite uses the group environment G_X25519 defined in <xref target="CPaceMontgomery"/> and SHA-512 as hash function.
This cipher suite comes with the smallest messages on the wire and a low computational cost.</li>
        <li>CPACE-P256_XMD:SHA-256_SSWU_NU_-SHA256.
This suite instantiates the group environment G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P256_XMD:SHA-256_SSWU_NU_
from <xref target="I-D.irtf-cfrg-hash-to-curve"/> on curve NIST-P256, and hash function SHA-256.</li>
      </ul>
      <t>The following RECOMMENDED cipher suites provide higher security margins.</t>
      <ul spacing="normal">
        <li>CPACE-X448-SHAKE256. This suite uses the group environment G_X448 defined in <xref target="CPaceMontgomery"/> and SHAKE-256 as hash function.</li>
        <li>CPACE-P384_XMD:SHA-384_SSWU_NU_-SHA384.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P384_XMD:SHA-384_SSWU_NU_
from <xref target="I-D.irtf-cfrg-hash-to-curve"/> on curve NIST-P384 with H = SHA-384.</li>
        <li>CPACE-P521_XMD:SHA-512_SSWU_NU_-SHA512.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P521_XMD:SHA-384_SSWU_NU_
from <xref target="I-D.irtf-cfrg-hash-to-curve"/> on curve NIST-P384 with H = SHA-512.</li>
      </ul>
      <t>CPace can also securely be implemented using the cipher suites CPACE-RISTR255-SHA512 and CPACE-DECAF448-SHAKE256 defined in
<xref target="CPaceCoffee"/>. <xref target="sec-considerations"/> gives guidance on how to implement CPace on further elliptic curves.</t>
    </section>
    <section anchor="Definition">
      <name>Definitions and notation</name>
      <section anchor="hash-function-h">
        <name>Hash function H</name>
        <t>Common choices for H are SHA-512 <xref target="RFC6234"/> or SHAKE-256 <xref target="FIPS202"/>. (I.e. the hash function
outputs octet strings, and not group elements.)
For considering both variable-output-length hashes and fixed-output-length hashes, we use the following convention.
In case that the hash function is specified for a fixed-size output, we define H.hash(m,l) such
that it returns the first l octets of the output.</t>
        <t>We use the following notation for referring to the specific properties of a hash function H:</t>
        <ul spacing="normal">
          <li>H.hash(m,l) is a function that operates on an input octet string m and returns a hashing result of l octets.</li>
          <li>H.b_in_bytes denotes the default output size in bytes corresponding to the symmetric
security level of the hash function. E.g. H.b_in_bytes = 64 for SHA-512 and SHAKE-256 and H.b_in_bytes = 32 for
SHA-256 and SHAKE-128. We use the notation H.hash(m) = H.hash(m, H.b_in_bytes) and let the hash operation
output the default length if no explicit length parameter is given.</li>
          <li>H.bmax_in_bytes denotes the <em>maximum</em> output size in octets supported by the hash function. In case of fixed-size
hashes such as SHA-256, this is the same as H.b_in_bytes, while there is no such limit for hash functions such as SHAKE-256.</li>
          <li>H.s_in_bytes denotes the <em>input block size</em> used by H. For instance, for SHA-512 the input block size s_in_bytes is 128,
while for SHAKE-256 the input block size amounts to 136 bytes.</li>
        </ul>
      </section>
      <section anchor="group-environment-g">
        <name>Group environment G</name>
        <t>The group environment G specifies an elliptic curve group (also denoted G for convenience)  and associated constants
and functions as detailed below. In this document we use multiplicative notation for the group operation.</t>
        <ul spacing="normal">
          <li>G.calculate_generator(H,PRS,CI,sid) denotes a function that outputs a representation of a generator (referred to as "generator" from now on) of the group
which is derived from input octet strings PRS, CI, and sid and with the help of the hash function H.</li>
          <li>G.sample_scalar() is a function returning a representation of a scalar (referred to as "scalar" from now on) appropriate as a
private Diffie-Hellman key for the group.</li>
          <li>G.scalar_mult(y,g) is a function operating on a scalar
y and a group element g.
It returns an octet string representation of the group element Y = g^y.</li>
          <li>G.I denotes a unique octet string representation of the neutral element of the group. G.I is used for detecting and signaling certain error conditions.</li>
          <li>G.scalar_mult_vfy(y,g) is a function operating on
a scalar y and a group element g. It returns an octet string
representation of the group element g^y. Additionally, scalar_mult_vfy specifies validity conditions for y,g and g^y and outputs G.I in case they are not met.</li>
          <li>G.DSI denotes a domain-separation identifier string which SHALL be uniquely identifying the group environment G.</li>
        </ul>
      </section>
      <section anchor="notation-section">
        <name>Notation for string operations</name>
        <ul spacing="normal">
          <li>bytes1 || bytes2 and denotes concatenation of octet strings.</li>
          <li>len(S) denotes the number of octets in a string S.</li>
          <li>nil denotes an empty octet string, i.e., len(nil) = 0.</li>
          <li>prepend_len(octet_string) denotes the octet sequence that is obtained from prepending
the length of the octet string to the string itself. The length shall be prepended by using an LEB128 encoding of the length.
This will result in a single-byte encoding for values below 128. (Test vectors and reference implementations
for prepend_len and the LEB128 encodings are given in the appendix.)</li>
          <li>lv_cat(a0,a1, ...) is the "length-value" encoding function which returns the concatenation of the input strings with an encoding of
their respective length prepended. E.g. lv_cat(a0,a1) returns
prepend_len(a0) || prepend_len(a1). The detailed specification of lv_cat and a reference implementations are given in the appendix.</li>
          <li>
            <t>network_encode(Y,AD) denotes the function specified by the application layer that outputs an octet string encoding
of the input octet strings Y and AD
for transfer on the network. The implementation of MSG = network_encode(Y,AD) SHALL allow the receiver party to parse MSG for the
individual subcomponents Y and AD.
For CPace we RECOMMEND to implement network_encode(Y,AD) as network_encode(Y,AD) = lv_cat(Y,AD).  </t>
            <t>
Other prefix-free encodings, such as the network encoding
used for the client-hello messages in TLS MAY also be used. We give guidance in the security consideration sections.
but here the guidance given in the security consideration section MUST be considered.</t>
          </li>
          <li>sample_random_bytes(n) denotes a function that returns n octets uniformly distributed between 0 and 255.</li>
          <li>zero_bytes(n) denotes a function that returns n octets with value 0.</li>
          <li>oCat(bytes1,bytes2) denotes ordered concatenation of octet strings, which places the lexiographically larger octet
string first. (Explicit reference code for this function is given in the appendix.)</li>
          <li>transcript(MSGa,MSGb) denotes function outputing a string for the protocol transcript with messages MSGa and MSGb.
In applications where CPace is used without clear initiator and responder roles, i.e. where the ordering of messages is
not enforced by the protocol flow, transcript(MSGa,MSGb) = oCat(MSGa,MSGb) SHOULD be used.
In the initiator-responder setting transcript(MSGa,MSGb) SHOULD BE implemented such that the later message is appended to the
earlier message, i.e., transcript(MSGa,MSGb) = MSGa||MSGb if MSGa is sent first.</li>
        </ul>
      </section>
      <section anchor="notation-for-group-operations">
        <name>Notation for group operations</name>
        <t>We use multiplicative notation for the group, i.e., X^2  denotes the element that is obtained by computing X*X, for group element X and group operation *.</t>
      </section>
    </section>
    <section anchor="protocol-section">
      <name>The CPace protocol</name>
      <t>CPace is a one round protocol between two parties, A and B. At invocation, A and B are provisioned with PRS,G,H and OPTIONAL CI,sid,ADa (for A) and CI,sid,ADb (for B).
A sends a message MSGa to B. MSGa contains the public share Ya
and OPTIONAL associated data ADa (i.e. an ADa field that MAY have a length of 0 bytes).
Likewise, B sends a message MSGb to A. MSGb contains the public share Yb
and OPTIONAL associated data ADb (i.e. an ADb field that MAY have a length of 0 bytes).
Both A and B use the received messages for deriving a shared intermediate session key, ISK.</t>
      <section anchor="protocol-flow">
        <name>Protocol flow</name>
        <t>Optional parameters and messages are denoted with [].</t>
        <artwork><![CDATA[
            public: G, H, [CI], [sid]

  A: PRS,[ADa]                    B: PRS,[ADb]
    ---------------------------------------
 compute Ya    |     Ya,[ADa]     |  compute Yb
               |----------------->|
               |     Yb,[ADb]     |
 verify inputs |<-----------------|  verify inputs
 derive ISK    |                  |  derive ISK
    ---------------------------------------
 output ISK                          output ISK

]]></artwork>
      </section>
      <section anchor="cpace-protocol-instructions">
        <name>CPace protocol instructions</name>
        <t>A computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar ya = G.sample_scalar() and group element Ya = G.scalar_mult (ya,g). A then transmits MSGa = network_encode(Ya, ADa) with
optional associated data ADa to B.</t>
        <t>B computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar yb = G.sample_scalar() and group element Yb = G.scalar_mult(yb,g). B sends MSGb = network_encode(Yb, ADb) with optional associated data ADb to A.</t>
        <t>Upon reception of MSGa, B checks that MSGa was properly generated conform with the chosen encoding of network messages (notably correct length fields).
If this parsing fails, then B MUST abort. (Testvectors of examples for invalid messages when using lv_cat() as network_encode function for
CPace are given in the appendix.)
B then computes K = G.scalar_mult_vfy(yb,Ya). B MUST abort if K=G.I.
Otherwise B returns
ISK = H.hash(prefix_free_cat(G.DSI || "_ISK", sid, K)||transcript(MSGa, MSGb)). B returns ISK and terminates.</t>
        <t>Likewise upon reception of MSGb, A parses MSGb for Yb and ADb and checks for a valid encoding.
If this parsing fails, then A MUST abort. A then computes K = G.scalar_mult_vfy(ya,Yb). A MUST abort if K=G.I.
Otherwise A returns
ISK = H.hash(lv_cat(G.DSI || "_ISK", sid, K) || transcript(MSGa, MSGb)). A returns ISK and terminates.</t>
        <t>The session key ISK returned by A and B is identical if and only if the supplied input parameters PRS, CI and sid match on both sides and transcript view (containing of MSGa and MSGb) of both parties match.</t>
        <t>Note that in case of a symmetric protocol execution without clear initiator/responder roles, ordered concatenation needs to be used for
generating a matching view of the transcript by both parties.</t>
      </section>
    </section>
    <section anchor="implementation-of-recommended-cpace-cipher-suites">
      <name>Implementation of recommended CPace cipher suites</name>
      <section anchor="common-function-for-computing-generators">
        <name>Common function for computing generators</name>
        <t>The different cipher suites for CPace defined in the upcoming sections share the same method for deterministically combining the individual strings PRS, CI, sid and the domain-separation identifier DSI to a generator string that we describe here. Let CPACE-G-H denote the cipher suite.</t>
        <ul spacing="normal">
          <li>generator_string(G.DSI, PRS, CI, sid, s_in_bytes) denotes a function that returns the string
lv_cat(G.DSI, PRS, zero_bytes(len_zpad), CI, sid).</li>
          <li>len_zpad = MAX(0, s_in_bytes - len(prepend_len(PRS)) - len(prepend_len(G.DSI)) - 1)</li>
        </ul>
        <t>The zero padding of length len_zpad is designed such that the encoding of G.DSI and PRS together with the zero padding field completely
fills the first input block (of length s_in_bytes) of the hash.
As a result the number of bytes to hash becomes independent of the actual length of the password (PRS). (A reference implementation
and test vectors are provided in the appendix.)</t>
        <t>The introduction of a zero-padding within the generator string also helps mitigating attacks of a side-channel adversary that
analyzes correlations between publicly known variable information with the low-entropy PRS string.
Note that the hash of the first block is intentionally made independent of session-specific inputs, such as sid or CI.</t>
      </section>
      <section anchor="CPaceMontgomery">
        <name>CPace group objects G_X25519 and G_X448 for single-coordinate Ladders on Montgomery curves</name>
        <t>In this section we consider the case of CPace when using the X25519 and X448 Diffie-Hellman functions
from <xref target="RFC7748"/> operating on the Montgomery curves Curve25519 and Curve448 <xref target="RFC7748"/>.
CPace implementations using single-coordinate ladders on further Montgomery curves SHALL use the definitions in line
with the specifications for X25519 and X448 and review the guidance given in <xref target="sec-considerations"/>.</t>
        <t>For the group environment G_X25519 the following definitions apply:</t>
        <ul spacing="normal">
          <li>G_X25519.field_size_bytes = 32</li>
          <li>G_X25519.field_size_bits = 255</li>
          <li>G_X25519.sample_scalar() = sample_random_bytes(G.field_size_bytes)</li>
          <li>G_X25519.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X25519(y,g)</li>
          <li>G_X25519.I = zero_bytes(G.field_size_bytes)</li>
          <li>G_X25519.DSI = "CPace255"</li>
        </ul>
        <t>CPace cipher suites using G_X25519 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 32 bytes of output. It is RECOMMENDED
to use G_X25519 in combination with SHA-512.</t>
        <t>For X448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>G_X448.field_size_bytes = 56</li>
          <li>G_X448.field_size_bits = 448</li>
          <li>G_X448.sample_scalar() = sample_random_bytes(G.field_size_bytes)</li>
          <li>G_X448.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X448(y,g)</li>
          <li>G_X448.I = zero_bytes(G.field_size_bytes)</li>
          <li>G_X448.DSI = "CPace448"</li>
        </ul>
        <t>CPace cipher suites using G_X448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 56 bytes of output. It is RECOMMENDED
to use G_X448 in combination with SHAKE-256.</t>
        <t>For both G_X448 and G_X25519 the G.calculate_generator(H, PRS,sid,CI) function shall be implemented as follows.</t>
        <ul spacing="normal">
          <li>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) SHALL BE calculated using the input block size of the
chosen hash function.</li>
          <li>This string SHALL then BE hashed to the required length
gen_str_hash = H.hash(gen_str, G.field_size_bytes).
Note that this implies that the permissible output length H.maxb_in_bytes MUST BE larger or equal to the
field size of the group G for making a hashing function suitable.</li>
          <li>This result is then considered as a field coordinate using
the u = decodeUCoordinate(gen_str_hash, G.field_size_bits) function from <xref target="RFC7748"/> which we
repeat in the appendix for convenience.</li>
          <li>The result point g is then calculated as (g,v) = map_to_curve_elligator2(u) using the function
from <xref target="I-D.irtf-cfrg-hash-to-curve"/>. Note that the v coordinate produced by the map_to_curve_elligator2 function
is not required for CPace and discarded. The appendix repeats the definitions from <xref target="I-D.irtf-cfrg-hash-to-curve"/> for convenience.</li>
        </ul>
        <t>In the appendix we show sage code that can be used as reference implementation.</t>
        <section anchor="verification-tests">
          <name>Verification tests</name>
          <t>For single-coordinate Montgomery ladders on Montgomery curves verification tests according to <xref target="verification"/> SHALL
consider the u coordinate values that encode a low-order point on either, the curve or the quadratic twist.</t>
          <t>In addition to that in case of G_X25519 the tests SHALL also verify that the implementation of G.scalar_mult_vfy(y,g) produces the
expected results for non-canonical u coordinate values with bit #255 set, which also encode low-order points.</t>
          <t>Corresponding test vectors are provided in the appendix.</t>
        </section>
      </section>
      <section anchor="CPaceCoffee">
        <name>CPace group objects G_Ristretto255 and G_Decaf448 for prime-order group abstractions</name>
        <t>In this section we consider the case of CPace using the Ristretto255 and Decaf448 group abstractions <xref target="I-D.draft-irtf-cfrg-ristretto255-decaf448"/>.
These abstractions define an encode and decode function, group operations using an internal encoding
and a one-way-map. With the group abstractions there is a distinction between an internal representation
of group elements and an external encoding of the same group element. In order to distinguish between these
different representations, we prepend an underscore before values using the internal representation within this
section.</t>
        <t>For Ristretto255 the following definitions apply:</t>
        <ul spacing="normal">
          <li>G_Ristretto255.DSI = "CPaceRistretto255"</li>
          <li>G_Ristretto255.field_size_bytes = 32</li>
          <li>G_Ristretto255.group_size_bits = 252</li>
          <li>G_Ristretto255.group_order = 2^252 + 27742317777372353535851937790883648493</li>
        </ul>
        <t>CPace cipher suites using G_Ristretto255 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 64 bytes of output.
It is RECOMMENDED to use G_Ristretto255 in combination with SHA-512.</t>
        <t>For decaf448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>G_Decaf448.DSI = "CPaceDecaf448"</li>
          <li>G_Decaf448.field_size_bytes = 56</li>
          <li>G_Decaf448.group_size_bits = 445</li>
          <li>G_Decaf448.group_order = l = 2^446 -
  1381806680989511535200738674851542
  6880336692474882178609894547503885</li>
        </ul>
        <t>CPace cipher suites using G_Decaf448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 112 bytes of output.
It is RECOMMENDED to use G_Decaf448 in combination with SHAKE-256.</t>
        <t>For both abstractions the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>It is RECOMMENDED to implement G.sample_scalar() as follows.  </t>
            <ul spacing="normal">
              <li>Set scalar = sample_random_bytes(G.group_size_bytes).</li>
              <li>Then clear the most significant bits larger than G.group_size_bits.</li>
              <li>Interpret the result as the little-endian encoding of an integer value and return the result.</li>
            </ul>
          </li>
          <li>Alternatively, if G.sample_scalar() is not implemented according to the above recommendation, it SHALL be implemented using uniform sampling between 1 and (G.group_order - 1). Note that the more complex
uniform sampling process can provide a larger side-channel attack surface for embedded systems in hostile environments.</li>
          <li>G.scalar_mult(y,_g) SHALL operate on a scalar y and a group element _g in the internal representation of the group abstraction environment. It returns the value Y = encode((_g)^y), i.e. it returns a value using the public encoding.</li>
          <li>G.I = is the public encoding representation of the identity element.</li>
          <li>G.scalar_mult_vfy(y,X) operates on a value using the public encoding and a scalar and is implemented as follows. If the decode(X) function fails, it returns G.I. Otherwise it returns encode( decode(X)^y ).</li>
          <li>
            <t>The G.calculate_generator(H, PRS,sid,CI) function SHALL return a decoded point and SHALL BE implemented as follows.  </t>
            <ul spacing="normal">
              <li>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated using the input block size of the chosen hash function.</li>
              <li>This string is then hashed to the required length gen_str_hash = H.hash(gen_str, 2 * G.field_size_bytes).  Note that this
implies that the permissible output length H.maxb_in_bytes MUST BE larger or equal to twice the field size of the group
G for making a
hash function suitable.</li>
              <li>Finally the internal representation of the generator _g is calculated as _g = one_way_map(gen_str_hash)
using the one-way map function from the abstraction.</li>
            </ul>
          </li>
        </ul>
        <t>Note that with these definitions the scalar_mult function operates on a decoded point _g and returns an encoded point,
while the scalar_mult_vfy(y,X) function operates on an encoded point X (and also returns an encoded point).</t>
        <section anchor="verification-tests-1">
          <name>Verification tests</name>
          <t>For group abstractions verification tests according to <xref target="verification"/> SHALL consider encodings of the neutral element and an octet string
that does not decode to a valid group element.</t>
        </section>
      </section>
      <section anchor="CPaceWeierstrass">
        <name>CPace group objects for curves in Short-Weierstrass representation</name>
        <t>The group environment objects G defined in this section for use with Short-Weierstrass curves,
are parametrized by the choice of an elliptic curve and by choice of a suitable encode_to_curve(str) function.
encode_to_curve(str) must map an octet string str to a point on the curve.</t>
        <section anchor="curves-and-associated-functions">
          <name>Curves and associated functions</name>
          <t>Elliptic curves in Short-Weierstrass form are considered in <xref target="IEEE1363"/>.
<xref target="IEEE1363"/> allows for both, curves of prime and non-prime order. However, for the procedures described in this section any suitable
group MUST BE of prime order.</t>
          <t>The specification for the group environment objects specified in this section closely follow the ECKAS-DH1 method from <xref target="IEEE1363"/>.
I.e. we use the same methods and encodings and protocol substeps as employed in the TLS
 <xref target="RFC5246"/> <xref target="RFC8446"/> protocol family.</t>
          <t>For CPace only the uncompressed full-coordinate encodings from <xref target="SEC1"/> (x and y coordinate) SHOULD be used.
Commonly used curve groups are specified in <xref target="SEC2"/> and <xref target="RFC5639"/>. A typical representative of such a Short-Weierstrass curve is NIST-P256.
Point verification as used in ECKAS-DH1 is described in Annex A.16.10. of <xref target="IEEE1363"/>.</t>
          <t>For deriving Diffie-Hellman shared secrets ECKAS-DH1 from <xref target="IEEE1363"/> specifies the use of an ECSVDP-DH method. We use ECSVDP-DH in combination with the identy map such that it either returns "error" or the x-coordinate of the Diffie-Hellman result point as shared secret in big endian format (fixed length output by FE2OSP without truncating leading zeros).</t>
        </section>
        <section anchor="suitable-encodetocurve-methods">
          <name>Suitable encode_to_curve methods</name>
          <t>All the encode_to_curve methods specified in <xref target="I-D.irtf-cfrg-hash-to-curve"/>
are suitable for CPace. For Short-Weierstrass curves it is RECOMMENDED to use the non-uniform variant of the SSWU
mapping primitive from <xref target="I-D.irtf-cfrg-hash-to-curve"/> if a SSWU mapping is available for the chosen curve. (We recommend non-uniform maps in order to give implementations
the flexibility to opt for x-coordinate-only scalar multiplication algorithms.)</t>
        </section>
        <section anchor="definition-of-the-group-environment-g-for-short-weierstrass-curves">
          <name>Definition of the group environment G for Short-Weierstrass curves</name>
          <t>In this paragraph we use the following notation for defining the group object G for a selected curve and encode_to_curve method:</t>
          <ul spacing="normal">
            <li>With group_order we denote the order of the elliptic curve which MUST BE a prime.</li>
            <li>With is_valid(X) we denote a method which operates on an octet stream according to <xref target="SEC1"/> of a point on the group and returns true if the point is valid or false otherwise. This is_valid(X) method SHALL be implemented according to Annex A.16.10. of <xref target="IEEE1363"/>. I.e. it shall return false if X encodes either the neutral element on the group or does not form a valid encoding of a point on the group.</li>
            <li>With encode_to_curve(str) we denote a selected mapping function from <xref target="I-D.irtf-cfrg-hash-to-curve"/>. I.e. a function that maps
octet string str to a point on the group. <xref target="I-D.irtf-cfrg-hash-to-curve"/> considers both, uniform and non-uniform mappings based on several different strategies. It is RECOMMENDED to use the nonuniform variant of the SSWU mapping primitive within <xref target="I-D.irtf-cfrg-hash-to-curve"/>.</li>
            <li>G.DSI denotes a domain-separation identifier string. G.DSI which SHALL BE obtained by the concatenation of "CPace" and the associated name of the cipher suite used for the encode_to_curve function as specified in <xref target="I-D.irtf-cfrg-hash-to-curve"/>. E.g. when using the map with the name "P384_XMD:SHA-384_SSWU_NU_"
on curve NIST-P384 the resulting value SHALL BE G.DSI = "CPaceP384_XMD:SHA-384_SSWU_NU_".</li>
          </ul>
          <t>Using the above definitions, the CPace functions required for the group object G are defined as follows.</t>
          <ul spacing="normal">
            <li>G.sample_scalar() SHALL return a value between 1 and (G.group_order - 1). The value sampling MUST BE uniformly random. It is RECOMMENDED to use rejection sampling for converting a uniform bitstring to a uniform value between 1 and (G.group_order - 1).</li>
            <li>
              <t>G.calculate_generator(H, PRS,sid,CI) function SHALL be implemented as follows.  </t>
              <ul spacing="normal">
                <li>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated.</li>
                <li>Then the output of a call to encode_to_curve(gen_str) is returned, using the selected function from <xref target="I-D.irtf-cfrg-hash-to-curve"/>.</li>
              </ul>
            </li>
            <li>G.scalar_mult(s,X) is a function that operates on a scalar s and an input point X. The input X shall use the same encoding as produced by the G.calculate_generator method above.
G.scalar_mult(s,X) SHALL return an encoding of either the point X^s or the point X^(-s) according to <xref target="SEC1"/>. Implementations SHOULD use the full-coordinate format without compression, as important protocols such as TLS 1.3 removed support for compression. Implementations of scalar_mult(s,X) MAY output either X^s or X^(-s) as both points X^s and X^(-s) have the same x-coordinate and
result in the same Diffie-Hellman shared secrets K.
(This allows implementations to opt for x-coordinate-only scalar multiplication algorithms.)</li>
            <li>
              <t>G.scalar_mult_vfy(s,X) merges verification of point X according to <xref target="IEEE1363"/> A.16.10. and the the ECSVDP-DH procedure from <xref target="IEEE1363"/>.
It SHALL BE implemented as follows:  </t>
              <ul spacing="normal">
                <li>If is_valid(X) = False then G.scalar_mult_vfy(s,X) SHALL return "error" as specified in <xref target="IEEE1363"/> A.16.10 and 7.2.1.</li>
                <li>Otherwise G.scalar_mult_vfy(s,X) SHALL return the result of the ECSVDP-DH procedure from <xref target="IEEE1363"/> (section 7.2.1). I.e. it shall
either return "error" (in case that X^s is the neutral element) or the secret shared value "z" (otherwise). "z" SHALL be encoded by using
the big-endian encoding of the x-coordinate of the result point X^s according to <xref target="SEC1"/>.</li>
              </ul>
            </li>
            <li>We represent the neutral element G.I by using the representation of the "error" result case from <xref target="IEEE1363"/> as used in the G.scalar_mult_vfy method above.</li>
          </ul>
        </section>
        <section anchor="verification-tests-2">
          <name>Verification tests</name>
          <t>For Short-Weierstrass curves verification tests according to <xref target="verification"/> SHALL consider encodings of the point at infinity and an encoding of a point not on the group.</t>
        </section>
      </section>
    </section>
    <section anchor="verification">
      <name>Implementation verification</name>
      <t>Any CPace implementation MUST be tested against invalid or weak point attacks.
Implementation MUST be verified to abort upon conditions where G.scalar_mult_vfy functions outputs G.I.
For testing an implementation it is RECOMMENDED to include weak or invalid points in MSGa and MSGb and introduce this
in a protocol run. It SHALL be verified that the abort condition is properly handled.</t>
      <t>Moreover any implementation MUST be tested with respect invalid encodings of MSGa and MSGb where the length of the message
does not match the specified encoding (i.e. where the sum of the prepended length information does not match the actual length
of the message).</t>
      <t>Corresponding test vectors are given in the appendix for all recommended cipher suites.</t>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>A security proof of CPace is found in <xref target="AHH21"/>. This proof covers all recommended cipher suites included in this document.
In the following sections we describe how to protect CPace against several attack families, such as relay-, length extension- or side channel attacks. We also describe aspects to consider when deviating from recommended cipher suites.</t>
      <section anchor="sec-considerations-ids">
        <name>Party identifiers and relay attacks</name>
        <t>If unique strings identifying the protocol partners are included either as part of the channel identifier CI, the session id sid or the associated data fields ADa, ADb, the ISK will provide implicit authentication also regarding the party identities. Incorporating party identifier strings
is important for fending off relay attacks.
Such attacks become relevant in a setting where several parties, say, A, B and C, share the same password PRS. An adversary might relay messages from a honest user A, who aims at interacting with user B, to a party C instead. If no party identifier strings are used, and B and C use the same PRS value, A might be establishing a common ISK key with C while assuming to interact with party B.
Including and checking party identifiers can fend off such relay attacks.</t>
      </section>
      <section anchor="network-message-encoding-and-hashing-protocol-transcripts">
        <name>Network message encoding and hashing protocol transcripts</name>
        <t>It is RECOMMENDED to encode the (Ya,ADa) and (Yb,ADb) fields on the network by using network_encode(Y,AD) = lv_cat(Y,AD). I.e. we RECOMMEND
to prepend an encoding of the length of the subfields. As the length
of the variable-size input strings are prepended this results in a so-called prefix-free encoding of transcript strings, using terminology introduced in <xref target="CDMP05"/>. This property allows for disregarding length-extension imperfections that come with the commonly used
Merkle-Damgard hash function constructions such as SHA256 and SHA512.</t>
        <t>Other alternative network encoding formats which prepend an encoding of the length of variable-size data fields in the protocol
messages are equally suitable.
This includes, e.g., the type-length-value format specified in the DER encoding standard (X.690) or the protocol message encoding used in the TLS protocol family for the TLS client-hello or server-hello messages.</t>
        <t>In case that an application whishes to use another form of network message encoding which is not prefix-free,
the guidance given in <xref target="CDMP05"/> SHOULD BE considered (e.g. by replacing hash functions with the HMAC constructions from<xref target="RFC2104"/>).</t>
      </section>
      <section anchor="key-derivation">
        <name>Key derivation</name>
        <t>Although already K is a shared value, it MUST NOT itself be used as an application key. Instead, ISK MUST BE used. Leakage of K to an adversary can lead to offline dictionary attacks.</t>
        <t>As noted already in <xref target="protocol-section"/> it is RECOMMENDED to process ISK
by use of a suitable strong key derivation function KDF (such as defined in <xref target="RFC5869"/>) first,
before using the key in a higher-level protocol.</t>
      </section>
      <section anchor="key-confirmation">
        <name>Key confirmation</name>
        <t>In many applications it is advisable to add an explicit key confirmation round after the CPace protocol flow. However, as some applications
might only require implicit authentication and as explicit authentication messages are already a built-in feature in many higher-level protocols (e.g. TLS 1.3) the CPace protocol described here does not mandate
use of a key confirmation on the level of the CPace sub-protocol.</t>
        <t>Already without explicit key confirmation, CPace enjoys weak forward security under the sCDH and sSDH assumptions <xref target="AHH21"/>.
With added explicit confirmation, CPace enjoys perfect forward security also under the strong sCDH and sSDH assumptions <xref target="AHH21"/>.</t>
        <t>Note that in <xref target="ABKLX21"/> it was shown that an idealized variant of CPace
also enjoys perfect forward security without explicit key confirmation. However this proof does not explicitly cover
the recommended cipher suites
in this document and requires the stronger assumption of an algebraic adversary model. For this reason, we recommend adding
explicit key confirmation if perfect forward security is required.</t>
        <t>When implementing explicit key confirmation, it is recommended to use an appropriate message-authentication code (MAC)
such as HMAC <xref target="RFC2104"/> or
CMAC <xref target="RFC4493"/> using a key mac_key derived from ISK.</t>
        <t>One suitable option that works also in the parallel setting without message ordering is to proceed as follows.</t>
        <ul spacing="normal">
          <li>First calculate mac_key as as mac_key = H.hash(b"CPaceMac" || ISK).</li>
          <li>Then let each party send an authenticator tag Ta, Tb that is calculated over the protocol message that it has sent previously. I.e.
let party A calculate its transmitted authentication code Ta as Ta = MAC(mac_key, MSGa) and let party B calculate its transmitted
authentication code Tb as Tb = MAC(mac_key, MSGb).</li>
          <li>Let the receiving party check the remote authentication tag for the correct value and abort in case that it's incorrect.</li>
        </ul>
      </section>
      <section anchor="sampling-of-scalars">
        <name>Sampling of scalars</name>
        <t>For curves over fields F_p where p is a prime close to a power of two, we recommend sampling scalars as a uniform bit string of length field_size_bits. We do so in order to reduce both, complexity of the implementation and reducing the attack surface
with respect to side-channels for embedded systems in hostile environments.
The effect of non-uniform sampling on security was demonstrated to be begning in <xref target="AHH21"/> for the case of Curve25519 and Curve448.
This analysis however does not transfer to most curves in Short-Weierstrass form. As a result, we recommend rejection sampling if G is as in <xref target="CPaceWeierstrass"/>.</t>
      </section>
      <section anchor="single-coordinate-cpace-on-montgomery-curves">
        <name>Single-coordinate CPace on Montgomery curves</name>
        <t>The recommended cipher suites for the Montgomery curves Curve25519 and Curve448 in <xref target="CPaceMontgomery"/> rely on the following properties  <xref target="AHH21"/>:</t>
        <ul spacing="normal">
          <li>The curve has order (p * c) with p prime and c a small cofactor. Also the curve's quadratic twist must be of order (p' * c') with p' prime and c' a cofactor.</li>
          <li>The cofactor c' of the twist MUST BE EQUAL to or an integer multiple of the cofactor c of the curve.</li>
          <li>Both field order q and group order p MUST BE close to a power of two along the lines of <xref target="AHH21"/>, Appendix E.</li>
          <li>The representation of the neutral element G.I MUST BE the same for both, the curve and its twist.</li>
          <li>The implementation of G.scalar_mult_vfy(y,X) MUST map all c low-order points on the curve and all c' low-order points on the twist to G.I.</li>
        </ul>
        <t>Montgomery curves other than the ones recommended here can use the specifications given in <xref target="CPaceMontgomery"/>, given that the above properties hold.</t>
      </section>
      <section anchor="nonce-values">
        <name>Nonce values</name>
        <t>Secret scalars ya and yb MUST NOT be reused. Values for sid SHOULD NOT be reused since the composability
guarantees established by the simulation-based proof rely on the uniqueness of session ids <xref target="AHH21"/>.</t>
        <t>If CPace is used in a concurrent system, it is RECOMMENDED that a unique sid is generated by the higher-level protocol and passed to CPace. One suitable option is that sid is generated by concatenating ephemeral random strings contributed by both parties.</t>
      </section>
      <section anchor="side-channel-attacks">
        <name>Side channel attacks</name>
        <t>All state-of-the art methods for realizing constant-time execution SHOULD be used.
In case that side channel attacks are to be considered practical for a given application, it is RECOMMENDED to pay special
attention on computing
the secret generator G.calculate_generator(PRS,CI,sid).
The most critical substep to consider might be the processing of the first block of the hash that includes
the PRS string.
The zero-padding introduced when hashing the sensitive PRS string can be expected to make
the task for a side-channel attack somewhat more complex. Still this feature alone is not sufficient for ruling out power analysis attacks.</t>
      </section>
      <section anchor="quantum-computers">
        <name>Quantum computers</name>
        <t>CPace is proven secure under the hardness of the strong computational Simultaneous Diffie-Hellmann (sSDH) and strong computational Diffie-Hellmann (sCDH)
assumptions in the group G (as defined in <xref target="AHH21"/>).
These assumptions are not expected to hold any longer when large-scale quantum computers (LSQC) are available.
Still, even in case that LSQC emerge, it is reasonable to assume that discrete-logarithm computations will remain costly. CPace with ephemeral session id values
sid forces the adversary to solve one computational Diffie-Hellman problem per password guess <xref target="ES21"/>.
In this sense, using the wording suggested by Steve Thomas on the CFRG mailing list, CPace is "quantum-annoying".</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>No IANA action is required.</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Thanks to the members of the CFRG for comments and advice. Any comment and advice is appreciated.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="SEC1" target="http://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author>
              <organization>Standards for Efficient Cryptography Group (SECG)</organization>
            </author>
            <date year="2009" month="May"/>
          </front>
        </reference>
        <reference anchor="IEEE1363">
          <front>
            <title>Standard Specifications for Public Key Cryptography, IEEE 1363</title>
            <author>
              <organization/>
            </author>
            <date year="2000"/>
          </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">
              <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="I-D.irtf-cfrg-opaque">
          <front>
            <title>The OPAQUE Asymmetric PAKE Protocol</title>
            <author fullname="Daniel Bourdrez">
	 </author>
            <author fullname="Hugo Krawczyk">
              <organization>Algorand Foundation</organization>
            </author>
            <author fullname="Kevin Lewi">
              <organization>Novi Research</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="6" month="July" year="2022"/>
            <abstract>
              <t>   This document describes the OPAQUE protocol, a secure asymmetric
   password-authenticated key exchange (aPAKE) that supports mutual
   authentication in a client-server setting without reliance on PKI and
   with security against pre-computation attacks upon server compromise.
   In addition, the protocol provides forward secrecy and the ability to
   hide the password from the server, even during password registration.
   This document specifies the core OPAQUE protocol and one
   instantiation based on 3DH.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-09"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-hash-to-curve">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Sam Scott">
              <organization>Cornell Tech</organization>
            </author>
            <author fullname="Nick Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby">
              <organization>Stanford University</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="15" month="June" year="2022"/>
            <abstract>
              <t>   This document specifies a number of algorithms for encoding or
   hashing an arbitrary string to a point on an elliptic curve.  This
   document is a product of the Crypto Forum Research Group (CFRG) in
   the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-hash-to-curve-16"/>
        </reference>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley">
              <organization/>
            </author>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg">
              <organization/>
            </author>
            <author fullname="S. Turner" initials="S." surname="Turner">
              <organization/>
            </author>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS).  These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="I-D.draft-irtf-cfrg-ristretto255-decaf448">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="Henry de Valence">
	 </author>
            <author fullname="Jack Grigg">
	 </author>
            <author fullname="Mike Hamburg">
	 </author>
            <author fullname="Isis Lovecruft">
	 </author>
            <author fullname="George Tankersley">
	 </author>
            <author fullname="Filippo Valsorda">
	 </author>
            <date day="25" month="February" year="2022"/>
            <abstract>
              <t>   This memo specifies two prime-order groups, ristretto255 and
   decaf448, suitable for safely implementing higher-level and complex
   cryptographic protocols.  The ristretto255 group can be implemented
   using Curve25519, allowing existing Curve25519 implementations to be
   reused and extended to provide a prime-order group.  Likewise, the
   decaf448 group can be implemented using edwards448.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-ristretto255-decaf448-03"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="ES21" target="https://eprint.iacr.org/2021/696">
          <front>
            <title>The 'quantum annoying' property of password-authenticated key exchange protocols.</title>
            <author initials="E." surname="Eaton">
              <organization/>
            </author>
            <author initials="D." surname="Stebila">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ABKLX21" target="https://eprint.iacr.org/2021/1218">
          <front>
            <title>Algebraic Adversaries in the Universal Composability Framework.</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="J." surname="Katz">
              <organization/>
            </author>
            <author initials="J." surname="Loss">
              <organization/>
            </author>
            <author initials="J." surname="Xu">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="AHH21" target="https://eprint.iacr.org/2021/114">
          <front>
            <title>Security analysis of CPace</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="B." surname="Haase">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CDMP05" target="https://doi.org/10.1007/11535218_26">
          <front>
            <title>Merkle-Damgaard Revisited: How to Construct a Hash Function</title>
            <author initials="J.-S." surname="Coron" fullname="Jean-Sebastien Coron">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="Y." surname="Dodis" fullname="Yevgeniy Dodis">
              <organization>New York University</organization>
            </author>
            <author initials="C." surname="Malinaud" fullname="Cecile Malinaud">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="P." surname="Puniya" fullname="Prashant Puniya">
              <organization>New York University</organization>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="In" value="Advances in Cryptology - CRYPTO 2005"/>
          <seriesInfo name="pages" value="430-448"/>
          <seriesInfo name="DOI" value="10.1007/11535218_26"/>
        </reference>
        <reference anchor="FIPS202" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">
          <front>
            <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="SEC2" target="http://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters</title>
            <author>
              <organization>Standards for Efficient Cryptography Group (SECG)</organization>
            </author>
            <date year="2010" month="January"/>
          </front>
        </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="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="RFC5246">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
            <author fullname="T. Dierks" initials="T." surname="Dierks">
              <organization/>
            </author>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="August" year="2008"/>
            <abstract>
              <t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol.  The TLS protocol provides communications security over the Internet.  The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5246"/>
          <seriesInfo name="DOI" value="10.17487/RFC5246"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC5639">
          <front>
            <title>Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation</title>
            <author fullname="M. Lochter" initials="M." surname="Lochter">
              <organization/>
            </author>
            <author fullname="J. Merkle" initials="J." surname="Merkle">
              <organization/>
            </author>
            <date month="March" year="2010"/>
            <abstract>
              <t>This memo proposes several elliptic curve domain parameters over finite prime fields for use in cryptographic applications.  The domain parameters are consistent with the relevant international standards, and can be used in X.509 certificates and certificate revocation lists (CRLs), for Internet Key Exchange (IKE), Transport Layer Security (TLS), XML signatures, and all applications or protocols based on the cryptographic message syntax (CMS).  This document is  not an Internet Standards Track specification; it is published for  informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5639"/>
          <seriesInfo name="DOI" value="10.17487/RFC5639"/>
        </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>
      </references>
    </references>
    <section anchor="cpace-function-definitions">
      <name>CPace function definitions</name>
      <section anchor="definition-and-test-vectors-for-string-utility-functions">
        <name>Definition and test vectors for string utility functions</name>
        <section anchor="prependlen-function">
          <name>prepend_len function</name>
          <artwork><![CDATA[
def prepend_len(data):
    "prepend LEB128 encoding of length"
    length = len(data)
    length_encoded = b""
    while True:
        if length < 128:
            length_encoded += bytes([length])
        else:
            length_encoded += bytes([(length & 0x7f) + 0x80])
        length = int(length >> 7)
        if length == 0:
            break;
    return length_encoded + data
]]></artwork>
        </section>
        <section anchor="prependlen-test-vectors">
          <name>prepend_len test vectors</name>
          <artwork><![CDATA[
  prepend_len(b""): (length: 1 bytes)
    00
  prepend_len(b"1234"): (length: 5 bytes)
    0431323334
  prepend_len(bytes(range(127))): (length: 128 bytes)
    7f000102030405060708090a0b0c0d0e0f101112131415161718191a1b
    1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738
    393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455
    565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172
    737475767778797a7b7c7d7e
  prepend_len(bytes(range(128))): (length: 130 bytes)
    8001000102030405060708090a0b0c0d0e0f101112131415161718191a
    1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
    38393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354
    55565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071
    72737475767778797a7b7c7d7e7f
]]></artwork>
        </section>
        <section anchor="lvcat-function">
          <name>lv_cat function</name>
          <artwork><![CDATA[
  def lv_cat(*args):
      result = b""
      for arg in args:
          result += prepend_len(arg)
      return result
]]></artwork>
        </section>
        <section anchor="testvector-for-lvcat">
          <name>Testvector for lv_cat()</name>
          <artwork><![CDATA[
  lv_cat(b"1234",b"5",b"",b"6789"): (length: 13 bytes)
    04313233340135000436373839
]]></artwork>
        </section>
        <section anchor="examples-for-messages-not-obtained-from-a-lvcat-based-encoding">
          <name>Examples for messages not obtained from a lv_cat-based encoding</name>
          <t>The following messages are examples which have invalid encoded length fields. I.e. they are examples
where parsing for the sum of the length of subfields as expected for a message generated using lv_cat(Y,AD)
does not give the correct length of the message. Parties MUST abort upon reception of such invalid messages as MSGa or MSGb.</t>
          <artwork><![CDATA[
  Inv_MSG1 not encoded by lv_cat: (length: 3 bytes)
    ffffff
  Inv_MSG2 not encoded by lv_cat: (length: 3 bytes)
    ffff03
  Inv_MSG3 not encoded by lv_cat: (length: 4 bytes)
    00ffff03
  Inv_MSG4 not encoded by lv_cat: (length: 4 bytes)
    00ffffff
]]></artwork>
        </section>
      </section>
      <section anchor="definition-of-generatorstring-function">
        <name>Definition of generator_string function.</name>
        <artwork><![CDATA[
def generator_string(DSI,PRS,CI,sid,s_in_bytes):
    # Concat all input fields with prepended length information.
    # Add zero padding in the first hash block after DSI and PRS.
    len_zpad = max(0,s_in_bytes - 1 - len(prepend_len(PRS))
                     - len(prepend_len(DSI)))
    return lv_cat(DSI, PRS, zero_bytes(len_zpad),
                           CI, sid)
]]></artwork>
      </section>
      <section anchor="definitions-and-test-vector-ordered-concatenation">
        <name>Definitions and test vector ordered concatenation</name>
        <section anchor="definitions-for-lexiographical-ordering">
          <name>Definitions for lexiographical ordering</name>
          <t>For ordered concatenation lexiographical ordering of byte sequences is used:</t>
          <artwork><![CDATA[
   def lexiographically_larger(bytes1,bytes2):
      "Returns True if bytes1 > bytes2 using lexiographical ordering."
      min_len = min (len(bytes1), len(bytes2))
      for m in range(min_len):
          if bytes1[m] > bytes2[m]:
              return True;
          elif bytes1[m] < bytes2[m]:
              return False;
      return len(bytes1) > len(bytes2)
]]></artwork>
        </section>
        <section anchor="definitions-for-ordered-concatenation">
          <name>Definitions for ordered concatenation</name>
          <t>With the above definition of lexiographical ordering ordered concatenation is specified as follows.</t>
          <artwork><![CDATA[
  def oCAT(bytes1,bytes2):
      if lexiographically_larger(bytes1,bytes2):
          return bytes1 + bytes2
      else:
          return bytes2 + bytes1
]]></artwork>
        </section>
        <section anchor="test-vectors-ordered-concatenation">
          <name>Test vectors ordered concatenation</name>
          <artwork><![CDATA[
  string comparison for oCAT:
    lexiographically_larger(b"\0", b"\0\0") == False
    lexiographically_larger(b"\1", b"\0\0") == True
    lexiographically_larger(b"\0\0", b"\0") == True
    lexiographically_larger(b"\0\0", b"\1") == False
    lexiographically_larger(b"\0\1", b"\1") == False
    lexiographically_larger(b"ABCD", b"BCD") == False

  oCAT(b"ABCD",b"BCD"): (length: 7 bytes)
    42434441424344
  oCAT(b"BCD",b"ABCDE"): (length: 8 bytes)
    4243444142434445
]]></artwork>
        </section>
      </section>
      <section anchor="decoding-and-encoding-functions-according-to-rfc7748">
        <name>Decoding and Encoding functions according to RFC7748</name>
        <artwork><![CDATA[
   def decodeLittleEndian(b, bits):
       return sum([b[i] << 8*i for i in range((bits+7)/8)])

   def decodeUCoordinate(u, bits):
       u_list = [ord(b) for b in u]
       # Ignore any unused bits.
       if bits % 8:
           u_list[-1] &= (1<<(bits%8))-1
       return decodeLittleEndian(u_list, bits)

   def encodeUCoordinate(u, bits):
       return ''.join([chr((u >> 8*i) & 0xff)
                       for i in range((bits+7)/8)])
]]></artwork>
      </section>
      <section anchor="elligator-2-reference-implementation">
        <name>Elligator 2 reference implementation</name>
        <t>The Elligator 2 map requires a non-square field element Z which shall be calculated
as follows.</t>
        <artwork><![CDATA[
    def find_z_ell2(F):
        # Find nonsquare for Elligator2
        # Argument: F, a field object, e.g., F = GF(2^255 - 19)
        ctr = F.gen()
        while True:
            for Z_cand in (F(ctr), F(-ctr)):
                # Z must be a non-square in F.
                if is_square(Z_cand):
                    continue
                return Z_cand
            ctr += 1
]]></artwork>
        <t>The values of the non-square Z only depend on the curve. The algorithm above
results in a value of Z = 2 for Curve25519 and Z=-1 for Ed448.</t>
        <t>The following code maps a field element r to an encoded field element which
is a valid u-coordinate of a Montgomery curve with curve parameter A.</t>
        <artwork><![CDATA[
    def elligator2(r, q, A, field_size_bits):
        # Inputs: field element r, field order q,
        #         curve parameter A and field size in bits
        Fq = GF(q); A = Fq(A); B = Fq(1);

        # get non-square z as specified in the hash2curve draft.
        z = Fq(find_z_ell2(Fq))
        powerForLegendreSymbol = floor((q-1)/2)

        v = - A / (1 + z * r^2)
        epsilon = (v^3 + A * v^2 + B * v)^powerForLegendreSymbol
        x = epsilon * v - (1 - epsilon) * A/2
        return encodeUCoordinate(Integer(x), field_size_bits)
]]></artwork>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test vectors</name>
      <section anchor="test-vector-for-cpace-using-group-x25519-and-hash-sha-512">
        <name>Test vector for CPace using group X25519 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-x25519">
          <name>Test vectors for calculate_generator with group X25519</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 109 ; DSI = b'CPace255'
    CI = b'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 168 bytes)
      0843506163653235350850617373776f72646d000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000160a41696e69746961746f72
      0a42726573706f6e646572107e4b4791d6a8ef019b936c79fb7f2c57
    hash generator string: (length: 32 bytes)
      10047198e8c4cacf0ab8a6d0ac337b8ae497209d042f7f3a50945863
      94e821fc
    decoded field element of 255 bits: (length: 32 bytes)
      10047198e8c4cacf0ab8a6d0ac337b8ae497209d042f7f3a50945863
      94e8217c
    generator g: (length: 32 bytes)
      4e6098733061c0e8486611a904fe5edb049804d26130a44131a6229e
      55c5c321
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      45acf93116ae5d3dae995a7c627df2924321a8e857d9a200807131e3
      8839b0c2
  Outputs
    Ya: (length: 32 bytes)
      6f7fd31863b18b0cc9830fc842c60dea80120ccf2fd375498225e45a
      52065361
    MSGa = lv_cat(Ya,ADa): (length: 37 bytes)
      206f7fd31863b18b0cc9830fc842c60dea80120ccf2fd375498225e4
      5a5206536103414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      a145e914b347002d298ce2051394f0ed68cf3623dfe5db082c78ffa5
      a667acdc
  Outputs
    Yb: (length: 32 bytes)
      e1b730a4956c0f853d96c5d125cebeeea46952c07c6f66da65bd9ffd
      2f71a462
    MSGb = lv_cat(Yb,ADb): (length: 37 bytes)
      20e1b730a4956c0f853d96c5d125cebeeea46952c07c6f66da65bd9f
      fd2f71a46203414462
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      2a905bc5f0b93ee72ac4b6ea8723520941adfc892935bf6f86d9e199
      befa6024
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      2a905bc5f0b93ee72ac4b6ea8723520941adfc892935bf6f86d9e199
      befa6024
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 74 bytes)
      206f7fd31863b18b0cc9830fc842c60dea80120ccf2fd375498225e4
      5a520653610341446120e1b730a4956c0f853d96c5d125cebeeea469
      52c07c6f66da65bd9ffd2f71a46203414462
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 137 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c57202a905bc5f0b93ee72ac4b6ea8723520941adfc892935bf6f86
      d9e199befa6024206f7fd31863b18b0cc9830fc842c60dea80120ccf
      2fd375498225e45a520653610341446120e1b730a4956c0f853d96c5
      d125cebeeea46952c07c6f66da65bd9ffd2f71a46203414462
    ISK result: (length: 64 bytes)
      99a9e0ff35acb94ad8af1cd6b32ac409dc7d00557ccd9a7d19d3b462
      9e5f1f084f9332096162438c7ecc78331b4eda17e1a229a47182eccc
      9ea58cd9cdcd8e9a
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 74 bytes)
      20e1b730a4956c0f853d96c5d125cebeeea46952c07c6f66da65bd9f
      fd2f71a46203414462206f7fd31863b18b0cc9830fc842c60dea8012
      0ccf2fd375498225e45a5206536103414461
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||oCAT(MSGa,MSGb): (length: 137 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c57202a905bc5f0b93ee72ac4b6ea8723520941adfc892935bf6f86
      d9e199befa602420e1b730a4956c0f853d96c5d125cebeeea46952c0
      7c6f66da65bd9ffd2f71a46203414462206f7fd31863b18b0cc9830f
      c842c60dea80120ccf2fd375498225e45a5206536103414461
    ISK result: (length: 64 bytes)
      3cd6a9670fa3ff211d829b845baa0f5ba9ad580c3ba0ee790bd0e9cd
      556290a8ffce44419fbf94e4cb8e7fe9f454fd25dc13e689e4d6ab0a
      c2211c70a8ac0062
]]></artwork>
        </section>
        <section anchor="corresponding-ansi-c-initializers">
          <name>Corresponding ANSI-C initializers</name>
          <artwork><![CDATA[
const uint8_t tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const uint8_t tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const uint8_t tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const uint8_t tc_g[] = {
 0x4e,0x60,0x98,0x73,0x30,0x61,0xc0,0xe8,0x48,0x66,0x11,0xa9,
 0x04,0xfe,0x5e,0xdb,0x04,0x98,0x04,0xd2,0x61,0x30,0xa4,0x41,
 0x31,0xa6,0x22,0x9e,0x55,0xc5,0xc3,0x21,
};
const uint8_t tc_ya[] = {
 0x45,0xac,0xf9,0x31,0x16,0xae,0x5d,0x3d,0xae,0x99,0x5a,0x7c,
 0x62,0x7d,0xf2,0x92,0x43,0x21,0xa8,0xe8,0x57,0xd9,0xa2,0x00,
 0x80,0x71,0x31,0xe3,0x88,0x39,0xb0,0xc2,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x6f,0x7f,0xd3,0x18,0x63,0xb1,0x8b,0x0c,0xc9,0x83,0x0f,0xc8,
 0x42,0xc6,0x0d,0xea,0x80,0x12,0x0c,0xcf,0x2f,0xd3,0x75,0x49,
 0x82,0x25,0xe4,0x5a,0x52,0x06,0x53,0x61,
};
const uint8_t tc_yb[] = {
 0xa1,0x45,0xe9,0x14,0xb3,0x47,0x00,0x2d,0x29,0x8c,0xe2,0x05,
 0x13,0x94,0xf0,0xed,0x68,0xcf,0x36,0x23,0xdf,0xe5,0xdb,0x08,
 0x2c,0x78,0xff,0xa5,0xa6,0x67,0xac,0xdc,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0xe1,0xb7,0x30,0xa4,0x95,0x6c,0x0f,0x85,0x3d,0x96,0xc5,0xd1,
 0x25,0xce,0xbe,0xee,0xa4,0x69,0x52,0xc0,0x7c,0x6f,0x66,0xda,
 0x65,0xbd,0x9f,0xfd,0x2f,0x71,0xa4,0x62,
};
const uint8_t tc_K[] = {
 0x2a,0x90,0x5b,0xc5,0xf0,0xb9,0x3e,0xe7,0x2a,0xc4,0xb6,0xea,
 0x87,0x23,0x52,0x09,0x41,0xad,0xfc,0x89,0x29,0x35,0xbf,0x6f,
 0x86,0xd9,0xe1,0x99,0xbe,0xfa,0x60,0x24,
};
const uint8_t tc_ISK_IR[] = {
 0x99,0xa9,0xe0,0xff,0x35,0xac,0xb9,0x4a,0xd8,0xaf,0x1c,0xd6,
 0xb3,0x2a,0xc4,0x09,0xdc,0x7d,0x00,0x55,0x7c,0xcd,0x9a,0x7d,
 0x19,0xd3,0xb4,0x62,0x9e,0x5f,0x1f,0x08,0x4f,0x93,0x32,0x09,
 0x61,0x62,0x43,0x8c,0x7e,0xcc,0x78,0x33,0x1b,0x4e,0xda,0x17,
 0xe1,0xa2,0x29,0xa4,0x71,0x82,0xec,0xcc,0x9e,0xa5,0x8c,0xd9,
 0xcd,0xcd,0x8e,0x9a,
};
const uint8_t tc_ISK_SY[] = {
 0x3c,0xd6,0xa9,0x67,0x0f,0xa3,0xff,0x21,0x1d,0x82,0x9b,0x84,
 0x5b,0xaa,0x0f,0x5b,0xa9,0xad,0x58,0x0c,0x3b,0xa0,0xee,0x79,
 0x0b,0xd0,0xe9,0xcd,0x55,0x62,0x90,0xa8,0xff,0xce,0x44,0x41,
 0x9f,0xbf,0x94,0xe4,0xcb,0x8e,0x7f,0xe9,0xf4,0x54,0xfd,0x25,
 0xdc,0x13,0xe6,0x89,0xe4,0xd6,0xab,0x0a,0xc2,0x21,0x1c,0x70,
 0xa8,0xac,0x00,0x62,
};
]]></artwork>
        </section>
        <section anchor="test-vectors-for-gx25519scalarmultvfy-low-order-points">
          <name>Test vectors for G_X25519.scalar_mult_vfy: low order points</name>
          <t>Test vectors for which G_X25519.scalar_mult_vfy(s_in,ux) must return the neutral
element or would return the neutral element if bit #255 of field element
representation was not correctly cleared. (The decodeUCoordinate function from RFC7748 mandates clearing bit #255 for field element representations for use in the X25519 function.).</t>
          <artwork><![CDATA[
u0: 0000000000000000000000000000000000000000000000000000000000000000
u1: 0100000000000000000000000000000000000000000000000000000000000000
u2: ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u3: e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800
u4: 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157
u5: edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u6: daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
u7: eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u8: dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
u9: d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ua: cdeb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880
ub: 4c9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7

u0 ... ub MUST be verified to produce the correct results q0 ... qb:

Additionally, u0,u1,u2,u3,u4,u5 and u7 MUST trigger the abort case
when included in MSGa or MSGb.

s = af46e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449aff
qN = G_X25519.scalar_mult_vfy(s, uX)
q0: 0000000000000000000000000000000000000000000000000000000000000000
q1: 0000000000000000000000000000000000000000000000000000000000000000
q2: 0000000000000000000000000000000000000000000000000000000000000000
q3: 0000000000000000000000000000000000000000000000000000000000000000
q4: 0000000000000000000000000000000000000000000000000000000000000000
q5: 0000000000000000000000000000000000000000000000000000000000000000
q6: d8e2c776bbacd510d09fd9278b7edcd25fc5ae9adfba3b6e040e8d3b71b21806
q7: 0000000000000000000000000000000000000000000000000000000000000000
q8: c85c655ebe8be44ba9c0ffde69f2fe10194458d137f09bbff725ce58803cdb38
q9: db64dafa9b8fdd136914e61461935fe92aa372cb056314e1231bc4ec12417456
qa: e062dcd5376d58297be2618c7498f55baa07d7e03184e8aada20bca28888bf7a
qb: 993c6ad11c4c29da9a56f7691fd0ff8d732e49de6250b6c2e80003ff4629a175
]]></artwork>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-x448-and-hash-shake-256">
        <name>Test vector for CPace using group X448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-x448">
          <name>Test vectors for calculate_generator with group X448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 117 ; DSI = b'CPace448'
    CI = b'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 176 bytes)
      0843506163653434380850617373776f726475000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000160a4169
      6e69746961746f720a42726573706f6e646572105223e0cdc45d6575
      668d64c552004124
    hash generator string: (length: 56 bytes)
      769e06d6c41c8cf1c87aa3df8e687167f6d0a2e41821e856276a0221
      d88272359d0b43204b546174c9179c83c107b707f296eafaa1c5a293
    decoded field element of 448 bits: (length: 56 bytes)
      769e06d6c41c8cf1c87aa3df8e687167f6d0a2e41821e856276a0221
      d88272359d0b43204b546174c9179c83c107b707f296eafaa1c5a293
    generator g: (length: 56 bytes)
      6fdae14718eb7506dd96e3f7797896efdb8db9ec0797485c9c48a192
      2e44961da097f2908b084a5de33ab671630660d27d79ffd6ee8ec846
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-1">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080516bd083bfcce66121a3072646994c8430cc382b8dc543e8
  Outputs
    Ya: (length: 56 bytes)
      396bd11daf223711e575cac6021e3fa31558012048a1cec7876292b9
      6c61eda353fe04f33028d2352779668a934084da776c1c51a58ce4b5
    MSGa = lv_cat(Ya,ADa): (length: 61 bytes)
      38396bd11daf223711e575cac6021e3fa31558012048a1cec7876292
      b96c61eda353fe04f33028d2352779668a934084da776c1c51a58ce4
      b503414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-1">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a439caf5e61ec88c307c7d619195229412eaa73fb2a5ea20d
  Outputs
    Yb: (length: 56 bytes)
      53c519fb490fde5a04bda8c18b327d0fc1a9391d19e0ac00c59df9c6
      0422284e593d6b092eac94f5aa644ed883f39bd4f04e4beb6af86d58
    MSGb = lv_cat(Yb,ADb): (length: 61 bytes)
      3853c519fb490fde5a04bda8c18b327d0fc1a9391d19e0ac00c59df9
      c60422284e593d6b092eac94f5aa644ed883f39bd4f04e4beb6af86d
      5803414462
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-1">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      e00af217556a40ccbc9822cc27a43542e45166a653aa4df746d5f8e1
      e8df483e9baff71c9eb03ee20a688ad4e4d359f70ac9ec3f6a659997
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      e00af217556a40ccbc9822cc27a43542e45166a653aa4df746d5f8e1
      e8df483e9baff71c9eb03ee20a688ad4e4d359f70ac9ec3f6a659997
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-1">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 122 bytes)
      38396bd11daf223711e575cac6021e3fa31558012048a1cec7876292
      b96c61eda353fe04f33028d2352779668a934084da776c1c51a58ce4
      b5034144613853c519fb490fde5a04bda8c18b327d0fc1a9391d19e0
      ac00c59df9c60422284e593d6b092eac94f5aa644ed883f39bd4f04e
      4beb6af86d5803414462
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 209 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      412438e00af217556a40ccbc9822cc27a43542e45166a653aa4df746
      d5f8e1e8df483e9baff71c9eb03ee20a688ad4e4d359f70ac9ec3f6a
      65999738396bd11daf223711e575cac6021e3fa31558012048a1cec7
      876292b96c61eda353fe04f33028d2352779668a934084da776c1c51
      a58ce4b5034144613853c519fb490fde5a04bda8c18b327d0fc1a939
      1d19e0ac00c59df9c60422284e593d6b092eac94f5aa644ed883f39b
      d4f04e4beb6af86d5803414462
    ISK result: (length: 64 bytes)
      4030297722c1914711da6b2a224a44b53b30c05ab02c2a3d3ccc7272
      a3333ce3a4564c17031b634e89f65681f52d5c3d1df7baeb88523d2e
      481b3858aed86315
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-1">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 122 bytes)
      3853c519fb490fde5a04bda8c18b327d0fc1a9391d19e0ac00c59df9
      c60422284e593d6b092eac94f5aa644ed883f39bd4f04e4beb6af86d
      580341446238396bd11daf223711e575cac6021e3fa31558012048a1
      cec7876292b96c61eda353fe04f33028d2352779668a934084da776c
      1c51a58ce4b503414461
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||oCAT(MSGa,MSGb): (length: 209 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      412438e00af217556a40ccbc9822cc27a43542e45166a653aa4df746
      d5f8e1e8df483e9baff71c9eb03ee20a688ad4e4d359f70ac9ec3f6a
      6599973853c519fb490fde5a04bda8c18b327d0fc1a9391d19e0ac00
      c59df9c60422284e593d6b092eac94f5aa644ed883f39bd4f04e4beb
      6af86d580341446238396bd11daf223711e575cac6021e3fa3155801
      2048a1cec7876292b96c61eda353fe04f33028d2352779668a934084
      da776c1c51a58ce4b503414461
    ISK result: (length: 64 bytes)
      925e95d1095dad1af6378d5ef8b9a998bd3855bfc7d36cb5ca05b0a7
      a93346abcb8cef04bceb28c38fdaf0cc608fd1dcd462ab523f3b7f75
      2c77c411be3ac8fb
]]></artwork>
        </section>
        <section anchor="corresponding-ansi-c-initializers-1">
          <name>Corresponding ANSI-C initializers</name>
          <artwork><![CDATA[
const uint8_t tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const uint8_t tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const uint8_t tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const uint8_t tc_g[] = {
 0x6f,0xda,0xe1,0x47,0x18,0xeb,0x75,0x06,0xdd,0x96,0xe3,0xf7,
 0x79,0x78,0x96,0xef,0xdb,0x8d,0xb9,0xec,0x07,0x97,0x48,0x5c,
 0x9c,0x48,0xa1,0x92,0x2e,0x44,0x96,0x1d,0xa0,0x97,0xf2,0x90,
 0x8b,0x08,0x4a,0x5d,0xe3,0x3a,0xb6,0x71,0x63,0x06,0x60,0xd2,
 0x7d,0x79,0xff,0xd6,0xee,0x8e,0xc8,0x46,
};
const uint8_t tc_ya[] = {
 0x21,0xb4,0xf4,0xbd,0x9e,0x64,0xed,0x35,0x5c,0x3e,0xb6,0x76,
 0xa2,0x8e,0xbe,0xda,0xf6,0xd8,0xf1,0x7b,0xdc,0x36,0x59,0x95,
 0xb3,0x19,0x09,0x71,0x53,0x04,0x40,0x80,0x51,0x6b,0xd0,0x83,
 0xbf,0xcc,0xe6,0x61,0x21,0xa3,0x07,0x26,0x46,0x99,0x4c,0x84,
 0x30,0xcc,0x38,0x2b,0x8d,0xc5,0x43,0xe8,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x39,0x6b,0xd1,0x1d,0xaf,0x22,0x37,0x11,0xe5,0x75,0xca,0xc6,
 0x02,0x1e,0x3f,0xa3,0x15,0x58,0x01,0x20,0x48,0xa1,0xce,0xc7,
 0x87,0x62,0x92,0xb9,0x6c,0x61,0xed,0xa3,0x53,0xfe,0x04,0xf3,
 0x30,0x28,0xd2,0x35,0x27,0x79,0x66,0x8a,0x93,0x40,0x84,0xda,
 0x77,0x6c,0x1c,0x51,0xa5,0x8c,0xe4,0xb5,
};
const uint8_t tc_yb[] = {
 0x84,0x8b,0x07,0x79,0xff,0x41,0x5f,0x0a,0xf4,0xea,0x14,0xdf,
 0x9d,0xd1,0xd3,0xc2,0x9a,0xc4,0x1d,0x83,0x6c,0x78,0x08,0x89,
 0x6c,0x4e,0xba,0x19,0xc5,0x1a,0xc4,0x0a,0x43,0x9c,0xaf,0x5e,
 0x61,0xec,0x88,0xc3,0x07,0xc7,0xd6,0x19,0x19,0x52,0x29,0x41,
 0x2e,0xaa,0x73,0xfb,0x2a,0x5e,0xa2,0x0d,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0x53,0xc5,0x19,0xfb,0x49,0x0f,0xde,0x5a,0x04,0xbd,0xa8,0xc1,
 0x8b,0x32,0x7d,0x0f,0xc1,0xa9,0x39,0x1d,0x19,0xe0,0xac,0x00,
 0xc5,0x9d,0xf9,0xc6,0x04,0x22,0x28,0x4e,0x59,0x3d,0x6b,0x09,
 0x2e,0xac,0x94,0xf5,0xaa,0x64,0x4e,0xd8,0x83,0xf3,0x9b,0xd4,
 0xf0,0x4e,0x4b,0xeb,0x6a,0xf8,0x6d,0x58,
};
const uint8_t tc_K[] = {
 0xe0,0x0a,0xf2,0x17,0x55,0x6a,0x40,0xcc,0xbc,0x98,0x22,0xcc,
 0x27,0xa4,0x35,0x42,0xe4,0x51,0x66,0xa6,0x53,0xaa,0x4d,0xf7,
 0x46,0xd5,0xf8,0xe1,0xe8,0xdf,0x48,0x3e,0x9b,0xaf,0xf7,0x1c,
 0x9e,0xb0,0x3e,0xe2,0x0a,0x68,0x8a,0xd4,0xe4,0xd3,0x59,0xf7,
 0x0a,0xc9,0xec,0x3f,0x6a,0x65,0x99,0x97,
};
const uint8_t tc_ISK_IR[] = {
 0x40,0x30,0x29,0x77,0x22,0xc1,0x91,0x47,0x11,0xda,0x6b,0x2a,
 0x22,0x4a,0x44,0xb5,0x3b,0x30,0xc0,0x5a,0xb0,0x2c,0x2a,0x3d,
 0x3c,0xcc,0x72,0x72,0xa3,0x33,0x3c,0xe3,0xa4,0x56,0x4c,0x17,
 0x03,0x1b,0x63,0x4e,0x89,0xf6,0x56,0x81,0xf5,0x2d,0x5c,0x3d,
 0x1d,0xf7,0xba,0xeb,0x88,0x52,0x3d,0x2e,0x48,0x1b,0x38,0x58,
 0xae,0xd8,0x63,0x15,
};
const uint8_t tc_ISK_SY[] = {
 0x92,0x5e,0x95,0xd1,0x09,0x5d,0xad,0x1a,0xf6,0x37,0x8d,0x5e,
 0xf8,0xb9,0xa9,0x98,0xbd,0x38,0x55,0xbf,0xc7,0xd3,0x6c,0xb5,
 0xca,0x05,0xb0,0xa7,0xa9,0x33,0x46,0xab,0xcb,0x8c,0xef,0x04,
 0xbc,0xeb,0x28,0xc3,0x8f,0xda,0xf0,0xcc,0x60,0x8f,0xd1,0xdc,
 0xd4,0x62,0xab,0x52,0x3f,0x3b,0x7f,0x75,0x2c,0x77,0xc4,0x11,
 0xbe,0x3a,0xc8,0xfb,
};
]]></artwork>
        </section>
        <section anchor="test-vectors-for-gx448scalarmultvfy-low-order-points">
          <name>Test vectors for G_X448.scalar_mult_vfy: low order points</name>
          <t>Test vectors for which G_X448.scalar_mult_vfy(s_in,ux) must return the neutral
element.
This includes points that are non-canonicaly encoded, i.e. have coordinate values
larger
than the field prime.</t>
          <t>Weak points for X448 smaller than the field prime (canonical)</t>
          <artwork><![CDATA[
  u0: (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  u1: (length: 56 bytes)
    0100000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  u2: (length: 56 bytes)
    fefffffffffffffffffffffffffffffffffffffffffffffffffffffffe
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff
]]></artwork>
          <t>Weak points for X448 larger or equal to the field prime (non-canonical)</t>
          <artwork><![CDATA[
  u3: (length: 56 bytes)
    fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff
  u4: (length: 56 bytes)
    00000000000000000000000000000000000000000000000000000000ff
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff

All of the above points u0 ... u4 MUST trigger the abort case
when included in the protocol messages MSGa or MSGb.
]]></artwork>
          <t>Expected results for X448 resp. G_X448.scalar_mult_vfy</t>
          <artwork><![CDATA[
  scalar s: (length: 56 bytes)
    af8a14218bf2a2062926d2ea9b8fe4e8b6817349b6ed2feb1e5d64d7a4
    523f15fceec70fb111e870dc58d191e66a14d3e9d482d04432cadd
  G_X448.scalar_mult_vfy(s,u0): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u1): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u2): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u3): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u4): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
]]></artwork>
          <t>Test vectors for scalar_mult with nonzero outputs</t>
          <artwork><![CDATA[
  scalar s: (length: 56 bytes)
    af8a14218bf2a2062926d2ea9b8fe4e8b6817349b6ed2feb1e5d64d7a4
    523f15fceec70fb111e870dc58d191e66a14d3e9d482d04432cadd
  point coordinate u_curve on the curve: (length: 56 bytes)
    ab0c68d772ec2eb9de25c49700e46d6325e66d6aa39d7b65eb84a68c55
    69d47bd71b41f3e0d210f44e146dec8926b174acb3f940a0b82cab
  G_X448.scalar_mult_vfy(s,u_curve): (length: 56 bytes)
    3b0fa9bc40a6fdc78c9e06ff7a54c143c5d52f365607053bf0656f5142
    0496295f910a101b38edc1acd3bd240fd55dcb7a360553b8a7627e

  point coordinate u_twist on the twist: (length: 56 bytes)
    c981cd1e1f72d9c35c7d7cf6be426757c0dc8206a2fcfa564a8e7618c0
    3c0e61f9a2eb1c3e0dd97d6e9b1010f5edd03397a83f5a914cb3ff
  G_X448.scalar_mult_vfy(s,u_twist): (length: 56 bytes)
    d0a2bb7e9c5c2c627793d8342f23b759fe7d9e3320a85ca4fd61376331
    50ffd9a9148a9b75c349fac43d64bec49a6e126cc92cbfbf353961
]]></artwork>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-ristretto255-and-hash-sha-512">
        <name>Test vector for CPace using group ristretto255 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-ristretto255">
          <name>Test vectors for calculate_generator with group ristretto255</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 100 ;
    DSI = b'CPaceRistretto255'
    CI = b'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 168 bytes)
      11435061636552697374726574746f3235350850617373776f726464
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000160a41696e69746961746f72
      0a42726573706f6e646572107e4b4791d6a8ef019b936c79fb7f2c57
    hash result: (length: 64 bytes)
      a5ce446f63a1ae6d1fee80fa67d0b4004a4b1283ec5549a462bf33a6
      c1ae06a0871f9bf48545f49b2a792eed255ac04f52758c9c60448306
      810b44e986e3dcbb
    encoded generator g: (length: 32 bytes)
      9c5712178570957204d89ac11acbef789dd076992ba361429acb2bc3
      8c71d14c
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-2">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      1433dd19359992d4e06d740d3993d429af6338ffb4531ce175d22449
      853a790b
  Outputs
    Ya: (length: 32 bytes)
      a8fc42c4d57b3c7346661011122a00563d0995fd72b62123ae244400
      e86d7b1a
    MSGa = lv_cat(Ya,ADa): (length: 37 bytes)
      20a8fc42c4d57b3c7346661011122a00563d0995fd72b62123ae2444
      00e86d7b1a03414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-2">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      0e6566d32d80a5a1135f99c27f2d637aa24da23027c3fa76b9d1cfd9
      742fdc00
  Outputs
    Yb: (length: 32 bytes)
      fc8e84ae4ab725909af05a56ef9714db6930e4a5589b3fee6cdd2662
      36676d63
    MSGb = lv_cat(Yb,ADb): (length: 37 bytes)
      20fc8e84ae4ab725909af05a56ef9714db6930e4a5589b3fee6cdd26
      6236676d6303414462
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-2">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      3efef1706f42efa354020b087b37fbd9f81cf72a16f4947e4a042a7f
      1aaa2b6f
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      3efef1706f42efa354020b087b37fbd9f81cf72a16f4947e4a042a7f
      1aaa2b6f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-2">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 74 bytes)
      20a8fc42c4d57b3c7346661011122a00563d0995fd72b62123ae2444
      00e86d7b1a0341446120fc8e84ae4ab725909af05a56ef9714db6930
      e4a5589b3fee6cdd266236676d6303414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c57203efef1706f42efa354020b087b37fbd9
      f81cf72a16f4947e4a042a7f1aaa2b6f20a8fc42c4d57b3c73466610
      11122a00563d0995fd72b62123ae244400e86d7b1a0341446120fc8e
      84ae4ab725909af05a56ef9714db6930e4a5589b3fee6cdd26623667
      6d6303414462
    ISK result: (length: 64 bytes)
      0e33c5822bd495dea94ba7af161501f1b2d6a16d464b5d6e1a53dcbf
      b9244b9ba66c09c430fffdfe4fb4e99b4ea46f991a272de0431c132c
      2c79fd6de1a7e5e4
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-2">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 74 bytes)
      20fc8e84ae4ab725909af05a56ef9714db6930e4a5589b3fee6cdd26
      6236676d630341446220a8fc42c4d57b3c7346661011122a00563d09
      95fd72b62123ae244400e86d7b1a03414461
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||oCAT(MSGa,MSGb): (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c57203efef1706f42efa354020b087b37fbd9
      f81cf72a16f4947e4a042a7f1aaa2b6f20fc8e84ae4ab725909af05a
      56ef9714db6930e4a5589b3fee6cdd266236676d630341446220a8fc
      42c4d57b3c7346661011122a00563d0995fd72b62123ae244400e86d
      7b1a03414461
    ISK result: (length: 64 bytes)
      ca36335be682a480a9fc63977d044a10ff7adfcda0f2978fbcf8713d
      2a4e23e25c05a9a02edcfbff2ede65b752f8ea1f4454d764ad8ed860
      7c158ef662614567
]]></artwork>
        </section>
        <section anchor="corresponding-ansi-c-initializers-2">
          <name>Corresponding ANSI-C initializers</name>
          <artwork><![CDATA[
const uint8_t tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const uint8_t tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const uint8_t tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const uint8_t tc_g[] = {
 0x9c,0x57,0x12,0x17,0x85,0x70,0x95,0x72,0x04,0xd8,0x9a,0xc1,
 0x1a,0xcb,0xef,0x78,0x9d,0xd0,0x76,0x99,0x2b,0xa3,0x61,0x42,
 0x9a,0xcb,0x2b,0xc3,0x8c,0x71,0xd1,0x4c,
};
const uint8_t tc_ya[] = {
 0x14,0x33,0xdd,0x19,0x35,0x99,0x92,0xd4,0xe0,0x6d,0x74,0x0d,
 0x39,0x93,0xd4,0x29,0xaf,0x63,0x38,0xff,0xb4,0x53,0x1c,0xe1,
 0x75,0xd2,0x24,0x49,0x85,0x3a,0x79,0x0b,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0xa8,0xfc,0x42,0xc4,0xd5,0x7b,0x3c,0x73,0x46,0x66,0x10,0x11,
 0x12,0x2a,0x00,0x56,0x3d,0x09,0x95,0xfd,0x72,0xb6,0x21,0x23,
 0xae,0x24,0x44,0x00,0xe8,0x6d,0x7b,0x1a,
};
const uint8_t tc_yb[] = {
 0x0e,0x65,0x66,0xd3,0x2d,0x80,0xa5,0xa1,0x13,0x5f,0x99,0xc2,
 0x7f,0x2d,0x63,0x7a,0xa2,0x4d,0xa2,0x30,0x27,0xc3,0xfa,0x76,
 0xb9,0xd1,0xcf,0xd9,0x74,0x2f,0xdc,0x00,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0xfc,0x8e,0x84,0xae,0x4a,0xb7,0x25,0x90,0x9a,0xf0,0x5a,0x56,
 0xef,0x97,0x14,0xdb,0x69,0x30,0xe4,0xa5,0x58,0x9b,0x3f,0xee,
 0x6c,0xdd,0x26,0x62,0x36,0x67,0x6d,0x63,
};
const uint8_t tc_K[] = {
 0x3e,0xfe,0xf1,0x70,0x6f,0x42,0xef,0xa3,0x54,0x02,0x0b,0x08,
 0x7b,0x37,0xfb,0xd9,0xf8,0x1c,0xf7,0x2a,0x16,0xf4,0x94,0x7e,
 0x4a,0x04,0x2a,0x7f,0x1a,0xaa,0x2b,0x6f,
};
const uint8_t tc_ISK_IR[] = {
 0x0e,0x33,0xc5,0x82,0x2b,0xd4,0x95,0xde,0xa9,0x4b,0xa7,0xaf,
 0x16,0x15,0x01,0xf1,0xb2,0xd6,0xa1,0x6d,0x46,0x4b,0x5d,0x6e,
 0x1a,0x53,0xdc,0xbf,0xb9,0x24,0x4b,0x9b,0xa6,0x6c,0x09,0xc4,
 0x30,0xff,0xfd,0xfe,0x4f,0xb4,0xe9,0x9b,0x4e,0xa4,0x6f,0x99,
 0x1a,0x27,0x2d,0xe0,0x43,0x1c,0x13,0x2c,0x2c,0x79,0xfd,0x6d,
 0xe1,0xa7,0xe5,0xe4,
};
const uint8_t tc_ISK_SY[] = {
 0xca,0x36,0x33,0x5b,0xe6,0x82,0xa4,0x80,0xa9,0xfc,0x63,0x97,
 0x7d,0x04,0x4a,0x10,0xff,0x7a,0xdf,0xcd,0xa0,0xf2,0x97,0x8f,
 0xbc,0xf8,0x71,0x3d,0x2a,0x4e,0x23,0xe2,0x5c,0x05,0xa9,0xa0,
 0x2e,0xdc,0xfb,0xff,0x2e,0xde,0x65,0xb7,0x52,0xf8,0xea,0x1f,
 0x44,0x54,0xd7,0x64,0xad,0x8e,0xd8,0x60,0x7c,0x15,0x8e,0xf6,
 0x62,0x61,0x45,0x67,
};
]]></artwork>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    X: (length: 32 bytes)
      021ca069484e890c9e494d8ed6bb0f66cbd9a8f0ef67168f36c51e0e
      feb8f347
    G.scalar_mult(s,decode(X)): (length: 32 bytes)
      62aaa018755dc881902097c2a993c0b7c0a4fe33bce2c0182b46a44c
      40b95119
    G.scalar_mult_vfy(s,X): (length: 32 bytes)
      62aaa018755dc881902097c2a993c0b7c0a4fe33bce2c0182b46a44c
      40b95119
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in MSGa or MSGb the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    Y_i1: (length: 32 bytes)
      011ca069484e890c9e494d8ed6bb0f66cbd9a8f0ef67168f36c51e0e
      feb8f347
    Y_i2 == G.I: (length: 32 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-decaf448-and-hash-shake-256">
        <name>Test vector for CPace using group decaf448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-decaf448">
          <name>Test vectors for calculate_generator with group decaf448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 112 ;
    DSI = b'CPaceDecaf448'
    CI = b'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 176 bytes)
      0d435061636544656361663434380850617373776f72647000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000160a4169
      6e69746961746f720a42726573706f6e646572105223e0cdc45d6575
      668d64c552004124
    hash result: (length: 112 bytes)
      8955b426ff1d3a22032d21c013cf94134cee9a4235e93261a4911edb
      f68f2945f0267c983954262c7f59badb9caf468ebe21b7e9885657af
      b8f1a3b783c2047ba519e113ecf81b2b580dd481f499beabd401cc77
      1d28915fb750011209040f5f03b2ceb5e5eb259c96b478382d5a5c57
    encoded generator g: (length: 56 bytes)
      c811b3f6b0d27b58a74d8274bf5f9ca6b7ada15b0bf57b79a6b45c13
      2eb0c28bdcc3abf4e5932cea97a80997ead1c146b98b1a1f1def30f3
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-3">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      d8d2e26c821a12d7f59a8dee023d3f6155976152e16c73cbf68c303d
      f0404399f0a7b614a65df50a9788f00b410586b443f738ad7ff03930
  Outputs
    Ya: (length: 56 bytes)
      223f95a5430a2f2a499431696d23ea2d0a90f432e5491e45e4005f3d
      d785e7be1235b79252670099bc993c2df5c261dfb7a8989f091e2be3
    MSGa = lv_cat(Ya,ADa): (length: 61 bytes)
      38223f95a5430a2f2a499431696d23ea2d0a90f432e5491e45e4005f
      3dd785e7be1235b79252670099bc993c2df5c261dfb7a8989f091e2b
      e303414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-3">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      91bae9793f4a8aceb1b5c54375a7ed1858a79a6e72dab959c8bdf3a7
      5ac9bb4de2a25af4d4a9a5c5bc5441d19b8e3f6fcce7196c6afc2236
  Outputs
    Yb: (length: 56 bytes)
      b6ba0a336c103c6c92019ae4cfbcb88d8f6bfc361e979c9e0d3a0967
      e630094ba3d1555821ac1f979996ef5ce79f012ffe279ac89b287bee
    MSGb = lv_cat(Yb,ADb): (length: 61 bytes)
      38b6ba0a336c103c6c92019ae4cfbcb88d8f6bfc361e979c9e0d3a09
      67e630094ba3d1555821ac1f979996ef5ce79f012ffe279ac89b287b
      ee03414462
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-3">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      dc504938fb70eb13916697aa3e076e82537c171aa326121399c896fe
      ea0e198b41b6bae300bb86f8c61d4b170eee4717b5497016f34364a9
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      dc504938fb70eb13916697aa3e076e82537c171aa326121399c896fe
      ea0e198b41b6bae300bb86f8c61d4b170eee4717b5497016f34364a9
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-3">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 122 bytes)
      38223f95a5430a2f2a499431696d23ea2d0a90f432e5491e45e4005f
      3dd785e7be1235b79252670099bc993c2df5c261dfb7a8989f091e2b
      e30341446138b6ba0a336c103c6c92019ae4cfbcb88d8f6bfc361e97
      9c9e0d3a0967e630094ba3d1555821ac1f979996ef5ce79f012ffe27
      9ac89b287bee03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438dc504938fb70eb13916697aa3e076e82537c171a
      a326121399c896feea0e198b41b6bae300bb86f8c61d4b170eee4717
      b5497016f34364a938223f95a5430a2f2a499431696d23ea2d0a90f4
      32e5491e45e4005f3dd785e7be1235b79252670099bc993c2df5c261
      dfb7a8989f091e2be30341446138b6ba0a336c103c6c92019ae4cfbc
      b88d8f6bfc361e979c9e0d3a0967e630094ba3d1555821ac1f979996
      ef5ce79f012ffe279ac89b287bee03414462
    ISK result: (length: 64 bytes)
      ebe28369491f8899a5af3b339d4993881b69d22607c58719da6eaab3
      8f0d9025eae413ca2b072b156ce4a0d4778ff471a63c4d908cab70bc
      2081951d504cbb03
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-3">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 122 bytes)
      38b6ba0a336c103c6c92019ae4cfbcb88d8f6bfc361e979c9e0d3a09
      67e630094ba3d1555821ac1f979996ef5ce79f012ffe279ac89b287b
      ee0341446238223f95a5430a2f2a499431696d23ea2d0a90f432e549
      1e45e4005f3dd785e7be1235b79252670099bc993c2df5c261dfb7a8
      989f091e2be303414461
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||oCAT(MSGa,MSGb): (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438dc504938fb70eb13916697aa3e076e82537c171a
      a326121399c896feea0e198b41b6bae300bb86f8c61d4b170eee4717
      b5497016f34364a938b6ba0a336c103c6c92019ae4cfbcb88d8f6bfc
      361e979c9e0d3a0967e630094ba3d1555821ac1f979996ef5ce79f01
      2ffe279ac89b287bee0341446238223f95a5430a2f2a499431696d23
      ea2d0a90f432e5491e45e4005f3dd785e7be1235b79252670099bc99
      3c2df5c261dfb7a8989f091e2be303414461
    ISK result: (length: 64 bytes)
      2996d1953320581b587f473cfd5c974c5a8597b22b37fefe49bdb7b8
      4073424f7f7a6e456498665a69530741398c6010bdb346f79944acc9
      0c5c537fa35cd29a
]]></artwork>
        </section>
        <section anchor="corresponding-ansi-c-initializers-3">
          <name>Corresponding ANSI-C initializers</name>
          <artwork><![CDATA[
const uint8_t tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const uint8_t tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const uint8_t tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const uint8_t tc_g[] = {
 0xc8,0x11,0xb3,0xf6,0xb0,0xd2,0x7b,0x58,0xa7,0x4d,0x82,0x74,
 0xbf,0x5f,0x9c,0xa6,0xb7,0xad,0xa1,0x5b,0x0b,0xf5,0x7b,0x79,
 0xa6,0xb4,0x5c,0x13,0x2e,0xb0,0xc2,0x8b,0xdc,0xc3,0xab,0xf4,
 0xe5,0x93,0x2c,0xea,0x97,0xa8,0x09,0x97,0xea,0xd1,0xc1,0x46,
 0xb9,0x8b,0x1a,0x1f,0x1d,0xef,0x30,0xf3,
};
const uint8_t tc_ya[] = {
 0xd8,0xd2,0xe2,0x6c,0x82,0x1a,0x12,0xd7,0xf5,0x9a,0x8d,0xee,
 0x02,0x3d,0x3f,0x61,0x55,0x97,0x61,0x52,0xe1,0x6c,0x73,0xcb,
 0xf6,0x8c,0x30,0x3d,0xf0,0x40,0x43,0x99,0xf0,0xa7,0xb6,0x14,
 0xa6,0x5d,0xf5,0x0a,0x97,0x88,0xf0,0x0b,0x41,0x05,0x86,0xb4,
 0x43,0xf7,0x38,0xad,0x7f,0xf0,0x39,0x30,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x22,0x3f,0x95,0xa5,0x43,0x0a,0x2f,0x2a,0x49,0x94,0x31,0x69,
 0x6d,0x23,0xea,0x2d,0x0a,0x90,0xf4,0x32,0xe5,0x49,0x1e,0x45,
 0xe4,0x00,0x5f,0x3d,0xd7,0x85,0xe7,0xbe,0x12,0x35,0xb7,0x92,
 0x52,0x67,0x00,0x99,0xbc,0x99,0x3c,0x2d,0xf5,0xc2,0x61,0xdf,
 0xb7,0xa8,0x98,0x9f,0x09,0x1e,0x2b,0xe3,
};
const uint8_t tc_yb[] = {
 0x91,0xba,0xe9,0x79,0x3f,0x4a,0x8a,0xce,0xb1,0xb5,0xc5,0x43,
 0x75,0xa7,0xed,0x18,0x58,0xa7,0x9a,0x6e,0x72,0xda,0xb9,0x59,
 0xc8,0xbd,0xf3,0xa7,0x5a,0xc9,0xbb,0x4d,0xe2,0xa2,0x5a,0xf4,
 0xd4,0xa9,0xa5,0xc5,0xbc,0x54,0x41,0xd1,0x9b,0x8e,0x3f,0x6f,
 0xcc,0xe7,0x19,0x6c,0x6a,0xfc,0x22,0x36,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0xb6,0xba,0x0a,0x33,0x6c,0x10,0x3c,0x6c,0x92,0x01,0x9a,0xe4,
 0xcf,0xbc,0xb8,0x8d,0x8f,0x6b,0xfc,0x36,0x1e,0x97,0x9c,0x9e,
 0x0d,0x3a,0x09,0x67,0xe6,0x30,0x09,0x4b,0xa3,0xd1,0x55,0x58,
 0x21,0xac,0x1f,0x97,0x99,0x96,0xef,0x5c,0xe7,0x9f,0x01,0x2f,
 0xfe,0x27,0x9a,0xc8,0x9b,0x28,0x7b,0xee,
};
const uint8_t tc_K[] = {
 0xdc,0x50,0x49,0x38,0xfb,0x70,0xeb,0x13,0x91,0x66,0x97,0xaa,
 0x3e,0x07,0x6e,0x82,0x53,0x7c,0x17,0x1a,0xa3,0x26,0x12,0x13,
 0x99,0xc8,0x96,0xfe,0xea,0x0e,0x19,0x8b,0x41,0xb6,0xba,0xe3,
 0x00,0xbb,0x86,0xf8,0xc6,0x1d,0x4b,0x17,0x0e,0xee,0x47,0x17,
 0xb5,0x49,0x70,0x16,0xf3,0x43,0x64,0xa9,
};
const uint8_t tc_ISK_IR[] = {
 0xeb,0xe2,0x83,0x69,0x49,0x1f,0x88,0x99,0xa5,0xaf,0x3b,0x33,
 0x9d,0x49,0x93,0x88,0x1b,0x69,0xd2,0x26,0x07,0xc5,0x87,0x19,
 0xda,0x6e,0xaa,0xb3,0x8f,0x0d,0x90,0x25,0xea,0xe4,0x13,0xca,
 0x2b,0x07,0x2b,0x15,0x6c,0xe4,0xa0,0xd4,0x77,0x8f,0xf4,0x71,
 0xa6,0x3c,0x4d,0x90,0x8c,0xab,0x70,0xbc,0x20,0x81,0x95,0x1d,
 0x50,0x4c,0xbb,0x03,
};
const uint8_t tc_ISK_SY[] = {
 0x29,0x96,0xd1,0x95,0x33,0x20,0x58,0x1b,0x58,0x7f,0x47,0x3c,
 0xfd,0x5c,0x97,0x4c,0x5a,0x85,0x97,0xb2,0x2b,0x37,0xfe,0xfe,
 0x49,0xbd,0xb7,0xb8,0x40,0x73,0x42,0x4f,0x7f,0x7a,0x6e,0x45,
 0x64,0x98,0x66,0x5a,0x69,0x53,0x07,0x41,0x39,0x8c,0x60,0x10,
 0xbd,0xb3,0x46,0xf7,0x99,0x44,0xac,0xc9,0x0c,0x5c,0x53,0x7f,
 0xa3,0x5c,0xd2,0x9a,
};
]]></artwork>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs-1">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    X: (length: 56 bytes)
      c803a6c8171ac38b66c5306553f45a487a24eb8581414444715bd2e5
      cf4c749a3b56a550f3c9a6ea3efa6e11ae6a6da12b98ef2f51174b9a
    G.scalar_mult(s,decode(X)): (length: 56 bytes)
      b831a1f804fd3c902ae82f731d298aebf9152ea855f5b5da5ee88584
      84c55a7f65cc3ccf5f678496dc4cb1c8d6bc7ed17d2fe535fdc8f60e
    G.scalar_mult_vfy(s,X): (length: 56 bytes)
      b831a1f804fd3c902ae82f731d298aebf9152ea855f5b5da5ee88584
      84c55a7f65cc3ccf5f678496dc4cb1c8d6bc7ed17d2fe535fdc8f60e
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-1">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in MSGa or MSGb the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    Y_i1: (length: 56 bytes)
      c703a6c8171ac38b66c5306553f45a487a24eb8581414444715bd2e5
      cf4c749a3b56a550f3c9a6ea3efa6e11ae6a6da12b98ef2f51174b9a
    Y_i2 == G.I: (length: 56 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-256-and-hash-sha-256">
        <name>Test vector for CPace using group NIST P-256 and hash SHA-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-256">
          <name>Test vectors for calculate_generator with group NIST P-256</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-256 with input block size 64 bytes.
    PRS = b'Password' ; ZPAD length: 23 ;
    DSI = b'CPaceP256_XMD:SHA-256_SSWU_NU_'
    CI = b'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 34b36454cab2e7842c389f7d88ecb7df
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 104 bytes)
      1e4350616365503235365f584d443a5348412d3235365f535357555f
      4e555f0850617373776f726417000000000000000000000000000000
      0000000000000000160a41696e69746961746f720a42726573706f6e
      6465721034b36454cab2e7842c389f7d88ecb7df
    generator g: (length: 65 bytes)
      04993b46e30ba9cfc3dc2d3ae2cf9733cf03994e74383c4e1b4a92e8
      d6d466b321c4a642979162fbde9e1c9a6180bd27a0594491e4c231f5
      1006d0bf7992d07127
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-4">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 32 bytes)
      c9e47ca5debd2285727af47e55f5b7763fa79719da428f800190cc66
      59b4eafb
  Outputs
    Ya: (length: 65 bytes)
      0478ac925a6e3447a537627a2163be005a422f55c08385c1ef7d051c
      a94593df5946314120faa87165cba131c1da3aac429dc3d99a9bac7d
      4c4cbb8570b4d5ea10
    Alternative correct value for Ya: g^(-ya):
    (length: 65 bytes)
      0478ac925a6e3447a537627a2163be005a422f55c08385c1ef7d051c
      a94593df59b9cebede05578e9b345ece3e25c553bd623c2666645382
      b3b3447a8f4b2a15ef
    MSGa = lv_cat(Ya,ADa): (length: 70 bytes)
      410478ac925a6e3447a537627a2163be005a422f55c08385c1ef7d05
      1ca94593df5946314120faa87165cba131c1da3aac429dc3d99a9bac
      7d4c4cbb8570b4d5ea1003414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-4">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 32 bytes)
      a0b768ba7555621d133012d1dee27a0013c1bcfddd675811df12771e
      44d77b10
  Outputs
    Yb: (length: 65 bytes)
      04df13ffa89b0ce3cc553b1495ff027886564d94b8d9165cd50e5f65
      4247959951bfac90839fca218bf8e2d1258eb7d7d9f733fe4cd558e6
      fa57bf1f801aae7d3a
    Alternative correct value for Yb: g^(-yb):
    (length: 65 bytes)
      04df13ffa89b0ce3cc553b1495ff027886564d94b8d9165cd50e5f65
      424795995140536f7b6035de75071d2eda7148282608cc01b42aa719
      05a840e07fe55182c5
    MSGb = lv_cat(Yb,ADb): (length: 70 bytes)
      4104df13ffa89b0ce3cc553b1495ff027886564d94b8d9165cd50e5f
      654247959951bfac90839fca218bf8e2d1258eb7d7d9f733fe4cd558
      e6fa57bf1f801aae7d3a03414462
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-4">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      27f7059d88f02007dc18c911c9b4034d3c0f13f8f7ed9603b0927f23
      fbab1037
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      27f7059d88f02007dc18c911c9b4034d3c0f13f8f7ed9603b0927f23
      fbab1037
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-4">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 140 bytes)
      410478ac925a6e3447a537627a2163be005a422f55c08385c1ef7d05
      1ca94593df5946314120faa87165cba131c1da3aac429dc3d99a9bac
      7d4c4cbb8570b4d5ea10034144614104df13ffa89b0ce3cc553b1495
      ff027886564d94b8d9165cd50e5f654247959951bfac90839fca218b
      f8e2d1258eb7d7d9f733fe4cd558e6fa57bf1f801aae7d3a03414462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 225 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df2027f705
      9d88f02007dc18c911c9b4034d3c0f13f8f7ed9603b0927f23fbab10
      37410478ac925a6e3447a537627a2163be005a422f55c08385c1ef7d
      051ca94593df5946314120faa87165cba131c1da3aac429dc3d99a9b
      ac7d4c4cbb8570b4d5ea10034144614104df13ffa89b0ce3cc553b14
      95ff027886564d94b8d9165cd50e5f654247959951bfac90839fca21
      8bf8e2d1258eb7d7d9f733fe4cd558e6fa57bf1f801aae7d3a034144
      62
    ISK result: (length: 32 bytes)
      ddc1b133c387ecf344c0b496bc1223656cd6e7d99a5def8b3b026796
      50811fc9
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-4">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 140 bytes)
      4104df13ffa89b0ce3cc553b1495ff027886564d94b8d9165cd50e5f
      654247959951bfac90839fca218bf8e2d1258eb7d7d9f733fe4cd558
      e6fa57bf1f801aae7d3a03414462410478ac925a6e3447a537627a21
      63be005a422f55c08385c1ef7d051ca94593df5946314120faa87165
      cba131c1da3aac429dc3d99a9bac7d4c4cbb8570b4d5ea1003414461
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||oCAT(MSGa,MSGb): (length: 225 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df2027f705
      9d88f02007dc18c911c9b4034d3c0f13f8f7ed9603b0927f23fbab10
      374104df13ffa89b0ce3cc553b1495ff027886564d94b8d9165cd50e
      5f654247959951bfac90839fca218bf8e2d1258eb7d7d9f733fe4cd5
      58e6fa57bf1f801aae7d3a03414462410478ac925a6e3447a537627a
      2163be005a422f55c08385c1ef7d051ca94593df5946314120faa871
      65cba131c1da3aac429dc3d99a9bac7d4c4cbb8570b4d5ea10034144
      61
    ISK result: (length: 32 bytes)
      6ea775b0fb3c31502687565a52150fc595c63fe901a11d5fc1995cd5
      089a17ae
]]></artwork>
        </section>
        <section anchor="corresponding-ansi-c-initializers-4">
          <name>Corresponding ANSI-C initializers</name>
          <artwork><![CDATA[
const uint8_t tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const uint8_t tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const uint8_t tc_sid[] = {
 0x34,0xb3,0x64,0x54,0xca,0xb2,0xe7,0x84,0x2c,0x38,0x9f,0x7d,
 0x88,0xec,0xb7,0xdf,
};
const uint8_t tc_g[] = {
 0x04,0x99,0x3b,0x46,0xe3,0x0b,0xa9,0xcf,0xc3,0xdc,0x2d,0x3a,
 0xe2,0xcf,0x97,0x33,0xcf,0x03,0x99,0x4e,0x74,0x38,0x3c,0x4e,
 0x1b,0x4a,0x92,0xe8,0xd6,0xd4,0x66,0xb3,0x21,0xc4,0xa6,0x42,
 0x97,0x91,0x62,0xfb,0xde,0x9e,0x1c,0x9a,0x61,0x80,0xbd,0x27,
 0xa0,0x59,0x44,0x91,0xe4,0xc2,0x31,0xf5,0x10,0x06,0xd0,0xbf,
 0x79,0x92,0xd0,0x71,0x27,
};
const uint8_t tc_ya[] = {
 0xc9,0xe4,0x7c,0xa5,0xde,0xbd,0x22,0x85,0x72,0x7a,0xf4,0x7e,
 0x55,0xf5,0xb7,0x76,0x3f,0xa7,0x97,0x19,0xda,0x42,0x8f,0x80,
 0x01,0x90,0xcc,0x66,0x59,0xb4,0xea,0xfb,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x04,0x78,0xac,0x92,0x5a,0x6e,0x34,0x47,0xa5,0x37,0x62,0x7a,
 0x21,0x63,0xbe,0x00,0x5a,0x42,0x2f,0x55,0xc0,0x83,0x85,0xc1,
 0xef,0x7d,0x05,0x1c,0xa9,0x45,0x93,0xdf,0x59,0x46,0x31,0x41,
 0x20,0xfa,0xa8,0x71,0x65,0xcb,0xa1,0x31,0xc1,0xda,0x3a,0xac,
 0x42,0x9d,0xc3,0xd9,0x9a,0x9b,0xac,0x7d,0x4c,0x4c,0xbb,0x85,
 0x70,0xb4,0xd5,0xea,0x10,
};
const uint8_t tc_yb[] = {
 0xa0,0xb7,0x68,0xba,0x75,0x55,0x62,0x1d,0x13,0x30,0x12,0xd1,
 0xde,0xe2,0x7a,0x00,0x13,0xc1,0xbc,0xfd,0xdd,0x67,0x58,0x11,
 0xdf,0x12,0x77,0x1e,0x44,0xd7,0x7b,0x10,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0x04,0xdf,0x13,0xff,0xa8,0x9b,0x0c,0xe3,0xcc,0x55,0x3b,0x14,
 0x95,0xff,0x02,0x78,0x86,0x56,0x4d,0x94,0xb8,0xd9,0x16,0x5c,
 0xd5,0x0e,0x5f,0x65,0x42,0x47,0x95,0x99,0x51,0xbf,0xac,0x90,
 0x83,0x9f,0xca,0x21,0x8b,0xf8,0xe2,0xd1,0x25,0x8e,0xb7,0xd7,
 0xd9,0xf7,0x33,0xfe,0x4c,0xd5,0x58,0xe6,0xfa,0x57,0xbf,0x1f,
 0x80,0x1a,0xae,0x7d,0x3a,
};
const uint8_t tc_K[] = {
 0x27,0xf7,0x05,0x9d,0x88,0xf0,0x20,0x07,0xdc,0x18,0xc9,0x11,
 0xc9,0xb4,0x03,0x4d,0x3c,0x0f,0x13,0xf8,0xf7,0xed,0x96,0x03,
 0xb0,0x92,0x7f,0x23,0xfb,0xab,0x10,0x37,
};
const uint8_t tc_ISK_IR[] = {
 0xdd,0xc1,0xb1,0x33,0xc3,0x87,0xec,0xf3,0x44,0xc0,0xb4,0x96,
 0xbc,0x12,0x23,0x65,0x6c,0xd6,0xe7,0xd9,0x9a,0x5d,0xef,0x8b,
 0x3b,0x02,0x67,0x96,0x50,0x81,0x1f,0xc9,
};
const uint8_t tc_ISK_SY[] = {
 0x6e,0xa7,0x75,0xb0,0xfb,0x3c,0x31,0x50,0x26,0x87,0x56,0x5a,
 0x52,0x15,0x0f,0xc5,0x95,0xc6,0x3f,0xe9,0x01,0xa1,0x1d,0x5f,
 0xc1,0x99,0x5c,0xd5,0x08,0x9a,0x17,0xae,
};
]]></artwork>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    X: (length: 65 bytes)
      0476ab88669dc640ca098b3d19ed87084d22d7e7c86b3b87451554d6
      93a7d98fb6bf0a6938fe0cec7be7563499ba3792909c8b9f4c936ef5
      2828b78a8d6254f49c
    G.scalar_mult(s,X) (full coordinates): (length: 65 bytes)
      0492b0eb1fe6a988797a85e6de8ec5de7ec685c83164570d79f0d568
      b918bfe7718b049dac20ea4631d8c4f321ddb48d70416f4929eb9a85
      2528114d3a560537c7
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 32 bytes)
      92b0eb1fe6a988797a85e6de8ec5de7ec685c83164570d79f0d568b9
      18bfe771
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-2">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in MSGa or MSGb the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    Y_i1: (length: 65 bytes)
      0476ab88669dc640ca098b3d19ed87084d22d7e7c86b3b87451554d6
      93a7d98fb6bf0a6938fe0cec7be7563499ba3792909c8b9f4c936ef5
      2828b78a8d6254f4f3
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-384-and-hash-sha-384">
        <name>Test vector for CPace using group NIST P-384 and hash SHA-384</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-384">
          <name>Test vectors for calculate_generator with group NIST P-384</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-384 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP384_XMD:SHA-384_SSWU_NU_'
    CI = b'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 5b3773aa90e8f23c61563a4b645b276c
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 168 bytes)
      1e4350616365503338345f584d443a5348412d3338345f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000160a41696e69746961746f72
      0a42726573706f6e646572105b3773aa90e8f23c61563a4b645b276c
    generator g: (length: 97 bytes)
      04bb6f046a601d0a0b134c6221e20e83c3f9ac0390be56c5a95b68eb
      f41c82ade6f4977ea21341239d194c38dabd1a7eb5887d9fed2550a1
      d5e6789327f2a039cd9c41239b240f775f5f2bef8744561b3a7e98f3
      2234cb1b318f66616de777aeef
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-5">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 48 bytes)
      ef433dd5ad142c860e7cb6400dd315d388d5ec5420c550e9d6f0907f
      375d988bc4d704837e43561c497e7dd93edcdb9d
  Outputs
    Ya: (length: 97 bytes)
      047214fc512921b3fa0b555b41d841c9c20227fa1ab0dda5bfc051f6
      de9be7983e6df11d4e8da738b739adfbd85d8f5e80b2b4bbc66f3dff
      c02136ee19773d05f9c0242c0dd51857763de98a2fdfec73a4b1010c
      bc419c7b23b50adedbb3ff6644
    Alternative correct value for Ya: g^(-ya):
    (length: 97 bytes)
      047214fc512921b3fa0b555b41d841c9c20227fa1ab0dda5bfc051f6
      de9be7983e6df11d4e8da738b739adfbd85d8f5e804d4b443990c200
      3fdec911e688c2fa063fdbd3f22ae7a889c21675d020138c5a4efef3
      42be6384dc4af521254c0099bb
    MSGa = lv_cat(Ya,ADa): (length: 102 bytes)
      61047214fc512921b3fa0b555b41d841c9c20227fa1ab0dda5bfc051
      f6de9be7983e6df11d4e8da738b739adfbd85d8f5e80b2b4bbc66f3d
      ffc02136ee19773d05f9c0242c0dd51857763de98a2fdfec73a4b101
      0cbc419c7b23b50adedbb3ff664403414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-5">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 48 bytes)
      50b0e36b95a2edfaa8342b843dddc90b175330f2399c1b36586dedda
      3c255975f30be6a750f9404fccc62a6323b5e471
  Outputs
    Yb: (length: 97 bytes)
      04e34cbd45b13ad11552ea7100b19899fa52662e268f2086e21262f7
      46efcb18e4b51ecfaf2e8ebab82addb6245f9bb1ff8138317c8045c4
      d2550e1566832b94acb91b670c4c4c00e59f5c15c74d4260e490caca
      aa860c11b8f369b72d5871bd94
    Alternative correct value for Yb: g^(-yb):
    (length: 97 bytes)
      04e34cbd45b13ad11552ea7100b19899fa52662e268f2086e21262f7
      46efcb18e4b51ecfaf2e8ebab82addb6245f9bb1ff7ec7ce837fba3b
      2daaf1ea997cd46b5346e498f3b3b3ff1a60a3ea38b2bd9f1a6f3535
      5479f3ee470c9648d3a78e426b
    MSGb = lv_cat(Yb,ADb): (length: 102 bytes)
      6104e34cbd45b13ad11552ea7100b19899fa52662e268f2086e21262
      f746efcb18e4b51ecfaf2e8ebab82addb6245f9bb1ff8138317c8045
      c4d2550e1566832b94acb91b670c4c4c00e59f5c15c74d4260e490ca
      caaa860c11b8f369b72d5871bd9403414462
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-5">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 48 bytes)
      e5ef578c410effb4ec114998a59fa5832f6101be479f1a97b021f224
      e378c3fb1f77f87a92e39fb415edf5458b3815bf
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      e5ef578c410effb4ec114998a59fa5832f6101be479f1a97b021f224
      e378c3fb1f77f87a92e39fb415edf5458b3815bf
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-5">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 204 bytes)
      61047214fc512921b3fa0b555b41d841c9c20227fa1ab0dda5bfc051
      f6de9be7983e6df11d4e8da738b739adfbd85d8f5e80b2b4bbc66f3d
      ffc02136ee19773d05f9c0242c0dd51857763de98a2fdfec73a4b101
      0cbc419c7b23b50adedbb3ff6644034144616104e34cbd45b13ad115
      52ea7100b19899fa52662e268f2086e21262f746efcb18e4b51ecfaf
      2e8ebab82addb6245f9bb1ff8138317c8045c4d2550e1566832b94ac
      b91b670c4c4c00e59f5c15c74d4260e490cacaaa860c11b8f369b72d
      5871bd9403414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 305 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30e5ef57
      8c410effb4ec114998a59fa5832f6101be479f1a97b021f224e378c3
      fb1f77f87a92e39fb415edf5458b3815bf61047214fc512921b3fa0b
      555b41d841c9c20227fa1ab0dda5bfc051f6de9be7983e6df11d4e8d
      a738b739adfbd85d8f5e80b2b4bbc66f3dffc02136ee19773d05f9c0
      242c0dd51857763de98a2fdfec73a4b1010cbc419c7b23b50adedbb3
      ff6644034144616104e34cbd45b13ad11552ea7100b19899fa52662e
      268f2086e21262f746efcb18e4b51ecfaf2e8ebab82addb6245f9bb1
      ff8138317c8045c4d2550e1566832b94acb91b670c4c4c00e59f5c15
      c74d4260e490cacaaa860c11b8f369b72d5871bd9403414462
    ISK result: (length: 48 bytes)
      401601de4a9f25bd57fc85985c9abf1de75191d68306b584547e6ac9
      e959cf2df49a9bf2205c3617ce99a169971bdbf8
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-5">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 204 bytes)
      6104e34cbd45b13ad11552ea7100b19899fa52662e268f2086e21262
      f746efcb18e4b51ecfaf2e8ebab82addb6245f9bb1ff8138317c8045
      c4d2550e1566832b94acb91b670c4c4c00e59f5c15c74d4260e490ca
      caaa860c11b8f369b72d5871bd940341446261047214fc512921b3fa
      0b555b41d841c9c20227fa1ab0dda5bfc051f6de9be7983e6df11d4e
      8da738b739adfbd85d8f5e80b2b4bbc66f3dffc02136ee19773d05f9
      c0242c0dd51857763de98a2fdfec73a4b1010cbc419c7b23b50adedb
      b3ff664403414461
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||oCAT(MSGa,MSGb): (length: 305 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30e5ef57
      8c410effb4ec114998a59fa5832f6101be479f1a97b021f224e378c3
      fb1f77f87a92e39fb415edf5458b3815bf6104e34cbd45b13ad11552
      ea7100b19899fa52662e268f2086e21262f746efcb18e4b51ecfaf2e
      8ebab82addb6245f9bb1ff8138317c8045c4d2550e1566832b94acb9
      1b670c4c4c00e59f5c15c74d4260e490cacaaa860c11b8f369b72d58
      71bd940341446261047214fc512921b3fa0b555b41d841c9c20227fa
      1ab0dda5bfc051f6de9be7983e6df11d4e8da738b739adfbd85d8f5e
      80b2b4bbc66f3dffc02136ee19773d05f9c0242c0dd51857763de98a
      2fdfec73a4b1010cbc419c7b23b50adedbb3ff664403414461
    ISK result: (length: 48 bytes)
      1eb17f7f7126a07acd510e9d60c84f63dc0113ac34f8d359e8f692a9
      06f828bde926d9ff65202c9801e9884aa05a43b6
]]></artwork>
        </section>
        <section anchor="corresponding-ansi-c-initializers-5">
          <name>Corresponding ANSI-C initializers</name>
          <artwork><![CDATA[
const uint8_t tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const uint8_t tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const uint8_t tc_sid[] = {
 0x5b,0x37,0x73,0xaa,0x90,0xe8,0xf2,0x3c,0x61,0x56,0x3a,0x4b,
 0x64,0x5b,0x27,0x6c,
};
const uint8_t tc_g[] = {
 0x04,0xbb,0x6f,0x04,0x6a,0x60,0x1d,0x0a,0x0b,0x13,0x4c,0x62,
 0x21,0xe2,0x0e,0x83,0xc3,0xf9,0xac,0x03,0x90,0xbe,0x56,0xc5,
 0xa9,0x5b,0x68,0xeb,0xf4,0x1c,0x82,0xad,0xe6,0xf4,0x97,0x7e,
 0xa2,0x13,0x41,0x23,0x9d,0x19,0x4c,0x38,0xda,0xbd,0x1a,0x7e,
 0xb5,0x88,0x7d,0x9f,0xed,0x25,0x50,0xa1,0xd5,0xe6,0x78,0x93,
 0x27,0xf2,0xa0,0x39,0xcd,0x9c,0x41,0x23,0x9b,0x24,0x0f,0x77,
 0x5f,0x5f,0x2b,0xef,0x87,0x44,0x56,0x1b,0x3a,0x7e,0x98,0xf3,
 0x22,0x34,0xcb,0x1b,0x31,0x8f,0x66,0x61,0x6d,0xe7,0x77,0xae,
 0xef,
};
const uint8_t tc_ya[] = {
 0xef,0x43,0x3d,0xd5,0xad,0x14,0x2c,0x86,0x0e,0x7c,0xb6,0x40,
 0x0d,0xd3,0x15,0xd3,0x88,0xd5,0xec,0x54,0x20,0xc5,0x50,0xe9,
 0xd6,0xf0,0x90,0x7f,0x37,0x5d,0x98,0x8b,0xc4,0xd7,0x04,0x83,
 0x7e,0x43,0x56,0x1c,0x49,0x7e,0x7d,0xd9,0x3e,0xdc,0xdb,0x9d,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x04,0x72,0x14,0xfc,0x51,0x29,0x21,0xb3,0xfa,0x0b,0x55,0x5b,
 0x41,0xd8,0x41,0xc9,0xc2,0x02,0x27,0xfa,0x1a,0xb0,0xdd,0xa5,
 0xbf,0xc0,0x51,0xf6,0xde,0x9b,0xe7,0x98,0x3e,0x6d,0xf1,0x1d,
 0x4e,0x8d,0xa7,0x38,0xb7,0x39,0xad,0xfb,0xd8,0x5d,0x8f,0x5e,
 0x80,0xb2,0xb4,0xbb,0xc6,0x6f,0x3d,0xff,0xc0,0x21,0x36,0xee,
 0x19,0x77,0x3d,0x05,0xf9,0xc0,0x24,0x2c,0x0d,0xd5,0x18,0x57,
 0x76,0x3d,0xe9,0x8a,0x2f,0xdf,0xec,0x73,0xa4,0xb1,0x01,0x0c,
 0xbc,0x41,0x9c,0x7b,0x23,0xb5,0x0a,0xde,0xdb,0xb3,0xff,0x66,
 0x44,
};
const uint8_t tc_yb[] = {
 0x50,0xb0,0xe3,0x6b,0x95,0xa2,0xed,0xfa,0xa8,0x34,0x2b,0x84,
 0x3d,0xdd,0xc9,0x0b,0x17,0x53,0x30,0xf2,0x39,0x9c,0x1b,0x36,
 0x58,0x6d,0xed,0xda,0x3c,0x25,0x59,0x75,0xf3,0x0b,0xe6,0xa7,
 0x50,0xf9,0x40,0x4f,0xcc,0xc6,0x2a,0x63,0x23,0xb5,0xe4,0x71,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0x04,0xe3,0x4c,0xbd,0x45,0xb1,0x3a,0xd1,0x15,0x52,0xea,0x71,
 0x00,0xb1,0x98,0x99,0xfa,0x52,0x66,0x2e,0x26,0x8f,0x20,0x86,
 0xe2,0x12,0x62,0xf7,0x46,0xef,0xcb,0x18,0xe4,0xb5,0x1e,0xcf,
 0xaf,0x2e,0x8e,0xba,0xb8,0x2a,0xdd,0xb6,0x24,0x5f,0x9b,0xb1,
 0xff,0x81,0x38,0x31,0x7c,0x80,0x45,0xc4,0xd2,0x55,0x0e,0x15,
 0x66,0x83,0x2b,0x94,0xac,0xb9,0x1b,0x67,0x0c,0x4c,0x4c,0x00,
 0xe5,0x9f,0x5c,0x15,0xc7,0x4d,0x42,0x60,0xe4,0x90,0xca,0xca,
 0xaa,0x86,0x0c,0x11,0xb8,0xf3,0x69,0xb7,0x2d,0x58,0x71,0xbd,
 0x94,
};
const uint8_t tc_K[] = {
 0xe5,0xef,0x57,0x8c,0x41,0x0e,0xff,0xb4,0xec,0x11,0x49,0x98,
 0xa5,0x9f,0xa5,0x83,0x2f,0x61,0x01,0xbe,0x47,0x9f,0x1a,0x97,
 0xb0,0x21,0xf2,0x24,0xe3,0x78,0xc3,0xfb,0x1f,0x77,0xf8,0x7a,
 0x92,0xe3,0x9f,0xb4,0x15,0xed,0xf5,0x45,0x8b,0x38,0x15,0xbf,
};
const uint8_t tc_ISK_IR[] = {
 0x40,0x16,0x01,0xde,0x4a,0x9f,0x25,0xbd,0x57,0xfc,0x85,0x98,
 0x5c,0x9a,0xbf,0x1d,0xe7,0x51,0x91,0xd6,0x83,0x06,0xb5,0x84,
 0x54,0x7e,0x6a,0xc9,0xe9,0x59,0xcf,0x2d,0xf4,0x9a,0x9b,0xf2,
 0x20,0x5c,0x36,0x17,0xce,0x99,0xa1,0x69,0x97,0x1b,0xdb,0xf8,
};
const uint8_t tc_ISK_SY[] = {
 0x1e,0xb1,0x7f,0x7f,0x71,0x26,0xa0,0x7a,0xcd,0x51,0x0e,0x9d,
 0x60,0xc8,0x4f,0x63,0xdc,0x01,0x13,0xac,0x34,0xf8,0xd3,0x59,
 0xe8,0xf6,0x92,0xa9,0x06,0xf8,0x28,0xbd,0xe9,0x26,0xd9,0xff,
 0x65,0x20,0x2c,0x98,0x01,0xe9,0x88,0x4a,0xa0,0x5a,0x43,0xb6,
};
]]></artwork>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-1">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    X: (length: 97 bytes)
      04a32d8d8e1057d37b090d92f46d0bac1874e6cd7c13774774385c30
      39fa8fa3539884b436e49743d2d6279f5bd69dda5fe79fc6ecfb8547
      bf32d8c64ac51f177a70041a1300944f255eea38ca7e964c9d02c5e7
      e28d744e7cdc0bd80437363999
    G.scalar_mult(s,X) (full coordinates): (length: 97 bytes)
      045eb8202664ec20fed23ed6005c7be398174946a0f6a8a2e5fd2fed
      9ca159f22652899f820a2d472f926f57de30035a9d11e8006fb66e79
      f3db5d58bd5688954c7284d1e4a616a935dfb761955be13d29de5745
      074a863140dcc9a5c0056ced3b
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 48 bytes)
      5eb8202664ec20fed23ed6005c7be398174946a0f6a8a2e5fd2fed9c
      a159f22652899f820a2d472f926f57de30035a9d
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-3">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in MSGa or MSGb the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    Y_i1: (length: 97 bytes)
      04a32d8d8e1057d37b090d92f46d0bac1874e6cd7c13774774385c30
      39fa8fa3539884b436e49743d2d6279f5bd69dda5fe79fc6ecfb8547
      bf32d8c64ac51f177a70041a1300944f255eea38ca7e964c9d02c5e7
      e28d744e7cdc0bd80437363938
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-521-and-hash-sha-512">
        <name>Test vector for CPace using group NIST P-521 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-521">
          <name>Test vectors for calculate_generator with group NIST P-521</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP521_XMD:SHA-512_SSWU_NU_'
    CI = b'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 168 bytes)
      1e4350616365503532315f584d443a5348412d3531325f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000160a41696e69746961746f72
      0a42726573706f6e646572107e4b4791d6a8ef019b936c79fb7f2c57
    generator g: (length: 133 bytes)
      0400523c2be75a6fdb50e33d917597f182810ea6afe04b7297fccdfc
      f8c1c9f0f1a0c794056c729c275a654d1f9f52cd3d1d0ecc8f2f6a1b
      ab958d36cc539c558496a901bbe4fd573f2a6e6cc0c9afee3ee25c4b
      6f0474dd012eff5af0cbf55c4ec3c0ab4f1187353f815eb2a01ebc52
      d076d45a77a9b86d14fb21066df1d09f10b0a97546
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-6">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 66 bytes)
      016fac7bb757452e7b788d68a1510eda90113c65db1213fa08927d50
      bcf2635fd66ca254e82927071001353e265082fd609af47ad06fab42
      0c2295df4056ee9ff997
  Outputs
    Ya: (length: 133 bytes)
      0400484dcee6d54cb356830cd764079360a03b06a7db1a82188e09c9
      2e02d7e78a1e3710da9554db11697d242893e2114d6cbee89f5999b7
      e545d9fdf59f4c9acd408901ad73e01ec22ae6ecc122cf257e81826e
      348cd410ddb9245c61889fe97b2bbb98b2038eb2ed23e989ec7013a6
      10fb2f3b4fb958cc860dd10c98745b9d89e37f2bf9
    Alternative correct value for Ya: g^(-ya):
    (length: 133 bytes)
      0400484dcee6d54cb356830cd764079360a03b06a7db1a82188e09c9
      2e02d7e78a1e3710da9554db11697d242893e2114d6cbee89f5999b7
      e545d9fdf59f4c9acd408900528c1fe13dd519133edd30da817e7d91
      cb732bef2246dba39e77601684d444674dfc714d12dc1676138fec59
      ef04d0c4b046a73379f22ef3678ba462761c80d406
    MSGa = lv_cat(Ya,ADa): (length: 139 bytes)
      85010400484dcee6d54cb356830cd764079360a03b06a7db1a82188e
      09c92e02d7e78a1e3710da9554db11697d242893e2114d6cbee89f59
      99b7e545d9fdf59f4c9acd408901ad73e01ec22ae6ecc122cf257e81
      826e348cd410ddb9245c61889fe97b2bbb98b2038eb2ed23e989ec70
      13a610fb2f3b4fb958cc860dd10c98745b9d89e37f2bf903414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-6">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 66 bytes)
      011a946e2d0f48dc440ae3f4fd9126198237042fd1d41d037068c284
      6d43ec130cbc55ef1208496be068f8682bcaf6156e51598e27c1fb24
      d77b43957bbc129bab80
  Outputs
    Yb: (length: 133 bytes)
      0401edf767bd7d9e67ff137b8f3210c55e9192e9ac8a10f32a2f0eef
      9ce34524a543e0d4eb9b3328ca114b02ab23b291f61b5bc814639a9e
      caff07e870733131747637004c2df1bec8abe6b252e7fe91bdb6f724
      2e65c36e7b960646c89aaf0262a4803ee4c90d1b58775a409a135bd1
      8fedbf4ba0eae172b4fe8a0fada83d699e44f2f861
    Alternative correct value for Yb: g^(-yb):
    (length: 133 bytes)
      0401edf767bd7d9e67ff137b8f3210c55e9192e9ac8a10f32a2f0eef
      9ce34524a543e0d4eb9b3328ca114b02ab23b291f61b5bc814639a9e
      caff07e87073313174763701b3d20e413754194dad18016e424908db
      d19a3c918469f9b9376550fd9d5b7fc11b36f2e4a788a5bf65eca42e
      701240b45f151e8d4b0175f05257c29661bb0d079e
    MSGb = lv_cat(Yb,ADb): (length: 139 bytes)
      85010401edf767bd7d9e67ff137b8f3210c55e9192e9ac8a10f32a2f
      0eef9ce34524a543e0d4eb9b3328ca114b02ab23b291f61b5bc81463
      9a9ecaff07e870733131747637004c2df1bec8abe6b252e7fe91bdb6
      f7242e65c36e7b960646c89aaf0262a4803ee4c90d1b58775a409a13
      5bd18fedbf4ba0eae172b4fe8a0fada83d699e44f2f86103414462
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-6">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 66 bytes)
      0070a7460122c65d86bf9dd012ab45fc94be362619d1a1f0e75f1433
      3ed8b873b5724616b88dadaaba5f28bb783aeb01f60df5fdb8c0a237
      45900f462f405debfd51
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      0070a7460122c65d86bf9dd012ab45fc94be362619d1a1f0e75f1433
      3ed8b873b5724616b88dadaaba5f28bb783aeb01f60df5fdb8c0a237
      45900f462f405debfd51
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-6">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 278 bytes)
      85010400484dcee6d54cb356830cd764079360a03b06a7db1a82188e
      09c92e02d7e78a1e3710da9554db11697d242893e2114d6cbee89f59
      99b7e545d9fdf59f4c9acd408901ad73e01ec22ae6ecc122cf257e81
      826e348cd410ddb9245c61889fe97b2bbb98b2038eb2ed23e989ec70
      13a610fb2f3b4fb958cc860dd10c98745b9d89e37f2bf90341446185
      010401edf767bd7d9e67ff137b8f3210c55e9192e9ac8a10f32a2f0e
      ef9ce34524a543e0d4eb9b3328ca114b02ab23b291f61b5bc814639a
      9ecaff07e870733131747637004c2df1bec8abe6b252e7fe91bdb6f7
      242e65c36e7b960646c89aaf0262a4803ee4c90d1b58775a409a135b
      d18fedbf4ba0eae172b4fe8a0fada83d699e44f2f86103414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 397 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c57420070a7
      460122c65d86bf9dd012ab45fc94be362619d1a1f0e75f14333ed8b8
      73b5724616b88dadaaba5f28bb783aeb01f60df5fdb8c0a23745900f
      462f405debfd5185010400484dcee6d54cb356830cd764079360a03b
      06a7db1a82188e09c92e02d7e78a1e3710da9554db11697d242893e2
      114d6cbee89f5999b7e545d9fdf59f4c9acd408901ad73e01ec22ae6
      ecc122cf257e81826e348cd410ddb9245c61889fe97b2bbb98b2038e
      b2ed23e989ec7013a610fb2f3b4fb958cc860dd10c98745b9d89e37f
      2bf90341446185010401edf767bd7d9e67ff137b8f3210c55e9192e9
      ac8a10f32a2f0eef9ce34524a543e0d4eb9b3328ca114b02ab23b291
      f61b5bc814639a9ecaff07e870733131747637004c2df1bec8abe6b2
      52e7fe91bdb6f7242e65c36e7b960646c89aaf0262a4803ee4c90d1b
      58775a409a135bd18fedbf4ba0eae172b4fe8a0fada83d699e44f2f8
      6103414462
    ISK result: (length: 64 bytes)
      2b2c534c352c446773bd334fac2f2c50ef8cd7991bd4e070f85b0367
      a2f7ffca445066cf20b756773687e1038b170896ec2677fe722acb0f
      9e6c2f11830e808a
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-6">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 278 bytes)
      85010401edf767bd7d9e67ff137b8f3210c55e9192e9ac8a10f32a2f
      0eef9ce34524a543e0d4eb9b3328ca114b02ab23b291f61b5bc81463
      9a9ecaff07e870733131747637004c2df1bec8abe6b252e7fe91bdb6
      f7242e65c36e7b960646c89aaf0262a4803ee4c90d1b58775a409a13
      5bd18fedbf4ba0eae172b4fe8a0fada83d699e44f2f8610341446285
      010400484dcee6d54cb356830cd764079360a03b06a7db1a82188e09
      c92e02d7e78a1e3710da9554db11697d242893e2114d6cbee89f5999
      b7e545d9fdf59f4c9acd408901ad73e01ec22ae6ecc122cf257e8182
      6e348cd410ddb9245c61889fe97b2bbb98b2038eb2ed23e989ec7013
      a610fb2f3b4fb958cc860dd10c98745b9d89e37f2bf903414461
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||oCAT(MSGa,MSGb): (length: 397 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c57420070a7
      460122c65d86bf9dd012ab45fc94be362619d1a1f0e75f14333ed8b8
      73b5724616b88dadaaba5f28bb783aeb01f60df5fdb8c0a23745900f
      462f405debfd5185010401edf767bd7d9e67ff137b8f3210c55e9192
      e9ac8a10f32a2f0eef9ce34524a543e0d4eb9b3328ca114b02ab23b2
      91f61b5bc814639a9ecaff07e870733131747637004c2df1bec8abe6
      b252e7fe91bdb6f7242e65c36e7b960646c89aaf0262a4803ee4c90d
      1b58775a409a135bd18fedbf4ba0eae172b4fe8a0fada83d699e44f2
      f8610341446285010400484dcee6d54cb356830cd764079360a03b06
      a7db1a82188e09c92e02d7e78a1e3710da9554db11697d242893e211
      4d6cbee89f5999b7e545d9fdf59f4c9acd408901ad73e01ec22ae6ec
      c122cf257e81826e348cd410ddb9245c61889fe97b2bbb98b2038eb2
      ed23e989ec7013a610fb2f3b4fb958cc860dd10c98745b9d89e37f2b
      f903414461
    ISK result: (length: 64 bytes)
      78c4dd7136309a2bbe1fdef3cf24a08690006b0c9de253b770c147dd
      0800681c82e4e67a388ed1cd9182e595b8e9e3f2976a0e6dab48b2cd
      205b19489e20f571
]]></artwork>
        </section>
        <section anchor="corresponding-ansi-c-initializers-6">
          <name>Corresponding ANSI-C initializers</name>
          <artwork><![CDATA[
const uint8_t tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const uint8_t tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const uint8_t tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const uint8_t tc_g[] = {
 0x04,0x00,0x52,0x3c,0x2b,0xe7,0x5a,0x6f,0xdb,0x50,0xe3,0x3d,
 0x91,0x75,0x97,0xf1,0x82,0x81,0x0e,0xa6,0xaf,0xe0,0x4b,0x72,
 0x97,0xfc,0xcd,0xfc,0xf8,0xc1,0xc9,0xf0,0xf1,0xa0,0xc7,0x94,
 0x05,0x6c,0x72,0x9c,0x27,0x5a,0x65,0x4d,0x1f,0x9f,0x52,0xcd,
 0x3d,0x1d,0x0e,0xcc,0x8f,0x2f,0x6a,0x1b,0xab,0x95,0x8d,0x36,
 0xcc,0x53,0x9c,0x55,0x84,0x96,0xa9,0x01,0xbb,0xe4,0xfd,0x57,
 0x3f,0x2a,0x6e,0x6c,0xc0,0xc9,0xaf,0xee,0x3e,0xe2,0x5c,0x4b,
 0x6f,0x04,0x74,0xdd,0x01,0x2e,0xff,0x5a,0xf0,0xcb,0xf5,0x5c,
 0x4e,0xc3,0xc0,0xab,0x4f,0x11,0x87,0x35,0x3f,0x81,0x5e,0xb2,
 0xa0,0x1e,0xbc,0x52,0xd0,0x76,0xd4,0x5a,0x77,0xa9,0xb8,0x6d,
 0x14,0xfb,0x21,0x06,0x6d,0xf1,0xd0,0x9f,0x10,0xb0,0xa9,0x75,
 0x46,
};
const uint8_t tc_ya[] = {
 0x01,0x6f,0xac,0x7b,0xb7,0x57,0x45,0x2e,0x7b,0x78,0x8d,0x68,
 0xa1,0x51,0x0e,0xda,0x90,0x11,0x3c,0x65,0xdb,0x12,0x13,0xfa,
 0x08,0x92,0x7d,0x50,0xbc,0xf2,0x63,0x5f,0xd6,0x6c,0xa2,0x54,
 0xe8,0x29,0x27,0x07,0x10,0x01,0x35,0x3e,0x26,0x50,0x82,0xfd,
 0x60,0x9a,0xf4,0x7a,0xd0,0x6f,0xab,0x42,0x0c,0x22,0x95,0xdf,
 0x40,0x56,0xee,0x9f,0xf9,0x97,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x04,0x00,0x48,0x4d,0xce,0xe6,0xd5,0x4c,0xb3,0x56,0x83,0x0c,
 0xd7,0x64,0x07,0x93,0x60,0xa0,0x3b,0x06,0xa7,0xdb,0x1a,0x82,
 0x18,0x8e,0x09,0xc9,0x2e,0x02,0xd7,0xe7,0x8a,0x1e,0x37,0x10,
 0xda,0x95,0x54,0xdb,0x11,0x69,0x7d,0x24,0x28,0x93,0xe2,0x11,
 0x4d,0x6c,0xbe,0xe8,0x9f,0x59,0x99,0xb7,0xe5,0x45,0xd9,0xfd,
 0xf5,0x9f,0x4c,0x9a,0xcd,0x40,0x89,0x01,0xad,0x73,0xe0,0x1e,
 0xc2,0x2a,0xe6,0xec,0xc1,0x22,0xcf,0x25,0x7e,0x81,0x82,0x6e,
 0x34,0x8c,0xd4,0x10,0xdd,0xb9,0x24,0x5c,0x61,0x88,0x9f,0xe9,
 0x7b,0x2b,0xbb,0x98,0xb2,0x03,0x8e,0xb2,0xed,0x23,0xe9,0x89,
 0xec,0x70,0x13,0xa6,0x10,0xfb,0x2f,0x3b,0x4f,0xb9,0x58,0xcc,
 0x86,0x0d,0xd1,0x0c,0x98,0x74,0x5b,0x9d,0x89,0xe3,0x7f,0x2b,
 0xf9,
};
const uint8_t tc_yb[] = {
 0x01,0x1a,0x94,0x6e,0x2d,0x0f,0x48,0xdc,0x44,0x0a,0xe3,0xf4,
 0xfd,0x91,0x26,0x19,0x82,0x37,0x04,0x2f,0xd1,0xd4,0x1d,0x03,
 0x70,0x68,0xc2,0x84,0x6d,0x43,0xec,0x13,0x0c,0xbc,0x55,0xef,
 0x12,0x08,0x49,0x6b,0xe0,0x68,0xf8,0x68,0x2b,0xca,0xf6,0x15,
 0x6e,0x51,0x59,0x8e,0x27,0xc1,0xfb,0x24,0xd7,0x7b,0x43,0x95,
 0x7b,0xbc,0x12,0x9b,0xab,0x80,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0x04,0x01,0xed,0xf7,0x67,0xbd,0x7d,0x9e,0x67,0xff,0x13,0x7b,
 0x8f,0x32,0x10,0xc5,0x5e,0x91,0x92,0xe9,0xac,0x8a,0x10,0xf3,
 0x2a,0x2f,0x0e,0xef,0x9c,0xe3,0x45,0x24,0xa5,0x43,0xe0,0xd4,
 0xeb,0x9b,0x33,0x28,0xca,0x11,0x4b,0x02,0xab,0x23,0xb2,0x91,
 0xf6,0x1b,0x5b,0xc8,0x14,0x63,0x9a,0x9e,0xca,0xff,0x07,0xe8,
 0x70,0x73,0x31,0x31,0x74,0x76,0x37,0x00,0x4c,0x2d,0xf1,0xbe,
 0xc8,0xab,0xe6,0xb2,0x52,0xe7,0xfe,0x91,0xbd,0xb6,0xf7,0x24,
 0x2e,0x65,0xc3,0x6e,0x7b,0x96,0x06,0x46,0xc8,0x9a,0xaf,0x02,
 0x62,0xa4,0x80,0x3e,0xe4,0xc9,0x0d,0x1b,0x58,0x77,0x5a,0x40,
 0x9a,0x13,0x5b,0xd1,0x8f,0xed,0xbf,0x4b,0xa0,0xea,0xe1,0x72,
 0xb4,0xfe,0x8a,0x0f,0xad,0xa8,0x3d,0x69,0x9e,0x44,0xf2,0xf8,
 0x61,
};
const uint8_t tc_K[] = {
 0x00,0x70,0xa7,0x46,0x01,0x22,0xc6,0x5d,0x86,0xbf,0x9d,0xd0,
 0x12,0xab,0x45,0xfc,0x94,0xbe,0x36,0x26,0x19,0xd1,0xa1,0xf0,
 0xe7,0x5f,0x14,0x33,0x3e,0xd8,0xb8,0x73,0xb5,0x72,0x46,0x16,
 0xb8,0x8d,0xad,0xaa,0xba,0x5f,0x28,0xbb,0x78,0x3a,0xeb,0x01,
 0xf6,0x0d,0xf5,0xfd,0xb8,0xc0,0xa2,0x37,0x45,0x90,0x0f,0x46,
 0x2f,0x40,0x5d,0xeb,0xfd,0x51,
};
const uint8_t tc_ISK_IR[] = {
 0x2b,0x2c,0x53,0x4c,0x35,0x2c,0x44,0x67,0x73,0xbd,0x33,0x4f,
 0xac,0x2f,0x2c,0x50,0xef,0x8c,0xd7,0x99,0x1b,0xd4,0xe0,0x70,
 0xf8,0x5b,0x03,0x67,0xa2,0xf7,0xff,0xca,0x44,0x50,0x66,0xcf,
 0x20,0xb7,0x56,0x77,0x36,0x87,0xe1,0x03,0x8b,0x17,0x08,0x96,
 0xec,0x26,0x77,0xfe,0x72,0x2a,0xcb,0x0f,0x9e,0x6c,0x2f,0x11,
 0x83,0x0e,0x80,0x8a,
};
const uint8_t tc_ISK_SY[] = {
 0x78,0xc4,0xdd,0x71,0x36,0x30,0x9a,0x2b,0xbe,0x1f,0xde,0xf3,
 0xcf,0x24,0xa0,0x86,0x90,0x00,0x6b,0x0c,0x9d,0xe2,0x53,0xb7,
 0x70,0xc1,0x47,0xdd,0x08,0x00,0x68,0x1c,0x82,0xe4,0xe6,0x7a,
 0x38,0x8e,0xd1,0xcd,0x91,0x82,0xe5,0x95,0xb8,0xe9,0xe3,0xf2,
 0x97,0x6a,0x0e,0x6d,0xab,0x48,0xb2,0xcd,0x20,0x5b,0x19,0x48,
 0x9e,0x20,0xf5,0x71,
};
]]></artwork>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-2">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    X: (length: 133 bytes)
      0400bf0a2632f954515e65c55553e25cde4c8bf3a48e5df86a3ef845
      fcf15c8d9a4640171188ff835df48b8f934070d225daa591e270a9cc
      539b82e8dc145caf38aeb900c30b83a1c9792e95c4a25f75b58001d3
      6331c2b71a86591e1b510a1740335bc9947da1f6bab91b86900c9258
      b28ee7b5ea33af2a8138a75cde4287613ab6673bcc
    G.scalar_mult(s,X) (full coordinates): (length: 133 bytes)
      040100763e7ebe6a051e2195b1980686a2a5d7edbc1d9284e38d1e9e
      13673b65b6b3b5cb1b1ab146a315c32425edee8fdca06a07cf72d26d
      31e38ec6a38481b4f18d8600b2a7df9cc7db6cbf75b2eee98f9f14e5
      e24a789d45b9709278e8b74b30eb32d55fb8cfea4258dcf9de7fb36a
      67326584d5c8121c4802801115b908b937361c9828
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 66 bytes)
      0100763e7ebe6a051e2195b1980686a2a5d7edbc1d9284e38d1e9e13
      673b65b6b3b5cb1b1ab146a315c32425edee8fdca06a07cf72d26d31
      e38ec6a38481b4f18d86
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-4">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in MSGa or MSGb the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    Y_i1: (length: 133 bytes)
      0400bf0a2632f954515e65c55553e25cde4c8bf3a48e5df86a3ef845
      fcf15c8d9a4640171188ff835df48b8f934070d225daa591e270a9cc
      539b82e8dc145caf38aeb900c30b83a1c9792e95c4a25f75b58001d3
      6331c2b71a86591e1b510a1740335bc9947da1f6bab91b86900c9258
      b28ee7b5ea33af2a8138a75cde4287613ab6673b3a
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
2rIvrWmvQs46KlNDLbrkMYzzaY6RxmxK6ZzaVCql/VbOJZWDHzP4OY1yqSa/
Xhd+9x4Cm/tbmGDNzJ57YPBrUE//WcbP9+FaqtMWl4bvM4Vix0xSUTfb1L6l
noujlemodUqTlsygcJrBzNapqLoxvpfisx4mqpLbnrO3uSYzUm/a+VamTWXU
TAKyqiYSTcuR76J8c4WEGn31iVbe98VEsFY3U6MuKfDDdfVakWSdstaTHLOL
vehJ8mNqNrzm426a0nbGpDFi9aNYW6YpzCdVItZsEmOHSw0h2tpea5JzF0uo
FKnCiINJppUneejMLweTCiRaU3yPo9emezbJDZu6HgIG1JYnE3zldiWeSfh1
qdrRjtAWWOMMKRRpx+ytKKZjajOabsJ+C2k1PW80+nhySXO9Q+op0O6bEvuk
PYm9hlZZymYM5vzPU7uxd5q0r8SUmdwrR26lmkaq0VWrRrWmez8rKeQoNA3a
zpn7iLPasAEsNHUT+FqEtEUb3UhbTVJaa3qcSgxNtIG2O5l0K+vPKcW8tclX
JC5XX69J3O4X7fck/ous2vxGXOVVgeev3vIFb2nLFuUHFIz+PyMTC1rU7QEA

-->

</rfc>
