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

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

<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. CPace does not mandate any ordering of these two messages. 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 optional input parameters CI, ADa, ADb and sid that will be specified in section <xref target="OptionalInputs"/>.</t>
      <t>The naming of ISK as "intermediate" session key highlights the fact that it is RECOMMENDED that applications process ISK by use of a suitable strong key derivation function KDF (such as defined in <xref target="RFC5869"/>) before using the key in a higher-level protocol.</t>
      <section anchor="OptionalInputs">
        <name>Optional CPace inputs</name>
        <t>For accommodating different application settings, CPace offers the following OPTIONAL inputs, i.e. inputs which 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.
The RECOMMENDED option is to integrate both, A and B, into the channel identifier string CI. This option is to be
preferred as A and B will be kept
confidential and as this provides security advantages (see <xref target="sec-quantum-annoying"/> and <xref target="sec-considerations-ids"/>).
Integrating A,B into CI, however, requires that both parties know the party identity string of the communication partner
before starting the protocol. If this requirement is not fulfilled in an application setting then CPace offers the alternative of
integrating A as part of the optional input ADa and B as part of the optional input ADb. If the key exchange is successful, parties are guaranteed to learn each other's identity string.</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.
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.  </t>
            <t>
If an application cannot integrate the party identities (A,B) as part of CI, A SHOULD BE included in ADa and B SHOULD BE included in ADb instead
(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 optional 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, as in the symmetric
setting transcripts ordered string concatenation must be used for generating protocol transcripts and when integrating
the identity strings A and B into the channel identifier CI.
In this document we will provide test vectors for both, initiator-responder and symmetric settings.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="CipherSuites">
      <name>CPace cipher suites</name>
      <t>In the setup phase of CPace, both communication partners need to agree on a common cipher suite.
Cipher suites consist of a combination of a hash function H and an elliptic curve environment G.</t>
      <t>For naming cipher suites we use the convention "CPACE-G-H". We RECOMMEND the following cipher suites:</t>
      <ul spacing="normal">
        <li>
          <t>CPACE-X25519-SHA512. This suite uses the group environment G_X25519 defined in <xref target="CPaceMontgomery"/> and SHA-512 as hash function.
This cipher suite comes with the smallest messages on the wire and a low computational cost.</t>
        </li>
        <li>
          <t>CPACE-P256_XMD:SHA-256_SSWU_NU_-SHA256.
This suite instantiates the group environment G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P256_XMD:SHA-256_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P256, and hash function SHA-256.</t>
        </li>
      </ul>
      <t>The following RECOMMENDED cipher suites provide higher security margins.</t>
      <ul spacing="normal">
        <li>
          <t>CPACE-X448-SHAKE256. This suite uses the group environment G_X448 defined in <xref target="CPaceMontgomery"/> and SHAKE-256 as hash function.</t>
        </li>
        <li>
          <t>CPACE-P384_XMD:SHA-384_SSWU_NU_-SHA384.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P384_XMD:SHA-384_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P384 with H = SHA-384.</t>
        </li>
        <li>
          <t>CPACE-P521_XMD:SHA-512_SSWU_NU_-SHA512.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P521_XMD:SHA-512_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P521 with H = SHA-512.</t>
        </li>
      </ul>
      <t>CPace can also securely be implemented using the cipher suites CPACE-RISTR255-SHA512 and CPACE-DECAF448-SHAKE256 defined in
<xref target="CPaceCoffee"/>. <xref target="sec-considerations"/> gives guidance on how to implement CPace on further elliptic curves.</t>
    </section>
    <section anchor="Definition">
      <name>Definitions and notation</name>
      <section anchor="hash-function-h">
        <name>Hash function H</name>
        <t>Common choices for H are SHA-512 <xref target="RFC6234"/> or SHAKE-256 <xref target="FIPS202"/>. (I.e., the hash function
outputs octet strings, and not group elements.)
For considering both variable-output-length hashes and fixed-output-length hashes, we use the following convention.</t>
        <t>We use the following notation for referring to the specific properties of a hash function H:</t>
        <ul spacing="normal">
          <li>
            <t>H.hash(m,l) is a function that operates on an input octet string m and returns the first l octets of the hash of m.</t>
          </li>
          <li>
            <t>H.b_in_bytes denotes the <em>minimum</em> output size in bytes for collision resistance for the
security level target of the hash function. E.g. H.b_in_bytes = 64 for SHA-512 and SHAKE-256 and H.b_in_bytes = 32 for
SHA-256 and SHAKE-128. We use the notation H.hash(m) = H.hash(m, H.b_in_bytes) and let the hash operation
output the default length if no explicit length parameter is given.</t>
          </li>
          <li>
            <t>H.bmax_in_bytes denotes the <em>maximum</em> output size in octets supported by the hash function. In case of fixed-size
hashes such as SHA-256, this is the same as H.b_in_bytes, while there is no such limit for hash functions such as SHAKE-256.</t>
          </li>
          <li>
            <t>H.s_in_bytes denotes the <em>input block size</em> used by H. This number denotes the maximum number of bytes that can be processed
in a single block before applying the compression function or permutation becomes necessary. (See also <xref target="RFC2104"/> for the corresponding block size concepts).
For instance, for SHA-512 the input block size s_in_bytes is 128 as the compression function can process up to 128 bytes,
while for SHAKE-256 the input block size amounts to 136 bytes before the permutation of the sponge state needs to be applied.</t>
          </li>
        </ul>
      </section>
      <section anchor="group-environment-g">
        <name>Group environment G</name>
        <t>The group environment G specifies an elliptic curve group (also denoted G for convenience)  and associated constants
and functions as detailed below. In this document we use additive notation for the group operation.</t>
        <ul spacing="normal">
          <li>
            <t>G.calculate_generator(H,PRS,CI,sid) denotes a function that outputs a representation of a generator (referred to as "generator" from now on) of the group
which is derived from input octet strings PRS, CI, and sid and with the help of a hash function H.</t>
          </li>
          <li>
            <t>G.sample_scalar() is a function returning a representation of an integer (referred to as "scalar" from now on) appropriate as a
private Diffie-Hellman key for the group.</t>
          </li>
          <li>
            <t>G.scalar_mult(y,g) is a function operating on a scalar
y and a group element g. It returns an octet string representation of the group element Y = y*g.</t>
          </li>
          <li>
            <t>G.I denotes a unique octet string representation of the neutral element of the group. G.I is used for detecting and signaling certain error conditions.</t>
          </li>
          <li>
            <t>G.scalar_mult_vfy(y,g) is a function operating on
a scalar y and a group element g. It returns an octet string
representation of the group element y*g. Additionally, scalar_mult_vfy specifies validity conditions for y,g and y*g and outputs G.I in case they are not met.</t>
          </li>
          <li>
            <t>G.DSI denotes a domain-separation identifier octet string which SHALL be uniquely identifying the group environment G.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-section">
        <name>Notation for string operations</name>
        <ul spacing="normal">
          <li>
            <t>bytes1 || bytes2 denotes concatenation of octet strings.</t>
          </li>
          <li>
            <t>len(S) denotes the number of octets in an octet string S.</t>
          </li>
          <li>
            <t>This document uses quotation marks "" both for general language (e.g. for citation of notation used in other documents) and
as syntax for specifying octet strings as in b"CPace25519".  </t>
            <t>
We use a preceding lowercase letter b"" in front of the quotation marks if a character sequence is representing an octet string sequence.
I.e., we use the notation convention for byte string representations with single-byte ASCII character encodings from the python programming language.
b"" denotes the empty string of length 0.</t>
          </li>
          <li>
            <t>LEB128 denotes an algorithm that converts an integer to a variable sized string. The algorithm encodes 7 bits per byte starting with the least significant bits in bits #0 to #6.
As long as significant bits remain, bit #7 will be set. This will result in a single-byte encoding for values below 128.
Test vectors and reference code for LEB128 encoding are available in the appendix.</t>
          </li>
          <li>
            <t>prepend_len(octet_string) denotes the octet sequence that is obtained from prepending
the length of the octet string to the string itself. The length is encoded using LEB128.
Test vectors and code for prepend_len are available in the appendix.</t>
          </li>
          <li>
            <t>lv_cat(a0,a1, ...) is the "length-value" encoding function which returns the concatenation of the input strings with an encoding of
their respective length prepended. E.g., lv_cat(a0,a1) returns
prepend_len(a0) || prepend_len(a1). The detailed specification of lv_cat and reference code is available in the appendix.</t>
          </li>
          <li>
            <t>sample_random_bytes(n) denotes a function that returns n octets, each of which is to be independently sampled from a uniform distribution between 0 and 255.</t>
          </li>
          <li>
            <t>zero_bytes(n) denotes a function that returns n octets with value 0.</t>
          </li>
          <li>
            <t>o_cat(bytes1,bytes2) denotes a function for ordered concatenation of octet strings. It places the lexicographically larger octet
string first and prepends the two bytes from the octet string b"oc" to the result. Reference code for this function is available in the appendix.</t>
          </li>
          <li>
            <t>transcript(Ya,ADa,Yb,ADb) denotes a function outputting an octet string for the protocol transcript.
In applications where CPace is used without clear initiator and responder roles, i.e. where the ordering of messages is
not enforced by the protocol flow, transcript_oc(Ya,Yb,ADa,ADb) = o_cat(lv_cat(Ya,ADa),lv_cat(Yb, ADb)) SHALL be used.
In the initiator-responder setting the implementation transcript_ir(Ya,Yb,ADa,ADb) = lv_cat(Ya,ADa) || lv_cat(Yb, ADb) SHALL be used.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-for-group-operations">
        <name>Notation for group operations</name>
        <t>We use additive notation for the group, i.e., 2*X  denotes the element that is obtained by computing X+X, for group element X and group operation +.</t>
      </section>
    </section>
    <section anchor="protocol-section">
      <name>The CPace protocol</name>
      <t>CPace is a one round protocol between two parties, A and B. At invocation, A and B are provisioned with PRS,G and H.
Parties will also be provisioned with OPTIONAL CI,sid,ADa (for A) and CI,sid,ADb (for B) which will default to the empty
string b"" if not used.
A sends the public share Ya and optional associated data ADa to B.
Likewise, B sends the public share Yb and optional associated data ADb to A.
Both A and B use the received messages for deriving a shared intermediate session key, ISK.</t>
      <section anchor="protocol-flow">
        <name>Protocol flow</name>
        <t>Optional parameters and messages are denoted with [].</t>
        <artwork><![CDATA[
                        public: G, H

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

]]></artwork>
      </section>
      <section anchor="cpace-protocol-instructions">
        <name>CPace protocol instructions</name>
        <t>A computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar ya = G.sample_scalar() and group element Ya = G.scalar_mult (ya,g). A then transmits Ya and
optional associated data ADa to B.</t>
        <t>B computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar yb = G.sample_scalar() and group element Yb = G.scalar_mult(yb,g). B sends Yb and optional associated data ADb to A.</t>
        <t>B then computes K = G.scalar_mult_vfy(yb,Ya). B MUST abort if K=G.I.
Otherwise B calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K)||transcript(Ya,ADa,Yb,ADb)). B returns ISK and terminates.</t>
        <t>Likewise upon reception of the message from B,  A computes K = G.scalar_mult_vfy(ya,Yb). A MUST abort if K=G.I.</t>
        <t>Otherwise A calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(Ya,ADa,Yb,ADb)). A returns ISK and terminates.</t>
        <t>The session key ISK returned by A and B is identical if and only if the supplied input parameters PRS, CI and sid match on both sides and the transcript views of both parties match.</t>
      </section>
    </section>
    <section anchor="implementation-of-recommended-cpace-cipher-suites">
      <name>Implementation of recommended CPace cipher suites</name>
      <section anchor="common-function-for-computing-generators">
        <name>Common function for computing generators</name>
        <t>The different cipher suites for CPace defined in the upcoming sections share the following method for deterministically combining the individual strings PRS, CI, sid and the domain-separation identifier DSI to a generator string:</t>
        <ul spacing="normal">
          <li>
            <t>generator_string(DSI, PRS, CI, sid, s_in_bytes) denotes a function that returns the string
