<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-18" 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-18"/>
    <author initials="M." surname="Abdalla" fullname="Michel Abdalla">
      <organization>Nexus - San Francisco</organization>
      <address>
        <email>michel.abdalla@gmail.com</email>
      </address>
    </author>
    <author initials="B." surname="Haase" fullname="Bjoern Haase">
      <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
      <address>
        <email>bjoern.m.haase@web.de</email>
      </address>
    </author>
    <author initials="J." surname="Hesse" fullname="Julia Hesse">
      <organization>IBM Research Europe - Zurich</organization>
      <address>
        <email>juliahesse2@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="February" day="01"/>
    <workgroup>CFRG</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 161?>

<t>This document describes CPace which is a protocol that allows two
parties that share a low-entropy secret (password) to derive a strong shared key without
disclosing the secret to offline dictionary attacks.
The CPace protocol was tailored for constrained devices and
can be used on groups of prime- and non-prime order.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Crypto Forum Research Group mailing list (cfrg@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/search/?email_list=cfrg"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/cfrg/draft-irtf-cfrg-cpace"/>.</t>
    </note>
  </front>
  <middle>
    <?line 169?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes CPace which is a balanced Password-Authenticated-Key-Establishment (PAKE)
protocol for two parties where both parties derive a cryptographic key
of high entropy from a shared secret of low-entropy.
CPace protects the passwords against offline dictionary attacks by requiring
adversaries to actively interact with a protocol party and by allowing
for at most one single password guess per active interaction.</t>
      <t>The CPace design was tailored considering the following main objectives:</t>
      <ul spacing="normal">
        <li>
          <t>Efficiency: Deployment of CPace is feasible on resource-constrained devices.</t>
        </li>
        <li>
          <t>Versatility: CPace supports different application scenarios via versatile input formats, and by supporting applications with and without clear initiator and responder roles.</t>
        </li>
        <li>
          <t>Implementation error resistance: CPace aims at avoiding common implementation pitfalls already by design, such as avoiding incentives for insecure execution-time speed optimizations. For smooth integration into different cryptographic library ecosystems, this document provides a variety of cipher suites.</t>
        </li>
        <li>
          <t>Post-quantum annoyance: CPace comes with measures to slow down adversaries capable of breaking the discrete logarithm problem on elliptic curves.</t>
        </li>
      </ul>
      <section anchor="outline-of-this-document">
        <name>Outline of this document</name>
        <ul spacing="normal">
          <li>
            <t><xref target="ApplicationPerspective"/> describes the expected properties of an application using CPace, and discusses in particular which application-level aspects are relevant for CPace's security.</t>
          </li>
          <li>
            <t><xref target="CipherSuites"/> gives an overview of the recommended
cipher suites for CPace which were optimized for different types of cryptographic
library ecosystems.</t>
          </li>
          <li>
            <t><xref target="Definition"/> introduces the notation used throughout this document.</t>
          </li>
          <li>
            <t><xref target="protocol-section"/> specifies the CPace protocol.</t>
          </li>
          <li>
            <t>The appendix provides code and test vectors of all of the
functions defined for CPace.</t>
          </li>
        </ul>
        <t>As this document is primarily written for implementers and application designers, we would like to refer the theory-inclined reader to the scientific paper <xref target="AHH21"/> which covers the detailed security analysis of the different CPace instantiations as defined in this document via the cipher suites.</t>
      </section>
    </section>
    <section anchor="requirements-notation">
      <name>Requirements Notation</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.
<?line -6?>
      </t>
    </section>
    <section anchor="ApplicationPerspective">
      <name>High-level application perspective</name>
      <t>CPace enables balanced password-authenticated key establishment. I.e. with CPace the parties start the protocol with a shared secret octet string, namely the password-related string (PRS).
PRS can be a low-entropy secret itself, for instance a clear-text password encoded according to <xref target="RFC8265"/>, or any string derived from a common secret, for instance by use of a key derivation function.</t>
      <t>Applications with clients and servers where the server side is storing account and password information in its persistent memory are recommended to use <em>augmented</em>
PAKE protocols such as OPAQUE <xref target="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>CPace inputs</name>
        <t>For accommodating different application settings, CPace offers the following inputs which, depending on the application scenario, MAY also be the empty string:</t>
        <ul spacing="normal">
          <li>
            <t>Party identity strings (A,B).
In CPace, each party can be  given a party identity string which
might be a device name, a user name, or an URL.
CPace offers two alternative options for authenticating the party identifiers in the course of the protocol run
(see <xref target="sec-considerations-ids"/>).</t>
          </li>
          <li>
            <t>Channel identifier (CI).
CI can be used to bind a session key exchanged with CPace to a specific networking channel which interconnects the protocol parties.
CI could for instance include networking addresses of both parties or party identity strings or service port number identifiers.
Both parties are required to have the same view of CI. CI will not be publicly sent on the wire and may also include confidential
information.
Both parties will only establish a common session key if they initiated the protocol with the same view of CI.</t>
          </li>
          <li>
            <t>Associated data fields (ADa and ADb).
These fields can be used for authenticating associated data alongside the CPace protocol.
The ADa and ADb will be sent in clear text as part of the protocol messages.
ADa and ADb will become authenticated in a CPace protocol run as
both parties will only agree on a common key if they have had the same view on ADa and ADb.
Applications that need to rely on the identity of the communication partner may have to integrate identity information in ADa and/or ADb
(see <xref target="sec-considerations-ids"/>).  </t>
            <t>
In a setting with clear initiator and responder roles, identity information in ADa
sent by the initiator can be used by the responder for choosing the appropriate PRS (respectively password) for this identity.
ADa and ADb could also include application protocol version information (e.g. to avoid downgrade attacks).</t>
          </li>
          <li>
            <t>Session identifier (sid).
If both parties have access to the same unique public octet string sid being specific for a communication session before starting the protocol,
it is RECOMMENDED to use this sid value as an additional input for the protocol as this provides security advantages
and will bind the CPace run to this communication session (see <xref target="sec-considerations"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="optional-cpace-outputs">
        <name>Optional CPace outputs</name>
        <t>If a session identifier is not available as input at protocol start CPace can optionally produce a unique public session identifier sid_output
as output that might be helpful for the application for actions subsequent to the CPace protocol step (see <xref target="sec-sid-output"/>, <xref target="BGHJ24"/>).</t>
      </section>
      <section anchor="responsibilities-of-the-application-layer">
        <name>Responsibilities of the application layer</name>
        <t>The following tasks are out of the scope of this document and left to the application layer</t>
        <ul spacing="normal">
          <li>
            <t>Setup phase:
The application layer is responsible for the handshake that makes parties agree on a common CPace cipher suite.</t>
          </li>
          <li>
            <t>This document does not specify which encodings applications use for the mandatory PRS input and the inputs
CI, sid, ADa and ADb. If PRS is a clear-text password or an octet string derived from a clear-text password,
e.g. by use of a key-derivation function, the clear-text password SHOULD BE encoded according to <xref target="RFC8265"/>.</t>
          </li>
          <li>
            <t>The application needs to settle whether CPace is used in the initiator-responder or the symmetric setting along the
guidelines of <xref target="sec-considerations-ids"/>. In the symmetric
setting, transcripts ordered string concatenation must be used for generating protocol transcripts.
In this document we will provide test vectors for both the initiator-responder and the symmetric setting.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="CipherSuites">
      <name>CPace cipher suites</name>
      <t>In the setup phase of CPace, both communication partners need to agree on a common cipher suite.
Cipher suites consist of a combination of a hash function H and an elliptic curve environment G.</t>
      <t>For naming cipher suites we use the convention "CPACE-G-H". We RECOMMEND the following cipher suites:</t>
      <ul spacing="normal">
        <li>
          <t>CPACE-X25519-SHA512. This suite uses the group environment G_X25519 defined in <xref target="CPaceMontgomery"/> and SHA-512 as hash function.
This cipher suite comes with the smallest messages on the wire and a low computational cost.</t>
        </li>
        <li>
          <t>CPACE-P256_XMD:SHA-256_SSWU_NU_-SHA256.
This suite instantiates the group environment G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P256_XMD:SHA-256_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P256, and hash function SHA-256.</t>
        </li>
      </ul>
      <t>The following RECOMMENDED cipher suites provide higher security margins.</t>
      <ul spacing="normal">
        <li>
          <t>CPACE-X448-SHAKE256. This suite uses the group environment G_X448 defined in <xref target="CPaceMontgomery"/> and SHAKE-256 as hash function.</t>
        </li>
        <li>
          <t>CPACE-P384_XMD:SHA-384_SSWU_NU_-SHA384.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P384_XMD:SHA-384_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P384 with H = SHA-384.</t>
        </li>
        <li>
          <t>CPACE-P521_XMD:SHA-512_SSWU_NU_-SHA512.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P521_XMD:SHA-512_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P521 with H = SHA-512.</t>
        </li>
      </ul>
      <t>CPace can also securely be implemented using the cipher suites CPACE-RISTR255-SHA512 and CPACE-DECAF448-SHAKE256 defined in
<xref target="CPaceCoffee"/>. <xref target="sec-considerations"/> gives guidance on how to implement CPace on further elliptic curves.</t>
    </section>
    <section anchor="Definition">
      <name>Definitions and notation</name>
      <section anchor="group-environment-g">
        <name>Group environment G</name>
        <t>The group environment G specifies an elliptic curve group (also denoted G for convenience)  and associated constants
and functions as detailed below. In this document we use additive notation for the group operation.</t>
        <ul spacing="normal">
          <li>
            <t>G.calculate_generator(H,PRS,CI,sid) denotes a function that outputs a representation of a generator (referred to as "generator" from now on) of the group
which is derived from input octet strings PRS, CI, and sid and with the help of a hash function H.</t>
          </li>
          <li>
            <t>G.sample_scalar() is a function returning a representation of an integer (referred to as "scalar" from now on) appropriate as a
private Diffie-Hellman key for the group.</t>
          </li>
          <li>
            <t>G.scalar_mult(y,g) is a function operating on a scalar
y and a group element g. It returns an octet string representation of the group element Y = y*g.</t>
          </li>
          <li>
            <t>G.I denotes a unique octet string representation of the neutral element of the group. G.I is used for detecting and signaling certain error conditions.</t>
          </li>
          <li>
            <t>G.scalar_mult_vfy(y,g) is a function operating on
a scalar y and a group element g. It returns an octet string
representation of the group element y*g. Additionally, scalar_mult_vfy specifies validity conditions for y,g and y*g and outputs G.I in case they are not met.</t>
          </li>
          <li>
            <t>G.DSI denotes a domain-separation identifier octet string which SHALL be uniquely identifying the group environment G.</t>
          </li>
        </ul>
      </section>
      <section anchor="hash-function-h">
        <name>Hash function H</name>
        <t>Common choices for H are SHA-512 <xref target="RFC6234"/> or SHAKE-256 <xref target="FIPS202"/>. (I.e., the hash function
outputs octet strings, and not group elements.)
For considering both variable-output-length hashes and fixed-output-length hashes, we use the following convention.</t>
        <t>We use the following notation for referring to the specific properties of a hash function H:</t>
        <ul spacing="normal">
          <li>
            <t>H.hash(m,l) is a function that operates on an input octet string m and returns the first l octets of the hash of m.</t>
          </li>
          <li>
            <t>H.b_in_bytes denotes the <em>minimum</em> output size in bytes for collision resistance for the
security level target of the hash function. E.g. H.b_in_bytes = 64 for SHA-512 and SHAKE-256 and H.b_in_bytes = 32 for
SHA-256 and SHAKE-128. We use the notation H.hash(m) = H.hash(m, H.b_in_bytes) and let the hash operation
output the default length if no explicit length parameter is given.</t>
          </li>
          <li>
            <t>H.bmax_in_bytes denotes the <em>maximum</em> output size in octets supported by the hash function. In case of fixed-size
hashes such as SHA-256, this is the same as H.b_in_bytes, while there is no such limit for hash functions such as SHAKE-256.</t>
          </li>
          <li>
            <t>H.s_in_bytes denotes the <em>input block size</em> used by H. This number denotes the maximum number of bytes that can be processed
in a single block before applying the compression function or permutation becomes necessary. (See also <xref target="RFC2104"/> for the corresponding block size concepts).
For instance, for SHA-512 the input block size s_in_bytes is 128 as the compression function can process up to 128 bytes,
while for SHAKE-256 the input block size amounts to 136 bytes before the permutation of the sponge state needs to be applied.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-section">
        <name>Notation for string operations</name>
        <ul spacing="normal">
          <li>
            <t>bytes1 || bytes2 denotes concatenation of octet strings.</t>
          </li>
          <li>
            <t>len(S) denotes the number of octets in an octet string S.</t>
          </li>
          <li>
            <t>This document uses quotation marks "" both for general language (e.g. for citation of notation used in other documents) and
as syntax for specifying octet strings as in b"CPace25519".  </t>
            <t>
We use a preceding lowercase letter b"" in front of the quotation marks if a character sequence is representing an octet string sequence.
I.e., we use the notation convention for byte string representations with single-byte ASCII character encodings from the python programming language.
b"" denotes the empty string of length 0.</t>
          </li>
          <li>
            <t>LEB128 denotes an algorithm that converts an integer to a variable sized string. The algorithm encodes 7 bits per byte starting with the least significant bits in bits #0 to #6.
As long as significant bits remain, bit #7 will be set. This will result in a single-byte encoding for values below 128.
Test vectors and reference code for LEB128 encoding are available in the appendix.</t>
          </li>
          <li>
            <t>prepend_len(octet_string) denotes the octet sequence that is obtained from prepending
the length of the octet string to the string itself. The length is encoded using LEB128.
Test vectors and code for prepend_len are available in the appendix.</t>
          </li>
          <li>
            <t>lv_cat(a0,a1, ...) is the "length-value" encoding function which returns the concatenation of the input strings with an encoding of
their respective length prepended. E.g., lv_cat(a0,a1) returns
prepend_len(a0) || prepend_len(a1). The detailed specification of lv_cat and reference code is available in the appendix.</t>
          </li>
          <li>
            <t>sample_random_bytes(n) denotes a function that returns n octets, each of which is to be independently sampled from a uniform distribution between 0 and 255.</t>
          </li>
          <li>
            <t>zero_bytes(n) denotes a function that returns n octets with value 0.</t>
          </li>
          <li>
            <t>o_cat(bytes1,bytes2) denotes a function for ordered concatenation of octet strings. It places the lexicographically larger octet
string first and prepends the two bytes from the octet string b"oc" to the result. Reference code for this function is available in the appendix.</t>
          </li>
          <li>
            <t>transcript(Ya,ADa, Yb,ADb) denotes a function outputting an octet string for the protocol transcript.
In applications where CPace is used without clear initiator and responder roles, i.e. where the ordering of messages is
not enforced by the protocol flow, transcript_oc(Ya,ADa, Yb,ADb) = o_cat(lv_cat(Ya,ADa),lv_cat(Yb, ADb)) SHALL be used.
In the initiator-responder setting, the implementation transcript_ir(Ya,ADa, Yb,ADb) = lv_cat(Ya,ADa) || lv_cat(Yb, ADb) SHALL be used.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-for-group-operations">
        <name>Notation for group operations</name>
        <t>We use additive notation for the group, i.e., 2*X  denotes the element that is obtained by computing X+X, for group element X and group operation +.</t>
      </section>
    </section>
    <section anchor="protocol-section">
      <name>The CPace protocol</name>
      <t>CPace is a one round protocol between two parties, A and B. At invocation, A and B are provisioned with PRS,G and H.
Parties will also be provisioned with CI,sid,ADa (for A) and CI,sid,ADb (for B) which will default to the empty
string b"" if not used.</t>
      <t>Party identifiers SHALL be integrated into CI and/or ADa and ADb following the guidelines in <xref target="sec-considerations-ids"/>.</t>
      <t>A sends the public share Ya and associated data ADa to B.
Likewise, B sends the public share Yb and associated data ADb to A.
Both A and B use the received messages for deriving a shared intermediate session key, ISK.</t>
      <section anchor="protocol-flow">
        <name>Protocol flow</name>
        <artwork><![CDATA[
                        public: G, H

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

]]></artwork>
      </section>
      <section anchor="cpace-protocol-instructions">
        <name>CPace protocol instructions</name>
        <t>A computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar ya = G.sample_scalar() and group element Ya = G.scalar_mult (ya,g). A then transmits Ya and associated data ADa to B.</t>
        <t>B computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar yb = G.sample_scalar() and group element Yb = G.scalar_mult(yb,g). B sends Yb and associated data ADb to A.</t>
        <t>B then computes K = G.scalar_mult_vfy(yb,Ya). B MUST abort if K=G.I.
Otherwise B calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K)||transcript(Ya,ADa,Yb,ADb)). B returns ISK and terminates.</t>
        <t>Likewise upon reception of the message from B,  A computes K = G.scalar_mult_vfy(ya,Yb). A MUST abort if K=G.I.</t>
        <t>Otherwise A calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(Ya,ADa,Yb,ADb)). A returns ISK and terminates.</t>
        <t>The session key ISK returned by A and B is identical if and only if the supplied input parameters PRS, CI and sid match on both sides and the transcript views of both parties match.</t>
      </section>
    </section>
    <section anchor="implementation-of-recommended-cpace-cipher-suites">
      <name>Implementation of recommended CPace cipher suites</name>
      <section anchor="common-function-for-computing-generators">
        <name>Common function for computing generators</name>
        <t>The different cipher suites for CPace defined in the upcoming sections share the following method for deterministically combining the individual strings PRS, CI, sid and the domain-separation identifier DSI to a generator string:</t>
        <ul spacing="normal">
          <li>
            <t>generator_string(DSI, PRS, CI, sid, s_in_bytes) denotes a function that returns the string
