<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.4.7) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-17" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-17"/>
    <author initials="M." surname="Abdalla" fullname="Michel Abdalla">
      <organization>Nexus - San Francisco</organization>
      <address>
        <email>michel.abdalla@gmail.com</email>
      </address>
    </author>
    <author initials="B." surname="Haase" fullname="Bjoern Haase">
      <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
      <address>
        <email>bjoern.m.haase@web.de</email>
      </address>
    </author>
    <author initials="J." surname="Hesse" fullname="Julia Hesse">
      <organization>IBM Research Europe - Zurich</organization>
      <address>
        <email>juliahesse2@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="December" day="19"/>
    <workgroup>CFRG</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 161?>

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

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

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

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-ristretto255-decaf448-08"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="ES21" target="https://eprint.iacr.org/2021/696">
          <front>
            <title>The 'quantum annoying' property of password-authenticated key exchange protocols.</title>
            <author initials="E." surname="Eaton">
              <organization/>
            </author>
            <author initials="D." surname="Stebila">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ABKLX21" target="https://eprint.iacr.org/2021/1218">
          <front>
            <title>Algebraic Adversaries in the Universal Composability Framework.</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="J." surname="Katz">
              <organization/>
            </author>
            <author initials="J." surname="Loss">
              <organization/>
            </author>
            <author initials="J." surname="Xu">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="AHH21" target="https://eprint.iacr.org/2021/114">
          <front>
            <title>Security analysis of CPace</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="B." surname="Haase">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HS14" target="https://eprint.iacr.org/2014/585.pdf">
          <front>
            <title>The SPEKE Protocol Revisited</title>
            <author initials="F." surname="Hao">
              <organization/>
            </author>
            <author initials="S." surname="Shahandashti">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BGHJ24" target="link.springer.com/chapter/10.1007/978-3-031-68379-4_6">
          <front>
            <title>Bare PAKE: Universally Composable Key Exchange from Just Passwords</title>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="K." surname="Gellert">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HMSD18" target="https://arxiv.org/abs/1802.04900">
          <front>
            <title>Analysing and Patching SPEKE in ISO/IEC</title>
            <author initials="F." surname="Hao">
              <organization/>
            </author>
            <author initials="R." surname="Metere">
              <organization/>
            </author>
            <author initials="S." surname="Sahahandashti">
              <organization/>
            </author>
            <author initials="C." surname="Dong">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CDMP05" target="https://doi.org/10.1007/11535218_26">
          <front>
            <title>Merkle-Damgaard Revisited: How to Construct a Hash Function</title>
            <author initials="J.-S." surname="Coron" fullname="Jean-Sebastien Coron">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="Y." surname="Dodis" fullname="Yevgeniy Dodis">
              <organization>New York University</organization>
            </author>
            <author initials="C." surname="Malinaud" fullname="Cecile Malinaud">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="P." surname="Puniya" fullname="Prashant Puniya">
              <organization>New York University</organization>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="In" value="Advances in Cryptology - CRYPTO 2005"/>
          <seriesInfo name="pages" value="430-448"/>
          <seriesInfo name="DOI" value="10.1007/11535218_26"/>
        </reference>
        <reference anchor="FIPS202" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">
          <front>
            <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="SEC2" target="http://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters</title>
            <author>
              <organization>Standards for Efficient Cryptography Group (SECG)</organization>
            </author>
            <date year="2010" month="January"/>
          </front>
        </reference>
        <reference anchor="REFIMP" target="https://github.com/cfrg/draft-irtf-cfrg-cpace/tree/master/poc">
          <front>
            <title>CPace reference implementation (sage)</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="September"/>
          </front>
        </reference>
        <reference anchor="RFC8265">
          <front>
            <title>Preparation, Enforcement, and Comparison of Internationalized Strings Representing Usernames and Passwords</title>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This document describes updated methods for handling Unicode strings representing usernames and passwords. The previous approach was known as SASLprep (RFC 4013) and was based on Stringprep (RFC 3454). The methods specified in this document provide a more sustainable approach to the handling of internationalized usernames and passwords. This document obsoletes RFC 7613.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8265"/>
          <seriesInfo name="DOI" value="10.17487/RFC8265"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-opaque">
          <front>
            <title>The OPAQUE Augmented PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>AWS</organization>
            </author>
            <author fullname="Kevin Lewi" initials="K." surname="Lewi">
              <organization>Meta</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="21" month="November" year="2024"/>
            <abstract>
              <t>   This document describes the OPAQUE protocol, an augmented (or
   asymmetric) password-authenticated key exchange (aPAKE) that supports
   mutual authentication in a client-server setting without reliance on
   PKI and with security against pre-computation attacks upon server
   compromise.  In addition, the protocol provides forward secrecy and
   the ability to hide the password from the server, even during
   password registration.  This document specifies the core OPAQUE
   protocol and one instantiation based on 3DH.  This document is a
   product of the Crypto Forum Research Group (CFRG) in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-18"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key. The cryptographic strength of HMAC depends on the properties of the underlying hash function. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </reference>
        <reference anchor="RFC5246">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
            <author fullname="T. Dierks" initials="T." surname="Dierks"/>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2008"/>
            <abstract>
              <t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications security over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5246"/>
          <seriesInfo name="DOI" value="10.17487/RFC5246"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC5639">
          <front>
            <title>Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation</title>
            <author fullname="M. Lochter" initials="M." surname="Lochter"/>
            <author fullname="J. Merkle" initials="J." surname="Merkle"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>This memo proposes several elliptic curve domain parameters over finite prime fields for use in cryptographic applications. The domain parameters are consistent with the relevant international standards, and can be used in X.509 certificates and certificate revocation lists (CRLs), for Internet Key Exchange (IKE), Transport Layer Security (TLS), XML signatures, and all applications or protocols based on the cryptographic message syntax (CMS). This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5639"/>
          <seriesInfo name="DOI" value="10.17487/RFC5639"/>
        </reference>
        <reference anchor="RFC4493">
          <front>
            <title>The AES-CMAC Algorithm</title>
            <author fullname="JH. Song" initials="JH." surname="Song"/>
            <author fullname="R. Poovendran" initials="R." surname="Poovendran"/>
            <author fullname="J. Lee" initials="J." surname="Lee"/>
            <author fullname="T. Iwata" initials="T." surname="Iwata"/>
            <date month="June" year="2006"/>
            <abstract>
              <t>The National Institute of Standards and Technology (NIST) has recently specified the Cipher-based Message Authentication Code (CMAC), which is equivalent to the One-Key CBC MAC1 (OMAC1) submitted by Iwata and Kurosawa. This memo specifies an authentication algorithm based on CMAC with the 128-bit Advanced Encryption Standard (AES). This new authentication algorithm is named AES-CMAC. The purpose of this document is to make the AES-CMAC algorithm conveniently available to the Internet Community. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4493"/>
          <seriesInfo name="DOI" value="10.17487/RFC4493"/>
        </reference>
      </references>
    </references>
    <?line 970?>

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

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

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

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

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

        v = - A / (1 + z * r^2)
        epsilon = (v^3 + A * v^2 + B * v)^powerForLegendreSymbol
        x = epsilon * v - (1 - epsilon) * A/2
        return encodeUCoordinate(Integer(x), field_size_bits)
]]></sourcecode>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test vectors</name>
      <section anchor="test-vector-for-cpace-using-group-x25519-and-hash-sha-512">
        <name>Test vector for CPace using group X25519 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-x25519">
          <name>Test vectors for calculate_generator with group X25519</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 109 ; DSI = b'CPace255'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      0843506163653235350850617373776f72646d000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    hash generator string: (length: 32 bytes)
      92806dc608984dbf4e4aae478c6ec453ae979cc01ecc1a2a7cf49f5c
      ee56551b
    decoded field element of 255 bits: (length: 32 bytes)
      92806dc608984dbf4e4aae478c6ec453ae979cc01ecc1a2a7cf49f5c
      ee56551b
    generator g: (length: 32 bytes)
      64e8099e3ea682cfdc5cb665c057ebb514d06bf23ebc9f743b51b822
      42327074
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-5">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDksICJEU0kiOiAiNDM1MDYx
 #NjM2NTMyMzUzNSIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyME
 #I0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3RTRCNDc5MUQ2QThFRjAx
 #OUI5MzZDNzlGQjdGMkM1NyIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSS
 #xzaWQsSC5zX2luX2J5dGVzKSI6ICIwODQzNTA2MTYzNjUzMjM1MzUwODUwNjE3Mzcz
 #Nzc2RjcyNjQ2RDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUE2RjYzMEI0MjVGNzI2NTczNz
 #A2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMTA3RTRCNDc5MUQ2QThF
 #RjAxOUI5MzZDNzlGQjdGMkM1NyIsICJoYXNoIGdlbmVyYXRvciBzdHJpbmciOiAiOT
 #I4MDZEQzYwODk4NERCRjRFNEFBRTQ3OEM2RUM0NTNBRTk3OUNDMDFFQ0MxQTJBN0NG
 #NDlGNUNFRTU2NTUxQiIsICJkZWNvZGVkIGZpZWxkIGVsZW1lbnQgb2YgMjU1IGJpdH
 #MiOiAiOTI4MDZEQzYwODk4NERCRjRFNEFBRTQ3OEM2RUM0NTNBRTk3OUNDMDFFQ0Mx
 #QTJBN0NGNDlGNUNFRTU2NTUxQiIsICJnZW5lcmF0b3IgZyI6ICI2NEU4MDk5RTNFQT
 #Y4MkNGREM1Q0I2NjVDMDU3RUJCNTE0RDA2QkYyM0VCQzlGNzQzQjUxQjgyMjQyMzI3
 #MDc0In0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080
  Outputs
    Ya: (length: 32 bytes)
      1b02dad6dbd29a07b6d28c9e04cb2f184f0734350e32bb7e62ff9dbc
      fdb63d15
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a
  Outputs
    Yb: (length: 32 bytes)
      20cda5955f82c4931545bcbf40758ce1010d7db4db2a907013d79c7a
      8fcf957f
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f950c970
      3df7297a
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f950c970
      3df7297a
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      201b02dad6dbd29a07b6d28c9e04cb2f184f0734350e32bb7e62ff9d
      bcfdb63d15034144612020cda5955f82c4931545bcbf40758ce1010d
      7db4db2a907013d79c7a8fcf957f03414462
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 137 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c5720f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f9
      50c9703df7297a201b02dad6dbd29a07b6d28c9e04cb2f184f073435
      0e32bb7e62ff9dbcfdb63d15034144612020cda5955f82c4931545bc
      bf40758ce1010d7db4db2a907013d79c7a8fcf957f03414462
    ISK result: (length: 64 bytes)
      a051ee5ee2499d16da3f69f430218b8ea94a18a45b67f9e86495b382
      c33d14a5c38cecc0cc834f960e39e0d1bf7d76b9ef5d54eecc5e0f38
      6c97ad12da8c3d5f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f632020cda5955f82c4931545bcbf40758ce1010d7db4db2a907013
      d79c7a8fcf957f03414462201b02dad6dbd29a07b6d28c9e04cb2f18
      4f0734350e32bb7e62ff9dbcfdb63d1503414461
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 139 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c5720f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f9
      50c9703df7297a6f632020cda5955f82c4931545bcbf40758ce1010d
      7db4db2a907013d79c7a8fcf957f03414462201b02dad6dbd29a07b6
      d28c9e04cb2f184f0734350e32bb7e62ff9dbcfdb63d1503414461
    ISK result: (length: 64 bytes)
      5cc27e49679423f81a37d7521d9fb1327c840d2ea4a1543652e7de5c
      abb89ebad27d24761b3288a3fd5764b441ecb78d30abc26161ff45ea
      297bb311dde04727
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      f7ae11ac3ee85c3c42d8bd51ba823fbe17158f43d34a1296f1cb2567
      bcc71dc8b201a134b566b468aad8fd04f02f96e3caf9d5601f7ed760
      a0a951a5a861b5e7
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      a38389e34fa492788c1df43b06b427710491174e53c33b01362a490d
      116fe1b7e870aa6e2a7fc018725e3b7f969f7508042e44cd3863f39a
      a75026a190d1902b
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x64,0xe8,0x09,0x9e,0x3e,0xa6,0x82,0xcf,0xdc,0x5c,0xb6,0x65,
 0xc0,0x57,0xeb,0xb5,0x14,0xd0,0x6b,0xf2,0x3e,0xbc,0x9f,0x74,
 0x3b,0x51,0xb8,0x22,0x42,0x32,0x70,0x74,
};
const unsigned char tc_ya[] = {
 0x21,0xb4,0xf4,0xbd,0x9e,0x64,0xed,0x35,0x5c,0x3e,0xb6,0x76,
 0xa2,0x8e,0xbe,0xda,0xf6,0xd8,0xf1,0x7b,0xdc,0x36,0x59,0x95,
 0xb3,0x19,0x09,0x71,0x53,0x04,0x40,0x80,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x1b,0x02,0xda,0xd6,0xdb,0xd2,0x9a,0x07,0xb6,0xd2,0x8c,0x9e,
 0x04,0xcb,0x2f,0x18,0x4f,0x07,0x34,0x35,0x0e,0x32,0xbb,0x7e,
 0x62,0xff,0x9d,0xbc,0xfd,0xb6,0x3d,0x15,
};
const unsigned char tc_yb[] = {
 0x84,0x8b,0x07,0x79,0xff,0x41,0x5f,0x0a,0xf4,0xea,0x14,0xdf,
 0x9d,0xd1,0xd3,0xc2,0x9a,0xc4,0x1d,0x83,0x6c,0x78,0x08,0x89,
 0x6c,0x4e,0xba,0x19,0xc5,0x1a,0xc4,0x0a,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x20,0xcd,0xa5,0x95,0x5f,0x82,0xc4,0x93,0x15,0x45,0xbc,0xbf,
 0x40,0x75,0x8c,0xe1,0x01,0x0d,0x7d,0xb4,0xdb,0x2a,0x90,0x70,
 0x13,0xd7,0x9c,0x7a,0x8f,0xcf,0x95,0x7f,
};
const unsigned char tc_K[] = {
 0xf9,0x7f,0xdf,0xcf,0xff,0x1c,0x98,0x3e,0xd6,0x28,0x38,0x56,
 0xa4,0x01,0xde,0x31,0x91,0xca,0x91,0x99,0x02,0xb3,0x23,0xc5,
 0xf9,0x50,0xc9,0x70,0x3d,0xf7,0x29,0x7a,
};
const unsigned char tc_ISK_IR[] = {
 0xa0,0x51,0xee,0x5e,0xe2,0x49,0x9d,0x16,0xda,0x3f,0x69,0xf4,
 0x30,0x21,0x8b,0x8e,0xa9,0x4a,0x18,0xa4,0x5b,0x67,0xf9,0xe8,
 0x64,0x95,0xb3,0x82,0xc3,0x3d,0x14,0xa5,0xc3,0x8c,0xec,0xc0,
 0xcc,0x83,0x4f,0x96,0x0e,0x39,0xe0,0xd1,0xbf,0x7d,0x76,0xb9,
 0xef,0x5d,0x54,0xee,0xcc,0x5e,0x0f,0x38,0x6c,0x97,0xad,0x12,
 0xda,0x8c,0x3d,0x5f,
};
const unsigned char tc_ISK_SY[] = {
 0x5c,0xc2,0x7e,0x49,0x67,0x94,0x23,0xf8,0x1a,0x37,0xd7,0x52,
 0x1d,0x9f,0xb1,0x32,0x7c,0x84,0x0d,0x2e,0xa4,0xa1,0x54,0x36,
 0x52,0xe7,0xde,0x5c,0xab,0xb8,0x9e,0xba,0xd2,0x7d,0x24,0x76,
 0x1b,0x32,0x88,0xa3,0xfd,0x57,0x64,0xb4,0x41,0xec,0xb7,0x8d,
 0x30,0xab,0xc2,0x61,0x61,0xff,0x45,0xea,0x29,0x7b,0xb3,0x11,
 0xdd,0xe0,0x47,0x27,
};
const unsigned char tc_ISK_SY[] = {
 0x5c,0xc2,0x7e,0x49,0x67,0x94,0x23,0xf8,0x1a,0x37,0xd7,0x52,
 0x1d,0x9f,0xb1,0x32,0x7c,0x84,0x0d,0x2e,0xa4,0xa1,0x54,0x36,
 0x52,0xe7,0xde,0x5c,0xab,0xb8,0x9e,0xba,0xd2,0x7d,0x24,0x76,
 0x1b,0x32,0x88,0xa3,0xfd,0x57,0x64,0xb4,0x41,0xec,0xb7,0x8d,
 0x30,0xab,0xc2,0x61,0x61,0xff,0x45,0xea,0x29,0x7b,0xb3,0x11,
 0xdd,0xe0,0x47,0x27,
};
const unsigned char tc_sid_out_ir[] = {
 0xf7,0xae,0x11,0xac,0x3e,0xe8,0x5c,0x3c,0x42,0xd8,0xbd,0x51,
 0xba,0x82,0x3f,0xbe,0x17,0x15,0x8f,0x43,0xd3,0x4a,0x12,0x96,
 0xf1,0xcb,0x25,0x67,0xbc,0xc7,0x1d,0xc8,0xb2,0x01,0xa1,0x34,
 0xb5,0x66,0xb4,0x68,0xaa,0xd8,0xfd,0x04,0xf0,0x2f,0x96,0xe3,
 0xca,0xf9,0xd5,0x60,0x1f,0x7e,0xd7,0x60,0xa0,0xa9,0x51,0xa5,
 0xa8,0x61,0xb5,0xe7,
};
const unsigned char tc_sid_out_oc[] = {
 0xa3,0x83,0x89,0xe3,0x4f,0xa4,0x92,0x78,0x8c,0x1d,0xf4,0x3b,
 0x06,0xb4,0x27,0x71,0x04,0x91,0x17,0x4e,0x53,0xc3,0x3b,0x01,
 0x36,0x2a,0x49,0x0d,0x11,0x6f,0xe1,0xb7,0xe8,0x70,0xaa,0x6e,
 0x2a,0x7f,0xc0,0x18,0x72,0x5e,0x3b,0x7f,0x96,0x9f,0x75,0x08,
 0x04,0x2e,0x44,0xcd,0x38,0x63,0xf3,0x9a,0xa7,0x50,0x26,0xa1,
 0x90,0xd1,0x90,0x2b,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-6">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjY0RTgwOTlFM0
 #VBNjgyQ0ZEQzVDQjY2NUMwNTdFQkI1MTREMDZCRjIzRUJDOUY3NDNCNTFCODIyNDIz
 #MjcwNzQiLCAieWEiOiAiMjFCNEY0QkQ5RTY0RUQzNTVDM0VCNjc2QTI4RUJFREFGNk
 #Q4RjE3QkRDMzY1OTk1QjMxOTA5NzE1MzA0NDA4MCIsICJBRGEiOiAiNDE0NDYxIiwg
 #IllhIjogIjFCMDJEQUQ2REJEMjlBMDdCNkQyOEM5RTA0Q0IyRjE4NEYwNzM0MzUwRT
 #MyQkI3RTYyRkY5REJDRkRCNjNEMTUiLCAieWIiOiAiODQ4QjA3NzlGRjQxNUYwQUY0
 #RUExNERGOUREMUQzQzI5QUM0MUQ4MzZDNzgwODg5NkM0RUJBMTlDNTFBQzQwQSIsIC
 #JBRGIiOiAiNDE0NDYyIiwgIlliIjogIjIwQ0RBNTk1NUY4MkM0OTMxNTQ1QkNCRjQw
 #NzU4Q0UxMDEwRDdEQjREQjJBOTA3MDEzRDc5QzdBOEZDRjk1N0YiLCAiSyI6ICJGOT
 #dGREZDRkZGMUM5ODNFRDYyODM4NTZBNDAxREUzMTkxQ0E5MTk5MDJCMzIzQzVGOTUw
 #Qzk3MDNERjcyOTdBIiwgIklTS19JUiI6ICJBMDUxRUU1RUUyNDk5RDE2REEzRjY5Rj
 #QzMDIxOEI4RUE5NEExOEE0NUI2N0Y5RTg2NDk1QjM4MkMzM0QxNEE1QzM4Q0VDQzBD
 #QzgzNEY5NjBFMzlFMEQxQkY3RDc2QjlFRjVENTRFRUNDNUUwRjM4NkM5N0FEMTJEQT
 #hDM0Q1RiIsICJJU0tfU1kiOiAiNUNDMjdFNDk2Nzk0MjNGODFBMzdENzUyMUQ5RkIx
 #MzI3Qzg0MEQyRUE0QTE1NDM2NTJFN0RFNUNBQkI4OUVCQUQyN0QyNDc2MUIzMjg4QT
 #NGRDU3NjRCNDQxRUNCNzhEMzBBQkMyNjE2MUZGNDVFQTI5N0JCMzExRERFMDQ3Mjci
 #LCAic2lkX291dHB1dF9pciI6ICJGN0FFMTFBQzNFRTg1QzNDNDJEOEJENTFCQTgyM0
 #ZCRTE3MTU4RjQzRDM0QTEyOTZGMUNCMjU2N0JDQzcxREM4QjIwMUExMzRCNTY2QjQ2
 #OEFBRDhGRDA0RjAyRjk2RTNDQUY5RDU2MDFGN0VENzYwQTBBOTUxQTVBODYxQjVFNy
 #IsICJzaWRfb3V0cHV0X29jIjogIkEzODM4OUUzNEZBNDkyNzg4QzFERjQzQjA2QjQy
 #NzcxMDQ5MTE3NEU1M0MzM0IwMTM2MkE0OTBEMTE2RkUxQjdFODcwQUE2RTJBN0ZDMD
 #E4NzI1RTNCN0Y5NjlGNzUwODA0MkU0NENEMzg2M0YzOUFBNzUwMjZBMTkwRDE5MDJC
 #In0=
]]></sourcecode>
        </section>
        <section anchor="test-vectors-for-gx25519scalarmultvfy-low-order-points">
          <name>Test vectors for G_X25519.scalar_mult_vfy: low order points</name>
          <t>Test vectors for which G_X25519.scalar_mult_vfy(s_in,ux) must return the neutral
