<?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.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-08" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-08"/>
    <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="2023" month="July" day="23"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 118?>

<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>
    <?line 126?>

<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.
<?line -6?>
      </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"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-opaque">
          <front>
            <title>The OPAQUE Asymmetric PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Dr. Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>Algorand Foundation</organization>
            </author>
            <author fullname="Kevin Lewi" initials="K." surname="Lewi">
              <organization>Novi Research</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="8" month="June" year="2023"/>
            <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-11"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-hash-to-curve">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Sam Scott" initials="S." surname="Scott">
              <organization>Cornell Tech</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby" initials="R. S." surname="Wahby">
              <organization>Stanford University</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="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"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <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" initials="H." surname="de Valence">
         </author>
            <author fullname="Jack Grigg" initials="J." surname="Grigg">
         </author>
            <author fullname="Mike Hamburg" initials="M." surname="Hamburg">
         </author>
            <author fullname="Isis Lovecruft" initials="I." surname="Lovecruft">
         </author>
            <author fullname="George Tankersley" initials="G." surname="Tankersley">
         </author>
            <author fullname="Filippo Valsorda" initials="F." surname="Valsorda">
         </author>
            <date day="3" month="April" year="2023"/>
            <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.

   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-ristretto255-decaf448-07"/>
        </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"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <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"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <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"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <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"/>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <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"/>
            <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"/>
            <author fullname="J. Merkle" initials="J." surname="Merkle"/>
            <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"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <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"/>
            <author fullname="R. Poovendran" initials="R." surname="Poovendran"/>
            <author fullname="J. Lee" initials="J." surname="Lee"/>
            <author fullname="T. Iwata" initials="T." surname="Iwata"/>
            <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>
    <?line 792?>

<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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
+ZNsEUK4xMzjKdSWfWlNexVy1lGZGmrRJY9hnE9zjDRmU0rn1KZSKe23ci6p
HPyYwc9plEs1+fW68Lv3ENjc38IEa2b23AODX4N6+s8yfr4P11Kdtrg0fJ8p
FDtmkoq62ab2LfVcHK1MR61TmrRkBoXTDGa2TkXVjfG9FJ/1MFGV3Pacvc01
mZF60863Mm0qo2YSkFU1kWhajnwX5ZsrJNToq0+08r4vJoK1upkadUmBH66r
14ok65S1nuSYXexFT5IfU7PhNR9305S2MyaNEasfxdoyTWE+qRKxZpMYO1xq
CNHW9lqTnLtYQqVIFUYcTDKtPMlDZ345mFQg0Zriexy9Nt2zSW7Y1PUQMKC2
PJngK7cr8UzCr0vVjnaEtsAaZ0ihSDtmb0UxHVOb0XQT9ltIq+l5o9HHk0ua
6x1ST4F235TYJ+1J7DW0ylI2YzDnf57ajb3TpH0lpszkXjlyK9U0Uo2uWjWq
Nd37WUkhR6Fp0HbO3Eec1YYNYKGpm8DXIqQt2uhG2mqS0lrT41RiaKINtN3J
pFtZf04p5q1NviJxufp6TeJ2v2i/J/FfZNXmN+Iqrwo8f/WWL3hLW7YoP6Bg
9P8BOLVVe+DtAQA=

-->

</rfc>
