<?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-10" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.0 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-10"/>
    <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="September" day="25"/>
    <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 and
can be used on groups 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 aims at avoiding common implementation pitfalls already by-design, such as avoiding incentives for insecure execution-time speed optimizations. 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="RFC9380"/> 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="RFC9380"/> 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-512_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P521 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 encodings, such as the network encoding used for the client-hello and server-hello messages in TLS MAY also be used when
following the guidance given in the security consideration section.</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(lv_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, transcript(MSGa, MSGb) needs to be implemented using ordered concatenation for generating a matching view 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.</t>
        <ul spacing="normal">
          <li>generator_string(DSI, PRS, CI, sid, s_in_bytes) denotes a function that returns the string
lv_cat(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 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 for the common case of short PRS 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="RFC9380"/>. 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="RFC9380"/> 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
check for proper handling of the abort conditions, when a party is receiving 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 may 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 an element-derivation function that maps a byte string to a group element.
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 = element_derivation(gen_str_hash)
using the element derivation 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
check for proper handling of the abort conditions, when a party is receiving
encodings of the neutral element or receives 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 function.
encode_to_curve must map an octet string 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="RFC9380"/>
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="RFC9380"/> 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 G.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 and returns 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,DST) we denote a mapping function from <xref target="RFC9380"/>. I.e. a function that maps
octet string str to a point on the group using the domain separation tag DST. <xref target="RFC9380"/> 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="RFC9380"/>.</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="RFC9380"/>. 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.DST denotes the domain-separation tag value to use in conjunction with the encode_to_curve function from <xref target="RFC9380"/>. G.DST shall be obtained by concatenating G.DSI and "_DST".</li>
            <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, G.DST) is returned, using the selected suite from <xref target="RFC9380"/>.</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
check for proper handling of the abort conditions, when a party is receiving an
encoding 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 point encodings within MSGa and MSGb and introduce this
in a protocol run. It SHALL be verified that the abort condition is properly handled.</t>
      <t>Moreover regarding the network format any implementation MUST be tested with respect invalid encodings of MSGa and MSGb.
E.g. when lv_cat is used as network format for encoding MSGa and MSGb,
the sum of the prepended lengths of the fields must be verified to match the actual length of the message.
Tests SHALL verify that a party aborts in case that incorrectly encoded messages are recieved.</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. Prepending the length of
of all variable-size input strings 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 uses 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>We would like to thank the participants on the CFRG list 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="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="5" month="September" 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-08"/>
        </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="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <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="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </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 796?>

