<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-12" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.1 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-12"/>
    <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>JHS@zurich.ibm.com</email>
      </address>
    </author>
    <date year="2024" month="September" day="26"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 138?>

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

<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 mitigations with respect to adversaries that become 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 final section provides explicit reference implementations and test vectors of all of the
functions defined for CPace in the appendix.</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 papers <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. CPace requires a shared secret octet string, the password-related string (PRS), is available for both parties A and B. 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 password-based 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 augmented 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 only if both sides did initiate the protocol using the same protocol inputs, specifically the same PRS string and the same value for the optional input parameters CI, ADa, ADb and sid that will be specified in the upcoming sections.</t>
      <t>The naming of ISK key 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="optional-cpace-inputs">
        <name>Optional CPace inputs</name>
        <t>For accomodating 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 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 of 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 fullfilled 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.</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 string (respectively password) for this identity.
ADa and ADb could also include application protocol version information of an application protocol (e.g. to avoid downgrade attacks).</t>
          </li>
          <li>
            <t>Session identifier (sid).
If both parties have access to the same unique octet string sid being specific for a communication session before starting the protocol,
it is RECOMMENDED to forward 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 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.
In case that the hash function is specified for a fixed-size output, we define H.hash(m,l) such
that it returns the first l octets of the output.</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 a hashing result of l octets.</t>
          </li>
          <li>
            <t>H.b_in_bytes denotes the minimum 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 the 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 = g*y.</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 g*y. Additionally, scalar_mult_vfy specifies validity conditions for y,g and g*y 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 and 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>nil denotes an empty octet string, i.e., len(nil) = 0.</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 preceeding lower-case 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.</t>
          </li>
          <li>
            <t>LEB128 denotes an algorithm that converts an integer to a variable size 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 implementations for LEB128 encodings are given 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 shall be prepended by using an LEB128 encoding of the length.
Test vectors and reference implementations for prepend_len are given 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 a reference implementations are given 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 an 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 lexiographically larger octet
string first and prepends the two bytes from the octet string b"oc" to the result. (Explicit reference code for this function is given in the appendix.)</t>
          </li>
          <li>
            <t>transcript(Ya,ADa,Yb,ADb) denotes a function outputing 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., X*2  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,H and OPTIONAL CI,sid,ADa (for A) and CI,sid,ADb (for B).