lv_cat(DSI, PRS, zero_bytes(len_zpad), CI, sid).</t>
          </li>
          <li>
            <t>len_zpad = MAX(0, s_in_bytes - len(prepend_len(PRS)) - len(prepend_len(G.DSI)) - 1)</t>
          </li>
        </ul>
        <t>The zero padding of length len_zpad is designed such that the encoding of DSI and PRS together with the zero padding field completely
fills at least the first input block (of length s_in_bytes) of the hash.
As a result for the common case of short PRS the number of bytes to hash becomes independent of the actual length of the password (PRS). (Code and test vectors are provided in the appendix.)</t>
        <t>The introduction of a zero-padding within the generator string also helps mitigating attacks of a side-channel adversary that
analyzes correlations between publicly known variable information with a short low-entropy PRS string.
Note that the hash of the first block is intentionally made independent of session-specific inputs, such as sid or CI and that there is no limitation
regarding the maximum length of the PRS string.</t>
      </section>
      <section anchor="CPaceMontgomery">
        <name>CPace group objects G_X25519 and G_X448 for single-coordinate Ladders on Montgomery curves</name>
        <t>In this section we consider the case of CPace when using the X25519 and X448 Diffie-Hellman functions
from <xref target="RFC7748"/> operating on the Montgomery curves Curve25519 and Curve448 <xref target="RFC7748"/>.
CPace implementations using single-coordinate ladders on further Montgomery curves SHALL use the definitions in line
with the specifications for X25519 and X448 and review the guidance given in <xref target="sec-considerations"/>.</t>
        <t>For the group environment G_X25519 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X25519.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_X25519.field_size_bits = 255</t>
          </li>
          <li>
            <t>G_X25519.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X25519(y,g)</t>
          </li>
          <li>
            <t>G_X25519.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.DSI = b"CPace255"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X25519 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 32 bytes of output. It is RECOMMENDED