lv_cat(DSI, PRS, zero_bytes(len_zpad), CI, sid).</t>
          </li>
          <li>
            <t>len_zpad = MAX(0, s_in_bytes - len(prepend_len(PRS)) - len(prepend_len(G.DSI)) - 1)</t>
          </li>
        </ul>
        <t>The zero padding of length len_zpad is designed such that the encoding of DSI and PRS together with the zero padding field completely
fills at least the first input block (of length s_in_bytes) of the hash.
As a result for the common case of short PRS the number of bytes to hash becomes independent of the actual length of the password (PRS). (Code and test vectors are provided in the appendix.)</t>
        <t>The introduction of a zero-padding within the generator string also helps mitigating attacks of a side-channel adversary that
analyzes correlations between publicly known variable information with a short low-entropy PRS string.
Note that the hash of the first block is intentionally made independent of session-specific inputs, such as sid or CI and that there is no limitation
regarding the maximum length of the PRS string.</t>
      </section>
      <section anchor="CPaceMontgomery">
        <name>CPace group objects G_X25519 and G_X448 for single-coordinate Ladders on Montgomery curves</name>
        <t>In this section we consider the case of CPace when using the X25519 and X448 Diffie-Hellman functions
from <xref target="RFC7748"/> operating on the Montgomery curves Curve25519 and Curve448 <xref target="RFC7748"/>.
CPace implementations using single-coordinate ladders on further Montgomery curves SHALL use the definitions in line
with the specifications for X25519 and X448 and review the guidance given in <xref target="sec-considerations"/>.</t>
        <t>For the group environment G_X25519 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X25519.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_X25519.field_size_bits = 255</t>
          </li>
          <li>
            <t>G_X25519.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X25519(y,g)</t>
          </li>
          <li>
            <t>G_X25519.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.DSI = b"CPace255"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X25519 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 32 bytes of output. It is RECOMMENDED