element or would return the neutral element if bit #255 of field element
representation was not correctly cleared. (The decodeUCoordinate function from RFC7748 mandates clearing bit #255 for field element representations for use in the X25519 function.).</t>
          <artwork><![CDATA[
u0: 0000000000000000000000000000000000000000000000000000000000000000
u1: 0100000000000000000000000000000000000000000000000000000000000000
u2: ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u3: e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800
u4: 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157
u5: edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u6: daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
u7: eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u8: dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
u9: d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ua: cdeb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880
ub: 4c9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7

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

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

s = af46e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449aff
qN = G_X25519.scalar_mult_vfy(s, uX)
q0: 0000000000000000000000000000000000000000000000000000000000000000
q1: 0000000000000000000000000000000000000000000000000000000000000000
q2: 0000000000000000000000000000000000000000000000000000000000000000
q3: 0000000000000000000000000000000000000000000000000000000000000000
q4: 0000000000000000000000000000000000000000000000000000000000000000
q5: 0000000000000000000000000000000000000000000000000000000000000000
q6: d8e2c776bbacd510d09fd9278b7edcd25fc5ae9adfba3b6e040e8d3b71b21806
q7: 0000000000000000000000000000000000000000000000000000000000000000
q8: c85c655ebe8be44ba9c0ffde69f2fe10194458d137f09bbff725ce58803cdb38
q9: db64dafa9b8fdd136914e61461935fe92aa372cb056314e1231bc4ec12417456
qa: e062dcd5376d58297be2618c7498f55baa07d7e03184e8aada20bca28888bf7a
qb: 993c6ad11c4c29da9a56f7691fd0ff8d732e49de6250b6c2e80003ff4629a175
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-7">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkwIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMSI6ICIw
 #MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwIiwgIkludmFsaWQgWTIiOiAiRUNGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsIC
 #JJbnZhbGlkIFkzIjogIkUwRUI3QTdDM0I0MUI4QUUxNjU2RTNGQUYxOUZDNDZBREEw
 #OThERUI5QzMyQjFGRDg2NjIwNTE2NUY0OUI4MDAiLCAiSW52YWxpZCBZNCI6ICI1Rj
 #lDOTVCQ0EzNTA4QzI0QjFEMEIxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIy
 #NEVEREQwOUYxMTU3IiwgIkludmFsaWQgWTUiOiAiRURGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsICJJ
 #bnZhbGlkIFk2IjogIkRBRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNyI6ICJFRUZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRjdGIiwgIkludmFsaWQgWTgiOiAiREJGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbn
 #ZhbGlkIFk5IjogIkQ5RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZMTAiOiAiQ0RFQj
 #dBN0MzQjQxQjhBRTE2NTZFM0ZBRjE5RkM0NkFEQTA5OERFQjlDMzJCMUZEODY2MjA1
 #MTY1RjQ5Qjg4MCIsICJJbnZhbGlkIFkxMSI6ICI0QzlDOTVCQ0EzNTA4QzI0QjFEME
 #IxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIyNEVEREQwOUYxMUQ3In0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-x448-and-hash-shake-256">
        <name>Test vector for CPace using group X448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-x448">
          <name>Test vectors for calculate_generator with group X448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 117 ; DSI = b'CPace448'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 180 bytes)
      0843506163653434380850617373776f726475000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000001a6f630b
      425f726573706f6e6465720b415f696e69746961746f72105223e0cd
      c45d6575668d64c552004124
    hash generator string: (length: 56 bytes)
      98b713f84529194d719a7d86cb0f504b8afeb05354d68747e18b2e7c
      c8b6da526085e4263bd8bea7d69e479ebad09e30ae062e5d089da7f3
    decoded field element of 448 bits: (length: 56 bytes)
      98b713f84529194d719a7d86cb0f504b8afeb05354d68747e18b2e7c
      c8b6da526085e4263bd8bea7d69e479ebad09e30ae062e5d089da7f3
    generator g: (length: 56 bytes)
      e293b7ccf61ca7eb928a26391cf38b660f874a001fdf0bf3a91fd182
      f2b6d83e61a9377ede127eba7e0d4c08592eaff33d4aa705d6ce54bb
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-8">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExNywgIkRTSSI6ICI0MzUw
 #NjE2MzY1MzQzNDM4IiwgIkNJIjogIjZGNjMwQjQyNUY3MjY1NzM3MDZGNkU2NDY1Nz
 #IwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIiLCAic2lkIjogIjUyMjNFMENEQzQ1RDY1
 #NzU2NjhENjRDNTUyMDA0MTI0IiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0ksUFJTLE
 #NJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjA4NDM1MDYxNjM2NTM0MzQzODA4NTA2MTcz
 #NzM3NzZGNzI2NDc1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMU
 #E2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2
 #RjcyMTA1MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJoYXNoIGdlbm
 #VyYXRvciBzdHJpbmciOiAiOThCNzEzRjg0NTI5MTk0RDcxOUE3RDg2Q0IwRjUwNEI4
 #QUZFQjA1MzU0RDY4NzQ3RTE4QjJFN0NDOEI2REE1MjYwODVFNDI2M0JEOEJFQTdENj
 #lFNDc5RUJBRDA5RTMwQUUwNjJFNUQwODlEQTdGMyIsICJkZWNvZGVkIGZpZWxkIGVs
 #ZW1lbnQgb2YgNDQ4IGJpdHMiOiAiOThCNzEzRjg0NTI5MTk0RDcxOUE3RDg2Q0IwRj
 #UwNEI4QUZFQjA1MzU0RDY4NzQ3RTE4QjJFN0NDOEI2REE1MjYwODVFNDI2M0JEOEJF
 #QTdENjlFNDc5RUJBRDA5RTMwQUUwNjJFNUQwODlEQTdGMyIsICJnZW5lcmF0b3IgZy
 #I6ICJFMjkzQjdDQ0Y2MUNBN0VCOTI4QTI2MzkxQ0YzOEI2NjBGODc0QTAwMUZERjBC
 #RjNBOTFGRDE4MkYyQjZEODNFNjFBOTM3N0VERTEyN0VCQTdFMEQ0QzA4NTkyRUFGRj
 #MzRDRBQTcwNUQ2Q0U1NEJCIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-1">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080516bd083bfcce66121a3072646994c8430cc382b8dc543e8
  Outputs
    Ya: (length: 56 bytes)
      7f645772cc209bf9fd9d76dbb10283bea71b12235e3bb21878d5e56a
      70506e165743a632de98eca9932c5d2efe36500a59b2fdaed0d8a148
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-1">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a439caf5e61ec88c307c7d619195229412eaa73fb2a5ea20d
  Outputs
    Yb: (length: 56 bytes)
      a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e2c6ee95844de
      f2692be77646b20d3b429f8da00d21433ee0891c667658d8d0c48e38
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-1">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbeee5bb2
      d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2cede6135a
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbeee5bb2
      d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2cede6135a
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-1">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      387f645772cc209bf9fd9d76dbb10283bea71b12235e3bb21878d5e5
      6a70506e165743a632de98eca9932c5d2efe36500a59b2fdaed0d8a1
      480341446138a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e
      2c6ee95844def2692be77646b20d3b429f8da00d21433ee0891c6676
      58d8d0c48e3803414462
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 209 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      412438db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbe
      ee5bb2d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2ced
      e6135a387f645772cc209bf9fd9d76dbb10283bea71b12235e3bb218
      78d5e56a70506e165743a632de98eca9932c5d2efe36500a59b2fdae
      d0d8a1480341446138a4690a0750c42b288ddd0ba08e3f4902dfe70b
      ae5c9e2c6ee95844def2692be77646b20d3b429f8da00d21433ee089
      1c667658d8d0c48e3803414462
    ISK result: (length: 64 bytes)
      599892a2078a8c988181625e1e5e5f7a6163f7d72f21b93ebefba0f1
      7ff7ea3aa0594bd569cf74264157b3c0087bdccf2f59c77156628487
      f5ca1645b8e9d05b
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-1">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f6338a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e2c6ee9
      5844def2692be77646b20d3b429f8da00d21433ee0891c667658d8d0
      c48e3803414462387f645772cc209bf9fd9d76dbb10283bea71b1223
      5e3bb21878d5e56a70506e165743a632de98eca9932c5d2efe36500a
      59b2fdaed0d8a14803414461
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 211 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      412438db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbe
      ee5bb2d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2ced
      e6135a6f6338a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e
      2c6ee95844def2692be77646b20d3b429f8da00d21433ee0891c6676
      58d8d0c48e3803414462387f645772cc209bf9fd9d76dbb10283bea7
      1b12235e3bb21878d5e56a70506e165743a632de98eca9932c5d2efe
      36500a59b2fdaed0d8a14803414461
    ISK result: (length: 64 bytes)
      3ac73f03030296aa591f01326b18afa47e1189129cd06ae8dfb05e6e
      b1310cde948b59eef0755365c06a339266afe594948c56a538d98a65
      767113938a9a78d8
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-1">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      00a2333a79481abe71efd6594d7bbaac55c808482e869c9b65c4b53d
      7100d3da8f3cabd59fa0c1f22d6d2f9ac0c093962292798fca2c0b93
      268974cad75d575a
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      a1ce90537a8d53b06d77e79fe719461cc5ed8300d21d1866a59f9638
      601833f57a8b5e88db9a52abfa1b4e8a651a400bc9205082aad81eb3
      11c44373b9a19eff
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-1">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0xe2,0x93,0xb7,0xcc,0xf6,0x1c,0xa7,0xeb,0x92,0x8a,0x26,0x39,
 0x1c,0xf3,0x8b,0x66,0x0f,0x87,0x4a,0x00,0x1f,0xdf,0x0b,0xf3,
 0xa9,0x1f,0xd1,0x82,0xf2,0xb6,0xd8,0x3e,0x61,0xa9,0x37,0x7e,
 0xde,0x12,0x7e,0xba,0x7e,0x0d,0x4c,0x08,0x59,0x2e,0xaf,0xf3,
 0x3d,0x4a,0xa7,0x05,0xd6,0xce,0x54,0xbb,
};
const unsigned char tc_ya[] = {
 0x21,0xb4,0xf4,0xbd,0x9e,0x64,0xed,0x35,0x5c,0x3e,0xb6,0x76,
 0xa2,0x8e,0xbe,0xda,0xf6,0xd8,0xf1,0x7b,0xdc,0x36,0x59,0x95,
 0xb3,0x19,0x09,0x71,0x53,0x04,0x40,0x80,0x51,0x6b,0xd0,0x83,
 0xbf,0xcc,0xe6,0x61,0x21,0xa3,0x07,0x26,0x46,0x99,0x4c,0x84,
 0x30,0xcc,0x38,0x2b,0x8d,0xc5,0x43,0xe8,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x7f,0x64,0x57,0x72,0xcc,0x20,0x9b,0xf9,0xfd,0x9d,0x76,0xdb,
 0xb1,0x02,0x83,0xbe,0xa7,0x1b,0x12,0x23,0x5e,0x3b,0xb2,0x18,
 0x78,0xd5,0xe5,0x6a,0x70,0x50,0x6e,0x16,0x57,0x43,0xa6,0x32,
 0xde,0x98,0xec,0xa9,0x93,0x2c,0x5d,0x2e,0xfe,0x36,0x50,0x0a,
 0x59,0xb2,0xfd,0xae,0xd0,0xd8,0xa1,0x48,
};
const unsigned char tc_yb[] = {
 0x84,0x8b,0x07,0x79,0xff,0x41,0x5f,0x0a,0xf4,0xea,0x14,0xdf,
 0x9d,0xd1,0xd3,0xc2,0x9a,0xc4,0x1d,0x83,0x6c,0x78,0x08,0x89,
 0x6c,0x4e,0xba,0x19,0xc5,0x1a,0xc4,0x0a,0x43,0x9c,0xaf,0x5e,
 0x61,0xec,0x88,0xc3,0x07,0xc7,0xd6,0x19,0x19,0x52,0x29,0x41,
 0x2e,0xaa,0x73,0xfb,0x2a,0x5e,0xa2,0x0d,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0xa4,0x69,0x0a,0x07,0x50,0xc4,0x2b,0x28,0x8d,0xdd,0x0b,0xa0,
 0x8e,0x3f,0x49,0x02,0xdf,0xe7,0x0b,0xae,0x5c,0x9e,0x2c,0x6e,
 0xe9,0x58,0x44,0xde,0xf2,0x69,0x2b,0xe7,0x76,0x46,0xb2,0x0d,
 0x3b,0x42,0x9f,0x8d,0xa0,0x0d,0x21,0x43,0x3e,0xe0,0x89,0x1c,
 0x66,0x76,0x58,0xd8,0xd0,0xc4,0x8e,0x38,
};
const unsigned char tc_K[] = {
 0xdb,0x3f,0xff,0x9d,0xa5,0x95,0x76,0x71,0x5b,0x04,0xd4,0xdf,
 0x8d,0xc8,0xd1,0x8d,0xb2,0x43,0x0e,0x57,0xbb,0xed,0x33,0x7d,
 0xbe,0xee,0x5b,0xb2,0xd6,0xab,0x6c,0xed,0xdc,0x9c,0x75,0xc5,
 0xc0,0xb1,0x7f,0xad,0x7e,0xb7,0x24,0xda,0xa1,0x2f,0x8f,0x19,
 0x03,0xdd,0x6c,0x2c,0xed,0xe6,0x13,0x5a,
};
const unsigned char tc_ISK_IR[] = {
 0x59,0x98,0x92,0xa2,0x07,0x8a,0x8c,0x98,0x81,0x81,0x62,0x5e,
 0x1e,0x5e,0x5f,0x7a,0x61,0x63,0xf7,0xd7,0x2f,0x21,0xb9,0x3e,
 0xbe,0xfb,0xa0,0xf1,0x7f,0xf7,0xea,0x3a,0xa0,0x59,0x4b,0xd5,
 0x69,0xcf,0x74,0x26,0x41,0x57,0xb3,0xc0,0x08,0x7b,0xdc,0xcf,
 0x2f,0x59,0xc7,0x71,0x56,0x62,0x84,0x87,0xf5,0xca,0x16,0x45,
 0xb8,0xe9,0xd0,0x5b,
};
const unsigned char tc_ISK_SY[] = {
 0x3a,0xc7,0x3f,0x03,0x03,0x02,0x96,0xaa,0x59,0x1f,0x01,0x32,
 0x6b,0x18,0xaf,0xa4,0x7e,0x11,0x89,0x12,0x9c,0xd0,0x6a,0xe8,
 0xdf,0xb0,0x5e,0x6e,0xb1,0x31,0x0c,0xde,0x94,0x8b,0x59,0xee,
 0xf0,0x75,0x53,0x65,0xc0,0x6a,0x33,0x92,0x66,0xaf,0xe5,0x94,
 0x94,0x8c,0x56,0xa5,0x38,0xd9,0x8a,0x65,0x76,0x71,0x13,0x93,
 0x8a,0x9a,0x78,0xd8,
};
const unsigned char tc_ISK_SY[] = {
 0x3a,0xc7,0x3f,0x03,0x03,0x02,0x96,0xaa,0x59,0x1f,0x01,0x32,
 0x6b,0x18,0xaf,0xa4,0x7e,0x11,0x89,0x12,0x9c,0xd0,0x6a,0xe8,
 0xdf,0xb0,0x5e,0x6e,0xb1,0x31,0x0c,0xde,0x94,0x8b,0x59,0xee,
 0xf0,0x75,0x53,0x65,0xc0,0x6a,0x33,0x92,0x66,0xaf,0xe5,0x94,
 0x94,0x8c,0x56,0xa5,0x38,0xd9,0x8a,0x65,0x76,0x71,0x13,0x93,
 0x8a,0x9a,0x78,0xd8,
};
const unsigned char tc_sid_out_ir[] = {
 0x00,0xa2,0x33,0x3a,0x79,0x48,0x1a,0xbe,0x71,0xef,0xd6,0x59,
 0x4d,0x7b,0xba,0xac,0x55,0xc8,0x08,0x48,0x2e,0x86,0x9c,0x9b,
 0x65,0xc4,0xb5,0x3d,0x71,0x00,0xd3,0xda,0x8f,0x3c,0xab,0xd5,
 0x9f,0xa0,0xc1,0xf2,0x2d,0x6d,0x2f,0x9a,0xc0,0xc0,0x93,0x96,
 0x22,0x92,0x79,0x8f,0xca,0x2c,0x0b,0x93,0x26,0x89,0x74,0xca,
 0xd7,0x5d,0x57,0x5a,
};
const unsigned char tc_sid_out_oc[] = {
 0xa1,0xce,0x90,0x53,0x7a,0x8d,0x53,0xb0,0x6d,0x77,0xe7,0x9f,
 0xe7,0x19,0x46,0x1c,0xc5,0xed,0x83,0x00,0xd2,0x1d,0x18,0x66,
 0xa5,0x9f,0x96,0x38,0x60,0x18,0x33,0xf5,0x7a,0x8b,0x5e,0x88,
 0xdb,0x9a,0x52,0xab,0xfa,0x1b,0x4e,0x8a,0x65,0x1a,0x40,0x0b,
 0xc9,0x20,0x50,0x82,0xaa,0xd8,0x1e,0xb3,0x11,0xc4,0x43,0x73,
 0xb9,0xa1,0x9e,0xff,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-9">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIkUyOTNCN0NDRj
 #YxQ0E3RUI5MjhBMjYzOTFDRjM4QjY2MEY4NzRBMDAxRkRGMEJGM0E5MUZEMTgyRjJC
 #NkQ4M0U2MUE5Mzc3RURFMTI3RUJBN0UwRDRDMDg1OTJFQUZGMzNENEFBNzA1RDZDRT
 #U0QkIiLCAieWEiOiAiMjFCNEY0QkQ5RTY0RUQzNTVDM0VCNjc2QTI4RUJFREFGNkQ4
 #RjE3QkRDMzY1OTk1QjMxOTA5NzE1MzA0NDA4MDUxNkJEMDgzQkZDQ0U2NjEyMUEzMD
 #cyNjQ2OTk0Qzg0MzBDQzM4MkI4REM1NDNFOCIsICJBRGEiOiAiNDE0NDYxIiwgIllh
 #IjogIjdGNjQ1NzcyQ0MyMDlCRjlGRDlENzZEQkIxMDI4M0JFQTcxQjEyMjM1RTNCQj
 #IxODc4RDVFNTZBNzA1MDZFMTY1NzQzQTYzMkRFOThFQ0E5OTMyQzVEMkVGRTM2NTAw
 #QTU5QjJGREFFRDBEOEExNDgiLCAieWIiOiAiODQ4QjA3NzlGRjQxNUYwQUY0RUExNE
 #RGOUREMUQzQzI5QUM0MUQ4MzZDNzgwODg5NkM0RUJBMTlDNTFBQzQwQTQzOUNBRjVF
 #NjFFQzg4QzMwN0M3RDYxOTE5NTIyOTQxMkVBQTczRkIyQTVFQTIwRCIsICJBRGIiOi
 #AiNDE0NDYyIiwgIlliIjogIkE0NjkwQTA3NTBDNDJCMjg4REREMEJBMDhFM0Y0OTAy
 #REZFNzBCQUU1QzlFMkM2RUU5NTg0NERFRjI2OTJCRTc3NjQ2QjIwRDNCNDI5RjhEQT
 #AwRDIxNDMzRUUwODkxQzY2NzY1OEQ4RDBDNDhFMzgiLCAiSyI6ICJEQjNGRkY5REE1
 #OTU3NjcxNUIwNEQ0REY4REM4RDE4REIyNDMwRTU3QkJFRDMzN0RCRUVFNUJCMkQ2QU
 #I2Q0VEREM5Qzc1QzVDMEIxN0ZBRDdFQjcyNERBQTEyRjhGMTkwM0RENkMyQ0VERTYx
 #MzVBIiwgIklTS19JUiI6ICI1OTk4OTJBMjA3OEE4Qzk4ODE4MTYyNUUxRTVFNUY3QT
 #YxNjNGN0Q3MkYyMUI5M0VCRUZCQTBGMTdGRjdFQTNBQTA1OTRCRDU2OUNGNzQyNjQx
 #NTdCM0MwMDg3QkRDQ0YyRjU5Qzc3MTU2NjI4NDg3RjVDQTE2NDVCOEU5RDA1QiIsIC
 #JJU0tfU1kiOiAiM0FDNzNGMDMwMzAyOTZBQTU5MUYwMTMyNkIxOEFGQTQ3RTExODkx
 #MjlDRDA2QUU4REZCMDVFNkVCMTMxMENERTk0OEI1OUVFRjA3NTUzNjVDMDZBMzM5Mj
 #Y2QUZFNTk0OTQ4QzU2QTUzOEQ5OEE2NTc2NzExMzkzOEE5QTc4RDgiLCAic2lkX291
 #dHB1dF9pciI6ICIwMEEyMzMzQTc5NDgxQUJFNzFFRkQ2NTk0RDdCQkFBQzU1QzgwOD
 #Q4MkU4NjlDOUI2NUM0QjUzRDcxMDBEM0RBOEYzQ0FCRDU5RkEwQzFGMjJENkQyRjlB
 #QzBDMDkzOTYyMjkyNzk4RkNBMkMwQjkzMjY4OTc0Q0FENzVENTc1QSIsICJzaWRfb3
 #V0cHV0X29jIjogIkExQ0U5MDUzN0E4RDUzQjA2RDc3RTc5RkU3MTk0NjFDQzVFRDgz
 #MDBEMjFEMTg2NkE1OUY5NjM4NjAxODMzRjU3QThCNUU4OERCOUE1MkFCRkExQjRFOE
 #E2NTFBNDAwQkM5MjA1MDgyQUFEODFFQjMxMUM0NDM3M0I5QTE5RUZGIn0=
]]></sourcecode>
        </section>
        <section anchor="test-vectors-for-gx448scalarmultvfy-low-order-points">
          <name>Test vectors for G_X448.scalar_mult_vfy: low order points</name>
          <t>Test vectors for which G_X448.scalar_mult_vfy(s_in,ux) must return the neutral