to use G_X25519 in combination with SHA-512.</t>
        <t>For X448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_X448.field_size_bits = 448</t>
          </li>
          <li>
            <t>G_X448.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X448(y,g)</t>
          </li>
          <li>
            <t>G_X448.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.DSI = b"CPace448"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 56 bytes of output. It is RECOMMENDED
to use G_X448 in combination with SHAKE-256.</t>
        <t>For both G_X448 and G_X25519 the G.calculate_generator(H, PRS,sid,CI) function shall be implemented as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) SHALL BE calculated using the input block size of the
chosen hash function.</t>
          </li>
          <li>
            <t>This string SHALL then BE hashed to the required length
gen_str_hash = H.hash(gen_str, G.field_size_bytes).
Note that this implies that the permissible output length H.maxb_in_bytes MUST BE larger or equal to the
field size of the group G for making a hashing function suitable.</t>
          </li>
          <li>
            <t>This result is then considered as a field coordinate using
the u = decodeUCoordinate(gen_str_hash, G.field_size_bits) function from <xref target="RFC7748"/> which we
repeat in the appendix for convenience.</t>
          </li>
          <li>
            <t>The result point g is then calculated as (g,v) = map_to_curve_elligator2(u) using the function
from <xref target="RFC9380"/>. Note that the v coordinate produced by the map_to_curve_elligator2 function
is not required for CPace and discarded. The appendix repeats the definitions from <xref target="RFC9380"/> for convenience.</t>
          </li>
        </ul>
        <t>Code for the functions above is available in the appendix.</t>
        <section anchor="verification-tests">
          <name>Verification tests</name>
          <t>For single-coordinate Montgomery ladders on Montgomery curves, verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving u coordinate values that encode a low-order
point on either the curve or the quadratic twist.</t>
          <t>In addition to that, in case of G_X25519, the tests SHALL also verify that the implementation of G.scalar_mult_vfy(y,g) produces the
expected results for non-canonical u coordinate values with bit #255 set, which may also encode low-order points.</t>
          <t>Corresponding test vectors are provided in the appendix.</t>
        </section>
      </section>
      <section anchor="CPaceCoffee">
        <name>CPace group objects G_Ristretto255 and G_Decaf448 for prime-order group abstractions</name>
        <t>In this section we consider the case of CPace using the Ristretto255 and Decaf448 group abstractions <xref target="I-D.draft-irtf-cfrg-ristretto255-decaf448"/>.
These abstractions define an encode and decode function, group operations using an internal encoding
and an element-derivation function that maps a byte string to a group element.
With the group abstractions there is a distinction between an internal representation
of group elements and an external encoding of the same group element. In order to distinguish between these
different representations, we prepend an underscore before values using the internal representation within this
section.</t>
        <t>For Ristretto255 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_Ristretto255.DSI = b"CPaceRistretto255"</t>
          </li>
          <li>
            <t>G_Ristretto255.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_Ristretto255.group_size_bits = 252</t>
          </li>
          <li>
            <t>G_Ristretto255.group_order = 2^252 + 27742317777372353535851937790883648493</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_Ristretto255 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 64 bytes of output.
It is RECOMMENDED to use G_Ristretto255 in combination with SHA-512.</t>
        <t>For decaf448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_Decaf448.DSI = b"CPaceDecaf448"</t>
          </li>
          <li>
            <t>G_Decaf448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_Decaf448.group_size_bits = 445</t>
          </li>
          <li>
            <t>G_Decaf448.group_order = l = 2^446 -
  1381806680989511535200738674851542
  6880336692474882178609894547503885</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_Decaf448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 112 bytes of output.
It is RECOMMENDED to use G_Decaf448 in combination with SHAKE-256.</t>
        <t>For both abstractions the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>It is RECOMMENDED to implement G.sample_scalar() as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>Set scalar = sample_random_bytes(G.group_size_bytes).</t>
              </li>
              <li>
                <t>Then clear the most significant bits larger than G.group_size_bits.</t>
              </li>
              <li>
                <t>Interpret the result as the little-endian encoding of an integer value and return the result.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Alternatively, if G.sample_scalar() is not implemented according to the above recommendation, it SHALL be implemented using uniform sampling between 1 and (G.group_order - 1). Note that the more complex
uniform sampling process can provide a larger side-channel attack surface for embedded systems in hostile environments.</t>
          </li>
          <li>
            <t>G.scalar_mult(y,_g) SHALL operate on a scalar y and a group element _g in the internal representation of the group abstraction environment. It returns the value Y = encode(y * (_g)), i.e. it returns a value using the public encoding.</t>
          </li>
          <li>
            <t>G.I = is the public encoding representation of the identity element.</t>
          </li>
          <li>
            <t>G.scalar_mult_vfy(y,X) operates on a value using the public encoding and a scalar and is implemented as follows. If the decode(X) function fails, it returns G.I. Otherwise it returns encode( y * decode(X) ).</t>
          </li>
          <li>
            <t>The G.calculate_generator(H, PRS,sid,CI) function SHALL return a decoded point and SHALL BE implemented as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated using the input block size of the chosen hash function.</t>
              </li>
              <li>
                <t>This string is then hashed to the required length gen_str_hash = H.hash(gen_str, 2 * G.field_size_bytes).  Note that this
implies that the permissible output length H.maxb_in_bytes MUST BE larger or equal to twice the field size of the group
G for making a
hash function suitable.</t>
              </li>
              <li>
                <t>Finally the internal representation of the generator _g is calculated as _g = element_derivation(gen_str_hash)
using the element derivation function from the abstraction.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Note that with these definitions the scalar_mult function operates on a decoded point _g and returns an encoded point,
while the scalar_mult_vfy(y,X) function operates on an encoded point X (and also returns an encoded point).</t>
        <section anchor="verification-tests-1">
          <name>Verification tests</name>
          <t>For group abstractions verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving
encodings of the neutral element or receives an octet string
that does not decode to a valid group element.</t>
        </section>
      </section>
      <section anchor="CPaceWeierstrass">
        <name>CPace group objects for curves in Short-Weierstrass representation</name>
        <t>The group environment objects G defined in this section for use with Short-Weierstrass curves,
are parametrized by the choice of an elliptic curve and by choice of a suitable encode_to_curve function.
encode_to_curve must map an octet string to a point on the curve.</t>
        <section anchor="curves-and-associated-functions">
          <name>Curves and associated functions</name>
          <t>Elliptic curves in Short-Weierstrass form are considered in <xref target="IEEE1363"/>.
<xref target="IEEE1363"/> allows for both, curves of prime and non-prime order. However, for the procedures described in this section any suitable
group MUST BE of prime order.</t>
          <t>The specification for the group environment objects specified in this section closely follow the ECKAS-DH1 method from <xref target="IEEE1363"/>.
I.e. we use the same methods and encodings and protocol sub steps as employed in the TLS
 <xref target="RFC5246"/> <xref target="RFC8446"/> protocol family.</t>
          <t>For CPace only the uncompressed full-coordinate encodings from <xref target="SEC1"/> (x and y coordinate) SHOULD be used.