A sends the public share Ya and OPTIONAL associated data ADa (i.e. an ADa field that MAY have a length of 0 bytes) to B.
Likewise, B sends the public share Yb and OPTIONAL associated data ADb (i.e. an ADb field that MAY have a length of 0 bytes).
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 transcript view 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 same method for deterministically combining the individual strings PRS, CI, sid and the domain-separation identifier DSI to a generator string that we describe here.</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). (A reference implementation 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>In the appendix we show sage code that can be used as reference implementation.</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((_g) * y), 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( decode(X) * y ).</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 substeps 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 identy 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 X*s or the point X*(-s) 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 X*s or X*(-s) as both points X*s and X*(-s) 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 X*s is the neutral element) or the secret shared value "z" (otherwise). "z" SHALL be encoded by using
the big-endian encoding of the x-coordinate of the result point X*s 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"/> and covers also the case that
no pre-agreed session identifier is available. <xref target="BGHJ24"/> also shows how a 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 a 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>Although already K is a shared value, it MUST NOT itself be used as an application key. Instead, ISK MUST BE used. Leakage of K to an adversary can lead to offline dictionary attacks.</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
use of a key confirmation on the level of the CPace sub-protocol.</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 Ta, Tb that is calculated over the protocol message that it has sent previously. I.e.
let party A calculate its transmitted authentication code Ta as Ta = MAC(mac_key, lv_cat(Ya,ADa)) and let party B calculate its transmitted
authentication code 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 preceed the two CPace messages
is done under the responsibiity 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 preceeding 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 preceeding 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 session identifier string
sid_output = H.hash(b"CPaceSidOut" || 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.
The effect of non-uniform sampling on security was demonstrated to be begnin in <xref target="AHH21"/> 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 allong 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">
      <name>Reference implementation</name>
      <t>The reference implementation that was used for deriving test vectors is available at <xref target="REFIMP"/>.</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="12" month="June" 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-16"/>
        </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 877?>

<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[
    ##eyJwcmVwZW5kX2xlbihiKSI6ICIwMCIsICJiXCIxMjM0XCIiOiAiMzEzMjMzMzQ
    ##iLCAicHJlcGVuZF9sZW4oYlwiMTIzNFwiKSI6ICIwNDMxMzIzMzM0IiwgInByZX
    ##BlbmRfbGVuKGJ5dGVzKHJhbmdlKDEyNykpKSI6ICI3RjAwMDEwMjAzMDQwNTA2M
    ##DcwODA5MEEwQjBDMEQwRTBGMTAxMTEyMTMxNDE1MTYxNzE4MTkxQTFCMUMxRDFF
    ##MUYyMDIxMjIyMzI0MjUyNjI3MjgyOTJBMkIyQzJEMkUyRjMwMzEzMjMzMzQzNTM
    ##2MzczODM5M0EzQjNDM0QzRTNGNDA0MTQyNDM0NDQ1NDY0NzQ4NDk0QTRCNEM0RD
    ##RFNEY1MDUxNTI1MzU0NTU1NjU3NTg1OTVBNUI1QzVENUU1RjYwNjE2MjYzNjQ2N
    ##TY2Njc2ODY5NkE2QjZDNkQ2RTZGNzA3MTcyNzM3NDc1NzY3Nzc4Nzk3QTdCN0M3
    ##RDdFIiwgInByZXBlbmRfbGVuKGJ5dGVzKHJhbmdlKDEyOCkpKSI6ICI4MDAxMDA
    ##wMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEYxMDExMTIxMzE0MTUxNjE3MT
    ##gxOTFBMUIxQzFEMUUxRjIwMjEyMjIzMjQyNTI2MjcyODI5MkEyQjJDMkQyRTJGM
    ##zAzMTMyMzMzNDM1MzYzNzM4MzkzQTNCM0MzRDNFM0Y0MDQxNDI0MzQ0NDU0NjQ3
    ##NDg0OTRBNEI0QzRENEU0RjUwNTE1MjUzNTQ1NTU2NTc1ODU5NUE1QjVDNUQ1RTV
    ##GNjA2MTYyNjM2NDY1NjY2NzY4Njk2QTZCNkM2RDZFNkY3MDcxNzI3Mzc0NzU3Nj
    ##c3Nzg3OTdBN0I3QzdEN0U3RiJ9
]]></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"6789"): (length: 13 bytes)
    04313233340135000436373839
]]></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[
    ##eyJiYTEiOiAiMzEzMjMzMzQiLCAiYmEyIjogIjM1IiwgImJhMyI6ICIzNjM3Mzg
    ##zOSIsICJsdl9jYXQoYmExLGJhMixiYTMpIjogIjA0MzEzMjMzMzQwMTM1MDAwND
    ##M2MzczODM5In0=
]]></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[
    ##eyJiXCJBQkNEXCIiOiAiNDE0MjQzNDQiLCAiYlwiQkNEXCIiOiAiNDI0MzQ0Iiw
    ##gImJcIkFCQ0RFXCIiOiAiNDE0MjQzNDQ0NSIsICJvX2NhdChiXCJBQkNEXCIsYl
    ##wiQkNEXCIpIjogIjZGNjM0MjQzNDQ0MTQyNDM0NCIsICJvX2NhdChiXCJCQ0RcI
    ##ixiXCJBQkNERVwiKSI6ICI2RjYzNDI0MzQ0NDE0MjQzNDQ0NSJ9
]]></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[
    ##eyJiXCIxMjNcIiI6ICIzMTMyMzMiLCAiYlwiMjM0XCIiOiAiMzIzMzM0IiwgImJ
    ##cIlBhcnR5QVwiIjogIjUwNjE3Mjc0Nzk0MSIsICJiXCJQYXJ0eUJcIiI6ICI1MD
    ##YxNzI3NDc5NDIiLCAiYlwiMzQ1NlwiIjogIjMzMzQzNTM2IiwgImJcIjIzNDVcI
    ##iI6ICIzMjMzMzQzNSIsICJ0cmFuc2NyaXB0X2lyKGJcIjEyM1wiLGJcIlBhcnR5
    ##QVwiLGJcIjIzNFwiLGJcIlBhcnR5QlwiKSI6ICIwMzMxMzIzMzA2NTA2MTcyNzQ
    ##3OTQxMDMzMjMzMzQwNjUwNjE3Mjc0Nzk0MiIsICJ0cmFuc2NyaXB0X2lyKGJcIj
    ##M0NTZcIixiXCJQYXJ0eUFcIixiXCIyMzQ1XCIsYlwiUGFydHlCXCIpIjogIjA0M
    ##zMzNDM1MzYwNjUwNjE3Mjc0Nzk0MTA0MzIzMzM0MzUwNjUwNjE3Mjc0Nzk0MiJ9
]]></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[
    ##eyJiXCIxMjNcIiI6ICIzMTMyMzMiLCAiYlwiMjM0XCIiOiAiMzIzMzM0IiwgImJ
    ##cIlBhcnR5QVwiIjogIjUwNjE3Mjc0Nzk0MSIsICJiXCJQYXJ0eUJcIiI6ICI1MD
    ##YxNzI3NDc5NDIiLCAiYlwiMzQ1NlwiIjogIjMzMzQzNTM2IiwgImJcIjIzNDVcI
    ##iI6ICIzMjMzMzQzNSIsICJ0cmFuc2NyaXB0X29jKGJcIjEyM1wiLGJcIlBhcnR5
    ##QVwiLGJcIjIzNFwiLGJcIlBhcnR5QlwiKSI6ICI2RjYzMDMzMjMzMzQwNjUwNjE
    ##3Mjc0Nzk0MjAzMzEzMjMzMDY1MDYxNzI3NDc5NDEiLCAidHJhbnNjcmlwdF9vYy
    ##hiXCIzNDU2XCIsYlwiUGFydHlBXCIsYlwiMjM0NVwiLGJcIlBhcnR5QlwiKSI6I
    ##CI2RjYzMDQzMzM0MzUzNjA2NTA2MTcyNzQ3OTQxMDQzMjMzMzQzNTA2NTA2MTcy
    ##NzQ3OTQyIn0=
]]></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[
    ##eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjU
    ##wNjE3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDksICJEU0kiOiAiND
    ##M1MDYxNjM2NTMyMzUzNSIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFN
    ##jQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3RTRCNDc5
    ##MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnZW5lcmF0b3Jfc3RyaW5nKEc
    ##uRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIwODQzNTA2MTYzNjUzMj
    ##M1MzUwODUwNjE3MzczNzc2RjcyNjQ2RDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
    ##MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
    ##AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMUE2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5
    ##NzQ2OTYxNzQ2RjcyMTA3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyI
    ##sICJoYXNoIGdlbmVyYXRvciBzdHJpbmciOiAiOTI4MDZEQzYwODk4NERCRjRFNE
    ##FBRTQ3OEM2RUM0NTNBRTk3OUNDMDFFQ0MxQTJBN0NGNDlGNUNFRTU2NTUxQiIsI
    ##CJkZWNvZGVkIGZpZWxkIGVsZW1lbnQgb2YgMjU1IGJpdHMiOiAiOTI4MDZEQzYw
    ##ODk4NERCRjRFNEFBRTQ3OEM2RUM0NTNBRTk3OUNDMDFFQ0MxQTJBN0NGNDlGNUN
    ##FRTU2NTUxQiIsICJnZW5lcmF0b3IgZyI6ICI2NEU4MDk5RTNFQTY4MkNGREM1Q0
    ##I2NjVDMDU3RUJCNTE0RDA2QkYyM0VCQzlGNzQzQjUxQjgyMjQyMzI3MDc0In0=
]]></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[
  ##eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI
  ##2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZC
  ##I6ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjY0R
  ##TgwOTlFM0VBNjgyQ0ZEQzVDQjY2NUMwNTdFQkI1MTREMDZCRjIzRUJDOUY3NDNC
  ##NTFCODIyNDIzMjcwNzQiLCAieWEiOiAiMjFCNEY0QkQ5RTY0RUQzNTVDM0VCNjc
  ##2QTI4RUJFREFGNkQ4RjE3QkRDMzY1OTk1QjMxOTA5NzE1MzA0NDA4MCIsICJBRG
  ##EiOiAiNDE0NDYxIiwgIllhIjogIjFCMDJEQUQ2REJEMjlBMDdCNkQyOEM5RTA0Q
  ##0IyRjE4NEYwNzM0MzUwRTMyQkI3RTYyRkY5REJDRkRCNjNEMTUiLCAieWIiOiAi
  ##ODQ4QjA3NzlGRjQxNUYwQUY0RUExNERGOUREMUQzQzI5QUM0MUQ4MzZDNzgwODg
  ##5NkM0RUJBMTlDNTFBQzQwQSIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjogIjIwQ0
  ##RBNTk1NUY4MkM0OTMxNTQ1QkNCRjQwNzU4Q0UxMDEwRDdEQjREQjJBOTA3MDEzR
  ##Dc5QzdBOEZDRjk1N0YiLCAiSyI6ICJGOTdGREZDRkZGMUM5ODNFRDYyODM4NTZB
  ##NDAxREUzMTkxQ0E5MTk5MDJCMzIzQzVGOTUwQzk3MDNERjcyOTdBIiwgIklTS19
  ##JUiI6ICJBMDUxRUU1RUUyNDk5RDE2REEzRjY5RjQzMDIxOEI4RUE5NEExOEE0NU
  ##I2N0Y5RTg2NDk1QjM4MkMzM0QxNEE1QzM4Q0VDQzBDQzgzNEY5NjBFMzlFMEQxQ
  ##kY3RDc2QjlFRjVENTRFRUNDNUUwRjM4NkM5N0FEMTJEQThDM0Q1RiIsICJJU0tf
  ##U1kiOiAiNUNDMjdFNDk2Nzk0MjNGODFBMzdENzUyMUQ5RkIxMzI3Qzg0MEQyRUE
  ##0QTE1NDM2NTJFN0RFNUNBQkI4OUVCQUQyN0QyNDc2MUIzMjg4QTNGRDU3NjRCND
  ##QxRUNCNzhEMzBBQkMyNjE2MUZGNDVFQTI5N0JCMzExRERFMDQ3MjciLCAic2lkX
  ##291dHB1dF9pciI6ICJGN0FFMTFBQzNFRTg1QzNDNDJEOEJENTFCQTgyM0ZCRTE3
  ##MTU4RjQzRDM0QTEyOTZGMUNCMjU2N0JDQzcxREM4QjIwMUExMzRCNTY2QjQ2OEF
  ##BRDhGRDA0RjAyRjk2RTNDQUY5RDU2MDFGN0VENzYwQTBBOTUxQTVBODYxQjVFNy
  ##IsICJzaWRfb3V0cHV0X29jIjogIkEzODM4OUUzNEZBNDkyNzg4QzFERjQzQjA2Q
  ##jQyNzcxMDQ5MTE3NEU1M0MzM0IwMTM2MkE0OTBEMTE2RkUxQjdFODcwQUE2RTJB
  ##N0ZDMDE4NzI1RTNCN0Y5NjlGNzUwODA0MkU0NENEMzg2M0YzOUFBNzUwMjZBMTk
  ##wRDE5MDJCIn0=
]]></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[
    ##eyJJbnZhbGlkIFkwIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMS
    ##I6ICIwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIkludmFsaWQgWTIiOiAiRUNGRkZGRkZG
    ##RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZ
    ##GRkZGRkY3RiIsICJJbnZhbGlkIFkzIjogIkUwRUI3QTdDM0I0MUI4QUUxNjU2RT
    ##NGQUYxOUZDNDZBREEwOThERUI5QzMyQjFGRDg2NjIwNTE2NUY0OUI4MDAiLCAiS
    ##W52YWxpZCBZNCI6ICI1RjlDOTVCQ0EzNTA4QzI0QjFEMEIxNTU5QzgzRUY1QjA0
    ##NDQ1Q0M0NTgxQzhFODZEODIyNEVEREQwOUYxMTU3IiwgIkludmFsaWQgWTUiOiA
    ##iRURGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
    ##ZGRkZGRkZGRkZGRkZGRkY3RiIsICJJbnZhbGlkIFk2IjogIkRBRkZGRkZGRkZGR
    ##kZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
    ##RkZGRkYiLCAiSW52YWxpZCBZNyI6ICJFRUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZ
    ##GRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGIiwgIkludm
    ##FsaWQgWTgiOiAiREJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGR
    ##kZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbnZhbGlkIFk5IjogIkQ5
    ##RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZ
    ##GRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZMTAiOiAiQ0RFQjdBN0MzQjQxQj
    ##hBRTE2NTZFM0ZBRjE5RkM0NkFEQTA5OERFQjlDMzJCMUZEODY2MjA1MTY1RjQ5Q
    ##jg4MCIsICJJbnZhbGlkIFkxMSI6ICI0QzlDOTVCQ0EzNTA4QzI0QjFEMEIxNTU5
    ##QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIyNEVEREQwOUYxMUQ3In0=
]]></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[
    ##eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiA
    ##iNTA2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExNywgIkRTSSI6IC
    ##I0MzUwNjE2MzY1MzQzNDM4IiwgIkNJIjogIjZGNjMwQjQyNUY3MjY1NzM3MDZGN
    ##kU2NDY1NzIwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIiLCAic2lkIjogIjUyMjNF
    ##MENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImdlbmVyYXRvcl9zdHJpbmc
    ##oRy5EU0ksUFJTLENJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjA4NDM1MDYxNjM2NT
    ##M0MzQzODA4NTA2MTczNzM3NzZGNzI2NDc1MDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
    ##MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
    ##AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUE2RjYzMEI0MjVGNzI2NTczNzA2RjZF
    ##NjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMTA1MjIzRTBDREM0NUQ2NTc
    ##1NjY4RDY0QzU1MjAwNDEyNCIsICJoYXNoIGdlbmVyYXRvciBzdHJpbmciOiAiOT
    ##hCNzEzRjg0NTI5MTk0RDcxOUE3RDg2Q0IwRjUwNEI4QUZFQjA1MzU0RDY4NzQ3R
    ##TE4QjJFN0NDOEI2REE1MjYwODVFNDI2M0JEOEJFQTdENjlFNDc5RUJBRDA5RTMw
    ##QUUwNjJFNUQwODlEQTdGMyIsICJkZWNvZGVkIGZpZWxkIGVsZW1lbnQgb2YgNDQ
    ##4IGJpdHMiOiAiOThCNzEzRjg0NTI5MTk0RDcxOUE3RDg2Q0IwRjUwNEI4QUZFQj
    ##A1MzU0RDY4NzQ3RTE4QjJFN0NDOEI2REE1MjYwODVFNDI2M0JEOEJFQTdENjlFN
    ##Dc5RUJBRDA5RTMwQUUwNjJFNUQwODlEQTdGMyIsICJnZW5lcmF0b3IgZyI6ICJF
    ##MjkzQjdDQ0Y2MUNBN0VCOTI4QTI2MzkxQ0YzOEI2NjBGODc0QTAwMUZERjBCRjN
    ##BOTFGRDE4MkYyQjZEODNFNjFBOTM3N0VERTEyN0VCQTdFMEQ0QzA4NTkyRUFGRj
    ##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[
  ##eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI
  ##2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZC
  ##I6ICI1MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIkUyO
  ##TNCN0NDRjYxQ0E3RUI5MjhBMjYzOTFDRjM4QjY2MEY4NzRBMDAxRkRGMEJGM0E5
  ##MUZEMTgyRjJCNkQ4M0U2MUE5Mzc3RURFMTI3RUJBN0UwRDRDMDg1OTJFQUZGMzN
  ##ENEFBNzA1RDZDRTU0QkIiLCAieWEiOiAiMjFCNEY0QkQ5RTY0RUQzNTVDM0VCNj
  ##c2QTI4RUJFREFGNkQ4RjE3QkRDMzY1OTk1QjMxOTA5NzE1MzA0NDA4MDUxNkJEM
  ##DgzQkZDQ0U2NjEyMUEzMDcyNjQ2OTk0Qzg0MzBDQzM4MkI4REM1NDNFOCIsICJB
  ##RGEiOiAiNDE0NDYxIiwgIllhIjogIjdGNjQ1NzcyQ0MyMDlCRjlGRDlENzZEQkI
  ##xMDI4M0JFQTcxQjEyMjM1RTNCQjIxODc4RDVFNTZBNzA1MDZFMTY1NzQzQTYzMk
  ##RFOThFQ0E5OTMyQzVEMkVGRTM2NTAwQTU5QjJGREFFRDBEOEExNDgiLCAieWIiO
  ##iAiODQ4QjA3NzlGRjQxNUYwQUY0RUExNERGOUREMUQzQzI5QUM0MUQ4MzZDNzgw
  ##ODg5NkM0RUJBMTlDNTFBQzQwQTQzOUNBRjVFNjFFQzg4QzMwN0M3RDYxOTE5NTI
  ##yOTQxMkVBQTczRkIyQTVFQTIwRCIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjogIk
  ##E0NjkwQTA3NTBDNDJCMjg4REREMEJBMDhFM0Y0OTAyREZFNzBCQUU1QzlFMkM2R
  ##UU5NTg0NERFRjI2OTJCRTc3NjQ2QjIwRDNCNDI5RjhEQTAwRDIxNDMzRUUwODkx
  ##QzY2NzY1OEQ4RDBDNDhFMzgiLCAiSyI6ICJEQjNGRkY5REE1OTU3NjcxNUIwNEQ
  ##0REY4REM4RDE4REIyNDMwRTU3QkJFRDMzN0RCRUVFNUJCMkQ2QUI2Q0VEREM5Qz
  ##c1QzVDMEIxN0ZBRDdFQjcyNERBQTEyRjhGMTkwM0RENkMyQ0VERTYxMzVBIiwgI
  ##klTS19JUiI6ICI1OTk4OTJBMjA3OEE4Qzk4ODE4MTYyNUUxRTVFNUY3QTYxNjNG
  ##N0Q3MkYyMUI5M0VCRUZCQTBGMTdGRjdFQTNBQTA1OTRCRDU2OUNGNzQyNjQxNTd
  ##CM0MwMDg3QkRDQ0YyRjU5Qzc3MTU2NjI4NDg3RjVDQTE2NDVCOEU5RDA1QiIsIC
  ##JJU0tfU1kiOiAiM0FDNzNGMDMwMzAyOTZBQTU5MUYwMTMyNkIxOEFGQTQ3RTExO
  ##DkxMjlDRDA2QUU4REZCMDVFNkVCMTMxMENERTk0OEI1OUVFRjA3NTUzNjVDMDZB
  ##MzM5MjY2QUZFNTk0OTQ4QzU2QTUzOEQ5OEE2NTc2NzExMzkzOEE5QTc4RDgiLCA
  ##ic2lkX291dHB1dF9pciI6ICIwMEEyMzMzQTc5NDgxQUJFNzFFRkQ2NTk0RDdCQk
  ##FBQzU1QzgwODQ4MkU4NjlDOUI2NUM0QjUzRDcxMDBEM0RBOEYzQ0FCRDU5RkEwQ
  ##zFGMjJENkQyRjlBQzBDMDkzOTYyMjkyNzk4RkNBMkMwQjkzMjY4OTc0Q0FENzVE
  ##NTc1QSIsICJzaWRfb3V0cHV0X29jIjogIkExQ0U5MDUzN0E4RDUzQjA2RDc3RTc
  ##5RkU3MTk0NjFDQzVFRDgzMDBEMjFEMTg2NkE1OUY5NjM4NjAxODMzRjU3QThCNU
  ##U4OERCOUE1MkFCRkExQjRFOEE2NTFBNDAwQkM5MjA1MDgyQUFEODFFQjMxMUM0N
  ##DM3M0I5QTE5RUZGIn0=
]]></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[
    ##eyJJbnZhbGlkIFkxIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
    ##AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZM
    ##iI6ICIwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
    ##MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIkludmFsaWQgWTMiOiAiRkVGRkZGRk
    ##ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGR
    ##kZGRUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
    ##RkZGRkZGRkZGRiIsICJJbnZhbGlkIFk0IjogIkZGRkZGRkZGRkZGRkZGRkZGRkZ
    ##GRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRk
    ##ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiL
    ##CAiSW52YWxpZCBZNSI6ICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
    ##MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZ
    ##GRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIiwgIlZhbGlkIChvbi
    ##BjdXJ2ZSkiOiB7InMiOiAiQUY4QTE0MjE4QkYyQTIwNjI5MjZEMkVBOUI4RkU0R
    ##ThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0YxNUZDRUVDNzBGQjExMUU4
    ##NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FERCIsICJ1X2N1cnZlIjo
    ##gIkFCMEM2OEQ3NzJFQzJFQjlERTI1QzQ5NzAwRTQ2RDYzMjVFNjZENkFBMzlEN0
    ##I2NUVCODRBNjhDNTU2OUQ0N0JENzFCNDFGM0UwRDIxMEY0NEUxNDZERUM4OTI2Q
    ##jE3NEFDQjNGOTQwQTBCODJDQUIiLCAicmVzX2N1cnZlIjogIjNCMEZBOUJDNDBB
    ##NkZEQzc4QzlFMDZGRjdBNTRDMTQzQzVENTJGMzY1NjA3MDUzQkYwNjU2RjUxNDI
    ##wNDk2Mjk1RjkxMEExMDFCMzhFREMxQUNEM0JEMjQwRkQ1NURDQjdBMzYwNTUzQj
    ##hBNzYyN0UifSwgIlZhbGlkIChvbiB0d2lzdCkiOiB7InMiOiAiQUY4QTE0MjE4Q
    ##kYyQTIwNjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdB
    ##NDUyM0YxNUZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA
    ##0NDMyQ0FERCIsICJ1X3R3aXN0IjogIkM5ODFDRDFFMUY3MkQ5QzM1QzdEN0NGNk
    ##JFNDI2NzU3QzBEQzgyMDZBMkZDRkE1NjRBOEU3NjE4QzAzQzBFNjFGOUEyRUIxQ
    ##zNFMEREOTdENkU5QjEwMTBGNUVERDAzMzk3QTgzRjVBOTE0Q0IzRkYiLCAicmVz
    ##X3R3aXN0IjogIkQwQTJCQjdFOUM1QzJDNjI3NzkzRDgzNDJGMjNCNzU5RkU3RDl
    ##FMzMyMEE4NUNBNEZENjEzNzYzMzE1MEZGRDlBOTE0OEE5Qjc1QzM0OUZBQzQzRD
    ##Y0QkVDNDlBNkUxMjZDQzkyQ0JGQkYzNTM5NjEifX0=
]]></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[
    ##eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjU
    ##wNjE3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDAsICJEU0kiOiAiND
    ##M1MDYxNjM2NTUyNjk3Mzc0NzI2NTc0NzQ2RjMyMzUzNSIsICJDSSI6ICI2RjYzM
    ##EI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2Rjcy
    ##IiwgInNpZCI6ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJ
    ##nZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKS
    ##I6ICIxMTQzNTA2MTYzNjU1MjY5NzM3NDcyNjU3NDc0NkYzMjM1MzUwODUwNjE3M
    ##zczNzc2RjcyNjQ2NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
    ##MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
    ##AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUE2RjYzMEI0MjVGNzI2NTczNzA2RjZF
    ##NjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMTA3RTRCNDc5MUQ2QThFRjA
    ##xOUI5MzZDNzlGQjdGMkM1NyIsICJoYXNoIHJlc3VsdCI6ICJDNjNBNTc1MEUyND
    ##M5QzE3Q0NEODIxM0JFMTRGREUyRjg3RTFCQzYzNzAwMUE5N0Y1OTI5Qzc3QjMwR
    ##UEwRTA4QUZCQzc1QUNFNUQzRDczQjI4NDJBNzlEMDE0ODhDNUZEN0VBMzBENDc1
    ##RUU2MDk1NDVBRjFCRkQxRkY3N0M4RSIsICJlbmNvZGVkIGdlbmVyYXRvciBnIjo
    ##gIkE2RkM4MkMzQjg5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQTUwRDI0OEYwQz
    ##dDQTZBMThCMDkwMkEzMEIzNkIifQ==
]]></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[
  ##eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI
  ##2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZC
  ##I6ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIkE2R
  ##kM4MkMzQjg5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQTUwRDI0OEYwQzdDQTZB
  ##MThCMDkwMkEzMEIzNkIiLCAieWEiOiAiREEzRDIzNzAwQTlFNTY5OTI1OEFFRjk
  ##0REMwNjBERkRBNUVCQjYxRjAyQTVFQTc3RkFENTNGNEZGMDk3NkQwOCIsICJBRG
  ##EiOiAiNDE0NDYxIiwgIllhIjogIkQ0MEZCMjY1QTdBQkVBRUU3OTM5RDkxQTU4N
  ##UZFNTlGNzA1M0Y5ODJDMjk2RUM0MTNDNjI0QzY2OTMwOEY4N0EiLCAieWIiOiAi
  ##RDIzMTZCNDU0NzE4QzM1MzYyRDgzRDY5REY2MzIwRjM4NTc4RUQ1OTg0NjUxNDM
  ##1RTI5NDk3NjJEOTAwQjgwRCIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjogIjA4Qk
  ##NGNkU5Nzc3QTlDMzEzQTNEQjZEQUE1MTBGMkQzOTg0MDMzMTlDMjM0MUJENTA2Q
  ##TkyRTY3MkVCN0UzMDciLCAiSyI6ICJFMjJCMUVGNzc4OEY2NjE0NzhGM0NEREQ0
  ##QzYwMDc3NEZDMEY0MUU2QjcxMTU2OTE5MEZGODhGQTBFNjA3RTA5IiwgIklTS19
  ##JUiI6ICI0QzU0NjlBMTZCMjM2NEM0Qjk0NEVCQzFBNzlFNTFEMTY3NEFENDdEQj
  ##I2RTg3MTgxNTRGNTlGQUVCRkFBNTJEODM0NkYzMEFBNTgzNzcxMTdFQjIwRDUyN
  ##0YyQ0JDNUM3NjM4MUY3RkQzNzJFODlERjgyMzlGODdGMkUwMkVEMSIsICJJU0tf
  ##U1kiOiAiOTgwRENDNUExQzUyQ0VFQTAzMUU3NUYzOEVEMjY2NTg2NjE2NDg4QzV
  ##DNTc4MDI4NUZDQkNGNzkwODdDN0JDREJEOTkzNTAyRUVFNjA2QjcxOEJBMzFFOD
  ##QwQTAwMEE3QjdCRUZFMTVFQTQyN0M1Q0ZFODgzNDRGQTEyMzdGMzUiLCAic2lkX
  ##291dHB1dF9pciI6ICIyQTc2RDNCQkM0OTlERkRDNERDQUNDOUZGMDQyRjRFMUE1
  ##NEUzODQzMjU4RTEwMENDRDdDNjBGMEE1NDFGOUQzRUJGMDI1RTY4QTQ2MERERTI
  ##xOEJEMzlGMDcxMUJDNkZBMTE0MDlDOUQ3QjY5RDhDQ0Y2QjMyRkM1MUREQjY5OS
  ##IsICJzaWRfb3V0cHV0X29jIjogIkNBNEI1MDcwMEM0NjIwM0NDRDEwQkMwRTlGM
  ##zEwOTVFNTA4MTg5Q0I1OTg1NzUzN0JFNTYxMDQ4RDM0QjlFRDlBOTY5N0FGMTFD
  ##OTk4RjQ4NEMzRDc4M0IwQjUzMTQzNENBQTY4MzVENEMzMjM0NEZDRDE3MTYwQzl
  ##DMzQ4RkM3In0=
]]></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[
    ##eyJWYWxpZCI6IHsicyI6ICI3Q0QwRTA3NUZBNzk1NUJBNTJDMDI3NTlBNkM5MER
    ##CQkZDMTBFNkQ0MEFFQThEMjgzRTQwN0Q4OENGNTM4QTA1IiwgIlgiOiAiMkMzQz
    ##ZCOEM0RjM4MDBFN0FFRjY4NjQwMjVCNEVENzlCRDU5OTExN0U0MjdDNDFCRDQ3R
    ##DkzRDY1NEI0QTUxQyIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICI3
    ##QzEzNjQ1RkU3OTBBNDY4RjYyQzM5QkVCNzM4OEU1NDFEODQwNUQxQURFNjlEMTc
    ##3OEM1RkUzRTdGNkI2MDBFIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiN0
    ##MxMzY0NUZFNzkwQTQ2OEY2MkMzOUJFQjczODhFNTQxRDg0MDVEMUFERTY5RDE3N
    ##zhDNUZFM0U3RjZCNjAwRSJ9LCAiSW52YWxpZCBZMSI6ICIyQjNDNkI4QzRGMzgw
    ##MEU3QUVGNjg2NDAyNUI0RUQ3OUJENTk5MTE3RTQyN0M0MUJENDdEOTNENjU0QjR
    ##BNTFDIiwgIkludmFsaWQgWTIiOiAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
    ##AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJ9
]]></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[
    ##eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiA
    ##iNTA2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExMiwgIkRTSSI6IC
    ##I0MzUwNjE2MzY1NDQ2NTYzNjE2NjM0MzQzOCIsICJDSSI6ICI2RjYzMEI0MjVGN
    ##zI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNp
    ##ZCI6ICI1MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnZW5lcmF
    ##0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIwRD
    ##QzNTA2MTYzNjU0NDY1NjM2MTY2MzQzNDM4MDg1MDYxNzM3Mzc3NkY3MjY0NzAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
    ##MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
    ##AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1Rjcy
    ##NjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwNTIyM0U
    ##wQ0RDNDVENjU3NTY2OEQ2NEM1NTIwMDQxMjQiLCAiaGFzaCByZXN1bHQiOiAiNz
    ##E0OEY0RDYwNTg3QUFBRkE2NEQyRkQ2QkNGRTQ1RUU3MUU4Qjk3MUQxRDVGRjNCQ
    ##kY4QzE0NTE3OTdDNjJBMUFGMjJBQjI1NjM4NzQ5Rjk3RjlCMTVGRURDRjRBRUVF
    ##ODcyODJDRjY2NzU5NEFCMDkyQjYwMjNDOEY4RDNBNjFDMzhCMEFGNzkxQzkyNzE
    ##xMzdERjAxQjU3RDYzQjc5NzM0QkJDRTY5OTFFM0UyRTEwRkRDODA1QUJDOUU2RT
    ##ZGM0RBRUZGNkZEMzQwOTNEMjZERTI0MEIzMjY3NjQyNTIiLCAiZW5jb2RlZCBnZ
    ##W5lcmF0b3IgZyI6ICI5QTcwMEVDQzM3OEVCOThFNTczODdERjQ1NkQ1QjRCNEYx
    ##RENFRUJCQjEzNzE1MjdFRUI3RTFCRkJBQjY0RUNDOUM5MzAzMzk2MTQ1QkEwNEY
    ##1QjVBRUE1QkFFREZBNjFGMzFGMDBGQkM1RkQ1NjA2In0=
]]></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[
  ##eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI
  ##2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZC
  ##I6ICI1MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIjlBN
  ##zAwRUNDMzc4RUI5OEU1NzM4N0RGNDU2RDVCNEI0RjFEQ0VFQkJCMTM3MTUyN0VF
  ##QjdFMUJGQkFCNjRFQ0M5QzkzMDMzOTYxNDVCQTA0RjVCNUFFQTVCQUVERkE2MUY
  ##zMUYwMEZCQzVGRDU2MDYiLCAieWEiOiAiMzNENTYxRjEzQ0ZDMERDQTI3OUMzME
  ##U4Q0RFODk1MTc1REMyNTQ4Mzg5MjgxOUVCQTEzMkQ1OEMxM0MwNDYyQThFQjBEN
  ##zNGREE5NDE5NTA1OTRCRUY1MTkxRDgzOTQ2OTFGODZFREZGQ0FENkMxRSIsICJB
  ##RGEiOiAiNDE0NDYxIiwgIllhIjogIjYyN0Y4QkIyQUU5NDVFMkE1MTg5NjdERjl
  ##CMDBBRkYxOTI1M0QzMDg2Mzk4RjJFQzE4QkU4NDZDQzBEMUYyODZDMkNFM0NBRj
  ##FEQTYzOTg1OUNDRDJBNkEwMUE5MzcyQTE3RTY2QkI3MDA2RTU3MUIiLCAieWIiO
  ##iAiMjUyM0M5NjlGNjhGQTJCMkFFQTI5NEMyNTM5RUYzNkVCMUUwNTU4QUJEMTQ3
  ##MTJBNzgyOEYxNkE4NUVEMkM3RTc3RTJCREQ0MTg5OTQ0MDVGQjFCNTdCNkJCQUF
  ##ERDY2ODQ5ODkyQUFDOUQ4MTQwMiIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjogIj
  ##hFOTgxMUU0NDAyRkFDMDk4NzQzQ0E3QjJCNTA5QjkxQjM4QzhDRjEzNjBDQzZDQ
  ##UIzMDExODcxNzAxOTc4MkI3RjU4QTU5MUM2M0Q5QzkyNDdCNzc0RTZCMEUwQjgy
  ##NkZGNEY4Mzk5Rjk0NzcyREIiLCAiSyI6ICI5NEY0QUU0OTRGNEU4QjA3QURFMzM
  ##1NDcyNkVFRTQ5QzU1MThCMzYzQ0RBNTQ0RjVCNDU0MUI5NzMyODMwQkUzN0VBME
  ##U2M0ZDODNGNTRCRTI4MERFQTA3NDdBMDQzQzc2RDQ3M0UwMTY4OUFGNzdGIiwgI
  ##klTS19JUiI6ICI5QzI3MjZBNkNEQTExNzkzNDlDQkMzOEYzMTc2NUVBQjY0NkEy
  ##QTVGMTc2RjMwMTlGQUI0QTBBQUJEOUQxN0MyQkE4OTU5OThDRkY2OThEODAxNzY
  ##xQTAwMzUxMkMxQ0Y2N0QxNDRCMjFFMUNCNkQ2QjgyREE3MUQwREE3NkNBRCIsIC
  ##JJU0tfU1kiOiAiNkQyMTc4RUQzMDQ4NzAzMDI1QjkwMDdFQzg0QzREOTY5RThEO
  ##DEzNURGNDU1RTYwOEMxNkFBMTUyRTEyMTlDODZDRUE1NjMyNTQ0MjhBOUQ5Njk5
  ##MDNBRTM2NDlEMTA1MERBMUU2RTBDMUMwNjBFMUVCRjczMTZBN0U5OTMzODkiLCA
  ##ic2lkX291dHB1dF9pciI6ICI2NUJGRkRFMTdCN0FDRjA3Q0ZENDM3QkRCOTczQT
  ##hGNzM0MEJGOTExRDM5M0E2MTQ5OEMwQTUwRUYwRDY4QkNBMTAzRkJEQjBGNUI3O
  ##Tk1MDU1NjJFNTk4MTFERjFCQzVEOUI0RjVGMEY3QzU3QzIyQ0Q3RUQ2REI0RDE1
  ##M0UzQSIsICJzaWRfb3V0cHV0X29jIjogIjdDRTI3MDQzRDFCMUQwRDBFMDJFMTY
  ##5Nzk2MzdFMkEwMDU0N0VENkUxNUVBOTg4RjdEM0M5QjNDMjE1OUIyNkFCMzgzNE
  ##JGRjdGRjg2MjQwMzIzRTI1MjE2QkEyRUU2RUE2RTE1ODI1MDIwMTdGOEU2RDY1R
  ##jhDNEE1RTY1NTQzIn0=
]]></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[
    ##eyJWYWxpZCI6IHsicyI6ICJERDFCQzcwMTVEQUFCQjc2NzIxMjlDQzM1QTNCQTg
    ##xNTQ4NkIxMzlERUZGOUJERUNBN0E0RkM2MTM0MzIzRDM0NjU4NzYxRTkwRkYwNz
    ##k5NzJBN0NBOEFBNTYwNjQ5OEY0RjRGMEVCQzA5MzNBODE5IiwgIlgiOiAiNjAxN
    ##DMxRDVFNTFGNDNENDIyQTkyRDNGQjIzNzNCREUyODIxN0FBQjQyNTI0QzM0MUFB
    ##NDA0RUFCQTVBQTU1NDFGNzA0MkRCQjMyNTNDRTRDOTBGNzcyQjAzOEE0MTNEQ0I
    ##zQTBGNkJGM0FFOUUyMSIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6IC
    ##IzODhCMzVDNjBFQjQxQjY2MDg1QTIxMTgzMTYyMTg2ODFENzg5NzlENjY3NzAyR
    ##EUxMDVGREMxRjIxRkZFODg0QTU3N0Q3OTVGNDU2OTE3ODEzOTBBMjI5QTNCRDdC
    ##NTI3RTgzMTM4MEYyRjU4NUE0IiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiA
    ##iMzg4QjM1QzYwRUI0MUI2NjA4NUEyMTE4MzE2MjE4NjgxRDc4OTc5RDY2NzcwMk
    ##RFMTA1RkRDMUYyMUZGRTg4NEE1NzdENzk1RjQ1NjkxNzgxMzkwQTIyOUEzQkQ3Q
    ##jUyN0U4MzEzODBGMkY1ODVBNCJ9LCAiSW52YWxpZCBZMSI6ICI1RjE0MzFENUU1
    ##MUY0M0Q0MjJBOTJEM0ZCMjM3M0JERTI4MjE3QUFCNDI1MjRDMzQxQUE0MDRFQUJ
    ##BNUFBNTU0MUY3MDQyREJCMzI1M0NFNEM5MEY3NzJCMDM4QTQxM0RDQjNBMEY2Qk
    ##YzQUU5RTIxIiwgIkludmFsaWQgWTIiOiAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
    ##MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJ9
]]></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[
    ##eyJIIjogIlNIQS0yNTYiLCAiSC5zX2luX2J5dGVzIjogNjQsICJQUlMiOiAiNTA
    ##2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDIzLCAiRFNJIjogIjQzNT
    ##A2MTYzNjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4NDEyRDMyMzUzNjVGNTM1MzU3N
    ##TU1RjRFNTU1RiIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcy
    ##MEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIzNEIzNjQ1NENBQjJ
    ##FNzg0MkMzODlGN0Q4OEVDQjdERiIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLF
    ##BSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDMyMzUzN
    ##jVGNTg0RDQ0M0E1MzQ4NDEyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2
    ##MTczNzM3NzZGNzI2NDE3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCND
    ##E1RjY5NkU2OTc0Njk2MTc0NkY3MjEwMzRCMzY0NTRDQUIyRTc4NDJDMzg5RjdEO
    ##DhFQ0I3REYiLCAiZ2VuZXJhdG9yIGciOiAiMDRFRUU1NzczMjBCMUMyNDFBNzk0
    ##MTlGQ0RFNTcxOEMyQjYzRjgxRUY4NzE3RDU2QTU3RDJGQjI2QjY1QThCRUI2MzU
    ##3M0I1MjYwNUVGQjMyRkY0Q0YzMUFBRUY5QTkyREY4NEU0RTg0MDhDQzZDN0NGMj
    ##dBNTM1QUFEMkIzOEE1NiJ9
]]></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: g*(-ya):
    (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: g*(-yb):
    (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[
  ##eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI
  ##2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZC
  ##I6ICIzNEIzNjQ1NENBQjJFNzg0MkMzODlGN0Q4OEVDQjdERiIsICJnIjogIjA0R
  ##UVFNTc3MzIwQjFDMjQxQTc5NDE5RkNERTU3MThDMkI2M0Y4MUVGODcxN0Q1NkE1
  ##N0QyRkIyNkI2NUE4QkVCNjM1NzNCNTI2MDVFRkIzMkZGNENGMzFBQUVGOUE5MkR
  ##GODRFNEU4NDA4Q0M2QzdDRjI3QTUzNUFBRDJCMzhBNTYiLCAieWEiOiAiMzc1Nz
  ##RDRkJGMUI5NUZGNkE4RTJEN0JFNDYyRDREMDFFNkRERTI2MThGMzRGNERFOURGO
  ##DY5QjI0RjUzMkM1RCIsICJBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MUYxMkFE
  ##NUZDNjUwMTBBMjRGQzA0Qzg2MTk3MTA5QTM2REYwRTlDRTg1QTc0NzlFMUUxMzY
  ##0NjkyRkRBQ0UxN0VBNUE2MzRFMTlDMjA3QTVENTJFQUQ2QzY4MTdBMTYzQ0YyRj
  ##JGRTM0MDZDNURGREZDMkVDREY4RTQyQzVFMTYiLCAieWIiOiAiRTU2NzJGQzlFQ
  ##jRFNzIxRjQxRDgwMTgxRUM0QzlGRDk4ODY2NjhBQ0M0ODAyNEQzM0M4MkJCMTAy
  ##QUVDQkE1MiIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjogIjA0NkE1MTE4MEI2RUJ
  ##BQkFGNUVEMEFGOENENzg2ODg2RDkzMzQyQkNBRTRDMTU4Q0UxNjE3QTBBQ0M4RU
  ##MzNTQ0ODZGOUVEMkU5MjEwOTEzMjA2RDFFM0Y1RTQ2M0QyRDMyMEM0RjFGNUNFO
  ##EI2NzdBN0UzOEEyNkY3NTJCRjhGODQiLCAiSyI6ICIzRTBFMkY4OTc2RkI4RDBE
  ##RUVFMzBBRUY0QjVDRDM2MzFFRUQyNDlBRjMyRjUzRDBERDAwOUI1RDdCOEY2QjZ
  ##DIiwgIklTS19JUiI6ICI5NTY1RUQyODZCNkUzQ0YxRjk0M0ZEMzE3NDZGOUEyMj
  ##kzNTUzNzAyNUExMzI4RDQ5ODAwMDVCQTk4NEYwQzM5IiwgIklTS19TWSI6ICI2M
  ##kE0NDVBNERBQTM1NDZERDAzMUM2NkVBRDJFNEUwMTVBQkJDQzgzQkRFMzFDOTBG
  ##ODQxMTQ5RkQ0NDFDNThBIiwgInNpZF9vdXRwdXRfaXIiOiAiQTczODZEMUMyRUI
  ##wNkU4MDU2RDdGRUNCQ0Y2OTFFMDhEMTg5RDk2MjM2MDIwRUYzMUI0MTQwNjk4QT
  ##RCOTlGOSIsICJzaWRfb3V0cHV0X29jIjogIkQzMzdEQkMwREQ3OTdCNEU2RjJGM
  ##TRFQTQ5MjVDNThFNUQ1NTIzODcxRThDQjQzQTNDMUIwRjJCMUExRkZERTMifQ==
]]></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[
    ##eyJWYWxpZCI6IHsicyI6ICJGMDEyNTAxQzA5MUZGOUI5OUExMjNGRkZFNTcxRDh
    ##CQzAxRTgwNzdFRTU4MTM2MkUxQkQyMTM5OTA4MzU2NDNCIiwgIlgiOiAiMDQyND
    ##Y0OEVCOTg2QzJCRTBBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGR
    ##kExQjFGRDEyQkE0RTBGNzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRC
    ##NjkzNkM5QTM3MzQ2RDEwQTRBQjI1MTRGQUVGNTgzMSIsICJHLnNjYWxhcl9tdWx
    ##0KHMsWCkgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0RjVBMTkxRjA3OEM4N0MzNj
    ##YzM0I3OEM3MDE3NTExNTlENTZDNTlGM0ZFOTEwNUI1NzIwNjczNDcwRjMwM0FCO
    ##TI1QjZBN0ZEMUNERDhGNjQ5QTIxQ0YzNkI2OEQ5RTlDNEExMTkxOUE5NTE4OTI1
    ##MTk3ODYxMDRCMjcwMzM3NTciLCAiRy5zY2FsYXJfbXVsdF92ZnkocyxYKSAob25
    ##seSBYLWNvb3JkaW5hdGUpIjogIkY1QTE5MUYwNzhDODdDMzY2MzNCNzhDNzAxNz
    ##UxMTU5RDU2QzU5RjNGRTkxMDVCNTcyMDY3MzQ3MEYzMDNBQjkifSwgIkludmFsa
    ##WQgWTEiOiAiMDQyNDY0OEVCOTg2QzJCRTBBRjYzNjQ1NUNFRjA1NTA2NzFENkJD
    ##RDhBQTI2RTBENzJGRkExQjFGRDEyQkE0RTBGNzhEQTJCNkQyMTg0RjMxQUYzOUU
    ##1NjZBRUYxMjcwMTRCNjkzNkM5QTM3MzQ2RDEwQTRBQjI1MTRGQUVGNTg1NyIsIC
    ##JJbnZhbGlkIFkyIjogIjAwIn0=
]]></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[
    ##eyJIIjogIlNIQS0zODQiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjU
    ##wNjE3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0Mz
    ##UwNjE2MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0ODQxMkQzMzM4MzQ1RjUzNTM1N
    ##zU1NUY0RTU1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3
    ##MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiNUIzNzczQUE5MEU
    ##4RjIzQzYxNTYzQTRCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSS
    ##xQUlMsQ0ksc2lkLEguc19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzMzM4M
    ##zQ1RjU4NEQ0NDNBNTM0ODQxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RTU1NUYwODUw
    ##NjE3MzczNzc2RjcyNjQ1NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
    ##AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
    ##MDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2OTc0Njk
    ##2MTc0NkY3MjEwNUIzNzczQUE5MEU4RjIzQzYxNTYzQTRCNjQ1QjI3NkMiLCAiZ2
    ##VuZXJhdG9yIGciOiAiMDRGRkUxQkRDMzI5M0ZEQkUzMUIyOTU5OTE2RTUyQzAxO
    ##EU5MjNFQUM5OTgzNkJEOUExQ0JFRUM3OTRBOEQ0RDc4QkFBMzJDREFGQzk2ODVC
    ##QzEwNjdBNzgwRjRBRDlDOEE2QzZFMTY0QUE0MjkwNkQxRTI3Rjc4MjU4MUFEQzh
    ##FMDEwOTIxOTYyNkEyQjhGQkRDMzQ2MDJFNDA4NDU1NEJERDZDMEM2OThERDY1N0
    ##FDOEUzMUIyQkNDRTFDN0IwRDgifQ==
]]></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: g*(-ya):
    (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: g*(-yb):
    (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[
  ##eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI
  ##2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZC
  ##I6ICI1QjM3NzNBQTkwRThGMjNDNjE1NjNBNEI2NDVCMjc2QyIsICJnIjogIjA0R
  ##kZFMUJEQzMyOTNGREJFMzFCMjk1OTkxNkU1MkMwMThFOTIzRUFDOTk4MzZCRDlB
  ##MUNCRUVDNzk0QThENEQ3OEJBQTMyQ0RBRkM5Njg1QkMxMDY3QTc4MEY0QUQ5Qzh
  ##BNkM2RTE2NEFBNDI5MDZEMUUyN0Y3ODI1ODFBREM4RTAxMDkyMTk2MjZBMkI4Rk
  ##JEQzM0NjAyRTQwODQ1NTRCREQ2QzBDNjk4REQ2NTdBQzhFMzFCMkJDQ0UxQzdCM
  ##EQ4IiwgInlhIjogIkVGNDMzREQ1QUQxNDJDODYwRTdDQjY0MDBERDMxNUQzODhE
  ##NUVDNTQyMEM1NTBFOUQ2RjA5MDdGMzc1RDk4OEJDNEQ3MDQ4MzdFNDM1NjFDNDk
  ##3RTdERDkzRURDREI5RCIsICJBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MzRBMD
  ##REQTEyMTk5NUQ4MUQ3QzVERUQwMkNGMkU3MDk1NERDQTQ5MDU5NDg1RUEzODMxM
  ##EI3M0I5NkZBMUVDNzg2MTlDNUExRTUyNDQ3Mjc3ODMzMUZCRTAwOUZBMTU2NEEz
  ##MjAzRTQyOTkzQTM2Mjg1RkE1NEU2QzI0MTg0RkQyMjc0NThDODc3ODFCRTE2RkZ
  ##GNDZEQkM5NzBDQzFCMTc3MDA1MEE5NEQ2ODI2RDUyRjIxMUIyMzQ3OTJFNjZEIi
  ##wgInliIjogIjUwQjBFMzZCOTVBMkVERkFBODM0MkI4NDNERERDOTBCMTc1MzMwR
  ##jIzOTlDMUIzNjU4NkRFRERBM0MyNTU5NzVGMzBCRTZBNzUwRjk0MDRGQ0NDNjJB
  ##NjMyM0I1RTQ3MSIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjogIjA0MEE2NTU5MTQ
  ##3RkQ0OTJBRDc0QUIxRjRERUY2MTk2RkQ2Mzk5NTQwRTg0NzA2MjI3QTFGOTBEMT
  ##A0Q0RBRUI2MzBCN0M1QzE4NzQ4REVCMjU2NTNBRDJBNENCNUU2Mjc0ODQxQ0FEM
  ##zI4QkIwMzEyNjI4QjlCMUY1MUJFQTcyQjhDNjEwOTk5QTY3MzBGNzUyNjQ5MjA1
  ##QUU4NUM0NTJFRjgzRjk4QkU3MTVDRDAxMDMxODY4NzRCMDdDRjAyMDc0IiwgIks
  ##iOiAiQTlBQ0FFQTk1NjkyQTY0NDYyMDY3RkU4RTQzMjFGMkZDQTk3OTNBOEEwND
  ##IwRjBFMjUzRUQwRDZEQjg1OEZFMTYxREU3NTc2MjA2QThBMzVCRDRBNjBFMDA3M
  ##jRGRDNFIiwgIklTS19JUiI6ICJEMUI3NDM3NUM3RDYzRDdERTI0NkNCRjNGQzJC
  ##MzA5MjY0NUM3M0EwQUE4MTY5ODlDMERFNjA0OEVENEVDRTZBNTRERjgyRDA1RDJ
  ##CRTM0OThDQjkyODhCRTdCREJEQjkiLCAiSVNLX1NZIjogIkEwNTFENDUzMkNBOU
  ##ZCNjc3NEUwOTdFQkFDNjlDMUQ2QTE4MTQ0QTE1NDIxREMxNTVEMEIxRThBRUY5R
  ##jlEOEMwRkU4NkU4NUQzQ0JFRTc3OTZGRjUwMTcxRjQyODAxQiIsICJzaWRfb3V0
  ##cHV0X2lyIjogIjhENUEwMzk0NkE2OUZGQTEyQ0Q2RUZENDY5RkU4NjcxQkJDMjV
  ##GQUQ2REIyNjU2RjM5NjNDOTRFOUM5NDBCREVDQzJCRDU1NTQ3NEMyMTE4MTc3OD
  ##dENUNGNzg3MEVEMSIsICJzaWRfb3V0cHV0X29jIjogIkMwNzI5REIyNURCNDBDN
  ##DhBMzVGNzg3RDU0MTBCMkNCOUEyRDlGNUU5Q0YxQ0YxNTlFRDJGNjNDNkIyMTg1
  ##RTU5N0UxNzZDQzIyMTQyMkU5NDk2RUVEQTJCRjEyM0M4QiJ9
]]></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[
    ##eyJWYWxpZCI6IHsicyI6ICI2RThBOTlBNUNERDQwOEVBRTk4RTFCOEFFRDI4NkU
    ##3QjEyQURCQkRBQzdGMkM2MjhEOTA2MENFOTJBRTBEOTBCRDU3QTU2NEZEMzUwME
    ##ZCQ0NFMzQyNURDOTRCQTBBREUiLCAiWCI6ICIwNDVCNENENTNDNDUwNkNDMDRCQ
    ##TRDNDRGMjc2MkQ1RDMyQzNFNTVERjI1QjhCQUE1NTcxQjE2NTdBRDk1NzZFRkVB
    ##ODI1OUYwNjg0REUwNjVBNDcwNTg1QjRCRTg3Njc0OEM3Nzk3MDU0RjNERUZFRjI
    ##xQjc3RjgzRDUzQkFDNTdDODlENTJBQTRENkRENTg3MkJEMjgxOTg5QjEzODM1OT
    ##Y5ODAwOUY4QUMxRjMwMTUzOEJBRENDRTlEOUY0MDM2RSIsICJHLnNjYWxhcl9td
    ##Wx0KHMsWCkgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0NjVDMjhEQjA1RkQ5RjlB
    ##OTM2NTFDNUNDMzFFQUU0OUM0RTUyNDZCNDY0ODlCOEY2MTA1ODczMzE3M0EwMzN
    ##DREE3NkMzRTNFQTUzNTJCODA0RTY3RkRCRTJFMzM0QkU4MjQ1REFENUM4Qzk5M0
    ##U2M0JBQ0YwNDU2NDc4RjI5QjcxQjZDODU5RjEzNjc2Rjg0RkYxNTBEMjc0MUYwM
    ##jhGNTYwNTg0QTBCREJBMTlBNjNERjYyQzA4OTQ5QzJGRDZEIiwgIkcuc2NhbGFy
    ##X211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29yZGluYXRlKSI6ICI2NUMyOERCMDV
    ##GRDlGOUE5MzY1MUM1Q0MzMUVBRTQ5QzRFNTI0NkI0NjQ4OUI4RjYxMDU4NzMzMT
    ##czQTAzM0NEQTc2QzNFM0VBNTM1MkI4MDRFNjdGREJFMkUzMzRCRTgifSwgIklud
    ##mFsaWQgWTEiOiAiMDQ1QjRDRDUzQzQ1MDZDQzA0QkE0QzQ0RjI3NjJENUQzMkMz
    ##RTU1REYyNUI4QkFBNTU3MUIxNjU3QUQ5NTc2RUZFQTgyNTlGMDY4NERFMDY1QTQ
    ##3MDU4NUI0QkU4NzY3NDhDNzc5NzA1NEYzREVGRUYyMUI3N0Y4M0Q1M0JBQzU3Qz
    ##g5RDUyQUE0RDZERDU4NzJCRDI4MTk4OUIxMzgzNTk2OTgwMDlGOEFDMUYzMDE1M
    ##zhCQURDQ0U5RDlGNDAzMDIiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></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[
    ##eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjU
    ##wNjE3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0Mz
    ##UwNjE2MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0ODQxMkQzNTMxMzI1RjUzNTM1N
    ##zU1NUY0RTU1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3
    ##MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiN0U0QjQ3OTFENkE
    ##4RUYwMTlCOTM2Qzc5RkI3RjJDNTciLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSS
    ##xQUlMsQ0ksc2lkLEguc19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzNTMyM
    ##zE1RjU4NEQ0NDNBNTM0ODQxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RTU1NUYwODUw
    ##NjE3MzczNzc2RjcyNjQ1NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA
    ##wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
    ##AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
    ##DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
    ##MDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2OTc0Njk
    ##2MTc0NkY3MjEwN0U0QjQ3OTFENkE4RUYwMTlCOTM2Qzc5RkI3RjJDNTciLCAiZ2
    ##VuZXJhdG9yIGciOiAiMDQwMEU1OEE4RkJGMDhCMzhFMzRBMzY3NkY2RDY5MEJFR
    ##DU4QUE0MTE1RkYzMkE1N0VDODcxNzJGQzJBMUZCODlEMDMyNThDNjQyOUM0NjQ5
    ##ODFCMzI4NEI1RkVEQkQxMjQ0QkYyNzQzMjAwODg2ODcwNjVCOTA3NURENTU4RTE
    ##0RUQ2OTkwMUQyMTYyREIxQkEzQTQ5Qzk3RENBN0M5MDJDQjFCOTZCQUJFMjFBMz
    ##E5NDIxMTRDODYwNjY1QjM1QzQ2QjgyMTNGNkRFMTcxOTRERTU0QzQ0MTA4M0REM
    ##TE2M0Q1OTA3QURBRDg4MjRCQjEzMDdEQ0Y2QTU1QzExQThGMDFEOTc4OUIifQ==
]]></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: g*(-ya):
    (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: g*(-yb):
    (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[
  ##eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI
  ##2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZC
  ##I6ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjA0M
  ##DBFNThBOEZCRjA4QjM4RTM0QTM2NzZGNkQ2OTBCRUQ1OEFBNDExNUZGMzJBNTdF
  ##Qzg3MTcyRkMyQTFGQjg5RDAzMjU4QzY0MjlDNDY0OTgxQjMyODRCNUZFREJEMTI
  ##0NEJGMjc0MzIwMDg4Njg3MDY1QjkwNzVERDU1OEUxNEVENjk5MDFEMjE2MkRCMU
  ##JBM0E0OUM5N0RDQTdDOTAyQ0IxQjk2QkFCRTIxQTMxOTQyMTE0Qzg2MDY2NUIzN
  ##UM0NkI4MjEzRjZERTE3MTk0REU1NEM0NDEwODNERDExNjNENTkwN0FEQUQ4ODI0
  ##QkIxMzA3RENGNkE1NUMxMUE4RjAxRDk3ODlCIiwgInlhIjogIjAwNjM2N0U5QzJ
  ##BRUZGOUYxREIxOUFGNjAwQ0NBNzMzNDNENDdDQkU0NDZDRUJCRDFDQ0Q3ODNGOD
  ##I3NTVBODcyREE4NkZEMDcwN0VCMzc2N0M2MTE0RjE4MDNERUI2MkQ2M0JERDFFN
  ##jEzRjY3RTYzRThDMTQxRUU1MzEwRTNFRTgxOSIsICJBRGEiOiAiNDE0NDYxIiwg
  ##IllhIjogIjA0MDBDMkJGRDc5NDQ2N0Y0NDM4Mjc3RTg1QTQyRTEwMUZBNDA2MUU
  ##xRUY2RTA1RjgxRTUzODFGMzBFNzNCMzQxREQ3MjYwODlDQjZBNkJCRTVBNTA5Rk
  ##FEMDA5ODU3NDg4REI3MTMwRkY3NjgwOTA3MzEyRUI3MjRDRERCNERDQ0U2NzVCM
  ##DA5OEFENDAwRkVGODBFMURFQjRCQzE3NTZDNDM5NjFFRjYwQjg1RjJENjJFRDQ1
  ##ODQ1NEUxMTYxNkE1RDFERjFFNTgwOTYzNjgyMUE3MzY2MkY5RjEyMjU0RTZGOTk
  ##1MEREMDFGQThFMjZBOEIyMDczNkZCNjNDNjNDODEwOTRGNjgxIiwgInliIjogIj
  ##AwOTIyN0JGOERDNzQxREFDQzk0MjJGOEJGM0MwRTk2RkNFOTU4N0JDNTYyRUFBR
  ##kUwREM1RjZGODJGMjg1OTRFNEE2Rjk4NTUzNTYwQzYyQjc1RkE0QUJCMTk4Q0VD
  ##QkJCODZFQkQ0MUIwRUEwMjU0Q0RFNzhBQzY4RDM5QTI0MEFFNyIsICJBRGIiOiA
  ##iNDE0NDYyIiwgIlliIjogIjA0MDA3MDZFQTY5QjJCNzE2Nzc3MzI0OEVBNkU2OU
  ##E1NzRFOUREMkZGOEEzRDA0QTZFMDdGNzBDNzA5ODY5Q0E0ODY4MjdENTlGOTI5M
  ##DU5OUQxQ0Y5NEUxQTAzRkMyNDJFMkIxMzE2QUZFMkZBMjE4QkZBRUIzRTFGRkQ5
  ##RjE5QkYwNjJEMDFGNkIxNUM5QzM2NTFCRTRDMDhCQUYwMUVFQzI1QzgxOEVFMTJ
  ##DNkVEQzQ2MjA2NDRCMUQ5N0NGMjRGODY4NzMyRDU2RkU0NUNFNzhFMzAyQzIyMU
  ##M5MkY0MDNFMEZBMzIwN0RFOEJCNDFCMzg4RDgxMDQ2QTI5OEVEOEREQUM5QjJBI
  ##iwgIksiOiAiMDE4RTBFN0U5QURFNzQ5MTdDMTFDMEY2QjUyRjk1RUQ4NzFFQUIy
  ##MzU0MzdDQkVFOEI1QzI1MDk1MTZFNzg3QTgwRTgyNUVENUQ1MzlGQTZBMEVDMzJ
  ##DNDhGQThGQUJFODU4MDlEMDAwRDBDRkQzMDgzMkMyM0Q0NzdDOTkxQkVBOEU1Ii
  ##wgIklTS19JUiI6ICIxNjY5QTBBMjk3MjZBREM3RUVBMjUxMEQ2RjdFMDA0QTEzN
  ##UZBNjNBQzNDOUY5RTZDRTUzQ0JBNUQ1RTM3ODFBQ0VENTE1OTU2MDQxRTQzMzU4
  ##NDA5QTEzRUY5MEREQzNDMzZGRDhEN0Q4MTQyNEM4RTk0NTkyRTIxODU0MjYwQSI
  ##sICJJU0tfU1kiOiAiRjJGM0JEOENENDQyQTRFMTY2NTlCNDdBN0I3QTg0RjI5Qk
  ##U3NTg5M0VEMkU1Rjc3MkQ3QTNDOEI3NzlFQjBERjkzN0E0RUM1MEE0RjFGRjAxR
  ##UJCQUE5N0Q4MEUwOTBFQTY5QjAwQTk1MjAwRUQyNThFNDhDNkY3RTlEOEZCQzIi
  ##LCAic2lkX291dHB1dF9pciI6ICI1NkNDM0NEOEJFNzdDREM4NEMwRDE5MDZERTF
  ##GRkM4RUY3Q0JCMzI2QTNGMDUyNjdCNkU4QzYzNDRFMjc4MUVCMjBFRjcyNUU4NE
  ##NCMUJCNDU5Mjc0MzUwNTFCNEUwRkFFNzhFOTc1QkYxNTA5OUY5RTM4RDc1NTQxM
  ##0VFRTJGRCIsICJzaWRfb3V0cHV0X29jIjogIkE0NkM3MTg5QkE2QTM2QzQ0NDc3
  ##NDFFMDU3REEzOUM4ODVCN0Q1OUUwOEJEMkRGMTg1MkE1MjcxRjJBOEEyRTlCMTg
  ##3Q0NEMDczMjVBM0VFREU2NDZBREVFMEMwNkZFNThEQTc3Rjc0MTc3ODk2QjIxMD
  ##UzQzVEMTA3REUwMDZEIn0=
]]></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[
    ##eyJWYWxpZCI6IHsicyI6ICIwMTgyREQ3OTI1RjE3NTM0MTlFNEJGODM0Mjk3NjN
    ##BQ0QzN0Q2NDAwMENENUExNzVFREY1M0ExNTg3REQ5ODZCQzk1QUNDMTUwNjk5MT
    ##cwMkI2QkExQTlFRTI0NThGRUU4RUZDMDAxOThDRjAwODhDNDgwOTY1RUY2NUZGM
    ##jA0OEI4NTYiLCAiWCI6ICIwNDAwREM1MDc4QjI0QzRBRjE2MjBDQzEwRkJFQ0M2
    ##Q0Q4Q0YxQ0FCMEIwMTFFRkI3M0M3ODJGMjI2REMyMUM3Q0E3RUI0MDZCRTc0QTY
    ##5RUNCQTVCNEE4N0MwN0NGQzZFNjg3QjRCRUNBOUE2RURBQzk1OTQwQTNCNDEyMD
    ##U3M0IyNkE4MDAwNUU2OTc4MzNCMEJBMjg1RkNFN0IzRjFGMjUyNDMwMDg4NjBCO
    ##EYxREU3MTBBMERDQzA1QjBEMjAzNDFFRkU5MEVCMkJDQ0EyNjc5N0MyRDg1QUU2
    ##Q0E3NEMwMDY5NkNCMUIxM0U0MEJEQTE1QjI3OTY0RDc2NzA1NzY2NDdCRkFCOSI
    ##sICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0MD
    ##EyMkY4OENFNzNFQzVBQTJEMUM4QzVEMDQxNDg3NjBDM0Q5N0JBODdEQUExMEQ4Q
    ##0I4QkI3QzczQ0Y2RTk1MUZDOTIyNzIxQkYxNDM3OTk1Q0ZCMTNFMTMyQTc4QkVC
    ##ODYzODlFNjBEMzUxN0NERjZEOTlBOEEyRDZEQjE5RUYyN0JEMDA1NUFGOUU4RER
    ##DRjMzN0NFMEE3QzIyQTlDODA5OUJDNEE0NEZBRURFRDFFQjcyRUZGRDI2RTRGMz
    ##IyMjE3QjY3RDYwQjk0NEIyNjdCM0RGNTA0NjA3OEZENTc3RjE3ODU3MjhGNDlCM
    ##jQxRkQ1RThDODMyMjNBOTk0QTJEMjE5MjgxIiwgIkcuc2NhbGFyX211bHRfdmZ5
    ##KHMsWCkgKG9ubHkgWC1jb29yZGluYXRlKSI6ICIwMTIyRjg4Q0U3M0VDNUFBMkQ
    ##xQzhDNUQwNDE0ODc2MEMzRDk3QkE4N0RBQTEwRDhDQjhCQjdDNzNDRjZFOTUxRk
    ##M5MjI3MjFCRjE0Mzc5OTVDRkIxM0UxMzJBNzhCRUI4NjM4OUU2MEQzNTE3Q0RGN
    ##kQ5OUE4QTJENkRCMTlFRjI3QkQifSwgIkludmFsaWQgWTEiOiAiMDQwMERDNTA3
    ##OEIyNEM0QUYxNjIwQ0MxMEZCRUNDNkNEOENGMUNBQjBCMDExRUZCNzNDNzgyRjI
    ##yNkRDMjFDN0NBN0VCNDA2QkU3NEE2OUVDQkE1QjRBODdDMDdDRkM2RTY4N0I0Qk
    ##VDQTlBNkVEQUM5NTk0MEEzQjQxMjA1NzNCMjZBODAwMDVFNjk3ODMzQjBCQTI4N
    ##UZDRTdCM0YxRjI1MjQzMDA4ODYwQjhGMURFNzEwQTBEQ0MwNUIwRDIwMzQxRUZF
    ##OTBFQjJCQ0NBMjY3OTdDMkQ4NUFFNkNBNzRDMDA2OTZDQjFCMTNFNDBCREExNUI
    ##yNzk2NEQ3NjcwNTc2NjQ3QkZBRjkiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
kQdhIGcOkBRGeEIzPlWPHGbxuIu1GHMlUv+SzYV/Sc0F2b8QZ0GnxFvnjd18
dp9cjzxJMu6WMeb8pMtK+QuWdTgtf0VpMvfutMKIT58xsXCKLGwfbo40RlQ5
9Yj6fF1ExchapF91bInqXHVGs3/GzCSiKljxaOpNy26UYGzi4exIRwrjKtkx
ZHZLOXbR180hGExD7D9nUESHjuD0HFs62fKSva4L2bcvsIFsesyLnoxoHbRr
qml22ewpq/brzoj5ElD9CVgptwsMriOQIXxEj8Yole3OtCN/DjylqV5ltn5V
T6BERPTxlY1OYJFtQcjhrBHRmY7O7krMhwBrFJP9SVY2Za0Kcw82dohmYGCs
72OqcOumle68471MM69zXbAzBljMkfcmIteKGeOdENBe5XqndfQsqT6pvJ/Y
2MVW1MAAywUFt4rQQMqJclgARjwMLIvNrNqYCBwpDPFORZ1ymsmYfr7f+5Qr
NcQT+Wi9XiI4Qi+2o8CbSKeKG20zJPy27FQuEuP0eqLvdaBSAbIDhwKiaNJf
/wUb6eVbrq+0MY5D8T66DiPqrZIZQtTDyHQPITYiPkpXZdb5s9I0MYaOpTC2
LUM3JVXoStxUVLZtiAL4O2ovrqWDcXBNj7JXSj9Ln6pg/crD9iijIhbDy0CC
Dl420wybimfLmlR97kNuPSpVHSOOWdjweJsZgtovIwDgxlGoR5y0Ir5LaeAz
l+5GBUkimMbZISjOAsyXF2nzYrPohk7hetJgTZyUBMsJgy/DUM+0//V3siaw
/s1B0dNPu5KZRwmZOw7lU48ysuGp/4DnjD8bNpgBdtWqw59q3a66+L8GSLxq
vd40G41qzWk4zeo3TPYMgv4A073m7JjupR3T3UhN98z83/bj5H5+Li2l/MjS
UX56kH/qaa9PPVZEO8dx9zwm6TYj2jlOTdxlYVUbVsOs1Rpms9F0+eoY06xX
GzUw71zLdWx6rNZomNVqrda0Hfi8YVv1Rg3fcFyn7prVRsP9BomVDP0DyGtZ
ux76k/RVkz/bPcvLuG+SuXD6tEC16Dgz46MZ1NlEHoHu99CzVBcuDb0+ItOZ
22eh8bosSnUVXgpI/4WRHyxeS0i6sn+ylu8lq5dmMXbjOEZ1nk1Q1HN3RScg
Vfqo540htoxW2vwOc/vjyZ5qE2qUpTu2uv0obMGvWidckToDRo3KPdqtY5Yp
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
+Y7KhvrFVtSmewWQwdhkFW8f6dJNgfLL/G8KGvj5ZY6gghkQ/L9oX0WzzAB/
/eYA1NHoL1nJqS0DQNDWocTZDuH3MIm6BS3fdpBd3j2EL2STWO+glCk+KdIz
SxblhbSPv5dZNNT4B8vgAFxNwS7iB7sksZ/1lotestXbKTZHehhiDypZR8nz
iOX8zlvFiTi4o9W+FOJoz8oOPpkHZQP/gR+O0MEm0n/rJSv3EjLcNydSU/2G
d6zvAM6U4H3HS62T0za9hP9qb8FrgmnEI+IJTes3daVfm9SqwoMTnpw2ghgA
B+pkDQfz6TEc959hMnw4fX0yuO13pL8F7gr4H+BXtIXpAI5V9ns2ScGMkJYx
WBNB9/bsdGAOzwqGMftsUnz9YPevw9NrfcrkaiatdDmLsDDAUQAvUA6h3JfT
naFw2qArfcMHNfrwvfIE7SG6J8qW1iHLmql50ZWmin76HK806zVnnKTPwWMy
q1Qklb4UClrYsUJFiwov2PDyA35a1+a6lbojCp4CDQbJQkR2K3E2tb5p0Y/C
kqVPTg4ITsWLtp0xYqtsxJo116xZdbvu1JuOBZ+yYat/ahfMXXXcmpqphT/B
1O7+uZ2cAS3CJbnZHRlIyc3/T9kj6Jv3g27MJrNw4dT+yMYrtIDD/LX0krqz
k+tgMXQHwJXM4ON78i9v0J+6NXuXMvzxenD14bUZjV/L6cC0FqNckQsGTrML
zJzO/gje3kwOq6ICtoAg6IJ/2m+/T/eIWIR8lGc2g/nZJrD7W+/DifnBnm3B
yYZXwb217uO3+LNYgRgFF0If33DQRX9kMEuDMDCJCMK0bIqckOsvYzngOA7A
7+4pV6Kfx0v8FHTS3TD7o4+ArgcNfWfid4yoDCwWNffx+PxsG76anaZyBjwZ
6foon3wXihE6PEzY3uO4AMrny5Fl8Cw5sgyeliOsTrLSpJyVJc8XJt+CMbup
AbTvFyhOXrkVi49iUVMw//cKldrO/P9PsPx3CJbmzR8jWEinF0gOKVjU+jFq
K2MVbYxs6ovt0GJDjCMu+jfBfHYfnjW/Xm3FKGhg4BrHdk6AnMjfkUL993ug
FKMoYAdSgDxi6E2ThkIMDrSobvq9DPrxY1stosLuuXZzYkeeGqZpvpkmniLb
t8hH5izht3QbaYf6ph76Zerwnfo6QpQkm/nhL/4vMfiQfzUaf4pJfMSp73qI
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
GQ2GxSwPPoSMJFv4XaUhLMAVyIdC3BJRyiOOlOPruqpuScl3jSrDFzctpMtm
Bylgi0sHnut0h22IF4xS9H/kBoKQ3vaqQSghOFIDYd5u+h0eAq0hd4CPLFbV
2a5lS5wh3W2r6+Cnu+VRvTmpkO4I0twCKW7qEroM/lBvkMpkq7pts4AAu243
2x0MG/zHMmgI0uFpYJzBFW0mIHqOIwUWL5iZEgzJIBzgb+RFgd7BzASWJ+hS
L/HcKiQayN5gecj01HVEbSExzxYCrcfT6jUM8wByLETtBuIJz74GFp9eraru
cNXD2rGFceJdN5BjaTZg8Sohp25x5jAhX9y2/bJaoYoPrDk1qvsE/6hlzSBP
QmpDsOBLOFJQqPSXMqQ82cbL+VH+9G59+eHHSC/wYzxa99Pl8NNXKOSJmp52
gD8/wD1uYyX19Vcf/jT96avL4Z/IfpCYToL26zvoy8X0j3fQRrhlAK38/R8f
/jb96d2776ZhG2+DQyGU249/w2MXSH3w+Jqv/pg68F/xJSYymzxzXO6tgKX5
hf2bL0WelOe69Gb6lF/YJfFsl/xbOUPCW+030ntQPDzpAMFnkMti+v9+Hq6Q
YuORG3zki3euIJ8f5Fv/7xcNErqkPrt3ev9LuvTu4OoqSjKTunK0fyQ5Ua9j
IMHP//6PH376wf5wFQ9K//gxHwlNdXXzd0hak0vUKGm+8VX1n55PYHFywwdf
PQ9vGzwe6kB9F4/nzTJhRIZCEUgVMampGLOC51KZMZuc8NPIJ+0y5fIhYAC1
kJ5rb6fJ5syPnHOUDXAWKSkMn7IMz2TLyThVCMeUksIODuuSo/sdv8+Q8jN7
/iTvWyf/l+aB5zvL/506K/6dOiv/nTqrfmudDYXTo7LnXtcDTB0Wg930jx/m
A08//ubTBqXd+yXTz38Neug/hKRK/3i+1yOzWeHyXExWTKNxk9BWmZyxSWUu
k0LDrV02DNK4fMz0NBZqyAqrw1myDPqTjy7no+JeTnhEiXmlJg4XT7YweKAt
V4MdpTeKDWwsoNvjXscJvX/ee+TIkLYHkSqZdzYnGaHM+3zQynIlrXZaeJnp
jOVMy9Ez+NFrmJrgPcrA1GhvOBs446MsJmf5YJ0cnVDMO62dHfNBZkzD1cWQ
ZyKf3j1t6J+uP4A7zYamfzzbbWsKbh2fuM+FM1Zqm7vc+mxEAHSucwtzXQgk
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
4VMk3qg3yM5xUqFXB3g+ChOt8Tjp6WHDeqQ6uc9Csaw3qJKKbm0V2AMpUWDI
l0c1EmBULXs301lcw4USpq7EQ8h4zLXdWBQIFkjhgWc0VyU43xoPm+LJhgM9
4wiQO4LaiAQSyFgDhrpaoIFrPORTIdPAFu4HPrNDihh0MITsn+GR5qopXdUG
+heIxPWFrNcXN826O8JpbsHRwLEWzRqMXNbh5AvyzKwv8JgL9BApL5C1o78N
/sHO8Exo2fQQ7jB9eNS2AyPi8W2Umuo2F7c1BN2qxKDrISROqzocUCDuiOBj
M4EEWP66gw42fXUDw0ICDXD1gx3YRzY9ik3BxRswKrIPbJCVAulPTqmNEh0H
KWDwTHG7Rb6L7TXctWygd12FPrPFgz63RPGxOSCDr5DFZLeEnoZ5uSYJq6qS
kCOQVGNZU7C1tw2recvO4Yt48LY7QrqPegdD2vVJoe99yGOPCCQgYq1AmpN2
W7PV+gojugRvKNu+KVfI6FMi1UO3rMEJg59W/W6FjDmbXnXrCnoE98ShbMBD
q4rjIfYVHhrpT+DiYwgNPKjdCjyB3M30Lzi2Ci1fI+MEHkvf4iGNClwbGSla
GCIEXnlJ6l7tpr7tICXWPfgo/H71bfCPPQQSeLL4mEPj0DvwE/CJGlmRygop
Ha478KUQtztU5UbinQMFjqZbhpQnF6hXuIOZwdR3A+NXXYlee7UMR5Mh07Pl
Ub1ehnlBjpRu0ypwbTwoo2qGuokQfHh2q0KqkzNV43F6+BwjFuMKegKejYn5
KvgH5HQFY5RPEUggGvseEPJ/30NC/nO4+uDCceEf3907ObDnPX1uHZtYrv2Q
G63HQQvLRK7NkFnD3Dh6y9mUOcWGaSicKOSkWO6K+AzYei2LgYVTku/33EdY
abOxsMrLgrEpHyafFZliQo9qcrlBuneDrw7xhQG+81C5MzK97dFqVIPm4Rn5
0X1w3B9//DoIo/7x/X/tO5CQWy4zpf2UGzaorPAZdMmM05jLopg06mwpph0f
3JQZx/McD4NOMp53zX02ZtDxxx2Y0Xnvf42b37nC8ff3J/uRP8wA+uUPhOMH
h/kpus6Pj7/3x9uv//RfAfx/jyTkH9Pf/wFXfv9TeOU6MwfM1CFJfvboT8d/
+uo75AaYT6yc/e+/fuCI/8cfBPGH3GcNiEeCoLnAEvAxjwB1glgH/vTr++8Z
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
FH8drr/P26yT/yZcf5+3WSf/TYr0Pm+zuqdvUqT3eZvVxr5yOu/3NuvbX8VF
7/U2q9K+iove621W7/YqFn2vt1lj1lex6Hu9zTr54eeMkfyVE9E5hKgwGtRq
QJoyTYNxWo35XEwKctQWuUZuh4DYb66mPEAfgx9WVRvdZItSw5WNTrsK+UnG
T3QslERVePNEIsuIN2OzMdsCk8+ghSlIrzJXQebY6QxqPfzBMKxSfQvD+pXQ
YD3XP2SsL1a6qu6HjPXFSpe3f8xYX6x0ffqHjPXFSlNQ8hFjfbHS1XA+ZKwv
Vrrq0YeM9cVKV8P5kLG+WOlqQx8y1n+90OCnuK6q+jM0eDs0eL/HWT/EfPM2
7+ceZ7WzN2/zfu5xUuby1g3qzz1OevpbN6g/9zirnX2Tk7zP46ySf+Pa5D0e
J91OfHtt8h6Ps7z9rauq93ic1cO9cVX1Ho+zqs23judd4cFsZuvHMsAwzQBx
EGoNWxsKDzPI+FXsqXAl6f5mcnNRmLEYBEq12EpRTV6Nc2ULvDs4NWSz5r3w
5P0wVAgH1AT9k91TaqicUQpDrdFFOWVlYCRSjeXsw4+o8H8kqey1kGAJiHBG
wt+KMIYSGz3ybnqkXgS4JDgTb6HXdlbO5IXPJyzLZsmdGYRQE3Qer4Rfwfu9
xnYiMiroJ3FosU3iwO2vYJf8qnsFRV01wyKuci5DsDVBK8f3rvPnQLPX6xwy
eFVdVh4uDw42y+DKEO4pV4yDrUJZOk8TmqDmo4Hhl84MzhSp46MZysFMlddl
EcIICzduwKRHflcJHnlSQeGEdeU4FDDOjKS2KvfplFWIPOFRqO0Kwv2Te/Y7
c88irUkeJIX3L+X/5VoALzyQSoq5BZCzgMKEOiEIlXktmnfFR7hnAvuRkm4h
BgiEQ8qzBcTlBZrE2UVqkzy6eFmj1NnnibkjFd6C0xHChUhNkCZS1y/ckMG9
8KkisEivko70DAExySzKtQJeSAGRNxZeSG/CThKqSmSuSD2+X58jDBjB7Qgu
QDAjY6S8RIKTYDsSQClymSiL8gW3olZFEYSGKl44C5ELUK418EISkA0TPIzs
lRTRC3xJCu8Xwowg3CK0TqYvOiTgIgHOCIwgYa4EySTPzhdChAhZBpZxRCcS
DUIK70Wmwg/J+exI1Isyj7IS3ooMIQQaYbAI/k3wDgn3JCohtIMs6rQgBYRa
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

-->

</rfc>