element.
This includes points that are non-canonicaly encoded, i.e. have coordinate values
larger
than the field prime.</t>
          <t>Weak points for X448 smaller than the field prime (canonical)</t>
          <artwork><![CDATA[
  u0: (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  u1: (length: 56 bytes)
    0100000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  u2: (length: 56 bytes)
    fefffffffffffffffffffffffffffffffffffffffffffffffffffffffe
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff
]]></artwork>
          <t>Weak points for X448 larger or equal to the field prime (non-canonical)</t>
          <artwork><![CDATA[
  u3: (length: 56 bytes)
    fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff
  u4: (length: 56 bytes)
    00000000000000000000000000000000000000000000000000000000ff
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff

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

  point coordinate u_twist on the twist: (length: 56 bytes)
    c981cd1e1f72d9c35c7d7cf6be426757c0dc8206a2fcfa564a8e7618c0
    3c0e61f9a2eb1c3e0dd97d6e9b1010f5edd03397a83f5a914cb3ff
  G_X448.scalar_mult_vfy(s,u_twist): (length: 56 bytes)
    d0a2bb7e9c5c2c627793d8342f23b759fe7d9e3320a85ca4fd61376331
    50ffd9a9148a9b75c349fac43d64bec49a6e126cc92cbfbf353961
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-10">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkxIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMiI6ICIwMT
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwIiwgIkludmFsaWQgWTMiOiAiRkVGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbnZh
 #bGlkIFk0IjogIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNSI6ICIwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGIiwgIlZhbGlkIChvbiBjdXJ2ZSkiOiB7InMiOiAiQUY4QTE0MjE4QkYyQTIw
 #NjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0YxNU
 #ZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FERCIs
 #ICJ1X2N1cnZlIjogIkFCMEM2OEQ3NzJFQzJFQjlERTI1QzQ5NzAwRTQ2RDYzMjVFNj
 #ZENkFBMzlEN0I2NUVCODRBNjhDNTU2OUQ0N0JENzFCNDFGM0UwRDIxMEY0NEUxNDZE
 #RUM4OTI2QjE3NEFDQjNGOTQwQTBCODJDQUIiLCAicmVzX2N1cnZlIjogIjNCMEZBOU
 #JDNDBBNkZEQzc4QzlFMDZGRjdBNTRDMTQzQzVENTJGMzY1NjA3MDUzQkYwNjU2RjUx
 #NDIwNDk2Mjk1RjkxMEExMDFCMzhFREMxQUNEM0JEMjQwRkQ1NURDQjdBMzYwNTUzQj
 #hBNzYyN0UifSwgIlZhbGlkIChvbiB0d2lzdCkiOiB7InMiOiAiQUY4QTE0MjE4QkYy
 #QTIwNjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0
 #YxNUZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FE
 #RCIsICJ1X3R3aXN0IjogIkM5ODFDRDFFMUY3MkQ5QzM1QzdEN0NGNkJFNDI2NzU3Qz
 #BEQzgyMDZBMkZDRkE1NjRBOEU3NjE4QzAzQzBFNjFGOUEyRUIxQzNFMEREOTdENkU5
 #QjEwMTBGNUVERDAzMzk3QTgzRjVBOTE0Q0IzRkYiLCAicmVzX3R3aXN0IjogIkQwQT
 #JCQjdFOUM1QzJDNjI3NzkzRDgzNDJGMjNCNzU5RkU3RDlFMzMyMEE4NUNBNEZENjEz
 #NzYzMzE1MEZGRDlBOTE0OEE5Qjc1QzM0OUZBQzQzRDY0QkVDNDlBNkUxMjZDQzkyQ0
 #JGQkYzNTM5NjEifX0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-ristretto255-and-hash-sha-512">
        <name>Test vector for CPace using group ristretto255 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-ristretto255">
          <name>Test vectors for calculate_generator with group ristretto255</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 100 ;
    DSI = b'CPaceRistretto255'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      11435061636552697374726574746f3235350850617373776f726464
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    hash result: (length: 64 bytes)
      c63a5750e2439c17ccd8213be14fde2f87e1bc637001a97f5929c77b
      30ea0e08afbc75ace5d3d73b2842a79d01488c5fd7ea30d475ee6095
      45af1bfd1ff77c8e
    encoded generator g: (length: 32 bytes)
      a6fc82c3b8968fbb2e06fee81ca858586dea50d248f0c7ca6a18b090
      2a30b36b
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-11">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDAsICJEU0kiOiAiNDM1MDYx
 #NjM2NTUyNjk3Mzc0NzI2NTc0NzQ2RjMyMzUzNSIsICJDSSI6ICI2RjYzMEI0MjVGNz
 #I2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6
 #ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnZW5lcmF0b3Jfc3
 #RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIxMTQzNTA2MTYz
 #NjU1MjY5NzM3NDcyNjU3NDc0NkYzMjM1MzUwODUwNjE3MzczNzc2RjcyNjQ2NDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMU
 #E2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2
 #RjcyMTA3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJoYXNoIHJlc3
 #VsdCI6ICJDNjNBNTc1MEUyNDM5QzE3Q0NEODIxM0JFMTRGREUyRjg3RTFCQzYzNzAw
 #MUE5N0Y1OTI5Qzc3QjMwRUEwRTA4QUZCQzc1QUNFNUQzRDczQjI4NDJBNzlEMDE0OD
 #hDNUZEN0VBMzBENDc1RUU2MDk1NDVBRjFCRkQxRkY3N0M4RSIsICJlbmNvZGVkIGdl
 #bmVyYXRvciBnIjogIkE2RkM4MkMzQjg5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQT
 #UwRDI0OEYwQzdDQTZBMThCMDkwMkEzMEIzNkIifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-2">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      da3d23700a9e5699258aef94dc060dfda5ebb61f02a5ea77fad53f4f
      f0976d08
  Outputs
    Ya: (length: 32 bytes)
      d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c66
      9308f87a
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-2">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      d2316b454718c35362d83d69df6320f38578ed5984651435e2949762
      d900b80d
  Outputs
    Yb: (length: 32 bytes)
      08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67
      2eb7e307
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-2">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa
      0e607e09
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa
      0e607e09
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-2">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      20d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c
      669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d39840
      3319c2341bd506a92e672eb7e30703414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774
      fc0f41e6b711569190ff88fa0e607e0920d40fb265a7abeaee7939d9
      1a585fe59f7053f982c296ec413c624c669308f87a034144612008bc
      f6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e672eb7
      e30703414462
    ISK result: (length: 64 bytes)
      4c5469a16b2364c4b944ebc1a79e51d1674ad47db26e8718154f59fa
      ebfaa52d8346f30aa58377117eb20d527f2cbc5c76381f7fd372e89d
      f8239f87f2e02ed1
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-2">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f6320d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c
      624c669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d3
      98403319c2341bd506a92e672eb7e30703414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 148 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774
      fc0f41e6b711569190ff88fa0e607e096f6320d40fb265a7abeaee79
      39d91a585fe59f7053f982c296ec413c624c669308f87a0341446120
      08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67
      2eb7e30703414462
    ISK result: (length: 64 bytes)
      980dcc5a1c52ceea031e75f38ed266586616488c5c5780285fcbcf79
      087c7bcdbd993502eee606b718ba31e840a000a7b7befe15ea427c5c
      fe88344fa1237f35
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-2">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      2a76d3bbc499dfdc4dcacc9ff042f4e1a54e3843258e100ccd7c60f0
      a541f9d3ebf025e68a460dde218bd39f0711bc6fa11409c9d7b69d8c
      cf6b32fc51ddb699
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      ca4b50700c46203ccd10bc0e9f31095e508189cb59857537be561048
      d34b9ed9a9697af11c998f484c3d783b0b531434caa6835d4c32344f
      cd17160c9c348fc7
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-2">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0xa6,0xfc,0x82,0xc3,0xb8,0x96,0x8f,0xbb,0x2e,0x06,0xfe,0xe8,
 0x1c,0xa8,0x58,0x58,0x6d,0xea,0x50,0xd2,0x48,0xf0,0xc7,0xca,
 0x6a,0x18,0xb0,0x90,0x2a,0x30,0xb3,0x6b,
};
const unsigned char tc_ya[] = {
 0xda,0x3d,0x23,0x70,0x0a,0x9e,0x56,0x99,0x25,0x8a,0xef,0x94,
 0xdc,0x06,0x0d,0xfd,0xa5,0xeb,0xb6,0x1f,0x02,0xa5,0xea,0x77,
 0xfa,0xd5,0x3f,0x4f,0xf0,0x97,0x6d,0x08,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd4,0x0f,0xb2,0x65,0xa7,0xab,0xea,0xee,0x79,0x39,0xd9,0x1a,
 0x58,0x5f,0xe5,0x9f,0x70,0x53,0xf9,0x82,0xc2,0x96,0xec,0x41,
 0x3c,0x62,0x4c,0x66,0x93,0x08,0xf8,0x7a,
};
const unsigned char tc_yb[] = {
 0xd2,0x31,0x6b,0x45,0x47,0x18,0xc3,0x53,0x62,0xd8,0x3d,0x69,
 0xdf,0x63,0x20,0xf3,0x85,0x78,0xed,0x59,0x84,0x65,0x14,0x35,
 0xe2,0x94,0x97,0x62,0xd9,0x00,0xb8,0x0d,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x08,0xbc,0xf6,0xe9,0x77,0x7a,0x9c,0x31,0x3a,0x3d,0xb6,0xda,
 0xa5,0x10,0xf2,0xd3,0x98,0x40,0x33,0x19,0xc2,0x34,0x1b,0xd5,
 0x06,0xa9,0x2e,0x67,0x2e,0xb7,0xe3,0x07,
};
const unsigned char tc_K[] = {
 0xe2,0x2b,0x1e,0xf7,0x78,0x8f,0x66,0x14,0x78,0xf3,0xcd,0xdd,
 0x4c,0x60,0x07,0x74,0xfc,0x0f,0x41,0xe6,0xb7,0x11,0x56,0x91,
 0x90,0xff,0x88,0xfa,0x0e,0x60,0x7e,0x09,
};
const unsigned char tc_ISK_IR[] = {
 0x4c,0x54,0x69,0xa1,0x6b,0x23,0x64,0xc4,0xb9,0x44,0xeb,0xc1,
 0xa7,0x9e,0x51,0xd1,0x67,0x4a,0xd4,0x7d,0xb2,0x6e,0x87,0x18,
 0x15,0x4f,0x59,0xfa,0xeb,0xfa,0xa5,0x2d,0x83,0x46,0xf3,0x0a,
 0xa5,0x83,0x77,0x11,0x7e,0xb2,0x0d,0x52,0x7f,0x2c,0xbc,0x5c,
 0x76,0x38,0x1f,0x7f,0xd3,0x72,0xe8,0x9d,0xf8,0x23,0x9f,0x87,
 0xf2,0xe0,0x2e,0xd1,
};
const unsigned char tc_ISK_SY[] = {
 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3,
 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28,
 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02,
 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7,
 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f,
 0xa1,0x23,0x7f,0x35,
};
const unsigned char tc_ISK_SY[] = {
 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3,
 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28,
 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02,
 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7,
 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f,
 0xa1,0x23,0x7f,0x35,
};
const unsigned char tc_sid_out_ir[] = {
 0x2a,0x76,0xd3,0xbb,0xc4,0x99,0xdf,0xdc,0x4d,0xca,0xcc,0x9f,
 0xf0,0x42,0xf4,0xe1,0xa5,0x4e,0x38,0x43,0x25,0x8e,0x10,0x0c,
 0xcd,0x7c,0x60,0xf0,0xa5,0x41,0xf9,0xd3,0xeb,0xf0,0x25,0xe6,
 0x8a,0x46,0x0d,0xde,0x21,0x8b,0xd3,0x9f,0x07,0x11,0xbc,0x6f,
 0xa1,0x14,0x09,0xc9,0xd7,0xb6,0x9d,0x8c,0xcf,0x6b,0x32,0xfc,
 0x51,0xdd,0xb6,0x99,
};
const unsigned char tc_sid_out_oc[] = {
 0xca,0x4b,0x50,0x70,0x0c,0x46,0x20,0x3c,0xcd,0x10,0xbc,0x0e,
 0x9f,0x31,0x09,0x5e,0x50,0x81,0x89,0xcb,0x59,0x85,0x75,0x37,
 0xbe,0x56,0x10,0x48,0xd3,0x4b,0x9e,0xd9,0xa9,0x69,0x7a,0xf1,
 0x1c,0x99,0x8f,0x48,0x4c,0x3d,0x78,0x3b,0x0b,0x53,0x14,0x34,
 0xca,0xa6,0x83,0x5d,0x4c,0x32,0x34,0x4f,0xcd,0x17,0x16,0x0c,
 0x9c,0x34,0x8f,0xc7,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-12">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIkE2RkM4MkMzQj
 #g5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQTUwRDI0OEYwQzdDQTZBMThCMDkwMkEz
 #MEIzNkIiLCAieWEiOiAiREEzRDIzNzAwQTlFNTY5OTI1OEFFRjk0REMwNjBERkRBNU
 #VCQjYxRjAyQTVFQTc3RkFENTNGNEZGMDk3NkQwOCIsICJBRGEiOiAiNDE0NDYxIiwg
 #IllhIjogIkQ0MEZCMjY1QTdBQkVBRUU3OTM5RDkxQTU4NUZFNTlGNzA1M0Y5ODJDMj
 #k2RUM0MTNDNjI0QzY2OTMwOEY4N0EiLCAieWIiOiAiRDIzMTZCNDU0NzE4QzM1MzYy
 #RDgzRDY5REY2MzIwRjM4NTc4RUQ1OTg0NjUxNDM1RTI5NDk3NjJEOTAwQjgwRCIsIC
 #JBRGIiOiAiNDE0NDYyIiwgIlliIjogIjA4QkNGNkU5Nzc3QTlDMzEzQTNEQjZEQUE1
 #MTBGMkQzOTg0MDMzMTlDMjM0MUJENTA2QTkyRTY3MkVCN0UzMDciLCAiSyI6ICJFMj
 #JCMUVGNzc4OEY2NjE0NzhGM0NEREQ0QzYwMDc3NEZDMEY0MUU2QjcxMTU2OTE5MEZG
 #ODhGQTBFNjA3RTA5IiwgIklTS19JUiI6ICI0QzU0NjlBMTZCMjM2NEM0Qjk0NEVCQz
 #FBNzlFNTFEMTY3NEFENDdEQjI2RTg3MTgxNTRGNTlGQUVCRkFBNTJEODM0NkYzMEFB
 #NTgzNzcxMTdFQjIwRDUyN0YyQ0JDNUM3NjM4MUY3RkQzNzJFODlERjgyMzlGODdGMk
 #UwMkVEMSIsICJJU0tfU1kiOiAiOTgwRENDNUExQzUyQ0VFQTAzMUU3NUYzOEVEMjY2
 #NTg2NjE2NDg4QzVDNTc4MDI4NUZDQkNGNzkwODdDN0JDREJEOTkzNTAyRUVFNjA2Qj
 #cxOEJBMzFFODQwQTAwMEE3QjdCRUZFMTVFQTQyN0M1Q0ZFODgzNDRGQTEyMzdGMzUi
 #LCAic2lkX291dHB1dF9pciI6ICIyQTc2RDNCQkM0OTlERkRDNERDQUNDOUZGMDQyRj
 #RFMUE1NEUzODQzMjU4RTEwMENDRDdDNjBGMEE1NDFGOUQzRUJGMDI1RTY4QTQ2MERE
 #RTIxOEJEMzlGMDcxMUJDNkZBMTE0MDlDOUQ3QjY5RDhDQ0Y2QjMyRkM1MUREQjY5OS
 #IsICJzaWRfb3V0cHV0X29jIjogIkNBNEI1MDcwMEM0NjIwM0NDRDEwQkMwRTlGMzEw
 #OTVFNTA4MTg5Q0I1OTg1NzUzN0JFNTYxMDQ4RDM0QjlFRDlBOTY5N0FGMTFDOTk4Rj
 #Q4NEMzRDc4M0IwQjUzMTQzNENBQTY4MzVENEMzMjM0NEZDRDE3MTYwQzlDMzQ4RkM3
 #In0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    X: (length: 32 bytes)
      2c3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    G.scalar_mult(s,decode(X)): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
    G.scalar_mult_vfy(s,X): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    Y_i1: (length: 32 bytes)
      2b3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    Y_i2 == G.I: (length: 32 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-13">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI3Q0QwRTA3NUZBNzk1NUJBNTJDMDI3NTlBNkM5MERCQk
 #ZDMTBFNkQ0MEFFQThEMjgzRTQwN0Q4OENGNTM4QTA1IiwgIlgiOiAiMkMzQzZCOEM0
 #RjM4MDBFN0FFRjY4NjQwMjVCNEVENzlCRDU5OTExN0U0MjdDNDFCRDQ3RDkzRDY1NE
 #I0QTUxQyIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICI3QzEzNjQ1RkU3
 #OTBBNDY4RjYyQzM5QkVCNzM4OEU1NDFEODQwNUQxQURFNjlEMTc3OEM1RkUzRTdGNk
 #I2MDBFIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiN0MxMzY0NUZFNzkwQTQ2
 #OEY2MkMzOUJFQjczODhFNTQxRDg0MDVEMUFERTY5RDE3NzhDNUZFM0U3RjZCNjAwRS
 #J9LCAiSW52YWxpZCBZMSI6ICIyQjNDNkI4QzRGMzgwMEU3QUVGNjg2NDAyNUI0RUQ3
 #OUJENTk5MTE3RTQyN0M0MUJENDdEOTNENjU0QjRBNTFDIiwgIkludmFsaWQgWTIiOi
 #AiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-decaf448-and-hash-shake-256">
        <name>Test vector for CPace using group decaf448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-decaf448">
          <name>Test vectors for calculate_generator with group decaf448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 112 ;
    DSI = b'CPaceDecaf448'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 180 bytes)
      0d435061636544656361663434380850617373776f72647000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000001a6f630b
      425f726573706f6e6465720b415f696e69746961746f72105223e0cd
      c45d6575668d64c552004124
    hash result: (length: 112 bytes)
      7148f4d60587aaafa64d2fd6bcfe45ee71e8b971d1d5ff3bbf8c1451
      797c62a1af22ab25638749f97f9b15fedcf4aeee87282cf667594ab0
      92b6023c8f8d3a61c38b0af791c9271137df01b57d63b79734bbce69
      91e3e2e10fdc805abc9e6e6f3daeff6fd34093d26de240b326764252
    encoded generator g: (length: 56 bytes)
      9a700ecc378eb98e57387df456d5b4b4f1dceebbb1371527eeb7e1bf
      bab64ecc9c9303396145ba04f5b5aea5baedfa61f31f00fbc5fd5606
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-14">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExMiwgIkRTSSI6ICI0MzUw
 #NjE2MzY1NDQ2NTYzNjE2NjM0MzQzOCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNz
 #A2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1MjIz
 #RTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnZW5lcmF0b3Jfc3RyaW5nKE
 #cuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIwRDQzNTA2MTYzNjU0NDY1
 #NjM2MTY2MzQzNDM4MDg1MDYxNzM3Mzc3NkY3MjY0NzAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2
 #OTc0Njk2MTc0NkY3MjEwNTIyM0UwQ0RDNDVENjU3NTY2OEQ2NEM1NTIwMDQxMjQiLC
 #AiaGFzaCByZXN1bHQiOiAiNzE0OEY0RDYwNTg3QUFBRkE2NEQyRkQ2QkNGRTQ1RUU3
 #MUU4Qjk3MUQxRDVGRjNCQkY4QzE0NTE3OTdDNjJBMUFGMjJBQjI1NjM4NzQ5Rjk3Rj
 #lCMTVGRURDRjRBRUVFODcyODJDRjY2NzU5NEFCMDkyQjYwMjNDOEY4RDNBNjFDMzhC
 #MEFGNzkxQzkyNzExMzdERjAxQjU3RDYzQjc5NzM0QkJDRTY5OTFFM0UyRTEwRkRDOD
 #A1QUJDOUU2RTZGM0RBRUZGNkZEMzQwOTNEMjZERTI0MEIzMjY3NjQyNTIiLCAiZW5j
 #b2RlZCBnZW5lcmF0b3IgZyI6ICI5QTcwMEVDQzM3OEVCOThFNTczODdERjQ1NkQ1Qj
 #RCNEYxRENFRUJCQjEzNzE1MjdFRUI3RTFCRkJBQjY0RUNDOUM5MzAzMzk2MTQ1QkEw
 #NEY1QjVBRUE1QkFFREZBNjFGMzFGMDBGQkM1RkQ1NjA2In0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-3">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      33d561f13cfc0dca279c30e8cde895175dc25483892819eba132d58c
      13c0462a8eb0d73fda941950594bef5191d8394691f86edffcad6c1e
  Outputs
    Ya: (length: 56 bytes)
      627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be846c
      c0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e571b
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-3">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      2523c969f68fa2b2aea294c2539ef36eb1e0558abd14712a7828f16a
      85ed2c7e77e2bdd418994405fb1b57b6bbaadd66849892aac9d81402
  Outputs
    Yb: (length: 56 bytes)
      8e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3011871
      7019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f94772db
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-3">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97
      32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97
      32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-3">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      38627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be84
      6cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e57
      1b03414461388e9811e4402fac098743ca7b2b509b91b38c8cf1360c
      c6cab30118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f
      8399f94772db03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363
      cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7
      6d473e01689af77f38627f8bb2ae945e2a518967df9b00aff19253d3
      086398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a937
      2a17e66bb7006e571b03414461388e9811e4402fac098743ca7b2b50
      9b91b38c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b7
      74e6b0e0b826ff4f8399f94772db03414462
    ISK result: (length: 64 bytes)
      9c2726a6cda1179349cbc38f31765eab646a2a5f176f3019fab4a0aa
      bd9d17c2ba895998cff698d801761a003512c1cf67d144b21e1cb6d6
      b82da71d0da76cad
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-3">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f63388e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3
      0118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f9
      4772db0341446238627f8bb2ae945e2a518967df9b00aff19253d308
      6398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a
      17e66bb7006e571b03414461
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 216 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363
      cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7
      6d473e01689af77f6f63388e9811e4402fac098743ca7b2b509b91b3
      8c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b774e6b0
      e0b826ff4f8399f94772db0341446238627f8bb2ae945e2a518967df
      9b00aff19253d3086398f2ec18be846cc0d1f286c2ce3caf1da63985
      9ccd2a6a01a9372a17e66bb7006e571b03414461
    ISK result: (length: 64 bytes)
      6d2178ed3048703025b9007ec84c4d969e8d8135df455e608c16aa15
      2e1219c86cea563254428a9d969903ae3649d1050da1e6e0c1c060e1
      ebf7316a7e993389
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-3">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      65bffde17b7acf07cfd437bdb973a8f7340bf911d393a61498c0a50e
      f0d68bca103fbdb0f5b799505562e59811df1bc5d9b4f5f0f7c57c22
      cd7ed6db4d153e3a
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      7ce27043d1b1d0d0e02e16979637e2a00547ed6e15ea988f7d3c9b3c
      2159b26ab3834bff7ff86240323e25216ba2ee6ea6e1582502017f8e
      6d65f8c4a5e65543
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-3">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0x9a,0x70,0x0e,0xcc,0x37,0x8e,0xb9,0x8e,0x57,0x38,0x7d,0xf4,
 0x56,0xd5,0xb4,0xb4,0xf1,0xdc,0xee,0xbb,0xb1,0x37,0x15,0x27,
 0xee,0xb7,0xe1,0xbf,0xba,0xb6,0x4e,0xcc,0x9c,0x93,0x03,0x39,
 0x61,0x45,0xba,0x04,0xf5,0xb5,0xae,0xa5,0xba,0xed,0xfa,0x61,
 0xf3,0x1f,0x00,0xfb,0xc5,0xfd,0x56,0x06,
};
const unsigned char tc_ya[] = {
 0x33,0xd5,0x61,0xf1,0x3c,0xfc,0x0d,0xca,0x27,0x9c,0x30,0xe8,
 0xcd,0xe8,0x95,0x17,0x5d,0xc2,0x54,0x83,0x89,0x28,0x19,0xeb,
 0xa1,0x32,0xd5,0x8c,0x13,0xc0,0x46,0x2a,0x8e,0xb0,0xd7,0x3f,
 0xda,0x94,0x19,0x50,0x59,0x4b,0xef,0x51,0x91,0xd8,0x39,0x46,
 0x91,0xf8,0x6e,0xdf,0xfc,0xad,0x6c,0x1e,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x62,0x7f,0x8b,0xb2,0xae,0x94,0x5e,0x2a,0x51,0x89,0x67,0xdf,
 0x9b,0x00,0xaf,0xf1,0x92,0x53,0xd3,0x08,0x63,0x98,0xf2,0xec,
 0x18,0xbe,0x84,0x6c,0xc0,0xd1,0xf2,0x86,0xc2,0xce,0x3c,0xaf,
 0x1d,0xa6,0x39,0x85,0x9c,0xcd,0x2a,0x6a,0x01,0xa9,0x37,0x2a,
 0x17,0xe6,0x6b,0xb7,0x00,0x6e,0x57,0x1b,
};
const unsigned char tc_yb[] = {
 0x25,0x23,0xc9,0x69,0xf6,0x8f,0xa2,0xb2,0xae,0xa2,0x94,0xc2,
 0x53,0x9e,0xf3,0x6e,0xb1,0xe0,0x55,0x8a,0xbd,0x14,0x71,0x2a,
 0x78,0x28,0xf1,0x6a,0x85,0xed,0x2c,0x7e,0x77,0xe2,0xbd,0xd4,
 0x18,0x99,0x44,0x05,0xfb,0x1b,0x57,0xb6,0xbb,0xaa,0xdd,0x66,
 0x84,0x98,0x92,0xaa,0xc9,0xd8,0x14,0x02,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x8e,0x98,0x11,0xe4,0x40,0x2f,0xac,0x09,0x87,0x43,0xca,0x7b,
 0x2b,0x50,0x9b,0x91,0xb3,0x8c,0x8c,0xf1,0x36,0x0c,0xc6,0xca,
 0xb3,0x01,0x18,0x71,0x70,0x19,0x78,0x2b,0x7f,0x58,0xa5,0x91,
 0xc6,0x3d,0x9c,0x92,0x47,0xb7,0x74,0xe6,0xb0,0xe0,0xb8,0x26,
 0xff,0x4f,0x83,0x99,0xf9,0x47,0x72,0xdb,
};
const unsigned char tc_K[] = {
 0x94,0xf4,0xae,0x49,0x4f,0x4e,0x8b,0x07,0xad,0xe3,0x35,0x47,
 0x26,0xee,0xe4,0x9c,0x55,0x18,0xb3,0x63,0xcd,0xa5,0x44,0xf5,
 0xb4,0x54,0x1b,0x97,0x32,0x83,0x0b,0xe3,0x7e,0xa0,0xe6,0x3f,
 0xc8,0x3f,0x54,0xbe,0x28,0x0d,0xea,0x07,0x47,0xa0,0x43,0xc7,
 0x6d,0x47,0x3e,0x01,0x68,0x9a,0xf7,0x7f,
};
const unsigned char tc_ISK_IR[] = {
 0x9c,0x27,0x26,0xa6,0xcd,0xa1,0x17,0x93,0x49,0xcb,0xc3,0x8f,
 0x31,0x76,0x5e,0xab,0x64,0x6a,0x2a,0x5f,0x17,0x6f,0x30,0x19,
 0xfa,0xb4,0xa0,0xaa,0xbd,0x9d,0x17,0xc2,0xba,0x89,0x59,0x98,
 0xcf,0xf6,0x98,0xd8,0x01,0x76,0x1a,0x00,0x35,0x12,0xc1,0xcf,
 0x67,0xd1,0x44,0xb2,0x1e,0x1c,0xb6,0xd6,0xb8,0x2d,0xa7,0x1d,
 0x0d,0xa7,0x6c,0xad,
};
const unsigned char tc_ISK_SY[] = {
 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e,
 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60,
 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32,
 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05,
 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a,
 0x7e,0x99,0x33,0x89,
};
const unsigned char tc_ISK_SY[] = {
 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e,
 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60,
 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32,
 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05,
 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a,
 0x7e,0x99,0x33,0x89,
};
const unsigned char tc_sid_out_ir[] = {
 0x65,0xbf,0xfd,0xe1,0x7b,0x7a,0xcf,0x07,0xcf,0xd4,0x37,0xbd,
 0xb9,0x73,0xa8,0xf7,0x34,0x0b,0xf9,0x11,0xd3,0x93,0xa6,0x14,
 0x98,0xc0,0xa5,0x0e,0xf0,0xd6,0x8b,0xca,0x10,0x3f,0xbd,0xb0,
 0xf5,0xb7,0x99,0x50,0x55,0x62,0xe5,0x98,0x11,0xdf,0x1b,0xc5,
 0xd9,0xb4,0xf5,0xf0,0xf7,0xc5,0x7c,0x22,0xcd,0x7e,0xd6,0xdb,
 0x4d,0x15,0x3e,0x3a,
};
const unsigned char tc_sid_out_oc[] = {
 0x7c,0xe2,0x70,0x43,0xd1,0xb1,0xd0,0xd0,0xe0,0x2e,0x16,0x97,
 0x96,0x37,0xe2,0xa0,0x05,0x47,0xed,0x6e,0x15,0xea,0x98,0x8f,
 0x7d,0x3c,0x9b,0x3c,0x21,0x59,0xb2,0x6a,0xb3,0x83,0x4b,0xff,
 0x7f,0xf8,0x62,0x40,0x32,0x3e,0x25,0x21,0x6b,0xa2,0xee,0x6e,
 0xa6,0xe1,0x58,0x25,0x02,0x01,0x7f,0x8e,0x6d,0x65,0xf8,0xc4,
 0xa5,0xe6,0x55,0x43,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-15">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIjlBNzAwRUNDMz
 #c4RUI5OEU1NzM4N0RGNDU2RDVCNEI0RjFEQ0VFQkJCMTM3MTUyN0VFQjdFMUJGQkFC
 #NjRFQ0M5QzkzMDMzOTYxNDVCQTA0RjVCNUFFQTVCQUVERkE2MUYzMUYwMEZCQzVGRD
 #U2MDYiLCAieWEiOiAiMzNENTYxRjEzQ0ZDMERDQTI3OUMzMEU4Q0RFODk1MTc1REMy
 #NTQ4Mzg5MjgxOUVCQTEzMkQ1OEMxM0MwNDYyQThFQjBENzNGREE5NDE5NTA1OTRCRU
 #Y1MTkxRDgzOTQ2OTFGODZFREZGQ0FENkMxRSIsICJBRGEiOiAiNDE0NDYxIiwgIllh
 #IjogIjYyN0Y4QkIyQUU5NDVFMkE1MTg5NjdERjlCMDBBRkYxOTI1M0QzMDg2Mzk4Rj
 #JFQzE4QkU4NDZDQzBEMUYyODZDMkNFM0NBRjFEQTYzOTg1OUNDRDJBNkEwMUE5Mzcy
 #QTE3RTY2QkI3MDA2RTU3MUIiLCAieWIiOiAiMjUyM0M5NjlGNjhGQTJCMkFFQTI5NE
 #MyNTM5RUYzNkVCMUUwNTU4QUJEMTQ3MTJBNzgyOEYxNkE4NUVEMkM3RTc3RTJCREQ0
 #MTg5OTQ0MDVGQjFCNTdCNkJCQUFERDY2ODQ5ODkyQUFDOUQ4MTQwMiIsICJBRGIiOi
 #AiNDE0NDYyIiwgIlliIjogIjhFOTgxMUU0NDAyRkFDMDk4NzQzQ0E3QjJCNTA5Qjkx
 #QjM4QzhDRjEzNjBDQzZDQUIzMDExODcxNzAxOTc4MkI3RjU4QTU5MUM2M0Q5QzkyND
 #dCNzc0RTZCMEUwQjgyNkZGNEY4Mzk5Rjk0NzcyREIiLCAiSyI6ICI5NEY0QUU0OTRG
 #NEU4QjA3QURFMzM1NDcyNkVFRTQ5QzU1MThCMzYzQ0RBNTQ0RjVCNDU0MUI5NzMyOD
 #MwQkUzN0VBMEU2M0ZDODNGNTRCRTI4MERFQTA3NDdBMDQzQzc2RDQ3M0UwMTY4OUFG
 #NzdGIiwgIklTS19JUiI6ICI5QzI3MjZBNkNEQTExNzkzNDlDQkMzOEYzMTc2NUVBQj
 #Y0NkEyQTVGMTc2RjMwMTlGQUI0QTBBQUJEOUQxN0MyQkE4OTU5OThDRkY2OThEODAx
 #NzYxQTAwMzUxMkMxQ0Y2N0QxNDRCMjFFMUNCNkQ2QjgyREE3MUQwREE3NkNBRCIsIC
 #JJU0tfU1kiOiAiNkQyMTc4RUQzMDQ4NzAzMDI1QjkwMDdFQzg0QzREOTY5RThEODEz
 #NURGNDU1RTYwOEMxNkFBMTUyRTEyMTlDODZDRUE1NjMyNTQ0MjhBOUQ5Njk5MDNBRT
 #M2NDlEMTA1MERBMUU2RTBDMUMwNjBFMUVCRjczMTZBN0U5OTMzODkiLCAic2lkX291
 #dHB1dF9pciI6ICI2NUJGRkRFMTdCN0FDRjA3Q0ZENDM3QkRCOTczQThGNzM0MEJGOT
 #ExRDM5M0E2MTQ5OEMwQTUwRUYwRDY4QkNBMTAzRkJEQjBGNUI3OTk1MDU1NjJFNTk4
 #MTFERjFCQzVEOUI0RjVGMEY3QzU3QzIyQ0Q3RUQ2REI0RDE1M0UzQSIsICJzaWRfb3
 #V0cHV0X29jIjogIjdDRTI3MDQzRDFCMUQwRDBFMDJFMTY5Nzk2MzdFMkEwMDU0N0VE
 #NkUxNUVBOTg4RjdEM0M5QjNDMjE1OUIyNkFCMzgzNEJGRjdGRjg2MjQwMzIzRTI1Mj
 #E2QkEyRUU2RUE2RTE1ODI1MDIwMTdGOEU2RDY1RjhDNEE1RTY1NTQzIn0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs-1">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    X: (length: 56 bytes)
      601431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    G.scalar_mult(s,decode(X)): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
    G.scalar_mult_vfy(s,X): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-1">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    Y_i1: (length: 56 bytes)
      5f1431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    Y_i2 == G.I: (length: 56 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-16">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJERDFCQzcwMTVEQUFCQjc2NzIxMjlDQzM1QTNCQTgxNT
 #Q4NkIxMzlERUZGOUJERUNBN0E0RkM2MTM0MzIzRDM0NjU4NzYxRTkwRkYwNzk5NzJB
 #N0NBOEFBNTYwNjQ5OEY0RjRGMEVCQzA5MzNBODE5IiwgIlgiOiAiNjAxNDMxRDVFNT
 #FGNDNENDIyQTkyRDNGQjIzNzNCREUyODIxN0FBQjQyNTI0QzM0MUFBNDA0RUFCQTVB
 #QTU1NDFGNzA0MkRCQjMyNTNDRTRDOTBGNzcyQjAzOEE0MTNEQ0IzQTBGNkJGM0FFOU
 #UyMSIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICIzODhCMzVDNjBFQjQx
 #QjY2MDg1QTIxMTgzMTYyMTg2ODFENzg5NzlENjY3NzAyREUxMDVGREMxRjIxRkZFOD
 #g0QTU3N0Q3OTVGNDU2OTE3ODEzOTBBMjI5QTNCRDdCNTI3RTgzMTM4MEYyRjU4NUE0
 #IiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiMzg4QjM1QzYwRUI0MUI2NjA4NU
 #EyMTE4MzE2MjE4NjgxRDc4OTc5RDY2NzcwMkRFMTA1RkRDMUYyMUZGRTg4NEE1NzdE
 #Nzk1RjQ1NjkxNzgxMzkwQTIyOUEzQkQ3QjUyN0U4MzEzODBGMkY1ODVBNCJ9LCAiSW
 #52YWxpZCBZMSI6ICI1RjE0MzFENUU1MUY0M0Q0MjJBOTJEM0ZCMjM3M0JERTI4MjE3
 #QUFCNDI1MjRDMzQxQUE0MDRFQUJBNUFBNTU0MUY3MDQyREJCMzI1M0NFNEM5MEY3Nz
 #JCMDM4QTQxM0RDQjNBMEY2QkYzQUU5RTIxIiwgIkludmFsaWQgWTIiOiAiMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-256-and-hash-sha-256">
        <name>Test vector for CPace using group NIST P-256 and hash SHA-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-256">
          <name>Test vectors for calculate_generator with group NIST P-256</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-256 with input block size 64 bytes.
    PRS = b'Password' ; ZPAD length: 23 ;
    DSI = b'CPaceP256_XMD:SHA-256_SSWU_NU_'
    DST = b'CPaceP256_XMD:SHA-256_SSWU_NU__DST'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 34b36454cab2e7842c389f7d88ecb7df
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 108 bytes)
      1e4350616365503235365f584d443a5348412d3235365f535357555f
      4e555f0850617373776f726417000000000000000000000000000000
      00000000000000001a6f630b425f726573706f6e6465720b415f696e
      69746961746f721034b36454cab2e7842c389f7d88ecb7df
    generator g: (length: 65 bytes)
      04eee577320b1c241a79419fcde5718c2b63f81ef8717d56a57d2fb2
      6b65a8beb63573b52605efb32ff4cf31aaef9a92df84e4e8408cc6c7
      cf27a535aad2b38a56
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-17">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0yNTYiLCAiSC5zX2luX2J5dGVzIjogNjQsICJQUlMiOiAiNTA2MT
 #czNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDIzLCAiRFNJIjogIjQzNTA2MTYz
 #NjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4NDEyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNT
 #U1RiIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2
 #RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIzNEIzNjQ1NENBQjJFNzg0MkMzODlGN0
 #Q4OEVDQjdERiIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5z
 #X2luX2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4ND
 #EyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDE3MDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2Mz
 #BCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEw
 #MzRCMzY0NTRDQUIyRTc4NDJDMzg5RjdEODhFQ0I3REYiLCAiZ2VuZXJhdG9yIGciOi
 #AiMDRFRUU1NzczMjBCMUMyNDFBNzk0MTlGQ0RFNTcxOEMyQjYzRjgxRUY4NzE3RDU2
 #QTU3RDJGQjI2QjY1QThCRUI2MzU3M0I1MjYwNUVGQjMyRkY0Q0YzMUFBRUY5QTkyRE
 #Y4NEU0RTg0MDhDQzZDN0NGMjdBNTM1QUFEMkIzOEE1NiJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-4">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 32 bytes)
      37574cfbf1b95ff6a8e2d7be462d4d01e6dde2618f34f4de9df869b2
      4f532c5d
  Outputs
    Ya: (length: 65 bytes)
      041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364
      692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c5d
      fdfc2ecdf8e42c5e16
    Alternative correct value for Ya: (-ya)*g:
    (length: 65 bytes)
      041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364
      692fdace1715a59cb0e63df85b2ad1529397e85e9c30d0d01dbf93a2
      0203d132071bd3a1e9
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-4">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 32 bytes)
      e5672fc9eb4e721f41d80181ec4c9fd9886668acc48024d33c82bb10
      2aecba52
  Outputs
    Yb: (length: 65 bytes)
      046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a
      cc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5ce8b677
      a7e38a26f752bf8f84
    Alternative correct value for Yb: (-yb)*g:
    (length: 65 bytes)
      046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a
      cc8ec3544890612d15def6ece092e1c0a1b9c2d2cdf3b0e0a4174988
      581c75d908ad40707b
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-4">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d
      7b8f6b6c
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d
      7b8f6b6c
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-4">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 140 bytes)
      41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e13
      64692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c
      5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8cd
      786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e921091320
      6d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f8403414462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 225 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f
      8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b
      6c41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e
      1364692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe340
      6c5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8
      cd786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e9210913
      206d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f84034144
      62
    ISK result: (length: 32 bytes)
      9565ed286b6e3cf1f943fd31746f9a22935537025a1328d4980005ba
      984f0c39
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-4">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 142 bytes)
      6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1
      617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5c
      e8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24fc0
      4c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19c2
      07a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e160341
      4461
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 227 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f
      8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b
      6c6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158c
      e1617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f
      5ce8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24f
      c04c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19
      c207a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e1603
      414461
    ISK result: (length: 32 bytes)
      62a445a4daa3546dd031c66ead2e4e015abbcc83bde31c90f841149f
      d441c58a
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-4">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      a7386d1c2eb06e8056d7fecbcf691e08d189d96236020ef31b414069
      8a4b99f9
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      d337dbc0dd797b4e6f2f14ea4925c58e5d5523871e8cb43a3c1b0f2b
      1a1ffde3
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-4">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x34,0xb3,0x64,0x54,0xca,0xb2,0xe7,0x84,0x2c,0x38,0x9f,0x7d,
 0x88,0xec,0xb7,0xdf,
};
const unsigned char tc_g[] = {
 0x04,0xee,0xe5,0x77,0x32,0x0b,0x1c,0x24,0x1a,0x79,0x41,0x9f,
 0xcd,0xe5,0x71,0x8c,0x2b,0x63,0xf8,0x1e,0xf8,0x71,0x7d,0x56,
 0xa5,0x7d,0x2f,0xb2,0x6b,0x65,0xa8,0xbe,0xb6,0x35,0x73,0xb5,
 0x26,0x05,0xef,0xb3,0x2f,0xf4,0xcf,0x31,0xaa,0xef,0x9a,0x92,
 0xdf,0x84,0xe4,0xe8,0x40,0x8c,0xc6,0xc7,0xcf,0x27,0xa5,0x35,
 0xaa,0xd2,0xb3,0x8a,0x56,
};
const unsigned char tc_ya[] = {
 0x37,0x57,0x4c,0xfb,0xf1,0xb9,0x5f,0xf6,0xa8,0xe2,0xd7,0xbe,
 0x46,0x2d,0x4d,0x01,0xe6,0xdd,0xe2,0x61,0x8f,0x34,0xf4,0xde,
 0x9d,0xf8,0x69,0xb2,0x4f,0x53,0x2c,0x5d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x1f,0x12,0xad,0x5f,0xc6,0x50,0x10,0xa2,0x4f,0xc0,0x4c,
 0x86,0x19,0x71,0x09,0xa3,0x6d,0xf0,0xe9,0xce,0x85,0xa7,0x47,
 0x9e,0x1e,0x13,0x64,0x69,0x2f,0xda,0xce,0x17,0xea,0x5a,0x63,
 0x4e,0x19,0xc2,0x07,0xa5,0xd5,0x2e,0xad,0x6c,0x68,0x17,0xa1,
 0x63,0xcf,0x2f,0x2f,0xe3,0x40,0x6c,0x5d,0xfd,0xfc,0x2e,0xcd,
 0xf8,0xe4,0x2c,0x5e,0x16,
};
const unsigned char tc_yb[] = {
 0xe5,0x67,0x2f,0xc9,0xeb,0x4e,0x72,0x1f,0x41,0xd8,0x01,0x81,
 0xec,0x4c,0x9f,0xd9,0x88,0x66,0x68,0xac,0xc4,0x80,0x24,0xd3,
 0x3c,0x82,0xbb,0x10,0x2a,0xec,0xba,0x52,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x6a,0x51,0x18,0x0b,0x6e,0xba,0xba,0xf5,0xed,0x0a,0xf8,
 0xcd,0x78,0x68,0x86,0xd9,0x33,0x42,0xbc,0xae,0x4c,0x15,0x8c,
 0xe1,0x61,0x7a,0x0a,0xcc,0x8e,0xc3,0x54,0x48,0x6f,0x9e,0xd2,
 0xe9,0x21,0x09,0x13,0x20,0x6d,0x1e,0x3f,0x5e,0x46,0x3d,0x2d,
 0x32,0x0c,0x4f,0x1f,0x5c,0xe8,0xb6,0x77,0xa7,0xe3,0x8a,0x26,
 0xf7,0x52,0xbf,0x8f,0x84,
};
const unsigned char tc_K[] = {
 0x3e,0x0e,0x2f,0x89,0x76,0xfb,0x8d,0x0d,0xee,0xe3,0x0a,0xef,
 0x4b,0x5c,0xd3,0x63,0x1e,0xed,0x24,0x9a,0xf3,0x2f,0x53,0xd0,
 0xdd,0x00,0x9b,0x5d,0x7b,0x8f,0x6b,0x6c,
};
const unsigned char tc_ISK_IR[] = {
 0x95,0x65,0xed,0x28,0x6b,0x6e,0x3c,0xf1,0xf9,0x43,0xfd,0x31,
 0x74,0x6f,0x9a,0x22,0x93,0x55,0x37,0x02,0x5a,0x13,0x28,0xd4,
 0x98,0x00,0x05,0xba,0x98,0x4f,0x0c,0x39,
};
const unsigned char tc_ISK_SY[] = {
 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e,
 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90,
 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a,
};
const unsigned char tc_ISK_SY[] = {
 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e,
 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90,
 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a,
};
const unsigned char tc_sid_out_ir[] = {
 0xa7,0x38,0x6d,0x1c,0x2e,0xb0,0x6e,0x80,0x56,0xd7,0xfe,0xcb,
 0xcf,0x69,0x1e,0x08,0xd1,0x89,0xd9,0x62,0x36,0x02,0x0e,0xf3,
 0x1b,0x41,0x40,0x69,0x8a,0x4b,0x99,0xf9,
};
const unsigned char tc_sid_out_oc[] = {
 0xd3,0x37,0xdb,0xc0,0xdd,0x79,0x7b,0x4e,0x6f,0x2f,0x14,0xea,
 0x49,0x25,0xc5,0x8e,0x5d,0x55,0x23,0x87,0x1e,0x8c,0xb4,0x3a,
 0x3c,0x1b,0x0f,0x2b,0x1a,0x1f,0xfd,0xe3,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-18">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIz
 #NEIzNjQ1NENBQjJFNzg0MkMzODlGN0Q4OEVDQjdERiIsICJnIjogIjA0RUVFNTc3Mz
 #IwQjFDMjQxQTc5NDE5RkNERTU3MThDMkI2M0Y4MUVGODcxN0Q1NkE1N0QyRkIyNkI2
 #NUE4QkVCNjM1NzNCNTI2MDVFRkIzMkZGNENGMzFBQUVGOUE5MkRGODRFNEU4NDA4Q0
 #M2QzdDRjI3QTUzNUFBRDJCMzhBNTYiLCAieWEiOiAiMzc1NzRDRkJGMUI5NUZGNkE4
 #RTJEN0JFNDYyRDREMDFFNkRERTI2MThGMzRGNERFOURGODY5QjI0RjUzMkM1RCIsIC
 #JBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MUYxMkFENUZDNjUwMTBBMjRGQzA0Qzg2
 #MTk3MTA5QTM2REYwRTlDRTg1QTc0NzlFMUUxMzY0NjkyRkRBQ0UxN0VBNUE2MzRFMT
 #lDMjA3QTVENTJFQUQ2QzY4MTdBMTYzQ0YyRjJGRTM0MDZDNURGREZDMkVDREY4RTQy
 #QzVFMTYiLCAieWIiOiAiRTU2NzJGQzlFQjRFNzIxRjQxRDgwMTgxRUM0QzlGRDk4OD
 #Y2NjhBQ0M0ODAyNEQzM0M4MkJCMTAyQUVDQkE1MiIsICJBRGIiOiAiNDE0NDYyIiwg
 #IlliIjogIjA0NkE1MTE4MEI2RUJBQkFGNUVEMEFGOENENzg2ODg2RDkzMzQyQkNBRT
 #RDMTU4Q0UxNjE3QTBBQ0M4RUMzNTQ0ODZGOUVEMkU5MjEwOTEzMjA2RDFFM0Y1RTQ2
 #M0QyRDMyMEM0RjFGNUNFOEI2NzdBN0UzOEEyNkY3NTJCRjhGODQiLCAiSyI6ICIzRT
 #BFMkY4OTc2RkI4RDBERUVFMzBBRUY0QjVDRDM2MzFFRUQyNDlBRjMyRjUzRDBERDAw
 #OUI1RDdCOEY2QjZDIiwgIklTS19JUiI6ICI5NTY1RUQyODZCNkUzQ0YxRjk0M0ZEMz
 #E3NDZGOUEyMjkzNTUzNzAyNUExMzI4RDQ5ODAwMDVCQTk4NEYwQzM5IiwgIklTS19T
 #WSI6ICI2MkE0NDVBNERBQTM1NDZERDAzMUM2NkVBRDJFNEUwMTVBQkJDQzgzQkRFMz
 #FDOTBGODQxMTQ5RkQ0NDFDNThBIiwgInNpZF9vdXRwdXRfaXIiOiAiQTczODZEMUMy
 #RUIwNkU4MDU2RDdGRUNCQ0Y2OTFFMDhEMTg5RDk2MjM2MDIwRUYzMUI0MTQwNjk4QT
 #RCOTlGOSIsICJzaWRfb3V0cHV0X29jIjogIkQzMzdEQkMwREQ3OTdCNEU2RjJGMTRF
 #QTQ5MjVDNThFNUQ1NTIzODcxRThDQjQzQTNDMUIwRjJCMUExRkZERTMifQ==
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    X: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5831
    G.scalar_mult(s,X) (full coordinates): (length: 65 bytes)
      04f5a191f078c87c36633b78c701751159d56c59f3fe9105b5720673
      470f303ab925b6a7fd1cdd8f649a21cf36b68d9e9c4a11919a951892
      519786104b27033757
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 32 bytes)
      f5a191f078c87c36633b78c701751159d56c59f3fe9105b572067347
      0f303ab9
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-2">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    Y_i1: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5857
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-19">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJGMDEyNTAxQzA5MUZGOUI5OUExMjNGRkZFNTcxRDhCQz
 #AxRTgwNzdFRTU4MTM2MkUxQkQyMTM5OTA4MzU2NDNCIiwgIlgiOiAiMDQyNDY0OEVC
 #OTg2QzJCRTBBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRD
 #EyQkE0RTBGNzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3
 #MzQ2RDEwQTRBQjI1MTRGQUVGNTgzMSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bG
 #wgY29vcmRpbmF0ZXMpIjogIjA0RjVBMTkxRjA3OEM4N0MzNjYzM0I3OEM3MDE3NTEx
 #NTlENTZDNTlGM0ZFOTEwNUI1NzIwNjczNDcwRjMwM0FCOTI1QjZBN0ZEMUNERDhGNj
 #Q5QTIxQ0YzNkI2OEQ5RTlDNEExMTkxOUE5NTE4OTI1MTk3ODYxMDRCMjcwMzM3NTci
 #LCAiRy5zY2FsYXJfbXVsdF92ZnkocyxYKSAob25seSBYLWNvb3JkaW5hdGUpIjogIk
 #Y1QTE5MUYwNzhDODdDMzY2MzNCNzhDNzAxNzUxMTU5RDU2QzU5RjNGRTkxMDVCNTcy
 #MDY3MzQ3MEYzMDNBQjkifSwgIkludmFsaWQgWTEiOiAiMDQyNDY0OEVCOTg2QzJCRT
 #BBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRDEyQkE0RTBG
 #NzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3MzQ2RDEwQT
 #RBQjI1MTRGQUVGNTg1NyIsICJJbnZhbGlkIFkyIjogIjAwIn0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-384-and-hash-sha-384">
        <name>Test vector for CPace using group NIST P-384 and hash SHA-384</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-384">
          <name>Test vectors for calculate_generator with group NIST P-384</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-384 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP384_XMD:SHA-384_SSWU_NU_'
    DST = b'CPaceP384_XMD:SHA-384_SSWU_NU__DST'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5b3773aa90e8f23c61563a4b645b276c
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      1e4350616365503338345f584d443a5348412d3338345f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72105b3773aa90e8f23c61563a4b
      645b276c
    generator g: (length: 97 bytes)
      04ffe1bdc3293fdbe31b2959916e52c018e923eac99836bd9a1cbeec
      794a8d4d78baa32cdafc9685bc1067a780f4ad9c8a6c6e164aa42906
      d1e27f782581adc8e0109219626a2b8fbdc34602e4084554bdd6c0c6
      98dd657ac8e31b2bcce1c7b0d8
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-20">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0zODQiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0ODQxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5
 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiNUIzNzczQUE5MEU4RjIzQzYxNTYzQT
 #RCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu
 #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0OD
 #QxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0
 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwNUIzNzczQUE5MEU4RjIzQzYxNT
 #YzQTRCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yIGciOiAiMDRGRkUxQkRDMzI5M0ZEQkUz
 #MUIyOTU5OTE2RTUyQzAxOEU5MjNFQUM5OTgzNkJEOUExQ0JFRUM3OTRBOEQ0RDc4Qk
 #FBMzJDREFGQzk2ODVCQzEwNjdBNzgwRjRBRDlDOEE2QzZFMTY0QUE0MjkwNkQxRTI3
 #Rjc4MjU4MUFEQzhFMDEwOTIxOTYyNkEyQjhGQkRDMzQ2MDJFNDA4NDU1NEJERDZDME
 #M2OThERDY1N0FDOEUzMUIyQkNDRTFDN0IwRDgifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-5">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 48 bytes)
      ef433dd5ad142c860e7cb6400dd315d388d5ec5420c550e9d6f0907f
      375d988bc4d704837e43561c497e7dd93edcdb9d
  Outputs
    Ya: (length: 97 bytes)
      0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7
      3b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993a3
      6285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1770050
      a94d6826d52f211b234792e66d
    Alternative correct value for Ya: (-ya)*g:
    (length: 97 bytes)
      0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7
      3b96fa1ec78619c5a1e524472778331fbe009fa156b5cdfc1bd66c5c
      9d7a05ab193dbe7b02dd8ba737887e41e9000b924368f33e4d88ffaf
      55b297d92ad0dee4ddb86d1992
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-5">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 48 bytes)
      50b0e36b95a2edfaa8342b843dddc90b175330f2399c1b36586dedda
      3c255975f30be6a750f9404fccc62a6323b5e471
  Outputs
    Yb: (length: 97 bytes)
      040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d
      104cdaeb630b7c5c18748deb25653ad2a4cb5e6274841cad328bb031
      2628b9b1f51bea72b8c610999a6730f752649205ae85c452ef83f98b
      e715cd0103186874b07cf02074
    Alternative correct value for Yb: (-yb)*g:
    (length: 97 bytes)
      040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d
      104cdaeb630b7c5c18748deb25653ad2a4cb5e62747be352cd744fce
      d9d7464e0ae4158d4739ef666598cf08ad9b6dfa517a3bad0f7c0674
      17ea32fefce7978b50830fdf8b
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-5">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 48 bytes)
      a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6
      db858fe161de7576206a8a35bd4a60e00724fd3e
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6
      db858fe161de7576206a8a35bd4a60e00724fd3e
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-5">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 204 bytes)
      610434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310
      b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993
      a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b17700
      50a94d6826d52f211b234792e66d0341446161040a6559147fd492ad
      74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c5c18
      748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea72b8
      c610999a6730f752649205ae85c452ef83f98be715cd0103186874b0
      7cf0207403414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 305 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae
      a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f
      e161de7576206a8a35bd4a60e00724fd3e610434a04da121995d81d7
      c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5a1e5
      24472778331fbe009fa1564a3203e42993a36285fa54e6c24184fd22
      7458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b2347
      92e66d0341446161040a6559147fd492ad74ab1f4def6196fd639954
      0e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb5e62
      74841cad328bb0312628b9b1f51bea72b8c610999a6730f752649205
      ae85c452ef83f98be715cd0103186874b07cf0207403414462
    ISK result: (length: 48 bytes)
      d1b74375c7d63d7de246cbf3fc2b3092645c73a0aa816989c0de6048
      ed4ece6a54df82d05d2be3498cb9288be7bdbdb9
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-5">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 206 bytes)
      6f63610434a04da121995d81d7c5ded02cf2e70954dca49059485ea3
      8310b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e4
      2993a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1
      770050a94d6826d52f211b234792e66d0341446161040a6559147fd4
      92ad74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c
      5c18748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea
      72b8c610999a6730f752649205ae85c452ef83f98be715cd01031868
      74b07cf0207403414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 307 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae
      a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f
      e161de7576206a8a35bd4a60e00724fd3e6f63610434a04da121995d
      81d7c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5
      a1e524472778331fbe009fa1564a3203e42993a36285fa54e6c24184
      fd227458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b
      234792e66d0341446161040a6559147fd492ad74ab1f4def6196fd63
      99540e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb
      5e6274841cad328bb0312628b9b1f51bea72b8c610999a6730f75264
      9205ae85c452ef83f98be715cd0103186874b07cf0207403414462
    ISK result: (length: 48 bytes)
      a051d4532ca9fb6774e097ebac69c1d6a18144a15421dc155d0b1e8a
      ef9f9d8c0fe86e85d3cbee7796ff50171f42801b
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-5">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      8d5a03946a69ffa12cd6efd469fe8671bbc25fad6db2656f3963c94e
      9c940bdecc2bd555474c211817787d5cf7870ed1
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      c0729db25db40c48a35f787d5410b2cb9a2d9f5e9cf1cf159ed2f63c
      6b2185e597e176cc221422e9496eeda2bf123c8b
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-5">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x5b,0x37,0x73,0xaa,0x90,0xe8,0xf2,0x3c,0x61,0x56,0x3a,0x4b,
 0x64,0x5b,0x27,0x6c,
};
const unsigned char tc_g[] = {
 0x04,0xff,0xe1,0xbd,0xc3,0x29,0x3f,0xdb,0xe3,0x1b,0x29,0x59,
 0x91,0x6e,0x52,0xc0,0x18,0xe9,0x23,0xea,0xc9,0x98,0x36,0xbd,
 0x9a,0x1c,0xbe,0xec,0x79,0x4a,0x8d,0x4d,0x78,0xba,0xa3,0x2c,
 0xda,0xfc,0x96,0x85,0xbc,0x10,0x67,0xa7,0x80,0xf4,0xad,0x9c,
 0x8a,0x6c,0x6e,0x16,0x4a,0xa4,0x29,0x06,0xd1,0xe2,0x7f,0x78,
 0x25,0x81,0xad,0xc8,0xe0,0x10,0x92,0x19,0x62,0x6a,0x2b,0x8f,
 0xbd,0xc3,0x46,0x02,0xe4,0x08,0x45,0x54,0xbd,0xd6,0xc0,0xc6,
 0x98,0xdd,0x65,0x7a,0xc8,0xe3,0x1b,0x2b,0xcc,0xe1,0xc7,0xb0,
 0xd8,
};
const unsigned char tc_ya[] = {
 0xef,0x43,0x3d,0xd5,0xad,0x14,0x2c,0x86,0x0e,0x7c,0xb6,0x40,
 0x0d,0xd3,0x15,0xd3,0x88,0xd5,0xec,0x54,0x20,0xc5,0x50,0xe9,
 0xd6,0xf0,0x90,0x7f,0x37,0x5d,0x98,0x8b,0xc4,0xd7,0x04,0x83,
 0x7e,0x43,0x56,0x1c,0x49,0x7e,0x7d,0xd9,0x3e,0xdc,0xdb,0x9d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x34,0xa0,0x4d,0xa1,0x21,0x99,0x5d,0x81,0xd7,0xc5,0xde,
 0xd0,0x2c,0xf2,0xe7,0x09,0x54,0xdc,0xa4,0x90,0x59,0x48,0x5e,
 0xa3,0x83,0x10,0xb7,0x3b,0x96,0xfa,0x1e,0xc7,0x86,0x19,0xc5,
 0xa1,0xe5,0x24,0x47,0x27,0x78,0x33,0x1f,0xbe,0x00,0x9f,0xa1,
 0x56,0x4a,0x32,0x03,0xe4,0x29,0x93,0xa3,0x62,0x85,0xfa,0x54,
 0xe6,0xc2,0x41,0x84,0xfd,0x22,0x74,0x58,0xc8,0x77,0x81,0xbe,
 0x16,0xff,0xf4,0x6d,0xbc,0x97,0x0c,0xc1,0xb1,0x77,0x00,0x50,
 0xa9,0x4d,0x68,0x26,0xd5,0x2f,0x21,0x1b,0x23,0x47,0x92,0xe6,
 0x6d,
};
const unsigned char tc_yb[] = {
 0x50,0xb0,0xe3,0x6b,0x95,0xa2,0xed,0xfa,0xa8,0x34,0x2b,0x84,
 0x3d,0xdd,0xc9,0x0b,0x17,0x53,0x30,0xf2,0x39,0x9c,0x1b,0x36,
 0x58,0x6d,0xed,0xda,0x3c,0x25,0x59,0x75,0xf3,0x0b,0xe6,0xa7,
 0x50,0xf9,0x40,0x4f,0xcc,0xc6,0x2a,0x63,0x23,0xb5,0xe4,0x71,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x0a,0x65,0x59,0x14,0x7f,0xd4,0x92,0xad,0x74,0xab,0x1f,
 0x4d,0xef,0x61,0x96,0xfd,0x63,0x99,0x54,0x0e,0x84,0x70,0x62,
 0x27,0xa1,0xf9,0x0d,0x10,0x4c,0xda,0xeb,0x63,0x0b,0x7c,0x5c,
 0x18,0x74,0x8d,0xeb,0x25,0x65,0x3a,0xd2,0xa4,0xcb,0x5e,0x62,
 0x74,0x84,0x1c,0xad,0x32,0x8b,0xb0,0x31,0x26,0x28,0xb9,0xb1,
 0xf5,0x1b,0xea,0x72,0xb8,0xc6,0x10,0x99,0x9a,0x67,0x30,0xf7,
 0x52,0x64,0x92,0x05,0xae,0x85,0xc4,0x52,0xef,0x83,0xf9,0x8b,
 0xe7,0x15,0xcd,0x01,0x03,0x18,0x68,0x74,0xb0,0x7c,0xf0,0x20,
 0x74,
};
const unsigned char tc_K[] = {
 0xa9,0xac,0xae,0xa9,0x56,0x92,0xa6,0x44,0x62,0x06,0x7f,0xe8,
 0xe4,0x32,0x1f,0x2f,0xca,0x97,0x93,0xa8,0xa0,0x42,0x0f,0x0e,
 0x25,0x3e,0xd0,0xd6,0xdb,0x85,0x8f,0xe1,0x61,0xde,0x75,0x76,
 0x20,0x6a,0x8a,0x35,0xbd,0x4a,0x60,0xe0,0x07,0x24,0xfd,0x3e,
};
const unsigned char tc_ISK_IR[] = {
 0xd1,0xb7,0x43,0x75,0xc7,0xd6,0x3d,0x7d,0xe2,0x46,0xcb,0xf3,
 0xfc,0x2b,0x30,0x92,0x64,0x5c,0x73,0xa0,0xaa,0x81,0x69,0x89,
 0xc0,0xde,0x60,0x48,0xed,0x4e,0xce,0x6a,0x54,0xdf,0x82,0xd0,
 0x5d,0x2b,0xe3,0x49,0x8c,0xb9,0x28,0x8b,0xe7,0xbd,0xbd,0xb9,
};
const unsigned char tc_ISK_SY[] = {
 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb,
 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15,
 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85,
 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b,
};
const unsigned char tc_ISK_SY[] = {
 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb,
 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15,
 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85,
 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b,
};
const unsigned char tc_sid_out_ir[] = {
 0x8d,0x5a,0x03,0x94,0x6a,0x69,0xff,0xa1,0x2c,0xd6,0xef,0xd4,
 0x69,0xfe,0x86,0x71,0xbb,0xc2,0x5f,0xad,0x6d,0xb2,0x65,0x6f,
 0x39,0x63,0xc9,0x4e,0x9c,0x94,0x0b,0xde,0xcc,0x2b,0xd5,0x55,
 0x47,0x4c,0x21,0x18,0x17,0x78,0x7d,0x5c,0xf7,0x87,0x0e,0xd1,
};
const unsigned char tc_sid_out_oc[] = {
 0xc0,0x72,0x9d,0xb2,0x5d,0xb4,0x0c,0x48,0xa3,0x5f,0x78,0x7d,
 0x54,0x10,0xb2,0xcb,0x9a,0x2d,0x9f,0x5e,0x9c,0xf1,0xcf,0x15,
 0x9e,0xd2,0xf6,0x3c,0x6b,0x21,0x85,0xe5,0x97,0xe1,0x76,0xcc,
 0x22,0x14,0x22,0xe9,0x49,0x6e,0xed,0xa2,0xbf,0x12,0x3c,0x8b,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-21">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #QjM3NzNBQTkwRThGMjNDNjE1NjNBNEI2NDVCMjc2QyIsICJnIjogIjA0RkZFMUJEQz
 #MyOTNGREJFMzFCMjk1OTkxNkU1MkMwMThFOTIzRUFDOTk4MzZCRDlBMUNCRUVDNzk0
 #QThENEQ3OEJBQTMyQ0RBRkM5Njg1QkMxMDY3QTc4MEY0QUQ5QzhBNkM2RTE2NEFBND
 #I5MDZEMUUyN0Y3ODI1ODFBREM4RTAxMDkyMTk2MjZBMkI4RkJEQzM0NjAyRTQwODQ1
 #NTRCREQ2QzBDNjk4REQ2NTdBQzhFMzFCMkJDQ0UxQzdCMEQ4IiwgInlhIjogIkVGND
 #MzREQ1QUQxNDJDODYwRTdDQjY0MDBERDMxNUQzODhENUVDNTQyMEM1NTBFOUQ2RjA5
 #MDdGMzc1RDk4OEJDNEQ3MDQ4MzdFNDM1NjFDNDk3RTdERDkzRURDREI5RCIsICJBRG
 #EiOiAiNDE0NDYxIiwgIllhIjogIjA0MzRBMDREQTEyMTk5NUQ4MUQ3QzVERUQwMkNG
 #MkU3MDk1NERDQTQ5MDU5NDg1RUEzODMxMEI3M0I5NkZBMUVDNzg2MTlDNUExRTUyND
 #Q3Mjc3ODMzMUZCRTAwOUZBMTU2NEEzMjAzRTQyOTkzQTM2Mjg1RkE1NEU2QzI0MTg0
 #RkQyMjc0NThDODc3ODFCRTE2RkZGNDZEQkM5NzBDQzFCMTc3MDA1MEE5NEQ2ODI2RD
 #UyRjIxMUIyMzQ3OTJFNjZEIiwgInliIjogIjUwQjBFMzZCOTVBMkVERkFBODM0MkI4
 #NDNERERDOTBCMTc1MzMwRjIzOTlDMUIzNjU4NkRFRERBM0MyNTU5NzVGMzBCRTZBNz
 #UwRjk0MDRGQ0NDNjJBNjMyM0I1RTQ3MSIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjog
 #IjA0MEE2NTU5MTQ3RkQ0OTJBRDc0QUIxRjRERUY2MTk2RkQ2Mzk5NTQwRTg0NzA2Mj
 #I3QTFGOTBEMTA0Q0RBRUI2MzBCN0M1QzE4NzQ4REVCMjU2NTNBRDJBNENCNUU2Mjc0
 #ODQxQ0FEMzI4QkIwMzEyNjI4QjlCMUY1MUJFQTcyQjhDNjEwOTk5QTY3MzBGNzUyNj
 #Q5MjA1QUU4NUM0NTJFRjgzRjk4QkU3MTVDRDAxMDMxODY4NzRCMDdDRjAyMDc0Iiwg
 #IksiOiAiQTlBQ0FFQTk1NjkyQTY0NDYyMDY3RkU4RTQzMjFGMkZDQTk3OTNBOEEwND
 #IwRjBFMjUzRUQwRDZEQjg1OEZFMTYxREU3NTc2MjA2QThBMzVCRDRBNjBFMDA3MjRG
 #RDNFIiwgIklTS19JUiI6ICJEMUI3NDM3NUM3RDYzRDdERTI0NkNCRjNGQzJCMzA5Mj
 #Y0NUM3M0EwQUE4MTY5ODlDMERFNjA0OEVENEVDRTZBNTRERjgyRDA1RDJCRTM0OThD
 #QjkyODhCRTdCREJEQjkiLCAiSVNLX1NZIjogIkEwNTFENDUzMkNBOUZCNjc3NEUwOT
 #dFQkFDNjlDMUQ2QTE4MTQ0QTE1NDIxREMxNTVEMEIxRThBRUY5RjlEOEMwRkU4NkU4
 #NUQzQ0JFRTc3OTZGRjUwMTcxRjQyODAxQiIsICJzaWRfb3V0cHV0X2lyIjogIjhENU
 #EwMzk0NkE2OUZGQTEyQ0Q2RUZENDY5RkU4NjcxQkJDMjVGQUQ2REIyNjU2RjM5NjND
 #OTRFOUM5NDBCREVDQzJCRDU1NTQ3NEMyMTE4MTc3ODdENUNGNzg3MEVEMSIsICJzaW
 #Rfb3V0cHV0X29jIjogIkMwNzI5REIyNURCNDBDNDhBMzVGNzg3RDU0MTBCMkNCOUEy
 #RDlGNUU5Q0YxQ0YxNTlFRDJGNjNDNkIyMTg1RTU5N0UxNzZDQzIyMTQyMkU5NDk2RU
 #VEQTJCRjEyM0M4QiJ9
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-1">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    X: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f4036e
    G.scalar_mult(s,X) (full coordinates): (length: 97 bytes)
      0465c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f6105873
      3173a033cda76c3e3ea5352b804e67fdbe2e334be8245dad5c8c993e
      63bacf0456478f29b71b6c859f13676f84ff150d2741f028f560584a
      0bdba19a63df62c08949c2fd6d
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 48 bytes)
      65c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f610587331
      73a033cda76c3e3ea5352b804e67fdbe2e334be8
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-3">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    Y_i1: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f40302
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-22">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI2RThBOTlBNUNERDQwOEVBRTk4RTFCOEFFRDI4NkU3Qj
 #EyQURCQkRBQzdGMkM2MjhEOTA2MENFOTJBRTBEOTBCRDU3QTU2NEZEMzUwMEZCQ0NF
 #MzQyNURDOTRCQTBBREUiLCAiWCI6ICIwNDVCNENENTNDNDUwNkNDMDRCQTRDNDRGMj
 #c2MkQ1RDMyQzNFNTVERjI1QjhCQUE1NTcxQjE2NTdBRDk1NzZFRkVBODI1OUYwNjg0
 #REUwNjVBNDcwNTg1QjRCRTg3Njc0OEM3Nzk3MDU0RjNERUZFRjIxQjc3RjgzRDUzQk
 #FDNTdDODlENTJBQTRENkRENTg3MkJEMjgxOTg5QjEzODM1OTY5ODAwOUY4QUMxRjMw
 #MTUzOEJBRENDRTlEOUY0MDM2RSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bGwgY2
 #9vcmRpbmF0ZXMpIjogIjA0NjVDMjhEQjA1RkQ5RjlBOTM2NTFDNUNDMzFFQUU0OUM0
 #RTUyNDZCNDY0ODlCOEY2MTA1ODczMzE3M0EwMzNDREE3NkMzRTNFQTUzNTJCODA0RT
 #Y3RkRCRTJFMzM0QkU4MjQ1REFENUM4Qzk5M0U2M0JBQ0YwNDU2NDc4RjI5QjcxQjZD
 #ODU5RjEzNjc2Rjg0RkYxNTBEMjc0MUYwMjhGNTYwNTg0QTBCREJBMTlBNjNERjYyQz
 #A4OTQ5QzJGRDZEIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29y
 #ZGluYXRlKSI6ICI2NUMyOERCMDVGRDlGOUE5MzY1MUM1Q0MzMUVBRTQ5QzRFNTI0Nk
 #I0NjQ4OUI4RjYxMDU4NzMzMTczQTAzM0NEQTc2QzNFM0VBNTM1MkI4MDRFNjdGREJF
 #MkUzMzRCRTgifSwgIkludmFsaWQgWTEiOiAiMDQ1QjRDRDUzQzQ1MDZDQzA0QkE0Qz
 #Q0RjI3NjJENUQzMkMzRTU1REYyNUI4QkFBNTU3MUIxNjU3QUQ5NTc2RUZFQTgyNTlG
 #MDY4NERFMDY1QTQ3MDU4NUI0QkU4NzY3NDhDNzc5NzA1NEYzREVGRUYyMUI3N0Y4M0
 #Q1M0JBQzU3Qzg5RDUyQUE0RDZERDU4NzJCRDI4MTk4OUIxMzgzNTk2OTgwMDlGOEFD
 #MUYzMDE1MzhCQURDQ0U5RDlGNDAzMDIiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-521-and-hash-sha-512">
        <name>Test vector for CPace using group NIST P-521 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-521">
          <name>Test vectors for calculate_generator with group NIST P-521</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP521_XMD:SHA-512_SSWU_NU_'
    DST = b'CPaceP521_XMD:SHA-512_SSWU_NU__DST'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      1e4350616365503532315f584d443a5348412d3531325f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    generator g: (length: 133 bytes)
      0400e58a8fbf08b38e34a3676f6d690bed58aa4115ff32a57ec87172
      fc2a1fb89d03258c6429c464981b3284b5fedbd1244bf27432008868
      7065b9075dd558e14ed69901d2162db1ba3a49c97dca7c902cb1b96b
      abe21a31942114c860665b35c46b8213f6de17194de54c441083dd11
      63d5907adad8824bb1307dcf6a55c11a8f01d9789b
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-23">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0ODQxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5
 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiN0U0QjQ3OTFENkE4RUYwMTlCOTM2Qz
 #c5RkI3RjJDNTciLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu
 #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0OD
 #QxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0
 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwN0U0QjQ3OTFENkE4RUYwMTlCOT
 #M2Qzc5RkI3RjJDNTciLCAiZ2VuZXJhdG9yIGciOiAiMDQwMEU1OEE4RkJGMDhCMzhF
 #MzRBMzY3NkY2RDY5MEJFRDU4QUE0MTE1RkYzMkE1N0VDODcxNzJGQzJBMUZCODlEMD
 #MyNThDNjQyOUM0NjQ5ODFCMzI4NEI1RkVEQkQxMjQ0QkYyNzQzMjAwODg2ODcwNjVC
 #OTA3NURENTU4RTE0RUQ2OTkwMUQyMTYyREIxQkEzQTQ5Qzk3RENBN0M5MDJDQjFCOT
 #ZCQUJFMjFBMzE5NDIxMTRDODYwNjY1QjM1QzQ2QjgyMTNGNkRFMTcxOTRERTU0QzQ0
 #MTA4M0REMTE2M0Q1OTA3QURBRDg4MjRCQjEzMDdEQ0Y2QTU1QzExQThGMDFEOTc4OU
 #IifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-6">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 66 bytes)
      006367e9c2aeff9f1db19af600cca73343d47cbe446cebbd1ccd783f
      82755a872da86fd0707eb3767c6114f1803deb62d63bdd1e613f67e6
      3e8c141ee5310e3ee819
  Outputs
    Ya: (length: 133 bytes)
      0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f
      30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090
      7312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c43961ef
      60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f12254
      e6f9950dd01fa8e26a8b20736fb63c63c81094f681
    Alternative correct value for Ya: (-ya)*g:
    (length: 133 bytes)
      0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f
      30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090
      7312eb724cddb4dcce675b016752bff0107f1e214b43e8a93bc69e10
      9f47a0d29d12ba7bab1ee9e95a2e20e1a7f69c97de58c99d060eddab
      19066af22fe0571d9574df8c9049c39c37ef6b097e
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-6">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 66 bytes)
      009227bf8dc741dacc9422f8bf3c0e96fce9587bc562eaafe0dc5f6f
      82f28594e4a6f98553560c62b75fa4abb198cecbbb86ebd41b0ea025
      4cde78ac68d39a240ae7
  Outputs
    Yb: (length: 133 bytes)
      0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c
      709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21
      8bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c818
      ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92f4
      03e0fa3207de8bb41b388d81046a298ed8ddac9b2a
    Alternative correct value for Yb: (-yb)*g:
    (length: 133 bytes)
      0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c
      709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21
      8bfaeb3e1ffd9f19bf062d00094ea363c9ae41b3f7450fe113da37e7
      11ed39123b9df9bb4e26830db07978cd2a901ba31871cfd3dde36d0b
      fc1f05cdf821744be4c7727efb95d67127225364d5
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-6">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 66 bytes)
      018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509
      516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30
      832c23d477c991bea8e5
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509
      516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30
      832c23d477c991bea8e5
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-6">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 278 bytes)
      85010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5
      381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff76
      80907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c439
      61ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f1
      2254e6f9950dd01fa8e26a8b20736fb63c63c81094f6810341446185
      010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f7
      0c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa
      218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c8
      18ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92
      f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 397 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e
      7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78
      7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23
      d477c991bea8e585010400c2bfd794467f4438277e85a42e101fa406
      1e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad00985
      7488db7130ff7680907312eb724cddb4dcce675b0098ad400fef80e1
      deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e580963
      6821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094
      f6810341446185010400706ea69b2b7167773248ea6e69a574e9dd2f
      f8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03fc24
      2e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c
      08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56fe45c
      e78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b
      2a03414462
    ISK result: (length: 64 bytes)
      1669a0a29726adc7eea2510d6f7e004a135fa63ac3c9f9e6ce53cba5
      d5e3781aced515956041e43358409a13ef90ddc3c36fd8d7d81424c8
      e94592e21854260a
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-6">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 280 bytes)
      6f6385010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f
      81e5381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130
      ff7680907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756
      c43961ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662
      f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094f681034144
      6185010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e
      07f70c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316af
      e2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec
      25c818ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c22
      1c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 399 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e
      7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78
      7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23
      d477c991bea8e56f6385010400c2bfd794467f4438277e85a42e101f
      a4061e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad0
      09857488db7130ff7680907312eb724cddb4dcce675b0098ad400fef
      80e1deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e58
      09636821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c8
      1094f6810341446185010400706ea69b2b7167773248ea6e69a574e9
      dd2ff8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03
      fc242e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651
      be4c08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56f
      e45ce78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8dd
      ac9b2a03414462
    ISK result: (length: 64 bytes)
      f2f3bd8cd442a4e16659b47a7b7a84f29be75893ed2e5f772d7a3c8b
      779eb0df937a4ec50a4f1ff01ebbaa97d80e090ea69b00a95200ed25
      8e48c6f7e9d8fbc2
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-6">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      56cc3cd8be77cdc84c0d1906de1ffc8ef7cbb326a3f05267b6e8c634
      4e2781eb20ef725e84cb1bb45927435051b4e0fae78e975bf15099f9
      e38d755413eee2fd
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      a46c7189ba6a36c4447741e057da39c885b7d59e08bd2df1852a5271
      f2a8a2e9b187ccd07325a3eede646adee0c06fe58da77f74177896b2
      1053c5d107de006d
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-6">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x04,0x00,0xe5,0x8a,0x8f,0xbf,0x08,0xb3,0x8e,0x34,0xa3,0x67,
 0x6f,0x6d,0x69,0x0b,0xed,0x58,0xaa,0x41,0x15,0xff,0x32,0xa5,
 0x7e,0xc8,0x71,0x72,0xfc,0x2a,0x1f,0xb8,0x9d,0x03,0x25,0x8c,
 0x64,0x29,0xc4,0x64,0x98,0x1b,0x32,0x84,0xb5,0xfe,0xdb,0xd1,
 0x24,0x4b,0xf2,0x74,0x32,0x00,0x88,0x68,0x70,0x65,0xb9,0x07,
 0x5d,0xd5,0x58,0xe1,0x4e,0xd6,0x99,0x01,0xd2,0x16,0x2d,0xb1,
 0xba,0x3a,0x49,0xc9,0x7d,0xca,0x7c,0x90,0x2c,0xb1,0xb9,0x6b,
 0xab,0xe2,0x1a,0x31,0x94,0x21,0x14,0xc8,0x60,0x66,0x5b,0x35,
 0xc4,0x6b,0x82,0x13,0xf6,0xde,0x17,0x19,0x4d,0xe5,0x4c,0x44,
 0x10,0x83,0xdd,0x11,0x63,0xd5,0x90,0x7a,0xda,0xd8,0x82,0x4b,
 0xb1,0x30,0x7d,0xcf,0x6a,0x55,0xc1,0x1a,0x8f,0x01,0xd9,0x78,
 0x9b,
};
const unsigned char tc_ya[] = {
 0x00,0x63,0x67,0xe9,0xc2,0xae,0xff,0x9f,0x1d,0xb1,0x9a,0xf6,
 0x00,0xcc,0xa7,0x33,0x43,0xd4,0x7c,0xbe,0x44,0x6c,0xeb,0xbd,
 0x1c,0xcd,0x78,0x3f,0x82,0x75,0x5a,0x87,0x2d,0xa8,0x6f,0xd0,
 0x70,0x7e,0xb3,0x76,0x7c,0x61,0x14,0xf1,0x80,0x3d,0xeb,0x62,
 0xd6,0x3b,0xdd,0x1e,0x61,0x3f,0x67,0xe6,0x3e,0x8c,0x14,0x1e,
 0xe5,0x31,0x0e,0x3e,0xe8,0x19,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x00,0xc2,0xbf,0xd7,0x94,0x46,0x7f,0x44,0x38,0x27,0x7e,
 0x85,0xa4,0x2e,0x10,0x1f,0xa4,0x06,0x1e,0x1e,0xf6,0xe0,0x5f,
 0x81,0xe5,0x38,0x1f,0x30,0xe7,0x3b,0x34,0x1d,0xd7,0x26,0x08,
 0x9c,0xb6,0xa6,0xbb,0xe5,0xa5,0x09,0xfa,0xd0,0x09,0x85,0x74,
 0x88,0xdb,0x71,0x30,0xff,0x76,0x80,0x90,0x73,0x12,0xeb,0x72,
 0x4c,0xdd,0xb4,0xdc,0xce,0x67,0x5b,0x00,0x98,0xad,0x40,0x0f,
 0xef,0x80,0xe1,0xde,0xb4,0xbc,0x17,0x56,0xc4,0x39,0x61,0xef,
 0x60,0xb8,0x5f,0x2d,0x62,0xed,0x45,0x84,0x54,0xe1,0x16,0x16,
 0xa5,0xd1,0xdf,0x1e,0x58,0x09,0x63,0x68,0x21,0xa7,0x36,0x62,
 0xf9,0xf1,0x22,0x54,0xe6,0xf9,0x95,0x0d,0xd0,0x1f,0xa8,0xe2,
 0x6a,0x8b,0x20,0x73,0x6f,0xb6,0x3c,0x63,0xc8,0x10,0x94,0xf6,
 0x81,
};
const unsigned char tc_yb[] = {
 0x00,0x92,0x27,0xbf,0x8d,0xc7,0x41,0xda,0xcc,0x94,0x22,0xf8,
 0xbf,0x3c,0x0e,0x96,0xfc,0xe9,0x58,0x7b,0xc5,0x62,0xea,0xaf,
 0xe0,0xdc,0x5f,0x6f,0x82,0xf2,0x85,0x94,0xe4,0xa6,0xf9,0x85,
 0x53,0x56,0x0c,0x62,0xb7,0x5f,0xa4,0xab,0xb1,0x98,0xce,0xcb,
 0xbb,0x86,0xeb,0xd4,0x1b,0x0e,0xa0,0x25,0x4c,0xde,0x78,0xac,
 0x68,0xd3,0x9a,0x24,0x0a,0xe7,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x00,0x70,0x6e,0xa6,0x9b,0x2b,0x71,0x67,0x77,0x32,0x48,
 0xea,0x6e,0x69,0xa5,0x74,0xe9,0xdd,0x2f,0xf8,0xa3,0xd0,0x4a,
 0x6e,0x07,0xf7,0x0c,0x70,0x98,0x69,0xca,0x48,0x68,0x27,0xd5,
 0x9f,0x92,0x90,0x59,0x9d,0x1c,0xf9,0x4e,0x1a,0x03,0xfc,0x24,
 0x2e,0x2b,0x13,0x16,0xaf,0xe2,0xfa,0x21,0x8b,0xfa,0xeb,0x3e,
 0x1f,0xfd,0x9f,0x19,0xbf,0x06,0x2d,0x01,0xf6,0xb1,0x5c,0x9c,
 0x36,0x51,0xbe,0x4c,0x08,0xba,0xf0,0x1e,0xec,0x25,0xc8,0x18,
 0xee,0x12,0xc6,0xed,0xc4,0x62,0x06,0x44,0xb1,0xd9,0x7c,0xf2,
 0x4f,0x86,0x87,0x32,0xd5,0x6f,0xe4,0x5c,0xe7,0x8e,0x30,0x2c,
 0x22,0x1c,0x92,0xf4,0x03,0xe0,0xfa,0x32,0x07,0xde,0x8b,0xb4,
 0x1b,0x38,0x8d,0x81,0x04,0x6a,0x29,0x8e,0xd8,0xdd,0xac,0x9b,
 0x2a,
};
const unsigned char tc_K[] = {
 0x01,0x8e,0x0e,0x7e,0x9a,0xde,0x74,0x91,0x7c,0x11,0xc0,0xf6,
 0xb5,0x2f,0x95,0xed,0x87,0x1e,0xab,0x23,0x54,0x37,0xcb,0xee,
 0x8b,0x5c,0x25,0x09,0x51,0x6e,0x78,0x7a,0x80,0xe8,0x25,0xed,
 0x5d,0x53,0x9f,0xa6,0xa0,0xec,0x32,0xc4,0x8f,0xa8,0xfa,0xbe,
 0x85,0x80,0x9d,0x00,0x0d,0x0c,0xfd,0x30,0x83,0x2c,0x23,0xd4,
 0x77,0xc9,0x91,0xbe,0xa8,0xe5,
};
const unsigned char tc_ISK_IR[] = {
 0x16,0x69,0xa0,0xa2,0x97,0x26,0xad,0xc7,0xee,0xa2,0x51,0x0d,
 0x6f,0x7e,0x00,0x4a,0x13,0x5f,0xa6,0x3a,0xc3,0xc9,0xf9,0xe6,
 0xce,0x53,0xcb,0xa5,0xd5,0xe3,0x78,0x1a,0xce,0xd5,0x15,0x95,
 0x60,0x41,0xe4,0x33,0x58,0x40,0x9a,0x13,0xef,0x90,0xdd,0xc3,
 0xc3,0x6f,0xd8,0xd7,0xd8,0x14,0x24,0xc8,0xe9,0x45,0x92,0xe2,
 0x18,0x54,0x26,0x0a,
};
const unsigned char tc_ISK_SY[] = {
 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a,
 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77,
 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5,
 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e,
 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7,
 0xe9,0xd8,0xfb,0xc2,
};
const unsigned char tc_ISK_SY[] = {
 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a,
 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77,
 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5,
 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e,
 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7,
 0xe9,0xd8,0xfb,0xc2,
};
const unsigned char tc_sid_out_ir[] = {
 0x56,0xcc,0x3c,0xd8,0xbe,0x77,0xcd,0xc8,0x4c,0x0d,0x19,0x06,
 0xde,0x1f,0xfc,0x8e,0xf7,0xcb,0xb3,0x26,0xa3,0xf0,0x52,0x67,
 0xb6,0xe8,0xc6,0x34,0x4e,0x27,0x81,0xeb,0x20,0xef,0x72,0x5e,
 0x84,0xcb,0x1b,0xb4,0x59,0x27,0x43,0x50,0x51,0xb4,0xe0,0xfa,
 0xe7,0x8e,0x97,0x5b,0xf1,0x50,0x99,0xf9,0xe3,0x8d,0x75,0x54,
 0x13,0xee,0xe2,0xfd,
};
const unsigned char tc_sid_out_oc[] = {
 0xa4,0x6c,0x71,0x89,0xba,0x6a,0x36,0xc4,0x44,0x77,0x41,0xe0,
 0x57,0xda,0x39,0xc8,0x85,0xb7,0xd5,0x9e,0x08,0xbd,0x2d,0xf1,
 0x85,0x2a,0x52,0x71,0xf2,0xa8,0xa2,0xe9,0xb1,0x87,0xcc,0xd0,
 0x73,0x25,0xa3,0xee,0xde,0x64,0x6a,0xde,0xe0,0xc0,0x6f,0xe5,
 0x8d,0xa7,0x7f,0x74,0x17,0x78,0x96,0xb2,0x10,0x53,0xc5,0xd1,
 0x07,0xde,0x00,0x6d,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-24">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjA0MDBFNThBOE
 #ZCRjA4QjM4RTM0QTM2NzZGNkQ2OTBCRUQ1OEFBNDExNUZGMzJBNTdFQzg3MTcyRkMy
 #QTFGQjg5RDAzMjU4QzY0MjlDNDY0OTgxQjMyODRCNUZFREJEMTI0NEJGMjc0MzIwMD
 #g4Njg3MDY1QjkwNzVERDU1OEUxNEVENjk5MDFEMjE2MkRCMUJBM0E0OUM5N0RDQTdD
 #OTAyQ0IxQjk2QkFCRTIxQTMxOTQyMTE0Qzg2MDY2NUIzNUM0NkI4MjEzRjZERTE3MT
 #k0REU1NEM0NDEwODNERDExNjNENTkwN0FEQUQ4ODI0QkIxMzA3RENGNkE1NUMxMUE4
 #RjAxRDk3ODlCIiwgInlhIjogIjAwNjM2N0U5QzJBRUZGOUYxREIxOUFGNjAwQ0NBNz
 #MzNDNENDdDQkU0NDZDRUJCRDFDQ0Q3ODNGODI3NTVBODcyREE4NkZEMDcwN0VCMzc2
 #N0M2MTE0RjE4MDNERUI2MkQ2M0JERDFFNjEzRjY3RTYzRThDMTQxRUU1MzEwRTNFRT
 #gxOSIsICJBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MDBDMkJGRDc5NDQ2N0Y0NDM4
 #Mjc3RTg1QTQyRTEwMUZBNDA2MUUxRUY2RTA1RjgxRTUzODFGMzBFNzNCMzQxREQ3Mj
 #YwODlDQjZBNkJCRTVBNTA5RkFEMDA5ODU3NDg4REI3MTMwRkY3NjgwOTA3MzEyRUI3
 #MjRDRERCNERDQ0U2NzVCMDA5OEFENDAwRkVGODBFMURFQjRCQzE3NTZDNDM5NjFFRj
 #YwQjg1RjJENjJFRDQ1ODQ1NEUxMTYxNkE1RDFERjFFNTgwOTYzNjgyMUE3MzY2MkY5
 #RjEyMjU0RTZGOTk1MEREMDFGQThFMjZBOEIyMDczNkZCNjNDNjNDODEwOTRGNjgxIi
 #wgInliIjogIjAwOTIyN0JGOERDNzQxREFDQzk0MjJGOEJGM0MwRTk2RkNFOTU4N0JD
 #NTYyRUFBRkUwREM1RjZGODJGMjg1OTRFNEE2Rjk4NTUzNTYwQzYyQjc1RkE0QUJCMT
 #k4Q0VDQkJCODZFQkQ0MUIwRUEwMjU0Q0RFNzhBQzY4RDM5QTI0MEFFNyIsICJBRGIi
 #OiAiNDE0NDYyIiwgIlliIjogIjA0MDA3MDZFQTY5QjJCNzE2Nzc3MzI0OEVBNkU2OU
 #E1NzRFOUREMkZGOEEzRDA0QTZFMDdGNzBDNzA5ODY5Q0E0ODY4MjdENTlGOTI5MDU5
 #OUQxQ0Y5NEUxQTAzRkMyNDJFMkIxMzE2QUZFMkZBMjE4QkZBRUIzRTFGRkQ5RjE5Qk
 #YwNjJEMDFGNkIxNUM5QzM2NTFCRTRDMDhCQUYwMUVFQzI1QzgxOEVFMTJDNkVEQzQ2
 #MjA2NDRCMUQ5N0NGMjRGODY4NzMyRDU2RkU0NUNFNzhFMzAyQzIyMUM5MkY0MDNFME
 #ZBMzIwN0RFOEJCNDFCMzg4RDgxMDQ2QTI5OEVEOEREQUM5QjJBIiwgIksiOiAiMDE4
 #RTBFN0U5QURFNzQ5MTdDMTFDMEY2QjUyRjk1RUQ4NzFFQUIyMzU0MzdDQkVFOEI1Qz
 #I1MDk1MTZFNzg3QTgwRTgyNUVENUQ1MzlGQTZBMEVDMzJDNDhGQThGQUJFODU4MDlE
 #MDAwRDBDRkQzMDgzMkMyM0Q0NzdDOTkxQkVBOEU1IiwgIklTS19JUiI6ICIxNjY5QT
 #BBMjk3MjZBREM3RUVBMjUxMEQ2RjdFMDA0QTEzNUZBNjNBQzNDOUY5RTZDRTUzQ0JB
 #NUQ1RTM3ODFBQ0VENTE1OTU2MDQxRTQzMzU4NDA5QTEzRUY5MEREQzNDMzZGRDhEN0
 #Q4MTQyNEM4RTk0NTkyRTIxODU0MjYwQSIsICJJU0tfU1kiOiAiRjJGM0JEOENENDQy
 #QTRFMTY2NTlCNDdBN0I3QTg0RjI5QkU3NTg5M0VEMkU1Rjc3MkQ3QTNDOEI3NzlFQj
 #BERjkzN0E0RUM1MEE0RjFGRjAxRUJCQUE5N0Q4MEUwOTBFQTY5QjAwQTk1MjAwRUQy
 #NThFNDhDNkY3RTlEOEZCQzIiLCAic2lkX291dHB1dF9pciI6ICI1NkNDM0NEOEJFNz
 #dDREM4NEMwRDE5MDZERTFGRkM4RUY3Q0JCMzI2QTNGMDUyNjdCNkU4QzYzNDRFMjc4
 #MUVCMjBFRjcyNUU4NENCMUJCNDU5Mjc0MzUwNTFCNEUwRkFFNzhFOTc1QkYxNTA5OU
 #Y5RTM4RDc1NTQxM0VFRTJGRCIsICJzaWRfb3V0cHV0X29jIjogIkE0NkM3MTg5QkE2
 #QTM2QzQ0NDc3NDFFMDU3REEzOUM4ODVCN0Q1OUUwOEJEMkRGMTg1MkE1MjcxRjJBOE
 #EyRTlCMTg3Q0NEMDczMjVBM0VFREU2NDZBREVFMEMwNkZFNThEQTc3Rjc0MTc3ODk2
 #QjIxMDUzQzVEMTA3REUwMDZEIn0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-2">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    X: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfab9
    G.scalar_mult(s,X) (full coordinates): (length: 133 bytes)
      040122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7
      c73cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517c
      df6d99a8a2d6db19ef27bd0055af9e8ddcf337ce0a7c22a9c8099bc4
      a44faeded1eb72effd26e4f322217b67d60b944b267b3df5046078fd
      577f1785728f49b241fd5e8c83223a994a2d219281
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 66 bytes)
      0122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7c7
      3cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517cdf
      6d99a8a2d6db19ef27bd
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-4">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    Y_i1: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfaf9
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-25">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICIwMTgyREQ3OTI1RjE3NTM0MTlFNEJGODM0Mjk3NjNBQ0
 #QzN0Q2NDAwMENENUExNzVFREY1M0ExNTg3REQ5ODZCQzk1QUNDMTUwNjk5MTcwMkI2
 #QkExQTlFRTI0NThGRUU4RUZDMDAxOThDRjAwODhDNDgwOTY1RUY2NUZGMjA0OEI4NT
 #YiLCAiWCI6ICIwNDAwREM1MDc4QjI0QzRBRjE2MjBDQzEwRkJFQ0M2Q0Q4Q0YxQ0FC
 #MEIwMTFFRkI3M0M3ODJGMjI2REMyMUM3Q0E3RUI0MDZCRTc0QTY5RUNCQTVCNEE4N0
 #MwN0NGQzZFNjg3QjRCRUNBOUE2RURBQzk1OTQwQTNCNDEyMDU3M0IyNkE4MDAwNUU2
 #OTc4MzNCMEJBMjg1RkNFN0IzRjFGMjUyNDMwMDg4NjBCOEYxREU3MTBBMERDQzA1Qj
 #BEMjAzNDFFRkU5MEVCMkJDQ0EyNjc5N0MyRDg1QUU2Q0E3NEMwMDY5NkNCMUIxM0U0
 #MEJEQTE1QjI3OTY0RDc2NzA1NzY2NDdCRkFCOSIsICJHLnNjYWxhcl9tdWx0KHMsWC
 #kgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0MDEyMkY4OENFNzNFQzVBQTJEMUM4QzVE
 #MDQxNDg3NjBDM0Q5N0JBODdEQUExMEQ4Q0I4QkI3QzczQ0Y2RTk1MUZDOTIyNzIxQk
 #YxNDM3OTk1Q0ZCMTNFMTMyQTc4QkVCODYzODlFNjBEMzUxN0NERjZEOTlBOEEyRDZE
 #QjE5RUYyN0JEMDA1NUFGOUU4RERDRjMzN0NFMEE3QzIyQTlDODA5OUJDNEE0NEZBRU
 #RFRDFFQjcyRUZGRDI2RTRGMzIyMjE3QjY3RDYwQjk0NEIyNjdCM0RGNTA0NjA3OEZE
 #NTc3RjE3ODU3MjhGNDlCMjQxRkQ1RThDODMyMjNBOTk0QTJEMjE5MjgxIiwgIkcuc2
 #NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29yZGluYXRlKSI6ICIwMTIyRjg4
 #Q0U3M0VDNUFBMkQxQzhDNUQwNDE0ODc2MEMzRDk3QkE4N0RBQTEwRDhDQjhCQjdDNz
 #NDRjZFOTUxRkM5MjI3MjFCRjE0Mzc5OTVDRkIxM0UxMzJBNzhCRUI4NjM4OUU2MEQz
 #NTE3Q0RGNkQ5OUE4QTJENkRCMTlFRjI3QkQifSwgIkludmFsaWQgWTEiOiAiMDQwME
 #RDNTA3OEIyNEM0QUYxNjIwQ0MxMEZCRUNDNkNEOENGMUNBQjBCMDExRUZCNzNDNzgy
 #RjIyNkRDMjFDN0NBN0VCNDA2QkU3NEE2OUVDQkE1QjRBODdDMDdDRkM2RTY4N0I0Qk
 #VDQTlBNkVEQUM5NTk0MEEzQjQxMjA1NzNCMjZBODAwMDVFNjk3ODMzQjBCQTI4NUZD
 #RTdCM0YxRjI1MjQzMDA4ODYwQjhGMURFNzEwQTBEQ0MwNUIwRDIwMzQxRUZFOTBFQj
 #JCQ0NBMjY3OTdDMkQ4NUFFNkNBNzRDMDA2OTZDQjFCMTNFNDBCREExNUIyNzk2NEQ3
 #NjcwNTc2NjQ3QkZBRjkiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