Commonly used curve groups are specified in <xref target="SEC2"/> and <xref target="RFC5639"/>. A typical representative of such a Short-Weierstrass curve is NIST-P256.
Point verification as used in ECKAS-DH1 is described in Annex A.16.10. of <xref target="IEEE1363"/>.</t>
          <t>For deriving Diffie-Hellman shared secrets ECKAS-DH1 from <xref target="IEEE1363"/> specifies the use of an ECSVDP-DH method. We use ECSVDP-DH in combination with the identity map such that it either returns "error" or the x-coordinate of the Diffie-Hellman result point as shared secret in big endian format (fixed length output by FE2OSP without truncating leading zeros).</t>
        </section>
        <section anchor="suitable-encodetocurve-methods">
          <name>Suitable encode_to_curve methods</name>
          <t>All the encode_to_curve methods specified in <xref target="RFC9380"/>
are suitable for CPace. For Short-Weierstrass curves it is RECOMMENDED to use the non-uniform variant of the SSWU
mapping primitive from <xref target="RFC9380"/> if a SSWU mapping is available for the chosen curve. (We recommend non-uniform maps in order to give implementations
the flexibility to opt for x-coordinate-only scalar multiplication algorithms.)</t>
        </section>
        <section anchor="definition-of-the-group-environment-g-for-short-weierstrass-curves">
          <name>Definition of the group environment G for Short-Weierstrass curves</name>
          <t>In this paragraph we use the following notation for defining the group object G for a selected curve and encode_to_curve method:</t>
          <ul spacing="normal">
            <li>
              <t>With G.group_order we denote the order of the elliptic curve which MUST BE a prime.</t>
            </li>
            <li>
              <t>With is_valid(X) we denote a method which operates on an octet stream according to <xref target="SEC1"/> of a point on the group and returns true if the point is valid and returns false otherwise. This is_valid(X) method SHALL be implemented according to Annex A.16.10. of <xref target="IEEE1363"/>. I.e. it shall return false if X encodes either the neutral element on the group or does not form a valid encoding of a point on the group.</t>
            </li>
            <li>
              <t>With encode_to_curve(str,DST) we denote a mapping function from <xref target="RFC9380"/>. I.e. a function that maps
octet string str to a point on the group using the domain separation tag DST. <xref target="RFC9380"/> considers both, uniform and non-uniform mappings based on several different strategies. It is RECOMMENDED to use the nonuniform variant of the SSWU mapping primitive within <xref target="RFC9380"/>.</t>
            </li>
            <li>
              <t>G.DSI denotes a domain-separation identifier octet string. G.DSI which SHALL BE obtained by the concatenation of b"CPace" and the associated name of the cipher suite used for the encode_to_curve function as specified in <xref target="RFC9380"/>. E.g. when using the map with the name P384_XMD:SHA-384_SSWU_NU_
on curve NIST-P384 the resulting value SHALL BE G.DSI = b"CPaceP384_XMD:SHA-384_SSWU_NU_".</t>
            </li>
          </ul>
          <t>Using the above definitions, the CPace functions required for the group object G are defined as follows.</t>
          <ul spacing="normal">
            <li>
              <t>G.DST denotes the domain-separation tag value to use in conjunction with the encode_to_curve function from <xref target="RFC9380"/>. G.DST shall be obtained by concatenating G.DSI and b"_DST".</t>
            </li>
            <li>
              <t>G.sample_scalar() SHALL return a value between 1 and (G.group_order - 1). The sampling SHALL BE indistinguishable from uniform random
selection between 1 and (G.group_order - 1).
It is RECOMMENDED to use a constant-time rejection sampling algorithm for converting a uniform bitstring to a uniform value between 1 and (G.group_order - 1).</t>
            </li>
            <li>
              <t>G.calculate_generator(H, PRS,sid,CI) function SHALL be implemented as follows.  </t>
              <ul spacing="normal">
                <li>
                  <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated.</t>
                </li>
                <li>
                  <t>Then the output of a call to encode_to_curve(gen_str, G.DST) is returned, using the selected suite from <xref target="RFC9380"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>G.scalar_mult(s,X) is a function that operates on a scalar s and an input point X. The input X shall use the same encoding as produced by the G.calculate_generator method above.
G.scalar_mult(s,X) SHALL return an encoding of either the point s*X or the point (-s)*X according to <xref target="SEC1"/>. Implementations SHOULD use the full-coordinate format without compression, as important protocols such as TLS 1.3 removed support for compression. Implementations of scalar_mult(s,X) MAY output either s*X or (-s)*X as both points s*X and (-s)*X have the same x-coordinate and
result in the same Diffie-Hellman shared secrets K.
(This allows implementations to opt for x-coordinate-only scalar multiplication algorithms.)</t>
            </li>
            <li>
              <t>G.scalar_mult_vfy(s,X) merges verification of point X according to <xref target="IEEE1363"/> A.16.10. and the the ECSVDP-DH procedure from <xref target="IEEE1363"/>.
It SHALL BE implemented as follows:  </t>
              <ul spacing="normal">
                <li>
                  <t>If is_valid(X) = False then G.scalar_mult_vfy(s,X) SHALL return "error" as specified in <xref target="IEEE1363"/> A.16.10 and 7.2.1.</t>
                </li>
                <li>
                  <t>Otherwise G.scalar_mult_vfy(s,X) SHALL return the result of the ECSVDP-DH procedure from <xref target="IEEE1363"/> (section 7.2.1). I.e. it shall
either return "error" (in case that s*X is the neutral element) or the secret shared value "z" defined in <xref target="IEEE1363"/> (otherwise).
"z" SHALL be encoded by using
the big-endian encoding of the x-coordinate of the result point s*X according to <xref target="SEC1"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>We represent the neutral element G.I by using the representation of the "error" result case from <xref target="IEEE1363"/> as used in the G.scalar_mult_vfy method above.</t>
            </li>
          </ul>
        </section>
        <section anchor="verification-tests-2">
          <name>Verification tests</name>
          <t>For Short-Weierstrass curves verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving an
encoding of the point at infinity and an encoding of a point not on the group.</t>
        </section>
      </section>
    </section>
    <section anchor="verification">
      <name>Implementation verification</name>
      <t>Any CPace implementation MUST be tested against invalid or weak point attacks.
Implementation MUST be verified to abort upon conditions where G.scalar_mult_vfy functions outputs G.I.
For testing an implementation it is RECOMMENDED to include weak or invalid point encodings within the messages of party A and B and introduce this
in a protocol run. It SHALL be verified that the abort condition is properly handled.</t>
      <t>Corresponding test vectors are given in the appendix for all recommended cipher suites.</t>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>A security proof of CPace is found in <xref target="AHH21"/>. This proof covers all recommended cipher suites included in this document.
The security analysis in <xref target="BGHJ24"/> extends the analysis from <xref target="AHH21"/> by covering the case that
no pre-agreed session identifier is available. <xref target="BGHJ24"/> also shows how a unique session id sid_output can be generated along with the protocol
for applications that do not have a session identifier input available.</t>
      <section anchor="sec-considerations-ids">
        <name>Party identifiers and relay attacks</name>
        <t>If unique strings identifying the protocol partners are included either as part of the channel identifier CI or the associated data
