<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.34 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-20" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-20"/>
    <author initials="M." surname="Abdalla" fullname="Michel Abdalla">
      <organization>Nexus - San Francisco</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>juliahesse2@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="23"/>
    <workgroup>CFRG</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 161?>

<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 169?>

<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>
          <t>Efficiency: Deployment of CPace is feasible on resource-constrained devices.</t>
        </li>
        <li>
          <t>Versatility: CPace supports different application scenarios via versatile input formats, and by supporting applications with and without clear initiator and responder roles.</t>
        </li>
        <li>
          <t>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.</t>
        </li>
        <li>
          <t>Post-quantum annoyance: CPace comes with measures to slow down adversaries capable of breaking the discrete logarithm problem on elliptic curves.</t>
        </li>
      </ul>
      <section anchor="outline-of-this-document">
        <name>Outline of this document</name>
        <ul spacing="normal">
          <li>
            <t><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.</t>
          </li>
          <li>
            <t><xref target="CipherSuites"/> gives an overview of the recommended
cipher suites for CPace which were optimized for different types of cryptographic
library ecosystems.</t>
          </li>
          <li>
            <t><xref target="Definition"/> introduces the notation used throughout this document.</t>
          </li>
          <li>
            <t><xref target="protocol-section"/> specifies the CPace protocol.</t>
          </li>
          <li>
            <t>The appendix provides code and test vectors of all of the
functions defined for CPace.</t>
          </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. I.e. with CPace the parties start the protocol with a shared secret octet string, namely the password-related string (PRS).
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 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 <em>augmented</em>
PAKE protocols such as OPAQUE <xref target="RFC9807"/>.</t>
      <t>In the course of the CPace protocol, A sends one message to B and B sends one message to A.  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 if and
only if both sides did initiate the protocol using the same protocol inputs, specifically the same PRS and the same value for the input parameters CI, ADa, ADb
and sid that will be specified in section <xref target="OptionalInputs"/>.</t>
      <t>This specification considers different application scenarios. This includes applications aiming at anonymous key exchange and applications that need to
rely on verification of identities of one or both communication partners.
Moreover, when identities are used, they may or may not need to be kept confidential. Depending on the application's requirements, identity information
regarding the communication partners may have to be mandatorily integrated in the input parameters CI, ADa, ADb and the protocol
may have to be executed with clear initiator and responder roles (see <xref target="sec-considerations-ids"/>).</t>
      <t>The naming of ISK 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="OptionalInputs">
        <name>CPace inputs</name>
        <t>For accommodating different application settings, CPace offers the following inputs which, depending on the application scenario, MAY also be the empty string:</t>
        <ul spacing="normal">
          <li>
            <t>Party identity strings (A,B).
In CPace, each party can be  given a party identity string which
might be a device name, a user name, or an URL.
CPace offers two alternative options for authenticating the party identifiers in the course of the protocol run
(see <xref target="sec-considerations-ids"/>).</t>
          </li>
          <li>
            <t>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.
CI could for instance include networking addresses of both parties or party identity strings or service port number identifiers.
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.
Both parties will only establish a common session key if they initiated the protocol with the same view of CI.</t>
          </li>
          <li>
            <t>Associated data fields (ADa and ADb).
These fields can be used for authenticating associated data alongside the CPace protocol.
The ADa and ADb will be sent in clear text as part of the protocol messages.
ADa and ADb will become authenticated in a CPace protocol run as
both parties will only agree on a common key if they have had the same view on ADa and ADb.
Applications that need to rely on the identity of the communication partner may have to integrate identity information in ADa and/or ADb
(see <xref target="sec-considerations-ids"/>).  </t>
            <t>
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 appropriate PRS (respectively password) for this identity.
ADa and ADb could also include application protocol version information (e.g. to avoid downgrade attacks).</t>
          </li>
          <li>
            <t>Session identifier (sid).
If both parties have access to the same unique public octet string sid being specific for a communication session before starting the protocol,
it is RECOMMENDED to use this sid value as an additional input for the protocol as this provides security advantages
and will bind the CPace run to this communication session (see <xref target="sec-considerations"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="optional-cpace-outputs">
        <name>Optional CPace outputs</name>
        <t>If a session identifier is not available as input at protocol start CPace can optionally produce a unique public session identifier sid_output
as output that might be helpful for the application for actions subsequent to the CPace protocol step (see <xref target="sec-sid-output"/>, <xref target="BGHJ24"/>).</t>
      </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:
The application layer is responsible for the handshake that makes parties agree on a common CPace cipher suite.</t>
          </li>
          <li>
            <t>This document does not specify which encodings applications use for the mandatory PRS input and the 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"/>.</t>
          </li>
          <li>
            <t>The application needs to settle whether CPace is used in the initiator-responder or the symmetric setting along the
guidelines of <xref target="sec-considerations-ids"/>. In the symmetric
setting, transcripts ordered string concatenation must be used for generating protocol transcripts.
In this document we will provide test vectors for both the initiator-responder and the symmetric setting.</t>
          </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>
          <t>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.</t>
        </li>
        <li>
          <t>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.</t>
        </li>
      </ul>
      <t>The following RECOMMENDED cipher suites provide higher security margins.</t>
      <ul spacing="normal">
        <li>
          <t>CPACE-X448-SHAKE256. This suite uses the group environment G_X448 defined in <xref target="CPaceMontgomery"/> and SHAKE-256 as hash function.</t>
        </li>
        <li>
          <t>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.</t>
        </li>
        <li>
          <t>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.</t>
        </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="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 additive notation for the group operation.</t>
        <ul spacing="normal">
          <li>
            <t>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 a hash function H.</t>
          </li>
          <li>
            <t>G.sample_scalar() is a function returning a representation of an integer (referred to as "scalar" from now on) appropriate as a
private Diffie-Hellman key for the group.</t>
          </li>
          <li>
            <t>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 = y*g.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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 y*g. Additionally, scalar_mult_vfy specifies validity conditions for y,g and y*g and outputs G.I in case they are not met.</t>
          </li>
          <li>
            <t>G.DSI denotes a domain-separation identifier octet string which SHALL be uniquely identifying the group environment G.</t>
          </li>
        </ul>
      </section>
      <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.</t>
        <t>We use the following notation for referring to the specific properties of a hash function H:</t>
        <ul spacing="normal">
          <li>
            <t>H.hash(m,l) is a function that operates on an input octet string m and returns the first l octets of the hash of m.</t>
          </li>
          <li>
            <t>H.b_in_bytes denotes the <em>minimum</em> output size in bytes for collision resistance for the
security level target 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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>H.s_in_bytes denotes the <em>input block size</em> used by H. This number denotes the maximum number of bytes that can be processed
in a single block before applying the compression function or permutation becomes necessary. (See also <xref target="RFC2104"/> for the corresponding block size concepts).
For instance, for SHA-512 the input block size s_in_bytes is 128 as the compression function can process up to 128 bytes,
while for SHAKE-256 the input block size amounts to 136 bytes before the permutation of the sponge state needs to be applied.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-section">
        <name>Notation for string operations</name>
        <ul spacing="normal">
          <li>
            <t>bytes1 || bytes2 denotes concatenation of octet strings.</t>
          </li>
          <li>
            <t>len(S) denotes the number of octets in an octet string S.</t>
          </li>
          <li>
            <t>This document uses quotation marks "" both for general language (e.g. for citation of notation used in other documents) and
as syntax for specifying octet strings as in b"CPace25519".  </t>
            <t>
We use a preceding lowercase letter b"" in front of the quotation marks if a character sequence is representing an octet string sequence.
I.e., we use the notation convention for byte string representations with single-byte ASCII character encodings from the python programming language.
b"" denotes the empty string of length 0.</t>
          </li>
          <li>
            <t>LEB128 denotes an algorithm that converts an integer to a variable sized string. The algorithm encodes 7 bits per byte starting with the least significant bits in bits #0 to #6.
As long as significant bits remain, bit #7 will be set. This will result in a single-byte encoding for values below 128.
Test vectors and reference code for LEB128 encoding are available in the appendix.</t>
          </li>
          <li>
            <t>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 is encoded using LEB128.
Test vectors and code for prepend_len are available in the appendix.</t>
          </li>
          <li>
            <t>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 reference code is available in the appendix.</t>
          </li>
          <li>
            <t>sample_random_bytes(n) denotes a function that returns n octets, each of which is to be independently sampled from a uniform distribution between 0 and 255.</t>
          </li>
          <li>
            <t>zero_bytes(n) denotes a function that returns n octets with value 0.</t>
          </li>
          <li>
            <t>o_cat(bytes1,bytes2) denotes a function for ordered concatenation of octet strings. It places the lexicographically larger octet
string first and prepends the two bytes from the octet string b"oc" to the result. Reference code for this function is available in the appendix.</t>
          </li>
          <li>
            <t>transcript(Ya,ADa, Yb,ADb) denotes a function outputting an octet string for the protocol transcript.
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_oc(Ya,ADa, Yb,ADb) = o_cat(lv_cat(Ya,ADa),lv_cat(Yb, ADb)) SHALL be used.
In the initiator-responder setting, the implementation transcript_ir(Ya,ADa, Yb,ADb) = lv_cat(Ya,ADa) || lv_cat(Yb, ADb) SHALL be used.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-for-group-operations">
        <name>Notation for group operations</name>
        <t>We use additive notation for the group, i.e., 2*X  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 and H.
Parties will also be provisioned with CI,sid,ADa (for A) and CI,sid,ADb (for B) which will default to the empty
string b"" if not used.</t>
      <t>Party identifiers SHALL be integrated into CI and/or ADa and ADb following the guidelines in <xref target="sec-considerations-ids"/>.</t>
      <t>A sends the public share Ya and associated data ADa to B.
Likewise, B sends the public share Yb and associated data ADb to A.
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>
        <artwork><![CDATA[
                        public: G, H

  A: PRS,ADa,CI,sid         B: PRS,ADb,CI,sid
    ---------------------------------------
 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 Ya and 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 Yb and associated data ADb to A.</t>
        <t>B then computes K = G.scalar_mult_vfy(yb,Ya). B MUST abort if K=G.I.
Otherwise B calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K)||transcript(Ya,ADa,Yb,ADb)). B returns ISK and terminates.</t>
        <t>Likewise upon reception of the message from B,  A computes K = G.scalar_mult_vfy(ya,Yb). A MUST abort if K=G.I.</t>
        <t>Otherwise A calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(Ya,ADa,Yb,ADb)). 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 the transcript views of both parties match.</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 following method for deterministically combining the individual strings PRS, CI, sid and the domain-separation identifier DSI to a generator string:</t>
        <ul spacing="normal">
          <li>
            <t>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).</t>
          </li>
          <li>
            <t>len_zpad = MAX(0, s_in_bytes - len(prepend_len(PRS)) - len(prepend_len(G.DSI)) - 1)</t>
          </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 at least 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). (Code 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 a short 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 and that there is no limitation
regarding the maximum length of the PRS string.</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>
            <t>G_X25519.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_X25519.field_size_bits = 255</t>
          </li>
          <li>
            <t>G_X25519.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X25519(y,g)</t>
          </li>
          <li>
            <t>G_X25519.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.DSI = b"CPace255"</t>
          </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>
            <t>G_X448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_X448.field_size_bits = 448</t>
          </li>
          <li>
            <t>G_X448.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X448(y,g)</t>
          </li>
          <li>
            <t>G_X448.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.DSI = b"CPace448"</t>
          </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>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
        </ul>
        <t>Code for the functions above is available in the appendix.</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="RFC9496"/>.
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>
            <t>G_Ristretto255.DSI = b"CPaceRistretto255"</t>
          </li>
          <li>
            <t>G_Ristretto255.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_Ristretto255.group_size_bits = 252</t>
          </li>
          <li>
            <t>G_Ristretto255.group_order = 2^252 + 27742317777372353535851937790883648493</t>
          </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>
            <t>G_Decaf448.DSI = b"CPaceDecaf448"</t>
          </li>
          <li>
            <t>G_Decaf448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_Decaf448.group_size_bits = 445</t>
          </li>
          <li>
            <t>G_Decaf448.group_order = l = 2^446 -
  1381806680989511535200738674851542
  6880336692474882178609894547503885</t>
          </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>
                <t>Set scalar = sample_random_bytes(G.group_size_bytes).</t>
              </li>
              <li>
                <t>Then clear the most significant bits larger than G.group_size_bits.</t>
              </li>
              <li>
                <t>Interpret the result as the little-endian encoding of an integer value and return the result.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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(y * (_g)), i.e. it returns a value using the public encoding.</t>
          </li>
          <li>
            <t>G.I = is the public encoding representation of the identity element.</t>
          </li>
          <li>
            <t>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( y * decode(X) ).</t>
          </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>
                <t>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.</t>
              </li>
              <li>
                <t>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.</t>
              </li>
              <li>
                <t>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.</t>
              </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 sub steps 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 identity 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>
              <t>With G.group_order we denote the order of the elliptic curve which MUST BE a prime.</t>
            </li>
            <li>
              <t>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.</t>
            </li>
            <li>
              <t>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"/>.</t>
            </li>
            <li>
              <t>G.DSI denotes a domain-separation identifier octet string. G.DSI which SHALL BE obtained by the concatenation of b"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 = b"CPaceP384_XMD:SHA-384_SSWU_NU_".</t>
            </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>
              <t>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 b"_DST".</t>
            </li>
            <li>
              <t>G.sample_scalar() SHALL return a value between 1 and (G.group_order - 1). The sampling SHALL BE indistinguishable from uniform random
selection between 1 and (G.group_order - 1).
It is RECOMMENDED to use a constant-time rejection sampling algorithm for converting a uniform bitstring to a uniform value between 1 and (G.group_order - 1).</t>
            </li>
            <li>
              <t>G.calculate_generator(H, PRS,sid,CI) function SHALL be implemented as follows.  </t>
              <ul spacing="normal">
                <li>
                  <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated.</t>
                </li>
                <li>
                  <t>Then the output of a call to encode_to_curve(gen_str, G.DST) is returned, using the selected suite from <xref target="RFC9380"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>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 s*X or the point (-s)*X 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 s*X or (-s)*X as both points s*X and (-s)*X 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.)</t>
            </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>
                  <t>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.</t>
                </li>
                <li>
                  <t>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 s*X is the neutral element) or the secret shared value "z" defined in <xref target="IEEE1363"/> (otherwise).
"z" SHALL be encoded by using
the big-endian encoding of the x-coordinate of the result point s*X according to <xref target="SEC1"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>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.</t>
            </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 the messages of party A and B and introduce this
in a protocol run. It SHALL be verified that the abort condition is properly handled.</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.
The security analysis in <xref target="BGHJ24"/> extends the analysis from <xref target="AHH21"/> by covering the case that
no pre-agreed session identifier is available. <xref target="BGHJ24"/> also shows how a unique session id sid_output can be generated along with the protocol
for applications that do not have a session identifier input available.</t>
      <section anchor="sec-considerations-ids">
        <name>Party identifiers</name>
        <t>The protocol assures that both communication partners have had the same view on the communication transcripts and the inputs CI and sid.</t>
        <t>If CPace is instantiated without identity strings for A or B in its inputs it will anonymously create a key with any party using the
same PRS and sid values and cannot give any further guarantee regarding the identity of the communication partner.
A protocol instance running on a party P might even be communicating with a second protocol instance also running on P.</t>
        <section anchor="guidance-regarding-party-identifier-integration">
          <name>Guidance regarding party identifier integration</name>
          <t>If an application layer's security relies on CPace for checking party identities, it SHALL integrate the party identifiers that are
to be checked in the CPace protocol run within CI or ADa/ADb as specified below.</t>
          <ul spacing="normal">
            <li>
              <t>If CPace is used in initiator-responder mode, identity strings that are to be authenticated and that are available for
both communication partners at protocol start SHOULD be integrated as part of CI.  </t>
              <t>
If both party identifiers are integrated into CI, the encoding MUST associate the initiator and responder roles with the respective identity strings. It is recommended to place the initiator`s identity first
and the responder`s identity second.  </t>
              <t>
Party identity information included in CI will be kept confidential.</t>
            </li>
            <li>
              <t>Party identities that are not included in CI identity and are to be authenticated by CPace SHALL be integrated in ADa/ADb, such that
A integrates its party identifier in ADa and B integrates its party identifier in ADb. In this case, the application layer SHALL make the recipient
check the party identifier string of the remote communication partner.  </t>
              <t>
Note that identities communicated in ADa or ADb will not be kept confidential.</t>
            </li>
          </ul>
          <t>If ADa and ADb are not guaranteed to be unique, then CPace SHALL be used in initator-responder mode.</t>
          <t>If CPace is to be run in the symmetric mode without initiator and responder roles, the application can always enforce uniqueness of ADa and ADb for all sessions by adding further information such as random data.</t>
        </section>
        <section anchor="rationale-for-the-above-guidance">
          <name>Rationale for the above guidance</name>
          <t>Incorporating party identifier strings is important for fending off attacks based on relaying messages.
Such attacks become for example relevant in a setting where several parties, say, A, B and C, share the same password PRS.
An adversary might relay messages from an 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 share the same PRS value, then A might be using CPace for
establishing a common ISK key with C while assuming to interact with party B.
If a party A is allowing for multiple concurrent sessions, the adversary may also mount an attack relaying messages of A looped back to A such that A actually shares a key with itself <xref target="HS14"/>.</t>
          <t>Integration of party identity strings in CI is to be preferred. This way, the identities may be kept confidential.
If both identities are to be integrated in CI, this is only possible if clear initiator and responder roles are assigned and the encoding of the identities associates the role with the identity string.</t>
          <t>Integration of identity strings in CI also avoids the need of the security-critical subsequent check for the identity strings,
which might be omitted or implemented incorrectly without notice. Integration of identities into CI also strengthens the security properties with respect
to attacks based on quantum computers <xref target="sec-quantum-annoying"/>.</t>
          <t>Applications that integrate identity strings in ADa and/or ADb shall carefully verify implementations for correctness
of the implemented identity checks that the application must carry out after the CPace run.</t>
          <t>When adding randomness guaranteeing for unique values of ADa and ADb then a party running the application can detect for loopback attacks by checking
that the received remote value of ADa/ADb doesn't show up in the list of active local concurrent protocol sessions <xref target="HMSD18"/>.</t>
          <t>If no unique value in ADa and ADb is available or if maintaining state information regarding the list of concurrently active local protocol instances for
verification is impractical in a given application setting, then the loopback attack may be
prevented by assigning initiator and responder role and mandating that a given party implements either the initiator or responder role
for a given PRS password but not both roles with the same (PRS,sid) value set.</t>
          <t>Note that the requirement on party identifiers may differ from what might be intuitively expected as information on the application service
such as service identifiers, port-ids and role information (e.g. client or server role) should be included as part of the party identity.</t>
          <t>For instance, if computers A and B allow for running a protocol with different roles (e.g. both might run several client and a server instances concurrently
on different ports) then a relay attack may successfully generate protocol confusion. E.g. a client instance on A may be maliciously redirected
to a second client instance on B while it expects to be connecting to a server on B. This will work if client and server instances on B share the same
PRS secret and the identity strings do not include information on the respective roles.</t>
        </section>
      </section>
      <section anchor="hashing-protocol-transcripts">
        <name>Hashing protocol transcripts</name>
        <t>CPace prepends the length of all variable-size input strings before hashing data.
Prepending the length 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 <xref target="CDMP05"/>.</t>
      </section>
      <section anchor="key-derivation">
        <name>Key derivation</name>
        <t>A CPace implementation SHALL output ISK but MUST NOT expose K, because a leaked K
may enable offline dictionary attack
on the password, and a matching value for K does not provide authentication of ADa and ADb.</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="sec-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
key confirmation.</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>
            <t>First calculate mac_key as mac_key = H.hash(b"CPaceMac" || sid || ISK).</t>
          </li>
          <li>
            <t>Then let each party send an authenticator tag calculated over the protocol message that it has sent previously. I.e.
let party A calculate its authentication tag Ta as Ta = MAC(mac_key, lv_cat(Ya,ADa)) and let party B calculate its
authentication tag Tb as Tb = MAC(mac_key, lv_cat(Yb,ADb)).</t>
          </li>
          <li>
            <t>Let the receiving party check the remote authentication tag for the correct value and abort in case that it's incorrect.</t>
          </li>
        </ul>
      </section>
      <section anchor="integrating-cpace-in-higher-level-protocols-such-as-tls13">
        <name>Integrating CPace in higher-level protocols such as TLS1.3</name>
        <t>When integrating CPace into a higher-level protocol such as TLS1.3 <xref target="RFC8446"/> it is recommended to use ISK
as shared secret (which might otherwise be generated as part of a Diffie-Hellman key exchange output for other cipher suites).</t>
        <t>Note that unlike the shared secret of a Diffie-Hellman protocol run, ISK will also provide mutual implicit authentication of the protocol partners.
For providing explicit authentication, it is recommended to add a key confirmation round along the lines in <xref target="sec-key-confirmation"/>,
such as e.g. done in the "Finished" messages in TLS1.3 <xref target="RFC8446"/>.</t>
        <t>If an embedding protocol uses more than two messages (e.g. four message TLS1.3 <xref target="RFC8446"/> flows involving
a hello-retry message and a repeated client-hello message) it is suggested
that the CPace layer only considers the two messages used for the CPace run. I.e., it is suggested that
authenticating the full message sequence involving also the additional messages that might precede the two CPace messages
is done under the responsibility of the embedding application protocol.
This could be done by integrating the full protocol transcript as part of a final explicit key confirmation round (as commonly done by TLS 1.3 as part of the "Finished" messages).
Alternatively, information on communication rounds preceding the CPace flows can also be integrated as part of the CI field, as this will authenticate
the information and will not require both communication partners to keep state information regarding preceding messages in memory until after the CPace run.</t>
        <t>In case of TLS 1.3 <xref target="RFC8446"/> it is suggested to integrate Ya into the client-hello message and Yb into the server-hello message. Also party identifiers
