<?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.35 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-21" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-21"/>
    <author initials="M." surname="Abdalla" fullname="Michel Abdalla">
      <organization>Alloc Init Labs - New York</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="April" day="23"/>
    <workgroup>Crypto Forum Research Group (CFRG)</workgroup>
    <abstract>
      <?line 160?>

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

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

]]></artwork>
      </section>
      <section anchor="cpace-protocol-instructions">
        <name>CPace protocol instructions</name>
        <t>A computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar ya = G.sample_scalar() and group element Ya = G.scalar_mult (ya,g). A then transmits Ya and associated data ADa to B.</t>
        <t>B computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar yb = G.sample_scalar() and group element Yb = G.scalar_mult(yb,g). B sends Yb and associated data ADb to A.</t>
        <t>B then computes K = G.scalar_mult_vfy(yb,Ya). B MUST abort if K=G.I.
Otherwise B calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K)||transcript(Ya,ADa,Yb,ADb)). B returns ISK and terminates.</t>
        <t>Likewise upon reception of the message from B,  A computes K = G.scalar_mult_vfy(ya,Yb). A MUST abort if K=G.I.</t>
        <t>Otherwise A calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(Ya,ADa,Yb,ADb)). A returns ISK and terminates.</t>
        <t>The session key ISK returned by A and B is identical if and only if the supplied input parameters PRS, CI and sid match on both sides and the transcript views of both parties match.</t>
      </section>
    </section>
    <section anchor="implementation-of-recommended-cpace-cipher-suites">
      <name>Implementation of recommended CPace cipher suites</name>
      <section anchor="common-function-for-computing-generators">
        <name>Common function for computing generators</name>
        <t>The different cipher suites for CPace defined in the upcoming sections share the following method for deterministically combining the individual strings PRS, CI, sid and the domain-separation identifier DSI to a generator string:</t>
        <ul spacing="normal">
          <li>
            <t>generator_string(DSI, PRS, CI, sid, s_in_bytes) denotes a function that returns the string
lv_cat(DSI, PRS, zero_bytes(len_zpad), CI, sid).</t>
          </li>
          <li>
            <t>len_zpad = MAX(0, s_in_bytes - len(prepend_len(PRS)) - len(prepend_len(G.DSI)) - 1)</t>
          </li>
        </ul>
        <t>The zero padding of length len_zpad is designed such that the encoding of DSI and PRS together with the zero padding field completely
fills at least the first input block (of length s_in_bytes) of the hash.
As a result for the common case of short PRS the number of bytes to hash becomes independent of the actual length of the password (PRS). (Code and test vectors are provided in the appendix.)</t>
        <t>The introduction of a zero-padding within the generator string also helps mitigating attacks of a side-channel adversary that
analyzes correlations between publicly known variable information with a short low-entropy PRS string.
Note that the hash of the first block is intentionally made independent of session-specific inputs, such as sid or CI and that there is no limitation
regarding the maximum length of the PRS string.</t>
      </section>
      <section anchor="CPaceMontgomery">
        <name>CPace group objects G_X25519 and G_X448 for single-coordinate Ladders on Montgomery curves</name>
        <t>In this section we consider the case of CPace when using the X25519 and X448 Diffie-Hellman functions
from <xref target="RFC7748"/> operating on the Montgomery curves Curve25519 and Curve448 <xref target="RFC7748"/>.
CPace implementations using single-coordinate ladders on further Montgomery curves SHALL use the definitions in line
with the specifications for X25519 and X448 and review the guidance given in <xref target="sec-considerations"/>.</t>
        <t>For the group environment G_X25519 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X25519.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_X25519.field_size_bits = 255</t>
          </li>
          <li>
            <t>G_X25519.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X25519(y,g)</t>
          </li>
          <li>
            <t>G_X25519.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.DSI = b"CPace255"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X25519 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 32 bytes of output. It is RECOMMENDED
to use G_X25519 in combination with SHA-512.</t>
        <t>For X448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_X448.field_size_bits = 448</t>
          </li>
          <li>
            <t>G_X448.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X448(y,g)</t>
          </li>
          <li>
            <t>G_X448.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.DSI = b"CPace448"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 56 bytes of output. It is RECOMMENDED
to use G_X448 in combination with SHAKE-256.</t>
        <t>For both G_X448 and G_X25519 the G.calculate_generator(H, PRS,sid,CI) function shall be implemented as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) SHALL BE calculated using the input block size of the
chosen hash function.</t>
          </li>
          <li>
            <t>This string SHALL then BE hashed to the required length
gen_str_hash = H.hash(gen_str, G.field_size_bytes).
Note that this implies that the permissible output length H.maxb_in_bytes MUST be larger or equal to the
field size of the group G for making a hashing function suitable.</t>
          </li>
          <li>
            <t>This result is then considered as a field coordinate using
the u = decodeUCoordinate(gen_str_hash, G.field_size_bits) function from <xref target="RFC7748"/> which we
repeat in the appendix for convenience.</t>
          </li>
          <li>
            <t>The result point g is then calculated as (g,v) = map_to_curve_elligator2(u) using the function
from <xref target="RFC9380"/>. Note that the v coordinate produced by the map_to_curve_elligator2 function
is not required for CPace and discarded. The appendix repeats the definitions from <xref target="RFC9380"/> for convenience.</t>
          </li>
        </ul>
        <t>Code for the functions above is available in the appendix.</t>
        <section anchor="verification-tests">
          <name>Verification tests</name>
          <t>For single-coordinate Montgomery ladders on Montgomery curves, verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving u coordinate values that encode a low-order
point on either the curve or the quadratic twist.</t>
          <t>In addition to that, in case of G_X25519, the tests SHALL also verify that the implementation of G.scalar_mult_vfy(y,g) produces the
expected results for non-canonical u coordinate values with bit #255 set, which may also encode low-order points.</t>
          <t>Corresponding test vectors are provided in the appendix.</t>
        </section>
      </section>
      <section anchor="CPaceCoffee">
        <name>CPace group objects G_Ristretto255 and G_Decaf448 for prime-order group abstractions</name>
        <t>In this section we consider the case of CPace using the Ristretto255 and Decaf448 group abstractions <xref target="RFC9496"/>.
These abstractions define an encode and decode function, group operations using an internal encoding
and an element-derivation function that maps a byte string to a group element.
With the group abstractions there is a distinction between an internal representation
of group elements and an external encoding of the same group element. In order to distinguish between these
different representations, we prepend an underscore before values using the internal representation within this
section.</t>
        <t>For Ristretto255 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_Ristretto255.DSI = b"CPaceRistretto255"</t>
          </li>
          <li>
            <t>G_Ristretto255.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_Ristretto255.group_size_bits = 252</t>
          </li>
          <li>
            <t>G_Ristretto255.group_order = 2^252 + 27742317777372353535851937790883648493</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_Ristretto255 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 64 bytes of output.
It is RECOMMENDED to use G_Ristretto255 in combination with SHA-512.</t>
        <t>For decaf448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_Decaf448.DSI = b"CPaceDecaf448"</t>
          </li>
          <li>
            <t>G_Decaf448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_Decaf448.group_size_bits = 445</t>
          </li>
          <li>
            <t>G_Decaf448.group_order = l = 2^446 -
  1381806680989511535200738674851542
  6880336692474882178609894547503885</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_Decaf448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 112 bytes of output.
It is RECOMMENDED to use G_Decaf448 in combination with SHAKE-256.</t>
        <t>For both abstractions the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>It is RECOMMENDED to implement G.sample_scalar() as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>Set scalar = sample_random_bytes(G.group_size_bytes).</t>
              </li>
              <li>
                <t>Then clear the most significant bits larger than G.group_size_bits.</t>
              </li>
              <li>
                <t>Interpret the result as the little-endian encoding of an integer value and return the result.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Alternatively, if G.sample_scalar() is not implemented according to the above recommendation, it SHALL be implemented using uniform sampling between 1 and (G.group_order - 1). Note that the more complex
uniform sampling process can provide a larger side-channel attack surface for embedded systems in hostile environments.</t>
          </li>
          <li>
            <t>G.scalar_mult(y,_g) SHALL operate on a scalar y and a group element _g in the internal representation of the group abstraction environment. It returns the value Y = encode(y * (_g)), i.e. it returns a value using the public encoding.</t>
          </li>
          <li>
            <t>G.I = is the public encoding representation of the identity element.</t>
          </li>
          <li>
            <t>G.scalar_mult_vfy(y,X) operates on a value using the public encoding and a scalar and is implemented as follows. If the decode(X) function fails, it returns G.I. Otherwise it returns encode( y * decode(X) ).</t>
          </li>
          <li>
            <t>The G.calculate_generator(H, PRS,sid,CI) function SHALL return a decoded point and SHALL BE implemented as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated using the input block size of the chosen hash function.</t>
              </li>
              <li>
                <t>This string is then hashed to the required length gen_str_hash = H.hash(gen_str, 2 * G.field_size_bytes).  Note that this
implies that the permissible output length H.maxb_in_bytes MUST be larger or equal to twice the field size of the group
G for making a
hash function suitable.</t>
              </li>
              <li>
                <t>Finally the internal representation of the generator _g is calculated as _g = element_derivation(gen_str_hash)
using the element derivation function from the abstraction.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Note that with these definitions the scalar_mult function operates on a decoded point _g and returns an encoded point,
while the scalar_mult_vfy(y,X) function operates on an encoded point X (and also returns an encoded point).</t>
        <section anchor="verification-tests-1">
          <name>Verification tests</name>
          <t>For group abstractions verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving
encodings of the neutral element or receives an octet string
that does not decode to a valid group element.</t>
        </section>
      </section>
      <section anchor="CPaceWeierstrass">
        <name>CPace group objects for curves in Short-Weierstrass representation</name>
        <t>The group environment objects G defined in this section for use with Short-Weierstrass curves,
are parametrized by the choice of an elliptic curve and by choice of a suitable encode_to_curve function.
encode_to_curve must map an octet string to a point on the curve.</t>
        <section anchor="curves-and-associated-functions">
          <name>Curves and associated functions</name>
          <t>Elliptic curves in Short-Weierstrass form are considered in <xref target="IEEE1363"/>.
<xref target="IEEE1363"/> allows for both, curves of prime and non-prime order. However, for the procedures described in this section any suitable
group MUST be of prime order.</t>
          <t>The specification for the group environment objects specified in this section closely follow the ECKAS-DH1 method from <xref target="IEEE1363"/>.
I.e. we use the same methods and encodings and protocol sub steps as employed in the TLS
 <xref target="RFC5246"/> <xref target="RFC8446"/> protocol family.</t>
          <t>For CPace only the uncompressed full-coordinate encodings from <xref target="SEC1"/> (x and y coordinate) SHOULD be used.
Commonly used curve groups are specified in <xref target="SEC2"/> and <xref target="RFC5639"/>. A typical representative of such a Short-Weierstrass curve is NIST-P256.
Point verification as used in ECKAS-DH1 is described in Annex A.16.10. of <xref target="IEEE1363"/>.</t>
          <t>For deriving Diffie-Hellman shared secrets ECKAS-DH1 from <xref target="IEEE1363"/> specifies the use of an ECSVDP-DH method. We use ECSVDP-DH in combination with the identity map such that it either returns "error" or the x-coordinate of the Diffie-Hellman result point as shared secret in big endian format (fixed length output by FE2OSP without truncating leading zeros).</t>
        </section>
        <section anchor="suitable-encodetocurve-methods">
          <name>Suitable encode_to_curve methods</name>
          <t>All the encode_to_curve methods specified in <xref target="RFC9380"/>
are suitable for CPace. For Short-Weierstrass curves it is RECOMMENDED to use the non-uniform variant of the SSWU
mapping primitive from <xref target="RFC9380"/> if a SSWU mapping is available for the chosen curve. (We recommend non-uniform maps in order to give implementations
the flexibility to opt for x-coordinate-only scalar multiplication algorithms.)</t>
        </section>
        <section anchor="definition-of-the-group-environment-g-for-short-weierstrass-curves">
          <name>Definition of the group environment G for Short-Weierstrass curves</name>
          <t>In this paragraph we use the following notation for defining the group object G for a selected curve and encode_to_curve method:</t>
          <ul spacing="normal">
            <li>
              <t>With G.group_order we denote the order of the elliptic curve which MUST be a prime.</t>
            </li>
            <li>
              <t>With is_valid(X) we denote a method which operates on an octet stream according to <xref target="SEC1"/> of a point on the group and returns true if the point is valid and returns false otherwise. This is_valid(X) method SHALL be implemented according to Annex A.16.10. of <xref target="IEEE1363"/>. I.e. it shall return false if X encodes either the neutral element on the group or does not form a valid encoding of a point on the group.</t>
            </li>
            <li>
              <t>With encode_to_curve(str,DST) we denote a mapping function from <xref target="RFC9380"/>. I.e. a function that maps
octet string str to a point on the group using the domain separation tag DST. <xref target="RFC9380"/> considers both, uniform and non-uniform mappings based on several different strategies. It is RECOMMENDED to use the nonuniform variant of the SSWU mapping primitive within <xref target="RFC9380"/>.</t>
            </li>
            <li>
              <t>G.DSI denotes a domain-separation identifier octet string. G.DSI which SHALL BE obtained by the concatenation of b"CPace" and the associated name of the cipher suite used for the encode_to_curve function as specified in <xref target="RFC9380"/>. E.g. when using the map with the name P384_XMD:SHA-384_SSWU_NU_
on curve NIST-P384 the resulting value SHALL BE G.DSI = b"CPaceP384_XMD:SHA-384_SSWU_NU_".</t>
            </li>
          </ul>
          <t>Using the above definitions, the CPace functions required for the group object G are defined as follows.</t>
          <ul spacing="normal">
            <li>
              <t>G.DST denotes the domain-separation tag value to use in conjunction with the encode_to_curve function from <xref target="RFC9380"/>. G.DST shall be obtained by concatenating G.DSI and b"_DST".</t>
            </li>
            <li>
              <t>G.sample_scalar() SHALL return a value between 1 and (G.group_order - 1). The sampling SHALL BE indistinguishable from uniform random
selection between 1 and (G.group_order - 1).
It is RECOMMENDED to use a constant-time rejection sampling algorithm for converting a uniform bitstring to a uniform value between 1 and (G.group_order - 1).</t>
            </li>
            <li>
              <t>G.calculate_generator(H, PRS,sid,CI) function SHALL be implemented as follows.  </t>
              <ul spacing="normal">
                <li>
                  <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated.</t>
                </li>
                <li>
                  <t>Then the output of a call to encode_to_curve(gen_str, G.DST) is returned, using the selected suite from <xref target="RFC9380"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>G.scalar_mult(s,X) is a function that operates on a scalar s and an input point X. The input X shall use the same encoding as produced by the G.calculate_generator method above.
G.scalar_mult(s,X) SHALL return an encoding of either the point s*X or the point (-s)*X according to <xref target="SEC1"/>. Implementations SHOULD use the full-coordinate format without compression, as important protocols such as TLS 1.3 removed support for compression. Implementations of scalar_mult(s,X) MAY output either s*X or (-s)*X as both points s*X and (-s)*X have the same x-coordinate and
result in the same Diffie-Hellman shared secrets K.
(This allows implementations to opt for x-coordinate-only scalar multiplication algorithms.)</t>
            </li>
            <li>
              <t>G.scalar_mult_vfy(s,X) merges verification of point X according to <xref target="IEEE1363"/> A.16.10. and the the ECSVDP-DH procedure from <xref target="IEEE1363"/>.
It SHALL BE implemented as follows:  </t>
              <ul spacing="normal">
                <li>
                  <t>If is_valid(X) = False then G.scalar_mult_vfy(s,X) SHALL return "error" as specified in <xref target="IEEE1363"/> A.16.10 and 7.2.1.</t>
                </li>
                <li>
                  <t>Otherwise G.scalar_mult_vfy(s,X) SHALL return the result of the ECSVDP-DH procedure from <xref target="IEEE1363"/> (section 7.2.1). I.e. it shall
either return "error" (in case that s*X is the neutral element) or the secret shared value "z" defined in <xref target="IEEE1363"/> (otherwise).
"z" SHALL be encoded by using
the big-endian encoding of the x-coordinate of the result point s*X according to <xref target="SEC1"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>We represent the neutral element G.I by using the representation of the "error" result case from <xref target="IEEE1363"/> as used in the G.scalar_mult_vfy method above.</t>
            </li>
          </ul>
        </section>
        <section anchor="verification-tests-2">
          <name>Verification tests</name>
          <t>For Short-Weierstrass curves verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving an
encoding of the point at infinity and an encoding of a point not on the group.</t>
        </section>
      </section>
    </section>
    <section anchor="verification">
      <name>Implementation verification</name>
      <t>Any CPace implementation MUST be tested against invalid or weak point attacks.
Implementation MUST be verified to abort upon conditions where G.scalar_mult_vfy functions outputs G.I.
For testing an implementation it is RECOMMENDED to include weak or invalid point encodings within the messages of party A and B and introduce this
in a protocol run. It SHALL be verified that the abort condition is properly handled.</t>
      <t>Corresponding test vectors are given in the appendix for all recommended cipher suites.</t>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>A security proof of CPace is found in <xref target="AHH21"/>. This proof covers all recommended cipher suites included in this document.
The security analysis in <xref target="BGHJ24"/> extends the analysis from <xref target="AHH21"/> by covering the case that
no pre-agreed session identifier is available. <xref target="BGHJ24"/> also shows how a unique session id sid_output can be generated along with the protocol
for applications that do not have a session identifier input available.</t>
      <section anchor="sec-considerations-ids">
        <name>Party identifiers</name>
        <t>The protocol assures that both communication partners have had the same view on the communication transcripts and the inputs CI and sid.</t>
        <t>If CPace is instantiated without identity strings for A or B in its inputs it will anonymously create a key with any party using the
same PRS and sid values and cannot give any further guarantee regarding the identity of the communication partner.
A protocol instance running on a party P might even be communicating with a second protocol instance also running on P.</t>
        <section anchor="guidance-regarding-party-identifier-integration">
          <name>Guidance regarding party identifier integration</name>
          <t>If an application layer's security relies on CPace for checking party identities, it SHALL integrate the party identifiers that are
to be checked in the CPace protocol run within CI or ADa/ADb as specified below.</t>
          <ul spacing="normal">
            <li>
              <t>If CPace is used in initiator-responder mode, identity strings that are to be authenticated and that are available for
both communication partners at protocol start SHOULD be integrated as part of CI.  </t>
              <t>
If both party identifiers are integrated into CI, the encoding MUST associate the initiator and responder roles with the respective identity strings. It is recommended to place the initiator`s identity first
and the responder`s identity second.  </t>
              <t>
Party identity information included in CI will be kept confidential.</t>
            </li>
            <li>
              <t>Party identities that are not included in CI identity and are to be authenticated by CPace SHALL be integrated in ADa/ADb, such that
A integrates its party identifier in ADa and B integrates its party identifier in ADb. In this case, the application layer SHALL make the recipient
check the party identifier string of the remote communication partner.  </t>
              <t>
Note that identities communicated in ADa or ADb will not be kept confidential.</t>
            </li>
          </ul>
          <t>If ADa and ADb are not guaranteed to be unique, then CPace SHALL be used in initator-responder mode.</t>
          <t>If CPace is to be run in the symmetric mode without initiator and responder roles, the application can always enforce uniqueness of ADa and ADb for all sessions by adding further information such as random data.</t>
        </section>
        <section anchor="rationale-for-the-above-guidance">
          <name>Rationale for the above guidance</name>
          <t>Incorporating party identifier strings is important for fending off attacks based on relaying messages.
Such attacks become for example relevant in a setting where several parties, say, A, B and C, share the same password PRS.
An adversary might relay messages from an honest user A, who aims at interacting with user B, to a party C instead.
If no party identifier strings are used and B and C share the same PRS value, then A might be using CPace for
establishing a common ISK key with C while assuming to interact with party B.
If a party A is allowing for multiple concurrent sessions, the adversary may also mount an attack relaying messages of A looped back to A such that A actually shares a key with itself <xref target="HS14"/>.</t>
          <t>Integration of party identity strings in CI is to be preferred. This way, the identities may be kept confidential.
If both identities are to be integrated in CI, this is only possible if clear initiator and responder roles are assigned and the encoding of the identities associates the role with the identity string.</t>
          <t>Integration of identity strings in CI also avoids the need of the security-critical subsequent check for the identity strings,
which might be omitted or implemented incorrectly without notice. Integration of identities into CI also strengthens the security properties with respect
to attacks based on quantum computers <xref target="sec-quantum-annoying"/>.</t>
          <t>Applications that integrate identity strings in ADa and/or ADb shall carefully verify implementations for correctness
of the implemented identity checks that the application must carry out after the CPace run.</t>
          <t>When adding randomness guaranteeing for unique values of ADa and ADb then a party running the application can detect for loopback attacks by checking
that the received remote value of ADa/ADb doesn't show up in the list of active local concurrent protocol sessions <xref target="HMSD18"/>.</t>
          <t>If no unique value in ADa and ADb is available or if maintaining state information regarding the list of concurrently active local protocol instances for
verification is impractical in a given application setting, then the loopback attack may be
prevented by assigning initiator and responder role and mandating that a given party implements either the initiator or responder role
for a given PRS password but not both roles with the same (PRS,sid) value set.</t>
          <t>Note that the requirement on party identifiers may differ from what might be intuitively expected as information on the application service
such as service identifiers, port-ids and role information (e.g. client or server role) should be included as part of the party identity.</t>
          <t>For instance, if computers A and B allow for running a protocol with different roles (e.g. both might run several client and a server instances concurrently
on different ports) then a relay attack may successfully generate protocol confusion. E.g. a client instance on A may be maliciously redirected
to a second client instance on B while it expects to be connecting to a server on B. This will work if client and server instances on B share the same
PRS secret and the identity strings do not include information on the respective roles.</t>
        </section>
      </section>
      <section anchor="hashing-protocol-transcripts">
        <name>Hashing protocol transcripts</name>
        <t>CPace prepends the length of all variable-size input strings before hashing data.
Prepending the length of
all variable-size input strings results in a so-called prefix-free encoding of transcript strings, using terminology introduced in <xref target="CDMP05"/>. This property allows for disregarding length-extension imperfections that come with the commonly used Merkle-Damgard hash function constructions such as SHA256 and SHA512 <xref target="CDMP05"/>.</t>
      </section>
      <section anchor="key-derivation">
        <name>Key derivation</name>
        <t>A CPace implementation SHALL output ISK but MUST NOT expose K, because a leaked K
may enable offline dictionary attack
on the password, and a matching value for K does not provide authentication of ADa and ADb.</t>
        <t>As noted already in <xref target="protocol-section"/> it is RECOMMENDED to process ISK
by use of a suitable strong key derivation function KDF (such as defined in <xref target="RFC5869"/>) first,
before using the key in a higher-level protocol.</t>
      </section>
      <section anchor="sec-key-confirmation">
        <name>Key confirmation</name>
        <t>In many applications it is advisable to add an explicit key confirmation round after the CPace protocol flow. However, as some applications
might only require implicit authentication and as explicit authentication messages are already a built-in feature in many higher-level protocols (e.g. TLS 1.3), the CPace protocol described here does not mandate
key confirmation.</t>
        <t>Already without explicit key confirmation, CPace enjoys weak forward security under the sCDH and sSDH assumptions <xref target="AHH21"/>.
With added explicit confirmation, CPace enjoys perfect forward security also under the strong sCDH and sSDH assumptions <xref target="AHH21"/>.</t>
        <t>Note that in <xref target="ABKLX21"/> it was shown that an idealized variant of CPace
also enjoys perfect forward security without explicit key confirmation. However this proof does not explicitly cover
the recommended cipher suites
in this document and requires the stronger assumption of an algebraic adversary model. For this reason, we recommend adding
explicit key confirmation if perfect forward security is required.</t>
        <t>When implementing explicit key confirmation, it is recommended to use an appropriate message-authentication code (MAC)
such as HMAC <xref target="RFC2104"/> or
CMAC <xref target="RFC4493"/> using a key mac_key derived from ISK.</t>
        <t>One suitable option that works also in the parallel setting without message ordering is to proceed as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First calculate mac_key as mac_key = H.hash(b"CPaceMac" || sid || ISK).</t>
          </li>
          <li>
            <t>Then let each party send an authenticator tag calculated over the protocol message that it has sent previously. I.e.
let party A calculate its authentication tag Ta as Ta = MAC(mac_key, lv_cat(Ya,ADa)) and let party B calculate its
authentication tag Tb as Tb = MAC(mac_key, lv_cat(Yb,ADb)).</t>
          </li>
          <li>
            <t>Let the receiving party check the remote authentication tag for the correct value and abort in case that it's incorrect.</t>
          </li>
        </ul>
      </section>
      <section anchor="integrating-cpace-in-higher-level-protocols">
        <name>Integrating CPace in higher-level protocols</name>
        <t>When integrating CPace into a higher-level protocol 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>
      </section>
      <section anchor="sec-sid-output">
        <name>Calculating a session identifier alongside with the CPace run</name>
        <t>If CPace was run with an empty string sid available as input, both parties can produce a public session identifier string
sid_output = H.hash(b"CPaceSidOutput" || transcript(Ya,ADa,Yb,ADb)) which will be unique for honest parties <xref target="BGHJ24"/>.</t>
      </section>
      <section anchor="sampling-of-scalars">
        <name>Sampling of scalars</name>
        <t>For curves over fields F_q where q is a prime close to a power of two, we recommend sampling scalars as a uniform bit string of length field_size_bits. We do so in order to reduce both, complexity of the implementation and the attack surface
with respect to side-channels for embedded systems in hostile environments.
<xref target="AHH21"/> demonstrated that non-uniform sampling did not negatively impact security for the case of Curve25519 and Curve448.
This analysis however does not transfer to most curves in Short-Weierstrass form.</t>
        <t>As a result, we recommend rejection sampling if G is as in <xref target="CPaceWeierstrass"/>. Alternatively an algorithm designed along the lines of the hash_to_field() function from <xref target="RFC9380"/> can also be
used. There, oversampling to an integer significantly larger than the curve order is followed by a modular reduction to the group order.</t>
      </section>
      <section anchor="preconditions-for-using-the-simplified-cpace-specification-from-cpacemontgomery">
        <name>Preconditions for using the simplified CPace specification from <xref target="CPaceMontgomery"/></name>
        <t>The security of the algorithms used for the recommended cipher suites for the Montgomery curves Curve25519 and Curve448 in <xref target="CPaceMontgomery"/> rely on the following properties <xref target="AHH21"/>:</t>
        <ul spacing="normal">
          <li>
            <t>The curve has order (p * c) with p prime and c a small cofactor. Also the curve's quadratic twist must be of order (p' * c') with p' prime and c' a cofactor.</t>
          </li>
          <li>
            <t>The cofactor c of the curve MUST be equal to or an integer multiple of the cofactor c' of the curve's quadratic twist. Also, importantly, the
implementation of the scalar_mult and scalar_mult_vfy
functions must ensure that all scalars actually used for the group operation are integer multiples of
c (e.g. such as asserted by the specification of the decodeScalar functions in <xref target="RFC7748"/>).</t>
          </li>
          <li>
            <t>Both field order q and group order p MUST be close to a power of two along the lines of <xref target="AHH21"/>, Appendix E. Otherwise the simplified scalar sampling specified in <xref target="CPaceMontgomery"/>