fields ADa, ADb, then ISK will provide implicit authentication also regarding the party identities.</t>
        <t>Incorporating party identifier strings is important for fending off relay attacks.
Such attacks become relevant in a setting where several parties, say, A, B and C, share the same password PRS.
An adversary might relay messages from an honest user A, who aims at interacting with user B, to a party C instead.
If no party identifier strings are used and B and C share the same PRS value then A might be using CPace for
establishing a common ISK key with C while assuming to interact with party B.
Including and checking party identifiers can fend off such relay attacks.</t>
        <t>The following guidance SHOULD be followed regarding party identifiers.</t>
        <ul spacing="normal">
          <li>
            <t>If an application layer has party identifiers available, it SHOULD integrate party identifiers in the CPace protocol run, either within CI or ADa/ADb.</t>
          </li>
          <li>
            <t>The application SHOULD give preference to the option of integrating party identifiers in CI. This avoids the need of an explicit check for the identity strings.</t>
          </li>
          <li>
            <t>Otherwise A SHOULD integrate its party identifiers in ADa and ADb, such that A integrates its identifier in ADa and B integrates its party identifier as part of ADb.
In this case the application layer will have to add an explicit check for the identity string of the actual communication partner for fending off relay attacks.</t>
          </li>
        </ul>
      </section>
      <section anchor="hashing-protocol-transcripts">
        <name>Hashing protocol transcripts</name>
        <t>CPace prepends the length of all variable-size input strings before hashing data.
Prepending the length of
all variable-size input strings results in a so-called prefix-free encoding of transcript strings, using terminology introduced in <xref target="CDMP05"/>. This property allows for disregarding length-extension imperfections that come with the commonly used Merkle-Damgard hash function constructions such as SHA256 and SHA512 <xref target="CDMP05"/>.</t>
      </section>
      <section anchor="key-derivation">
        <name>Key derivation</name>
        <t>A CPace implementation SHALL output ISK but MUST NOT expose K, because a leaked K
may enable offline dictionary attack
on the password, and a matching value for K does not provide authentication of ADa and ADb.</t>
        <t>As noted already in <xref target="protocol-section"/> it is RECOMMENDED to process ISK
by use of a suitable strong key derivation function KDF (such as defined in <xref target="RFC5869"/>) first,
before using the key in a higher-level protocol.</t>
      </section>
      <section anchor="sec-key-confirmation">
        <name>Key confirmation</name>
        <t>In many applications it is advisable to add an explicit key confirmation round after the CPace protocol flow. However, as some applications
might only require implicit authentication and as explicit authentication messages are already a built-in feature in many higher-level protocols (e.g. TLS 1.3), the CPace protocol described here does not mandate
key confirmation.</t>
        <t>Already without explicit key confirmation, CPace enjoys weak forward security under the sCDH and sSDH assumptions <xref target="AHH21"/>.
With added explicit confirmation, CPace enjoys perfect forward security also under the strong sCDH and sSDH assumptions <xref target="AHH21"/>.</t>
        <t>Note that in <xref target="ABKLX21"/> it was shown that an idealized variant of CPace
also enjoys perfect forward security without explicit key confirmation. However this proof does not explicitly cover
the recommended cipher suites
in this document and requires the stronger assumption of an algebraic adversary model. For this reason, we recommend adding
explicit key confirmation if perfect forward security is required.</t>
        <t>When implementing explicit key confirmation, it is recommended to use an appropriate message-authentication code (MAC)
such as HMAC <xref target="RFC2104"/> or
CMAC <xref target="RFC4493"/> using a key mac_key derived from ISK.</t>
        <t>One suitable option that works also in the parallel setting without message ordering is to proceed as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First calculate mac_key as mac_key = H.hash(b"CPaceMac" || sid || ISK).</t>
          </li>
          <li>
            <t>Then let each party send an authenticator tag calculated over the protocol message that it has sent previously. I.e.
let party A calculate its authentication tag Ta as Ta = MAC(mac_key, lv_cat(Ya,ADa)) and let party B calculate its
authentication tag Tb as Tb = MAC(mac_key, lv_cat(Yb,ADb)).</t>
          </li>
          <li>
            <t>Let the receiving party check the remote authentication tag for the correct value and abort in case that it's incorrect.</t>
          </li>
        </ul>
      </section>
      <section anchor="integrating-cpace-in-higher-level-protocols-such-as-tls13">
        <name>Integrating CPace in higher-level protocols such as TLS1.3</name>
        <t>When integrating CPace into a higher-level protocol such as TLS1.3 <xref target="RFC8446"/> it is recommended to use ISK
as shared secret (which might otherwise be generated as part of a Diffie-Hellman key exchange output for other cipher suites).</t>
        <t>Note that unlike the shared secret of a Diffie-Hellman protocol run, ISK will also provide mutual implicit authentication of the protocol partners.
For providing explicit authentication, it is recommended to add a key confirmation round along the lines in <xref target="sec-key-confirmation"/>,
such as e.g. done in the "Finished" messages in TLS1.3 <xref target="RFC8446"/>.</t>
        <t>If an embedding protocol uses more than two messages (e.g. four message TLS1.3 <xref target="RFC8446"/> flows involving
a hello-retry message and a repeated client-hello message) it is suggested
that the CPace layer only considers the two messages used for the CPace run. I.e., it is suggested that
authenticating the full message sequence involving also the additional messages that might precede the two CPace messages
is done under the responsibility of the embedding application protocol.
This could be done by integrating the full protocol transcript as part of a final explicit key confirmation round (as commonly done by TLS 1.3 as part of the "Finished" messages).
Alternatively, information on communication rounds preceding the CPace flows can also be integrated as part of the CI field, as this will authenticate
the information and will not require both communication partners to keep state information regarding preceding messages in memory until after the CPace run.</t>
        <t>In case of TLS 1.3 <xref target="RFC8446"/> it is suggested to integrate Ya into the client-hello message and Yb into the server-hello message. Also party identifiers
might best be added to the client-hello and server-hello messages as part of extension fields.
It is recommended to use the full octet stream encoding of the
client-hello message as parameter ADa. Likewise it is recommended to use the encoding of the server-hello message for the parameter ADb.
This approach has the drawback that the public points Ya and Yb might show up redundantly duplicated in the hashing operation for
CPace's transcript strings but has the advantage of simplicity and the advantage that all meta-information in the extension fields within the
client- and server hello fields will always become authenticated as part of the ISK.</t>
      </section>
      <section anchor="sec-sid-output">
        <name>Calculating a session identifier alongside with the CPace run</name>
        <t>If CPace was run with an empty string sid available as input, both parties can produce a public session identifier string
sid_output = H.hash(b"CPaceSidOutput" || transcript(Ya,ADa,Yb,ADb)) which will be unique for honest parties <xref target="BGHJ24"/>.</t>
      </section>
      <section anchor="sampling-of-scalars">
        <name>Sampling of scalars</name>
        <t>For curves over fields F_q where q is a prime close to a power of two, we recommend sampling scalars as a uniform bit string of length field_size_bits. We do so in order to reduce both, complexity of the implementation and the attack surface
