<?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-13" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-13"/>
    <author initials="M." surname="Abdalla" fullname="Michel Abdalla">
      <organization>Nexus - San Francisco</organization>
      <address>
        <email>michel.abdalla@gmail.com</email>
      </address>
    </author>
    <author initials="B." surname="Haase" fullname="Bjoern Haase">
      <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
      <address>
        <email>bjoern.m.haase@web.de</email>
      </address>
    </author>
    <author initials="J." surname="Hesse" fullname="Julia Hesse">
      <organization>IBM Research Europe - Zurich</organization>
      <address>
        <email>juliahesse2@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="15"/>
    <workgroup>CFRG</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 140?>

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

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

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

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-ristretto255-decaf448-08"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="ES21" target="https://eprint.iacr.org/2021/696">
          <front>
            <title>The 'quantum annoying' property of password-authenticated key exchange protocols.</title>
            <author initials="E." surname="Eaton">
              <organization/>
            </author>
            <author initials="D." surname="Stebila">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ABKLX21" target="https://eprint.iacr.org/2021/1218">
          <front>
            <title>Algebraic Adversaries in the Universal Composability Framework.</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="J." surname="Katz">
              <organization/>
            </author>
            <author initials="J." surname="Loss">
              <organization/>
            </author>
            <author initials="J." surname="Xu">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="AHH21" target="https://eprint.iacr.org/2021/114">
          <front>
            <title>Security analysis of CPace</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="B." surname="Haase">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BGHJ24" target="link.springer.com/chapter/10.1007/978-3-031-68379-4_6">
          <front>
            <title>Bare PAKE: Universally Composable Key Exchange from Just Passwords</title>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="K." surname="Gellert">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CDMP05" target="https://doi.org/10.1007/11535218_26">
          <front>
            <title>Merkle-Damgaard Revisited: How to Construct a Hash Function</title>
            <author initials="J.-S." surname="Coron" fullname="Jean-Sebastien Coron">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="Y." surname="Dodis" fullname="Yevgeniy Dodis">
              <organization>New York University</organization>
            </author>
            <author initials="C." surname="Malinaud" fullname="Cecile Malinaud">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="P." surname="Puniya" fullname="Prashant Puniya">
              <organization>New York University</organization>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="In" value="Advances in Cryptology - CRYPTO 2005"/>
          <seriesInfo name="pages" value="430-448"/>
          <seriesInfo name="DOI" value="10.1007/11535218_26"/>
        </reference>
        <reference anchor="FIPS202" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">
          <front>
            <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="SEC2" target="http://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters</title>
            <author>
              <organization>Standards for Efficient Cryptography Group (SECG)</organization>
            </author>
            <date year="2010" month="January"/>
          </front>
        </reference>
        <reference anchor="REFIMP" target="https://github.com/cfrg/draft-irtf-cfrg-cpace/tree/master/poc">
          <front>
            <title>CPace reference implementation (sage)</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="September"/>
          </front>
        </reference>
        <reference anchor="RFC8265">
          <front>
            <title>Preparation, Enforcement, and Comparison of Internationalized Strings Representing Usernames and Passwords</title>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This document describes updated methods for handling Unicode strings representing usernames and passwords. The previous approach was known as SASLprep (RFC 4013) and was based on Stringprep (RFC 3454). The methods specified in this document provide a more sustainable approach to the handling of internationalized usernames and passwords. This document obsoletes RFC 7613.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8265"/>
          <seriesInfo name="DOI" value="10.17487/RFC8265"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-opaque">
          <front>
            <title>The OPAQUE Augmented PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>AWS</organization>
            </author>
            <author fullname="Kevin Lewi" initials="K." surname="Lewi">
              <organization>Meta</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="27" month="September" 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-17"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key. The cryptographic strength of HMAC depends on the properties of the underlying hash function. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </reference>
        <reference anchor="RFC5246">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
            <author fullname="T. Dierks" initials="T." surname="Dierks"/>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2008"/>
            <abstract>
              <t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications security over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5246"/>
          <seriesInfo name="DOI" value="10.17487/RFC5246"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC5639">
          <front>
            <title>Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation</title>
            <author fullname="M. Lochter" initials="M." surname="Lochter"/>
            <author fullname="J. Merkle" initials="J." surname="Merkle"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>This memo proposes several elliptic curve domain parameters over finite prime fields for use in cryptographic applications. The domain parameters are consistent with the relevant international standards, and can be used in X.509 certificates and certificate revocation lists (CRLs), for Internet Key Exchange (IKE), Transport Layer Security (TLS), XML signatures, and all applications or protocols based on the cryptographic message syntax (CMS). This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5639"/>
          <seriesInfo name="DOI" value="10.17487/RFC5639"/>
        </reference>
        <reference anchor="RFC4493">
          <front>
            <title>The AES-CMAC Algorithm</title>
            <author fullname="JH. Song" initials="JH." surname="Song"/>
            <author fullname="R. Poovendran" initials="R." surname="Poovendran"/>
            <author fullname="J. Lee" initials="J." surname="Lee"/>
            <author fullname="T. Iwata" initials="T." surname="Iwata"/>
            <date month="June" year="2006"/>
            <abstract>
              <t>The National Institute of Standards and Technology (NIST) has recently specified the Cipher-based Message Authentication Code (CMAC), which is equivalent to the One-Key CBC MAC1 (OMAC1) submitted by Iwata and Kurosawa. This memo specifies an authentication algorithm based on CMAC with the 128-bit Advanced Encryption Standard (AES). This new authentication algorithm is named AES-CMAC. The purpose of this document is to make the AES-CMAC algorithm conveniently available to the Internet Community. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4493"/>
          <seriesInfo name="DOI" value="10.17487/RFC4493"/>
        </reference>
      </references>
    </references>
    <?line 885?>

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

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

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

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

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

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

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

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

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

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

  point coordinate u_twist on the twist: (length: 56 bytes)
    c981cd1e1f72d9c35c7d7cf6be426757c0dc8206a2fcfa564a8e7618c0
    3c0e61f9a2eb1c3e0dd97d6e9b1010f5edd03397a83f5a914cb3ff
  G_X448.scalar_mult_vfy(s,u_twist): (length: 56 bytes)
    d0a2bb7e9c5c2c627793d8342f23b759fe7d9e3320a85ca4fd61376331
    50ffd9a9148a9b75c349fac43d64bec49a6e126cc92cbfbf353961
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-10">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkxIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMiI6ICIwMT
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwIiwgIkludmFsaWQgWTMiOiAiRkVGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbnZh
 #bGlkIFk0IjogIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNSI6ICIwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGIiwgIlZhbGlkIChvbiBjdXJ2ZSkiOiB7InMiOiAiQUY4QTE0MjE4QkYyQTIw
 #NjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0YxNU
 #ZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FERCIs
 #ICJ1X2N1cnZlIjogIkFCMEM2OEQ3NzJFQzJFQjlERTI1QzQ5NzAwRTQ2RDYzMjVFNj
 #ZENkFBMzlEN0I2NUVCODRBNjhDNTU2OUQ0N0JENzFCNDFGM0UwRDIxMEY0NEUxNDZE
 #RUM4OTI2QjE3NEFDQjNGOTQwQTBCODJDQUIiLCAicmVzX2N1cnZlIjogIjNCMEZBOU
 #JDNDBBNkZEQzc4QzlFMDZGRjdBNTRDMTQzQzVENTJGMzY1NjA3MDUzQkYwNjU2RjUx
 #NDIwNDk2Mjk1RjkxMEExMDFCMzhFREMxQUNEM0JEMjQwRkQ1NURDQjdBMzYwNTUzQj
 #hBNzYyN0UifSwgIlZhbGlkIChvbiB0d2lzdCkiOiB7InMiOiAiQUY4QTE0MjE4QkYy
 #QTIwNjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0
 #YxNUZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FE
 #RCIsICJ1X3R3aXN0IjogIkM5ODFDRDFFMUY3MkQ5QzM1QzdEN0NGNkJFNDI2NzU3Qz
 #BEQzgyMDZBMkZDRkE1NjRBOEU3NjE4QzAzQzBFNjFGOUEyRUIxQzNFMEREOTdENkU5
 #QjEwMTBGNUVERDAzMzk3QTgzRjVBOTE0Q0IzRkYiLCAicmVzX3R3aXN0IjogIkQwQT
 #JCQjdFOUM1QzJDNjI3NzkzRDgzNDJGMjNCNzU5RkU3RDlFMzMyMEE4NUNBNEZENjEz
 #NzYzMzE1MEZGRDlBOTE0OEE5Qjc1QzM0OUZBQzQzRDY0QkVDNDlBNkUxMjZDQzkyQ0
 #JGQkYzNTM5NjEifX0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-ristretto255-and-hash-sha-512">
        <name>Test vector for CPace using group ristretto255 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-ristretto255">
          <name>Test vectors for calculate_generator with group ristretto255</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 100 ;
    DSI = b'CPaceRistretto255'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      11435061636552697374726574746f3235350850617373776f726464
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    hash result: (length: 64 bytes)
      c63a5750e2439c17ccd8213be14fde2f87e1bc637001a97f5929c77b
      30ea0e08afbc75ace5d3d73b2842a79d01488c5fd7ea30d475ee6095
      45af1bfd1ff77c8e
    encoded generator g: (length: 32 bytes)
      a6fc82c3b8968fbb2e06fee81ca858586dea50d248f0c7ca6a18b090
      2a30b36b
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-11">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDAsICJEU0kiOiAiNDM1MDYx
 #NjM2NTUyNjk3Mzc0NzI2NTc0NzQ2RjMyMzUzNSIsICJDSSI6ICI2RjYzMEI0MjVGNz
 #I2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6
 #ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnZW5lcmF0b3Jfc3
 #RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIxMTQzNTA2MTYz
 #NjU1MjY5NzM3NDcyNjU3NDc0NkYzMjM1MzUwODUwNjE3MzczNzc2RjcyNjQ2NDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMU
 #E2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2
 #RjcyMTA3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJoYXNoIHJlc3
 #VsdCI6ICJDNjNBNTc1MEUyNDM5QzE3Q0NEODIxM0JFMTRGREUyRjg3RTFCQzYzNzAw
 #MUE5N0Y1OTI5Qzc3QjMwRUEwRTA4QUZCQzc1QUNFNUQzRDczQjI4NDJBNzlEMDE0OD
 #hDNUZEN0VBMzBENDc1RUU2MDk1NDVBRjFCRkQxRkY3N0M4RSIsICJlbmNvZGVkIGdl
 #bmVyYXRvciBnIjogIkE2RkM4MkMzQjg5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQT
 #UwRDI0OEYwQzdDQTZBMThCMDkwMkEzMEIzNkIifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-2">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      da3d23700a9e5699258aef94dc060dfda5ebb61f02a5ea77fad53f4f
      f0976d08
  Outputs
    Ya: (length: 32 bytes)
      d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c66
      9308f87a
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-2">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      d2316b454718c35362d83d69df6320f38578ed5984651435e2949762
      d900b80d
  Outputs
    Yb: (length: 32 bytes)
      08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67
      2eb7e307
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-2">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa
      0e607e09
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa
      0e607e09
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-2">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      20d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c
      669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d39840
      3319c2341bd506a92e672eb7e30703414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774
      fc0f41e6b711569190ff88fa0e607e0920d40fb265a7abeaee7939d9
      1a585fe59f7053f982c296ec413c624c669308f87a034144612008bc
      f6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e672eb7
      e30703414462
    ISK result: (length: 64 bytes)
      4c5469a16b2364c4b944ebc1a79e51d1674ad47db26e8718154f59fa
      ebfaa52d8346f30aa58377117eb20d527f2cbc5c76381f7fd372e89d
      f8239f87f2e02ed1
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-2">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f6320d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c
      624c669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d3
      98403319c2341bd506a92e672eb7e30703414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 148 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774
      fc0f41e6b711569190ff88fa0e607e096f6320d40fb265a7abeaee79
      39d91a585fe59f7053f982c296ec413c624c669308f87a0341446120
      08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67
      2eb7e30703414462
    ISK result: (length: 64 bytes)
      980dcc5a1c52ceea031e75f38ed266586616488c5c5780285fcbcf79
      087c7bcdbd993502eee606b718ba31e840a000a7b7befe15ea427c5c
      fe88344fa1237f35
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-2">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      2a76d3bbc499dfdc4dcacc9ff042f4e1a54e3843258e100ccd7c60f0
      a541f9d3ebf025e68a460dde218bd39f0711bc6fa11409c9d7b69d8c
      cf6b32fc51ddb699
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      ca4b50700c46203ccd10bc0e9f31095e508189cb59857537be561048
      d34b9ed9a9697af11c998f484c3d783b0b531434caa6835d4c32344f
      cd17160c9c348fc7
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-2">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0xa6,0xfc,0x82,0xc3,0xb8,0x96,0x8f,0xbb,0x2e,0x06,0xfe,0xe8,
 0x1c,0xa8,0x58,0x58,0x6d,0xea,0x50,0xd2,0x48,0xf0,0xc7,0xca,
 0x6a,0x18,0xb0,0x90,0x2a,0x30,0xb3,0x6b,
};
const unsigned char tc_ya[] = {
 0xda,0x3d,0x23,0x70,0x0a,0x9e,0x56,0x99,0x25,0x8a,0xef,0x94,
 0xdc,0x06,0x0d,0xfd,0xa5,0xeb,0xb6,0x1f,0x02,0xa5,0xea,0x77,
 0xfa,0xd5,0x3f,0x4f,0xf0,0x97,0x6d,0x08,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd4,0x0f,0xb2,0x65,0xa7,0xab,0xea,0xee,0x79,0x39,0xd9,0x1a,
 0x58,0x5f,0xe5,0x9f,0x70,0x53,0xf9,0x82,0xc2,0x96,0xec,0x41,
 0x3c,0x62,0x4c,0x66,0x93,0x08,0xf8,0x7a,
};
const unsigned char tc_yb[] = {
 0xd2,0x31,0x6b,0x45,0x47,0x18,0xc3,0x53,0x62,0xd8,0x3d,0x69,
 0xdf,0x63,0x20,0xf3,0x85,0x78,0xed,0x59,0x84,0x65,0x14,0x35,
 0xe2,0x94,0x97,0x62,0xd9,0x00,0xb8,0x0d,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x08,0xbc,0xf6,0xe9,0x77,0x7a,0x9c,0x31,0x3a,0x3d,0xb6,0xda,
 0xa5,0x10,0xf2,0xd3,0x98,0x40,0x33,0x19,0xc2,0x34,0x1b,0xd5,
 0x06,0xa9,0x2e,0x67,0x2e,0xb7,0xe3,0x07,
};
const unsigned char tc_K[] = {
 0xe2,0x2b,0x1e,0xf7,0x78,0x8f,0x66,0x14,0x78,0xf3,0xcd,0xdd,
 0x4c,0x60,0x07,0x74,0xfc,0x0f,0x41,0xe6,0xb7,0x11,0x56,0x91,
 0x90,0xff,0x88,0xfa,0x0e,0x60,0x7e,0x09,
};
const unsigned char tc_ISK_IR[] = {
 0x4c,0x54,0x69,0xa1,0x6b,0x23,0x64,0xc4,0xb9,0x44,0xeb,0xc1,
 0xa7,0x9e,0x51,0xd1,0x67,0x4a,0xd4,0x7d,0xb2,0x6e,0x87,0x18,
 0x15,0x4f,0x59,0xfa,0xeb,0xfa,0xa5,0x2d,0x83,0x46,0xf3,0x0a,
 0xa5,0x83,0x77,0x11,0x7e,0xb2,0x0d,0x52,0x7f,0x2c,0xbc,0x5c,
 0x76,0x38,0x1f,0x7f,0xd3,0x72,0xe8,0x9d,0xf8,0x23,0x9f,0x87,
 0xf2,0xe0,0x2e,0xd1,
};
const unsigned char tc_ISK_SY[] = {
 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3,
 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28,
 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02,
 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7,
 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f,
 0xa1,0x23,0x7f,0x35,
};
const unsigned char tc_ISK_SY[] = {
 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3,
 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28,
 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02,
 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7,
 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f,
 0xa1,0x23,0x7f,0x35,
};
const unsigned char tc_sid_out_ir[] = {
 0x2a,0x76,0xd3,0xbb,0xc4,0x99,0xdf,0xdc,0x4d,0xca,0xcc,0x9f,
 0xf0,0x42,0xf4,0xe1,0xa5,0x4e,0x38,0x43,0x25,0x8e,0x10,0x0c,
 0xcd,0x7c,0x60,0xf0,0xa5,0x41,0xf9,0xd3,0xeb,0xf0,0x25,0xe6,
 0x8a,0x46,0x0d,0xde,0x21,0x8b,0xd3,0x9f,0x07,0x11,0xbc,0x6f,
 0xa1,0x14,0x09,0xc9,0xd7,0xb6,0x9d,0x8c,0xcf,0x6b,0x32,0xfc,
 0x51,0xdd,0xb6,0x99,
};
const unsigned char tc_sid_out_oc[] = {
 0xca,0x4b,0x50,0x70,0x0c,0x46,0x20,0x3c,0xcd,0x10,0xbc,0x0e,
 0x9f,0x31,0x09,0x5e,0x50,0x81,0x89,0xcb,0x59,0x85,0x75,0x37,
 0xbe,0x56,0x10,0x48,0xd3,0x4b,0x9e,0xd9,0xa9,0x69,0x7a,0xf1,
 0x1c,0x99,0x8f,0x48,0x4c,0x3d,0x78,0x3b,0x0b,0x53,0x14,0x34,
 0xca,0xa6,0x83,0x5d,0x4c,0x32,0x34,0x4f,0xcd,0x17,0x16,0x0c,
 0x9c,0x34,0x8f,0xc7,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-12">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIkE2RkM4MkMzQj
 #g5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQTUwRDI0OEYwQzdDQTZBMThCMDkwMkEz
 #MEIzNkIiLCAieWEiOiAiREEzRDIzNzAwQTlFNTY5OTI1OEFFRjk0REMwNjBERkRBNU
 #VCQjYxRjAyQTVFQTc3RkFENTNGNEZGMDk3NkQwOCIsICJBRGEiOiAiNDE0NDYxIiwg
 #IllhIjogIkQ0MEZCMjY1QTdBQkVBRUU3OTM5RDkxQTU4NUZFNTlGNzA1M0Y5ODJDMj
 #k2RUM0MTNDNjI0QzY2OTMwOEY4N0EiLCAieWIiOiAiRDIzMTZCNDU0NzE4QzM1MzYy
 #RDgzRDY5REY2MzIwRjM4NTc4RUQ1OTg0NjUxNDM1RTI5NDk3NjJEOTAwQjgwRCIsIC
 #JBRGIiOiAiNDE0NDYyIiwgIlliIjogIjA4QkNGNkU5Nzc3QTlDMzEzQTNEQjZEQUE1
 #MTBGMkQzOTg0MDMzMTlDMjM0MUJENTA2QTkyRTY3MkVCN0UzMDciLCAiSyI6ICJFMj
 #JCMUVGNzc4OEY2NjE0NzhGM0NEREQ0QzYwMDc3NEZDMEY0MUU2QjcxMTU2OTE5MEZG
 #ODhGQTBFNjA3RTA5IiwgIklTS19JUiI6ICI0QzU0NjlBMTZCMjM2NEM0Qjk0NEVCQz
 #FBNzlFNTFEMTY3NEFENDdEQjI2RTg3MTgxNTRGNTlGQUVCRkFBNTJEODM0NkYzMEFB
 #NTgzNzcxMTdFQjIwRDUyN0YyQ0JDNUM3NjM4MUY3RkQzNzJFODlERjgyMzlGODdGMk
 #UwMkVEMSIsICJJU0tfU1kiOiAiOTgwRENDNUExQzUyQ0VFQTAzMUU3NUYzOEVEMjY2
 #NTg2NjE2NDg4QzVDNTc4MDI4NUZDQkNGNzkwODdDN0JDREJEOTkzNTAyRUVFNjA2Qj
 #cxOEJBMzFFODQwQTAwMEE3QjdCRUZFMTVFQTQyN0M1Q0ZFODgzNDRGQTEyMzdGMzUi
 #LCAic2lkX291dHB1dF9pciI6ICIyQTc2RDNCQkM0OTlERkRDNERDQUNDOUZGMDQyRj
 #RFMUE1NEUzODQzMjU4RTEwMENDRDdDNjBGMEE1NDFGOUQzRUJGMDI1RTY4QTQ2MERE
 #RTIxOEJEMzlGMDcxMUJDNkZBMTE0MDlDOUQ3QjY5RDhDQ0Y2QjMyRkM1MUREQjY5OS
 #IsICJzaWRfb3V0cHV0X29jIjogIkNBNEI1MDcwMEM0NjIwM0NDRDEwQkMwRTlGMzEw
 #OTVFNTA4MTg5Q0I1OTg1NzUzN0JFNTYxMDQ4RDM0QjlFRDlBOTY5N0FGMTFDOTk4Rj
 #Q4NEMzRDc4M0IwQjUzMTQzNENBQTY4MzVENEMzMjM0NEZDRDE3MTYwQzlDMzQ4RkM3
 #In0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    X: (length: 32 bytes)
      2c3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    G.scalar_mult(s,decode(X)): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
    G.scalar_mult_vfy(s,X): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    Y_i1: (length: 32 bytes)
      2b3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    Y_i2 == G.I: (length: 32 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-13">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI3Q0QwRTA3NUZBNzk1NUJBNTJDMDI3NTlBNkM5MERCQk
 #ZDMTBFNkQ0MEFFQThEMjgzRTQwN0Q4OENGNTM4QTA1IiwgIlgiOiAiMkMzQzZCOEM0
 #RjM4MDBFN0FFRjY4NjQwMjVCNEVENzlCRDU5OTExN0U0MjdDNDFCRDQ3RDkzRDY1NE
 #I0QTUxQyIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICI3QzEzNjQ1RkU3
 #OTBBNDY4RjYyQzM5QkVCNzM4OEU1NDFEODQwNUQxQURFNjlEMTc3OEM1RkUzRTdGNk
 #I2MDBFIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiN0MxMzY0NUZFNzkwQTQ2
 #OEY2MkMzOUJFQjczODhFNTQxRDg0MDVEMUFERTY5RDE3NzhDNUZFM0U3RjZCNjAwRS
 #J9LCAiSW52YWxpZCBZMSI6ICIyQjNDNkI4QzRGMzgwMEU3QUVGNjg2NDAyNUI0RUQ3
 #OUJENTk5MTE3RTQyN0M0MUJENDdEOTNENjU0QjRBNTFDIiwgIkludmFsaWQgWTIiOi
 #AiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-decaf448-and-hash-shake-256">
        <name>Test vector for CPace using group decaf448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-decaf448">
          <name>Test vectors for calculate_generator with group decaf448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 112 ;
    DSI = b'CPaceDecaf448'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 180 bytes)
      0d435061636544656361663434380850617373776f72647000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000001a6f630b
      425f726573706f6e6465720b415f696e69746961746f72105223e0cd
      c45d6575668d64c552004124
    hash result: (length: 112 bytes)
      7148f4d60587aaafa64d2fd6bcfe45ee71e8b971d1d5ff3bbf8c1451
      797c62a1af22ab25638749f97f9b15fedcf4aeee87282cf667594ab0
      92b6023c8f8d3a61c38b0af791c9271137df01b57d63b79734bbce69
      91e3e2e10fdc805abc9e6e6f3daeff6fd34093d26de240b326764252
    encoded generator g: (length: 56 bytes)
      9a700ecc378eb98e57387df456d5b4b4f1dceebbb1371527eeb7e1bf
      bab64ecc9c9303396145ba04f5b5aea5baedfa61f31f00fbc5fd5606
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-14">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExMiwgIkRTSSI6ICI0MzUw
 #NjE2MzY1NDQ2NTYzNjE2NjM0MzQzOCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNz
 #A2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1MjIz
 #RTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnZW5lcmF0b3Jfc3RyaW5nKE
 #cuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIwRDQzNTA2MTYzNjU0NDY1
 #NjM2MTY2MzQzNDM4MDg1MDYxNzM3Mzc3NkY3MjY0NzAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2
 #OTc0Njk2MTc0NkY3MjEwNTIyM0UwQ0RDNDVENjU3NTY2OEQ2NEM1NTIwMDQxMjQiLC
 #AiaGFzaCByZXN1bHQiOiAiNzE0OEY0RDYwNTg3QUFBRkE2NEQyRkQ2QkNGRTQ1RUU3
 #MUU4Qjk3MUQxRDVGRjNCQkY4QzE0NTE3OTdDNjJBMUFGMjJBQjI1NjM4NzQ5Rjk3Rj
 #lCMTVGRURDRjRBRUVFODcyODJDRjY2NzU5NEFCMDkyQjYwMjNDOEY4RDNBNjFDMzhC
 #MEFGNzkxQzkyNzExMzdERjAxQjU3RDYzQjc5NzM0QkJDRTY5OTFFM0UyRTEwRkRDOD
 #A1QUJDOUU2RTZGM0RBRUZGNkZEMzQwOTNEMjZERTI0MEIzMjY3NjQyNTIiLCAiZW5j
 #b2RlZCBnZW5lcmF0b3IgZyI6ICI5QTcwMEVDQzM3OEVCOThFNTczODdERjQ1NkQ1Qj
 #RCNEYxRENFRUJCQjEzNzE1MjdFRUI3RTFCRkJBQjY0RUNDOUM5MzAzMzk2MTQ1QkEw
 #NEY1QjVBRUE1QkFFREZBNjFGMzFGMDBGQkM1RkQ1NjA2In0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-3">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      33d561f13cfc0dca279c30e8cde895175dc25483892819eba132d58c
      13c0462a8eb0d73fda941950594bef5191d8394691f86edffcad6c1e
  Outputs
    Ya: (length: 56 bytes)
      627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be846c
      c0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e571b
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-3">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      2523c969f68fa2b2aea294c2539ef36eb1e0558abd14712a7828f16a
      85ed2c7e77e2bdd418994405fb1b57b6bbaadd66849892aac9d81402
  Outputs
    Yb: (length: 56 bytes)
      8e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3011871
      7019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f94772db
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-3">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97
      32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97
      32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-3">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      38627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be84
      6cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e57
      1b03414461388e9811e4402fac098743ca7b2b509b91b38c8cf1360c
      c6cab30118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f
      8399f94772db03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363
      cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7
      6d473e01689af77f38627f8bb2ae945e2a518967df9b00aff19253d3
      086398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a937
      2a17e66bb7006e571b03414461388e9811e4402fac098743ca7b2b50
      9b91b38c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b7
      74e6b0e0b826ff4f8399f94772db03414462
    ISK result: (length: 64 bytes)
      9c2726a6cda1179349cbc38f31765eab646a2a5f176f3019fab4a0aa
      bd9d17c2ba895998cff698d801761a003512c1cf67d144b21e1cb6d6
      b82da71d0da76cad
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-3">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f63388e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3
      0118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f9
      4772db0341446238627f8bb2ae945e2a518967df9b00aff19253d308
      6398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a
      17e66bb7006e571b03414461
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 216 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363
      cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7
      6d473e01689af77f6f63388e9811e4402fac098743ca7b2b509b91b3
      8c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b774e6b0
      e0b826ff4f8399f94772db0341446238627f8bb2ae945e2a518967df
      9b00aff19253d3086398f2ec18be846cc0d1f286c2ce3caf1da63985
      9ccd2a6a01a9372a17e66bb7006e571b03414461
    ISK result: (length: 64 bytes)
      6d2178ed3048703025b9007ec84c4d969e8d8135df455e608c16aa15
      2e1219c86cea563254428a9d969903ae3649d1050da1e6e0c1c060e1
      ebf7316a7e993389
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-3">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      65bffde17b7acf07cfd437bdb973a8f7340bf911d393a61498c0a50e
      f0d68bca103fbdb0f5b799505562e59811df1bc5d9b4f5f0f7c57c22
      cd7ed6db4d153e3a
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      7ce27043d1b1d0d0e02e16979637e2a00547ed6e15ea988f7d3c9b3c
      2159b26ab3834bff7ff86240323e25216ba2ee6ea6e1582502017f8e
      6d65f8c4a5e65543
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-3">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0x9a,0x70,0x0e,0xcc,0x37,0x8e,0xb9,0x8e,0x57,0x38,0x7d,0xf4,
 0x56,0xd5,0xb4,0xb4,0xf1,0xdc,0xee,0xbb,0xb1,0x37,0x15,0x27,
 0xee,0xb7,0xe1,0xbf,0xba,0xb6,0x4e,0xcc,0x9c,0x93,0x03,0x39,
 0x61,0x45,0xba,0x04,0xf5,0xb5,0xae,0xa5,0xba,0xed,0xfa,0x61,
 0xf3,0x1f,0x00,0xfb,0xc5,0xfd,0x56,0x06,
};
const unsigned char tc_ya[] = {
 0x33,0xd5,0x61,0xf1,0x3c,0xfc,0x0d,0xca,0x27,0x9c,0x30,0xe8,
 0xcd,0xe8,0x95,0x17,0x5d,0xc2,0x54,0x83,0x89,0x28,0x19,0xeb,
 0xa1,0x32,0xd5,0x8c,0x13,0xc0,0x46,0x2a,0x8e,0xb0,0xd7,0x3f,
 0xda,0x94,0x19,0x50,0x59,0x4b,0xef,0x51,0x91,0xd8,0x39,0x46,
 0x91,0xf8,0x6e,0xdf,0xfc,0xad,0x6c,0x1e,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x62,0x7f,0x8b,0xb2,0xae,0x94,0x5e,0x2a,0x51,0x89,0x67,0xdf,
 0x9b,0x00,0xaf,0xf1,0x92,0x53,0xd3,0x08,0x63,0x98,0xf2,0xec,
 0x18,0xbe,0x84,0x6c,0xc0,0xd1,0xf2,0x86,0xc2,0xce,0x3c,0xaf,
 0x1d,0xa6,0x39,0x85,0x9c,0xcd,0x2a,0x6a,0x01,0xa9,0x37,0x2a,
 0x17,0xe6,0x6b,0xb7,0x00,0x6e,0x57,0x1b,
};
const unsigned char tc_yb[] = {
 0x25,0x23,0xc9,0x69,0xf6,0x8f,0xa2,0xb2,0xae,0xa2,0x94,0xc2,
 0x53,0x9e,0xf3,0x6e,0xb1,0xe0,0x55,0x8a,0xbd,0x14,0x71,0x2a,
 0x78,0x28,0xf1,0x6a,0x85,0xed,0x2c,0x7e,0x77,0xe2,0xbd,0xd4,
 0x18,0x99,0x44,0x05,0xfb,0x1b,0x57,0xb6,0xbb,0xaa,0xdd,0x66,
 0x84,0x98,0x92,0xaa,0xc9,0xd8,0x14,0x02,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x8e,0x98,0x11,0xe4,0x40,0x2f,0xac,0x09,0x87,0x43,0xca,0x7b,
 0x2b,0x50,0x9b,0x91,0xb3,0x8c,0x8c,0xf1,0x36,0x0c,0xc6,0xca,
 0xb3,0x01,0x18,0x71,0x70,0x19,0x78,0x2b,0x7f,0x58,0xa5,0x91,
 0xc6,0x3d,0x9c,0x92,0x47,0xb7,0x74,0xe6,0xb0,0xe0,0xb8,0x26,
 0xff,0x4f,0x83,0x99,0xf9,0x47,0x72,0xdb,
};
const unsigned char tc_K[] = {
 0x94,0xf4,0xae,0x49,0x4f,0x4e,0x8b,0x07,0xad,0xe3,0x35,0x47,
 0x26,0xee,0xe4,0x9c,0x55,0x18,0xb3,0x63,0xcd,0xa5,0x44,0xf5,
 0xb4,0x54,0x1b,0x97,0x32,0x83,0x0b,0xe3,0x7e,0xa0,0xe6,0x3f,
 0xc8,0x3f,0x54,0xbe,0x28,0x0d,0xea,0x07,0x47,0xa0,0x43,0xc7,
 0x6d,0x47,0x3e,0x01,0x68,0x9a,0xf7,0x7f,
};
const unsigned char tc_ISK_IR[] = {
 0x9c,0x27,0x26,0xa6,0xcd,0xa1,0x17,0x93,0x49,0xcb,0xc3,0x8f,
 0x31,0x76,0x5e,0xab,0x64,0x6a,0x2a,0x5f,0x17,0x6f,0x30,0x19,
 0xfa,0xb4,0xa0,0xaa,0xbd,0x9d,0x17,0xc2,0xba,0x89,0x59,0x98,
 0xcf,0xf6,0x98,0xd8,0x01,0x76,0x1a,0x00,0x35,0x12,0xc1,0xcf,
 0x67,0xd1,0x44,0xb2,0x1e,0x1c,0xb6,0xd6,0xb8,0x2d,0xa7,0x1d,
 0x0d,0xa7,0x6c,0xad,
};
const unsigned char tc_ISK_SY[] = {
 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e,
 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60,
 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32,
 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05,
 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a,
 0x7e,0x99,0x33,0x89,
};
const unsigned char tc_ISK_SY[] = {
 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e,
 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60,
 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32,
 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05,
 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a,
 0x7e,0x99,0x33,0x89,
};
const unsigned char tc_sid_out_ir[] = {
 0x65,0xbf,0xfd,0xe1,0x7b,0x7a,0xcf,0x07,0xcf,0xd4,0x37,0xbd,
 0xb9,0x73,0xa8,0xf7,0x34,0x0b,0xf9,0x11,0xd3,0x93,0xa6,0x14,
 0x98,0xc0,0xa5,0x0e,0xf0,0xd6,0x8b,0xca,0x10,0x3f,0xbd,0xb0,
 0xf5,0xb7,0x99,0x50,0x55,0x62,0xe5,0x98,0x11,0xdf,0x1b,0xc5,
 0xd9,0xb4,0xf5,0xf0,0xf7,0xc5,0x7c,0x22,0xcd,0x7e,0xd6,0xdb,
 0x4d,0x15,0x3e,0x3a,
};
const unsigned char tc_sid_out_oc[] = {
 0x7c,0xe2,0x70,0x43,0xd1,0xb1,0xd0,0xd0,0xe0,0x2e,0x16,0x97,
 0x96,0x37,0xe2,0xa0,0x05,0x47,0xed,0x6e,0x15,0xea,0x98,0x8f,
 0x7d,0x3c,0x9b,0x3c,0x21,0x59,0xb2,0x6a,0xb3,0x83,0x4b,0xff,
 0x7f,0xf8,0x62,0x40,0x32,0x3e,0x25,0x21,0x6b,0xa2,0xee,0x6e,
 0xa6,0xe1,0x58,0x25,0x02,0x01,0x7f,0x8e,0x6d,0x65,0xf8,0xc4,
 0xa5,0xe6,0x55,0x43,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-15">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIjlBNzAwRUNDMz
 #c4RUI5OEU1NzM4N0RGNDU2RDVCNEI0RjFEQ0VFQkJCMTM3MTUyN0VFQjdFMUJGQkFC
 #NjRFQ0M5QzkzMDMzOTYxNDVCQTA0RjVCNUFFQTVCQUVERkE2MUYzMUYwMEZCQzVGRD
 #U2MDYiLCAieWEiOiAiMzNENTYxRjEzQ0ZDMERDQTI3OUMzMEU4Q0RFODk1MTc1REMy
 #NTQ4Mzg5MjgxOUVCQTEzMkQ1OEMxM0MwNDYyQThFQjBENzNGREE5NDE5NTA1OTRCRU
 #Y1MTkxRDgzOTQ2OTFGODZFREZGQ0FENkMxRSIsICJBRGEiOiAiNDE0NDYxIiwgIllh
 #IjogIjYyN0Y4QkIyQUU5NDVFMkE1MTg5NjdERjlCMDBBRkYxOTI1M0QzMDg2Mzk4Rj
 #JFQzE4QkU4NDZDQzBEMUYyODZDMkNFM0NBRjFEQTYzOTg1OUNDRDJBNkEwMUE5Mzcy
 #QTE3RTY2QkI3MDA2RTU3MUIiLCAieWIiOiAiMjUyM0M5NjlGNjhGQTJCMkFFQTI5NE
 #MyNTM5RUYzNkVCMUUwNTU4QUJEMTQ3MTJBNzgyOEYxNkE4NUVEMkM3RTc3RTJCREQ0
 #MTg5OTQ0MDVGQjFCNTdCNkJCQUFERDY2ODQ5ODkyQUFDOUQ4MTQwMiIsICJBRGIiOi
 #AiNDE0NDYyIiwgIlliIjogIjhFOTgxMUU0NDAyRkFDMDk4NzQzQ0E3QjJCNTA5Qjkx
 #QjM4QzhDRjEzNjBDQzZDQUIzMDExODcxNzAxOTc4MkI3RjU4QTU5MUM2M0Q5QzkyND
 #dCNzc0RTZCMEUwQjgyNkZGNEY4Mzk5Rjk0NzcyREIiLCAiSyI6ICI5NEY0QUU0OTRG
 #NEU4QjA3QURFMzM1NDcyNkVFRTQ5QzU1MThCMzYzQ0RBNTQ0RjVCNDU0MUI5NzMyOD
 #MwQkUzN0VBMEU2M0ZDODNGNTRCRTI4MERFQTA3NDdBMDQzQzc2RDQ3M0UwMTY4OUFG
 #NzdGIiwgIklTS19JUiI6ICI5QzI3MjZBNkNEQTExNzkzNDlDQkMzOEYzMTc2NUVBQj
 #Y0NkEyQTVGMTc2RjMwMTlGQUI0QTBBQUJEOUQxN0MyQkE4OTU5OThDRkY2OThEODAx
 #NzYxQTAwMzUxMkMxQ0Y2N0QxNDRCMjFFMUNCNkQ2QjgyREE3MUQwREE3NkNBRCIsIC
 #JJU0tfU1kiOiAiNkQyMTc4RUQzMDQ4NzAzMDI1QjkwMDdFQzg0QzREOTY5RThEODEz
 #NURGNDU1RTYwOEMxNkFBMTUyRTEyMTlDODZDRUE1NjMyNTQ0MjhBOUQ5Njk5MDNBRT
 #M2NDlEMTA1MERBMUU2RTBDMUMwNjBFMUVCRjczMTZBN0U5OTMzODkiLCAic2lkX291
 #dHB1dF9pciI6ICI2NUJGRkRFMTdCN0FDRjA3Q0ZENDM3QkRCOTczQThGNzM0MEJGOT
 #ExRDM5M0E2MTQ5OEMwQTUwRUYwRDY4QkNBMTAzRkJEQjBGNUI3OTk1MDU1NjJFNTk4
 #MTFERjFCQzVEOUI0RjVGMEY3QzU3QzIyQ0Q3RUQ2REI0RDE1M0UzQSIsICJzaWRfb3
 #V0cHV0X29jIjogIjdDRTI3MDQzRDFCMUQwRDBFMDJFMTY5Nzk2MzdFMkEwMDU0N0VE
 #NkUxNUVBOTg4RjdEM0M5QjNDMjE1OUIyNkFCMzgzNEJGRjdGRjg2MjQwMzIzRTI1Mj
 #E2QkEyRUU2RUE2RTE1ODI1MDIwMTdGOEU2RDY1RjhDNEE1RTY1NTQzIn0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs-1">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    X: (length: 56 bytes)
      601431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    G.scalar_mult(s,decode(X)): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
    G.scalar_mult_vfy(s,X): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-1">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    Y_i1: (length: 56 bytes)
      5f1431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    Y_i2 == G.I: (length: 56 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-16">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJERDFCQzcwMTVEQUFCQjc2NzIxMjlDQzM1QTNCQTgxNT
 #Q4NkIxMzlERUZGOUJERUNBN0E0RkM2MTM0MzIzRDM0NjU4NzYxRTkwRkYwNzk5NzJB
 #N0NBOEFBNTYwNjQ5OEY0RjRGMEVCQzA5MzNBODE5IiwgIlgiOiAiNjAxNDMxRDVFNT
 #FGNDNENDIyQTkyRDNGQjIzNzNCREUyODIxN0FBQjQyNTI0QzM0MUFBNDA0RUFCQTVB
 #QTU1NDFGNzA0MkRCQjMyNTNDRTRDOTBGNzcyQjAzOEE0MTNEQ0IzQTBGNkJGM0FFOU
 #UyMSIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICIzODhCMzVDNjBFQjQx
 #QjY2MDg1QTIxMTgzMTYyMTg2ODFENzg5NzlENjY3NzAyREUxMDVGREMxRjIxRkZFOD
 #g0QTU3N0Q3OTVGNDU2OTE3ODEzOTBBMjI5QTNCRDdCNTI3RTgzMTM4MEYyRjU4NUE0
 #IiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiMzg4QjM1QzYwRUI0MUI2NjA4NU
 #EyMTE4MzE2MjE4NjgxRDc4OTc5RDY2NzcwMkRFMTA1RkRDMUYyMUZGRTg4NEE1NzdE
 #Nzk1RjQ1NjkxNzgxMzkwQTIyOUEzQkQ3QjUyN0U4MzEzODBGMkY1ODVBNCJ9LCAiSW
 #52YWxpZCBZMSI6ICI1RjE0MzFENUU1MUY0M0Q0MjJBOTJEM0ZCMjM3M0JERTI4MjE3
 #QUFCNDI1MjRDMzQxQUE0MDRFQUJBNUFBNTU0MUY3MDQyREJCMzI1M0NFNEM5MEY3Nz
 #JCMDM4QTQxM0RDQjNBMEY2QkYzQUU5RTIxIiwgIkludmFsaWQgWTIiOiAiMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-256-and-hash-sha-256">
        <name>Test vector for CPace using group NIST P-256 and hash SHA-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-256">
          <name>Test vectors for calculate_generator with group NIST P-256</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-256 with input block size 64 bytes.
    PRS = b'Password' ; ZPAD length: 23 ;
    DSI = b'CPaceP256_XMD:SHA-256_SSWU_NU_'
    DST = b'CPaceP256_XMD:SHA-256_SSWU_NU__DST'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 34b36454cab2e7842c389f7d88ecb7df
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 108 bytes)
      1e4350616365503235365f584d443a5348412d3235365f535357555f
      4e555f0850617373776f726417000000000000000000000000000000
      00000000000000001a6f630b425f726573706f6e6465720b415f696e
      69746961746f721034b36454cab2e7842c389f7d88ecb7df
    generator g: (length: 65 bytes)
      04eee577320b1c241a79419fcde5718c2b63f81ef8717d56a57d2fb2
      6b65a8beb63573b52605efb32ff4cf31aaef9a92df84e4e8408cc6c7
      cf27a535aad2b38a56
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-17">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0yNTYiLCAiSC5zX2luX2J5dGVzIjogNjQsICJQUlMiOiAiNTA2MT
 #czNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDIzLCAiRFNJIjogIjQzNTA2MTYz
 #NjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4NDEyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNT
 #U1RiIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2
 #RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIzNEIzNjQ1NENBQjJFNzg0MkMzODlGN0
 #Q4OEVDQjdERiIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5z
 #X2luX2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4ND
 #EyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDE3MDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2Mz
 #BCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEw
 #MzRCMzY0NTRDQUIyRTc4NDJDMzg5RjdEODhFQ0I3REYiLCAiZ2VuZXJhdG9yIGciOi
 #AiMDRFRUU1NzczMjBCMUMyNDFBNzk0MTlGQ0RFNTcxOEMyQjYzRjgxRUY4NzE3RDU2
 #QTU3RDJGQjI2QjY1QThCRUI2MzU3M0I1MjYwNUVGQjMyRkY0Q0YzMUFBRUY5QTkyRE
 #Y4NEU0RTg0MDhDQzZDN0NGMjdBNTM1QUFEMkIzOEE1NiJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-4">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 32 bytes)
      37574cfbf1b95ff6a8e2d7be462d4d01e6dde2618f34f4de9df869b2
      4f532c5d
  Outputs
    Ya: (length: 65 bytes)
      041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364
      692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c5d
      fdfc2ecdf8e42c5e16
    Alternative correct value for Ya: (-ya)*g:
    (length: 65 bytes)
      041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364
      692fdace1715a59cb0e63df85b2ad1529397e85e9c30d0d01dbf93a2
      0203d132071bd3a1e9
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-4">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 32 bytes)
      e5672fc9eb4e721f41d80181ec4c9fd9886668acc48024d33c82bb10
      2aecba52
  Outputs
    Yb: (length: 65 bytes)
      046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a
      cc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5ce8b677
      a7e38a26f752bf8f84
    Alternative correct value for Yb: (-yb)*g:
    (length: 65 bytes)
      046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a
      cc8ec3544890612d15def6ece092e1c0a1b9c2d2cdf3b0e0a4174988
      581c75d908ad40707b
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-4">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d
      7b8f6b6c
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d
      7b8f6b6c
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-4">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 140 bytes)
      41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e13
      64692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c
      5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8cd
      786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e921091320
      6d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f8403414462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 225 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f
      8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b
      6c41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e
      1364692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe340
      6c5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8
      cd786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e9210913
      206d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f84034144
      62
    ISK result: (length: 32 bytes)
      9565ed286b6e3cf1f943fd31746f9a22935537025a1328d4980005ba
      984f0c39
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-4">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 142 bytes)
      6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1
      617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5c
      e8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24fc0
      4c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19c2
      07a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e160341
      4461
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 227 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f
      8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b
      6c6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158c
      e1617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f
      5ce8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24f
      c04c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19
      c207a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e1603
      414461
    ISK result: (length: 32 bytes)
      62a445a4daa3546dd031c66ead2e4e015abbcc83bde31c90f841149f
      d441c58a
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-4">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      a7386d1c2eb06e8056d7fecbcf691e08d189d96236020ef31b414069
      8a4b99f9
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      d337dbc0dd797b4e6f2f14ea4925c58e5d5523871e8cb43a3c1b0f2b
      1a1ffde3
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-4">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x34,0xb3,0x64,0x54,0xca,0xb2,0xe7,0x84,0x2c,0x38,0x9f,0x7d,
 0x88,0xec,0xb7,0xdf,
};
const unsigned char tc_g[] = {
 0x04,0xee,0xe5,0x77,0x32,0x0b,0x1c,0x24,0x1a,0x79,0x41,0x9f,
 0xcd,0xe5,0x71,0x8c,0x2b,0x63,0xf8,0x1e,0xf8,0x71,0x7d,0x56,
 0xa5,0x7d,0x2f,0xb2,0x6b,0x65,0xa8,0xbe,0xb6,0x35,0x73,0xb5,
 0x26,0x05,0xef,0xb3,0x2f,0xf4,0xcf,0x31,0xaa,0xef,0x9a,0x92,
 0xdf,0x84,0xe4,0xe8,0x40,0x8c,0xc6,0xc7,0xcf,0x27,0xa5,0x35,
 0xaa,0xd2,0xb3,0x8a,0x56,
};
const unsigned char tc_ya[] = {
 0x37,0x57,0x4c,0xfb,0xf1,0xb9,0x5f,0xf6,0xa8,0xe2,0xd7,0xbe,
 0x46,0x2d,0x4d,0x01,0xe6,0xdd,0xe2,0x61,0x8f,0x34,0xf4,0xde,
 0x9d,0xf8,0x69,0xb2,0x4f,0x53,0x2c,0x5d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x1f,0x12,0xad,0x5f,0xc6,0x50,0x10,0xa2,0x4f,0xc0,0x4c,
 0x86,0x19,0x71,0x09,0xa3,0x6d,0xf0,0xe9,0xce,0x85,0xa7,0x47,
 0x9e,0x1e,0x13,0x64,0x69,0x2f,0xda,0xce,0x17,0xea,0x5a,0x63,
 0x4e,0x19,0xc2,0x07,0xa5,0xd5,0x2e,0xad,0x6c,0x68,0x17,0xa1,
 0x63,0xcf,0x2f,0x2f,0xe3,0x40,0x6c,0x5d,0xfd,0xfc,0x2e,0xcd,
 0xf8,0xe4,0x2c,0x5e,0x16,
};
const unsigned char tc_yb[] = {
 0xe5,0x67,0x2f,0xc9,0xeb,0x4e,0x72,0x1f,0x41,0xd8,0x01,0x81,
 0xec,0x4c,0x9f,0xd9,0x88,0x66,0x68,0xac,0xc4,0x80,0x24,0xd3,
 0x3c,0x82,0xbb,0x10,0x2a,0xec,0xba,0x52,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x6a,0x51,0x18,0x0b,0x6e,0xba,0xba,0xf5,0xed,0x0a,0xf8,
 0xcd,0x78,0x68,0x86,0xd9,0x33,0x42,0xbc,0xae,0x4c,0x15,0x8c,
 0xe1,0x61,0x7a,0x0a,0xcc,0x8e,0xc3,0x54,0x48,0x6f,0x9e,0xd2,
 0xe9,0x21,0x09,0x13,0x20,0x6d,0x1e,0x3f,0x5e,0x46,0x3d,0x2d,
 0x32,0x0c,0x4f,0x1f,0x5c,0xe8,0xb6,0x77,0xa7,0xe3,0x8a,0x26,
 0xf7,0x52,0xbf,0x8f,0x84,
};
const unsigned char tc_K[] = {
 0x3e,0x0e,0x2f,0x89,0x76,0xfb,0x8d,0x0d,0xee,0xe3,0x0a,0xef,
 0x4b,0x5c,0xd3,0x63,0x1e,0xed,0x24,0x9a,0xf3,0x2f,0x53,0xd0,
 0xdd,0x00,0x9b,0x5d,0x7b,0x8f,0x6b,0x6c,
};
const unsigned char tc_ISK_IR[] = {
 0x95,0x65,0xed,0x28,0x6b,0x6e,0x3c,0xf1,0xf9,0x43,0xfd,0x31,
 0x74,0x6f,0x9a,0x22,0x93,0x55,0x37,0x02,0x5a,0x13,0x28,0xd4,
 0x98,0x00,0x05,0xba,0x98,0x4f,0x0c,0x39,
};
const unsigned char tc_ISK_SY[] = {
 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e,
 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90,
 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a,
};
const unsigned char tc_ISK_SY[] = {
 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e,
 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90,
 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a,
};
const unsigned char tc_sid_out_ir[] = {
 0xa7,0x38,0x6d,0x1c,0x2e,0xb0,0x6e,0x80,0x56,0xd7,0xfe,0xcb,
 0xcf,0x69,0x1e,0x08,0xd1,0x89,0xd9,0x62,0x36,0x02,0x0e,0xf3,
 0x1b,0x41,0x40,0x69,0x8a,0x4b,0x99,0xf9,
};
const unsigned char tc_sid_out_oc[] = {
 0xd3,0x37,0xdb,0xc0,0xdd,0x79,0x7b,0x4e,0x6f,0x2f,0x14,0xea,
 0x49,0x25,0xc5,0x8e,0x5d,0x55,0x23,0x87,0x1e,0x8c,0xb4,0x3a,
 0x3c,0x1b,0x0f,0x2b,0x1a,0x1f,0xfd,0xe3,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-18">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIz
 #NEIzNjQ1NENBQjJFNzg0MkMzODlGN0Q4OEVDQjdERiIsICJnIjogIjA0RUVFNTc3Mz
 #IwQjFDMjQxQTc5NDE5RkNERTU3MThDMkI2M0Y4MUVGODcxN0Q1NkE1N0QyRkIyNkI2
 #NUE4QkVCNjM1NzNCNTI2MDVFRkIzMkZGNENGMzFBQUVGOUE5MkRGODRFNEU4NDA4Q0
 #M2QzdDRjI3QTUzNUFBRDJCMzhBNTYiLCAieWEiOiAiMzc1NzRDRkJGMUI5NUZGNkE4
 #RTJEN0JFNDYyRDREMDFFNkRERTI2MThGMzRGNERFOURGODY5QjI0RjUzMkM1RCIsIC
 #JBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MUYxMkFENUZDNjUwMTBBMjRGQzA0Qzg2
 #MTk3MTA5QTM2REYwRTlDRTg1QTc0NzlFMUUxMzY0NjkyRkRBQ0UxN0VBNUE2MzRFMT
 #lDMjA3QTVENTJFQUQ2QzY4MTdBMTYzQ0YyRjJGRTM0MDZDNURGREZDMkVDREY4RTQy
 #QzVFMTYiLCAieWIiOiAiRTU2NzJGQzlFQjRFNzIxRjQxRDgwMTgxRUM0QzlGRDk4OD
 #Y2NjhBQ0M0ODAyNEQzM0M4MkJCMTAyQUVDQkE1MiIsICJBRGIiOiAiNDE0NDYyIiwg
 #IlliIjogIjA0NkE1MTE4MEI2RUJBQkFGNUVEMEFGOENENzg2ODg2RDkzMzQyQkNBRT
 #RDMTU4Q0UxNjE3QTBBQ0M4RUMzNTQ0ODZGOUVEMkU5MjEwOTEzMjA2RDFFM0Y1RTQ2
 #M0QyRDMyMEM0RjFGNUNFOEI2NzdBN0UzOEEyNkY3NTJCRjhGODQiLCAiSyI6ICIzRT
 #BFMkY4OTc2RkI4RDBERUVFMzBBRUY0QjVDRDM2MzFFRUQyNDlBRjMyRjUzRDBERDAw
 #OUI1RDdCOEY2QjZDIiwgIklTS19JUiI6ICI5NTY1RUQyODZCNkUzQ0YxRjk0M0ZEMz
 #E3NDZGOUEyMjkzNTUzNzAyNUExMzI4RDQ5ODAwMDVCQTk4NEYwQzM5IiwgIklTS19T
 #WSI6ICI2MkE0NDVBNERBQTM1NDZERDAzMUM2NkVBRDJFNEUwMTVBQkJDQzgzQkRFMz
 #FDOTBGODQxMTQ5RkQ0NDFDNThBIiwgInNpZF9vdXRwdXRfaXIiOiAiQTczODZEMUMy
 #RUIwNkU4MDU2RDdGRUNCQ0Y2OTFFMDhEMTg5RDk2MjM2MDIwRUYzMUI0MTQwNjk4QT
 #RCOTlGOSIsICJzaWRfb3V0cHV0X29jIjogIkQzMzdEQkMwREQ3OTdCNEU2RjJGMTRF
 #QTQ5MjVDNThFNUQ1NTIzODcxRThDQjQzQTNDMUIwRjJCMUExRkZERTMifQ==
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    X: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5831
    G.scalar_mult(s,X) (full coordinates): (length: 65 bytes)
      04f5a191f078c87c36633b78c701751159d56c59f3fe9105b5720673
      470f303ab925b6a7fd1cdd8f649a21cf36b68d9e9c4a11919a951892
      519786104b27033757
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 32 bytes)
      f5a191f078c87c36633b78c701751159d56c59f3fe9105b572067347
      0f303ab9
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-2">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    Y_i1: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5857
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-19">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJGMDEyNTAxQzA5MUZGOUI5OUExMjNGRkZFNTcxRDhCQz
 #AxRTgwNzdFRTU4MTM2MkUxQkQyMTM5OTA4MzU2NDNCIiwgIlgiOiAiMDQyNDY0OEVC
 #OTg2QzJCRTBBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRD
 #EyQkE0RTBGNzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3
 #MzQ2RDEwQTRBQjI1MTRGQUVGNTgzMSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bG
 #wgY29vcmRpbmF0ZXMpIjogIjA0RjVBMTkxRjA3OEM4N0MzNjYzM0I3OEM3MDE3NTEx
 #NTlENTZDNTlGM0ZFOTEwNUI1NzIwNjczNDcwRjMwM0FCOTI1QjZBN0ZEMUNERDhGNj
 #Q5QTIxQ0YzNkI2OEQ5RTlDNEExMTkxOUE5NTE4OTI1MTk3ODYxMDRCMjcwMzM3NTci
 #LCAiRy5zY2FsYXJfbXVsdF92ZnkocyxYKSAob25seSBYLWNvb3JkaW5hdGUpIjogIk
 #Y1QTE5MUYwNzhDODdDMzY2MzNCNzhDNzAxNzUxMTU5RDU2QzU5RjNGRTkxMDVCNTcy
 #MDY3MzQ3MEYzMDNBQjkifSwgIkludmFsaWQgWTEiOiAiMDQyNDY0OEVCOTg2QzJCRT
 #BBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRDEyQkE0RTBG
 #NzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3MzQ2RDEwQT
 #RBQjI1MTRGQUVGNTg1NyIsICJJbnZhbGlkIFkyIjogIjAwIn0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-384-and-hash-sha-384">
        <name>Test vector for CPace using group NIST P-384 and hash SHA-384</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-384">
          <name>Test vectors for calculate_generator with group NIST P-384</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-384 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP384_XMD:SHA-384_SSWU_NU_'
    DST = b'CPaceP384_XMD:SHA-384_SSWU_NU__DST'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5b3773aa90e8f23c61563a4b645b276c
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      1e4350616365503338345f584d443a5348412d3338345f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72105b3773aa90e8f23c61563a4b
      645b276c
    generator g: (length: 97 bytes)
      04ffe1bdc3293fdbe31b2959916e52c018e923eac99836bd9a1cbeec
      794a8d4d78baa32cdafc9685bc1067a780f4ad9c8a6c6e164aa42906
      d1e27f782581adc8e0109219626a2b8fbdc34602e4084554bdd6c0c6
      98dd657ac8e31b2bcce1c7b0d8
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-20">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0zODQiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0ODQxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5
 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiNUIzNzczQUE5MEU4RjIzQzYxNTYzQT
 #RCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu
 #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0OD
 #QxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0
 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwNUIzNzczQUE5MEU4RjIzQzYxNT
 #YzQTRCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yIGciOiAiMDRGRkUxQkRDMzI5M0ZEQkUz
 #MUIyOTU5OTE2RTUyQzAxOEU5MjNFQUM5OTgzNkJEOUExQ0JFRUM3OTRBOEQ0RDc4Qk
 #FBMzJDREFGQzk2ODVCQzEwNjdBNzgwRjRBRDlDOEE2QzZFMTY0QUE0MjkwNkQxRTI3
 #Rjc4MjU4MUFEQzhFMDEwOTIxOTYyNkEyQjhGQkRDMzQ2MDJFNDA4NDU1NEJERDZDME
 #M2OThERDY1N0FDOEUzMUIyQkNDRTFDN0IwRDgifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-5">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 48 bytes)
      ef433dd5ad142c860e7cb6400dd315d388d5ec5420c550e9d6f0907f
      375d988bc4d704837e43561c497e7dd93edcdb9d
  Outputs
    Ya: (length: 97 bytes)
      0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7
      3b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993a3
      6285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1770050
      a94d6826d52f211b234792e66d
    Alternative correct value for Ya: (-ya)*g:
    (length: 97 bytes)
      0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7
      3b96fa1ec78619c5a1e524472778331fbe009fa156b5cdfc1bd66c5c
      9d7a05ab193dbe7b02dd8ba737887e41e9000b924368f33e4d88ffaf
      55b297d92ad0dee4ddb86d1992
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-5">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 48 bytes)
      50b0e36b95a2edfaa8342b843dddc90b175330f2399c1b36586dedda
      3c255975f30be6a750f9404fccc62a6323b5e471
  Outputs
    Yb: (length: 97 bytes)
      040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d
      104cdaeb630b7c5c18748deb25653ad2a4cb5e6274841cad328bb031
      2628b9b1f51bea72b8c610999a6730f752649205ae85c452ef83f98b
      e715cd0103186874b07cf02074
    Alternative correct value for Yb: (-yb)*g:
    (length: 97 bytes)
      040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d
      104cdaeb630b7c5c18748deb25653ad2a4cb5e62747be352cd744fce
      d9d7464e0ae4158d4739ef666598cf08ad9b6dfa517a3bad0f7c0674
      17ea32fefce7978b50830fdf8b
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-5">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 48 bytes)
      a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6
      db858fe161de7576206a8a35bd4a60e00724fd3e
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6
      db858fe161de7576206a8a35bd4a60e00724fd3e
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-5">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 204 bytes)
      610434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310
      b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993
      a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b17700
      50a94d6826d52f211b234792e66d0341446161040a6559147fd492ad
      74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c5c18
      748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea72b8
      c610999a6730f752649205ae85c452ef83f98be715cd0103186874b0
      7cf0207403414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 305 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae
      a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f
      e161de7576206a8a35bd4a60e00724fd3e610434a04da121995d81d7
      c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5a1e5
      24472778331fbe009fa1564a3203e42993a36285fa54e6c24184fd22
      7458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b2347
      92e66d0341446161040a6559147fd492ad74ab1f4def6196fd639954
      0e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb5e62
      74841cad328bb0312628b9b1f51bea72b8c610999a6730f752649205
      ae85c452ef83f98be715cd0103186874b07cf0207403414462
    ISK result: (length: 48 bytes)
      d1b74375c7d63d7de246cbf3fc2b3092645c73a0aa816989c0de6048
      ed4ece6a54df82d05d2be3498cb9288be7bdbdb9
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-5">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 206 bytes)
      6f63610434a04da121995d81d7c5ded02cf2e70954dca49059485ea3
      8310b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e4
      2993a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1
      770050a94d6826d52f211b234792e66d0341446161040a6559147fd4
      92ad74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c
      5c18748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea
      72b8c610999a6730f752649205ae85c452ef83f98be715cd01031868
      74b07cf0207403414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 307 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae
      a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f
      e161de7576206a8a35bd4a60e00724fd3e6f63610434a04da121995d
      81d7c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5
      a1e524472778331fbe009fa1564a3203e42993a36285fa54e6c24184
      fd227458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b
      234792e66d0341446161040a6559147fd492ad74ab1f4def6196fd63
      99540e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb
      5e6274841cad328bb0312628b9b1f51bea72b8c610999a6730f75264
      9205ae85c452ef83f98be715cd0103186874b07cf0207403414462
    ISK result: (length: 48 bytes)
      a051d4532ca9fb6774e097ebac69c1d6a18144a15421dc155d0b1e8a
      ef9f9d8c0fe86e85d3cbee7796ff50171f42801b
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-5">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      8d5a03946a69ffa12cd6efd469fe8671bbc25fad6db2656f3963c94e
      9c940bdecc2bd555474c211817787d5cf7870ed1
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      c0729db25db40c48a35f787d5410b2cb9a2d9f5e9cf1cf159ed2f63c
      6b2185e597e176cc221422e9496eeda2bf123c8b
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-5">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x5b,0x37,0x73,0xaa,0x90,0xe8,0xf2,0x3c,0x61,0x56,0x3a,0x4b,
 0x64,0x5b,0x27,0x6c,
};
const unsigned char tc_g[] = {
 0x04,0xff,0xe1,0xbd,0xc3,0x29,0x3f,0xdb,0xe3,0x1b,0x29,0x59,
 0x91,0x6e,0x52,0xc0,0x18,0xe9,0x23,0xea,0xc9,0x98,0x36,0xbd,
 0x9a,0x1c,0xbe,0xec,0x79,0x4a,0x8d,0x4d,0x78,0xba,0xa3,0x2c,
 0xda,0xfc,0x96,0x85,0xbc,0x10,0x67,0xa7,0x80,0xf4,0xad,0x9c,
 0x8a,0x6c,0x6e,0x16,0x4a,0xa4,0x29,0x06,0xd1,0xe2,0x7f,0x78,
 0x25,0x81,0xad,0xc8,0xe0,0x10,0x92,0x19,0x62,0x6a,0x2b,0x8f,
 0xbd,0xc3,0x46,0x02,0xe4,0x08,0x45,0x54,0xbd,0xd6,0xc0,0xc6,
 0x98,0xdd,0x65,0x7a,0xc8,0xe3,0x1b,0x2b,0xcc,0xe1,0xc7,0xb0,
 0xd8,
};
const unsigned char tc_ya[] = {
 0xef,0x43,0x3d,0xd5,0xad,0x14,0x2c,0x86,0x0e,0x7c,0xb6,0x40,
 0x0d,0xd3,0x15,0xd3,0x88,0xd5,0xec,0x54,0x20,0xc5,0x50,0xe9,
 0xd6,0xf0,0x90,0x7f,0x37,0x5d,0x98,0x8b,0xc4,0xd7,0x04,0x83,
 0x7e,0x43,0x56,0x1c,0x49,0x7e,0x7d,0xd9,0x3e,0xdc,0xdb,0x9d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x34,0xa0,0x4d,0xa1,0x21,0x99,0x5d,0x81,0xd7,0xc5,0xde,
 0xd0,0x2c,0xf2,0xe7,0x09,0x54,0xdc,0xa4,0x90,0x59,0x48,0x5e,
 0xa3,0x83,0x10,0xb7,0x3b,0x96,0xfa,0x1e,0xc7,0x86,0x19,0xc5,
 0xa1,0xe5,0x24,0x47,0x27,0x78,0x33,0x1f,0xbe,0x00,0x9f,0xa1,
 0x56,0x4a,0x32,0x03,0xe4,0x29,0x93,0xa3,0x62,0x85,0xfa,0x54,
 0xe6,0xc2,0x41,0x84,0xfd,0x22,0x74,0x58,0xc8,0x77,0x81,0xbe,
 0x16,0xff,0xf4,0x6d,0xbc,0x97,0x0c,0xc1,0xb1,0x77,0x00,0x50,
 0xa9,0x4d,0x68,0x26,0xd5,0x2f,0x21,0x1b,0x23,0x47,0x92,0xe6,
 0x6d,
};
const unsigned char tc_yb[] = {
 0x50,0xb0,0xe3,0x6b,0x95,0xa2,0xed,0xfa,0xa8,0x34,0x2b,0x84,
 0x3d,0xdd,0xc9,0x0b,0x17,0x53,0x30,0xf2,0x39,0x9c,0x1b,0x36,
 0x58,0x6d,0xed,0xda,0x3c,0x25,0x59,0x75,0xf3,0x0b,0xe6,0xa7,
 0x50,0xf9,0x40,0x4f,0xcc,0xc6,0x2a,0x63,0x23,0xb5,0xe4,0x71,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x0a,0x65,0x59,0x14,0x7f,0xd4,0x92,0xad,0x74,0xab,0x1f,
 0x4d,0xef,0x61,0x96,0xfd,0x63,0x99,0x54,0x0e,0x84,0x70,0x62,
 0x27,0xa1,0xf9,0x0d,0x10,0x4c,0xda,0xeb,0x63,0x0b,0x7c,0x5c,
 0x18,0x74,0x8d,0xeb,0x25,0x65,0x3a,0xd2,0xa4,0xcb,0x5e,0x62,
 0x74,0x84,0x1c,0xad,0x32,0x8b,0xb0,0x31,0x26,0x28,0xb9,0xb1,
 0xf5,0x1b,0xea,0x72,0xb8,0xc6,0x10,0x99,0x9a,0x67,0x30,0xf7,
 0x52,0x64,0x92,0x05,0xae,0x85,0xc4,0x52,0xef,0x83,0xf9,0x8b,
 0xe7,0x15,0xcd,0x01,0x03,0x18,0x68,0x74,0xb0,0x7c,0xf0,0x20,
 0x74,
};
const unsigned char tc_K[] = {
 0xa9,0xac,0xae,0xa9,0x56,0x92,0xa6,0x44,0x62,0x06,0x7f,0xe8,
 0xe4,0x32,0x1f,0x2f,0xca,0x97,0x93,0xa8,0xa0,0x42,0x0f,0x0e,
 0x25,0x3e,0xd0,0xd6,0xdb,0x85,0x8f,0xe1,0x61,0xde,0x75,0x76,
 0x20,0x6a,0x8a,0x35,0xbd,0x4a,0x60,0xe0,0x07,0x24,0xfd,0x3e,
};
const unsigned char tc_ISK_IR[] = {
 0xd1,0xb7,0x43,0x75,0xc7,0xd6,0x3d,0x7d,0xe2,0x46,0xcb,0xf3,
 0xfc,0x2b,0x30,0x92,0x64,0x5c,0x73,0xa0,0xaa,0x81,0x69,0x89,
 0xc0,0xde,0x60,0x48,0xed,0x4e,0xce,0x6a,0x54,0xdf,0x82,0xd0,
 0x5d,0x2b,0xe3,0x49,0x8c,0xb9,0x28,0x8b,0xe7,0xbd,0xbd,0xb9,
};
const unsigned char tc_ISK_SY[] = {
 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb,
 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15,
 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85,
 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b,
};
const unsigned char tc_ISK_SY[] = {
 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb,
 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15,
 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85,
 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b,
};
const unsigned char tc_sid_out_ir[] = {
 0x8d,0x5a,0x03,0x94,0x6a,0x69,0xff,0xa1,0x2c,0xd6,0xef,0xd4,
 0x69,0xfe,0x86,0x71,0xbb,0xc2,0x5f,0xad,0x6d,0xb2,0x65,0x6f,
 0x39,0x63,0xc9,0x4e,0x9c,0x94,0x0b,0xde,0xcc,0x2b,0xd5,0x55,
 0x47,0x4c,0x21,0x18,0x17,0x78,0x7d,0x5c,0xf7,0x87,0x0e,0xd1,
};
const unsigned char tc_sid_out_oc[] = {
 0xc0,0x72,0x9d,0xb2,0x5d,0xb4,0x0c,0x48,0xa3,0x5f,0x78,0x7d,
 0x54,0x10,0xb2,0xcb,0x9a,0x2d,0x9f,0x5e,0x9c,0xf1,0xcf,0x15,
 0x9e,0xd2,0xf6,0x3c,0x6b,0x21,0x85,0xe5,0x97,0xe1,0x76,0xcc,
 0x22,0x14,0x22,0xe9,0x49,0x6e,0xed,0xa2,0xbf,0x12,0x3c,0x8b,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-21">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #QjM3NzNBQTkwRThGMjNDNjE1NjNBNEI2NDVCMjc2QyIsICJnIjogIjA0RkZFMUJEQz
 #MyOTNGREJFMzFCMjk1OTkxNkU1MkMwMThFOTIzRUFDOTk4MzZCRDlBMUNCRUVDNzk0
 #QThENEQ3OEJBQTMyQ0RBRkM5Njg1QkMxMDY3QTc4MEY0QUQ5QzhBNkM2RTE2NEFBND
 #I5MDZEMUUyN0Y3ODI1ODFBREM4RTAxMDkyMTk2MjZBMkI4RkJEQzM0NjAyRTQwODQ1
 #NTRCREQ2QzBDNjk4REQ2NTdBQzhFMzFCMkJDQ0UxQzdCMEQ4IiwgInlhIjogIkVGND
 #MzREQ1QUQxNDJDODYwRTdDQjY0MDBERDMxNUQzODhENUVDNTQyMEM1NTBFOUQ2RjA5
 #MDdGMzc1RDk4OEJDNEQ3MDQ4MzdFNDM1NjFDNDk3RTdERDkzRURDREI5RCIsICJBRG
 #EiOiAiNDE0NDYxIiwgIllhIjogIjA0MzRBMDREQTEyMTk5NUQ4MUQ3QzVERUQwMkNG
 #MkU3MDk1NERDQTQ5MDU5NDg1RUEzODMxMEI3M0I5NkZBMUVDNzg2MTlDNUExRTUyND
 #Q3Mjc3ODMzMUZCRTAwOUZBMTU2NEEzMjAzRTQyOTkzQTM2Mjg1RkE1NEU2QzI0MTg0
 #RkQyMjc0NThDODc3ODFCRTE2RkZGNDZEQkM5NzBDQzFCMTc3MDA1MEE5NEQ2ODI2RD
 #UyRjIxMUIyMzQ3OTJFNjZEIiwgInliIjogIjUwQjBFMzZCOTVBMkVERkFBODM0MkI4
 #NDNERERDOTBCMTc1MzMwRjIzOTlDMUIzNjU4NkRFRERBM0MyNTU5NzVGMzBCRTZBNz
 #UwRjk0MDRGQ0NDNjJBNjMyM0I1RTQ3MSIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjog
 #IjA0MEE2NTU5MTQ3RkQ0OTJBRDc0QUIxRjRERUY2MTk2RkQ2Mzk5NTQwRTg0NzA2Mj
 #I3QTFGOTBEMTA0Q0RBRUI2MzBCN0M1QzE4NzQ4REVCMjU2NTNBRDJBNENCNUU2Mjc0
 #ODQxQ0FEMzI4QkIwMzEyNjI4QjlCMUY1MUJFQTcyQjhDNjEwOTk5QTY3MzBGNzUyNj
 #Q5MjA1QUU4NUM0NTJFRjgzRjk4QkU3MTVDRDAxMDMxODY4NzRCMDdDRjAyMDc0Iiwg
 #IksiOiAiQTlBQ0FFQTk1NjkyQTY0NDYyMDY3RkU4RTQzMjFGMkZDQTk3OTNBOEEwND
 #IwRjBFMjUzRUQwRDZEQjg1OEZFMTYxREU3NTc2MjA2QThBMzVCRDRBNjBFMDA3MjRG
 #RDNFIiwgIklTS19JUiI6ICJEMUI3NDM3NUM3RDYzRDdERTI0NkNCRjNGQzJCMzA5Mj
 #Y0NUM3M0EwQUE4MTY5ODlDMERFNjA0OEVENEVDRTZBNTRERjgyRDA1RDJCRTM0OThD
 #QjkyODhCRTdCREJEQjkiLCAiSVNLX1NZIjogIkEwNTFENDUzMkNBOUZCNjc3NEUwOT
 #dFQkFDNjlDMUQ2QTE4MTQ0QTE1NDIxREMxNTVEMEIxRThBRUY5RjlEOEMwRkU4NkU4
 #NUQzQ0JFRTc3OTZGRjUwMTcxRjQyODAxQiIsICJzaWRfb3V0cHV0X2lyIjogIjhENU
 #EwMzk0NkE2OUZGQTEyQ0Q2RUZENDY5RkU4NjcxQkJDMjVGQUQ2REIyNjU2RjM5NjND
 #OTRFOUM5NDBCREVDQzJCRDU1NTQ3NEMyMTE4MTc3ODdENUNGNzg3MEVEMSIsICJzaW
 #Rfb3V0cHV0X29jIjogIkMwNzI5REIyNURCNDBDNDhBMzVGNzg3RDU0MTBCMkNCOUEy
 #RDlGNUU5Q0YxQ0YxNTlFRDJGNjNDNkIyMTg1RTU5N0UxNzZDQzIyMTQyMkU5NDk2RU
 #VEQTJCRjEyM0M4QiJ9
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-1">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    X: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f4036e
    G.scalar_mult(s,X) (full coordinates): (length: 97 bytes)
      0465c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f6105873
      3173a033cda76c3e3ea5352b804e67fdbe2e334be8245dad5c8c993e
      63bacf0456478f29b71b6c859f13676f84ff150d2741f028f560584a
      0bdba19a63df62c08949c2fd6d
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 48 bytes)
      65c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f610587331
      73a033cda76c3e3ea5352b804e67fdbe2e334be8
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-3">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    Y_i1: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f40302
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-22">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI2RThBOTlBNUNERDQwOEVBRTk4RTFCOEFFRDI4NkU3Qj
 #EyQURCQkRBQzdGMkM2MjhEOTA2MENFOTJBRTBEOTBCRDU3QTU2NEZEMzUwMEZCQ0NF
 #MzQyNURDOTRCQTBBREUiLCAiWCI6ICIwNDVCNENENTNDNDUwNkNDMDRCQTRDNDRGMj
 #c2MkQ1RDMyQzNFNTVERjI1QjhCQUE1NTcxQjE2NTdBRDk1NzZFRkVBODI1OUYwNjg0
 #REUwNjVBNDcwNTg1QjRCRTg3Njc0OEM3Nzk3MDU0RjNERUZFRjIxQjc3RjgzRDUzQk
 #FDNTdDODlENTJBQTRENkRENTg3MkJEMjgxOTg5QjEzODM1OTY5ODAwOUY4QUMxRjMw
 #MTUzOEJBRENDRTlEOUY0MDM2RSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bGwgY2
 #9vcmRpbmF0ZXMpIjogIjA0NjVDMjhEQjA1RkQ5RjlBOTM2NTFDNUNDMzFFQUU0OUM0
 #RTUyNDZCNDY0ODlCOEY2MTA1ODczMzE3M0EwMzNDREE3NkMzRTNFQTUzNTJCODA0RT
 #Y3RkRCRTJFMzM0QkU4MjQ1REFENUM4Qzk5M0U2M0JBQ0YwNDU2NDc4RjI5QjcxQjZD
 #ODU5RjEzNjc2Rjg0RkYxNTBEMjc0MUYwMjhGNTYwNTg0QTBCREJBMTlBNjNERjYyQz
 #A4OTQ5QzJGRDZEIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29y
 #ZGluYXRlKSI6ICI2NUMyOERCMDVGRDlGOUE5MzY1MUM1Q0MzMUVBRTQ5QzRFNTI0Nk
 #I0NjQ4OUI4RjYxMDU4NzMzMTczQTAzM0NEQTc2QzNFM0VBNTM1MkI4MDRFNjdGREJF
 #MkUzMzRCRTgifSwgIkludmFsaWQgWTEiOiAiMDQ1QjRDRDUzQzQ1MDZDQzA0QkE0Qz
 #Q0RjI3NjJENUQzMkMzRTU1REYyNUI4QkFBNTU3MUIxNjU3QUQ5NTc2RUZFQTgyNTlG
 #MDY4NERFMDY1QTQ3MDU4NUI0QkU4NzY3NDhDNzc5NzA1NEYzREVGRUYyMUI3N0Y4M0
 #Q1M0JBQzU3Qzg5RDUyQUE0RDZERDU4NzJCRDI4MTk4OUIxMzgzNTk2OTgwMDlGOEFD
 #MUYzMDE1MzhCQURDQ0U5RDlGNDAzMDIiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-521-and-hash-sha-512">
        <name>Test vector for CPace using group NIST P-521 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-521">
          <name>Test vectors for calculate_generator with group NIST P-521</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP521_XMD:SHA-512_SSWU_NU_'
    DST = b'CPaceP521_XMD:SHA-512_SSWU_NU__DST'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      1e4350616365503532315f584d443a5348412d3531325f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    generator g: (length: 133 bytes)
      0400e58a8fbf08b38e34a3676f6d690bed58aa4115ff32a57ec87172
      fc2a1fb89d03258c6429c464981b3284b5fedbd1244bf27432008868
      7065b9075dd558e14ed69901d2162db1ba3a49c97dca7c902cb1b96b
      abe21a31942114c860665b35c46b8213f6de17194de54c441083dd11
      63d5907adad8824bb1307dcf6a55c11a8f01d9789b
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-23">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0ODQxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5
 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiN0U0QjQ3OTFENkE4RUYwMTlCOTM2Qz
 #c5RkI3RjJDNTciLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu
 #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0OD
 #QxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0
 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwN0U0QjQ3OTFENkE4RUYwMTlCOT
 #M2Qzc5RkI3RjJDNTciLCAiZ2VuZXJhdG9yIGciOiAiMDQwMEU1OEE4RkJGMDhCMzhF
 #MzRBMzY3NkY2RDY5MEJFRDU4QUE0MTE1RkYzMkE1N0VDODcxNzJGQzJBMUZCODlEMD
 #MyNThDNjQyOUM0NjQ5ODFCMzI4NEI1RkVEQkQxMjQ0QkYyNzQzMjAwODg2ODcwNjVC
 #OTA3NURENTU4RTE0RUQ2OTkwMUQyMTYyREIxQkEzQTQ5Qzk3RENBN0M5MDJDQjFCOT
 #ZCQUJFMjFBMzE5NDIxMTRDODYwNjY1QjM1QzQ2QjgyMTNGNkRFMTcxOTRERTU0QzQ0
 #MTA4M0REMTE2M0Q1OTA3QURBRDg4MjRCQjEzMDdEQ0Y2QTU1QzExQThGMDFEOTc4OU
 #IifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-6">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 66 bytes)
      006367e9c2aeff9f1db19af600cca73343d47cbe446cebbd1ccd783f
      82755a872da86fd0707eb3767c6114f1803deb62d63bdd1e613f67e6
      3e8c141ee5310e3ee819
  Outputs
    Ya: (length: 133 bytes)
      0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f
      30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090
      7312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c43961ef
      60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f12254
      e6f9950dd01fa8e26a8b20736fb63c63c81094f681
    Alternative correct value for Ya: (-ya)*g:
    (length: 133 bytes)
      0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f
      30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090
      7312eb724cddb4dcce675b016752bff0107f1e214b43e8a93bc69e10
      9f47a0d29d12ba7bab1ee9e95a2e20e1a7f69c97de58c99d060eddab
      19066af22fe0571d9574df8c9049c39c37ef6b097e
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-6">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 66 bytes)
      009227bf8dc741dacc9422f8bf3c0e96fce9587bc562eaafe0dc5f6f
      82f28594e4a6f98553560c62b75fa4abb198cecbbb86ebd41b0ea025
      4cde78ac68d39a240ae7
  Outputs
    Yb: (length: 133 bytes)
      0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c
      709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21
      8bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c818
      ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92f4
      03e0fa3207de8bb41b388d81046a298ed8ddac9b2a
    Alternative correct value for Yb: (-yb)*g:
    (length: 133 bytes)
      0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c
      709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21
      8bfaeb3e1ffd9f19bf062d00094ea363c9ae41b3f7450fe113da37e7
      11ed39123b9df9bb4e26830db07978cd2a901ba31871cfd3dde36d0b
      fc1f05cdf821744be4c7727efb95d67127225364d5
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-6">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 66 bytes)
      018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509
      516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30
      832c23d477c991bea8e5
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509
      516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30
      832c23d477c991bea8e5
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-6">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 278 bytes)
      85010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5
      381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff76
      80907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c439
      61ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f1
      2254e6f9950dd01fa8e26a8b20736fb63c63c81094f6810341446185
      010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f7
      0c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa
      218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c8
      18ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92
      f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 397 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e
      7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78
      7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23
      d477c991bea8e585010400c2bfd794467f4438277e85a42e101fa406
      1e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad00985
      7488db7130ff7680907312eb724cddb4dcce675b0098ad400fef80e1
      deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e580963
      6821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094
      f6810341446185010400706ea69b2b7167773248ea6e69a574e9dd2f
      f8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03fc24
      2e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c
      08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56fe45c
      e78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b
      2a03414462
    ISK result: (length: 64 bytes)
      1669a0a29726adc7eea2510d6f7e004a135fa63ac3c9f9e6ce53cba5
      d5e3781aced515956041e43358409a13ef90ddc3c36fd8d7d81424c8
      e94592e21854260a
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-6">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 280 bytes)
      6f6385010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f
      81e5381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130
      ff7680907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756
      c43961ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662
      f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094f681034144
      6185010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e
      07f70c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316af
      e2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec
      25c818ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c22
      1c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 399 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e
      7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78
      7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23
      d477c991bea8e56f6385010400c2bfd794467f4438277e85a42e101f
      a4061e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad0
      09857488db7130ff7680907312eb724cddb4dcce675b0098ad400fef
      80e1deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e58
      09636821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c8
      1094f6810341446185010400706ea69b2b7167773248ea6e69a574e9
      dd2ff8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03
      fc242e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651
      be4c08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56f
      e45ce78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8dd
      ac9b2a03414462
    ISK result: (length: 64 bytes)
      f2f3bd8cd442a4e16659b47a7b7a84f29be75893ed2e5f772d7a3c8b
      779eb0df937a4ec50a4f1ff01ebbaa97d80e090ea69b00a95200ed25
      8e48c6f7e9d8fbc2
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-6">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      56cc3cd8be77cdc84c0d1906de1ffc8ef7cbb326a3f05267b6e8c634
      4e2781eb20ef725e84cb1bb45927435051b4e0fae78e975bf15099f9
      e38d755413eee2fd
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      a46c7189ba6a36c4447741e057da39c885b7d59e08bd2df1852a5271
      f2a8a2e9b187ccd07325a3eede646adee0c06fe58da77f74177896b2
      1053c5d107de006d
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-6">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x04,0x00,0xe5,0x8a,0x8f,0xbf,0x08,0xb3,0x8e,0x34,0xa3,0x67,
 0x6f,0x6d,0x69,0x0b,0xed,0x58,0xaa,0x41,0x15,0xff,0x32,0xa5,
 0x7e,0xc8,0x71,0x72,0xfc,0x2a,0x1f,0xb8,0x9d,0x03,0x25,0x8c,
 0x64,0x29,0xc4,0x64,0x98,0x1b,0x32,0x84,0xb5,0xfe,0xdb,0xd1,
 0x24,0x4b,0xf2,0x74,0x32,0x00,0x88,0x68,0x70,0x65,0xb9,0x07,
 0x5d,0xd5,0x58,0xe1,0x4e,0xd6,0x99,0x01,0xd2,0x16,0x2d,0xb1,
 0xba,0x3a,0x49,0xc9,0x7d,0xca,0x7c,0x90,0x2c,0xb1,0xb9,0x6b,
 0xab,0xe2,0x1a,0x31,0x94,0x21,0x14,0xc8,0x60,0x66,0x5b,0x35,
 0xc4,0x6b,0x82,0x13,0xf6,0xde,0x17,0x19,0x4d,0xe5,0x4c,0x44,
 0x10,0x83,0xdd,0x11,0x63,0xd5,0x90,0x7a,0xda,0xd8,0x82,0x4b,
 0xb1,0x30,0x7d,0xcf,0x6a,0x55,0xc1,0x1a,0x8f,0x01,0xd9,0x78,
 0x9b,
};
const unsigned char tc_ya[] = {
 0x00,0x63,0x67,0xe9,0xc2,0xae,0xff,0x9f,0x1d,0xb1,0x9a,0xf6,
 0x00,0xcc,0xa7,0x33,0x43,0xd4,0x7c,0xbe,0x44,0x6c,0xeb,0xbd,
 0x1c,0xcd,0x78,0x3f,0x82,0x75,0x5a,0x87,0x2d,0xa8,0x6f,0xd0,
 0x70,0x7e,0xb3,0x76,0x7c,0x61,0x14,0xf1,0x80,0x3d,0xeb,0x62,
 0xd6,0x3b,0xdd,0x1e,0x61,0x3f,0x67,0xe6,0x3e,0x8c,0x14,0x1e,
 0xe5,0x31,0x0e,0x3e,0xe8,0x19,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x00,0xc2,0xbf,0xd7,0x94,0x46,0x7f,0x44,0x38,0x27,0x7e,
 0x85,0xa4,0x2e,0x10,0x1f,0xa4,0x06,0x1e,0x1e,0xf6,0xe0,0x5f,
 0x81,0xe5,0x38,0x1f,0x30,0xe7,0x3b,0x34,0x1d,0xd7,0x26,0x08,
 0x9c,0xb6,0xa6,0xbb,0xe5,0xa5,0x09,0xfa,0xd0,0x09,0x85,0x74,
 0x88,0xdb,0x71,0x30,0xff,0x76,0x80,0x90,0x73,0x12,0xeb,0x72,
 0x4c,0xdd,0xb4,0xdc,0xce,0x67,0x5b,0x00,0x98,0xad,0x40,0x0f,
 0xef,0x80,0xe1,0xde,0xb4,0xbc,0x17,0x56,0xc4,0x39,0x61,0xef,
 0x60,0xb8,0x5f,0x2d,0x62,0xed,0x45,0x84,0x54,0xe1,0x16,0x16,
 0xa5,0xd1,0xdf,0x1e,0x58,0x09,0x63,0x68,0x21,0xa7,0x36,0x62,
 0xf9,0xf1,0x22,0x54,0xe6,0xf9,0x95,0x0d,0xd0,0x1f,0xa8,0xe2,
 0x6a,0x8b,0x20,0x73,0x6f,0xb6,0x3c,0x63,0xc8,0x10,0x94,0xf6,
 0x81,
};
const unsigned char tc_yb[] = {
 0x00,0x92,0x27,0xbf,0x8d,0xc7,0x41,0xda,0xcc,0x94,0x22,0xf8,
 0xbf,0x3c,0x0e,0x96,0xfc,0xe9,0x58,0x7b,0xc5,0x62,0xea,0xaf,
 0xe0,0xdc,0x5f,0x6f,0x82,0xf2,0x85,0x94,0xe4,0xa6,0xf9,0x85,
 0x53,0x56,0x0c,0x62,0xb7,0x5f,0xa4,0xab,0xb1,0x98,0xce,0xcb,
 0xbb,0x86,0xeb,0xd4,0x1b,0x0e,0xa0,0x25,0x4c,0xde,0x78,0xac,
 0x68,0xd3,0x9a,0x24,0x0a,0xe7,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x00,0x70,0x6e,0xa6,0x9b,0x2b,0x71,0x67,0x77,0x32,0x48,
 0xea,0x6e,0x69,0xa5,0x74,0xe9,0xdd,0x2f,0xf8,0xa3,0xd0,0x4a,
 0x6e,0x07,0xf7,0x0c,0x70,0x98,0x69,0xca,0x48,0x68,0x27,0xd5,
 0x9f,0x92,0x90,0x59,0x9d,0x1c,0xf9,0x4e,0x1a,0x03,0xfc,0x24,
 0x2e,0x2b,0x13,0x16,0xaf,0xe2,0xfa,0x21,0x8b,0xfa,0xeb,0x3e,
 0x1f,0xfd,0x9f,0x19,0xbf,0x06,0x2d,0x01,0xf6,0xb1,0x5c,0x9c,
 0x36,0x51,0xbe,0x4c,0x08,0xba,0xf0,0x1e,0xec,0x25,0xc8,0x18,
 0xee,0x12,0xc6,0xed,0xc4,0x62,0x06,0x44,0xb1,0xd9,0x7c,0xf2,
 0x4f,0x86,0x87,0x32,0xd5,0x6f,0xe4,0x5c,0xe7,0x8e,0x30,0x2c,
 0x22,0x1c,0x92,0xf4,0x03,0xe0,0xfa,0x32,0x07,0xde,0x8b,0xb4,
 0x1b,0x38,0x8d,0x81,0x04,0x6a,0x29,0x8e,0xd8,0xdd,0xac,0x9b,
 0x2a,
};
const unsigned char tc_K[] = {
 0x01,0x8e,0x0e,0x7e,0x9a,0xde,0x74,0x91,0x7c,0x11,0xc0,0xf6,
 0xb5,0x2f,0x95,0xed,0x87,0x1e,0xab,0x23,0x54,0x37,0xcb,0xee,
 0x8b,0x5c,0x25,0x09,0x51,0x6e,0x78,0x7a,0x80,0xe8,0x25,0xed,
 0x5d,0x53,0x9f,0xa6,0xa0,0xec,0x32,0xc4,0x8f,0xa8,0xfa,0xbe,
 0x85,0x80,0x9d,0x00,0x0d,0x0c,0xfd,0x30,0x83,0x2c,0x23,0xd4,
 0x77,0xc9,0x91,0xbe,0xa8,0xe5,
};
const unsigned char tc_ISK_IR[] = {
 0x16,0x69,0xa0,0xa2,0x97,0x26,0xad,0xc7,0xee,0xa2,0x51,0x0d,
 0x6f,0x7e,0x00,0x4a,0x13,0x5f,0xa6,0x3a,0xc3,0xc9,0xf9,0xe6,
 0xce,0x53,0xcb,0xa5,0xd5,0xe3,0x78,0x1a,0xce,0xd5,0x15,0x95,
 0x60,0x41,0xe4,0x33,0x58,0x40,0x9a,0x13,0xef,0x90,0xdd,0xc3,
 0xc3,0x6f,0xd8,0xd7,0xd8,0x14,0x24,0xc8,0xe9,0x45,0x92,0xe2,
 0x18,0x54,0x26,0x0a,
};
const unsigned char tc_ISK_SY[] = {
 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a,
 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77,
 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5,
 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e,
 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7,
 0xe9,0xd8,0xfb,0xc2,
};
const unsigned char tc_ISK_SY[] = {
 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a,
 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77,
 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5,
 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e,
 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7,
 0xe9,0xd8,0xfb,0xc2,
};
const unsigned char tc_sid_out_ir[] = {
 0x56,0xcc,0x3c,0xd8,0xbe,0x77,0xcd,0xc8,0x4c,0x0d,0x19,0x06,
 0xde,0x1f,0xfc,0x8e,0xf7,0xcb,0xb3,0x26,0xa3,0xf0,0x52,0x67,
 0xb6,0xe8,0xc6,0x34,0x4e,0x27,0x81,0xeb,0x20,0xef,0x72,0x5e,
 0x84,0xcb,0x1b,0xb4,0x59,0x27,0x43,0x50,0x51,0xb4,0xe0,0xfa,
 0xe7,0x8e,0x97,0x5b,0xf1,0x50,0x99,0xf9,0xe3,0x8d,0x75,0x54,
 0x13,0xee,0xe2,0xfd,
};
const unsigned char tc_sid_out_oc[] = {
 0xa4,0x6c,0x71,0x89,0xba,0x6a,0x36,0xc4,0x44,0x77,0x41,0xe0,
 0x57,0xda,0x39,0xc8,0x85,0xb7,0xd5,0x9e,0x08,0xbd,0x2d,0xf1,
 0x85,0x2a,0x52,0x71,0xf2,0xa8,0xa2,0xe9,0xb1,0x87,0xcc,0xd0,
 0x73,0x25,0xa3,0xee,0xde,0x64,0x6a,0xde,0xe0,0xc0,0x6f,0xe5,
 0x8d,0xa7,0x7f,0x74,0x17,0x78,0x96,0xb2,0x10,0x53,0xc5,0xd1,
 0x07,0xde,0x00,0x6d,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-24">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjA0MDBFNThBOE
 #ZCRjA4QjM4RTM0QTM2NzZGNkQ2OTBCRUQ1OEFBNDExNUZGMzJBNTdFQzg3MTcyRkMy
 #QTFGQjg5RDAzMjU4QzY0MjlDNDY0OTgxQjMyODRCNUZFREJEMTI0NEJGMjc0MzIwMD
 #g4Njg3MDY1QjkwNzVERDU1OEUxNEVENjk5MDFEMjE2MkRCMUJBM0E0OUM5N0RDQTdD
 #OTAyQ0IxQjk2QkFCRTIxQTMxOTQyMTE0Qzg2MDY2NUIzNUM0NkI4MjEzRjZERTE3MT
 #k0REU1NEM0NDEwODNERDExNjNENTkwN0FEQUQ4ODI0QkIxMzA3RENGNkE1NUMxMUE4
 #RjAxRDk3ODlCIiwgInlhIjogIjAwNjM2N0U5QzJBRUZGOUYxREIxOUFGNjAwQ0NBNz
 #MzNDNENDdDQkU0NDZDRUJCRDFDQ0Q3ODNGODI3NTVBODcyREE4NkZEMDcwN0VCMzc2
 #N0M2MTE0RjE4MDNERUI2MkQ2M0JERDFFNjEzRjY3RTYzRThDMTQxRUU1MzEwRTNFRT
 #gxOSIsICJBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MDBDMkJGRDc5NDQ2N0Y0NDM4
 #Mjc3RTg1QTQyRTEwMUZBNDA2MUUxRUY2RTA1RjgxRTUzODFGMzBFNzNCMzQxREQ3Mj
 #YwODlDQjZBNkJCRTVBNTA5RkFEMDA5ODU3NDg4REI3MTMwRkY3NjgwOTA3MzEyRUI3
 #MjRDRERCNERDQ0U2NzVCMDA5OEFENDAwRkVGODBFMURFQjRCQzE3NTZDNDM5NjFFRj
 #YwQjg1RjJENjJFRDQ1ODQ1NEUxMTYxNkE1RDFERjFFNTgwOTYzNjgyMUE3MzY2MkY5
 #RjEyMjU0RTZGOTk1MEREMDFGQThFMjZBOEIyMDczNkZCNjNDNjNDODEwOTRGNjgxIi
 #wgInliIjogIjAwOTIyN0JGOERDNzQxREFDQzk0MjJGOEJGM0MwRTk2RkNFOTU4N0JD
 #NTYyRUFBRkUwREM1RjZGODJGMjg1OTRFNEE2Rjk4NTUzNTYwQzYyQjc1RkE0QUJCMT
 #k4Q0VDQkJCODZFQkQ0MUIwRUEwMjU0Q0RFNzhBQzY4RDM5QTI0MEFFNyIsICJBRGIi
 #OiAiNDE0NDYyIiwgIlliIjogIjA0MDA3MDZFQTY5QjJCNzE2Nzc3MzI0OEVBNkU2OU
 #E1NzRFOUREMkZGOEEzRDA0QTZFMDdGNzBDNzA5ODY5Q0E0ODY4MjdENTlGOTI5MDU5
 #OUQxQ0Y5NEUxQTAzRkMyNDJFMkIxMzE2QUZFMkZBMjE4QkZBRUIzRTFGRkQ5RjE5Qk
 #YwNjJEMDFGNkIxNUM5QzM2NTFCRTRDMDhCQUYwMUVFQzI1QzgxOEVFMTJDNkVEQzQ2
 #MjA2NDRCMUQ5N0NGMjRGODY4NzMyRDU2RkU0NUNFNzhFMzAyQzIyMUM5MkY0MDNFME
 #ZBMzIwN0RFOEJCNDFCMzg4RDgxMDQ2QTI5OEVEOEREQUM5QjJBIiwgIksiOiAiMDE4
 #RTBFN0U5QURFNzQ5MTdDMTFDMEY2QjUyRjk1RUQ4NzFFQUIyMzU0MzdDQkVFOEI1Qz
 #I1MDk1MTZFNzg3QTgwRTgyNUVENUQ1MzlGQTZBMEVDMzJDNDhGQThGQUJFODU4MDlE
 #MDAwRDBDRkQzMDgzMkMyM0Q0NzdDOTkxQkVBOEU1IiwgIklTS19JUiI6ICIxNjY5QT
 #BBMjk3MjZBREM3RUVBMjUxMEQ2RjdFMDA0QTEzNUZBNjNBQzNDOUY5RTZDRTUzQ0JB
 #NUQ1RTM3ODFBQ0VENTE1OTU2MDQxRTQzMzU4NDA5QTEzRUY5MEREQzNDMzZGRDhEN0
 #Q4MTQyNEM4RTk0NTkyRTIxODU0MjYwQSIsICJJU0tfU1kiOiAiRjJGM0JEOENENDQy
 #QTRFMTY2NTlCNDdBN0I3QTg0RjI5QkU3NTg5M0VEMkU1Rjc3MkQ3QTNDOEI3NzlFQj
 #BERjkzN0E0RUM1MEE0RjFGRjAxRUJCQUE5N0Q4MEUwOTBFQTY5QjAwQTk1MjAwRUQy
 #NThFNDhDNkY3RTlEOEZCQzIiLCAic2lkX291dHB1dF9pciI6ICI1NkNDM0NEOEJFNz
 #dDREM4NEMwRDE5MDZERTFGRkM4RUY3Q0JCMzI2QTNGMDUyNjdCNkU4QzYzNDRFMjc4
 #MUVCMjBFRjcyNUU4NENCMUJCNDU5Mjc0MzUwNTFCNEUwRkFFNzhFOTc1QkYxNTA5OU
 #Y5RTM4RDc1NTQxM0VFRTJGRCIsICJzaWRfb3V0cHV0X29jIjogIkE0NkM3MTg5QkE2
 #QTM2QzQ0NDc3NDFFMDU3REEzOUM4ODVCN0Q1OUUwOEJEMkRGMTg1MkE1MjcxRjJBOE
 #EyRTlCMTg3Q0NEMDczMjVBM0VFREU2NDZBREVFMEMwNkZFNThEQTc3Rjc0MTc3ODk2
 #QjIxMDUzQzVEMTA3REUwMDZEIn0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-2">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    X: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfab9
    G.scalar_mult(s,X) (full coordinates): (length: 133 bytes)
      040122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7
      c73cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517c
      df6d99a8a2d6db19ef27bd0055af9e8ddcf337ce0a7c22a9c8099bc4
      a44faeded1eb72effd26e4f322217b67d60b944b267b3df5046078fd
      577f1785728f49b241fd5e8c83223a994a2d219281
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 66 bytes)
      0122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7c7
      3cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517cdf
      6d99a8a2d6db19ef27bd
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-4">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    Y_i1: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfaf9
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-25">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICIwMTgyREQ3OTI1RjE3NTM0MTlFNEJGODM0Mjk3NjNBQ0
 #QzN0Q2NDAwMENENUExNzVFREY1M0ExNTg3REQ5ODZCQzk1QUNDMTUwNjk5MTcwMkI2
 #QkExQTlFRTI0NThGRUU4RUZDMDAxOThDRjAwODhDNDgwOTY1RUY2NUZGMjA0OEI4NT
 #YiLCAiWCI6ICIwNDAwREM1MDc4QjI0QzRBRjE2MjBDQzEwRkJFQ0M2Q0Q4Q0YxQ0FC
 #MEIwMTFFRkI3M0M3ODJGMjI2REMyMUM3Q0E3RUI0MDZCRTc0QTY5RUNCQTVCNEE4N0
 #MwN0NGQzZFNjg3QjRCRUNBOUE2RURBQzk1OTQwQTNCNDEyMDU3M0IyNkE4MDAwNUU2
 #OTc4MzNCMEJBMjg1RkNFN0IzRjFGMjUyNDMwMDg4NjBCOEYxREU3MTBBMERDQzA1Qj
 #BEMjAzNDFFRkU5MEVCMkJDQ0EyNjc5N0MyRDg1QUU2Q0E3NEMwMDY5NkNCMUIxM0U0
 #MEJEQTE1QjI3OTY0RDc2NzA1NzY2NDdCRkFCOSIsICJHLnNjYWxhcl9tdWx0KHMsWC
 #kgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0MDEyMkY4OENFNzNFQzVBQTJEMUM4QzVE
 #MDQxNDg3NjBDM0Q5N0JBODdEQUExMEQ4Q0I4QkI3QzczQ0Y2RTk1MUZDOTIyNzIxQk
 #YxNDM3OTk1Q0ZCMTNFMTMyQTc4QkVCODYzODlFNjBEMzUxN0NERjZEOTlBOEEyRDZE
 #QjE5RUYyN0JEMDA1NUFGOUU4RERDRjMzN0NFMEE3QzIyQTlDODA5OUJDNEE0NEZBRU
 #RFRDFFQjcyRUZGRDI2RTRGMzIyMjE3QjY3RDYwQjk0NEIyNjdCM0RGNTA0NjA3OEZE
 #NTc3RjE3ODU3MjhGNDlCMjQxRkQ1RThDODMyMjNBOTk0QTJEMjE5MjgxIiwgIkcuc2
 #NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29yZGluYXRlKSI6ICIwMTIyRjg4
 #Q0U3M0VDNUFBMkQxQzhDNUQwNDE0ODc2MEMzRDk3QkE4N0RBQTEwRDhDQjhCQjdDNz
 #NDRjZFOTUxRkM5MjI3MjFCRjE0Mzc5OTVDRkIxM0UxMzJBNzhCRUI4NjM4OUU2MEQz
 #NTE3Q0RGNkQ5OUE4QTJENkRCMTlFRjI3QkQifSwgIkludmFsaWQgWTEiOiAiMDQwME
 #RDNTA3OEIyNEM0QUYxNjIwQ0MxMEZCRUNDNkNEOENGMUNBQjBCMDExRUZCNzNDNzgy
 #RjIyNkRDMjFDN0NBN0VCNDA2QkU3NEE2OUVDQkE1QjRBODdDMDdDRkM2RTY4N0I0Qk
 #VDQTlBNkVEQUM5NTk0MEEzQjQxMjA1NzNCMjZBODAwMDVFNjk3ODMzQjBCQTI4NUZD
 #RTdCM0YxRjI1MjQzMDA4ODYwQjhGMURFNzEwQTBEQ0MwNUIwRDIwMzQxRUZFOTBFQj
 #JCQ0NBMjY3OTdDMkQ4NUFFNkNBNzRDMDA2OTZDQjFCMTNFNDBCREExNUIyNzk2NEQ3
 #NjcwNTc2NjQ3QkZBRjkiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