needs to be changed.</t>
          </li>
          <li>
            <t>The representation of the neutral element G.I MUST be the same for both, the curve and its twist.</t>
          </li>
          <li>
            <t>The implementation of G.scalar_mult_vfy(y,X) MUST map all c low-order points on the curve and all c' low-order points on the twist to G.I.</t>
          </li>
        </ul>
        <t>Algorithms for curves other than the ones recommended here can be based on the principles from <xref target="CPaceMontgomery"/> given that the above properties hold.</t>
      </section>
      <section anchor="nonce-values">
        <name>Nonce values</name>
        <t>Secret scalars ya and yb MUST NOT be reused. Values for sid SHOULD NOT be reused since the composability
guarantees established by the simulation-based proof rely on the uniqueness of session ids <xref target="AHH21"/>.</t>
        <t>If the higher-level protocol that integrates CPace is able to establish a unique sid identifier for the communication session,
it is RECOMMENDED that this is passed to CPace as sid parameter.
One suitable option for generating sid is concatenation of ephemeral random strings contributed by both parties.</t>
      </section>
      <section anchor="side-channel-attacks">
        <name>Side channel attacks</name>
        <t>All state-of-the art methods for realizing constant-time execution SHOULD be used.
Special care is RECOMMENDED specifically for elliptic curves in Short-Weierstrass form
as important standard documents including <xref target="IEEE1363"/> describe curve operations with
non-constant-time algorithms.</t>
        <t>In case that side channel attacks are to be considered practical for a given application, it is RECOMMENDED to pay special
attention on computing the secret generator G.calculate_generator(PRS,CI,sid).
The most critical substep to consider might be the processing of the first block of the hash that includes
the PRS string.
The zero-padding introduced when hashing the sensitive PRS string can be expected to make
the task for a side-channel attack somewhat more complex. Still this feature alone is not sufficient for ruling out power analysis attacks.
The mapping algorithm that
converts the generator string to a elliptic curve point SHALL execute in constant time. In <xref target="RFC9380"/> suitable constant-time methods
are available for any elliptic curve.</t>
        <t>Even though the calculate_generator operation might be considered to form the primary target for side-channel attacks as information on long-term secrets might be exposed,
also the subsequent operations on ephemeral values, such as scalar
sampling and scalar multiplication should be protected from side-channels.</t>
      </section>
      <section anchor="large-characteristic-finite-fields">
        <name>Large-characteristic finite fields</name>
        <t>This document intentionally specifies CPace only for use on elliptic curve groups and the security proofs in <xref target="AHH21"/> only cover this case explicitly.
For group environments built upon safe primes additional security analysis will be required. For instance exponential equivalence attacks
may become practical when short exponents are used.</t>
      </section>
      <section anchor="sec-quantum-annoying">
        <name>Quantum computers</name>
        <t>CPace is proven secure under the hardness of the strong computational Simultaneous Diffie-Hellmann (sSDH) and strong computational Diffie-Hellmann (sCDH)
assumptions in the group G (as defined in <xref target="AHH21"/>).
These assumptions are not expected to hold any longer when large-scale quantum computers (LSQC) are available.
Still, even in case that LSQC emerge, it is reasonable to assume that discrete-logarithm computations will remain costly. CPace with ephemeral pre-established session id values
sid forces the adversary to solve one computational Diffie-Hellman problem per password guess <xref target="ES21"/>.
If party identifiers are included as part of CI then the adversary is forced to solve one computational Diffie-Hellman problem per password
guess and party identifier pair.
For this reason it is RECOMMENDED to use the optional inputs sid if available in an application setting.
For the same reason it is RECOMMENDED to integrate party identity strings A,B into CI.</t>
        <t>In this sense, using the wording suggested by Steve Thomas on the CFRG mailing list, CPace is "quantum-annoying".</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>No IANA action is required.</t>
    </section>
    <section anchor="reference-implementation-and-test-vector-generation">
      <name>Reference implementation and test vector generation</name>
      <t>The reference implementation that was used for deriving test vectors is available at <xref target="REFIMP"/>.
The embedded base64-encoded test vectors will decode to JSON files having the test vector's octet strings encoded as base16 (i.e. hexadecimal) strings.</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>We would like to thank the participants on the CFRG list for comments and advice. Any comment and advice is appreciated.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="SEC1" target="http://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author>
              <organization>Standards for Efficient Cryptography Group (SECG)</organization>
            </author>
            <date year="2009" month="May"/>
          </front>
        </reference>
        <reference anchor="IEEE1363">
          <front>
            <title>Standard Specifications for Public Key Cryptography, IEEE 1363</title>
            <author>
              <organization/>
            </author>
            <date year="2000"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="RFC9496">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="H. de Valence" initials="H." surname="de Valence"/>
            <author fullname="J. Grigg" initials="J." surname="Grigg"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="I. Lovecruft" initials="I." surname="Lovecruft"/>
            <author fullname="G. Tankersley" initials="G." surname="Tankersley"/>
            <author fullname="F. Valsorda" initials="F." surname="Valsorda"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>This memo specifies two prime-order groups, ristretto255 and decaf448, suitable for safely implementing higher-level and complex cryptographic protocols. The ristretto255 group can be implemented using Curve25519, allowing existing Curve25519 implementations to be reused and extended to provide a prime-order group. Likewise, the decaf448 group can be implemented using edwards448.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9496"/>
          <seriesInfo name="DOI" value="10.17487/RFC9496"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="ES21" target="https://eprint.iacr.org/2021/696">
          <front>
            <title>The 'quantum annoying' property of password-authenticated key exchange protocols.</title>
            <author initials="E." surname="Eaton">
              <organization/>
            </author>
            <author initials="D." surname="Stebila">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ABKLX21" target="https://eprint.iacr.org/2021/1218">
          <front>
            <title>Algebraic Adversaries in the Universal Composability Framework.</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="J." surname="Katz">
              <organization/>
            </author>
            <author initials="J." surname="Loss">
              <organization/>
            </author>
            <author initials="J." surname="Xu">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="AHH21" target="https://eprint.iacr.org/2021/114">
          <front>
            <title>Security analysis of CPace</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="B." surname="Haase">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HS14" target="https://eprint.iacr.org/2014/585.pdf">
          <front>
            <title>The SPEKE Protocol Revisited</title>
            <author initials="F." surname="Hao">
              <organization/>
            </author>
            <author initials="S." surname="Shahandashti">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BGHJ24" target="link.springer.com/chapter/10.1007/978-3-031-68379-4_6">
          <front>
            <title>Bare PAKE: Universally Composable Key Exchange from Just Passwords</title>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="K." surname="Gellert">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HMSD18" target="https://arxiv.org/abs/1802.04900">
          <front>
            <title>Analysing and Patching SPEKE in ISO/IEC</title>
            <author initials="F." surname="Hao">
              <organization/>
            </author>
            <author initials="R." surname="Metere">
              <organization/>
            </author>
            <author initials="S." surname="Sahahandashti">
              <organization/>
            </author>
            <author initials="C." surname="Dong">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CDMP05" target="https://doi.org/10.1007/11535218_26">
          <front>
            <title>Merkle-Damgaard Revisited: How to Construct a Hash Function</title>
            <author initials="J.-S." surname="Coron" fullname="Jean-Sebastien Coron">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="Y." surname="Dodis" fullname="Yevgeniy Dodis">
              <organization>New York University</organization>
            </author>
            <author initials="C." surname="Malinaud" fullname="Cecile Malinaud">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="P." surname="Puniya" fullname="Prashant Puniya">
              <organization>New York University</organization>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="In" value="Advances in Cryptology - CRYPTO 2005"/>
          <seriesInfo name="pages" value="430-448"/>
          <seriesInfo name="DOI" value="10.1007/11535218_26"/>
        </reference>
        <reference anchor="FIPS202" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">
          <front>
            <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="SEC2" target="http://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters</title>
            <author>
              <organization>Standards for Efficient Cryptography Group (SECG)</organization>
            </author>
            <date year="2010" month="January"/>
          </front>
        </reference>
        <reference anchor="REFIMP" target="https://github.com/cfrg/draft-irtf-cfrg-cpace/tree/master/poc">
          <front>
            <title>CPace reference implementation (sage)</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="September"/>
          </front>
        </reference>
        <reference anchor="RFC8265">
          <front>
            <title>Preparation, Enforcement, and Comparison of Internationalized Strings Representing Usernames and Passwords</title>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This document describes updated methods for handling Unicode strings representing usernames and passwords. The previous approach was known as SASLprep (RFC 4013) and was based on Stringprep (RFC 3454). The methods specified in this document provide a more sustainable approach to the handling of internationalized usernames and passwords. This document obsoletes RFC 7613.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8265"/>
          <seriesInfo name="DOI" value="10.17487/RFC8265"/>
        </reference>
        <reference anchor="RFC9807">
          <front>
            <title>The OPAQUE Augmented Password-Authenticated Key Exchange (aPAKE) Protocol</title>
            <author fullname="D. Bourdrez" initials="D." surname="Bourdrez"/>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="K. Lewi" initials="K." surname="Lewi"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="July" year="2025"/>
            <abstract>
              <t>This document describes the OPAQUE protocol, an Augmented (or Asymmetric) Password-Authenticated Key Exchange (aPAKE) protocol that supports mutual authentication in a client-server setting without reliance on PKI and with security against pre-computation attacks upon server compromise. In addition, the protocol provides forward secrecy and the ability to hide the password from the server, even during password registration. This document specifies the core OPAQUE protocol and one instantiation based on 3DH. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9807"/>
          <seriesInfo name="DOI" value="10.17487/RFC9807"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key. The cryptographic strength of HMAC depends on the properties of the underlying hash function. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </reference>
        <reference anchor="RFC5246">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
            <author fullname="T. Dierks" initials="T." surname="Dierks"/>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2008"/>
            <abstract>
              <t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications security over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5246"/>
          <seriesInfo name="DOI" value="10.17487/RFC5246"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC5639">
          <front>
            <title>Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation</title>
            <author fullname="M. Lochter" initials="M." surname="Lochter"/>
            <author fullname="J. Merkle" initials="J." surname="Merkle"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>This memo proposes several elliptic curve domain parameters over finite prime fields for use in cryptographic applications. The domain parameters are consistent with the relevant international standards, and can be used in X.509 certificates and certificate revocation lists (CRLs), for Internet Key Exchange (IKE), Transport Layer Security (TLS), XML signatures, and all applications or protocols based on the cryptographic message syntax (CMS). This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5639"/>
          <seriesInfo name="DOI" value="10.17487/RFC5639"/>
        </reference>
        <reference anchor="RFC4493">
          <front>
            <title>The AES-CMAC Algorithm</title>
            <author fullname="JH. Song" initials="JH." surname="Song"/>
            <author fullname="R. Poovendran" initials="R." surname="Poovendran"/>
            <author fullname="J. Lee" initials="J." surname="Lee"/>
            <author fullname="T. Iwata" initials="T." surname="Iwata"/>
            <date month="June" year="2006"/>
            <abstract>
              <t>The National Institute of Standards and Technology (NIST) has recently specified the Cipher-based Message Authentication Code (CMAC), which is equivalent to the One-Key CBC MAC1 (OMAC1) submitted by Iwata and Kurosawa. This memo specifies an authentication algorithm based on CMAC with the 128-bit Advanced Encryption Standard (AES). This new authentication algorithm is named AES-CMAC. The purpose of this document is to make the AES-CMAC algorithm conveniently available to the Internet Community. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4493"/>
          <seriesInfo name="DOI" value="10.17487/RFC4493"/>
        </reference>
      </references>
    </references>
    <?line 975?>

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

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

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

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

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

        v = - A / (1 + z * r^2)
        epsilon = (v^3 + A * v^2 + B * v)^powerForLegendreSymbol
        x = epsilon * v - (1 - epsilon) * A/2
        return encodeUCoordinate(Integer(x), field_size_bits)
]]></sourcecode>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test vectors</name>
      <section anchor="test-vector-for-cpace-using-group-x25519-and-hash-sha-512">
        <name>Test vector for CPace using group X25519 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-x25519">
          <name>Test vectors for calculate_generator with group X25519</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 109 ; DSI = b'CPace255'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      0843506163653235350850617373776f72646d000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572107e4b4791d6a8ef019b936c79fb7f
      2c57
    hash generator string: (length: 32 bytes)
      03998087bdb1a2617bbe25ef5a7c18cd4f84f902328701790958755e
      e4aed1d3
    decoded field element of 255 bits: (length: 32 bytes)
      03998087bdb1a2617bbe25ef5a7c18cd4f84f902328701790958755e
      e4aed153
    generator g: (length: 32 bytes)
      d04bf6d41f6a289632a2e929fa29bebd51092512a7829fdde7d314b6
      2f05a73f
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-5">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDksICJEU0kiOiAiNDM1MDYx
 #NjM2NTMyMzUzNSIsICJDSSI6ICIwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQyNU
 #Y3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0NzkxRDZBOEVGMDE5Qjkz
 #NkM3OUZCN0YyQzU3IiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0ksUFJTLENJLHNpZC
 #xILnNfaW5fYnl0ZXMpIjogIjA4NDM1MDYxNjM2NTMyMzUzNTA4NTA2MTczNzM3NzZG
 #NzI2NDZEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODBCNDE1RjY5NkU2OTc0Njk2MTc0Nk
 #Y3MjBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjEwN0U0QjQ3OTFENkE4RUYwMTlCOTM2
 #Qzc5RkI3RjJDNTciLCAiaGFzaCBnZW5lcmF0b3Igc3RyaW5nIjogIjAzOTk4MDg3Qk
 #RCMUEyNjE3QkJFMjVFRjVBN0MxOENENEY4NEY5MDIzMjg3MDE3OTA5NTg3NTVFRTRB
 #RUQxRDMiLCAiZGVjb2RlZCBmaWVsZCBlbGVtZW50IG9mIDI1NSBiaXRzIjogIjAzOT
 #k4MDg3QkRCMUEyNjE3QkJFMjVFRjVBN0MxOENENEY4NEY5MDIzMjg3MDE3OTA5NTg3
 #NTVFRTRBRUQxNTMiLCAiZ2VuZXJhdG9yIGciOiAiRDA0QkY2RDQxRjZBMjg5NjMyQT
 #JFOTI5RkEyOUJFQkQ1MTA5MjUxMkE3ODI5RkRERTdEMzE0QjYyRjA1QTczRiJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080
  Outputs
    Ya: (length: 32 bytes)
      1d13c89278cdadd826f6d8d7f887701430f8380ddc17611cdd6dc989
      ce0c9f32
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a
  Outputs
    Yb: (length: 32 bytes)
      248cccf6d5cdc3646f0ad593f9e6cef4e69d4945f8372e623512ecea
      32185623
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      5b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c37e43ee
      71322c6b
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      5b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c37e43ee
      71322c6b
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      201d13c89278cdadd826f6d8d7f887701430f8380ddc17611cdd6dc9
      89ce0c9f320341446120248cccf6d5cdc3646f0ad593f9e6cef4e69d
      4945f8372e623512ecea3218562303414462
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 137 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c57205b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c3
      7e43ee71322c6b201d13c89278cdadd826f6d8d7f887701430f8380d
      dc17611cdd6dc989ce0c9f320341446120248cccf6d5cdc3646f0ad5
      93f9e6cef4e69d4945f8372e623512ecea3218562303414462
    ISK result: (length: 64 bytes)
      6e19b875f7a561d6b3ca3dbb9ef42ac55de3e717881018204b8922b4
      d5e53bb2aa82c300bea7b65d2b671da71922ddf6472301b79bc270ad
      fa8bf413285f2263
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f6320248cccf6d5cdc3646f0ad593f9e6cef4e69d4945f8372e6235
      12ecea3218562303414462201d13c89278cdadd826f6d8d7f8877014
      30f8380ddc17611cdd6dc989ce0c9f3203414461
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 139 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c57205b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c3
      7e43ee71322c6b6f6320248cccf6d5cdc3646f0ad593f9e6cef4e69d
      4945f8372e623512ecea3218562303414462201d13c89278cdadd826
      f6d8d7f887701430f8380ddc17611cdd6dc989ce0c9f3203414461
    ISK result: (length: 64 bytes)
      eef745e2f6e7ae2b1a1e53da340e777167a07fe150436648c51fb199
      c11f3cbabfc683a2b48e1af5881940dc398d375c95e6b4ae9948a45b
      8770de0656382be4
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      cbc73f62589bbc96ab6a95ec2363df621e93bc3b0cea83ba6b9571d0
      05fa8f5d2d08f7165622777fa484c02a9e6b20a84ee2dbebae8c53be
      757dcfc0eebdeb5f
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      3a504e9c7f1f7fa7314861e2c487d13f28566f3043f0ca760d22c491
      1aca0dd8b1f12a7ad0862eb92d08a76120140412ae6b8322e99d75cf
      1d20d8cfde2b40fe
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0xd0,0x4b,0xf6,0xd4,0x1f,0x6a,0x28,0x96,0x32,0xa2,0xe9,0x29,
 0xfa,0x29,0xbe,0xbd,0x51,0x09,0x25,0x12,0xa7,0x82,0x9f,0xdd,
 0xe7,0xd3,0x14,0xb6,0x2f,0x05,0xa7,0x3f,
};
const unsigned char tc_ya[] = {
 0x21,0xb4,0xf4,0xbd,0x9e,0x64,0xed,0x35,0x5c,0x3e,0xb6,0x76,
 0xa2,0x8e,0xbe,0xda,0xf6,0xd8,0xf1,0x7b,0xdc,0x36,0x59,0x95,
 0xb3,0x19,0x09,0x71,0x53,0x04,0x40,0x80,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x1d,0x13,0xc8,0x92,0x78,0xcd,0xad,0xd8,0x26,0xf6,0xd8,0xd7,
 0xf8,0x87,0x70,0x14,0x30,0xf8,0x38,0x0d,0xdc,0x17,0x61,0x1c,
 0xdd,0x6d,0xc9,0x89,0xce,0x0c,0x9f,0x32,
};
const unsigned char tc_yb[] = {
 0x84,0x8b,0x07,0x79,0xff,0x41,0x5f,0x0a,0xf4,0xea,0x14,0xdf,
 0x9d,0xd1,0xd3,0xc2,0x9a,0xc4,0x1d,0x83,0x6c,0x78,0x08,0x89,
 0x6c,0x4e,0xba,0x19,0xc5,0x1a,0xc4,0x0a,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x24,0x8c,0xcc,0xf6,0xd5,0xcd,0xc3,0x64,0x6f,0x0a,0xd5,0x93,
 0xf9,0xe6,0xce,0xf4,0xe6,0x9d,0x49,0x45,0xf8,0x37,0x2e,0x62,
 0x35,0x12,0xec,0xea,0x32,0x18,0x56,0x23,
};
const unsigned char tc_K[] = {
 0x5b,0x06,0x7e,0xff,0xbd,0xc0,0xb2,0xa0,0xe1,0xd9,0x07,0xb2,
 0x1e,0xbb,0x25,0xcf,0xed,0xb9,0x6a,0x85,0x21,0x79,0xa8,0x47,
 0xc3,0x7e,0x43,0xee,0x71,0x32,0x2c,0x6b,
};
const unsigned char tc_ISK_IR[] = {
 0x6e,0x19,0xb8,0x75,0xf7,0xa5,0x61,0xd6,0xb3,0xca,0x3d,0xbb,
 0x9e,0xf4,0x2a,0xc5,0x5d,0xe3,0xe7,0x17,0x88,0x10,0x18,0x20,
 0x4b,0x89,0x22,0xb4,0xd5,0xe5,0x3b,0xb2,0xaa,0x82,0xc3,0x00,
 0xbe,0xa7,0xb6,0x5d,0x2b,0x67,0x1d,0xa7,0x19,0x22,0xdd,0xf6,
 0x47,0x23,0x01,0xb7,0x9b,0xc2,0x70,0xad,0xfa,0x8b,0xf4,0x13,
 0x28,0x5f,0x22,0x63,
};
const unsigned char tc_ISK_SY[] = {
 0xee,0xf7,0x45,0xe2,0xf6,0xe7,0xae,0x2b,0x1a,0x1e,0x53,0xda,
 0x34,0x0e,0x77,0x71,0x67,0xa0,0x7f,0xe1,0x50,0x43,0x66,0x48,
 0xc5,0x1f,0xb1,0x99,0xc1,0x1f,0x3c,0xba,0xbf,0xc6,0x83,0xa2,
 0xb4,0x8e,0x1a,0xf5,0x88,0x19,0x40,0xdc,0x39,0x8d,0x37,0x5c,
 0x95,0xe6,0xb4,0xae,0x99,0x48,0xa4,0x5b,0x87,0x70,0xde,0x06,
 0x56,0x38,0x2b,0xe4,
};
const unsigned char tc_sid_out_ir[] = {
 0xcb,0xc7,0x3f,0x62,0x58,0x9b,0xbc,0x96,0xab,0x6a,0x95,0xec,
 0x23,0x63,0xdf,0x62,0x1e,0x93,0xbc,0x3b,0x0c,0xea,0x83,0xba,
 0x6b,0x95,0x71,0xd0,0x05,0xfa,0x8f,0x5d,0x2d,0x08,0xf7,0x16,
 0x56,0x22,0x77,0x7f,0xa4,0x84,0xc0,0x2a,0x9e,0x6b,0x20,0xa8,
 0x4e,0xe2,0xdb,0xeb,0xae,0x8c,0x53,0xbe,0x75,0x7d,0xcf,0xc0,
 0xee,0xbd,0xeb,0x5f,
};
const unsigned char tc_sid_out_oc[] = {
 0x3a,0x50,0x4e,0x9c,0x7f,0x1f,0x7f,0xa7,0x31,0x48,0x61,0xe2,
 0xc4,0x87,0xd1,0x3f,0x28,0x56,0x6f,0x30,0x43,0xf0,0xca,0x76,
 0x0d,0x22,0xc4,0x91,0x1a,0xca,0x0d,0xd8,0xb1,0xf1,0x2a,0x7a,
 0xd0,0x86,0x2e,0xb9,0x2d,0x08,0xa7,0x61,0x20,0x14,0x04,0x12,
 0xae,0x6b,0x83,0x22,0xe9,0x9d,0x75,0xcf,0x1d,0x20,0xd8,0xcf,
 0xde,0x2b,0x40,0xfe,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-6">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0
 #NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImciOiAiRDA0QkY2RDQxRjZBMj
 #g5NjMyQTJFOTI5RkEyOUJFQkQ1MTA5MjUxMkE3ODI5RkRERTdEMzE0QjYyRjA1QTcz
 #RiIsICJ5YSI6ICIyMUI0RjRCRDlFNjRFRDM1NUMzRUI2NzZBMjhFQkVEQUY2RDhGMT
 #dCREMzNjU5OTVCMzE5MDk3MTUzMDQ0MDgwIiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEi
 #OiAiMUQxM0M4OTI3OENEQUREODI2RjZEOEQ3Rjg4NzcwMTQzMEY4MzgwRERDMTc2MT
 #FDREQ2REM5ODlDRTBDOUYzMiIsICJ5YiI6ICI4NDhCMDc3OUZGNDE1RjBBRjRFQTE0
 #REY5REQxRDNDMjlBQzQxRDgzNkM3ODA4ODk2QzRFQkExOUM1MUFDNDBBIiwgIkFEYi
 #I6ICI0MTQ0NjIiLCAiWWIiOiAiMjQ4Q0NDRjZENUNEQzM2NDZGMEFENTkzRjlFNkNF
 #RjRFNjlENDk0NUY4MzcyRTYyMzUxMkVDRUEzMjE4NTYyMyIsICJLIjogIjVCMDY3RU
 #ZGQkRDMEIyQTBFMUQ5MDdCMjFFQkIyNUNGRURCOTZBODUyMTc5QTg0N0MzN0U0M0VF
 #NzEzMjJDNkIiLCAiSVNLX0lSIjogIjZFMTlCODc1RjdBNTYxRDZCM0NBM0RCQjlFRj
 #QyQUM1NURFM0U3MTc4ODEwMTgyMDRCODkyMkI0RDVFNTNCQjJBQTgyQzMwMEJFQTdC
 #NjVEMkI2NzFEQTcxOTIyRERGNjQ3MjMwMUI3OUJDMjcwQURGQThCRjQxMzI4NUYyMj
 #YzIiwgIklTS19TWSI6ICJFRUY3NDVFMkY2RTdBRTJCMUExRTUzREEzNDBFNzc3MTY3
 #QTA3RkUxNTA0MzY2NDhDNTFGQjE5OUMxMUYzQ0JBQkZDNjgzQTJCNDhFMUFGNTg4MT
 #k0MERDMzk4RDM3NUM5NUU2QjRBRTk5NDhBNDVCODc3MERFMDY1NjM4MkJFNCIsICJz
 #aWRfb3V0cHV0X2lyIjogIkNCQzczRjYyNTg5QkJDOTZBQjZBOTVFQzIzNjNERjYyMU
 #U5M0JDM0IwQ0VBODNCQTZCOTU3MUQwMDVGQThGNUQyRDA4RjcxNjU2MjI3NzdGQTQ4
 #NEMwMkE5RTZCMjBBODRFRTJEQkVCQUU4QzUzQkU3NTdEQ0ZDMEVFQkRFQjVGIiwgIn
 #NpZF9vdXRwdXRfb2MiOiAiM0E1MDRFOUM3RjFGN0ZBNzMxNDg2MUUyQzQ4N0QxM0Yy
 #ODU2NkYzMDQzRjBDQTc2MEQyMkM0OTExQUNBMEREOEIxRjEyQTdBRDA4NjJFQjkyRD
 #A4QTc2MTIwMTQwNDEyQUU2QjgzMjJFOTlENzVDRjFEMjBEOENGREUyQjQwRkUifQ==
]]></sourcecode>
        </section>
        <section anchor="test-vectors-for-gx25519scalarmultvfy-low-order-points">
          <name>Test vectors for G_X25519.scalar_mult_vfy: low order points</name>
          <t>Test vectors for which G_X25519.scalar_mult_vfy(s_in,ux) must return the neutral