with respect to side-channels for embedded systems in hostile environments.
<xref target="AHH21"/> demonstrated that non-uniform sampling did not negatively impact security for the case of Curve25519 and Curve448.
This analysis however does not transfer to most curves in Short-Weierstrass form.</t>
        <t>As a result, we recommend rejection sampling if G is as in <xref target="CPaceWeierstrass"/>. Alternatively an algorithm designed along the lines of the hash_to_field() function from <xref target="RFC9380"/> can also be
used. There, oversampling to an integer significantly larger than the curve order is followed by a modular reduction to the group order.</t>
      </section>
      <section anchor="preconditions-for-using-the-simplified-cpace-specification-from-cpacemontgomery">
        <name>Preconditions for using the simplified CPace specification from <xref target="CPaceMontgomery"/></name>
        <t>The security of the algorithms used for the recommended cipher suites for the Montgomery curves Curve25519 and Curve448 in <xref target="CPaceMontgomery"/> rely on the following properties <xref target="AHH21"/>:</t>
        <ul spacing="normal">
          <li>
            <t>The curve has order (p * c) with p prime and c a small cofactor. Also the curve's quadratic twist must be of order (p' * c') with p' prime and c' a cofactor.</t>
          </li>
          <li>
            <t>The cofactor c of the curve MUST BE equal to or an integer multiple of the cofactor c' of the curve's quadratic twist. Also, importantly, the
implementation of the scalar_mult and scalar_mult_vfy
functions must ensure that all scalars actually used for the group operation are integer multiples of
c (e.g. such as asserted by the specification of the decodeScalar functions in <xref target="RFC7748"/>).</t>
          </li>
          <li>
            <t>Both field order q and group order p MUST BE close to a power of two along the lines of <xref target="AHH21"/>, Appendix E. Otherwise the simplified scalar sampling specified in <xref target="CPaceMontgomery"/>
needs to be changed.</t>
          </li>
          <li>
            <t>The representation of the neutral element G.I MUST BE the same for both, the curve and its twist.</t>
          </li>
          <li>
            <t>The implementation of G.scalar_mult_vfy(y,X) MUST map all c low-order points on the curve and all c' low-order points on the twist to G.I.</t>
          </li>
        </ul>
        <t>Algorithms for curves other than the ones recommended here can be based on the principles from <xref target="CPaceMontgomery"/> given that the above properties hold.</t>
      </section>
      <section anchor="nonce-values">
        <name>Nonce values</name>
        <t>Secret scalars ya and yb MUST NOT be reused. Values for sid SHOULD NOT be reused since the composability
guarantees established by the simulation-based proof rely on the uniqueness of session ids <xref target="AHH21"/>.</t>
        <t>If the higher-level protocol that integrates CPace is able to establish a unique sid identifier for the communication session,
it is RECOMMENDED that this is passed to CPace as sid parameter.
One suitable option for generating sid is concatenation of ephemeral random strings contributed by both parties.</t>
      </section>
      <section anchor="side-channel-attacks">
        <name>Side channel attacks</name>
        <t>All state-of-the art methods for realizing constant-time execution SHOULD be used.
Special care is RECOMMENDED specifically for elliptic curves in Short-Weierstrass form
as important standard documents including <xref target="IEEE1363"/> describe curve operations with
non-constant-time algorithms.</t>
        <t>In case that side channel attacks are to be considered practical for a given application, it is RECOMMENDED to pay special
attention on computing the secret generator G.calculate_generator(PRS,CI,sid).
The most critical substep to consider might be the processing of the first block of the hash that includes
the PRS string.
The zero-padding introduced when hashing the sensitive PRS string can be expected to make
the task for a side-channel attack somewhat more complex. Still this feature alone is not sufficient for ruling out power analysis attacks.</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="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="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="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 885?>