<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)
      5e25411ca1ad7c9debfd0b33ad987a95cefef2d3f15dcc8bd26415a5
      dfe2e15a
]]></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)
      da3d23700a9e5699258aef94dc060dfda5ebb61f02a5ea77fad53f4f
      f0976d08
  Outputs
    Ya: (length: 32 bytes)
      383a85dd236978f17f8c8545b50dabc52a39fcdab2cf8bc531ce040f
      f77ca82d
    MSGa = lv_cat(Ya,ADa): (length: 37 bytes)
      20383a85dd236978f17f8c8545b50dabc52a39fcdab2cf8bc531ce04
      0ff77ca82d03414461
]]></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)
      d2316b454718c35362d83d69df6320f38578ed5984651435e2949762
      d900b80d
  Outputs
    Yb: (length: 32 bytes)
      a6206309c0e8e5f579295e35997ac4300ab3fecec3c17f7b604f3e69
      8fa1383c
    MSGb = lv_cat(Yb,ADb): (length: 37 bytes)
      20a6206309c0e8e5f579295e35997ac4300ab3fecec3c17f7b604f3e
      698fa1383c03414462
]]></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)
      fa1d0318864e2cacb26875f1b791c9ae83204fe8359addb53e95a2e9
      8893853f
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      fa1d0318864e2cacb26875f1b791c9ae83204fe8359addb53e95a2e9
      8893853f
]]></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)
      20383a85dd236978f17f8c8545b50dabc52a39fcdab2cf8bc531ce04
      0ff77ca82d0341446120a6206309c0e8e5f579295e35997ac4300ab3
      fecec3c17f7b604f3e698fa1383c03414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720fa1d0318864e2cacb26875f1b791c9ae
      83204fe8359addb53e95a2e98893853f20383a85dd236978f17f8c85
      45b50dabc52a39fcdab2cf8bc531ce040ff77ca82d0341446120a620
      6309c0e8e5f579295e35997ac4300ab3fecec3c17f7b604f3e698fa1
      383c03414462
    ISK result: (length: 64 bytes)
      e91ccb2c0f5e0d0993a33956e3be59754f3f2b07db57631f5394452e
      a2e7b4354674eb1f5686c078462bf83bec72e8743df440108e638f35
      26d9b90e85be096f
]]></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)
      20a6206309c0e8e5f579295e35997ac4300ab3fecec3c17f7b604f3e
      698fa1383c0341446220383a85dd236978f17f8c8545b50dabc52a39
      fcdab2cf8bc531ce040ff77ca82d03414461
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||oCAT(MSGa,MSGb): (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720fa1d0318864e2cacb26875f1b791c9ae
      83204fe8359addb53e95a2e98893853f20a6206309c0e8e5f579295e
      35997ac4300ab3fecec3c17f7b604f3e698fa1383c0341446220383a
      85dd236978f17f8c8545b50dabc52a39fcdab2cf8bc531ce040ff77c
      a82d03414461
    ISK result: (length: 64 bytes)
      2472dedbff868bfc12b4c256f790539af0e2bab7efc28d1a995d18a1
      a58e5bec639273d4604512669ab7953153d437eb90314dcba7539724
      02b0d9c5ec5283f8
]]></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[] = {
 0x5e,0x25,0x41,0x1c,0xa1,0xad,0x7c,0x9d,0xeb,0xfd,0x0b,0x33,
 0xad,0x98,0x7a,0x95,0xce,0xfe,0xf2,0xd3,0xf1,0x5d,0xcc,0x8b,
 0xd2,0x64,0x15,0xa5,0xdf,0xe2,0xe1,0x5a,
};
const uint8_t tc_ya[] = {
 0xda,0x3d,0x23,0x70,0x0a,0x9e,0x56,0x99,0x25,0x8a,0xef,0x94,
 0xdc,0x06,0x0d,0xfd,0xa5,0xeb,0xb6,0x1f,0x02,0xa5,0xea,0x77,
 0xfa,0xd5,0x3f,0x4f,0xf0,0x97,0x6d,0x08,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x38,0x3a,0x85,0xdd,0x23,0x69,0x78,0xf1,0x7f,0x8c,0x85,0x45,
 0xb5,0x0d,0xab,0xc5,0x2a,0x39,0xfc,0xda,0xb2,0xcf,0x8b,0xc5,
 0x31,0xce,0x04,0x0f,0xf7,0x7c,0xa8,0x2d,
};
const uint8_t tc_yb[] = {
 0xd2,0x31,0x6b,0x45,0x47,0x18,0xc3,0x53,0x62,0xd8,0x3d,0x69,
 0xdf,0x63,0x20,0xf3,0x85,0x78,0xed,0x59,0x84,0x65,0x14,0x35,
 0xe2,0x94,0x97,0x62,0xd9,0x00,0xb8,0x0d,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0xa6,0x20,0x63,0x09,0xc0,0xe8,0xe5,0xf5,0x79,0x29,0x5e,0x35,
 0x99,0x7a,0xc4,0x30,0x0a,0xb3,0xfe,0xce,0xc3,0xc1,0x7f,0x7b,
 0x60,0x4f,0x3e,0x69,0x8f,0xa1,0x38,0x3c,
};
const uint8_t tc_K[] = {
 0xfa,0x1d,0x03,0x18,0x86,0x4e,0x2c,0xac,0xb2,0x68,0x75,0xf1,
 0xb7,0x91,0xc9,0xae,0x83,0x20,0x4f,0xe8,0x35,0x9a,0xdd,0xb5,
 0x3e,0x95,0xa2,0xe9,0x88,0x93,0x85,0x3f,
};
const uint8_t tc_ISK_IR[] = {
 0xe9,0x1c,0xcb,0x2c,0x0f,0x5e,0x0d,0x09,0x93,0xa3,0x39,0x56,
 0xe3,0xbe,0x59,0x75,0x4f,0x3f,0x2b,0x07,0xdb,0x57,0x63,0x1f,
 0x53,0x94,0x45,0x2e,0xa2,0xe7,0xb4,0x35,0x46,0x74,0xeb,0x1f,
 0x56,0x86,0xc0,0x78,0x46,0x2b,0xf8,0x3b,0xec,0x72,0xe8,0x74,
 0x3d,0xf4,0x40,0x10,0x8e,0x63,0x8f,0x35,0x26,0xd9,0xb9,0x0e,
 0x85,0xbe,0x09,0x6f,
};
const uint8_t tc_ISK_SY[] = {
 0x24,0x72,0xde,0xdb,0xff,0x86,0x8b,0xfc,0x12,0xb4,0xc2,0x56,
 0xf7,0x90,0x53,0x9a,0xf0,0xe2,0xba,0xb7,0xef,0xc2,0x8d,0x1a,
 0x99,0x5d,0x18,0xa1,0xa5,0x8e,0x5b,0xec,0x63,0x92,0x73,0xd4,
 0x60,0x45,0x12,0x66,0x9a,0xb7,0x95,0x31,0x53,0xd4,0x37,0xeb,
 0x90,0x31,0x4d,0xcb,0xa7,0x53,0x97,0x24,0x02,0xb0,0xd9,0xc5,
 0xec,0x52,0x83,0xf8,
};
]]></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)
      2c3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    G.scalar_mult(s,decode(X)): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
    G.scalar_mult_vfy(s,X): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
]]></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)
      2b3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    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)
      682d1a4f49fc2a4834356ae4d7f58636bc9481521c845e66e6fb0b29
      69341df45fbaeaea9e2221b3f5babc54c5f8ce456988ffc519defaeb
]]></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)
      d4b87d2fcdcac1096dba1898361f27e29dc1e019f74f84a71199bfd3
      dc8d09d2b823038f579f517591474be366968e2fb599bf14e55704f4
    MSGa = lv_cat(Ya,ADa): (length: 61 bytes)
      38d4b87d2fcdcac1096dba1898361f27e29dc1e019f74f84a71199bf
      d3dc8d09d2b823038f579f517591474be366968e2fb599bf14e55704
      f403414461
]]></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)
      d61c6c039c01560e8b19b8299fb39513f39302eebd4c462694a33155
      a3a387e44aa613647fcf6303f918bad598aaab53bea849b9fd14da74
    MSGb = lv_cat(Yb,ADb): (length: 61 bytes)
      38d61c6c039c01560e8b19b8299fb39513f39302eebd4c462694a331
      55a3a387e44aa613647fcf6303f918bad598aaab53bea849b9fd14da
      7403414462
]]></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)
      e434cda1783ddaaef08fc1d5f2201f1540fbc295fe2dd7cc38f20385
      64824c98dbbe1978f121bdfead8e1a638913a6952cbec54867eb770a
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      e434cda1783ddaaef08fc1d5f2201f1540fbc295fe2dd7cc38f20385
      64824c98dbbe1978f121bdfead8e1a638913a6952cbec54867eb770a
]]></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)
      38d4b87d2fcdcac1096dba1898361f27e29dc1e019f74f84a71199bf
      d3dc8d09d2b823038f579f517591474be366968e2fb599bf14e55704
      f40341446138d61c6c039c01560e8b19b8299fb39513f39302eebd4c
      462694a33155a3a387e44aa613647fcf6303f918bad598aaab53bea8
      49b9fd14da7403414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438e434cda1783ddaaef08fc1d5f2201f1540fbc295
      fe2dd7cc38f2038564824c98dbbe1978f121bdfead8e1a638913a695
      2cbec54867eb770a38d4b87d2fcdcac1096dba1898361f27e29dc1e0
      19f74f84a71199bfd3dc8d09d2b823038f579f517591474be366968e
      2fb599bf14e55704f40341446138d61c6c039c01560e8b19b8299fb3
      9513f39302eebd4c462694a33155a3a387e44aa613647fcf6303f918
      bad598aaab53bea849b9fd14da7403414462
    ISK result: (length: 64 bytes)
      13636dc9b7d233ac24a2d5c4a85a72fe20145f7a47ad51cab40e087c
      057831b69ee59b9c828732bde171cfca99afda4852bcaf04fe9f0a97
      592cdf5e2c9a5948
]]></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)
      38d61c6c039c01560e8b19b8299fb39513f39302eebd4c462694a331
      55a3a387e44aa613647fcf6303f918bad598aaab53bea849b9fd14da
      740341446238d4b87d2fcdcac1096dba1898361f27e29dc1e019f74f
      84a71199bfd3dc8d09d2b823038f579f517591474be366968e2fb599
      bf14e55704f403414461
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||oCAT(MSGa,MSGb): (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438e434cda1783ddaaef08fc1d5f2201f1540fbc295
      fe2dd7cc38f2038564824c98dbbe1978f121bdfead8e1a638913a695
      2cbec54867eb770a38d61c6c039c01560e8b19b8299fb39513f39302
      eebd4c462694a33155a3a387e44aa613647fcf6303f918bad598aaab
      53bea849b9fd14da740341446238d4b87d2fcdcac1096dba1898361f
      27e29dc1e019f74f84a71199bfd3dc8d09d2b823038f579f51759147
      4be366968e2fb599bf14e55704f403414461
    ISK result: (length: 64 bytes)
      999e8f8486670bc1bf874a4d8f1496b9ebd8909eb01cf46b275ec942
      2f22593064b272ba9e9e201a4a34a18729e48859a2d038c7c8cf0a0f
      e8a90ddcbdde1126
]]></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[] = {
 0x68,0x2d,0x1a,0x4f,0x49,0xfc,0x2a,0x48,0x34,0x35,0x6a,0xe4,
 0xd7,0xf5,0x86,0x36,0xbc,0x94,0x81,0x52,0x1c,0x84,0x5e,0x66,
 0xe6,0xfb,0x0b,0x29,0x69,0x34,0x1d,0xf4,0x5f,0xba,0xea,0xea,
 0x9e,0x22,0x21,0xb3,0xf5,0xba,0xbc,0x54,0xc5,0xf8,0xce,0x45,
 0x69,0x88,0xff,0xc5,0x19,0xde,0xfa,0xeb,
};
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[] = {
 0xd4,0xb8,0x7d,0x2f,0xcd,0xca,0xc1,0x09,0x6d,0xba,0x18,0x98,
 0x36,0x1f,0x27,0xe2,0x9d,0xc1,0xe0,0x19,0xf7,0x4f,0x84,0xa7,
 0x11,0x99,0xbf,0xd3,0xdc,0x8d,0x09,0xd2,0xb8,0x23,0x03,0x8f,
 0x57,0x9f,0x51,0x75,0x91,0x47,0x4b,0xe3,0x66,0x96,0x8e,0x2f,
 0xb5,0x99,0xbf,0x14,0xe5,0x57,0x04,0xf4,
};
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[] = {
 0xd6,0x1c,0x6c,0x03,0x9c,0x01,0x56,0x0e,0x8b,0x19,0xb8,0x29,
 0x9f,0xb3,0x95,0x13,0xf3,0x93,0x02,0xee,0xbd,0x4c,0x46,0x26,
 0x94,0xa3,0x31,0x55,0xa3,0xa3,0x87,0xe4,0x4a,0xa6,0x13,0x64,
 0x7f,0xcf,0x63,0x03,0xf9,0x18,0xba,0xd5,0x98,0xaa,0xab,0x53,
 0xbe,0xa8,0x49,0xb9,0xfd,0x14,0xda,0x74,
};
const uint8_t tc_K[] = {
 0xe4,0x34,0xcd,0xa1,0x78,0x3d,0xda,0xae,0xf0,0x8f,0xc1,0xd5,
 0xf2,0x20,0x1f,0x15,0x40,0xfb,0xc2,0x95,0xfe,0x2d,0xd7,0xcc,
 0x38,0xf2,0x03,0x85,0x64,0x82,0x4c,0x98,0xdb,0xbe,0x19,0x78,
 0xf1,0x21,0xbd,0xfe,0xad,0x8e,0x1a,0x63,0x89,0x13,0xa6,0x95,
 0x2c,0xbe,0xc5,0x48,0x67,0xeb,0x77,0x0a,
};
const uint8_t tc_ISK_IR[] = {
 0x13,0x63,0x6d,0xc9,0xb7,0xd2,0x33,0xac,0x24,0xa2,0xd5,0xc4,
 0xa8,0x5a,0x72,0xfe,0x20,0x14,0x5f,0x7a,0x47,0xad,0x51,0xca,
 0xb4,0x0e,0x08,0x7c,0x05,0x78,0x31,0xb6,0x9e,0xe5,0x9b,0x9c,
 0x82,0x87,0x32,0xbd,0xe1,0x71,0xcf,0xca,0x99,0xaf,0xda,0x48,
 0x52,0xbc,0xaf,0x04,0xfe,0x9f,0x0a,0x97,0x59,0x2c,0xdf,0x5e,
 0x2c,0x9a,0x59,0x48,
};
const uint8_t tc_ISK_SY[] = {
 0x99,0x9e,0x8f,0x84,0x86,0x67,0x0b,0xc1,0xbf,0x87,0x4a,0x4d,
 0x8f,0x14,0x96,0xb9,0xeb,0xd8,0x90,0x9e,0xb0,0x1c,0xf4,0x6b,
 0x27,0x5e,0xc9,0x42,0x2f,0x22,0x59,0x30,0x64,0xb2,0x72,0xba,
 0x9e,0x9e,0x20,0x1a,0x4a,0x34,0xa1,0x87,0x29,0xe4,0x88,0x59,
 0xa2,0xd0,0x38,0xc7,0xc8,0xcf,0x0a,0x0f,0xe8,0xa9,0x0d,0xdc,
 0xbd,0xde,0x11,0x26,
};
]]></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)
      601431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    G.scalar_mult(s,decode(X)): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
    G.scalar_mult_vfy(s,X): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
]]></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)
      5f1431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    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_'
    DST = b'CPaceP256_XMD:SHA-256_SSWU_NU__DST'
    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)
      041b51433114e096c9d595f0955f5717a75169afb95557f4a6f51155
      035dee19c76887bce5c7c054fa1fe48a4a62c7fb96dc75e34259d2f7
      2b8d41f31b8e586bcd
]]></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)
      37574cfbf1b95ff6a8e2d7be462d4d01e6dde2618f34f4de9df869b2
      4f532c5d
  Outputs
    Ya: (length: 65 bytes)
      04b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb320d
      81df014649c2ac691925fce0eceac7dbc75eca25e6a1558066a610b4
      021488279e3b989d52
    Alternative correct value for Ya: g^(-ya):
    (length: 65 bytes)
      04b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb320d
      81df0146493d5396e5da031f1415382438a135da195eaa7f9a59ef4b
      fdeb77d861c46762ad
    MSGa = lv_cat(Ya,ADa): (length: 70 bytes)
      4104b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb32
      0d81df014649c2ac691925fce0eceac7dbc75eca25e6a1558066a610
      b4021488279e3b989d5203414461
]]></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)
      e5672fc9eb4e721f41d80181ec4c9fd9886668acc48024d33c82bb10
      2aecba52
  Outputs
    Yb: (length: 65 bytes)
      04bb2783a57337e74671f76452876b27839c0ea9e044e3aadaad2e64
      777ed27a90e80a99438e2f1c072462f2895c6dadf1b43867b92ffb65
      562b78c793947dcada
    Alternative correct value for Yb: g^(-yb):
    (length: 65 bytes)
      04bb2783a57337e74671f76452876b27839c0ea9e044e3aadaad2e64
      777ed27a9017f566bb71d0e3f9db9d0d76a392520e4bc79847d0049a
      a9d487386c6b823525
    MSGb = lv_cat(Yb,ADb): (length: 70 bytes)
      4104bb2783a57337e74671f76452876b27839c0ea9e044e3aadaad2e
      64777ed27a90e80a99438e2f1c072462f2895c6dadf1b43867b92ffb
      65562b78c793947dcada03414462
]]></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)
      8fd12b283805750aeee6151bcd4211a6b71019e8fc416293ade24ed2
      bce12c39
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      8fd12b283805750aeee6151bcd4211a6b71019e8fc416293ade24ed2
      bce12c39
]]></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)
      4104b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb32
      0d81df014649c2ac691925fce0eceac7dbc75eca25e6a1558066a610
      b4021488279e3b989d52034144614104bb2783a57337e74671f76452
      876b27839c0ea9e044e3aadaad2e64777ed27a90e80a99438e2f1c07
      2462f2895c6dadf1b43867b92ffb65562b78c793947dcada03414462
    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
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df208fd12b
      283805750aeee6151bcd4211a6b71019e8fc416293ade24ed2bce12c
      394104b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb
      320d81df014649c2ac691925fce0eceac7dbc75eca25e6a1558066a6
      10b4021488279e3b989d52034144614104bb2783a57337e74671f764
      52876b27839c0ea9e044e3aadaad2e64777ed27a90e80a99438e2f1c
      072462f2895c6dadf1b43867b92ffb65562b78c793947dcada034144
      62
    ISK result: (length: 32 bytes)
      7ae1e916606e44652e3c0d7231198af6519226339c241e546afd0bbf
      48e1c96a
]]></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)
      4104bb2783a57337e74671f76452876b27839c0ea9e044e3aadaad2e
      64777ed27a90e80a99438e2f1c072462f2895c6dadf1b43867b92ffb
      65562b78c793947dcada034144624104b75c1bcda84a0f324aabb7f2
      5cf853ed7fb327c33f23db6aeb320d81df014649c2ac691925fce0ec
      eac7dbc75eca25e6a1558066a610b4021488279e3b989d5203414461
    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
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df208fd12b
      283805750aeee6151bcd4211a6b71019e8fc416293ade24ed2bce12c
      394104bb2783a57337e74671f76452876b27839c0ea9e044e3aadaad
      2e64777ed27a90e80a99438e2f1c072462f2895c6dadf1b43867b92f
      fb65562b78c793947dcada034144624104b75c1bcda84a0f324aabb7
      f25cf853ed7fb327c33f23db6aeb320d81df014649c2ac691925fce0
      eceac7dbc75eca25e6a1558066a610b4021488279e3b989d52034144
      61
    ISK result: (length: 32 bytes)
      c5b4e6d44f5bbb7637a77ec67afd768a1343c410f7e1f76f6549eb00
      2623c0f1
]]></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,0x1b,0x51,0x43,0x31,0x14,0xe0,0x96,0xc9,0xd5,0x95,0xf0,
 0x95,0x5f,0x57,0x17,0xa7,0x51,0x69,0xaf,0xb9,0x55,0x57,0xf4,
 0xa6,0xf5,0x11,0x55,0x03,0x5d,0xee,0x19,0xc7,0x68,0x87,0xbc,
 0xe5,0xc7,0xc0,0x54,0xfa,0x1f,0xe4,0x8a,0x4a,0x62,0xc7,0xfb,
 0x96,0xdc,0x75,0xe3,0x42,0x59,0xd2,0xf7,0x2b,0x8d,0x41,0xf3,
 0x1b,0x8e,0x58,0x6b,0xcd,
};
const uint8_t tc_ya[] = {
 0x37,0x57,0x4c,0xfb,0xf1,0xb9,0x5f,0xf6,0xa8,0xe2,0xd7,0xbe,
 0x46,0x2d,0x4d,0x01,0xe6,0xdd,0xe2,0x61,0x8f,0x34,0xf4,0xde,
 0x9d,0xf8,0x69,0xb2,0x4f,0x53,0x2c,0x5d,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x04,0xb7,0x5c,0x1b,0xcd,0xa8,0x4a,0x0f,0x32,0x4a,0xab,0xb7,
 0xf2,0x5c,0xf8,0x53,0xed,0x7f,0xb3,0x27,0xc3,0x3f,0x23,0xdb,
 0x6a,0xeb,0x32,0x0d,0x81,0xdf,0x01,0x46,0x49,0xc2,0xac,0x69,
 0x19,0x25,0xfc,0xe0,0xec,0xea,0xc7,0xdb,0xc7,0x5e,0xca,0x25,
 0xe6,0xa1,0x55,0x80,0x66,0xa6,0x10,0xb4,0x02,0x14,0x88,0x27,
 0x9e,0x3b,0x98,0x9d,0x52,
};
const uint8_t tc_yb[] = {
 0xe5,0x67,0x2f,0xc9,0xeb,0x4e,0x72,0x1f,0x41,0xd8,0x01,0x81,
 0xec,0x4c,0x9f,0xd9,0x88,0x66,0x68,0xac,0xc4,0x80,0x24,0xd3,
 0x3c,0x82,0xbb,0x10,0x2a,0xec,0xba,0x52,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0x04,0xbb,0x27,0x83,0xa5,0x73,0x37,0xe7,0x46,0x71,0xf7,0x64,
 0x52,0x87,0x6b,0x27,0x83,0x9c,0x0e,0xa9,0xe0,0x44,0xe3,0xaa,
 0xda,0xad,0x2e,0x64,0x77,0x7e,0xd2,0x7a,0x90,0xe8,0x0a,0x99,
 0x43,0x8e,0x2f,0x1c,0x07,0x24,0x62,0xf2,0x89,0x5c,0x6d,0xad,
 0xf1,0xb4,0x38,0x67,0xb9,0x2f,0xfb,0x65,0x56,0x2b,0x78,0xc7,
 0x93,0x94,0x7d,0xca,0xda,
};
const uint8_t tc_K[] = {
 0x8f,0xd1,0x2b,0x28,0x38,0x05,0x75,0x0a,0xee,0xe6,0x15,0x1b,
 0xcd,0x42,0x11,0xa6,0xb7,0x10,0x19,0xe8,0xfc,0x41,0x62,0x93,
 0xad,0xe2,0x4e,0xd2,0xbc,0xe1,0x2c,0x39,
};
const uint8_t tc_ISK_IR[] = {
 0x7a,0xe1,0xe9,0x16,0x60,0x6e,0x44,0x65,0x2e,0x3c,0x0d,0x72,
 0x31,0x19,0x8a,0xf6,0x51,0x92,0x26,0x33,0x9c,0x24,0x1e,0x54,
 0x6a,0xfd,0x0b,0xbf,0x48,0xe1,0xc9,0x6a,
};
const uint8_t tc_ISK_SY[] = {
 0xc5,0xb4,0xe6,0xd4,0x4f,0x5b,0xbb,0x76,0x37,0xa7,0x7e,0xc6,
 0x7a,0xfd,0x76,0x8a,0x13,0x43,0xc4,0x10,0xf7,0xe1,0xf7,0x6f,
 0x65,0x49,0xeb,0x00,0x26,0x23,0xc0,0xf1,
};
]]></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)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5831
    G.scalar_mult(s,X) (full coordinates): (length: 65 bytes)
      04f5a191f078c87c36633b78c701751159d56c59f3fe9105b5720673
      470f303ab925b6a7fd1cdd8f649a21cf36b68d9e9c4a11919a951892
      519786104b27033757
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 32 bytes)
      f5a191f078c87c36633b78c701751159d56c59f3fe9105b572067347
      0f303ab9
]]></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)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5857
    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_'
    DST = b'CPaceP384_XMD:SHA-384_SSWU_NU__DST'
    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)
      04f35a925fe82e54350e80b084a8013b1960cb3f73c49b0c2ae9b523
      997846ddd14c66f24f62223112cf35b866065f91ad86674cce2a2876
      84904e49f01287b54666bb518df2ea53cec627fa6e1283f14c6ed4bc
      d11b33fbb962da3e2e4ff1345c
]]></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)
      7d5bc6a8959f9db2655b8b6642e393dc13d25150d69c6675fb3efd41
      ae6255bf54202b960f9aacd97fd6d2841b461f18
  Outputs
    Ya: (length: 97 bytes)
      048b65b9ef4c5726664391ceeae241834b275960a6f9316799f5c974
      eceb71dfb6d36e989addf2ae8c4e338f204b2cd754e1c43b43a12692
      8d8d81ce2e6edbc22a99ed478ad3487b87e1052bce2d94b6464a2228
      eab73c01f79d6b290af6b218cf
    Alternative correct value for Ya: g^(-ya):
    (length: 97 bytes)
      048b65b9ef4c5726664391ceeae241834b275960a6f9316799f5c974
      eceb71dfb6d36e989addf2ae8c4e338f204b2cd7541e3bc4bc5ed96d
      72727e31d191243dd56612b8752cb784781efad431d26b49b8b5ddd7
      1448c3fe086294d6f6094de730
    MSGa = lv_cat(Ya,ADa): (length: 102 bytes)
      61048b65b9ef4c5726664391ceeae241834b275960a6f9316799f5c9
      74eceb71dfb6d36e989addf2ae8c4e338f204b2cd754e1c43b43a126
      928d8d81ce2e6edbc22a99ed478ad3487b87e1052bce2d94b6464a22
      28eab73c01f79d6b290af6b218cf03414461
]]></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)
      5cc9465bdb3ae626b77521ea36218fc93a9693c36ff126899e3d8777
      c126ef05483e34c05576c9e8c64b1a0b6f5b53d1
  Outputs
    Yb: (length: 97 bytes)
      04cb68451813699abda3dc0ed9d521baf9108bc2c4b2a1dbcd90a083
      63f5e458938d6fe634ed6393bc8440ec9b9f8a30841ffcc7cd65d9cf
      9617155e129bccded9888ac738f78e940f9887f9089ab6275d36c3ab
      1bccbd048b088b1b80a0f56f27
    Alternative correct value for Yb: g^(-yb):
    (length: 97 bytes)
      04cb68451813699abda3dc0ed9d521baf9108bc2c4b2a1dbcd90a083
      63f5e458938d6fe634ed6393bc8440ec9b9f8a3084e00338329a2630
      69e8eaa1ed64332126777538c708716bf0677806f76549d8a1c93c54
      e33342fb74f774e4805f0a90d8
    MSGb = lv_cat(Yb,ADb): (length: 102 bytes)
      6104cb68451813699abda3dc0ed9d521baf9108bc2c4b2a1dbcd90a0
      8363f5e458938d6fe634ed6393bc8440ec9b9f8a30841ffcc7cd65d9
      cf9617155e129bccded9888ac738f78e940f9887f9089ab6275d36c3
      ab1bccbd048b088b1b80a0f56f2703414462
]]></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)
      c862709d6bfe7cc02f0c11dafdbf4ef8db1c5e4cb13a22985a83bef1
      8631361ed7d8cd97b12931844b7ac61b2f31d332
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      c862709d6bfe7cc02f0c11dafdbf4ef8db1c5e4cb13a22985a83bef1
      8631361ed7d8cd97b12931844b7ac61b2f31d332
]]></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)
      61048b65b9ef4c5726664391ceeae241834b275960a6f9316799f5c9
      74eceb71dfb6d36e989addf2ae8c4e338f204b2cd754e1c43b43a126
      928d8d81ce2e6edbc22a99ed478ad3487b87e1052bce2d94b6464a22
      28eab73c01f79d6b290af6b218cf034144616104cb68451813699abd
      a3dc0ed9d521baf9108bc2c4b2a1dbcd90a08363f5e458938d6fe634
      ed6393bc8440ec9b9f8a30841ffcc7cd65d9cf9617155e129bccded9
      888ac738f78e940f9887f9089ab6275d36c3ab1bccbd048b088b1b80
      a0f56f2703414462
    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
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30c86270
      9d6bfe7cc02f0c11dafdbf4ef8db1c5e4cb13a22985a83bef1863136
      1ed7d8cd97b12931844b7ac61b2f31d33261048b65b9ef4c57266643
      91ceeae241834b275960a6f9316799f5c974eceb71dfb6d36e989add
      f2ae8c4e338f204b2cd754e1c43b43a126928d8d81ce2e6edbc22a99
      ed478ad3487b87e1052bce2d94b6464a2228eab73c01f79d6b290af6
      b218cf034144616104cb68451813699abda3dc0ed9d521baf9108bc2
      c4b2a1dbcd90a08363f5e458938d6fe634ed6393bc8440ec9b9f8a30
      841ffcc7cd65d9cf9617155e129bccded9888ac738f78e940f9887f9
      089ab6275d36c3ab1bccbd048b088b1b80a0f56f2703414462
    ISK result: (length: 48 bytes)
      db1e8133be8359b9aa8cd563043ee784344f26580876862e28b3f98b
      51b2f611a65362c1d77db66c879de466f5b6148a
]]></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)
      6104cb68451813699abda3dc0ed9d521baf9108bc2c4b2a1dbcd90a0
      8363f5e458938d6fe634ed6393bc8440ec9b9f8a30841ffcc7cd65d9
      cf9617155e129bccded9888ac738f78e940f9887f9089ab6275d36c3
      ab1bccbd048b088b1b80a0f56f270341446261048b65b9ef4c572666
      4391ceeae241834b275960a6f9316799f5c974eceb71dfb6d36e989a
      ddf2ae8c4e338f204b2cd754e1c43b43a126928d8d81ce2e6edbc22a
      99ed478ad3487b87e1052bce2d94b6464a2228eab73c01f79d6b290a
      f6b218cf03414461
    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
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30c86270
      9d6bfe7cc02f0c11dafdbf4ef8db1c5e4cb13a22985a83bef1863136
      1ed7d8cd97b12931844b7ac61b2f31d3326104cb68451813699abda3
      dc0ed9d521baf9108bc2c4b2a1dbcd90a08363f5e458938d6fe634ed
      6393bc8440ec9b9f8a30841ffcc7cd65d9cf9617155e129bccded988
      8ac738f78e940f9887f9089ab6275d36c3ab1bccbd048b088b1b80a0
      f56f270341446261048b65b9ef4c5726664391ceeae241834b275960
      a6f9316799f5c974eceb71dfb6d36e989addf2ae8c4e338f204b2cd7
      54e1c43b43a126928d8d81ce2e6edbc22a99ed478ad3487b87e1052b
      ce2d94b6464a2228eab73c01f79d6b290af6b218cf03414461
    ISK result: (length: 48 bytes)
      519bfbb1477652e8ed1b4ec5774e310c4f44da46f3c36be91b0dd6b4
      e3a3245942cf4d9db8f79023dad6e1b57aed4891
]]></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,0xf3,0x5a,0x92,0x5f,0xe8,0x2e,0x54,0x35,0x0e,0x80,0xb0,
 0x84,0xa8,0x01,0x3b,0x19,0x60,0xcb,0x3f,0x73,0xc4,0x9b,0x0c,
 0x2a,0xe9,0xb5,0x23,0x99,0x78,0x46,0xdd,0xd1,0x4c,0x66,0xf2,
 0x4f,0x62,0x22,0x31,0x12,0xcf,0x35,0xb8,0x66,0x06,0x5f,0x91,
 0xad,0x86,0x67,0x4c,0xce,0x2a,0x28,0x76,0x84,0x90,0x4e,0x49,
 0xf0,0x12,0x87,0xb5,0x46,0x66,0xbb,0x51,0x8d,0xf2,0xea,0x53,
 0xce,0xc6,0x27,0xfa,0x6e,0x12,0x83,0xf1,0x4c,0x6e,0xd4,0xbc,
 0xd1,0x1b,0x33,0xfb,0xb9,0x62,0xda,0x3e,0x2e,0x4f,0xf1,0x34,
 0x5c,
};
const uint8_t tc_ya[] = {
 0x7d,0x5b,0xc6,0xa8,0x95,0x9f,0x9d,0xb2,0x65,0x5b,0x8b,0x66,
 0x42,0xe3,0x93,0xdc,0x13,0xd2,0x51,0x50,0xd6,0x9c,0x66,0x75,
 0xfb,0x3e,0xfd,0x41,0xae,0x62,0x55,0xbf,0x54,0x20,0x2b,0x96,
 0x0f,0x9a,0xac,0xd9,0x7f,0xd6,0xd2,0x84,0x1b,0x46,0x1f,0x18,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x04,0x8b,0x65,0xb9,0xef,0x4c,0x57,0x26,0x66,0x43,0x91,0xce,
 0xea,0xe2,0x41,0x83,0x4b,0x27,0x59,0x60,0xa6,0xf9,0x31,0x67,
 0x99,0xf5,0xc9,0x74,0xec,0xeb,0x71,0xdf,0xb6,0xd3,0x6e,0x98,
 0x9a,0xdd,0xf2,0xae,0x8c,0x4e,0x33,0x8f,0x20,0x4b,0x2c,0xd7,
 0x54,0xe1,0xc4,0x3b,0x43,0xa1,0x26,0x92,0x8d,0x8d,0x81,0xce,
 0x2e,0x6e,0xdb,0xc2,0x2a,0x99,0xed,0x47,0x8a,0xd3,0x48,0x7b,
 0x87,0xe1,0x05,0x2b,0xce,0x2d,0x94,0xb6,0x46,0x4a,0x22,0x28,
 0xea,0xb7,0x3c,0x01,0xf7,0x9d,0x6b,0x29,0x0a,0xf6,0xb2,0x18,
 0xcf,
};
const uint8_t tc_yb[] = {
 0x5c,0xc9,0x46,0x5b,0xdb,0x3a,0xe6,0x26,0xb7,0x75,0x21,0xea,
 0x36,0x21,0x8f,0xc9,0x3a,0x96,0x93,0xc3,0x6f,0xf1,0x26,0x89,
 0x9e,0x3d,0x87,0x77,0xc1,0x26,0xef,0x05,0x48,0x3e,0x34,0xc0,
 0x55,0x76,0xc9,0xe8,0xc6,0x4b,0x1a,0x0b,0x6f,0x5b,0x53,0xd1,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0x04,0xcb,0x68,0x45,0x18,0x13,0x69,0x9a,0xbd,0xa3,0xdc,0x0e,
 0xd9,0xd5,0x21,0xba,0xf9,0x10,0x8b,0xc2,0xc4,0xb2,0xa1,0xdb,
 0xcd,0x90,0xa0,0x83,0x63,0xf5,0xe4,0x58,0x93,0x8d,0x6f,0xe6,
 0x34,0xed,0x63,0x93,0xbc,0x84,0x40,0xec,0x9b,0x9f,0x8a,0x30,
 0x84,0x1f,0xfc,0xc7,0xcd,0x65,0xd9,0xcf,0x96,0x17,0x15,0x5e,
 0x12,0x9b,0xcc,0xde,0xd9,0x88,0x8a,0xc7,0x38,0xf7,0x8e,0x94,
 0x0f,0x98,0x87,0xf9,0x08,0x9a,0xb6,0x27,0x5d,0x36,0xc3,0xab,
 0x1b,0xcc,0xbd,0x04,0x8b,0x08,0x8b,0x1b,0x80,0xa0,0xf5,0x6f,
 0x27,
};
const uint8_t tc_K[] = {
 0xc8,0x62,0x70,0x9d,0x6b,0xfe,0x7c,0xc0,0x2f,0x0c,0x11,0xda,
 0xfd,0xbf,0x4e,0xf8,0xdb,0x1c,0x5e,0x4c,0xb1,0x3a,0x22,0x98,
 0x5a,0x83,0xbe,0xf1,0x86,0x31,0x36,0x1e,0xd7,0xd8,0xcd,0x97,
 0xb1,0x29,0x31,0x84,0x4b,0x7a,0xc6,0x1b,0x2f,0x31,0xd3,0x32,
};
const uint8_t tc_ISK_IR[] = {
 0xdb,0x1e,0x81,0x33,0xbe,0x83,0x59,0xb9,0xaa,0x8c,0xd5,0x63,
 0x04,0x3e,0xe7,0x84,0x34,0x4f,0x26,0x58,0x08,0x76,0x86,0x2e,
 0x28,0xb3,0xf9,0x8b,0x51,0xb2,0xf6,0x11,0xa6,0x53,0x62,0xc1,
 0xd7,0x7d,0xb6,0x6c,0x87,0x9d,0xe4,0x66,0xf5,0xb6,0x14,0x8a,
};
const uint8_t tc_ISK_SY[] = {
 0x51,0x9b,0xfb,0xb1,0x47,0x76,0x52,0xe8,0xed,0x1b,0x4e,0xc5,
 0x77,0x4e,0x31,0x0c,0x4f,0x44,0xda,0x46,0xf3,0xc3,0x6b,0xe9,
 0x1b,0x0d,0xd6,0xb4,0xe3,0xa3,0x24,0x59,0x42,0xcf,0x4d,0x9d,
 0xb8,0xf7,0x90,0x23,0xda,0xd6,0xe1,0xb5,0x7a,0xed,0x48,0x91,
};
]]></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)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f4036e
    G.scalar_mult(s,X) (full coordinates): (length: 97 bytes)
      0465c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f6105873
      3173a033cda76c3e3ea5352b804e67fdbe2e334be8245dad5c8c993e
      63bacf0456478f29b71b6c859f13676f84ff150d2741f028f560584a
      0bdba19a63df62c08949c2fd6d
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 48 bytes)
      65c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f610587331
      73a033cda76c3e3ea5352b804e67fdbe2e334be8
]]></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)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f40302
    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_'
    DST = b'CPaceP521_XMD:SHA-512_SSWU_NU__DST'
    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)
      0400dc927958f0b69ccad8fb67ef008905354b58c7c9c92ad50060a9
      e6afb10437d6ca8a26164e8573702b897275a25d05ed4407af2a3849
      86dca7e243b92c5dd500d40057012121a9c8e34373fa619f918f7d47
      9c23f85f0485379ef0f05284398de26653b49a155324c9d7b138be84
      d0b49bb58e232b7bf697798de6ee8afd6b92b6fa2f
]]></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)
      006367e9c2aeff9f1db19af600cca73343d47cbe446cebbd1ccd783f
      82755a872da86fd0707eb3767c6114f1803deb62d63bdd1e613f67e6
      3e8c141ee5310e3ee819
  Outputs
    Ya: (length: 133 bytes)
      04003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e1065706d
      ca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc594ad5
      286c068792ab7ca60ff6ea00919c41c00e789dabc2f42fd94178d7bf
      d8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703860f022bd271740469
      bb322b07c179c7c225499b31727c0ea3ee65578634
    Alternative correct value for Ya: g^(-ya):
    (length: 133 bytes)
      04003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e1065706d
      ca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc594ad5
      286c068792ab7ca60ff6ea016e63be3ff18762543d0bd026be872840
      27041e500e3e7ab4c2504c5f15ec0a5a03e8fc79f0fdd42d8e8bfb96
      44cdd4f83e86383ddab664ce8d83f15c119aa879cb
    MSGa = lv_cat(Ya,ADa): (length: 139 bytes)
      850104003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e1065
      706dca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc59
      4ad5286c068792ab7ca60ff6ea00919c41c00e789dabc2f42fd94178
      d7bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703860f022bd27174
      0469bb322b07c179c7c225499b31727c0ea3ee6557863403414461
]]></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)
      009227bf8dc741dacc9422f8bf3c0e96fce9587bc562eaafe0dc5f6f
      82f28594e4a6f98553560c62b75fa4abb198cecbbb86ebd41b0ea025
      4cde78ac68d39a240ae7
  Outputs
    Yb: (length: 133 bytes)
      0400f5cb68bf0117bd1a65412a2bc800af92013f9969cf546e1ea6d3
      bcf08643fdc482130aec1eecc33a2b5f33600be51295047fa3399fa2
      82cc1a78de91f3a4e30b5d01a085b453f22bf3dc947386b042e5fc4e
      c691fee47fe3c3ec6408c22a17c26bc0ab73940910614d6fcee32daf
      bfd2d340d6e382d71b1fc763d7cec502fbcbcf93b4
    Alternative correct value for Yb: g^(-yb):
    (length: 133 bytes)
      0400f5cb68bf0117bd1a65412a2bc800af92013f9969cf546e1ea6d3
      bcf08643fdc482130aec1eecc33a2b5f33600be51295047fa3399fa2
      82cc1a78de91f3a4e30b5d005f7a4bac0dd40c236b8c794fbd1a03b1
      396e011b801c3c139bf73dd5e83d943f548c6bf6ef9eb290311cd250
      402d2cbf291c7d28e4e0389c28313afd0434306c4b
    MSGb = lv_cat(Yb,ADb): (length: 139 bytes)
      85010400f5cb68bf0117bd1a65412a2bc800af92013f9969cf546e1e
      a6d3bcf08643fdc482130aec1eecc33a2b5f33600be51295047fa339
      9fa282cc1a78de91f3a4e30b5d01a085b453f22bf3dc947386b042e5
      fc4ec691fee47fe3c3ec6408c22a17c26bc0ab73940910614d6fcee3
      2dafbfd2d340d6e382d71b1fc763d7cec502fbcbcf93b403414462
]]></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)
      00503e75e38e012a6dc6f3561980e4cf540dbcff3de3a4a6f09d79c3
      2cc45764d3a6605eb45df1dc63fb7937b7879f2820da1b3266b69fa0
      99bf8720dd8f6a07e8ed
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      00503e75e38e012a6dc6f3561980e4cf540dbcff3de3a4a6f09d79c3
      2cc45764d3a6605eb45df1dc63fb7937b7879f2820da1b3266b69fa0
      99bf8720dd8f6a07e8ed
]]></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)
      850104003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e1065
      706dca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc59
      4ad5286c068792ab7ca60ff6ea00919c41c00e789dabc2f42fd94178
      d7bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703860f022bd27174
      0469bb322b07c179c7c225499b31727c0ea3ee655786340341446185
      010400f5cb68bf0117bd1a65412a2bc800af92013f9969cf546e1ea6
      d3bcf08643fdc482130aec1eecc33a2b5f33600be51295047fa3399f
      a282cc1a78de91f3a4e30b5d01a085b453f22bf3dc947386b042e5fc
      4ec691fee47fe3c3ec6408c22a17c26bc0ab73940910614d6fcee32d
      afbfd2d340d6e382d71b1fc763d7cec502fbcbcf93b403414462
    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
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c574200503e
      75e38e012a6dc6f3561980e4cf540dbcff3de3a4a6f09d79c32cc457
      64d3a6605eb45df1dc63fb7937b7879f2820da1b3266b69fa099bf87
      20dd8f6a07e8ed850104003701ec35caafa3dd416cad29ba1774551f
      9d2ed89f7e1065706dca230b86a11d02e4cee8b3fde64380d4a05983
      167d8a2414bc594ad5286c068792ab7ca60ff6ea00919c41c00e789d
      abc2f42fd94178d7bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703
      860f022bd271740469bb322b07c179c7c225499b31727c0ea3ee6557
      86340341446185010400f5cb68bf0117bd1a65412a2bc800af92013f
      9969cf546e1ea6d3bcf08643fdc482130aec1eecc33a2b5f33600be5
      1295047fa3399fa282cc1a78de91f3a4e30b5d01a085b453f22bf3dc
      947386b042e5fc4ec691fee47fe3c3ec6408c22a17c26bc0ab739409
      10614d6fcee32dafbfd2d340d6e382d71b1fc763d7cec502fbcbcf93
      b403414462
    ISK result: (length: 64 bytes)
      ed208a15af3ef8a67a5cac4acb360d03154570e3b1b1c54867f53a72
      53cb919d13aa47efc647375be2250cb39ad965afa4ddfcb6be47d586
      d28c7eef6d654525
]]></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)
      85010400f5cb68bf0117bd1a65412a2bc800af92013f9969cf546e1e
      a6d3bcf08643fdc482130aec1eecc33a2b5f33600be51295047fa339
      9fa282cc1a78de91f3a4e30b5d01a085b453f22bf3dc947386b042e5
      fc4ec691fee47fe3c3ec6408c22a17c26bc0ab73940910614d6fcee3
      2dafbfd2d340d6e382d71b1fc763d7cec502fbcbcf93b40341446285
      0104003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e106570
      6dca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc594a
      d5286c068792ab7ca60ff6ea00919c41c00e789dabc2f42fd94178d7
      bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703860f022bd2717404
      69bb322b07c179c7c225499b31727c0ea3ee6557863403414461
    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
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c574200503e
      75e38e012a6dc6f3561980e4cf540dbcff3de3a4a6f09d79c32cc457
      64d3a6605eb45df1dc63fb7937b7879f2820da1b3266b69fa099bf87
      20dd8f6a07e8ed85010400f5cb68bf0117bd1a65412a2bc800af9201
      3f9969cf546e1ea6d3bcf08643fdc482130aec1eecc33a2b5f33600b
      e51295047fa3399fa282cc1a78de91f3a4e30b5d01a085b453f22bf3
      dc947386b042e5fc4ec691fee47fe3c3ec6408c22a17c26bc0ab7394
      0910614d6fcee32dafbfd2d340d6e382d71b1fc763d7cec502fbcbcf
      93b403414462850104003701ec35caafa3dd416cad29ba1774551f9d
      2ed89f7e1065706dca230b86a11d02e4cee8b3fde64380d4a0598316
      7d8a2414bc594ad5286c068792ab7ca60ff6ea00919c41c00e789dab
      c2f42fd94178d7bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc170386
      0f022bd271740469bb322b07c179c7c225499b31727c0ea3ee655786
      3403414461
    ISK result: (length: 64 bytes)
      aae7320b73ba2516f289f71088662d41c4314d00521c48ea3c9c85ea
      ca57112e55eb2b4094d4a0c7813ddd95c5d80c5596ad686d2eba876b
      a1cd92f90407aa3d
]]></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,0xdc,0x92,0x79,0x58,0xf0,0xb6,0x9c,0xca,0xd8,0xfb,
 0x67,0xef,0x00,0x89,0x05,0x35,0x4b,0x58,0xc7,0xc9,0xc9,0x2a,
 0xd5,0x00,0x60,0xa9,0xe6,0xaf,0xb1,0x04,0x37,0xd6,0xca,0x8a,
 0x26,0x16,0x4e,0x85,0x73,0x70,0x2b,0x89,0x72,0x75,0xa2,0x5d,
 0x05,0xed,0x44,0x07,0xaf,0x2a,0x38,0x49,0x86,0xdc,0xa7,0xe2,
 0x43,0xb9,0x2c,0x5d,0xd5,0x00,0xd4,0x00,0x57,0x01,0x21,0x21,
 0xa9,0xc8,0xe3,0x43,0x73,0xfa,0x61,0x9f,0x91,0x8f,0x7d,0x47,
 0x9c,0x23,0xf8,0x5f,0x04,0x85,0x37,0x9e,0xf0,0xf0,0x52,0x84,
 0x39,0x8d,0xe2,0x66,0x53,0xb4,0x9a,0x15,0x53,0x24,0xc9,0xd7,
 0xb1,0x38,0xbe,0x84,0xd0,0xb4,0x9b,0xb5,0x8e,0x23,0x2b,0x7b,
 0xf6,0x97,0x79,0x8d,0xe6,0xee,0x8a,0xfd,0x6b,0x92,0xb6,0xfa,
 0x2f,
};
const uint8_t tc_ya[] = {
 0x00,0x63,0x67,0xe9,0xc2,0xae,0xff,0x9f,0x1d,0xb1,0x9a,0xf6,
 0x00,0xcc,0xa7,0x33,0x43,0xd4,0x7c,0xbe,0x44,0x6c,0xeb,0xbd,
 0x1c,0xcd,0x78,0x3f,0x82,0x75,0x5a,0x87,0x2d,0xa8,0x6f,0xd0,
 0x70,0x7e,0xb3,0x76,0x7c,0x61,0x14,0xf1,0x80,0x3d,0xeb,0x62,
 0xd6,0x3b,0xdd,0x1e,0x61,0x3f,0x67,0xe6,0x3e,0x8c,0x14,0x1e,
 0xe5,0x31,0x0e,0x3e,0xe8,0x19,
};
const uint8_t tc_ADa[] = {
 0x41,0x44,0x61,
};
const uint8_t tc_Ya[] = {
 0x04,0x00,0x37,0x01,0xec,0x35,0xca,0xaf,0xa3,0xdd,0x41,0x6c,
 0xad,0x29,0xba,0x17,0x74,0x55,0x1f,0x9d,0x2e,0xd8,0x9f,0x7e,
 0x10,0x65,0x70,0x6d,0xca,0x23,0x0b,0x86,0xa1,0x1d,0x02,0xe4,
 0xce,0xe8,0xb3,0xfd,0xe6,0x43,0x80,0xd4,0xa0,0x59,0x83,0x16,
 0x7d,0x8a,0x24,0x14,0xbc,0x59,0x4a,0xd5,0x28,0x6c,0x06,0x87,
 0x92,0xab,0x7c,0xa6,0x0f,0xf6,0xea,0x00,0x91,0x9c,0x41,0xc0,
 0x0e,0x78,0x9d,0xab,0xc2,0xf4,0x2f,0xd9,0x41,0x78,0xd7,0xbf,
 0xd8,0xfb,0xe1,0xaf,0xf1,0xc1,0x85,0x4b,0x3d,0xaf,0xb3,0xa0,
 0xea,0x13,0xf5,0xa5,0xfc,0x17,0x03,0x86,0x0f,0x02,0x2b,0xd2,
 0x71,0x74,0x04,0x69,0xbb,0x32,0x2b,0x07,0xc1,0x79,0xc7,0xc2,
 0x25,0x49,0x9b,0x31,0x72,0x7c,0x0e,0xa3,0xee,0x65,0x57,0x86,
 0x34,
};
const uint8_t tc_yb[] = {
 0x00,0x92,0x27,0xbf,0x8d,0xc7,0x41,0xda,0xcc,0x94,0x22,0xf8,
 0xbf,0x3c,0x0e,0x96,0xfc,0xe9,0x58,0x7b,0xc5,0x62,0xea,0xaf,
 0xe0,0xdc,0x5f,0x6f,0x82,0xf2,0x85,0x94,0xe4,0xa6,0xf9,0x85,
 0x53,0x56,0x0c,0x62,0xb7,0x5f,0xa4,0xab,0xb1,0x98,0xce,0xcb,
 0xbb,0x86,0xeb,0xd4,0x1b,0x0e,0xa0,0x25,0x4c,0xde,0x78,0xac,
 0x68,0xd3,0x9a,0x24,0x0a,0xe7,
};
const uint8_t tc_ADb[] = {
 0x41,0x44,0x62,
};
const uint8_t tc_Yb[] = {
 0x04,0x00,0xf5,0xcb,0x68,0xbf,0x01,0x17,0xbd,0x1a,0x65,0x41,
 0x2a,0x2b,0xc8,0x00,0xaf,0x92,0x01,0x3f,0x99,0x69,0xcf,0x54,
 0x6e,0x1e,0xa6,0xd3,0xbc,0xf0,0x86,0x43,0xfd,0xc4,0x82,0x13,
 0x0a,0xec,0x1e,0xec,0xc3,0x3a,0x2b,0x5f,0x33,0x60,0x0b,0xe5,
 0x12,0x95,0x04,0x7f,0xa3,0x39,0x9f,0xa2,0x82,0xcc,0x1a,0x78,
 0xde,0x91,0xf3,0xa4,0xe3,0x0b,0x5d,0x01,0xa0,0x85,0xb4,0x53,
 0xf2,0x2b,0xf3,0xdc,0x94,0x73,0x86,0xb0,0x42,0xe5,0xfc,0x4e,
 0xc6,0x91,0xfe,0xe4,0x7f,0xe3,0xc3,0xec,0x64,0x08,0xc2,0x2a,
 0x17,0xc2,0x6b,0xc0,0xab,0x73,0x94,0x09,0x10,0x61,0x4d,0x6f,
 0xce,0xe3,0x2d,0xaf,0xbf,0xd2,0xd3,0x40,0xd6,0xe3,0x82,0xd7,
 0x1b,0x1f,0xc7,0x63,0xd7,0xce,0xc5,0x02,0xfb,0xcb,0xcf,0x93,
 0xb4,
};
const uint8_t tc_K[] = {
 0x00,0x50,0x3e,0x75,0xe3,0x8e,0x01,0x2a,0x6d,0xc6,0xf3,0x56,
 0x19,0x80,0xe4,0xcf,0x54,0x0d,0xbc,0xff,0x3d,0xe3,0xa4,0xa6,
 0xf0,0x9d,0x79,0xc3,0x2c,0xc4,0x57,0x64,0xd3,0xa6,0x60,0x5e,
 0xb4,0x5d,0xf1,0xdc,0x63,0xfb,0x79,0x37,0xb7,0x87,0x9f,0x28,
 0x20,0xda,0x1b,0x32,0x66,0xb6,0x9f,0xa0,0x99,0xbf,0x87,0x20,
 0xdd,0x8f,0x6a,0x07,0xe8,0xed,
};
const uint8_t tc_ISK_IR[] = {
 0xed,0x20,0x8a,0x15,0xaf,0x3e,0xf8,0xa6,0x7a,0x5c,0xac,0x4a,
 0xcb,0x36,0x0d,0x03,0x15,0x45,0x70,0xe3,0xb1,0xb1,0xc5,0x48,
 0x67,0xf5,0x3a,0x72,0x53,0xcb,0x91,0x9d,0x13,0xaa,0x47,0xef,
 0xc6,0x47,0x37,0x5b,0xe2,0x25,0x0c,0xb3,0x9a,0xd9,0x65,0xaf,
 0xa4,0xdd,0xfc,0xb6,0xbe,0x47,0xd5,0x86,0xd2,0x8c,0x7e,0xef,
 0x6d,0x65,0x45,0x25,
};
const uint8_t tc_ISK_SY[] = {
 0xaa,0xe7,0x32,0x0b,0x73,0xba,0x25,0x16,0xf2,0x89,0xf7,0x10,
 0x88,0x66,0x2d,0x41,0xc4,0x31,0x4d,0x00,0x52,0x1c,0x48,0xea,
 0x3c,0x9c,0x85,0xea,0xca,0x57,0x11,0x2e,0x55,0xeb,0x2b,0x40,
 0x94,0xd4,0xa0,0xc7,0x81,0x3d,0xdd,0x95,0xc5,0xd8,0x0c,0x55,
 0x96,0xad,0x68,0x6d,0x2e,0xba,0x87,0x6b,0xa1,0xcd,0x92,0xf9,
 0x04,0x07,0xaa,0x3d,
};
]]></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)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfab9
    G.scalar_mult(s,X) (full coordinates): (length: 133 bytes)
      040122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7
      c73cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517c
      df6d99a8a2d6db19ef27bd0055af9e8ddcf337ce0a7c22a9c8099bc4
      a44faeded1eb72effd26e4f322217b67d60b944b267b3df5046078fd
      577f1785728f49b241fd5e8c83223a994a2d219281
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 66 bytes)
      0122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7c7
      3cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517cdf
      6d99a8a2d6db19ef27bd
]]></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)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfaf9
    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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