might best be added to the client-hello and server-hello messages as part of extension fields.
It is recommended to use the full octet stream encoding of the
client-hello message as parameter ADa. Likewise it is recommended to use the encoding of the server-hello message for the parameter ADb.
This approach has the drawback that the public points Ya and Yb might show up redundantly duplicated in the hashing operation for
CPace's transcript strings but has the advantage of simplicity and the advantage that all meta-information in the extension fields within the
client- and server hello fields will always become authenticated as part of the ISK.</t>
      </section>
      <section anchor="sec-sid-output">
        <name>Calculating a session identifier alongside with the CPace run</name>
        <t>If CPace was run with an empty string sid available as input, both parties can produce a public session identifier string
sid_output = H.hash(b"CPaceSidOutput" || transcript(Ya,ADa,Yb,ADb)) which will be unique for honest parties <xref target="BGHJ24"/>.</t>
      </section>
      <section anchor="sampling-of-scalars">
        <name>Sampling of scalars</name>
        <t>For curves over fields F_q where q 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 the attack surface
with respect to side-channels for embedded systems in hostile environments.
<xref target="AHH21"/> demonstrated that non-uniform sampling did not negatively impact security for the case of Curve25519 and Curve448.
This analysis however does not transfer to most curves in Short-Weierstrass form.</t>
        <t>As a result, we recommend rejection sampling if G is as in <xref target="CPaceWeierstrass"/>. Alternatively an algorithm designed along the lines of the hash_to_field() function from <xref target="RFC9380"/> can also be
used. There, oversampling to an integer significantly larger than the curve order is followed by a modular reduction to the group order.</t>
      </section>
      <section anchor="preconditions-for-using-the-simplified-cpace-specification-from-cpacemontgomery">
        <name>Preconditions for using the simplified CPace specification from <xref target="CPaceMontgomery"/></name>
        <t>The security of the algorithms used for 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>
            <t>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.</t>
          </li>
          <li>
            <t>The cofactor c of the curve MUST BE equal to or an integer multiple of the cofactor c' of the curve's quadratic twist. Also, importantly, the
implementation of the scalar_mult and scalar_mult_vfy
functions must ensure that all scalars actually used for the group operation are integer multiples of
c (e.g. such as asserted by the specification of the decodeScalar functions in <xref target="RFC7748"/>).</t>
          </li>
          <li>
            <t>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. Otherwise the simplified scalar sampling specified in <xref target="CPaceMontgomery"/>
needs to be changed.</t>
          </li>
          <li>
            <t>The representation of the neutral element G.I MUST BE the same for both, the curve and its twist.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
        </ul>
        <t>Algorithms for curves other than the ones recommended here can be based on the principles from <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 the higher-level protocol that integrates CPace is able to establish a unique sid identifier for the communication session,
it is RECOMMENDED that this is passed to CPace as sid parameter.
One suitable option for generating sid is concatenation of 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.
Special care is RECOMMENDED specifically for elliptic curves in Short-Weierstrass form
as important standard documents including <xref target="IEEE1363"/> describe curve operations with
non-constant-time algorithms.</t>
        <t>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.
The mapping algorithm that
converts the generator string to a elliptic curve point SHALL execute in constant time. In <xref target="RFC9380"/> suitable constant-time methods
are available for any elliptic curve.</t>
        <t>Even though the calculate_generator operation might be considered to form the primary target for side-channel attacks as information on long-term secrets might be exposed,
also the subsequent operations on ephemeral values, such as scalar
sampling and scalar multiplication should be protected from side-channels.</t>
      </section>
      <section anchor="large-characteristic-finite-fields">
        <name>Large-characteristic finite fields</name>
        <t>This document intentionally specifies CPace only for use on elliptic curve groups and the security proofs in <xref target="AHH21"/> only cover this case explicitly.
For group environments built upon safe primes additional security analysis will be required. For instance exponential equivalence attacks
may become practical when short exponents are used.</t>
      </section>
      <section anchor="sec-quantum-annoying">
        <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 pre-established session id values
sid forces the adversary to solve one computational Diffie-Hellman problem per password guess <xref target="ES21"/>.
If party identifiers are included as part of CI then the adversary is forced to solve one computational Diffie-Hellman problem per password
guess and party identifier pair.
For this reason it is RECOMMENDED to use the optional inputs sid if available in an application setting.
For the same reason it is RECOMMENDED to integrate party identity strings A,B into CI.</t>
        <t>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="reference-implementation-and-test-vector-generation">
      <name>Reference implementation and test vector generation</name>
      <t>The reference implementation that was used for deriving test vectors is available at <xref target="REFIMP"/>.
The embedded base64-encoded test vectors will decode to JSON files having the test vector's octet strings encoded as base16 (i.e. hexadecimal) strings.</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 anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-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="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="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="RFC9496">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="H. de Valence" initials="H." surname="de Valence"/>
            <author fullname="J. Grigg" initials="J." surname="Grigg"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="I. Lovecruft" initials="I." surname="Lovecruft"/>
            <author fullname="G. Tankersley" initials="G." surname="Tankersley"/>
            <author fullname="F. Valsorda" initials="F." surname="Valsorda"/>
            <date month="December" 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.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9496"/>
          <seriesInfo name="DOI" value="10.17487/RFC9496"/>
        </reference>
      </references>
      <references anchor="sec-informative-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="HS14" target="https://eprint.iacr.org/2014/585.pdf">
          <front>
            <title>The SPEKE Protocol Revisited</title>
            <author initials="F." surname="Hao">
              <organization/>
            </author>
            <author initials="S." surname="Shahandashti">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BGHJ24" target="link.springer.com/chapter/10.1007/978-3-031-68379-4_6">
          <front>
            <title>Bare PAKE: Universally Composable Key Exchange from Just Passwords</title>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="K." surname="Gellert">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HMSD18" target="https://arxiv.org/abs/1802.04900">
          <front>
            <title>Analysing and Patching SPEKE in ISO/IEC</title>
            <author initials="F." surname="Hao">
              <organization/>
            </author>
            <author initials="R." surname="Metere">
              <organization/>
            </author>
            <author initials="S." surname="Sahahandashti">
              <organization/>
            </author>
            <author initials="C." surname="Dong">
              <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="REFIMP" target="https://github.com/cfrg/draft-irtf-cfrg-cpace/tree/master/poc">
          <front>
            <title>CPace reference implementation (sage)</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="September"/>
          </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="RFC9807">
          <front>
            <title>The OPAQUE Augmented Password-Authenticated Key Exchange (aPAKE) Protocol</title>
            <author fullname="D. Bourdrez" initials="D." surname="Bourdrez"/>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="K. Lewi" initials="K." surname="Lewi"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="July" year="2025"/>
            <abstract>
              <t>This document describes the OPAQUE protocol, an Augmented (or Asymmetric) Password-Authenticated Key Exchange (aPAKE) protocol that supports mutual authentication in a client-server setting without reliance on PKI and with security against pre-computation attacks upon server compromise. In addition, the protocol provides forward secrecy and the ability to hide the password from the server, even during password registration. This document specifies the core OPAQUE protocol and one instantiation based on 3DH. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9807"/>
          <seriesInfo name="DOI" value="10.17487/RFC9807"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="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="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="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 970?>