<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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
be7t1WUP9Dg6GrfeF4lz7Q3w5zN3q6s6Po87WVg145Dand5GTx6MC2pqeqTl
NAPGTgK8WW0ahRPuhk7XWT+SLuDjdLpfYH4vjyTAHokfPM3Xop3FHZW1vFpT
9fBLjG2FsBpMfKF9bojzjIiLMdBvPD428DCjVPznu1x/Bb3/QokUk9Z3Z+cW
vHF6Yx1YZ3RGqjWMo2I//dbC9GINuhvXeNiAuTAvwZTyMbrbEJOLj15RueSB
7Of+Y/vUshuZwx6OOR/QcyL+/NpQ72sf38gdxK4U/DyXHAyX6+iVuok4VmHs
vxowV/pFwUh/fs1dqw9/5i/+fqSeBo0evfDdQzHf/zTMp/r4yPgz/NswtbHU
skBsyIf/9jejflQA9OvXhpmd1wdpdf8X+kjUxuYh4WIduqZ4d7P0nZZ3Uuvb
BLg8emUIsF4ZliFud8L5THPnYcuuOpkX3MwLTtWq2tVq1cm/SKhaYqzl0LLr
R0eZOYEktEHqY9M0LdM2q6ZjumbNrJsNs2l6pm8GZmhG5tgyLcuyrarlWK5V
s+pWw2pansVXVluBFVqRNbZN27Jtu2o7tmvX7LrdsJu2Z/t2YId2ZI+rpoS1
6oKXVa826PVqs+pV/WpQDatRdeyYjuXYTtVxHNepYad1p+l4ju8ETuhEztg1
Xcu13arruC697tbcuttwm67n+m7ghm7kjmtmzarZtWrNqbm1Wq1ea9SaNa/m
14JaWItq47pZt+rc1b1erTt1t16r1+uNerPu1f16UA/r0bPobOTQWTV1dDYQ
mb8JoYxO/7cilNHZ+K0IZXS6vxWhjE57H0LrY3mvNzCMMQQmUSWeSapddK1x
enLVrjlC5iFXHUuuMr6LNm8fg9mHx08/ufcf7aepH9/GbzfBQ+duMencnTx2
4sdJZ9aZd4edbe8siC/jk7i7bW+7d91td9uPfzyDQU7i4M3baXDxYf3pvJl8
+slZXMfBEzxivt3c8yut/rY77G7wpd5ZJ+mcZaeFQXDm6ONgGmxuN9c/ufNP
VxMYInh4d8VD9Mzrx27r5Knb6jx2tydmtzV67N2dVLutyePl8PS024ZBOo/9
7Wm72x49Du7aj91hG4YAYIf9p96wbXeHwdNlq+12R+2n/t15qzvqPw2G5xfd
u5MNLHADEG9gkF6rY3Xvrje9bcfp3t1v+sO3Z9377mbQenvevb/edlvdp+62
A0vpmt3taNu761a728n2ctg77ZqdbX+Lg7S75mg7uOs/gn1mdu/6216rb/aG
fbvXCszLVt/ttdtm/27Q6rX75mA4uOgNT6zucLTpDbtWrzWycJDhtdXbjpze
8N7qDz+c9UZda9D6cN4bXdvd1vVT765jd7fXZu9uZPfurqu9u4l9Ofx02rvv
2P3tp3bvHgYZ2YO74LG3bVcBndvetl/tDQO7tw2ql63A7Zntav8ubPXMfnVw
tbszuC1IJzs7M1E7c9k6AVTD/y1A+d0J4AcWPTwBCINH+M7tttuP/TsY5LTV
bfcfB8PTC3j8CXYHsN59AvzAumEx27bTHd4/9YfnZ91R92nQOj/vjq43sOEw
HezOtgNS/bvuHaDorgOLmWwuh29Pu/edTX/7tt29H20Gd91HjTq3gErAT7C9
bHXdrtne9u96rS4O0t8Ohr2LXgvIaNjf4IewO4B1QOW27/Ra92Z/ODjDPRy0
Bue99rUF5AY0BISxHcEu8u7cjQCVE+ty+OG0N+pY/e2Hdm80sgZ310CZQG53
10AbsOHDa9idwL5sXbu9+7bdv/vU6t337cEQBvl00dsCEQ8DILduFWgDNhw2
chs4ve19tT8Mz3pmtzpohefAAPG4//q10JekMEWO6x7DxkBrCp6hNNg/gaua
HEkNLfoqpBaJwTGcJXXvx0d1XS6eBstBl+Xw1JEajvQ7P6cp9FQ80fAyJfdI
6nMBm9DOZf/Axb/w/1q9kVXvdrG6Nq2qC0qiKhThHysa47dboNFtf87iMGV7
KRZ7V1IkjkAUnsQg94CzJuJ5pFamPxZ5STht3l1/7Gvi8QmmGM1/vOjM+efr
6uWZkr4m0jKRPJEzMFkX6BAYbSuHfdtUyM41qNzp+KT3tM9bv+ph/bZyrTdU
chPPRVsoJgu89B1D43Row7V1WjaPpJK0a6oWIquIAU7CMHudtwjYcIyT786m
QCfnvmn3glekbS0vM595T4emBiS218peWp5eZp6xUNWf3YfpevOjjPH6peDS
9fTOdXHlevH4/Efexl60Z8mOO0uHYHjYrh9ClPLNSNkJwvyVBXUUpdCyrEUo
cWpO4Uj73pFXmKtEV/KD0VN+lZcuLF4yw0w3N5wAwZaeVaZ/bCV3DgaiCedQ
9Orkx/7Gj4koxB7IKlJSzWCj0UN4jT+RiBCzHZUN9Yut9pquLUDyYrNTvH2k
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
0TLYwcrR6GCU6pwKeuyVTjUNRGVKpjRkxmIYr43sOiPMsPRzdJZuzmSgqTAq
9L1WVvvBeBphmqpe6KwzUgff606MST/qbnCDkq+HRj9qhc2yXluf0CyN7JNE
ZLZTUmZaJkpmSSZDmrnUhSRJU6HCIIUdg5fj8mXcyAytprNpGlJnGRbiZJqR
7UWnlKPlCGnPqBC6os7EqEZLdzCvg1J/K4P9N/T6W4q/B1Dth0Oz4z8uBJ+G
dj8c4S8Mvfvo4982FPy04A2OSjDaXs4KqnSP6h3VT4eTm3J3lUN8cFvRuYUp
XyLPxp5eOlwVjJxg1HDDEn6iEM2eIUUMq6LNjJlgdiyJSKel7f66YTlIqkGr
wymYYeigsCmYNIZVInnjP6ddu6Fdm/ln3tFBgV6nU9B9NHm1e8dcPoxCWWMk
ayqE6DyWM3HK/rah+rLeMRVSdcSCOSygQ2UIFYHAb/BBhkpUumVOR0Ce5PZs
hbMIIN/MTyRKqlJq1E1U122bfMOSiFQwUzVMdWXBZEUFSyHW/Pv96XEp1mtI
ZNJR5fs3AdIZ502FwBlztdDRr44ngHPFKCw64dzQuYTKr3Oq6C7pDEJHPDpB
smxPxYCUAx0mCqpDGY1DFWCzO7lp9kw4w0xTDI/XVJpSnXSGk/OGQTpUOzLm
nQ7olhezyalE2zLKhG9TUj1+fsuHiqot+FT0Wkw7VTJ0UmC9RyrXqO6iE4Ci
VTJgmuJytKBzB1V2Ozp/0fGXuVmoCLR8sKrY3VAsvpMMzuFTZMnKvVQ4cVVD
pT/qqQPLhTJ+ZU9VPh2mgJw/ud20dADfMz8NH/9bvg2ZlBmYzqlYOltVRzMm
ni7yCBZPl6TFPJBZWzrOtOeCDlGCwUubLZ0eBSiRNKuR4qyyK7g85LhgEFe5
a5gw5qZumSWHjjFMm8ButeUT0LkGR09BZ9UDn56rdVUwjQKvWuR3ypkmoaaj
P+ubUnVb8DGYDlN0GGdCnqeR9Xew+m8TL/dGcH51Qjvf/wJQ/iN9zZ8Dzr+7
5ovqms+D8+eOqVdi85V+Cpr/v+j6v/+xzP+f6V6///77H9rfV+3v/6/pvdtX
vPf39LZ/ELZfm555c4zvejWkmVFeZ25k/pbB97HX8UVsP6P6I77/Ndh+8VBq
YrgnNSEgLZFYKgdNMEZ3VpvMSKoq5t+z8kRqrZ1LTTPwPx6TAMj0FXv04y3+
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
BItnbxuoLNFbjqHlySCuF+BnPxztL//n+EL2TKlwfXmu3N/9H5o/939Ys/Ta
n5eTxe5sBZYRKlo3BTOvUFHG5x9xwv/WJSuQbguwIWyvqKalmpUlvFnqfFtc
V1QKUSFKWzidj3J/DaIFsT5iFpGauRq43GlZzfw9nZN4d7YMdOOWZD6IbAoq
OKjKrgpaTBoFnzTobgYkJFSNU71/U4JsgWzDJ7atn9XUm1t7OFfrn85/PB37
H89+CmunLv64/5O/vTn/n+/f/YlC4afh+9X5736o/t7r0333g30fjts48T3Y
VeotnWtaRii+z1kGnmp7Kv3oLMSKq4d3dJCjen/bWu67rg/0N7sbjZKLMj4A
oj/9nA5ltS6ZfyLnQ93+w/j9QzBX8cjF7vyLi9LPdLE7/wJm7vNc7M6/uAB7
6GKyipK7p/0fL973x1f7k/X+dvKd6zvugTcBwHRmPgaA0S9+LgAMl3gBAMb3
fEadVWVvQoBl6ZMIMLrB0lTCP7+EAHvuvf9ABJjtdZrqrnNiyEalfSJtojva
aYylUgcNk18QAZaqFxFgmunGn2hbmX//WgSY/TwE2JtA3l/948/h0e46YF9W
c31mYZePL+v7HCzNpY8q8JHLJK+V02PoBy17xZIoMhlYFl5mg1N66LxzGZXT
gSou3w/D3KaTOtNlwYQ067tOKx+60bsks72XVCF1aSZG0wXnsy7xySAT03VG
OTFLVQQ5qJQqJEX1Whd8NggpnJIuUQnVTNnI4zKJUIMRGZVepg8h8cLPH3dZ
YOmLjj7Iw+69H6RPexGyr4huOyyPIp5At5XbE8OvtevTbUys7TV2yoKRSoeK
OZKAXIqX+OGKdouj1U8XP9g/hmPULqa6fax/ymKnqB6YJoYFBEsqe2oJuHfB
J/yKgT4Cp36cqZfXDwwAoq2PNqNz0UR0G/2Iu9diZjF6m75l5Mh5DK36MJ/0
J5HKloH8/lDzA8eiNc3u5FAfzm9YvXV6QMC7JO1RmravRzCrH3Ul/B+u/nZx
+/63v4M9bvi570806p+Yweh3xeXf+EmudH/ur9yH4cfmyt9OmPa2Xcz2aZtx
HfMJs+Hv602OSz5cScnUd98mpvtrjuTTuqgRj/kqSN7zvsK1HbnLy74SIXnA
41FFxecDBvifWH4+xxxm0EA9uY3EYEzH1N7WzMVW8DPKal23fJS4pCqKicSo
IBOn66Yt9YaqdCpqBZMe1FxlrlflgWq4Yn1cH/Zqw4/zDjR4xtkdLq+hi5pf
5ZuioHLwgp/5ClAM7PZkk/qGuajY7XfelOSFZbsu6sP7NRXl11Qi32y257eg
OWOmPEygVkxVxQ/omS2sKpjlgwkL8bCemc2YQ4ppumgi/PyNn9HmzXadV4I1
gy8fPgX7qmg/8wAIPoxG6xBsF6RRPkvEkHqqQIQIQUsbdJYFO3hrlPBUJgwu
JKNwIp3LAM0goIzO9LS5CJPplKuKRHrj0iENwekh+NC7F9GAjzc7bTphQseq
OM4G5j3ylrYAofyohlQ4a4LvjGNF0swOHZUoUiwKZrp3CZ3xB89PjZy39KNV
xqQqTTOt5dgPQjh6g6VtTnM3LW11TncLvEVlduysGRKGf2dmDEqlxvLDoTST
Pe2O4ziaJPTepcJ72cuUSp5Ffq1zJiSZSoJVI3N5KG1Sp4ZkembwuaDCf5iN
uJl4pFmGJPFLs7oLaceq7NJpqkVoK1chUGlBZVKWkQcw45EQvVNGJ9moycIh
y8axW9p+qf5xaXCqQ9uyCaHn3lHn1C+ETXwYBFb0YqC6ydlOsVx7l3Gzc2Yo
MIJ3gpbYai2olHOOTEEFMw13CGEGMGivrHWpHVmBK+lSK0ZnqGTz3ieqS7TS
vR0MhFKfxS4+XmDRUWHupEnHYNhUqSGDM+B2pCVLxpDQaKyhEtNQcUo+2snR
ibsnU4aqPOYhoEWnhZNZarIw0AE9sboLqjOexpSQZ1OZ77ugVdb3Qs/PxRRF
Qe/odpY8vkvJFlTECudcl6RkiNRSpe8UucCQWW+sGsZMjy6bK9whleQ2VCVq
pi1LTc9qT0KJ9OdBIP9hNkqp4KYymy5PizqfAgJFgUnMIDryeJuxoJqj+yaJ
ZaFCBka6PiFnsjJl1rDAilRUbc8AG25I12oc6IKpo8LciowsG8bs6yApH7p8
5zrfDZ2zCdkt4VZ7Gts4ZJS/lRzV6DuXUlbMKMkoMYpBWUrlYpFWpIi12cjt
/2FIbcqfpvdq2wfT0R4iRKooc+rh6cE9RFr+owb3CyMxlXgoiSY/L49PH+/T
z9vrZivrz9vrlqT5/F43g9x4gg9jdD6TvipUH8fo8vHXpLPHeWzGfrwqnT3O
Y/Pdp3T2Onjos8+e3gp+evVDmq8FD9XiZXjo5z1FuqeW+YlHYlrE1LDkibdm
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
MexH1bcPqBD2Fyz5XADrVd5utiyefLouD2t6+15utvubat/Kcs+Kr6zFe3Jo
WMZ3uzfl4eKoya9WLNvatGc5ay4AMPy+qBhLXJwyePqWFW6bPWsQX8p6X94w
xqdmDV4I5rIa7vtVtS9ZolNVrGbGva8ntgQYmoWpzjUrd27y9aopStNs39El
9rflltHPF6uSgeesbHpgrbR3t822vt7ktQTCqmGJYlUfVjmDovnnahtW6Pnk
CTJ0W7Q39SEclUVtolknjoM9C39FoYqiljWr2+an+SZnHoOQ17tzUQLCXt5U
bc1KZEXFNtjWjKiX1Xa13rBY6u6dRT9wOGbOBpAJFKc524flaln8tMrp7bt1
XuV7TZcuGO7ftEzdcGIjIQOzCXAH+8uEDIdmVdKHakjY7m3FQsttrVnOtWnr
63Jf8UXKfUt33ssKots1mZn1qy9l07L2F61OccKqF7bak2mxqJeKFXEZSc9d
u7AJDX7naVXKQ9mSD2zfXW/aCxbQpQUE2cCBiRfIRw7M/VDSwjdMmVEw7os9
+5L9pGFk1c6LastwMb7c+oh9oGG6jJzbhslnDqzhTCvFZB05C+0WlmynyCFU
VBe/ZeE27rxl2Nhme0oxdFFMC/lhBgDUrMdL3rrZnpG/sFj5ekWjF+w77Ce0
Hk0BpTq+k6RpXXP/84bmXXJfNHes75t1wzK/gpXtyGaHs2NuvW5Y3pdjp70G
H0HeHKO1fXe6YvFgFhBpWEn7++dpIWZOCKiL00IWFAesS00fY/YAmtSqyT3F
ChNU0Bjac8XOT6+xorgll7tm4RFOIlC+ZfqQ9TFNhrWJBcIPciaro0qwzFzB
6tkUDJwQaMW21Qrq4kV1VLWt4iVhxGZe37AsOrMn1PuT6/JQ3FY7+pm1zdtz
STljTVHMvdKcZ65psW29ZfQewzPJTyI6kXyBYoc18Sg6aXWa3eWhYX4CdsMt
00NwNJc3FFc0quaIAoUlj29LmvBMmbH/aWJIuFrRiOiue1ayu60ZGEEm5HzS
7Fvm+iDXWx+X+wvy7D05A6sjFtcxn9DqkA8w8QQ0iMm9yCs3BXrEb5qClXS8
YpoMSl+r8nBGma1ZQcc5f6eZ2AS8G9X6MTnFKaWpE836zDRJ3eTnhyYPTLci
qj0lxl11zMjEkrG2k5J2y7p4xXXdFoZVkDc5uVnRkOe+YzAjJU+yC7vVlhab
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
NHzIobVy5LY0AfkudfZ/ARiiQZM1tgIA

-->

</rfc>