to use G_X25519 in combination with SHA-512.</t>
        <t>For X448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_X448.field_size_bits = 448</t>
          </li>
          <li>
            <t>G_X448.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X448(y,g)</t>
          </li>
          <li>
            <t>G_X448.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.DSI = b"CPace448"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 56 bytes of output. It is RECOMMENDED
to use G_X448 in combination with SHAKE-256.</t>
        <t>For both G_X448 and G_X25519 the G.calculate_generator(H, PRS,sid,CI) function shall be implemented as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) SHALL BE calculated using the input block size of the
chosen hash function.</t>
          </li>
          <li>
            <t>This string SHALL then BE hashed to the required length
gen_str_hash = H.hash(gen_str, G.field_size_bytes).
Note that this implies that the permissible output length H.maxb_in_bytes MUST BE larger or equal to the
field size of the group G for making a hashing function suitable.</t>
          </li>
          <li>
            <t>This result is then considered as a field coordinate using
the u = decodeUCoordinate(gen_str_hash, G.field_size_bits) function from <xref target="RFC7748"/> which we
repeat in the appendix for convenience.</t>
          </li>
          <li>
            <t>The result point g is then calculated as (g,v) = map_to_curve_elligator2(u) using the function
from <xref target="RFC9380"/>. Note that the v coordinate produced by the map_to_curve_elligator2 function
is not required for CPace and discarded. The appendix repeats the definitions from <xref target="RFC9380"/> for convenience.</t>
          </li>
        </ul>
        <t>Code for the functions above is available in the appendix.</t>
        <section anchor="verification-tests">
          <name>Verification tests</name>
          <t>For single-coordinate Montgomery ladders on Montgomery curves, verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving u coordinate values that encode a low-order
point on either the curve or the quadratic twist.</t>
          <t>In addition to that, in case of G_X25519, the tests SHALL also verify that the implementation of G.scalar_mult_vfy(y,g) produces the
expected results for non-canonical u coordinate values with bit #255 set, which may also encode low-order points.</t>
          <t>Corresponding test vectors are provided in the appendix.</t>
        </section>
      </section>
      <section anchor="CPaceCoffee">
        <name>CPace group objects G_Ristretto255 and G_Decaf448 for prime-order group abstractions</name>
        <t>In this section we consider the case of CPace using the Ristretto255 and Decaf448 group abstractions <xref target="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</name>
        <t>The protocol assures that both communication partners have had the same view on the communication transcripts and the inputs CI and sid.</t>
        <t>If CPace is instantiated without identity strings for A or B in its inputs it will anonymously create a key with any party using the
same PRS and sid values and cannot give any further guarantee regarding the identity of the communication partner.
A protocol instance running on a party P might even be communicating with a second protocol instance also running on P.</t>
        <section anchor="guidance-regarding-party-identifier-integration">
          <name>Guidance regarding party identifier integration</name>
          <t>If an application layer's security relies on CPace for checking party identities, it SHALL integrate the party identifiers that are
to be checked in the CPace protocol run within CI or ADa/ADb as specified below.</t>
          <ul spacing="normal">
            <li>
              <t>If CPace is used in initiator-responder mode, identity strings that are to be authenticated and that are available for
both communication partners at protocol start SHOULD be integrated as part of CI.  </t>
              <t>
If both party identifiers are integrated into CI, the encoding MUST associate the initiator and responder roles with the respective identity strings. It is recommended to place the initiator`s identity first
and the responder`s identity second.  </t>
              <t>
Party identity information included in CI will be kept confidential.</t>
            </li>
            <li>
              <t>Party identities that are not included in CI identity and are to be authenticated by CPace SHALL be integrated in ADa/ADb, such that