NMWLEKiSmALO4iGyFPIV+CUK5aPpQI2925rxM1jHR3dxxPRrfvJl+UmSoRQv
uSqh033NVcnbvNdc1dxd3q+5KiMNMK+4Kv7iXRTw3Vddn4sCfvod0VfoM7l8
P3wBAH7tddUJAH7vVY0zy6NtY/xsx7Y82n7P/tmObXm0vfZPHNvzfmV7x6vy
8jm/sl8UXpWXz/mVrc9XJf1zfkXeRF2W9M/5Ffn6W/fyvF+RwPJppvmsX9mi
u8g0n/Ur++4X2f2zfmXf/SK7f9av7HTavd87czlVfnSjUtG+TDtmKiEWUs/m
SqskmE45r+cXxIOyZsbNuxQimWqRF6vetkpK1CnjLS6OSSuMNvo6aJOZ1iOX
ngNdvLjeJ21iJVl0n8TvG8rMx5ih05byhIyPbLG5F/5/TbifjWIX4f/z35tt
b/tS3iQH3a/lTdJy8FrepIRJ+pX3OvzFn2v4f9AE9GsO8F4O8L5z2W8nrl6a
POdctl+/emnynHPZJnX1ouo557L9wdWLquecy/aFn/iY553LlvxLyZPeQem1
5EmoRF5LniQkvpY8ydcvfMxTOUApI1qjaANrMV4HZv2fUSueN2ZI0M1Z2ksy
LUM/Jrpnyy15mZbaio9ak5qQoRjauOxYpI3H6fbes2++J9W8z6H0kAKFgFp4
NsG+u249m5kVH2rSzv7a//RU/xOYbIGBBSATTRH9ZE4Xfu+FkrYbHBrz2T2C
hg9ztFk81f8EllvgxNGbEPPGtqLPp0qjyqJTTt8J2fyaeT/3JcDoDBg92o+w
DH8OHM/7D3PQTPv9xdXMAWg91jo3KnWBcOMWAh4grW8DgQuKY2BR06cbsOjt
894edBNgCrpfQFI85QKIQgJx3xbtFsCBgwU4CZ0+iIaHOSmuq0ymB/D7XE0X
maLPBftljj/QewVBpA18daK/qxMK2zv35qdjCgIUAp0MbQNfF3X83GKCBCAr
NDtg7/CHP/p+gMLHok5afYEfA4gLQPsCzgsadw1IeAPYhnAWjhqAX6F8h04C
frvYv+3eh6M/BajnHLeGracAbnd8t0mnBbwOTYTqzWO/73WYvO06gjLBKrBb
J/89JDK3ZHXfCpaPbhb5dpO9trI52FAA6etJpC0NRXVpFPDyQLejfQ99f0l0
bwHl0fYkQwLgJPrqb4DSwvgBGgcQO0qjI9DdC1zPn0MfC+4dlj7CONBrhMYl
YN7xRTzFkgU+Is1M+uDvFnL9heUe+0PAf+s7vONf2hcGQVuxDbR9wGPAvmGG
q3VFWuBCO7sW0TCA1hX0ecAzo0FHS3se+qj6OUTk6AKBdsBP4CdhiIemooEn
yXQDqAiGGAx3di2OE9Yv2rv47sXw0cIBCDvaDPTBSt63ii/m9KOhcYPd4VjR
l5O2bqFlMx02Dx2uWyfQNKBkqAY6tyBTeIwsNPNH9xJ2Ncq8hSJtPpiiYWQk
Ar6Dz63hHKsDZfv7A15fpL0K7VNJHD2Ussj4iqLOrjItTUJFxk5g7zAUJclq
IG54jL70OkroVRKOq8y9wCeVdHJFGanS1reNcLnDM0HDVzQ4hyBg8MbYegF/
naRf6d2OtiV0PMshscOt4THc0WZzOBU04KF5Zq7mGXzcyrOgdWmN5JAAHLFX
6EqRLtqy9mVI0EYICOJv1nAFv++IbpGzUTKtJg74d/RPo38DV1/TTGB9buvJ
cpKI4WgBWZ68iq3AC3XpKV1CRQCG8KXbKh5DNpA1QMXQBCYGscYr3MlXvrRf
TklX1dk5VyWVgiaiNwuNfGsCgD47tFcfZdrXgYpjz5V4WLRnBmlC2yMR0NM8
tvi7dLwhKifxHXAla/aIWdYimSlcIy6Bn9Y4GHko7BXCFBIoeLDh33S8+W05
UXwqEgB4RaRDuCPUE4uPSzOxZfmYC3SowxAn6WVIz+oDlHENR3/3FOOc0oC4
ZnKIuVc0z5rvjuAzj/5a+Nkg9x5bffH4Q/qJIAsk1mi+2m2yWHfcv1izi9RW
5CiTQZQ0PCJEuqNR8fTxyFtObwb/aPYGOundxufSMctIWpsQhNZgJ/vd4Unb
0T11eDg4U2jiallcUqt3/M3fXbgbFD6I0eeAJ+RbK8+ECkOhpAfLh3PuD+IU
ZLo19ejGWooJher7suVwHdLyj/ix/KzMVoLi+rh3BEIqMnnkaMBc6oGmar1V
Ikj7Pq6IfAAuaHW6IRlf6ohWazhSLc5/MQ0EUWY8Xt77tTKtFYKQRSCNxowS
BIzd3vZUHyHKBDxDkvwYqmGlYxILRtMZmpzRfe+WRi4WiLDljJCHSzjJRCBs
eFr80Y5GZKmw4Lpg9ghf8N247Ir3cF3CluGOmkxsCb9YA7rgIGAtUEZktOKH
kQOEY3HItrCf2LS2hb0SYBRkSPRPXgGUoeO8d5DuXCyUx0c905tYjkCwZ1uJ
7dayn1sfLBhHgTePUTtoExbGCyO542rEF1NXUhIhY18zaso56QnpE3zamodV
tnqjX3MxguBf0ZmKSv2YGQdxSQoIH7AaT/uWIxwytnfNqGrrYvg2Mk/IDGuQ
NLZK5QCPhuR0NdHCl+SzWXUVsWXd8Vv1O14BTnQyvUdmgtfRW6fzcHUm60yO
wZbWGfnulFKt+0KfGJ1PmvQ+Ykix95xCbdmX1rRXIWfN0PhQiy55DON8mmOk
MZtSjDVk1H2SM/6kcvBjBj+ZcijV5Ncrs+/fx/R7FVM1rrkydTCK7q5mHa2F
1ukuupWqqtJ6TOYaioyD3C8iQ29Gt8jI/OpUqCO6EvJotfjqSopNxTZbGCFF
7ndqJZcwurxYyz47VWx12igfbTWhJBKQ5yaHZC3dtpjEQzFjtVNP442ztOjz
ILamqfuIWhVaRlO+qo4xmGOOrPhtXWvFhJhjMz35MgI96X6HS1IMOTQ++LPD
qdppL6qJObgeQ6TnCcHFOnk0DH/8c1stb8laM9w00XLsaL4U03VLzXfltEsx
qGaZkIvE1kvRimRf0zlOtJHsZxjZ69kYx2p0ndrZmLNvk5egrSm0j6MyuDmP
oLr1OgrT/ww9Z+676IG7BMY0sfI7T19mHqn3Nq2NbagSQULVEr/tb1tYxfGg
lD66HjWaMWc3YbhpjTE61kCarWp2jnaQtooUW7lASjX3G2sfIxlF8tGk6TLp
mp6MQ2yJLmB5Kis9ltHZpBsDjz6ndfPaJl+ReNsyf03ifb/mvyXxX2SX58/E
VV40hP7qLV/wlgch6sc0mP7m/wGnsUQr4+8BAA==

-->

</rfc>