XsWvBJWwMq5aVbvqVCvVarVWreOdcdVW1a16Vb8aVMPquGbV7JpTq9SqtRq9
XqvXGrVmrVVza17NrwW1sDauW3W77tQr9Wq9Vq/XG/VmvVV3617drwf1sD5u
WA27wffTNSqNaqPWqDcajWaj1XAbXsNvBI3wWXQ2M+isWDo6m4jM34RQRqf3
WxHK6Gz+VoQyOmu/FaGMTmcfQhtj3jCvcMOYI9gkqllVnGgXXWscH1106lUh
83BXleSuMl+Fm/eP/uzT45efanefnaepF91E7zf+ffd2MeneHj12o8dJd9ad
90bdbf/Ej86jo6i37Wx7t71tbzuIfjyBQY4i/937qX/2af3ltBV/+am6uIr8
J3jEer+541fag21v1NvgS/2Tbtw9SU8Lg+DM4efh1N/cbK5+qs2/XExgCP/+
wwUP0beuHnvto6deu/vY2x5ZvfblY//2qNJrTx7PR8fHvQ4M0n0cbI87vc7l
4/C289gbdWAIAHY0eOqPOk5v5D+dtzu13mXnaXB72u5dDp6Go9Oz3u3RBha4
AYg3MEi/3bV7t1eb/rZb7d3ebQaj9ye9u95m2H5/2ru72vbavafetgtL6Vm9
7eW2f9ur9LaT7fmof9yzutvBFgfp9KzL7fB28AgGmtW7HWz77YHVHw2cftu3
ztuDWr/TsQa3w3a/M7CGo+FZf3Rk90aXm/6oZ/fblzYOMrqy+9vLan90Zw9G
n076lz172P502r+8cnrtq6f+bdfpba+s/u2l07+9qvRvJ8756Mtx/67rDLZf
Ov07GOTSGd76j/1tpwLo3Pa3g0p/5Dv9rV85b/u1vtWpDG6Ddt8aVIYXu5RB
siCf7FBmoihz3j4CVMP/bUD57RHgBxY9OgII/Uf4rtbrdB4HtzDIcbvXGTwO
R8dn8PgTUAew3nsC/MC6YTHbTrU3unsajE5Pepe9p2H79LR3ebUBgsN0QJ1t
F6T6q94toOi2C4uZbM5H7497d93NYPu+07u73Axve48ad24BlYAff3ve7tV6
Vmc7uO23ezjIYDsc9c/6bWCj0WCDHwJ1AOuAyu2g2m/fWYPR8ARpOGwPT/ud
KxvYDXgIGGN7CVRk6txeAion9vno03H/smsPtp86/ctLe3h7BZwJ7HZ7BbwB
BB9dAXV857x9VevfdZzB7Zd2/27gDEcwyJez/haYeOQDu/UqwBtAcCDk1q/2
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
vaFIlQWI0Mavif58JEXUq6ffmMW/Ff4CDwNDfzs8gh+P+Ue78BdDmwUzWzVi
b3cuNpOZ0g7DESzd8Sph1i0Pmtq537QgL6Ucny6WP4awqYJleLGZeYspvDSe
AjUOD7+V7MJrp5BA9ADflQDs1yB1wcPcmn8yl/90tOyK+ziaLjD0ePjwzwo8
cQRPPPwTw0vH+FPhn/lTqgGe4FU5CDwPkx1irFp8VIDPjl4nIkXsoF3R3eUK
rMOnwi7dlaxNWbske/VPkuvORdiVcyU/J3uDgvB4A2zNdoSJv2tA517nSKys
jyftaeZDWt87+P+tHF60BqeTBA77E2+pBAsmOSa2vzW9Hz6KPL0fzL+YXz4e
tc0k0NOCj8Rdtj/Q4mD6H+jlE/5w4X99srzj6+QuC/j16Fr1qNUeJnvZqzq1
ccOp1xqVhgWfhHh233Dgc7s2rrfg91ajCv/a8PdYJENggt9bsxFWPbCh7aDu
NsOxZbe8VqXuN1pjrzF2/BqmGXDJN+Nj5xBm57LRd+Wdg5gkxNVIxR3A+2+S
LW/XK/UamPY1+KVJhn0F/msgqLCQwNr5I1//jX/+f/G67eaTVrz+PIVtax9h
5XlDQl+T91C2ckELTVYyZGs5Tase+HWr2WpWA29cDauuG1YbTb8e+tVaxQ1b
jZbvW3bo+7bruA1/XG2Na76MhYe1Ouw3TyiKPNUEygdtDxQV/0VwJMt/buX1
ati0Wq2wErr1puOPA7/me/V6zbdqjdDzanY1sOre2KmEnt8aN6oV+MhrOlJY
Vp2K07Aa1T/YYe2SSzTtdwcXlg3+HbmHFye17Wdnuv7svK8FZ5+2+Ax8V8Xv
Lk/fjxIPFR3WCp7V9rc+5mFs+rfs0/40PT4enhzHX36qzYOzCbqDT732HXqX
nUtLhGDZs3qiXIMeuH7ocF1KJ7R9cUHOKQx7te11MI786Qy8L3gOpzuCz7+c
cv4B+HuUHWP1RvDI7Z0zHF3VwIN0zinvYkCQkRc+799/OaFhK0PMgABHrnc5
cAajm9Ph7RFCcn7ZrfW2X9r97fRscBuc9e56dn9DEM1hMVN/dmp5lfdjvzLc
uLC4Dx1/PTztv//x9PjicvMEUMMgT1v3p0GcReMHXtDjeZtDTr0RJlBcoveN
eRfwuXD6AZ+IkwSlzhCPxX/1/5i79BteS/9Pkb3fO8x/OSSXnT18g5BkWOd5
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
fuN03u9tlq+/iove620WpX0VF73X2yze7VUs+l5vs8Ssr2LR93qb9V2Rn7M3
kldORCcQosLVoFY90pRp6o3XakzmdFKQo7bINRLbB8R+cz4lAfoYhn5RtdFP
Ns00XNnotc+Rnzg+gbFQEpXjyxNJJSO+jMXGaFMM3kEL1yA9dz6HzLHSDmrd
/8GQqEx9C4n6TGiw7OsfMtYXK11U90PG+mKl569/zFhfrHS5+4eM9cVK16Dk
I8b6YqWL4XzIWF+sdNGjDxnri5UuhvMhY32x0sWGPmSs/3ihwU8xVnn+V2jw
dmjwfo+zPHR88zTv5x5nsbM3T/N+7nHWzOWtE9Sfe5z17m+doP7c4yx29k1O
8j6Ps0j+jWOT93icl4fN3xybvMfjnL/+1lHVezzO4uHeOKp6j8dZ1OZbx/Ou
8GA2sx3GLMAwTQ9xEPYMW+vTAWbg+J7zlPqM1Hsz+TlNzZj2Ams620qaT4Ma
59ym+Hbwqnez5rnwNAx9nyMcUBP0T1ZPqT73RilcaokussllgZFIPmbzEH5E
S/8jCV6vhQRLQIQzEoqWhjFkWOiRZ9Mj9SLAJcGZDBZ6bWflTZIOyYRpWbe6
M4MQaoLO45PwK/j+oLGciIxS+klsWmzY13P5c9gl3yPPoaiLZljEVd47BFsT
tHJ87zx/Dvp6Pc/ewavqLB/g8uBgnYMrQ7infDr2Ng9Z5gea0AQ1Hw0MP/Om
9yZdew+aPuvNlA86S0MYYeHG9xj0yHeL4JEnFRR2WJ+NfQrjdCSY5cmw7rIK
kSc8CrVdQbh/8cB+Zx5YpBjJjaQg/aUsPlsKw4WTkUuRs4BjzgAtoTEIWmRe
isl9+hEemEBwpNRZKukFTiFlywKoGgQmxNFFmpHcOn2Zo9SfJyuLRiqfBTMj
5AeRmqA+pN5deBq9f+E2RZCPXiQdqRJr93gBkkhluFTQRw5XeCGgCVNIaCOR
RSJ16sNyH2GjCIZGyugFvzFG+kkkGwnOYgULRV4RZZG9YEjUoiiCllDpC38g
1stnS224VNjLggk2RdZKissFSiQF6WfyiqDNIsxNhi86JEAfAbFIkf6KfxJU
kdw7OZMTRMhyYbmO6MRKSZCCdJGpcDUS3juS5qLMo6yEQyKXEDKLsEkEiybY
gxWDJCohFAAXdVpK7YXmIgAiLVQPu8gisrsEWiP/y5a7nJl1MhWBhcTZivII
5EPII3qZUrbqumC7zgy2/If4hV+TzGQJk7OanivzhZkgFJh55UTocZGvMAPm
iF6RbwsVQXBygrsSPopgLtIVXxfJMQJdE9xOJBIIiSesFDu7kkuEriIsCMEl
iD6IZYsNnbkmom1iFmJ0ghtIVwigrK1QDIRHYVdk0JkHFLEtw7o60/JFGUWU
hXxEmBJhuaKOwBpZbNEmQTnIhwSdoX9ITfnbcNKi0FdcguDQRKndSuWRy1oB
c6VRSoLYEPCQqL8osIA65uVnwvQROcj/RNEFReIjJCNbSWdyYfmiKOi0EtPE
54mmyKCEpaTOGrlC8AQlJGwOuVjP/wmtTTheAgCSv8poz/tDpOOJ217tQnRT
Vj17geEJF8ksa53GtY54qRWUIXCUSM0RFNiwyFQ8omBChNil4rwjlUkmuuKH
5DoRqCiXENSFyHzd2ab4bfEs4pllNxRVTlZ0mfAMxfMKnUNuIC5QR/sS4Qh6
SLA+sjDiRdVKLIn4NcEtyjokLzouFCmxAaFuxFsIu0VYVSL4cZF5VATx0PHb
kagkiI9VtGJ/wwsARJAp2aJLooRnz5D9UKd/TXhTKxFJdFV0WmAwglcSKxEX
GVYgi8xmjnolH5fBiCVGNI04mnyRVSocGL8KXnBx57VViz7EWGX1QPMK3JM7
Ct6qX0V3ZuP4FaMo7BW5uiCi/GpUsgFFt5ktWhfOHl42lmTRVfGYsh3LRIQY
ZNY9JUKvRD/PO7pYhJByhOGyYt2mH0YzfyN+nCiE7BzTIph8hWuKiUackWik
7GpnTFi/fEdioP5s4ufVEhMVdNi8YmxEN10f5ywMRV5zXhGF6Wq4EZDU/8sZ
gpOs3m88E2zmRc9eOJASLck2NK/gH70yiGJ8FT2QeEyZnoQBYqT9/C/n6EJc
VyThDMtfZVXtmbUok1o5OxI1xKBxjXdkDxenK+oixKAzj1Vs2p/RjWeFUCv3
VWhveoXEis5EmzzLXCYlyB9RNjGt35LcRAeGlyDijNIUHZkXLc3WxRzP6KSz
XchQZROIge85HHvh/oRF8AKajJBLtYgpBpLpouMRx3eOoESCEhmt8E+1cqEk
nJU7jiv1VUhZebQvBMbvI9+J5OVCEdcqfqRfBiTqKQmGiEXCOAExnR3dsEIv
xaGKeEVUsiT9ysAU7yuc1oWmJW5yWARo1n3Qr+DgiG8SP7zCjs35LmtoLV4o
QkVFKdWiCSJZWels9e0i8uFX4UDcO0UBZc+TP4VFW+0aw0p8bc6hnYRfMpV8
EY5oZtw+/Ee4emJI0RkIAE/scw0e+nUfEC2WfxXxqPFXeeOKVhXgn17pV/0K
gg4r20vs/EwhFW/sV8BZ3GxFvHYRvjgD+Zz8g+RmuX/Z2cWFRvih3FYgxWpR
IBlKZK2pRUVDJAKGdTuN2psuf4qUrDUziagsua1sXuaFhRlxb7L9/FDVX8Po
ZG8TZumwwt9k93ErPjPSFsXtiKtyUQ9l3YdVJ2W7lwVb+YEiAEm4xRDEa8ZD
hJgMiqtLV5CqqH9kyklYJVKal0vI5yLjMIpcNjjxSNGhrp5P9tJ+5U2KIMWY
xaDOlMmXbUqUJRIu1zQ2jldMQpzsSvc8QzzjDiU2dObK/SXy/59E/hZT0J8R
dOepy6WGFWMYVjx53FElFjjDzSVFnNZZh2WM8+rAJemMTsougomg1zh4iZKn
dUqSGolgzQpintbgelrP2c5Q6myF2Oph0QbRC7MiSP3KlBxWauTcvyBjZbz5
muFIHuBXUm30g3JaJfpxBquLcxFdkoBC1PaHrOa3OIX9mu1LKJiJPkvkJ1q4
JksSdqRrlD+deaWiTvLJfFmgCLA/B3NnzY0RkKjQGOe3bmpyJiaLIQMQg4n4
2ZU+KNGO7NOiH8uZwnpw1q9CGM+nnOfhy19F2GE9CJ2irYgkJQuLPHyJ6FcQ
pKQmgl6UZCnuO+f8TixtjYHimcz4j8k+lH7ObE5dBB8xVl+27eHiaddd++p0
X9Snr1fNQagRun7FPqyKzbYmiKKUyhx8zTUHEgYrRW6dTOTIu28u267RO4ET
lk91d39VnW429X7cNoRIYdTtsXoW9uEWd2NN+cWJHaab0x3m+7UQrMH+4QmX
f94VGC2xDuVNWbFMv7y5ErjA6TpWcD24+oCrssKdfavJ7ytYG9U91aSDHY6e
hTwVi+SO7WXV3WwqVSpBXylC/cZIw7p4bhTBEUfTHEnWw5/31dOOnKk9S/If
DG5hpO83i6JY9X8oT1iKst2XmBQuclRtybbX+Ge2yCYmj/M/kJKBkalt2XSN
2xWsv2eh/AWLniCzUuOST1VXOum2ffHUFkdLrMNvCIuHi8f6ADGrjqSETQux
7jrC2K6xelsowMVjo+pI1yP7AXctxqI5dhjNfdF2LNPfFo1qcOn6CqOw9Z6w
DaxGWbr6eF9WrN5St5fVKbAOs1aV4dzbQ+kqToZYPFL0FPt6b6GCnP+dhdqd
2v2Xoto3T23X6epUPhI4IXWYD0+7leX3EyJjsSmqIxEQwdcFtFsRWFdRJsQn
tkR/YDUg7cequ4dqwYa67ol8v3Z/odvDA4mLp12xJWlwW59qTAQjIjtSSHKP
JMc1B3z1SDoc8Q0Xvj1CN4oLvys6WxcPriXQcU9m252FXj2yWIwwP0zeykhI
moRGloIwgNJDXPw6qRnFBb52C9FutlXXbgkqaU4lxAy7Kghe28LWZCSk6bVE
OxxYngdbwa8aGku6HvUB4i1bfLzecwR3p5oVbh1rMu+wBFKbKqizQ6faPfRg
f9RV2WIisCdYNEGfu/KaWMATFvZSSGr4tZPO7S105QHix0V+zX28YFP351rd
XO0wuVpEB305HWGS/BnMTkEuglIkRqZz+Gwh3NA7iGe7aY/dI8aAiWFEBa30
QZMyV5elIcSwFgAJJn+6e24OgZBL1UAto+24Rt1CW8knud82x0ZV3fVj22Gx
MclG4TKnLxt81bUQZQNHUJWQz/MLJ5JW/B1UZFQvLCQvDSfZHG4u61OJ1QsQ
6TUxghup2RS6nq5PRONhKkdMpISSFxfwcPdbYkmJ2IQPhr7gMvQjxR0cwVgS
uAH5CSCUI+nIg4Q7xqKSHEKHVxc320oMvzQNPFpFZihsq8HvUC/Y0PYqsl9K
L9AaVjneyKLC3cCPYt4nQcJAeyGFgiSNOxjDLfzqtYaLesJEttX+pqhZo4kd
QDT2wtQFHV8Dh1dfEc4Y8ZHVMxwlFhMOoqsp3i1c0rPQ9XArqBlkVm8r8fYb
ulv4yy30AJsHq0FhK8XDU1VwE7n2JDFCb+DhKop3EyEu/32uV42ebQ+rpPfq
uJiNr+B6q/22qMo70xyIJj1qbBwYGVk3RJSyvpku7Ba35QRZh6mJY62wGqQJ
NrCPlriT7paYFLgebF97jLa8LbDnkDxIg7hiFSksHG7sa3muHG7hbiDtU1U8
kK7yjE1M1bgbEb4NKURw5d/SK0lbwcJTYzdYvKOlqUFTbNvd4u+w4JL77kgO
JtmQ2CzuybqB5sL8yISEM6CbatTNJvIgNTZQ0lw3MACoUQmb6bDXwPxI6DzB
zOBfeCkiJWnlvBT2ajjKL2UtgBaSKJ9rof0eFfaaZ25fO5IWDzC36H9vOvV/
5k7H0nH4niu68R0JTkUT92IWz2KH23/FAo+bWhGM+qCE93Mk8PPBVxhhdexY
Bm2xE+DfMSk4TEQNW0FPbeC1jqdasdy3In4WX4dSc0uDoTddCRXEaAWpuTmb
IrYtui/8jsV/Fn/yZStgmiP3FiI07+FHI42AJfG/mFyP/7rR4zb/3yGuihb8
FGIDqOdWdsCxIP24Jn2zKIWOHM2rYtG1hfRZzwzNhUEUxK+OlyR0wr+QmgQH
GmTf6Qh93Wyl7JtY1rJmAAH5dD7GIB2ZoZdkhGIjERva7YNuBIIEJ0F/wjXH
XYtAtOYTRIiNEbvc5Vugz4WhCRd2rLAPPUD0wkRohCbAev6AbWoL9eoQPJQn
hDEIKG4va9Y1dxAro6Rje0VmJuu8MconLHaM2bCLYXHxT5h/zd0eQRe0liMq
CXeiJsN/QGbYNBjqEXZkW05UQKBHGQkBwgItuiUw1xLPRfFe/5f6X78LcvON
qiUzjmlu/KxTb53OJzfMmXUmT/k+8mjTMXFKqTD6Hp+YxtnbXq+vDqXjmGfJ
EHLfh6C9SvJcp8oMydDrPp8m49gyfcqmOSilpYO9yrLljVDHl2T9NCd+no1y
2ZCd37P95WcFk2PwKs0G44LrZ50YNodU8zCFkIQxYwu8flCD0nqah9SGlEWe
y2uRyRiMDmno02lwKhmm1PVJPvF968H1WRrYZDEkU5KlhO2FPu+TaVxqYzDV
3KneDk4b5VM78E06CMiT5JJZi9v2bG4ZpnSws56NN85i0ovE+BrfzA6dWvWY
RlB+UKPhO2PTPOVqGswQQm+SNE+DGTPfTwlGurzFBCkmecI3l7Sd2JEQazGY
NE/cmCYpxpMkLh3mfojvLX2U9vmWrDVraTNMx07B970ZdciCH5XTLksTFeyY
pwPENva9VpD9kA3D2ssasp+TKfd6DizSNXqYtbNpnvswcwramh7rOA1ZYrN8
StRovV574o5zMuY532diX0bo5mzSYYSsfT/nUzaOYbY2DZPqISvT5wH6lA/B
rW9SubmfkE5qvnY5zfNoksnN1hij0yGBZqshd27gy2IWiq1cAqWal7f5fJrC
KDKfmmx2OXRNz6OfspDhArbPc4dhGZ2bc7H5p+mh39rkZyQeFpl/TuLjWqH/
hsT/iUGjfxKH+YpJ+pfP/ITPPL/r+Y/AOH1EXPLMZB1ZFAJMps3IN/dftzzw
ke4DiLYlkpaQF0FmY5hxVwxhu/IJmTjCmDtdKfwZIQ4uhSSNkeNRNyRo7ok1
OiLrCI/IwiSUORL08nUr8HlkCS1CvLa7R2Z18URyfCtUGwSihWThmkcNcpol
5PlrJ0dyd6+wqBeSAyO4coiUVHNqNy2Png7szFAiSrzZIrU1DcLgyDvfEpZT
lZz/dkv6D2ZqY/p8bVqC2LsK8VqJDAM5b8H+EUExcm67+rLZk8JaOkkDELYp
0vN5OIgQj5jUjhx7ZN8dWbBsT9Ig2K7JKXpmBFkpJPxHnu5cPLKZgRyEBVfx
6IScTulEgdRQITllq4ADqaMVwj2euW1IHZVeANUeuRAPRE4X+pwGsKkF41Rk
l8hZbs+9Q9gTISAFYOb5wEYHhhNjkF4VpCYxukZ0qTqZDkH9SIcgRujEnUIE
bYRTecIqFOMlAu7L3Q/JqzxW+BV89W3yakVZHO8cUiGeGSGVvt00e3YpIAP1
NqaL7GZC4uwGesg0GgE1gUFQOzZCaZQ0fbDNKZwIEWqZz0CP5DzlRMwR9eSJ
PQ94UtOoewThyKzZ7QXiRrZ5iYz8tCug7IcNSbxPWMmSZ4uE/u5KBO6IsCX4
Lj35nBgBT6103W2vdtRaSL89YN0UE/bSMomHZhc7Hk11bKCCjKLkMQPz8C1P
7xrkNDxDbNkbZI+MgXk/zK7hiV7BIyqkktI2YLysVHuFfIYNYyyysVKSNGYG
peW5mTBeC2QWByStBP5KixJoLqwVE1YiToy8kmOnBe7Ki7yb7/oK7gpjuX5u
Dw9OQKlU5NsCstggKX1qTrDYrnnkQdAOOoN85sQDVVg77ASGsIcZwqoFQ3wY
C0kXkfQd7nmo9cTeOzA9TGrLdgLI8YLfsfXGUTTzSY6yT19gW3AAB2RfbAIS
+wEheYeltjwFh9RLx3nXPHOmj8Elm2PzIx7soxy1tAUkbXl6x4PkpoPeHK4f
4TOeSGeGRSMvZp6LxBXW3cAMocFIr+8vax76nh6kpcKBht0WFRvl8FBYwU8U
F0YS+ZJ9I3jWRttqqcmF9BGRpkJ3kBHPp9lSoWAPETlK4mE5FhKqdWoORH/R
DGGtPGcUTNotNPcoLW44omYP2XTCB2bLjQqOjuBn6McJWut2ol5frio5CCrh
kjYlJggXdI2VYfMUHiRzOTbxWOGGVGq4ozvYDwZ7bHB1ZNtHnnbzIOzC7Pb3
Qg2jXcWOFnzwQPM7GnYPEkgb+dHwIYfGypHb0gTkh9TZ/wtvCxQ6McgCAA==

-->

</rfc>