A integrates its party identifier in ADa and B integrates its party identifier in ADb. In this case, the application layer SHALL make the recipient
check the party identifier string of the remote communication partner.  </t>
              <t>
Note that identities communicated in ADa or ADb will not be kept confidential.</t>
            </li>
          </ul>
          <t>If ADa and ADb are not guaranteed to be unique, then CPace SHALL be used in initator-responder mode.</t>
          <t>If CPace is to be run in the symmetric mode without initiator and responder roles, the application can always enforce uniqueness of ADa and ADb for all sessions by adding further information such as random data.</t>
        </section>
        <section anchor="rationale-for-the-above-guidance">
          <name>Rationale for the above guidance</name>
          <t>Incorporating party identifier strings is important for fending off attacks based on relaying messages.
Such attacks become for example relevant in a setting where several parties, say, A, B and C, share the same password PRS.
An adversary might relay messages from an honest user A, who aims at interacting with user B, to a party C instead.
If no party identifier strings are used and B and C share the same PRS value, then A might be using CPace for
establishing a common ISK key with C while assuming to interact with party B.
If a party A is allowing for multiple concurrent sessions, the adversary may also mount an attack relaying messages of A looped back to A such that A actually shares a key with itself <xref target="HS14"/>.</t>
          <t>Integration of party identity strings in CI is to be preferred. This way, the identities may be kept confidential.
If both identities are to be integrated in CI, this is only possible if clear initiator and responder roles are assigned and the encoding of the identities associates the role with the identity string.</t>
          <t>Integration of identity strings in CI also avoids the need of the security-critical subsequent check for the identity strings,
which might be omitted or implemented incorrectly without notice. Integration of identities into CI also strengthens the security properties with respect
to attacks based on quantum computers <xref target="sec-quantum-annoying"/>.</t>
          <t>Applications that integrate identity strings in ADa and/or ADb shall carefully verify implementations for correctness
of the implemented identity checks that the application must carry out after the CPace run.</t>
          <t>When adding randomness guaranteeing for unique values of ADa and ADb then a party running the application can detect for loopback attacks by checking
that the received remote value of ADa/ADb doesn't show up in the list of active local concurrent protocol sessions <xref target="HMSD18"/>.</t>
          <t>If no unique value in ADa and ADb is available or if maintaining state information regarding the list of concurrently active local protocol instances for
verification is impractical in a given application setting, then the loopback attack may be
prevented by assigning initiator and responder role and mandating that a given party implements either the initiator or responder role
for a given PRS password but not both roles with the same (PRS,sid) value set.</t>
          <t>Note that the requirement on party identifiers may differ from what might be intuitively expected as information on the application service
such as service identifiers, port-ids and role information (e.g. client or server role) should be included as part of the party identity.</t>
          <t>For instance, if computers A and B allow for running a protocol with different roles (e.g. both might run several client and a server instances concurrently
on different ports) then a relay attack may successfully generate protocol confusion. E.g. a client instance on A may be maliciously redirected
to a second client instance on B while it expects to be connecting to a server on B. This will work if client and server instances on B share the same
PRS secret and the identity strings do not include information on the respective roles.</t>
        </section>
      </section>
      <section anchor="hashing-protocol-transcripts">
        <name>Hashing protocol transcripts</name>
        <t>CPace prepends the length of all variable-size input strings before hashing data.
Prepending the length of
all variable-size input strings results in a so-called prefix-free encoding of transcript strings, using terminology introduced in <xref target="CDMP05"/>. This property allows for disregarding length-extension imperfections that come with the commonly used Merkle-Damgard hash function constructions such as SHA256 and SHA512 <xref target="CDMP05"/>.</t>
      </section>
      <section anchor="key-derivation">
        <name>Key derivation</name>
        <t>A CPace implementation SHALL output ISK but MUST NOT expose K, because a leaked K
may enable offline dictionary attack
on the password, and a matching value for K does not provide authentication of ADa and ADb.</t>
        <t>As noted already in <xref target="protocol-section"/> it is RECOMMENDED to process ISK
by use of a suitable strong key derivation function KDF (such as defined in <xref target="RFC5869"/>) first,
before using the key in a higher-level protocol.</t>
      </section>
      <section anchor="sec-key-confirmation">
        <name>Key confirmation</name>
        <t>In many applications it is advisable to add an explicit key confirmation round after the CPace protocol flow. However, as some applications
might only require implicit authentication and as explicit authentication messages are already a built-in feature in many higher-level protocols (e.g. TLS 1.3), the CPace protocol described here does not mandate
key confirmation.</t>
        <t>Already without explicit key confirmation, CPace enjoys weak forward security under the sCDH and sSDH assumptions <xref target="AHH21"/>.
With added explicit confirmation, CPace enjoys perfect forward security also under the strong sCDH and sSDH assumptions <xref target="AHH21"/>.</t>
        <t>Note that in <xref target="ABKLX21"/> it was shown that an idealized variant of CPace
also enjoys perfect forward security without explicit key confirmation. However this proof does not explicitly cover
the recommended cipher suites
in this document and requires the stronger assumption of an algebraic adversary model. For this reason, we recommend adding
explicit key confirmation if perfect forward security is required.</t>
        <t>When implementing explicit key confirmation, it is recommended to use an appropriate message-authentication code (MAC)
such as HMAC <xref target="RFC2104"/> or
CMAC <xref target="RFC4493"/> using a key mac_key derived from ISK.</t>
        <t>One suitable option that works also in the parallel setting without message ordering is to proceed as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First calculate mac_key as mac_key = H.hash(b"CPaceMac" || sid || ISK).</t>
          </li>
          <li>
            <t>Then let each party send an authenticator tag calculated over the protocol message that it has sent previously. I.e.
let party A calculate its authentication tag Ta as Ta = MAC(mac_key, lv_cat(Ya,ADa)) and let party B calculate its
authentication tag Tb as Tb = MAC(mac_key, lv_cat(Yb,ADb)).</t>
          </li>
          <li>
            <t>Let the receiving party check the remote authentication tag for the correct value and abort in case that it's incorrect.</t>
          </li>
        </ul>
      </section>
      <section anchor="integrating-cpace-in-higher-level-protocols-such-as-tls13">
        <name>Integrating CPace in higher-level protocols such as TLS1.3</name>
        <t>When integrating CPace into a higher-level protocol such as TLS1.3 <xref target="RFC8446"/> it is recommended to use ISK
as shared secret (which might otherwise be generated as part of a Diffie-Hellman key exchange output for other cipher suites).</t>
        <t>Note that unlike the shared secret of a Diffie-Hellman protocol run, ISK will also provide mutual implicit authentication of the protocol partners.
For providing explicit authentication, it is recommended to add a key confirmation round along the lines in <xref target="sec-key-confirmation"/>,
such as e.g. done in the "Finished" messages in TLS1.3 <xref target="RFC8446"/>.</t>
        <t>If an embedding protocol uses more than two messages (e.g. four message TLS1.3 <xref target="RFC8446"/> flows involving
a hello-retry message and a repeated client-hello message) it is suggested
that the CPace layer only considers the two messages used for the CPace run. I.e., it is suggested that
authenticating the full message sequence involving also the additional messages that might precede the two CPace messages
is done under the responsibility of the embedding application protocol.
This could be done by integrating the full protocol transcript as part of a final explicit key confirmation round (as commonly done by TLS 1.3 as part of the "Finished" messages).
Alternatively, information on communication rounds preceding the CPace flows can also be integrated as part of the CI field, as this will authenticate
the information and will not require both communication partners to keep state information regarding preceding messages in memory until after the CPace run.</t>
        <t>In case of TLS 1.3 <xref target="RFC8446"/> it is suggested to integrate Ya into the client-hello message and Yb into the server-hello message. Also party identifiers