element or would return the neutral element if bit #255 of field element
representation was not correctly cleared. (The decodeUCoordinate function from RFC7748 mandates clearing bit #255 for field element representations for use in the X25519 function.).</t>
          <artwork><![CDATA[
u0: 0000000000000000000000000000000000000000000000000000000000000000
u1: 0100000000000000000000000000000000000000000000000000000000000000
u2: ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u3: e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800
u4: 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157
u5: edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u6: daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
u7: eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u8: dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
u9: d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ua: cdeb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880
ub: 4c9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7

u0 ... ub MUST be verified to produce the correct results q0 ... qb:

Additionally, u0,u1,u2,u3,u4,u5 and u7 MUST trigger the abort case
when included in message from A or B.

s = af46e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449aff
qN = G_X25519.scalar_mult_vfy(s, uX)
q0: 0000000000000000000000000000000000000000000000000000000000000000
q1: 0000000000000000000000000000000000000000000000000000000000000000
q2: 0000000000000000000000000000000000000000000000000000000000000000
q3: 0000000000000000000000000000000000000000000000000000000000000000
q4: 0000000000000000000000000000000000000000000000000000000000000000
q5: 0000000000000000000000000000000000000000000000000000000000000000
q6: d8e2c776bbacd510d09fd9278b7edcd25fc5ae9adfba3b6e040e8d3b71b21806
q7: 0000000000000000000000000000000000000000000000000000000000000000
q8: c85c655ebe8be44ba9c0ffde69f2fe10194458d137f09bbff725ce58803cdb38
q9: db64dafa9b8fdd136914e61461935fe92aa372cb056314e1231bc4ec12417456
qa: e062dcd5376d58297be2618c7498f55baa07d7e03184e8aada20bca28888bf7a
qb: 993c6ad11c4c29da9a56f7691fd0ff8d732e49de6250b6c2e80003ff4629a175
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-7">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkwIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMSI6ICIw
 #MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwIiwgIkludmFsaWQgWTIiOiAiRUNGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsIC
 #JJbnZhbGlkIFkzIjogIkUwRUI3QTdDM0I0MUI4QUUxNjU2RTNGQUYxOUZDNDZBREEw
 #OThERUI5QzMyQjFGRDg2NjIwNTE2NUY0OUI4MDAiLCAiSW52YWxpZCBZNCI6ICI1Rj
 #lDOTVCQ0EzNTA4QzI0QjFEMEIxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIy
 #NEVEREQwOUYxMTU3IiwgIkludmFsaWQgWTUiOiAiRURGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsICJJ
 #bnZhbGlkIFk2IjogIkRBRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNyI6ICJFRUZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRjdGIiwgIkludmFsaWQgWTgiOiAiREJGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbn
 #ZhbGlkIFk5IjogIkQ5RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZMTAiOiAiQ0RFQj
 #dBN0MzQjQxQjhBRTE2NTZFM0ZBRjE5RkM0NkFEQTA5OERFQjlDMzJCMUZEODY2MjA1
 #MTY1RjQ5Qjg4MCIsICJJbnZhbGlkIFkxMSI6ICI0QzlDOTVCQ0EzNTA4QzI0QjFEME
 #IxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIyNEVEREQwOUYxMUQ3In0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-x448-and-hash-shake-256">
        <name>Test vector for CPace using group X448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-x448">
          <name>Test vectors for calculate_generator with group X448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 117 ; DSI = b'CPace448'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 178 bytes)
      0843506163653434380850617373776f726475000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000180b415f
      696e69746961746f720b425f726573706f6e646572105223e0cdc45d
      6575668d64c552004124
    hash generator string: (length: 56 bytes)
      e129c967efb40a175ac2bf4443dfb8c2360d7fba99922b04c19e0986
      a3ef779a6fcf6942c9497adcc90c6db1f03cc0b8680f87df1fd88c35
    decoded field element of 448 bits: (length: 56 bytes)
      e129c967efb40a175ac2bf4443dfb8c2360d7fba99922b04c19e0986
      a3ef779a6fcf6942c9497adcc90c6db1f03cc0b8680f87df1fd88c35
    generator g: (length: 56 bytes)
      9ccb9b0468ea5a8a8193d9d915620f2847565d92449e939b314e76cc
      b1f88b00e5e803e5b65643c17fdba0c2ba839b09ed5873e811ff5a98
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-8">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExNywgIkRTSSI6ICI0MzUw
 #NjE2MzY1MzQzNDM4IiwgIkNJIjogIjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjBCND
 #I1RjcyNjU3MzcwNkY2RTY0NjU3MiIsICJzaWQiOiAiNTIyM0UwQ0RDNDVENjU3NTY2
 #OEQ2NEM1NTIwMDQxMjQiLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2
 #lkLEguc19pbl9ieXRlcykiOiAiMDg0MzUwNjE2MzY1MzQzNDM4MDg1MDYxNzM3Mzc3
 #NkY3MjY0NzUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODBCND
 #E1RjY5NkU2OTc0Njk2MTc0NkY3MjBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjEwNTIy
 #M0UwQ0RDNDVENjU3NTY2OEQ2NEM1NTIwMDQxMjQiLCAiaGFzaCBnZW5lcmF0b3Igc3
 #RyaW5nIjogIkUxMjlDOTY3RUZCNDBBMTc1QUMyQkY0NDQzREZCOEMyMzYwRDdGQkE5
 #OTkyMkIwNEMxOUUwOTg2QTNFRjc3OUE2RkNGNjk0MkM5NDk3QURDQzkwQzZEQjFGMD
 #NDQzBCODY4MEY4N0RGMUZEODhDMzUiLCAiZGVjb2RlZCBmaWVsZCBlbGVtZW50IG9m
 #IDQ0OCBiaXRzIjogIkUxMjlDOTY3RUZCNDBBMTc1QUMyQkY0NDQzREZCOEMyMzYwRD
 #dGQkE5OTkyMkIwNEMxOUUwOTg2QTNFRjc3OUE2RkNGNjk0MkM5NDk3QURDQzkwQzZE
 #QjFGMDNDQzBCODY4MEY4N0RGMUZEODhDMzUiLCAiZ2VuZXJhdG9yIGciOiAiOUNDQj
 #lCMDQ2OEVBNUE4QTgxOTNEOUQ5MTU2MjBGMjg0NzU2NUQ5MjQ0OUU5MzlCMzE0RTc2
 #Q0NCMUY4OEIwMEU1RTgwM0U1QjY1NjQzQzE3RkRCQTBDMkJBODM5QjA5RUQ1ODczRT
 #gxMUZGNUE5OCJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-1">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080516bd083bfcce66121a3072646994c8430cc382b8dc543e8
  Outputs
    Ya: (length: 56 bytes)
      d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef974003ad9d
      3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4cf82eebe0
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-1">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a439caf5e61ec88c307c7d619195229412eaa73fb2a5ea20d
  Outputs
    Yb: (length: 56 bytes)
      89aaf7f3f3b708cecf0e1d2c0fab82817ac6c741291106414a25a474
      187abca5214ca8a3f0b55f6809cbd5316e139b2721afa70dcb0971d3
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-1">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      0fa58f732254a0708032d764d19b734b5cc890df45ec244d6d522767
      af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0bc028e
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      0fa58f732254a0708032d764d19b734b5cc890df45ec244d6d522767
      af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0bc028e
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-1">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      38d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef974003ad
      9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4cf82eeb
      e0034144613889aaf7f3f3b708cecf0e1d2c0fab82817ac6c7412911
      06414a25a474187abca5214ca8a3f0b55f6809cbd5316e139b2721af
      a70dcb0971d303414462
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 209 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      4124380fa58f732254a0708032d764d19b734b5cc890df45ec244d6d
      522767af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0
      bc028e38d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef97
      4003ad9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4c
      f82eebe0034144613889aaf7f3f3b708cecf0e1d2c0fab82817ac6c7
      41291106414a25a474187abca5214ca8a3f0b55f6809cbd5316e139b
      2721afa70dcb0971d303414462
    ISK result: (length: 64 bytes)
      ff3f4fa2f91e0badf5780ed2b795b97e48bb36d34c3e48cdfa1e7f79
      39ad0d6987a7fda8857b3cca3c311eaab94ce05e6d9bd111bb417ba0
      c91baf14b967eafb
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-1">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f6338d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef9740
      03ad9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4cf8
      2eebe0034144613889aaf7f3f3b708cecf0e1d2c0fab82817ac6c741
      291106414a25a474187abca5214ca8a3f0b55f6809cbd5316e139b27
      21afa70dcb0971d303414462
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 211 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      4124380fa58f732254a0708032d764d19b734b5cc890df45ec244d6d
      522767af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0
      bc028e6f6338d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48a
      ef974003ad9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d
      0a4cf82eebe0034144613889aaf7f3f3b708cecf0e1d2c0fab82817a
      c6c741291106414a25a474187abca5214ca8a3f0b55f6809cbd5316e
      139b2721afa70dcb0971d303414462
    ISK result: (length: 64 bytes)
      0ab598d085cd0bcdca64b58630e53287ef5aa7dbfc209dc9d2e50e0c
      6eb8e5e5ac27987d48e5608a45228c24532821d00fe66c7acc72fccf
      2d14d95d4ee645ed
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-1">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      6ef5882a6a9a323789e418a27c254513412e3c75945e1c0777dc2725
      0a122bc1c64106aedc800a0cd51d35203d2ae09471c1a81448b70a2e
      3715376d9f03b79b
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      5784ff2c7c3dce998db4976cbeccfe0ec3a253a2caf64ae4132f5394
      0390ab5938dbd3c0fddc6d070f8fde384d49898873146b2921ee92a6
      74ac1ca45ca365f4
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-1">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0x9c,0xcb,0x9b,0x04,0x68,0xea,0x5a,0x8a,0x81,0x93,0xd9,0xd9,
 0x15,0x62,0x0f,0x28,0x47,0x56,0x5d,0x92,0x44,0x9e,0x93,0x9b,
 0x31,0x4e,0x76,0xcc,0xb1,0xf8,0x8b,0x00,0xe5,0xe8,0x03,0xe5,
 0xb6,0x56,0x43,0xc1,0x7f,0xdb,0xa0,0xc2,0xba,0x83,0x9b,0x09,
 0xed,0x58,0x73,0xe8,0x11,0xff,0x5a,0x98,
};
const unsigned char tc_ya[] = {
 0x21,0xb4,0xf4,0xbd,0x9e,0x64,0xed,0x35,0x5c,0x3e,0xb6,0x76,
 0xa2,0x8e,0xbe,0xda,0xf6,0xd8,0xf1,0x7b,0xdc,0x36,0x59,0x95,
 0xb3,0x19,0x09,0x71,0x53,0x04,0x40,0x80,0x51,0x6b,0xd0,0x83,
 0xbf,0xcc,0xe6,0x61,0x21,0xa3,0x07,0x26,0x46,0x99,0x4c,0x84,
 0x30,0xcc,0x38,0x2b,0x8d,0xc5,0x43,0xe8,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd8,0xb2,0xcc,0x0f,0xab,0x92,0x98,0xa7,0xa5,0xc6,0x21,0x9f,
 0xb9,0xc2,0xe7,0x7d,0xbd,0xb2,0x26,0x25,0xf4,0x8a,0xef,0x97,
 0x40,0x03,0xad,0x9d,0x3d,0x5b,0x58,0xca,0x4e,0x73,0xa6,0xb7,
 0x03,0x3a,0x3d,0x08,0x3c,0xd7,0x47,0xb5,0x5c,0x6f,0x73,0x45,
 0x46,0x7d,0x0a,0x4c,0xf8,0x2e,0xeb,0xe0,
};
const unsigned char tc_yb[] = {
 0x84,0x8b,0x07,0x79,0xff,0x41,0x5f,0x0a,0xf4,0xea,0x14,0xdf,
 0x9d,0xd1,0xd3,0xc2,0x9a,0xc4,0x1d,0x83,0x6c,0x78,0x08,0x89,
 0x6c,0x4e,0xba,0x19,0xc5,0x1a,0xc4,0x0a,0x43,0x9c,0xaf,0x5e,
 0x61,0xec,0x88,0xc3,0x07,0xc7,0xd6,0x19,0x19,0x52,0x29,0x41,
 0x2e,0xaa,0x73,0xfb,0x2a,0x5e,0xa2,0x0d,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x89,0xaa,0xf7,0xf3,0xf3,0xb7,0x08,0xce,0xcf,0x0e,0x1d,0x2c,
 0x0f,0xab,0x82,0x81,0x7a,0xc6,0xc7,0x41,0x29,0x11,0x06,0x41,
 0x4a,0x25,0xa4,0x74,0x18,0x7a,0xbc,0xa5,0x21,0x4c,0xa8,0xa3,
 0xf0,0xb5,0x5f,0x68,0x09,0xcb,0xd5,0x31,0x6e,0x13,0x9b,0x27,
 0x21,0xaf,0xa7,0x0d,0xcb,0x09,0x71,0xd3,
};
const unsigned char tc_K[] = {
 0x0f,0xa5,0x8f,0x73,0x22,0x54,0xa0,0x70,0x80,0x32,0xd7,0x64,
 0xd1,0x9b,0x73,0x4b,0x5c,0xc8,0x90,0xdf,0x45,0xec,0x24,0x4d,
 0x6d,0x52,0x27,0x67,0xaf,0x6b,0xdc,0x80,0x28,0x68,0x68,0x8b,
 0x54,0x3f,0x1a,0x93,0x99,0x0a,0x5b,0x05,0xdd,0x53,0x6c,0x49,
 0xd5,0x72,0x90,0xf2,0xf0,0xbc,0x02,0x8e,
};
const unsigned char tc_ISK_IR[] = {
 0xff,0x3f,0x4f,0xa2,0xf9,0x1e,0x0b,0xad,0xf5,0x78,0x0e,0xd2,
 0xb7,0x95,0xb9,0x7e,0x48,0xbb,0x36,0xd3,0x4c,0x3e,0x48,0xcd,
 0xfa,0x1e,0x7f,0x79,0x39,0xad,0x0d,0x69,0x87,0xa7,0xfd,0xa8,
 0x85,0x7b,0x3c,0xca,0x3c,0x31,0x1e,0xaa,0xb9,0x4c,0xe0,0x5e,
 0x6d,0x9b,0xd1,0x11,0xbb,0x41,0x7b,0xa0,0xc9,0x1b,0xaf,0x14,
 0xb9,0x67,0xea,0xfb,
};
const unsigned char tc_ISK_SY[] = {
 0x0a,0xb5,0x98,0xd0,0x85,0xcd,0x0b,0xcd,0xca,0x64,0xb5,0x86,
 0x30,0xe5,0x32,0x87,0xef,0x5a,0xa7,0xdb,0xfc,0x20,0x9d,0xc9,
 0xd2,0xe5,0x0e,0x0c,0x6e,0xb8,0xe5,0xe5,0xac,0x27,0x98,0x7d,
 0x48,0xe5,0x60,0x8a,0x45,0x22,0x8c,0x24,0x53,0x28,0x21,0xd0,
 0x0f,0xe6,0x6c,0x7a,0xcc,0x72,0xfc,0xcf,0x2d,0x14,0xd9,0x5d,
 0x4e,0xe6,0x45,0xed,
};
const unsigned char tc_sid_out_ir[] = {
 0x6e,0xf5,0x88,0x2a,0x6a,0x9a,0x32,0x37,0x89,0xe4,0x18,0xa2,
 0x7c,0x25,0x45,0x13,0x41,0x2e,0x3c,0x75,0x94,0x5e,0x1c,0x07,
 0x77,0xdc,0x27,0x25,0x0a,0x12,0x2b,0xc1,0xc6,0x41,0x06,0xae,
 0xdc,0x80,0x0a,0x0c,0xd5,0x1d,0x35,0x20,0x3d,0x2a,0xe0,0x94,
 0x71,0xc1,0xa8,0x14,0x48,0xb7,0x0a,0x2e,0x37,0x15,0x37,0x6d,
 0x9f,0x03,0xb7,0x9b,
};
const unsigned char tc_sid_out_oc[] = {
 0x57,0x84,0xff,0x2c,0x7c,0x3d,0xce,0x99,0x8d,0xb4,0x97,0x6c,
 0xbe,0xcc,0xfe,0x0e,0xc3,0xa2,0x53,0xa2,0xca,0xf6,0x4a,0xe4,
 0x13,0x2f,0x53,0x94,0x03,0x90,0xab,0x59,0x38,0xdb,0xd3,0xc0,
 0xfd,0xdc,0x6d,0x07,0x0f,0x8f,0xde,0x38,0x4d,0x49,0x89,0x88,
 0x73,0x14,0x6b,0x29,0x21,0xee,0x92,0xa6,0x74,0xac,0x1c,0xa4,
 0x5c,0xa3,0x65,0xf4,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-9">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjUyMjNF
 #MENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImciOiAiOUNDQjlCMDQ2OEVBNU
 #E4QTgxOTNEOUQ5MTU2MjBGMjg0NzU2NUQ5MjQ0OUU5MzlCMzE0RTc2Q0NCMUY4OEIw
 #MEU1RTgwM0U1QjY1NjQzQzE3RkRCQTBDMkJBODM5QjA5RUQ1ODczRTgxMUZGNUE5OC
 #IsICJ5YSI6ICIyMUI0RjRCRDlFNjRFRDM1NUMzRUI2NzZBMjhFQkVEQUY2RDhGMTdC
 #REMzNjU5OTVCMzE5MDk3MTUzMDQ0MDgwNTE2QkQwODNCRkNDRTY2MTIxQTMwNzI2ND
 #Y5OTRDODQzMENDMzgyQjhEQzU0M0U4IiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEiOiAi
 #RDhCMkNDMEZBQjkyOThBN0E1QzYyMTlGQjlDMkU3N0RCREIyMjYyNUY0OEFFRjk3ND
 #AwM0FEOUQzRDVCNThDQTRFNzNBNkI3MDMzQTNEMDgzQ0Q3NDdCNTVDNkY3MzQ1NDY3
 #RDBBNENGODJFRUJFMCIsICJ5YiI6ICI4NDhCMDc3OUZGNDE1RjBBRjRFQTE0REY5RE
 #QxRDNDMjlBQzQxRDgzNkM3ODA4ODk2QzRFQkExOUM1MUFDNDBBNDM5Q0FGNUU2MUVD
 #ODhDMzA3QzdENjE5MTk1MjI5NDEyRUFBNzNGQjJBNUVBMjBEIiwgIkFEYiI6ICI0MT
 #Q0NjIiLCAiWWIiOiAiODlBQUY3RjNGM0I3MDhDRUNGMEUxRDJDMEZBQjgyODE3QUM2
 #Qzc0MTI5MTEwNjQxNEEyNUE0NzQxODdBQkNBNTIxNENBOEEzRjBCNTVGNjgwOUNCRD
 #UzMTZFMTM5QjI3MjFBRkE3MERDQjA5NzFEMyIsICJLIjogIjBGQTU4RjczMjI1NEEw
 #NzA4MDMyRDc2NEQxOUI3MzRCNUNDODkwREY0NUVDMjQ0RDZENTIyNzY3QUY2QkRDOD
 #AyODY4Njg4QjU0M0YxQTkzOTkwQTVCMDVERDUzNkM0OUQ1NzI5MEYyRjBCQzAyOEUi
 #LCAiSVNLX0lSIjogIkZGM0Y0RkEyRjkxRTBCQURGNTc4MEVEMkI3OTVCOTdFNDhCQj
 #M2RDM0QzNFNDhDREZBMUU3Rjc5MzlBRDBENjk4N0E3RkRBODg1N0IzQ0NBM0MzMTFF
 #QUFCOTRDRTA1RTZEOUJEMTExQkI0MTdCQTBDOTFCQUYxNEI5NjdFQUZCIiwgIklTS1
 #9TWSI6ICIwQUI1OThEMDg1Q0QwQkNEQ0E2NEI1ODYzMEU1MzI4N0VGNUFBN0RCRkMy
 #MDlEQzlEMkU1MEUwQzZFQjhFNUU1QUMyNzk4N0Q0OEU1NjA4QTQ1MjI4QzI0NTMyOD
 #IxRDAwRkU2NkM3QUNDNzJGQ0NGMkQxNEQ5NUQ0RUU2NDVFRCIsICJzaWRfb3V0cHV0
 #X2lyIjogIjZFRjU4ODJBNkE5QTMyMzc4OUU0MThBMjdDMjU0NTEzNDEyRTNDNzU5ND
 #VFMUMwNzc3REMyNzI1MEExMjJCQzFDNjQxMDZBRURDODAwQTBDRDUxRDM1MjAzRDJB
 #RTA5NDcxQzFBODE0NDhCNzBBMkUzNzE1Mzc2RDlGMDNCNzlCIiwgInNpZF9vdXRwdX
 #Rfb2MiOiAiNTc4NEZGMkM3QzNEQ0U5OThEQjQ5NzZDQkVDQ0ZFMEVDM0EyNTNBMkNB
 #RjY0QUU0MTMyRjUzOTQwMzkwQUI1OTM4REJEM0MwRkREQzZEMDcwRjhGREUzODREND
 #k4OTg4NzMxNDZCMjkyMUVFOTJBNjc0QUMxQ0E0NUNBMzY1RjQifQ==
]]></sourcecode>
        </section>
        <section anchor="test-vectors-for-gx448scalarmultvfy-low-order-points">
          <name>Test vectors for G_X448.scalar_mult_vfy: low order points</name>
          <t>Test vectors for which G_X448.scalar_mult_vfy(s_in,ux) must return the neutral
