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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  point coordinate u_twist on the twist: (length: 56 bytes)
    c981cd1e1f72d9c35c7d7cf6be426757c0dc8206a2fcfa564a8e7618c0
    3c0e61f9a2eb1c3e0dd97d6e9b1010f5edd03397a83f5a914cb3ff
  G_X448.scalar_mult_vfy(s,u_twist): (length: 56 bytes)
    d0a2bb7e9c5c2c627793d8342f23b759fe7d9e3320a85ca4fd61376331
    50ffd9a9148a9b75c349fac43d64bec49a6e126cc92cbfbf353961
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-10">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkxIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMiI6ICIwMT
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwIiwgIkludmFsaWQgWTMiOiAiRkVGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbnZh
 #bGlkIFk0IjogIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNSI6ICIwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGIiwgIlZhbGlkIChvbiBjdXJ2ZSkiOiB7InMiOiAiQUY4QTE0MjE4QkYyQTIw
 #NjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0YxNU
 #ZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FERCIs
 #ICJ1X2N1cnZlIjogIkFCMEM2OEQ3NzJFQzJFQjlERTI1QzQ5NzAwRTQ2RDYzMjVFNj
 #ZENkFBMzlEN0I2NUVCODRBNjhDNTU2OUQ0N0JENzFCNDFGM0UwRDIxMEY0NEUxNDZE
 #RUM4OTI2QjE3NEFDQjNGOTQwQTBCODJDQUIiLCAicmVzX2N1cnZlIjogIjNCMEZBOU
 #JDNDBBNkZEQzc4QzlFMDZGRjdBNTRDMTQzQzVENTJGMzY1NjA3MDUzQkYwNjU2RjUx
 #NDIwNDk2Mjk1RjkxMEExMDFCMzhFREMxQUNEM0JEMjQwRkQ1NURDQjdBMzYwNTUzQj
 #hBNzYyN0UifSwgIlZhbGlkIChvbiB0d2lzdCkiOiB7InMiOiAiQUY4QTE0MjE4QkYy
 #QTIwNjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0
 #YxNUZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FE
 #RCIsICJ1X3R3aXN0IjogIkM5ODFDRDFFMUY3MkQ5QzM1QzdEN0NGNkJFNDI2NzU3Qz
 #BEQzgyMDZBMkZDRkE1NjRBOEU3NjE4QzAzQzBFNjFGOUEyRUIxQzNFMEREOTdENkU5
 #QjEwMTBGNUVERDAzMzk3QTgzRjVBOTE0Q0IzRkYiLCAicmVzX3R3aXN0IjogIkQwQT
 #JCQjdFOUM1QzJDNjI3NzkzRDgzNDJGMjNCNzU5RkU3RDlFMzMyMEE4NUNBNEZENjEz
 #NzYzMzE1MEZGRDlBOTE0OEE5Qjc1QzM0OUZBQzQzRDY0QkVDNDlBNkUxMjZDQzkyQ0
 #JGQkYzNTM5NjEifX0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-ristretto255-and-hash-sha-512">
        <name>Test vector for CPace using group ristretto255 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-ristretto255">
          <name>Test vectors for calculate_generator with group ristretto255</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 100 ;
    DSI = b'CPaceRistretto255'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      11435061636552697374726574746f3235350850617373776f726464
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    hash result: (length: 64 bytes)
      c63a5750e2439c17ccd8213be14fde2f87e1bc637001a97f5929c77b
      30ea0e08afbc75ace5d3d73b2842a79d01488c5fd7ea30d475ee6095
      45af1bfd1ff77c8e
    encoded generator g: (length: 32 bytes)
      a6fc82c3b8968fbb2e06fee81ca858586dea50d248f0c7ca6a18b090
      2a30b36b
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-11">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDAsICJEU0kiOiAiNDM1MDYx
 #NjM2NTUyNjk3Mzc0NzI2NTc0NzQ2RjMyMzUzNSIsICJDSSI6ICI2RjYzMEI0MjVGNz
 #I2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6
 #ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnZW5lcmF0b3Jfc3
 #RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIxMTQzNTA2MTYz
 #NjU1MjY5NzM3NDcyNjU3NDc0NkYzMjM1MzUwODUwNjE3MzczNzc2RjcyNjQ2NDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMU
 #E2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2
 #RjcyMTA3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJoYXNoIHJlc3
 #VsdCI6ICJDNjNBNTc1MEUyNDM5QzE3Q0NEODIxM0JFMTRGREUyRjg3RTFCQzYzNzAw
 #MUE5N0Y1OTI5Qzc3QjMwRUEwRTA4QUZCQzc1QUNFNUQzRDczQjI4NDJBNzlEMDE0OD
 #hDNUZEN0VBMzBENDc1RUU2MDk1NDVBRjFCRkQxRkY3N0M4RSIsICJlbmNvZGVkIGdl
 #bmVyYXRvciBnIjogIkE2RkM4MkMzQjg5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQT
 #UwRDI0OEYwQzdDQTZBMThCMDkwMkEzMEIzNkIifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-2">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      da3d23700a9e5699258aef94dc060dfda5ebb61f02a5ea77fad53f4f
      f0976d08
  Outputs
    Ya: (length: 32 bytes)
      d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c66
      9308f87a
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-2">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      d2316b454718c35362d83d69df6320f38578ed5984651435e2949762
      d900b80d
  Outputs
    Yb: (length: 32 bytes)
      08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67
      2eb7e307
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-2">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa
      0e607e09
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa
      0e607e09
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-2">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      20d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c
      669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d39840
      3319c2341bd506a92e672eb7e30703414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774
      fc0f41e6b711569190ff88fa0e607e0920d40fb265a7abeaee7939d9
      1a585fe59f7053f982c296ec413c624c669308f87a034144612008bc
      f6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e672eb7
      e30703414462
    ISK result: (length: 64 bytes)
      4c5469a16b2364c4b944ebc1a79e51d1674ad47db26e8718154f59fa
      ebfaa52d8346f30aa58377117eb20d527f2cbc5c76381f7fd372e89d
      f8239f87f2e02ed1
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-2">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f6320d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c
      624c669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d3
      98403319c2341bd506a92e672eb7e30703414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 148 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774
      fc0f41e6b711569190ff88fa0e607e096f6320d40fb265a7abeaee79
      39d91a585fe59f7053f982c296ec413c624c669308f87a0341446120
      08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67
      2eb7e30703414462
    ISK result: (length: 64 bytes)
      980dcc5a1c52ceea031e75f38ed266586616488c5c5780285fcbcf79
      087c7bcdbd993502eee606b718ba31e840a000a7b7befe15ea427c5c
      fe88344fa1237f35
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-2">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      2a76d3bbc499dfdc4dcacc9ff042f4e1a54e3843258e100ccd7c60f0
      a541f9d3ebf025e68a460dde218bd39f0711bc6fa11409c9d7b69d8c
      cf6b32fc51ddb699
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      ca4b50700c46203ccd10bc0e9f31095e508189cb59857537be561048
      d34b9ed9a9697af11c998f484c3d783b0b531434caa6835d4c32344f
      cd17160c9c348fc7
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-2">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0xa6,0xfc,0x82,0xc3,0xb8,0x96,0x8f,0xbb,0x2e,0x06,0xfe,0xe8,
 0x1c,0xa8,0x58,0x58,0x6d,0xea,0x50,0xd2,0x48,0xf0,0xc7,0xca,
 0x6a,0x18,0xb0,0x90,0x2a,0x30,0xb3,0x6b,
};
const unsigned char tc_ya[] = {
 0xda,0x3d,0x23,0x70,0x0a,0x9e,0x56,0x99,0x25,0x8a,0xef,0x94,
 0xdc,0x06,0x0d,0xfd,0xa5,0xeb,0xb6,0x1f,0x02,0xa5,0xea,0x77,
 0xfa,0xd5,0x3f,0x4f,0xf0,0x97,0x6d,0x08,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd4,0x0f,0xb2,0x65,0xa7,0xab,0xea,0xee,0x79,0x39,0xd9,0x1a,
 0x58,0x5f,0xe5,0x9f,0x70,0x53,0xf9,0x82,0xc2,0x96,0xec,0x41,
 0x3c,0x62,0x4c,0x66,0x93,0x08,0xf8,0x7a,
};
const unsigned char tc_yb[] = {
 0xd2,0x31,0x6b,0x45,0x47,0x18,0xc3,0x53,0x62,0xd8,0x3d,0x69,
 0xdf,0x63,0x20,0xf3,0x85,0x78,0xed,0x59,0x84,0x65,0x14,0x35,
 0xe2,0x94,0x97,0x62,0xd9,0x00,0xb8,0x0d,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x08,0xbc,0xf6,0xe9,0x77,0x7a,0x9c,0x31,0x3a,0x3d,0xb6,0xda,
 0xa5,0x10,0xf2,0xd3,0x98,0x40,0x33,0x19,0xc2,0x34,0x1b,0xd5,
 0x06,0xa9,0x2e,0x67,0x2e,0xb7,0xe3,0x07,
};
const unsigned char tc_K[] = {
 0xe2,0x2b,0x1e,0xf7,0x78,0x8f,0x66,0x14,0x78,0xf3,0xcd,0xdd,
 0x4c,0x60,0x07,0x74,0xfc,0x0f,0x41,0xe6,0xb7,0x11,0x56,0x91,
 0x90,0xff,0x88,0xfa,0x0e,0x60,0x7e,0x09,
};
const unsigned char tc_ISK_IR[] = {
 0x4c,0x54,0x69,0xa1,0x6b,0x23,0x64,0xc4,0xb9,0x44,0xeb,0xc1,
 0xa7,0x9e,0x51,0xd1,0x67,0x4a,0xd4,0x7d,0xb2,0x6e,0x87,0x18,
 0x15,0x4f,0x59,0xfa,0xeb,0xfa,0xa5,0x2d,0x83,0x46,0xf3,0x0a,
 0xa5,0x83,0x77,0x11,0x7e,0xb2,0x0d,0x52,0x7f,0x2c,0xbc,0x5c,
 0x76,0x38,0x1f,0x7f,0xd3,0x72,0xe8,0x9d,0xf8,0x23,0x9f,0x87,
 0xf2,0xe0,0x2e,0xd1,
};
const unsigned char tc_ISK_SY[] = {
 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3,
 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28,
 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02,
 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7,
 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f,
 0xa1,0x23,0x7f,0x35,
};
const unsigned char tc_ISK_SY[] = {
 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3,
 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28,
 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02,
 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7,
 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f,
 0xa1,0x23,0x7f,0x35,
};
const unsigned char tc_sid_out_ir[] = {
 0x2a,0x76,0xd3,0xbb,0xc4,0x99,0xdf,0xdc,0x4d,0xca,0xcc,0x9f,
 0xf0,0x42,0xf4,0xe1,0xa5,0x4e,0x38,0x43,0x25,0x8e,0x10,0x0c,
 0xcd,0x7c,0x60,0xf0,0xa5,0x41,0xf9,0xd3,0xeb,0xf0,0x25,0xe6,
 0x8a,0x46,0x0d,0xde,0x21,0x8b,0xd3,0x9f,0x07,0x11,0xbc,0x6f,
 0xa1,0x14,0x09,0xc9,0xd7,0xb6,0x9d,0x8c,0xcf,0x6b,0x32,0xfc,
 0x51,0xdd,0xb6,0x99,
};
const unsigned char tc_sid_out_oc[] = {
 0xca,0x4b,0x50,0x70,0x0c,0x46,0x20,0x3c,0xcd,0x10,0xbc,0x0e,
 0x9f,0x31,0x09,0x5e,0x50,0x81,0x89,0xcb,0x59,0x85,0x75,0x37,
 0xbe,0x56,0x10,0x48,0xd3,0x4b,0x9e,0xd9,0xa9,0x69,0x7a,0xf1,
 0x1c,0x99,0x8f,0x48,0x4c,0x3d,0x78,0x3b,0x0b,0x53,0x14,0x34,
 0xca,0xa6,0x83,0x5d,0x4c,0x32,0x34,0x4f,0xcd,0x17,0x16,0x0c,
 0x9c,0x34,0x8f,0xc7,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-12">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIkE2RkM4MkMzQj
 #g5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQTUwRDI0OEYwQzdDQTZBMThCMDkwMkEz
 #MEIzNkIiLCAieWEiOiAiREEzRDIzNzAwQTlFNTY5OTI1OEFFRjk0REMwNjBERkRBNU
 #VCQjYxRjAyQTVFQTc3RkFENTNGNEZGMDk3NkQwOCIsICJBRGEiOiAiNDE0NDYxIiwg
 #IllhIjogIkQ0MEZCMjY1QTdBQkVBRUU3OTM5RDkxQTU4NUZFNTlGNzA1M0Y5ODJDMj
 #k2RUM0MTNDNjI0QzY2OTMwOEY4N0EiLCAieWIiOiAiRDIzMTZCNDU0NzE4QzM1MzYy
 #RDgzRDY5REY2MzIwRjM4NTc4RUQ1OTg0NjUxNDM1RTI5NDk3NjJEOTAwQjgwRCIsIC
 #JBRGIiOiAiNDE0NDYyIiwgIlliIjogIjA4QkNGNkU5Nzc3QTlDMzEzQTNEQjZEQUE1
 #MTBGMkQzOTg0MDMzMTlDMjM0MUJENTA2QTkyRTY3MkVCN0UzMDciLCAiSyI6ICJFMj
 #JCMUVGNzc4OEY2NjE0NzhGM0NEREQ0QzYwMDc3NEZDMEY0MUU2QjcxMTU2OTE5MEZG
 #ODhGQTBFNjA3RTA5IiwgIklTS19JUiI6ICI0QzU0NjlBMTZCMjM2NEM0Qjk0NEVCQz
 #FBNzlFNTFEMTY3NEFENDdEQjI2RTg3MTgxNTRGNTlGQUVCRkFBNTJEODM0NkYzMEFB
 #NTgzNzcxMTdFQjIwRDUyN0YyQ0JDNUM3NjM4MUY3RkQzNzJFODlERjgyMzlGODdGMk
 #UwMkVEMSIsICJJU0tfU1kiOiAiOTgwRENDNUExQzUyQ0VFQTAzMUU3NUYzOEVEMjY2
 #NTg2NjE2NDg4QzVDNTc4MDI4NUZDQkNGNzkwODdDN0JDREJEOTkzNTAyRUVFNjA2Qj
 #cxOEJBMzFFODQwQTAwMEE3QjdCRUZFMTVFQTQyN0M1Q0ZFODgzNDRGQTEyMzdGMzUi
 #LCAic2lkX291dHB1dF9pciI6ICIyQTc2RDNCQkM0OTlERkRDNERDQUNDOUZGMDQyRj
 #RFMUE1NEUzODQzMjU4RTEwMENDRDdDNjBGMEE1NDFGOUQzRUJGMDI1RTY4QTQ2MERE
 #RTIxOEJEMzlGMDcxMUJDNkZBMTE0MDlDOUQ3QjY5RDhDQ0Y2QjMyRkM1MUREQjY5OS
 #IsICJzaWRfb3V0cHV0X29jIjogIkNBNEI1MDcwMEM0NjIwM0NDRDEwQkMwRTlGMzEw
 #OTVFNTA4MTg5Q0I1OTg1NzUzN0JFNTYxMDQ4RDM0QjlFRDlBOTY5N0FGMTFDOTk4Rj
 #Q4NEMzRDc4M0IwQjUzMTQzNENBQTY4MzVENEMzMjM0NEZDRDE3MTYwQzlDMzQ4RkM3
 #In0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    X: (length: 32 bytes)
      2c3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    G.scalar_mult(s,decode(X)): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
    G.scalar_mult_vfy(s,X): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    Y_i1: (length: 32 bytes)
      2b3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    Y_i2 == G.I: (length: 32 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-13">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI3Q0QwRTA3NUZBNzk1NUJBNTJDMDI3NTlBNkM5MERCQk
 #ZDMTBFNkQ0MEFFQThEMjgzRTQwN0Q4OENGNTM4QTA1IiwgIlgiOiAiMkMzQzZCOEM0
 #RjM4MDBFN0FFRjY4NjQwMjVCNEVENzlCRDU5OTExN0U0MjdDNDFCRDQ3RDkzRDY1NE
 #I0QTUxQyIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICI3QzEzNjQ1RkU3
 #OTBBNDY4RjYyQzM5QkVCNzM4OEU1NDFEODQwNUQxQURFNjlEMTc3OEM1RkUzRTdGNk
 #I2MDBFIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiN0MxMzY0NUZFNzkwQTQ2
 #OEY2MkMzOUJFQjczODhFNTQxRDg0MDVEMUFERTY5RDE3NzhDNUZFM0U3RjZCNjAwRS
 #J9LCAiSW52YWxpZCBZMSI6ICIyQjNDNkI4QzRGMzgwMEU3QUVGNjg2NDAyNUI0RUQ3
 #OUJENTk5MTE3RTQyN0M0MUJENDdEOTNENjU0QjRBNTFDIiwgIkludmFsaWQgWTIiOi
 #AiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-decaf448-and-hash-shake-256">
        <name>Test vector for CPace using group decaf448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-decaf448">
          <name>Test vectors for calculate_generator with group decaf448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 112 ;
    DSI = b'CPaceDecaf448'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 180 bytes)
      0d435061636544656361663434380850617373776f72647000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000001a6f630b
      425f726573706f6e6465720b415f696e69746961746f72105223e0cd
      c45d6575668d64c552004124
    hash result: (length: 112 bytes)
      7148f4d60587aaafa64d2fd6bcfe45ee71e8b971d1d5ff3bbf8c1451
      797c62a1af22ab25638749f97f9b15fedcf4aeee87282cf667594ab0
      92b6023c8f8d3a61c38b0af791c9271137df01b57d63b79734bbce69
      91e3e2e10fdc805abc9e6e6f3daeff6fd34093d26de240b326764252
    encoded generator g: (length: 56 bytes)
      9a700ecc378eb98e57387df456d5b4b4f1dceebbb1371527eeb7e1bf
      bab64ecc9c9303396145ba04f5b5aea5baedfa61f31f00fbc5fd5606
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-14">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExMiwgIkRTSSI6ICI0MzUw
 #NjE2MzY1NDQ2NTYzNjE2NjM0MzQzOCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNz
 #A2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1MjIz
 #RTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnZW5lcmF0b3Jfc3RyaW5nKE
 #cuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIwRDQzNTA2MTYzNjU0NDY1
 #NjM2MTY2MzQzNDM4MDg1MDYxNzM3Mzc3NkY3MjY0NzAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2
 #OTc0Njk2MTc0NkY3MjEwNTIyM0UwQ0RDNDVENjU3NTY2OEQ2NEM1NTIwMDQxMjQiLC
 #AiaGFzaCByZXN1bHQiOiAiNzE0OEY0RDYwNTg3QUFBRkE2NEQyRkQ2QkNGRTQ1RUU3
 #MUU4Qjk3MUQxRDVGRjNCQkY4QzE0NTE3OTdDNjJBMUFGMjJBQjI1NjM4NzQ5Rjk3Rj
 #lCMTVGRURDRjRBRUVFODcyODJDRjY2NzU5NEFCMDkyQjYwMjNDOEY4RDNBNjFDMzhC
 #MEFGNzkxQzkyNzExMzdERjAxQjU3RDYzQjc5NzM0QkJDRTY5OTFFM0UyRTEwRkRDOD
 #A1QUJDOUU2RTZGM0RBRUZGNkZEMzQwOTNEMjZERTI0MEIzMjY3NjQyNTIiLCAiZW5j
 #b2RlZCBnZW5lcmF0b3IgZyI6ICI5QTcwMEVDQzM3OEVCOThFNTczODdERjQ1NkQ1Qj
 #RCNEYxRENFRUJCQjEzNzE1MjdFRUI3RTFCRkJBQjY0RUNDOUM5MzAzMzk2MTQ1QkEw
 #NEY1QjVBRUE1QkFFREZBNjFGMzFGMDBGQkM1RkQ1NjA2In0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-3">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      33d561f13cfc0dca279c30e8cde895175dc25483892819eba132d58c
      13c0462a8eb0d73fda941950594bef5191d8394691f86edffcad6c1e
  Outputs
    Ya: (length: 56 bytes)
      627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be846c
      c0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e571b
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-3">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      2523c969f68fa2b2aea294c2539ef36eb1e0558abd14712a7828f16a
      85ed2c7e77e2bdd418994405fb1b57b6bbaadd66849892aac9d81402
  Outputs
    Yb: (length: 56 bytes)
      8e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3011871
      7019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f94772db
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-3">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97
      32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97
      32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-3">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      38627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be84
      6cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e57
      1b03414461388e9811e4402fac098743ca7b2b509b91b38c8cf1360c
      c6cab30118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f
      8399f94772db03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363
      cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7
      6d473e01689af77f38627f8bb2ae945e2a518967df9b00aff19253d3
      086398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a937
      2a17e66bb7006e571b03414461388e9811e4402fac098743ca7b2b50
      9b91b38c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b7
      74e6b0e0b826ff4f8399f94772db03414462
    ISK result: (length: 64 bytes)
      9c2726a6cda1179349cbc38f31765eab646a2a5f176f3019fab4a0aa
      bd9d17c2ba895998cff698d801761a003512c1cf67d144b21e1cb6d6
      b82da71d0da76cad
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-3">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f63388e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3
      0118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f9
      4772db0341446238627f8bb2ae945e2a518967df9b00aff19253d308
      6398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a
      17e66bb7006e571b03414461
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 216 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363
      cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7
      6d473e01689af77f6f63388e9811e4402fac098743ca7b2b509b91b3
      8c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b774e6b0
      e0b826ff4f8399f94772db0341446238627f8bb2ae945e2a518967df
      9b00aff19253d3086398f2ec18be846cc0d1f286c2ce3caf1da63985
      9ccd2a6a01a9372a17e66bb7006e571b03414461
    ISK result: (length: 64 bytes)
      6d2178ed3048703025b9007ec84c4d969e8d8135df455e608c16aa15
      2e1219c86cea563254428a9d969903ae3649d1050da1e6e0c1c060e1
      ebf7316a7e993389
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-3">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      65bffde17b7acf07cfd437bdb973a8f7340bf911d393a61498c0a50e
      f0d68bca103fbdb0f5b799505562e59811df1bc5d9b4f5f0f7c57c22
      cd7ed6db4d153e3a
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      7ce27043d1b1d0d0e02e16979637e2a00547ed6e15ea988f7d3c9b3c
      2159b26ab3834bff7ff86240323e25216ba2ee6ea6e1582502017f8e
      6d65f8c4a5e65543
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-3">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0x9a,0x70,0x0e,0xcc,0x37,0x8e,0xb9,0x8e,0x57,0x38,0x7d,0xf4,
 0x56,0xd5,0xb4,0xb4,0xf1,0xdc,0xee,0xbb,0xb1,0x37,0x15,0x27,
 0xee,0xb7,0xe1,0xbf,0xba,0xb6,0x4e,0xcc,0x9c,0x93,0x03,0x39,
 0x61,0x45,0xba,0x04,0xf5,0xb5,0xae,0xa5,0xba,0xed,0xfa,0x61,
 0xf3,0x1f,0x00,0xfb,0xc5,0xfd,0x56,0x06,
};
const unsigned char tc_ya[] = {
 0x33,0xd5,0x61,0xf1,0x3c,0xfc,0x0d,0xca,0x27,0x9c,0x30,0xe8,
 0xcd,0xe8,0x95,0x17,0x5d,0xc2,0x54,0x83,0x89,0x28,0x19,0xeb,
 0xa1,0x32,0xd5,0x8c,0x13,0xc0,0x46,0x2a,0x8e,0xb0,0xd7,0x3f,
 0xda,0x94,0x19,0x50,0x59,0x4b,0xef,0x51,0x91,0xd8,0x39,0x46,
 0x91,0xf8,0x6e,0xdf,0xfc,0xad,0x6c,0x1e,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x62,0x7f,0x8b,0xb2,0xae,0x94,0x5e,0x2a,0x51,0x89,0x67,0xdf,
 0x9b,0x00,0xaf,0xf1,0x92,0x53,0xd3,0x08,0x63,0x98,0xf2,0xec,
 0x18,0xbe,0x84,0x6c,0xc0,0xd1,0xf2,0x86,0xc2,0xce,0x3c,0xaf,
 0x1d,0xa6,0x39,0x85,0x9c,0xcd,0x2a,0x6a,0x01,0xa9,0x37,0x2a,
 0x17,0xe6,0x6b,0xb7,0x00,0x6e,0x57,0x1b,
};
const unsigned char tc_yb[] = {
 0x25,0x23,0xc9,0x69,0xf6,0x8f,0xa2,0xb2,0xae,0xa2,0x94,0xc2,
 0x53,0x9e,0xf3,0x6e,0xb1,0xe0,0x55,0x8a,0xbd,0x14,0x71,0x2a,
 0x78,0x28,0xf1,0x6a,0x85,0xed,0x2c,0x7e,0x77,0xe2,0xbd,0xd4,
 0x18,0x99,0x44,0x05,0xfb,0x1b,0x57,0xb6,0xbb,0xaa,0xdd,0x66,
 0x84,0x98,0x92,0xaa,0xc9,0xd8,0x14,0x02,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x8e,0x98,0x11,0xe4,0x40,0x2f,0xac,0x09,0x87,0x43,0xca,0x7b,
 0x2b,0x50,0x9b,0x91,0xb3,0x8c,0x8c,0xf1,0x36,0x0c,0xc6,0xca,
 0xb3,0x01,0x18,0x71,0x70,0x19,0x78,0x2b,0x7f,0x58,0xa5,0x91,
 0xc6,0x3d,0x9c,0x92,0x47,0xb7,0x74,0xe6,0xb0,0xe0,0xb8,0x26,
 0xff,0x4f,0x83,0x99,0xf9,0x47,0x72,0xdb,
};
const unsigned char tc_K[] = {
 0x94,0xf4,0xae,0x49,0x4f,0x4e,0x8b,0x07,0xad,0xe3,0x35,0x47,
 0x26,0xee,0xe4,0x9c,0x55,0x18,0xb3,0x63,0xcd,0xa5,0x44,0xf5,
 0xb4,0x54,0x1b,0x97,0x32,0x83,0x0b,0xe3,0x7e,0xa0,0xe6,0x3f,
 0xc8,0x3f,0x54,0xbe,0x28,0x0d,0xea,0x07,0x47,0xa0,0x43,0xc7,
 0x6d,0x47,0x3e,0x01,0x68,0x9a,0xf7,0x7f,
};
const unsigned char tc_ISK_IR[] = {
 0x9c,0x27,0x26,0xa6,0xcd,0xa1,0x17,0x93,0x49,0xcb,0xc3,0x8f,
 0x31,0x76,0x5e,0xab,0x64,0x6a,0x2a,0x5f,0x17,0x6f,0x30,0x19,
 0xfa,0xb4,0xa0,0xaa,0xbd,0x9d,0x17,0xc2,0xba,0x89,0x59,0x98,
 0xcf,0xf6,0x98,0xd8,0x01,0x76,0x1a,0x00,0x35,0x12,0xc1,0xcf,
 0x67,0xd1,0x44,0xb2,0x1e,0x1c,0xb6,0xd6,0xb8,0x2d,0xa7,0x1d,
 0x0d,0xa7,0x6c,0xad,
};
const unsigned char tc_ISK_SY[] = {
 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e,
 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60,
 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32,
 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05,
 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a,
 0x7e,0x99,0x33,0x89,
};
const unsigned char tc_ISK_SY[] = {
 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e,
 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60,
 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32,
 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05,
 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a,
 0x7e,0x99,0x33,0x89,
};
const unsigned char tc_sid_out_ir[] = {
 0x65,0xbf,0xfd,0xe1,0x7b,0x7a,0xcf,0x07,0xcf,0xd4,0x37,0xbd,
 0xb9,0x73,0xa8,0xf7,0x34,0x0b,0xf9,0x11,0xd3,0x93,0xa6,0x14,
 0x98,0xc0,0xa5,0x0e,0xf0,0xd6,0x8b,0xca,0x10,0x3f,0xbd,0xb0,
 0xf5,0xb7,0x99,0x50,0x55,0x62,0xe5,0x98,0x11,0xdf,0x1b,0xc5,
 0xd9,0xb4,0xf5,0xf0,0xf7,0xc5,0x7c,0x22,0xcd,0x7e,0xd6,0xdb,
 0x4d,0x15,0x3e,0x3a,
};
const unsigned char tc_sid_out_oc[] = {
 0x7c,0xe2,0x70,0x43,0xd1,0xb1,0xd0,0xd0,0xe0,0x2e,0x16,0x97,
 0x96,0x37,0xe2,0xa0,0x05,0x47,0xed,0x6e,0x15,0xea,0x98,0x8f,
 0x7d,0x3c,0x9b,0x3c,0x21,0x59,0xb2,0x6a,0xb3,0x83,0x4b,0xff,
 0x7f,0xf8,0x62,0x40,0x32,0x3e,0x25,0x21,0x6b,0xa2,0xee,0x6e,
 0xa6,0xe1,0x58,0x25,0x02,0x01,0x7f,0x8e,0x6d,0x65,0xf8,0xc4,
 0xa5,0xe6,0x55,0x43,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-15">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIjlBNzAwRUNDMz
 #c4RUI5OEU1NzM4N0RGNDU2RDVCNEI0RjFEQ0VFQkJCMTM3MTUyN0VFQjdFMUJGQkFC
 #NjRFQ0M5QzkzMDMzOTYxNDVCQTA0RjVCNUFFQTVCQUVERkE2MUYzMUYwMEZCQzVGRD
 #U2MDYiLCAieWEiOiAiMzNENTYxRjEzQ0ZDMERDQTI3OUMzMEU4Q0RFODk1MTc1REMy
 #NTQ4Mzg5MjgxOUVCQTEzMkQ1OEMxM0MwNDYyQThFQjBENzNGREE5NDE5NTA1OTRCRU
 #Y1MTkxRDgzOTQ2OTFGODZFREZGQ0FENkMxRSIsICJBRGEiOiAiNDE0NDYxIiwgIllh
 #IjogIjYyN0Y4QkIyQUU5NDVFMkE1MTg5NjdERjlCMDBBRkYxOTI1M0QzMDg2Mzk4Rj
 #JFQzE4QkU4NDZDQzBEMUYyODZDMkNFM0NBRjFEQTYzOTg1OUNDRDJBNkEwMUE5Mzcy
 #QTE3RTY2QkI3MDA2RTU3MUIiLCAieWIiOiAiMjUyM0M5NjlGNjhGQTJCMkFFQTI5NE
 #MyNTM5RUYzNkVCMUUwNTU4QUJEMTQ3MTJBNzgyOEYxNkE4NUVEMkM3RTc3RTJCREQ0
 #MTg5OTQ0MDVGQjFCNTdCNkJCQUFERDY2ODQ5ODkyQUFDOUQ4MTQwMiIsICJBRGIiOi
 #AiNDE0NDYyIiwgIlliIjogIjhFOTgxMUU0NDAyRkFDMDk4NzQzQ0E3QjJCNTA5Qjkx
 #QjM4QzhDRjEzNjBDQzZDQUIzMDExODcxNzAxOTc4MkI3RjU4QTU5MUM2M0Q5QzkyND
 #dCNzc0RTZCMEUwQjgyNkZGNEY4Mzk5Rjk0NzcyREIiLCAiSyI6ICI5NEY0QUU0OTRG
 #NEU4QjA3QURFMzM1NDcyNkVFRTQ5QzU1MThCMzYzQ0RBNTQ0RjVCNDU0MUI5NzMyOD
 #MwQkUzN0VBMEU2M0ZDODNGNTRCRTI4MERFQTA3NDdBMDQzQzc2RDQ3M0UwMTY4OUFG
 #NzdGIiwgIklTS19JUiI6ICI5QzI3MjZBNkNEQTExNzkzNDlDQkMzOEYzMTc2NUVBQj
 #Y0NkEyQTVGMTc2RjMwMTlGQUI0QTBBQUJEOUQxN0MyQkE4OTU5OThDRkY2OThEODAx
 #NzYxQTAwMzUxMkMxQ0Y2N0QxNDRCMjFFMUNCNkQ2QjgyREE3MUQwREE3NkNBRCIsIC
 #JJU0tfU1kiOiAiNkQyMTc4RUQzMDQ4NzAzMDI1QjkwMDdFQzg0QzREOTY5RThEODEz
 #NURGNDU1RTYwOEMxNkFBMTUyRTEyMTlDODZDRUE1NjMyNTQ0MjhBOUQ5Njk5MDNBRT
 #M2NDlEMTA1MERBMUU2RTBDMUMwNjBFMUVCRjczMTZBN0U5OTMzODkiLCAic2lkX291
 #dHB1dF9pciI6ICI2NUJGRkRFMTdCN0FDRjA3Q0ZENDM3QkRCOTczQThGNzM0MEJGOT
 #ExRDM5M0E2MTQ5OEMwQTUwRUYwRDY4QkNBMTAzRkJEQjBGNUI3OTk1MDU1NjJFNTk4
 #MTFERjFCQzVEOUI0RjVGMEY3QzU3QzIyQ0Q3RUQ2REI0RDE1M0UzQSIsICJzaWRfb3
 #V0cHV0X29jIjogIjdDRTI3MDQzRDFCMUQwRDBFMDJFMTY5Nzk2MzdFMkEwMDU0N0VE
 #NkUxNUVBOTg4RjdEM0M5QjNDMjE1OUIyNkFCMzgzNEJGRjdGRjg2MjQwMzIzRTI1Mj
 #E2QkEyRUU2RUE2RTE1ODI1MDIwMTdGOEU2RDY1RjhDNEE1RTY1NTQzIn0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs-1">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    X: (length: 56 bytes)
      601431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    G.scalar_mult(s,decode(X)): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
    G.scalar_mult_vfy(s,X): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-1">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    Y_i1: (length: 56 bytes)
      5f1431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    Y_i2 == G.I: (length: 56 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-16">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJERDFCQzcwMTVEQUFCQjc2NzIxMjlDQzM1QTNCQTgxNT
 #Q4NkIxMzlERUZGOUJERUNBN0E0RkM2MTM0MzIzRDM0NjU4NzYxRTkwRkYwNzk5NzJB
 #N0NBOEFBNTYwNjQ5OEY0RjRGMEVCQzA5MzNBODE5IiwgIlgiOiAiNjAxNDMxRDVFNT
 #FGNDNENDIyQTkyRDNGQjIzNzNCREUyODIxN0FBQjQyNTI0QzM0MUFBNDA0RUFCQTVB
 #QTU1NDFGNzA0MkRCQjMyNTNDRTRDOTBGNzcyQjAzOEE0MTNEQ0IzQTBGNkJGM0FFOU
 #UyMSIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICIzODhCMzVDNjBFQjQx
 #QjY2MDg1QTIxMTgzMTYyMTg2ODFENzg5NzlENjY3NzAyREUxMDVGREMxRjIxRkZFOD
 #g0QTU3N0Q3OTVGNDU2OTE3ODEzOTBBMjI5QTNCRDdCNTI3RTgzMTM4MEYyRjU4NUE0
 #IiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiMzg4QjM1QzYwRUI0MUI2NjA4NU
 #EyMTE4MzE2MjE4NjgxRDc4OTc5RDY2NzcwMkRFMTA1RkRDMUYyMUZGRTg4NEE1NzdE
 #Nzk1RjQ1NjkxNzgxMzkwQTIyOUEzQkQ3QjUyN0U4MzEzODBGMkY1ODVBNCJ9LCAiSW
 #52YWxpZCBZMSI6ICI1RjE0MzFENUU1MUY0M0Q0MjJBOTJEM0ZCMjM3M0JERTI4MjE3
 #QUFCNDI1MjRDMzQxQUE0MDRFQUJBNUFBNTU0MUY3MDQyREJCMzI1M0NFNEM5MEY3Nz
 #JCMDM4QTQxM0RDQjNBMEY2QkYzQUU5RTIxIiwgIkludmFsaWQgWTIiOiAiMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-256-and-hash-sha-256">
        <name>Test vector for CPace using group NIST P-256 and hash SHA-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-256">
          <name>Test vectors for calculate_generator with group NIST P-256</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-256 with input block size 64 bytes.
    PRS = b'Password' ; ZPAD length: 23 ;
    DSI = b'CPaceP256_XMD:SHA-256_SSWU_NU_'
    DST = b'CPaceP256_XMD:SHA-256_SSWU_NU__DST'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 34b36454cab2e7842c389f7d88ecb7df
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 108 bytes)
      1e4350616365503235365f584d443a5348412d3235365f535357555f
      4e555f0850617373776f726417000000000000000000000000000000
      00000000000000001a6f630b425f726573706f6e6465720b415f696e
      69746961746f721034b36454cab2e7842c389f7d88ecb7df
    generator g: (length: 65 bytes)
      04eee577320b1c241a79419fcde5718c2b63f81ef8717d56a57d2fb2
      6b65a8beb63573b52605efb32ff4cf31aaef9a92df84e4e8408cc6c7
      cf27a535aad2b38a56
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-17">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0yNTYiLCAiSC5zX2luX2J5dGVzIjogNjQsICJQUlMiOiAiNTA2MT
 #czNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDIzLCAiRFNJIjogIjQzNTA2MTYz
 #NjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4NDEyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNT
 #U1RiIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2
 #RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIzNEIzNjQ1NENBQjJFNzg0MkMzODlGN0
 #Q4OEVDQjdERiIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5z
 #X2luX2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4ND
 #EyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDE3MDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2Mz
 #BCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEw
 #MzRCMzY0NTRDQUIyRTc4NDJDMzg5RjdEODhFQ0I3REYiLCAiZ2VuZXJhdG9yIGciOi
 #AiMDRFRUU1NzczMjBCMUMyNDFBNzk0MTlGQ0RFNTcxOEMyQjYzRjgxRUY4NzE3RDU2
 #QTU3RDJGQjI2QjY1QThCRUI2MzU3M0I1MjYwNUVGQjMyRkY0Q0YzMUFBRUY5QTkyRE
 #Y4NEU0RTg0MDhDQzZDN0NGMjdBNTM1QUFEMkIzOEE1NiJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-4">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 32 bytes)
      37574cfbf1b95ff6a8e2d7be462d4d01e6dde2618f34f4de9df869b2
      4f532c5d
  Outputs
    Ya: (length: 65 bytes)
      041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364
      692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c5d
      fdfc2ecdf8e42c5e16
    Alternative correct value for Ya: (-ya)*g:
    (length: 65 bytes)
      041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364
      692fdace1715a59cb0e63df85b2ad1529397e85e9c30d0d01dbf93a2
      0203d132071bd3a1e9
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-4">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 32 bytes)
      e5672fc9eb4e721f41d80181ec4c9fd9886668acc48024d33c82bb10
      2aecba52
  Outputs
    Yb: (length: 65 bytes)
      046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a
      cc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5ce8b677
      a7e38a26f752bf8f84
    Alternative correct value for Yb: (-yb)*g:
    (length: 65 bytes)
      046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a
      cc8ec3544890612d15def6ece092e1c0a1b9c2d2cdf3b0e0a4174988
      581c75d908ad40707b
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-4">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d
      7b8f6b6c
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d
      7b8f6b6c
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-4">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 140 bytes)
      41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e13
      64692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c
      5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8cd
      786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e921091320
      6d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f8403414462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 225 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f
      8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b
      6c41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e
      1364692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe340
      6c5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8
      cd786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e9210913
      206d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f84034144
      62
    ISK result: (length: 32 bytes)
      9565ed286b6e3cf1f943fd31746f9a22935537025a1328d4980005ba
      984f0c39
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-4">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 142 bytes)
      6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1
      617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5c
      e8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24fc0
      4c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19c2
      07a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e160341
      4461
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 227 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f
      8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b
      6c6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158c
      e1617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f
      5ce8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24f
      c04c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19
      c207a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e1603
      414461
    ISK result: (length: 32 bytes)
      62a445a4daa3546dd031c66ead2e4e015abbcc83bde31c90f841149f
      d441c58a
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-4">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      a7386d1c2eb06e8056d7fecbcf691e08d189d96236020ef31b414069
      8a4b99f9
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      d337dbc0dd797b4e6f2f14ea4925c58e5d5523871e8cb43a3c1b0f2b
      1a1ffde3
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-4">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x34,0xb3,0x64,0x54,0xca,0xb2,0xe7,0x84,0x2c,0x38,0x9f,0x7d,
 0x88,0xec,0xb7,0xdf,
};
const unsigned char tc_g[] = {
 0x04,0xee,0xe5,0x77,0x32,0x0b,0x1c,0x24,0x1a,0x79,0x41,0x9f,
 0xcd,0xe5,0x71,0x8c,0x2b,0x63,0xf8,0x1e,0xf8,0x71,0x7d,0x56,
 0xa5,0x7d,0x2f,0xb2,0x6b,0x65,0xa8,0xbe,0xb6,0x35,0x73,0xb5,
 0x26,0x05,0xef,0xb3,0x2f,0xf4,0xcf,0x31,0xaa,0xef,0x9a,0x92,
 0xdf,0x84,0xe4,0xe8,0x40,0x8c,0xc6,0xc7,0xcf,0x27,0xa5,0x35,
 0xaa,0xd2,0xb3,0x8a,0x56,
};
const unsigned char tc_ya[] = {
 0x37,0x57,0x4c,0xfb,0xf1,0xb9,0x5f,0xf6,0xa8,0xe2,0xd7,0xbe,
 0x46,0x2d,0x4d,0x01,0xe6,0xdd,0xe2,0x61,0x8f,0x34,0xf4,0xde,
 0x9d,0xf8,0x69,0xb2,0x4f,0x53,0x2c,0x5d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x1f,0x12,0xad,0x5f,0xc6,0x50,0x10,0xa2,0x4f,0xc0,0x4c,
 0x86,0x19,0x71,0x09,0xa3,0x6d,0xf0,0xe9,0xce,0x85,0xa7,0x47,
 0x9e,0x1e,0x13,0x64,0x69,0x2f,0xda,0xce,0x17,0xea,0x5a,0x63,
 0x4e,0x19,0xc2,0x07,0xa5,0xd5,0x2e,0xad,0x6c,0x68,0x17,0xa1,
 0x63,0xcf,0x2f,0x2f,0xe3,0x40,0x6c,0x5d,0xfd,0xfc,0x2e,0xcd,
 0xf8,0xe4,0x2c,0x5e,0x16,
};
const unsigned char tc_yb[] = {
 0xe5,0x67,0x2f,0xc9,0xeb,0x4e,0x72,0x1f,0x41,0xd8,0x01,0x81,
 0xec,0x4c,0x9f,0xd9,0x88,0x66,0x68,0xac,0xc4,0x80,0x24,0xd3,
 0x3c,0x82,0xbb,0x10,0x2a,0xec,0xba,0x52,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x6a,0x51,0x18,0x0b,0x6e,0xba,0xba,0xf5,0xed,0x0a,0xf8,
 0xcd,0x78,0x68,0x86,0xd9,0x33,0x42,0xbc,0xae,0x4c,0x15,0x8c,
 0xe1,0x61,0x7a,0x0a,0xcc,0x8e,0xc3,0x54,0x48,0x6f,0x9e,0xd2,
 0xe9,0x21,0x09,0x13,0x20,0x6d,0x1e,0x3f,0x5e,0x46,0x3d,0x2d,
 0x32,0x0c,0x4f,0x1f,0x5c,0xe8,0xb6,0x77,0xa7,0xe3,0x8a,0x26,
 0xf7,0x52,0xbf,0x8f,0x84,
};
const unsigned char tc_K[] = {
 0x3e,0x0e,0x2f,0x89,0x76,0xfb,0x8d,0x0d,0xee,0xe3,0x0a,0xef,
 0x4b,0x5c,0xd3,0x63,0x1e,0xed,0x24,0x9a,0xf3,0x2f,0x53,0xd0,
 0xdd,0x00,0x9b,0x5d,0x7b,0x8f,0x6b,0x6c,
};
const unsigned char tc_ISK_IR[] = {
 0x95,0x65,0xed,0x28,0x6b,0x6e,0x3c,0xf1,0xf9,0x43,0xfd,0x31,
 0x74,0x6f,0x9a,0x22,0x93,0x55,0x37,0x02,0x5a,0x13,0x28,0xd4,
 0x98,0x00,0x05,0xba,0x98,0x4f,0x0c,0x39,
};
const unsigned char tc_ISK_SY[] = {
 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e,
 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90,
 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a,
};
const unsigned char tc_ISK_SY[] = {
 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e,
 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90,
 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a,
};
const unsigned char tc_sid_out_ir[] = {
 0xa7,0x38,0x6d,0x1c,0x2e,0xb0,0x6e,0x80,0x56,0xd7,0xfe,0xcb,
 0xcf,0x69,0x1e,0x08,0xd1,0x89,0xd9,0x62,0x36,0x02,0x0e,0xf3,
 0x1b,0x41,0x40,0x69,0x8a,0x4b,0x99,0xf9,
};
const unsigned char tc_sid_out_oc[] = {
 0xd3,0x37,0xdb,0xc0,0xdd,0x79,0x7b,0x4e,0x6f,0x2f,0x14,0xea,
 0x49,0x25,0xc5,0x8e,0x5d,0x55,0x23,0x87,0x1e,0x8c,0xb4,0x3a,
 0x3c,0x1b,0x0f,0x2b,0x1a,0x1f,0xfd,0xe3,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-18">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIz
 #NEIzNjQ1NENBQjJFNzg0MkMzODlGN0Q4OEVDQjdERiIsICJnIjogIjA0RUVFNTc3Mz
 #IwQjFDMjQxQTc5NDE5RkNERTU3MThDMkI2M0Y4MUVGODcxN0Q1NkE1N0QyRkIyNkI2
 #NUE4QkVCNjM1NzNCNTI2MDVFRkIzMkZGNENGMzFBQUVGOUE5MkRGODRFNEU4NDA4Q0
 #M2QzdDRjI3QTUzNUFBRDJCMzhBNTYiLCAieWEiOiAiMzc1NzRDRkJGMUI5NUZGNkE4
 #RTJEN0JFNDYyRDREMDFFNkRERTI2MThGMzRGNERFOURGODY5QjI0RjUzMkM1RCIsIC
 #JBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MUYxMkFENUZDNjUwMTBBMjRGQzA0Qzg2
 #MTk3MTA5QTM2REYwRTlDRTg1QTc0NzlFMUUxMzY0NjkyRkRBQ0UxN0VBNUE2MzRFMT
 #lDMjA3QTVENTJFQUQ2QzY4MTdBMTYzQ0YyRjJGRTM0MDZDNURGREZDMkVDREY4RTQy
 #QzVFMTYiLCAieWIiOiAiRTU2NzJGQzlFQjRFNzIxRjQxRDgwMTgxRUM0QzlGRDk4OD
 #Y2NjhBQ0M0ODAyNEQzM0M4MkJCMTAyQUVDQkE1MiIsICJBRGIiOiAiNDE0NDYyIiwg
 #IlliIjogIjA0NkE1MTE4MEI2RUJBQkFGNUVEMEFGOENENzg2ODg2RDkzMzQyQkNBRT
 #RDMTU4Q0UxNjE3QTBBQ0M4RUMzNTQ0ODZGOUVEMkU5MjEwOTEzMjA2RDFFM0Y1RTQ2
 #M0QyRDMyMEM0RjFGNUNFOEI2NzdBN0UzOEEyNkY3NTJCRjhGODQiLCAiSyI6ICIzRT
 #BFMkY4OTc2RkI4RDBERUVFMzBBRUY0QjVDRDM2MzFFRUQyNDlBRjMyRjUzRDBERDAw
 #OUI1RDdCOEY2QjZDIiwgIklTS19JUiI6ICI5NTY1RUQyODZCNkUzQ0YxRjk0M0ZEMz
 #E3NDZGOUEyMjkzNTUzNzAyNUExMzI4RDQ5ODAwMDVCQTk4NEYwQzM5IiwgIklTS19T
 #WSI6ICI2MkE0NDVBNERBQTM1NDZERDAzMUM2NkVBRDJFNEUwMTVBQkJDQzgzQkRFMz
 #FDOTBGODQxMTQ5RkQ0NDFDNThBIiwgInNpZF9vdXRwdXRfaXIiOiAiQTczODZEMUMy
 #RUIwNkU4MDU2RDdGRUNCQ0Y2OTFFMDhEMTg5RDk2MjM2MDIwRUYzMUI0MTQwNjk4QT
 #RCOTlGOSIsICJzaWRfb3V0cHV0X29jIjogIkQzMzdEQkMwREQ3OTdCNEU2RjJGMTRF
 #QTQ5MjVDNThFNUQ1NTIzODcxRThDQjQzQTNDMUIwRjJCMUExRkZERTMifQ==
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    X: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5831
    G.scalar_mult(s,X) (full coordinates): (length: 65 bytes)
      04f5a191f078c87c36633b78c701751159d56c59f3fe9105b5720673
      470f303ab925b6a7fd1cdd8f649a21cf36b68d9e9c4a11919a951892
      519786104b27033757
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 32 bytes)
      f5a191f078c87c36633b78c701751159d56c59f3fe9105b572067347
      0f303ab9
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-2">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    Y_i1: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5857
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-19">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJGMDEyNTAxQzA5MUZGOUI5OUExMjNGRkZFNTcxRDhCQz
 #AxRTgwNzdFRTU4MTM2MkUxQkQyMTM5OTA4MzU2NDNCIiwgIlgiOiAiMDQyNDY0OEVC
 #OTg2QzJCRTBBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRD
 #EyQkE0RTBGNzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3
 #MzQ2RDEwQTRBQjI1MTRGQUVGNTgzMSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bG
 #wgY29vcmRpbmF0ZXMpIjogIjA0RjVBMTkxRjA3OEM4N0MzNjYzM0I3OEM3MDE3NTEx
 #NTlENTZDNTlGM0ZFOTEwNUI1NzIwNjczNDcwRjMwM0FCOTI1QjZBN0ZEMUNERDhGNj
 #Q5QTIxQ0YzNkI2OEQ5RTlDNEExMTkxOUE5NTE4OTI1MTk3ODYxMDRCMjcwMzM3NTci
 #LCAiRy5zY2FsYXJfbXVsdF92ZnkocyxYKSAob25seSBYLWNvb3JkaW5hdGUpIjogIk
 #Y1QTE5MUYwNzhDODdDMzY2MzNCNzhDNzAxNzUxMTU5RDU2QzU5RjNGRTkxMDVCNTcy
 #MDY3MzQ3MEYzMDNBQjkifSwgIkludmFsaWQgWTEiOiAiMDQyNDY0OEVCOTg2QzJCRT
 #BBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRDEyQkE0RTBG
 #NzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3MzQ2RDEwQT
 #RBQjI1MTRGQUVGNTg1NyIsICJJbnZhbGlkIFkyIjogIjAwIn0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-384-and-hash-sha-384">
        <name>Test vector for CPace using group NIST P-384 and hash SHA-384</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-384">
          <name>Test vectors for calculate_generator with group NIST P-384</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-384 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP384_XMD:SHA-384_SSWU_NU_'
    DST = b'CPaceP384_XMD:SHA-384_SSWU_NU__DST'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 5b3773aa90e8f23c61563a4b645b276c
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      1e4350616365503338345f584d443a5348412d3338345f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72105b3773aa90e8f23c61563a4b
      645b276c
    generator g: (length: 97 bytes)
      04ffe1bdc3293fdbe31b2959916e52c018e923eac99836bd9a1cbeec
      794a8d4d78baa32cdafc9685bc1067a780f4ad9c8a6c6e164aa42906
      d1e27f782581adc8e0109219626a2b8fbdc34602e4084554bdd6c0c6
      98dd657ac8e31b2bcce1c7b0d8
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-20">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0zODQiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0ODQxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5
 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiNUIzNzczQUE5MEU4RjIzQzYxNTYzQT
 #RCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu
 #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0OD
 #QxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0
 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwNUIzNzczQUE5MEU4RjIzQzYxNT
 #YzQTRCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yIGciOiAiMDRGRkUxQkRDMzI5M0ZEQkUz
 #MUIyOTU5OTE2RTUyQzAxOEU5MjNFQUM5OTgzNkJEOUExQ0JFRUM3OTRBOEQ0RDc4Qk
 #FBMzJDREFGQzk2ODVCQzEwNjdBNzgwRjRBRDlDOEE2QzZFMTY0QUE0MjkwNkQxRTI3
 #Rjc4MjU4MUFEQzhFMDEwOTIxOTYyNkEyQjhGQkRDMzQ2MDJFNDA4NDU1NEJERDZDME
 #M2OThERDY1N0FDOEUzMUIyQkNDRTFDN0IwRDgifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-5">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 48 bytes)
      ef433dd5ad142c860e7cb6400dd315d388d5ec5420c550e9d6f0907f
      375d988bc4d704837e43561c497e7dd93edcdb9d
  Outputs
    Ya: (length: 97 bytes)
      0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7
      3b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993a3
      6285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1770050
      a94d6826d52f211b234792e66d
    Alternative correct value for Ya: (-ya)*g:
    (length: 97 bytes)
      0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7
      3b96fa1ec78619c5a1e524472778331fbe009fa156b5cdfc1bd66c5c
      9d7a05ab193dbe7b02dd8ba737887e41e9000b924368f33e4d88ffaf
      55b297d92ad0dee4ddb86d1992
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-5">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 48 bytes)
      50b0e36b95a2edfaa8342b843dddc90b175330f2399c1b36586dedda
      3c255975f30be6a750f9404fccc62a6323b5e471
  Outputs
    Yb: (length: 97 bytes)
      040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d
      104cdaeb630b7c5c18748deb25653ad2a4cb5e6274841cad328bb031
      2628b9b1f51bea72b8c610999a6730f752649205ae85c452ef83f98b
      e715cd0103186874b07cf02074
    Alternative correct value for Yb: (-yb)*g:
    (length: 97 bytes)
      040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d
      104cdaeb630b7c5c18748deb25653ad2a4cb5e62747be352cd744fce
      d9d7464e0ae4158d4739ef666598cf08ad9b6dfa517a3bad0f7c0674
      17ea32fefce7978b50830fdf8b
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-5">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 48 bytes)
      a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6
      db858fe161de7576206a8a35bd4a60e00724fd3e
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6
      db858fe161de7576206a8a35bd4a60e00724fd3e
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-5">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 204 bytes)
      610434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310
      b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993
      a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b17700
      50a94d6826d52f211b234792e66d0341446161040a6559147fd492ad
      74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c5c18
      748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea72b8
      c610999a6730f752649205ae85c452ef83f98be715cd0103186874b0
      7cf0207403414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 305 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae
      a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f
      e161de7576206a8a35bd4a60e00724fd3e610434a04da121995d81d7
      c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5a1e5
      24472778331fbe009fa1564a3203e42993a36285fa54e6c24184fd22
      7458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b2347
      92e66d0341446161040a6559147fd492ad74ab1f4def6196fd639954
      0e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb5e62
      74841cad328bb0312628b9b1f51bea72b8c610999a6730f752649205
      ae85c452ef83f98be715cd0103186874b07cf0207403414462
    ISK result: (length: 48 bytes)
      d1b74375c7d63d7de246cbf3fc2b3092645c73a0aa816989c0de6048
      ed4ece6a54df82d05d2be3498cb9288be7bdbdb9
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-5">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 206 bytes)
      6f63610434a04da121995d81d7c5ded02cf2e70954dca49059485ea3
      8310b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e4
      2993a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1
      770050a94d6826d52f211b234792e66d0341446161040a6559147fd4
      92ad74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c
      5c18748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea
      72b8c610999a6730f752649205ae85c452ef83f98be715cd01031868
      74b07cf0207403414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 307 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae
      a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f
      e161de7576206a8a35bd4a60e00724fd3e6f63610434a04da121995d
      81d7c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5
      a1e524472778331fbe009fa1564a3203e42993a36285fa54e6c24184
      fd227458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b
      234792e66d0341446161040a6559147fd492ad74ab1f4def6196fd63
      99540e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb
      5e6274841cad328bb0312628b9b1f51bea72b8c610999a6730f75264
      9205ae85c452ef83f98be715cd0103186874b07cf0207403414462
    ISK result: (length: 48 bytes)
      a051d4532ca9fb6774e097ebac69c1d6a18144a15421dc155d0b1e8a
      ef9f9d8c0fe86e85d3cbee7796ff50171f42801b
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-5">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      8d5a03946a69ffa12cd6efd469fe8671bbc25fad6db2656f3963c94e
      9c940bdecc2bd555474c211817787d5cf7870ed1
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      c0729db25db40c48a35f787d5410b2cb9a2d9f5e9cf1cf159ed2f63c
      6b2185e597e176cc221422e9496eeda2bf123c8b
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-5">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x5b,0x37,0x73,0xaa,0x90,0xe8,0xf2,0x3c,0x61,0x56,0x3a,0x4b,
 0x64,0x5b,0x27,0x6c,
};
const unsigned char tc_g[] = {
 0x04,0xff,0xe1,0xbd,0xc3,0x29,0x3f,0xdb,0xe3,0x1b,0x29,0x59,
 0x91,0x6e,0x52,0xc0,0x18,0xe9,0x23,0xea,0xc9,0x98,0x36,0xbd,
 0x9a,0x1c,0xbe,0xec,0x79,0x4a,0x8d,0x4d,0x78,0xba,0xa3,0x2c,
 0xda,0xfc,0x96,0x85,0xbc,0x10,0x67,0xa7,0x80,0xf4,0xad,0x9c,
 0x8a,0x6c,0x6e,0x16,0x4a,0xa4,0x29,0x06,0xd1,0xe2,0x7f,0x78,
 0x25,0x81,0xad,0xc8,0xe0,0x10,0x92,0x19,0x62,0x6a,0x2b,0x8f,
 0xbd,0xc3,0x46,0x02,0xe4,0x08,0x45,0x54,0xbd,0xd6,0xc0,0xc6,
 0x98,0xdd,0x65,0x7a,0xc8,0xe3,0x1b,0x2b,0xcc,0xe1,0xc7,0xb0,
 0xd8,
};
const unsigned char tc_ya[] = {
 0xef,0x43,0x3d,0xd5,0xad,0x14,0x2c,0x86,0x0e,0x7c,0xb6,0x40,
 0x0d,0xd3,0x15,0xd3,0x88,0xd5,0xec,0x54,0x20,0xc5,0x50,0xe9,
 0xd6,0xf0,0x90,0x7f,0x37,0x5d,0x98,0x8b,0xc4,0xd7,0x04,0x83,
 0x7e,0x43,0x56,0x1c,0x49,0x7e,0x7d,0xd9,0x3e,0xdc,0xdb,0x9d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x34,0xa0,0x4d,0xa1,0x21,0x99,0x5d,0x81,0xd7,0xc5,0xde,
 0xd0,0x2c,0xf2,0xe7,0x09,0x54,0xdc,0xa4,0x90,0x59,0x48,0x5e,
 0xa3,0x83,0x10,0xb7,0x3b,0x96,0xfa,0x1e,0xc7,0x86,0x19,0xc5,
 0xa1,0xe5,0x24,0x47,0x27,0x78,0x33,0x1f,0xbe,0x00,0x9f,0xa1,
 0x56,0x4a,0x32,0x03,0xe4,0x29,0x93,0xa3,0x62,0x85,0xfa,0x54,
 0xe6,0xc2,0x41,0x84,0xfd,0x22,0x74,0x58,0xc8,0x77,0x81,0xbe,
 0x16,0xff,0xf4,0x6d,0xbc,0x97,0x0c,0xc1,0xb1,0x77,0x00,0x50,
 0xa9,0x4d,0x68,0x26,0xd5,0x2f,0x21,0x1b,0x23,0x47,0x92,0xe6,
 0x6d,
};
const unsigned char tc_yb[] = {
 0x50,0xb0,0xe3,0x6b,0x95,0xa2,0xed,0xfa,0xa8,0x34,0x2b,0x84,
 0x3d,0xdd,0xc9,0x0b,0x17,0x53,0x30,0xf2,0x39,0x9c,0x1b,0x36,
 0x58,0x6d,0xed,0xda,0x3c,0x25,0x59,0x75,0xf3,0x0b,0xe6,0xa7,
 0x50,0xf9,0x40,0x4f,0xcc,0xc6,0x2a,0x63,0x23,0xb5,0xe4,0x71,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x0a,0x65,0x59,0x14,0x7f,0xd4,0x92,0xad,0x74,0xab,0x1f,
 0x4d,0xef,0x61,0x96,0xfd,0x63,0x99,0x54,0x0e,0x84,0x70,0x62,
 0x27,0xa1,0xf9,0x0d,0x10,0x4c,0xda,0xeb,0x63,0x0b,0x7c,0x5c,
 0x18,0x74,0x8d,0xeb,0x25,0x65,0x3a,0xd2,0xa4,0xcb,0x5e,0x62,
 0x74,0x84,0x1c,0xad,0x32,0x8b,0xb0,0x31,0x26,0x28,0xb9,0xb1,
 0xf5,0x1b,0xea,0x72,0xb8,0xc6,0x10,0x99,0x9a,0x67,0x30,0xf7,
 0x52,0x64,0x92,0x05,0xae,0x85,0xc4,0x52,0xef,0x83,0xf9,0x8b,
 0xe7,0x15,0xcd,0x01,0x03,0x18,0x68,0x74,0xb0,0x7c,0xf0,0x20,
 0x74,
};
const unsigned char tc_K[] = {
 0xa9,0xac,0xae,0xa9,0x56,0x92,0xa6,0x44,0x62,0x06,0x7f,0xe8,
 0xe4,0x32,0x1f,0x2f,0xca,0x97,0x93,0xa8,0xa0,0x42,0x0f,0x0e,
 0x25,0x3e,0xd0,0xd6,0xdb,0x85,0x8f,0xe1,0x61,0xde,0x75,0x76,
 0x20,0x6a,0x8a,0x35,0xbd,0x4a,0x60,0xe0,0x07,0x24,0xfd,0x3e,
};
const unsigned char tc_ISK_IR[] = {
 0xd1,0xb7,0x43,0x75,0xc7,0xd6,0x3d,0x7d,0xe2,0x46,0xcb,0xf3,
 0xfc,0x2b,0x30,0x92,0x64,0x5c,0x73,0xa0,0xaa,0x81,0x69,0x89,
 0xc0,0xde,0x60,0x48,0xed,0x4e,0xce,0x6a,0x54,0xdf,0x82,0xd0,
 0x5d,0x2b,0xe3,0x49,0x8c,0xb9,0x28,0x8b,0xe7,0xbd,0xbd,0xb9,
};
const unsigned char tc_ISK_SY[] = {
 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb,
 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15,
 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85,
 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b,
};
const unsigned char tc_ISK_SY[] = {
 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb,
 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15,
 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85,
 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b,
};
const unsigned char tc_sid_out_ir[] = {
 0x8d,0x5a,0x03,0x94,0x6a,0x69,0xff,0xa1,0x2c,0xd6,0xef,0xd4,
 0x69,0xfe,0x86,0x71,0xbb,0xc2,0x5f,0xad,0x6d,0xb2,0x65,0x6f,
 0x39,0x63,0xc9,0x4e,0x9c,0x94,0x0b,0xde,0xcc,0x2b,0xd5,0x55,
 0x47,0x4c,0x21,0x18,0x17,0x78,0x7d,0x5c,0xf7,0x87,0x0e,0xd1,
};
const unsigned char tc_sid_out_oc[] = {
 0xc0,0x72,0x9d,0xb2,0x5d,0xb4,0x0c,0x48,0xa3,0x5f,0x78,0x7d,
 0x54,0x10,0xb2,0xcb,0x9a,0x2d,0x9f,0x5e,0x9c,0xf1,0xcf,0x15,
 0x9e,0xd2,0xf6,0x3c,0x6b,0x21,0x85,0xe5,0x97,0xe1,0x76,0xcc,
 0x22,0x14,0x22,0xe9,0x49,0x6e,0xed,0xa2,0xbf,0x12,0x3c,0x8b,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-21">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1
 #QjM3NzNBQTkwRThGMjNDNjE1NjNBNEI2NDVCMjc2QyIsICJnIjogIjA0RkZFMUJEQz
 #MyOTNGREJFMzFCMjk1OTkxNkU1MkMwMThFOTIzRUFDOTk4MzZCRDlBMUNCRUVDNzk0
 #QThENEQ3OEJBQTMyQ0RBRkM5Njg1QkMxMDY3QTc4MEY0QUQ5QzhBNkM2RTE2NEFBND
 #I5MDZEMUUyN0Y3ODI1ODFBREM4RTAxMDkyMTk2MjZBMkI4RkJEQzM0NjAyRTQwODQ1
 #NTRCREQ2QzBDNjk4REQ2NTdBQzhFMzFCMkJDQ0UxQzdCMEQ4IiwgInlhIjogIkVGND
 #MzREQ1QUQxNDJDODYwRTdDQjY0MDBERDMxNUQzODhENUVDNTQyMEM1NTBFOUQ2RjA5
 #MDdGMzc1RDk4OEJDNEQ3MDQ4MzdFNDM1NjFDNDk3RTdERDkzRURDREI5RCIsICJBRG
 #EiOiAiNDE0NDYxIiwgIllhIjogIjA0MzRBMDREQTEyMTk5NUQ4MUQ3QzVERUQwMkNG
 #MkU3MDk1NERDQTQ5MDU5NDg1RUEzODMxMEI3M0I5NkZBMUVDNzg2MTlDNUExRTUyND
 #Q3Mjc3ODMzMUZCRTAwOUZBMTU2NEEzMjAzRTQyOTkzQTM2Mjg1RkE1NEU2QzI0MTg0
 #RkQyMjc0NThDODc3ODFCRTE2RkZGNDZEQkM5NzBDQzFCMTc3MDA1MEE5NEQ2ODI2RD
 #UyRjIxMUIyMzQ3OTJFNjZEIiwgInliIjogIjUwQjBFMzZCOTVBMkVERkFBODM0MkI4
 #NDNERERDOTBCMTc1MzMwRjIzOTlDMUIzNjU4NkRFRERBM0MyNTU5NzVGMzBCRTZBNz
 #UwRjk0MDRGQ0NDNjJBNjMyM0I1RTQ3MSIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjog
 #IjA0MEE2NTU5MTQ3RkQ0OTJBRDc0QUIxRjRERUY2MTk2RkQ2Mzk5NTQwRTg0NzA2Mj
 #I3QTFGOTBEMTA0Q0RBRUI2MzBCN0M1QzE4NzQ4REVCMjU2NTNBRDJBNENCNUU2Mjc0
 #ODQxQ0FEMzI4QkIwMzEyNjI4QjlCMUY1MUJFQTcyQjhDNjEwOTk5QTY3MzBGNzUyNj
 #Q5MjA1QUU4NUM0NTJFRjgzRjk4QkU3MTVDRDAxMDMxODY4NzRCMDdDRjAyMDc0Iiwg
 #IksiOiAiQTlBQ0FFQTk1NjkyQTY0NDYyMDY3RkU4RTQzMjFGMkZDQTk3OTNBOEEwND
 #IwRjBFMjUzRUQwRDZEQjg1OEZFMTYxREU3NTc2MjA2QThBMzVCRDRBNjBFMDA3MjRG
 #RDNFIiwgIklTS19JUiI6ICJEMUI3NDM3NUM3RDYzRDdERTI0NkNCRjNGQzJCMzA5Mj
 #Y0NUM3M0EwQUE4MTY5ODlDMERFNjA0OEVENEVDRTZBNTRERjgyRDA1RDJCRTM0OThD
 #QjkyODhCRTdCREJEQjkiLCAiSVNLX1NZIjogIkEwNTFENDUzMkNBOUZCNjc3NEUwOT
 #dFQkFDNjlDMUQ2QTE4MTQ0QTE1NDIxREMxNTVEMEIxRThBRUY5RjlEOEMwRkU4NkU4
 #NUQzQ0JFRTc3OTZGRjUwMTcxRjQyODAxQiIsICJzaWRfb3V0cHV0X2lyIjogIjhENU
 #EwMzk0NkE2OUZGQTEyQ0Q2RUZENDY5RkU4NjcxQkJDMjVGQUQ2REIyNjU2RjM5NjND
 #OTRFOUM5NDBCREVDQzJCRDU1NTQ3NEMyMTE4MTc3ODdENUNGNzg3MEVEMSIsICJzaW
 #Rfb3V0cHV0X29jIjogIkMwNzI5REIyNURCNDBDNDhBMzVGNzg3RDU0MTBCMkNCOUEy
 #RDlGNUU5Q0YxQ0YxNTlFRDJGNjNDNkIyMTg1RTU5N0UxNzZDQzIyMTQyMkU5NDk2RU
 #VEQTJCRjEyM0M4QiJ9
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-1">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    X: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f4036e
    G.scalar_mult(s,X) (full coordinates): (length: 97 bytes)
      0465c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f6105873
      3173a033cda76c3e3ea5352b804e67fdbe2e334be8245dad5c8c993e
      63bacf0456478f29b71b6c859f13676f84ff150d2741f028f560584a
      0bdba19a63df62c08949c2fd6d
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 48 bytes)
      65c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f610587331
      73a033cda76c3e3ea5352b804e67fdbe2e334be8
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-3">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    Y_i1: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f40302
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-22">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI2RThBOTlBNUNERDQwOEVBRTk4RTFCOEFFRDI4NkU3Qj
 #EyQURCQkRBQzdGMkM2MjhEOTA2MENFOTJBRTBEOTBCRDU3QTU2NEZEMzUwMEZCQ0NF
 #MzQyNURDOTRCQTBBREUiLCAiWCI6ICIwNDVCNENENTNDNDUwNkNDMDRCQTRDNDRGMj
 #c2MkQ1RDMyQzNFNTVERjI1QjhCQUE1NTcxQjE2NTdBRDk1NzZFRkVBODI1OUYwNjg0
 #REUwNjVBNDcwNTg1QjRCRTg3Njc0OEM3Nzk3MDU0RjNERUZFRjIxQjc3RjgzRDUzQk
 #FDNTdDODlENTJBQTRENkRENTg3MkJEMjgxOTg5QjEzODM1OTY5ODAwOUY4QUMxRjMw
 #MTUzOEJBRENDRTlEOUY0MDM2RSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bGwgY2
 #9vcmRpbmF0ZXMpIjogIjA0NjVDMjhEQjA1RkQ5RjlBOTM2NTFDNUNDMzFFQUU0OUM0
 #RTUyNDZCNDY0ODlCOEY2MTA1ODczMzE3M0EwMzNDREE3NkMzRTNFQTUzNTJCODA0RT
 #Y3RkRCRTJFMzM0QkU4MjQ1REFENUM4Qzk5M0U2M0JBQ0YwNDU2NDc4RjI5QjcxQjZD
 #ODU5RjEzNjc2Rjg0RkYxNTBEMjc0MUYwMjhGNTYwNTg0QTBCREJBMTlBNjNERjYyQz
 #A4OTQ5QzJGRDZEIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29y
 #ZGluYXRlKSI6ICI2NUMyOERCMDVGRDlGOUE5MzY1MUM1Q0MzMUVBRTQ5QzRFNTI0Nk
 #I0NjQ4OUI4RjYxMDU4NzMzMTczQTAzM0NEQTc2QzNFM0VBNTM1MkI4MDRFNjdGREJF
 #MkUzMzRCRTgifSwgIkludmFsaWQgWTEiOiAiMDQ1QjRDRDUzQzQ1MDZDQzA0QkE0Qz
 #Q0RjI3NjJENUQzMkMzRTU1REYyNUI4QkFBNTU3MUIxNjU3QUQ5NTc2RUZFQTgyNTlG
 #MDY4NERFMDY1QTQ3MDU4NUI0QkU4NzY3NDhDNzc5NzA1NEYzREVGRUYyMUI3N0Y4M0
 #Q1M0JBQzU3Qzg5RDUyQUE0RDZERDU4NzJCRDI4MTk4OUIxMzgzNTk2OTgwMDlGOEFD
 #MUYzMDE1MzhCQURDQ0U5RDlGNDAzMDIiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-521-and-hash-sha-512">
        <name>Test vector for CPace using group NIST P-521 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-521">
          <name>Test vectors for calculate_generator with group NIST P-521</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP521_XMD:SHA-512_SSWU_NU_'
    DST = b'CPaceP521_XMD:SHA-512_SSWU_NU__DST'
    CI = b'oc\x0bB_responder\x0bA_initiator'
    CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 172 bytes)
      1e4350616365503532315f584d443a5348412d3531325f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000001a6f630b425f726573706f6e
      6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79
      fb7f2c57
    generator g: (length: 133 bytes)
      0400e58a8fbf08b38e34a3676f6d690bed58aa4115ff32a57ec87172
      fc2a1fb89d03258c6429c464981b3284b5fedbd1244bf27432008868
      7065b9075dd558e14ed69901d2162db1ba3a49c97dca7c902cb1b96b
      abe21a31942114c860665b35c46b8213f6de17194de54c441083dd11
      63d5907adad8824bb1307dcf6a55c11a8f01d9789b
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-23">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0ODQxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5
 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiN0U0QjQ3OTFENkE4RUYwMTlCOTM2Qz
 #c5RkI3RjJDNTciLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu
 #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0OD
 #QxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0
 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwN0U0QjQ3OTFENkE4RUYwMTlCOT
 #M2Qzc5RkI3RjJDNTciLCAiZ2VuZXJhdG9yIGciOiAiMDQwMEU1OEE4RkJGMDhCMzhF
 #MzRBMzY3NkY2RDY5MEJFRDU4QUE0MTE1RkYzMkE1N0VDODcxNzJGQzJBMUZCODlEMD
 #MyNThDNjQyOUM0NjQ5ODFCMzI4NEI1RkVEQkQxMjQ0QkYyNzQzMjAwODg2ODcwNjVC
 #OTA3NURENTU4RTE0RUQ2OTkwMUQyMTYyREIxQkEzQTQ5Qzk3RENBN0M5MDJDQjFCOT
 #ZCQUJFMjFBMzE5NDIxMTRDODYwNjY1QjM1QzQ2QjgyMTNGNkRFMTcxOTRERTU0QzQ0
 #MTA4M0REMTE2M0Q1OTA3QURBRDg4MjRCQjEzMDdEQ0Y2QTU1QzExQThGMDFEOTc4OU
 #IifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-6">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 66 bytes)
      006367e9c2aeff9f1db19af600cca73343d47cbe446cebbd1ccd783f
      82755a872da86fd0707eb3767c6114f1803deb62d63bdd1e613f67e6
      3e8c141ee5310e3ee819
  Outputs
    Ya: (length: 133 bytes)
      0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f
      30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090
      7312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c43961ef
      60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f12254
      e6f9950dd01fa8e26a8b20736fb63c63c81094f681
    Alternative correct value for Ya: (-ya)*g:
    (length: 133 bytes)
      0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f
      30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090
      7312eb724cddb4dcce675b016752bff0107f1e214b43e8a93bc69e10
      9f47a0d29d12ba7bab1ee9e95a2e20e1a7f69c97de58c99d060eddab
      19066af22fe0571d9574df8c9049c39c37ef6b097e
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-6">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 66 bytes)
      009227bf8dc741dacc9422f8bf3c0e96fce9587bc562eaafe0dc5f6f
      82f28594e4a6f98553560c62b75fa4abb198cecbbb86ebd41b0ea025
      4cde78ac68d39a240ae7
  Outputs
    Yb: (length: 133 bytes)
      0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c
      709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21
      8bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c818
      ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92f4
      03e0fa3207de8bb41b388d81046a298ed8ddac9b2a
    Alternative correct value for Yb: (-yb)*g:
    (length: 133 bytes)
      0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c
      709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21
      8bfaeb3e1ffd9f19bf062d00094ea363c9ae41b3f7450fe113da37e7
      11ed39123b9df9bb4e26830db07978cd2a901ba31871cfd3dde36d0b
      fc1f05cdf821744be4c7727efb95d67127225364d5
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-6">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 66 bytes)
      018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509
      516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30
      832c23d477c991bea8e5
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509
      516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30
      832c23d477c991bea8e5
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-6">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 278 bytes)
      85010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5
      381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff76
      80907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c439
      61ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f1
      2254e6f9950dd01fa8e26a8b20736fb63c63c81094f6810341446185
      010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f7
      0c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa
      218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c8
      18ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92
      f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 397 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e
      7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78
      7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23
      d477c991bea8e585010400c2bfd794467f4438277e85a42e101fa406
      1e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad00985
      7488db7130ff7680907312eb724cddb4dcce675b0098ad400fef80e1
      deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e580963
      6821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094
      f6810341446185010400706ea69b2b7167773248ea6e69a574e9dd2f
      f8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03fc24
      2e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c
      08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56fe45c
      e78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b
      2a03414462
    ISK result: (length: 64 bytes)
      1669a0a29726adc7eea2510d6f7e004a135fa63ac3c9f9e6ce53cba5
      d5e3781aced515956041e43358409a13ef90ddc3c36fd8d7d81424c8
      e94592e21854260a
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-6">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 280 bytes)
      6f6385010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f
      81e5381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130
      ff7680907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756
      c43961ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662
      f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094f681034144
      6185010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e
      07f70c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316af
      e2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec
      25c818ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c22
      1c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 399 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e
      7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78
      7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23
      d477c991bea8e56f6385010400c2bfd794467f4438277e85a42e101f
      a4061e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad0
      09857488db7130ff7680907312eb724cddb4dcce675b0098ad400fef
      80e1deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e58
      09636821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c8
      1094f6810341446185010400706ea69b2b7167773248ea6e69a574e9
      dd2ff8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03
      fc242e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651
      be4c08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56f
      e45ce78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8dd
      ac9b2a03414462
    ISK result: (length: 64 bytes)
      f2f3bd8cd442a4e16659b47a7b7a84f29be75893ed2e5f772d7a3c8b
      779eb0df937a4ec50a4f1ff01ebbaa97d80e090ea69b00a95200ed25
      8e48c6f7e9d8fbc2
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-6">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      56cc3cd8be77cdc84c0d1906de1ffc8ef7cbb326a3f05267b6e8c634
      4e2781eb20ef725e84cb1bb45927435051b4e0fae78e975bf15099f9
      e38d755413eee2fd
    H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      a46c7189ba6a36c4447741e057da39c885b7d59e08bd2df1852a5271
      f2a8a2e9b187ccd07325a3eede646adee0c06fe58da77f74177896b2
      1053c5d107de006d
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-6">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,
 0x6f,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x04,0x00,0xe5,0x8a,0x8f,0xbf,0x08,0xb3,0x8e,0x34,0xa3,0x67,
 0x6f,0x6d,0x69,0x0b,0xed,0x58,0xaa,0x41,0x15,0xff,0x32,0xa5,
 0x7e,0xc8,0x71,0x72,0xfc,0x2a,0x1f,0xb8,0x9d,0x03,0x25,0x8c,
 0x64,0x29,0xc4,0x64,0x98,0x1b,0x32,0x84,0xb5,0xfe,0xdb,0xd1,
 0x24,0x4b,0xf2,0x74,0x32,0x00,0x88,0x68,0x70,0x65,0xb9,0x07,
 0x5d,0xd5,0x58,0xe1,0x4e,0xd6,0x99,0x01,0xd2,0x16,0x2d,0xb1,
 0xba,0x3a,0x49,0xc9,0x7d,0xca,0x7c,0x90,0x2c,0xb1,0xb9,0x6b,
 0xab,0xe2,0x1a,0x31,0x94,0x21,0x14,0xc8,0x60,0x66,0x5b,0x35,
 0xc4,0x6b,0x82,0x13,0xf6,0xde,0x17,0x19,0x4d,0xe5,0x4c,0x44,
 0x10,0x83,0xdd,0x11,0x63,0xd5,0x90,0x7a,0xda,0xd8,0x82,0x4b,
 0xb1,0x30,0x7d,0xcf,0x6a,0x55,0xc1,0x1a,0x8f,0x01,0xd9,0x78,
 0x9b,
};
const unsigned char tc_ya[] = {
 0x00,0x63,0x67,0xe9,0xc2,0xae,0xff,0x9f,0x1d,0xb1,0x9a,0xf6,
 0x00,0xcc,0xa7,0x33,0x43,0xd4,0x7c,0xbe,0x44,0x6c,0xeb,0xbd,
 0x1c,0xcd,0x78,0x3f,0x82,0x75,0x5a,0x87,0x2d,0xa8,0x6f,0xd0,
 0x70,0x7e,0xb3,0x76,0x7c,0x61,0x14,0xf1,0x80,0x3d,0xeb,0x62,
 0xd6,0x3b,0xdd,0x1e,0x61,0x3f,0x67,0xe6,0x3e,0x8c,0x14,0x1e,
 0xe5,0x31,0x0e,0x3e,0xe8,0x19,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x00,0xc2,0xbf,0xd7,0x94,0x46,0x7f,0x44,0x38,0x27,0x7e,
 0x85,0xa4,0x2e,0x10,0x1f,0xa4,0x06,0x1e,0x1e,0xf6,0xe0,0x5f,
 0x81,0xe5,0x38,0x1f,0x30,0xe7,0x3b,0x34,0x1d,0xd7,0x26,0x08,
 0x9c,0xb6,0xa6,0xbb,0xe5,0xa5,0x09,0xfa,0xd0,0x09,0x85,0x74,
 0x88,0xdb,0x71,0x30,0xff,0x76,0x80,0x90,0x73,0x12,0xeb,0x72,
 0x4c,0xdd,0xb4,0xdc,0xce,0x67,0x5b,0x00,0x98,0xad,0x40,0x0f,
 0xef,0x80,0xe1,0xde,0xb4,0xbc,0x17,0x56,0xc4,0x39,0x61,0xef,
 0x60,0xb8,0x5f,0x2d,0x62,0xed,0x45,0x84,0x54,0xe1,0x16,0x16,
 0xa5,0xd1,0xdf,0x1e,0x58,0x09,0x63,0x68,0x21,0xa7,0x36,0x62,
 0xf9,0xf1,0x22,0x54,0xe6,0xf9,0x95,0x0d,0xd0,0x1f,0xa8,0xe2,
 0x6a,0x8b,0x20,0x73,0x6f,0xb6,0x3c,0x63,0xc8,0x10,0x94,0xf6,
 0x81,
};
const unsigned char tc_yb[] = {
 0x00,0x92,0x27,0xbf,0x8d,0xc7,0x41,0xda,0xcc,0x94,0x22,0xf8,
 0xbf,0x3c,0x0e,0x96,0xfc,0xe9,0x58,0x7b,0xc5,0x62,0xea,0xaf,
 0xe0,0xdc,0x5f,0x6f,0x82,0xf2,0x85,0x94,0xe4,0xa6,0xf9,0x85,
 0x53,0x56,0x0c,0x62,0xb7,0x5f,0xa4,0xab,0xb1,0x98,0xce,0xcb,
 0xbb,0x86,0xeb,0xd4,0x1b,0x0e,0xa0,0x25,0x4c,0xde,0x78,0xac,
 0x68,0xd3,0x9a,0x24,0x0a,0xe7,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x00,0x70,0x6e,0xa6,0x9b,0x2b,0x71,0x67,0x77,0x32,0x48,
 0xea,0x6e,0x69,0xa5,0x74,0xe9,0xdd,0x2f,0xf8,0xa3,0xd0,0x4a,
 0x6e,0x07,0xf7,0x0c,0x70,0x98,0x69,0xca,0x48,0x68,0x27,0xd5,
 0x9f,0x92,0x90,0x59,0x9d,0x1c,0xf9,0x4e,0x1a,0x03,0xfc,0x24,
 0x2e,0x2b,0x13,0x16,0xaf,0xe2,0xfa,0x21,0x8b,0xfa,0xeb,0x3e,
 0x1f,0xfd,0x9f,0x19,0xbf,0x06,0x2d,0x01,0xf6,0xb1,0x5c,0x9c,
 0x36,0x51,0xbe,0x4c,0x08,0xba,0xf0,0x1e,0xec,0x25,0xc8,0x18,
 0xee,0x12,0xc6,0xed,0xc4,0x62,0x06,0x44,0xb1,0xd9,0x7c,0xf2,
 0x4f,0x86,0x87,0x32,0xd5,0x6f,0xe4,0x5c,0xe7,0x8e,0x30,0x2c,
 0x22,0x1c,0x92,0xf4,0x03,0xe0,0xfa,0x32,0x07,0xde,0x8b,0xb4,
 0x1b,0x38,0x8d,0x81,0x04,0x6a,0x29,0x8e,0xd8,0xdd,0xac,0x9b,
 0x2a,
};
const unsigned char tc_K[] = {
 0x01,0x8e,0x0e,0x7e,0x9a,0xde,0x74,0x91,0x7c,0x11,0xc0,0xf6,
 0xb5,0x2f,0x95,0xed,0x87,0x1e,0xab,0x23,0x54,0x37,0xcb,0xee,
 0x8b,0x5c,0x25,0x09,0x51,0x6e,0x78,0x7a,0x80,0xe8,0x25,0xed,
 0x5d,0x53,0x9f,0xa6,0xa0,0xec,0x32,0xc4,0x8f,0xa8,0xfa,0xbe,
 0x85,0x80,0x9d,0x00,0x0d,0x0c,0xfd,0x30,0x83,0x2c,0x23,0xd4,
 0x77,0xc9,0x91,0xbe,0xa8,0xe5,
};
const unsigned char tc_ISK_IR[] = {
 0x16,0x69,0xa0,0xa2,0x97,0x26,0xad,0xc7,0xee,0xa2,0x51,0x0d,
 0x6f,0x7e,0x00,0x4a,0x13,0x5f,0xa6,0x3a,0xc3,0xc9,0xf9,0xe6,
 0xce,0x53,0xcb,0xa5,0xd5,0xe3,0x78,0x1a,0xce,0xd5,0x15,0x95,
 0x60,0x41,0xe4,0x33,0x58,0x40,0x9a,0x13,0xef,0x90,0xdd,0xc3,
 0xc3,0x6f,0xd8,0xd7,0xd8,0x14,0x24,0xc8,0xe9,0x45,0x92,0xe2,
 0x18,0x54,0x26,0x0a,
};
const unsigned char tc_ISK_SY[] = {
 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a,
 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77,
 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5,
 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e,
 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7,
 0xe9,0xd8,0xfb,0xc2,
};
const unsigned char tc_ISK_SY[] = {
 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a,
 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77,
 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5,
 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e,
 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7,
 0xe9,0xd8,0xfb,0xc2,
};
const unsigned char tc_sid_out_ir[] = {
 0x56,0xcc,0x3c,0xd8,0xbe,0x77,0xcd,0xc8,0x4c,0x0d,0x19,0x06,
 0xde,0x1f,0xfc,0x8e,0xf7,0xcb,0xb3,0x26,0xa3,0xf0,0x52,0x67,
 0xb6,0xe8,0xc6,0x34,0x4e,0x27,0x81,0xeb,0x20,0xef,0x72,0x5e,
 0x84,0xcb,0x1b,0xb4,0x59,0x27,0x43,0x50,0x51,0xb4,0xe0,0xfa,
 0xe7,0x8e,0x97,0x5b,0xf1,0x50,0x99,0xf9,0xe3,0x8d,0x75,0x54,
 0x13,0xee,0xe2,0xfd,
};
const unsigned char tc_sid_out_oc[] = {
 0xa4,0x6c,0x71,0x89,0xba,0x6a,0x36,0xc4,0x44,0x77,0x41,0xe0,
 0x57,0xda,0x39,0xc8,0x85,0xb7,0xd5,0x9e,0x08,0xbd,0x2d,0xf1,
 0x85,0x2a,0x52,0x71,0xf2,0xa8,0xa2,0xe9,0xb1,0x87,0xcc,0xd0,
 0x73,0x25,0xa3,0xee,0xde,0x64,0x6a,0xde,0xe0,0xc0,0x6f,0xe5,
 0x8d,0xa7,0x7f,0x74,0x17,0x78,0x96,0xb2,0x10,0x53,0xc5,0xd1,
 0x07,0xde,0x00,0x6d,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-24">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT
 #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3
 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjA0MDBFNThBOE
 #ZCRjA4QjM4RTM0QTM2NzZGNkQ2OTBCRUQ1OEFBNDExNUZGMzJBNTdFQzg3MTcyRkMy
 #QTFGQjg5RDAzMjU4QzY0MjlDNDY0OTgxQjMyODRCNUZFREJEMTI0NEJGMjc0MzIwMD
 #g4Njg3MDY1QjkwNzVERDU1OEUxNEVENjk5MDFEMjE2MkRCMUJBM0E0OUM5N0RDQTdD
 #OTAyQ0IxQjk2QkFCRTIxQTMxOTQyMTE0Qzg2MDY2NUIzNUM0NkI4MjEzRjZERTE3MT
 #k0REU1NEM0NDEwODNERDExNjNENTkwN0FEQUQ4ODI0QkIxMzA3RENGNkE1NUMxMUE4
 #RjAxRDk3ODlCIiwgInlhIjogIjAwNjM2N0U5QzJBRUZGOUYxREIxOUFGNjAwQ0NBNz
 #MzNDNENDdDQkU0NDZDRUJCRDFDQ0Q3ODNGODI3NTVBODcyREE4NkZEMDcwN0VCMzc2
 #N0M2MTE0RjE4MDNERUI2MkQ2M0JERDFFNjEzRjY3RTYzRThDMTQxRUU1MzEwRTNFRT
 #gxOSIsICJBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MDBDMkJGRDc5NDQ2N0Y0NDM4
 #Mjc3RTg1QTQyRTEwMUZBNDA2MUUxRUY2RTA1RjgxRTUzODFGMzBFNzNCMzQxREQ3Mj
 #YwODlDQjZBNkJCRTVBNTA5RkFEMDA5ODU3NDg4REI3MTMwRkY3NjgwOTA3MzEyRUI3
 #MjRDRERCNERDQ0U2NzVCMDA5OEFENDAwRkVGODBFMURFQjRCQzE3NTZDNDM5NjFFRj
 #YwQjg1RjJENjJFRDQ1ODQ1NEUxMTYxNkE1RDFERjFFNTgwOTYzNjgyMUE3MzY2MkY5
 #RjEyMjU0RTZGOTk1MEREMDFGQThFMjZBOEIyMDczNkZCNjNDNjNDODEwOTRGNjgxIi
 #wgInliIjogIjAwOTIyN0JGOERDNzQxREFDQzk0MjJGOEJGM0MwRTk2RkNFOTU4N0JD
 #NTYyRUFBRkUwREM1RjZGODJGMjg1OTRFNEE2Rjk4NTUzNTYwQzYyQjc1RkE0QUJCMT
 #k4Q0VDQkJCODZFQkQ0MUIwRUEwMjU0Q0RFNzhBQzY4RDM5QTI0MEFFNyIsICJBRGIi
 #OiAiNDE0NDYyIiwgIlliIjogIjA0MDA3MDZFQTY5QjJCNzE2Nzc3MzI0OEVBNkU2OU
 #E1NzRFOUREMkZGOEEzRDA0QTZFMDdGNzBDNzA5ODY5Q0E0ODY4MjdENTlGOTI5MDU5
 #OUQxQ0Y5NEUxQTAzRkMyNDJFMkIxMzE2QUZFMkZBMjE4QkZBRUIzRTFGRkQ5RjE5Qk
 #YwNjJEMDFGNkIxNUM5QzM2NTFCRTRDMDhCQUYwMUVFQzI1QzgxOEVFMTJDNkVEQzQ2
 #MjA2NDRCMUQ5N0NGMjRGODY4NzMyRDU2RkU0NUNFNzhFMzAyQzIyMUM5MkY0MDNFME
 #ZBMzIwN0RFOEJCNDFCMzg4RDgxMDQ2QTI5OEVEOEREQUM5QjJBIiwgIksiOiAiMDE4
 #RTBFN0U5QURFNzQ5MTdDMTFDMEY2QjUyRjk1RUQ4NzFFQUIyMzU0MzdDQkVFOEI1Qz
 #I1MDk1MTZFNzg3QTgwRTgyNUVENUQ1MzlGQTZBMEVDMzJDNDhGQThGQUJFODU4MDlE
 #MDAwRDBDRkQzMDgzMkMyM0Q0NzdDOTkxQkVBOEU1IiwgIklTS19JUiI6ICIxNjY5QT
 #BBMjk3MjZBREM3RUVBMjUxMEQ2RjdFMDA0QTEzNUZBNjNBQzNDOUY5RTZDRTUzQ0JB
 #NUQ1RTM3ODFBQ0VENTE1OTU2MDQxRTQzMzU4NDA5QTEzRUY5MEREQzNDMzZGRDhEN0
 #Q4MTQyNEM4RTk0NTkyRTIxODU0MjYwQSIsICJJU0tfU1kiOiAiRjJGM0JEOENENDQy
 #QTRFMTY2NTlCNDdBN0I3QTg0RjI5QkU3NTg5M0VEMkU1Rjc3MkQ3QTNDOEI3NzlFQj
 #BERjkzN0E0RUM1MEE0RjFGRjAxRUJCQUE5N0Q4MEUwOTBFQTY5QjAwQTk1MjAwRUQy
 #NThFNDhDNkY3RTlEOEZCQzIiLCAic2lkX291dHB1dF9pciI6ICI1NkNDM0NEOEJFNz
 #dDREM4NEMwRDE5MDZERTFGRkM4RUY3Q0JCMzI2QTNGMDUyNjdCNkU4QzYzNDRFMjc4
 #MUVCMjBFRjcyNUU4NENCMUJCNDU5Mjc0MzUwNTFCNEUwRkFFNzhFOTc1QkYxNTA5OU
 #Y5RTM4RDc1NTQxM0VFRTJGRCIsICJzaWRfb3V0cHV0X29jIjogIkE0NkM3MTg5QkE2
 #QTM2QzQ0NDc3NDFFMDU3REEzOUM4ODVCN0Q1OUUwOEJEMkRGMTg1MkE1MjcxRjJBOE
 #EyRTlCMTg3Q0NEMDczMjVBM0VFREU2NDZBREVFMEMwNkZFNThEQTc3Rjc0MTc3ODk2
 #QjIxMDUzQzVEMTA3REUwMDZEIn0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-2">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    X: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfab9
    G.scalar_mult(s,X) (full coordinates): (length: 133 bytes)
      040122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7
      c73cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517c
      df6d99a8a2d6db19ef27bd0055af9e8ddcf337ce0a7c22a9c8099bc4
      a44faeded1eb72effd26e4f322217b67d60b944b267b3df5046078fd
      577f1785728f49b241fd5e8c83223a994a2d219281
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 66 bytes)
      0122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7c7
      3cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517cdf
      6d99a8a2d6db19ef27bd
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-4">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    Y_i1: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfaf9
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-25">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICIwMTgyREQ3OTI1RjE3NTM0MTlFNEJGODM0Mjk3NjNBQ0
 #QzN0Q2NDAwMENENUExNzVFREY1M0ExNTg3REQ5ODZCQzk1QUNDMTUwNjk5MTcwMkI2
 #QkExQTlFRTI0NThGRUU4RUZDMDAxOThDRjAwODhDNDgwOTY1RUY2NUZGMjA0OEI4NT
 #YiLCAiWCI6ICIwNDAwREM1MDc4QjI0QzRBRjE2MjBDQzEwRkJFQ0M2Q0Q4Q0YxQ0FC
 #MEIwMTFFRkI3M0M3ODJGMjI2REMyMUM3Q0E3RUI0MDZCRTc0QTY5RUNCQTVCNEE4N0
 #MwN0NGQzZFNjg3QjRCRUNBOUE2RURBQzk1OTQwQTNCNDEyMDU3M0IyNkE4MDAwNUU2
 #OTc4MzNCMEJBMjg1RkNFN0IzRjFGMjUyNDMwMDg4NjBCOEYxREU3MTBBMERDQzA1Qj
 #BEMjAzNDFFRkU5MEVCMkJDQ0EyNjc5N0MyRDg1QUU2Q0E3NEMwMDY5NkNCMUIxM0U0
 #MEJEQTE1QjI3OTY0RDc2NzA1NzY2NDdCRkFCOSIsICJHLnNjYWxhcl9tdWx0KHMsWC
 #kgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0MDEyMkY4OENFNzNFQzVBQTJEMUM4QzVE
 #MDQxNDg3NjBDM0Q5N0JBODdEQUExMEQ4Q0I4QkI3QzczQ0Y2RTk1MUZDOTIyNzIxQk
 #YxNDM3OTk1Q0ZCMTNFMTMyQTc4QkVCODYzODlFNjBEMzUxN0NERjZEOTlBOEEyRDZE
 #QjE5RUYyN0JEMDA1NUFGOUU4RERDRjMzN0NFMEE3QzIyQTlDODA5OUJDNEE0NEZBRU
 #RFRDFFQjcyRUZGRDI2RTRGMzIyMjE3QjY3RDYwQjk0NEIyNjdCM0RGNTA0NjA3OEZE
 #NTc3RjE3ODU3MjhGNDlCMjQxRkQ1RThDODMyMjNBOTk0QTJEMjE5MjgxIiwgIkcuc2
 #NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29yZGluYXRlKSI6ICIwMTIyRjg4
 #Q0U3M0VDNUFBMkQxQzhDNUQwNDE0ODc2MEMzRDk3QkE4N0RBQTEwRDhDQjhCQjdDNz
 #NDRjZFOTUxRkM5MjI3MjFCRjE0Mzc5OTVDRkIxM0UxMzJBNzhCRUI4NjM4OUU2MEQz
 #NTE3Q0RGNkQ5OUE4QTJENkRCMTlFRjI3QkQifSwgIkludmFsaWQgWTEiOiAiMDQwME
 #RDNTA3OEIyNEM0QUYxNjIwQ0MxMEZCRUNDNkNEOENGMUNBQjBCMDExRUZCNzNDNzgy
 #RjIyNkRDMjFDN0NBN0VCNDA2QkU3NEE2OUVDQkE1QjRBODdDMDdDRkM2RTY4N0I0Qk
 #VDQTlBNkVEQUM5NTk0MEEzQjQxMjA1NzNCMjZBODAwMDVFNjk3ODMzQjBCQTI4NUZD
 #RTdCM0YxRjI1MjQzMDA4ODYwQjhGMURFNzEwQTBEQ0MwNUIwRDIwMzQxRUZFOTBFQj
 #JCQ0NBMjY3OTdDMkQ4NUFFNkNBNzRDMDA2OTZDQjFCMTNFNDBCREExNUIyNzk2NEQ3
 #NjcwNTc2NjQ3QkZBRjkiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963bbSJIg/J9PgVGd3ZK6KRYAAry42z0riZRMu0iZFOmy