might best be added to the client-hello and server-hello messages as part of extension fields.
It is recommended to use the full octet stream encoding of the
client-hello message as parameter ADa. Likewise it is recommended to use the encoding of the server-hello message for the parameter ADb.
This approach has the drawback that the public points Ya and Yb might show up redundantly duplicated in the hashing operation for
CPace's transcript strings but has the advantage of simplicity and the advantage that all meta-information in the extension fields within the
client- and server hello fields will always become authenticated as part of the ISK.</t>
      </section>
      <section anchor="sec-sid-output">
        <name>Calculating a session identifier alongside with the CPace run</name>
        <t>If CPace was run with an empty string sid available as input, both parties can produce a public session identifier string
sid_output = H.hash(b"CPaceSidOutput" || transcript(Ya,ADa,Yb,ADb)) which will be unique for honest parties <xref target="BGHJ24"/>.</t>
      </section>
      <section anchor="sampling-of-scalars">
        <name>Sampling of scalars</name>
        <t>For curves over fields F_q where q is a prime close to a power of two, we recommend sampling scalars as a uniform bit string of length field_size_bits. We do so in order to reduce both, complexity of the implementation and the attack surface
with respect to side-channels for embedded systems in hostile environments.
<xref target="AHH21"/> demonstrated that non-uniform sampling did not negatively impact security for the case of Curve25519 and Curve448.
This analysis however does not transfer to most curves in Short-Weierstrass form.</t>
        <t>As a result, we recommend rejection sampling if G is as in <xref target="CPaceWeierstrass"/>. Alternatively an algorithm designed along the lines of the hash_to_field() function from <xref target="RFC9380"/> can also be
used. There, oversampling to an integer significantly larger than the curve order is followed by a modular reduction to the group order.</t>
      </section>
      <section anchor="preconditions-for-using-the-simplified-cpace-specification-from-cpacemontgomery">
        <name>Preconditions for using the simplified CPace specification from <xref target="CPaceMontgomery"/></name>
        <t>The security of the algorithms used for the recommended cipher suites for the Montgomery curves Curve25519 and Curve448 in <xref target="CPaceMontgomery"/> rely on the following properties <xref target="AHH21"/>:</t>
        <ul spacing="normal">
          <li>
            <t>The curve has order (p * c) with p prime and c a small cofactor. Also the curve's quadratic twist must be of order (p' * c') with p' prime and c' a cofactor.</t>
          </li>
          <li>
            <t>The cofactor c of the curve MUST BE equal to or an integer multiple of the cofactor c' of the curve's quadratic twist. Also, importantly, the
implementation of the scalar_mult and scalar_mult_vfy
functions must ensure that all scalars actually used for the group operation are integer multiples of
c (e.g. such as asserted by the specification of the decodeScalar functions in <xref target="RFC7748"/>).</t>
          </li>
          <li>
            <t>Both field order q and group order p MUST BE close to a power of two along the lines of <xref target="AHH21"/>, Appendix E. Otherwise the simplified scalar sampling specified in <xref target="CPaceMontgomery"/>
needs to be changed.</t>
          </li>
          <li>
            <t>The representation of the neutral element G.I MUST BE the same for both, the curve and its twist.</t>
          </li>
          <li>
            <t>The implementation of G.scalar_mult_vfy(y,X) MUST map all c low-order points on the curve and all c' low-order points on the twist to G.I.</t>
          </li>
        </ul>
        <t>Algorithms for curves other than the ones recommended here can be based on the principles from <xref target="CPaceMontgomery"/> given that the above properties hold.</t>
      </section>
      <section anchor="nonce-values">
        <name>Nonce values</name>
        <t>Secret scalars ya and yb MUST NOT be reused. Values for sid SHOULD NOT be reused since the composability
guarantees established by the simulation-based proof rely on the uniqueness of session ids <xref target="AHH21"/>.</t>
        <t>If the higher-level protocol that integrates CPace is able to establish a unique sid identifier for the communication session,
it is RECOMMENDED that this is passed to CPace as sid parameter.
One suitable option for generating sid is concatenation of ephemeral random strings contributed by both parties.</t>
      </section>
      <section anchor="side-channel-attacks">
        <name>Side channel attacks</name>
        <t>All state-of-the art methods for realizing constant-time execution SHOULD be used.
Special care is RECOMMENDED specifically for elliptic curves in Short-Weierstrass form
as important standard documents including <xref target="IEEE1363"/> describe curve operations with
non-constant-time algorithms.</t>
        <t>In case that side channel attacks are to be considered practical for a given application, it is RECOMMENDED to pay special
attention on computing the secret generator G.calculate_generator(PRS,CI,sid).
The most critical substep to consider might be the processing of the first block of the hash that includes
the PRS string.
The zero-padding introduced when hashing the sensitive PRS string can be expected to make
the task for a side-channel attack somewhat more complex. Still this feature alone is not sufficient for ruling out power analysis attacks.
The mapping algorithm that
converts the generator string to a elliptic curve point SHALL execute in constant time. In <xref target="RFC9380"/> suitable constant-time methods
are available for any elliptic curve.</t>
        <t>Even though the calculate_generator operation might be considered to form the primary target for side-channel attacks as information on long-term secrets might be exposed,
also the subsequent operations on ephemeral values, such as scalar
sampling and scalar multiplication should be protected from side-channels.</t>
      </section>
      <section anchor="large-characteristic-finite-fields">
        <name>Large-characteristic finite fields</name>
        <t>This document intentionally specifies CPace only for use on elliptic curve groups and the security proofs in <xref target="AHH21"/> only cover this case explicitly.
For group environments built upon safe primes additional security analysis will be required. For instance exponential equivalence attacks
may become practical when short exponents are used.</t>
      </section>
      <section anchor="sec-quantum-annoying">
        <name>Quantum computers</name>
        <t>CPace is proven secure under the hardness of the strong computational Simultaneous Diffie-Hellmann (sSDH) and strong computational Diffie-Hellmann (sCDH)
assumptions in the group G (as defined in <xref target="AHH21"/>).
These assumptions are not expected to hold any longer when large-scale quantum computers (LSQC) are available.
Still, even in case that LSQC emerge, it is reasonable to assume that discrete-logarithm computations will remain costly. CPace with ephemeral pre-established session id values
sid forces the adversary to solve one computational Diffie-Hellman problem per password guess <xref target="ES21"/>.
If party identifiers are included as part of CI then the adversary is forced to solve one computational Diffie-Hellman problem per password
guess and party identifier pair.
For this reason it is RECOMMENDED to use the optional inputs sid if available in an application setting.
For the same reason it is RECOMMENDED to integrate party identity strings A,B into CI.</t>
        <t>In this sense, using the wording suggested by Steve Thomas on the CFRG mailing list, CPace is "quantum-annoying".</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>No IANA action is required.</t>
    </section>
    <section anchor="reference-implementation-and-test-vector-generation">
      <name>Reference implementation and test vector generation</name>
      <t>The reference implementation that was used for deriving test vectors is available at <xref target="REFIMP"/>.
The embedded base64-encoded test vectors will decode to JSON files having the test vector's octet strings encoded as base16 (i.e. hexadecimal) strings.</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>We would like to thank the participants on the CFRG list for comments and advice. Any comment and advice is appreciated.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="SEC1" target="http://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author>
              <organization>Standards for Efficient Cryptography Group (SECG)</organization>
            </author>
            <date year="2009" month="May"/>
          </front>
        </reference>
        <reference anchor="IEEE1363">
          <front>
            <title>Standard Specifications for Public Key Cryptography, IEEE 1363</title>
            <author>
              <organization/>
            </author>
            <date year="2000"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="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="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 970?>