element.
This includes points that are non-canonicaly encoded, i.e. have coordinate values
larger
than the field prime.</t>
          <t>Weak points for X448 smaller than the field prime (canonical)</t>
          <artwork><![CDATA[
  u0: (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  u1: (length: 56 bytes)
    0100000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  u2: (length: 56 bytes)
    fefffffffffffffffffffffffffffffffffffffffffffffffffffffffe
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff
]]></artwork>
          <t>Weak points for X448 larger or equal to the field prime (non-canonical)</t>
          <artwork><![CDATA[
  u3: (length: 56 bytes)
    fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff
  u4: (length: 56 bytes)
    00000000000000000000000000000000000000000000000000000000ff
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff

All of the above points u0 ... u4 MUST trigger the abort case
when included in the protocol messages from A or B.
]]></artwork>
          <t>Expected results for X448 resp. G_X448.scalar_mult_vfy</t>
          <artwork><![CDATA[
  scalar s: (length: 56 bytes)
    af8a14218bf2a2062926d2ea9b8fe4e8b6817349b6ed2feb1e5d64d7a4
    523f15fceec70fb111e870dc58d191e66a14d3e9d482d04432cadd
  G_X448.scalar_mult_vfy(s,u0): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u1): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u2): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u3): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u4): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
]]></artwork>
          <t>Test vectors for scalar_mult with nonzero outputs</t>
          <artwork><![CDATA[
  scalar s: (length: 56 bytes)
    af8a14218bf2a2062926d2ea9b8fe4e8b6817349b6ed2feb1e5d64d7a4
    523f15fceec70fb111e870dc58d191e66a14d3e9d482d04432cadd
  point coordinate u_curve on the curve: (length: 56 bytes)
    ab0c68d772ec2eb9de25c49700e46d6325e66d6aa39d7b65eb84a68c55
    69d47bd71b41f3e0d210f44e146dec8926b174acb3f940a0b82cab
  G_X448.scalar_mult_vfy(s,u_curve): (length: 56 bytes)
    3b0fa9bc40a6fdc78c9e06ff7a54c143c5d52f365607053bf0656f5142
    0496295f910a101b38edc1acd3bd240fd55dcb7a360553b8a7627e

  point coordinate u_twist on the twist: (length: 56 bytes)
    c981cd1e1f72d9c35c7d7cf6be426757c0dc8206a2fcfa564a8e7618c0
    3c0e61f9a2eb1c3e0dd97d6e9b1010f5edd03397a83f5a914cb3ff
  G_X448.scalar_mult_vfy(s,u_twist): (length: 56 bytes)
    d0a2bb7e9c5c2c627793d8342f23b759fe7d9e3320a85ca4fd61376331
    50ffd9a9148a9b75c349fac43d64bec49a6e126cc92cbfbf353961
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-10">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkxIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMiI6ICIwMT
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwIiwgIkludmFsaWQgWTMiOiAiRkVGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbnZh
 #bGlkIFk0IjogIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNSI6ICIwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGIiwgIlZhbGlkIChvbiBjdXJ2ZSkiOiB7InMiOiAiQUY4QTE0MjE4QkYyQTIw
 #NjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0YxNU
 #ZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FERCIs
 #ICJ1X2N1cnZlIjogIkFCMEM2OEQ3NzJFQzJFQjlERTI1QzQ5NzAwRTQ2RDYzMjVFNj
 #ZENkFBMzlEN0I2NUVCODRBNjhDNTU2OUQ0N0JENzFCNDFGM0UwRDIxMEY0NEUxNDZE
 #RUM4OTI2QjE3NEFDQjNGOTQwQTBCODJDQUIiLCAicmVzX2N1cnZlIjogIjNCMEZBOU
 #JDNDBBNkZEQzc4QzlFMDZGRjdBNTRDMTQzQzVENTJGMzY1NjA3MDUzQkYwNjU2RjUx
 #NDIwNDk2Mjk1RjkxMEExMDFCMzhFREMxQUNEM0JEMjQwRkQ1NURDQjdBMzYwNTUzQj
 #hBNzYyN0UifSwgIlZhbGlkIChvbiB0d2lzdCkiOiB7InMiOiAiQUY4QTE0MjE4QkYy
 #QTIwNjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0
 #YxNUZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FE
 #RCIsICJ1X3R3aXN0IjogIkM5ODFDRDFFMUY3MkQ5QzM1QzdEN0NGNkJFNDI2NzU3Qz
 #BEQzgyMDZBMkZDRkE1NjRBOEU3NjE4QzAzQzBFNjFGOUEyRUIxQzNFMEREOTdENkU5
 #QjEwMTBGNUVERDAzMzk3QTgzRjVBOTE0Q0IzRkYiLCAicmVzX3R3aXN0IjogIkQwQT
 #JCQjdFOUM1QzJDNjI3NzkzRDgzNDJGMjNCNzU5RkU3RDlFMzMyMEE4NUNBNEZENjEz
 #NzYzMzE1MEZGRDlBOTE0OEE5Qjc1QzM0OUZBQzQzRDY0QkVDNDlBNkUxMjZDQzkyQ0
 #JGQkYzNTM5NjEifX0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-ristretto255-and-hash-sha-512">
        <name>Test vector for CPace using group ristretto255 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-ristretto255">
          <name>Test vectors for calculate_generator with group ristretto255</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 100 ;
    DSI = b'CPaceRistretto255'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      11435061636552697374726574746f3235350850617373776f726464
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572107e4b4791d6a8ef019b936c79fb7f
      2c57
    hash result: (length: 64 bytes)
      da6d3ddc8802fca9058755ffd3ebde08a9c2c74945901a258482a288
      b6663af06bf645c93cd1c51512307199c80e84908916d983b34af772
      05f90851a657ee27
    encoded generator g: (length: 32 bytes)
      222b6b195fe84b1652badb6f6a3ae3d24341e7306967f0b8115b40d5
      698c7e56
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-11">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDAsICJEU0kiOiAiNDM1MDYx
 #NjM2NTUyNjk3Mzc0NzI2NTc0NzQ2RjMyMzUzNSIsICJDSSI6ICIwQjQxNUY2OTZFNj
 #k3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdF
 #NEI0NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImdlbmVyYXRvcl9zdHJpbm
 #coRy5EU0ksUFJTLENJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjExNDM1MDYxNjM2NTUy
 #Njk3Mzc0NzI2NTc0NzQ2RjMyMzUzNTA4NTA2MTczNzM3NzZGNzI2NDY0MDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODBCND
 #E1RjY5NkU2OTc0Njk2MTc0NkY3MjBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjEwN0U0
 #QjQ3OTFENkE4RUYwMTlCOTM2Qzc5RkI3RjJDNTciLCAiaGFzaCByZXN1bHQiOiAiRE
 #E2RDNEREM4ODAyRkNBOTA1ODc1NUZGRDNFQkRFMDhBOUMyQzc0OTQ1OTAxQTI1ODQ4
 #MkEyODhCNjY2M0FGMDZCRjY0NUM5M0NEMUM1MTUxMjMwNzE5OUM4MEU4NDkwODkxNk
 #Q5ODNCMzRBRjc3MjA1RjkwODUxQTY1N0VFMjciLCAiZW5jb2RlZCBnZW5lcmF0b3Ig
 #ZyI6ICIyMjJCNkIxOTVGRTg0QjE2NTJCQURCNkY2QTNBRTNEMjQzNDFFNzMwNjk2N0
 #YwQjgxMTVCNDBENTY5OEM3RTU2In0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-2">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      da3d23700a9e5699258aef94dc060dfda5ebb61f02a5ea77fad53f4f
      f0976d08
  Outputs
    Ya: (length: 32 bytes)
      d6bac480f2c386c394efc7c47adb9925dcd2630b64f240c50f8d0eec
      482b9157
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-2">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      d2316b454718c35362d83d69df6320f38578ed5984651435e2949762
      d900b80d
  Outputs
    Yb: (length: 32 bytes)
      3ea7e0b19560d7c0b0f5734f63b955286dfa8232b5ebe63324e2d9e7
      433f7258
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-2">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      80b69a8a76457ab6a4d7f887a4bf6b55a2f80ac19c333f917a05fc98
      87c8b40f
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      80b69a8a76457ab6a4d7f887a4bf6b55a2f80ac19c333f917a05fc98
      87c8b40f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-2">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      20d6bac480f2c386c394efc7c47adb9925dcd2630b64f240c50f8d0e
      ec482b915703414461203ea7e0b19560d7c0b0f5734f63b955286dfa
      8232b5ebe63324e2d9e7433f725803414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c572080b69a8a76457ab6a4d7f887a4bf6b55
      a2f80ac19c333f917a05fc9887c8b40f20d6bac480f2c386c394efc7
      c47adb9925dcd2630b64f240c50f8d0eec482b915703414461203ea7
      e0b19560d7c0b0f5734f63b955286dfa8232b5ebe63324e2d9e7433f
      725803414462
    ISK result: (length: 64 bytes)
      b69effbf61b51d56401c0f65601abe428de8206feaaf0e32198896dc
      ae7b35cd2b38950a39dfd5d4a79164614c2984f7daa460b588c1e80c
      3fa2068af7900447
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-2">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f6320d6bac480f2c386c394efc7c47adb9925dcd2630b64f240c50f
      8d0eec482b915703414461203ea7e0b19560d7c0b0f5734f63b95528
      6dfa8232b5ebe63324e2d9e7433f725803414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 148 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c572080b69a8a76457ab6a4d7f887a4bf6b55
      a2f80ac19c333f917a05fc9887c8b40f6f6320d6bac480f2c386c394
      efc7c47adb9925dcd2630b64f240c50f8d0eec482b91570341446120
      3ea7e0b19560d7c0b0f5734f63b955286dfa8232b5ebe63324e2d9e7
      433f725803414462
    ISK result: (length: 64 bytes)
      544199d71f62f8d9a1fee55727e24fe4a45844593c2b6013c4fa3969
      d0e5debb2244675c0b43397cbb68d342b01fc0f98fc961469a25134d
      e9f0f813c1a57476
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-2">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      bb1c449b35f0ea79a65c209f329a693d475e0ce2387bed9fe4b78f60
      b2a27c219813fb2cfe175ef40d2222d9261e66da7d78f7c55a303b1b
      8611dcdfab880c47
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      10d5941d4933497fe31b9188d690b84465e2a2d158332a7267284a07
      1a8d0876fc5c8c329dc735d59a9f8ef6623ee23924704a2f929dd631
      ca981227ee82fff2
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-2">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x22,0x2b,0x6b,0x19,0x5f,0xe8,0x4b,0x16,0x52,0xba,0xdb,0x6f,
 0x6a,0x3a,0xe3,0xd2,0x43,0x41,0xe7,0x30,0x69,0x67,0xf0,0xb8,
 0x11,0x5b,0x40,0xd5,0x69,0x8c,0x7e,0x56,
};
const unsigned char tc_ya[] = {
 0xda,0x3d,0x23,0x70,0x0a,0x9e,0x56,0x99,0x25,0x8a,0xef,0x94,
 0xdc,0x06,0x0d,0xfd,0xa5,0xeb,0xb6,0x1f,0x02,0xa5,0xea,0x77,
 0xfa,0xd5,0x3f,0x4f,0xf0,0x97,0x6d,0x08,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd6,0xba,0xc4,0x80,0xf2,0xc3,0x86,0xc3,0x94,0xef,0xc7,0xc4,
 0x7a,0xdb,0x99,0x25,0xdc,0xd2,0x63,0x0b,0x64,0xf2,0x40,0xc5,
 0x0f,0x8d,0x0e,0xec,0x48,0x2b,0x91,0x57,
};
const unsigned char tc_yb[] = {
 0xd2,0x31,0x6b,0x45,0x47,0x18,0xc3,0x53,0x62,0xd8,0x3d,0x69,
 0xdf,0x63,0x20,0xf3,0x85,0x78,0xed,0x59,0x84,0x65,0x14,0x35,
 0xe2,0x94,0x97,0x62,0xd9,0x00,0xb8,0x0d,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x3e,0xa7,0xe0,0xb1,0x95,0x60,0xd7,0xc0,0xb0,0xf5,0x73,0x4f,
 0x63,0xb9,0x55,0x28,0x6d,0xfa,0x82,0x32,0xb5,0xeb,0xe6,0x33,
 0x24,0xe2,0xd9,0xe7,0x43,0x3f,0x72,0x58,
};
const unsigned char tc_K[] = {
 0x80,0xb6,0x9a,0x8a,0x76,0x45,0x7a,0xb6,0xa4,0xd7,0xf8,0x87,
 0xa4,0xbf,0x6b,0x55,0xa2,0xf8,0x0a,0xc1,0x9c,0x33,0x3f,0x91,
 0x7a,0x05,0xfc,0x98,0x87,0xc8,0xb4,0x0f,
};
const unsigned char tc_ISK_IR[] = {
 0xb6,0x9e,0xff,0xbf,0x61,0xb5,0x1d,0x56,0x40,0x1c,0x0f,0x65,
 0x60,0x1a,0xbe,0x42,0x8d,0xe8,0x20,0x6f,0xea,0xaf,0x0e,0x32,
 0x19,0x88,0x96,0xdc,0xae,0x7b,0x35,0xcd,0x2b,0x38,0x95,0x0a,
 0x39,0xdf,0xd5,0xd4,0xa7,0x91,0x64,0x61,0x4c,0x29,0x84,0xf7,
 0xda,0xa4,0x60,0xb5,0x88,0xc1,0xe8,0x0c,0x3f,0xa2,0x06,0x8a,
 0xf7,0x90,0x04,0x47,
};
const unsigned char tc_ISK_SY[] = {
 0x54,0x41,0x99,0xd7,0x1f,0x62,0xf8,0xd9,0xa1,0xfe,0xe5,0x57,
 0x27,0xe2,0x4f,0xe4,0xa4,0x58,0x44,0x59,0x3c,0x2b,0x60,0x13,
 0xc4,0xfa,0x39,0x69,0xd0,0xe5,0xde,0xbb,0x22,0x44,0x67,0x5c,
 0x0b,0x43,0x39,0x7c,0xbb,0x68,0xd3,0x42,0xb0,0x1f,0xc0,0xf9,
 0x8f,0xc9,0x61,0x46,0x9a,0x25,0x13,0x4d,0xe9,0xf0,0xf8,0x13,
 0xc1,0xa5,0x74,0x76,
};
const unsigned char tc_sid_out_ir[] = {
 0xbb,0x1c,0x44,0x9b,0x35,0xf0,0xea,0x79,0xa6,0x5c,0x20,0x9f,
 0x32,0x9a,0x69,0x3d,0x47,0x5e,0x0c,0xe2,0x38,0x7b,0xed,0x9f,
 0xe4,0xb7,0x8f,0x60,0xb2,0xa2,0x7c,0x21,0x98,0x13,0xfb,0x2c,
 0xfe,0x17,0x5e,0xf4,0x0d,0x22,0x22,0xd9,0x26,0x1e,0x66,0xda,
 0x7d,0x78,0xf7,0xc5,0x5a,0x30,0x3b,0x1b,0x86,0x11,0xdc,0xdf,
 0xab,0x88,0x0c,0x47,
};
const unsigned char tc_sid_out_oc[] = {
 0x10,0xd5,0x94,0x1d,0x49,0x33,0x49,0x7f,0xe3,0x1b,0x91,0x88,
 0xd6,0x90,0xb8,0x44,0x65,0xe2,0xa2,0xd1,0x58,0x33,0x2a,0x72,
 0x67,0x28,0x4a,0x07,0x1a,0x8d,0x08,0x76,0xfc,0x5c,0x8c,0x32,
 0x9d,0xc7,0x35,0xd5,0x9a,0x9f,0x8e,0xf6,0x62,0x3e,0xe2,0x39,
 0x24,0x70,0x4a,0x2f,0x92,0x9d,0xd6,0x31,0xca,0x98,0x12,0x27,
 0xee,0x82,0xff,0xf2,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-12">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0
 #NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImciOiAiMjIyQjZCMTk1RkU4NE
 #IxNjUyQkFEQjZGNkEzQUUzRDI0MzQxRTczMDY5NjdGMEI4MTE1QjQwRDU2OThDN0U1
 #NiIsICJ5YSI6ICJEQTNEMjM3MDBBOUU1Njk5MjU4QUVGOTREQzA2MERGREE1RUJCNj
 #FGMDJBNUVBNzdGQUQ1M0Y0RkYwOTc2RDA4IiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEi
 #OiAiRDZCQUM0ODBGMkMzODZDMzk0RUZDN0M0N0FEQjk5MjVEQ0QyNjMwQjY0RjI0ME
 #M1MEY4RDBFRUM0ODJCOTE1NyIsICJ5YiI6ICJEMjMxNkI0NTQ3MThDMzUzNjJEODNE
 #NjlERjYzMjBGMzg1NzhFRDU5ODQ2NTE0MzVFMjk0OTc2MkQ5MDBCODBEIiwgIkFEYi
 #I6ICI0MTQ0NjIiLCAiWWIiOiAiM0VBN0UwQjE5NTYwRDdDMEIwRjU3MzRGNjNCOTU1
 #Mjg2REZBODIzMkI1RUJFNjMzMjRFMkQ5RTc0MzNGNzI1OCIsICJLIjogIjgwQjY5QT
 #hBNzY0NTdBQjZBNEQ3Rjg4N0E0QkY2QjU1QTJGODBBQzE5QzMzM0Y5MTdBMDVGQzk4
 #ODdDOEI0MEYiLCAiSVNLX0lSIjogIkI2OUVGRkJGNjFCNTFENTY0MDFDMEY2NTYwMU
 #FCRTQyOERFODIwNkZFQUFGMEUzMjE5ODg5NkRDQUU3QjM1Q0QyQjM4OTUwQTM5REZE
 #NUQ0QTc5MTY0NjE0QzI5ODRGN0RBQTQ2MEI1ODhDMUU4MEMzRkEyMDY4QUY3OTAwND
 #Q3IiwgIklTS19TWSI6ICI1NDQxOTlENzFGNjJGOEQ5QTFGRUU1NTcyN0UyNEZFNEE0
 #NTg0NDU5M0MyQjYwMTNDNEZBMzk2OUQwRTVERUJCMjI0NDY3NUMwQjQzMzk3Q0JCNj
 #hEMzQyQjAxRkMwRjk4RkM5NjE0NjlBMjUxMzRERTlGMEY4MTNDMUE1NzQ3NiIsICJz
 #aWRfb3V0cHV0X2lyIjogIkJCMUM0NDlCMzVGMEVBNzlBNjVDMjA5RjMyOUE2OTNEND
 #c1RTBDRTIzODdCRUQ5RkU0Qjc4RjYwQjJBMjdDMjE5ODEzRkIyQ0ZFMTc1RUY0MEQy
 #MjIyRDkyNjFFNjZEQTdENzhGN0M1NUEzMDNCMUI4NjExRENERkFCODgwQzQ3IiwgIn
 #NpZF9vdXRwdXRfb2MiOiAiMTBENTk0MUQ0OTMzNDk3RkUzMUI5MTg4RDY5MEI4NDQ2
 #NUUyQTJEMTU4MzMyQTcyNjcyODRBMDcxQThEMDg3NkZDNUM4QzMyOURDNzM1RDU5QT
 #lGOEVGNjYyM0VFMjM5MjQ3MDRBMkY5MjlERDYzMUNBOTgxMjI3RUU4MkZGRjIifQ==
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    X: (length: 32 bytes)
      2c3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    G.scalar_mult(s,decode(X)): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
    G.scalar_mult_vfy(s,X): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    Y_i1: (length: 32 bytes)
      2b3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    Y_i2 == G.I: (length: 32 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-13">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI3Q0QwRTA3NUZBNzk1NUJBNTJDMDI3NTlBNkM5MERCQk
 #ZDMTBFNkQ0MEFFQThEMjgzRTQwN0Q4OENGNTM4QTA1IiwgIlgiOiAiMkMzQzZCOEM0
 #RjM4MDBFN0FFRjY4NjQwMjVCNEVENzlCRDU5OTExN0U0MjdDNDFCRDQ3RDkzRDY1NE
 #I0QTUxQyIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICI3QzEzNjQ1RkU3
 #OTBBNDY4RjYyQzM5QkVCNzM4OEU1NDFEODQwNUQxQURFNjlEMTc3OEM1RkUzRTdGNk
 #I2MDBFIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiN0MxMzY0NUZFNzkwQTQ2
 #OEY2MkMzOUJFQjczODhFNTQxRDg0MDVEMUFERTY5RDE3NzhDNUZFM0U3RjZCNjAwRS
 #J9LCAiSW52YWxpZCBZMSI6ICIyQjNDNkI4QzRGMzgwMEU3QUVGNjg2NDAyNUI0RUQ3
 #OUJENTk5MTE3RTQyN0M0MUJENDdEOTNENjU0QjRBNTFDIiwgIkludmFsaWQgWTIiOi
 #AiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-decaf448-and-hash-shake-256">
        <name>Test vector for CPace using group decaf448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-decaf448">
          <name>Test vectors for calculate_generator with group decaf448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 112 ;
    DSI = b'CPaceDecaf448'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 178 bytes)
      0d435061636544656361663434380850617373776f72647000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000180b415f
      696e69746961746f720b425f726573706f6e646572105223e0cdc45d
      6575668d64c552004124
    hash result: (length: 112 bytes)
      8ad1e4999548af985785a92cf36c5ba8b75115c7b38359ddb45a7347
      ab381673a3aeaac0edf6aaa666f9f4362d0115d8b9ead3e3b0235de1
      4032c6952ac33ea84af04081bda042548c7bde48a2950cd5a370b786
      e2e5ef832b113f0ba86f46954ea5f1f99b50ce7e65d35ca3a8f93bf6
    encoded generator g: (length: 56 bytes)
      b47b2c3e328ea9f318ca695af65dc838ba5a58bdb8087ae6c6ab486a
      8bfcb13d35b301dddca91d1540a4106d38ba1bf152e5bba104193c7e
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-14">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExMiwgIkRTSSI6ICI0MzUw
 #NjE2MzY1NDQ2NTYzNjE2NjM0MzQzOCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3NDY5Nj
 #E3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjUyMjNFMENE
 #QzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0
 #ksUFJTLENJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjBENDM1MDYxNjM2NTQ0NjU2MzYx
 #NjYzNDM0MzgwODUwNjE3MzczNzc2RjcyNjQ3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMTgwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2
 #NDY1NzIxMDUyMjNFMENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImhhc2ggcm
 #VzdWx0IjogIjhBRDFFNDk5OTU0OEFGOTg1Nzg1QTkyQ0YzNkM1QkE4Qjc1MTE1QzdC
 #MzgzNTlEREI0NUE3MzQ3QUIzODE2NzNBM0FFQUFDMEVERjZBQUE2NjZGOUY0MzYyRD
 #AxMTVEOEI5RUFEM0UzQjAyMzVERTE0MDMyQzY5NTJBQzMzRUE4NEFGMDQwODFCREEw
 #NDI1NDhDN0JERTQ4QTI5NTBDRDVBMzcwQjc4NkUyRTVFRjgzMkIxMTNGMEJBODZGND
 #Y5NTRFQTVGMUY5OUI1MENFN0U2NUQzNUNBM0E4RjkzQkY2IiwgImVuY29kZWQgZ2Vu
 #ZXJhdG9yIGciOiAiQjQ3QjJDM0UzMjhFQTlGMzE4Q0E2OTVBRjY1REM4MzhCQTVBNT
 #hCREI4MDg3QUU2QzZBQjQ4NkE4QkZDQjEzRDM1QjMwMURERENBOTFEMTU0MEE0MTA2
 #RDM4QkExQkYxNTJFNUJCQTEwNDE5M0M3RSJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-3">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      33d561f13cfc0dca279c30e8cde895175dc25483892819eba132d58c
      13c0462a8eb0d73fda941950594bef5191d8394691f86edffcad6c1e
  Outputs
    Ya: (length: 56 bytes)
      d2926adf737d8dfe46ae47cdd0a56bbcdad96958512d39f9865ad1b6
      4b5304d4d1696983cd6d38d57e3cdb1080262198b5d4c497c64926a5
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-3">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      2523c969f68fa2b2aea294c2539ef36eb1e0558abd14712a7828f16a
      85ed2c7e77e2bdd418994405fb1b57b6bbaadd66849892aac9d81402
  Outputs
    Yb: (length: 56 bytes)
      2e620e5d0bc4637f1ff97ddccb015141b2c3241b4abcb5931a7e22a9
      9fe256ae543733ce4e4c41826dda142fbfeb2639727a5233f8f0a42a
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-3">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      ee0c0ead075ed5637e167cd3e16415c114aee6e21adaddc0de9151b2
      930833e2862f4e4ec30c91de5c5249a724d9114860f2bcbbb6ca83fd
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      ee0c0ead075ed5637e167cd3e16415c114aee6e21adaddc0de9151b2
      930833e2862f4e4ec30c91de5c5249a724d9114860f2bcbbb6ca83fd
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-3">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      38d2926adf737d8dfe46ae47cdd0a56bbcdad96958512d39f9865ad1
      b64b5304d4d1696983cd6d38d57e3cdb1080262198b5d4c497c64926
      a503414461382e620e5d0bc4637f1ff97ddccb015141b2c3241b4abc
      b5931a7e22a99fe256ae543733ce4e4c41826dda142fbfeb2639727a
      5233f8f0a42a03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438ee0c0ead075ed5637e167cd3e16415c114aee6e2
      1adaddc0de9151b2930833e2862f4e4ec30c91de5c5249a724d91148
      60f2bcbbb6ca83fd38d2926adf737d8dfe46ae47cdd0a56bbcdad969
      58512d39f9865ad1b64b5304d4d1696983cd6d38d57e3cdb10802621
      98b5d4c497c64926a503414461382e620e5d0bc4637f1ff97ddccb01
      5141b2c3241b4abcb5931a7e22a99fe256ae543733ce4e4c41826dda
      142fbfeb2639727a5233f8f0a42a03414462
    ISK result: (length: 64 bytes)
      6f3a66ce20e1bad279d32d65844cd66b7352eb61a9eb37631168fe80
      3c83c6601c6a3e0867f4b2dbe2b0cb1b530912892d2b5eb9af2e3ab3
      d8682a33e178d1d2
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-3">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f6338d2926adf737d8dfe46ae47cdd0a56bbcdad96958512d39f986
      5ad1b64b5304d4d1696983cd6d38d57e3cdb1080262198b5d4c497c6
      4926a503414461382e620e5d0bc4637f1ff97ddccb015141b2c3241b
      4abcb5931a7e22a99fe256ae543733ce4e4c41826dda142fbfeb2639
      727a5233f8f0a42a03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 216 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438ee0c0ead075ed5637e167cd3e16415c114aee6e2
      1adaddc0de9151b2930833e2862f4e4ec30c91de5c5249a724d91148
      60f2bcbbb6ca83fd6f6338d2926adf737d8dfe46ae47cdd0a56bbcda
      d96958512d39f9865ad1b64b5304d4d1696983cd6d38d57e3cdb1080
      262198b5d4c497c64926a503414461382e620e5d0bc4637f1ff97ddc
      cb015141b2c3241b4abcb5931a7e22a99fe256ae543733ce4e4c4182
      6dda142fbfeb2639727a5233f8f0a42a03414462
    ISK result: (length: 64 bytes)
      59012b30b7a4050d1e83f7157da6cdd5baf77bf432f545e7baa1a2a1
      0bc29ef1345f9cfe2fb448bfe8a48a470d90d94cd73e4c99fc1c8b65
      1d43fb3ebed3a88f
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-3">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      9b3fb936e2b9d00da70841392bf012f3d0c1bcf0a8861020f7882b0d
      7f1e54eaf6e4d850ea4ed3169e630f2968d69e19338ae23d74febf00
      3b41600b0de91ad6
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      dfdf19db27b99dbf0a8943ee6a5395b48664e3930bdb0cf5a4e79646
      52e2ceafaee3645ee668a047f3fb259affac4eaec76014c2a01d2064
      9e96a19abde0cd22
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-3">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0xb4,0x7b,0x2c,0x3e,0x32,0x8e,0xa9,0xf3,0x18,0xca,0x69,0x5a,
 0xf6,0x5d,0xc8,0x38,0xba,0x5a,0x58,0xbd,0xb8,0x08,0x7a,0xe6,
 0xc6,0xab,0x48,0x6a,0x8b,0xfc,0xb1,0x3d,0x35,0xb3,0x01,0xdd,
 0xdc,0xa9,0x1d,0x15,0x40,0xa4,0x10,0x6d,0x38,0xba,0x1b,0xf1,
 0x52,0xe5,0xbb,0xa1,0x04,0x19,0x3c,0x7e,
};
const unsigned char tc_ya[] = {
 0x33,0xd5,0x61,0xf1,0x3c,0xfc,0x0d,0xca,0x27,0x9c,0x30,0xe8,
 0xcd,0xe8,0x95,0x17,0x5d,0xc2,0x54,0x83,0x89,0x28,0x19,0xeb,
 0xa1,0x32,0xd5,0x8c,0x13,0xc0,0x46,0x2a,0x8e,0xb0,0xd7,0x3f,
 0xda,0x94,0x19,0x50,0x59,0x4b,0xef,0x51,0x91,0xd8,0x39,0x46,
 0x91,0xf8,0x6e,0xdf,0xfc,0xad,0x6c,0x1e,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd2,0x92,0x6a,0xdf,0x73,0x7d,0x8d,0xfe,0x46,0xae,0x47,0xcd,
 0xd0,0xa5,0x6b,0xbc,0xda,0xd9,0x69,0x58,0x51,0x2d,0x39,0xf9,
 0x86,0x5a,0xd1,0xb6,0x4b,0x53,0x04,0xd4,0xd1,0x69,0x69,0x83,
 0xcd,0x6d,0x38,0xd5,0x7e,0x3c,0xdb,0x10,0x80,0x26,0x21,0x98,
 0xb5,0xd4,0xc4,0x97,0xc6,0x49,0x26,0xa5,
};
const unsigned char tc_yb[] = {
 0x25,0x23,0xc9,0x69,0xf6,0x8f,0xa2,0xb2,0xae,0xa2,0x94,0xc2,
 0x53,0x9e,0xf3,0x6e,0xb1,0xe0,0x55,0x8a,0xbd,0x14,0x71,0x2a,
 0x78,0x28,0xf1,0x6a,0x85,0xed,0x2c,0x7e,0x77,0xe2,0xbd,0xd4,
 0x18,0x99,0x44,0x05,0xfb,0x1b,0x57,0xb6,0xbb,0xaa,0xdd,0x66,
 0x84,0x98,0x92,0xaa,0xc9,0xd8,0x14,0x02,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x2e,0x62,0x0e,0x5d,0x0b,0xc4,0x63,0x7f,0x1f,0xf9,0x7d,0xdc,
 0xcb,0x01,0x51,0x41,0xb2,0xc3,0x24,0x1b,0x4a,0xbc,0xb5,0x93,
 0x1a,0x7e,0x22,0xa9,0x9f,0xe2,0x56,0xae,0x54,0x37,0x33,0xce,
 0x4e,0x4c,0x41,0x82,0x6d,0xda,0x14,0x2f,0xbf,0xeb,0x26,0x39,
 0x72,0x7a,0x52,0x33,0xf8,0xf0,0xa4,0x2a,
};
const unsigned char tc_K[] = {
 0xee,0x0c,0x0e,0xad,0x07,0x5e,0xd5,0x63,0x7e,0x16,0x7c,0xd3,
 0xe1,0x64,0x15,0xc1,0x14,0xae,0xe6,0xe2,0x1a,0xda,0xdd,0xc0,
 0xde,0x91,0x51,0xb2,0x93,0x08,0x33,0xe2,0x86,0x2f,0x4e,0x4e,
 0xc3,0x0c,0x91,0xde,0x5c,0x52,0x49,0xa7,0x24,0xd9,0x11,0x48,
 0x60,0xf2,0xbc,0xbb,0xb6,0xca,0x83,0xfd,
};
const unsigned char tc_ISK_IR[] = {
 0x6f,0x3a,0x66,0xce,0x20,0xe1,0xba,0xd2,0x79,0xd3,0x2d,0x65,
 0x84,0x4c,0xd6,0x6b,0x73,0x52,0xeb,0x61,0xa9,0xeb,0x37,0x63,
 0x11,0x68,0xfe,0x80,0x3c,0x83,0xc6,0x60,0x1c,0x6a,0x3e,0x08,
 0x67,0xf4,0xb2,0xdb,0xe2,0xb0,0xcb,0x1b,0x53,0x09,0x12,0x89,
 0x2d,0x2b,0x5e,0xb9,0xaf,0x2e,0x3a,0xb3,0xd8,0x68,0x2a,0x33,
 0xe1,0x78,0xd1,0xd2,
};
const unsigned char tc_ISK_SY[] = {
 0x59,0x01,0x2b,0x30,0xb7,0xa4,0x05,0x0d,0x1e,0x83,0xf7,0x15,
 0x7d,0xa6,0xcd,0xd5,0xba,0xf7,0x7b,0xf4,0x32,0xf5,0x45,0xe7,
 0xba,0xa1,0xa2,0xa1,0x0b,0xc2,0x9e,0xf1,0x34,0x5f,0x9c,0xfe,
 0x2f,0xb4,0x48,0xbf,0xe8,0xa4,0x8a,0x47,0x0d,0x90,0xd9,0x4c,
 0xd7,0x3e,0x4c,0x99,0xfc,0x1c,0x8b,0x65,0x1d,0x43,0xfb,0x3e,
 0xbe,0xd3,0xa8,0x8f,
};
const unsigned char tc_sid_out_ir[] = {
 0x9b,0x3f,0xb9,0x36,0xe2,0xb9,0xd0,0x0d,0xa7,0x08,0x41,0x39,
 0x2b,0xf0,0x12,0xf3,0xd0,0xc1,0xbc,0xf0,0xa8,0x86,0x10,0x20,
 0xf7,0x88,0x2b,0x0d,0x7f,0x1e,0x54,0xea,0xf6,0xe4,0xd8,0x50,
 0xea,0x4e,0xd3,0x16,0x9e,0x63,0x0f,0x29,0x68,0xd6,0x9e,0x19,
 0x33,0x8a,0xe2,0x3d,0x74,0xfe,0xbf,0x00,0x3b,0x41,0x60,0x0b,
 0x0d,0xe9,0x1a,0xd6,
};
const unsigned char tc_sid_out_oc[] = {
 0xdf,0xdf,0x19,0xdb,0x27,0xb9,0x9d,0xbf,0x0a,0x89,0x43,0xee,
 0x6a,0x53,0x95,0xb4,0x86,0x64,0xe3,0x93,0x0b,0xdb,0x0c,0xf5,
 0xa4,0xe7,0x96,0x46,0x52,0xe2,0xce,0xaf,0xae,0xe3,0x64,0x5e,
 0xe6,0x68,0xa0,0x47,0xf3,0xfb,0x25,0x9a,0xff,0xac,0x4e,0xae,
 0xc7,0x60,0x14,0xc2,0xa0,0x1d,0x20,0x64,0x9e,0x96,0xa1,0x9a,
 0xbd,0xe0,0xcd,0x22,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-15">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjUyMjNF
 #MENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImciOiAiQjQ3QjJDM0UzMjhFQT
 #lGMzE4Q0E2OTVBRjY1REM4MzhCQTVBNThCREI4MDg3QUU2QzZBQjQ4NkE4QkZDQjEz
 #RDM1QjMwMURERENBOTFEMTU0MEE0MTA2RDM4QkExQkYxNTJFNUJCQTEwNDE5M0M3RS
 #IsICJ5YSI6ICIzM0Q1NjFGMTNDRkMwRENBMjc5QzMwRThDREU4OTUxNzVEQzI1NDgz
 #ODkyODE5RUJBMTMyRDU4QzEzQzA0NjJBOEVCMEQ3M0ZEQTk0MTk1MDU5NEJFRjUxOT
 #FEODM5NDY5MUY4NkVERkZDQUQ2QzFFIiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEiOiAi
 #RDI5MjZBREY3MzdEOERGRTQ2QUU0N0NERDBBNTZCQkNEQUQ5Njk1ODUxMkQzOUY5OD
 #Y1QUQxQjY0QjUzMDRENEQxNjk2OTgzQ0Q2RDM4RDU3RTNDREIxMDgwMjYyMTk4QjVE
 #NEM0OTdDNjQ5MjZBNSIsICJ5YiI6ICIyNTIzQzk2OUY2OEZBMkIyQUVBMjk0QzI1Mz
 #lFRjM2RUIxRTA1NThBQkQxNDcxMkE3ODI4RjE2QTg1RUQyQzdFNzdFMkJERDQxODk5
 #NDQwNUZCMUI1N0I2QkJBQURENjY4NDk4OTJBQUM5RDgxNDAyIiwgIkFEYiI6ICI0MT
 #Q0NjIiLCAiWWIiOiAiMkU2MjBFNUQwQkM0NjM3RjFGRjk3RERDQ0IwMTUxNDFCMkMz
 #MjQxQjRBQkNCNTkzMUE3RTIyQTk5RkUyNTZBRTU0MzczM0NFNEU0QzQxODI2RERBMT
 #QyRkJGRUIyNjM5NzI3QTUyMzNGOEYwQTQyQSIsICJLIjogIkVFMEMwRUFEMDc1RUQ1
 #NjM3RTE2N0NEM0UxNjQxNUMxMTRBRUU2RTIxQURBRERDMERFOTE1MUIyOTMwODMzRT
 #I4NjJGNEU0RUMzMEM5MURFNUM1MjQ5QTcyNEQ5MTE0ODYwRjJCQ0JCQjZDQTgzRkQi
 #LCAiSVNLX0lSIjogIjZGM0E2NkNFMjBFMUJBRDI3OUQzMkQ2NTg0NENENjZCNzM1Mk
 #VCNjFBOUVCMzc2MzExNjhGRTgwM0M4M0M2NjAxQzZBM0UwODY3RjRCMkRCRTJCMENC
 #MUI1MzA5MTI4OTJEMkI1RUI5QUYyRTNBQjNEODY4MkEzM0UxNzhEMUQyIiwgIklTS1
 #9TWSI6ICI1OTAxMkIzMEI3QTQwNTBEMUU4M0Y3MTU3REE2Q0RENUJBRjc3QkY0MzJG
 #NTQ1RTdCQUExQTJBMTBCQzI5RUYxMzQ1RjlDRkUyRkI0NDhCRkU4QTQ4QTQ3MEQ5ME
 #Q5NENENzNFNEM5OUZDMUM4QjY1MUQ0M0ZCM0VCRUQzQTg4RiIsICJzaWRfb3V0cHV0
 #X2lyIjogIjlCM0ZCOTM2RTJCOUQwMERBNzA4NDEzOTJCRjAxMkYzRDBDMUJDRjBBOD
 #g2MTAyMEY3ODgyQjBEN0YxRTU0RUFGNkU0RDg1MEVBNEVEMzE2OUU2MzBGMjk2OEQ2
 #OUUxOTMzOEFFMjNENzRGRUJGMDAzQjQxNjAwQjBERTkxQUQ2IiwgInNpZF9vdXRwdX
 #Rfb2MiOiAiREZERjE5REIyN0I5OURCRjBBODk0M0VFNkE1Mzk1QjQ4NjY0RTM5MzBC
 #REIwQ0Y1QTRFNzk2NDY1MkUyQ0VBRkFFRTM2NDVFRTY2OEEwNDdGM0ZCMjU5QUZGQU
 #M0RUFFQzc2MDE0QzJBMDFEMjA2NDlFOTZBMTlBQkRFMENEMjIifQ==
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs-1">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    X: (length: 56 bytes)
      601431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    G.scalar_mult(s,decode(X)): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
    G.scalar_mult_vfy(s,X): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-1">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    Y_i1: (length: 56 bytes)
      5f1431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    Y_i2 == G.I: (length: 56 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-16">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJERDFCQzcwMTVEQUFCQjc2NzIxMjlDQzM1QTNCQTgxNT
 #Q4NkIxMzlERUZGOUJERUNBN0E0RkM2MTM0MzIzRDM0NjU4NzYxRTkwRkYwNzk5NzJB
 #N0NBOEFBNTYwNjQ5OEY0RjRGMEVCQzA5MzNBODE5IiwgIlgiOiAiNjAxNDMxRDVFNT
 #FGNDNENDIyQTkyRDNGQjIzNzNCREUyODIxN0FBQjQyNTI0QzM0MUFBNDA0RUFCQTVB
 #QTU1NDFGNzA0MkRCQjMyNTNDRTRDOTBGNzcyQjAzOEE0MTNEQ0IzQTBGNkJGM0FFOU
 #UyMSIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICIzODhCMzVDNjBFQjQx
 #QjY2MDg1QTIxMTgzMTYyMTg2ODFENzg5NzlENjY3NzAyREUxMDVGREMxRjIxRkZFOD
 #g0QTU3N0Q3OTVGNDU2OTE3ODEzOTBBMjI5QTNCRDdCNTI3RTgzMTM4MEYyRjU4NUE0
 #IiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiMzg4QjM1QzYwRUI0MUI2NjA4NU
 #EyMTE4MzE2MjE4NjgxRDc4OTc5RDY2NzcwMkRFMTA1RkRDMUYyMUZGRTg4NEE1NzdE
 #Nzk1RjQ1NjkxNzgxMzkwQTIyOUEzQkQ3QjUyN0U4MzEzODBGMkY1ODVBNCJ9LCAiSW
 #52YWxpZCBZMSI6ICI1RjE0MzFENUU1MUY0M0Q0MjJBOTJEM0ZCMjM3M0JERTI4MjE3
 #QUFCNDI1MjRDMzQxQUE0MDRFQUJBNUFBNTU0MUY3MDQyREJCMzI1M0NFNEM5MEY3Nz
 #JCMDM4QTQxM0RDQjNBMEY2QkYzQUU5RTIxIiwgIkludmFsaWQgWTIiOiAiMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-256-and-hash-sha-256">
        <name>Test vector for CPace using group NIST P-256 and hash SHA-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-256">
          <name>Test vectors for calculate_generator with group NIST P-256</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-256 with input block size 64 bytes.
    PRS = b'Password' ; ZPAD length: 23 ;
    DSI = b'CPaceP256_XMD:SHA-256_SSWU_NU_'
    DST = b'CPaceP256_XMD:SHA-256_SSWU_NU__DST'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 34b36454cab2e7842c389f7d88ecb7df
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 106 bytes)
      1e4350616365503235365f584d443a5348412d3235365f535357555f
      4e555f0850617373776f726417000000000000000000000000000000
      0000000000000000180b415f696e69746961746f720b425f72657370
      6f6e6465721034b36454cab2e7842c389f7d88ecb7df
    generator g: (length: 65 bytes)
      0439bff2b051701594d3e9c7e93be9213af15db42214dfc4f7ee929a
      6697f774d7ba5fb289b982399e4acd281a988bf058ea7ff6d7ff34fd
      b72157bb464ff4af87
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-17">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0yNTYiLCAiSC5zX2luX2J5dGVzIjogNjQsICJQUlMiOiAiNTA2MT
 #czNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDIzLCAiRFNJIjogIjQzNTA2MTYz
 #NjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4NDEyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNT
 #U1RiIsICJDSSI6ICIwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3
 #MDZGNkU2NDY1NzIiLCAic2lkIjogIjM0QjM2NDU0Q0FCMkU3ODQyQzM4OUY3RDg4RU
 #NCN0RGIiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0ksUFJTLENJLHNpZCxILnNfaW5f
 #Ynl0ZXMpIjogIjFFNDM1MDYxNjM2NTUwMzIzNTM2NUY1ODRENDQzQTUzNDg0MTJEMz
 #IzNTM2NUY1MzUzNTc1NTVGNEU1NTVGMDg1MDYxNzM3Mzc3NkY3MjY0MTcwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTgwQjQxNUY2OT
 #ZFNjk3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIxMDM0QjM2NDU0
 #Q0FCMkU3ODQyQzM4OUY3RDg4RUNCN0RGIiwgImdlbmVyYXRvciBnIjogIjA0MzlCRk
 #YyQjA1MTcwMTU5NEQzRTlDN0U5M0JFOTIxM0FGMTVEQjQyMjE0REZDNEY3RUU5MjlB
 #NjY5N0Y3NzREN0JBNUZCMjg5Qjk4MjM5OUU0QUNEMjgxQTk4OEJGMDU4RUE3RkY2RD
 #dGRjM0RkRCNzIxNTdCQjQ2NEZGNEFGODcifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-4">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 32 bytes)
      37574cfbf1b95ff6a8e2d7be462d4d01e6dde2618f34f4de9df869b2
      4f532c5d
  Outputs
    Ya: (length: 65 bytes)
      04cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901ef962
      c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16fc19c3
      2a7b31aab097919736
    Alternative correct value for Ya: (-ya)*g:
    (length: 65 bytes)
      04cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901ef962
      c2e2d486b208c7d9c2925a5570d01e7a51d325a782072d85ea03e63c
      d584ce554f686e68c9
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-4">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 32 bytes)
      e5672fc9eb4e721f41d80181ec4c9fd9886668acc48024d33c82bb10
      2aecba52
  Outputs
    Yb: (length: 65 bytes)
      046f538f9b8eb4e628bcace0fbba7d36fea44e98334d233c22101a2f
      28eb3afc1a61b2bd14c0f11b222b5ea34df7756d104e2b5da09c9e8f
      fa330c150f47e84cef
    Alternative correct value for Yb: (-yb)*g:
    (length: 65 bytes)
      046f538f9b8eb4e628bcace0fbba7d36fea44e98334d233c22101a2f
      28eb3afc1a9e4d42ea3f0ee4ded4a15cb2088a92efb1d4a260636170
      05ccf3eaf0b817b310
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-4">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      9dd152b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb
      3a0db812
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      9dd152b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb
      3a0db812
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-4">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 140 bytes)
      4104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901ef9
      62c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16fc19
      c32a7b31aab0979197360341446141046f538f9b8eb4e628bcace0fb
      ba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0f11b22
      2b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef03414462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 225 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df209dd152
      b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb3a0db8
      124104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901e
      f962c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16fc
      19c32a7b31aab0979197360341446141046f538f9b8eb4e628bcace0
      fbba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0f11b
      222b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef034144
      62
    ISK result: (length: 32 bytes)
      d67704f1c69b85736f273e73198a79fe5e4f60cb405e32f708e0aff5
      fdb5f9db
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-4">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 142 bytes)
      6f634104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b90
      1ef962c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16
      fc19c32a7b31aab0979197360341446141046f538f9b8eb4e628bcac
      e0fbba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0f1
      1b222b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef0341
      4462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 227 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df209dd152
      b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb3a0db8
      126f634104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b
      901ef962c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a
      16fc19c32a7b31aab0979197360341446141046f538f9b8eb4e628bc
      ace0fbba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0
      f11b222b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef03
      414462
    ISK result: (length: 32 bytes)
      724ffa2de3685f12a10bb2eb013cb6c0378acef40b78f5b21dbd69f7
      2478e32b
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-4">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      28e98006db715c2de9817e847f937336ba510ed288cd55a6e7b020d0
      c85e74fe
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      dc11fd7db69958c3bd30d72171377444261975c599fa6e85f73bac00
      a85ad5c3
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-4">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x34,0xb3,0x64,0x54,0xca,0xb2,0xe7,0x84,0x2c,0x38,0x9f,0x7d,
 0x88,0xec,0xb7,0xdf,
};
const unsigned char tc_g[] = {
 0x04,0x39,0xbf,0xf2,0xb0,0x51,0x70,0x15,0x94,0xd3,0xe9,0xc7,
 0xe9,0x3b,0xe9,0x21,0x3a,0xf1,0x5d,0xb4,0x22,0x14,0xdf,0xc4,
 0xf7,0xee,0x92,0x9a,0x66,0x97,0xf7,0x74,0xd7,0xba,0x5f,0xb2,
 0x89,0xb9,0x82,0x39,0x9e,0x4a,0xcd,0x28,0x1a,0x98,0x8b,0xf0,
 0x58,0xea,0x7f,0xf6,0xd7,0xff,0x34,0xfd,0xb7,0x21,0x57,0xbb,
 0x46,0x4f,0xf4,0xaf,0x87,
};
const unsigned char tc_ya[] = {
 0x37,0x57,0x4c,0xfb,0xf1,0xb9,0x5f,0xf6,0xa8,0xe2,0xd7,0xbe,
 0x46,0x2d,0x4d,0x01,0xe6,0xdd,0xe2,0x61,0x8f,0x34,0xf4,0xde,
 0x9d,0xf8,0x69,0xb2,0x4f,0x53,0x2c,0x5d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0xcf,0x55,0xf0,0xa5,0x3a,0x1b,0x4c,0x43,0x00,0x2e,0x1b,
 0xe8,0x17,0x1f,0x42,0x73,0x7c,0xf2,0x0b,0x7c,0xd6,0x17,0x7b,
 0x90,0x1e,0xf9,0x62,0xc2,0xe2,0xd4,0x86,0xb2,0xf7,0x38,0x26,
 0x3c,0x6d,0xa5,0xaa,0x90,0x2f,0xe1,0x85,0xae,0x2c,0xda,0x58,
 0x7d,0xf8,0xd2,0x7a,0x16,0xfc,0x19,0xc3,0x2a,0x7b,0x31,0xaa,
 0xb0,0x97,0x91,0x97,0x36,
};
const unsigned char tc_yb[] = {
 0xe5,0x67,0x2f,0xc9,0xeb,0x4e,0x72,0x1f,0x41,0xd8,0x01,0x81,
 0xec,0x4c,0x9f,0xd9,0x88,0x66,0x68,0xac,0xc4,0x80,0x24,0xd3,
 0x3c,0x82,0xbb,0x10,0x2a,0xec,0xba,0x52,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x6f,0x53,0x8f,0x9b,0x8e,0xb4,0xe6,0x28,0xbc,0xac,0xe0,
 0xfb,0xba,0x7d,0x36,0xfe,0xa4,0x4e,0x98,0x33,0x4d,0x23,0x3c,
 0x22,0x10,0x1a,0x2f,0x28,0xeb,0x3a,0xfc,0x1a,0x61,0xb2,0xbd,
 0x14,0xc0,0xf1,0x1b,0x22,0x2b,0x5e,0xa3,0x4d,0xf7,0x75,0x6d,
 0x10,0x4e,0x2b,0x5d,0xa0,0x9c,0x9e,0x8f,0xfa,0x33,0x0c,0x15,
 0x0f,0x47,0xe8,0x4c,0xef,
};
const unsigned char tc_K[] = {
 0x9d,0xd1,0x52,0xb6,0x87,0xde,0xd1,0xe0,0x71,0xcc,0x06,0x25,
 0xbd,0x1f,0xff,0xf4,0xc4,0xcc,0xd7,0xd7,0x7c,0xb4,0x98,0x7c,
 0x7d,0x1e,0x4e,0xcb,0x3a,0x0d,0xb8,0x12,
};
const unsigned char tc_ISK_IR[] = {
 0xd6,0x77,0x04,0xf1,0xc6,0x9b,0x85,0x73,0x6f,0x27,0x3e,0x73,
 0x19,0x8a,0x79,0xfe,0x5e,0x4f,0x60,0xcb,0x40,0x5e,0x32,0xf7,
 0x08,0xe0,0xaf,0xf5,0xfd,0xb5,0xf9,0xdb,
};
const unsigned char tc_ISK_SY[] = {
 0x72,0x4f,0xfa,0x2d,0xe3,0x68,0x5f,0x12,0xa1,0x0b,0xb2,0xeb,
 0x01,0x3c,0xb6,0xc0,0x37,0x8a,0xce,0xf4,0x0b,0x78,0xf5,0xb2,
 0x1d,0xbd,0x69,0xf7,0x24,0x78,0xe3,0x2b,
};
const unsigned char tc_sid_out_ir[] = {
 0x28,0xe9,0x80,0x06,0xdb,0x71,0x5c,0x2d,0xe9,0x81,0x7e,0x84,
 0x7f,0x93,0x73,0x36,0xba,0x51,0x0e,0xd2,0x88,0xcd,0x55,0xa6,
 0xe7,0xb0,0x20,0xd0,0xc8,0x5e,0x74,0xfe,
};
const unsigned char tc_sid_out_oc[] = {
 0xdc,0x11,0xfd,0x7d,0xb6,0x99,0x58,0xc3,0xbd,0x30,0xd7,0x21,
 0x71,0x37,0x74,0x44,0x26,0x19,0x75,0xc5,0x99,0xfa,0x6e,0x85,
 0xf7,0x3b,0xac,0x00,0xa8,0x5a,0xd5,0xc3,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-18">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjM0QjM2
 #NDU0Q0FCMkU3ODQyQzM4OUY3RDg4RUNCN0RGIiwgImciOiAiMDQzOUJGRjJCMDUxNz
 #AxNTk0RDNFOUM3RTkzQkU5MjEzQUYxNURCNDIyMTRERkM0RjdFRTkyOUE2Njk3Rjc3
 #NEQ3QkE1RkIyODlCOTgyMzk5RTRBQ0QyODFBOTg4QkYwNThFQTdGRjZEN0ZGMzRGRE
 #I3MjE1N0JCNDY0RkY0QUY4NyIsICJ5YSI6ICIzNzU3NENGQkYxQjk1RkY2QThFMkQ3
 #QkU0NjJENEQwMUU2RERFMjYxOEYzNEY0REU5REY4NjlCMjRGNTMyQzVEIiwgIkFEYS
 #I6ICI0MTQ0NjEiLCAiWWEiOiAiMDRDRjU1RjBBNTNBMUI0QzQzMDAyRTFCRTgxNzFG
 #NDI3MzdDRjIwQjdDRDYxNzdCOTAxRUY5NjJDMkUyRDQ4NkIyRjczODI2M0M2REE1QU
 #E5MDJGRTE4NUFFMkNEQTU4N0RGOEQyN0ExNkZDMTlDMzJBN0IzMUFBQjA5NzkxOTcz
 #NiIsICJ5YiI6ICJFNTY3MkZDOUVCNEU3MjFGNDFEODAxODFFQzRDOUZEOTg4NjY2OE
 #FDQzQ4MDI0RDMzQzgyQkIxMDJBRUNCQTUyIiwgIkFEYiI6ICI0MTQ0NjIiLCAiWWIi
 #OiAiMDQ2RjUzOEY5QjhFQjRFNjI4QkNBQ0UwRkJCQTdEMzZGRUE0NEU5ODMzNEQyMz
 #NDMjIxMDFBMkYyOEVCM0FGQzFBNjFCMkJEMTRDMEYxMUIyMjJCNUVBMzRERjc3NTZE
 #MTA0RTJCNURBMDlDOUU4RkZBMzMwQzE1MEY0N0U4NENFRiIsICJLIjogIjlERDE1Mk
 #I2ODdERUQxRTA3MUNDMDYyNUJEMUZGRkY0QzRDQ0Q3RDc3Q0I0OTg3QzdEMUU0RUNC
 #M0EwREI4MTIiLCAiSVNLX0lSIjogIkQ2NzcwNEYxQzY5Qjg1NzM2RjI3M0U3MzE5OE
 #E3OUZFNUU0RjYwQ0I0MDVFMzJGNzA4RTBBRkY1RkRCNUY5REIiLCAiSVNLX1NZIjog
 #IjcyNEZGQTJERTM2ODVGMTJBMTBCQjJFQjAxM0NCNkMwMzc4QUNFRjQwQjc4RjVCMj
 #FEQkQ2OUY3MjQ3OEUzMkIiLCAic2lkX291dHB1dF9pciI6ICIyOEU5ODAwNkRCNzE1
 #QzJERTk4MTdFODQ3RjkzNzMzNkJBNTEwRUQyODhDRDU1QTZFN0IwMjBEMEM4NUU3NE
 #ZFIiwgInNpZF9vdXRwdXRfb2MiOiAiREMxMUZEN0RCNjk5NThDM0JEMzBENzIxNzEz
 #Nzc0NDQyNjE5NzVDNTk5RkE2RTg1RjczQkFDMDBBODVBRDVDMyJ9
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    X: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5831
    G.scalar_mult(s,X) (full coordinates): (length: 65 bytes)
      04f5a191f078c87c36633b78c701751159d56c59f3fe9105b5720673
      470f303ab925b6a7fd1cdd8f649a21cf36b68d9e9c4a11919a951892
      519786104b27033757
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 32 bytes)
      f5a191f078c87c36633b78c701751159d56c59f3fe9105b572067347
      0f303ab9
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-2">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    Y_i1: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5857
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-19">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJGMDEyNTAxQzA5MUZGOUI5OUExMjNGRkZFNTcxRDhCQz
 #AxRTgwNzdFRTU4MTM2MkUxQkQyMTM5OTA4MzU2NDNCIiwgIlgiOiAiMDQyNDY0OEVC
 #OTg2QzJCRTBBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRD
 #EyQkE0RTBGNzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3
 #MzQ2RDEwQTRBQjI1MTRGQUVGNTgzMSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bG
 #wgY29vcmRpbmF0ZXMpIjogIjA0RjVBMTkxRjA3OEM4N0MzNjYzM0I3OEM3MDE3NTEx
 #NTlENTZDNTlGM0ZFOTEwNUI1NzIwNjczNDcwRjMwM0FCOTI1QjZBN0ZEMUNERDhGNj
 #Q5QTIxQ0YzNkI2OEQ5RTlDNEExMTkxOUE5NTE4OTI1MTk3ODYxMDRCMjcwMzM3NTci
 #LCAiRy5zY2FsYXJfbXVsdF92ZnkocyxYKSAob25seSBYLWNvb3JkaW5hdGUpIjogIk
 #Y1QTE5MUYwNzhDODdDMzY2MzNCNzhDNzAxNzUxMTU5RDU2QzU5RjNGRTkxMDVCNTcy
 #MDY3MzQ3MEYzMDNBQjkifSwgIkludmFsaWQgWTEiOiAiMDQyNDY0OEVCOTg2QzJCRT
 #BBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRDEyQkE0RTBG
 #NzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3MzQ2RDEwQT
 #RBQjI1MTRGQUVGNTg1NyIsICJJbnZhbGlkIFkyIjogIjAwIn0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-384-and-hash-sha-384">
        <name>Test vector for CPace using group NIST P-384 and hash SHA-384</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-384">
          <name>Test vectors for calculate_generator with group NIST P-384</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-384 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP384_XMD:SHA-384_SSWU_NU_'
    DST = b'CPaceP384_XMD:SHA-384_SSWU_NU__DST'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 5b3773aa90e8f23c61563a4b645b276c
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      1e4350616365503338345f584d443a5348412d3338345f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572105b3773aa90e8f23c61563a4b645b
      276c
    generator g: (length: 97 bytes)
      04d938e00eaa8d44fcac33dd5d10404f0c57e0fb1dfdcca3fae47a6a
      14bbe52a6ac82a856d9de14e0223a1e1a5bd3fb38be951af748723f8
      f64835217ad5bc05a4fc0e1d7c17cf14c3bda93d05cef96b86483fc5
      f51570fc27f0a3c19cd2ece2a2
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-20">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0zODQiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0ODQxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMEI0MjVGNzI2NTcz
 #NzA2RjZFNjQ2NTcyIiwgInNpZCI6ICI1QjM3NzNBQTkwRThGMjNDNjE1NjNBNEI2ND
 #VCMjc2QyIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2lu
 #X2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDMzMzgzNDVGNTg0RDQ0M0E1MzQ4NDEyRD
 #MzMzgzNDVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDU3MDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMTgwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQy
 #NUY3MjY1NzM3MDZGNkU2NDY1NzIxMDVCMzc3M0FBOTBFOEYyM0M2MTU2M0E0QjY0NU
 #IyNzZDIiwgImdlbmVyYXRvciBnIjogIjA0RDkzOEUwMEVBQThENDRGQ0FDMzNERDVE
 #MTA0MDRGMEM1N0UwRkIxREZEQ0NBM0ZBRTQ3QTZBMTRCQkU1MkE2QUM4MkE4NTZEOU
 #RFMTRFMDIyM0ExRTFBNUJEM0ZCMzhCRTk1MUFGNzQ4NzIzRjhGNjQ4MzUyMTdBRDVC
 #QzA1QTRGQzBFMUQ3QzE3Q0YxNEMzQkRBOTNEMDVDRUY5NkI4NjQ4M0ZDNUY1MTU3ME
 #ZDMjdGMEEzQzE5Q0QyRUNFMkEyIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-5">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 48 bytes)
      ef433dd5ad142c860e7cb6400dd315d388d5ec5420c550e9d6f0907f
      375d988bc4d704837e43561c497e7dd93edcdb9d
  Outputs
    Ya: (length: 97 bytes)
      043973faff49d85b1a14f114d0550a8ec0e5defcc7399c2e19003251
      b1ddb9e786489b66be3cf8601880bd426a8a52f96968229d35032ac9
      cc3ef6c1fd67ce1f7979bb1be9f4ff63e34fc6df42ebb481989596f6
      3c6bd987fffd2527bdfd6b05d6
    Alternative correct value for Ya: (-ya)*g:
    (length: 97 bytes)
      043973faff49d85b1a14f114d0550a8ec0e5defcc7399c2e19003251
      b1ddb9e786489b66be3cf8601880bd426a8a52f96997dd62cafcd536
      33c1093e029831e0868644e4160b009c1cb03920bd144b7e666a6909
      c29426780002dad8430294fa29
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-5">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 48 bytes)
      50b0e36b95a2edfaa8342b843dddc90b175330f2399c1b36586dedda
      3c255975f30be6a750f9404fccc62a6323b5e471
  Outputs
    Yb: (length: 97 bytes)
      04a94b80cc266671a00ef719ee249bda79cbf66788784611e9c18835
      2ac7dbf23f730a4c3ea320e7a27a657ac336e7ee9c9bf49a5dcb715b
      b9b2ac2e5433bba61b2b186b7d6a539015096f351b36df579469d50a
      2f7ca1c615bd7e28633e5faefb
    Alternative correct value for Yb: (-yb)*g:
    (length: 97 bytes)
      04a94b80cc266671a00ef719ee249bda79cbf66788784611e9c18835
      2ac7dbf23f730a4c3ea320e7a27a657ac336e7ee9c640b65a2348ea4
      464d53d1abcc4459e4d4e7948295ac6feaf690cae4c920a86a962af5
      cf835e39ea4281d79dc1a05104
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-5">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 48 bytes)
      03ad91b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502
      397903b464768f57d2ef19fda00542dc7636031f
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      03ad91b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502
      397903b464768f57d2ef19fda00542dc7636031f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-5">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 204 bytes)
      61043973faff49d85b1a14f114d0550a8ec0e5defcc7399c2e190032
      51b1ddb9e786489b66be3cf8601880bd426a8a52f96968229d35032a
      c9cc3ef6c1fd67ce1f7979bb1be9f4ff63e34fc6df42ebb481989596
      f63c6bd987fffd2527bdfd6b05d6034144616104a94b80cc266671a0
      0ef719ee249bda79cbf66788784611e9c188352ac7dbf23f730a4c3e
      a320e7a27a657ac336e7ee9c9bf49a5dcb715bb9b2ac2e5433bba61b
      2b186b7d6a539015096f351b36df579469d50a2f7ca1c615bd7e2863
      3e5faefb03414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 305 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c3003ad91
      b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502397903
      b464768f57d2ef19fda00542dc7636031f61043973faff49d85b1a14
      f114d0550a8ec0e5defcc7399c2e19003251b1ddb9e786489b66be3c
      f8601880bd426a8a52f96968229d35032ac9cc3ef6c1fd67ce1f7979
      bb1be9f4ff63e34fc6df42ebb481989596f63c6bd987fffd2527bdfd
      6b05d6034144616104a94b80cc266671a00ef719ee249bda79cbf667
      88784611e9c188352ac7dbf23f730a4c3ea320e7a27a657ac336e7ee
      9c9bf49a5dcb715bb9b2ac2e5433bba61b2b186b7d6a539015096f35
      1b36df579469d50a2f7ca1c615bd7e28633e5faefb03414462
    ISK result: (length: 48 bytes)
      407d3e94916138a8a0cd3b6b64cdbd9a665fd83e706508649bc43b04
      7b73cf27017d2cc74533f18a5075a6748de5a026
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-5">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 206 bytes)
      6f636104a94b80cc266671a00ef719ee249bda79cbf66788784611e9
      c188352ac7dbf23f730a4c3ea320e7a27a657ac336e7ee9c9bf49a5d
      cb715bb9b2ac2e5433bba61b2b186b7d6a539015096f351b36df5794
      69d50a2f7ca1c615bd7e28633e5faefb0341446261043973faff49d8
      5b1a14f114d0550a8ec0e5defcc7399c2e19003251b1ddb9e786489b
      66be3cf8601880bd426a8a52f96968229d35032ac9cc3ef6c1fd67ce
      1f7979bb1be9f4ff63e34fc6df42ebb481989596f63c6bd987fffd25
      27bdfd6b05d603414461
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 307 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c3003ad91
      b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502397903
      b464768f57d2ef19fda00542dc7636031f6f636104a94b80cc266671
      a00ef719ee249bda79cbf66788784611e9c188352ac7dbf23f730a4c
      3ea320e7a27a657ac336e7ee9c9bf49a5dcb715bb9b2ac2e5433bba6
      1b2b186b7d6a539015096f351b36df579469d50a2f7ca1c615bd7e28
      633e5faefb0341446261043973faff49d85b1a14f114d0550a8ec0e5
      defcc7399c2e19003251b1ddb9e786489b66be3cf8601880bd426a8a
      52f96968229d35032ac9cc3ef6c1fd67ce1f7979bb1be9f4ff63e34f
      c6df42ebb481989596f63c6bd987fffd2527bdfd6b05d603414461
    ISK result: (length: 48 bytes)
      b2c28ddad4a77680469bd090bad8098d1c22e7050553acdacd13614d
      eed72bb7821c50ddc4b30b4b54151e07077d1985
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-5">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      ad0247e90c1124ce6da6f62d55daf30fada0b08160164bb93ccd5a2d
      f9750b91a4517184872e2bcfb4fff83bbad02371
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      4c7b6523ae4c7a5df9d709b59dd1b033152040715391c7ed7c60a12c
      c3f40e251fbda5b78c63bc465dac5ca6046f3fc0
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-5">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x5b,0x37,0x73,0xaa,0x90,0xe8,0xf2,0x3c,0x61,0x56,0x3a,0x4b,
 0x64,0x5b,0x27,0x6c,
};
const unsigned char tc_g[] = {
 0x04,0xd9,0x38,0xe0,0x0e,0xaa,0x8d,0x44,0xfc,0xac,0x33,0xdd,
 0x5d,0x10,0x40,0x4f,0x0c,0x57,0xe0,0xfb,0x1d,0xfd,0xcc,0xa3,
 0xfa,0xe4,0x7a,0x6a,0x14,0xbb,0xe5,0x2a,0x6a,0xc8,0x2a,0x85,
 0x6d,0x9d,0xe1,0x4e,0x02,0x23,0xa1,0xe1,0xa5,0xbd,0x3f,0xb3,
 0x8b,0xe9,0x51,0xaf,0x74,0x87,0x23,0xf8,0xf6,0x48,0x35,0x21,
 0x7a,0xd5,0xbc,0x05,0xa4,0xfc,0x0e,0x1d,0x7c,0x17,0xcf,0x14,
 0xc3,0xbd,0xa9,0x3d,0x05,0xce,0xf9,0x6b,0x86,0x48,0x3f,0xc5,
 0xf5,0x15,0x70,0xfc,0x27,0xf0,0xa3,0xc1,0x9c,0xd2,0xec,0xe2,
 0xa2,
};
const unsigned char tc_ya[] = {
 0xef,0x43,0x3d,0xd5,0xad,0x14,0x2c,0x86,0x0e,0x7c,0xb6,0x40,
 0x0d,0xd3,0x15,0xd3,0x88,0xd5,0xec,0x54,0x20,0xc5,0x50,0xe9,
 0xd6,0xf0,0x90,0x7f,0x37,0x5d,0x98,0x8b,0xc4,0xd7,0x04,0x83,
 0x7e,0x43,0x56,0x1c,0x49,0x7e,0x7d,0xd9,0x3e,0xdc,0xdb,0x9d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x39,0x73,0xfa,0xff,0x49,0xd8,0x5b,0x1a,0x14,0xf1,0x14,
 0xd0,0x55,0x0a,0x8e,0xc0,0xe5,0xde,0xfc,0xc7,0x39,0x9c,0x2e,
 0x19,0x00,0x32,0x51,0xb1,0xdd,0xb9,0xe7,0x86,0x48,0x9b,0x66,
 0xbe,0x3c,0xf8,0x60,0x18,0x80,0xbd,0x42,0x6a,0x8a,0x52,0xf9,
 0x69,0x68,0x22,0x9d,0x35,0x03,0x2a,0xc9,0xcc,0x3e,0xf6,0xc1,
 0xfd,0x67,0xce,0x1f,0x79,0x79,0xbb,0x1b,0xe9,0xf4,0xff,0x63,
 0xe3,0x4f,0xc6,0xdf,0x42,0xeb,0xb4,0x81,0x98,0x95,0x96,0xf6,
 0x3c,0x6b,0xd9,0x87,0xff,0xfd,0x25,0x27,0xbd,0xfd,0x6b,0x05,
 0xd6,
};
const unsigned char tc_yb[] = {
 0x50,0xb0,0xe3,0x6b,0x95,0xa2,0xed,0xfa,0xa8,0x34,0x2b,0x84,
 0x3d,0xdd,0xc9,0x0b,0x17,0x53,0x30,0xf2,0x39,0x9c,0x1b,0x36,
 0x58,0x6d,0xed,0xda,0x3c,0x25,0x59,0x75,0xf3,0x0b,0xe6,0xa7,
 0x50,0xf9,0x40,0x4f,0xcc,0xc6,0x2a,0x63,0x23,0xb5,0xe4,0x71,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0xa9,0x4b,0x80,0xcc,0x26,0x66,0x71,0xa0,0x0e,0xf7,0x19,
 0xee,0x24,0x9b,0xda,0x79,0xcb,0xf6,0x67,0x88,0x78,0x46,0x11,
 0xe9,0xc1,0x88,0x35,0x2a,0xc7,0xdb,0xf2,0x3f,0x73,0x0a,0x4c,
 0x3e,0xa3,0x20,0xe7,0xa2,0x7a,0x65,0x7a,0xc3,0x36,0xe7,0xee,
 0x9c,0x9b,0xf4,0x9a,0x5d,0xcb,0x71,0x5b,0xb9,0xb2,0xac,0x2e,
 0x54,0x33,0xbb,0xa6,0x1b,0x2b,0x18,0x6b,0x7d,0x6a,0x53,0x90,
 0x15,0x09,0x6f,0x35,0x1b,0x36,0xdf,0x57,0x94,0x69,0xd5,0x0a,
 0x2f,0x7c,0xa1,0xc6,0x15,0xbd,0x7e,0x28,0x63,0x3e,0x5f,0xae,
 0xfb,
};
const unsigned char tc_K[] = {
 0x03,0xad,0x91,0xb0,0x3f,0x83,0x12,0xfd,0xd6,0xaa,0x19,0x86,
 0xda,0xfc,0x68,0x4a,0xdb,0x2d,0x93,0xa1,0x24,0x8e,0x99,0xa2,
 0x28,0x43,0xc5,0x02,0x39,0x79,0x03,0xb4,0x64,0x76,0x8f,0x57,
 0xd2,0xef,0x19,0xfd,0xa0,0x05,0x42,0xdc,0x76,0x36,0x03,0x1f,
};
const unsigned char tc_ISK_IR[] = {
 0x40,0x7d,0x3e,0x94,0x91,0x61,0x38,0xa8,0xa0,0xcd,0x3b,0x6b,
 0x64,0xcd,0xbd,0x9a,0x66,0x5f,0xd8,0x3e,0x70,0x65,0x08,0x64,
 0x9b,0xc4,0x3b,0x04,0x7b,0x73,0xcf,0x27,0x01,0x7d,0x2c,0xc7,
 0x45,0x33,0xf1,0x8a,0x50,0x75,0xa6,0x74,0x8d,0xe5,0xa0,0x26,
};
const unsigned char tc_ISK_SY[] = {
 0xb2,0xc2,0x8d,0xda,0xd4,0xa7,0x76,0x80,0x46,0x9b,0xd0,0x90,
 0xba,0xd8,0x09,0x8d,0x1c,0x22,0xe7,0x05,0x05,0x53,0xac,0xda,
 0xcd,0x13,0x61,0x4d,0xee,0xd7,0x2b,0xb7,0x82,0x1c,0x50,0xdd,
 0xc4,0xb3,0x0b,0x4b,0x54,0x15,0x1e,0x07,0x07,0x7d,0x19,0x85,
};
const unsigned char tc_sid_out_ir[] = {
 0xad,0x02,0x47,0xe9,0x0c,0x11,0x24,0xce,0x6d,0xa6,0xf6,0x2d,
 0x55,0xda,0xf3,0x0f,0xad,0xa0,0xb0,0x81,0x60,0x16,0x4b,0xb9,
 0x3c,0xcd,0x5a,0x2d,0xf9,0x75,0x0b,0x91,0xa4,0x51,0x71,0x84,
 0x87,0x2e,0x2b,0xcf,0xb4,0xff,0xf8,0x3b,0xba,0xd0,0x23,0x71,
};
const unsigned char tc_sid_out_oc[] = {
 0x4c,0x7b,0x65,0x23,0xae,0x4c,0x7a,0x5d,0xf9,0xd7,0x09,0xb5,
 0x9d,0xd1,0xb0,0x33,0x15,0x20,0x40,0x71,0x53,0x91,0xc7,0xed,
 0x7c,0x60,0xa1,0x2c,0xc3,0xf4,0x0e,0x25,0x1f,0xbd,0xa5,0xb7,
 0x8c,0x63,0xbc,0x46,0x5d,0xac,0x5c,0xa6,0x04,0x6f,0x3f,0xc0,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-21">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjVCMzc3
 #M0FBOTBFOEYyM0M2MTU2M0E0QjY0NUIyNzZDIiwgImciOiAiMDREOTM4RTAwRUFBOE
 #Q0NEZDQUMzM0RENUQxMDQwNEYwQzU3RTBGQjFERkRDQ0EzRkFFNDdBNkExNEJCRTUy
 #QTZBQzgyQTg1NkQ5REUxNEUwMjIzQTFFMUE1QkQzRkIzOEJFOTUxQUY3NDg3MjNGOE
 #Y2NDgzNTIxN0FENUJDMDVBNEZDMEUxRDdDMTdDRjE0QzNCREE5M0QwNUNFRjk2Qjg2
 #NDgzRkM1RjUxNTcwRkMyN0YwQTNDMTlDRDJFQ0UyQTIiLCAieWEiOiAiRUY0MzNERD
 #VBRDE0MkM4NjBFN0NCNjQwMEREMzE1RDM4OEQ1RUM1NDIwQzU1MEU5RDZGMDkwN0Yz
 #NzVEOTg4QkM0RDcwNDgzN0U0MzU2MUM0OTdFN0REOTNFRENEQjlEIiwgIkFEYSI6IC
 #I0MTQ0NjEiLCAiWWEiOiAiMDQzOTczRkFGRjQ5RDg1QjFBMTRGMTE0RDA1NTBBOEVD
 #MEU1REVGQ0M3Mzk5QzJFMTkwMDMyNTFCMUREQjlFNzg2NDg5QjY2QkUzQ0Y4NjAxOD
 #gwQkQ0MjZBOEE1MkY5Njk2ODIyOUQzNTAzMkFDOUNDM0VGNkMxRkQ2N0NFMUY3OTc5
 #QkIxQkU5RjRGRjYzRTM0RkM2REY0MkVCQjQ4MTk4OTU5NkY2M0M2QkQ5ODdGRkZEMj
 #UyN0JERkQ2QjA1RDYiLCAieWIiOiAiNTBCMEUzNkI5NUEyRURGQUE4MzQyQjg0M0RE
 #REM5MEIxNzUzMzBGMjM5OUMxQjM2NTg2REVEREEzQzI1NTk3NUYzMEJFNkE3NTBGOT
 #QwNEZDQ0M2MkE2MzIzQjVFNDcxIiwgIkFEYiI6ICI0MTQ0NjIiLCAiWWIiOiAiMDRB
 #OTRCODBDQzI2NjY3MUEwMEVGNzE5RUUyNDlCREE3OUNCRjY2Nzg4Nzg0NjExRTlDMT
 #g4MzUyQUM3REJGMjNGNzMwQTRDM0VBMzIwRTdBMjdBNjU3QUMzMzZFN0VFOUM5QkY0
 #OUE1RENCNzE1QkI5QjJBQzJFNTQzM0JCQTYxQjJCMTg2QjdENkE1MzkwMTUwOTZGMz
 #UxQjM2REY1Nzk0NjlENTBBMkY3Q0ExQzYxNUJEN0UyODYzM0U1RkFFRkIiLCAiSyI6
 #ICIwM0FEOTFCMDNGODMxMkZERDZBQTE5ODZEQUZDNjg0QURCMkQ5M0ExMjQ4RTk5QT
 #IyODQzQzUwMjM5NzkwM0I0NjQ3NjhGNTdEMkVGMTlGREEwMDU0MkRDNzYzNjAzMUYi
 #LCAiSVNLX0lSIjogIjQwN0QzRTk0OTE2MTM4QThBMENEM0I2QjY0Q0RCRDlBNjY1Rk
 #Q4M0U3MDY1MDg2NDlCQzQzQjA0N0I3M0NGMjcwMTdEMkNDNzQ1MzNGMThBNTA3NUE2
 #NzQ4REU1QTAyNiIsICJJU0tfU1kiOiAiQjJDMjhEREFENEE3NzY4MDQ2OUJEMDkwQk
 #FEODA5OEQxQzIyRTcwNTA1NTNBQ0RBQ0QxMzYxNERFRUQ3MkJCNzgyMUM1MEREQzRC
 #MzBCNEI1NDE1MUUwNzA3N0QxOTg1IiwgInNpZF9vdXRwdXRfaXIiOiAiQUQwMjQ3RT
 #kwQzExMjRDRTZEQTZGNjJENTVEQUYzMEZBREEwQjA4MTYwMTY0QkI5M0NDRDVBMkRG
 #OTc1MEI5MUE0NTE3MTg0ODcyRTJCQ0ZCNEZGRjgzQkJBRDAyMzcxIiwgInNpZF9vdX
 #RwdXRfb2MiOiAiNEM3QjY1MjNBRTRDN0E1REY5RDcwOUI1OUREMUIwMzMxNTIwNDA3
 #MTUzOTFDN0VEN0M2MEExMkNDM0Y0MEUyNTFGQkRBNUI3OEM2M0JDNDY1REFDNUNBNj
 #A0NkYzRkMwIn0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-1">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    X: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f4036e
    G.scalar_mult(s,X) (full coordinates): (length: 97 bytes)
      0465c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f6105873
      3173a033cda76c3e3ea5352b804e67fdbe2e334be8245dad5c8c993e
      63bacf0456478f29b71b6c859f13676f84ff150d2741f028f560584a
      0bdba19a63df62c08949c2fd6d
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 48 bytes)
      65c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f610587331
      73a033cda76c3e3ea5352b804e67fdbe2e334be8
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-3">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    Y_i1: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f40302
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-22">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI2RThBOTlBNUNERDQwOEVBRTk4RTFCOEFFRDI4NkU3Qj
 #EyQURCQkRBQzdGMkM2MjhEOTA2MENFOTJBRTBEOTBCRDU3QTU2NEZEMzUwMEZCQ0NF
 #MzQyNURDOTRCQTBBREUiLCAiWCI6ICIwNDVCNENENTNDNDUwNkNDMDRCQTRDNDRGMj
 #c2MkQ1RDMyQzNFNTVERjI1QjhCQUE1NTcxQjE2NTdBRDk1NzZFRkVBODI1OUYwNjg0
 #REUwNjVBNDcwNTg1QjRCRTg3Njc0OEM3Nzk3MDU0RjNERUZFRjIxQjc3RjgzRDUzQk
 #FDNTdDODlENTJBQTRENkRENTg3MkJEMjgxOTg5QjEzODM1OTY5ODAwOUY4QUMxRjMw
 #MTUzOEJBRENDRTlEOUY0MDM2RSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bGwgY2
 #9vcmRpbmF0ZXMpIjogIjA0NjVDMjhEQjA1RkQ5RjlBOTM2NTFDNUNDMzFFQUU0OUM0
 #RTUyNDZCNDY0ODlCOEY2MTA1ODczMzE3M0EwMzNDREE3NkMzRTNFQTUzNTJCODA0RT
 #Y3RkRCRTJFMzM0QkU4MjQ1REFENUM4Qzk5M0U2M0JBQ0YwNDU2NDc4RjI5QjcxQjZD
 #ODU5RjEzNjc2Rjg0RkYxNTBEMjc0MUYwMjhGNTYwNTg0QTBCREJBMTlBNjNERjYyQz
 #A4OTQ5QzJGRDZEIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29y
 #ZGluYXRlKSI6ICI2NUMyOERCMDVGRDlGOUE5MzY1MUM1Q0MzMUVBRTQ5QzRFNTI0Nk
 #I0NjQ4OUI4RjYxMDU4NzMzMTczQTAzM0NEQTc2QzNFM0VBNTM1MkI4MDRFNjdGREJF
 #MkUzMzRCRTgifSwgIkludmFsaWQgWTEiOiAiMDQ1QjRDRDUzQzQ1MDZDQzA0QkE0Qz
 #Q0RjI3NjJENUQzMkMzRTU1REYyNUI4QkFBNTU3MUIxNjU3QUQ5NTc2RUZFQTgyNTlG
 #MDY4NERFMDY1QTQ3MDU4NUI0QkU4NzY3NDhDNzc5NzA1NEYzREVGRUYyMUI3N0Y4M0
 #Q1M0JBQzU3Qzg5RDUyQUE0RDZERDU4NzJCRDI4MTk4OUIxMzgzNTk2OTgwMDlGOEFD
 #MUYzMDE1MzhCQURDQ0U5RDlGNDAzMDIiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-521-and-hash-sha-512">
        <name>Test vector for CPace using group NIST P-521 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-521">
          <name>Test vectors for calculate_generator with group NIST P-521</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP521_XMD:SHA-512_SSWU_NU_'
    DST = b'CPaceP521_XMD:SHA-512_SSWU_NU__DST'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      1e4350616365503532315f584d443a5348412d3531325f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572107e4b4791d6a8ef019b936c79fb7f
      2c57
    generator g: (length: 133 bytes)
      0400aefb79f4ba40369bbe78a5c873b2ce75be111516deed28c5899a
      8bbf8a96dbd28882afbc1501d8a4e9b25c172dfadcd96d10466f9c36
      d23ea05c982df0bb1e353201c98da6ce14e3c424b6cf55e627c4f3c0
      a4469e2aedaa692f5fe16d57baa8a9432aac320139e854d06bfb4daa
      efc504ff2fe1d2c4f06443878a242a7b876b224040
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-23">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0ODQxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMEI0MjVGNzI2NTcz
 #NzA2RjZFNjQ2NTcyIiwgInNpZCI6ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQj
 #dGMkM1NyIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2lu
 #X2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDM1MzIzMTVGNTg0RDQ0M0E1MzQ4NDEyRD
 #M1MzEzMjVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDU3MDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMTgwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQy
 #NUY3MjY1NzM3MDZGNkU2NDY1NzIxMDdFNEI0NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0
 #YyQzU3IiwgImdlbmVyYXRvciBnIjogIjA0MDBBRUZCNzlGNEJBNDAzNjlCQkU3OEE1
 #Qzg3M0IyQ0U3NUJFMTExNTE2REVFRDI4QzU4OTlBOEJCRjhBOTZEQkQyODg4MkFGQk
 #MxNTAxRDhBNEU5QjI1QzE3MkRGQURDRDk2RDEwNDY2RjlDMzZEMjNFQTA1Qzk4MkRG
 #MEJCMUUzNTMyMDFDOThEQTZDRTE0RTNDNDI0QjZDRjU1RTYyN0M0RjNDMEE0NDY5RT
 #JBRURBQTY5MkY1RkUxNkQ1N0JBQThBOTQzMkFBQzMyMDEzOUU4NTREMDZCRkI0REFB
 #RUZDNTA0RkYyRkUxRDJDNEYwNjQ0Mzg3OEEyNDJBN0I4NzZCMjI0MDQwIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-6">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 66 bytes)
      006367e9c2aeff9f1db19af600cca73343d47cbe446cebbd1ccd783f
      82755a872da86fd0707eb3767c6114f1803deb62d63bdd1e613f67e6
      3e8c141ee5310e3ee819
  Outputs
    Ya: (length: 133 bytes)
      0400493381a239f5c33edc50f92a4ac7dbade7854c2ef090515567a5
      387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf4651e5d4
      cfebf1ebb89ca459a6311801d78c1142bf4eb46df664108bd05e8d97
      9f3bc13ea3e373ce07fd67e457f44927e0123d7566b527eb10ead212
      71d922f373fec78b4a3f4798f8fd52fb97859588de
    Alternative correct value for Ya: (-ya)*g:
    (length: 133 bytes)
      0400493381a239f5c33edc50f92a4ac7dbade7854c2ef090515567a5
      387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf4651e5d4
      cfebf1ebb89ca459a63118002873eebd40b14b92099bef742fa17268
      60c43ec15c1c8c31f802981ba80bb6d81fedc28a994ad814ef152ded
      8e26dd0c8c013874b5c0b8670702ad04687a6a7721
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-6">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 66 bytes)
      009227bf8dc741dacc9422f8bf3c0e96fce9587bc562eaafe0dc5f6f
      82f28594e4a6f98553560c62b75fa4abb198cecbbb86ebd41b0ea025
      4cde78ac68d39a240ae7
  Outputs
    Yb: (length: 133 bytes)
      04012938f18169cf9f37048b973ec9ac06bb15eeb26d370957736775
      e6c5638153f00152fe632215eb22f407dc3a1a2c473f45751b6451bf
      626b781d8db61c537cb4310060575918b0c77f5208b31b89f6fc2cf8
      6bf494a1533a6f282ae0fc550133d51626c35989c01462aabab6dab9
      522cfb6a2ab214570f29560a7cc9619aa3e3341929
    Alternative correct value for Yb: (-yb)*g:
    (length: 133 bytes)
      04012938f18169cf9f37048b973ec9ac06bb15eeb26d370957736775
      e6c5638153f00152fe632215eb22f407dc3a1a2c473f45751b6451bf
      626b781d8db61c537cb431019fa8a6e74f3880adf74ce4760903d307
      940b6b5eacc590d7d51f03aafecc2ae9d93ca6763feb9d5545492546
      add30495d54deba8f0d6a9f583369e655c1ccbe6d6
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-6">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 66 bytes)
      0057f1164b053e75197f7457d56391442efe0e5078fa9df658c6a6d0
      0af69ae3998d55f092ef9da4040bc42945691590496a5d84479439b1
      14d28b02a51ba41b273d
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      0057f1164b053e75197f7457d56391442efe0e5078fa9df658c6a6d0
      0af69ae3998d55f092ef9da4040bc42945691590496a5d84479439b1
      14d28b02a51ba41b273d
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-6">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 278 bytes)
      85010400493381a239f5c33edc50f92a4ac7dbade7854c2ef0905155
      67a5387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf4651
      e5d4cfebf1ebb89ca459a6311801d78c1142bf4eb46df664108bd05e
      8d979f3bc13ea3e373ce07fd67e457f44927e0123d7566b527eb10ea
      d21271d922f373fec78b4a3f4798f8fd52fb97859588de0341446185
      0104012938f18169cf9f37048b973ec9ac06bb15eeb26d3709577367
      75e6c5638153f00152fe632215eb22f407dc3a1a2c473f45751b6451
      bf626b781d8db61c537cb4310060575918b0c77f5208b31b89f6fc2c
      f86bf494a1533a6f282ae0fc550133d51626c35989c01462aabab6da
      b9522cfb6a2ab214570f29560a7cc9619aa3e334192903414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 397 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c57420057f1
      164b053e75197f7457d56391442efe0e5078fa9df658c6a6d00af69a
      e3998d55f092ef9da4040bc42945691590496a5d84479439b114d28b
      02a51ba41b273d85010400493381a239f5c33edc50f92a4ac7dbade7
      854c2ef090515567a5387c331fc9c7fdff4e151801a51ed20514412d
      d9832a0ebf4651e5d4cfebf1ebb89ca459a6311801d78c1142bf4eb4
      6df664108bd05e8d979f3bc13ea3e373ce07fd67e457f44927e0123d
      7566b527eb10ead21271d922f373fec78b4a3f4798f8fd52fb978595
      88de03414461850104012938f18169cf9f37048b973ec9ac06bb15ee
      b26d370957736775e6c5638153f00152fe632215eb22f407dc3a1a2c
      473f45751b6451bf626b781d8db61c537cb4310060575918b0c77f52
      08b31b89f6fc2cf86bf494a1533a6f282ae0fc550133d51626c35989
      c01462aabab6dab9522cfb6a2ab214570f29560a7cc9619aa3e33419
      2903414462
    ISK result: (length: 64 bytes)
      6f8daaedf8843dd9ae3b8376c6dd668f49a127e7d33b8adb37d4ae13
      5e1f09a68db1a03d436aae0cb8efb80a11813dec6924a52a6589b186
      e62e676a8dd777ad
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-6">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 280 bytes)
      6f63850104012938f18169cf9f37048b973ec9ac06bb15eeb26d3709
      57736775e6c5638153f00152fe632215eb22f407dc3a1a2c473f4575
      1b6451bf626b781d8db61c537cb4310060575918b0c77f5208b31b89
      f6fc2cf86bf494a1533a6f282ae0fc550133d51626c35989c01462aa
      bab6dab9522cfb6a2ab214570f29560a7cc9619aa3e3341929034144
      6285010400493381a239f5c33edc50f92a4ac7dbade7854c2ef09051
      5567a5387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf46
      51e5d4cfebf1ebb89ca459a6311801d78c1142bf4eb46df664108bd0
      5e8d979f3bc13ea3e373ce07fd67e457f44927e0123d7566b527eb10
      ead21271d922f373fec78b4a3f4798f8fd52fb97859588de03414461
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 399 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c57420057f1
      164b053e75197f7457d56391442efe0e5078fa9df658c6a6d00af69a
      e3998d55f092ef9da4040bc42945691590496a5d84479439b114d28b
      02a51ba41b273d6f63850104012938f18169cf9f37048b973ec9ac06
      bb15eeb26d370957736775e6c5638153f00152fe632215eb22f407dc
      3a1a2c473f45751b6451bf626b781d8db61c537cb4310060575918b0
      c77f5208b31b89f6fc2cf86bf494a1533a6f282ae0fc550133d51626
      c35989c01462aabab6dab9522cfb6a2ab214570f29560a7cc9619aa3
      e33419290341446285010400493381a239f5c33edc50f92a4ac7dbad
      e7854c2ef090515567a5387c331fc9c7fdff4e151801a51ed2051441
      2dd9832a0ebf4651e5d4cfebf1ebb89ca459a6311801d78c1142bf4e
      b46df664108bd05e8d979f3bc13ea3e373ce07fd67e457f44927e012
      3d7566b527eb10ead21271d922f373fec78b4a3f4798f8fd52fb9785
      9588de03414461
    ISK result: (length: 64 bytes)
      28c311ecace3f42a9cc2ec3cc7b8bcbfd5308d999bb795ae0af7a312
      9b83f36ef011d7186422ed03bf79725cdb1b17d2a995f6db753db6eb
      9438db72bdf23d77
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-6">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      eebbefc008cede41adf4cfb06c5f3d6236aa532a958dd352d4154efa
      bda569ae3afab954380b842cde2c13b4a9750d821634ce763be4c72d
      710fcc8d9f9c79f0
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      3fc7eed0ea9381c98f60bc762c0bc6c73f90bb8fdc85c9826697838b
      76d116f0ee50a5489237b8bc7f30ab32157af2e8d8e6f712f07a3020
      eb112d609061f4f9
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-6">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x04,0x00,0xae,0xfb,0x79,0xf4,0xba,0x40,0x36,0x9b,0xbe,0x78,
 0xa5,0xc8,0x73,0xb2,0xce,0x75,0xbe,0x11,0x15,0x16,0xde,0xed,
 0x28,0xc5,0x89,0x9a,0x8b,0xbf,0x8a,0x96,0xdb,0xd2,0x88,0x82,
 0xaf,0xbc,0x15,0x01,0xd8,0xa4,0xe9,0xb2,0x5c,0x17,0x2d,0xfa,
 0xdc,0xd9,0x6d,0x10,0x46,0x6f,0x9c,0x36,0xd2,0x3e,0xa0,0x5c,
 0x98,0x2d,0xf0,0xbb,0x1e,0x35,0x32,0x01,0xc9,0x8d,0xa6,0xce,
 0x14,0xe3,0xc4,0x24,0xb6,0xcf,0x55,0xe6,0x27,0xc4,0xf3,0xc0,
 0xa4,0x46,0x9e,0x2a,0xed,0xaa,0x69,0x2f,0x5f,0xe1,0x6d,0x57,
 0xba,0xa8,0xa9,0x43,0x2a,0xac,0x32,0x01,0x39,0xe8,0x54,0xd0,
 0x6b,0xfb,0x4d,0xaa,0xef,0xc5,0x04,0xff,0x2f,0xe1,0xd2,0xc4,
 0xf0,0x64,0x43,0x87,0x8a,0x24,0x2a,0x7b,0x87,0x6b,0x22,0x40,
 0x40,
};
const unsigned char tc_ya[] = {
 0x00,0x63,0x67,0xe9,0xc2,0xae,0xff,0x9f,0x1d,0xb1,0x9a,0xf6,
 0x00,0xcc,0xa7,0x33,0x43,0xd4,0x7c,0xbe,0x44,0x6c,0xeb,0xbd,
 0x1c,0xcd,0x78,0x3f,0x82,0x75,0x5a,0x87,0x2d,0xa8,0x6f,0xd0,
 0x70,0x7e,0xb3,0x76,0x7c,0x61,0x14,0xf1,0x80,0x3d,0xeb,0x62,
 0xd6,0x3b,0xdd,0x1e,0x61,0x3f,0x67,0xe6,0x3e,0x8c,0x14,0x1e,
 0xe5,0x31,0x0e,0x3e,0xe8,0x19,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x00,0x49,0x33,0x81,0xa2,0x39,0xf5,0xc3,0x3e,0xdc,0x50,
 0xf9,0x2a,0x4a,0xc7,0xdb,0xad,0xe7,0x85,0x4c,0x2e,0xf0,0x90,
 0x51,0x55,0x67,0xa5,0x38,0x7c,0x33,0x1f,0xc9,0xc7,0xfd,0xff,
 0x4e,0x15,0x18,0x01,0xa5,0x1e,0xd2,0x05,0x14,0x41,0x2d,0xd9,
 0x83,0x2a,0x0e,0xbf,0x46,0x51,0xe5,0xd4,0xcf,0xeb,0xf1,0xeb,
 0xb8,0x9c,0xa4,0x59,0xa6,0x31,0x18,0x01,0xd7,0x8c,0x11,0x42,
 0xbf,0x4e,0xb4,0x6d,0xf6,0x64,0x10,0x8b,0xd0,0x5e,0x8d,0x97,
 0x9f,0x3b,0xc1,0x3e,0xa3,0xe3,0x73,0xce,0x07,0xfd,0x67,0xe4,
 0x57,0xf4,0x49,0x27,0xe0,0x12,0x3d,0x75,0x66,0xb5,0x27,0xeb,
 0x10,0xea,0xd2,0x12,0x71,0xd9,0x22,0xf3,0x73,0xfe,0xc7,0x8b,
 0x4a,0x3f,0x47,0x98,0xf8,0xfd,0x52,0xfb,0x97,0x85,0x95,0x88,
 0xde,
};
const unsigned char tc_yb[] = {
 0x00,0x92,0x27,0xbf,0x8d,0xc7,0x41,0xda,0xcc,0x94,0x22,0xf8,
 0xbf,0x3c,0x0e,0x96,0xfc,0xe9,0x58,0x7b,0xc5,0x62,0xea,0xaf,
 0xe0,0xdc,0x5f,0x6f,0x82,0xf2,0x85,0x94,0xe4,0xa6,0xf9,0x85,
 0x53,0x56,0x0c,0x62,0xb7,0x5f,0xa4,0xab,0xb1,0x98,0xce,0xcb,
 0xbb,0x86,0xeb,0xd4,0x1b,0x0e,0xa0,0x25,0x4c,0xde,0x78,0xac,
 0x68,0xd3,0x9a,0x24,0x0a,0xe7,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x01,0x29,0x38,0xf1,0x81,0x69,0xcf,0x9f,0x37,0x04,0x8b,
 0x97,0x3e,0xc9,0xac,0x06,0xbb,0x15,0xee,0xb2,0x6d,0x37,0x09,
 0x57,0x73,0x67,0x75,0xe6,0xc5,0x63,0x81,0x53,0xf0,0x01,0x52,
 0xfe,0x63,0x22,0x15,0xeb,0x22,0xf4,0x07,0xdc,0x3a,0x1a,0x2c,
 0x47,0x3f,0x45,0x75,0x1b,0x64,0x51,0xbf,0x62,0x6b,0x78,0x1d,
 0x8d,0xb6,0x1c,0x53,0x7c,0xb4,0x31,0x00,0x60,0x57,0x59,0x18,
 0xb0,0xc7,0x7f,0x52,0x08,0xb3,0x1b,0x89,0xf6,0xfc,0x2c,0xf8,
 0x6b,0xf4,0x94,0xa1,0x53,0x3a,0x6f,0x28,0x2a,0xe0,0xfc,0x55,
 0x01,0x33,0xd5,0x16,0x26,0xc3,0x59,0x89,0xc0,0x14,0x62,0xaa,
 0xba,0xb6,0xda,0xb9,0x52,0x2c,0xfb,0x6a,0x2a,0xb2,0x14,0x57,
 0x0f,0x29,0x56,0x0a,0x7c,0xc9,0x61,0x9a,0xa3,0xe3,0x34,0x19,
 0x29,
};
const unsigned char tc_K[] = {
 0x00,0x57,0xf1,0x16,0x4b,0x05,0x3e,0x75,0x19,0x7f,0x74,0x57,
 0xd5,0x63,0x91,0x44,0x2e,0xfe,0x0e,0x50,0x78,0xfa,0x9d,0xf6,
 0x58,0xc6,0xa6,0xd0,0x0a,0xf6,0x9a,0xe3,0x99,0x8d,0x55,0xf0,
 0x92,0xef,0x9d,0xa4,0x04,0x0b,0xc4,0x29,0x45,0x69,0x15,0x90,
 0x49,0x6a,0x5d,0x84,0x47,0x94,0x39,0xb1,0x14,0xd2,0x8b,0x02,
 0xa5,0x1b,0xa4,0x1b,0x27,0x3d,
};
const unsigned char tc_ISK_IR[] = {
 0x6f,0x8d,0xaa,0xed,0xf8,0x84,0x3d,0xd9,0xae,0x3b,0x83,0x76,
 0xc6,0xdd,0x66,0x8f,0x49,0xa1,0x27,0xe7,0xd3,0x3b,0x8a,0xdb,
 0x37,0xd4,0xae,0x13,0x5e,0x1f,0x09,0xa6,0x8d,0xb1,0xa0,0x3d,
 0x43,0x6a,0xae,0x0c,0xb8,0xef,0xb8,0x0a,0x11,0x81,0x3d,0xec,
 0x69,0x24,0xa5,0x2a,0x65,0x89,0xb1,0x86,0xe6,0x2e,0x67,0x6a,
 0x8d,0xd7,0x77,0xad,
};
const unsigned char tc_ISK_SY[] = {
 0x28,0xc3,0x11,0xec,0xac,0xe3,0xf4,0x2a,0x9c,0xc2,0xec,0x3c,
 0xc7,0xb8,0xbc,0xbf,0xd5,0x30,0x8d,0x99,0x9b,0xb7,0x95,0xae,
 0x0a,0xf7,0xa3,0x12,0x9b,0x83,0xf3,0x6e,0xf0,0x11,0xd7,0x18,
 0x64,0x22,0xed,0x03,0xbf,0x79,0x72,0x5c,0xdb,0x1b,0x17,0xd2,
 0xa9,0x95,0xf6,0xdb,0x75,0x3d,0xb6,0xeb,0x94,0x38,0xdb,0x72,
 0xbd,0xf2,0x3d,0x77,
};
const unsigned char tc_sid_out_ir[] = {
 0xee,0xbb,0xef,0xc0,0x08,0xce,0xde,0x41,0xad,0xf4,0xcf,0xb0,
 0x6c,0x5f,0x3d,0x62,0x36,0xaa,0x53,0x2a,0x95,0x8d,0xd3,0x52,
 0xd4,0x15,0x4e,0xfa,0xbd,0xa5,0x69,0xae,0x3a,0xfa,0xb9,0x54,
 0x38,0x0b,0x84,0x2c,0xde,0x2c,0x13,0xb4,0xa9,0x75,0x0d,0x82,
 0x16,0x34,0xce,0x76,0x3b,0xe4,0xc7,0x2d,0x71,0x0f,0xcc,0x8d,
 0x9f,0x9c,0x79,0xf0,
};
const unsigned char tc_sid_out_oc[] = {
 0x3f,0xc7,0xee,0xd0,0xea,0x93,0x81,0xc9,0x8f,0x60,0xbc,0x76,
 0x2c,0x0b,0xc6,0xc7,0x3f,0x90,0xbb,0x8f,0xdc,0x85,0xc9,0x82,
 0x66,0x97,0x83,0x8b,0x76,0xd1,0x16,0xf0,0xee,0x50,0xa5,0x48,
 0x92,0x37,0xb8,0xbc,0x7f,0x30,0xab,0x32,0x15,0x7a,0xf2,0xe8,
 0xd8,0xe6,0xf7,0x12,0xf0,0x7a,0x30,0x20,0xeb,0x11,0x2d,0x60,
 0x90,0x61,0xf4,0xf9,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-24">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0
 #NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImciOiAiMDQwMEFFRkI3OUY0Qk
 #E0MDM2OUJCRTc4QTVDODczQjJDRTc1QkUxMTE1MTZERUVEMjhDNTg5OUE4QkJGOEE5
 #NkRCRDI4ODgyQUZCQzE1MDFEOEE0RTlCMjVDMTcyREZBRENEOTZEMTA0NjZGOUMzNk
 #QyM0VBMDVDOTgyREYwQkIxRTM1MzIwMUM5OERBNkNFMTRFM0M0MjRCNkNGNTVFNjI3
 #QzRGM0MwQTQ0NjlFMkFFREFBNjkyRjVGRTE2RDU3QkFBOEE5NDMyQUFDMzIwMTM5RT
 #g1NEQwNkJGQjREQUFFRkM1MDRGRjJGRTFEMkM0RjA2NDQzODc4QTI0MkE3Qjg3NkIy
 #MjQwNDAiLCAieWEiOiAiMDA2MzY3RTlDMkFFRkY5RjFEQjE5QUY2MDBDQ0E3MzM0M0
 #Q0N0NCRTQ0NkNFQkJEMUNDRDc4M0Y4Mjc1NUE4NzJEQTg2RkQwNzA3RUIzNzY3QzYx
 #MTRGMTgwM0RFQjYyRDYzQkREMUU2MTNGNjdFNjNFOEMxNDFFRTUzMTBFM0VFODE5Ii
 #wgIkFEYSI6ICI0MTQ0NjEiLCAiWWEiOiAiMDQwMDQ5MzM4MUEyMzlGNUMzM0VEQzUw
 #RjkyQTRBQzdEQkFERTc4NTRDMkVGMDkwNTE1NTY3QTUzODdDMzMxRkM5QzdGREZGNE
 #UxNTE4MDFBNTFFRDIwNTE0NDEyREQ5ODMyQTBFQkY0NjUxRTVENENGRUJGMUVCQjg5
 #Q0E0NTlBNjMxMTgwMUQ3OEMxMTQyQkY0RUI0NkRGNjY0MTA4QkQwNUU4RDk3OUYzQk
 #MxM0VBM0UzNzNDRTA3RkQ2N0U0NTdGNDQ5MjdFMDEyM0Q3NTY2QjUyN0VCMTBFQUQy
 #MTI3MUQ5MjJGMzczRkVDNzhCNEEzRjQ3OThGOEZENTJGQjk3ODU5NTg4REUiLCAieW
 #IiOiAiMDA5MjI3QkY4REM3NDFEQUNDOTQyMkY4QkYzQzBFOTZGQ0U5NTg3QkM1NjJF
 #QUFGRTBEQzVGNkY4MkYyODU5NEU0QTZGOTg1NTM1NjBDNjJCNzVGQTRBQkIxOThDRU
 #NCQkI4NkVCRDQxQjBFQTAyNTRDREU3OEFDNjhEMzlBMjQwQUU3IiwgIkFEYiI6ICI0
 #MTQ0NjIiLCAiWWIiOiAiMDQwMTI5MzhGMTgxNjlDRjlGMzcwNDhCOTczRUM5QUMwNk
 #JCMTVFRUIyNkQzNzA5NTc3MzY3NzVFNkM1NjM4MTUzRjAwMTUyRkU2MzIyMTVFQjIy
 #RjQwN0RDM0ExQTJDNDczRjQ1NzUxQjY0NTFCRjYyNkI3ODFEOERCNjFDNTM3Q0I0Mz
 #EwMDYwNTc1OTE4QjBDNzdGNTIwOEIzMUI4OUY2RkMyQ0Y4NkJGNDk0QTE1MzNBNkYy
 #ODJBRTBGQzU1MDEzM0Q1MTYyNkMzNTk4OUMwMTQ2MkFBQkFCNkRBQjk1MjJDRkI2QT
 #JBQjIxNDU3MEYyOTU2MEE3Q0M5NjE5QUEzRTMzNDE5MjkiLCAiSyI6ICIwMDU3RjEx
 #NjRCMDUzRTc1MTk3Rjc0NTdENTYzOTE0NDJFRkUwRTUwNzhGQTlERjY1OEM2QTZEMD
 #BBRjY5QUUzOTk4RDU1RjA5MkVGOURBNDA0MEJDNDI5NDU2OTE1OTA0OTZBNUQ4NDQ3
 #OTQzOUIxMTREMjhCMDJBNTFCQTQxQjI3M0QiLCAiSVNLX0lSIjogIjZGOERBQUVERj
 #g4NDNERDlBRTNCODM3NkM2REQ2NjhGNDlBMTI3RTdEMzNCOEFEQjM3RDRBRTEzNUUx
 #RjA5QTY4REIxQTAzRDQzNkFBRTBDQjhFRkI4MEExMTgxM0RFQzY5MjRBNTJBNjU4OU
 #IxODZFNjJFNjc2QThERDc3N0FEIiwgIklTS19TWSI6ICIyOEMzMTFFQ0FDRTNGNDJB
 #OUNDMkVDM0NDN0I4QkNCRkQ1MzA4RDk5OUJCNzk1QUUwQUY3QTMxMjlCODNGMzZFRj
 #AxMUQ3MTg2NDIyRUQwM0JGNzk3MjVDREIxQjE3RDJBOTk1RjZEQjc1M0RCNkVCOTQz
 #OERCNzJCREYyM0Q3NyIsICJzaWRfb3V0cHV0X2lyIjogIkVFQkJFRkMwMDhDRURFND
 #FBREY0Q0ZCMDZDNUYzRDYyMzZBQTUzMkE5NThERDM1MkQ0MTU0RUZBQkRBNTY5QUUz
 #QUZBQjk1NDM4MEI4NDJDREUyQzEzQjRBOTc1MEQ4MjE2MzRDRTc2M0JFNEM3MkQ3MT
 #BGQ0M4RDlGOUM3OUYwIiwgInNpZF9vdXRwdXRfb2MiOiAiM0ZDN0VFRDBFQTkzODFD
 #OThGNjBCQzc2MkMwQkM2QzczRjkwQkI4RkRDODVDOTgyNjY5NzgzOEI3NkQxMTZGME
 #VFNTBBNTQ4OTIzN0I4QkM3RjMwQUIzMjE1N0FGMkU4RDhFNkY3MTJGMDdBMzAyMEVC
 #MTEyRDYwOTA2MUY0RjkifQ==
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-2">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    X: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfab9
    G.scalar_mult(s,X) (full coordinates): (length: 133 bytes)
      040122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7
      c73cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517c
      df6d99a8a2d6db19ef27bd0055af9e8ddcf337ce0a7c22a9c8099bc4
      a44faeded1eb72effd26e4f322217b67d60b944b267b3df5046078fd
      577f1785728f49b241fd5e8c83223a994a2d219281
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 66 bytes)
      0122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7c7
      3cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517cdf
      6d99a8a2d6db19ef27bd
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-4">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    Y_i1: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfaf9
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-25">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICIwMTgyREQ3OTI1RjE3NTM0MTlFNEJGODM0Mjk3NjNBQ0
 #QzN0Q2NDAwMENENUExNzVFREY1M0ExNTg3REQ5ODZCQzk1QUNDMTUwNjk5MTcwMkI2
 #QkExQTlFRTI0NThGRUU4RUZDMDAxOThDRjAwODhDNDgwOTY1RUY2NUZGMjA0OEI4NT
 #YiLCAiWCI6ICIwNDAwREM1MDc4QjI0QzRBRjE2MjBDQzEwRkJFQ0M2Q0Q4Q0YxQ0FC
 #MEIwMTFFRkI3M0M3ODJGMjI2REMyMUM3Q0E3RUI0MDZCRTc0QTY5RUNCQTVCNEE4N0
 #MwN0NGQzZFNjg3QjRCRUNBOUE2RURBQzk1OTQwQTNCNDEyMDU3M0IyNkE4MDAwNUU2
 #OTc4MzNCMEJBMjg1RkNFN0IzRjFGMjUyNDMwMDg4NjBCOEYxREU3MTBBMERDQzA1Qj
 #BEMjAzNDFFRkU5MEVCMkJDQ0EyNjc5N0MyRDg1QUU2Q0E3NEMwMDY5NkNCMUIxM0U0
 #MEJEQTE1QjI3OTY0RDc2NzA1NzY2NDdCRkFCOSIsICJHLnNjYWxhcl9tdWx0KHMsWC
 #kgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0MDEyMkY4OENFNzNFQzVBQTJEMUM4QzVE
 #MDQxNDg3NjBDM0Q5N0JBODdEQUExMEQ4Q0I4QkI3QzczQ0Y2RTk1MUZDOTIyNzIxQk
 #YxNDM3OTk1Q0ZCMTNFMTMyQTc4QkVCODYzODlFNjBEMzUxN0NERjZEOTlBOEEyRDZE
 #QjE5RUYyN0JEMDA1NUFGOUU4RERDRjMzN0NFMEE3QzIyQTlDODA5OUJDNEE0NEZBRU
 #RFRDFFQjcyRUZGRDI2RTRGMzIyMjE3QjY3RDYwQjk0NEIyNjdCM0RGNTA0NjA3OEZE
 #NTc3RjE3ODU3MjhGNDlCMjQxRkQ1RThDODMyMjNBOTk0QTJEMjE5MjgxIiwgIkcuc2
 #NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29yZGluYXRlKSI6ICIwMTIyRjg4
 #Q0U3M0VDNUFBMkQxQzhDNUQwNDE0ODc2MEMzRDk3QkE4N0RBQTEwRDhDQjhCQjdDNz
 #NDRjZFOTUxRkM5MjI3MjFCRjE0Mzc5OTVDRkIxM0UxMzJBNzhCRUI4NjM4OUU2MEQz
 #NTE3Q0RGNkQ5OUE4QTJENkRCMTlFRjI3QkQifSwgIkludmFsaWQgWTEiOiAiMDQwME
 #RDNTA3OEIyNEM0QUYxNjIwQ0MxMEZCRUNDNkNEOENGMUNBQjBCMDExRUZCNzNDNzgy
 #RjIyNkRDMjFDN0NBN0VCNDA2QkU3NEE2OUVDQkE1QjRBODdDMDdDRkM2RTY4N0I0Qk
 #VDQTlBNkVEQUM5NTk0MEEzQjQxMjA1NzNCMjZBODAwMDVFNjk3ODMzQjBCQTI4NUZD
 #RTdCM0YxRjI1MjQzMDA4ODYwQjhGMURFNzEwQTBEQ0MwNUIwRDIwMzQxRUZFOTBFQj
 #JCQ0NBMjY3OTdDMkQ4NUFFNkNBNzRDMDA2OTZDQjFCMTNFNDBCREExNUIyNzk2NEQ3
 #NjcwNTc2NjQ3QkZBRjkiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