XO7RwY0UJF5UBGmJrO55ln2W78m+uGQmEiAoy1XVs7PnrOuULZFAZmRk3DMi
8vj4uLSKV9PolXH23guisuEZvjf15kEUGsFi9rBIPH8aGe9P3rVLnu8voy/i
yVK4CObeDF4Ml954dRwvV+PjYLycHAcP8PWx5ZZCbxW9KgXw92Sx3Lwy4vl4
UXpcLO8ny8X6AcY5H1yUktUy8mavjM5geF4qxQ/LV8ZquU5Wtmk2Tbt0H23g
jRC+n6+i5TxaHbdwuhK8583DG2+6mAMImygpPcSvjJ9Xi6BsJIslDDpO4KfN
DH/4e6nkrVe3i+WrknFsABzJK6NbMU780JtOvZIBf3gp3Ti4jaaZLxbLySuj
Fz2tE3j1ypsb50vATpwEC/o6mnnx9JUxoxcrHr/4vyb4aQXwl853WjHeeF4S
abOd3i1gSdrHNFd7Hi6jJDH+DF+sk2hp/Bj/so5D42TuTTdJjGBcRMtpPJ9E
cx0En0arzCq3ON7/eoz8Shil87+F+WFYff6362nsaZ/S9J3TrjGIkshbBrdG
e71cPEQwxqf1ElaoT3eHL9/iu7a23NJ8sZx5q/gLbLxhXLXPrFf0kqCxA/jE
sGCN02n8sIoD42y9/BIZZ8vNw2oxWXoPt5sDft5bTqLVK+N2tXp49cMPj4+P
lSQKJhUA8Qf4wTr+YlcewjE9S2RmdL1N2UCioc/UdtOfY/GvWOIVko63DBNj
vFga7fE4DuJovsqAYVwgjRqHAPDFUQne77Tbbataq2bWI0cyrh6iIIZxYOmL
OY/7fu1PYYXvok1m4DKNZOBQGvQAuAnUDwyioa99ZWfRN7yNjO9/WXvz1Xpm
ePP5YgNU8L3xgJu0XG2Mxdh48JIEGeYYMQCLQpCAlYGNjOgpuPWAavB54JPF
NKns4DoBZEcPy3i+qsResCR826Zt/VBr1p5FLNFYu2K0vdViXvxtqwL4ivwY
GAu+ODl99+PH3PpOppPIX3qAtZPwS7RMvGUcJfCyAUsxRvOYPpsaZ0IuxdMY
Fg38OItQqnzDaizbanx9OTkRUfT9qbf0AZTi74Hl3nmr7d4vf1wkyd4vP64J
S2/e5HB0FQXAi7BuT8oD2HWWyC9fvuX8/tVnBFrRCliwwMenF2/e2k5WEADi
WKu8Sjd2ulFbCyoHGactSXa8XMxAXiUr470g8CQrKEAe3lcSXOwkWqIo+gHe
fACV8YNlVizTrP/QrDeOq8dm1TquNar15rFz8wKK/toWv6uAMJ5Ogfu+gobC
b68qxlvAQ3AfI5rOWt33pptFUzda3k+j45Y3m3goZwbRlziJgaNfGW8Wj8Zq
ARibgwpdByvQ3G+85NY4X88DlEKMH1AgwEMoWF6puQ8684NXyGKo5om/WEBN
F5MNyPqzwfX74SWKJDd95cGbRAm85VTNY8dpqC9al51XhkSxZblVF1jrxq4V
EmO4iIkI9z2vZKH79Z15ewzYO1sslbRRWi3y5sdXke8lK5DquUdI/guCi1li
/rh+imb+Yr2cFE90XTFaizBOctNcR19AAceb3JfCXHg0rkEiaTMVj31WAb0F
pOutw9zwZ6BPgAl2vv0NC3hfAV0EkHq5Kd4vgVxAl+S/3bsEeOK88/4KREhO
qb85Oa4qXQgDR8vZekWq8PgUJETIhAlfA0OvIngK+Pv4cr16WK8UuSa7ih9J
Zv5l+rD2k8o8TlaVyeLLD/gDfvIDgvJDr3M1rOBPFYAqZxGcrCdoEVjPExOv
loAF1dIBZopX61WEiE3tBAR9GAW3c+aRQ5yWrAIwD/LIAAvHfgWMCjJoBmuF
1eesndYCzKU5CDJUXCChClZeYPLYuybPW29OCzT/JSYPDDBon3e678WQcoGk
awwwq6NlBPLDiGcP0whWyhtuHCYgKY4OxDu53ZzEq9u1z+IZXIUfCl2HH8B4
j36YAf+C9H5YBDwUL/kqesAl206pdHx8bHg+yD4vAHdgeAuaEFySNUJihFES
LGMfhBtD+3gL1qsBT3jK+AGbwgOZOZ0uHhNj9bgoPXjLFZob9DkwBugnz4Bv
j2FAMLA2IEqDZbQyDqWJdYTiNwT5+gWfBEAW8wm/yPbWIyx2sV6VQDwE0wXI
4AnZMWIYeHcxHgN3R0YYEwd4S1Dqq5UX3INhhqYew64AfvQAODC0FzgBbmNA
oh9oCX4PQTGgMIdtBo9rbviRsUbOgx0hb4vMBFCPs+iYqHkOvEm/An3AGiqM
z1kchlPQ2d+hu7VchGsC7Buwq3xHqaaPT3Q79BiU+nEbXDcwjZNbGuwQjYCj
klolLgy2w5Db8XgLdGb4i9Wt+kjhPEipF7gLcF6CRd7Gk1tD7hnZDZ7cFYF6
eEjb10opxXMUrBLaJLnHsKYJIDhZPbNZhr8BdgAfDY2PkqdZrrDHQJwAK1g2
Mfqv8BuRhU6HuKoN7QmMQ/SIwyAagA5nC5wapkXymaZwGZM1+ohg9osZ1PgA
W6WkkQ9sVjyZZ4kHCSdGLAqSHC/EtAZJpoV/F9GgySsgCyUtAnDhW9HDdLGh
jZNmJ278OPKSGI02IDdwXkEXBdFxAXkimRkfED8rMt5FLMFI1g8P4LTD1sZj
kivAmQ8PU+FPGUkQAcLjRWJ8AYf1i3gf14wahH0m8PYFDsVguBxtkEQgHp4R
jGkEU/ByYZB4FYPXsqTvAPqHBUjtpbFcTAXAnayEi5ZLeBgejDEGEcjQieHF
swT3zPuyiEOcHTUAPJ8TkA/xagzbDI9Ol5EXbhBk3qQygA6MBDulhohh/Dlt
BTEGUCKa/xH4cvAvKdgV8nDyECGvg5KZxVtebsU4hxeS2QI5B4kD2ITmh58X
Gp6zPDSNwf8C0gbtlWxAAM8ArasM8wPdfgHaQWb/glTONkgQPwCfAvxgmzLS
3gPlHmd8VR1XgJpI7MgMaAeWRNySABnCVI9zQ2ejwHsgjwDm8QFl95JsUbAC
P0fAzRN4cnU7Q+jgyRnSYSS1boBaF4H67jsDjA7iYhgqsyyE+NdfT1JyARsG
kEpc8M9/ahIP542e8BtAuHC8EUYYEKSuTrRrkvgyqgakheCuwRcgi5tkWbCe
AgGy+NRePZ5GIDKADh5IHqEmWkbwGdpqSAU05veJkQhXsMLQn9EeXNEWAMwT
ohoAagGY/BKDPUeLxrGUaQKqNbNz6fACqkcUvoKuhNZJSWe1eeCVZ2gIxtyl
IgFiKxoTuy3mAGAsVIzA6nyxkoiDmVa3oLUmxKaZjRIDSel5nESBGC7hEIwY
Las76S2UiYBlWHj8lJJxsAgj2h5Y/gpkSwCSgLdzOhUYgxWNpZUKpDAmiaYw
BWOfJDkmgZ9RuQJRguR/hD0Cq5cZWMoCIC+aVacYlgLwTRnwbjwu1tMQUHkf
IWeQvUUrg/8Xy80xSIYpAYJCBL9asHVBdh2GooDEUD0AVWMMARDEOxogOTCO
wgg1AuvF3ZgCc5jcayHq5yjyUFwSLrwUHRSk0VGAkhqHyEuG78A0Rl1JWEiM
nth1VllkNpHaPeiOroYHZf7X6F3Sz4N2f9QZtFv4MzgdP/6ofiiJJ67eXI5+
bKU/pW+eXXa77V6LX4ZPjcxHpYPuyfUB8+nB5fth57J38uPB7qqQFwHTvtC3
Dyh+YBOTkpQQhInTs/f/3/+2HMD9vw3Oz2zLagL6+ZeGVXdoL6I5z7aYI4nQ
r4CuTQkplLQSESCIvnjlTVG5Ab/fomREe6hS+uu/kxw7rv3738BUB6y+AbNH
Cg6Nph5SOWb8+t0eAVcSJhBoWZCeSWrFPRdN1K24itGpRBWW5zwUG1EsG+HJ
5Yo/UbYsG0E5uwyE6goNaRCcZXJSATW6NXYMYpAA4GfAdhxcHVVK8LchbN5C
iz1eJdF0XJYalJQ2Wo+o/o9X0dMqNavAylmgy+YFAfxKimYBO/fvuHN2zf3n
P8sGGQobCQLboqE0NIXK54lzM4KeB9FGooUwSK/yLknxgrJkx2QBPidWQWpJ
QJQj+7JVzO4EfmKgPYdiJwHxRZYPLGCNBDtPd9FQ8WUyAxAvRB9gxyBtz6LZ
Aq3aZUZFIAIQ7BtvPSHBFd6U0GRPo8jKarl8f9IftRFdneNWJfXqFg/eL2tQ
o7C6DsdyAbZlEkkpk5XVZeMEFjUHGYB2L5gJ6FAiFKe0mNPiL08q0t5dAMWB
LgFTdo4+I20W+TiIFp4RpkYXQ7wOptJP5C2xeI2WM+NAGYXHyiA8yChHRP8J
sOijt0lQ9XjgB4zjZbJirk5HSjaASKCV4AAAX5FVym8DXLgGJFx6n1+vCF4E
9b7gAElMSpzEzSwKY1wS2BAJ7iFS0WHn6t1R2fDXK1opexMzEAbwuw9mMG50
4Am6w3G+eNMYtUYQEeEKJFRwNYTexxjkzgNrZqYwYEQDZgF7b7oGIhuncgt+
Js8sIVUaxqG0pqMsu69T7xcHU5+TAY/ndPL4ZCo4nh5DvpbIpA8YAPIQb9ks
oaANuwEPKp5inHWAiFoe/uUz28Qh+/W0OD9SxgKJa2FDAOFeiiE7BBdRLKol
EEWCeBANQOkH+nYcZPYD3c8pop917BhdPpo6pq3UtI6IQOj8DogJ0K/DaXRx
gdqTTGARZdgjPox3rXPjULKjpppZgrmNGiiiI1g/oDDSNgWHQ4VDwEdLoUY0
4wktZ4ltaQkghkCl5FBWKqHbgdIHBCHwH8nIYqeOuQF2n0dc4ENJzh+VqlhR
Sox6RkzOBg0obuDDhJQyWeezh5UUz+S/vieWAAoF/aW+SYzDk/LpEZ4ZgUwS
6s8LbgUDCXVCRjQi5qFoDAYARmB2I/XDji4pL/iNzm/pZ9IaxmjwI86YXTBI
Im+Kh9t08CfImk1xTe3KvdIhAQJeqvOxrExVLLZcz3FKJGOd9ngWpEgQntI9
5DhLWYqCMvuKNPgtuHBAE+m8EgdnnYpB4aHMiD4azQ9ktC7JQMqKFx9p7gHP
TILFfMyDAmmRQSxsaWWgp8YpHlisUGADjUdgzvwKX0kX81geh4JxhcPwlzLQ
wex1HIfA02LPhUMMKwA64IWi2AATC4h/WRYRHRkPzMSf7ud49JLbi5QqxA4g
B6znyg6DR8G0h6kF95FRpDZVsprREY7pMjWSEaWo0Mbr6RiQxxydczalakFy
2eWnDHlhBDnWl48oR/Ak4Dm5CoJUbN3XnvMF+FH2uDkmCwHlGqygrLCIdsZk
DUIbYGEzA+2xOXMhoDtagg7M4Zb8uLNdWjw869C2nnUMPfiJhBgjTWUktAQs
zNirC3xKqCFjHq3wRJmCOGI2EeREuQ9UNU8jhXocL44SCQZ5bxn7Dz22NVhp
2uBeSLke7EVnaAxeLKQuGv9Uf5LtNaIWWvGt90XT29LxRzYFsIj7kJgARQ+U
oDBFMxnDeSxFHuMlu8Mzb8NiVYKtcyqRkLIlK1mAaA4yD5SPoFvG6UbERCwb
ZTOEBT5C0UKQCE6SZBHwS6BlPDCeommIQl1QK1DjkZB7IBTFtzptFIhXLzcm
JhdNyLAuiiiwTNXmS40LYtq5iC+Sg5FjHbVGZYLiWf/uUBgmM7K+F+np3MkA
yHj0QY0sCaX74E2WEcVm1Tbo6CeCufXCPK7nOkQVyoHZCXIFKHZXmgLZEYsI
CalaHQdkoBnCRT9tSxqj1aXyZt/3PvFU5GH4StMEe4Q9a3gvtb7Zp/pq6Lec
sl7ObwIISwbvss/majqQTmLiy3RcOrS5XaRnQYBKcFSXZDCjtXuIz0byyCA9
aGKTN07lYZ5eWNxk+DUTBZCUQke5tIp0RYdRZVIhAYhRZwq/wl7iCHy+cUQM
dyUYV5e6gG7WpjnhRRTlkchXcSmkK1CH4AgKwZNx98lC9yP6SQph4tCcGpXi
4zklWkbptGtsL4SLh+oIJmNfwiPnCsRwnNFl0sVQeHuJVQLT8ukCsm4s/BZx
WgoMSoiIkz0L2kvHTMO7Bjh7hwm41GNNv2m7I6wG74sXT8l38BKxOm+VLoxj
MyIoj8FiMQuSn/ABvdy+FcwF8H6+YYhKnvJcyXJStvFtNH0AA0DhVqdP2moR
YE3WfgLqjALMiwLJCyBHDzq+YPJjnhHDM7/+yulGCm8DYr8kpnQxEarPzz/1
NmCbka+X+h4rL7ln9YpRaPFWEmBCZP74gDZ+Go0VyAWDIwut1g/Gwy1446+E
+th5ziDbT0A8TZ1dsELC5NbDYDBhFX5KUhNgR76LDdViryIEnjnHlaESZrmN
sHEoBkYuUsY3Re6R0HBsBaNFKLUEVQmKz5qFCZlDZaSQckafoNCgl5M9oTj2
mDJCIh9s230LeZ/EWS7YdlzgLZfZTC+YOlU8X40H6icLaifnYNDyeRbonCmF
i9CeTc9LST0Iv60g1GQINKvYkVReZWbi7Jeki4T5D9Y0xqEfVgnHvNJYKUgV
NCDmDOEMU+l0U2gSzSPhEKQZEtpoJNnQudBcB5iYFpD3rKWr95z3iGYcKeYs
H+G5h4g/fSHDSz+UQTjZQS3CGcV58gjjE4ddbsDIRea8TIUmk5RJ1RF3mdVb
oUeX0G6T+tzhwiz/nWXmJylPeQX8PGgMHpc+uMWEKRXWecOecf5ME6jzS7xc
zAlzFxUOvYhYVXaxj2l8E+b9grsAwx6cvT85ax9fHL85oBCoUpe5IExmLAqp
8Isfbde1msdXb05cyxZRAHoIJ2PviHJPsnB+vuH3svEpwnN3MV9NwORdboQX
j5llMDZSfQYjbH2jMtVA0w+VaSdnoMaQfqSRvePj0GkBlTmIdDWQWsEi4UNG
XuN7260BxN3WK4SFfrm6+ml00xt9vsGVwyeVkrby9IRsPwboLEcPQIrl/xRh
PAe4LsHz2zQ8x0Lo881q8fmGN15RxnPglUhMsrBqVhsmjIk0SQNgAhutjcPV
WXITQ1XyClE3p7L0JdmV44epcTTzlhPAiIbPj47TQLy9a+MM30Az8N4LKeZd
G6EvoJl0U6sNJ8Ua/ZLZVPhk/6b+odv3DCBf3z54nqn9jfHaEAPoq3RtKx0c
2Ci3SmTa/5pVPgPI11cJL2dXSXDLI0u0Wcnt4cQYMFt9LSURIE8hzJIs42gA
UwxAHAl8EAnxN6322cm5Tqwa9ZUELs4wxoYHW3ssd5GDMVnHIUWAYGW3nLWt
IJTWPJolSzISCvJWjDRvIhHZeyJX4tfvtJQKMnffZDUH4EnootsFJQiiEn1D
Vq0Uroz8ml3Fg2n4NmWhX38V+b64xEM84i0LY1SboyQ8kYypJrKx0LgU7MzL
TSpHpKX0DDTSrZhLRGnBPNrxNJpP4GOcibMajXH8FIWFX5d1/aapLaXpAIc/
FT2h0DimhC4MVgsTj/SHdERzaT555Uwa8U0FPz2cladHbNKq78lexwGIrxZz
PoVDizlj285EDGK1Xs7FKQieBxpTfky5LTQ5/Dyr8LT+55t4/vnG36woMxKW
JMToDdgB8Ww9u5HuWBJvkckNfpQTSIHWyJdLs9mkjV9SQpxPgziVNwOFkqxG
G03uHCyvjZpDgyklnhXP8Jt4Q71QtfGFktA/2guW3cgc0qqNk2g/grfVFuQg
ORLe2UrD34Ng0pJyVTEdZuytp4Bxpq14DNNgrheY9bH6VJ0y4i7T6ZDch5n3
tH8rvKfCrRBbKzIW05BRDr2d9AiXuQDfLwnekMd9AmsiXy9O0rALfJnFSBk9
vSmhchlxoICHmcazmKMfGQgyk/D+iVUne5fMJO5PF8E9LfdGxcTeCLU/X898
wKP+lsCT/AqD4puVPIMRoTVxRhqFJQqFisRYnkiEhdAX2yixD+bdUoQsFFNi
eD2tUhCRVjTlcWhvuQFxdxVFrFlYPtqWifJResDgDgrXg0SYWib5WRF4TEcV
EnQy+l/OsAL7fVkEGRlcAn6A6DnutGcNiA95YAwSFqQWvsEbXOINHmfEeeGs
3gzzRMhbtao1gW+BRwqBaWiSMRBY9oSCb6so9XV94QNHIcddLnbNODYoiyzi
NHlv18vh5w9pL5hYQnhDJMADA2JqcnRkiNNDFcKn9GOwZ5ISaQ9FynQyLhLf
/Ag0QaXQDUVRw3HBL1FWUaQ2qhIjxA0XlcCbYkrnCswg4U8vlodvyu8HV+Wz
ThmjpYradxSEUKIeiGLcapUuTBpHjYYRYnGmih5nYhyorw44LIJnk4v5kdwr
ArSkMvQzEZRdLZRgSKZMARuZNiETplkuRdOHQh0oEADiBuyazzcJYMJbHuZV
IWs3OmopWqYILkQFq+QBc0vUo+cYyC09UIwnMlrxGGjp+A0Q0szjw47Mxklo
adDPNzOQ+oeb8iQPrthePNIlSUOPlzbCdczYNQbov85Kqe984Gp3sZqjI0a4
BhW2+fyniQCuo5GKiL++YMh5tAbTfKoG1Weq0Kgy+kSpvBFWPNB+0G5P5lhu
BpYTWDtYCMCZ7gEKOc4p38Xb55sv483XkFeSyDN+A/JKL0EeIc44UXH86aZs
7ICpSRlKgkLjJl0cYQQWQhDieJzmJPiSUCfUMJ2aoQVNaWbRSqCldaXvWUhV
XsdJhBbDKhcvz+wkMyelsVJIjjZ7qnI8lCIrkJssaXu6dJJJCFI0YaRLii+V
LY0Ak6S3jM//+PwP/tlW0GdjhYDwjIyg5YI5dHh1lFHeqdIWZg2nKWTWelUQ
hibH/5e1XMTMW94Dxx+wX5DGJqfG1JtP1pjvxydWpAHilCqyCeRoXZE/Jedh
OxAPacCc2QA1PTG+OPZNOMtIQo60+lzvRhGrAzpMFGYoVvCAtUDqH5RItCTS
ACsTbUP/gHKHQVqlPJhfYUyBv1sPi3YoZoJnHhweVhTPrJk7KRMPUvyUXLLH
AsNYC/NR2HSzioolhwiYsRl1TM+dXJ11Ohpo6YEAiV+yCjarWz5XnIA9TBFH
uTsIF65fJw09J4vKr9iYNokafmyfouGiWAcd+smC6znY8MO1LFeJriEoX0M6
jWTJyEh3hcPxaggOTCRG3fBFwqvEhjg7VNptGnnJisQg5SLi8W7MZEz/fmfi
rN/V6Ow1MTA5gGgp//wSO2TMy/iL8V1dywpYCcOXPoEtQGdDs2EZ+RLZtG10
SJmwmYLWHcU99ZA4+4yyFJNqGfA9gVI1FhUzqoNAcYAgayFoE4Ak8LfPN8jY
RG+gxQmfWSYXpCiJlTMbwTn1V1zoRRQiBkuPCMR+y8QhnZyls82/cao2b6H0
wxJ1CsOxHF5cISoUAvTlvGD10y+fb0DiHXpm2bPKRqVSOZIe1AGDcUxbcaBt
j1R0LL51x31HfKaGtxQuohYtHY7SsuC5mCrLZMa+dDp5NWBZk6ddzsJ7JCfn
lLt0Gz3ziMV79lPriPGbln/ozUuIPXn4IupCJf8sKqUJuISXFzPhzhzO91u+
EnPSGy6LDLBxWlcqKy5CRsN8hUlLNI86CwStiRkNWGQFKPbXwq1bPUZAACat
BGQ4QbiNlovfABfvGacNsOBa8CawIi2zDi0cDylSHsd9RbeiIfQw9WRR1DR6
igNZWUWn8lOMwwgLAk/+mG84VkTJ/rzX/Drmlopwj5TcGebzDxbBgWRBlkgV
Y7ArT8g7Usv5Kg2kB4eH114ZM7Gv/TJmZBUhhy2sQlW3k4aRDixOD7MFnhTO
yB6yfkOtp0guTksr9KoBdYZEvR7Q8IswhSZIYzZpBTMI67IG6uebRYB4IBx4
jIfXkngkJzOejsrqd5+y14+ONMMwQddaHJoWnxtraaD5slMdnni5C08OEBYc
eWjywOxYnzm/OFGB16+40oz7smF//tNHI2s6CAt/R9P4G3Fyhwv++OePZQ0A
+dJH2uccUMafKaY+3M0s+fW7nbpCec5Azg3Wa8BYxGXiFSlitJJ1lT8NDgkq
+C8LJlD1OSkkOjLDgI7MQ0XP+0KERUvv9Rw+md2+84rKjufoAm6ccYhYOOGY
p/rY549Pj2RZJw4r452C/clGKynBcMAB0JXYaVmTQ5Qu8oCoR8I1p3SorI98
EiXChMU7ldKP8X30GCdRWdXw7A7mf20wn4t9SpRxKvEprd98UUsivNxl/IWD
DqLebF8xTRkLL5iq3+vcXCqp5CutyoSyZOVECL0MTtHe/Px3GOg///M/VR+O
/B9e+CvjooynNGBSviIS+BkQ9vfyz2cd+As27+/q+VP1va9/T+Mfv+xPSXAM
7Rr8+QcNDBxPkxriI/WMn4f9Hzsj/u0fO8/wmD4Dyh+VMO8QE4xE4cY//roz
ELyWeaYkuzxgKYwaNj9T+sy3oUGE4cXYxX/SZ3gfkSpy8iIWrZdY0p1IzCWZ
iN0EhOtLQoNlFSPx6I2dWFoqylTISDypBTqMw41XnhxhORdmDbPYn6Fbwoxa
egGjlk5ftJKvL8R/8UL8nYUcbnxah5QVLxcNAD4tXa3h3c7gImrll689moKK
jEW53Nh49/qi0qmULjF8gAILHlCLTkpINOqwSSpIjv5wLOXg8w08cyBy3t4d
4ad7LSKaXpqaVF1GpejLGaYD0emvFJvG+oFCqHi6oPkVsgaSDLzTMsiRFywc
pycaKVy4tvKT37Vy/vi5tZ88v/bhbbbYER/iF9gAUJlmMjM6wLzDbIEieZdr
PpnYLRUU8W4V7p55K3Q+5npdoyroVAuhDPndog16mYyLXMsQeFAvqS3IR2Px
wkf1Gb8htXEUuyWMGK2Hx54eDpnifCQgGIxDSPJYj7Ru9lAcEHO7SOPDuBvg
UwnvgxPVlIkJFv+XOFx7093zA3l2QCerz8VCkXwompMKGq14T30owxGH8Hw5
M005c3L2dYcuDTeUJBGnY+rOIXjLn2+2Dx6KNDHXkQx+8hfADt2Tj4dmFgSD
w6MZrxsr1Y+KviD+oa+sI95XBAFIKgyzwbJ0UjrHoVYRIR/M0vJUEo54DfGK
G4BJtqvFhDNQVawrMwmVxxClTWHHp5sS1plRLxsOiaXZCPrx4WEKW3YDtByB
CvbG8GSwKz085ZQUcaad3KL8ITgzYWRx9rvgwyZ5RquFAVQqd7BCGsxGmVQ2
L3cJMA7PCjt9KFs8TBlFObNiR2KtGRYffyH6jiX6EKnizTwNs+2Ox2YgHcAB
mohKI9E5iot7YepjmSIr+95saFNL1JBjSyH5JTU/ILaVToeq4MKKxHkaDtWr
O1SnBcSx3hwB8S2r6sCHi1Iqkikm6bbzhqOUna84qkzSYIZVIrn9EOL6WGXP
qBpvkUKAggElVEeIB55U5SFQCgLnZiyjiSeSrrXcgOwu66tILTTh8VEfq0RL
OcUZZTIhBf858BosKLkbvYEfYU9RLwDm0txCkYqFOcO5pEORNhwnqoj8MVLJ
TUzreiIxp1CnKWkaWART7uBSHVrrWXL1utPARC39cBLH2gWX2g2mM9CvOIs+
jux+lo0WJALGXfxMU/zIhLXdiTlKIL2yUEteAzbBviWlNEl3t3FyHikcqqGa
NGIxmU3HtdmUmViUfCfyob+WhZxVfjqslEVCSkg9XSFJCaoo3kaftbSl5x5C
2/s1Bh+zD+1Yxa/3hE4vCiY9yo21c5C9x+7jr/gt+i07Tge+1BXgC6ZGLfNa
OyU7UImZGZuEySnFOtmdfIyWzSTgoiOWkUL7UO5SLrvqb5Qsxj9jDJV8NQqe
Zsu+SqLsK505nmey7YkQ06xSpBgiupeSBTxbTBRubf8jTBLYRld75I8hCBrp
G8kB3skQA47xTaSAL2QIAT74KiEglv8AMnBr30gGOO8eIlCpbeei0kS9IBVH
KjP2uvRkR6JZetY5ShcEljYfA+q5yV4iaAx9HbAAz0nZTtDQA50G6Ny1fslc
1Lztci4JT4ZoT9up56YnQe/kf6kWZ5ghDK72TtK8Ic7r5Qk+DU8ONsxBOYhh
eoIgytBZR+OgcjGfb2hc5T7Kz8tGIWVRL3fdKkHbY4Y+XJLaKZiaFiei8SRH
a4Rx8KYChJLJRiVKA4Dl8cnSAFjBZmTIcTY2gjWcCLXBqWYzbjvIdJo5/5O9
WTRUybPdRAYiWDPxjnvK3FZKlbYHYSAvDZAURnj0MjpTjxxm8biLtRjzG1LH
kc2Ff0vNBdnOD2dB98Nb5Y3dfEadXI88GDIeFjHm6qTLSukLlnU4KX9BaTLz
HrQigM83mMw3QRK2D9dHGiGq9HFEfb4GoGJkLdIvOrZEXao6eNk/Y2YSUQ+r
aDR1k2VzRjA28Yh1qCOFcZXsGDK7ZQu76DtLj88iPQHRX3z56kHqd2DLfsCA
qDyWRaclYcm0a5VpJtj0GQO2zDHWzJD50kb9CVgVd9cLbiOQF3ywjoYnlaNO
tWYnHEJKk6nKbOmqxjmJiM3jK2t9M0WGA+00H/OLHm50+FZimgNYo5hsTbKo
KStUoBWYOESTLzBWjzFVbnXSem7mbm9V1ptgXQgpzqUMjAMWauSriSi0Ir14
J5KzV5U+aO0sS6pJKHMPm7bYdTnw4G8KVBUhglQRZY4AkHieVxasq/pxCCwp
HDFfJkRvek7yy73c5xynAZ6nR6vVAsERWrAVBd5YulDcU5oh4bdlU26RfKZX
ynyru5SKix04FBBFk/76b9iBLt9dfKmNcRyK99FRGFKTkMwQHDpTKRpCSER8
Iq4KiPPHnQJg2a8N49QyJFNSJZxETUUFyYYo7X6gTtpaxhaHx/SIeaX0k/Sg
Ctav/GmP8iFiMbwMG+jgZZPBsH92tl5HVZ4+5dajksGxwiALG55QM0FQp2EE
AJw2CuGIw1LEdymNX+Yy0iijTQTJcO41nm0nAWaki8R0wSy6WVO4njQ0Eycl
QXLCvMsQ1Autff2drMGrf3NQ9PTzjmPmUULmjvv43KOMbHjqP+A548+GDUrf
rlp1+FOt21UX/2uAyKvW602z0ajWnIbTrH7FQM8g6A8w1GvOjqFe2jHUjdRQ
z8z/da9N8vNL91LKj+w+yk8P8k897+Opx4r2znHcPY/JfZvS3jlOTVzbYFUb
VsOs1Rpms9F0+ZYU06xXGzUw5lzLdWx6rNZomNVqrda0Hfi8YVv1Rg3fcFyn
7prVRsP9yhYrGfoHbK9l7frjz+6vmvzFzlhexn11mwunT0svi44mMx6ZQT07
5HHmfn88u+vCgaHXh2Qocx8oNFUXRQmmwicB6T838oPFKwlJRzYc1pK1ZH3Q
NMY+E8eozrNJhXrKrOh4o6oM9aQvxJZxkraJw/z5eLynooM6PulurG5BCmvw
i9ZEVmS/gFGj0od2K3RlAh9NSCkoQllYBHKKZWYaPC7JewkzVA18ivFU2hlP
lkqJsimqV/ck7rMxeIrOA7csx54oiIxmfhSi7ST6mSPRgrtMtxBoccWiCgmw
DT/fTKRfLgpB9YqSPUUR8FLaIqRYu2X8VI07dJAypRXkSxEZYLUJWzaHG+Pz
n4xDhPFI9tfUijHE86mqFQk7kshUucprmTGbe2AP0KpriLJo9taWfDzK1s9+
DSSBToFd/EVEDwriLrJjIZt2hx91Jxq8s6SsIwNPx430cFz7RqDSIFymYx2p
9jDfGC5iYhF86okRQ+GCi7pYjvLsjycZf1RECftsfEMsaW8gyciFkmQg4dkg
0gsiSDYivTiMlA8icbbSvyyS9BiLnsl7gkk8fTaixJ9l1a4eU+JtnKvWyF8T
BuoEkgRIkgvT4IevJc99vkm9kFyE6YjB0vo7CLFU5Leo5GJNBgHoKerlcU+S
DaKQ/6AnL+WqxyS/Z8kfl6DXyisfTTwgi1/zo2vipHie3DjGR+OQJAl63fsm
O/pKrKbAO/tvEIMppSU9+woHlzKbcrcgj7ZUNQ8TTrEoyMHe4jlPdV90gQJm
fGAIeu4KD6iPte4iefoWkQS9/8i+emIVv9i5nkKGHXButEPZ2NyZWoTLShQ2
4WShJZUYiZAjN9MQ9lWuXFncQqQ9krbv3t8kpVLa/Y6adM28h528eMK1Co2p
mJggxTPGaa4cOj1LLrWzHUaKsU/Gk7eM9Og1nbXKi3AxcKL/Ju9SS7t0ieHl
xWNG0b1jeI0lN1zWkv2DKKQbgTKXamT2j25gEFgtMQFIuaymkxebDfPHzLkq
7iLKyXS+ycyMV7lhdSYrWhqmffbu5Oq49cZSuVMcHNYxxfdjpIV6FDbhx3mr
tK57en55svap4SHVI0YzvH0rjeANf7wqyd7utlOjS0aoNZ1Dv6QVCd4snm6E
KyUbzgh1AmQhmgsQkUynelw5V/n36694ozOMfPjEVbJaAPNIds1TxQGczTbd
cCGGVsvP4chccyG8SVH17qYV1apNPAk4wXuGKF6qC4QvnDlEOSX7GBhFnmp0
VSm9J4bJSF8vbcWXbmKcI7wTcAqejJOKVatYZgWnzW6tCD+IJPNcCkfmhpNE
m2WHRnIXGMnuhQjZ1YfWe3hJ0IvqhJJ+UeRCZ4xslCJpqhgYriKeLtXaAZV6
H8io+pNOBEJD5BaWORTyktxVLlQzOTGEQ8rZSMYhNS9RCTxsZ4GoPG/bl1fv
VanOarmei47M4DiTVsST6ESq2qv90lQwVKl0Mp2mCXFFj+TJLz3IIaGvJHZ6
zRPdp7ZPVTzXcDYioSf9UUrSSlPXsBFWCXbngV1UTH5C2t49XqJyYXzakE9n
TpBUah3b3qwPjMOfNDc8AwZFmWMtTjuhSwSzWUAlMmWxBk3ctY2XVj5wHp9O
IsfE5sLfQlMrTnthqkJcbP1E+5d2rMrV8mc6goyfwXZ6jIDKmarjiltAZYqN
2PLMFNOzuBezYRfdKZ/ZpJp8HwFRfIli8LnAxKOsA6Fp+DOxzJyhIK6vEGrL
Y61VUePG4ISRPYWOZDqqJ5UMv54zYJWZEHmzvFUpZDdZJBnjQdioevupJV/0
QvqYHo1Fz4TMY2MwjSMus0eHWJQ3ZwAXwBYGfjLwfUXK8gVT8UokUgjPmAEA
QD+qMm/toHDHptWXiwQhTVi2dcQCM9GzAkSlO7RDG4fojrauhrn9EvyaP53X
j7tpdfmEZeTRUrb2f7UsMP54QamrxunWhpZuvfJAMV0NK1mRIi27RNhrUjZ4
u7LigYwA3xNXyiZosgFm0yMc5M9VNMELEIrDrposfEYUGruiUBzhZPD1uxpu
VMSret8NtBu1wkKSpPlCXXFEcKDS2jXrmu94EeEPvSep6rVSrI3Uhu92W9TJ
g/qr5XJHUaUrRU/z7+km+ZkbLS52m0emAWAclKNqCh8X2ZORZwfHzhijtKs9
hX81R5+P2tnwTPMgMpkYBTKZS+rYf8tEtnjvh5ky0d3dR5rnJQnqIyNpfqfq
9iXuntmVAk7lqVU6V7YcVVEMnq9UZAa+f3AD7xzs65GUi/UxzC+Jfg/Zj+Dw
dhoQnGtHrmwb4Cok0/HZRYlVnX4q/MxM+89xPNVmiy+iXUZ3YlgFWNqJQ2XI
iMt5FUx4yqF5tql8eCEmnu2+9VyA9dl8vH9N/DQNhPJBuLSDuQ80UtVqUaBZ
9Hw50jAUzuFKqLJ+v5o0YVj87BJwwQFFgiGxrzWtlOadyggQpVQcKWNi5I8+
Cu7IuLppbD7ZSeAq3jppOpA0qZSKYM5yTvbgS7MDGMYES8sX+ieHx8kRflho
J1VyNVyJ9G+VlZnzlYWToxoOpC37uGv7DFs8evP07oW0qyL48YZVqWLnmMUX
2jvqB6nqv8Q4uyChC7yDFbwQTRCVQIJculpwIurWKHOIvybmEt9nrxDKOINY
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
c2+vLnugx9HRuPW+SJxrb4A/n7lbXdXxedzJwqoZh9Tu9DZ68mBcUFPTIy2n
GTB2EuDNatMonHA3dLrO+pF0AR+n0/0C83t5JAH2SPzgab4W7SzuqKzl1Zqq
h19ibCuE1WDiC+1zQ5xnRFyMgX7j8bGBhxml4j/f5for6P0XSqSYtL47O7fg
jdMb68A6ozNSrWEcFfvptxamF2vQ3bjGwwbMhXkJppSP0d2GmFx89IrKJQ9k
P/cf26eW3cgc9nDM+YCeE/Hn14Z6X/v4Ru4gdqXg57nkYLhcR6/UTcSxCmP/
1YC50i8KRvrza+5affgzf/H3I/U0aPTohe8eivn+p2E+1cdHxp/h34apjaWW
BWJDPvy3vxn1owKgX782zOy8Pkir+7/QR6I2Ng8JF+vQNcW7m6XvtLyTWt8m
wOXRK0OA9cqwDHG7E85nmjsPW3bVybzgZl5wqlbVrlarTv5FQtUSYy2Hll0/
OsrMCSShDVIfm6ZpmbZZNR3TNWtm3WyYTdMzfTMwQzMyx5ZpWZZtVS3Hcq2a
VbcaVtPyLL6y2gqs0IqssW3alm3bVduxXbtm1+2G3bQ927cDO7Qje1w1JaxV
F7yserVBr1ebVa/qV4NqWI2qY8d0LMd2qo7juE4NO607TcdzfCdwQidyxq7p
Wq7tVl3Hdel1t+bW3YbbdD3XdwM3dCN3XDNrVs2uVWtOza3VavVao9aseTW/
FtTCWlQb1826Veeu7vVq3am79Vq9Xm/Um3Wv7teDeliPnkVnI4fOqqmjs4HI
/E0IZXT6vxWhjM7Gb0Uoo9P9rQhldNr7EFofy3u9gWGMITCJKvFMUu2ia43T
k6t2zREyD7nqWHKV8V20efsYzD48fvrJvf9oP039+DZ+uwkeOneLSefu5LET
P046s868O+xse2dBfBmfxN1te9u9626723784xkMchIHb95Og4sP60/nzeTT
T87iOg6e4BHz7eaeX2n1t91hd4Mv9c46SecsOy0MgjNHHwfTYHO7uf7JnX+6
msAQwcO7Kx6iZ14/dlsnT91W57G7PTG7rdFj7+6k2m1NHi+Hp6fdNgzSeexv
T9vd9uhxcNd+7A7bMAQAO+w/9YZtuzsMni5bbbc7aj/1785b3VH/aTA8v+je
nWxggRuAeAOD9Fodq3t3veltO0737n7TH7496953N4PW2/Pu/fW22+o+dbcd
WErX7G5H295dt9rdTraXw95p1+xs+1scpN01R9vBXf8R7DOze9ff9lp9szfs
271WYF62+m6v3Tb7d4NWr903B8PBRW94YnWHo01v2LV6rZGFgwyvrd525PSG
91Z/+OGsN+pag9aH897o2u62rp96dx27u702e3cju3d3Xe3dTezL4afT3n3H
7m8/tXv3MMjIHtwFj71tuwro3Pa2/WpvGNi9bVC9bAVuz2xX+3dhq2f2q4Or
3Z3BbUE62dmZidqZy9YJoBr+bwHK704AP7Do4QlAGDzCd2633X7s38Egp61u
u/84GJ5ewONPsDuA9e4T4AfWDYvZtp3u8P6pPzw/6466T4PW+Xl3dL2BDYfp
YHe2HZDq33XvAEV3HVjMZHM5fHvave9s+tu37e79aDO46z5q1LkFVAJ+gu1l
q+t2zfa2f9drdXGQ/nYw7F30WkBGw/4GP4TdAawDKrd9p9e6N/vDwRnu4aA1
OO+1ry0gN6AhIIztCHaRd+duBKicWJfDD6e9Ucfqbz+0e6ORNbi7BsoEcru7
BtqADR9ew+4E9mXr2u3dt+3+3adW775vD4YwyKeL3haIeBgAuXWrQBuw4bCR
28Dpbe+r/WF41jO71UErPAcGiMf916+FviSFKXJc9xg2BlpT8Aylwf4JXNXk
SGpo0VchtUgMjuEsqXs/PqrrcvE0WA66LIenjtRwpN/5OU2hp+KJhpcpuUdS
nwvYhHYu+wcu/oX/1+qNrHq3i9W1aVVdUBJVoQj/WNEYv90CjW77cxaHKdtL
sdi7kiJxBKLwJAa5B5w1Ec8jtTL9schLwmnz7vpjXxOPTzDFaP7jRWfOP19X
L8+U9DWRlonkiZyBybpAh8BoWzns26ZCdq5B5U7HJ72nfd76VQ/rt5VrvaGS
m3gu2kIxWeCl7xgap0Mbrq3TsnkklaRdU7UQWUUMcBKG2eu8RcCGY5x8dzYF
Ojn3TbsXvCJta3mZ+cx7OjQ1ILG9VvbS8vQy84yFqv7sPkzXmx9ljNcvBZeu
p3euiyvXi8fnP/I29qI9S3bcWToEw8N2/RCilG9Gyk4Q5q8sqKMohZZlLUKJ
U3MKR9r3jrzCXCW6kh+MnvKrvHRh8ZIZZrq54QQItvSsMv1jK7lzMBBNOIei
Vyc/9jd+TEQh9kBWkZJqBhuNHsJr/IlEhJjtqGyoX2y113RtAZIXm53i7SNd
wClAfp793fgb/2zDz69y2ylIAYH/i/ZVNM0M8NevDkDdkv6SFZ7aMgAEbR1K
qO1s+x4SUZes5Vsastu6Z9sLiSTWuzNlalmKVM2CpXnhzsffSioaavyDRXAA
7iI/KH+wSxL7WY+36CVbvZ1ic6iHEvagktWUPAZZzB68ZZyI80Ja7SshjPas
7OCzeVA28B/44QidZNr6r71k5V5CgvvqRGqq3/CO9Q3AmRK8b3jp5PSsRS/h
v9pb8JogGvGIeELT/E1d8dfGtarwwoQ3po0gBsCB2lnjwXx+DMf9ww0H8/ys
b0rDAdyPVge0eV8ZDv37XvvtplPrnHWkcyAMiPC0f0/+w0DYFhn/gS30Lx/t
3m14dqumQQOChxTO0v21jYbDVhm3OQia42v73HynXnsSQw3O9SG6aH3sDgHe
yY4lmhdNaerp55t4qRmoOdMjfQ4ey2WpvhLqV5iqQgGLYjFgaPkBP63rat0Q
3WH150CDQbIQkWlKlEttcU7oR2Gs0ienBwSnojU7a6hW2VA1ay64/uDVO/Wm
Y8GnbLzqn9oFc1cdt6ZmOsGfYGp3/9xOzkgWIY3c7I4MduTm/1cYz5tszEDF
E8j6JfrXYglE//3rj2/NaASDtAX7oKNP3it4Z/dml3kgfmud3gbzgduPBZ+g
y0l+VL96CV4dToUhAZxtC85dLCHpAiuBIb29liY7mvhWDpqtYDUzmMEg52uw
6zfex1Pzoz3dINtgQITYRkJxFSRiKOLG0cX5JnwzPZPshNzY6sogCCwot6gh
+M0yptBCdxMd4g46hC6wHUEavoFB3t76c3AmZ9PH8Lz5EGC4Bl4BF1Of9ZSd
iQ4sdLQDDQyiQjIqgnFi59D3RN8rPzr/PcmFztx8sQxYBC+SAYvgeRnAoj4r
CcpZOfByQfA1GLMMCaB9uzBw8oqnmPWLxUTB/N8qEGo78/8/ofCvEArNu98o
FFjNPsv86O+LyMMum3ZwEEDffICxue119e1D8GYw9u0uRhlQANh7ILL0z5Gf
Yxl4+HTRuwMR1dKCaDtQtfH7jcIbfQ+DZKVW1kjAy6/Tmw7b8ihNu2Jeb6op
snaLXE4+Tf2Rbg9tUx/TQ79M7bhT50Hwf7KeHf7s/xyDU/ZXo/GnmHg+Tp3B
Q3zrz/WjHxpHfz8qZScYnalWqIfr/PjrGzoffW38DM8c+kecRIsDr/8un/nO
6EzmmPaEaSPrOZ0289WomtuJSbb/w8ge9/HgPx9bfzf+52vj0PrrXwnO/9E4
Ojq2cissQAa/LiBWi2ImfXZRYsjvv6/cLeL54c/B7fLwcI1HfoC6IzonHI/3
hFCM51GbUgHe4zWhbCx77xE9Ha/rD2IisWqT4VFNTPLLGpNDOJNb5jd/EoVN
qtN92vGglHFfs1RFCALlFd5sb6Lp1D4819zQ7/AiQ7pbQk4JICngbO25k+WE
0iFfGedlKp6lJHO6GaBMNdtl4xxI5uL8EO+8djFO1UzRGVCr9vPKBFz/9NOi
o2KJ7U+g97iT5uH5Ibx+BOMfHuMPR/nAA4L3SdUzZDAIr59Xdh6PscXzDT9y
yBMVDEpwL7ATiHA29T+CnPjlzLe41D+/NoQzjpst7kaXaespdJ+4yDvkc3g9
a5y7t6eFQBTtKGV6e3GLBhj0E95VzdciZWtSPr0+tnhDQyqGynXmo7QNcbd9
ltKWogpI6r7st0SFpThR97Osc42VvZ1yGQ6d8o9anWgxrUaK/A6XZeMX6vlI
EFDx202WrVEQUeLRq/waytlCiLL2htqqPECENu2mULo0a5WoV89/YRL/5egv
8DAQ9C+HJ/DjKf9oHf2lpM2CuZXaZm932oHLHFeb4QiX3niVEuuWB81w7i9a
kJeSRc8Xyx8jYKpwGV1tZv4C7y0fT2E3Dg9/ObaOfrCPUoi+wHfHAPYPIHXB
w9wafzKW/2Fr2RUPSTxdYOjx8Mt/VOGJE3jiy39geOkUfzr6j+Ip1QBPeI+p
GASeh8kOMVYtPjqCz05+SEWK4KBd0d3h4pnDp6PdfVeyNmPtkuzVP0kvCRNh
V06V/JjyBgXhxX31wsTfNaALL0EgUtbHk/Y00yGt7w38/1oOz2/sXM2rEix4
yzEl+bXhf/9epOl9b/zF+PT+pGWkgZ4mfCRugPmeFgfTf08vn/GHi+Dzk+mf
3ohGydESfz25IccFYdceJnvZd2x3XLdrbr1aN+GTCM/u6zZ8brnjWhN+b9Yd
+NeCv8ciGQLz+14b9cjxwYa2wprXiMam1fSb1VpQb479+tgOXEwz4GpdxsfO
IczOFR1vKjsHMWmIq56JO4D33yBb3qpVay6Y9i780iDDvgr/1RFUWEho7vyR
r//GP/9XvG55xVsrXn9+hy1z38bK84Z0f8UNySlj8NZqoclqbtuadsOshUHN
bDQbTuiPncjxvMipN4JaFDhu1Yua9WYQmFYUBJZne/Vg7DTHbiBj4ZFbA37z
haIoUk2gfND2QFHxXwRHuvznVl5zoobZbEbVyKs17GAcBm7g12puYLr1yPdd
ywnNmj+2q5EfNMd1pwof+Q1bCkvHrtp1s+78wQ5rh1yiaa/TvzIt8O/IPbw6
c7cf7en6o/3WDS8+bPEZ+M7B70bnb4eph4oOaxXPanvbAPMwNr079ml/mp6e
Ds5Ok08/ufPwYoLu4FO3dY/eZXtkihAse1ZPlGvQBdcPHa6RdEJbV1fknMKw
19tuG+PIHy7A+4LncLoT+PzTOecfgL9H2TFmdwiP3N3bg+G1Cx6kfUl5F32C
jLzwee/h0xkNWx1gBgQ4ct1R3+4Pb88HdycIyeWo43a3n1q97fSifxdedO+7
Vm9DEM1hMdNgdm761bfjoDrYeLC4d+1gPTjvvf3x/PRqtHkCqGGQp633Uz/J
o/EdL+jxssUhp+4QEyhG6H1j3gV8Lpx+wCfiJEWpPcBj8W/+H3OXfsNr2f8p
svd7h/kvh2TU3kM3CEmOdJ6nm+7wZIdWYBAkl2doZXH9sbfoXIRTf/Zhc/1x
8CWIT7fhm7cP/oxDMhRj7Djd1qd2f3sNe3/v9NqDs8Ed5uOcnw6G/eplu2sP
Rhj97MHv99XLEXBM6/y8b3af+sO3pz2zd0H5XNOL3qh3PhiOYEGjp35MENx/
+qn35dPFh/vOxaeHTz89wb8fgB2tqT/vT3z7etK9G1mdi7cPFHftCqB+O0QY
YhFA7YFI45/O5BOHnuxeewRT3ruDYe+8jzi5drr3vYtBu2v1Tfj67gPMMKoO
Rm/PesO2CYxg9++vN13zw1kf0A67tO3fwRR3k033ro9ZVFWik8DUwrd5047P
zGXzGiwZOimw4LBpLppU8C9bTRsPxDtFIsQdukfPyHvb8p2x44dNsKiisOq6
AUj2Wr3m2Y3Ij0JvXAsbY6vuhwFYMM2m61etptmsy/iHWzUdx2yYOSvq2ntm
Sss37dALa6Ef2k3PrPu10G4Ezch0At8eWw1nbNYpBBpVbd+vRzV7PG6GvlRq
49CvVUMrPSz8Cs5OC3HmC5z5Amf+N+Cs4TR8sw4m5BhtE9MDteyBXgQgQyus
BrCowLHCBlojDbPRaNYCJ/I9S1omgWvBA6aXx5n/3DaZQei5Tdcdg1J2mlXL
dVw/AIPArLuNILJMywzroQ82gu01zbppVUMwDOqehHgcjJuulrS6izNRTinK
vd9JpBmiqo0Ky7muHE8FnkPPuFkfhzDheGwFzUY1Cmt2o9pwa55jWmEE9GMF
XtNqNk3bB5M4cAEyM2jWpdlYDcG8awrQdyb3y9fef8Xkz3Ak9jSU/ha3VBJO
yw/Km0mx9+zJarqMupPf79/GJeJ1P5BcYlYdy3Fqlm2+hITE60WUJElIDMgG
H/t45CLdAFrKmruHv3+/N3UQLMWcX+SC5epWHbZVtSwvdLneHf3jH18/otYy
2Os5LyzYN9t+NwL9B7kZAToi305ZUkYSgUnKevnOSuBzYvClOytJ4asyonBn
kcg5iKftYS1HpZ7pWuBjRJHtNJuhVQu9KrhqY6dq2lbDb0Re0/GshgfQ1Orj
ZtSoOahAGtJZCKqwDscDlQPggRcTBI2qM27WYMWAjdDyx/WwXvOb0dgNXSeC
R9zIHItCC3BVAK1eaAEuG0E1dJ8TbnmWVX2EVQV/IcfunoNqHFvLOU7gy76M
ybJ7IF4v3oqvE4vkpj06M08s/we5ds+hssa1zf++XPvy3f0GEVq0u5IcXmQR
Fe7uizjXDQIbcNis4elyddywvCrwmmtbIaDQAh8+aDhmaEceMLDrwAbYUT2M
VGDB8/1GE2ya0K6HtlOvWYC8RgO4P3TrNdgZx4oCv94Iq6bnBzZsoQW2khtJ
cwQw6oMhaYUhLLFu15/hXFW0m151m9ZGp0xb1IEP0w4LtYYhcxRyFJhH0rju
RRbYatUoaoCQChw7bPiha/leA3DmR1bdchsg7cIqYMlu1oDEfNut1ZUSDupW
GDR82GfPArJ1azXfqTU8D0zq0IRNtUHYRdXAg810a6Y1rkcg70wlXL0mWIqu
1wD0ulH9petM+eyl6/SqwBLNCGSv5zTteqMRWCEsyzcBXLtet0ynaVl1J3Kr
ILF9IOeaDQ8qUres2jiygCwbddPzapHt1ceBaTXqthtVgR+boBLqLjgJjh05
ThBWG7XquNqUxODBd3YNzGOQ+MiGGjFkb9I7wyLxydKb0QVRU28+WaORz+YX
Xj4gKhSNoETdTIz1XPSkC269pbEKbt4Prn7+O4i+X0uG+eSaZfOpZsFf9ar6
q46fjfEnG39yyqV//mXfaGeddDB6p4ZDmD785eDbbjqOqyYw5QS1SExgyO9t
9bYl36411ZP4U91Rn1n8q5ob3n4GVBDHKax1HM+hiXC5TRwqrMFfXgP+inA0
Ez9r4iNNhLoW4AxNmm2Mn9bxIRs/devPzTvRMISwRziDiQtoIhBV/MvDqRu4
+ABHDWlU/MuvMerw7cDkuWAInN9HhFk4YkgIxc/GthzRx7eb4xRDVfzexTX5
CIBtyy2q2nJP6s9u9cZLF2LTODj3GP/yQ7kaXiH+WnXlGhgeXEi9RqB4OGOD
PsW/Qg/Hwe9DhGxM2+pLNFTxC5fQxWjwcTespkRinQiFqA7ndnAhDfO5hYBY
SFdCdOY4TE7PvHStvWMhcKYtQSe6CQlg/KyJn5l1uWb6rBEwgvBtAjPAx23c
HgvX7IzlO1VH4s6M5Ob4RG78dg0/GOPjzVBu8ziUk1XxJ8t9dhv9dCENnKzh
y7nrTTl2yn2mJzc58hS9jQkUAiAkzkH0B2rxAT5k4beNlHOI6vGvBvMQfeoQ
EXhyQwMiaTUEzP3sNvqF2/isELjW3rGRVAIE03OZvMSamRFxMOJ8C79wXIlt
n1dPhFZ35eZGCACJDBNHrIeSQYgwbFxT02RGIxLCgUMSPYQd/L6BcxP/Eygg
X55ZyLt0HeNmWUijUI1Au2gR1TUkCxKd2vQr/uUKZnQk4CERHEk9/Cvw5E/N
pqR34j27ylul5iYtEjTLQowQEY5xbXaT1/bMOsBSu+kM0sV4JORw1gjBcfGv
iGRVU9K8VZOcV1X6YSyEHL5NwomommSMh987nmQ1Wq+L39YQRFoAiGQlngn3
tE4mg6piK0dSCn3Gu45/BbylQSAJnri5iVAyD9MUpmQWfyzpo46P+MwOpHJc
/NR15OJpRMKAOZa7RmzTRMg9AsqmtwkbBBGB6j5LOojyq2vNCKBFkBaIJKIJ
N01H7va4IRmzWpeE6/LUxOekaHxcHWsTQoUjmcGOJN49Sy6wytTn4uNRXVIf
geKRdsMZm0o8kBQlpNlOWSkSEsQ0Y4O2lkAlBJANQ6qJlIIl98rHLxphSiw0
GS2ezAn6i0Ug7jTJPKZiX5KFZTHKQ7mrZEHYz9oA/w/l/+UoB3MPm5ODy6NJ
SuKbiEeEn5R1QjYZGyuklki342dk2bg8PWGFhALJHbJdLByRFARJb4fEOskA
EjikEhlxZNaw2nflbpM+CWgInCegGckEtuTOVVmwkbFXq0ns1gj3noSSNoDs
ijEJQCV/oiqLJlLiiNOQxsGHrLGkPiIt+oyEL8lLksAey3gyiWmXCIroRWhf
BJpMJ3lJfzUZKCEjiUCbRGdkGQQSE2RwgMVK9pJatU1GiiXXSrqJNoDMCLIB
WVz7jEKiOFJ6uH5iMmIO2nzyGEhrE4ESBZD6IrTW2NqiF0m1kvFNCoR8FJLK
VeUGELLZ2ibTrZFaesSJZJmQqcFCnLgG/yJ7ySPepp2r8b6TeaU0Bv1k+4T2
XEz+d+YU9EfTrp6dvqXS/+0nPoU9+9rpPgxSdMD/baf7eEJbcMD/3Ok+ZzVc
m4MhdtyYnlMnhQ+nvbvJpm/imeiHVv/u2u6Nuo+9YXjev+9Y3eGg3W19Ohvc
dbaD0dvW5ei62mv1znrD87PLVmfTa3W4wB0bVHBiRPRTm1Py787Peu1rs3/f
d2FB5mCESQEfWniwid0U+sOOA0OeD9rnF9Tnou8M7trV/v2g1d1eW5fYMuOu
+3Q5PAFctC1sGdJrnThdRu/p4KKtqut6resnWRgwnd7yOs/Puq237T7gZtB+
2+7eTU+7rfCsd9/fXLa7ANGJ2Tc7G5jSASgBeqqkeaSeDt0NrL0KQG8G99cu
vN4a3AOq73rt7nAkFtkRrTP6Tv/upIroHmCZ4Oj6sT+6RsQORu2nXntwcTkC
FMLa+9uO2x/BLKO+wzsEu9CauL37LuDm7Wl3OG0BWk/hycc+ZYhgtRCss6Ov
k+lgOo15kZ3Hvjk4xfYiMLMDm21eYkeOYd/q3/fOsHsJ5VmMnL45esL+HoNW
2O7fDeD/t6eA2ip8th0ADfW34ell+1NrcAdDmVxEcUUn2G8v6CQ/vBjg1/ef
LrqjrnvZ6p0PAJrLVtfpYcOS1snToD3aUv8Ps+3Cvy6g/wyrHoCuYIjRI7Xt
uIcZAStA0JfD8JQWcz8dXlnNt6OYZjvFRh0D7MIxGgF53buDVht2EKC8g624
o0Gwo8hlG8mnjV1Y4GfAzQhYy4RHhhMbXkPaQXzAtsKutNsWvAVIAArfnrZo
kMkW9t3t3Z2ed7fAC+3+U//+ugq4sPt3U+ClD+3ecHA+GAG5j7AdDSz0vuv2
zHMgAqArxMktEHPfGvDh/9uRuRqPLJH5g3kDd+E5QGJTectd7+KydX7a3YZt
2I4NEIE7uO88UY1npwrQmADBBhZk9odtC14GofD2vGcOzmGoUyBH53L04Qyo
edMzsaAzsLsjLGuZOARJ72LQGlV7dygQ+oA+4NDtbbu7PYVXuxtqZjIC8dT6
cA5sB4vAnWnDjg3Ou60+FuFgFQrueWBP7z/aTSt8c2pxgRrTAKz7vEvUiVkP
EwvLWXvAX5fAWygM+sPJhuQJyIphuwp8AtzcB9Lq4oJgs5FuemddbHRjvoVd
CGB22BGgYOzm090C5MNrQH0f614vMR2jdQuLOjFBqgGXolCEpY1gg1sju9sC
mWHCDm2B3YanQMmjp/7ww+klCIL+3YfzHrYBol3Zej8Nxn71gxm8+UBlPsQ3
921sKQMoHQERIPXeb4Adnf72vI1QA0cjJBvOUcJKOiDodrXXHlkoJbpmB1t5
2N37NrDbKdADUOg9pmiE55etAAQA/E6ZIp9alBkEImbbsWABZ0ihvTvM6sBs
qBOzez8ye22QK9uJ3TWvt5ej81P8rnv3CQTCPbBrm/gIl5PN9tjJ4734fMOp
ursN3V9hU3ZDb8peKu28z3UXz4xymHy+iefl9dMRlyGI3GatS31JpSguRbvC
3WdUGiPXzhjfYS7jYpzNcSzlmuFjr0fs5ypuY8Q746YRXidYMQ6H6voALb86
d0WIqEWSt/Ym/DrGghUIdD16Nrk+A4O8s0Pd2CfyrFVXliNO9C+tzVe/Of1V
pcGuLRjE+r2D2K+MCM+vfvOf+ri0rsIgZuTXvXpQ9R3Lb3iRVXNrUXXsja3m
OHBqXuiZzUYY+c2gavvWOGzUarbpwlNjp+k3EBLnleGOm0HT9QMPE5kD2/Gt
0PQt120GjWo0dn0Ty/iDwHEbVtCIGrWwYdtOFIah2RxbllsvrV2AJPy9y6m9
MkLv9wwyhkHqAEn0eyFpACT+74WkCYM0f+8g3isjCH/PFjdgi/1XhhP8ni0O
6yVgHqNSqRhrcbeCH4GIWnItCd/JS/c+rbRLXGW50C/85i/+q1LpRF3jiDen
rM3y2iqv7fK6Wl475bVLtRHrOk+xWsaTieh7zdfAYkPn0iNf1yr6FsfzXDId
SrhTYPgEnDVv7ACqav7YdO160AyrvlWzXMdv2E7NhdXVbMtxAtMLrHHgehYm
8Xuwbsf3HKcJpFj6pYdn6lm5m+YtJbCCj0elX/4IsfKL9UcMYv8Rg1T/iEGc
P2IQ948YBMVKI7KDer3m+14QupaJVB3ioahfj8IgtF3c/qjphWPfq/q1yHTM
qAHUUrd822qYtdIv9T8CEhArQcMNaq4b+VHDj5DQmoE5HodRrTm2x5hr0AQ+
bIRWtT42mz7IoLrtBpELbFwNQr/aKP2CYsWvOSApPWDvcQjP1pqWE9Usp2Y1
q+44atqeV63bgW+6tSp8Y9lVyw+cKLBsx6o7LizHQ81Rs2HtbrVeC90GHt5H
ds1qBHWn2Ri7ru95JvbENKtWw4nweNuzTZAfdgP++OO6VwJ+NprNagASyLIC
J7Cbodf03Nq4DvCMQ1hWI6xX7chpwvJs1/RrgR2ByjGrY2BLu+lZdTe1mv4Y
9/+tP/90619M7zvn94+y0ea/JlWc/bCfXPv6pydw/U8/dUWKPToOw39J0rrw
ydbh7DzxfupPfhqyAwpOxQW6f/n/0dUt+Phl/4PDFUtXV0frls108LtGHWyi
CG5EBzznjtMfjZ6wWya2fwRv4OlyBJ5069MpeIiIk8vhbRteAXcWfPi7c3Ag
wBsEHwO7h4KHbF6OMP97F609jqpY5GBOW5dD8LXMNhYxgFPQMWGodrfdAcd6
5KLnOBhdg4N5Qk0n+yami0+e+ttbsP4/tTEsQv1/PrTBzX68BCDBG6ruonUk
0DrYgxtqLvn70Pr2LTZmTdFqM1oHp9823Ashud5FK0cQwIv+nXRSDMldeLGL
1gmjtf127zC/BxKBVn+OkEi0uoxWdOm/bbgXQbKLVuB8WiS2e6LGrCH4ml1w
W/vgg96eDpDYh5/OuybwxV0boAIKvT9v94cn7mUbX5m2utu3Z90RUuu13b07
sUieXAP9993+3URG2XSWfBKix+xv9zEIeqkv5pEMg4z61dS/fWGdK15EqFe5
vmsf26B2fnOdqyOaVeypcuXh99W5VmvfVudq1fN1rjD9/6E6V9e2q5EZhGCY
h9jzulZrhDUncF3bNB1Q539snWvDfKbO1YH/Grt1rnW3wNIRr/9WQ+n/xtdl
3asqmfyWHbdMudEyiXr/fn+97tXNJTE3wcy1quOG49pNsC/DutX06uAmgoE4
dk3whrxxBLZi1XXCWqPu1COr4dtRXaaFBg2/FnquXYPNjxy7VvVDsF1hhFoz
cuqUMGo2o6rpoUUZuaHZAEOwPq4+XyeLIiJXJ/vfCe7iuto8hJHdBCchCMY1
K/Dq4ILbDQ8malrBuAqz18wxwOUBcYzDsemPqx4axpZKlR/bACH43zXLawJD
RSGY6jAKjGSG4JY23KYdgRdarYaO59VNIAlwBRzf/5fV4Y5W5z8OO1aPVWnn
x3lv7P3kjq/nU/PTxy4X0m6v8TvtnI2qGvcctXmj9nm7c/E09Weh6aEl12o/
9TZoGAyG4hiODneoDreNHdctaozU6jpsP/T+f/betTly5MgW/K5foW87s9Yj
iyeA2LX5UEkgKXIE5AU6wW7SrpkMiABYlUk9Vi2JZP76dT8BgCy+iqyuapV0
NZquYjEzgQgPdw8PpJ9zTu8TJ/GjXyoWdblj9vZSlzn9ft+qKud/R5b6+F0P
k7Wvq91eV0wNvivob4zsw/wofQIS35a7al0WVVEfatnQZeK3MlSavi8qppDf
0ltAZn4y8Tvew1VeuRlX+afm1jK4+CfGKP+Ot9vq9He/5e8Ebx6acaagNjMG
eQIgc5lw2OT0++mrS4zknklzL/8J0K/f/khAdfZKaPfz3/wChwuIriz5K9jt
Km8KqqVafFRWu3ND7kQlWUuvv2OpgtspKO7hc/lb3mcguu+PqgN/tXZJ5dkJ
f2snmtzToarQfHKqxcl1wzD44sTwd2btBdWO70ChT3c1TGFGtaapd/xNVZVv
ihP+po61F643rHKQn6hS4DuiNZ3hCqDpr9b8lTV/4dnk72yzpXBrGRVOl2ip
GMyvqEwNx+Xt8xBfrrzvoXypvjQR5Vu+YVKsq4B5/ZxJARHM83rTpB6ghDmf
4JBU7vYHVnKoBZXkbUUl/dkR45XrLYtE8Peq5wceTbVbHW9yL2o+/1MJ3+xW
R/CTarXZ8pG3MOX+nI6/XGdX5GZr+j1FuKB6e0v+wcDibeBvPMlvOBHsb5uW
Pge6+0OTN6t666/ZxWrRyqo4PfqFgcYPN8AvBDS2Mulp/9X96P2QJFLJTguw
qDhnPFWhwnudqT4L3ho9ZC8Bkx8OMR0TY9NUea+E60d+8BfSJPS9FIruSAWB
7CVVXwxr4Kd9acZyMskMZEhZHIefuadGd4lWYXDZ4DvntPI2qGEcaGZCdNb1
agzdEETIOmmyXw7I/HDCXwjIbLTz3WipOBl8lnlaD0+lk6RKjGpVR8XoQDWJ
HnvV2aFTwI08C3x+OMSOFlZ0gs4O3qheZRl/0dB3ImMxICdUGIeU/j1Y7wbl
k2FwNjMmDEvdlDjVD3QEMUlPt9Z0wHJjFqjSCkoarYeBijnpWQXIZiELdBu6
9Etr8vlA6YdzC70eGcjFkLI0SSV/txLI/OS7GdV+oVfkzoNNe4oPrdPQD8Ng
yfPmjyddT2VeCN751HrrRS/TsQtUF6bKhK6TaqSQckIHKgcVvZNWSNtXAqu/
lcH+wkBsqR4gHnX2eWlhhoV2n5cW5sNhNmP7dPaWUFgwkHcR8ZZQmJPuvYh4
Fe6bjmpvQJDiOcEXxH3T8ryAIP3obnfH6KfOz/NQ6Rits7c7/nzkg/+/3fHn
j8P/3+5+8240bU5vdb85XqfN6a3uN6ftRwn5de43QwofJeS3g9OpiMhYYE6k
WZd5l2Uyk4mygxxYAy7t2C0YYK5GKk0cFSPDSLMZ58hLxzEdOt11wjoqW2zi
/JgaKjQkLbX2QmRcq/hRjZYWltwiSRTtpzP4c7S+k7RwfTa4IGz/y4LTpTKP
0elvyyBx7ZZE8NYMEtdueUZ1fwlf79Lz3R/UW6916cURPq63XoWF/7qZ7FNY
eCXlv1wme7sLfr1N7DUuOKeiJ0v+T7vgXD48WfK/HbCvO08ltND0P+WSjq4o
RyG1SnqZdWPHjzQlTVw5H0TSDVkYe0EV+TyMXmpJLjI4qvitG4aRVsBqpvVL
Oq2dSpJuHCjR0euepmfJWVzWJXMVw94itaPlcx2Z4KXy+B8J2CdLM31+l9I0
ZEduIoeRQoIfCPd911FIeDrHmEwNGaVz19P8TW/1wtkgyYt06LJR+45Svhs7
4eWoyPODGukwJLxw2iV0qFGpy0bfKYoBN6cplWQuNZ4CwgYKw+4rAvalH5yw
Ou3IHRmnH9J0oGMcTdiRVzFPCp3aEBIU17S2NBWX3BGnCJlpPVr6eG8HCsHe
dVZ1/djRGX3gZZedEaL3TpGbZ4oJC+TQz/PkFg6jU02fkm4Yx38D9r8yYB+o
NQDjhgW2C4guMJNxLAtGKgvfTVi0CaaKTwsxD1O9aKJ7gH0gTwECBkgIgEwg
1QGt7RYsPjBMWTcjeHTEdOJNgPkAjYqhAcmZAbTUzWOSC3YXlhwjaAs4rPgS
AK0AfgOEu0DlgV2DVfFmAAUnnDiwfXJBGAK7hp+AgDL+uwmNDWR9RAuOd/cG
itQs2CTBlgV82ANpBZRf/69DFjDh3UChADKFLJoBUF0s+pDMlsZsgGgDZh7r
bQD/crNhs3tgZHwaoC/Vz54JmDugggw8/opEBcCmwcpAZyJYMSBA38FtAVQg
8INugSSHCLwDuBSwb2D3YH64AzCgcgnIOywcsIsygt+A6APccEBcwgFhamQT
uGcyjwzGAAmGVnfuC+g6MKRwb8RhJNxYIK7jsKw6X5YZA349eQAGg5kB8Yl1
hc8AV2letPw/F0nCZD8wCSCK7cQVsWBwgdX1i9MCcop4xhXxR0ywLs4LYYv1
xrIBrrjwGGC9EZaUS74mQUO37Bxi4dSIXANmjifQGSCoAA5G/uwiHh85A0hd
s/AXIMkC+xzfuQCgkY/gWxPyc4BNsnnQ8EdkX4wH98Z10iX++9kiM9kK9lOA
QjFAgGsjOFvOSxbBx+K7CRlLGwbWLZkvjAHAacMy7zivF933HjkE6Cf0Qgnh
Pqa7wE1iUoSDY6r3vDdbYMlxDwrzPDF6sBsgfsFQEjM5CoZoBWSMSOOwZIdI
stPPHo/PIHVHHgz73bJnA3GLHIQ0BrqDuJch72KU2KGQlWHmMTozsLd69gnc
Ry03QyYH/YZ9EzFF3FUAkVeL/wPavnAv4NVMzn8kE1AYpcBCZhELLGCM8SbE
1oLwxzzihumifyyGHPvZicbFKPggco7u5lcxUFAbhWhIeKyfqIDmHUsuS4e0
BN8EunnZS310AYwI1/QL/Nom8/RicgSRBpYOWQo3mPZfpHA3O7B9sWh4yJKA
OeGucGAsafxjwtVP+ckulZKY+BAwbexSSPgL1jxdsP8x3tTseJFCiS82cYEg
U/RiXjXsV5FtAbsiPoM9atkdMIohLti4kMOg2EB56pdbIEbgRYh0DA+bpIuF
Q7ymnw2NcEUJEdzsb8nH0Qt/drFowevYYtIpe/zb5N+SyZ8ipsAxACkFA8Uq
oNAwCwsIcgDuDKqYMFW62FuRGpFikQUwDcx/qSdwHezoWTIvgOvvznHYWUDv
gNI/kiygYkIeXeiJ9MIWMiUX7G/IOx48HqgikHax042zYbAU+ANl3ESKARay
SADh5lsghyBfi4V8DTkrW06TPpZ5kRNlIR95OZ8/SUwBTg74lJgdJ1Ixhfmf
8EfMBcds7PkuZkb8jNrJLEdCFGfDUtVFE6IqDnNoJNO5xn43WQ9RFXkhFpIJ
uAFSahxPP0dFNsVKPxsWdRtWZETyReUxfOS08B+cdURccnA1qaUYx9Hyjk0E
e9XMuzK5hpmeNiCn86dhOlRN4/ivSUyBTvK3tSr9cQJ73G6AkK5ytKKcM5GA
ZjBHuXu/Kmmwm+06Zxw+k1SUBbfqNKuSiQf2zXFZnB6XTDzQXhTl9vK22QE0
Xe1rU4pWlS29dPB0uWZdbk+YbX9Vifa6yZu8zC/lZnu6rtuL4/LAaGzGYL+T
TX6Rgw6iFfX+5GdwW9QG7Tmv4LbI25tqf1rQiA71/iKvBbcIFrc0+gNa26JW
Bn1cgDHgsGKNV1Pu6W5FKau8Wm9eoMdgbgzuNkJnYKAFrWV18Le1KG/L/Oqo
2V0dN/lVQf5S0IRvyvyEbMetW/6m5lHsSmDYgTg4udnknhb0bA36BzJXmV+s
GUIAwYItuda+WW+279dMB7HZlrf14awo92fHzZYbEdFkVzNUYHd6TGZaN/mq
2BTFTZVfvophI9JrsGE/j2FjWx82bbVqdmdrtIWu1zUYAMrrSpSaPJVWp7DV
9uQWYrr7M+6KOjT7k9t6CxaF62YxNY+UGw+fJunY0+92e7ojTYKComJajN0l
rRiNumC+i/frUpwLcgbuBWsKCr3D6qhuW1kzMcWeFSlaGsmlqIpm3exOyAFO
j5qt1+wMzKDQMCNLfmKb3ftITPGOfnVywwKg9FEWuripD+eqYtcralo1HgXd
9XB5n+ejqHeM8GLCk0ICS8WMEp4sfnJdFbVoKOSYs4EbzJqCuV/K64beU+/J
0elWlWiOmpYcoqUJ7mlk3AJ5omruOytKWx+8ZIoZ4KgYmZKHdc3qLwU3nBUU
se+PmfKA1qqgFbvF57bnkSLj7AmqkBOOI0O2oOTwTpPv0OrRv7n9bXt+W7Xt
TbPl0ZzrKLtxU9H8KlFr7o4rOa9QtDbtxVG9XdGdA+OJaGErGs07ujRNJm8V
+QhLcHDcQcZnG47Iwa4pQhHNtTingTPgxTPnBWPNDHmwJrfKa4bh5GdHm6K1
Tf5O1ndIt/tUIaVYk6dWxyWZkxIBU2WsODBKcnRWm672THayPiaP5cbEG15N
5NirHFohbUurcXFUcijuz47oIzfcadxQktgUZCNakYbjZ8sy0aw1crEqDyUl
VbaJ4vbHit+6pTA7tJS52gP5iCVzctomn2Fyjj39rrAUALT4lx/u84Qw+Ogj
qpCT67IooCtLb7dki5uaEmF1oAjf807AzZjhqN5zGLKHc4iC/Kfct6aiSW2Y
yIWiuN61zExDaWhF20iz2hTnh1qseVVssy+u68P6uNydFszoQ6lrBVKXFc2P
BkvrX+6Y02Nvmn21ohi6rnf7A20i5C9e0GUoyzHBC7nk9/d5QrhV9iFVCO1D
tBo5mU+Q49PfTA9CI6PV8DSSVnOHKSUQysVkakrdaB+mQTMmitlo9gWtAveH
lzTBd7SAFJY7ihtuVKXV2xTN0aalXWBPk+Pb7ShxFmgf5mxFG8N1vecF4xx7
eVu362LDkjS0gZQsVZOXuhSU+ShdMc7uNTwhrJT5c1lCnrzG6zlCfvOr7fsP
P80Q+5/mpri/vu/++mtWkmRRSd/Rnx/oHrdzDfTdrz/8ZvjNr993f2cGgIXt
I4qP/orGcjn85Vd0jXjLiAf5818+/GH4za9+9cPQ7efb8FQAIPvpD9wwwfD/
x5/59X8sA/jP+etHZvd4ptHtc7FA01ftn/1R5gp5bkifTSHyM4eknh3S+Lm8
GfH76M+kuEA8POkA0WeYz2H4//7WXTHNxCM3+MgX71xBPz/Jz/2/nzVJGpL5
4t45jj9nSL96d3U1awJD3ne2/0z0Yd7GwsGv//kvf/rrn/yfruYW558+5uTA
Uhc3f6akNYSFHmRZb/6S+TfPJ7B5ceMLv34eOdaN3I7BYiUjd4olyqmEVQ+Y
LmEwQ9YnmUy1cX0yBDUOvRxsSExIuwivs0qP0o5+GHwqxl5KyRz4wTMtg5ND
knA3tR5cMJkKwhitfBe42+D4/sDvs4T8TTzfg/u5i/9z88Dzg5X/TINV/0yD
1f9MgzXf2mBj4fSo7Lk39IgAp83gMPzlT1Or0k/ffNpA2r1fMv3t91GQ+74g
+/Oj7oVPspCmavBq6F0YlPXGpUIMJgmJVpZuHZKu0y6kfWKHPjNdknkbu8AS
Gk/ah1T2Ro564OYiMRozSPrw4DPHrWip6XyvR2dEJ/qMht2/6Dhx9M97j+4F
U9cwxiQZg0+hiZOMY9pZ46XR3garRp3YRKTC6n4U9ONoaWmi9xhHS2NHJ0Un
hex1NgQvOx90H5QRY7A2+D7tdCIsfTrr0kSlw6+eNvRfrz+QO02Gxj+eHbZ3
mfRBDnJMVXBeW5+G1I9Jz9ji1Kae1jpTTCA1+rGziemyIWVCnej02oshkaPr
aJGkZ0sHl4ZkcD0LDI3MRiW0dmmX6dF2Tho2+fiyoTHg5w0dRAdhIeetV56s
kDodMm3UqHSfWu4sC27QWokus74zY0ikThOtYwejZWIix0PJaLlS68n3x84b
TV7fD+RjXTJIlXjvlO/HftRWu0R+TUafm6/L6PMFQKeP+UDmk/f2m4G/PrbJ
Y6aW+Ki64WeCX5Cppf1yPDof7khQmEcn+oeIjwV+PnvNR/89b4M32+QJGp6J
NOpLemzxpRl94jPTKQyP3v+9/7DahR9P1cX3/JxslZ78MfpL3Z6beluIclcY
FsrlR7F4gstfFFzwI+YVszw1+1Y0/IRld3nD5M78WKlp69uGn5ExvXB+zk+i
VlXe3pbi/Kbip5UXedOe5dVhdVzviht6m6Gfi/rQGhCxti0/zLlhGH+zvSqq
/PKWGWqrnJ9Wrgt+IMyPPI9O5Y+qkv6PF1fRV9ZHZVGqTVHr6nC6rvm/3VXR
bE9kfahtdXh33WxZAvv8UDJ5LT+ZuyiqPdMF011YJLg9O9rkzaravWeuALVp
a1GJ06I6rI+qfH1c4quMk5uyOBdV0d5U+QUejbel2WxPVM3MBMU65we8my0/
/F7R5U7zup2YCv5wdvhoxLuKRnxBduSnlXmVr1bVngnCvcEj6RzcS6tq2+Tl
lp+786O002P+aqPaMad0e6CVuQZP167Fc9P85Jq5kMvdXja7PQ2UzJuTXQ7v
101R3tRtVTCqutzV182+llXb0GgDGYAus+VHbky3vKoO57eVaD+M3z/yFSoq
rg7h6GVfwXcONJKf5SvxWXL783yFVyd+fyB/1I3ufqymvMLc2uu8ydfrkiko
9jVzmZGfhALC0/tTINCrQ6trftDId7y8xUPdPdNzF7QC/KyUH93zA/F3tDor
xoAfb9ritmlPbpjBuSyaYsPI9X1r2Sa7gvaO1TG5WUGDPJSHva63l4dmR/Yh
89Xi5DDnFfjKRyNmf2I/OQL/ccuDJZ/ZnZCz7w/8PLTKyTd2TEnd4nlpk5MP
HcpbcgLD7NZVQd6+KyIVBcUAfyNG6YXehrvj0fOOvzzglbngr28O+CZxT+an
99Akbmg18/qwJ9PySI5prQ/VtmRKjg/jj2/jlfoLlTt/Gf761z8xK/B9fqn/
slJ9NrvU/au+xDLFN3mOY0plb+OYEuLX/+89pNIET2rujeQfRDj1kgQna2/+
6osSTqUPRcTlHSDKKhqkTg2mYXigUS70MQVVYhakyM84lX7rH58Jph4u7Qz/
+ATB1HMLOyMb79Z3Ipj6JHjJJ7qzqRWDYqoAmXofMiV1T2fHkU6hY5YOsqc3
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
G5f50UmxKhIABtNuMsnEekVrxjSbfJI6iMhbhPbGaFeaKdb7W68mFoZC+YoB
OdFAMlghfWNNWfixgCI6yKV/iz1/k/Dzx5A59DjxyMusK8n+GeyUJyk8qtZ2
7GFlC2NBaw9V08YO5TiVkBr8YGHVOCgSf9xoemRXyKo0kjg3jciGvM1Gtdjz
5PSkiN+Ck82xYljcPDcw4qFMxyzXJofDtVkypj+FGPSV9erCwz36socdJaXO
kZU5BfVL4fxTaECufT8YmyaWmzLUJIUKqiUfTnUG3cp77DqFwcfTMbXwqFmv
vLPGJQX2iQk5ZMGdhTIeFWWy+MYCnzHc75F5lizRLWaQxg/hQn+AefzWHKL8
Zc0tGyt/YOdcds2CX0W9f+dcnk6g4AeilSVS4Yg+EK1EhgCL298arSzl6kUa
teljLmq53H3MRS2D1x/bFhYHVXxsW1gcVPL2beFtrIpvnt++l1Xx5oPOn0ZK
evlt8wtWxcdOYs+sih8dKycm+LllI3y3uwt+Ln7X/V53F/zcfPmv3d3bvU08
xH4Zrr/N2yyD/ypcf5u3WQb/VYr0Nm+zuKevUqS3eZvFxn7ldN7ubZbLX8RF
b/U2i9K+iIve6m0W7/YiFn2rt1li1hex6Fu9TXxX5MfsjeyFE9EZhKhwN6hV
jzTF+96kWo3ZlHsFOWqLXCOzvUPsN5U+c9BHN/SLqo2pt3mh4crGVKcl8pOE
38BYKIkqcbEnqWTExVhsjDbH4BNoYQzSyyQtIXOsdAK17n9jSFShvoZEfSQ0
WPb1dxnr2UoX1X2XsZ6tdL78fcZ6ttLl6e8y1rOVxqDkPcZ6ttLFcN5lrGcr
XfToXcZ6ttLFcN5lrGcrXWzoXcb67xca/BBjVZZ/hQavhwZv9zjLl46vnub9
2OMsdvbqad6PPU7MXF47Qf2xx4lPf+0E9cceZ7Gzr3KSt3mcRfKvHJu8xeOc
v2z+6tjkLR5nvvy1o6q3eJzFw71yVPUWj7OozdeO503hwWQmO4yFg2GaHuIg
7Bm21ucDzCDhe84+TwtS741Ppzw3Y94LrGm2lbz0gxqn0ua42qWqTybNc2E/
DH1fIhxQHvonq6dUX6ZGKdxqiS4KnxSOkUg5FtPgvkdL/y0JXi+FBEtAhDMS
ipa70RVY6JFn0yP1wsElwZkMFnptJ5WaLB8yj2nZJLozgxDKQ+fxSfgVXD9o
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
m5qcicliyADEYAJ+NtIHJdqRfVr0YzlTiAdnfRTCOJ9yzsOXv4qwXTwI9cFW
RJKShQUevkT0EQQpqYmgFyVZCvvOnN+JpcUYKJzJjP+e7EPp58zm1JVLA8bq
03p3uHjadtdpc7qvNqfPV+1BqBF684J92FSr9YYgiloqc3BZ0h5IGGwUuXUy
kSOfvrrcda3eCpywftp091fN6Wa12Y/rlhApjHp3bJ6FfbjG01hTfnFih+n2
dIf5fq4Ea7B/eMLtn7cVRkusQ31TNyzTr2+uBC5wug4VXA/J5oC7ssKdfavJ
76tYG9U9bUgHOxxTFvI0LJI77i6b7mbVqFoJ+koR6jcGGtbFc6sIjjia9kiy
Hv68b5625EztWZL/YPAII32/WRTFqv9DfcJS1Lt9jUnhJke1q9n2Gj9mi2xi
8jj/AykZGJla123XJtuK9fcslL9g0RNkVmvc8qnp6kS6bV887aqjJdbhV4TF
w8Xj5gAxq46khNUOYt12hLFdY/XWUICLx1ZtAl2P7Ac8tRqr9thhNPfVrmOZ
/rpqVYtbb64wCrvZE7aB1ajrZHO8rxtWb6nby+bkWIe5UY3h3HeHOmk4GWLx
SNFT7Ou9hgpy/ncWanfa7T9Vzb592nWdbk71I4ETUof58LSNLL8fEBmrVdUc
iYBw6aaCdisC6xrKhPjEHdEfWA1I+7Hp7qFasKGueyLfb7e/0LvDA4mLp221
JmlwvTltMBGMiOxIIck9khzXHnDpkXQ44hsu0t0RulFdpNuqs5vqIdkR6Lgn
s+3OQq8eWSxGmB8mb2UkJE1CI2tBGEDpIS5eTmpGdYHLbiHa1brpdmuCStpT
DTHDriqC19awNRkJaXo7oh0OLM+DreD/DTSWdD3qA8Rb7/DxzZ4juDttWOHW
sSbzDksgtamCOjt0areHHuyPuql3mAjsCRZN0Oe2viYW8ISFvRSSGv7fSuf2
HXTlAeLHTb7kPl6wqfvzRt1cbTG5jYgO+nI6wiT5bzA7BbkISpEYmS7BZyvh
ht5BPOvV7tg9YgyYGEZU0UofNClzm7o2hBhuBECCyZ/untuDI+RStVDLYDtJ
q26hreST3K/bY6ua7vpx12GxMclW4TanTytcmuwgyhaOoKkhn+czJ5JW/A1U
ZFAvLCRvDSfZHm4uN6caq+cg0mtiBFdSsyl0Pb05EY2HqRwxkRpKXl3Aw92v
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
4UMOrZUjt6UJyHeps/8LQKOjfTW2AgA=

-->

</rfc>