<section anchor="cpace-function-definitions">
      <name>CPace function definitions</name>
      <section anchor="definition-and-test-vectors-for-string-utility-functions">
        <name>Definition and test vectors for string utility functions</name>
        <section anchor="prependlen-function">
          <name>prepend_len function</name>
          <sourcecode type="python"><![CDATA[
def prepend_len(data):
    "prepend LEB128 encoding of length"
    length = len(data)
    length_encoded = b""
    while True:
        if length < 128:
            length_encoded += bytes([length])
        else:
            length_encoded += bytes([(length & 0x7f) + 0x80])
        length = int(length >> 7)
        if length == 0:
            break;
    return length_encoded + data
]]></sourcecode>
        </section>
        <section anchor="prependlen-test-vectors">
          <name>prepend_len test vectors</name>
          <artwork><![CDATA[
  prepend_len(b""): (length: 1 bytes)
    00
  prepend_len(b"1234"): (length: 5 bytes)
    0431323334
  prepend_len(bytes(range(127))): (length: 128 bytes)
    7f000102030405060708090a0b0c0d0e0f101112131415161718191a1b
    1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738
    393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455
    565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172
    737475767778797a7b7c7d7e
  prepend_len(bytes(range(128))): (length: 130 bytes)
    8001000102030405060708090a0b0c0d0e0f101112131415161718191a
    1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
    38393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354
    55565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071
    72737475767778797a7b7c7d7e7f
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJwcmVwZW5kX2xlbihiJycpIjogIjAwIiwgImInMTIzNCciOiAiMzEzMjMzMzQiLC
 #AicHJlcGVuZF9sZW4oYicxMjM0JykiOiAiMDQzMTMyMzMzNCIsICJwcmVwZW5kX2xl
 #bihieXRlcyhyYW5nZSgxMjcpKSkiOiAiN0YwMDAxMDIwMzA0MDUwNjA3MDgwOTBBME
 #IwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGMjAyMTIyMjMy
 #NDI1MjYyNzI4MjkyQTJCMkMyRDJFMkYzMDMxMzIzMzM0MzUzNjM3MzgzOTNBM0IzQz
 #NEM0UzRjQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NEE0QjRDNEQ0RTRGNTA1MTUyNTM1NDU1
 #NTY1NzU4NTk1QTVCNUM1RDVFNUY2MDYxNjI2MzY0NjU2NjY3Njg2OTZBNkI2QzZENk
 #U2RjcwNzE3MjczNzQ3NTc2Nzc3ODc5N0E3QjdDN0Q3RSIsICJwcmVwZW5kX2xlbihi
 #eXRlcyhyYW5nZSgxMjgpKSkiOiAiODAwMTAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQj
 #BDMEQwRTBGMTAxMTEyMTMxNDE1MTYxNzE4MTkxQTFCMUMxRDFFMUYyMDIxMjIyMzI0
 #MjUyNjI3MjgyOTJBMkIyQzJEMkUyRjMwMzEzMjMzMzQzNTM2MzczODM5M0EzQjNDM0
 #QzRTNGNDA0MTQyNDM0NDQ1NDY0NzQ4NDk0QTRCNEM0RDRFNEY1MDUxNTI1MzU0NTU1
 #NjU3NTg1OTVBNUI1QzVENUU1RjYwNjE2MjYzNjQ2NTY2Njc2ODY5NkE2QjZDNkQ2RT
 #ZGNzA3MTcyNzM3NDc1NzY3Nzc4Nzk3QTdCN0M3RDdFN0YifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="lvcat-function">
          <name>lv_cat function</name>
          <sourcecode type="python"><![CDATA[
  def lv_cat(*args):
      result = b""
      for arg in args:
          result += prepend_len(arg)
      return result
]]></sourcecode>
        </section>
        <section anchor="testvector-for-lvcat">
          <name>Testvector for lv_cat()</name>
          <artwork><![CDATA[
  lv_cat(b"1234",b"5",b"",b"678"): (length: 12 bytes)
    043132333401350003363738
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-1">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJzEyMzQnIjogIjMxMzIzMzM0IiwgImInNSciOiAiMzUiLCAiYic2NzgnIjogIj
 #M2MzczOCIsICJsdl9jYXQoYicxMjM0JyxiJzUnLGInJyxiJzY3OCcpIjogIjA0MzEz
 #MjMzMzQwMTM1MDAwMzM2MzczOCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="definition-of-generatorstring-function">
        <name>Definition of generator_string function.</name>
        <sourcecode type="python"><![CDATA[
def generator_string(DSI,PRS,CI,sid,s_in_bytes):
    # Concat all input fields with prepended length information.
    # Add zero padding in the first hash block after DSI and PRS.
    len_zpad = max(0,s_in_bytes - 1 - len(prepend_len(PRS))
                     - len(prepend_len(DSI)))
    return lv_cat(DSI, PRS, zero_bytes(len_zpad),
                           CI, sid)
]]></sourcecode>
      </section>
      <section anchor="definitions-and-test-vector-ordered-concatenation">
        <name>Definitions and test vector ordered concatenation</name>
        <section anchor="definitions-for-lexiographical-ordering">
          <name>Definitions for lexiographical ordering</name>
          <t>For ordered concatenation lexiographical ordering of byte sequences is used:</t>
          <sourcecode type="python"><![CDATA[
   def lexiographically_larger(bytes1,bytes2):
      "Returns True if bytes1>bytes2 using lexiographical ordering."
      min_len = min (len(bytes1), len(bytes2))
      for m in range(min_len):
          if bytes1[m] > bytes2[m]:
              return True;
          elif bytes1[m] < bytes2[m]:
              return False;
      return len(bytes1) > len(bytes2)
]]></sourcecode>
        </section>
        <section anchor="definitions-for-ordered-concatenation">
          <name>Definitions for ordered concatenation</name>
          <t>With the above definition of lexiographical ordering ordered concatenation is specified as follows.</t>
          <sourcecode type="python"><![CDATA[
  def o_cat(bytes1,bytes2):
      if lexiographically_larger(bytes1,bytes2):
          return b"oc" + bytes1 + bytes2
      else:
          return b"oc" + bytes2 + bytes1
]]></sourcecode>
        </section>
        <section anchor="test-vectors-ordered-concatenation">
          <name>Test vectors ordered concatenation</name>
          <artwork><![CDATA[
  string comparison for o_cat:
    lexiographically_larger(b"\0", b"\0\0") == False
    lexiographically_larger(b"\1", b"\0\0") == True
    lexiographically_larger(b"\0\0", b"\0") == True
    lexiographically_larger(b"\0\0", b"\1") == False
    lexiographically_larger(b"\0\1", b"\1") == False
    lexiographically_larger(b"ABCD", b"BCD") == False

  o_cat(b"ABCD",b"BCD"): (length: 9 bytes)
    6f6342434441424344
  o_cat(b"BCD",b"ABCDE"): (length: 10 bytes)
    6f634243444142434445
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-2">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJ0FCQ0QnIjogIjQxNDI0MzQ0IiwgImInQkNEJyI6ICI0MjQzNDQiLCAiYidBQk
 #NERSciOiAiNDE0MjQzNDQ0NSIsICJvX2NhdChiJ0FCQ0QnLGInQkNEJykiOiAiNkY2
 #MzQyNDM0NDQxNDI0MzQ0IiwgIm9fY2F0KGInQkNEJyxiJ0FCQ0RFJykiOiAiNkY2Mz
 #QyNDM0NDQxNDI0MzQ0NDUifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="definitions-for-transcriptir-function">
          <name>Definitions for transcript_ir function</name>
          <sourcecode type="python"><![CDATA[
def transcript_ir(Ya,ADa,Yb,ADb):
    result = lv_cat(Ya,ADa) + lv_cat(Yb,ADb)
    return result
]]></sourcecode>
        </section>
        <section anchor="test-vectors-transcriptir-function">
          <name>Test vectors transcript_ir function</name>
          <artwork><![CDATA[
  transcript_ir(b"123", b"PartyA", b"234",b"PartyB"):
  (length: 22 bytes)
    03313233065061727479410332333406506172747942
  transcript_ir(b"3456",b"PartyA",b"2345",b"PartyB"):
  (length: 24 bytes)
    043334353606506172747941043233343506506172747942
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-3">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJzEyMyciOiAiMzEzMjMzIiwgImInMjM0JyI6ICIzMjMzMzQiLCAiYidQYXJ0eU
 #EnIjogIjUwNjE3Mjc0Nzk0MSIsICJiJ1BhcnR5QiciOiAiNTA2MTcyNzQ3OTQyIiwg
 #ImInMzQ1NiciOiAiMzMzNDM1MzYiLCAiYicyMzQ1JyI6ICIzMjMzMzQzNSIsICJ0cm
 #Fuc2NyaXB0X2lyKGInMTIzJyxiJ1BhcnR5QScsYicyMzQnLGInUGFydHlCJykiOiAi
 #MDMzMTMyMzMwNjUwNjE3Mjc0Nzk0MTAzMzIzMzM0MDY1MDYxNzI3NDc5NDIiLCAidH
 #JhbnNjcmlwdF9pcihiJzM0NTYnLGInUGFydHlBJyxiJzIzNDUnLGInUGFydHlCJyki
 #OiAiMDQzMzM0MzUzNjA2NTA2MTcyNzQ3OTQxMDQzMjMzMzQzNTA2NTA2MTcyNzQ3OT
 #QyIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="definitions-for-transcriptoc-function">
          <name>Definitions for transcript_oc function</name>
          <sourcecode type="python"><![CDATA[
def transcript_oc(Ya,ADa,Yb,ADb):
    result = o_cat(lv_cat(Ya,ADa),lv_cat(Yb,ADb))
    return result
]]></sourcecode>
        </section>
        <section anchor="test-vectors-for-transcriptoc-function">
          <name>Test vectors for transcript_oc function</name>
          <artwork><![CDATA[
  transcript_oc(b"123", b"PartyA", b"234",b"PartyB"):
  (length: 24 bytes)
    6f6303323334065061727479420331323306506172747941
  transcript_oc(b"3456",b"PartyA",b"2345",b"PartyB"):
  (length: 26 bytes)
    6f63043334353606506172747941043233343506506172747942
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-4">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJzEyMyciOiAiMzEzMjMzIiwgImInMjM0JyI6ICIzMjMzMzQiLCAiYidQYXJ0eU
 #EnIjogIjUwNjE3Mjc0Nzk0MSIsICJiJ1BhcnR5QiciOiAiNTA2MTcyNzQ3OTQyIiwg
 #ImInMzQ1NiciOiAiMzMzNDM1MzYiLCAiYicyMzQ1JyI6ICIzMjMzMzQzNSIsICJ0cm
 #Fuc2NyaXB0X29jKGInMTIzJyxiJ1BhcnR5QScsYicyMzQnLGInUGFydHlCJykiOiAi
 #NkY2MzAzMzIzMzM0MDY1MDYxNzI3NDc5NDIwMzMxMzIzMzA2NTA2MTcyNzQ3OTQxIi
 #wgInRyYW5zY3JpcHRfb2MoYiczNDU2JyxiJ1BhcnR5QScsYicyMzQ1JyxiJ1BhcnR5
 #QicpIjogIjZGNjMwNDMzMzQzNTM2MDY1MDYxNzI3NDc5NDEwNDMyMzMzNDM1MDY1MD
 #YxNzI3NDc5NDIifQ==
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="decoding-and-encoding-functions-according-to-rfc7748">
        <name>Decoding and Encoding functions according to RFC7748</name>
        <sourcecode type="python"><![CDATA[
   def decodeLittleEndian(b, bits):
       return sum([b[i] << 8*i for i in range((bits+7)/8)])

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

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

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

        v = - A / (1 + z * r^2)
        epsilon = (v^3 + A * v^2 + B * v)^powerForLegendreSymbol
        x = epsilon * v - (1 - epsilon) * A/2
        return encodeUCoordinate(Integer(x), field_size_bits)
]]></sourcecode>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test vectors</name>
      <section anchor="test-vector-for-cpace-using-group-x25519-and-hash-sha-512">
        <name>Test vector for CPace using group X25519 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-x25519">
          <name>Test vectors for calculate_generator with group X25519</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 109 ; DSI = b'CPace255'
    CI = b'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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
D3roA04wkIqIlkHCQ4siJxCqiCruPFys40w0cG4eYpIJh5RzX959/gSeN/Ss
FHlLs7jY7zCbjyXOtqCuhNLelZVrOtdEDZGofsopHgRTchiUEPXDnNqCwx8v
BieFdOkpCHnkn0UuJk6FnfFpM6QmNkkwElNCVKIWLlE8jJfYAWWHpeli4jLD
1EAk0GgZUndAH4QXxv+F15P6GSraxmJ8XePUqumFEowKFRXBKX+yvLYanXPT
B9LVnz0gxBTYwwwzVZIE78kaceTnnzsXrJx2xzn52Wxt7iY5n3RxMfPMishJ
s/T5xH7H2gxeG7VnzpaF3bvRUvTHSLJ2nm8Ky4oq5exTkTypqOP0pYBubhp/
WV1sTNbec5Ml8aE9FVRHxWNZUlPWb2ebYxlq4pF6FD1akuATKMUXK8BXMCMX
M1dZdSenwzMsgyARgCUOxcRiOMjyDWyJh81TjvpHmTYYmDPAn4sbTdJZS6/M
YUiZ4bt5qpkL3pURgMXybFbveZHzhFzNS6Z6Oqf6f6TKPuCVn38edk67vY/i
IrnESYxGWb1akt2DUoMQJSad899fnPdBnKG1euM+SKBrb/wQp1pYxqonkcuF
THbdPKSrW27CJxfGBSVhWlCV3gTlIx9viZ+GwYRrMQzjJzxXlMSck0F3Jc6T
KmKQY/euZrDT0VLViuhLpl0QFzxQ2RZ2thFfaJ+bIigWcrNMdD6USlQkaOT/
kfcFKL+u1kvSIMmk9RDOHLgwtVkXBB2fAu1a83uqqhVJ61+vQU4ml4Qaxr//
/W/zfgPK2tyAKeVj+NQhZqgX3lDrpwN5N92PnWPbaaYihhy4OKDnRBDjrane
1z6+lieIHTb5eS4gGC3XIc9DV5WoWMhfTZgr+SJnpD+/5Ru4Dv/OX/yjoJ4G
fSp84buHYr7/ZVpPjXHB/DP827S0sdS2gG/Ih//2N7NRyFn027emlZ7XA3Z1
9xf6SPT5yq6EigHwKPIOSz9pOi8YST8mgGXhjSmW9ca0TXFTNc5nWTsP206l
mnqhlnqhWrErTqVSqWZfJFAt0WF3aDuNQiE1J6CENkhjbFmWbTlWxapaNatu
Naym1bJcy7N8K7BCa2xbtm07dsWu2jW7bjfspt2yXdvju+B8O7BDe+xYju04
TsWpOjWn7jScptNyXMdzfCdwQmdcseRaKzUw1RuVJr1eaVXcilfxK0ElrIyr
VtWuOtVKtVqtVet4a1y1VXWrXtWvBtWwOq5ZNbvm1Cq1aq1Gr9fqtUatWWvV
3JpX82tBLayN61bdrjv1Sr1ar9Xr9Ua9WW/V3bpX9+tBPayPG1bDbvANdY1K
o9qoNeqNRqPZaDXchtfwG0EjfBaczQw4K5YOziYC8zcBlMHp/VaAMjibvxWg
DM7abwUog9PZB9DGmAnmFRKMOQIiUe2q4kS66FLj+OiiU68KnodUVZJUZb4K
N+8f/dmnxy8/1e4+O09TL7qJ3m/8++7tYtK9PXrsRo+T7qw774262/6JH51H
R1Fv29n2bnvb3nYQ/XgCgxxF/rv3U//s0/rLaSv+8lN1cRX5T/CI9X5zx6+0
B9veqLfBl/on3bh7kp4WBsGZw8/Dqb+52Vz9VJt/uZjAEP79hwseom9dPfba
R0+9dvextz2yeu3Lx/7tUaXXnjyej46Pex0YpPs42B53ep3Lx+Ft57E36sAQ
sNjR4Kk/6ji9kf903u7Uepedp8Htabt3OXgajk7PerdHG9jgBla8gUH67a7d
u73a9Lfdau/2bjMYvT/p3fU2w/b7097d1bbX7j31tl3YSs/qbS+3/dtepbed
bM9H/eOe1d0OtjhIp2ddboe3g0dQ0Kze7WDbbw+s/mjg9Nu+dd4e1PqdjjW4
Hbb7nYE1HA3P+qMjuze63PRHPbvfvrRxkNGV3d9eVvujO3sw+nTSv+zZw/an
0/7lldNrXz31b7tOb3tl9W8vnf7tVaV/O3HOR1+O+3ddZ7D90unfwSCXzvDW
f+xvOxUA57a/HVT6I9/pb/3Keduv9a1OZXAbtPvWoDK82D0ZPBbEk52TmaiT
OW8fAajh/zaA/PYI4AObHh3BCv1H+K7W63QeB7cwyHG71xk8DkfHZ/D4E5wO
QL33BPCBfcNmtp1qb3T3NBidnvQue0/D9ulp7/JqAwcO08HpbLvA1V/1bgFE
t13YzGRzPnp/3Lvrbgbb953e3eVmeNt71LBzC6AE+Pjb83av1rM628Ftv93D
QQbb4ah/1m8DGo0GG/wQTgegDqDcDqr99p01GA1P8AyH7eFpv3NlA7oBDgFi
bC/hFPl0bi8BlBP7fPTpuH/ZtQfbT53+5aU9vL0CzAR0u70C3IADH13B6fjO
efuq1r/rOIPbL+3+3cAZjmCQL2f9LSDxyAd061UAN+DA4SC3frW/vasMRsFJ
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
6R/hNHCz6uEkXZ4v4ISINlmtLyv4CBxn4Qy/WcIBAk6DcMZA9lA4IbNVj/3f
D83axKcqnA6YV+VqDWctViGIAQ4FxwwuVdXVMRyse40nx64/gwPmAZFOtgzb
xS9u2t0lVP/nFT4WIf6f0wqO2dcrGCSchuRDs/aTWbsnbEPkkr/MrCcnSMy6
N6uIZu0Wr7vcC0dy9tCs8QkCnKJ/oZ88PpKNO3po1oto1urkycv8kpFMZh1/
wJHMZtXRrHikf93lXjSSh2aFyKdJIt0TEbM6OGvWcGxt4Qx6uejQ2dfny5pB
XGwqGBV46HZZtesDvarwI1dlvTs5rHv01jNRbw445ZMz8P9Wt5uL+Snb3ZC8
mVIPa3dPBQieUl8cIx8FSN/K/fn2hThXVLO8i3L9S/XfAradN+Nc1URW8QTK
NV7+KZyrzF6Hc+X5fZwr3P43wrlqIaRn1kFh7pDzOssKlymrtWBMwXb+eXGu
BXsG56rgf8VDnGuuH6l0po+/tVD6d/z4jHtNkMnXrDhn80LPTdRPr/enca/6
XhOzgTKXy1AoLQzUly7nZsjhmAgFYtAMTkND8FArSq1cVuQq97wYhc/ntlBb
jJkbtMhg8b0SmRwd1K5whcx4lVPDKDNesgErSq8dK6AQzIN8HieLKeIeTvZr
GvfjuNr7I/TCwCHB2pBxO+RwBBfFADcy3AYJd89YgHEN4BzBBTYGOWBhzFOr
fBAwQjh/Z3wwEFDeQakOV4ErMQfH0kIb4eEUKqVTw5AzcAk4Cqhx/GI43P6n
5V/Xx7yJW+nxX39owvC9Dmc/XLHzd3UE0u7O8LU737MRqvGJr9qGvlpWx0c3
V+PfHRuwkiurm+YWC4NuPX0NR1/uEA63QsZ1TsRIZa1i/dCc3CVOwke/UCzK
eoPs7bWsS/j9thdNif+OLPXxux4ka182m61skBp8U8HfNLL386P0CUh8W2+a
ZV01VbtreQeXid/KQGl6WTVIIb+GtxCZ+fHE73gHV3llZlzlj92tRnDxB8Qo
/xW32+bkr3/G7wRv7ptxpqBWMwZ5AiBjmbBblfD76atLGskdk5aW/xugX7/+
kRDV2Quh3U9/80s4XILo8hq/gl0vyq6CWqqnj/Jmc6bAnaAk6+H1A5QquJ2C
4g4+F7/lfQKie3nY7PCrtQsoz47xWzvWlRYOVZXEk1PLjq87hMFXxwq/M+vP
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
/+npBDYvbnzhm6eRY0PAdgwUKwnYKZYJIzJUPUC6BK98MWYFz6UyY+adCH7k
XrtMuXyI8DotZOA6WO9tzsLIOUcOfGeRlsFwn2XYTS29caoQjiklhR0cdhsc
3R34XZaQn9nTPbhvXfxfmgeeHiz/dxqs+HcarPx3Gqz62gYbC6cHZc+doUcE
OGwGO//PH6dWpQ9ffdqgtHu3ZPr5b1GQ+64g+9OjHpnNCpfnwlvhR+O80FaZ
nDGvMpdJoeHWLhsGaVw+ZtqPhRqywurYBZbBePLR5XxUPEiPzUUsKOU5fNjb
wmArWq4GO8pgFBvYWMCwx2cdJ47+ae+RI0PqGsSYZMHZnDRxshDyQSvLlbTa
aRFkpjOWMy3HwODHoGFpovcoA0ujg+Fs4IyPsvDO8sE6OTqhWHBaOzvmg8yY
hk8XQ56J3P/hcUP/dP0e3GkyNP3jyWFbU3DruOchF85YqW3uchuyEbHFuc4t
rHUhkEAq2DDoTA2Fz5FQJzq9tMxnPJgBFolbtLQzucu8GVFgKCAbFZPS5EMh
gx4MV2jy8LyhacBPG9qxgYSFjNVWWLBCbqQrpBJByDHX2FnmjJdSsKHQdlDB
ZVzmmZSxg1EjMZHBoRSwXLm24PthsEqC148efGzIPBeZtUbYMYxBamky/iUZ
fW6+LKPPZwCdPuQDmU/e668G/vrQJg+ZWuKj6g6fCX5Gppb+8/HovN+ToCCP
TvQPFh8L/HL2mo/+e9oGr7bJIzQ8E2nU5/TY6nMz+sRnplMYHl7+a3y/2Lh3
J+L8O3xOtsiPf4j+0vZnql1XrN5UCoVy8VEsPcHFLwrO8RHzAlmeum3POnzC
srm4QXJnfKzU9e1th8/IkF64PMMnUYum7G9rdnbT4NPK87LrT8tmtzhqN9UN
vE3Bz1W76xURsfY9Psy5QRh/t76qmvLiFhlqmxKfVi4rfCCMjzwPT/g70XD7
w/lV9JXlYV3VYlW1stmdLFv8b3NVdetj3u5a3ewOrrs1SmCf7Wokr8Unc+dV
s0W6YLgLigT3p4ersls0m0vkChCrvmUNO6ma3fKwKZdHNX2VcXxTV2esqfqb
pjynR+N9rVbrY9EiM0G1LPEB72qND78XcLmTsu0npoK/n+4+GvGmgRGfgx3x
aWXZlItFs0WCcKvokXRJ3EuLZt2V9Rqfu+OjtJMj/Gqj2SCndL+Dlbkmnq5N
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

-->

</rfc>