NRs+ZeNV/9QpmLtaqzfUTIf4E0xd3z13LWcki5BGbvaaDHbk5v/PMJ432ZiB
iieQ9Uv0r8USiP6Hl5/fWeEFDNIV7IOOPnmv4J3dWn3mgfidfXTtz0f1YSz4
BF1O8qOG1TPw6nAqDAngbE/g3MVyJX1gJTCkny6lyY4mvp1bzZNgNcufwSAn
a7DrN+7nI+uzM90g22BAhNhGruLcT8RQxI0Xpyeb4O30WLITcmOnL4MgsKHc
psbgN8uYQgfdTXSIe+gQ1oHtaKXBWxjk3bU3B2dyNn0ITtp3PoZr4BVwMfVZ
j9iZ6MFGL7ZWA4OokIyKYBw6OfA90vfKj85/T3KhN7deLAMW/otkwMJ/Xgaw
qM9KgnJWDrxcEHxvjVmGhKX9emFQyyueYtYvFhMF8/9agdDYmv//Fwr/GUKh
ffMbhQKr2WeZH/19EXnYZtMeDgLgm48wNvd0WX13578dRZ7TxygDCgBnx4ps
/XPk51gGHr6cDm5ARHW0INrWqrr4/UbBjb6HQbJSK2skgHzQLpnvylRaWvOd
uc9AlH4XuZycTf0Qr1bTsEtXSOx7ZboJKXUeBP8n69n+372/x+CU/dVs/Skm
no9TZ3Af3/pzs/SqVfpHychOcHGsbqHYX+fHX19RfvSN+Xd4Zt8rcSU2Drz+
h3zmB7M3mWPxHNaNrOeUbaajTfIB9BqxUvt/mNl0Hw/+9wP7H+b/fGPu23/9
K63zf7RKpQM7t8MCYPDrYsVqU8ykz25KDPnjj5WbRTzf/7t/vdzfX2PKD0BX
ojxhFO0IoZjPgzalArxCeUK1cM7OFD2l1/UHsRpdtYZw6WBV8vMaq0P4OIAs
kv8iTsepS8bSU/5Gxn3NUhUBCJRXcPV0FU6nzv6J5ob+gHfI07V+ckpYklqc
oz13uJxQadpr86RMR0vppAJdylamE81l8wRI5vRk3/mnU69jnKqdgtOnW7JO
KhNw/dNPi1LFEtpfQO/x7QX7J/vwegnG3z/AH0r5wAMu74s6FJOBILx+Utl6
PMbbda74kX2eqGBQWvcCu18IZ1P/I8iJX858i1v98xtTOOOI7LQ1Ip19SFf3
hcvvAs7D60cP+OKstGKUoh1Gpp+Vanj4BSDr8I202YNNX94c2IzQgE7U0WLS
E0xUtkEXvro5SluKo2RS92W/JSo06OAkX9qxzt1p426dueLQqahilSXv5mEx
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
TUQDNAIifWCjMyZ0c8TEJ3g1ddTkCVL4mXkysnl4opJ0QowTgpLEnX3CRVLH
iT7AT7jRNK57E5FFwqT6Pvk/+TXdlgZsoqaJQEnqJAF3CcOe+ELIj593x7tc
FfREmbhMCIFL8cATAUREyhPQv5jHPJswz+PcXkLJEtVCkeDskROGHCwFKME2
ZewIiYebPS6VHkF4/clpPztfBOHmCdhNsN6oXZ9A2MRrQDLojnqX0o+aopGw
uxTBBBQuZueL6utkWQrj5NgEspaR8YHg3EPqMwUvxbJMCU8/68R3OBvI/yhq
TGIYyhOgOxJQUGpTc7ciJVAMJ/qtSzQL1JnIVkBDQF5OlvGx9VMTDd87cxSd
J6376cYT4wPBjtmz6u73eRNiPwhSPqaG8dmOBMyONEWkj55oarLoVDRyxP9A
AGeaQihYKMGKNHFQPrGJB0TGaYdPMGNoQDYHJSmuRzaERCVAoUYQZTMBzsmd
iMqJIMwU0mr2LgrKTM0dIcoEkQJjjMNAGZXGIktkIJGGhc/NJ3y6TGwSlECL
+GwiPCHwdSQqejYD3OdNIOYMCiBKSOQhlH+z5AbkpJYYnSjrEFXJxD6Sz55M
mZgA/tQP4uyhkIxYcD9bLg5SjANKoBQxZD6akEJiYiAsOLFHiER8RROb9nfq
BDlfTfB3+joRg0SGDIpBNneJAnqM+Yvg5j5VISpFkNgzEZDvEIUPm20xt5yQ
/xRhxPjy7Nz5GG8CNZQ8OBJ6JR+jR8UZj8yefTvh1iPrREw/MjEDkc0oL0ey
sMQ/QYNCbkr+Swl5uppGiYgHyAjR5cTsWZGTgRyimC0R+Xyi2ckHeHoYMRnR
TB7rm5TViPOJCEOIZi1EXyWiJZoiyGuJn4g4Nqh4kWQVouGhq6kwo9kxtjwy
9KRweN7TH+NN4Kn6MYlSiUgGKLfRT1TZUY3F06Q6sQ/Q1G/SDKXS1DYk6xHv
CTk/3ZF4I6a6lnw38rpR3qRIo5ydWKsocVMupSGn4mxKT5FvJJ/dJPbBfjtx
SRDnGTE1UNjS5BY9wOxnHCrUIlcRJXFyIqJjoLmJGC1sGveJioccBm9Hkxql
5VH85ngTwhJfRdMJqNe+jY68CfXm+LbdnB8iWr3b9qqZJN82/W2LAnMbfGq1
a/t+15WovtPedNC5mt6dh6O6Olb1uuIkaV7iO9LLsmE9QpQnXaCJ9OCkIjD/
BjuyWKx6RBRvdb3pVdufHq3WiGEFu1XdUVdVvOtPDuktPb6gjJB5EpHvWx5B
22fXqzUCcQ9eZCxAZD6+QS3PD9u+ZqtygWDc3ao8L+vdlnWoNoladgw7iy06
rVoGpt/UMATwqA3cEm1Sc5QE6crFsqPbnByuoN/N7V26ATyAWN80W4RHt7Je
k2zIrtmcVKuSDNvguc0NntOEVuwuYCAvl2A2vSpb0eBBwx2+Ot0y7Bye3QNb
HUKL73AF4Ojc6eeHXAE1AzuhzMym0s2aNF9KGKHrjt5Od0fNpoFW0+jUmwuB
APZVebyrt8docfDEGlrWLfHJMMjQmgZdka8O7wL9L9Aums7s0YlK6GtYgJ8s
mqqV3eYC8e+sxRe3m56365Mj6MCi3VV4EHEHo6dr+H5dnh61u60i3oRQriq0
8nTy+AOU/rFY9Xi4+QQavzxs8B36Gk8tLKFjZwI7WeMp0+Vht25vUQpxhUdF
t+fLtl8iRwJ0qALzXuhm25XgxbLd1IiTB6fHw61gq3WtwRA0Oj18sPbQQHyB
D53YHcOlYDbWLdp1C96Jr9FhUPte1RUYdFvdQiAopGdYrQ+uKYpbuQfqJ5Q+
b8r2ZoXnOHdL6AjYpGrBhMujDgNh7fFU6m1TQTKoKori9QVrwC9qhqKneF6g
AQc6X4DH4uHd6259WmGMQPQyJMJoevTWNp68ZFPsXEITsZ8HN922Bh/Yqm5L
Zxqhc1cLCL0b6ELVra+O0LPxEXUPHr1r5RS6eKLyLlA/ofS3qDQJMVMiaQrk
GeRb2V0tmg0yORxoPHeCkjtIvEI28bxDtP36GMIuHHY9ymr2rN14BcFwjaQY
EdiPI1WBWSElISZ+Ddf1MNhVS2wFkKm6cguRuQRPPYd8EsCclzA6SJ5S7RCR
j3qy0MGbrmqqbruE2AFv3U1DggKfd4H6e5R+vcazA1tWgwOs1uD25VZCC3dw
O3CGC4h68NoKyURaQX4CyXGNrA3gByhLiwO48bd4xLpG7oBIxyDBDUsYGYXS
tau+KyGNc4x2ip2rI0zRzebstqbzEjVy0UByhFts4WmYKPBAd4+nPC5uoPOy
Q7cjkdTjR1H6CHm9gzb733fgZv+0Vz+GeCT052/uvIJ+5oVv7gMbWK5HmxuU
ddbCM5FrYzNvWHBu9JwNWVDMDrYIopCDYnlIZ+j8qGVhWdye/+G5o25e+swV
Xo2yYGzI7TBmRaaY0E4NITcuaGM4zwclcq+4CyoPRqbXBlo5ZTWP76CO7iKQ
/uvnb6Oe4H/98Pvn3mznnstM6XHIDbMqK8YMmmTc4HJZFINGJRzFdOAW1bYD
z/PCw5fl/Eo4HzOXsekN8dEjEKgfvsTD965w/NPdwX7gDxNKefk3AkuDw/wy
u87PD7/3X7ff/uH3EWF9h4nhH8Pf/wFX/vRLfHc3wbMnfoak2nj0h+M//O57
BGBPRx/O/vdffuQIssYfBJE03IVmz2dL4HYRiv0hWJsaQdDuP3x5/z2Dlj/n
wu7TufAZ2uZ/4tvA42ee+IkO8z7ps9jh39M7yUc/E/Gz4099vvT7iDiCKfOP
P//o4/kwiaQ23foA5jgoMXZbyPVQEK5Pyro8ls0az+9D6qy6w5awQCXk8mWz
bWHWWC4pEW8udlAbXDesVasKCpo1JOT1AY94oSgtjQVhuyNZOUbMKyivCLdh
yFaF1EPtNdSFh6hvjJwvVLGtqxs83IcTV1NC+VFC8VMiYAHKc6qhoZTob9pY
H/7xzz9Bpv/+5tJfmV/C9zfsT3+sf5718f60vPj7n76bOruroF5ssRSXpNSH
VFNnOE1C5V7rdgut2EHhgow85RLKSuhY3960fbfE2hKmTAmdwMuh0+GITusd
C+xMrEr8r140l+5oefuD4Nz9sRvDX881tub7w+mcLatRtpOBuZcN0s2s26hy
eSaobu4RfeRhIr9cQpGLZFkMKZjqfgmlxJnuSljC7GAR0KNaNZIjwbpjc3Dd
fYfICvMAejgxorUbKHC2SC3UYWGMwncSFwYNlKlNeQAroWMo1VuySX+CkzWy
W0ks+rB6r/F3Zaio4thgadGBjyzLh6BBLJTxfOmPn+t8aZLbex1cBKYoO35i
3ev5nl9Q+1o8BhUpp3b83yaCHfYHIfB1K/yXZ9mTcthvRVq8Mrf/e1z+JUWw
Hxym4PelfQob+KCMMVoVdjR43lRbI/woMw8lROFyzbn2uZOF1CYEp7TNpUpi
d/B7nuUSQRrWejaEMbPWZlk2mlHhcVYGl4fCmcEGOUjHhNRhmF+dKyaFz4wW
1ksJRYmyI1OsgHrBMjCCKuDBYYCWCaNRmsSCQVyeFKwHMehhLKRwnKMwjS2y
EQyp1WD1yEdjHFw15EOmg0T1DluMRroxewU85b4ooFO5gzp1kKIYrBklL7yF
J9kR7u0LWUC1ZXXhggN/h2oo85l1qsjSMUgovhyX0AwnGQ8heGt44Bo1JTnL
At6Au5Fr6JGDH2EcjfT58PngLF9Gyrr+8Vkp64Y2gc52+Pdmg4yB7W714sYh
7sMRsOZjCFeRbZWII19DuPoYjGXGsCCw5pUwlkX1IYwFt7N6NESE+JyhyjXD
WmBVkvr1feSQ/OpBJF9xS9YXT7jSy35EcGxypZu63LvP63zn8tKLiwuPsKfT
HRbC0RcuF4hYbsot1NU9ssQerda4O3rB2zWics9wD5u320ohkpc2nHdEiQv+
sYNFQNUhEKtHH2mhbsR9JoihHfJuLnEnsERKTyhFF22PsXV+tMJ9pd3ZLVGd
HiCApFpVx7qDKhaq1l27Obitd3AJ7ski5HoHtlmfLHCHresr1VS4MY1Mu1D5
T1SnJe7y4e73CVzWwhrjGC5BjsnTBSKDcLcLzHfbrU9hUXGBm67wWORxRfpg
JKeNrwDWyE17elT3Z3rVI4VlA+sQIiveEU0jq2A1sEWAvIgmPf31TJjtOVS3
qE2Na6B78tQIPmo3sGBiuBt6Cbe/ghobTMlwi+50AYsLjqiiend5CI9eUGa7
RN5eFJkHc/YCFkcLuI1C/FK7PS/bTbVD4sx2U1/XfQfmx22qJe6IwcILbLY+
EETOC2utLVKbQpCvT5awdIMnVNcNItxZLbvv/qXa1FIGnfGRSz8iMY4VufGS
DYUPQ2E0z2Eyw2lXFkYU3KAEshRBF/N5Z7iOqUzYYnAs5HIM1sBEpZk2yg2j
5gY1lA1MwXwsMqgFRm9D5vnwHKbngTY1EjzZMELxE4owDiqzg8p9gElFZ875
YIOBmbfQXARpoGTJNNQwbq4JlEMB7aACh4rKoFwezq5B5wP86DgrmEAZvsLp
oJCQyWcKn6f/ddrUQgvpoa1jVoxWOAGVlDAKxkGaAcowZLRiWhfWBa5yLmxe
iGLk+9JCD0FAqZDng3AhKF4YoxTTo+NO5w5MZm0IUCOiyJmAIs2EgismnsMM
PWjikAk8N8ucV5nMobYaTQ5FjHeMa644lkYC/qOs8yi0xi00Rtj5zK0ZB1h5
2UErWAVIP6gBTM8LkYWA1F6jGwcnMmlykVswhhyLEeoiYb+INvUAFTWD6pTl
YEhYueQDFLQeilWeQZnuOVd2GLJBcAueFyBqBgN9djMEy0hWQO0qikyM0K8B
wslDGAzaa6GMzYUKBu5RZGwUYBznMo9cUuF1mKSvpbFfgTb1u9JCQom8Ly3M
qxy9l9N8SyjMT78TEW8JhXmz9E5EvApEMW9CPJB1zZ8CT9xfs39KqWp+/7A2
f/m5j0m9JpTK3aWuLF4bEems94eB8dqImJfb9wLjtX45D+WDWet1fjmH74NZ
63V+OT/9mUz9nF/OpnsmU78dxpGN0maZH6DR3NkAhUiAUiND7AbYIHO5hLWw
y7iFKgTZ7ziH6XEoEvwEFt0+yxiHhTY4SpHlo3IiOJgDmceZTzLDBUx4gRAo
xo5ikNbJucgoskJYGHieF4EH8WWBW0+JVr85xc0D+wZXuutDcx54gyvd9aH5
8je40l0fmt9aPedKX0WKe1nD+j4K9LeU4l7rm3NkPVqcv+ybc6X5aHH+sm/O
7zBfKEif8s257y8UpO9AqxnGhZPM5RZqchb4ADbNuc6DzcB62iGNjhsVKhYr
PeRQrHMr7JyyoZsCVgFcKj0aD40fHSoxQyK0Cv6fs2Dg/5Axcwk9ge557guX
zRBBHpQcnRzcEKQtivHrRasZBw01sNoRzgTGgs1Zobg0wo1gwFEG5rnzMApF
kXEm2JgXBaT6eRscHGHAbd8xG1QoNESLgi6Dsw2ZBH82uENuBm7Ak+0gZMgV
jPCY9vClUzxjzFHM2Ok19edCq4UxjNwEJ3Jn4D/YJ6MkRLCFFZ/GXeNMDRKi
1gWYy0aNEvAmUynZi0F46CnEPJ6jgOuywjKFCu9OaJjokAx2sIPPYXaEZaRl
ML+xRMllBpNZbiyyQvkg/oNW++2oWRN6I5/OfU8nimWSV7Z0Kp4OSSdxXjKS
niAJSbSaoCB0Dt0lGWw6Hx3VgZOILWFJhqjGSIJ9dNabwE0EfSuS/CJBdWQS
6SPVZoLrhbAHmFED6Xg3ie8RYISACXQCnKA6+0bRQe+R7+1F+AM6ok+wB4JV
8IRjyJ/VAr2LlKMz4BFsx7+dBKjpFtQRlvQooyYk2ZmO/8fj5j5hVwhpEs/c
0zVJk5XkgEkgjw6WUxuHKIlKLY8irQQnITG8SYhvwjvQ6fQol51AT3LcI1JM
6jcFHCE5CKcYpTEJI0CGpzE28bZ0WD1Jj5PbEy6GukwapASm5M8a8eNRenS4
XczeE5KeLQEQKEoIyKAmRcgJPzFpqBIIheAdBIsiGViySEg4FfJhMgEpa1Lv
Z2hJNjs6oQEI1BTVcJOYOOGD6NMs3XHSEadR3zto1KZNcpgEHeRJhFfsdbij
z7iEPvIJXRf1LxMmA/r1SoQgQWEo8/jUSorsIuGQIm4kiTyTx/iYGaM6JAET
5OwJFLtRMTaBQ11SJiVRTTEBRYrZqSlqYg6YNEpnwUtCZyUEEt0nTBqVFDVm
9puIUUvgElLPpGGJMU5DRWaP7kvQLEJBREVJO1sgJK1P9mz+/mh0ImmHEpSD
IGp6r2FL9yFHJuXc8dtJWTifdDXJhUjvmM8OSg1wCaJKWBCyg0ry1FE4Nzog
YVLItgTmoUxKIBOysk4BEzWXKWeQiwx7RVlCudFjCTVC3hyS2rlI2D5CRpJT
TjgVmj5pKqA8TDemPDKmBI7+8Spk5JCwUGRDm+RGCbcUs7Kcu0rIa4I+hWiF
IeH2aAIhwBe13ibJXLIHWSskD5pUTgm7ZtIIkPEJSM4SNIiuplRB9oh2izaM
4ut+vgXdjABBZBSKZMIWiiTnS0gpVexhkAQddgkSR85OUw3NGOOz2Nr7qEyq
Xwh6TiUGqcsSGo1sFJHqNG7m2wl3J6bKJAUTOQTBjLIkEB5nWgLs8dnP6K9R
KVfugesE6KN0HZXH/dwPymxZAoNGjPwQzZwgV4RQoxGg5DkkTKDfJwQyOBmS
RmUCTSW4J3kMwX0JNhqVfSl4aIJPauQ0oco7DkRZjPJ8eDb2H6AyCQvN5+dT
VUCIPZvSGVUPhK+LQzoJDSeQHSEHaTIhV6dhoi9RUUdGoepgTPLLQ0R70Tep
eqCUHisgyj3kxZTQqbagGpSQZJOUMBmNgnsvh5wIDqjlUdw6CdVHUfhJSpzi
Jp9HkDyGMviYZHypBswSFFglaKIc9rrG5IBE5FA8iz1+DJUZYZjjPNgyRblL
0FRqN0UfhTIluRlkR4ZlsxfRrEfXUPKgYIxpjBpHAEeaw9kexVskMD89J+b4
lGyHpMdMEE7yOx2vpo9U6j9PQOpIKUBea2Y3DelTHltOCSkyNVDapWerb6eg
ozFkCZ9JXaagY7HSZAknG5Phq8Cwd1GZETc9fjsVmxSmVBKT2QmiGNtACczM
Qz8Me2aMWGzo2ffIupS9CclpEq8C3ZtS66j3CHhC4BPsWyUGDrIE5TqK+Zj2
5XzbSfA+Cq+Te7PZs8c9YjaBNAk3SXrUNEaTBDnBOWP6muqm6T7k3hGwruah
ouZRMJpYIVG9s18Sit8eKvPdatYPj2wQYuj5UxsvH9mIRzKePbXx8pGNb+6p
We9q1nJUCEAEGSHN4Lb1xiPe77pbo05uj0i7m2Z3CkbAUzIXO8L9bVG0WHf9
yYI0Tste4fH3dnfAms0JIlgP66qVNUOs15aRnnLZ66Y6QY3YmxXaBI/A1xqP
LqFid7M9rTrsa99C/5fLV6tZk57DoqtQWjpUK0ShruEWfc8a1lSkMb0+PyRp
3b4Fh9hyJLutt+1uhed0yE94iwfxUbR1g5LcCEEDd9psYbRIwZpMC52UKFoL
I3WDkt0ojA0dU+3mlBCIVc1W64BitdSiicV6VrO+bdbHYB/EAIKXIh4QoXKk
J71FtCKv0bBXYJ5aoFYDSgyDXyxaVOItPTS4kqvyWHWbSrTrC44iFe0uLBv4
t96eoLbzDQyLpuNMiCw4R0QdihiLdnuyaMFnGsRDlCgri3+vdVde3OAB/Veq
Wddb0mAHt0Kl4ho+B5cC30FR8A6fz1CGCBVIlocINyDcH5q1Q9Xqw2a93dU9
nvuHfq+3CCMEm8DIoQfvPLhis2yqnrWkdH0s4JaL2JJbhJCCTRDYqyFSZYuh
t2uOVtUZYhxu2+/ugFy3p8u6Au/F42AlohBbHnnH4cmVQJ+AyLwhbe2+vqnX
3QIFjjvUWu/hZ+hIjVDUdcXBfrerdX0NbrrrsCUIUDw5wkZ2fb2Dp4DndmAP
VCFGTKi/Rc3kGoUryrPrDtWLGWpjgFejpMa2fVTNeoNq1tCybbNE89YQU+DV
EsXVwUsF4UkrxEacI36E14gLOT2EqF2sehST9wJyC3To8ihK3UNeYTWkqYMb
zCOoDwOtkahZX2+7w259AqHZ0AE8PKO2O9DI+L5CTCRhiY9125+hOjOkoKZC
+W5wvR3ZbHdZ1eB2j6tZE1s13ALsgiMELrheVAS3ZWcodQ8+Ap7LwA2xgxsv
IU3BwJ8cEWYW8ivqZ/eQvdaYU1AAHM/0nd2gYHy3uSrRXzqEZ5eQLLc9Klrj
v7JGk9MJWE1mQoVvGJlVf17WCOCEXIvYUEhFhzU7RQTrrkVc6I8vqFlfHeIl
yPSNJkPkLvjFAlXRIZ/uwF6H3QY7fLaDHAOPOilRn57yyQVMVwe3NaSkVXlx
2+JxWXZ2g44OXolzDoPQ4wS9RbnyHcwKqEW/WxzVmHOqiNrpMU/Wu1W1BL/A
jkFm60+OYM7Z0Wy3ObjGW3fr7Q0mzRfUrBEnDblDQ/a6haQA9gFfoAZDeman
S5hrwBm2nOYdBM+vwbt3C/QTuOS6ZZAk1x3CimjChGRw2zKYyrbLJXw1CoSv
MbPhfBOOyNybHnzp/KhFlHeNfV+26K0lwrNhkEuI0M0BXHoF4Qaeur5aEAt6
hWQDnwMn++CEXuDO54zrYK1zeZYLLoz3UlvpbMG1KjLHpQnDOBqHyJzcqtFn
8zstqaSQQapMF3nGB8PGkeXG5MLm3hbW6oxlyhSjgv+xwXlmpITbmge42vvt
wvcdkgc9aD4qGRS+8BMBX4vIXEJDRCF4Dk1WQgvlpeLWKqaG+c0lHuG3Wis+
5kyJ4JwUGl8RemhhngvHZGEVl8E7admYuVHawQzT4YxX4XAfnMYsCmSfzaCX
irssY4W2gvNC8kzwIit4yAuTm5Blec5EGDjTY/A8SYTwcRyKQlmd5yE3elQ6
MzwvwPbMCmFgOELutMgHuKNECtBRwxPU63C7X0tj/4Pz/Zri7x4u+H7T9Piv
C8HHccT3W/iF0V4fXP51446xGF5C/eCvERvQ9vDzxgsCPUAdQZpq6wZWRlD9
Un2pUMIC9fZQQBIhqh0qk7GKwYoIZnJEshzjkXkEuahmhzP59hp5bGAyhHr0
ZIEVDIP1WLVcIKsJrgCgNGVQciG/BrQEaqwdfA4rprvQZSzRmrK+6WDupJZA
bVAi7QYVyLCoao7azTEsextYHfaw4Dq+adhyQetYWHSiKFrdwyNhEdphJ2El
SSp3hC+GJS+sTaHggxUjfB2WLeuuXKHS284jsQjUFbhqhIKVwboEfw9FNkIu
SPkP6uvv3oR+RlAxEorA8mexxPKElFPOYLJHHAjCJS529RoXTBdiBRN/s7sA
013hmgTW9Ae30MEbJJZBRcBuA8uf7fky1lKIxZYNQxGWU7AP8hThSghLsAUs
nqBchcHsygALjGMo8fExKHsCJSyOVk+cLK8FUNe7C0UkMzso33tYCfXHWEgr
UoisoPGVwmoNNQVRMLArPRTOHhZSZ+Be4G5YvcC6rduCt0ARXaO2C9SaTYXc
LKGKHE9QzeKiewv19AW4HcK0j5FzZQdLPQkLUCSUwcfsIt/RGaxXoVA8nAHY
cJMHGGy4JRIQgVn7HqpdqKsZVLy4EMeynkqxWtaEbjlW0HrEYmNcIPCl3kBj
d4hDR7xMt2wRo49uhesy3C4pYQFWwaIB16gsFtdY2jY7Uv6rcdNh3d5AfYci
kwuk9kENPliAa1xUPQ7j3mO4v06Y1huR4M0xzHz/i1DZH8gGfgwSfH/PZ0UD
n0aCz8d1XgkEF/IxHPj/gvv/5Ye6/P+mZ/3lu+++7//S9H/5f6bvrl/x3b/A
1744kFwqh8eKlLdODHmhkDbejEgTMniXh/ElIDlCyCOY/DVAcnb/5ORwh1Gf
EYN+pqEQVEEpabVUhcKThfPvkWA/1zqBqdWAf3mIOOf5K2bnh5P7Uwp/9w25
P8WboNqvMOPvnoAeZ/pexaKkceMI1Y/mWPUZ0qv3+WCkG4zg0o5QCkKDBFdh
9GrMB/i1mWuqDFoOxZOC6tpqKMQK40whpDGDsj6IglsDlf3IdDHYfByzAH9I
Nc4n6xz0RufOqUyNo7JjsRe5+PQKezDjnj2psAf1wT04Mu5vI9fWK+HIxzu8
NSzGT+JWRbuLtzgjHdUNTAHlpB63gSlzfYGpGaYEXOC3uHsBpcXdz2v4PUyx
UDdAxRIrEfjxx9egl5/eXads+twGO0xRiB0ue5iqcMOwh0kdtzRrtYLbdOWF
6nDWbQ4b1h29jF5+GrqMG7wfoJcRrfqBCN81FngN7mL0ONt2UILhJhHYBxlS
cApFw+6/EoX5PG+wIkE6FwR94o4O3hLfLOy8jCpzMBOv/UcDgT9A/CJK9E2g
3z3id29y2uB9yupPmPzHxU/RflBXIpMO7kOeYSnJqY9r3N4nxWNkkdRQbSxX
WPihUB2W4dA6qDxYV51DjXuGjGjIlLaIgHHdMKwowPIMqw8sWC6Q/1Ihudqq
Bx9BlWgouaAwVqsKd8F6aGklOxTtw/k/HHXgUlB5HWJfG9xM3LSiqcAGCEku
/f39pE+EWHU/XrxCHk3mOld+dCN3RkNussUgII8NKhNBBcaHLMCaMuMFZiwV
BhPGIjMJ7qZghhBeP5BHs89mWz/iHAKTjeVOeSUZEwN3Q8FzWNMKyPd+hPyf
+wCTQe4MtGI0SZHNC2ghLsDFmMtCZNJnARe1holx4IW2g/DwiwKmgCKI3PJs
JAWXeZfE5k7CotgxkxtuchlP/R5c/TL84yf7y4//HH7n8ZSu/wU37n6Nm3rU
n/++tb//fy/uHz3+XJ1jhc+D8cIIDev1nOFY5FZzmJo1AlRZLkKhB8vkACaY
9y1gHvcwQyvkChuywptPDrp9nVsNOsvF6M3g1ADT24icczDZ88Erb8YA82GG
h6o96uYImG2lL4RzPGEULMzhVj+LoH1o+Qzp1UbjCnxqJgrnofZjo3M2DxIF
qpQaTCGlCgIeCJM56vSm3TO4CuZ5z23GnUAksGcjLMZQNRfMDBfBFK+zwJka
4DfBMgPdK5K2opWSea7ZqPIBB2F8jVs5civ3Grf6RJ2DmiQoAf0Z2QA/DkFZ
rj26W2GNGEbH4TciYwioSWUX096PcrCkCozhw76INqEJgWvhMgjlIfCB5dx7
lgkNgzPCPxBc3oc85Ll3yhQ5xAtH8M2MmpKWBWivePzhL2kTfqqHf2lcr7qn
L674+1LSXNuK9+XbOZ/Jh/l2hhphy57y6rRb+ZxzPx2ys9s/G7kPQ/ZVwLin
F5OPqKlJ9RRa7i1rLzVTc+JfPiVyWNxLM0J8gsXhHn/30hJNsBhl82i/Odhi
lM0rW/E+X58zuHmfr89PN+/z9fnpLyTyp3w9Ddz7fD1F+dN4u4eKwHnO1Mg9
lIEFLM6zEaw65JKbwuZmHPQA1QeDgWJ6kGBHVgzMjuMMmBuD06MJ7gvjgZV4
iAd+j7ukXZT3uctsBP8+d5mrqxfn/cfdZW78i0XN4+4yR/lvKEO+CDwW+W8q
Q77P7eeSiL3P7eenZ+9z++ny15S7j7n9HHKvqOUfc/tURj2PSn7AFC0U3E6E
QWaFHrmwnDkYYodymS7zTOaw+kGxR5SE1E7w4EIGIz+7mcoLyJ7PZckvDCd+
wE9dgP0Zy4LLYQEBHTXgPGC0fDQI/M5g+cbZEERR+KC1zYbcMQGr2LkwhLUr
QoTf0MaXccAPpirP+QhR4TJjdOGlC5IFWI7mXOa5Ukpk4H7aa2NGaCCMUy6d
9Wmz2oIrB+3lfwC8nwHAS0AJtz86Tme9CT0i5rPnBJKJQFuCnVFLIhaRIAGk
9EcAkPAsqOEOgJdwhgRLdJNozwR7IUQS9YsnISQCDdARfj9J/pj5uD/9RBBD
QrwQ9IPwaHTQniBidHqdzu9PKoeEZSD8ldkrVRHogA7I5/M4ENwj4oLHaA/q
MTWaIJFi7gMdgSe8WjzsTkC8JFZUTMgLci2yF2HYqN/Z/Bw6g09jQZqTZE0x
SSYSTIrgawQCoAsJ7EXiSs9LKt7F++bz7Qi+MrrZYC6JfY57nVGRLDDsn02g
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
AxiKS2BovQIA

-->

</rfc>