<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>
          <sourcecode type="python"><![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
]]></sourcecode>
        </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 anchor="testvectors-as-json-file-encoded-as-base64">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJwcmVwZW5kX2xlbihiJycpIjogIjAwIiwgImInMTIzNCciOiAiMzEzMjMzMzQiLC
 #AicHJlcGVuZF9sZW4oYicxMjM0JykiOiAiMDQzMTMyMzMzNCIsICJwcmVwZW5kX2xl
 #bihieXRlcyhyYW5nZSgxMjcpKSkiOiAiN0YwMDAxMDIwMzA0MDUwNjA3MDgwOTBBME
 #IwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGMjAyMTIyMjMy
 #NDI1MjYyNzI4MjkyQTJCMkMyRDJFMkYzMDMxMzIzMzM0MzUzNjM3MzgzOTNBM0IzQz
 #NEM0UzRjQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NEE0QjRDNEQ0RTRGNTA1MTUyNTM1NDU1
 #NTY1NzU4NTk1QTVCNUM1RDVFNUY2MDYxNjI2MzY0NjU2NjY3Njg2OTZBNkI2QzZENk
 #U2RjcwNzE3MjczNzQ3NTc2Nzc3ODc5N0E3QjdDN0Q3RSIsICJwcmVwZW5kX2xlbihi
 #eXRlcyhyYW5nZSgxMjgpKSkiOiAiODAwMTAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQj
 #BDMEQwRTBGMTAxMTEyMTMxNDE1MTYxNzE4MTkxQTFCMUMxRDFFMUYyMDIxMjIyMzI0
 #MjUyNjI3MjgyOTJBMkIyQzJEMkUyRjMwMzEzMjMzMzQzNTM2MzczODM5M0EzQjNDM0
 #QzRTNGNDA0MTQyNDM0NDQ1NDY0NzQ4NDk0QTRCNEM0RDRFNEY1MDUxNTI1MzU0NTU1
 #NjU3NTg1OTVBNUI1QzVENUU1RjYwNjE2MjYzNjQ2NTY2Njc2ODY5NkE2QjZDNkQ2RT
 #ZGNzA3MTcyNzM3NDc1NzY3Nzc4Nzk3QTdCN0M3RDdFN0YifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="lvcat-function">
          <name>lv_cat function</name>
          <sourcecode type="python"><![CDATA[
  def lv_cat(*args):
      result = b""
      for arg in args:
          result += prepend_len(arg)
      return result
]]></sourcecode>
        </section>
        <section anchor="testvector-for-lvcat">
          <name>Testvector for lv_cat()</name>
          <artwork><![CDATA[
  lv_cat(b"1234",b"5",b"",b"678"): (length: 12 bytes)
    043132333401350003363738
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-1">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJzEyMzQnIjogIjMxMzIzMzM0IiwgImInNSciOiAiMzUiLCAiYic2NzgnIjogIj
 #M2MzczOCIsICJsdl9jYXQoYicxMjM0JyxiJzUnLGInJyxiJzY3OCcpIjogIjA0MzEz
 #MjMzMzQwMTM1MDAwMzM2MzczOCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="definition-of-generatorstring-function">
        <name>Definition of generator_string function.</name>
        <sourcecode type="python"><![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)
]]></sourcecode>
      </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>
          <sourcecode type="python"><![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)
]]></sourcecode>
        </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>
          <sourcecode type="python"><![CDATA[
  def o_cat(bytes1,bytes2):
      if lexiographically_larger(bytes1,bytes2):
          return b"oc" + bytes1 + bytes2
      else:
          return b"oc" + bytes2 + bytes1
]]></sourcecode>
        </section>
        <section anchor="test-vectors-ordered-concatenation">
          <name>Test vectors ordered concatenation</name>
          <artwork><![CDATA[
  string comparison for o_cat:
    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

  o_cat(b"ABCD",b"BCD"): (length: 9 bytes)
    6f6342434441424344
  o_cat(b"BCD",b"ABCDE"): (length: 10 bytes)
    6f634243444142434445
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-2">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJ0FCQ0QnIjogIjQxNDI0MzQ0IiwgImInQkNEJyI6ICI0MjQzNDQiLCAiYidBQk
 #NERSciOiAiNDE0MjQzNDQ0NSIsICJvX2NhdChiJ0FCQ0QnLGInQkNEJykiOiAiNkY2
 #MzQyNDM0NDQxNDI0MzQ0IiwgIm9fY2F0KGInQkNEJyxiJ0FCQ0RFJykiOiAiNkY2Mz
 #QyNDM0NDQxNDI0MzQ0NDUifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="definitions-for-transcriptir-function">
          <name>Definitions for transcript_ir function</name>
          <sourcecode type="python"><![CDATA[
def transcript_ir(Ya,ADa,Yb,ADb):
    result = lv_cat(Ya,ADa) + lv_cat(Yb,ADb)
    return result
]]></sourcecode>
        </section>
        <section anchor="test-vectors-transcriptir-function">
          <name>Test vectors transcript_ir function</name>
          <artwork><![CDATA[
  transcript_ir(b"123", b"PartyA", b"234",b"PartyB"):
  (length: 22 bytes)
    03313233065061727479410332333406506172747942
  transcript_ir(b"3456",b"PartyA",b"2345",b"PartyB"):
  (length: 24 bytes)
    043334353606506172747941043233343506506172747942
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-3">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJzEyMyciOiAiMzEzMjMzIiwgImInMjM0JyI6ICIzMjMzMzQiLCAiYidQYXJ0eU
 #EnIjogIjUwNjE3Mjc0Nzk0MSIsICJiJ1BhcnR5QiciOiAiNTA2MTcyNzQ3OTQyIiwg
 #ImInMzQ1NiciOiAiMzMzNDM1MzYiLCAiYicyMzQ1JyI6ICIzMjMzMzQzNSIsICJ0cm
 #Fuc2NyaXB0X2lyKGInMTIzJyxiJ1BhcnR5QScsYicyMzQnLGInUGFydHlCJykiOiAi
 #MDMzMTMyMzMwNjUwNjE3Mjc0Nzk0MTAzMzIzMzM0MDY1MDYxNzI3NDc5NDIiLCAidH
 #JhbnNjcmlwdF9pcihiJzM0NTYnLGInUGFydHlBJyxiJzIzNDUnLGInUGFydHlCJyki
 #OiAiMDQzMzM0MzUzNjA2NTA2MTcyNzQ3OTQxMDQzMjMzMzQzNTA2NTA2MTcyNzQ3OT
 #QyIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="definitions-for-transcriptoc-function">
          <name>Definitions for transcript_oc function</name>
          <sourcecode type="python"><![CDATA[
def transcript_oc(Ya,ADa,Yb,ADb):
    result = o_cat(lv_cat(Ya,ADa),lv_cat(Yb,ADb))
    return result
]]></sourcecode>
        </section>
        <section anchor="test-vectors-for-transcriptoc-function">
          <name>Test vectors for transcript_oc function</name>
          <artwork><![CDATA[
  transcript_oc(b"123", b"PartyA", b"234",b"PartyB"):
  (length: 24 bytes)
    6f6303323334065061727479420331323306506172747941
  transcript_oc(b"3456",b"PartyA",b"2345",b"PartyB"):
  (length: 26 bytes)
    6f63043334353606506172747941043233343506506172747942
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-4">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJzEyMyciOiAiMzEzMjMzIiwgImInMjM0JyI6ICIzMjMzMzQiLCAiYidQYXJ0eU
 #EnIjogIjUwNjE3Mjc0Nzk0MSIsICJiJ1BhcnR5QiciOiAiNTA2MTcyNzQ3OTQyIiwg
 #ImInMzQ1NiciOiAiMzMzNDM1MzYiLCAiYicyMzQ1JyI6ICIzMjMzMzQzNSIsICJ0cm
 #Fuc2NyaXB0X29jKGInMTIzJyxiJ1BhcnR5QScsYicyMzQnLGInUGFydHlCJykiOiAi
 #NkY2MzAzMzIzMzM0MDY1MDYxNzI3NDc5NDIwMzMxMzIzMzA2NTA2MTcyNzQ3OTQxIi
 #wgInRyYW5zY3JpcHRfb2MoYiczNDU2JyxiJ1BhcnR5QScsYicyMzQ1JyxiJ1BhcnR5
 #QicpIjogIjZGNjMwNDMzMzQzNTM2MDY1MDYxNzI3NDc5NDEwNDMyMzMzNDM1MDY1MD
 #YxNzI3NDc5NDIifQ==
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="decoding-and-encoding-functions-according-to-rfc7748">
        <name>Decoding and Encoding functions according to RFC7748</name>
        <sourcecode type="python"><![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)])
]]></sourcecode>
      </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>
        <sourcecode type="python"><![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
]]></sourcecode>
        <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>
        <sourcecode type="python"><![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)
]]></sourcecode>
      </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'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      0843506163653235350850617373776f72646d000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572107e4b4791d6a8ef019b936c79fb7f
      2c57
    hash generator string: (length: 32 bytes)
      03998087bdb1a2617bbe25ef5a7c18cd4f84f902328701790958755e
      e4aed1d3
    decoded field element of 255 bits: (length: 32 bytes)
      03998087bdb1a2617bbe25ef5a7c18cd4f84f902328701790958755e
      e4aed153
    generator g: (length: 32 bytes)
      d04bf6d41f6a289632a2e929fa29bebd51092512a7829fdde7d314b6
      2f05a73f
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-5">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDksICJEU0kiOiAiNDM1MDYx
 #NjM2NTMyMzUzNSIsICJDSSI6ICIwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQyNU
 #Y3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0NzkxRDZBOEVGMDE5Qjkz
 #NkM3OUZCN0YyQzU3IiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0ksUFJTLENJLHNpZC
 #xILnNfaW5fYnl0ZXMpIjogIjA4NDM1MDYxNjM2NTMyMzUzNTA4NTA2MTczNzM3NzZG
 #NzI2NDZEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODBCNDE1RjY5NkU2OTc0Njk2MTc0Nk
 #Y3MjBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjEwN0U0QjQ3OTFENkE4RUYwMTlCOTM2
 #Qzc5RkI3RjJDNTciLCAiaGFzaCBnZW5lcmF0b3Igc3RyaW5nIjogIjAzOTk4MDg3Qk
 #RCMUEyNjE3QkJFMjVFRjVBN0MxOENENEY4NEY5MDIzMjg3MDE3OTA5NTg3NTVFRTRB
 #RUQxRDMiLCAiZGVjb2RlZCBmaWVsZCBlbGVtZW50IG9mIDI1NSBiaXRzIjogIjAzOT
 #k4MDg3QkRCMUEyNjE3QkJFMjVFRjVBN0MxOENENEY4NEY5MDIzMjg3MDE3OTA5NTg3
 #NTVFRTRBRUQxNTMiLCAiZ2VuZXJhdG9yIGciOiAiRDA0QkY2RDQxRjZBMjg5NjMyQT
 #JFOTI5RkEyOUJFQkQ1MTA5MjUxMkE3ODI5RkRERTdEMzE0QjYyRjA1QTczRiJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080
  Outputs
    Ya: (length: 32 bytes)
      1d13c89278cdadd826f6d8d7f887701430f8380ddc17611cdd6dc989
      ce0c9f32
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a
  Outputs
    Yb: (length: 32 bytes)
      248cccf6d5cdc3646f0ad593f9e6cef4e69d4945f8372e623512ecea
      32185623
]]></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)
      5b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c37e43ee
      71322c6b
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      5b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c37e43ee
      71322c6b
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      201d13c89278cdadd826f6d8d7f887701430f8380ddc17611cdd6dc9
      89ce0c9f320341446120248cccf6d5cdc3646f0ad593f9e6cef4e69d
      4945f8372e623512ecea3218562303414462
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 137 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c57205b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c3
      7e43ee71322c6b201d13c89278cdadd826f6d8d7f887701430f8380d
      dc17611cdd6dc989ce0c9f320341446120248cccf6d5cdc3646f0ad5
      93f9e6cef4e69d4945f8372e623512ecea3218562303414462
    ISK result: (length: 64 bytes)
      6e19b875f7a561d6b3ca3dbb9ef42ac55de3e717881018204b8922b4
      d5e53bb2aa82c300bea7b65d2b671da71922ddf6472301b79bc270ad
      fa8bf413285f2263
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f6320248cccf6d5cdc3646f0ad593f9e6cef4e69d4945f8372e6235
      12ecea3218562303414462201d13c89278cdadd826f6d8d7f8877014
      30f8380ddc17611cdd6dc989ce0c9f3203414461
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 139 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c57205b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c3
      7e43ee71322c6b6f6320248cccf6d5cdc3646f0ad593f9e6cef4e69d
      4945f8372e623512ecea3218562303414462201d13c89278cdadd826
      f6d8d7f887701430f8380ddc17611cdd6dc989ce0c9f3203414461
    ISK result: (length: 64 bytes)
      eef745e2f6e7ae2b1a1e53da340e777167a07fe150436648c51fb199
      c11f3cbabfc683a2b48e1af5881940dc398d375c95e6b4ae9948a45b
      8770de0656382be4
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      cbc73f62589bbc96ab6a95ec2363df621e93bc3b0cea83ba6b9571d0
      05fa8f5d2d08f7165622777fa484c02a9e6b20a84ee2dbebae8c53be
      757dcfc0eebdeb5f
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      3a504e9c7f1f7fa7314861e2c487d13f28566f3043f0ca760d22c491
      1aca0dd8b1f12a7ad0862eb92d08a76120140412ae6b8322e99d75cf
      1d20d8cfde2b40fe
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0xd0,0x4b,0xf6,0xd4,0x1f,0x6a,0x28,0x96,0x32,0xa2,0xe9,0x29,
 0xfa,0x29,0xbe,0xbd,0x51,0x09,0x25,0x12,0xa7,0x82,0x9f,0xdd,
 0xe7,0xd3,0x14,0xb6,0x2f,0x05,0xa7,0x3f,
};
const unsigned char 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,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x1d,0x13,0xc8,0x92,0x78,0xcd,0xad,0xd8,0x26,0xf6,0xd8,0xd7,
 0xf8,0x87,0x70,0x14,0x30,0xf8,0x38,0x0d,0xdc,0x17,0x61,0x1c,
 0xdd,0x6d,0xc9,0x89,0xce,0x0c,0x9f,0x32,
};
const unsigned char 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,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x24,0x8c,0xcc,0xf6,0xd5,0xcd,0xc3,0x64,0x6f,0x0a,0xd5,0x93,
 0xf9,0xe6,0xce,0xf4,0xe6,0x9d,0x49,0x45,0xf8,0x37,0x2e,0x62,
 0x35,0x12,0xec,0xea,0x32,0x18,0x56,0x23,
};
const unsigned char tc_K[] = {
 0x5b,0x06,0x7e,0xff,0xbd,0xc0,0xb2,0xa0,0xe1,0xd9,0x07,0xb2,
 0x1e,0xbb,0x25,0xcf,0xed,0xb9,0x6a,0x85,0x21,0x79,0xa8,0x47,
 0xc3,0x7e,0x43,0xee,0x71,0x32,0x2c,0x6b,
};
const unsigned char tc_ISK_IR[] = {
 0x6e,0x19,0xb8,0x75,0xf7,0xa5,0x61,0xd6,0xb3,0xca,0x3d,0xbb,
 0x9e,0xf4,0x2a,0xc5,0x5d,0xe3,0xe7,0x17,0x88,0x10,0x18,0x20,
 0x4b,0x89,0x22,0xb4,0xd5,0xe5,0x3b,0xb2,0xaa,0x82,0xc3,0x00,
 0xbe,0xa7,0xb6,0x5d,0x2b,0x67,0x1d,0xa7,0x19,0x22,0xdd,0xf6,
 0x47,0x23,0x01,0xb7,0x9b,0xc2,0x70,0xad,0xfa,0x8b,0xf4,0x13,
 0x28,0x5f,0x22,0x63,
};
const unsigned char tc_ISK_SY[] = {
 0xee,0xf7,0x45,0xe2,0xf6,0xe7,0xae,0x2b,0x1a,0x1e,0x53,0xda,
 0x34,0x0e,0x77,0x71,0x67,0xa0,0x7f,0xe1,0x50,0x43,0x66,0x48,
 0xc5,0x1f,0xb1,0x99,0xc1,0x1f,0x3c,0xba,0xbf,0xc6,0x83,0xa2,
 0xb4,0x8e,0x1a,0xf5,0x88,0x19,0x40,0xdc,0x39,0x8d,0x37,0x5c,
 0x95,0xe6,0xb4,0xae,0x99,0x48,0xa4,0x5b,0x87,0x70,0xde,0x06,
 0x56,0x38,0x2b,0xe4,
};
const unsigned char tc_sid_out_ir[] = {
 0xcb,0xc7,0x3f,0x62,0x58,0x9b,0xbc,0x96,0xab,0x6a,0x95,0xec,
 0x23,0x63,0xdf,0x62,0x1e,0x93,0xbc,0x3b,0x0c,0xea,0x83,0xba,
 0x6b,0x95,0x71,0xd0,0x05,0xfa,0x8f,0x5d,0x2d,0x08,0xf7,0x16,
 0x56,0x22,0x77,0x7f,0xa4,0x84,0xc0,0x2a,0x9e,0x6b,0x20,0xa8,
 0x4e,0xe2,0xdb,0xeb,0xae,0x8c,0x53,0xbe,0x75,0x7d,0xcf,0xc0,
 0xee,0xbd,0xeb,0x5f,
};
const unsigned char tc_sid_out_oc[] = {
 0x3a,0x50,0x4e,0x9c,0x7f,0x1f,0x7f,0xa7,0x31,0x48,0x61,0xe2,
 0xc4,0x87,0xd1,0x3f,0x28,0x56,0x6f,0x30,0x43,0xf0,0xca,0x76,
 0x0d,0x22,0xc4,0x91,0x1a,0xca,0x0d,0xd8,0xb1,0xf1,0x2a,0x7a,
 0xd0,0x86,0x2e,0xb9,0x2d,0x08,0xa7,0x61,0x20,0x14,0x04,0x12,
 0xae,0x6b,0x83,0x22,0xe9,0x9d,0x75,0xcf,0x1d,0x20,0xd8,0xcf,
 0xde,0x2b,0x40,0xfe,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-6">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0
 #NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImciOiAiRDA0QkY2RDQxRjZBMj
 #g5NjMyQTJFOTI5RkEyOUJFQkQ1MTA5MjUxMkE3ODI5RkRERTdEMzE0QjYyRjA1QTcz
 #RiIsICJ5YSI6ICIyMUI0RjRCRDlFNjRFRDM1NUMzRUI2NzZBMjhFQkVEQUY2RDhGMT
 #dCREMzNjU5OTVCMzE5MDk3MTUzMDQ0MDgwIiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEi
 #OiAiMUQxM0M4OTI3OENEQUREODI2RjZEOEQ3Rjg4NzcwMTQzMEY4MzgwRERDMTc2MT
 #FDREQ2REM5ODlDRTBDOUYzMiIsICJ5YiI6ICI4NDhCMDc3OUZGNDE1RjBBRjRFQTE0
 #REY5REQxRDNDMjlBQzQxRDgzNkM3ODA4ODk2QzRFQkExOUM1MUFDNDBBIiwgIkFEYi
 #I6ICI0MTQ0NjIiLCAiWWIiOiAiMjQ4Q0NDRjZENUNEQzM2NDZGMEFENTkzRjlFNkNF
 #RjRFNjlENDk0NUY4MzcyRTYyMzUxMkVDRUEzMjE4NTYyMyIsICJLIjogIjVCMDY3RU
 #ZGQkRDMEIyQTBFMUQ5MDdCMjFFQkIyNUNGRURCOTZBODUyMTc5QTg0N0MzN0U0M0VF
 #NzEzMjJDNkIiLCAiSVNLX0lSIjogIjZFMTlCODc1RjdBNTYxRDZCM0NBM0RCQjlFRj
 #QyQUM1NURFM0U3MTc4ODEwMTgyMDRCODkyMkI0RDVFNTNCQjJBQTgyQzMwMEJFQTdC
 #NjVEMkI2NzFEQTcxOTIyRERGNjQ3MjMwMUI3OUJDMjcwQURGQThCRjQxMzI4NUYyMj
 #YzIiwgIklTS19TWSI6ICJFRUY3NDVFMkY2RTdBRTJCMUExRTUzREEzNDBFNzc3MTY3
 #QTA3RkUxNTA0MzY2NDhDNTFGQjE5OUMxMUYzQ0JBQkZDNjgzQTJCNDhFMUFGNTg4MT
 #k0MERDMzk4RDM3NUM5NUU2QjRBRTk5NDhBNDVCODc3MERFMDY1NjM4MkJFNCIsICJz
 #aWRfb3V0cHV0X2lyIjogIkNCQzczRjYyNTg5QkJDOTZBQjZBOTVFQzIzNjNERjYyMU
 #U5M0JDM0IwQ0VBODNCQTZCOTU3MUQwMDVGQThGNUQyRDA4RjcxNjU2MjI3NzdGQTQ4
 #NEMwMkE5RTZCMjBBODRFRTJEQkVCQUU4QzUzQkU3NTdEQ0ZDMEVFQkRFQjVGIiwgIn
 #NpZF9vdXRwdXRfb2MiOiAiM0E1MDRFOUM3RjFGN0ZBNzMxNDg2MUUyQzQ4N0QxM0Yy
 #ODU2NkYzMDQzRjBDQTc2MEQyMkM0OTExQUNBMEREOEIxRjEyQTdBRDA4NjJFQjkyRD
 #A4QTc2MTIwMTQwNDEyQUU2QjgzMjJFOTlENzVDRjFEMjBEOENGREUyQjQwRkUifQ==
]]></sourcecode>
        </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 message from A or B.

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 anchor="testvectors-as-json-file-encoded-as-base64-7">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkwIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMSI6ICIw
 #MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwIiwgIkludmFsaWQgWTIiOiAiRUNGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsIC
 #JJbnZhbGlkIFkzIjogIkUwRUI3QTdDM0I0MUI4QUUxNjU2RTNGQUYxOUZDNDZBREEw
 #OThERUI5QzMyQjFGRDg2NjIwNTE2NUY0OUI4MDAiLCAiSW52YWxpZCBZNCI6ICI1Rj
 #lDOTVCQ0EzNTA4QzI0QjFEMEIxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIy
 #NEVEREQwOUYxMTU3IiwgIkludmFsaWQgWTUiOiAiRURGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsICJJ
 #bnZhbGlkIFk2IjogIkRBRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNyI6ICJFRUZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRjdGIiwgIkludmFsaWQgWTgiOiAiREJGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbn
 #ZhbGlkIFk5IjogIkQ5RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZMTAiOiAiQ0RFQj
 #dBN0MzQjQxQjhBRTE2NTZFM0ZBRjE5RkM0NkFEQTA5OERFQjlDMzJCMUZEODY2MjA1
 #MTY1RjQ5Qjg4MCIsICJJbnZhbGlkIFkxMSI6ICI0QzlDOTVCQ0EzNTA4QzI0QjFEME
 #IxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIyNEVEREQwOUYxMUQ3In0=
]]></sourcecode>
          </section>
        </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'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 178 bytes)
      0843506163653434380850617373776f726475000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000180b415f
      696e69746961746f720b425f726573706f6e646572105223e0cdc45d
      6575668d64c552004124
    hash generator string: (length: 56 bytes)
      e129c967efb40a175ac2bf4443dfb8c2360d7fba99922b04c19e0986
      a3ef779a6fcf6942c9497adcc90c6db1f03cc0b8680f87df1fd88c35
    decoded field element of 448 bits: (length: 56 bytes)
      e129c967efb40a175ac2bf4443dfb8c2360d7fba99922b04c19e0986
      a3ef779a6fcf6942c9497adcc90c6db1f03cc0b8680f87df1fd88c35
    generator g: (length: 56 bytes)
      9ccb9b0468ea5a8a8193d9d915620f2847565d92449e939b314e76cc
      b1f88b00e5e803e5b65643c17fdba0c2ba839b09ed5873e811ff5a98
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-8">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExNywgIkRTSSI6ICI0MzUw
 #NjE2MzY1MzQzNDM4IiwgIkNJIjogIjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjBCND
 #I1RjcyNjU3MzcwNkY2RTY0NjU3MiIsICJzaWQiOiAiNTIyM0UwQ0RDNDVENjU3NTY2
 #OEQ2NEM1NTIwMDQxMjQiLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2
 #lkLEguc19pbl9ieXRlcykiOiAiMDg0MzUwNjE2MzY1MzQzNDM4MDg1MDYxNzM3Mzc3
 #NkY3MjY0NzUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODBCND
 #E1RjY5NkU2OTc0Njk2MTc0NkY3MjBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjEwNTIy
 #M0UwQ0RDNDVENjU3NTY2OEQ2NEM1NTIwMDQxMjQiLCAiaGFzaCBnZW5lcmF0b3Igc3
 #RyaW5nIjogIkUxMjlDOTY3RUZCNDBBMTc1QUMyQkY0NDQzREZCOEMyMzYwRDdGQkE5
 #OTkyMkIwNEMxOUUwOTg2QTNFRjc3OUE2RkNGNjk0MkM5NDk3QURDQzkwQzZEQjFGMD
 #NDQzBCODY4MEY4N0RGMUZEODhDMzUiLCAiZGVjb2RlZCBmaWVsZCBlbGVtZW50IG9m
 #IDQ0OCBiaXRzIjogIkUxMjlDOTY3RUZCNDBBMTc1QUMyQkY0NDQzREZCOEMyMzYwRD
 #dGQkE5OTkyMkIwNEMxOUUwOTg2QTNFRjc3OUE2RkNGNjk0MkM5NDk3QURDQzkwQzZE
 #QjFGMDNDQzBCODY4MEY4N0RGMUZEODhDMzUiLCAiZ2VuZXJhdG9yIGciOiAiOUNDQj
 #lCMDQ2OEVBNUE4QTgxOTNEOUQ5MTU2MjBGMjg0NzU2NUQ5MjQ0OUU5MzlCMzE0RTc2
 #Q0NCMUY4OEIwMEU1RTgwM0U1QjY1NjQzQzE3RkRCQTBDMkJBODM5QjA5RUQ1ODczRT
 #gxMUZGNUE5OCJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-1">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080516bd083bfcce66121a3072646994c8430cc382b8dc543e8
  Outputs
    Ya: (length: 56 bytes)
      d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef974003ad9d
      3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4cf82eebe0
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-1">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a439caf5e61ec88c307c7d619195229412eaa73fb2a5ea20d
  Outputs
    Yb: (length: 56 bytes)
      89aaf7f3f3b708cecf0e1d2c0fab82817ac6c741291106414a25a474
      187abca5214ca8a3f0b55f6809cbd5316e139b2721afa70dcb0971d3
]]></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)
      0fa58f732254a0708032d764d19b734b5cc890df45ec244d6d522767
      af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0bc028e
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      0fa58f732254a0708032d764d19b734b5cc890df45ec244d6d522767
      af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0bc028e
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-1">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      38d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef974003ad
      9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4cf82eeb
      e0034144613889aaf7f3f3b708cecf0e1d2c0fab82817ac6c7412911
      06414a25a474187abca5214ca8a3f0b55f6809cbd5316e139b2721af
      a70dcb0971d303414462
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 209 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      4124380fa58f732254a0708032d764d19b734b5cc890df45ec244d6d
      522767af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0
      bc028e38d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef97
      4003ad9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4c
      f82eebe0034144613889aaf7f3f3b708cecf0e1d2c0fab82817ac6c7
      41291106414a25a474187abca5214ca8a3f0b55f6809cbd5316e139b
      2721afa70dcb0971d303414462
    ISK result: (length: 64 bytes)
      ff3f4fa2f91e0badf5780ed2b795b97e48bb36d34c3e48cdfa1e7f79
      39ad0d6987a7fda8857b3cca3c311eaab94ce05e6d9bd111bb417ba0
      c91baf14b967eafb
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-1">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f6338d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef9740
      03ad9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4cf8
      2eebe0034144613889aaf7f3f3b708cecf0e1d2c0fab82817ac6c741
      291106414a25a474187abca5214ca8a3f0b55f6809cbd5316e139b27
      21afa70dcb0971d303414462
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 211 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      4124380fa58f732254a0708032d764d19b734b5cc890df45ec244d6d
      522767af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0
      bc028e6f6338d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48a
      ef974003ad9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d
      0a4cf82eebe0034144613889aaf7f3f3b708cecf0e1d2c0fab82817a
      c6c741291106414a25a474187abca5214ca8a3f0b55f6809cbd5316e
      139b2721afa70dcb0971d303414462
    ISK result: (length: 64 bytes)
      0ab598d085cd0bcdca64b58630e53287ef5aa7dbfc209dc9d2e50e0c
      6eb8e5e5ac27987d48e5608a45228c24532821d00fe66c7acc72fccf
      2d14d95d4ee645ed
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-1">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      6ef5882a6a9a323789e418a27c254513412e3c75945e1c0777dc2725
      0a122bc1c64106aedc800a0cd51d35203d2ae09471c1a81448b70a2e
      3715376d9f03b79b
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      5784ff2c7c3dce998db4976cbeccfe0ec3a253a2caf64ae4132f5394
      0390ab5938dbd3c0fddc6d070f8fde384d49898873146b2921ee92a6
      74ac1ca45ca365f4
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-1">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0x9c,0xcb,0x9b,0x04,0x68,0xea,0x5a,0x8a,0x81,0x93,0xd9,0xd9,
 0x15,0x62,0x0f,0x28,0x47,0x56,0x5d,0x92,0x44,0x9e,0x93,0x9b,
 0x31,0x4e,0x76,0xcc,0xb1,0xf8,0x8b,0x00,0xe5,0xe8,0x03,0xe5,
 0xb6,0x56,0x43,0xc1,0x7f,0xdb,0xa0,0xc2,0xba,0x83,0x9b,0x09,
 0xed,0x58,0x73,0xe8,0x11,0xff,0x5a,0x98,
};
const unsigned char 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 unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd8,0xb2,0xcc,0x0f,0xab,0x92,0x98,0xa7,0xa5,0xc6,0x21,0x9f,
 0xb9,0xc2,0xe7,0x7d,0xbd,0xb2,0x26,0x25,0xf4,0x8a,0xef,0x97,
 0x40,0x03,0xad,0x9d,0x3d,0x5b,0x58,0xca,0x4e,0x73,0xa6,0xb7,
 0x03,0x3a,0x3d,0x08,0x3c,0xd7,0x47,0xb5,0x5c,0x6f,0x73,0x45,
 0x46,0x7d,0x0a,0x4c,0xf8,0x2e,0xeb,0xe0,
};
const unsigned char 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 unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x89,0xaa,0xf7,0xf3,0xf3,0xb7,0x08,0xce,0xcf,0x0e,0x1d,0x2c,
 0x0f,0xab,0x82,0x81,0x7a,0xc6,0xc7,0x41,0x29,0x11,0x06,0x41,
 0x4a,0x25,0xa4,0x74,0x18,0x7a,0xbc,0xa5,0x21,0x4c,0xa8,0xa3,
 0xf0,0xb5,0x5f,0x68,0x09,0xcb,0xd5,0x31,0x6e,0x13,0x9b,0x27,
 0x21,0xaf,0xa7,0x0d,0xcb,0x09,0x71,0xd3,
};
const unsigned char tc_K[] = {
 0x0f,0xa5,0x8f,0x73,0x22,0x54,0xa0,0x70,0x80,0x32,0xd7,0x64,
 0xd1,0x9b,0x73,0x4b,0x5c,0xc8,0x90,0xdf,0x45,0xec,0x24,0x4d,
 0x6d,0x52,0x27,0x67,0xaf,0x6b,0xdc,0x80,0x28,0x68,0x68,0x8b,
 0x54,0x3f,0x1a,0x93,0x99,0x0a,0x5b,0x05,0xdd,0x53,0x6c,0x49,
 0xd5,0x72,0x90,0xf2,0xf0,0xbc,0x02,0x8e,
};
const unsigned char tc_ISK_IR[] = {
 0xff,0x3f,0x4f,0xa2,0xf9,0x1e,0x0b,0xad,0xf5,0x78,0x0e,0xd2,
 0xb7,0x95,0xb9,0x7e,0x48,0xbb,0x36,0xd3,0x4c,0x3e,0x48,0xcd,
 0xfa,0x1e,0x7f,0x79,0x39,0xad,0x0d,0x69,0x87,0xa7,0xfd,0xa8,
 0x85,0x7b,0x3c,0xca,0x3c,0x31,0x1e,0xaa,0xb9,0x4c,0xe0,0x5e,
 0x6d,0x9b,0xd1,0x11,0xbb,0x41,0x7b,0xa0,0xc9,0x1b,0xaf,0x14,
 0xb9,0x67,0xea,0xfb,
};
const unsigned char tc_ISK_SY[] = {
 0x0a,0xb5,0x98,0xd0,0x85,0xcd,0x0b,0xcd,0xca,0x64,0xb5,0x86,
 0x30,0xe5,0x32,0x87,0xef,0x5a,0xa7,0xdb,0xfc,0x20,0x9d,0xc9,
 0xd2,0xe5,0x0e,0x0c,0x6e,0xb8,0xe5,0xe5,0xac,0x27,0x98,0x7d,
 0x48,0xe5,0x60,0x8a,0x45,0x22,0x8c,0x24,0x53,0x28,0x21,0xd0,
 0x0f,0xe6,0x6c,0x7a,0xcc,0x72,0xfc,0xcf,0x2d,0x14,0xd9,0x5d,
 0x4e,0xe6,0x45,0xed,
};
const unsigned char tc_sid_out_ir[] = {
 0x6e,0xf5,0x88,0x2a,0x6a,0x9a,0x32,0x37,0x89,0xe4,0x18,0xa2,
 0x7c,0x25,0x45,0x13,0x41,0x2e,0x3c,0x75,0x94,0x5e,0x1c,0x07,
 0x77,0xdc,0x27,0x25,0x0a,0x12,0x2b,0xc1,0xc6,0x41,0x06,0xae,
 0xdc,0x80,0x0a,0x0c,0xd5,0x1d,0x35,0x20,0x3d,0x2a,0xe0,0x94,
 0x71,0xc1,0xa8,0x14,0x48,0xb7,0x0a,0x2e,0x37,0x15,0x37,0x6d,
 0x9f,0x03,0xb7,0x9b,
};
const unsigned char tc_sid_out_oc[] = {
 0x57,0x84,0xff,0x2c,0x7c,0x3d,0xce,0x99,0x8d,0xb4,0x97,0x6c,
 0xbe,0xcc,0xfe,0x0e,0xc3,0xa2,0x53,0xa2,0xca,0xf6,0x4a,0xe4,
 0x13,0x2f,0x53,0x94,0x03,0x90,0xab,0x59,0x38,0xdb,0xd3,0xc0,
 0xfd,0xdc,0x6d,0x07,0x0f,0x8f,0xde,0x38,0x4d,0x49,0x89,0x88,
 0x73,0x14,0x6b,0x29,0x21,0xee,0x92,0xa6,0x74,0xac,0x1c,0xa4,
 0x5c,0xa3,0x65,0xf4,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-9">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjUyMjNF
 #MENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImciOiAiOUNDQjlCMDQ2OEVBNU
 #E4QTgxOTNEOUQ5MTU2MjBGMjg0NzU2NUQ5MjQ0OUU5MzlCMzE0RTc2Q0NCMUY4OEIw
 #MEU1RTgwM0U1QjY1NjQzQzE3RkRCQTBDMkJBODM5QjA5RUQ1ODczRTgxMUZGNUE5OC
 #IsICJ5YSI6ICIyMUI0RjRCRDlFNjRFRDM1NUMzRUI2NzZBMjhFQkVEQUY2RDhGMTdC
 #REMzNjU5OTVCMzE5MDk3MTUzMDQ0MDgwNTE2QkQwODNCRkNDRTY2MTIxQTMwNzI2ND
 #Y5OTRDODQzMENDMzgyQjhEQzU0M0U4IiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEiOiAi
 #RDhCMkNDMEZBQjkyOThBN0E1QzYyMTlGQjlDMkU3N0RCREIyMjYyNUY0OEFFRjk3ND
 #AwM0FEOUQzRDVCNThDQTRFNzNBNkI3MDMzQTNEMDgzQ0Q3NDdCNTVDNkY3MzQ1NDY3
 #RDBBNENGODJFRUJFMCIsICJ5YiI6ICI4NDhCMDc3OUZGNDE1RjBBRjRFQTE0REY5RE
 #QxRDNDMjlBQzQxRDgzNkM3ODA4ODk2QzRFQkExOUM1MUFDNDBBNDM5Q0FGNUU2MUVD
 #ODhDMzA3QzdENjE5MTk1MjI5NDEyRUFBNzNGQjJBNUVBMjBEIiwgIkFEYiI6ICI0MT
 #Q0NjIiLCAiWWIiOiAiODlBQUY3RjNGM0I3MDhDRUNGMEUxRDJDMEZBQjgyODE3QUM2
 #Qzc0MTI5MTEwNjQxNEEyNUE0NzQxODdBQkNBNTIxNENBOEEzRjBCNTVGNjgwOUNCRD
 #UzMTZFMTM5QjI3MjFBRkE3MERDQjA5NzFEMyIsICJLIjogIjBGQTU4RjczMjI1NEEw
 #NzA4MDMyRDc2NEQxOUI3MzRCNUNDODkwREY0NUVDMjQ0RDZENTIyNzY3QUY2QkRDOD
 #AyODY4Njg4QjU0M0YxQTkzOTkwQTVCMDVERDUzNkM0OUQ1NzI5MEYyRjBCQzAyOEUi
 #LCAiSVNLX0lSIjogIkZGM0Y0RkEyRjkxRTBCQURGNTc4MEVEMkI3OTVCOTdFNDhCQj
 #M2RDM0QzNFNDhDREZBMUU3Rjc5MzlBRDBENjk4N0E3RkRBODg1N0IzQ0NBM0MzMTFF
 #QUFCOTRDRTA1RTZEOUJEMTExQkI0MTdCQTBDOTFCQUYxNEI5NjdFQUZCIiwgIklTS1
 #9TWSI6ICIwQUI1OThEMDg1Q0QwQkNEQ0E2NEI1ODYzMEU1MzI4N0VGNUFBN0RCRkMy
 #MDlEQzlEMkU1MEUwQzZFQjhFNUU1QUMyNzk4N0Q0OEU1NjA4QTQ1MjI4QzI0NTMyOD
 #IxRDAwRkU2NkM3QUNDNzJGQ0NGMkQxNEQ5NUQ0RUU2NDVFRCIsICJzaWRfb3V0cHV0
 #X2lyIjogIjZFRjU4ODJBNkE5QTMyMzc4OUU0MThBMjdDMjU0NTEzNDEyRTNDNzU5ND
 #VFMUMwNzc3REMyNzI1MEExMjJCQzFDNjQxMDZBRURDODAwQTBDRDUxRDM1MjAzRDJB
 #RTA5NDcxQzFBODE0NDhCNzBBMkUzNzE1Mzc2RDlGMDNCNzlCIiwgInNpZF9vdXRwdX
 #Rfb2MiOiAiNTc4NEZGMkM3QzNEQ0U5OThEQjQ5NzZDQkVDQ0ZFMEVDM0EyNTNBMkNB
 #RjY0QUU0MTMyRjUzOTQwMzkwQUI1OTM4REJEM0MwRkREQzZEMDcwRjhGREUzODREND
 #k4OTg4NzMxNDZCMjkyMUVFOTJBNjc0QUMxQ0E0NUNBMzY1RjQifQ==
]]></sourcecode>
        </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 from A or B.
]]></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 anchor="testvectors-as-json-file-encoded-as-base64-10">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkxIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMiI6ICIwMT
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwIiwgIkludmFsaWQgWTMiOiAiRkVGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbnZh
 #bGlkIFk0IjogIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNSI6ICIwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGIiwgIlZhbGlkIChvbiBjdXJ2ZSkiOiB7InMiOiAiQUY4QTE0MjE4QkYyQTIw
 #NjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0YxNU
 #ZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FERCIs
 #ICJ1X2N1cnZlIjogIkFCMEM2OEQ3NzJFQzJFQjlERTI1QzQ5NzAwRTQ2RDYzMjVFNj
 #ZENkFBMzlEN0I2NUVCODRBNjhDNTU2OUQ0N0JENzFCNDFGM0UwRDIxMEY0NEUxNDZE
 #RUM4OTI2QjE3NEFDQjNGOTQwQTBCODJDQUIiLCAicmVzX2N1cnZlIjogIjNCMEZBOU
 #JDNDBBNkZEQzc4QzlFMDZGRjdBNTRDMTQzQzVENTJGMzY1NjA3MDUzQkYwNjU2RjUx
 #NDIwNDk2Mjk1RjkxMEExMDFCMzhFREMxQUNEM0JEMjQwRkQ1NURDQjdBMzYwNTUzQj
 #hBNzYyN0UifSwgIlZhbGlkIChvbiB0d2lzdCkiOiB7InMiOiAiQUY4QTE0MjE4QkYy
 #QTIwNjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0
 #YxNUZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FE
 #RCIsICJ1X3R3aXN0IjogIkM5ODFDRDFFMUY3MkQ5QzM1QzdEN0NGNkJFNDI2NzU3Qz
 #BEQzgyMDZBMkZDRkE1NjRBOEU3NjE4QzAzQzBFNjFGOUEyRUIxQzNFMEREOTdENkU5
 #QjEwMTBGNUVERDAzMzk3QTgzRjVBOTE0Q0IzRkYiLCAicmVzX3R3aXN0IjogIkQwQT
 #JCQjdFOUM1QzJDNjI3NzkzRDgzNDJGMjNCNzU5RkU3RDlFMzMyMEE4NUNBNEZENjEz
 #NzYzMzE1MEZGRDlBOTE0OEE5Qjc1QzM0OUZBQzQzRDY0QkVDNDlBNkUxMjZDQzkyQ0
 #JGQkYzNTM5NjEifX0=
]]></sourcecode>
          </section>
        </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'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      11435061636552697374726574746f3235350850617373776f726464
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572107e4b4791d6a8ef019b936c79fb7f
      2c57
    hash result: (length: 64 bytes)
      da6d3ddc8802fca9058755ffd3ebde08a9c2c74945901a258482a288
      b6663af06bf645c93cd1c51512307199c80e84908916d983b34af772
      05f90851a657ee27
    encoded generator g: (length: 32 bytes)
      222b6b195fe84b1652badb6f6a3ae3d24341e7306967f0b8115b40d5
      698c7e56
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-11">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDAsICJEU0kiOiAiNDM1MDYx
 #NjM2NTUyNjk3Mzc0NzI2NTc0NzQ2RjMyMzUzNSIsICJDSSI6ICIwQjQxNUY2OTZFNj
 #k3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdF
 #NEI0NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImdlbmVyYXRvcl9zdHJpbm
 #coRy5EU0ksUFJTLENJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjExNDM1MDYxNjM2NTUy
 #Njk3Mzc0NzI2NTc0NzQ2RjMyMzUzNTA4NTA2MTczNzM3NzZGNzI2NDY0MDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODBCND
 #E1RjY5NkU2OTc0Njk2MTc0NkY3MjBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjEwN0U0
 #QjQ3OTFENkE4RUYwMTlCOTM2Qzc5RkI3RjJDNTciLCAiaGFzaCByZXN1bHQiOiAiRE
 #E2RDNEREM4ODAyRkNBOTA1ODc1NUZGRDNFQkRFMDhBOUMyQzc0OTQ1OTAxQTI1ODQ4
 #MkEyODhCNjY2M0FGMDZCRjY0NUM5M0NEMUM1MTUxMjMwNzE5OUM4MEU4NDkwODkxNk
 #Q5ODNCMzRBRjc3MjA1RjkwODUxQTY1N0VFMjciLCAiZW5jb2RlZCBnZW5lcmF0b3Ig
 #ZyI6ICIyMjJCNkIxOTVGRTg0QjE2NTJCQURCNkY2QTNBRTNEMjQzNDFFNzMwNjk2N0
 #YwQjgxMTVCNDBENTY5OEM3RTU2In0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-2">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      da3d23700a9e5699258aef94dc060dfda5ebb61f02a5ea77fad53f4f
      f0976d08
  Outputs
    Ya: (length: 32 bytes)
      d6bac480f2c386c394efc7c47adb9925dcd2630b64f240c50f8d0eec
      482b9157
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-2">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      d2316b454718c35362d83d69df6320f38578ed5984651435e2949762
      d900b80d
  Outputs
    Yb: (length: 32 bytes)
      3ea7e0b19560d7c0b0f5734f63b955286dfa8232b5ebe63324e2d9e7
      433f7258
]]></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)
      80b69a8a76457ab6a4d7f887a4bf6b55a2f80ac19c333f917a05fc98
      87c8b40f
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      80b69a8a76457ab6a4d7f887a4bf6b55a2f80ac19c333f917a05fc98
      87c8b40f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-2">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      20d6bac480f2c386c394efc7c47adb9925dcd2630b64f240c50f8d0e
      ec482b915703414461203ea7e0b19560d7c0b0f5734f63b955286dfa
      8232b5ebe63324e2d9e7433f725803414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c572080b69a8a76457ab6a4d7f887a4bf6b55
      a2f80ac19c333f917a05fc9887c8b40f20d6bac480f2c386c394efc7
      c47adb9925dcd2630b64f240c50f8d0eec482b915703414461203ea7
      e0b19560d7c0b0f5734f63b955286dfa8232b5ebe63324e2d9e7433f
      725803414462
    ISK result: (length: 64 bytes)
      b69effbf61b51d56401c0f65601abe428de8206feaaf0e32198896dc
      ae7b35cd2b38950a39dfd5d4a79164614c2984f7daa460b588c1e80c
      3fa2068af7900447
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-2">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f6320d6bac480f2c386c394efc7c47adb9925dcd2630b64f240c50f
      8d0eec482b915703414461203ea7e0b19560d7c0b0f5734f63b95528
      6dfa8232b5ebe63324e2d9e7433f725803414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 148 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c572080b69a8a76457ab6a4d7f887a4bf6b55
      a2f80ac19c333f917a05fc9887c8b40f6f6320d6bac480f2c386c394
      efc7c47adb9925dcd2630b64f240c50f8d0eec482b91570341446120
      3ea7e0b19560d7c0b0f5734f63b955286dfa8232b5ebe63324e2d9e7
      433f725803414462
    ISK result: (length: 64 bytes)
      544199d71f62f8d9a1fee55727e24fe4a45844593c2b6013c4fa3969
      d0e5debb2244675c0b43397cbb68d342b01fc0f98fc961469a25134d
      e9f0f813c1a57476
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-2">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      bb1c449b35f0ea79a65c209f329a693d475e0ce2387bed9fe4b78f60
      b2a27c219813fb2cfe175ef40d2222d9261e66da7d78f7c55a303b1b
      8611dcdfab880c47
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      10d5941d4933497fe31b9188d690b84465e2a2d158332a7267284a07
      1a8d0876fc5c8c329dc735d59a9f8ef6623ee23924704a2f929dd631
      ca981227ee82fff2
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-2">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x22,0x2b,0x6b,0x19,0x5f,0xe8,0x4b,0x16,0x52,0xba,0xdb,0x6f,
 0x6a,0x3a,0xe3,0xd2,0x43,0x41,0xe7,0x30,0x69,0x67,0xf0,0xb8,
 0x11,0x5b,0x40,0xd5,0x69,0x8c,0x7e,0x56,
};
const unsigned char 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 unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd6,0xba,0xc4,0x80,0xf2,0xc3,0x86,0xc3,0x94,0xef,0xc7,0xc4,
 0x7a,0xdb,0x99,0x25,0xdc,0xd2,0x63,0x0b,0x64,0xf2,0x40,0xc5,
 0x0f,0x8d,0x0e,0xec,0x48,0x2b,0x91,0x57,
};
const unsigned char 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 unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x3e,0xa7,0xe0,0xb1,0x95,0x60,0xd7,0xc0,0xb0,0xf5,0x73,0x4f,
 0x63,0xb9,0x55,0x28,0x6d,0xfa,0x82,0x32,0xb5,0xeb,0xe6,0x33,
 0x24,0xe2,0xd9,0xe7,0x43,0x3f,0x72,0x58,
};
const unsigned char tc_K[] = {
 0x80,0xb6,0x9a,0x8a,0x76,0x45,0x7a,0xb6,0xa4,0xd7,0xf8,0x87,
 0xa4,0xbf,0x6b,0x55,0xa2,0xf8,0x0a,0xc1,0x9c,0x33,0x3f,0x91,
 0x7a,0x05,0xfc,0x98,0x87,0xc8,0xb4,0x0f,
};
const unsigned char tc_ISK_IR[] = {
 0xb6,0x9e,0xff,0xbf,0x61,0xb5,0x1d,0x56,0x40,0x1c,0x0f,0x65,
 0x60,0x1a,0xbe,0x42,0x8d,0xe8,0x20,0x6f,0xea,0xaf,0x0e,0x32,
 0x19,0x88,0x96,0xdc,0xae,0x7b,0x35,0xcd,0x2b,0x38,0x95,0x0a,
 0x39,0xdf,0xd5,0xd4,0xa7,0x91,0x64,0x61,0x4c,0x29,0x84,0xf7,
 0xda,0xa4,0x60,0xb5,0x88,0xc1,0xe8,0x0c,0x3f,0xa2,0x06,0x8a,
 0xf7,0x90,0x04,0x47,
};
const unsigned char tc_ISK_SY[] = {
 0x54,0x41,0x99,0xd7,0x1f,0x62,0xf8,0xd9,0xa1,0xfe,0xe5,0x57,
 0x27,0xe2,0x4f,0xe4,0xa4,0x58,0x44,0x59,0x3c,0x2b,0x60,0x13,
 0xc4,0xfa,0x39,0x69,0xd0,0xe5,0xde,0xbb,0x22,0x44,0x67,0x5c,
 0x0b,0x43,0x39,0x7c,0xbb,0x68,0xd3,0x42,0xb0,0x1f,0xc0,0xf9,
 0x8f,0xc9,0x61,0x46,0x9a,0x25,0x13,0x4d,0xe9,0xf0,0xf8,0x13,
 0xc1,0xa5,0x74,0x76,
};
const unsigned char tc_sid_out_ir[] = {
 0xbb,0x1c,0x44,0x9b,0x35,0xf0,0xea,0x79,0xa6,0x5c,0x20,0x9f,
 0x32,0x9a,0x69,0x3d,0x47,0x5e,0x0c,0xe2,0x38,0x7b,0xed,0x9f,
 0xe4,0xb7,0x8f,0x60,0xb2,0xa2,0x7c,0x21,0x98,0x13,0xfb,0x2c,
 0xfe,0x17,0x5e,0xf4,0x0d,0x22,0x22,0xd9,0x26,0x1e,0x66,0xda,
 0x7d,0x78,0xf7,0xc5,0x5a,0x30,0x3b,0x1b,0x86,0x11,0xdc,0xdf,
 0xab,0x88,0x0c,0x47,
};
const unsigned char tc_sid_out_oc[] = {
 0x10,0xd5,0x94,0x1d,0x49,0x33,0x49,0x7f,0xe3,0x1b,0x91,0x88,
 0xd6,0x90,0xb8,0x44,0x65,0xe2,0xa2,0xd1,0x58,0x33,0x2a,0x72,
 0x67,0x28,0x4a,0x07,0x1a,0x8d,0x08,0x76,0xfc,0x5c,0x8c,0x32,
 0x9d,0xc7,0x35,0xd5,0x9a,0x9f,0x8e,0xf6,0x62,0x3e,0xe2,0x39,
 0x24,0x70,0x4a,0x2f,0x92,0x9d,0xd6,0x31,0xca,0x98,0x12,0x27,
 0xee,0x82,0xff,0xf2,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-12">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0
 #NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImciOiAiMjIyQjZCMTk1RkU4NE
 #IxNjUyQkFEQjZGNkEzQUUzRDI0MzQxRTczMDY5NjdGMEI4MTE1QjQwRDU2OThDN0U1
 #NiIsICJ5YSI6ICJEQTNEMjM3MDBBOUU1Njk5MjU4QUVGOTREQzA2MERGREE1RUJCNj
 #FGMDJBNUVBNzdGQUQ1M0Y0RkYwOTc2RDA4IiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEi
 #OiAiRDZCQUM0ODBGMkMzODZDMzk0RUZDN0M0N0FEQjk5MjVEQ0QyNjMwQjY0RjI0ME
 #M1MEY4RDBFRUM0ODJCOTE1NyIsICJ5YiI6ICJEMjMxNkI0NTQ3MThDMzUzNjJEODNE
 #NjlERjYzMjBGMzg1NzhFRDU5ODQ2NTE0MzVFMjk0OTc2MkQ5MDBCODBEIiwgIkFEYi
 #I6ICI0MTQ0NjIiLCAiWWIiOiAiM0VBN0UwQjE5NTYwRDdDMEIwRjU3MzRGNjNCOTU1
 #Mjg2REZBODIzMkI1RUJFNjMzMjRFMkQ5RTc0MzNGNzI1OCIsICJLIjogIjgwQjY5QT
 #hBNzY0NTdBQjZBNEQ3Rjg4N0E0QkY2QjU1QTJGODBBQzE5QzMzM0Y5MTdBMDVGQzk4
 #ODdDOEI0MEYiLCAiSVNLX0lSIjogIkI2OUVGRkJGNjFCNTFENTY0MDFDMEY2NTYwMU
 #FCRTQyOERFODIwNkZFQUFGMEUzMjE5ODg5NkRDQUU3QjM1Q0QyQjM4OTUwQTM5REZE
 #NUQ0QTc5MTY0NjE0QzI5ODRGN0RBQTQ2MEI1ODhDMUU4MEMzRkEyMDY4QUY3OTAwND
 #Q3IiwgIklTS19TWSI6ICI1NDQxOTlENzFGNjJGOEQ5QTFGRUU1NTcyN0UyNEZFNEE0
 #NTg0NDU5M0MyQjYwMTNDNEZBMzk2OUQwRTVERUJCMjI0NDY3NUMwQjQzMzk3Q0JCNj
 #hEMzQyQjAxRkMwRjk4RkM5NjE0NjlBMjUxMzRERTlGMEY4MTNDMUE1NzQ3NiIsICJz
 #aWRfb3V0cHV0X2lyIjogIkJCMUM0NDlCMzVGMEVBNzlBNjVDMjA5RjMyOUE2OTNEND
 #c1RTBDRTIzODdCRUQ5RkU0Qjc4RjYwQjJBMjdDMjE5ODEzRkIyQ0ZFMTc1RUY0MEQy
 #MjIyRDkyNjFFNjZEQTdENzhGN0M1NUEzMDNCMUI4NjExRENERkFCODgwQzQ3IiwgIn
 #NpZF9vdXRwdXRfb2MiOiAiMTBENTk0MUQ0OTMzNDk3RkUzMUI5MTg4RDY5MEI4NDQ2
 #NUUyQTJEMTU4MzMyQTcyNjcyODRBMDcxQThEMDg3NkZDNUM4QzMyOURDNzM1RDU5QT
 #lGOEVGNjYyM0VFMjM5MjQ3MDRBMkY5MjlERDYzMUNBOTgxMjI3RUU4MkZGRjIifQ==
]]></sourcecode>
        </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 message of A or B 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 anchor="testvectors-as-json-file-encoded-as-base64-13">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI3Q0QwRTA3NUZBNzk1NUJBNTJDMDI3NTlBNkM5MERCQk
 #ZDMTBFNkQ0MEFFQThEMjgzRTQwN0Q4OENGNTM4QTA1IiwgIlgiOiAiMkMzQzZCOEM0
 #RjM4MDBFN0FFRjY4NjQwMjVCNEVENzlCRDU5OTExN0U0MjdDNDFCRDQ3RDkzRDY1NE
 #I0QTUxQyIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICI3QzEzNjQ1RkU3
 #OTBBNDY4RjYyQzM5QkVCNzM4OEU1NDFEODQwNUQxQURFNjlEMTc3OEM1RkUzRTdGNk
 #I2MDBFIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiN0MxMzY0NUZFNzkwQTQ2
 #OEY2MkMzOUJFQjczODhFNTQxRDg0MDVEMUFERTY5RDE3NzhDNUZFM0U3RjZCNjAwRS
 #J9LCAiSW52YWxpZCBZMSI6ICIyQjNDNkI4QzRGMzgwMEU3QUVGNjg2NDAyNUI0RUQ3
 #OUJENTk5MTE3RTQyN0M0MUJENDdEOTNENjU0QjRBNTFDIiwgIkludmFsaWQgWTIiOi
 #AiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </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'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 178 bytes)
      0d435061636544656361663434380850617373776f72647000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000180b415f
      696e69746961746f720b425f726573706f6e646572105223e0cdc45d
      6575668d64c552004124
    hash result: (length: 112 bytes)
      8ad1e4999548af985785a92cf36c5ba8b75115c7b38359ddb45a7347
      ab381673a3aeaac0edf6aaa666f9f4362d0115d8b9ead3e3b0235de1
      4032c6952ac33ea84af04081bda042548c7bde48a2950cd5a370b786
      e2e5ef832b113f0ba86f46954ea5f1f99b50ce7e65d35ca3a8f93bf6
    encoded generator g: (length: 56 bytes)
      b47b2c3e328ea9f318ca695af65dc838ba5a58bdb8087ae6c6ab486a
      8bfcb13d35b301dddca91d1540a4106d38ba1bf152e5bba104193c7e
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-14">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExMiwgIkRTSSI6ICI0MzUw
 #NjE2MzY1NDQ2NTYzNjE2NjM0MzQzOCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3NDY5Nj
 #E3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjUyMjNFMENE
 #QzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0
 #ksUFJTLENJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjBENDM1MDYxNjM2NTQ0NjU2MzYx
 #NjYzNDM0MzgwODUwNjE3MzczNzc2RjcyNjQ3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMTgwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2
 #NDY1NzIxMDUyMjNFMENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImhhc2ggcm
 #VzdWx0IjogIjhBRDFFNDk5OTU0OEFGOTg1Nzg1QTkyQ0YzNkM1QkE4Qjc1MTE1QzdC
 #MzgzNTlEREI0NUE3MzQ3QUIzODE2NzNBM0FFQUFDMEVERjZBQUE2NjZGOUY0MzYyRD
 #AxMTVEOEI5RUFEM0UzQjAyMzVERTE0MDMyQzY5NTJBQzMzRUE4NEFGMDQwODFCREEw
 #NDI1NDhDN0JERTQ4QTI5NTBDRDVBMzcwQjc4NkUyRTVFRjgzMkIxMTNGMEJBODZGND
 #Y5NTRFQTVGMUY5OUI1MENFN0U2NUQzNUNBM0E4RjkzQkY2IiwgImVuY29kZWQgZ2Vu
 #ZXJhdG9yIGciOiAiQjQ3QjJDM0UzMjhFQTlGMzE4Q0E2OTVBRjY1REM4MzhCQTVBNT
 #hCREI4MDg3QUU2QzZBQjQ4NkE4QkZDQjEzRDM1QjMwMURERENBOTFEMTU0MEE0MTA2
 #RDM4QkExQkYxNTJFNUJCQTEwNDE5M0M3RSJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-3">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      33d561f13cfc0dca279c30e8cde895175dc25483892819eba132d58c
      13c0462a8eb0d73fda941950594bef5191d8394691f86edffcad6c1e
  Outputs
    Ya: (length: 56 bytes)
      d2926adf737d8dfe46ae47cdd0a56bbcdad96958512d39f9865ad1b6
      4b5304d4d1696983cd6d38d57e3cdb1080262198b5d4c497c64926a5
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-3">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      2523c969f68fa2b2aea294c2539ef36eb1e0558abd14712a7828f16a
      85ed2c7e77e2bdd418994405fb1b57b6bbaadd66849892aac9d81402
  Outputs
    Yb: (length: 56 bytes)
      2e620e5d0bc4637f1ff97ddccb015141b2c3241b4abcb5931a7e22a9
      9fe256ae543733ce4e4c41826dda142fbfeb2639727a5233f8f0a42a
]]></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)
      ee0c0ead075ed5637e167cd3e16415c114aee6e21adaddc0de9151b2
      930833e2862f4e4ec30c91de5c5249a724d9114860f2bcbbb6ca83fd
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      ee0c0ead075ed5637e167cd3e16415c114aee6e21adaddc0de9151b2
      930833e2862f4e4ec30c91de5c5249a724d9114860f2bcbbb6ca83fd
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-3">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      38d2926adf737d8dfe46ae47cdd0a56bbcdad96958512d39f9865ad1
      b64b5304d4d1696983cd6d38d57e3cdb1080262198b5d4c497c64926
      a503414461382e620e5d0bc4637f1ff97ddccb015141b2c3241b4abc
      b5931a7e22a99fe256ae543733ce4e4c41826dda142fbfeb2639727a
      5233f8f0a42a03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438ee0c0ead075ed5637e167cd3e16415c114aee6e2
      1adaddc0de9151b2930833e2862f4e4ec30c91de5c5249a724d91148
      60f2bcbbb6ca83fd38d2926adf737d8dfe46ae47cdd0a56bbcdad969
      58512d39f9865ad1b64b5304d4d1696983cd6d38d57e3cdb10802621
      98b5d4c497c64926a503414461382e620e5d0bc4637f1ff97ddccb01
      5141b2c3241b4abcb5931a7e22a99fe256ae543733ce4e4c41826dda
      142fbfeb2639727a5233f8f0a42a03414462
    ISK result: (length: 64 bytes)
      6f3a66ce20e1bad279d32d65844cd66b7352eb61a9eb37631168fe80
      3c83c6601c6a3e0867f4b2dbe2b0cb1b530912892d2b5eb9af2e3ab3
      d8682a33e178d1d2
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-3">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f6338d2926adf737d8dfe46ae47cdd0a56bbcdad96958512d39f986
      5ad1b64b5304d4d1696983cd6d38d57e3cdb1080262198b5d4c497c6
      4926a503414461382e620e5d0bc4637f1ff97ddccb015141b2c3241b
      4abcb5931a7e22a99fe256ae543733ce4e4c41826dda142fbfeb2639
      727a5233f8f0a42a03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 216 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438ee0c0ead075ed5637e167cd3e16415c114aee6e2
      1adaddc0de9151b2930833e2862f4e4ec30c91de5c5249a724d91148
      60f2bcbbb6ca83fd6f6338d2926adf737d8dfe46ae47cdd0a56bbcda
      d96958512d39f9865ad1b64b5304d4d1696983cd6d38d57e3cdb1080
      262198b5d4c497c64926a503414461382e620e5d0bc4637f1ff97ddc
      cb015141b2c3241b4abcb5931a7e22a99fe256ae543733ce4e4c4182
      6dda142fbfeb2639727a5233f8f0a42a03414462
    ISK result: (length: 64 bytes)
      59012b30b7a4050d1e83f7157da6cdd5baf77bf432f545e7baa1a2a1
      0bc29ef1345f9cfe2fb448bfe8a48a470d90d94cd73e4c99fc1c8b65
      1d43fb3ebed3a88f
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-3">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      9b3fb936e2b9d00da70841392bf012f3d0c1bcf0a8861020f7882b0d
      7f1e54eaf6e4d850ea4ed3169e630f2968d69e19338ae23d74febf00
      3b41600b0de91ad6
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      dfdf19db27b99dbf0a8943ee6a5395b48664e3930bdb0cf5a4e79646
      52e2ceafaee3645ee668a047f3fb259affac4eaec76014c2a01d2064
      9e96a19abde0cd22
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-3">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0xb4,0x7b,0x2c,0x3e,0x32,0x8e,0xa9,0xf3,0x18,0xca,0x69,0x5a,
 0xf6,0x5d,0xc8,0x38,0xba,0x5a,0x58,0xbd,0xb8,0x08,0x7a,0xe6,
 0xc6,0xab,0x48,0x6a,0x8b,0xfc,0xb1,0x3d,0x35,0xb3,0x01,0xdd,
 0xdc,0xa9,0x1d,0x15,0x40,0xa4,0x10,0x6d,0x38,0xba,0x1b,0xf1,
 0x52,0xe5,0xbb,0xa1,0x04,0x19,0x3c,0x7e,
};
const unsigned char tc_ya[] = {
 0x33,0xd5,0x61,0xf1,0x3c,0xfc,0x0d,0xca,0x27,0x9c,0x30,0xe8,
 0xcd,0xe8,0x95,0x17,0x5d,0xc2,0x54,0x83,0x89,0x28,0x19,0xeb,
 0xa1,0x32,0xd5,0x8c,0x13,0xc0,0x46,0x2a,0x8e,0xb0,0xd7,0x3f,
 0xda,0x94,0x19,0x50,0x59,0x4b,0xef,0x51,0x91,0xd8,0x39,0x46,
 0x91,0xf8,0x6e,0xdf,0xfc,0xad,0x6c,0x1e,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd2,0x92,0x6a,0xdf,0x73,0x7d,0x8d,0xfe,0x46,0xae,0x47,0xcd,
 0xd0,0xa5,0x6b,0xbc,0xda,0xd9,0x69,0x58,0x51,0x2d,0x39,0xf9,
 0x86,0x5a,0xd1,0xb6,0x4b,0x53,0x04,0xd4,0xd1,0x69,0x69,0x83,
 0xcd,0x6d,0x38,0xd5,0x7e,0x3c,0xdb,0x10,0x80,0x26,0x21,0x98,
 0xb5,0xd4,0xc4,0x97,0xc6,0x49,0x26,0xa5,
};
const unsigned char tc_yb[] = {
 0x25,0x23,0xc9,0x69,0xf6,0x8f,0xa2,0xb2,0xae,0xa2,0x94,0xc2,
 0x53,0x9e,0xf3,0x6e,0xb1,0xe0,0x55,0x8a,0xbd,0x14,0x71,0x2a,
 0x78,0x28,0xf1,0x6a,0x85,0xed,0x2c,0x7e,0x77,0xe2,0xbd,0xd4,
 0x18,0x99,0x44,0x05,0xfb,0x1b,0x57,0xb6,0xbb,0xaa,0xdd,0x66,
 0x84,0x98,0x92,0xaa,0xc9,0xd8,0x14,0x02,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x2e,0x62,0x0e,0x5d,0x0b,0xc4,0x63,0x7f,0x1f,0xf9,0x7d,0xdc,
 0xcb,0x01,0x51,0x41,0xb2,0xc3,0x24,0x1b,0x4a,0xbc,0xb5,0x93,
 0x1a,0x7e,0x22,0xa9,0x9f,0xe2,0x56,0xae,0x54,0x37,0x33,0xce,
 0x4e,0x4c,0x41,0x82,0x6d,0xda,0x14,0x2f,0xbf,0xeb,0x26,0x39,
 0x72,0x7a,0x52,0x33,0xf8,0xf0,0xa4,0x2a,
};
const unsigned char tc_K[] = {
 0xee,0x0c,0x0e,0xad,0x07,0x5e,0xd5,0x63,0x7e,0x16,0x7c,0xd3,
 0xe1,0x64,0x15,0xc1,0x14,0xae,0xe6,0xe2,0x1a,0xda,0xdd,0xc0,
 0xde,0x91,0x51,0xb2,0x93,0x08,0x33,0xe2,0x86,0x2f,0x4e,0x4e,
 0xc3,0x0c,0x91,0xde,0x5c,0x52,0x49,0xa7,0x24,0xd9,0x11,0x48,
 0x60,0xf2,0xbc,0xbb,0xb6,0xca,0x83,0xfd,
};
const unsigned char tc_ISK_IR[] = {
 0x6f,0x3a,0x66,0xce,0x20,0xe1,0xba,0xd2,0x79,0xd3,0x2d,0x65,
 0x84,0x4c,0xd6,0x6b,0x73,0x52,0xeb,0x61,0xa9,0xeb,0x37,0x63,
 0x11,0x68,0xfe,0x80,0x3c,0x83,0xc6,0x60,0x1c,0x6a,0x3e,0x08,
 0x67,0xf4,0xb2,0xdb,0xe2,0xb0,0xcb,0x1b,0x53,0x09,0x12,0x89,
 0x2d,0x2b,0x5e,0xb9,0xaf,0x2e,0x3a,0xb3,0xd8,0x68,0x2a,0x33,
 0xe1,0x78,0xd1,0xd2,
};
const unsigned char tc_ISK_SY[] = {
 0x59,0x01,0x2b,0x30,0xb7,0xa4,0x05,0x0d,0x1e,0x83,0xf7,0x15,
 0x7d,0xa6,0xcd,0xd5,0xba,0xf7,0x7b,0xf4,0x32,0xf5,0x45,0xe7,
 0xba,0xa1,0xa2,0xa1,0x0b,0xc2,0x9e,0xf1,0x34,0x5f,0x9c,0xfe,
 0x2f,0xb4,0x48,0xbf,0xe8,0xa4,0x8a,0x47,0x0d,0x90,0xd9,0x4c,
 0xd7,0x3e,0x4c,0x99,0xfc,0x1c,0x8b,0x65,0x1d,0x43,0xfb,0x3e,
 0xbe,0xd3,0xa8,0x8f,
};
const unsigned char tc_sid_out_ir[] = {
 0x9b,0x3f,0xb9,0x36,0xe2,0xb9,0xd0,0x0d,0xa7,0x08,0x41,0x39,
 0x2b,0xf0,0x12,0xf3,0xd0,0xc1,0xbc,0xf0,0xa8,0x86,0x10,0x20,
 0xf7,0x88,0x2b,0x0d,0x7f,0x1e,0x54,0xea,0xf6,0xe4,0xd8,0x50,
 0xea,0x4e,0xd3,0x16,0x9e,0x63,0x0f,0x29,0x68,0xd6,0x9e,0x19,
 0x33,0x8a,0xe2,0x3d,0x74,0xfe,0xbf,0x00,0x3b,0x41,0x60,0x0b,
 0x0d,0xe9,0x1a,0xd6,
};
const unsigned char tc_sid_out_oc[] = {
 0xdf,0xdf,0x19,0xdb,0x27,0xb9,0x9d,0xbf,0x0a,0x89,0x43,0xee,
 0x6a,0x53,0x95,0xb4,0x86,0x64,0xe3,0x93,0x0b,0xdb,0x0c,0xf5,
 0xa4,0xe7,0x96,0x46,0x52,0xe2,0xce,0xaf,0xae,0xe3,0x64,0x5e,
 0xe6,0x68,0xa0,0x47,0xf3,0xfb,0x25,0x9a,0xff,0xac,0x4e,0xae,
 0xc7,0x60,0x14,0xc2,0xa0,0x1d,0x20,0x64,0x9e,0x96,0xa1,0x9a,
 0xbd,0xe0,0xcd,0x22,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-15">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjUyMjNF
 #MENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImciOiAiQjQ3QjJDM0UzMjhFQT
 #lGMzE4Q0E2OTVBRjY1REM4MzhCQTVBNThCREI4MDg3QUU2QzZBQjQ4NkE4QkZDQjEz
 #RDM1QjMwMURERENBOTFEMTU0MEE0MTA2RDM4QkExQkYxNTJFNUJCQTEwNDE5M0M3RS
 #IsICJ5YSI6ICIzM0Q1NjFGMTNDRkMwRENBMjc5QzMwRThDREU4OTUxNzVEQzI1NDgz
 #ODkyODE5RUJBMTMyRDU4QzEzQzA0NjJBOEVCMEQ3M0ZEQTk0MTk1MDU5NEJFRjUxOT
 #FEODM5NDY5MUY4NkVERkZDQUQ2QzFFIiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEiOiAi
 #RDI5MjZBREY3MzdEOERGRTQ2QUU0N0NERDBBNTZCQkNEQUQ5Njk1ODUxMkQzOUY5OD
 #Y1QUQxQjY0QjUzMDRENEQxNjk2OTgzQ0Q2RDM4RDU3RTNDREIxMDgwMjYyMTk4QjVE
 #NEM0OTdDNjQ5MjZBNSIsICJ5YiI6ICIyNTIzQzk2OUY2OEZBMkIyQUVBMjk0QzI1Mz
 #lFRjM2RUIxRTA1NThBQkQxNDcxMkE3ODI4RjE2QTg1RUQyQzdFNzdFMkJERDQxODk5
 #NDQwNUZCMUI1N0I2QkJBQURENjY4NDk4OTJBQUM5RDgxNDAyIiwgIkFEYiI6ICI0MT
 #Q0NjIiLCAiWWIiOiAiMkU2MjBFNUQwQkM0NjM3RjFGRjk3RERDQ0IwMTUxNDFCMkMz
 #MjQxQjRBQkNCNTkzMUE3RTIyQTk5RkUyNTZBRTU0MzczM0NFNEU0QzQxODI2RERBMT
 #QyRkJGRUIyNjM5NzI3QTUyMzNGOEYwQTQyQSIsICJLIjogIkVFMEMwRUFEMDc1RUQ1
 #NjM3RTE2N0NEM0UxNjQxNUMxMTRBRUU2RTIxQURBRERDMERFOTE1MUIyOTMwODMzRT
 #I4NjJGNEU0RUMzMEM5MURFNUM1MjQ5QTcyNEQ5MTE0ODYwRjJCQ0JCQjZDQTgzRkQi
 #LCAiSVNLX0lSIjogIjZGM0E2NkNFMjBFMUJBRDI3OUQzMkQ2NTg0NENENjZCNzM1Mk
 #VCNjFBOUVCMzc2MzExNjhGRTgwM0M4M0M2NjAxQzZBM0UwODY3RjRCMkRCRTJCMENC
 #MUI1MzA5MTI4OTJEMkI1RUI5QUYyRTNBQjNEODY4MkEzM0UxNzhEMUQyIiwgIklTS1
 #9TWSI6ICI1OTAxMkIzMEI3QTQwNTBEMUU4M0Y3MTU3REE2Q0RENUJBRjc3QkY0MzJG
 #NTQ1RTdCQUExQTJBMTBCQzI5RUYxMzQ1RjlDRkUyRkI0NDhCRkU4QTQ4QTQ3MEQ5ME
 #Q5NENENzNFNEM5OUZDMUM4QjY1MUQ0M0ZCM0VCRUQzQTg4RiIsICJzaWRfb3V0cHV0
 #X2lyIjogIjlCM0ZCOTM2RTJCOUQwMERBNzA4NDEzOTJCRjAxMkYzRDBDMUJDRjBBOD
 #g2MTAyMEY3ODgyQjBEN0YxRTU0RUFGNkU0RDg1MEVBNEVEMzE2OUU2MzBGMjk2OEQ2
 #OUUxOTMzOEFFMjNENzRGRUJGMDAzQjQxNjAwQjBERTkxQUQ2IiwgInNpZF9vdXRwdX
 #Rfb2MiOiAiREZERjE5REIyN0I5OURCRjBBODk0M0VFNkE1Mzk1QjQ4NjY0RTM5MzBC
 #REIwQ0Y1QTRFNzk2NDY1MkUyQ0VBRkFFRTM2NDVFRTY2OEEwNDdGM0ZCMjU5QUZGQU
 #M0RUFFQzc2MDE0QzJBMDFEMjA2NDlFOTZBMTlBQkRFMENEMjIifQ==
]]></sourcecode>
        </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 message of A or B 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 anchor="testvectors-as-json-file-encoded-as-base64-16">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJERDFCQzcwMTVEQUFCQjc2NzIxMjlDQzM1QTNCQTgxNT
 #Q4NkIxMzlERUZGOUJERUNBN0E0RkM2MTM0MzIzRDM0NjU4NzYxRTkwRkYwNzk5NzJB
 #N0NBOEFBNTYwNjQ5OEY0RjRGMEVCQzA5MzNBODE5IiwgIlgiOiAiNjAxNDMxRDVFNT
 #FGNDNENDIyQTkyRDNGQjIzNzNCREUyODIxN0FBQjQyNTI0QzM0MUFBNDA0RUFCQTVB
 #QTU1NDFGNzA0MkRCQjMyNTNDRTRDOTBGNzcyQjAzOEE0MTNEQ0IzQTBGNkJGM0FFOU
 #UyMSIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICIzODhCMzVDNjBFQjQx
 #QjY2MDg1QTIxMTgzMTYyMTg2ODFENzg5NzlENjY3NzAyREUxMDVGREMxRjIxRkZFOD
 #g0QTU3N0Q3OTVGNDU2OTE3ODEzOTBBMjI5QTNCRDdCNTI3RTgzMTM4MEYyRjU4NUE0
 #IiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiMzg4QjM1QzYwRUI0MUI2NjA4NU
 #EyMTE4MzE2MjE4NjgxRDc4OTc5RDY2NzcwMkRFMTA1RkRDMUYyMUZGRTg4NEE1NzdE
 #Nzk1RjQ1NjkxNzgxMzkwQTIyOUEzQkQ3QjUyN0U4MzEzODBGMkY1ODVBNCJ9LCAiSW
 #52YWxpZCBZMSI6ICI1RjE0MzFENUU1MUY0M0Q0MjJBOTJEM0ZCMjM3M0JERTI4MjE3
 #QUFCNDI1MjRDMzQxQUE0MDRFQUJBNUFBNTU0MUY3MDQyREJCMzI1M0NFNEM5MEY3Nz
 #JCMDM4QTQxM0RDQjNBMEY2QkYzQUU5RTIxIiwgIkludmFsaWQgWTIiOiAiMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </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'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 34b36454cab2e7842c389f7d88ecb7df
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 106 bytes)
      1e4350616365503235365f584d443a5348412d3235365f535357555f
      4e555f0850617373776f726417000000000000000000000000000000
      0000000000000000180b415f696e69746961746f720b425f72657370
      6f6e6465721034b36454cab2e7842c389f7d88ecb7df
    generator g: (length: 65 bytes)
      0439bff2b051701594d3e9c7e93be9213af15db42214dfc4f7ee929a
      6697f774d7ba5fb289b982399e4acd281a988bf058ea7ff6d7ff34fd
      b72157bb464ff4af87
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-17">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0yNTYiLCAiSC5zX2luX2J5dGVzIjogNjQsICJQUlMiOiAiNTA2MT
 #czNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDIzLCAiRFNJIjogIjQzNTA2MTYz
 #NjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4NDEyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNT
 #U1RiIsICJDSSI6ICIwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3
 #MDZGNkU2NDY1NzIiLCAic2lkIjogIjM0QjM2NDU0Q0FCMkU3ODQyQzM4OUY3RDg4RU
 #NCN0RGIiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0ksUFJTLENJLHNpZCxILnNfaW5f
 #Ynl0ZXMpIjogIjFFNDM1MDYxNjM2NTUwMzIzNTM2NUY1ODRENDQzQTUzNDg0MTJEMz
 #IzNTM2NUY1MzUzNTc1NTVGNEU1NTVGMDg1MDYxNzM3Mzc3NkY3MjY0MTcwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTgwQjQxNUY2OT
 #ZFNjk3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIxMDM0QjM2NDU0
 #Q0FCMkU3ODQyQzM4OUY3RDg4RUNCN0RGIiwgImdlbmVyYXRvciBnIjogIjA0MzlCRk
 #YyQjA1MTcwMTU5NEQzRTlDN0U5M0JFOTIxM0FGMTVEQjQyMjE0REZDNEY3RUU5MjlB
 #NjY5N0Y3NzREN0JBNUZCMjg5Qjk4MjM5OUU0QUNEMjgxQTk4OEJGMDU4RUE3RkY2RD
 #dGRjM0RkRCNzIxNTdCQjQ2NEZGNEFGODcifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-4">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 32 bytes)
      37574cfbf1b95ff6a8e2d7be462d4d01e6dde2618f34f4de9df869b2
      4f532c5d
  Outputs
    Ya: (length: 65 bytes)
      04cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901ef962
      c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16fc19c3
      2a7b31aab097919736
    Alternative correct value for Ya: (-ya)*g:
    (length: 65 bytes)
      04cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901ef962
      c2e2d486b208c7d9c2925a5570d01e7a51d325a782072d85ea03e63c
      d584ce554f686e68c9
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-4">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 32 bytes)
      e5672fc9eb4e721f41d80181ec4c9fd9886668acc48024d33c82bb10
      2aecba52
  Outputs
    Yb: (length: 65 bytes)
      046f538f9b8eb4e628bcace0fbba7d36fea44e98334d233c22101a2f
      28eb3afc1a61b2bd14c0f11b222b5ea34df7756d104e2b5da09c9e8f
      fa330c150f47e84cef
    Alternative correct value for Yb: (-yb)*g:
    (length: 65 bytes)
      046f538f9b8eb4e628bcace0fbba7d36fea44e98334d233c22101a2f
      28eb3afc1a9e4d42ea3f0ee4ded4a15cb2088a92efb1d4a260636170
      05ccf3eaf0b817b310
]]></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)
      9dd152b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb
      3a0db812
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      9dd152b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb
      3a0db812
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-4">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 140 bytes)
      4104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901ef9
      62c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16fc19
      c32a7b31aab0979197360341446141046f538f9b8eb4e628bcace0fb
      ba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0f11b22
      2b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef03414462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 225 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df209dd152
      b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb3a0db8
      124104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901e
      f962c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16fc
      19c32a7b31aab0979197360341446141046f538f9b8eb4e628bcace0
      fbba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0f11b
      222b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef034144
      62
    ISK result: (length: 32 bytes)
      d67704f1c69b85736f273e73198a79fe5e4f60cb405e32f708e0aff5
      fdb5f9db
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-4">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 142 bytes)
      6f634104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b90
      1ef962c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16
      fc19c32a7b31aab0979197360341446141046f538f9b8eb4e628bcac
      e0fbba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0f1
      1b222b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef0341
      4462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 227 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df209dd152
      b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb3a0db8
      126f634104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b
      901ef962c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a
      16fc19c32a7b31aab0979197360341446141046f538f9b8eb4e628bc
      ace0fbba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0
      f11b222b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef03
      414462
    ISK result: (length: 32 bytes)
      724ffa2de3685f12a10bb2eb013cb6c0378acef40b78f5b21dbd69f7
      2478e32b
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-4">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      28e98006db715c2de9817e847f937336ba510ed288cd55a6e7b020d0
      c85e74fe
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      dc11fd7db69958c3bd30d72171377444261975c599fa6e85f73bac00
      a85ad5c3
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-4">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x34,0xb3,0x64,0x54,0xca,0xb2,0xe7,0x84,0x2c,0x38,0x9f,0x7d,
 0x88,0xec,0xb7,0xdf,
};
const unsigned char tc_g[] = {
 0x04,0x39,0xbf,0xf2,0xb0,0x51,0x70,0x15,0x94,0xd3,0xe9,0xc7,
 0xe9,0x3b,0xe9,0x21,0x3a,0xf1,0x5d,0xb4,0x22,0x14,0xdf,0xc4,
 0xf7,0xee,0x92,0x9a,0x66,0x97,0xf7,0x74,0xd7,0xba,0x5f,0xb2,
 0x89,0xb9,0x82,0x39,0x9e,0x4a,0xcd,0x28,0x1a,0x98,0x8b,0xf0,
 0x58,0xea,0x7f,0xf6,0xd7,0xff,0x34,0xfd,0xb7,0x21,0x57,0xbb,
 0x46,0x4f,0xf4,0xaf,0x87,
};
const unsigned char 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 unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0xcf,0x55,0xf0,0xa5,0x3a,0x1b,0x4c,0x43,0x00,0x2e,0x1b,
 0xe8,0x17,0x1f,0x42,0x73,0x7c,0xf2,0x0b,0x7c,0xd6,0x17,0x7b,
 0x90,0x1e,0xf9,0x62,0xc2,0xe2,0xd4,0x86,0xb2,0xf7,0x38,0x26,
 0x3c,0x6d,0xa5,0xaa,0x90,0x2f,0xe1,0x85,0xae,0x2c,0xda,0x58,
 0x7d,0xf8,0xd2,0x7a,0x16,0xfc,0x19,0xc3,0x2a,0x7b,0x31,0xaa,
 0xb0,0x97,0x91,0x97,0x36,
};
const unsigned char 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 unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x6f,0x53,0x8f,0x9b,0x8e,0xb4,0xe6,0x28,0xbc,0xac,0xe0,
 0xfb,0xba,0x7d,0x36,0xfe,0xa4,0x4e,0x98,0x33,0x4d,0x23,0x3c,
 0x22,0x10,0x1a,0x2f,0x28,0xeb,0x3a,0xfc,0x1a,0x61,0xb2,0xbd,
 0x14,0xc0,0xf1,0x1b,0x22,0x2b,0x5e,0xa3,0x4d,0xf7,0x75,0x6d,
 0x10,0x4e,0x2b,0x5d,0xa0,0x9c,0x9e,0x8f,0xfa,0x33,0x0c,0x15,
 0x0f,0x47,0xe8,0x4c,0xef,
};
const unsigned char tc_K[] = {
 0x9d,0xd1,0x52,0xb6,0x87,0xde,0xd1,0xe0,0x71,0xcc,0x06,0x25,
 0xbd,0x1f,0xff,0xf4,0xc4,0xcc,0xd7,0xd7,0x7c,0xb4,0x98,0x7c,
 0x7d,0x1e,0x4e,0xcb,0x3a,0x0d,0xb8,0x12,
};
const unsigned char tc_ISK_IR[] = {
 0xd6,0x77,0x04,0xf1,0xc6,0x9b,0x85,0x73,0x6f,0x27,0x3e,0x73,
 0x19,0x8a,0x79,0xfe,0x5e,0x4f,0x60,0xcb,0x40,0x5e,0x32,0xf7,
 0x08,0xe0,0xaf,0xf5,0xfd,0xb5,0xf9,0xdb,
};
const unsigned char tc_ISK_SY[] = {
 0x72,0x4f,0xfa,0x2d,0xe3,0x68,0x5f,0x12,0xa1,0x0b,0xb2,0xeb,
 0x01,0x3c,0xb6,0xc0,0x37,0x8a,0xce,0xf4,0x0b,0x78,0xf5,0xb2,
 0x1d,0xbd,0x69,0xf7,0x24,0x78,0xe3,0x2b,
};
const unsigned char tc_sid_out_ir[] = {
 0x28,0xe9,0x80,0x06,0xdb,0x71,0x5c,0x2d,0xe9,0x81,0x7e,0x84,
 0x7f,0x93,0x73,0x36,0xba,0x51,0x0e,0xd2,0x88,0xcd,0x55,0xa6,
 0xe7,0xb0,0x20,0xd0,0xc8,0x5e,0x74,0xfe,
};
const unsigned char tc_sid_out_oc[] = {
 0xdc,0x11,0xfd,0x7d,0xb6,0x99,0x58,0xc3,0xbd,0x30,0xd7,0x21,
 0x71,0x37,0x74,0x44,0x26,0x19,0x75,0xc5,0x99,0xfa,0x6e,0x85,
 0xf7,0x3b,0xac,0x00,0xa8,0x5a,0xd5,0xc3,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-18">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjM0QjM2
 #NDU0Q0FCMkU3ODQyQzM4OUY3RDg4RUNCN0RGIiwgImciOiAiMDQzOUJGRjJCMDUxNz
 #AxNTk0RDNFOUM3RTkzQkU5MjEzQUYxNURCNDIyMTRERkM0RjdFRTkyOUE2Njk3Rjc3
 #NEQ3QkE1RkIyODlCOTgyMzk5RTRBQ0QyODFBOTg4QkYwNThFQTdGRjZEN0ZGMzRGRE
 #I3MjE1N0JCNDY0RkY0QUY4NyIsICJ5YSI6ICIzNzU3NENGQkYxQjk1RkY2QThFMkQ3
 #QkU0NjJENEQwMUU2RERFMjYxOEYzNEY0REU5REY4NjlCMjRGNTMyQzVEIiwgIkFEYS
 #I6ICI0MTQ0NjEiLCAiWWEiOiAiMDRDRjU1RjBBNTNBMUI0QzQzMDAyRTFCRTgxNzFG
 #NDI3MzdDRjIwQjdDRDYxNzdCOTAxRUY5NjJDMkUyRDQ4NkIyRjczODI2M0M2REE1QU
 #E5MDJGRTE4NUFFMkNEQTU4N0RGOEQyN0ExNkZDMTlDMzJBN0IzMUFBQjA5NzkxOTcz
 #NiIsICJ5YiI6ICJFNTY3MkZDOUVCNEU3MjFGNDFEODAxODFFQzRDOUZEOTg4NjY2OE
 #FDQzQ4MDI0RDMzQzgyQkIxMDJBRUNCQTUyIiwgIkFEYiI6ICI0MTQ0NjIiLCAiWWIi
 #OiAiMDQ2RjUzOEY5QjhFQjRFNjI4QkNBQ0UwRkJCQTdEMzZGRUE0NEU5ODMzNEQyMz
 #NDMjIxMDFBMkYyOEVCM0FGQzFBNjFCMkJEMTRDMEYxMUIyMjJCNUVBMzRERjc3NTZE
 #MTA0RTJCNURBMDlDOUU4RkZBMzMwQzE1MEY0N0U4NENFRiIsICJLIjogIjlERDE1Mk
 #I2ODdERUQxRTA3MUNDMDYyNUJEMUZGRkY0QzRDQ0Q3RDc3Q0I0OTg3QzdEMUU0RUNC
 #M0EwREI4MTIiLCAiSVNLX0lSIjogIkQ2NzcwNEYxQzY5Qjg1NzM2RjI3M0U3MzE5OE
 #E3OUZFNUU0RjYwQ0I0MDVFMzJGNzA4RTBBRkY1RkRCNUY5REIiLCAiSVNLX1NZIjog
 #IjcyNEZGQTJERTM2ODVGMTJBMTBCQjJFQjAxM0NCNkMwMzc4QUNFRjQwQjc4RjVCMj
 #FEQkQ2OUY3MjQ3OEUzMkIiLCAic2lkX291dHB1dF9pciI6ICIyOEU5ODAwNkRCNzE1
 #QzJERTk4MTdFODQ3RjkzNzMzNkJBNTEwRUQyODhDRDU1QTZFN0IwMjBEMEM4NUU3NE
 #ZFIiwgInNpZF9vdXRwdXRfb2MiOiAiREMxMUZEN0RCNjk5NThDM0JEMzBENzIxNzEz
 #Nzc0NDQyNjE5NzVDNTk5RkE2RTg1RjczQkFDMDBBODVBRDVDMyJ9
]]></sourcecode>
        </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 messages of A or B 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 anchor="testvectors-as-json-file-encoded-as-base64-19">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJGMDEyNTAxQzA5MUZGOUI5OUExMjNGRkZFNTcxRDhCQz
 #AxRTgwNzdFRTU4MTM2MkUxQkQyMTM5OTA4MzU2NDNCIiwgIlgiOiAiMDQyNDY0OEVC
 #OTg2QzJCRTBBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRD
 #EyQkE0RTBGNzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3
 #MzQ2RDEwQTRBQjI1MTRGQUVGNTgzMSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bG
 #wgY29vcmRpbmF0ZXMpIjogIjA0RjVBMTkxRjA3OEM4N0MzNjYzM0I3OEM3MDE3NTEx
 #NTlENTZDNTlGM0ZFOTEwNUI1NzIwNjczNDcwRjMwM0FCOTI1QjZBN0ZEMUNERDhGNj
 #Q5QTIxQ0YzNkI2OEQ5RTlDNEExMTkxOUE5NTE4OTI1MTk3ODYxMDRCMjcwMzM3NTci
 #LCAiRy5zY2FsYXJfbXVsdF92ZnkocyxYKSAob25seSBYLWNvb3JkaW5hdGUpIjogIk
 #Y1QTE5MUYwNzhDODdDMzY2MzNCNzhDNzAxNzUxMTU5RDU2QzU5RjNGRTkxMDVCNTcy
 #MDY3MzQ3MEYzMDNBQjkifSwgIkludmFsaWQgWTEiOiAiMDQyNDY0OEVCOTg2QzJCRT
 #BBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRDEyQkE0RTBG
 #NzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3MzQ2RDEwQT
 #RBQjI1MTRGQUVGNTg1NyIsICJJbnZhbGlkIFkyIjogIjAwIn0=
]]></sourcecode>
          </section>
        </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'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 5b3773aa90e8f23c61563a4b645b276c
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      1e4350616365503338345f584d443a5348412d3338345f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572105b3773aa90e8f23c61563a4b645b
      276c
    generator g: (length: 97 bytes)
      04d938e00eaa8d44fcac33dd5d10404f0c57e0fb1dfdcca3fae47a6a
      14bbe52a6ac82a856d9de14e0223a1e1a5bd3fb38be951af748723f8
      f64835217ad5bc05a4fc0e1d7c17cf14c3bda93d05cef96b86483fc5
      f51570fc27f0a3c19cd2ece2a2
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-20">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0zODQiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0ODQxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMEI0MjVGNzI2NTcz
 #NzA2RjZFNjQ2NTcyIiwgInNpZCI6ICI1QjM3NzNBQTkwRThGMjNDNjE1NjNBNEI2ND
 #VCMjc2QyIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2lu
 #X2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDMzMzgzNDVGNTg0RDQ0M0E1MzQ4NDEyRD
 #MzMzgzNDVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDU3MDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMTgwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQy
 #NUY3MjY1NzM3MDZGNkU2NDY1NzIxMDVCMzc3M0FBOTBFOEYyM0M2MTU2M0E0QjY0NU
 #IyNzZDIiwgImdlbmVyYXRvciBnIjogIjA0RDkzOEUwMEVBQThENDRGQ0FDMzNERDVE
 #MTA0MDRGMEM1N0UwRkIxREZEQ0NBM0ZBRTQ3QTZBMTRCQkU1MkE2QUM4MkE4NTZEOU
 #RFMTRFMDIyM0ExRTFBNUJEM0ZCMzhCRTk1MUFGNzQ4NzIzRjhGNjQ4MzUyMTdBRDVC
 #QzA1QTRGQzBFMUQ3QzE3Q0YxNEMzQkRBOTNEMDVDRUY5NkI4NjQ4M0ZDNUY1MTU3ME
 #ZDMjdGMEEzQzE5Q0QyRUNFMkEyIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-5">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 48 bytes)
      ef433dd5ad142c860e7cb6400dd315d388d5ec5420c550e9d6f0907f
      375d988bc4d704837e43561c497e7dd93edcdb9d
  Outputs
    Ya: (length: 97 bytes)
      043973faff49d85b1a14f114d0550a8ec0e5defcc7399c2e19003251
      b1ddb9e786489b66be3cf8601880bd426a8a52f96968229d35032ac9
      cc3ef6c1fd67ce1f7979bb1be9f4ff63e34fc6df42ebb481989596f6
      3c6bd987fffd2527bdfd6b05d6
    Alternative correct value for Ya: (-ya)*g:
    (length: 97 bytes)
      043973faff49d85b1a14f114d0550a8ec0e5defcc7399c2e19003251
      b1ddb9e786489b66be3cf8601880bd426a8a52f96997dd62cafcd536
      33c1093e029831e0868644e4160b009c1cb03920bd144b7e666a6909
      c29426780002dad8430294fa29
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-5">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 48 bytes)
      50b0e36b95a2edfaa8342b843dddc90b175330f2399c1b36586dedda
      3c255975f30be6a750f9404fccc62a6323b5e471
  Outputs
    Yb: (length: 97 bytes)
      04a94b80cc266671a00ef719ee249bda79cbf66788784611e9c18835
      2ac7dbf23f730a4c3ea320e7a27a657ac336e7ee9c9bf49a5dcb715b
      b9b2ac2e5433bba61b2b186b7d6a539015096f351b36df579469d50a
      2f7ca1c615bd7e28633e5faefb
    Alternative correct value for Yb: (-yb)*g:
    (length: 97 bytes)
      04a94b80cc266671a00ef719ee249bda79cbf66788784611e9c18835
      2ac7dbf23f730a4c3ea320e7a27a657ac336e7ee9c640b65a2348ea4
      464d53d1abcc4459e4d4e7948295ac6feaf690cae4c920a86a962af5
      cf835e39ea4281d79dc1a05104
]]></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)
      03ad91b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502
      397903b464768f57d2ef19fda00542dc7636031f
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      03ad91b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502
      397903b464768f57d2ef19fda00542dc7636031f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-5">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 204 bytes)
      61043973faff49d85b1a14f114d0550a8ec0e5defcc7399c2e190032
      51b1ddb9e786489b66be3cf8601880bd426a8a52f96968229d35032a
      c9cc3ef6c1fd67ce1f7979bb1be9f4ff63e34fc6df42ebb481989596
      f63c6bd987fffd2527bdfd6b05d6034144616104a94b80cc266671a0
      0ef719ee249bda79cbf66788784611e9c188352ac7dbf23f730a4c3e
      a320e7a27a657ac336e7ee9c9bf49a5dcb715bb9b2ac2e5433bba61b
      2b186b7d6a539015096f351b36df579469d50a2f7ca1c615bd7e2863
      3e5faefb03414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 305 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c3003ad91
      b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502397903
      b464768f57d2ef19fda00542dc7636031f61043973faff49d85b1a14
      f114d0550a8ec0e5defcc7399c2e19003251b1ddb9e786489b66be3c
      f8601880bd426a8a52f96968229d35032ac9cc3ef6c1fd67ce1f7979
      bb1be9f4ff63e34fc6df42ebb481989596f63c6bd987fffd2527bdfd
      6b05d6034144616104a94b80cc266671a00ef719ee249bda79cbf667
      88784611e9c188352ac7dbf23f730a4c3ea320e7a27a657ac336e7ee
      9c9bf49a5dcb715bb9b2ac2e5433bba61b2b186b7d6a539015096f35
      1b36df579469d50a2f7ca1c615bd7e28633e5faefb03414462
    ISK result: (length: 48 bytes)
      407d3e94916138a8a0cd3b6b64cdbd9a665fd83e706508649bc43b04
      7b73cf27017d2cc74533f18a5075a6748de5a026
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-5">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 206 bytes)
      6f636104a94b80cc266671a00ef719ee249bda79cbf66788784611e9
      c188352ac7dbf23f730a4c3ea320e7a27a657ac336e7ee9c9bf49a5d
      cb715bb9b2ac2e5433bba61b2b186b7d6a539015096f351b36df5794
      69d50a2f7ca1c615bd7e28633e5faefb0341446261043973faff49d8
      5b1a14f114d0550a8ec0e5defcc7399c2e19003251b1ddb9e786489b
      66be3cf8601880bd426a8a52f96968229d35032ac9cc3ef6c1fd67ce
      1f7979bb1be9f4ff63e34fc6df42ebb481989596f63c6bd987fffd25
      27bdfd6b05d603414461
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 307 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c3003ad91
      b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502397903
      b464768f57d2ef19fda00542dc7636031f6f636104a94b80cc266671
      a00ef719ee249bda79cbf66788784611e9c188352ac7dbf23f730a4c
      3ea320e7a27a657ac336e7ee9c9bf49a5dcb715bb9b2ac2e5433bba6
      1b2b186b7d6a539015096f351b36df579469d50a2f7ca1c615bd7e28
      633e5faefb0341446261043973faff49d85b1a14f114d0550a8ec0e5
      defcc7399c2e19003251b1ddb9e786489b66be3cf8601880bd426a8a
      52f96968229d35032ac9cc3ef6c1fd67ce1f7979bb1be9f4ff63e34f
      c6df42ebb481989596f63c6bd987fffd2527bdfd6b05d603414461
    ISK result: (length: 48 bytes)
      b2c28ddad4a77680469bd090bad8098d1c22e7050553acdacd13614d
      eed72bb7821c50ddc4b30b4b54151e07077d1985
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-5">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      ad0247e90c1124ce6da6f62d55daf30fada0b08160164bb93ccd5a2d
      f9750b91a4517184872e2bcfb4fff83bbad02371
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      4c7b6523ae4c7a5df9d709b59dd1b033152040715391c7ed7c60a12c
      c3f40e251fbda5b78c63bc465dac5ca6046f3fc0
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-5">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x5b,0x37,0x73,0xaa,0x90,0xe8,0xf2,0x3c,0x61,0x56,0x3a,0x4b,
 0x64,0x5b,0x27,0x6c,
};
const unsigned char tc_g[] = {
 0x04,0xd9,0x38,0xe0,0x0e,0xaa,0x8d,0x44,0xfc,0xac,0x33,0xdd,
 0x5d,0x10,0x40,0x4f,0x0c,0x57,0xe0,0xfb,0x1d,0xfd,0xcc,0xa3,
 0xfa,0xe4,0x7a,0x6a,0x14,0xbb,0xe5,0x2a,0x6a,0xc8,0x2a,0x85,
 0x6d,0x9d,0xe1,0x4e,0x02,0x23,0xa1,0xe1,0xa5,0xbd,0x3f,0xb3,
 0x8b,0xe9,0x51,0xaf,0x74,0x87,0x23,0xf8,0xf6,0x48,0x35,0x21,
 0x7a,0xd5,0xbc,0x05,0xa4,0xfc,0x0e,0x1d,0x7c,0x17,0xcf,0x14,
 0xc3,0xbd,0xa9,0x3d,0x05,0xce,0xf9,0x6b,0x86,0x48,0x3f,0xc5,
 0xf5,0x15,0x70,0xfc,0x27,0xf0,0xa3,0xc1,0x9c,0xd2,0xec,0xe2,
 0xa2,
};
const unsigned char tc_ya[] = {
 0xef,0x43,0x3d,0xd5,0xad,0x14,0x2c,0x86,0x0e,0x7c,0xb6,0x40,
 0x0d,0xd3,0x15,0xd3,0x88,0xd5,0xec,0x54,0x20,0xc5,0x50,0xe9,
 0xd6,0xf0,0x90,0x7f,0x37,0x5d,0x98,0x8b,0xc4,0xd7,0x04,0x83,
 0x7e,0x43,0x56,0x1c,0x49,0x7e,0x7d,0xd9,0x3e,0xdc,0xdb,0x9d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x39,0x73,0xfa,0xff,0x49,0xd8,0x5b,0x1a,0x14,0xf1,0x14,
 0xd0,0x55,0x0a,0x8e,0xc0,0xe5,0xde,0xfc,0xc7,0x39,0x9c,0x2e,
 0x19,0x00,0x32,0x51,0xb1,0xdd,0xb9,0xe7,0x86,0x48,0x9b,0x66,
 0xbe,0x3c,0xf8,0x60,0x18,0x80,0xbd,0x42,0x6a,0x8a,0x52,0xf9,
 0x69,0x68,0x22,0x9d,0x35,0x03,0x2a,0xc9,0xcc,0x3e,0xf6,0xc1,
 0xfd,0x67,0xce,0x1f,0x79,0x79,0xbb,0x1b,0xe9,0xf4,0xff,0x63,
 0xe3,0x4f,0xc6,0xdf,0x42,0xeb,0xb4,0x81,0x98,0x95,0x96,0xf6,
 0x3c,0x6b,0xd9,0x87,0xff,0xfd,0x25,0x27,0xbd,0xfd,0x6b,0x05,
 0xd6,
};
const unsigned char tc_yb[] = {
 0x50,0xb0,0xe3,0x6b,0x95,0xa2,0xed,0xfa,0xa8,0x34,0x2b,0x84,
 0x3d,0xdd,0xc9,0x0b,0x17,0x53,0x30,0xf2,0x39,0x9c,0x1b,0x36,
 0x58,0x6d,0xed,0xda,0x3c,0x25,0x59,0x75,0xf3,0x0b,0xe6,0xa7,
 0x50,0xf9,0x40,0x4f,0xcc,0xc6,0x2a,0x63,0x23,0xb5,0xe4,0x71,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0xa9,0x4b,0x80,0xcc,0x26,0x66,0x71,0xa0,0x0e,0xf7,0x19,
 0xee,0x24,0x9b,0xda,0x79,0xcb,0xf6,0x67,0x88,0x78,0x46,0x11,
 0xe9,0xc1,0x88,0x35,0x2a,0xc7,0xdb,0xf2,0x3f,0x73,0x0a,0x4c,
 0x3e,0xa3,0x20,0xe7,0xa2,0x7a,0x65,0x7a,0xc3,0x36,0xe7,0xee,
 0x9c,0x9b,0xf4,0x9a,0x5d,0xcb,0x71,0x5b,0xb9,0xb2,0xac,0x2e,
 0x54,0x33,0xbb,0xa6,0x1b,0x2b,0x18,0x6b,0x7d,0x6a,0x53,0x90,
 0x15,0x09,0x6f,0x35,0x1b,0x36,0xdf,0x57,0x94,0x69,0xd5,0x0a,
 0x2f,0x7c,0xa1,0xc6,0x15,0xbd,0x7e,0x28,0x63,0x3e,0x5f,0xae,
 0xfb,
};
const unsigned char tc_K[] = {
 0x03,0xad,0x91,0xb0,0x3f,0x83,0x12,0xfd,0xd6,0xaa,0x19,0x86,
 0xda,0xfc,0x68,0x4a,0xdb,0x2d,0x93,0xa1,0x24,0x8e,0x99,0xa2,
 0x28,0x43,0xc5,0x02,0x39,0x79,0x03,0xb4,0x64,0x76,0x8f,0x57,
 0xd2,0xef,0x19,0xfd,0xa0,0x05,0x42,0xdc,0x76,0x36,0x03,0x1f,
};
const unsigned char tc_ISK_IR[] = {
 0x40,0x7d,0x3e,0x94,0x91,0x61,0x38,0xa8,0xa0,0xcd,0x3b,0x6b,
 0x64,0xcd,0xbd,0x9a,0x66,0x5f,0xd8,0x3e,0x70,0x65,0x08,0x64,
 0x9b,0xc4,0x3b,0x04,0x7b,0x73,0xcf,0x27,0x01,0x7d,0x2c,0xc7,
 0x45,0x33,0xf1,0x8a,0x50,0x75,0xa6,0x74,0x8d,0xe5,0xa0,0x26,
};
const unsigned char tc_ISK_SY[] = {
 0xb2,0xc2,0x8d,0xda,0xd4,0xa7,0x76,0x80,0x46,0x9b,0xd0,0x90,
 0xba,0xd8,0x09,0x8d,0x1c,0x22,0xe7,0x05,0x05,0x53,0xac,0xda,
 0xcd,0x13,0x61,0x4d,0xee,0xd7,0x2b,0xb7,0x82,0x1c,0x50,0xdd,
 0xc4,0xb3,0x0b,0x4b,0x54,0x15,0x1e,0x07,0x07,0x7d,0x19,0x85,
};
const unsigned char tc_sid_out_ir[] = {
 0xad,0x02,0x47,0xe9,0x0c,0x11,0x24,0xce,0x6d,0xa6,0xf6,0x2d,
 0x55,0xda,0xf3,0x0f,0xad,0xa0,0xb0,0x81,0x60,0x16,0x4b,0xb9,
 0x3c,0xcd,0x5a,0x2d,0xf9,0x75,0x0b,0x91,0xa4,0x51,0x71,0x84,
 0x87,0x2e,0x2b,0xcf,0xb4,0xff,0xf8,0x3b,0xba,0xd0,0x23,0x71,
};
const unsigned char tc_sid_out_oc[] = {
 0x4c,0x7b,0x65,0x23,0xae,0x4c,0x7a,0x5d,0xf9,0xd7,0x09,0xb5,
 0x9d,0xd1,0xb0,0x33,0x15,0x20,0x40,0x71,0x53,0x91,0xc7,0xed,
 0x7c,0x60,0xa1,0x2c,0xc3,0xf4,0x0e,0x25,0x1f,0xbd,0xa5,0xb7,
 0x8c,0x63,0xbc,0x46,0x5d,0xac,0x5c,0xa6,0x04,0x6f,0x3f,0xc0,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-21">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjVCMzc3
 #M0FBOTBFOEYyM0M2MTU2M0E0QjY0NUIyNzZDIiwgImciOiAiMDREOTM4RTAwRUFBOE
 #Q0NEZDQUMzM0RENUQxMDQwNEYwQzU3RTBGQjFERkRDQ0EzRkFFNDdBNkExNEJCRTUy
 #QTZBQzgyQTg1NkQ5REUxNEUwMjIzQTFFMUE1QkQzRkIzOEJFOTUxQUY3NDg3MjNGOE
 #Y2NDgzNTIxN0FENUJDMDVBNEZDMEUxRDdDMTdDRjE0QzNCREE5M0QwNUNFRjk2Qjg2
 #NDgzRkM1RjUxNTcwRkMyN0YwQTNDMTlDRDJFQ0UyQTIiLCAieWEiOiAiRUY0MzNERD
 #VBRDE0MkM4NjBFN0NCNjQwMEREMzE1RDM4OEQ1RUM1NDIwQzU1MEU5RDZGMDkwN0Yz
 #NzVEOTg4QkM0RDcwNDgzN0U0MzU2MUM0OTdFN0REOTNFRENEQjlEIiwgIkFEYSI6IC
 #I0MTQ0NjEiLCAiWWEiOiAiMDQzOTczRkFGRjQ5RDg1QjFBMTRGMTE0RDA1NTBBOEVD
 #MEU1REVGQ0M3Mzk5QzJFMTkwMDMyNTFCMUREQjlFNzg2NDg5QjY2QkUzQ0Y4NjAxOD
 #gwQkQ0MjZBOEE1MkY5Njk2ODIyOUQzNTAzMkFDOUNDM0VGNkMxRkQ2N0NFMUY3OTc5
 #QkIxQkU5RjRGRjYzRTM0RkM2REY0MkVCQjQ4MTk4OTU5NkY2M0M2QkQ5ODdGRkZEMj
 #UyN0JERkQ2QjA1RDYiLCAieWIiOiAiNTBCMEUzNkI5NUEyRURGQUE4MzQyQjg0M0RE
 #REM5MEIxNzUzMzBGMjM5OUMxQjM2NTg2REVEREEzQzI1NTk3NUYzMEJFNkE3NTBGOT
 #QwNEZDQ0M2MkE2MzIzQjVFNDcxIiwgIkFEYiI6ICI0MTQ0NjIiLCAiWWIiOiAiMDRB
 #OTRCODBDQzI2NjY3MUEwMEVGNzE5RUUyNDlCREE3OUNCRjY2Nzg4Nzg0NjExRTlDMT
 #g4MzUyQUM3REJGMjNGNzMwQTRDM0VBMzIwRTdBMjdBNjU3QUMzMzZFN0VFOUM5QkY0
 #OUE1RENCNzE1QkI5QjJBQzJFNTQzM0JCQTYxQjJCMTg2QjdENkE1MzkwMTUwOTZGMz
 #UxQjM2REY1Nzk0NjlENTBBMkY3Q0ExQzYxNUJEN0UyODYzM0U1RkFFRkIiLCAiSyI6
 #ICIwM0FEOTFCMDNGODMxMkZERDZBQTE5ODZEQUZDNjg0QURCMkQ5M0ExMjQ4RTk5QT
 #IyODQzQzUwMjM5NzkwM0I0NjQ3NjhGNTdEMkVGMTlGREEwMDU0MkRDNzYzNjAzMUYi
 #LCAiSVNLX0lSIjogIjQwN0QzRTk0OTE2MTM4QThBMENEM0I2QjY0Q0RCRDlBNjY1Rk
 #Q4M0U3MDY1MDg2NDlCQzQzQjA0N0I3M0NGMjcwMTdEMkNDNzQ1MzNGMThBNTA3NUE2
 #NzQ4REU1QTAyNiIsICJJU0tfU1kiOiAiQjJDMjhEREFENEE3NzY4MDQ2OUJEMDkwQk
 #FEODA5OEQxQzIyRTcwNTA1NTNBQ0RBQ0QxMzYxNERFRUQ3MkJCNzgyMUM1MEREQzRC
 #MzBCNEI1NDE1MUUwNzA3N0QxOTg1IiwgInNpZF9vdXRwdXRfaXIiOiAiQUQwMjQ3RT
 #kwQzExMjRDRTZEQTZGNjJENTVEQUYzMEZBREEwQjA4MTYwMTY0QkI5M0NDRDVBMkRG
 #OTc1MEI5MUE0NTE3MTg0ODcyRTJCQ0ZCNEZGRjgzQkJBRDAyMzcxIiwgInNpZF9vdX
 #RwdXRfb2MiOiAiNEM3QjY1MjNBRTRDN0E1REY5RDcwOUI1OUREMUIwMzMxNTIwNDA3
 #MTUzOTFDN0VEN0M2MEExMkNDM0Y0MEUyNTFGQkRBNUI3OEM2M0JDNDY1REFDNUNBNj
 #A0NkYzRkMwIn0=
]]></sourcecode>
        </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 messages of A or B 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 anchor="testvectors-as-json-file-encoded-as-base64-22">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI2RThBOTlBNUNERDQwOEVBRTk4RTFCOEFFRDI4NkU3Qj
 #EyQURCQkRBQzdGMkM2MjhEOTA2MENFOTJBRTBEOTBCRDU3QTU2NEZEMzUwMEZCQ0NF
 #MzQyNURDOTRCQTBBREUiLCAiWCI6ICIwNDVCNENENTNDNDUwNkNDMDRCQTRDNDRGMj
 #c2MkQ1RDMyQzNFNTVERjI1QjhCQUE1NTcxQjE2NTdBRDk1NzZFRkVBODI1OUYwNjg0
 #REUwNjVBNDcwNTg1QjRCRTg3Njc0OEM3Nzk3MDU0RjNERUZFRjIxQjc3RjgzRDUzQk
 #FDNTdDODlENTJBQTRENkRENTg3MkJEMjgxOTg5QjEzODM1OTY5ODAwOUY4QUMxRjMw
 #MTUzOEJBRENDRTlEOUY0MDM2RSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bGwgY2
 #9vcmRpbmF0ZXMpIjogIjA0NjVDMjhEQjA1RkQ5RjlBOTM2NTFDNUNDMzFFQUU0OUM0
 #RTUyNDZCNDY0ODlCOEY2MTA1ODczMzE3M0EwMzNDREE3NkMzRTNFQTUzNTJCODA0RT
 #Y3RkRCRTJFMzM0QkU4MjQ1REFENUM4Qzk5M0U2M0JBQ0YwNDU2NDc4RjI5QjcxQjZD
 #ODU5RjEzNjc2Rjg0RkYxNTBEMjc0MUYwMjhGNTYwNTg0QTBCREJBMTlBNjNERjYyQz
 #A4OTQ5QzJGRDZEIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29y
 #ZGluYXRlKSI6ICI2NUMyOERCMDVGRDlGOUE5MzY1MUM1Q0MzMUVBRTQ5QzRFNTI0Nk
 #I0NjQ4OUI4RjYxMDU4NzMzMTczQTAzM0NEQTc2QzNFM0VBNTM1MkI4MDRFNjdGREJF
 #MkUzMzRCRTgifSwgIkludmFsaWQgWTEiOiAiMDQ1QjRDRDUzQzQ1MDZDQzA0QkE0Qz
 #Q0RjI3NjJENUQzMkMzRTU1REYyNUI4QkFBNTU3MUIxNjU3QUQ5NTc2RUZFQTgyNTlG
 #MDY4NERFMDY1QTQ3MDU4NUI0QkU4NzY3NDhDNzc5NzA1NEYzREVGRUYyMUI3N0Y4M0
 #Q1M0JBQzU3Qzg5RDUyQUE0RDZERDU4NzJCRDI4MTk4OUIxMzgzNTk2OTgwMDlGOEFD
 #MUYzMDE1MzhCQURDQ0U5RDlGNDAzMDIiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </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'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      1e4350616365503532315f584d443a5348412d3531325f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572107e4b4791d6a8ef019b936c79fb7f
      2c57
    generator g: (length: 133 bytes)
      0400aefb79f4ba40369bbe78a5c873b2ce75be111516deed28c5899a
      8bbf8a96dbd28882afbc1501d8a4e9b25c172dfadcd96d10466f9c36
      d23ea05c982df0bb1e353201c98da6ce14e3c424b6cf55e627c4f3c0
      a4469e2aedaa692f5fe16d57baa8a9432aac320139e854d06bfb4daa
      efc504ff2fe1d2c4f06443878a242a7b876b224040
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-23">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0ODQxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMEI0MjVGNzI2NTcz
 #NzA2RjZFNjQ2NTcyIiwgInNpZCI6ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQj
 #dGMkM1NyIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2lu
 #X2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDM1MzIzMTVGNTg0RDQ0M0E1MzQ4NDEyRD
 #M1MzEzMjVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDU3MDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMTgwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQy
 #NUY3MjY1NzM3MDZGNkU2NDY1NzIxMDdFNEI0NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0
 #YyQzU3IiwgImdlbmVyYXRvciBnIjogIjA0MDBBRUZCNzlGNEJBNDAzNjlCQkU3OEE1
 #Qzg3M0IyQ0U3NUJFMTExNTE2REVFRDI4QzU4OTlBOEJCRjhBOTZEQkQyODg4MkFGQk
 #MxNTAxRDhBNEU5QjI1QzE3MkRGQURDRDk2RDEwNDY2RjlDMzZEMjNFQTA1Qzk4MkRG
 #MEJCMUUzNTMyMDFDOThEQTZDRTE0RTNDNDI0QjZDRjU1RTYyN0M0RjNDMEE0NDY5RT
 #JBRURBQTY5MkY1RkUxNkQ1N0JBQThBOTQzMkFBQzMyMDEzOUU4NTREMDZCRkI0REFB
 #RUZDNTA0RkYyRkUxRDJDNEYwNjQ0Mzg3OEEyNDJBN0I4NzZCMjI0MDQwIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-6">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 66 bytes)
      006367e9c2aeff9f1db19af600cca73343d47cbe446cebbd1ccd783f
      82755a872da86fd0707eb3767c6114f1803deb62d63bdd1e613f67e6
      3e8c141ee5310e3ee819
  Outputs
    Ya: (length: 133 bytes)
      0400493381a239f5c33edc50f92a4ac7dbade7854c2ef090515567a5
      387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf4651e5d4
      cfebf1ebb89ca459a6311801d78c1142bf4eb46df664108bd05e8d97
      9f3bc13ea3e373ce07fd67e457f44927e0123d7566b527eb10ead212
      71d922f373fec78b4a3f4798f8fd52fb97859588de
    Alternative correct value for Ya: (-ya)*g:
    (length: 133 bytes)
      0400493381a239f5c33edc50f92a4ac7dbade7854c2ef090515567a5
      387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf4651e5d4
      cfebf1ebb89ca459a63118002873eebd40b14b92099bef742fa17268
      60c43ec15c1c8c31f802981ba80bb6d81fedc28a994ad814ef152ded
      8e26dd0c8c013874b5c0b8670702ad04687a6a7721
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-6">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 66 bytes)
      009227bf8dc741dacc9422f8bf3c0e96fce9587bc562eaafe0dc5f6f
      82f28594e4a6f98553560c62b75fa4abb198cecbbb86ebd41b0ea025
      4cde78ac68d39a240ae7
  Outputs
    Yb: (length: 133 bytes)
      04012938f18169cf9f37048b973ec9ac06bb15eeb26d370957736775
      e6c5638153f00152fe632215eb22f407dc3a1a2c473f45751b6451bf
      626b781d8db61c537cb4310060575918b0c77f5208b31b89f6fc2cf8
      6bf494a1533a6f282ae0fc550133d51626c35989c01462aabab6dab9
      522cfb6a2ab214570f29560a7cc9619aa3e3341929
    Alternative correct value for Yb: (-yb)*g:
    (length: 133 bytes)
      04012938f18169cf9f37048b973ec9ac06bb15eeb26d370957736775
      e6c5638153f00152fe632215eb22f407dc3a1a2c473f45751b6451bf
      626b781d8db61c537cb431019fa8a6e74f3880adf74ce4760903d307
      940b6b5eacc590d7d51f03aafecc2ae9d93ca6763feb9d5545492546
      add30495d54deba8f0d6a9f583369e655c1ccbe6d6
]]></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)
      0057f1164b053e75197f7457d56391442efe0e5078fa9df658c6a6d0
      0af69ae3998d55f092ef9da4040bc42945691590496a5d84479439b1
      14d28b02a51ba41b273d
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      0057f1164b053e75197f7457d56391442efe0e5078fa9df658c6a6d0
      0af69ae3998d55f092ef9da4040bc42945691590496a5d84479439b1
      14d28b02a51ba41b273d
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-6">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 278 bytes)
      85010400493381a239f5c33edc50f92a4ac7dbade7854c2ef0905155
      67a5387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf4651
      e5d4cfebf1ebb89ca459a6311801d78c1142bf4eb46df664108bd05e
      8d979f3bc13ea3e373ce07fd67e457f44927e0123d7566b527eb10ea
      d21271d922f373fec78b4a3f4798f8fd52fb97859588de0341446185
      0104012938f18169cf9f37048b973ec9ac06bb15eeb26d3709577367
      75e6c5638153f00152fe632215eb22f407dc3a1a2c473f45751b6451
      bf626b781d8db61c537cb4310060575918b0c77f5208b31b89f6fc2c
      f86bf494a1533a6f282ae0fc550133d51626c35989c01462aabab6da
      b9522cfb6a2ab214570f29560a7cc9619aa3e334192903414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 397 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c57420057f1
      164b053e75197f7457d56391442efe0e5078fa9df658c6a6d00af69a
      e3998d55f092ef9da4040bc42945691590496a5d84479439b114d28b
      02a51ba41b273d85010400493381a239f5c33edc50f92a4ac7dbade7
      854c2ef090515567a5387c331fc9c7fdff4e151801a51ed20514412d
      d9832a0ebf4651e5d4cfebf1ebb89ca459a6311801d78c1142bf4eb4
      6df664108bd05e8d979f3bc13ea3e373ce07fd67e457f44927e0123d
      7566b527eb10ead21271d922f373fec78b4a3f4798f8fd52fb978595
      88de03414461850104012938f18169cf9f37048b973ec9ac06bb15ee
      b26d370957736775e6c5638153f00152fe632215eb22f407dc3a1a2c
      473f45751b6451bf626b781d8db61c537cb4310060575918b0c77f52
      08b31b89f6fc2cf86bf494a1533a6f282ae0fc550133d51626c35989
      c01462aabab6dab9522cfb6a2ab214570f29560a7cc9619aa3e33419
      2903414462
    ISK result: (length: 64 bytes)
      6f8daaedf8843dd9ae3b8376c6dd668f49a127e7d33b8adb37d4ae13
      5e1f09a68db1a03d436aae0cb8efb80a11813dec6924a52a6589b186
      e62e676a8dd777ad
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-6">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 280 bytes)
      6f63850104012938f18169cf9f37048b973ec9ac06bb15eeb26d3709
      57736775e6c5638153f00152fe632215eb22f407dc3a1a2c473f4575
      1b6451bf626b781d8db61c537cb4310060575918b0c77f5208b31b89
      f6fc2cf86bf494a1533a6f282ae0fc550133d51626c35989c01462aa
      bab6dab9522cfb6a2ab214570f29560a7cc9619aa3e3341929034144
      6285010400493381a239f5c33edc50f92a4ac7dbade7854c2ef09051
      5567a5387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf46
      51e5d4cfebf1ebb89ca459a6311801d78c1142bf4eb46df664108bd0
      5e8d979f3bc13ea3e373ce07fd67e457f44927e0123d7566b527eb10
      ead21271d922f373fec78b4a3f4798f8fd52fb97859588de03414461
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 399 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c57420057f1
      164b053e75197f7457d56391442efe0e5078fa9df658c6a6d00af69a
      e3998d55f092ef9da4040bc42945691590496a5d84479439b114d28b
      02a51ba41b273d6f63850104012938f18169cf9f37048b973ec9ac06
      bb15eeb26d370957736775e6c5638153f00152fe632215eb22f407dc
      3a1a2c473f45751b6451bf626b781d8db61c537cb4310060575918b0
      c77f5208b31b89f6fc2cf86bf494a1533a6f282ae0fc550133d51626
      c35989c01462aabab6dab9522cfb6a2ab214570f29560a7cc9619aa3
      e33419290341446285010400493381a239f5c33edc50f92a4ac7dbad
      e7854c2ef090515567a5387c331fc9c7fdff4e151801a51ed2051441
      2dd9832a0ebf4651e5d4cfebf1ebb89ca459a6311801d78c1142bf4e
      b46df664108bd05e8d979f3bc13ea3e373ce07fd67e457f44927e012
      3d7566b527eb10ead21271d922f373fec78b4a3f4798f8fd52fb9785
      9588de03414461
    ISK result: (length: 64 bytes)
      28c311ecace3f42a9cc2ec3cc7b8bcbfd5308d999bb795ae0af7a312
      9b83f36ef011d7186422ed03bf79725cdb1b17d2a995f6db753db6eb
      9438db72bdf23d77
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-6">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      eebbefc008cede41adf4cfb06c5f3d6236aa532a958dd352d4154efa
      bda569ae3afab954380b842cde2c13b4a9750d821634ce763be4c72d
      710fcc8d9f9c79f0
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      3fc7eed0ea9381c98f60bc762c0bc6c73f90bb8fdc85c9826697838b
      76d116f0ee50a5489237b8bc7f30ab32157af2e8d8e6f712f07a3020
      eb112d609061f4f9
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-6">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x04,0x00,0xae,0xfb,0x79,0xf4,0xba,0x40,0x36,0x9b,0xbe,0x78,
 0xa5,0xc8,0x73,0xb2,0xce,0x75,0xbe,0x11,0x15,0x16,0xde,0xed,
 0x28,0xc5,0x89,0x9a,0x8b,0xbf,0x8a,0x96,0xdb,0xd2,0x88,0x82,
 0xaf,0xbc,0x15,0x01,0xd8,0xa4,0xe9,0xb2,0x5c,0x17,0x2d,0xfa,
 0xdc,0xd9,0x6d,0x10,0x46,0x6f,0x9c,0x36,0xd2,0x3e,0xa0,0x5c,
 0x98,0x2d,0xf0,0xbb,0x1e,0x35,0x32,0x01,0xc9,0x8d,0xa6,0xce,
 0x14,0xe3,0xc4,0x24,0xb6,0xcf,0x55,0xe6,0x27,0xc4,0xf3,0xc0,
 0xa4,0x46,0x9e,0x2a,0xed,0xaa,0x69,0x2f,0x5f,0xe1,0x6d,0x57,
 0xba,0xa8,0xa9,0x43,0x2a,0xac,0x32,0x01,0x39,0xe8,0x54,0xd0,
 0x6b,0xfb,0x4d,0xaa,0xef,0xc5,0x04,0xff,0x2f,0xe1,0xd2,0xc4,
 0xf0,0x64,0x43,0x87,0x8a,0x24,0x2a,0x7b,0x87,0x6b,0x22,0x40,
 0x40,
};
const unsigned char 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 unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x00,0x49,0x33,0x81,0xa2,0x39,0xf5,0xc3,0x3e,0xdc,0x50,
 0xf9,0x2a,0x4a,0xc7,0xdb,0xad,0xe7,0x85,0x4c,0x2e,0xf0,0x90,
 0x51,0x55,0x67,0xa5,0x38,0x7c,0x33,0x1f,0xc9,0xc7,0xfd,0xff,
 0x4e,0x15,0x18,0x01,0xa5,0x1e,0xd2,0x05,0x14,0x41,0x2d,0xd9,
 0x83,0x2a,0x0e,0xbf,0x46,0x51,0xe5,0xd4,0xcf,0xeb,0xf1,0xeb,
 0xb8,0x9c,0xa4,0x59,0xa6,0x31,0x18,0x01,0xd7,0x8c,0x11,0x42,
 0xbf,0x4e,0xb4,0x6d,0xf6,0x64,0x10,0x8b,0xd0,0x5e,0x8d,0x97,
 0x9f,0x3b,0xc1,0x3e,0xa3,0xe3,0x73,0xce,0x07,0xfd,0x67,0xe4,
 0x57,0xf4,0x49,0x27,0xe0,0x12,0x3d,0x75,0x66,0xb5,0x27,0xeb,
 0x10,0xea,0xd2,0x12,0x71,0xd9,0x22,0xf3,0x73,0xfe,0xc7,0x8b,
 0x4a,0x3f,0x47,0x98,0xf8,0xfd,0x52,0xfb,0x97,0x85,0x95,0x88,
 0xde,
};
const unsigned char 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 unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x01,0x29,0x38,0xf1,0x81,0x69,0xcf,0x9f,0x37,0x04,0x8b,
 0x97,0x3e,0xc9,0xac,0x06,0xbb,0x15,0xee,0xb2,0x6d,0x37,0x09,
 0x57,0x73,0x67,0x75,0xe6,0xc5,0x63,0x81,0x53,0xf0,0x01,0x52,
 0xfe,0x63,0x22,0x15,0xeb,0x22,0xf4,0x07,0xdc,0x3a,0x1a,0x2c,
 0x47,0x3f,0x45,0x75,0x1b,0x64,0x51,0xbf,0x62,0x6b,0x78,0x1d,
 0x8d,0xb6,0x1c,0x53,0x7c,0xb4,0x31,0x00,0x60,0x57,0x59,0x18,
 0xb0,0xc7,0x7f,0x52,0x08,0xb3,0x1b,0x89,0xf6,0xfc,0x2c,0xf8,
 0x6b,0xf4,0x94,0xa1,0x53,0x3a,0x6f,0x28,0x2a,0xe0,0xfc,0x55,
 0x01,0x33,0xd5,0x16,0x26,0xc3,0x59,0x89,0xc0,0x14,0x62,0xaa,
 0xba,0xb6,0xda,0xb9,0x52,0x2c,0xfb,0x6a,0x2a,0xb2,0x14,0x57,
 0x0f,0x29,0x56,0x0a,0x7c,0xc9,0x61,0x9a,0xa3,0xe3,0x34,0x19,
 0x29,
};
const unsigned char tc_K[] = {
 0x00,0x57,0xf1,0x16,0x4b,0x05,0x3e,0x75,0x19,0x7f,0x74,0x57,
 0xd5,0x63,0x91,0x44,0x2e,0xfe,0x0e,0x50,0x78,0xfa,0x9d,0xf6,
 0x58,0xc6,0xa6,0xd0,0x0a,0xf6,0x9a,0xe3,0x99,0x8d,0x55,0xf0,
 0x92,0xef,0x9d,0xa4,0x04,0x0b,0xc4,0x29,0x45,0x69,0x15,0x90,
 0x49,0x6a,0x5d,0x84,0x47,0x94,0x39,0xb1,0x14,0xd2,0x8b,0x02,
 0xa5,0x1b,0xa4,0x1b,0x27,0x3d,
};
const unsigned char tc_ISK_IR[] = {
 0x6f,0x8d,0xaa,0xed,0xf8,0x84,0x3d,0xd9,0xae,0x3b,0x83,0x76,
 0xc6,0xdd,0x66,0x8f,0x49,0xa1,0x27,0xe7,0xd3,0x3b,0x8a,0xdb,
 0x37,0xd4,0xae,0x13,0x5e,0x1f,0x09,0xa6,0x8d,0xb1,0xa0,0x3d,
 0x43,0x6a,0xae,0x0c,0xb8,0xef,0xb8,0x0a,0x11,0x81,0x3d,0xec,
 0x69,0x24,0xa5,0x2a,0x65,0x89,0xb1,0x86,0xe6,0x2e,0x67,0x6a,
 0x8d,0xd7,0x77,0xad,
};
const unsigned char tc_ISK_SY[] = {
 0x28,0xc3,0x11,0xec,0xac,0xe3,0xf4,0x2a,0x9c,0xc2,0xec,0x3c,
 0xc7,0xb8,0xbc,0xbf,0xd5,0x30,0x8d,0x99,0x9b,0xb7,0x95,0xae,
 0x0a,0xf7,0xa3,0x12,0x9b,0x83,0xf3,0x6e,0xf0,0x11,0xd7,0x18,
 0x64,0x22,0xed,0x03,0xbf,0x79,0x72,0x5c,0xdb,0x1b,0x17,0xd2,
 0xa9,0x95,0xf6,0xdb,0x75,0x3d,0xb6,0xeb,0x94,0x38,0xdb,0x72,
 0xbd,0xf2,0x3d,0x77,
};
const unsigned char tc_sid_out_ir[] = {
 0xee,0xbb,0xef,0xc0,0x08,0xce,0xde,0x41,0xad,0xf4,0xcf,0xb0,
 0x6c,0x5f,0x3d,0x62,0x36,0xaa,0x53,0x2a,0x95,0x8d,0xd3,0x52,
 0xd4,0x15,0x4e,0xfa,0xbd,0xa5,0x69,0xae,0x3a,0xfa,0xb9,0x54,
 0x38,0x0b,0x84,0x2c,0xde,0x2c,0x13,0xb4,0xa9,0x75,0x0d,0x82,
 0x16,0x34,0xce,0x76,0x3b,0xe4,0xc7,0x2d,0x71,0x0f,0xcc,0x8d,
 0x9f,0x9c,0x79,0xf0,
};
const unsigned char tc_sid_out_oc[] = {
 0x3f,0xc7,0xee,0xd0,0xea,0x93,0x81,0xc9,0x8f,0x60,0xbc,0x76,
 0x2c,0x0b,0xc6,0xc7,0x3f,0x90,0xbb,0x8f,0xdc,0x85,0xc9,0x82,
 0x66,0x97,0x83,0x8b,0x76,0xd1,0x16,0xf0,0xee,0x50,0xa5,0x48,
 0x92,0x37,0xb8,0xbc,0x7f,0x30,0xab,0x32,0x15,0x7a,0xf2,0xe8,
 0xd8,0xe6,0xf7,0x12,0xf0,0x7a,0x30,0x20,0xeb,0x11,0x2d,0x60,
 0x90,0x61,0xf4,0xf9,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-24">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0
 #NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImciOiAiMDQwMEFFRkI3OUY0Qk
 #E0MDM2OUJCRTc4QTVDODczQjJDRTc1QkUxMTE1MTZERUVEMjhDNTg5OUE4QkJGOEE5
 #NkRCRDI4ODgyQUZCQzE1MDFEOEE0RTlCMjVDMTcyREZBRENEOTZEMTA0NjZGOUMzNk
 #QyM0VBMDVDOTgyREYwQkIxRTM1MzIwMUM5OERBNkNFMTRFM0M0MjRCNkNGNTVFNjI3
 #QzRGM0MwQTQ0NjlFMkFFREFBNjkyRjVGRTE2RDU3QkFBOEE5NDMyQUFDMzIwMTM5RT
 #g1NEQwNkJGQjREQUFFRkM1MDRGRjJGRTFEMkM0RjA2NDQzODc4QTI0MkE3Qjg3NkIy
 #MjQwNDAiLCAieWEiOiAiMDA2MzY3RTlDMkFFRkY5RjFEQjE5QUY2MDBDQ0E3MzM0M0
 #Q0N0NCRTQ0NkNFQkJEMUNDRDc4M0Y4Mjc1NUE4NzJEQTg2RkQwNzA3RUIzNzY3QzYx
 #MTRGMTgwM0RFQjYyRDYzQkREMUU2MTNGNjdFNjNFOEMxNDFFRTUzMTBFM0VFODE5Ii
 #wgIkFEYSI6ICI0MTQ0NjEiLCAiWWEiOiAiMDQwMDQ5MzM4MUEyMzlGNUMzM0VEQzUw
 #RjkyQTRBQzdEQkFERTc4NTRDMkVGMDkwNTE1NTY3QTUzODdDMzMxRkM5QzdGREZGNE
 #UxNTE4MDFBNTFFRDIwNTE0NDEyREQ5ODMyQTBFQkY0NjUxRTVENENGRUJGMUVCQjg5
 #Q0E0NTlBNjMxMTgwMUQ3OEMxMTQyQkY0RUI0NkRGNjY0MTA4QkQwNUU4RDk3OUYzQk
 #MxM0VBM0UzNzNDRTA3RkQ2N0U0NTdGNDQ5MjdFMDEyM0Q3NTY2QjUyN0VCMTBFQUQy
 #MTI3MUQ5MjJGMzczRkVDNzhCNEEzRjQ3OThGOEZENTJGQjk3ODU5NTg4REUiLCAieW
 #IiOiAiMDA5MjI3QkY4REM3NDFEQUNDOTQyMkY4QkYzQzBFOTZGQ0U5NTg3QkM1NjJF
 #QUFGRTBEQzVGNkY4MkYyODU5NEU0QTZGOTg1NTM1NjBDNjJCNzVGQTRBQkIxOThDRU
 #NCQkI4NkVCRDQxQjBFQTAyNTRDREU3OEFDNjhEMzlBMjQwQUU3IiwgIkFEYiI6ICI0
 #MTQ0NjIiLCAiWWIiOiAiMDQwMTI5MzhGMTgxNjlDRjlGMzcwNDhCOTczRUM5QUMwNk
 #JCMTVFRUIyNkQzNzA5NTc3MzY3NzVFNkM1NjM4MTUzRjAwMTUyRkU2MzIyMTVFQjIy
 #RjQwN0RDM0ExQTJDNDczRjQ1NzUxQjY0NTFCRjYyNkI3ODFEOERCNjFDNTM3Q0I0Mz
 #EwMDYwNTc1OTE4QjBDNzdGNTIwOEIzMUI4OUY2RkMyQ0Y4NkJGNDk0QTE1MzNBNkYy
 #ODJBRTBGQzU1MDEzM0Q1MTYyNkMzNTk4OUMwMTQ2MkFBQkFCNkRBQjk1MjJDRkI2QT
 #JBQjIxNDU3MEYyOTU2MEE3Q0M5NjE5QUEzRTMzNDE5MjkiLCAiSyI6ICIwMDU3RjEx
 #NjRCMDUzRTc1MTk3Rjc0NTdENTYzOTE0NDJFRkUwRTUwNzhGQTlERjY1OEM2QTZEMD
 #BBRjY5QUUzOTk4RDU1RjA5MkVGOURBNDA0MEJDNDI5NDU2OTE1OTA0OTZBNUQ4NDQ3
 #OTQzOUIxMTREMjhCMDJBNTFCQTQxQjI3M0QiLCAiSVNLX0lSIjogIjZGOERBQUVERj
 #g4NDNERDlBRTNCODM3NkM2REQ2NjhGNDlBMTI3RTdEMzNCOEFEQjM3RDRBRTEzNUUx
 #RjA5QTY4REIxQTAzRDQzNkFBRTBDQjhFRkI4MEExMTgxM0RFQzY5MjRBNTJBNjU4OU
 #IxODZFNjJFNjc2QThERDc3N0FEIiwgIklTS19TWSI6ICIyOEMzMTFFQ0FDRTNGNDJB
 #OUNDMkVDM0NDN0I4QkNCRkQ1MzA4RDk5OUJCNzk1QUUwQUY3QTMxMjlCODNGMzZFRj
 #AxMUQ3MTg2NDIyRUQwM0JGNzk3MjVDREIxQjE3RDJBOTk1RjZEQjc1M0RCNkVCOTQz
 #OERCNzJCREYyM0Q3NyIsICJzaWRfb3V0cHV0X2lyIjogIkVFQkJFRkMwMDhDRURFND
 #FBREY0Q0ZCMDZDNUYzRDYyMzZBQTUzMkE5NThERDM1MkQ0MTU0RUZBQkRBNTY5QUUz
 #QUZBQjk1NDM4MEI4NDJDREUyQzEzQjRBOTc1MEQ4MjE2MzRDRTc2M0JFNEM3MkQ3MT
 #BGQ0M4RDlGOUM3OUYwIiwgInNpZF9vdXRwdXRfb2MiOiAiM0ZDN0VFRDBFQTkzODFD
 #OThGNjBCQzc2MkMwQkM2QzczRjkwQkI4RkRDODVDOTgyNjY5NzgzOEI3NkQxMTZGME
 #VFNTBBNTQ4OTIzN0I4QkM3RjMwQUIzMjE1N0FGMkU4RDhFNkY3MTJGMDdBMzAyMEVC
 #MTEyRDYwOTA2MUY0RjkifQ==
]]></sourcecode>
        </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 messages of A or B 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 anchor="testvectors-as-json-file-encoded-as-base64-25">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICIwMTgyREQ3OTI1RjE3NTM0MTlFNEJGODM0Mjk3NjNBQ0
 #QzN0Q2NDAwMENENUExNzVFREY1M0ExNTg3REQ5ODZCQzk1QUNDMTUwNjk5MTcwMkI2
 #QkExQTlFRTI0NThGRUU4RUZDMDAxOThDRjAwODhDNDgwOTY1RUY2NUZGMjA0OEI4NT
 #YiLCAiWCI6ICIwNDAwREM1MDc4QjI0QzRBRjE2MjBDQzEwRkJFQ0M2Q0Q4Q0YxQ0FC
 #MEIwMTFFRkI3M0M3ODJGMjI2REMyMUM3Q0E3RUI0MDZCRTc0QTY5RUNCQTVCNEE4N0
 #MwN0NGQzZFNjg3QjRCRUNBOUE2RURBQzk1OTQwQTNCNDEyMDU3M0IyNkE4MDAwNUU2
 #OTc4MzNCMEJBMjg1RkNFN0IzRjFGMjUyNDMwMDg4NjBCOEYxREU3MTBBMERDQzA1Qj
 #BEMjAzNDFFRkU5MEVCMkJDQ0EyNjc5N0MyRDg1QUU2Q0E3NEMwMDY5NkNCMUIxM0U0
 #MEJEQTE1QjI3OTY0RDc2NzA1NzY2NDdCRkFCOSIsICJHLnNjYWxhcl9tdWx0KHMsWC
 #kgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0MDEyMkY4OENFNzNFQzVBQTJEMUM4QzVE
 #MDQxNDg3NjBDM0Q5N0JBODdEQUExMEQ4Q0I4QkI3QzczQ0Y2RTk1MUZDOTIyNzIxQk
 #YxNDM3OTk1Q0ZCMTNFMTMyQTc4QkVCODYzODlFNjBEMzUxN0NERjZEOTlBOEEyRDZE
 #QjE5RUYyN0JEMDA1NUFGOUU4RERDRjMzN0NFMEE3QzIyQTlDODA5OUJDNEE0NEZBRU
 #RFRDFFQjcyRUZGRDI2RTRGMzIyMjE3QjY3RDYwQjk0NEIyNjdCM0RGNTA0NjA3OEZE
 #NTc3RjE3ODU3MjhGNDlCMjQxRkQ1RThDODMyMjNBOTk0QTJEMjE5MjgxIiwgIkcuc2
 #NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29yZGluYXRlKSI6ICIwMTIyRjg4
 #Q0U3M0VDNUFBMkQxQzhDNUQwNDE0ODc2MEMzRDk3QkE4N0RBQTEwRDhDQjhCQjdDNz
 #NDRjZFOTUxRkM5MjI3MjFCRjE0Mzc5OTVDRkIxM0UxMzJBNzhCRUI4NjM4OUU2MEQz
 #NTE3Q0RGNkQ5OUE4QTJENkRCMTlFRjI3QkQifSwgIkludmFsaWQgWTEiOiAiMDQwME
 #RDNTA3OEIyNEM0QUYxNjIwQ0MxMEZCRUNDNkNEOENGMUNBQjBCMDExRUZCNzNDNzgy
 #RjIyNkRDMjFDN0NBN0VCNDA2QkU3NEE2OUVDQkE1QjRBODdDMDdDRkM2RTY4N0I0Qk
 #VDQTlBNkVEQUM5NTk0MEEzQjQxMjA1NzNCMjZBODAwMDVFNjk3ODMzQjBCQTI4NUZD
 #RTdCM0YxRjI1MjQzMDA4ODYwQjhGMURFNzEwQTBEQ0MwNUIwRDIwMzQxRUZFOTBFQj
 #JCQ0NBMjY3OTdDMkQ4NUFFNkNBNzRDMDA2OTZDQjFCMTNFNDBCREExNUIyNzk2NEQ3
 #NjcwNTc2NjQ3QkZBRjkiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
sIVll+q7fNP/B/Qdgt/tvQIA

-->

</rfc>