5t5eXfZAj6Ojcet9kTjX3gB/PnO3uqrj87iThVUzDqnd6W305MG4oKamR1pO
M2DsJMCb1aZROOFu6HSd9SPpAj5Op/sF5vfySALskfjB03wt2lncUVnLqzVV
D7/E2FYIq8HEF9rnhjjPiLgYA/3G42MDDzNKxX++y/VX0PsvlEgxaX13dm7B
G6c31oF1RmekWsM4KvbTby1ML9agu3GNhw2YC/MSTCkfo7sNMbn46BWVSx7I
fu4/tk8tu5E57OGY8wE9J+LPrw31vvbxjdxB7ErBz3PJwXC5jl6pm4hjFcb+
qwFzpV8UjPTn19y1+vBn/uLvR+pp0OjRC989FPP9T8N8qo+PjD/Dvw1TG0st
C8SGfPhvfzPqRwVAv35tmNl5fZBW93+hj0RtbB4SLtaha4p3N0vfaXkntb5N
gMujV4YA65VhGeJ2J5zPNHcetuyqk3nBzbzgVK2qXa1WnfyLhKolxloOLbt+
dJSZE0hCG6Q+Nk3TMm2zajqma9bMutkwm6Zn+mZghmZkji3TsizbqlqO5Vo1
q241rKblWXxltRVYoRVZY9u0Ldu2q7Zju3bNrtsNu2l7tm8HdmhH9rhqSlir
LnhZ9WqDXq82q17VrwbVsBpVx47pWI7tVB3HcZ0adlp3mo7n+E7ghE7kjF3T
tVzbrbqO69Lrbs2tuw236Xqu7wZu6EbuuGbWrJpdq9acmlur1eq1Rq1Z82p+
LaiFtag2rpt1q85d3evVulN367V6vd6oN+te3a8H9bAePYvORg6dVVNHZwOR
+ZsQyuj0fytCGZ2N34pQRqf7WxHK6LT3IbQ+lvd6A8MYQ2ASVeKZpNpF1xqn
J1ftmiNkHnLVseQq47to8/YxmH14/PSTe//Rfpr68W38dhM8dO4Wk87dyWMn
fpx0Zp15d9jZ9s6C+DI+ibvb9rZ71912t/34xzMY5CQO3rydBhcf1p/Om8mn
n5zFdRw8wSPm2809v9Lqb7vD7gZf6p11ks5ZdloYBGeOPg6mweZ2c/2TO/90
NYEhgod3VzxEz7x+7LZOnrqtzmN3e2J2W6PH3t1JtduaPF4OT0+7bRik89jf
nra77dHj4K792B22YQgAdth/6g3bdncYPF222m531H7q3523uqP+02B4ftG9
O9nAAjcA8QYG6bU6VvfuetPbdpzu3f2mP3x71r3vbgatt+fd++ttt9V96m47
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
28ubatsc88LW7dkR+dCq2pJp8zJ2qRTrFcgSLrk5hQbITA9MU9HeVuL8than
edVSNNNqcZNrQ3bjxmjWSWp2l7clxdUm57hCWwCZrChj48FHxAlk6uuGxlW1
xQ1NiAkjyKPfHcguumpZK4k+tztXcSRsTlXlTPFxlrOPML0Jd/FicQ/7a7pj
XtHImoJ9ZM8dObegs9jR6vHq+JsN03Uc1jRQ7nnlJvhCUwJgEol1iXiqaYKl
rMUFvYcbX5tjprYoDzSZQ8scIfe5Ex4QJ1BIesVUHvW+FJvtFUdtTkuf122V
b5icJmemA3b7dUleVxXtYcMEMLvWNNuCRkP340nsyBULej3npt/60LSn9NET
CgJuhq4VN/8iszGvxGnB1i6ZZ6GlVdlz2inIg5mHoabJUWzl7yFJVe/KW8pq
smzJGen3m+85FdzjTnhInMCNvSeSLk0jI78gB2CygiYvmM7guiHfoTiKos3M
IvPOkFvZWjCtx6WsuPFLnHJGu6F5myZnD71ax6ZgSt1ifVxu1zlTgMAmtSEn
5j4XUwrW56MQ47aqguk8zk3JLer0Oockxw+NgryYcy1HM11+X3K2f4o7gYHI
9zCA//seCPDv3dWHEBt1f/rVvRaAF75wT30Qg0jt2KWO9c+t8kKl1nWJdyL0
/eilGJJgRDd0WVCZHoxIQ5YtT52tzjoR+xN/fOE+ymuf9Jk3o86EGNJuGJMs
MULZ3gwhdcxR7vg7QH7yz19emDQ4vXxtY01vOivjw+7j+7iw//jpuyi3+R8/
/udLnQWplzoxdhxSJzqTZGNCQ3L90Kc6ywbL4lBG2CA7lqUPMk25DXPQc6dp
OiZ9QgN/PIAJmPbjL3HzO1c4+eP9xX7kDxN2fP0nQNjJYf46u85Pj9/3H7ff
/eY/I+79Hj/GX4Y//4U++ce/xu9OJ9D8xJqxiJoe/+bkN7/+gWHxU+vJ+f/+
/QfJ0Hf+QYE64z5gfu7toctFgPzHEHoMAoD73/zy/ntOI3/Jhfsv58LnbJv/
5m9jT15qG/oyzdXP+ixP+D/xnfCTr6n42smX7vX9IeLAaJP57U8f/G2sbame
4E5B2imZvmsvK2ZE21Jxlp9o2tdXFVPOFA1tRsBFlVxRoN5b0zb3njZWqry2
9XUlaipWaAfdloZ5k2LpFDXYUf8eLo42BUAzXJyVOV1GcHFKdd6uvqaC/YiF
wKnaALEP1TE3VB5RIU/7WM5kP7WmUpKLPAm2L6pdtu1NHavt3/7uj9WOJvfe
X7m/hh9uxP/8tvzp4vhs16vm6n/Wl3+eOmx1TQUb050x+gQbzmpFdR5tHFSM
HEpbc1F2KGkiLe+aBe/vVVvf1G1D2/8V1UBe0yT44zTpQLUguo55MrG68n/z
qnrfH69vf1RS9r9txvCHC8uj+eFo6nkWJavaCtTDB2YDQzcp13lspk3LmDBP
+/l72vLqGypsaROm+qVdMwmW5f2KakFu1lyXotV0qjmiwuS64U341D0ChH4/
VRQ7Ko/2J1TzNLTZXtJG3OqaS8zdJbcK31btCXPXwSYoVPeWtn8qG1HHxOKV
6r4N1bpUStMGTMcI2nQfQzkXBrSv1et7dOreAuKhLaobv7BA/HzNX1AkXj0F
4MmncfyfqRYf7tpRDA2Z/pZJ8qxu/FvxL6/M8P8cH/+l1eIftbXIh7pXqTTZ
aEIibJZ2XTd2iQlqDEnvx8HYgVV3st6lMshgx1FTOZF5aewirOZSn6hOdqNS
XU+BprPUuNGlo+tpEkPwo+mGYchSlSk/JgkVJqbrZ/s5RVWd0j4bs6C7RHqd
9aIbUye9U6xSlIZRyN6mIdE93UubvvdklvnjkipENUgxBp8J2/XeDWS1UQeq
TMZkDNoIqj9UEgZlRK9VkiZkc/UK0NAjUfqOqTW812k29I4qVqpbaXDGJoGK
n96MMvhh6PuexiytSgfuNJL93LPRd31i6OPOO818DwnZsO+EGW1vqS6jn4dA
tpejlqMQY88AKJuI5OuBjH4Zzffyw4ua71XOjwHPD3gSsJuk0D/5JJFvj5H8
HFJcZsTFmfv1pLgfg4tmZBE/h3gLuOiaKqgFXMR7eDWpz+9K/pViG1Q5F2aX
USae9e4PXlf7c13uqF45fPPQnm93JGuqotnEK2ZnlRGj1bJ5r/n3TByMf+/4
9YJeJz/atygLGQJHrlVuAfuitxTXTEXLOP9aNFQanxWAhdEKboqan99Jep1u
Wd+UQOKhGOuO14fuaHV78WNFRWkdw+rAiGrGszOy/pLKwfWq2VNAFIx3rxU/
DqP6j2FAGiCj1tQMzmu5KD07bnb8fOqcKspCVFQqbrb8wOl0RYUqs3Gu6h1F
OT+FPdS2oc/h2czVEcdK0zZ5QxUkP1Tb5P6WHwXTnBnLbqtizc+6qWA9pzMB
q65zYFQrptUsD++P8Px7zc/pbhjmHVlJQ8FP4+sdI8rPD1Q+M2RO1Hu6LJ6D
r7lUvuVHY/wkDXCnd7JuT/NN25L1L46ZVpT5QpjcgALhmutc5gVothTdxQnz
hTLH7m014SMpJHk6fLqgKvuBjjvCjTlSqco+48dydGRgAXcu6Lmw59HWks5Q
Ek8TGyaQvmmKat20DJ2nAwrj3neB/n0CqFezZ3My0zE//qPT2AHIfHIKusQe
T87oEnQ1fupe0K/oWFVcsMmo1qf/8tVxvedDS82sDOofLOKuNW0xcpTaj0xi
1KnUeS2GzIchc1amNnhlTaYzpzLpWCtcq2CXdkv6nDC099N+KEKqx9A5I52F
wuowWulYbNxR/SLHLKHdbfRdSLwcXkJaPRxiotIx63vVDY6KEdVZmbmEtl3X
CyoTRumU1UGLLNEuG9XgZdYPmUmWjlAR5Kgy6FdqKtFl6Pid1nkfVJd0DFDW
KZUv6ZAkfU87fEIbu3xJ3/Uri7hTcaK9S9yYZGOneOKdcobWQbth1Amzjwlr
s64P0qRSdWmmslEuqvWZHYLy6ZCmg+pDMGQuZ4ywY89FVJ+wcGIIVC8ayOl2
3oVMGqFeQnI90pkfXCblQJdVY+eFo4KPbJv2qrfC9Y6ZuXzmya0S4X3iu14L
KbN0qRiFdDTqPh1pGpbVPXWgqkiZtE9TMyS9GJhtLBlHM5L/UC1p0lSFl9bk
y4m4O8PlquG/qOwVaRcGrS1311MNaxyV2ORhOtE+dHTWoeLNWCOpPJ4jSmVU
3A86ZYh7okfPpF4UDSoTgX6VmpRKPu3TJJiUCnmZZI6K3XR8HVLsWxnsP17E
/fPSwpxT/OelhTnt9Xcq2m8JhTkl3YuIt4TCHHz3IuJV0Jb50cQj/eP0OUjL
wzP8l9R0lw8a6e8Tfzx336c0kWdrfHTspY3qlRGxNNJ/HBivjYjZkR4Exmv9
coGEPNy1XueXC9bi4a71Or+ck8cLmfolv5yz+AuZ+jPANV7RGnUJLYiUqdO0
VL3XGR2G08QOfHROOrLmSP8caYxu7HrTiW7e9frA3xh51XdUtzhHUxoTl4VM
0PtlJ4S2UnnpR1oKGliv5CB9nyxfS9AcQpfKIOhPskL4JtTd377Lzm715tQS
127OAx8t4etT7Tz4z3JpNa/kcy797aS4T4u9P8Tm/iuluNf65jz4N6eX6JvT
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
SWE+NOZ8CnmAnn+FKX/9DBo8sQ9qFzMMA9XPmu4qvTIs/GKkG33g1tDMqz7R
YyaHkdtdg02o1g6Kaq95ZH1iu6wf6F00Caq1E2GHkcULRuNHTbXYMDqu18bM
DIbVITLuoJ27cv2oUjI+VWhB9VSI2WRp3/vyUpS0954/K0VJlcIDhDg/7Z6e
Xr8GIX5y4Eszejqe8R/LLuaT5CQ/G99ecpKmzaGQTBHGT66bj16HFKOmzE8b
ShNrEvrxw2sA5c8/awdK/JOP2w8Vs0HyzsgEZ/wo5HApQCSTXx1XAnXahmGo
/FD3w0uA8ufR5HSRp9Qqm+1HgPJP2AyVwMtm47+paHjqqwtmafu5u94MwqaL
vA2H/RQIm0dyaI7A5LNlZj6m9PQsq5jzU35+5sMUPlQl6qaInnyhzv528ePp
+3Dsbk+O/R1RTrNuWv6Wwx/4zmVLhScP9rAXeEIp2DbMOVgyKvrQcAXVnlNF
XegmB0qcS70mP+WyV9Xg4Hx/RHWYYvOWgmsVqq5bfrLNzH3nVOTwtxzrFV3G
omTmEouuWLD6OfMNvcdjZ9YZLyHvTqVduy7K/QmXv7L6cPqi0NvnAYj7D5ev
0BDUqU0pWfWj7J0dR5YXViHtB5OoYIKQQ8LKLYnMRk3n1zA4SmaJW1Kgod1C
eftIQ7B7MevKUaouWDpDWyFFp1gNz/gskS6VwnU6CXRQdn7IbJea1A1yYNa5
ZT9QY6BtXqYDnW4TbQbWCRKUSoNVA4OTk4zOxLTZUYKl/w3aiCQOkf9vDKNX
g6dpDLR12EFGiMa7q78Of/lj99cPfx9+7bl12v+VH+X9LT7mw3z+67b7z//7
8mE/+NeanLSddb5neAeN1fZ0TWmV0y6lTw4M8eZ2cxn60eluXg6hhA6StrNU
9kF3cngJHvB5GOjXudVgk1SN3g29GWjTHpkYUEjaSr3xbgwuy5IkyTrvTSaU
CVr7TPW9vBNnpr28sy8Cmh9bnvZnKTPRJ0Pf9d1oB9qexsyHNEvofsFpbVTv
u8F4aTOyMdUUnZgflXhP9YO2xmTJ6IagBke1hmNbJkEOmq5maCW4ShLejHK0
tIJ9ks6beZcOtIUrKlGs6sdsnHCqn3CrHm7Vv8atvtDkHNVwijwpDFRxeZb1
G6QXHUW/V0FRWGjGlHVU2xm3kAvaTPrUBieyLhiRivTrwLgf5aZBsBC5o3Kz
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
w4ccWitHbksTkO9SZ/8XU658djW2AgA=

-->

</rfc>
