<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-16" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-16"/>
    <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="2025" month="December" day="12"/>
    <workgroup>CFRG</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 174?>

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

<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="I-D.irtf-cfrg-opaque"/>.</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>Optional 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, initiator-responder and symmetric settings.</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="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="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="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,Yb,ADa,ADb) = o_cat(lv_cat(Ya,ADa),lv_cat(Yb, ADb)) SHALL be used.
In the initiator-responder setting the implementation transcript_ir(Ya,Yb,ADa,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.
A sends the public share Ya and optional associated data ADa to B.
Likewise, B sends the public share Yb and optional 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>
        <t>Optional parameters and messages are denoted with [].</t>
        <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
optional associated data ADa to B.</t>
        <t>B computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar yb = G.sample_scalar() and group element Yb = G.scalar_mult(yb,g). B sends Yb and optional 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="I-D.draft-irtf-cfrg-ristretto255-decaf448"/>.
These abstractions define an encode and decode function, group operations using an internal encoding
and an element-derivation function that maps a byte string to a group element.
With the group abstractions there is a distinction between an internal representation
of group elements and an external encoding of the same group element. In order to distinguish between these
different representations, we prepend an underscore before values using the internal representation within this
section.</t>
        <t>For Ristretto255 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <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 and relay attacks</name>
        <t>The protocol assures that both communication partners have had the same view on the communication transcript and the inputs CI and sid.</t>
        <t>If CPace is instantiated without identity strings for A or B in its input it will anonymously create a key with any party in posession of the
PRS string and cannot give any guarantee regarding the identity of the communication partner.
This setting is not explicitly covered in the security paper <xref target="AHH21"/>, however <xref target="BFK09"/> can give some
guidance here where the PACE protocol as used in travel documents such as
passports is analyzed. The analysis in <xref target="BFK09"/> assumes clear initiator and responder roles.
If an application has no access to party identities and aims at deriving a shared key from a low-entropy secret
it SHALL use CPace in initiator-responder mode.</t>
        <t>If unique strings identifying one or both protocol partners are included either as part of the channel identifier CI or the
associated data fields ADa, ADb, then ISK will provide implicit authentication also regarding the included party identities.</t>
        <t>Incorporating party identifier strings is important for fending off unknown-key-share attacks.
Such attacks become relevant in a setting where several parties, say, A, B and C, share the same password PRS.
An adversary might relay messages from 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 is allowing for multiple concurrent sessions the adversary may also relay messages of A back to A such that A interacts with itself <xref target="HS14"/>.</t>
        <t>The requirement on party identifiers may differ from what might be intuitively expected as information on the application service
such as port-ids and role information (e.g. client or server role) also needs to 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>
        <t>As a result the following guidance SHALL be followed regarding party identifiers if guarantees regarding
the identities are requested from CPace.</t>
        <ul spacing="normal">
          <li>
            <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>
          </li>
          <li>
            <t>Identity strings that are to be authenticated that are available for both communication partners at protocol start SHOULD be integrated as
part of CI.  </t>
            <t>
If both identities are available before protocol start and need to be checked by CPace then the protocol
SHALL be used in initiator-responder mode and the initiator's identity SHALL be placed first within CI.  </t>
            <t>
Integration of identity strings in CI avoids the need of an explicit subsequent check for the identity strings
which may be omitted or implemented incorrectly without notice. It also strengthens the security properties with respect
to attacks based on quantum computers {sec-quantum-annoying} and keeps the identities confidential.</t>
          </li>
          <li>
            <t>Party identities that are not included in CI and need verification by CPace SHALL be integrated in ADa and/or ADb, such that
A integrates its identifier in ADa and B integrates its party identifier as part of ADb. In this case the application layer SHALL make the recipient
check the party identifier string of the remote communication partner for fending off relay attacks. Application verification test should
verify correctnes of party identity verification. Note that identities communicated in ADa or ADb will
not be kept confidential. This mode corresponds to the method analyzed in <xref target="HMSD18"/>.</t>
          </li>
        </ul>
      </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="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="I-D.draft-irtf-cfrg-ristretto255-decaf448">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="Henry de Valence" initials="H." surname="de Valence">
         </author>
            <author fullname="Jack Grigg" initials="J." surname="Grigg">
         </author>
            <author fullname="Mike Hamburg" initials="M." surname="Hamburg">
         </author>
            <author fullname="Isis Lovecruft" initials="I." surname="Lovecruft">
         </author>
            <author fullname="George Tankersley" initials="G." surname="Tankersley">
         </author>
            <author fullname="Filippo Valsorda" initials="F." surname="Valsorda">
         </author>
            <date day="5" month="September" year="2023"/>
            <abstract>
              <t>   This memo specifies two prime-order groups, ristretto255 and
   decaf448, suitable for safely implementing higher-level and complex
   cryptographic protocols.  The ristretto255 group can be implemented
   using Curve25519, allowing existing Curve25519 implementations to be
   reused and extended to provide a prime-order group.  Likewise, the
   decaf448 group can be implemented using edwards448.

   This document is a product of the Crypto Forum Research Group (CFRG)
   in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-ristretto255-decaf448-08"/>
        </reference>
      </references>
      <references 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="BFK09" target="https://eprint.iacr.org/2009/624.pdf">
          <front>
            <title>Security Analysis of the PACE Key-Agreement Protocol</title>
            <author initials="J." surname="Bender">
              <organization/>
            </author>
            <author initials="K." surname="Gellert">
              <organization/>
            </author>
            <author initials="M." surname="Fischlin">
              <organization/>
            </author>
            <author initials="D." surname="Kügler">
              <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="I-D.irtf-cfrg-opaque">
          <front>
            <title>The OPAQUE Augmented PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>AWS</organization>
            </author>
            <author fullname="Kevin Lewi" initials="K." surname="Lewi">
              <organization>Meta</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="21" month="November" year="2024"/>
            <abstract>
              <t>   This document describes the OPAQUE protocol, an augmented (or
   asymmetric) password-authenticated key exchange (aPAKE) that supports
   mutual authentication in a client-server setting without reliance on
   PKI and with security against pre-computation attacks upon server
   compromise.  In addition, the protocol provides forward secrecy and
   the ability to hide the password from the server, even during
   password registration.  This document specifies the core OPAQUE
   protocol and one instantiation based on 3DH.  This document is a
   product of the Crypto Forum Research Group (CFRG) in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-18"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="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 969?>

<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'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      0843506163653235350850617373776f72646d000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    hash generator string: (length: 32 bytes)
      92806dc608984dbf4e4aae478c6ec453ae979cc01ecc1a2a7cf49f5c
      ee56551b
    decoded field element of 255 bits: (length: 32 bytes)
      92806dc608984dbf4e4aae478c6ec453ae979cc01ecc1a2a7cf49f5c
      ee56551b
    generator g: (length: 32 bytes)
      64e8099e3ea682cfdc5cb665c057ebb514d06bf23ebc9f743b51b822
      42327074
]]></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
 #NjM2NTMyMzUzNSIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyME
 #I0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3RTRCNDc5MUQ2QThFRjAx
 #OUI5MzZDNzlGQjdGMkM1NyIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSS
 #xzaWQsSC5zX2luX2J5dGVzKSI6ICIwODQzNTA2MTYzNjUzMjM1MzUwODUwNjE3Mzcz
 #Nzc2RjcyNjQ2RDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUE2RjYzMEI0MjVGNzI2NTczNz
 #A2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMTA3RTRCNDc5MUQ2QThF
 #RjAxOUI5MzZDNzlGQjdGMkM1NyIsICJoYXNoIGdlbmVyYXRvciBzdHJpbmciOiAiOT
 #I4MDZEQzYwODk4NERCRjRFNEFBRTQ3OEM2RUM0NTNBRTk3OUNDMDFFQ0MxQTJBN0NG
 #NDlGNUNFRTU2NTUxQiIsICJkZWNvZGVkIGZpZWxkIGVsZW1lbnQgb2YgMjU1IGJpdH
 #MiOiAiOTI4MDZEQzYwODk4NERCRjRFNEFBRTQ3OEM2RUM0NTNBRTk3OUNDMDFFQ0Mx
 #QTJBN0NGNDlGNUNFRTU2NTUxQiIsICJnZW5lcmF0b3IgZyI6ICI2NEU4MDk5RTNFQT
 #Y4MkNGREM1Q0I2NjVDMDU3RUJCNTE0RDA2QkYyM0VCQzlGNzQzQjUxQjgyMjQyMzI3
 #MDc0In0=
]]></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)
      1b02dad6dbd29a07b6d28c9e04cb2f184f0734350e32bb7e62ff9dbc
      fdb63d15
]]></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)
      20cda5955f82c4931545bcbf40758ce1010d7db4db2a907013d79c7a
      8fcf957f
]]></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)
      f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f950c970
      3df7297a
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f950c970
      3df7297a
]]></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)
      201b02dad6dbd29a07b6d28c9e04cb2f184f0734350e32bb7e62ff9d
      bcfdb63d15034144612020cda5955f82c4931545bcbf40758ce1010d
      7db4db2a907013d79c7a8fcf957f03414462
    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
      2c5720f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f9
      50c9703df7297a201b02dad6dbd29a07b6d28c9e04cb2f184f073435
      0e32bb7e62ff9dbcfdb63d15034144612020cda5955f82c4931545bc
      bf40758ce1010d7db4db2a907013d79c7a8fcf957f03414462
    ISK result: (length: 64 bytes)
      a051ee5ee2499d16da3f69f430218b8ea94a18a45b67f9e86495b382
      c33d14a5c38cecc0cc834f960e39e0d1bf7d76b9ef5d54eecc5e0f38
      6c97ad12da8c3d5f
]]></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)
      6f632020cda5955f82c4931545bcbf40758ce1010d7db4db2a907013
      d79c7a8fcf957f03414462201b02dad6dbd29a07b6d28c9e04cb2f18
      4f0734350e32bb7e62ff9dbcfdb63d1503414461
    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
      2c5720f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f9
      50c9703df7297a6f632020cda5955f82c4931545bcbf40758ce1010d
      7db4db2a907013d79c7a8fcf957f03414462201b02dad6dbd29a07b6
      d28c9e04cb2f184f0734350e32bb7e62ff9dbcfdb63d1503414461
    ISK result: (length: 64 bytes)
      5cc27e49679423f81a37d7521d9fb1327c840d2ea4a1543652e7de5c
      abb89ebad27d24761b3288a3fd5764b441ecb78d30abc26161ff45ea
      297bb311dde04727
]]></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"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      f7ae11ac3ee85c3c42d8bd51ba823fbe17158f43d34a1296f1cb2567
      bcc71dc8b201a134b566b468aad8fd04f02f96e3caf9d5601f7ed760
      a0a951a5a861b5e7
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      a38389e34fa492788c1df43b06b427710491174e53c33b01362a490d
      116fe1b7e870aa6e2a7fc018725e3b7f969f7508042e44cd3863f39a
      a75026a190d1902b
]]></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[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,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[] = {
 0x64,0xe8,0x09,0x9e,0x3e,0xa6,0x82,0xcf,0xdc,0x5c,0xb6,0x65,
 0xc0,0x57,0xeb,0xb5,0x14,0xd0,0x6b,0xf2,0x3e,0xbc,0x9f,0x74,
 0x3b,0x51,0xb8,0x22,0x42,0x32,0x70,0x74,
};
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[] = {
 0x1b,0x02,0xda,0xd6,0xdb,0xd2,0x9a,0x07,0xb6,0xd2,0x8c,0x9e,
 0x04,0xcb,0x2f,0x18,0x4f,0x07,0x34,0x35,0x0e,0x32,0xbb,0x7e,
 0x62,0xff,0x9d,0xbc,0xfd,0xb6,0x3d,0x15,
};
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[] = {
 0x20,0xcd,0xa5,0x95,0x5f,0x82,0xc4,0x93,0x15,0x45,0xbc,0xbf,
 0x40,0x75,0x8c,0xe1,0x01,0x0d,0x7d,0xb4,0xdb,0x2a,0x90,0x70,
 0x13,0xd7,0x9c,0x7a,0x8f,0xcf,0x95,0x7f,
};
const unsigned char tc_K[] = {
 0xf9,0x7f,0xdf,0xcf,0xff,0x1c,0x98,0x3e,0xd6,0x28,0x38,0x56,
 0xa4,0x01,0xde,0x31,0x91,0xca,0x91,0x99,0x02,0xb3,0x23,0xc5,
 0xf9,0x50,0xc9,0x70,0x3d,0xf7,0x29,0x7a,
};
const unsigned char tc_ISK_IR[] = {
 0xa0,0x51,0xee,0x5e,0xe2,0x49,0x9d,0x16,0xda,0x3f,0x69,0xf4,
 0x30,0x21,0x8b,0x8e,0xa9,0x4a,0x18,0xa4,0x5b,0x67,0xf9,0xe8,
 0x64,0x95,0xb3,0x82,0xc3,0x3d,0x14,0xa5,0xc3,0x8c,0xec,0xc0,
 0xcc,0x83,0x4f,0x96,0x0e,0x39,0xe0,0xd1,0xbf,0x7d,0x76,0xb9,
 0xef,0x5d,0x54,0xee,0xcc,0x5e,0x0f,0x38,0x6c,0x97,0xad,0x12,
 0xda,0x8c,0x3d,0x5f,
};
const unsigned char tc_ISK_SY[] = {
 0x5c,0xc2,0x7e,0x49,0x67,0x94,0x23,0xf8,0x1a,0x37,0xd7,0x52,
 0x1d,0x9f,0xb1,0x32,0x7c,0x84,0x0d,0x2e,0xa4,0xa1,0x54,0x36,
 0x52,0xe7,0xde,0x5c,0xab,0xb8,0x9e,0xba,0xd2,0x7d,0x24,0x76,
 0x1b,0x32,0x88,0xa3,0xfd,0x57,0x64,0xb4,0x41,0xec,0xb7,0x8d,
 0x30,0xab,0xc2,0x61,0x61,0xff,0x45,0xea,0x29,0x7b,0xb3,0x11,
 0xdd,0xe0,0x47,0x27,
};
const unsigned char tc_ISK_SY[] = {
 0x5c,0xc2,0x7e,0x49,0x67,0x94,0x23,0xf8,0x1a,0x37,0xd7,0x52,
 0x1d,0x9f,0xb1,0x32,0x7c,0x84,0x0d,0x2e,0xa4,0xa1,0x54,0x36,
 0x52,0xe7,0xde,0x5c,0xab,0xb8,0x9e,0xba,0xd2,0x7d,0x24,0x76,
 0x1b,0x32,0x88,0xa3,0xfd,0x57,0x64,0xb4,0x41,0xec,0xb7,0x8d,
 0x30,0xab,0xc2,0x61,0x61,0xff,0x45,0xea,0x29,0x7b,0xb3,0x11,
 0xdd,0xe0,0x47,0x27,
};
const unsigned char tc_sid_out_ir[] = {
 0xf7,0xae,0x11,0xac,0x3e,0xe8,0x5c,0x3c,0x42,0xd8,0xbd,0x51,
 0xba,0x82,0x3f,0xbe,0x17,0x15,0x8f,0x43,0xd3,0x4a,0x12,0x96,
 0xf1,0xcb,0x25,0x67,0xbc,0xc7,0x1d,0xc8,0xb2,0x01,0xa1,0x34,
 0xb5,0x66,0xb4,0x68,0xaa,0xd8,0xfd,0x04,0xf0,0x2f,0x96,0xe3,
 0xca,0xf9,0xd5,0x60,0x1f,0x7e,0xd7,0x60,0xa0,0xa9,0x51,0xa5,
 0xa8,0x61,0xb5,0xe7,
};
const unsigned char tc_sid_out_oc[] = {
 0xa3,0x83,0x89,0xe3,0x4f,0xa4,0x92,0x78,0x8c,0x1d,0xf4,0x3b,
 0x06,0xb4,0x27,0x71,0x04,0x91,0x17,0x4e,0x53,0xc3,0x3b,0x01,
 0x36,0x2a,0x49,0x0d,0x11,0x6f,0xe1,0xb7,0xe8,0x70,0xaa,0x6e,
 0x2a,0x7f,0xc0,0x18,0x72,0x5e,0x3b,0x7f,0x96,0x9f,0x75,0x08,
 0x04,0x2e,0x44,0xcd,0x38,0x63,0xf3,0x9a,0xa7,0x50,0x26,0xa1,
 0x90,0xd1,0x90,0x2b,
};
]]></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[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjY0RTgwOTlFM0
 #VBNjgyQ0ZEQzVDQjY2NUMwNTdFQkI1MTREMDZCRjIzRUJDOUY3NDNCNTFCODIyNDIz
 #MjcwNzQiLCAieWEiOiAiMjFCNEY0QkQ5RTY0RUQzNTVDM0VCNjc2QTI4RUJFREFGNk
 #Q4RjE3QkRDMzY1OTk1QjMxOTA5NzE1MzA0NDA4MCIsICJBRGEiOiAiNDE0NDYxIiwg
 #IllhIjogIjFCMDJEQUQ2REJEMjlBMDdCNkQyOEM5RTA0Q0IyRjE4NEYwNzM0MzUwRT
 #MyQkI3RTYyRkY5REJDRkRCNjNEMTUiLCAieWIiOiAiODQ4QjA3NzlGRjQxNUYwQUY0
 #RUExNERGOUREMUQzQzI5QUM0MUQ4MzZDNzgwODg5NkM0RUJBMTlDNTFBQzQwQSIsIC
 #JBRGIiOiAiNDE0NDYyIiwgIlliIjogIjIwQ0RBNTk1NUY4MkM0OTMxNTQ1QkNCRjQw
 #NzU4Q0UxMDEwRDdEQjREQjJBOTA3MDEzRDc5QzdBOEZDRjk1N0YiLCAiSyI6ICJGOT
 #dGREZDRkZGMUM5ODNFRDYyODM4NTZBNDAxREUzMTkxQ0E5MTk5MDJCMzIzQzVGOTUw
 #Qzk3MDNERjcyOTdBIiwgIklTS19JUiI6ICJBMDUxRUU1RUUyNDk5RDE2REEzRjY5Rj
 #QzMDIxOEI4RUE5NEExOEE0NUI2N0Y5RTg2NDk1QjM4MkMzM0QxNEE1QzM4Q0VDQzBD
 #QzgzNEY5NjBFMzlFMEQxQkY3RDc2QjlFRjVENTRFRUNDNUUwRjM4NkM5N0FEMTJEQT
 #hDM0Q1RiIsICJJU0tfU1kiOiAiNUNDMjdFNDk2Nzk0MjNGODFBMzdENzUyMUQ5RkIx
 #MzI3Qzg0MEQyRUE0QTE1NDM2NTJFN0RFNUNBQkI4OUVCQUQyN0QyNDc2MUIzMjg4QT
 #NGRDU3NjRCNDQxRUNCNzhEMzBBQkMyNjE2MUZGNDVFQTI5N0JCMzExRERFMDQ3Mjci
 #LCAic2lkX291dHB1dF9pciI6ICJGN0FFMTFBQzNFRTg1QzNDNDJEOEJENTFCQTgyM0
 #ZCRTE3MTU4RjQzRDM0QTEyOTZGMUNCMjU2N0JDQzcxREM4QjIwMUExMzRCNTY2QjQ2
 #OEFBRDhGRDA0RjAyRjk2RTNDQUY5RDU2MDFGN0VENzYwQTBBOTUxQTVBODYxQjVFNy
 #IsICJzaWRfb3V0cHV0X29jIjogIkEzODM4OUUzNEZBNDkyNzg4QzFERjQzQjA2QjQy
 #NzcxMDQ5MTE3NEU1M0MzM0IwMTM2MkE0OTBEMTE2RkUxQjdFODcwQUE2RTJBN0ZDMD
 #E4NzI1RTNCN0Y5NjlGNzUwODA0MkU0NENEMzg2M0YzOUFBNzUwMjZBMTkwRDE5MDJC
 #In0=
]]></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'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 180 bytes)
      0843506163653434380850617373776f726475000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000001a6f630b
      425f726573706f6e6465720b415f696e69746961746f72105223e0cd
      c45d6575668d64c552004124
    hash generator string: (length: 56 bytes)
      98b713f84529194d719a7d86cb0f504b8afeb05354d68747e18b2e7c
      c8b6da526085e4263bd8bea7d69e479ebad09e30ae062e5d089da7f3
    decoded field element of 448 bits: (length: 56 bytes)
      98b713f84529194d719a7d86cb0f504b8afeb05354d68747e18b2e7c
      c8b6da526085e4263bd8bea7d69e479ebad09e30ae062e5d089da7f3
    generator g: (length: 56 bytes)
      e293b7ccf61ca7eb928a26391cf38b660f874a001fdf0bf3a91fd182
      f2b6d83e61a9377ede127eba7e0d4c08592eaff33d4aa705d6ce54bb
]]></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
 #NjE2MzY1MzQzNDM4IiwgIkNJIjogIjZGNjMwQjQyNUY3MjY1NzM3MDZGNkU2NDY1Nz
 #IwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIiLCAic2lkIjogIjUyMjNFMENEQzQ1RDY1
 #NzU2NjhENjRDNTUyMDA0MTI0IiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0ksUFJTLE
 #NJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjA4NDM1MDYxNjM2NTM0MzQzODA4NTA2MTcz
 #NzM3NzZGNzI2NDc1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMU
 #E2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2
 #RjcyMTA1MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJoYXNoIGdlbm
 #VyYXRvciBzdHJpbmciOiAiOThCNzEzRjg0NTI5MTk0RDcxOUE3RDg2Q0IwRjUwNEI4
 #QUZFQjA1MzU0RDY4NzQ3RTE4QjJFN0NDOEI2REE1MjYwODVFNDI2M0JEOEJFQTdENj
 #lFNDc5RUJBRDA5RTMwQUUwNjJFNUQwODlEQTdGMyIsICJkZWNvZGVkIGZpZWxkIGVs
 #ZW1lbnQgb2YgNDQ4IGJpdHMiOiAiOThCNzEzRjg0NTI5MTk0RDcxOUE3RDg2Q0IwRj
 #UwNEI4QUZFQjA1MzU0RDY4NzQ3RTE4QjJFN0NDOEI2REE1MjYwODVFNDI2M0JEOEJF
 #QTdENjlFNDc5RUJBRDA5RTMwQUUwNjJFNUQwODlEQTdGMyIsICJnZW5lcmF0b3IgZy
 #I6ICJFMjkzQjdDQ0Y2MUNBN0VCOTI4QTI2MzkxQ0YzOEI2NjBGODc0QTAwMUZERjBC
 #RjNBOTFGRDE4MkYyQjZEODNFNjFBOTM3N0VERTEyN0VCQTdFMEQ0QzA4NTkyRUFGRj
 #MzRDRBQTcwNUQ2Q0U1NEJCIn0=
]]></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)
      7f645772cc209bf9fd9d76dbb10283bea71b12235e3bb21878d5e56a
      70506e165743a632de98eca9932c5d2efe36500a59b2fdaed0d8a148
]]></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)
      a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e2c6ee95844de
      f2692be77646b20d3b429f8da00d21433ee0891c667658d8d0c48e38
]]></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)
      db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbeee5bb2
      d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2cede6135a
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbeee5bb2
      d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2cede6135a
]]></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)
      387f645772cc209bf9fd9d76dbb10283bea71b12235e3bb21878d5e5
      6a70506e165743a632de98eca9932c5d2efe36500a59b2fdaed0d8a1
      480341446138a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e
      2c6ee95844def2692be77646b20d3b429f8da00d21433ee0891c6676
      58d8d0c48e3803414462
    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
      412438db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbe
      ee5bb2d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2ced
      e6135a387f645772cc209bf9fd9d76dbb10283bea71b12235e3bb218
      78d5e56a70506e165743a632de98eca9932c5d2efe36500a59b2fdae
      d0d8a1480341446138a4690a0750c42b288ddd0ba08e3f4902dfe70b
      ae5c9e2c6ee95844def2692be77646b20d3b429f8da00d21433ee089
      1c667658d8d0c48e3803414462
    ISK result: (length: 64 bytes)
      599892a2078a8c988181625e1e5e5f7a6163f7d72f21b93ebefba0f1
      7ff7ea3aa0594bd569cf74264157b3c0087bdccf2f59c77156628487
      f5ca1645b8e9d05b
]]></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)
      6f6338a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e2c6ee9
      5844def2692be77646b20d3b429f8da00d21433ee0891c667658d8d0
      c48e3803414462387f645772cc209bf9fd9d76dbb10283bea71b1223
      5e3bb21878d5e56a70506e165743a632de98eca9932c5d2efe36500a
      59b2fdaed0d8a14803414461
    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
      412438db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbe
      ee5bb2d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2ced
      e6135a6f6338a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e
      2c6ee95844def2692be77646b20d3b429f8da00d21433ee0891c6676
      58d8d0c48e3803414462387f645772cc209bf9fd9d76dbb10283bea7
      1b12235e3bb21878d5e56a70506e165743a632de98eca9932c5d2efe
      36500a59b2fdaed0d8a14803414461
    ISK result: (length: 64 bytes)
      3ac73f03030296aa591f01326b18afa47e1189129cd06ae8dfb05e6e
      b1310cde948b59eef0755365c06a339266afe594948c56a538d98a65
      767113938a9a78d8
]]></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"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      00a2333a79481abe71efd6594d7bbaac55c808482e869c9b65c4b53d
      7100d3da8f3cabd59fa0c1f22d6d2f9ac0c093962292798fca2c0b93
      268974cad75d575a
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      a1ce90537a8d53b06d77e79fe719461cc5ed8300d21d1866a59f9638
      601833f57a8b5e88db9a52abfa1b4e8a651a400bc9205082aad81eb3
      11c44373b9a19eff
]]></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[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,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[] = {
 0xe2,0x93,0xb7,0xcc,0xf6,0x1c,0xa7,0xeb,0x92,0x8a,0x26,0x39,
 0x1c,0xf3,0x8b,0x66,0x0f,0x87,0x4a,0x00,0x1f,0xdf,0x0b,0xf3,
 0xa9,0x1f,0xd1,0x82,0xf2,0xb6,0xd8,0x3e,0x61,0xa9,0x37,0x7e,
 0xde,0x12,0x7e,0xba,0x7e,0x0d,0x4c,0x08,0x59,0x2e,0xaf,0xf3,
 0x3d,0x4a,0xa7,0x05,0xd6,0xce,0x54,0xbb,
};
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[] = {
 0x7f,0x64,0x57,0x72,0xcc,0x20,0x9b,0xf9,0xfd,0x9d,0x76,0xdb,
 0xb1,0x02,0x83,0xbe,0xa7,0x1b,0x12,0x23,0x5e,0x3b,0xb2,0x18,
 0x78,0xd5,0xe5,0x6a,0x70,0x50,0x6e,0x16,0x57,0x43,0xa6,0x32,
 0xde,0x98,0xec,0xa9,0x93,0x2c,0x5d,0x2e,0xfe,0x36,0x50,0x0a,
 0x59,0xb2,0xfd,0xae,0xd0,0xd8,0xa1,0x48,
};
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[] = {
 0xa4,0x69,0x0a,0x07,0x50,0xc4,0x2b,0x28,0x8d,0xdd,0x0b,0xa0,
 0x8e,0x3f,0x49,0x02,0xdf,0xe7,0x0b,0xae,0x5c,0x9e,0x2c,0x6e,
 0xe9,0x58,0x44,0xde,0xf2,0x69,0x2b,0xe7,0x76,0x46,0xb2,0x0d,
 0x3b,0x42,0x9f,0x8d,0xa0,0x0d,0x21,0x43,0x3e,0xe0,0x89,0x1c,
 0x66,0x76,0x58,0xd8,0xd0,0xc4,0x8e,0x38,
};
const unsigned char tc_K[] = {
 0xdb,0x3f,0xff,0x9d,0xa5,0x95,0x76,0x71,0x5b,0x04,0xd4,0xdf,
 0x8d,0xc8,0xd1,0x8d,0xb2,0x43,0x0e,0x57,0xbb,0xed,0x33,0x7d,
 0xbe,0xee,0x5b,0xb2,0xd6,0xab,0x6c,0xed,0xdc,0x9c,0x75,0xc5,
 0xc0,0xb1,0x7f,0xad,0x7e,0xb7,0x24,0xda,0xa1,0x2f,0x8f,0x19,
 0x03,0xdd,0x6c,0x2c,0xed,0xe6,0x13,0x5a,
};
const unsigned char tc_ISK_IR[] = {
 0x59,0x98,0x92,0xa2,0x07,0x8a,0x8c,0x98,0x81,0x81,0x62,0x5e,
 0x1e,0x5e,0x5f,0x7a,0x61,0x63,0xf7,0xd7,0x2f,0x21,0xb9,0x3e,
 0xbe,0xfb,0xa0,0xf1,0x7f,0xf7,0xea,0x3a,0xa0,0x59,0x4b,0xd5,
 0x69,0xcf,0x74,0x26,0x41,0x57,0xb3,0xc0,0x08,0x7b,0xdc,0xcf,
 0x2f,0x59,0xc7,0x71,0x56,0x62,0x84,0x87,0xf5,0xca,0x16,0x45,
 0xb8,0xe9,0xd0,0x5b,
};
const unsigned char tc_ISK_SY[] = {
 0x3a,0xc7,0x3f,0x03,0x03,0x02,0x96,0xaa,0x59,0x1f,0x01,0x32,
 0x6b,0x18,0xaf,0xa4,0x7e,0x11,0x89,0x12,0x9c,0xd0,0x6a,0xe8,
 0xdf,0xb0,0x5e,0x6e,0xb1,0x31,0x0c,0xde,0x94,0x8b,0x59,0xee,
 0xf0,0x75,0x53,0x65,0xc0,0x6a,0x33,0x92,0x66,0xaf,0xe5,0x94,
 0x94,0x8c,0x56,0xa5,0x38,0xd9,0x8a,0x65,0x76,0x71,0x13,0x93,
 0x8a,0x9a,0x78,0xd8,
};
const unsigned char tc_ISK_SY[] = {
 0x3a,0xc7,0x3f,0x03,0x03,0x02,0x96,0xaa,0x59,0x1f,0x01,0x32,
 0x6b,0x18,0xaf,0xa4,0x7e,0x11,0x89,0x12,0x9c,0xd0,0x6a,0xe8,
 0xdf,0xb0,0x5e,0x6e,0xb1,0x31,0x0c,0xde,0x94,0x8b,0x59,0xee,
 0xf0,0x75,0x53,0x65,0xc0,0x6a,0x33,0x92,0x66,0xaf,0xe5,0x94,
 0x94,0x8c,0x56,0xa5,0x38,0xd9,0x8a,0x65,0x76,0x71,0x13,0x93,
 0x8a,0x9a,0x78,0xd8,
};
const unsigned char tc_sid_out_ir[] = {
 0x00,0xa2,0x33,0x3a,0x79,0x48,0x1a,0xbe,0x71,0xef,0xd6,0x59,
 0x4d,0x7b,0xba,0xac,0x55,0xc8,0x08,0x48,0x2e,0x86,0x9c,0x9b,
 0x65,0xc4,0xb5,0x3d,0x71,0x00,0xd3,0xda,0x8f,0x3c,0xab,0xd5,
 0x9f,0xa0,0xc1,0xf2,0x2d,0x6d,0x2f,0x9a,0xc0,0xc0,0x93,0x96,
 0x22,0x92,0x79,0x8f,0xca,0x2c,0x0b,0x93,0x26,0x89,0x74,0xca,
 0xd7,0x5d,0x57,0x5a,
};
const unsigned char tc_sid_out_oc[] = {
 0xa1,0xce,0x90,0x53,0x7a,0x8d,0x53,0xb0,0x6d,0x77,0xe7,0x9f,
 0xe7,0x19,0x46,0x1c,0xc5,0xed,0x83,0x00,0xd2,0x1d,0x18,0x66,
 0xa5,0x9f,0x96,0x38,0x60,0x18,0x33,0xf5,0x7a,0x8b,0x5e,0x88,
 0xdb,0x9a,0x52,0xab,0xfa,0x1b,0x4e,0x8a,0x65,0x1a,0x40,0x0b,
 0xc9,0x20,0x50,0x82,0xaa,0xd8,0x1e,0xb3,0x11,0xc4,0x43,0x73,
 0xb9,0xa1,0x9e,0xff,
};
]]></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[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIkUyOTNCN0NDRj
 #YxQ0E3RUI5MjhBMjYzOTFDRjM4QjY2MEY4NzRBMDAxRkRGMEJGM0E5MUZEMTgyRjJC
 #NkQ4M0U2MUE5Mzc3RURFMTI3RUJBN0UwRDRDMDg1OTJFQUZGMzNENEFBNzA1RDZDRT
 #U0QkIiLCAieWEiOiAiMjFCNEY0QkQ5RTY0RUQzNTVDM0VCNjc2QTI4RUJFREFGNkQ4
 #RjE3QkRDMzY1OTk1QjMxOTA5NzE1MzA0NDA4MDUxNkJEMDgzQkZDQ0U2NjEyMUEzMD
 #cyNjQ2OTk0Qzg0MzBDQzM4MkI4REM1NDNFOCIsICJBRGEiOiAiNDE0NDYxIiwgIllh
 #IjogIjdGNjQ1NzcyQ0MyMDlCRjlGRDlENzZEQkIxMDI4M0JFQTcxQjEyMjM1RTNCQj
 #IxODc4RDVFNTZBNzA1MDZFMTY1NzQzQTYzMkRFOThFQ0E5OTMyQzVEMkVGRTM2NTAw
 #QTU5QjJGREFFRDBEOEExNDgiLCAieWIiOiAiODQ4QjA3NzlGRjQxNUYwQUY0RUExNE
 #RGOUREMUQzQzI5QUM0MUQ4MzZDNzgwODg5NkM0RUJBMTlDNTFBQzQwQTQzOUNBRjVF
 #NjFFQzg4QzMwN0M3RDYxOTE5NTIyOTQxMkVBQTczRkIyQTVFQTIwRCIsICJBRGIiOi
 #AiNDE0NDYyIiwgIlliIjogIkE0NjkwQTA3NTBDNDJCMjg4REREMEJBMDhFM0Y0OTAy
 #REZFNzBCQUU1QzlFMkM2RUU5NTg0NERFRjI2OTJCRTc3NjQ2QjIwRDNCNDI5RjhEQT
 #AwRDIxNDMzRUUwODkxQzY2NzY1OEQ4RDBDNDhFMzgiLCAiSyI6ICJEQjNGRkY5REE1
 #OTU3NjcxNUIwNEQ0REY4REM4RDE4REIyNDMwRTU3QkJFRDMzN0RCRUVFNUJCMkQ2QU
 #I2Q0VEREM5Qzc1QzVDMEIxN0ZBRDdFQjcyNERBQTEyRjhGMTkwM0RENkMyQ0VERTYx
 #MzVBIiwgIklTS19JUiI6ICI1OTk4OTJBMjA3OEE4Qzk4ODE4MTYyNUUxRTVFNUY3QT
 #YxNjNGN0Q3MkYyMUI5M0VCRUZCQTBGMTdGRjdFQTNBQTA1OTRCRDU2OUNGNzQyNjQx
 #NTdCM0MwMDg3QkRDQ0YyRjU5Qzc3MTU2NjI4NDg3RjVDQTE2NDVCOEU5RDA1QiIsIC
 #JJU0tfU1kiOiAiM0FDNzNGMDMwMzAyOTZBQTU5MUYwMTMyNkIxOEFGQTQ3RTExODkx
 #MjlDRDA2QUU4REZCMDVFNkVCMTMxMENERTk0OEI1OUVFRjA3NTUzNjVDMDZBMzM5Mj
 #Y2QUZFNTk0OTQ4QzU2QTUzOEQ5OEE2NTc2NzExMzkzOEE5QTc4RDgiLCAic2lkX291
 #dHB1dF9pciI6ICIwMEEyMzMzQTc5NDgxQUJFNzFFRkQ2NTk0RDdCQkFBQzU1QzgwOD
 #Q4MkU4NjlDOUI2NUM0QjUzRDcxMDBEM0RBOEYzQ0FCRDU5RkEwQzFGMjJENkQyRjlB
 #QzBDMDkzOTYyMjkyNzk4RkNBMkMwQjkzMjY4OTc0Q0FENzVENTc1QSIsICJzaWRfb3
 #V0cHV0X29jIjogIkExQ0U5MDUzN0E4RDUzQjA2RDc3RTc5RkU3MTk0NjFDQzVFRDgz
 #MDBEMjFEMTg2NkE1OUY5NjM4NjAxODMzRjU3QThCNUU4OERCOUE1MkFCRkExQjRFOE
 #E2NTFBNDAwQkM5MjA1MDgyQUFEODFFQjMxMUM0NDM3M0I5QTE5RUZGIn0=
]]></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'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      11435061636552697374726574746f3235350850617373776f726464
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    hash result: (length: 64 bytes)
      c63a5750e2439c17ccd8213be14fde2f87e1bc637001a97f5929c77b
      30ea0e08afbc75ace5d3d73b2842a79d01488c5fd7ea30d475ee6095
      45af1bfd1ff77c8e
    encoded generator g: (length: 32 bytes)
      a6fc82c3b8968fbb2e06fee81ca858586dea50d248f0c7ca6a18b090
      2a30b36b
]]></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
 #NjM2NTUyNjk3Mzc0NzI2NTc0NzQ2RjMyMzUzNSIsICJDSSI6ICI2RjYzMEI0MjVGNz
 #I2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6
 #ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnZW5lcmF0b3Jfc3
 #RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIxMTQzNTA2MTYz
 #NjU1MjY5NzM3NDcyNjU3NDc0NkYzMjM1MzUwODUwNjE3MzczNzc2RjcyNjQ2NDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMU
 #E2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2
 #RjcyMTA3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJoYXNoIHJlc3
 #VsdCI6ICJDNjNBNTc1MEUyNDM5QzE3Q0NEODIxM0JFMTRGREUyRjg3RTFCQzYzNzAw
 #MUE5N0Y1OTI5Qzc3QjMwRUEwRTA4QUZCQzc1QUNFNUQzRDczQjI4NDJBNzlEMDE0OD
 #hDNUZEN0VBMzBENDc1RUU2MDk1NDVBRjFCRkQxRkY3N0M4RSIsICJlbmNvZGVkIGdl
 #bmVyYXRvciBnIjogIkE2RkM4MkMzQjg5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQT
 #UwRDI0OEYwQzdDQTZBMThCMDkwMkEzMEIzNkIifQ==
]]></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)
      d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c66
      9308f87a
]]></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)
      08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67
      2eb7e307
]]></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)
      e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa
      0e607e09
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa
      0e607e09
]]></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)
      20d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c
      669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d39840
      3319c2341bd506a92e672eb7e30703414462
    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
      a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774
      fc0f41e6b711569190ff88fa0e607e0920d40fb265a7abeaee7939d9
      1a585fe59f7053f982c296ec413c624c669308f87a034144612008bc
      f6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e672eb7
      e30703414462
    ISK result: (length: 64 bytes)
      4c5469a16b2364c4b944ebc1a79e51d1674ad47db26e8718154f59fa
      ebfaa52d8346f30aa58377117eb20d527f2cbc5c76381f7fd372e89d
      f8239f87f2e02ed1
]]></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)
      6f6320d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c
      624c669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d3
      98403319c2341bd506a92e672eb7e30703414462
    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
      a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774
      fc0f41e6b711569190ff88fa0e607e096f6320d40fb265a7abeaee79
      39d91a585fe59f7053f982c296ec413c624c669308f87a0341446120
      08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67
      2eb7e30703414462
    ISK result: (length: 64 bytes)
      980dcc5a1c52ceea031e75f38ed266586616488c5c5780285fcbcf79
      087c7bcdbd993502eee606b718ba31e840a000a7b7befe15ea427c5c
      fe88344fa1237f35
]]></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"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      2a76d3bbc499dfdc4dcacc9ff042f4e1a54e3843258e100ccd7c60f0
      a541f9d3ebf025e68a460dde218bd39f0711bc6fa11409c9d7b69d8c
      cf6b32fc51ddb699
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      ca4b50700c46203ccd10bc0e9f31095e508189cb59857537be561048
      d34b9ed9a9697af11c998f484c3d783b0b531434caa6835d4c32344f
      cd17160c9c348fc7
]]></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[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,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[] = {
 0xa6,0xfc,0x82,0xc3,0xb8,0x96,0x8f,0xbb,0x2e,0x06,0xfe,0xe8,
 0x1c,0xa8,0x58,0x58,0x6d,0xea,0x50,0xd2,0x48,0xf0,0xc7,0xca,
 0x6a,0x18,0xb0,0x90,0x2a,0x30,0xb3,0x6b,
};
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[] = {
 0xd4,0x0f,0xb2,0x65,0xa7,0xab,0xea,0xee,0x79,0x39,0xd9,0x1a,
 0x58,0x5f,0xe5,0x9f,0x70,0x53,0xf9,0x82,0xc2,0x96,0xec,0x41,
 0x3c,0x62,0x4c,0x66,0x93,0x08,0xf8,0x7a,
};
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[] = {
 0x08,0xbc,0xf6,0xe9,0x77,0x7a,0x9c,0x31,0x3a,0x3d,0xb6,0xda,
 0xa5,0x10,0xf2,0xd3,0x98,0x40,0x33,0x19,0xc2,0x34,0x1b,0xd5,
 0x06,0xa9,0x2e,0x67,0x2e,0xb7,0xe3,0x07,
};
const unsigned char tc_K[] = {
 0xe2,0x2b,0x1e,0xf7,0x78,0x8f,0x66,0x14,0x78,0xf3,0xcd,0xdd,
 0x4c,0x60,0x07,0x74,0xfc,0x0f,0x41,0xe6,0xb7,0x11,0x56,0x91,
 0x90,0xff,0x88,0xfa,0x0e,0x60,0x7e,0x09,
};
const unsigned char tc_ISK_IR[] = {
 0x4c,0x54,0x69,0xa1,0x6b,0x23,0x64,0xc4,0xb9,0x44,0xeb,0xc1,
 0xa7,0x9e,0x51,0xd1,0x67,0x4a,0xd4,0x7d,0xb2,0x6e,0x87,0x18,
 0x15,0x4f,0x59,0xfa,0xeb,0xfa,0xa5,0x2d,0x83,0x46,0xf3,0x0a,
 0xa5,0x83,0x77,0x11,0x7e,0xb2,0x0d,0x52,0x7f,0x2c,0xbc,0x5c,
 0x76,0x38,0x1f,0x7f,0xd3,0x72,0xe8,0x9d,0xf8,0x23,0x9f,0x87,
 0xf2,0xe0,0x2e,0xd1,
};
const unsigned char tc_ISK_SY[] = {
 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3,
 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28,
 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02,
 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7,
 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f,
 0xa1,0x23,0x7f,0x35,
};
const unsigned char tc_ISK_SY[] = {
 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3,
 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28,
 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02,
 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7,
 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f,
 0xa1,0x23,0x7f,0x35,
};
const unsigned char tc_sid_out_ir[] = {
 0x2a,0x76,0xd3,0xbb,0xc4,0x99,0xdf,0xdc,0x4d,0xca,0xcc,0x9f,
 0xf0,0x42,0xf4,0xe1,0xa5,0x4e,0x38,0x43,0x25,0x8e,0x10,0x0c,
 0xcd,0x7c,0x60,0xf0,0xa5,0x41,0xf9,0xd3,0xeb,0xf0,0x25,0xe6,
 0x8a,0x46,0x0d,0xde,0x21,0x8b,0xd3,0x9f,0x07,0x11,0xbc,0x6f,
 0xa1,0x14,0x09,0xc9,0xd7,0xb6,0x9d,0x8c,0xcf,0x6b,0x32,0xfc,
 0x51,0xdd,0xb6,0x99,
};
const unsigned char tc_sid_out_oc[] = {
 0xca,0x4b,0x50,0x70,0x0c,0x46,0x20,0x3c,0xcd,0x10,0xbc,0x0e,
 0x9f,0x31,0x09,0x5e,0x50,0x81,0x89,0xcb,0x59,0x85,0x75,0x37,
 0xbe,0x56,0x10,0x48,0xd3,0x4b,0x9e,0xd9,0xa9,0x69,0x7a,0xf1,
 0x1c,0x99,0x8f,0x48,0x4c,0x3d,0x78,0x3b,0x0b,0x53,0x14,0x34,
 0xca,0xa6,0x83,0x5d,0x4c,0x32,0x34,0x4f,0xcd,0x17,0x16,0x0c,
 0x9c,0x34,0x8f,0xc7,
};
]]></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[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIkE2RkM4MkMzQj
 #g5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQTUwRDI0OEYwQzdDQTZBMThCMDkwMkEz
 #MEIzNkIiLCAieWEiOiAiREEzRDIzNzAwQTlFNTY5OTI1OEFFRjk0REMwNjBERkRBNU
 #VCQjYxRjAyQTVFQTc3RkFENTNGNEZGMDk3NkQwOCIsICJBRGEiOiAiNDE0NDYxIiwg
 #IllhIjogIkQ0MEZCMjY1QTdBQkVBRUU3OTM5RDkxQTU4NUZFNTlGNzA1M0Y5ODJDMj
 #k2RUM0MTNDNjI0QzY2OTMwOEY4N0EiLCAieWIiOiAiRDIzMTZCNDU0NzE4QzM1MzYy
 #RDgzRDY5REY2MzIwRjM4NTc4RUQ1OTg0NjUxNDM1RTI5NDk3NjJEOTAwQjgwRCIsIC
 #JBRGIiOiAiNDE0NDYyIiwgIlliIjogIjA4QkNGNkU5Nzc3QTlDMzEzQTNEQjZEQUE1
 #MTBGMkQzOTg0MDMzMTlDMjM0MUJENTA2QTkyRTY3MkVCN0UzMDciLCAiSyI6ICJFMj
 #JCMUVGNzc4OEY2NjE0NzhGM0NEREQ0QzYwMDc3NEZDMEY0MUU2QjcxMTU2OTE5MEZG
 #ODhGQTBFNjA3RTA5IiwgIklTS19JUiI6ICI0QzU0NjlBMTZCMjM2NEM0Qjk0NEVCQz
 #FBNzlFNTFEMTY3NEFENDdEQjI2RTg3MTgxNTRGNTlGQUVCRkFBNTJEODM0NkYzMEFB
 #NTgzNzcxMTdFQjIwRDUyN0YyQ0JDNUM3NjM4MUY3RkQzNzJFODlERjgyMzlGODdGMk
 #UwMkVEMSIsICJJU0tfU1kiOiAiOTgwRENDNUExQzUyQ0VFQTAzMUU3NUYzOEVEMjY2
 #NTg2NjE2NDg4QzVDNTc4MDI4NUZDQkNGNzkwODdDN0JDREJEOTkzNTAyRUVFNjA2Qj
 #cxOEJBMzFFODQwQTAwMEE3QjdCRUZFMTVFQTQyN0M1Q0ZFODgzNDRGQTEyMzdGMzUi
 #LCAic2lkX291dHB1dF9pciI6ICIyQTc2RDNCQkM0OTlERkRDNERDQUNDOUZGMDQyRj
 #RFMUE1NEUzODQzMjU4RTEwMENDRDdDNjBGMEE1NDFGOUQzRUJGMDI1RTY4QTQ2MERE
 #RTIxOEJEMzlGMDcxMUJDNkZBMTE0MDlDOUQ3QjY5RDhDQ0Y2QjMyRkM1MUREQjY5OS
 #IsICJzaWRfb3V0cHV0X29jIjogIkNBNEI1MDcwMEM0NjIwM0NDRDEwQkMwRTlGMzEw
 #OTVFNTA4MTg5Q0I1OTg1NzUzN0JFNTYxMDQ4RDM0QjlFRDlBOTY5N0FGMTFDOTk4Rj
 #Q4NEMzRDc4M0IwQjUzMTQzNENBQTY4MzVENEMzMjM0NEZDRDE3MTYwQzlDMzQ4RkM3
 #In0=
]]></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'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 180 bytes)
      0d435061636544656361663434380850617373776f72647000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000001a6f630b
      425f726573706f6e6465720b415f696e69746961746f72105223e0cd
      c45d6575668d64c552004124
    hash result: (length: 112 bytes)
      7148f4d60587aaafa64d2fd6bcfe45ee71e8b971d1d5ff3bbf8c1451
      797c62a1af22ab25638749f97f9b15fedcf4aeee87282cf667594ab0
      92b6023c8f8d3a61c38b0af791c9271137df01b57d63b79734bbce69
      91e3e2e10fdc805abc9e6e6f3daeff6fd34093d26de240b326764252
    encoded generator g: (length: 56 bytes)
      9a700ecc378eb98e57387df456d5b4b4f1dceebbb1371527eeb7e1bf
      bab64ecc9c9303396145ba04f5b5aea5baedfa61f31f00fbc5fd5606
]]></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
 #NjE2MzY1NDQ2NTYzNjE2NjM0MzQzOCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNz
 #A2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1MjIz
 #RTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnZW5lcmF0b3Jfc3RyaW5nKE
 #cuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIwRDQzNTA2MTYzNjU0NDY1
 #NjM2MTY2MzQzNDM4MDg1MDYxNzM3Mzc3NkY3MjY0NzAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2
 #OTc0Njk2MTc0NkY3MjEwNTIyM0UwQ0RDNDVENjU3NTY2OEQ2NEM1NTIwMDQxMjQiLC
 #AiaGFzaCByZXN1bHQiOiAiNzE0OEY0RDYwNTg3QUFBRkE2NEQyRkQ2QkNGRTQ1RUU3
 #MUU4Qjk3MUQxRDVGRjNCQkY4QzE0NTE3OTdDNjJBMUFGMjJBQjI1NjM4NzQ5Rjk3Rj
 #lCMTVGRURDRjRBRUVFODcyODJDRjY2NzU5NEFCMDkyQjYwMjNDOEY4RDNBNjFDMzhC
 #MEFGNzkxQzkyNzExMzdERjAxQjU3RDYzQjc5NzM0QkJDRTY5OTFFM0UyRTEwRkRDOD
 #A1QUJDOUU2RTZGM0RBRUZGNkZEMzQwOTNEMjZERTI0MEIzMjY3NjQyNTIiLCAiZW5j
 #b2RlZCBnZW5lcmF0b3IgZyI6ICI5QTcwMEVDQzM3OEVCOThFNTczODdERjQ1NkQ1Qj
 #RCNEYxRENFRUJCQjEzNzE1MjdFRUI3RTFCRkJBQjY0RUNDOUM5MzAzMzk2MTQ1QkEw
 #NEY1QjVBRUE1QkFFREZBNjFGMzFGMDBGQkM1RkQ1NjA2In0=
]]></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)
      627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be846c
      c0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e571b
]]></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)
      8e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3011871
      7019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f94772db
]]></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)
      94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97
      32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97
      32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f
]]></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)
      38627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be84
      6cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e57
      1b03414461388e9811e4402fac098743ca7b2b509b91b38c8cf1360c
      c6cab30118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f
      8399f94772db03414462
    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
      8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363
      cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7
      6d473e01689af77f38627f8bb2ae945e2a518967df9b00aff19253d3
      086398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a937
      2a17e66bb7006e571b03414461388e9811e4402fac098743ca7b2b50
      9b91b38c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b7
      74e6b0e0b826ff4f8399f94772db03414462
    ISK result: (length: 64 bytes)
      9c2726a6cda1179349cbc38f31765eab646a2a5f176f3019fab4a0aa
      bd9d17c2ba895998cff698d801761a003512c1cf67d144b21e1cb6d6
      b82da71d0da76cad
]]></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)
      6f63388e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3
      0118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f9
      4772db0341446238627f8bb2ae945e2a518967df9b00aff19253d308
      6398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a
      17e66bb7006e571b03414461
    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
      8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363
      cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7
      6d473e01689af77f6f63388e9811e4402fac098743ca7b2b509b91b3
      8c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b774e6b0
      e0b826ff4f8399f94772db0341446238627f8bb2ae945e2a518967df
      9b00aff19253d3086398f2ec18be846cc0d1f286c2ce3caf1da63985
      9ccd2a6a01a9372a17e66bb7006e571b03414461
    ISK result: (length: 64 bytes)
      6d2178ed3048703025b9007ec84c4d969e8d8135df455e608c16aa15
      2e1219c86cea563254428a9d969903ae3649d1050da1e6e0c1c060e1
      ebf7316a7e993389
]]></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"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      65bffde17b7acf07cfd437bdb973a8f7340bf911d393a61498c0a50e
      f0d68bca103fbdb0f5b799505562e59811df1bc5d9b4f5f0f7c57c22
      cd7ed6db4d153e3a
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      7ce27043d1b1d0d0e02e16979637e2a00547ed6e15ea988f7d3c9b3c
      2159b26ab3834bff7ff86240323e25216ba2ee6ea6e1582502017f8e
      6d65f8c4a5e65543
]]></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[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,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[] = {
 0x9a,0x70,0x0e,0xcc,0x37,0x8e,0xb9,0x8e,0x57,0x38,0x7d,0xf4,
 0x56,0xd5,0xb4,0xb4,0xf1,0xdc,0xee,0xbb,0xb1,0x37,0x15,0x27,
 0xee,0xb7,0xe1,0xbf,0xba,0xb6,0x4e,0xcc,0x9c,0x93,0x03,0x39,
 0x61,0x45,0xba,0x04,0xf5,0xb5,0xae,0xa5,0xba,0xed,0xfa,0x61,
 0xf3,0x1f,0x00,0xfb,0xc5,0xfd,0x56,0x06,
};
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[] = {
 0x62,0x7f,0x8b,0xb2,0xae,0x94,0x5e,0x2a,0x51,0x89,0x67,0xdf,
 0x9b,0x00,0xaf,0xf1,0x92,0x53,0xd3,0x08,0x63,0x98,0xf2,0xec,
 0x18,0xbe,0x84,0x6c,0xc0,0xd1,0xf2,0x86,0xc2,0xce,0x3c,0xaf,
 0x1d,0xa6,0x39,0x85,0x9c,0xcd,0x2a,0x6a,0x01,0xa9,0x37,0x2a,
 0x17,0xe6,0x6b,0xb7,0x00,0x6e,0x57,0x1b,
};
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[] = {
 0x8e,0x98,0x11,0xe4,0x40,0x2f,0xac,0x09,0x87,0x43,0xca,0x7b,
 0x2b,0x50,0x9b,0x91,0xb3,0x8c,0x8c,0xf1,0x36,0x0c,0xc6,0xca,
 0xb3,0x01,0x18,0x71,0x70,0x19,0x78,0x2b,0x7f,0x58,0xa5,0x91,
 0xc6,0x3d,0x9c,0x92,0x47,0xb7,0x74,0xe6,0xb0,0xe0,0xb8,0x26,
 0xff,0x4f,0x83,0x99,0xf9,0x47,0x72,0xdb,
};
const unsigned char tc_K[] = {
 0x94,0xf4,0xae,0x49,0x4f,0x4e,0x8b,0x07,0xad,0xe3,0x35,0x47,
 0x26,0xee,0xe4,0x9c,0x55,0x18,0xb3,0x63,0xcd,0xa5,0x44,0xf5,
 0xb4,0x54,0x1b,0x97,0x32,0x83,0x0b,0xe3,0x7e,0xa0,0xe6,0x3f,
 0xc8,0x3f,0x54,0xbe,0x28,0x0d,0xea,0x07,0x47,0xa0,0x43,0xc7,
 0x6d,0x47,0x3e,0x01,0x68,0x9a,0xf7,0x7f,
};
const unsigned char tc_ISK_IR[] = {
 0x9c,0x27,0x26,0xa6,0xcd,0xa1,0x17,0x93,0x49,0xcb,0xc3,0x8f,
 0x31,0x76,0x5e,0xab,0x64,0x6a,0x2a,0x5f,0x17,0x6f,0x30,0x19,
 0xfa,0xb4,0xa0,0xaa,0xbd,0x9d,0x17,0xc2,0xba,0x89,0x59,0x98,
 0xcf,0xf6,0x98,0xd8,0x01,0x76,0x1a,0x00,0x35,0x12,0xc1,0xcf,
 0x67,0xd1,0x44,0xb2,0x1e,0x1c,0xb6,0xd6,0xb8,0x2d,0xa7,0x1d,
 0x0d,0xa7,0x6c,0xad,
};
const unsigned char tc_ISK_SY[] = {
 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e,
 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60,
 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32,
 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05,
 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a,
 0x7e,0x99,0x33,0x89,
};
const unsigned char tc_ISK_SY[] = {
 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e,
 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60,
 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32,
 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05,
 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a,
 0x7e,0x99,0x33,0x89,
};
const unsigned char tc_sid_out_ir[] = {
 0x65,0xbf,0xfd,0xe1,0x7b,0x7a,0xcf,0x07,0xcf,0xd4,0x37,0xbd,
 0xb9,0x73,0xa8,0xf7,0x34,0x0b,0xf9,0x11,0xd3,0x93,0xa6,0x14,
 0x98,0xc0,0xa5,0x0e,0xf0,0xd6,0x8b,0xca,0x10,0x3f,0xbd,0xb0,
 0xf5,0xb7,0x99,0x50,0x55,0x62,0xe5,0x98,0x11,0xdf,0x1b,0xc5,
 0xd9,0xb4,0xf5,0xf0,0xf7,0xc5,0x7c,0x22,0xcd,0x7e,0xd6,0xdb,
 0x4d,0x15,0x3e,0x3a,
};
const unsigned char tc_sid_out_oc[] = {
 0x7c,0xe2,0x70,0x43,0xd1,0xb1,0xd0,0xd0,0xe0,0x2e,0x16,0x97,
 0x96,0x37,0xe2,0xa0,0x05,0x47,0xed,0x6e,0x15,0xea,0x98,0x8f,
 0x7d,0x3c,0x9b,0x3c,0x21,0x59,0xb2,0x6a,0xb3,0x83,0x4b,0xff,
 0x7f,0xf8,0x62,0x40,0x32,0x3e,0x25,0x21,0x6b,0xa2,0xee,0x6e,
 0xa6,0xe1,0x58,0x25,0x02,0x01,0x7f,0x8e,0x6d,0x65,0xf8,0xc4,
 0xa5,0xe6,0x55,0x43,
};
]]></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[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIjlBNzAwRUNDMz
 #c4RUI5OEU1NzM4N0RGNDU2RDVCNEI0RjFEQ0VFQkJCMTM3MTUyN0VFQjdFMUJGQkFC
 #NjRFQ0M5QzkzMDMzOTYxNDVCQTA0RjVCNUFFQTVCQUVERkE2MUYzMUYwMEZCQzVGRD
 #U2MDYiLCAieWEiOiAiMzNENTYxRjEzQ0ZDMERDQTI3OUMzMEU4Q0RFODk1MTc1REMy
 #NTQ4Mzg5MjgxOUVCQTEzMkQ1OEMxM0MwNDYyQThFQjBENzNGREE5NDE5NTA1OTRCRU
 #Y1MTkxRDgzOTQ2OTFGODZFREZGQ0FENkMxRSIsICJBRGEiOiAiNDE0NDYxIiwgIllh
 #IjogIjYyN0Y4QkIyQUU5NDVFMkE1MTg5NjdERjlCMDBBRkYxOTI1M0QzMDg2Mzk4Rj
 #JFQzE4QkU4NDZDQzBEMUYyODZDMkNFM0NBRjFEQTYzOTg1OUNDRDJBNkEwMUE5Mzcy
 #QTE3RTY2QkI3MDA2RTU3MUIiLCAieWIiOiAiMjUyM0M5NjlGNjhGQTJCMkFFQTI5NE
 #MyNTM5RUYzNkVCMUUwNTU4QUJEMTQ3MTJBNzgyOEYxNkE4NUVEMkM3RTc3RTJCREQ0
 #MTg5OTQ0MDVGQjFCNTdCNkJCQUFERDY2ODQ5ODkyQUFDOUQ4MTQwMiIsICJBRGIiOi
 #AiNDE0NDYyIiwgIlliIjogIjhFOTgxMUU0NDAyRkFDMDk4NzQzQ0E3QjJCNTA5Qjkx
 #QjM4QzhDRjEzNjBDQzZDQUIzMDExODcxNzAxOTc4MkI3RjU4QTU5MUM2M0Q5QzkyND
 #dCNzc0RTZCMEUwQjgyNkZGNEY4Mzk5Rjk0NzcyREIiLCAiSyI6ICI5NEY0QUU0OTRG
 #NEU4QjA3QURFMzM1NDcyNkVFRTQ5QzU1MThCMzYzQ0RBNTQ0RjVCNDU0MUI5NzMyOD
 #MwQkUzN0VBMEU2M0ZDODNGNTRCRTI4MERFQTA3NDdBMDQzQzc2RDQ3M0UwMTY4OUFG
 #NzdGIiwgIklTS19JUiI6ICI5QzI3MjZBNkNEQTExNzkzNDlDQkMzOEYzMTc2NUVBQj
 #Y0NkEyQTVGMTc2RjMwMTlGQUI0QTBBQUJEOUQxN0MyQkE4OTU5OThDRkY2OThEODAx
 #NzYxQTAwMzUxMkMxQ0Y2N0QxNDRCMjFFMUNCNkQ2QjgyREE3MUQwREE3NkNBRCIsIC
 #JJU0tfU1kiOiAiNkQyMTc4RUQzMDQ4NzAzMDI1QjkwMDdFQzg0QzREOTY5RThEODEz
 #NURGNDU1RTYwOEMxNkFBMTUyRTEyMTlDODZDRUE1NjMyNTQ0MjhBOUQ5Njk5MDNBRT
 #M2NDlEMTA1MERBMUU2RTBDMUMwNjBFMUVCRjczMTZBN0U5OTMzODkiLCAic2lkX291
 #dHB1dF9pciI6ICI2NUJGRkRFMTdCN0FDRjA3Q0ZENDM3QkRCOTczQThGNzM0MEJGOT
 #ExRDM5M0E2MTQ5OEMwQTUwRUYwRDY4QkNBMTAzRkJEQjBGNUI3OTk1MDU1NjJFNTk4
 #MTFERjFCQzVEOUI0RjVGMEY3QzU3QzIyQ0Q3RUQ2REI0RDE1M0UzQSIsICJzaWRfb3
 #V0cHV0X29jIjogIjdDRTI3MDQzRDFCMUQwRDBFMDJFMTY5Nzk2MzdFMkEwMDU0N0VE
 #NkUxNUVBOTg4RjdEM0M5QjNDMjE1OUIyNkFCMzgzNEJGRjdGRjg2MjQwMzIzRTI1Mj
 #E2QkEyRUU2RUE2RTE1ODI1MDIwMTdGOEU2RDY1RjhDNEE1RTY1NTQzIn0=
]]></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'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 34b36454cab2e7842c389f7d88ecb7df
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 108 bytes)
      1e4350616365503235365f584d443a5348412d3235365f535357555f
      4e555f0850617373776f726417000000000000000000000000000000
      00000000000000001a6f630b425f726573706f6e6465720b415f696e
      69746961746f721034b36454cab2e7842c389f7d88ecb7df
    generator g: (length: 65 bytes)
      04eee577320b1c241a79419fcde5718c2b63f81ef8717d56a57d2fb2
      6b65a8beb63573b52605efb32ff4cf31aaef9a92df84e4e8408cc6c7
      cf27a535aad2b38a56
]]></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
 #U1RiIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2
 #RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIzNEIzNjQ1NENBQjJFNzg0MkMzODlGN0
 #Q4OEVDQjdERiIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5z
 #X2luX2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4ND
 #EyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDE3MDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2Mz
 #BCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEw
 #MzRCMzY0NTRDQUIyRTc4NDJDMzg5RjdEODhFQ0I3REYiLCAiZ2VuZXJhdG9yIGciOi
 #AiMDRFRUU1NzczMjBCMUMyNDFBNzk0MTlGQ0RFNTcxOEMyQjYzRjgxRUY4NzE3RDU2
 #QTU3RDJGQjI2QjY1QThCRUI2MzU3M0I1MjYwNUVGQjMyRkY0Q0YzMUFBRUY5QTkyRE
 #Y4NEU0RTg0MDhDQzZDN0NGMjdBNTM1QUFEMkIzOEE1NiJ9
]]></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)
      041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364
      692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c5d
      fdfc2ecdf8e42c5e16
    Alternative correct value for Ya: (-ya)*g:
    (length: 65 bytes)
      041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364
      692fdace1715a59cb0e63df85b2ad1529397e85e9c30d0d01dbf93a2
      0203d132071bd3a1e9
]]></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)
      046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a
      cc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5ce8b677
      a7e38a26f752bf8f84
    Alternative correct value for Yb: (-yb)*g:
    (length: 65 bytes)
      046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a
      cc8ec3544890612d15def6ece092e1c0a1b9c2d2cdf3b0e0a4174988
      581c75d908ad40707b
]]></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)
      3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d
      7b8f6b6c
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d
      7b8f6b6c
]]></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)
      41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e13
      64692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c
      5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8cd
      786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e921091320
      6d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f8403414462
    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
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f
      8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b
      6c41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e
      1364692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe340
      6c5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8
      cd786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e9210913
      206d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f84034144
      62
    ISK result: (length: 32 bytes)
      9565ed286b6e3cf1f943fd31746f9a22935537025a1328d4980005ba
      984f0c39
]]></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)
      6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1
      617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5c
      e8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24fc0
      4c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19c2
      07a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e160341
      4461
    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
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f
      8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b
      6c6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158c
      e1617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f
      5ce8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24f
      c04c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19
      c207a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e1603
      414461
    ISK result: (length: 32 bytes)
      62a445a4daa3546dd031c66ead2e4e015abbcc83bde31c90f841149f
      d441c58a
]]></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"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      a7386d1c2eb06e8056d7fecbcf691e08d189d96236020ef31b414069
      8a4b99f9
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      d337dbc0dd797b4e6f2f14ea4925c58e5d5523871e8cb43a3c1b0f2b
      1a1ffde3
]]></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[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,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,0xee,0xe5,0x77,0x32,0x0b,0x1c,0x24,0x1a,0x79,0x41,0x9f,
 0xcd,0xe5,0x71,0x8c,0x2b,0x63,0xf8,0x1e,0xf8,0x71,0x7d,0x56,
 0xa5,0x7d,0x2f,0xb2,0x6b,0x65,0xa8,0xbe,0xb6,0x35,0x73,0xb5,
 0x26,0x05,0xef,0xb3,0x2f,0xf4,0xcf,0x31,0xaa,0xef,0x9a,0x92,
 0xdf,0x84,0xe4,0xe8,0x40,0x8c,0xc6,0xc7,0xcf,0x27,0xa5,0x35,
 0xaa,0xd2,0xb3,0x8a,0x56,
};
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,0x1f,0x12,0xad,0x5f,0xc6,0x50,0x10,0xa2,0x4f,0xc0,0x4c,
 0x86,0x19,0x71,0x09,0xa3,0x6d,0xf0,0xe9,0xce,0x85,0xa7,0x47,
 0x9e,0x1e,0x13,0x64,0x69,0x2f,0xda,0xce,0x17,0xea,0x5a,0x63,
 0x4e,0x19,0xc2,0x07,0xa5,0xd5,0x2e,0xad,0x6c,0x68,0x17,0xa1,
 0x63,0xcf,0x2f,0x2f,0xe3,0x40,0x6c,0x5d,0xfd,0xfc,0x2e,0xcd,
 0xf8,0xe4,0x2c,0x5e,0x16,
};
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,0x6a,0x51,0x18,0x0b,0x6e,0xba,0xba,0xf5,0xed,0x0a,0xf8,
 0xcd,0x78,0x68,0x86,0xd9,0x33,0x42,0xbc,0xae,0x4c,0x15,0x8c,
 0xe1,0x61,0x7a,0x0a,0xcc,0x8e,0xc3,0x54,0x48,0x6f,0x9e,0xd2,
 0xe9,0x21,0x09,0x13,0x20,0x6d,0x1e,0x3f,0x5e,0x46,0x3d,0x2d,
 0x32,0x0c,0x4f,0x1f,0x5c,0xe8,0xb6,0x77,0xa7,0xe3,0x8a,0x26,
 0xf7,0x52,0xbf,0x8f,0x84,
};
const unsigned char tc_K[] = {
 0x3e,0x0e,0x2f,0x89,0x76,0xfb,0x8d,0x0d,0xee,0xe3,0x0a,0xef,
 0x4b,0x5c,0xd3,0x63,0x1e,0xed,0x24,0x9a,0xf3,0x2f,0x53,0xd0,
 0xdd,0x00,0x9b,0x5d,0x7b,0x8f,0x6b,0x6c,
};
const unsigned char tc_ISK_IR[] = {
 0x95,0x65,0xed,0x28,0x6b,0x6e,0x3c,0xf1,0xf9,0x43,0xfd,0x31,
 0x74,0x6f,0x9a,0x22,0x93,0x55,0x37,0x02,0x5a,0x13,0x28,0xd4,
 0x98,0x00,0x05,0xba,0x98,0x4f,0x0c,0x39,
};
const unsigned char tc_ISK_SY[] = {
 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e,
 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90,
 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a,
};
const unsigned char tc_ISK_SY[] = {
 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e,
 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90,
 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a,
};
const unsigned char tc_sid_out_ir[] = {
 0xa7,0x38,0x6d,0x1c,0x2e,0xb0,0x6e,0x80,0x56,0xd7,0xfe,0xcb,
 0xcf,0x69,0x1e,0x08,0xd1,0x89,0xd9,0x62,0x36,0x02,0x0e,0xf3,
 0x1b,0x41,0x40,0x69,0x8a,0x4b,0x99,0xf9,
};
const unsigned char tc_sid_out_oc[] = {
 0xd3,0x37,0xdb,0xc0,0xdd,0x79,0x7b,0x4e,0x6f,0x2f,0x14,0xea,
 0x49,0x25,0xc5,0x8e,0x5d,0x55,0x23,0x87,0x1e,0x8c,0xb4,0x3a,
 0x3c,0x1b,0x0f,0x2b,0x1a,0x1f,0xfd,0xe3,
};
]]></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[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIz
 #NEIzNjQ1NENBQjJFNzg0MkMzODlGN0Q4OEVDQjdERiIsICJnIjogIjA0RUVFNTc3Mz
 #IwQjFDMjQxQTc5NDE5RkNERTU3MThDMkI2M0Y4MUVGODcxN0Q1NkE1N0QyRkIyNkI2
 #NUE4QkVCNjM1NzNCNTI2MDVFRkIzMkZGNENGMzFBQUVGOUE5MkRGODRFNEU4NDA4Q0
 #M2QzdDRjI3QTUzNUFBRDJCMzhBNTYiLCAieWEiOiAiMzc1NzRDRkJGMUI5NUZGNkE4
 #RTJEN0JFNDYyRDREMDFFNkRERTI2MThGMzRGNERFOURGODY5QjI0RjUzMkM1RCIsIC
 #JBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MUYxMkFENUZDNjUwMTBBMjRGQzA0Qzg2
 #MTk3MTA5QTM2REYwRTlDRTg1QTc0NzlFMUUxMzY0NjkyRkRBQ0UxN0VBNUE2MzRFMT
 #lDMjA3QTVENTJFQUQ2QzY4MTdBMTYzQ0YyRjJGRTM0MDZDNURGREZDMkVDREY4RTQy
 #QzVFMTYiLCAieWIiOiAiRTU2NzJGQzlFQjRFNzIxRjQxRDgwMTgxRUM0QzlGRDk4OD
 #Y2NjhBQ0M0ODAyNEQzM0M4MkJCMTAyQUVDQkE1MiIsICJBRGIiOiAiNDE0NDYyIiwg
 #IlliIjogIjA0NkE1MTE4MEI2RUJBQkFGNUVEMEFGOENENzg2ODg2RDkzMzQyQkNBRT
 #RDMTU4Q0UxNjE3QTBBQ0M4RUMzNTQ0ODZGOUVEMkU5MjEwOTEzMjA2RDFFM0Y1RTQ2
 #M0QyRDMyMEM0RjFGNUNFOEI2NzdBN0UzOEEyNkY3NTJCRjhGODQiLCAiSyI6ICIzRT
 #BFMkY4OTc2RkI4RDBERUVFMzBBRUY0QjVDRDM2MzFFRUQyNDlBRjMyRjUzRDBERDAw
 #OUI1RDdCOEY2QjZDIiwgIklTS19JUiI6ICI5NTY1RUQyODZCNkUzQ0YxRjk0M0ZEMz
 #E3NDZGOUEyMjkzNTUzNzAyNUExMzI4RDQ5ODAwMDVCQTk4NEYwQzM5IiwgIklTS19T
 #WSI6ICI2MkE0NDVBNERBQTM1NDZERDAzMUM2NkVBRDJFNEUwMTVBQkJDQzgzQkRFMz
 #FDOTBGODQxMTQ5RkQ0NDFDNThBIiwgInNpZF9vdXRwdXRfaXIiOiAiQTczODZEMUMy
 #RUIwNkU4MDU2RDdGRUNCQ0Y2OTFFMDhEMTg5RDk2MjM2MDIwRUYzMUI0MTQwNjk4QT
 #RCOTlGOSIsICJzaWRfb3V0cHV0X29jIjogIkQzMzdEQkMwREQ3OTdCNEU2RjJGMTRF
 #QTQ5MjVDNThFNUQ1NTIzODcxRThDQjQzQTNDMUIwRjJCMUExRkZERTMifQ==
]]></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'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5b3773aa90e8f23c61563a4b645b276c
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      1e4350616365503338345f584d443a5348412d3338345f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72105b3773aa90e8f23c61563a4b
      645b276c
    generator g: (length: 97 bytes)
      04ffe1bdc3293fdbe31b2959916e52c018e923eac99836bd9a1cbeec
      794a8d4d78baa32cdafc9685bc1067a780f4ad9c8a6c6e164aa42906
      d1e27f782581adc8e0109219626a2b8fbdc34602e4084554bdd6c0c6
      98dd657ac8e31b2bcce1c7b0d8
]]></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
 #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5
 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiNUIzNzczQUE5MEU4RjIzQzYxNTYzQT
 #RCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu
 #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0OD
 #QxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0
 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwNUIzNzczQUE5MEU4RjIzQzYxNT
 #YzQTRCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yIGciOiAiMDRGRkUxQkRDMzI5M0ZEQkUz
 #MUIyOTU5OTE2RTUyQzAxOEU5MjNFQUM5OTgzNkJEOUExQ0JFRUM3OTRBOEQ0RDc4Qk
 #FBMzJDREFGQzk2ODVCQzEwNjdBNzgwRjRBRDlDOEE2QzZFMTY0QUE0MjkwNkQxRTI3
 #Rjc4MjU4MUFEQzhFMDEwOTIxOTYyNkEyQjhGQkRDMzQ2MDJFNDA4NDU1NEJERDZDME
 #M2OThERDY1N0FDOEUzMUIyQkNDRTFDN0IwRDgifQ==
]]></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)
      0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7
      3b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993a3
      6285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1770050
      a94d6826d52f211b234792e66d
    Alternative correct value for Ya: (-ya)*g:
    (length: 97 bytes)
      0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7
      3b96fa1ec78619c5a1e524472778331fbe009fa156b5cdfc1bd66c5c
      9d7a05ab193dbe7b02dd8ba737887e41e9000b924368f33e4d88ffaf
      55b297d92ad0dee4ddb86d1992
]]></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)
      040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d
      104cdaeb630b7c5c18748deb25653ad2a4cb5e6274841cad328bb031
      2628b9b1f51bea72b8c610999a6730f752649205ae85c452ef83f98b
      e715cd0103186874b07cf02074
    Alternative correct value for Yb: (-yb)*g:
    (length: 97 bytes)
      040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d
      104cdaeb630b7c5c18748deb25653ad2a4cb5e62747be352cd744fce
      d9d7464e0ae4158d4739ef666598cf08ad9b6dfa517a3bad0f7c0674
      17ea32fefce7978b50830fdf8b
]]></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)
      a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6
      db858fe161de7576206a8a35bd4a60e00724fd3e
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6
      db858fe161de7576206a8a35bd4a60e00724fd3e
]]></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)
      610434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310
      b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993
      a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b17700
      50a94d6826d52f211b234792e66d0341446161040a6559147fd492ad
      74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c5c18
      748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea72b8
      c610999a6730f752649205ae85c452ef83f98be715cd0103186874b0
      7cf0207403414462
    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
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae
      a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f
      e161de7576206a8a35bd4a60e00724fd3e610434a04da121995d81d7
      c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5a1e5
      24472778331fbe009fa1564a3203e42993a36285fa54e6c24184fd22
      7458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b2347
      92e66d0341446161040a6559147fd492ad74ab1f4def6196fd639954
      0e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb5e62
      74841cad328bb0312628b9b1f51bea72b8c610999a6730f752649205
      ae85c452ef83f98be715cd0103186874b07cf0207403414462
    ISK result: (length: 48 bytes)
      d1b74375c7d63d7de246cbf3fc2b3092645c73a0aa816989c0de6048
      ed4ece6a54df82d05d2be3498cb9288be7bdbdb9
]]></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)
      6f63610434a04da121995d81d7c5ded02cf2e70954dca49059485ea3
      8310b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e4
      2993a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1
      770050a94d6826d52f211b234792e66d0341446161040a6559147fd4
      92ad74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c
      5c18748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea
      72b8c610999a6730f752649205ae85c452ef83f98be715cd01031868
      74b07cf0207403414462
    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
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae
      a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f
      e161de7576206a8a35bd4a60e00724fd3e6f63610434a04da121995d
      81d7c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5
      a1e524472778331fbe009fa1564a3203e42993a36285fa54e6c24184
      fd227458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b
      234792e66d0341446161040a6559147fd492ad74ab1f4def6196fd63
      99540e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb
      5e6274841cad328bb0312628b9b1f51bea72b8c610999a6730f75264
      9205ae85c452ef83f98be715cd0103186874b07cf0207403414462
    ISK result: (length: 48 bytes)
      a051d4532ca9fb6774e097ebac69c1d6a18144a15421dc155d0b1e8a
      ef9f9d8c0fe86e85d3cbee7796ff50171f42801b
]]></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"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      8d5a03946a69ffa12cd6efd469fe8671bbc25fad6db2656f3963c94e
      9c940bdecc2bd555474c211817787d5cf7870ed1
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      c0729db25db40c48a35f787d5410b2cb9a2d9f5e9cf1cf159ed2f63c
      6b2185e597e176cc221422e9496eeda2bf123c8b
]]></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[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,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,0xff,0xe1,0xbd,0xc3,0x29,0x3f,0xdb,0xe3,0x1b,0x29,0x59,
 0x91,0x6e,0x52,0xc0,0x18,0xe9,0x23,0xea,0xc9,0x98,0x36,0xbd,
 0x9a,0x1c,0xbe,0xec,0x79,0x4a,0x8d,0x4d,0x78,0xba,0xa3,0x2c,
 0xda,0xfc,0x96,0x85,0xbc,0x10,0x67,0xa7,0x80,0xf4,0xad,0x9c,
 0x8a,0x6c,0x6e,0x16,0x4a,0xa4,0x29,0x06,0xd1,0xe2,0x7f,0x78,
 0x25,0x81,0xad,0xc8,0xe0,0x10,0x92,0x19,0x62,0x6a,0x2b,0x8f,
 0xbd,0xc3,0x46,0x02,0xe4,0x08,0x45,0x54,0xbd,0xd6,0xc0,0xc6,
 0x98,0xdd,0x65,0x7a,0xc8,0xe3,0x1b,0x2b,0xcc,0xe1,0xc7,0xb0,
 0xd8,
};
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,0x34,0xa0,0x4d,0xa1,0x21,0x99,0x5d,0x81,0xd7,0xc5,0xde,
 0xd0,0x2c,0xf2,0xe7,0x09,0x54,0xdc,0xa4,0x90,0x59,0x48,0x5e,
 0xa3,0x83,0x10,0xb7,0x3b,0x96,0xfa,0x1e,0xc7,0x86,0x19,0xc5,
 0xa1,0xe5,0x24,0x47,0x27,0x78,0x33,0x1f,0xbe,0x00,0x9f,0xa1,
 0x56,0x4a,0x32,0x03,0xe4,0x29,0x93,0xa3,0x62,0x85,0xfa,0x54,
 0xe6,0xc2,0x41,0x84,0xfd,0x22,0x74,0x58,0xc8,0x77,0x81,0xbe,
 0x16,0xff,0xf4,0x6d,0xbc,0x97,0x0c,0xc1,0xb1,0x77,0x00,0x50,
 0xa9,0x4d,0x68,0x26,0xd5,0x2f,0x21,0x1b,0x23,0x47,0x92,0xe6,
 0x6d,
};
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,0x0a,0x65,0x59,0x14,0x7f,0xd4,0x92,0xad,0x74,0xab,0x1f,
 0x4d,0xef,0x61,0x96,0xfd,0x63,0x99,0x54,0x0e,0x84,0x70,0x62,
 0x27,0xa1,0xf9,0x0d,0x10,0x4c,0xda,0xeb,0x63,0x0b,0x7c,0x5c,
 0x18,0x74,0x8d,0xeb,0x25,0x65,0x3a,0xd2,0xa4,0xcb,0x5e,0x62,
 0x74,0x84,0x1c,0xad,0x32,0x8b,0xb0,0x31,0x26,0x28,0xb9,0xb1,
 0xf5,0x1b,0xea,0x72,0xb8,0xc6,0x10,0x99,0x9a,0x67,0x30,0xf7,
 0x52,0x64,0x92,0x05,0xae,0x85,0xc4,0x52,0xef,0x83,0xf9,0x8b,
 0xe7,0x15,0xcd,0x01,0x03,0x18,0x68,0x74,0xb0,0x7c,0xf0,0x20,
 0x74,
};
const unsigned char tc_K[] = {
 0xa9,0xac,0xae,0xa9,0x56,0x92,0xa6,0x44,0x62,0x06,0x7f,0xe8,
 0xe4,0x32,0x1f,0x2f,0xca,0x97,0x93,0xa8,0xa0,0x42,0x0f,0x0e,
 0x25,0x3e,0xd0,0xd6,0xdb,0x85,0x8f,0xe1,0x61,0xde,0x75,0x76,
 0x20,0x6a,0x8a,0x35,0xbd,0x4a,0x60,0xe0,0x07,0x24,0xfd,0x3e,
};
const unsigned char tc_ISK_IR[] = {
 0xd1,0xb7,0x43,0x75,0xc7,0xd6,0x3d,0x7d,0xe2,0x46,0xcb,0xf3,
 0xfc,0x2b,0x30,0x92,0x64,0x5c,0x73,0xa0,0xaa,0x81,0x69,0x89,
 0xc0,0xde,0x60,0x48,0xed,0x4e,0xce,0x6a,0x54,0xdf,0x82,0xd0,
 0x5d,0x2b,0xe3,0x49,0x8c,0xb9,0x28,0x8b,0xe7,0xbd,0xbd,0xb9,
};
const unsigned char tc_ISK_SY[] = {
 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb,
 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15,
 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85,
 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b,
};
const unsigned char tc_ISK_SY[] = {
 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb,
 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15,
 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85,
 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b,
};
const unsigned char tc_sid_out_ir[] = {
 0x8d,0x5a,0x03,0x94,0x6a,0x69,0xff,0xa1,0x2c,0xd6,0xef,0xd4,
 0x69,0xfe,0x86,0x71,0xbb,0xc2,0x5f,0xad,0x6d,0xb2,0x65,0x6f,
 0x39,0x63,0xc9,0x4e,0x9c,0x94,0x0b,0xde,0xcc,0x2b,0xd5,0x55,
 0x47,0x4c,0x21,0x18,0x17,0x78,0x7d,0x5c,0xf7,0x87,0x0e,0xd1,
};
const unsigned char tc_sid_out_oc[] = {
 0xc0,0x72,0x9d,0xb2,0x5d,0xb4,0x0c,0x48,0xa3,0x5f,0x78,0x7d,
 0x54,0x10,0xb2,0xcb,0x9a,0x2d,0x9f,0x5e,0x9c,0xf1,0xcf,0x15,
 0x9e,0xd2,0xf6,0x3c,0x6b,0x21,0x85,0xe5,0x97,0xe1,0x76,0xcc,
 0x22,0x14,0x22,0xe9,0x49,0x6e,0xed,0xa2,0xbf,0x12,0x3c,0x8b,
};
]]></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[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #QjM3NzNBQTkwRThGMjNDNjE1NjNBNEI2NDVCMjc2QyIsICJnIjogIjA0RkZFMUJEQz
 #MyOTNGREJFMzFCMjk1OTkxNkU1MkMwMThFOTIzRUFDOTk4MzZCRDlBMUNCRUVDNzk0
 #QThENEQ3OEJBQTMyQ0RBRkM5Njg1QkMxMDY3QTc4MEY0QUQ5QzhBNkM2RTE2NEFBND
 #I5MDZEMUUyN0Y3ODI1ODFBREM4RTAxMDkyMTk2MjZBMkI4RkJEQzM0NjAyRTQwODQ1
 #NTRCREQ2QzBDNjk4REQ2NTdBQzhFMzFCMkJDQ0UxQzdCMEQ4IiwgInlhIjogIkVGND
 #MzREQ1QUQxNDJDODYwRTdDQjY0MDBERDMxNUQzODhENUVDNTQyMEM1NTBFOUQ2RjA5
 #MDdGMzc1RDk4OEJDNEQ3MDQ4MzdFNDM1NjFDNDk3RTdERDkzRURDREI5RCIsICJBRG
 #EiOiAiNDE0NDYxIiwgIllhIjogIjA0MzRBMDREQTEyMTk5NUQ4MUQ3QzVERUQwMkNG
 #MkU3MDk1NERDQTQ5MDU5NDg1RUEzODMxMEI3M0I5NkZBMUVDNzg2MTlDNUExRTUyND
 #Q3Mjc3ODMzMUZCRTAwOUZBMTU2NEEzMjAzRTQyOTkzQTM2Mjg1RkE1NEU2QzI0MTg0
 #RkQyMjc0NThDODc3ODFCRTE2RkZGNDZEQkM5NzBDQzFCMTc3MDA1MEE5NEQ2ODI2RD
 #UyRjIxMUIyMzQ3OTJFNjZEIiwgInliIjogIjUwQjBFMzZCOTVBMkVERkFBODM0MkI4
 #NDNERERDOTBCMTc1MzMwRjIzOTlDMUIzNjU4NkRFRERBM0MyNTU5NzVGMzBCRTZBNz
 #UwRjk0MDRGQ0NDNjJBNjMyM0I1RTQ3MSIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjog
 #IjA0MEE2NTU5MTQ3RkQ0OTJBRDc0QUIxRjRERUY2MTk2RkQ2Mzk5NTQwRTg0NzA2Mj
 #I3QTFGOTBEMTA0Q0RBRUI2MzBCN0M1QzE4NzQ4REVCMjU2NTNBRDJBNENCNUU2Mjc0
 #ODQxQ0FEMzI4QkIwMzEyNjI4QjlCMUY1MUJFQTcyQjhDNjEwOTk5QTY3MzBGNzUyNj
 #Q5MjA1QUU4NUM0NTJFRjgzRjk4QkU3MTVDRDAxMDMxODY4NzRCMDdDRjAyMDc0Iiwg
 #IksiOiAiQTlBQ0FFQTk1NjkyQTY0NDYyMDY3RkU4RTQzMjFGMkZDQTk3OTNBOEEwND
 #IwRjBFMjUzRUQwRDZEQjg1OEZFMTYxREU3NTc2MjA2QThBMzVCRDRBNjBFMDA3MjRG
 #RDNFIiwgIklTS19JUiI6ICJEMUI3NDM3NUM3RDYzRDdERTI0NkNCRjNGQzJCMzA5Mj
 #Y0NUM3M0EwQUE4MTY5ODlDMERFNjA0OEVENEVDRTZBNTRERjgyRDA1RDJCRTM0OThD
 #QjkyODhCRTdCREJEQjkiLCAiSVNLX1NZIjogIkEwNTFENDUzMkNBOUZCNjc3NEUwOT
 #dFQkFDNjlDMUQ2QTE4MTQ0QTE1NDIxREMxNTVEMEIxRThBRUY5RjlEOEMwRkU4NkU4
 #NUQzQ0JFRTc3OTZGRjUwMTcxRjQyODAxQiIsICJzaWRfb3V0cHV0X2lyIjogIjhENU
 #EwMzk0NkE2OUZGQTEyQ0Q2RUZENDY5RkU4NjcxQkJDMjVGQUQ2REIyNjU2RjM5NjND
 #OTRFOUM5NDBCREVDQzJCRDU1NTQ3NEMyMTE4MTc3ODdENUNGNzg3MEVEMSIsICJzaW
 #Rfb3V0cHV0X29jIjogIkMwNzI5REIyNURCNDBDNDhBMzVGNzg3RDU0MTBCMkNCOUEy
 #RDlGNUU5Q0YxQ0YxNTlFRDJGNjNDNkIyMTg1RTU5N0UxNzZDQzIyMTQyMkU5NDk2RU
 #VEQTJCRjEyM0M4QiJ9
]]></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'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      1e4350616365503532315f584d443a5348412d3531325f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    generator g: (length: 133 bytes)
      0400e58a8fbf08b38e34a3676f6d690bed58aa4115ff32a57ec87172
      fc2a1fb89d03258c6429c464981b3284b5fedbd1244bf27432008868
      7065b9075dd558e14ed69901d2162db1ba3a49c97dca7c902cb1b96b
      abe21a31942114c860665b35c46b8213f6de17194de54c441083dd11
      63d5907adad8824bb1307dcf6a55c11a8f01d9789b
]]></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
 #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5
 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiN0U0QjQ3OTFENkE4RUYwMTlCOTM2Qz
 #c5RkI3RjJDNTciLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu
 #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0OD
 #QxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0
 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwN0U0QjQ3OTFENkE4RUYwMTlCOT
 #M2Qzc5RkI3RjJDNTciLCAiZ2VuZXJhdG9yIGciOiAiMDQwMEU1OEE4RkJGMDhCMzhF
 #MzRBMzY3NkY2RDY5MEJFRDU4QUE0MTE1RkYzMkE1N0VDODcxNzJGQzJBMUZCODlEMD
 #MyNThDNjQyOUM0NjQ5ODFCMzI4NEI1RkVEQkQxMjQ0QkYyNzQzMjAwODg2ODcwNjVC
 #OTA3NURENTU4RTE0RUQ2OTkwMUQyMTYyREIxQkEzQTQ5Qzk3RENBN0M5MDJDQjFCOT
 #ZCQUJFMjFBMzE5NDIxMTRDODYwNjY1QjM1QzQ2QjgyMTNGNkRFMTcxOTRERTU0QzQ0
 #MTA4M0REMTE2M0Q1OTA3QURBRDg4MjRCQjEzMDdEQ0Y2QTU1QzExQThGMDFEOTc4OU
 #IifQ==
]]></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)
      0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f
      30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090
      7312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c43961ef
      60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f12254
      e6f9950dd01fa8e26a8b20736fb63c63c81094f681
    Alternative correct value for Ya: (-ya)*g:
    (length: 133 bytes)
      0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f
      30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090
      7312eb724cddb4dcce675b016752bff0107f1e214b43e8a93bc69e10
      9f47a0d29d12ba7bab1ee9e95a2e20e1a7f69c97de58c99d060eddab
      19066af22fe0571d9574df8c9049c39c37ef6b097e
]]></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)
      0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c
      709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21
      8bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c818
      ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92f4
      03e0fa3207de8bb41b388d81046a298ed8ddac9b2a
    Alternative correct value for Yb: (-yb)*g:
    (length: 133 bytes)
      0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c
      709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21
      8bfaeb3e1ffd9f19bf062d00094ea363c9ae41b3f7450fe113da37e7
      11ed39123b9df9bb4e26830db07978cd2a901ba31871cfd3dde36d0b
      fc1f05cdf821744be4c7727efb95d67127225364d5
]]></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)
      018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509
      516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30
      832c23d477c991bea8e5
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509
      516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30
      832c23d477c991bea8e5
]]></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)
      85010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5
      381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff76
      80907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c439
      61ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f1
      2254e6f9950dd01fa8e26a8b20736fb63c63c81094f6810341446185
      010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f7
      0c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa
      218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c8
      18ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92
      f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462
    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
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e
      7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78
      7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23
      d477c991bea8e585010400c2bfd794467f4438277e85a42e101fa406
      1e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad00985
      7488db7130ff7680907312eb724cddb4dcce675b0098ad400fef80e1
      deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e580963
      6821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094
      f6810341446185010400706ea69b2b7167773248ea6e69a574e9dd2f
      f8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03fc24
      2e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c
      08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56fe45c
      e78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b
      2a03414462
    ISK result: (length: 64 bytes)
      1669a0a29726adc7eea2510d6f7e004a135fa63ac3c9f9e6ce53cba5
      d5e3781aced515956041e43358409a13ef90ddc3c36fd8d7d81424c8
      e94592e21854260a
]]></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)
      6f6385010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f
      81e5381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130
      ff7680907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756
      c43961ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662
      f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094f681034144
      6185010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e
      07f70c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316af
      e2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec
      25c818ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c22
      1c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462
    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
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e
      7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78
      7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23
      d477c991bea8e56f6385010400c2bfd794467f4438277e85a42e101f
      a4061e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad0
      09857488db7130ff7680907312eb724cddb4dcce675b0098ad400fef
      80e1deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e58
      09636821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c8
      1094f6810341446185010400706ea69b2b7167773248ea6e69a574e9
      dd2ff8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03
      fc242e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651
      be4c08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56f
      e45ce78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8dd
      ac9b2a03414462
    ISK result: (length: 64 bytes)
      f2f3bd8cd442a4e16659b47a7b7a84f29be75893ed2e5f772d7a3c8b
      779eb0df937a4ec50a4f1ff01ebbaa97d80e090ea69b00a95200ed25
      8e48c6f7e9d8fbc2
]]></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"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      56cc3cd8be77cdc84c0d1906de1ffc8ef7cbb326a3f05267b6e8c634
      4e2781eb20ef725e84cb1bb45927435051b4e0fae78e975bf15099f9
      e38d755413eee2fd
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      a46c7189ba6a36c4447741e057da39c885b7d59e08bd2df1852a5271
      f2a8a2e9b187ccd07325a3eede646adee0c06fe58da77f74177896b2
      1053c5d107de006d
]]></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[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,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,0xe5,0x8a,0x8f,0xbf,0x08,0xb3,0x8e,0x34,0xa3,0x67,
 0x6f,0x6d,0x69,0x0b,0xed,0x58,0xaa,0x41,0x15,0xff,0x32,0xa5,
 0x7e,0xc8,0x71,0x72,0xfc,0x2a,0x1f,0xb8,0x9d,0x03,0x25,0x8c,
 0x64,0x29,0xc4,0x64,0x98,0x1b,0x32,0x84,0xb5,0xfe,0xdb,0xd1,
 0x24,0x4b,0xf2,0x74,0x32,0x00,0x88,0x68,0x70,0x65,0xb9,0x07,
 0x5d,0xd5,0x58,0xe1,0x4e,0xd6,0x99,0x01,0xd2,0x16,0x2d,0xb1,
 0xba,0x3a,0x49,0xc9,0x7d,0xca,0x7c,0x90,0x2c,0xb1,0xb9,0x6b,
 0xab,0xe2,0x1a,0x31,0x94,0x21,0x14,0xc8,0x60,0x66,0x5b,0x35,
 0xc4,0x6b,0x82,0x13,0xf6,0xde,0x17,0x19,0x4d,0xe5,0x4c,0x44,
 0x10,0x83,0xdd,0x11,0x63,0xd5,0x90,0x7a,0xda,0xd8,0x82,0x4b,
 0xb1,0x30,0x7d,0xcf,0x6a,0x55,0xc1,0x1a,0x8f,0x01,0xd9,0x78,
 0x9b,
};
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,0xc2,0xbf,0xd7,0x94,0x46,0x7f,0x44,0x38,0x27,0x7e,
 0x85,0xa4,0x2e,0x10,0x1f,0xa4,0x06,0x1e,0x1e,0xf6,0xe0,0x5f,
 0x81,0xe5,0x38,0x1f,0x30,0xe7,0x3b,0x34,0x1d,0xd7,0x26,0x08,
 0x9c,0xb6,0xa6,0xbb,0xe5,0xa5,0x09,0xfa,0xd0,0x09,0x85,0x74,
 0x88,0xdb,0x71,0x30,0xff,0x76,0x80,0x90,0x73,0x12,0xeb,0x72,
 0x4c,0xdd,0xb4,0xdc,0xce,0x67,0x5b,0x00,0x98,0xad,0x40,0x0f,
 0xef,0x80,0xe1,0xde,0xb4,0xbc,0x17,0x56,0xc4,0x39,0x61,0xef,
 0x60,0xb8,0x5f,0x2d,0x62,0xed,0x45,0x84,0x54,0xe1,0x16,0x16,
 0xa5,0xd1,0xdf,0x1e,0x58,0x09,0x63,0x68,0x21,0xa7,0x36,0x62,
 0xf9,0xf1,0x22,0x54,0xe6,0xf9,0x95,0x0d,0xd0,0x1f,0xa8,0xe2,
 0x6a,0x8b,0x20,0x73,0x6f,0xb6,0x3c,0x63,0xc8,0x10,0x94,0xf6,
 0x81,
};
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,0x00,0x70,0x6e,0xa6,0x9b,0x2b,0x71,0x67,0x77,0x32,0x48,
 0xea,0x6e,0x69,0xa5,0x74,0xe9,0xdd,0x2f,0xf8,0xa3,0xd0,0x4a,
 0x6e,0x07,0xf7,0x0c,0x70,0x98,0x69,0xca,0x48,0x68,0x27,0xd5,
 0x9f,0x92,0x90,0x59,0x9d,0x1c,0xf9,0x4e,0x1a,0x03,0xfc,0x24,
 0x2e,0x2b,0x13,0x16,0xaf,0xe2,0xfa,0x21,0x8b,0xfa,0xeb,0x3e,
 0x1f,0xfd,0x9f,0x19,0xbf,0x06,0x2d,0x01,0xf6,0xb1,0x5c,0x9c,
 0x36,0x51,0xbe,0x4c,0x08,0xba,0xf0,0x1e,0xec,0x25,0xc8,0x18,
 0xee,0x12,0xc6,0xed,0xc4,0x62,0x06,0x44,0xb1,0xd9,0x7c,0xf2,
 0x4f,0x86,0x87,0x32,0xd5,0x6f,0xe4,0x5c,0xe7,0x8e,0x30,0x2c,
 0x22,0x1c,0x92,0xf4,0x03,0xe0,0xfa,0x32,0x07,0xde,0x8b,0xb4,
 0x1b,0x38,0x8d,0x81,0x04,0x6a,0x29,0x8e,0xd8,0xdd,0xac,0x9b,
 0x2a,
};
const unsigned char tc_K[] = {
 0x01,0x8e,0x0e,0x7e,0x9a,0xde,0x74,0x91,0x7c,0x11,0xc0,0xf6,
 0xb5,0x2f,0x95,0xed,0x87,0x1e,0xab,0x23,0x54,0x37,0xcb,0xee,
 0x8b,0x5c,0x25,0x09,0x51,0x6e,0x78,0x7a,0x80,0xe8,0x25,0xed,
 0x5d,0x53,0x9f,0xa6,0xa0,0xec,0x32,0xc4,0x8f,0xa8,0xfa,0xbe,
 0x85,0x80,0x9d,0x00,0x0d,0x0c,0xfd,0x30,0x83,0x2c,0x23,0xd4,
 0x77,0xc9,0x91,0xbe,0xa8,0xe5,
};
const unsigned char tc_ISK_IR[] = {
 0x16,0x69,0xa0,0xa2,0x97,0x26,0xad,0xc7,0xee,0xa2,0x51,0x0d,
 0x6f,0x7e,0x00,0x4a,0x13,0x5f,0xa6,0x3a,0xc3,0xc9,0xf9,0xe6,
 0xce,0x53,0xcb,0xa5,0xd5,0xe3,0x78,0x1a,0xce,0xd5,0x15,0x95,
 0x60,0x41,0xe4,0x33,0x58,0x40,0x9a,0x13,0xef,0x90,0xdd,0xc3,
 0xc3,0x6f,0xd8,0xd7,0xd8,0x14,0x24,0xc8,0xe9,0x45,0x92,0xe2,
 0x18,0x54,0x26,0x0a,
};
const unsigned char tc_ISK_SY[] = {
 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a,
 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77,
 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5,
 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e,
 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7,
 0xe9,0xd8,0xfb,0xc2,
};
const unsigned char tc_ISK_SY[] = {
 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a,
 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77,
 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5,
 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e,
 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7,
 0xe9,0xd8,0xfb,0xc2,
};
const unsigned char tc_sid_out_ir[] = {
 0x56,0xcc,0x3c,0xd8,0xbe,0x77,0xcd,0xc8,0x4c,0x0d,0x19,0x06,
 0xde,0x1f,0xfc,0x8e,0xf7,0xcb,0xb3,0x26,0xa3,0xf0,0x52,0x67,
 0xb6,0xe8,0xc6,0x34,0x4e,0x27,0x81,0xeb,0x20,0xef,0x72,0x5e,
 0x84,0xcb,0x1b,0xb4,0x59,0x27,0x43,0x50,0x51,0xb4,0xe0,0xfa,
 0xe7,0x8e,0x97,0x5b,0xf1,0x50,0x99,0xf9,0xe3,0x8d,0x75,0x54,
 0x13,0xee,0xe2,0xfd,
};
const unsigned char tc_sid_out_oc[] = {
 0xa4,0x6c,0x71,0x89,0xba,0x6a,0x36,0xc4,0x44,0x77,0x41,0xe0,
 0x57,0xda,0x39,0xc8,0x85,0xb7,0xd5,0x9e,0x08,0xbd,0x2d,0xf1,
 0x85,0x2a,0x52,0x71,0xf2,0xa8,0xa2,0xe9,0xb1,0x87,0xcc,0xd0,
 0x73,0x25,0xa3,0xee,0xde,0x64,0x6a,0xde,0xe0,0xc0,0x6f,0xe5,
 0x8d,0xa7,0x7f,0x74,0x17,0x78,0x96,0xb2,0x10,0x53,0xc5,0xd1,
 0x07,0xde,0x00,0x6d,
};
]]></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[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjA0MDBFNThBOE
 #ZCRjA4QjM4RTM0QTM2NzZGNkQ2OTBCRUQ1OEFBNDExNUZGMzJBNTdFQzg3MTcyRkMy
 #QTFGQjg5RDAzMjU4QzY0MjlDNDY0OTgxQjMyODRCNUZFREJEMTI0NEJGMjc0MzIwMD
 #g4Njg3MDY1QjkwNzVERDU1OEUxNEVENjk5MDFEMjE2MkRCMUJBM0E0OUM5N0RDQTdD
 #OTAyQ0IxQjk2QkFCRTIxQTMxOTQyMTE0Qzg2MDY2NUIzNUM0NkI4MjEzRjZERTE3MT
 #k0REU1NEM0NDEwODNERDExNjNENTkwN0FEQUQ4ODI0QkIxMzA3RENGNkE1NUMxMUE4
 #RjAxRDk3ODlCIiwgInlhIjogIjAwNjM2N0U5QzJBRUZGOUYxREIxOUFGNjAwQ0NBNz
 #MzNDNENDdDQkU0NDZDRUJCRDFDQ0Q3ODNGODI3NTVBODcyREE4NkZEMDcwN0VCMzc2
 #N0M2MTE0RjE4MDNERUI2MkQ2M0JERDFFNjEzRjY3RTYzRThDMTQxRUU1MzEwRTNFRT
 #gxOSIsICJBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MDBDMkJGRDc5NDQ2N0Y0NDM4
 #Mjc3RTg1QTQyRTEwMUZBNDA2MUUxRUY2RTA1RjgxRTUzODFGMzBFNzNCMzQxREQ3Mj
 #YwODlDQjZBNkJCRTVBNTA5RkFEMDA5ODU3NDg4REI3MTMwRkY3NjgwOTA3MzEyRUI3
 #MjRDRERCNERDQ0U2NzVCMDA5OEFENDAwRkVGODBFMURFQjRCQzE3NTZDNDM5NjFFRj
 #YwQjg1RjJENjJFRDQ1ODQ1NEUxMTYxNkE1RDFERjFFNTgwOTYzNjgyMUE3MzY2MkY5
 #RjEyMjU0RTZGOTk1MEREMDFGQThFMjZBOEIyMDczNkZCNjNDNjNDODEwOTRGNjgxIi
 #wgInliIjogIjAwOTIyN0JGOERDNzQxREFDQzk0MjJGOEJGM0MwRTk2RkNFOTU4N0JD
 #NTYyRUFBRkUwREM1RjZGODJGMjg1OTRFNEE2Rjk4NTUzNTYwQzYyQjc1RkE0QUJCMT
 #k4Q0VDQkJCODZFQkQ0MUIwRUEwMjU0Q0RFNzhBQzY4RDM5QTI0MEFFNyIsICJBRGIi
 #OiAiNDE0NDYyIiwgIlliIjogIjA0MDA3MDZFQTY5QjJCNzE2Nzc3MzI0OEVBNkU2OU
 #E1NzRFOUREMkZGOEEzRDA0QTZFMDdGNzBDNzA5ODY5Q0E0ODY4MjdENTlGOTI5MDU5
 #OUQxQ0Y5NEUxQTAzRkMyNDJFMkIxMzE2QUZFMkZBMjE4QkZBRUIzRTFGRkQ5RjE5Qk
 #YwNjJEMDFGNkIxNUM5QzM2NTFCRTRDMDhCQUYwMUVFQzI1QzgxOEVFMTJDNkVEQzQ2
 #MjA2NDRCMUQ5N0NGMjRGODY4NzMyRDU2RkU0NUNFNzhFMzAyQzIyMUM5MkY0MDNFME
 #ZBMzIwN0RFOEJCNDFCMzg4RDgxMDQ2QTI5OEVEOEREQUM5QjJBIiwgIksiOiAiMDE4
 #RTBFN0U5QURFNzQ5MTdDMTFDMEY2QjUyRjk1RUQ4NzFFQUIyMzU0MzdDQkVFOEI1Qz
 #I1MDk1MTZFNzg3QTgwRTgyNUVENUQ1MzlGQTZBMEVDMzJDNDhGQThGQUJFODU4MDlE
 #MDAwRDBDRkQzMDgzMkMyM0Q0NzdDOTkxQkVBOEU1IiwgIklTS19JUiI6ICIxNjY5QT
 #BBMjk3MjZBREM3RUVBMjUxMEQ2RjdFMDA0QTEzNUZBNjNBQzNDOUY5RTZDRTUzQ0JB
 #NUQ1RTM3ODFBQ0VENTE1OTU2MDQxRTQzMzU4NDA5QTEzRUY5MEREQzNDMzZGRDhEN0
 #Q4MTQyNEM4RTk0NTkyRTIxODU0MjYwQSIsICJJU0tfU1kiOiAiRjJGM0JEOENENDQy
 #QTRFMTY2NTlCNDdBN0I3QTg0RjI5QkU3NTg5M0VEMkU1Rjc3MkQ3QTNDOEI3NzlFQj
 #BERjkzN0E0RUM1MEE0RjFGRjAxRUJCQUE5N0Q4MEUwOTBFQTY5QjAwQTk1MjAwRUQy
 #NThFNDhDNkY3RTlEOEZCQzIiLCAic2lkX291dHB1dF9pciI6ICI1NkNDM0NEOEJFNz
 #dDREM4NEMwRDE5MDZERTFGRkM4RUY3Q0JCMzI2QTNGMDUyNjdCNkU4QzYzNDRFMjc4
 #MUVCMjBFRjcyNUU4NENCMUJCNDU5Mjc0MzUwNTFCNEUwRkFFNzhFOTc1QkYxNTA5OU
 #Y5RTM4RDc1NTQxM0VFRTJGRCIsICJzaWRfb3V0cHV0X29jIjogIkE0NkM3MTg5QkE2
 #QTM2QzQ0NDc3NDFFMDU3REEzOUM4ODVCN0Q1OUUwOEJEMkRGMTg1MkE1MjcxRjJBOE
 #EyRTlCMTg3Q0NEMDczMjVBM0VFREU2NDZBREVFMEMwNkZFNThEQTc3Rjc0MTc3ODk2
 #QjIxMDUzQzVEMTA3REUwMDZEIn0=
]]></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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

-->

</rfc>
