<?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.8 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-11" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.1 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-11"/>
    <author initials="M." surname="Abdalla" fullname="Michel Abdalla">
      <organization>DFINITY - Zurich</organization>
      <address>
        <email>michel.abdalla@gmail.com</email>
      </address>
    </author>
    <author initials="B." surname="Haase" fullname="Bjoern Haase">
      <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
      <address>
        <email>bjoern.m.haase@web.de</email>
      </address>
    </author>
    <author initials="J." surname="Hesse" fullname="Julia Hesse">
      <organization>IBM Research Europe - Zurich</organization>
      <address>
        <email>JHS@zurich.ibm.com</email>
      </address>
    </author>
    <date year="2024" month="March" day="27"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 118?>

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes CPace which is a balanced Password-Authenticated-Key-Establishment (PAKE)
protocol for two parties where both parties derive a cryptographic key
of high entropy from a shared secret of low-entropy.
CPace protects the passwords against offline dictionary attacks by requiring
adversaries to actively interact with a protocol party and by allowing
for at most one single password guess per active interaction.</t>
      <t>The CPace design was tailored considering the following main objectives:</t>
      <ul spacing="normal">
        <li>
          <t>Efficiency: Deployment of CPace is feasible on resource-constrained devices.</t>
        </li>
        <li>
          <t>Versatility: CPace supports different application scenarios via versatile input formats, and by supporting applications with and without clear initiator and responder roles.</t>
        </li>
        <li>
          <t>Implementation error resistance: CPace aims at avoiding common implementation pitfalls already by-design, such as avoiding incentives for insecure execution-time speed optimizations. For smooth integration into different cryptographic library ecosystems, this document provides a variety of cipher suites.</t>
        </li>
        <li>
          <t>Post-quantum annoyance: CPace comes with mitigations with respect to adversaries that become capable of breaking the discrete logarithm problem on elliptic curves.</t>
        </li>
      </ul>
      <section anchor="outline-of-this-document">
        <name>Outline of this document</name>
        <ul spacing="normal">
          <li>
            <t><xref target="ApplicationPerspective"/> describes the expected properties of an application using CPace, and discusses in particular which application-level aspects are relevant for CPace's security.</t>
          </li>
          <li>
            <t><xref target="CipherSuites"/> gives an overview of the recommended
cipher suites for CPace which were optimized for different types of cryptographic
library ecosystems.</t>
          </li>
          <li>
            <t><xref target="Definition"/> introduces the notation used throughout this document.</t>
          </li>
          <li>
            <t><xref target="protocol-section"/> specifies the CPace protocol.</t>
          </li>
          <li>
            <t>The final section provides explicit reference implementations and test vectors of all of the
functions defined for CPace in the appendix.</t>
          </li>
        </ul>
        <t>As this document is primarily written for implementers and application designers, we would like to refer the theory-inclined reader to the scientific 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. CPace requires a shared secret octet string, the password-related string (PRS), is available for both parties A and B. PRS can be a low-entropy secret itself, for instance a clear-text password encoded according to <xref target="RFC8265"/>, or any string derived from a common secret, for instance by use of a password-based key derivation function.</t>
      <t>Applications with clients and servers where the server side is storing account and password information in its persistent memory are recommended to use augmented PAKE protocols such as OPAQUE <xref target="I-D.irtf-cfrg-opaque"/>.</t>
      <t>In the course of the CPace protocol, A sends one message MSGa to B and B sends one message MSGb to A. CPace does not mandate any ordering of these two messages. We use the term "initiator-responder" for CPace where A always speaks first, and the term "symmetric" setting where anyone can speak first.</t>
      <t>CPace's output is an intermediate session key (ISK), but any party might abort in case of an invalid received message. A and B will produce the same ISK value only if both sides did initiate the protocol using the same protocol inputs, specifically the same PRS string and the same value for the optional input parameters CI, ADa, ADb and sid that will be specified in the upcoming sections.</t>
      <t>The naming of ISK key as "intermediate" session key highlights the fact that it is RECOMMENDED that applications process ISK by use of a suitable strong key derivation function KDF (such as defined in <xref target="RFC5869"/>) before using the key in a higher-level protocol.</t>
      <section anchor="optional-cpace-inputs">
        <name>Optional CPace inputs</name>
        <t>For accomodating different application settings, CPace offers the following OPTIONAL inputs, i.e. inputs which MAY also be the empty string:</t>
        <ul spacing="normal">
          <li>
            <t>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. 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.</t>
          </li>
          <li>
            <t>Associated data fields (ADa and ADb).
These fields can be used to authenticate public associated data alongside the CPace protocol. The values ADa (and ADb, respectively) are guaranteed to be authenticated in case both parties agree on a key.  </t>
            <t>
ADa and ADb can for instance include party identities or protocol
version information of an application protocol (e.g. to avoid downgrade attacks).  </t>
            <t>
If party identities are not encoded as part of CI, party identities SHOULD be included in ADa and ADb
 (see <xref target="sec-considerations-ids"/>).
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 right PRS string (respectively password) for this identity.</t>
          </li>
          <li>
            <t>Session identifier (sid).
CPace comes with a security analysis <xref target="AHH21"/> in the framework of universal composability.
This framework allows for modular analysis of a larger application protocol which uses CPace as a building block. For such analysis
the CPace protocol is bound to a specific session of the larger protocol by use of a sid string that is globally unique. As a result, when used with a unique sid, CPace instances remain secure when running concurrently with other CPace instances, and even arbitrary other protocols.  </t>
            <t>
For this reason, it is RECOMMENDED that applications establish a unique session identifier sid
prior to running the CPace protocol. This can be implemented by concatenating random bytes produced by A
with random bytes produced by B. If such preceding round is not an option but
parties are assigned clear initiator-responder roles, it is RECOMMENDED to let the initiator A choose a fresh
random sid and send it to B together with the first message.
If a sid string is used it SHOULD HAVE a length of at least 8 bytes.</t>
          </li>
        </ul>
      </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:  </t>
            <ul spacing="normal">
              <li>
                <t>The application layer is responsible for the handshake that makes parties agree on a common CPace cipher suite.</t>
              </li>
              <li>
                <t>The application layer needs to specify how to encode the CPace byte strings Ya / Yb and ADa / ADb defined in section
 <xref target="protocol-section"/>
for transfer over the network.
For CPace it is RECOMMENDED to encode network messages by using MSGa = lv_cat(Ya,ADa) and MSGb = lv_cat(Yb,ADb)
using the length-value concatenation function lv_cat
speficied in <xref target="notation-section"/>.
This document provides test vectors for lv_cat-encoded messages.
Alternative network encodings, e.g., the encoding method
used for the client hello and server hello messages of the TLS protocol, MAY be used
when considering the guidance given in <xref target="sec-considerations"/>.</t>
              </li>
            </ul>
          </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 must be generated using ordered string concatenation. In this document we will provide test vectors
for both, initiator-responder and symmetric settings.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="CipherSuites">
      <name>CPace cipher suites</name>
      <t>In the setup phase of CPace, both communication partners need to agree on a common cipher suite.
Cipher suites consist of a combination of a hash function H and an elliptic curve environment G.</t>
      <t>For naming cipher suites we use the convention "CPACE-G-H". We RECOMMEND the following cipher suites:</t>
      <ul spacing="normal">
        <li>
          <t>CPACE-X25519-SHA512. This suite uses the group environment G_X25519 defined in <xref target="CPaceMontgomery"/> and SHA-512 as hash function.
This cipher suite comes with the smallest messages on the wire and a low computational cost.</t>
        </li>
        <li>
          <t>CPACE-P256_XMD:SHA-256_SSWU_NU_-SHA256.
This suite instantiates the group environment G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P256_XMD:SHA-256_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P256, and hash function SHA-256.</t>
        </li>
      </ul>
      <t>The following RECOMMENDED cipher suites provide higher security margins.</t>
      <ul spacing="normal">
        <li>
          <t>CPACE-X448-SHAKE256. This suite uses the group environment G_X448 defined in <xref target="CPaceMontgomery"/> and SHAKE-256 as hash function.</t>
        </li>
        <li>
          <t>CPACE-P384_XMD:SHA-384_SSWU_NU_-SHA384.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P384_XMD:SHA-384_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P384 with H = SHA-384.</t>
        </li>
        <li>
          <t>CPACE-P521_XMD:SHA-512_SSWU_NU_-SHA512.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P521_XMD:SHA-512_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P521 with H = SHA-512.</t>
        </li>
      </ul>
      <t>CPace can also securely be implemented using the cipher suites CPACE-RISTR255-SHA512 and CPACE-DECAF448-SHAKE256 defined in
<xref target="CPaceCoffee"/>. <xref target="sec-considerations"/> gives guidance on how to implement CPace on further elliptic curves.</t>
    </section>
    <section anchor="Definition">
      <name>Definitions and notation</name>
      <section anchor="hash-function-h">
        <name>Hash function H</name>
        <t>Common choices for H are SHA-512 <xref target="RFC6234"/> or SHAKE-256 <xref target="FIPS202"/>. (I.e. the hash function
outputs octet strings, and not group elements.)
For considering both variable-output-length hashes and fixed-output-length hashes, we use the following convention.
In case that the hash function is specified for a fixed-size output, we define H.hash(m,l) such
that it returns the first l octets of the output.</t>
        <t>We use the following notation for referring to the specific properties of a hash function H:</t>
        <ul spacing="normal">
          <li>
            <t>H.hash(m,l) is a function that operates on an input octet string m and returns a hashing result of l octets.</t>
          </li>
          <li>
            <t>H.b_in_bytes denotes the minimum output size in bytes for collision resistance for the
security level target of the hash function. E.g. H.b_in_bytes = 64 for SHA-512 and SHAKE-256 and H.b_in_bytes = 32 for
SHA-256 and SHAKE-128. We use the notation H.hash(m) = H.hash(m, H.b_in_bytes) and let the hash operation
output the default length if no explicit length parameter is given.</t>
          </li>
          <li>
            <t>H.bmax_in_bytes denotes the <em>maximum</em> output size in octets supported by the hash function. In case of fixed-size
hashes such as SHA-256, this is the same as H.b_in_bytes, while there is no such limit for hash functions such as SHAKE-256.</t>
          </li>
          <li>
            <t>H.s_in_bytes denotes the <em>input block size</em> used by H. This number denotes the maximum number of bytes that can be processed
in a single block before applying the compression function or permutation becomes necessary. (See also <xref target="RFC2104"/> for the corresponding block size concepts).
For instance, for SHA-512 the input block size s_in_bytes is 128 as the compression function can process up to 128 bytes,
while for SHAKE-256 the input block size amounts to 136 bytes before the permutation of the sponge state needs to be applied.</t>
          </li>
        </ul>
      </section>
      <section anchor="group-environment-g">
        <name>Group environment G</name>
        <t>The group environment G specifies an elliptic curve group (also denoted G for convenience)  and associated constants
and functions as detailed below. In this document we use additive notation for the group operation.</t>
        <ul spacing="normal">
          <li>
            <t>G.calculate_generator(H,PRS,CI,sid) denotes a function that outputs a representation of a generator (referred to as "generator" from now on) of the group
which is derived from input octet strings PRS, CI, and sid and with the help of the hash function H.</t>
          </li>
          <li>
            <t>G.sample_scalar() is a function returning a representation of an integer (referred to as "scalar" from now on) appropriate as a
private Diffie-Hellman key for the group.</t>
          </li>
          <li>
            <t>G.scalar_mult(y,g) is a function operating on a scalar
y and a group element g. It returns an octet string representation of the group element Y = g*y.</t>
          </li>
          <li>
            <t>G.I denotes a unique octet string representation of the neutral element of the group. G.I is used for detecting and signaling certain error conditions.</t>
          </li>
          <li>
            <t>G.scalar_mult_vfy(y,g) is a function operating on
a scalar y and a group element g. It returns an octet string
representation of the group element g*y. Additionally, scalar_mult_vfy specifies validity conditions for y,g and g*y and outputs G.I in case they are not met.</t>
          </li>
          <li>
            <t>G.DSI denotes a domain-separation identifier octet string which SHALL be uniquely identifying the group environment G.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-section">
        <name>Notation for string operations</name>
        <ul spacing="normal">
          <li>
            <t>bytes1 || bytes2 and denotes concatenation of octet strings.</t>
          </li>
          <li>
            <t>len(S) denotes the number of octets in an octet string S.</t>
          </li>
          <li>
            <t>nil denotes an empty octet string, i.e., len(nil) = 0.</t>
          </li>
          <li>
            <t>This document uses quotation marks "" both for general language (e.g. for citation of notation used in other documents) and
as syntax for specifying octet strings as in b"CPace25519".  </t>
            <t>
We use a preceeding lower-case letter b"" in front of the quotation marks if a character sequence is representing an octet string sequence.
I.e. we use the notation for byte string representations with single-byte ASCII character encodings from the python programming language.</t>
          </li>
          <li>
            <t>prepend_len(octet_string) denotes the octet sequence that is obtained from prepending
the length of the octet string to the string itself. The length shall be prepended by using an LEB128 encoding of the length.
This will result in a single-byte encoding for values below 128. (Test vectors and reference implementations
for prepend_len and the LEB128 encodings are given in the appendix.)</t>
          </li>
          <li>
            <t>lv_cat(a0,a1, ...) is the "length-value" encoding function which returns the concatenation of the input strings with an encoding of
their respective length prepended. E.g. lv_cat(a0,a1) returns
prepend_len(a0) || prepend_len(a1). The detailed specification of lv_cat and a reference implementations are given in the appendix.</t>
          </li>
          <li>
            <t>network_encode(Y,AD) denotes the function specified by the application layer that outputs an octet string encoding
of the input octet strings Y and AD
for transfer on the network. The implementation of MSG = network_encode(Y,AD) SHALL allow the receiver party to parse MSG for the
individual subcomponents Y and AD.
For CPace we RECOMMEND to implement network_encode(Y,AD) as network_encode(Y,AD) = lv_cat(Y,AD).  </t>
            <t>
Other encodings, such as the network encoding used for the client-hello and server-hello messages in TLS MAY also be used when
following the guidance given in the security consideration section.</t>
          </li>
          <li>
            <t>sample_random_bytes(n) denotes a function that returns n octets, each of which is to be independently sampled from an uniform distribution between 0 and 255.</t>
          </li>
          <li>
            <t>zero_bytes(n) denotes a function that returns n octets with value 0.</t>
          </li>
          <li>
            <t>o_cat(bytes1,bytes2) denotes a function for ordered concatenation of octet strings. It places the lexiographically larger octet
string first and prepends the two bytes from the octet string b"oc" to the result. (Explicit reference code for this function is given in the appendix.)</t>
          </li>
          <li>
            <t>transcript(MSGa,MSGb) denotes function outputing a string for the protocol transcript with messages MSGa and MSGb.
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(MSGa,MSGb) = o_cat(MSGa,MSGb) SHALL be used.
In the initiator-responder setting transcript(MSGa,MSGb) SHALL BE implemented such that the later message is appended to the
earlier message, i.e., transcript(MSGa,MSGb) = MSGa||MSGb if MSGa is sent first.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-for-group-operations">
        <name>Notation for group operations</name>
        <t>We use additive notation for the group, i.e., X*2  denotes the element that is obtained by computing X+X, for group element X and group operation +.</t>
      </section>
    </section>
    <section anchor="protocol-section">
      <name>The CPace protocol</name>
      <t>CPace is a one round protocol between two parties, A and B. At invocation, A and B are provisioned with PRS,G,H and OPTIONAL CI,sid,ADa (for A) and CI,sid,ADb (for B).
A sends a message MSGa to B. MSGa contains the public share Ya
and OPTIONAL associated data ADa (i.e. an ADa field that MAY have a length of 0 bytes).
Likewise, B sends a message MSGb to A. MSGb contains the public share Yb
and OPTIONAL associated data ADb (i.e. an ADb field that MAY have a length of 0 bytes).
Both A and B use the received messages for deriving a shared intermediate session key, ISK.</t>
      <section anchor="protocol-flow">
        <name>Protocol flow</name>
        <t>Optional parameters and messages are denoted with [].</t>
        <artwork><![CDATA[
                        public: G, H

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

]]></artwork>
      </section>
      <section anchor="cpace-protocol-instructions">
        <name>CPace protocol instructions</name>
        <t>A computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar ya = G.sample_scalar() and group element Ya = G.scalar_mult (ya,g). A then transmits MSGa = network_encode(Ya, ADa) with
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 MSGb = network_encode(Yb, ADb) with optional associated data ADb to A.</t>
        <t>Upon reception of MSGa, B checks that MSGa was properly generated in conformity with the chosen encoding of network messages (notably correct length fields).
If this parsing fails, then B MUST abort. (Testvectors of examples for invalid messages when using lv_cat() as network_encode function for
CPace are given in the appendix.)
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(MSGa, MSGb)). B returns ISK and terminates.</t>
        <t>Likewise upon reception of MSGb, A parses MSGb for Yb and ADb and checks for a valid encoding.
If this parsing fails, then A MUST abort. A then computes K = G.scalar_mult_vfy(ya,Yb). A MUST abort if K=G.I.
Otherwise A calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(MSGa, MSGb)). A returns ISK and terminates.</t>
        <t>The session key ISK returned by A and B is identical if and only if the supplied input parameters PRS, CI and sid match on both sides and transcript view (containing of MSGa and MSGb) of both parties match.</t>
        <t>(Note that in case of a symmetric protocol execution without clear initiator/responder roles, transcript(MSGa, MSGb) needs to be implemented using ordered concatenation for generating a matching view by both parties.)</t>
      </section>
    </section>
    <section anchor="implementation-of-recommended-cpace-cipher-suites">
      <name>Implementation of recommended CPace cipher suites</name>
      <section anchor="common-function-for-computing-generators">
        <name>Common function for computing generators</name>
        <t>The different cipher suites for CPace defined in the upcoming sections share the same method for deterministically combining the individual strings PRS, CI, sid and the domain-separation identifier DSI to a generator string that we describe here.</t>
        <ul spacing="normal">
          <li>
            <t>generator_string(DSI, PRS, CI, sid, s_in_bytes) denotes a function that returns the string
lv_cat(DSI, PRS, zero_bytes(len_zpad), CI, sid).</t>
          </li>
          <li>
            <t>len_zpad = MAX(0, s_in_bytes - len(prepend_len(PRS)) - len(prepend_len(G.DSI)) - 1)</t>
          </li>
        </ul>
        <t>The zero padding of length len_zpad is designed such that the encoding of DSI and PRS together with the zero padding field completely
fills at least the first input block (of length s_in_bytes) of the hash.
As a result for the common case of short PRS the number of bytes to hash becomes independent of the actual length of the password (PRS). (A reference implementation and test vectors are provided in the appendix.)</t>
        <t>The introduction of a zero-padding within the generator string also helps mitigating attacks of a side-channel adversary that
analyzes correlations between publicly known variable information with a short low-entropy PRS string.
Note that the hash of the first block is intentionally made independent of session-specific inputs, such as sid or CI and that there is no limitation
regarding the maximum length of the PRS string.</t>
      </section>
      <section anchor="CPaceMontgomery">
        <name>CPace group objects G_X25519 and G_X448 for single-coordinate Ladders on Montgomery curves</name>
        <t>In this section we consider the case of CPace when using the X25519 and X448 Diffie-Hellman functions
from <xref target="RFC7748"/> operating on the Montgomery curves Curve25519 and Curve448 <xref target="RFC7748"/>.
CPace implementations using single-coordinate ladders on further Montgomery curves SHALL use the definitions in line
with the specifications for X25519 and X448 and review the guidance given in <xref target="sec-considerations"/>.</t>
        <t>For the group environment G_X25519 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X25519.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_X25519.field_size_bits = 255</t>
          </li>
          <li>
            <t>G_X25519.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X25519(y,g)</t>
          </li>
          <li>
            <t>G_X25519.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.DSI = b"CPace255"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X25519 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 32 bytes of output. It is RECOMMENDED
to use G_X25519 in combination with SHA-512.</t>
        <t>For X448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_X448.field_size_bits = 448</t>
          </li>
          <li>
            <t>G_X448.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X448(y,g)</t>
          </li>
          <li>
            <t>G_X448.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.DSI = b"CPace448"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 56 bytes of output. It is RECOMMENDED
to use G_X448 in combination with SHAKE-256.</t>
        <t>For both G_X448 and G_X25519 the G.calculate_generator(H, PRS,sid,CI) function shall be implemented as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) SHALL BE calculated using the input block size of the
chosen hash function.</t>
          </li>
          <li>
            <t>This string SHALL then BE hashed to the required length
gen_str_hash = H.hash(gen_str, G.field_size_bytes).
Note that this implies that the permissible output length H.maxb_in_bytes MUST BE larger or equal to the
field size of the group G for making a hashing function suitable.</t>
          </li>
          <li>
            <t>This result is then considered as a field coordinate using
the u = decodeUCoordinate(gen_str_hash, G.field_size_bits) function from <xref target="RFC7748"/> which we
repeat in the appendix for convenience.</t>
          </li>
          <li>
            <t>The result point g is then calculated as (g,v) = map_to_curve_elligator2(u) using the function
from <xref target="RFC9380"/>. Note that the v coordinate produced by the map_to_curve_elligator2 function
is not required for CPace and discarded. The appendix repeats the definitions from <xref target="RFC9380"/> for convenience.</t>
          </li>
        </ul>
        <t>In the appendix we show sage code that can be used as reference implementation.</t>
        <section anchor="verification-tests">
          <name>Verification tests</name>
          <t>For single-coordinate Montgomery ladders on Montgomery curves verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving u coordinate values that encode a low-order
point on either the curve or the quadratic twist.</t>
          <t>In addition to that in case of G_X25519 the tests SHALL also verify that the implementation of G.scalar_mult_vfy(y,g) produces the
expected results for non-canonical u coordinate values with bit #255 set, which may also encode low-order points.</t>
          <t>Corresponding test vectors are provided in the appendix.</t>
        </section>
      </section>
      <section anchor="CPaceCoffee">
        <name>CPace group objects G_Ristretto255 and G_Decaf448 for prime-order group abstractions</name>
        <t>In this section we consider the case of CPace using the Ristretto255 and Decaf448 group abstractions <xref target="I-D.draft-irtf-cfrg-ristretto255-decaf448"/>.
These abstractions define an encode and decode function, group operations using an internal encoding
and an element-derivation function that maps a byte string to a group element.
With the group abstractions there is a distinction between an internal representation
of group elements and an external encoding of the same group element. In order to distinguish between these
different representations, we prepend an underscore before values using the internal representation within this
section.</t>
        <t>For Ristretto255 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_Ristretto255.DSI = b"CPaceRistretto255"</t>
          </li>
          <li>
            <t>G_Ristretto255.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_Ristretto255.group_size_bits = 252</t>
          </li>
          <li>
            <t>G_Ristretto255.group_order = 2^252 + 27742317777372353535851937790883648493</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_Ristretto255 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 64 bytes of output.
It is RECOMMENDED to use G_Ristretto255 in combination with SHA-512.</t>
        <t>For decaf448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_Decaf448.DSI = b"CPaceDecaf448"</t>
          </li>
          <li>
            <t>G_Decaf448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_Decaf448.group_size_bits = 445</t>
          </li>
          <li>
            <t>G_Decaf448.group_order = l = 2^446 -
  1381806680989511535200738674851542
  6880336692474882178609894547503885</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_Decaf448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 112 bytes of output.
It is RECOMMENDED to use G_Decaf448 in combination with SHAKE-256.</t>
        <t>For both abstractions the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>It is RECOMMENDED to implement G.sample_scalar() as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>Set scalar = sample_random_bytes(G.group_size_bytes).</t>
              </li>
              <li>
                <t>Then clear the most significant bits larger than G.group_size_bits.</t>
              </li>
              <li>
                <t>Interpret the result as the little-endian encoding of an integer value and return the result.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Alternatively, if G.sample_scalar() is not implemented according to the above recommendation, it SHALL be implemented using uniform sampling between 1 and (G.group_order - 1). Note that the more complex
uniform sampling process can provide a larger side-channel attack surface for embedded systems in hostile environments.</t>
          </li>
          <li>
            <t>G.scalar_mult(y,_g) SHALL operate on a scalar y and a group element _g in the internal representation of the group abstraction environment. It returns the value Y = encode((_g) * y), i.e. it returns a value using the public encoding.</t>
          </li>
          <li>
            <t>G.I = is the public encoding representation of the identity element.</t>
          </li>
          <li>
            <t>G.scalar_mult_vfy(y,X) operates on a value using the public encoding and a scalar and is implemented as follows. If the decode(X) function fails, it returns G.I. Otherwise it returns encode( decode(X) * y ).</t>
          </li>
          <li>
            <t>The G.calculate_generator(H, PRS,sid,CI) function SHALL return a decoded point and SHALL BE implemented as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated using the input block size of the chosen hash function.</t>
              </li>
              <li>
                <t>This string is then hashed to the required length gen_str_hash = H.hash(gen_str, 2 * G.field_size_bytes).  Note that this
implies that the permissible output length H.maxb_in_bytes MUST BE larger or equal to twice the field size of the group
G for making a
hash function suitable.</t>
              </li>
              <li>
                <t>Finally the internal representation of the generator _g is calculated as _g = element_derivation(gen_str_hash)
using the element derivation function from the abstraction.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Note that with these definitions the scalar_mult function operates on a decoded point _g and returns an encoded point,
while the scalar_mult_vfy(y,X) function operates on an encoded point X (and also returns an encoded point).</t>
        <section anchor="verification-tests-1">
          <name>Verification tests</name>
          <t>For group abstractions verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving
encodings of the neutral element or receives an octet string
that does not decode to a valid group element.</t>
        </section>
      </section>
      <section anchor="CPaceWeierstrass">
        <name>CPace group objects for curves in Short-Weierstrass representation</name>
        <t>The group environment objects G defined in this section for use with Short-Weierstrass curves,
are parametrized by the choice of an elliptic curve and by choice of a suitable encode_to_curve function.
encode_to_curve must map an octet string to a point on the curve.</t>
        <section anchor="curves-and-associated-functions">
          <name>Curves and associated functions</name>
          <t>Elliptic curves in Short-Weierstrass form are considered in <xref target="IEEE1363"/>.
<xref target="IEEE1363"/> allows for both, curves of prime and non-prime order. However, for the procedures described in this section any suitable
group MUST BE of prime order.</t>
          <t>The specification for the group environment objects specified in this section closely follow the ECKAS-DH1 method from <xref target="IEEE1363"/>.
I.e. we use the same methods and encodings and protocol substeps as employed in the TLS
 <xref target="RFC5246"/> <xref target="RFC8446"/> protocol family.</t>
          <t>For CPace only the uncompressed full-coordinate encodings from <xref target="SEC1"/> (x and y coordinate) SHOULD be used.
Commonly used curve groups are specified in <xref target="SEC2"/> and <xref target="RFC5639"/>. A typical representative of such a Short-Weierstrass curve is NIST-P256.
Point verification as used in ECKAS-DH1 is described in Annex A.16.10. of <xref target="IEEE1363"/>.</t>
          <t>For deriving Diffie-Hellman shared secrets ECKAS-DH1 from <xref target="IEEE1363"/> specifies the use of an ECSVDP-DH method. We use ECSVDP-DH in combination with the identy map such that it either returns "error" or the x-coordinate of the Diffie-Hellman result point as shared secret in big endian format (fixed length output by FE2OSP without truncating leading zeros).</t>
        </section>
        <section anchor="suitable-encodetocurve-methods">
          <name>Suitable encode_to_curve methods</name>
          <t>All the encode_to_curve methods specified in <xref target="RFC9380"/>
are suitable for CPace. For Short-Weierstrass curves it is RECOMMENDED to use the non-uniform variant of the SSWU
mapping primitive from <xref target="RFC9380"/> if a SSWU mapping is available for the chosen curve. (We recommend non-uniform maps in order to give implementations
the flexibility to opt for x-coordinate-only scalar multiplication algorithms.)</t>
        </section>
        <section anchor="definition-of-the-group-environment-g-for-short-weierstrass-curves">
          <name>Definition of the group environment G for Short-Weierstrass curves</name>
          <t>In this paragraph we use the following notation for defining the group object G for a selected curve and encode_to_curve method:</t>
          <ul spacing="normal">
            <li>
              <t>With G.group_order we denote the order of the elliptic curve which MUST BE a prime.</t>
            </li>
            <li>
              <t>With is_valid(X) we denote a method which operates on an octet stream according to <xref target="SEC1"/> of a point on the group and returns true if the point is valid and returns false otherwise. This is_valid(X) method SHALL be implemented according to Annex A.16.10. of <xref target="IEEE1363"/>. I.e. it shall return false if X encodes either the neutral element on the group or does not form a valid encoding of a point on the group.</t>
            </li>
            <li>
              <t>With encode_to_curve(str,DST) we denote a mapping function from <xref target="RFC9380"/>. I.e. a function that maps
octet string str to a point on the group using the domain separation tag DST. <xref target="RFC9380"/> considers both, uniform and non-uniform mappings based on several different strategies. It is RECOMMENDED to use the nonuniform variant of the SSWU mapping primitive within <xref target="RFC9380"/>.</t>
            </li>
            <li>
              <t>G.DSI denotes a domain-separation identifier octet string. G.DSI which SHALL BE obtained by the concatenation of b"CPace" and the associated name of the cipher suite used for the encode_to_curve function as specified in <xref target="RFC9380"/>. E.g. when using the map with the name P384_XMD:SHA-384_SSWU_NU_
on curve NIST-P384 the resulting value SHALL BE G.DSI = b"CPaceP384_XMD:SHA-384_SSWU_NU_".</t>
            </li>
          </ul>
          <t>Using the above definitions, the CPace functions required for the group object G are defined as follows.</t>
          <ul spacing="normal">
            <li>
              <t>G.DST denotes the domain-separation tag value to use in conjunction with the encode_to_curve function from <xref target="RFC9380"/>. G.DST shall be obtained by concatenating G.DSI and b"_DST".</t>
            </li>
            <li>
              <t>G.sample_scalar() SHALL return a value between 1 and (G.group_order - 1). The sampling SHALL BE indistinguishable from uniform random
selection between 1 and (G.group_order - 1).
It is RECOMMENDED to use a constant-time rejection sampling algorithm for converting a uniform bitstring to a uniform value between 1 and (G.group_order - 1).</t>
            </li>
            <li>
              <t>G.calculate_generator(H, PRS,sid,CI) function SHALL be implemented as follows.  </t>
              <ul spacing="normal">
                <li>
                  <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated.</t>
                </li>
                <li>
                  <t>Then the output of a call to encode_to_curve(gen_str, G.DST) is returned, using the selected suite from <xref target="RFC9380"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>G.scalar_mult(s,X) is a function that operates on a scalar s and an input point X. The input X shall use the same encoding as produced by the G.calculate_generator method above.
G.scalar_mult(s,X) SHALL return an encoding of either the point X*s or the point X*(-s) according to <xref target="SEC1"/>. Implementations SHOULD use the full-coordinate format without compression, as important protocols such as TLS 1.3 removed support for compression. Implementations of scalar_mult(s,X) MAY output either X*s or X*(-s) as both points X*s and X*(-s) have the same x-coordinate and
result in the same Diffie-Hellman shared secrets K.
(This allows implementations to opt for x-coordinate-only scalar multiplication algorithms.)</t>
            </li>
            <li>
              <t>G.scalar_mult_vfy(s,X) merges verification of point X according to <xref target="IEEE1363"/> A.16.10. and the the ECSVDP-DH procedure from <xref target="IEEE1363"/>.
It SHALL BE implemented as follows:  </t>
              <ul spacing="normal">
                <li>
                  <t>If is_valid(X) = False then G.scalar_mult_vfy(s,X) SHALL return "error" as specified in <xref target="IEEE1363"/> A.16.10 and 7.2.1.</t>
                </li>
                <li>
                  <t>Otherwise G.scalar_mult_vfy(s,X) SHALL return the result of the ECSVDP-DH procedure from <xref target="IEEE1363"/> (section 7.2.1). I.e. it shall
either return "error" (in case that X*s is the neutral element) or the secret shared value "z" (otherwise). "z" SHALL be encoded by using
the big-endian encoding of the x-coordinate of the result point X*s according to <xref target="SEC1"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>We represent the neutral element G.I by using the representation of the "error" result case from <xref target="IEEE1363"/> as used in the G.scalar_mult_vfy method above.</t>
            </li>
          </ul>
        </section>
        <section anchor="verification-tests-2">
          <name>Verification tests</name>
          <t>For Short-Weierstrass curves verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving an
encoding of the point at infinity and an encoding of a point not on the group.</t>
        </section>
      </section>
    </section>
    <section anchor="verification">
      <name>Implementation verification</name>
      <t>Any CPace implementation MUST be tested against invalid or weak point attacks.
Implementation MUST be verified to abort upon conditions where G.scalar_mult_vfy functions outputs G.I.
For testing an implementation it is RECOMMENDED to include weak or invalid point encodings within MSGa and MSGb and introduce this
in a protocol run. It SHALL be verified that the abort condition is properly handled.</t>
      <t>Moreover regarding the network format any implementation MUST be tested with respect to invalid encodings of MSGa and MSGb.
E.g. when lv_cat is used as network format for encoding MSGa and MSGb,
the sum of the prepended lengths of the fields must be verified to match the actual length of the message.
Tests SHALL verify that a party aborts in case that incorrectly encoded messages are received.</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.
In the following sections we describe how to protect CPace against several attack families, such as relay-, length extension- or side channel attacks. We also describe aspects to consider when deviating from recommended cipher suites.</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, the session id sid or the associated data fields ADa, ADb, the ISK will provide implicit authentication also regarding the party identities. Incorporating party identifier strings
is important for fending off relay attacks.
Such attacks become relevant in a setting where several parties, say, A, B and C, share the same password PRS. An adversary might relay messages from a honest user A, who aims at interacting with user B, to a party C instead. If no party identifier strings are used, and B and C use the same PRS value, A might be 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>
      </section>
      <section anchor="network-message-encoding-and-hashing-protocol-transcripts">
        <name>Network message encoding and hashing protocol transcripts</name>
        <t>It is RECOMMENDED to encode the (Ya,ADa) and (Yb,ADb) fields on the network by using network_encode(Y,AD) = lv_cat(Y,AD). I.e. we RECOMMEND
to prepend an encoding of the length of the subfields. 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.</t>
        <t>Other alternative network encoding formats which prepend an encoding of the length of variable-size data fields in the protocol
messages are equally suitable.
This includes, e.g., the type-length-value format specified in the DER encoding standard (X.690) or the protocol message encoding used in the TLS protocol family for the TLS client-hello or server-hello messages.</t>
        <t>In case that an application uses another form of network message encoding which is not prefix-free,
the guidance given in <xref target="CDMP05"/> SHOULD BE considered (e.g. by replacing hash functions with the HMAC constructions from<xref target="RFC2104"/>).</t>
      </section>
      <section anchor="key-derivation">
        <name>Key derivation</name>
        <t>Although already K is a shared value, it MUST NOT itself be used as an application key. Instead, ISK MUST BE used. Leakage of K to an adversary can lead to offline dictionary attacks.</t>
        <t>As noted already in <xref target="protocol-section"/> it is RECOMMENDED to process ISK
by use of a suitable strong key derivation function KDF (such as defined in <xref target="RFC5869"/>) first,
before using the key in a higher-level protocol.</t>
      </section>
      <section anchor="key-confirmation">
        <name>Key confirmation</name>
        <t>In many applications it is advisable to add an explicit key confirmation round after the CPace protocol flow. However, as some applications
might only require implicit authentication and as explicit authentication messages are already a built-in feature in many higher-level protocols (e.g. TLS 1.3) the CPace protocol described here does not mandate
use of a key confirmation on the level of the CPace sub-protocol.</t>
        <t>Already without explicit key confirmation, CPace enjoys weak forward security under the sCDH and sSDH assumptions <xref target="AHH21"/>.
With added explicit confirmation, CPace enjoys perfect forward security also under the strong sCDH and sSDH assumptions <xref target="AHH21"/>.</t>
        <t>Note that in <xref target="ABKLX21"/> it was shown that an idealized variant of CPace
also enjoys perfect forward security without explicit key confirmation. However this proof does not explicitly cover
the recommended cipher suites
in this document and requires the stronger assumption of an algebraic adversary model. For this reason, we recommend adding
explicit key confirmation if perfect forward security is required.</t>
        <t>When implementing explicit key confirmation, it is recommended to use an appropriate message-authentication code (MAC)
such as HMAC <xref target="RFC2104"/> or
CMAC <xref target="RFC4493"/> using a key mac_key derived from ISK.</t>
        <t>One suitable option that works also in the parallel setting without message ordering is to proceed as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First calculate mac_key as mac_key = H.hash(b"CPaceMac" || ISK).</t>
          </li>
          <li>
            <t>Then let each party send an authenticator tag Ta, Tb that is calculated over the protocol message that it has sent previously. I.e.
let party A calculate its transmitted authentication code Ta as Ta = MAC(mac_key, MSGa) and let party B calculate its transmitted
authentication code Tb as Tb = MAC(mac_key, MSGb).</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="sampling-of-scalars">
        <name>Sampling of scalars</name>
        <t>For curves over fields F_q where q is a prime close to a power of two, we recommend sampling scalars as a uniform bit string of length field_size_bits. We do so in order to reduce both, complexity of the implementation and the attack surface
with respect to side-channels for embedded systems in hostile environments.
The effect of non-uniform sampling on security was demonstrated to be begnin in <xref target="AHH21"/> for the case of Curve25519 and Curve448.
This analysis however does not transfer to most curves in Short-Weierstrass form.</t>
        <t>As a result, we recommend rejection sampling if G is as in <xref target="CPaceWeierstrass"/>. Alternatively an algorithm designed allong the lines of the hash_to_field() function from <xref target="RFC9380"/> can also be
used. There oversampling to an integer significantly larger than the curve order is followed by a modular reduction to the group order.</t>
      </section>
      <section anchor="preconditions-for-using-the-simplified-cpace-specification-from-cpacemontgomery">
        <name>Preconditions for using the simplified CPace specification from <xref target="CPaceMontgomery"/></name>
        <t>The security of the algorithms used for the recommended cipher suites for the Montgomery curves Curve25519 and Curve448 in <xref target="CPaceMontgomery"/> rely on the following properties <xref target="AHH21"/>:</t>
        <ul spacing="normal">
          <li>
            <t>The curve has order (p * c) with p prime and c a small cofactor. Also the curve's quadratic twist must be of order (p' * c') with p' prime and c' a cofactor.</t>
          </li>
          <li>
            <t>The cofactor c of the curve MUST BE EQUAL to or an integer multiple of the cofactor c' of the curve's quadratic twist. Also, importantly, the
implementation of the scalar_mult and scalar_mult_vfy
functions must ensure that all scalars actually used for the group operation are integer multiples of
c (e.g. such as asserted by the specification of the decodeScalar functions in <xref target="RFC7748"/>).</t>
          </li>
          <li>
            <t>Both field order q and group order p MUST BE close to a power of two along the lines of <xref target="AHH21"/>, Appendix E. Otherwise the simplified scalar sampling specified in <xref target="CPaceMontgomery"/>
needs to be changed.</t>
          </li>
          <li>
            <t>The representation of the neutral element G.I MUST BE the same for both, the curve and its twist.</t>
          </li>
          <li>
            <t>The implementation of G.scalar_mult_vfy(y,X) MUST map all c low-order points on the curve and all c' low-order points on the twist to G.I.</t>
          </li>
        </ul>
        <t>Algorithms for curves other than the ones recommended here can be based on the principles from <xref target="CPaceMontgomery"/> given that the above properties hold.</t>
      </section>
      <section anchor="nonce-values">
        <name>Nonce values</name>
        <t>Secret scalars ya and yb MUST NOT be reused. Values for sid SHOULD NOT be reused since the composability
guarantees established by the simulation-based proof rely on the uniqueness of session ids <xref target="AHH21"/>.</t>
        <t>If CPace is used in a concurrent system, it is RECOMMENDED that a unique sid is generated by the higher-level protocol and passed to CPace. One suitable option is that sid is generated by concatenating 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="quantum-computers">
        <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 session id values
sid forces the adversary to solve one computational Diffie-Hellman problem per password guess <xref target="ES21"/>.
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="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>
      <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="I-D.irtf-cfrg-opaque">
          <front>
            <title>The OPAQUE Augmented PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Dr. 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="24" month="March" 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.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-14"/>
        </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="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="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="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 821?>

<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>
          <artwork><![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
]]></artwork>
        </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>
        <section anchor="lvcat-function">
          <name>lv_cat function</name>
          <artwork><![CDATA[
  def lv_cat(*args):
      result = b""
      for arg in args:
          result += prepend_len(arg)
      return result
]]></artwork>
        </section>
        <section anchor="testvector-for-lvcat">
          <name>Testvector for lv_cat()</name>
          <artwork><![CDATA[
  lv_cat(b"1234",b"5",b"",b"6789"): (length: 13 bytes)
    04313233340135000436373839
]]></artwork>
        </section>
        <section anchor="examples-for-messages-not-obtained-from-a-lvcat-based-encoding">
          <name>Examples for messages not obtained from a lv_cat-based encoding</name>
          <t>The following messages are examples which have invalid encoded length fields. I.e. they are examples
where parsing for the sum of the length of subfields as expected for a message generated using lv_cat(Y,AD)
does not give the correct length of the message. Parties MUST abort upon reception of such invalid messages as MSGa or MSGb.</t>
          <artwork><![CDATA[
  Inv_MSG1 not encoded by lv_cat: (length: 3 bytes)
    ffffff
  Inv_MSG2 not encoded by lv_cat: (length: 3 bytes)
    ffff03
  Inv_MSG3 not encoded by lv_cat: (length: 4 bytes)
    00ffff03
  Inv_MSG4 not encoded by lv_cat: (length: 4 bytes)
    00ffffff
]]></artwork>
        </section>
      </section>
      <section anchor="definition-of-generatorstring-function">
        <name>Definition of generator_string function.</name>
        <artwork><![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)
]]></artwork>
      </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>
          <artwork><![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)
]]></artwork>
        </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>
          <artwork><![CDATA[
  def o_cat(bytes1,bytes2):
      if lexiographically_larger(bytes1,bytes2):
          return b"oc" + bytes1 + bytes2
      else:
          return b"oc" + bytes2 + bytes1
]]></artwork>
        </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>
      </section>
      <section anchor="decoding-and-encoding-functions-according-to-rfc7748">
        <name>Decoding and Encoding functions according to RFC7748</name>
        <artwork><![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)])
]]></artwork>
      </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>
        <artwork><![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
]]></artwork>
        <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>
        <artwork><![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)
]]></artwork>
      </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'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 168 bytes)
      0843506163653235350850617373776f72646d000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000160a41696e69746961746f72
      0a42726573706f6e646572107e4b4791d6a8ef019b936c79fb7f2c57
    hash generator string: (length: 32 bytes)
      10047198e8c4cacf0ab8a6d0ac337b8ae497209d042f7f3a50945863
      94e821fc
    decoded field element of 255 bits: (length: 32 bytes)
      10047198e8c4cacf0ab8a6d0ac337b8ae497209d042f7f3a50945863
      94e8217c
    generator g: (length: 32 bytes)
      4e6098733061c0e8486611a904fe5edb049804d26130a44131a6229e
      55c5c321
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080
  Outputs
    Ya: (length: 32 bytes)
      f970e36f37cfcd9a39e37dd2d1fbc9156d6d2f9ae422f4722cbd9d32
      e9b1e704
    MSGa = lv_cat(Ya,ADa): (length: 37 bytes)
      20f970e36f37cfcd9a39e37dd2d1fbc9156d6d2f9ae422f4722cbd9d
      32e9b1e70403414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a
  Outputs
    Yb: (length: 32 bytes)
      0178bbbab0804a4455b8f02e5d6e7d80997c6470bfb3618d7e74c396
      47af5a29
    MSGb = lv_cat(Yb,ADb): (length: 37 bytes)
      200178bbbab0804a4455b8f02e5d6e7d80997c6470bfb3618d7e74c3
      9647af5a2903414462
]]></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)
      42ba4c6dc4c184a1cf405d4503f64bf7f015e2a0107450e38b9efff3
      bee52412
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      42ba4c6dc4c184a1cf405d4503f64bf7f015e2a0107450e38b9efff3
      bee52412
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 74 bytes)
      20f970e36f37cfcd9a39e37dd2d1fbc9156d6d2f9ae422f4722cbd9d
      32e9b1e70403414461200178bbbab0804a4455b8f02e5d6e7d80997c
      6470bfb3618d7e74c39647af5a2903414462
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 137 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c572042ba4c6dc4c184a1cf405d4503f64bf7f015e2a0107450e38b
      9efff3bee5241220f970e36f37cfcd9a39e37dd2d1fbc9156d6d2f9a
      e422f4722cbd9d32e9b1e70403414461200178bbbab0804a4455b8f0
      2e5d6e7d80997c6470bfb3618d7e74c39647af5a2903414462
    ISK result: (length: 64 bytes)
      f5ef3c13fdb9dfe839bdbf8a9256e8cee7db8a8f1dfa74958a925450
      cf8089cd560d9a4e7956b7334b6f625c8559b75ea0764ac2be894b8f
      3d434b30e87797d5
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 76 bytes)
      6f6320f970e36f37cfcd9a39e37dd2d1fbc9156d6d2f9ae422f4722c
      bd9d32e9b1e70403414461200178bbbab0804a4455b8f02e5d6e7d80
      997c6470bfb3618d7e74c39647af5a2903414462
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||o_cat(MSGa,MSGb): (length: 139 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c572042ba4c6dc4c184a1cf405d4503f64bf7f015e2a0107450e38b
      9efff3bee524126f6320f970e36f37cfcd9a39e37dd2d1fbc9156d6d
      2f9ae422f4722cbd9d32e9b1e70403414461200178bbbab0804a4455
      b8f02e5d6e7d80997c6470bfb3618d7e74c39647af5a2903414462
    ISK result: (length: 64 bytes)
      f4051edc63b2620e10d5ecf76d9f0c5ccd1447858a98d4bf847fafac
      737478c1350e14619bc0fcd4f028d10e4102dfca39f91fe9b829a503
      ab3e0549bd835edf
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers">
          <name>Corresponding C programming language initializers</name>
          <artwork><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,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[] = {
 0x4e,0x60,0x98,0x73,0x30,0x61,0xc0,0xe8,0x48,0x66,0x11,0xa9,
 0x04,0xfe,0x5e,0xdb,0x04,0x98,0x04,0xd2,0x61,0x30,0xa4,0x41,
 0x31,0xa6,0x22,0x9e,0x55,0xc5,0xc3,0x21,
};
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[] = {
 0xf9,0x70,0xe3,0x6f,0x37,0xcf,0xcd,0x9a,0x39,0xe3,0x7d,0xd2,
 0xd1,0xfb,0xc9,0x15,0x6d,0x6d,0x2f,0x9a,0xe4,0x22,0xf4,0x72,
 0x2c,0xbd,0x9d,0x32,0xe9,0xb1,0xe7,0x04,
};
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[] = {
 0x01,0x78,0xbb,0xba,0xb0,0x80,0x4a,0x44,0x55,0xb8,0xf0,0x2e,
 0x5d,0x6e,0x7d,0x80,0x99,0x7c,0x64,0x70,0xbf,0xb3,0x61,0x8d,
 0x7e,0x74,0xc3,0x96,0x47,0xaf,0x5a,0x29,
};
const unsigned char tc_K[] = {
 0x42,0xba,0x4c,0x6d,0xc4,0xc1,0x84,0xa1,0xcf,0x40,0x5d,0x45,
 0x03,0xf6,0x4b,0xf7,0xf0,0x15,0xe2,0xa0,0x10,0x74,0x50,0xe3,
 0x8b,0x9e,0xff,0xf3,0xbe,0xe5,0x24,0x12,
};
const unsigned char tc_ISK_IR[] = {
 0xf5,0xef,0x3c,0x13,0xfd,0xb9,0xdf,0xe8,0x39,0xbd,0xbf,0x8a,
 0x92,0x56,0xe8,0xce,0xe7,0xdb,0x8a,0x8f,0x1d,0xfa,0x74,0x95,
 0x8a,0x92,0x54,0x50,0xcf,0x80,0x89,0xcd,0x56,0x0d,0x9a,0x4e,
 0x79,0x56,0xb7,0x33,0x4b,0x6f,0x62,0x5c,0x85,0x59,0xb7,0x5e,
 0xa0,0x76,0x4a,0xc2,0xbe,0x89,0x4b,0x8f,0x3d,0x43,0x4b,0x30,
 0xe8,0x77,0x97,0xd5,
};
const unsigned char tc_ISK_SY[] = {
 0xf4,0x05,0x1e,0xdc,0x63,0xb2,0x62,0x0e,0x10,0xd5,0xec,0xf7,
 0x6d,0x9f,0x0c,0x5c,0xcd,0x14,0x47,0x85,0x8a,0x98,0xd4,0xbf,
 0x84,0x7f,0xaf,0xac,0x73,0x74,0x78,0xc1,0x35,0x0e,0x14,0x61,
 0x9b,0xc0,0xfc,0xd4,0xf0,0x28,0xd1,0x0e,0x41,0x02,0xdf,0xca,
 0x39,0xf9,0x1f,0xe9,0xb8,0x29,0xa5,0x03,0xab,0x3e,0x05,0x49,
 0xbd,0x83,0x5e,0xdf,
};
]]></artwork>
        </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 MSGa or MSGb.

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>
      </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'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 176 bytes)
      0843506163653434380850617373776f726475000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000160a4169
      6e69746961746f720a42726573706f6e646572105223e0cdc45d6575
      668d64c552004124
    hash generator string: (length: 56 bytes)
      769e06d6c41c8cf1c87aa3df8e687167f6d0a2e41821e856276a0221
      d88272359d0b43204b546174c9179c83c107b707f296eafaa1c5a293
    decoded field element of 448 bits: (length: 56 bytes)
      769e06d6c41c8cf1c87aa3df8e687167f6d0a2e41821e856276a0221
      d88272359d0b43204b546174c9179c83c107b707f296eafaa1c5a293
    generator g: (length: 56 bytes)
      6fdae14718eb7506dd96e3f7797896efdb8db9ec0797485c9c48a192
      2e44961da097f2908b084a5de33ab671630660d27d79ffd6ee8ec846
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-1">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080516bd083bfcce66121a3072646994c8430cc382b8dc543e8
  Outputs
    Ya: (length: 56 bytes)
      396bd11daf223711e575cac6021e3fa31558012048a1cec7876292b9
      6c61eda353fe04f33028d2352779668a934084da776c1c51a58ce4b5
    MSGa = lv_cat(Ya,ADa): (length: 61 bytes)
      38396bd11daf223711e575cac6021e3fa31558012048a1cec7876292
      b96c61eda353fe04f33028d2352779668a934084da776c1c51a58ce4
      b503414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-1">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a439caf5e61ec88c307c7d619195229412eaa73fb2a5ea20d
  Outputs
    Yb: (length: 56 bytes)
      53c519fb490fde5a04bda8c18b327d0fc1a9391d19e0ac00c59df9c6
      0422284e593d6b092eac94f5aa644ed883f39bd4f04e4beb6af86d58
    MSGb = lv_cat(Yb,ADb): (length: 61 bytes)
      3853c519fb490fde5a04bda8c18b327d0fc1a9391d19e0ac00c59df9
      c60422284e593d6b092eac94f5aa644ed883f39bd4f04e4beb6af86d
      5803414462
]]></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)
      e00af217556a40ccbc9822cc27a43542e45166a653aa4df746d5f8e1
      e8df483e9baff71c9eb03ee20a688ad4e4d359f70ac9ec3f6a659997
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      e00af217556a40ccbc9822cc27a43542e45166a653aa4df746d5f8e1
      e8df483e9baff71c9eb03ee20a688ad4e4d359f70ac9ec3f6a659997
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-1">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 122 bytes)
      38396bd11daf223711e575cac6021e3fa31558012048a1cec7876292
      b96c61eda353fe04f33028d2352779668a934084da776c1c51a58ce4
      b5034144613853c519fb490fde5a04bda8c18b327d0fc1a9391d19e0
      ac00c59df9c60422284e593d6b092eac94f5aa644ed883f39bd4f04e
      4beb6af86d5803414462
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 209 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      412438e00af217556a40ccbc9822cc27a43542e45166a653aa4df746
      d5f8e1e8df483e9baff71c9eb03ee20a688ad4e4d359f70ac9ec3f6a
      65999738396bd11daf223711e575cac6021e3fa31558012048a1cec7
      876292b96c61eda353fe04f33028d2352779668a934084da776c1c51
      a58ce4b5034144613853c519fb490fde5a04bda8c18b327d0fc1a939
      1d19e0ac00c59df9c60422284e593d6b092eac94f5aa644ed883f39b
      d4f04e4beb6af86d5803414462
    ISK result: (length: 64 bytes)
      4030297722c1914711da6b2a224a44b53b30c05ab02c2a3d3ccc7272
      a3333ce3a4564c17031b634e89f65681f52d5c3d1df7baeb88523d2e
      481b3858aed86315
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-1">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 124 bytes)
      6f633853c519fb490fde5a04bda8c18b327d0fc1a9391d19e0ac00c5
      9df9c60422284e593d6b092eac94f5aa644ed883f39bd4f04e4beb6a
      f86d580341446238396bd11daf223711e575cac6021e3fa315580120
      48a1cec7876292b96c61eda353fe04f33028d2352779668a934084da
      776c1c51a58ce4b503414461
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||o_cat(MSGa,MSGb): (length: 211 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      412438e00af217556a40ccbc9822cc27a43542e45166a653aa4df746
      d5f8e1e8df483e9baff71c9eb03ee20a688ad4e4d359f70ac9ec3f6a
      6599976f633853c519fb490fde5a04bda8c18b327d0fc1a9391d19e0
      ac00c59df9c60422284e593d6b092eac94f5aa644ed883f39bd4f04e
      4beb6af86d580341446238396bd11daf223711e575cac6021e3fa315
      58012048a1cec7876292b96c61eda353fe04f33028d2352779668a93
      4084da776c1c51a58ce4b503414461
    ISK result: (length: 64 bytes)
      4cd30768e2f75f0583449614bce823b421c31163c5a3bde4eed1c664
      284a32995ea3430b5c47fc7dd771b534ad38eaea5d8c8f97bd548966
      7facfc044615075f
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-1">
          <name>Corresponding C programming language initializers</name>
          <artwork><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,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[] = {
 0x6f,0xda,0xe1,0x47,0x18,0xeb,0x75,0x06,0xdd,0x96,0xe3,0xf7,
 0x79,0x78,0x96,0xef,0xdb,0x8d,0xb9,0xec,0x07,0x97,0x48,0x5c,
 0x9c,0x48,0xa1,0x92,0x2e,0x44,0x96,0x1d,0xa0,0x97,0xf2,0x90,
 0x8b,0x08,0x4a,0x5d,0xe3,0x3a,0xb6,0x71,0x63,0x06,0x60,0xd2,
 0x7d,0x79,0xff,0xd6,0xee,0x8e,0xc8,0x46,
};
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[] = {
 0x39,0x6b,0xd1,0x1d,0xaf,0x22,0x37,0x11,0xe5,0x75,0xca,0xc6,
 0x02,0x1e,0x3f,0xa3,0x15,0x58,0x01,0x20,0x48,0xa1,0xce,0xc7,
 0x87,0x62,0x92,0xb9,0x6c,0x61,0xed,0xa3,0x53,0xfe,0x04,0xf3,
 0x30,0x28,0xd2,0x35,0x27,0x79,0x66,0x8a,0x93,0x40,0x84,0xda,
 0x77,0x6c,0x1c,0x51,0xa5,0x8c,0xe4,0xb5,
};
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[] = {
 0x53,0xc5,0x19,0xfb,0x49,0x0f,0xde,0x5a,0x04,0xbd,0xa8,0xc1,
 0x8b,0x32,0x7d,0x0f,0xc1,0xa9,0x39,0x1d,0x19,0xe0,0xac,0x00,
 0xc5,0x9d,0xf9,0xc6,0x04,0x22,0x28,0x4e,0x59,0x3d,0x6b,0x09,
 0x2e,0xac,0x94,0xf5,0xaa,0x64,0x4e,0xd8,0x83,0xf3,0x9b,0xd4,
 0xf0,0x4e,0x4b,0xeb,0x6a,0xf8,0x6d,0x58,
};
const unsigned char tc_K[] = {
 0xe0,0x0a,0xf2,0x17,0x55,0x6a,0x40,0xcc,0xbc,0x98,0x22,0xcc,
 0x27,0xa4,0x35,0x42,0xe4,0x51,0x66,0xa6,0x53,0xaa,0x4d,0xf7,
 0x46,0xd5,0xf8,0xe1,0xe8,0xdf,0x48,0x3e,0x9b,0xaf,0xf7,0x1c,
 0x9e,0xb0,0x3e,0xe2,0x0a,0x68,0x8a,0xd4,0xe4,0xd3,0x59,0xf7,
 0x0a,0xc9,0xec,0x3f,0x6a,0x65,0x99,0x97,
};
const unsigned char tc_ISK_IR[] = {
 0x40,0x30,0x29,0x77,0x22,0xc1,0x91,0x47,0x11,0xda,0x6b,0x2a,
 0x22,0x4a,0x44,0xb5,0x3b,0x30,0xc0,0x5a,0xb0,0x2c,0x2a,0x3d,
 0x3c,0xcc,0x72,0x72,0xa3,0x33,0x3c,0xe3,0xa4,0x56,0x4c,0x17,
 0x03,0x1b,0x63,0x4e,0x89,0xf6,0x56,0x81,0xf5,0x2d,0x5c,0x3d,
 0x1d,0xf7,0xba,0xeb,0x88,0x52,0x3d,0x2e,0x48,0x1b,0x38,0x58,
 0xae,0xd8,0x63,0x15,
};
const unsigned char tc_ISK_SY[] = {
 0x4c,0xd3,0x07,0x68,0xe2,0xf7,0x5f,0x05,0x83,0x44,0x96,0x14,
 0xbc,0xe8,0x23,0xb4,0x21,0xc3,0x11,0x63,0xc5,0xa3,0xbd,0xe4,
 0xee,0xd1,0xc6,0x64,0x28,0x4a,0x32,0x99,0x5e,0xa3,0x43,0x0b,
 0x5c,0x47,0xfc,0x7d,0xd7,0x71,0xb5,0x34,0xad,0x38,0xea,0xea,
 0x5d,0x8c,0x8f,0x97,0xbd,0x54,0x89,0x66,0x7f,0xac,0xfc,0x04,
 0x46,0x15,0x07,0x5f,
};
]]></artwork>
        </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 MSGa or MSGb.
]]></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>
      </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'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 168 bytes)
      11435061636552697374726574746f3235350850617373776f726464
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000160a41696e69746961746f72
      0a42726573706f6e646572107e4b4791d6a8ef019b936c79fb7f2c57
    hash result: (length: 64 bytes)
      a5ce446f63a1ae6d1fee80fa67d0b4004a4b1283ec5549a462bf33a6
      c1ae06a0871f9bf48545f49b2a792eed255ac04f52758c9c60448306
      810b44e986e3dcbb
    encoded generator g: (length: 32 bytes)
      5e25411ca1ad7c9debfd0b33ad987a95cefef2d3f15dcc8bd26415a5
      dfe2e15a
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-2">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      da3d23700a9e5699258aef94dc060dfda5ebb61f02a5ea77fad53f4f
      f0976d08
  Outputs
    Ya: (length: 32 bytes)
      383a85dd236978f17f8c8545b50dabc52a39fcdab2cf8bc531ce040f
      f77ca82d
    MSGa = lv_cat(Ya,ADa): (length: 37 bytes)
      20383a85dd236978f17f8c8545b50dabc52a39fcdab2cf8bc531ce04
      0ff77ca82d03414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-2">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      d2316b454718c35362d83d69df6320f38578ed5984651435e2949762
      d900b80d
  Outputs
    Yb: (length: 32 bytes)
      a6206309c0e8e5f579295e35997ac4300ab3fecec3c17f7b604f3e69
      8fa1383c
    MSGb = lv_cat(Yb,ADb): (length: 37 bytes)
      20a6206309c0e8e5f579295e35997ac4300ab3fecec3c17f7b604f3e
      698fa1383c03414462
]]></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)
      fa1d0318864e2cacb26875f1b791c9ae83204fe8359addb53e95a2e9
      8893853f
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      fa1d0318864e2cacb26875f1b791c9ae83204fe8359addb53e95a2e9
      8893853f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-2">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 74 bytes)
      20383a85dd236978f17f8c8545b50dabc52a39fcdab2cf8bc531ce04
      0ff77ca82d0341446120a6206309c0e8e5f579295e35997ac4300ab3
      fecec3c17f7b604f3e698fa1383c03414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720fa1d0318864e2cacb26875f1b791c9ae
      83204fe8359addb53e95a2e98893853f20383a85dd236978f17f8c85
      45b50dabc52a39fcdab2cf8bc531ce040ff77ca82d0341446120a620
      6309c0e8e5f579295e35997ac4300ab3fecec3c17f7b604f3e698fa1
      383c03414462
    ISK result: (length: 64 bytes)
      e91ccb2c0f5e0d0993a33956e3be59754f3f2b07db57631f5394452e
      a2e7b4354674eb1f5686c078462bf83bec72e8743df440108e638f35
      26d9b90e85be096f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-2">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 76 bytes)
      6f6320a6206309c0e8e5f579295e35997ac4300ab3fecec3c17f7b60
      4f3e698fa1383c0341446220383a85dd236978f17f8c8545b50dabc5
      2a39fcdab2cf8bc531ce040ff77ca82d03414461
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||o_cat(MSGa,MSGb): (length: 148 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c5720fa1d0318864e2cacb26875f1b791c9ae
      83204fe8359addb53e95a2e98893853f6f6320a6206309c0e8e5f579
      295e35997ac4300ab3fecec3c17f7b604f3e698fa1383c0341446220
      383a85dd236978f17f8c8545b50dabc52a39fcdab2cf8bc531ce040f
      f77ca82d03414461
    ISK result: (length: 64 bytes)
      1638fb6ff564a80a12af07c036870e10c4efb539fa847fdf3e9c4621
      7bf52cd4df4ca0fe51146492a9ba6dd6a42ac402bc2d60adb4084c81
      758d754d1d81482a
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-2">
          <name>Corresponding C programming language initializers</name>
          <artwork><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,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[] = {
 0x5e,0x25,0x41,0x1c,0xa1,0xad,0x7c,0x9d,0xeb,0xfd,0x0b,0x33,
 0xad,0x98,0x7a,0x95,0xce,0xfe,0xf2,0xd3,0xf1,0x5d,0xcc,0x8b,
 0xd2,0x64,0x15,0xa5,0xdf,0xe2,0xe1,0x5a,
};
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[] = {
 0x38,0x3a,0x85,0xdd,0x23,0x69,0x78,0xf1,0x7f,0x8c,0x85,0x45,
 0xb5,0x0d,0xab,0xc5,0x2a,0x39,0xfc,0xda,0xb2,0xcf,0x8b,0xc5,
 0x31,0xce,0x04,0x0f,0xf7,0x7c,0xa8,0x2d,
};
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[] = {
 0xa6,0x20,0x63,0x09,0xc0,0xe8,0xe5,0xf5,0x79,0x29,0x5e,0x35,
 0x99,0x7a,0xc4,0x30,0x0a,0xb3,0xfe,0xce,0xc3,0xc1,0x7f,0x7b,
 0x60,0x4f,0x3e,0x69,0x8f,0xa1,0x38,0x3c,
};
const unsigned char tc_K[] = {
 0xfa,0x1d,0x03,0x18,0x86,0x4e,0x2c,0xac,0xb2,0x68,0x75,0xf1,
 0xb7,0x91,0xc9,0xae,0x83,0x20,0x4f,0xe8,0x35,0x9a,0xdd,0xb5,
 0x3e,0x95,0xa2,0xe9,0x88,0x93,0x85,0x3f,
};
const unsigned char tc_ISK_IR[] = {
 0xe9,0x1c,0xcb,0x2c,0x0f,0x5e,0x0d,0x09,0x93,0xa3,0x39,0x56,
 0xe3,0xbe,0x59,0x75,0x4f,0x3f,0x2b,0x07,0xdb,0x57,0x63,0x1f,
 0x53,0x94,0x45,0x2e,0xa2,0xe7,0xb4,0x35,0x46,0x74,0xeb,0x1f,
 0x56,0x86,0xc0,0x78,0x46,0x2b,0xf8,0x3b,0xec,0x72,0xe8,0x74,
 0x3d,0xf4,0x40,0x10,0x8e,0x63,0x8f,0x35,0x26,0xd9,0xb9,0x0e,
 0x85,0xbe,0x09,0x6f,
};
const unsigned char tc_ISK_SY[] = {
 0x16,0x38,0xfb,0x6f,0xf5,0x64,0xa8,0x0a,0x12,0xaf,0x07,0xc0,
 0x36,0x87,0x0e,0x10,0xc4,0xef,0xb5,0x39,0xfa,0x84,0x7f,0xdf,
 0x3e,0x9c,0x46,0x21,0x7b,0xf5,0x2c,0xd4,0xdf,0x4c,0xa0,0xfe,
 0x51,0x14,0x64,0x92,0xa9,0xba,0x6d,0xd6,0xa4,0x2a,0xc4,0x02,
 0xbc,0x2d,0x60,0xad,0xb4,0x08,0x4c,0x81,0x75,0x8d,0x75,0x4d,
 0x1d,0x81,0x48,0x2a,
};
]]></artwork>
        </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 MSGa or MSGb 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>
      </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'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 176 bytes)
      0d435061636544656361663434380850617373776f72647000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000160a4169
      6e69746961746f720a42726573706f6e646572105223e0cdc45d6575
      668d64c552004124
    hash result: (length: 112 bytes)
      8955b426ff1d3a22032d21c013cf94134cee9a4235e93261a4911edb
      f68f2945f0267c983954262c7f59badb9caf468ebe21b7e9885657af
      b8f1a3b783c2047ba519e113ecf81b2b580dd481f499beabd401cc77
      1d28915fb750011209040f5f03b2ceb5e5eb259c96b478382d5a5c57
    encoded generator g: (length: 56 bytes)
      682d1a4f49fc2a4834356ae4d7f58636bc9481521c845e66e6fb0b29
      69341df45fbaeaea9e2221b3f5babc54c5f8ce456988ffc519defaeb
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-3">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      33d561f13cfc0dca279c30e8cde895175dc25483892819eba132d58c
      13c0462a8eb0d73fda941950594bef5191d8394691f86edffcad6c1e
  Outputs
    Ya: (length: 56 bytes)
      e233867540319ec86eaecc09a85dec233745db729f61c36bde14c034
      200994fc4b6e8d263008c169585fd1d186d8ac560cb9f7ad0d166965
    MSGa = lv_cat(Ya,ADa): (length: 61 bytes)
      38e233867540319ec86eaecc09a85dec233745db729f61c36bde14c0
      34200994fc4b6e8d263008c169585fd1d186d8ac560cb9f7ad0d1669
      6503414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-3">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      2523c969f68fa2b2aea294c2539ef36eb1e0558abd14712a7828f16a
      85ed2c7e77e2bdd418994405fb1b57b6bbaadd66849892aac9d81402
  Outputs
    Yb: (length: 56 bytes)
      5062a0f33478914bf162a80dad39b5b266c1dd02f408573b41827e38
      599b682afbf7a0735adfd68c39ab4994fd1b034846270e38332b4da9
    MSGb = lv_cat(Yb,ADb): (length: 61 bytes)
      385062a0f33478914bf162a80dad39b5b266c1dd02f408573b41827e
      38599b682afbf7a0735adfd68c39ab4994fd1b034846270e38332b4d
      a903414462
]]></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)
      dc9edef7c127e79d32f2584f9fcd3269174fe32226c2082963879a6d
      eafefb9c14efcee9fc1245917ad3658037d2d62aff2d3f76fa4fca99
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      dc9edef7c127e79d32f2584f9fcd3269174fe32226c2082963879a6d
      eafefb9c14efcee9fc1245917ad3658037d2d62aff2d3f76fa4fca99
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-3">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 122 bytes)
      38e233867540319ec86eaecc09a85dec233745db729f61c36bde14c0
      34200994fc4b6e8d263008c169585fd1d186d8ac560cb9f7ad0d1669
      6503414461385062a0f33478914bf162a80dad39b5b266c1dd02f408
      573b41827e38599b682afbf7a0735adfd68c39ab4994fd1b03484627
      0e38332b4da903414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438dc9edef7c127e79d32f2584f9fcd3269174fe322
      26c2082963879a6deafefb9c14efcee9fc1245917ad3658037d2d62a
      ff2d3f76fa4fca9938e233867540319ec86eaecc09a85dec233745db
      729f61c36bde14c034200994fc4b6e8d263008c169585fd1d186d8ac
      560cb9f7ad0d16696503414461385062a0f33478914bf162a80dad39
      b5b266c1dd02f408573b41827e38599b682afbf7a0735adfd68c39ab
      4994fd1b034846270e38332b4da903414462
    ISK result: (length: 64 bytes)
      a752612fe6dec542e96629a6eb68ecb9bfe2257224975e916035aee7
      47c6aba32af2e6fe25eeb96261e6140100edcf95686e0aaa134026b4
      b5254fd271b7a4da
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-3">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 124 bytes)
      6f6338e233867540319ec86eaecc09a85dec233745db729f61c36bde
      14c034200994fc4b6e8d263008c169585fd1d186d8ac560cb9f7ad0d
      16696503414461385062a0f33478914bf162a80dad39b5b266c1dd02
      f408573b41827e38599b682afbf7a0735adfd68c39ab4994fd1b0348
      46270e38332b4da903414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||o_cat(MSGa,MSGb): (length: 216 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438dc9edef7c127e79d32f2584f9fcd3269174fe322
      26c2082963879a6deafefb9c14efcee9fc1245917ad3658037d2d62a
      ff2d3f76fa4fca996f6338e233867540319ec86eaecc09a85dec2337
      45db729f61c36bde14c034200994fc4b6e8d263008c169585fd1d186
      d8ac560cb9f7ad0d16696503414461385062a0f33478914bf162a80d
      ad39b5b266c1dd02f408573b41827e38599b682afbf7a0735adfd68c
      39ab4994fd1b034846270e38332b4da903414462
    ISK result: (length: 64 bytes)
      e6c79d30d4381a45bd47b14b769d41354211aff553ece937d4ac134f
      09844896c72a723b1f1b6da1ab281d759a15624d2bcd0e423b70b8b8
      50a4d0ed126a3026
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-3">
          <name>Corresponding C programming language initializers</name>
          <artwork><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,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[] = {
 0x68,0x2d,0x1a,0x4f,0x49,0xfc,0x2a,0x48,0x34,0x35,0x6a,0xe4,
 0xd7,0xf5,0x86,0x36,0xbc,0x94,0x81,0x52,0x1c,0x84,0x5e,0x66,
 0xe6,0xfb,0x0b,0x29,0x69,0x34,0x1d,0xf4,0x5f,0xba,0xea,0xea,
 0x9e,0x22,0x21,0xb3,0xf5,0xba,0xbc,0x54,0xc5,0xf8,0xce,0x45,
 0x69,0x88,0xff,0xc5,0x19,0xde,0xfa,0xeb,
};
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[] = {
 0xe2,0x33,0x86,0x75,0x40,0x31,0x9e,0xc8,0x6e,0xae,0xcc,0x09,
 0xa8,0x5d,0xec,0x23,0x37,0x45,0xdb,0x72,0x9f,0x61,0xc3,0x6b,
 0xde,0x14,0xc0,0x34,0x20,0x09,0x94,0xfc,0x4b,0x6e,0x8d,0x26,
 0x30,0x08,0xc1,0x69,0x58,0x5f,0xd1,0xd1,0x86,0xd8,0xac,0x56,
 0x0c,0xb9,0xf7,0xad,0x0d,0x16,0x69,0x65,
};
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[] = {
 0x50,0x62,0xa0,0xf3,0x34,0x78,0x91,0x4b,0xf1,0x62,0xa8,0x0d,
 0xad,0x39,0xb5,0xb2,0x66,0xc1,0xdd,0x02,0xf4,0x08,0x57,0x3b,
 0x41,0x82,0x7e,0x38,0x59,0x9b,0x68,0x2a,0xfb,0xf7,0xa0,0x73,
 0x5a,0xdf,0xd6,0x8c,0x39,0xab,0x49,0x94,0xfd,0x1b,0x03,0x48,
 0x46,0x27,0x0e,0x38,0x33,0x2b,0x4d,0xa9,
};
const unsigned char tc_K[] = {
 0xdc,0x9e,0xde,0xf7,0xc1,0x27,0xe7,0x9d,0x32,0xf2,0x58,0x4f,
 0x9f,0xcd,0x32,0x69,0x17,0x4f,0xe3,0x22,0x26,0xc2,0x08,0x29,
 0x63,0x87,0x9a,0x6d,0xea,0xfe,0xfb,0x9c,0x14,0xef,0xce,0xe9,
 0xfc,0x12,0x45,0x91,0x7a,0xd3,0x65,0x80,0x37,0xd2,0xd6,0x2a,
 0xff,0x2d,0x3f,0x76,0xfa,0x4f,0xca,0x99,
};
const unsigned char tc_ISK_IR[] = {
 0xa7,0x52,0x61,0x2f,0xe6,0xde,0xc5,0x42,0xe9,0x66,0x29,0xa6,
 0xeb,0x68,0xec,0xb9,0xbf,0xe2,0x25,0x72,0x24,0x97,0x5e,0x91,
 0x60,0x35,0xae,0xe7,0x47,0xc6,0xab,0xa3,0x2a,0xf2,0xe6,0xfe,
 0x25,0xee,0xb9,0x62,0x61,0xe6,0x14,0x01,0x00,0xed,0xcf,0x95,
 0x68,0x6e,0x0a,0xaa,0x13,0x40,0x26,0xb4,0xb5,0x25,0x4f,0xd2,
 0x71,0xb7,0xa4,0xda,
};
const unsigned char tc_ISK_SY[] = {
 0xe6,0xc7,0x9d,0x30,0xd4,0x38,0x1a,0x45,0xbd,0x47,0xb1,0x4b,
 0x76,0x9d,0x41,0x35,0x42,0x11,0xaf,0xf5,0x53,0xec,0xe9,0x37,
 0xd4,0xac,0x13,0x4f,0x09,0x84,0x48,0x96,0xc7,0x2a,0x72,0x3b,
 0x1f,0x1b,0x6d,0xa1,0xab,0x28,0x1d,0x75,0x9a,0x15,0x62,0x4d,
 0x2b,0xcd,0x0e,0x42,0x3b,0x70,0xb8,0xb8,0x50,0xa4,0xd0,0xed,
 0x12,0x6a,0x30,0x26,
};
]]></artwork>
        </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 MSGa or MSGb 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>
      </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'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 34b36454cab2e7842c389f7d88ecb7df
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 104 bytes)
      1e4350616365503235365f584d443a5348412d3235365f535357555f
      4e555f0850617373776f726417000000000000000000000000000000
      0000000000000000160a41696e69746961746f720a42726573706f6e
      6465721034b36454cab2e7842c389f7d88ecb7df
    generator g: (length: 65 bytes)
      041b51433114e096c9d595f0955f5717a75169afb95557f4a6f51155
      035dee19c76887bce5c7c054fa1fe48a4a62c7fb96dc75e34259d2f7
      2b8d41f31b8e586bcd
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-4">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 32 bytes)
      37574cfbf1b95ff6a8e2d7be462d4d01e6dde2618f34f4de9df869b2
      4f532c5d
  Outputs
    Ya: (length: 65 bytes)
      04b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb320d
      81df014649c2ac691925fce0eceac7dbc75eca25e6a1558066a610b4
      021488279e3b989d52
    Alternative correct value for Ya: g*(-ya):
    (length: 65 bytes)
      04b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb320d
      81df0146493d5396e5da031f1415382438a135da195eaa7f9a59ef4b
      fdeb77d861c46762ad
    MSGa = lv_cat(Ya,ADa): (length: 70 bytes)
      4104b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb32
      0d81df014649c2ac691925fce0eceac7dbc75eca25e6a1558066a610
      b4021488279e3b989d5203414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-4">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 32 bytes)
      e5672fc9eb4e721f41d80181ec4c9fd9886668acc48024d33c82bb10
      2aecba52
  Outputs
    Yb: (length: 65 bytes)
      04bb2783a57337e74671f76452876b27839c0ea9e044e3aadaad2e64
      777ed27a90e80a99438e2f1c072462f2895c6dadf1b43867b92ffb65
      562b78c793947dcada
    Alternative correct value for Yb: g*(-yb):
    (length: 65 bytes)
      04bb2783a57337e74671f76452876b27839c0ea9e044e3aadaad2e64
      777ed27a9017f566bb71d0e3f9db9d0d76a392520e4bc79847d0049a
      a9d487386c6b823525
    MSGb = lv_cat(Yb,ADb): (length: 70 bytes)
      4104bb2783a57337e74671f76452876b27839c0ea9e044e3aadaad2e
      64777ed27a90e80a99438e2f1c072462f2895c6dadf1b43867b92ffb
      65562b78c793947dcada03414462
]]></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)
      8fd12b283805750aeee6151bcd4211a6b71019e8fc416293ade24ed2
      bce12c39
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      8fd12b283805750aeee6151bcd4211a6b71019e8fc416293ade24ed2
      bce12c39
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-4">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 140 bytes)
      4104b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb32
      0d81df014649c2ac691925fce0eceac7dbc75eca25e6a1558066a610
      b4021488279e3b989d52034144614104bb2783a57337e74671f76452
      876b27839c0ea9e044e3aadaad2e64777ed27a90e80a99438e2f1c07
      2462f2895c6dadf1b43867b92ffb65562b78c793947dcada03414462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 225 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df208fd12b
      283805750aeee6151bcd4211a6b71019e8fc416293ade24ed2bce12c
      394104b75c1bcda84a0f324aabb7f25cf853ed7fb327c33f23db6aeb
      320d81df014649c2ac691925fce0eceac7dbc75eca25e6a1558066a6
      10b4021488279e3b989d52034144614104bb2783a57337e74671f764
      52876b27839c0ea9e044e3aadaad2e64777ed27a90e80a99438e2f1c
      072462f2895c6dadf1b43867b92ffb65562b78c793947dcada034144
      62
    ISK result: (length: 32 bytes)
      7ae1e916606e44652e3c0d7231198af6519226339c241e546afd0bbf
      48e1c96a
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-4">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 142 bytes)
      6f634104bb2783a57337e74671f76452876b27839c0ea9e044e3aada
      ad2e64777ed27a90e80a99438e2f1c072462f2895c6dadf1b43867b9
      2ffb65562b78c793947dcada034144624104b75c1bcda84a0f324aab
      b7f25cf853ed7fb327c33f23db6aeb320d81df014649c2ac691925fc
      e0eceac7dbc75eca25e6a1558066a610b4021488279e3b989d520341
      4461
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||o_cat(MSGa,MSGb): (length: 227 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df208fd12b
      283805750aeee6151bcd4211a6b71019e8fc416293ade24ed2bce12c
      396f634104bb2783a57337e74671f76452876b27839c0ea9e044e3aa
      daad2e64777ed27a90e80a99438e2f1c072462f2895c6dadf1b43867
      b92ffb65562b78c793947dcada034144624104b75c1bcda84a0f324a
      abb7f25cf853ed7fb327c33f23db6aeb320d81df014649c2ac691925
      fce0eceac7dbc75eca25e6a1558066a610b4021488279e3b989d5203
      414461
    ISK result: (length: 32 bytes)
      5600a5c5bea5e92695dd68bd33d7f7b58326199c27c9b7326d76e4f9
      cb2fb276
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-4">
          <name>Corresponding C programming language initializers</name>
          <artwork><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,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,0x1b,0x51,0x43,0x31,0x14,0xe0,0x96,0xc9,0xd5,0x95,0xf0,
 0x95,0x5f,0x57,0x17,0xa7,0x51,0x69,0xaf,0xb9,0x55,0x57,0xf4,
 0xa6,0xf5,0x11,0x55,0x03,0x5d,0xee,0x19,0xc7,0x68,0x87,0xbc,
 0xe5,0xc7,0xc0,0x54,0xfa,0x1f,0xe4,0x8a,0x4a,0x62,0xc7,0xfb,
 0x96,0xdc,0x75,0xe3,0x42,0x59,0xd2,0xf7,0x2b,0x8d,0x41,0xf3,
 0x1b,0x8e,0x58,0x6b,0xcd,
};
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,0xb7,0x5c,0x1b,0xcd,0xa8,0x4a,0x0f,0x32,0x4a,0xab,0xb7,
 0xf2,0x5c,0xf8,0x53,0xed,0x7f,0xb3,0x27,0xc3,0x3f,0x23,0xdb,
 0x6a,0xeb,0x32,0x0d,0x81,0xdf,0x01,0x46,0x49,0xc2,0xac,0x69,
 0x19,0x25,0xfc,0xe0,0xec,0xea,0xc7,0xdb,0xc7,0x5e,0xca,0x25,
 0xe6,0xa1,0x55,0x80,0x66,0xa6,0x10,0xb4,0x02,0x14,0x88,0x27,
 0x9e,0x3b,0x98,0x9d,0x52,
};
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,0xbb,0x27,0x83,0xa5,0x73,0x37,0xe7,0x46,0x71,0xf7,0x64,
 0x52,0x87,0x6b,0x27,0x83,0x9c,0x0e,0xa9,0xe0,0x44,0xe3,0xaa,
 0xda,0xad,0x2e,0x64,0x77,0x7e,0xd2,0x7a,0x90,0xe8,0x0a,0x99,
 0x43,0x8e,0x2f,0x1c,0x07,0x24,0x62,0xf2,0x89,0x5c,0x6d,0xad,
 0xf1,0xb4,0x38,0x67,0xb9,0x2f,0xfb,0x65,0x56,0x2b,0x78,0xc7,
 0x93,0x94,0x7d,0xca,0xda,
};
const unsigned char tc_K[] = {
 0x8f,0xd1,0x2b,0x28,0x38,0x05,0x75,0x0a,0xee,0xe6,0x15,0x1b,
 0xcd,0x42,0x11,0xa6,0xb7,0x10,0x19,0xe8,0xfc,0x41,0x62,0x93,
 0xad,0xe2,0x4e,0xd2,0xbc,0xe1,0x2c,0x39,
};
const unsigned char tc_ISK_IR[] = {
 0x7a,0xe1,0xe9,0x16,0x60,0x6e,0x44,0x65,0x2e,0x3c,0x0d,0x72,
 0x31,0x19,0x8a,0xf6,0x51,0x92,0x26,0x33,0x9c,0x24,0x1e,0x54,
 0x6a,0xfd,0x0b,0xbf,0x48,0xe1,0xc9,0x6a,
};
const unsigned char tc_ISK_SY[] = {
 0x56,0x00,0xa5,0xc5,0xbe,0xa5,0xe9,0x26,0x95,0xdd,0x68,0xbd,
 0x33,0xd7,0xf7,0xb5,0x83,0x26,0x19,0x9c,0x27,0xc9,0xb7,0x32,
 0x6d,0x76,0xe4,0xf9,0xcb,0x2f,0xb2,0x76,
};
]]></artwork>
        </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 MSGa or MSGb 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>
      </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'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 5b3773aa90e8f23c61563a4b645b276c
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 168 bytes)
      1e4350616365503338345f584d443a5348412d3338345f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000160a41696e69746961746f72
      0a42726573706f6e646572105b3773aa90e8f23c61563a4b645b276c
    generator g: (length: 97 bytes)
      04f35a925fe82e54350e80b084a8013b1960cb3f73c49b0c2ae9b523
      997846ddd14c66f24f62223112cf35b866065f91ad86674cce2a2876
      84904e49f01287b54666bb518df2ea53cec627fa6e1283f14c6ed4bc
      d11b33fbb962da3e2e4ff1345c
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-5">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 48 bytes)
      ef433dd5ad142c860e7cb6400dd315d388d5ec5420c550e9d6f0907f
      375d988bc4d704837e43561c497e7dd93edcdb9d
  Outputs
    Ya: (length: 97 bytes)
      04fd864c1a81f0e657a8a3f8e4ebafa421da712b6fb98f0abfa139ff
      971718cab474fa74c6a44b80a46468699280dd5d271252f3b9c05acc
      93dbd8b939152987cd5a8d1fb7b70c45512c993ec5456cc10f1797c9
      2fac2f1b7e363478a9ecd79e74
    Alternative correct value for Ya: g*(-ya):
    (length: 97 bytes)
      04fd864c1a81f0e657a8a3f8e4ebafa421da712b6fb98f0abfa139ff
      971718cab474fa74c6a44b80a46468699280dd5d27edad0c463fa533
      6c242746c6ead67832a572e04848f3baaed366c13aba933eefe86836
      cf53d0e481c9cb87571328618b
    MSGa = lv_cat(Ya,ADa): (length: 102 bytes)
      6104fd864c1a81f0e657a8a3f8e4ebafa421da712b6fb98f0abfa139
      ff971718cab474fa74c6a44b80a46468699280dd5d271252f3b9c05a
      cc93dbd8b939152987cd5a8d1fb7b70c45512c993ec5456cc10f1797
      c92fac2f1b7e363478a9ecd79e7403414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-5">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 48 bytes)
      50b0e36b95a2edfaa8342b843dddc90b175330f2399c1b36586dedda
      3c255975f30be6a750f9404fccc62a6323b5e471
  Outputs
    Yb: (length: 97 bytes)
      04822b9874755c51adfdf624101eb4dc12a8ae433750be4fd6f4f7eb
      f6954ddb57837752a4effa4a5b44627a64b62a2db9d3c9c031c4ad37
      dbe7bf180d6bcba54feb4e84eeb876ebfa64a85d4c5ac2063dc05ba7
      26810824c41e1893faa9373a84
    Alternative correct value for Yb: g*(-yb):
    (length: 97 bytes)
      04822b9874755c51adfdf624101eb4dc12a8ae433750be4fd6f4f7eb
      f6954ddb57837752a4effa4a5b44627a64b62a2db92c363fce3b52c8
      241840e7f294345ab014b17b11478914059b57a2b3a53df9c13fa458
      d87ef7db3be1e76c0656c8c57b
    MSGb = lv_cat(Yb,ADb): (length: 102 bytes)
      6104822b9874755c51adfdf624101eb4dc12a8ae433750be4fd6f4f7
      ebf6954ddb57837752a4effa4a5b44627a64b62a2db9d3c9c031c4ad
      37dbe7bf180d6bcba54feb4e84eeb876ebfa64a85d4c5ac2063dc05b
      a726810824c41e1893faa9373a8403414462
]]></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)
      374290a54e07015baad085b311b18fbae1a20652e137c7c4bd13d565
      7d8b1ace028eb5acfba8c68d6211a79fff0965c9
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      374290a54e07015baad085b311b18fbae1a20652e137c7c4bd13d565
      7d8b1ace028eb5acfba8c68d6211a79fff0965c9
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-5">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 204 bytes)
      6104fd864c1a81f0e657a8a3f8e4ebafa421da712b6fb98f0abfa139
      ff971718cab474fa74c6a44b80a46468699280dd5d271252f3b9c05a
      cc93dbd8b939152987cd5a8d1fb7b70c45512c993ec5456cc10f1797
      c92fac2f1b7e363478a9ecd79e74034144616104822b9874755c51ad
      fdf624101eb4dc12a8ae433750be4fd6f4f7ebf6954ddb57837752a4
      effa4a5b44627a64b62a2db9d3c9c031c4ad37dbe7bf180d6bcba54f
      eb4e84eeb876ebfa64a85d4c5ac2063dc05ba726810824c41e1893fa
      a9373a8403414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 305 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30374290
      a54e07015baad085b311b18fbae1a20652e137c7c4bd13d5657d8b1a
      ce028eb5acfba8c68d6211a79fff0965c96104fd864c1a81f0e657a8
      a3f8e4ebafa421da712b6fb98f0abfa139ff971718cab474fa74c6a4
      4b80a46468699280dd5d271252f3b9c05acc93dbd8b939152987cd5a
      8d1fb7b70c45512c993ec5456cc10f1797c92fac2f1b7e363478a9ec
      d79e74034144616104822b9874755c51adfdf624101eb4dc12a8ae43
      3750be4fd6f4f7ebf6954ddb57837752a4effa4a5b44627a64b62a2d
      b9d3c9c031c4ad37dbe7bf180d6bcba54feb4e84eeb876ebfa64a85d
      4c5ac2063dc05ba726810824c41e1893faa9373a8403414462
    ISK result: (length: 48 bytes)
      a62d337820ce9cc1195a1adfb3c1efc2d844c0d8c6bc44bd060fe3cd
      d4ee8d2343aca0168c2b58478354a37d8d8856bd
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-5">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 206 bytes)
      6f636104fd864c1a81f0e657a8a3f8e4ebafa421da712b6fb98f0abf
      a139ff971718cab474fa74c6a44b80a46468699280dd5d271252f3b9
      c05acc93dbd8b939152987cd5a8d1fb7b70c45512c993ec5456cc10f
      1797c92fac2f1b7e363478a9ecd79e74034144616104822b9874755c
      51adfdf624101eb4dc12a8ae433750be4fd6f4f7ebf6954ddb578377
      52a4effa4a5b44627a64b62a2db9d3c9c031c4ad37dbe7bf180d6bcb
      a54feb4e84eeb876ebfa64a85d4c5ac2063dc05ba726810824c41e18
      93faa9373a8403414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||o_cat(MSGa,MSGb): (length: 307 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30374290
      a54e07015baad085b311b18fbae1a20652e137c7c4bd13d5657d8b1a
      ce028eb5acfba8c68d6211a79fff0965c96f636104fd864c1a81f0e6
      57a8a3f8e4ebafa421da712b6fb98f0abfa139ff971718cab474fa74
      c6a44b80a46468699280dd5d271252f3b9c05acc93dbd8b939152987
      cd5a8d1fb7b70c45512c993ec5456cc10f1797c92fac2f1b7e363478
      a9ecd79e74034144616104822b9874755c51adfdf624101eb4dc12a8
      ae433750be4fd6f4f7ebf6954ddb57837752a4effa4a5b44627a64b6
      2a2db9d3c9c031c4ad37dbe7bf180d6bcba54feb4e84eeb876ebfa64
      a85d4c5ac2063dc05ba726810824c41e1893faa9373a8403414462
    ISK result: (length: 48 bytes)
      eebf988a62b5c854f0ba32822ab45d23329bd1c78c84a4a0e1b40704
      c99c0a6f6c01c29af5fc6943254b883ce8a65ea1
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-5">
          <name>Corresponding C programming language initializers</name>
          <artwork><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,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,0xf3,0x5a,0x92,0x5f,0xe8,0x2e,0x54,0x35,0x0e,0x80,0xb0,
 0x84,0xa8,0x01,0x3b,0x19,0x60,0xcb,0x3f,0x73,0xc4,0x9b,0x0c,
 0x2a,0xe9,0xb5,0x23,0x99,0x78,0x46,0xdd,0xd1,0x4c,0x66,0xf2,
 0x4f,0x62,0x22,0x31,0x12,0xcf,0x35,0xb8,0x66,0x06,0x5f,0x91,
 0xad,0x86,0x67,0x4c,0xce,0x2a,0x28,0x76,0x84,0x90,0x4e,0x49,
 0xf0,0x12,0x87,0xb5,0x46,0x66,0xbb,0x51,0x8d,0xf2,0xea,0x53,
 0xce,0xc6,0x27,0xfa,0x6e,0x12,0x83,0xf1,0x4c,0x6e,0xd4,0xbc,
 0xd1,0x1b,0x33,0xfb,0xb9,0x62,0xda,0x3e,0x2e,0x4f,0xf1,0x34,
 0x5c,
};
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,0xfd,0x86,0x4c,0x1a,0x81,0xf0,0xe6,0x57,0xa8,0xa3,0xf8,
 0xe4,0xeb,0xaf,0xa4,0x21,0xda,0x71,0x2b,0x6f,0xb9,0x8f,0x0a,
 0xbf,0xa1,0x39,0xff,0x97,0x17,0x18,0xca,0xb4,0x74,0xfa,0x74,
 0xc6,0xa4,0x4b,0x80,0xa4,0x64,0x68,0x69,0x92,0x80,0xdd,0x5d,
 0x27,0x12,0x52,0xf3,0xb9,0xc0,0x5a,0xcc,0x93,0xdb,0xd8,0xb9,
 0x39,0x15,0x29,0x87,0xcd,0x5a,0x8d,0x1f,0xb7,0xb7,0x0c,0x45,
 0x51,0x2c,0x99,0x3e,0xc5,0x45,0x6c,0xc1,0x0f,0x17,0x97,0xc9,
 0x2f,0xac,0x2f,0x1b,0x7e,0x36,0x34,0x78,0xa9,0xec,0xd7,0x9e,
 0x74,
};
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,0x82,0x2b,0x98,0x74,0x75,0x5c,0x51,0xad,0xfd,0xf6,0x24,
 0x10,0x1e,0xb4,0xdc,0x12,0xa8,0xae,0x43,0x37,0x50,0xbe,0x4f,
 0xd6,0xf4,0xf7,0xeb,0xf6,0x95,0x4d,0xdb,0x57,0x83,0x77,0x52,
 0xa4,0xef,0xfa,0x4a,0x5b,0x44,0x62,0x7a,0x64,0xb6,0x2a,0x2d,
 0xb9,0xd3,0xc9,0xc0,0x31,0xc4,0xad,0x37,0xdb,0xe7,0xbf,0x18,
 0x0d,0x6b,0xcb,0xa5,0x4f,0xeb,0x4e,0x84,0xee,0xb8,0x76,0xeb,
 0xfa,0x64,0xa8,0x5d,0x4c,0x5a,0xc2,0x06,0x3d,0xc0,0x5b,0xa7,
 0x26,0x81,0x08,0x24,0xc4,0x1e,0x18,0x93,0xfa,0xa9,0x37,0x3a,
 0x84,
};
const unsigned char tc_K[] = {
 0x37,0x42,0x90,0xa5,0x4e,0x07,0x01,0x5b,0xaa,0xd0,0x85,0xb3,
 0x11,0xb1,0x8f,0xba,0xe1,0xa2,0x06,0x52,0xe1,0x37,0xc7,0xc4,
 0xbd,0x13,0xd5,0x65,0x7d,0x8b,0x1a,0xce,0x02,0x8e,0xb5,0xac,
 0xfb,0xa8,0xc6,0x8d,0x62,0x11,0xa7,0x9f,0xff,0x09,0x65,0xc9,
};
const unsigned char tc_ISK_IR[] = {
 0xa6,0x2d,0x33,0x78,0x20,0xce,0x9c,0xc1,0x19,0x5a,0x1a,0xdf,
 0xb3,0xc1,0xef,0xc2,0xd8,0x44,0xc0,0xd8,0xc6,0xbc,0x44,0xbd,
 0x06,0x0f,0xe3,0xcd,0xd4,0xee,0x8d,0x23,0x43,0xac,0xa0,0x16,
 0x8c,0x2b,0x58,0x47,0x83,0x54,0xa3,0x7d,0x8d,0x88,0x56,0xbd,
};
const unsigned char tc_ISK_SY[] = {
 0xee,0xbf,0x98,0x8a,0x62,0xb5,0xc8,0x54,0xf0,0xba,0x32,0x82,
 0x2a,0xb4,0x5d,0x23,0x32,0x9b,0xd1,0xc7,0x8c,0x84,0xa4,0xa0,
 0xe1,0xb4,0x07,0x04,0xc9,0x9c,0x0a,0x6f,0x6c,0x01,0xc2,0x9a,
 0xf5,0xfc,0x69,0x43,0x25,0x4b,0x88,0x3c,0xe8,0xa6,0x5e,0xa1,
};
]]></artwork>
        </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 MSGa or MSGb 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>
      </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'\nAinitiator\nBresponder'
    CI = 0a41696e69746961746f720a42726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 168 bytes)
      1e4350616365503532315f584d443a5348412d3531325f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000160a41696e69746961746f72
      0a42726573706f6e646572107e4b4791d6a8ef019b936c79fb7f2c57
    generator g: (length: 133 bytes)
      0400dc927958f0b69ccad8fb67ef008905354b58c7c9c92ad50060a9
      e6afb10437d6ca8a26164e8573702b897275a25d05ed4407af2a3849
      86dca7e243b92c5dd500d40057012121a9c8e34373fa619f918f7d47
      9c23f85f0485379ef0f05284398de26653b49a155324c9d7b138be84
      d0b49bb58e232b7bf697798de6ee8afd6b92b6fa2f
]]></artwork>
        </section>
        <section anchor="test-vector-for-msga-6">
          <name>Test vector for MSGa</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 66 bytes)
      006367e9c2aeff9f1db19af600cca73343d47cbe446cebbd1ccd783f
      82755a872da86fd0707eb3767c6114f1803deb62d63bdd1e613f67e6
      3e8c141ee5310e3ee819
  Outputs
    Ya: (length: 133 bytes)
      04003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e1065706d
      ca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc594ad5
      286c068792ab7ca60ff6ea00919c41c00e789dabc2f42fd94178d7bf
      d8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703860f022bd271740469
      bb322b07c179c7c225499b31727c0ea3ee65578634
    Alternative correct value for Ya: g*(-ya):
    (length: 133 bytes)
      04003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e1065706d
      ca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc594ad5
      286c068792ab7ca60ff6ea016e63be3ff18762543d0bd026be872840
      27041e500e3e7ab4c2504c5f15ec0a5a03e8fc79f0fdd42d8e8bfb96
      44cdd4f83e86383ddab664ce8d83f15c119aa879cb
    MSGa = lv_cat(Ya,ADa): (length: 139 bytes)
      850104003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e1065
      706dca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc59
      4ad5286c068792ab7ca60ff6ea00919c41c00e789dabc2f42fd94178
      d7bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703860f022bd27174
      0469bb322b07c179c7c225499b31727c0ea3ee6557863403414461
]]></artwork>
        </section>
        <section anchor="test-vector-for-msgb-6">
          <name>Test vector for MSGb</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 66 bytes)
      009227bf8dc741dacc9422f8bf3c0e96fce9587bc562eaafe0dc5f6f
      82f28594e4a6f98553560c62b75fa4abb198cecbbb86ebd41b0ea025
      4cde78ac68d39a240ae7
  Outputs
    Yb: (length: 133 bytes)
      0400f5cb68bf0117bd1a65412a2bc800af92013f9969cf546e1ea6d3
      bcf08643fdc482130aec1eecc33a2b5f33600be51295047fa3399fa2
      82cc1a78de91f3a4e30b5d01a085b453f22bf3dc947386b042e5fc4e
      c691fee47fe3c3ec6408c22a17c26bc0ab73940910614d6fcee32daf
      bfd2d340d6e382d71b1fc763d7cec502fbcbcf93b4
    Alternative correct value for Yb: g*(-yb):
    (length: 133 bytes)
      0400f5cb68bf0117bd1a65412a2bc800af92013f9969cf546e1ea6d3
      bcf08643fdc482130aec1eecc33a2b5f33600be51295047fa3399fa2
      82cc1a78de91f3a4e30b5d005f7a4bac0dd40c236b8c794fbd1a03b1
      396e011b801c3c139bf73dd5e83d943f548c6bf6ef9eb290311cd250
      402d2cbf291c7d28e4e0389c28313afd0434306c4b
    MSGb = lv_cat(Yb,ADb): (length: 139 bytes)
      85010400f5cb68bf0117bd1a65412a2bc800af92013f9969cf546e1e
      a6d3bcf08643fdc482130aec1eecc33a2b5f33600be51295047fa339
      9fa282cc1a78de91f3a4e30b5d01a085b453f22bf3dc947386b042e5
      fc4ec691fee47fe3c3ec6408c22a17c26bc0ab73940910614d6fcee3
      2dafbfd2d340d6e382d71b1fc763d7cec502fbcbcf93b403414462
]]></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)
      00503e75e38e012a6dc6f3561980e4cf540dbcff3de3a4a6f09d79c3
      2cc45764d3a6605eb45df1dc63fb7937b7879f2820da1b3266b69fa0
      99bf8720dd8f6a07e8ed
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      00503e75e38e012a6dc6f3561980e4cf540dbcff3de3a4a6f09d79c3
      2cc45764d3a6605eb45df1dc63fb7937b7879f2820da1b3266b69fa0
      99bf8720dd8f6a07e8ed
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-6">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    unordered cat of transcript : (length: 278 bytes)
      850104003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e1065
      706dca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc59
      4ad5286c068792ab7ca60ff6ea00919c41c00e789dabc2f42fd94178
      d7bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703860f022bd27174
      0469bb322b07c179c7c225499b31727c0ea3ee655786340341446185
      010400f5cb68bf0117bd1a65412a2bc800af92013f9969cf546e1ea6
      d3bcf08643fdc482130aec1eecc33a2b5f33600be51295047fa3399f
      a282cc1a78de91f3a4e30b5d01a085b453f22bf3dc947386b042e5fc
      4ec691fee47fe3c3ec6408c22a17c26bc0ab73940910614d6fcee32d
      afbfd2d340d6e382d71b1fc763d7cec502fbcbcf93b403414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||MSGa||MSGb: (length: 397 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c574200503e
      75e38e012a6dc6f3561980e4cf540dbcff3de3a4a6f09d79c32cc457
      64d3a6605eb45df1dc63fb7937b7879f2820da1b3266b69fa099bf87
      20dd8f6a07e8ed850104003701ec35caafa3dd416cad29ba1774551f
      9d2ed89f7e1065706dca230b86a11d02e4cee8b3fde64380d4a05983
      167d8a2414bc594ad5286c068792ab7ca60ff6ea00919c41c00e789d
      abc2f42fd94178d7bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703
      860f022bd271740469bb322b07c179c7c225499b31727c0ea3ee6557
      86340341446185010400f5cb68bf0117bd1a65412a2bc800af92013f
      9969cf546e1ea6d3bcf08643fdc482130aec1eecc33a2b5f33600be5
      1295047fa3399fa282cc1a78de91f3a4e30b5d01a085b453f22bf3dc
      947386b042e5fc4ec691fee47fe3c3ec6408c22a17c26bc0ab739409
      10614d6fcee32dafbfd2d340d6e382d71b1fc763d7cec502fbcbcf93
      b403414462
    ISK result: (length: 64 bytes)
      ed208a15af3ef8a67a5cac4acb360d03154570e3b1b1c54867f53a72
      53cb919d13aa47efc647375be2250cb39ad965afa4ddfcb6be47d586
      d28c7eef6d654525
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-6">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    ordered cat of transcript : (length: 280 bytes)
      6f6385010400f5cb68bf0117bd1a65412a2bc800af92013f9969cf54
      6e1ea6d3bcf08643fdc482130aec1eecc33a2b5f33600be51295047f
      a3399fa282cc1a78de91f3a4e30b5d01a085b453f22bf3dc947386b0
      42e5fc4ec691fee47fe3c3ec6408c22a17c26bc0ab73940910614d6f
      cee32dafbfd2d340d6e382d71b1fc763d7cec502fbcbcf93b4034144
      62850104003701ec35caafa3dd416cad29ba1774551f9d2ed89f7e10
      65706dca230b86a11d02e4cee8b3fde64380d4a05983167d8a2414bc
      594ad5286c068792ab7ca60ff6ea00919c41c00e789dabc2f42fd941
      78d7bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc1703860f022bd271
      740469bb322b07c179c7c225499b31727c0ea3ee6557863403414461
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||o_cat(MSGa,MSGb): (length: 399 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c574200503e
      75e38e012a6dc6f3561980e4cf540dbcff3de3a4a6f09d79c32cc457
      64d3a6605eb45df1dc63fb7937b7879f2820da1b3266b69fa099bf87
      20dd8f6a07e8ed6f6385010400f5cb68bf0117bd1a65412a2bc800af
      92013f9969cf546e1ea6d3bcf08643fdc482130aec1eecc33a2b5f33
      600be51295047fa3399fa282cc1a78de91f3a4e30b5d01a085b453f2
      2bf3dc947386b042e5fc4ec691fee47fe3c3ec6408c22a17c26bc0ab
      73940910614d6fcee32dafbfd2d340d6e382d71b1fc763d7cec502fb
      cbcf93b403414462850104003701ec35caafa3dd416cad29ba177455
      1f9d2ed89f7e1065706dca230b86a11d02e4cee8b3fde64380d4a059
      83167d8a2414bc594ad5286c068792ab7ca60ff6ea00919c41c00e78
      9dabc2f42fd94178d7bfd8fbe1aff1c1854b3dafb3a0ea13f5a5fc17
      03860f022bd271740469bb322b07c179c7c225499b31727c0ea3ee65
      57863403414461
    ISK result: (length: 64 bytes)
      e7b10b6da531d9a8fd47fdd08441e8bb803d16c59a93e366d5cd9a10
      277bbc543d943182889154704d80f2b0756ed62da87e0eb4e6d07920
      480100d5e800ca85
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-6">
          <name>Corresponding C programming language initializers</name>
          <artwork><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0a,0x41,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,0x0a,
 0x42,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,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,0xdc,0x92,0x79,0x58,0xf0,0xb6,0x9c,0xca,0xd8,0xfb,
 0x67,0xef,0x00,0x89,0x05,0x35,0x4b,0x58,0xc7,0xc9,0xc9,0x2a,
 0xd5,0x00,0x60,0xa9,0xe6,0xaf,0xb1,0x04,0x37,0xd6,0xca,0x8a,
 0x26,0x16,0x4e,0x85,0x73,0x70,0x2b,0x89,0x72,0x75,0xa2,0x5d,
 0x05,0xed,0x44,0x07,0xaf,0x2a,0x38,0x49,0x86,0xdc,0xa7,0xe2,
 0x43,0xb9,0x2c,0x5d,0xd5,0x00,0xd4,0x00,0x57,0x01,0x21,0x21,
 0xa9,0xc8,0xe3,0x43,0x73,0xfa,0x61,0x9f,0x91,0x8f,0x7d,0x47,
 0x9c,0x23,0xf8,0x5f,0x04,0x85,0x37,0x9e,0xf0,0xf0,0x52,0x84,
 0x39,0x8d,0xe2,0x66,0x53,0xb4,0x9a,0x15,0x53,0x24,0xc9,0xd7,
 0xb1,0x38,0xbe,0x84,0xd0,0xb4,0x9b,0xb5,0x8e,0x23,0x2b,0x7b,
 0xf6,0x97,0x79,0x8d,0xe6,0xee,0x8a,0xfd,0x6b,0x92,0xb6,0xfa,
 0x2f,
};
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,0x37,0x01,0xec,0x35,0xca,0xaf,0xa3,0xdd,0x41,0x6c,
 0xad,0x29,0xba,0x17,0x74,0x55,0x1f,0x9d,0x2e,0xd8,0x9f,0x7e,
 0x10,0x65,0x70,0x6d,0xca,0x23,0x0b,0x86,0xa1,0x1d,0x02,0xe4,
 0xce,0xe8,0xb3,0xfd,0xe6,0x43,0x80,0xd4,0xa0,0x59,0x83,0x16,
 0x7d,0x8a,0x24,0x14,0xbc,0x59,0x4a,0xd5,0x28,0x6c,0x06,0x87,
 0x92,0xab,0x7c,0xa6,0x0f,0xf6,0xea,0x00,0x91,0x9c,0x41,0xc0,
 0x0e,0x78,0x9d,0xab,0xc2,0xf4,0x2f,0xd9,0x41,0x78,0xd7,0xbf,
 0xd8,0xfb,0xe1,0xaf,0xf1,0xc1,0x85,0x4b,0x3d,0xaf,0xb3,0xa0,
 0xea,0x13,0xf5,0xa5,0xfc,0x17,0x03,0x86,0x0f,0x02,0x2b,0xd2,
 0x71,0x74,0x04,0x69,0xbb,0x32,0x2b,0x07,0xc1,0x79,0xc7,0xc2,
 0x25,0x49,0x9b,0x31,0x72,0x7c,0x0e,0xa3,0xee,0x65,0x57,0x86,
 0x34,
};
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,0xf5,0xcb,0x68,0xbf,0x01,0x17,0xbd,0x1a,0x65,0x41,
 0x2a,0x2b,0xc8,0x00,0xaf,0x92,0x01,0x3f,0x99,0x69,0xcf,0x54,
 0x6e,0x1e,0xa6,0xd3,0xbc,0xf0,0x86,0x43,0xfd,0xc4,0x82,0x13,
 0x0a,0xec,0x1e,0xec,0xc3,0x3a,0x2b,0x5f,0x33,0x60,0x0b,0xe5,
 0x12,0x95,0x04,0x7f,0xa3,0x39,0x9f,0xa2,0x82,0xcc,0x1a,0x78,
 0xde,0x91,0xf3,0xa4,0xe3,0x0b,0x5d,0x01,0xa0,0x85,0xb4,0x53,
 0xf2,0x2b,0xf3,0xdc,0x94,0x73,0x86,0xb0,0x42,0xe5,0xfc,0x4e,
 0xc6,0x91,0xfe,0xe4,0x7f,0xe3,0xc3,0xec,0x64,0x08,0xc2,0x2a,
 0x17,0xc2,0x6b,0xc0,0xab,0x73,0x94,0x09,0x10,0x61,0x4d,0x6f,
 0xce,0xe3,0x2d,0xaf,0xbf,0xd2,0xd3,0x40,0xd6,0xe3,0x82,0xd7,
 0x1b,0x1f,0xc7,0x63,0xd7,0xce,0xc5,0x02,0xfb,0xcb,0xcf,0x93,
 0xb4,
};
const unsigned char tc_K[] = {
 0x00,0x50,0x3e,0x75,0xe3,0x8e,0x01,0x2a,0x6d,0xc6,0xf3,0x56,
 0x19,0x80,0xe4,0xcf,0x54,0x0d,0xbc,0xff,0x3d,0xe3,0xa4,0xa6,
 0xf0,0x9d,0x79,0xc3,0x2c,0xc4,0x57,0x64,0xd3,0xa6,0x60,0x5e,
 0xb4,0x5d,0xf1,0xdc,0x63,0xfb,0x79,0x37,0xb7,0x87,0x9f,0x28,
 0x20,0xda,0x1b,0x32,0x66,0xb6,0x9f,0xa0,0x99,0xbf,0x87,0x20,
 0xdd,0x8f,0x6a,0x07,0xe8,0xed,
};
const unsigned char tc_ISK_IR[] = {
 0xed,0x20,0x8a,0x15,0xaf,0x3e,0xf8,0xa6,0x7a,0x5c,0xac,0x4a,
 0xcb,0x36,0x0d,0x03,0x15,0x45,0x70,0xe3,0xb1,0xb1,0xc5,0x48,
 0x67,0xf5,0x3a,0x72,0x53,0xcb,0x91,0x9d,0x13,0xaa,0x47,0xef,
 0xc6,0x47,0x37,0x5b,0xe2,0x25,0x0c,0xb3,0x9a,0xd9,0x65,0xaf,
 0xa4,0xdd,0xfc,0xb6,0xbe,0x47,0xd5,0x86,0xd2,0x8c,0x7e,0xef,
 0x6d,0x65,0x45,0x25,
};
const unsigned char tc_ISK_SY[] = {
 0xe7,0xb1,0x0b,0x6d,0xa5,0x31,0xd9,0xa8,0xfd,0x47,0xfd,0xd0,
 0x84,0x41,0xe8,0xbb,0x80,0x3d,0x16,0xc5,0x9a,0x93,0xe3,0x66,
 0xd5,0xcd,0x9a,0x10,0x27,0x7b,0xbc,0x54,0x3d,0x94,0x31,0x82,
 0x88,0x91,0x54,0x70,0x4d,0x80,0xf2,0xb0,0x75,0x6e,0xd6,0x2d,
 0xa8,0x7e,0x0e,0xb4,0xe6,0xd0,0x79,0x20,0x48,0x01,0x00,0xd5,
 0xe8,0x00,0xca,0x85,
};
]]></artwork>
        </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 MSGa or MSGb 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>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
eWyVq+djRIyCm99wqtuqesLZyF45OLw4VVXdUyOKgwy3Bk7wkjNKl9r64JoB
RgQy2bd+UeOZ0oSz0QtaLx3lK9qCpu0c1j25O4GY4L1zMvPimefOsNvuzKrs
gzpw0cN0dC5UaqxedkSkd3uargGLlJ3/x5MX8JISF1Mzqv1iKII2PvYNqZAW
TwZeq0qla5t2RAUxjnRC/b0tAso89IbV2SMSTe/eKKwQUOM5XYpGGZzkjKnI
k8HzsJMFevLpqf/1+QuDCN2stwjaJFi2FGQScWO60Xb2fL8qVatpNDqZz1vU
3NAjfeFr93VI4xt1bTaNuP7+PjsxXIi6LT6wnOpglDBbLb4NCxeOYHauOD5F
LBRK9u5uExVFwKcd/fTOVVuW483GwBn/2YrBO2RQirm2krQXdKNp78Q9+bF4
JlRdGY836F4x2M8WkSktchVsoZ9Vt6e5xfxiRddCMp72E7v4YK/iSadyUnWA
2+0eAlpmOq46XLOvc4CP3c5OyRHW9ao3vB5izhs2rRnfJ0CUXKIEfC8r8U6f
iKJu+DM1zJ6XoC7CUTZLsMmamXZriMDImcJQsm1VaAvDr/e8V+MjSLHou5RK
c/NlZrbnoBxUy5+GJSg1ypwfrVVlmc5jFfjFksuJYDSs6p91CFfEDmZ9OvTd
omO5oEe9UbgKFRYzAUDod2qiGnuPcMehtYeLAqH9V3Z0escT9jGqnaEd2Rhj
LPrk/GVvvtR67W/W27vfNLo+qhnX6Khb4WSzHvD8eEBtnMZIbcdCam8EmKXz
l7OuStFuXaOcNa0bxK6uuCIXgG++oxP411R5pt2/wfW5kRd0OdLelK/ShQdU
obOrCtX+TYdfP6ss0Uy9alcnQqfROqxLmrR/cF7tDxwZRLzlWi/Rl9O5D7uG
dKdywoGatrvVcW3xoCIgPSgpmnRj5qn/PdV/X3Nh3NVusd82+0tnICilZvjx
eXdb5GDjWAHoW0MZ536tKJ+r1bPb2Ras6wAzBnQyHy7l4K2T1uK5f9k5er07
+yjzPCQlfXxE7W+mjIvm3YFZGVip3LVBd3WPeNu3uTD/KBQ8egPvHO2rJNdL
9DHNd0l9v+QggnPbbTZwae23sm+Ao9CLjjcuRmzq7C3hAz3t38QRphwh34q9
ln9TzRrCjAPQAmbUTeGGJtzisMLaVj/ckRMHqxQeyq4ehOf9MsnTNgvKu+Da
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
Kr0th7IGMm4XSKNLDzFZU8i2BymASyTQUka33KhPyV3J1o5BBhqSlaF25Cm5
qT3plltNlJZqayhPTXWDZh4CyrS6vfLTz4lj5zPzOZXZu2nPqcz+eH5bZT4F
mHbrETx5UFpJxZCTPkvh6aU1OfISvWVVKbe3VpHrzrmRCws+hT66XKDaZjyP
/6Hcvg4qWbziIbZutkbusARrbPXDRX3rEepDj5CMoZOLjqJr85q5HSZumfSo
rjdt6LjJ85A3oofyTNXpZhwnaWT2jie3kKbG6A3lrpTQuuIr31XFEij6kGtn
P2VJI5Ul/1W6EF/0OmKdmlSAkuJavJuM2UtuDNLdMEiXeECK766RG+EhMJ20
oxbBpISkVTKuOT2oNiNDIpugCJgueYQ38W+/mYwMFXp2tkHnSAFDgDdUAlDs
YHJOimGlcvavY9V60XkoT5E3UrHAWVOfpDkkB+f3x3uKY8ZebR16UBLA04db
aj6KR3gIo7vrEZ4Rxw6K9TmVkaD4nMrs+9H4tsr8UDjerSew0ZmsaPVDcecP
cyBSLlspQ6o6MbGo5pHdnmpRG1tsrnbNbJ77ojaST9RURihDpSbtkz6ReGx2
4HvuSMGIMong20W43m+1uE+G85nbhoq/+uB2z1blTcMVD/baViW3veLlX9uq
eIErXv61rW4zvjVZ/uGbyJo3S+2PImsu16jfjjG06jHG8Lly+QWP1julolXL
CWyBf9gXLCewdfVdX3DfFPfTL2Tf90xx7/1ChXLPFHcxeqFCuWeKO/6+a5H3
TfGsAt+xyPumKHii9yzyvilu0b1rkXdN8S765zbKlMD6GhOVvyOTLDVlxSyN
apses5menGuqk7pQCUx6pYKaw7a9tE5rTt1Y0v5WlA6pMcc4c4N7V2ijqTNB
eX3UlfXdEZMkqdeIyWeizBbRm6r9WKe32b2p2o91er+he1O1H+u03JBczZO/
1un98cu1xNc6fXqsi7XE1zotryreUO2fNco8wG9a9Ri/+VcXa+4a5Zblxbc9
t0a5n37xjditUe6PX3wjdmuUkhddyQBfG+X++KUM8LVRbrW5lAG+Nsr99EsZ
4PPxhh45c0oUdqrnMa9TMfEtCYfOkA7IWpNJoRpfuDraoBq6OtJDOdlM2yqk
O03pZnIhBW+BKnLj6byTbYO+2Y+i/0CjfvlOdJEAycX9leVrjBJAR0C6YGnA
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
6a/5Ffn4S/dy3a9IYPk607zqV7bobjLNq35lP/0mu7/qV/bTb7L7q35lp9MX
INPhxl2MblQq2pdpx0wlxELq2VxplQTTKef1/IJ4UNZcdeM5dZFMtciLVW9b
JSXqlPEWF8ekHUYbfR10yMwekkvPwTPKvvdJh1hJFt0n8fuGMvMxZuh0pDz2
4zM7eZJ63cnzTNK9P/5Bjduqtq3ugxq3VW27yw9q3Fa1XX9+UOO2qu29m+dy
p/3xD/i4l85tK+EHfNxL57ZDxQd83Evntj/+AR/31bsd/vDPmgI86jXK+Y9E
4H4icN3D7Hhy9+3J+x5mL/7u25P3Pcxe/N03Vu97mC35u2+s3vcw2yXdpMxX
PcyOpXde0l/xMDsNufOS/oqHkQzuuSxql1N3LkaueJhtwa8dzbVkIJJ91dDJ
KHXPJc1Op9y7Ss5pklTlCy/NpJQl22FD6L7Rr51T1WKsJCuH12c6mZQypQ9R
uc5zgWnpPpAN8G1aHDyOeISuSJgSwhIdsOL3b0q1kvwfbVZfvk+b1WoOqRsl
mtFDcXK/Cys5YJkAHQNTGfOJw0U7yiJujx9pswIHMPDk6JSIeeNVF2I0bDjn
In7GPxzNXVGWBlAycP68bysgTp82gHRhv8EqfBBi+/1BdGWtbgXsGDBmvfGk
Cxse9gJSOaHZIGBeEPCvD2M1IuR9VFG6Fo7mD6wSnQVOwKt4LOCw4KdGZ06S
4QDAMg9zknEv/uyDJv/lbrrI1At82xz/A5wZgsCpCnI4CoocqpfnVoF0THaA
WoCMG5DiowPn6B1bjQV+ywoM8Tg7/G/RlruzbSWd4wGAqcVu0E8G7LTfPzOC
5u3r2TgTCKcK7L4LXT00c/FAj73GxSV+QPGhSHFr2FoFoPrjy6bEFqw/NBGq
N8tuernYILZUChaCMzsZ/CGXueWr+1azfNBxy6ebnLiVI8Kxrn6yk+wb6GTs
e+kVeroAEgdKHU2GSTRw9QaBtV3GHMBt9IWmhurCEQC0jj6GKL2V6G9Dzxx6
mdCxgGcHc7Z4oNURXTdoUcAHsYolC/wKxN32N+pxDtFAVwYa5/BLwF3rh1j9
79N+BqFbsRb0LMGHwOJXZ5ndG1uuu53tkujAArAd/UXw25isgA6sLJT7/RyV
Ms6WmuWo8SdhtzfSVZRkVgPUBV0Qw53tkhARTmuKPi+ufnEFaAhAxxKg/0dr
wML942FuHwW6D/Cb6LCBS0HL54LPh6U98ALQ57r1o0iXAowMTZ2QKXxIFnL8
djRBjq2gEA6+BxaCBiEjox3wGfxeP7pyoGdHBNhdJtLKiSaLJK4fClpkGMfu
GMA5QWBwytICgLPD0Jcku1HSLNWXjkcJzEqCdZUpHvhN+HIsJcrImHb0OmBt
aE+oW9tXfDgHOGCMyNh6sdqh1onZy41zS/RYkXQzwd1hMU7aI1d/IWQO6aez
KdLKijCfZo0ZkcAccWLo15Em3rJOZ0gwR2gI4oHWeAi/n4iGtzV3J69/QKIl
3aloV1xtJHF/2er8gLuDXiG2o3dxefgqFgO/1GWi0BItAjOOAD2JooRHLxEa
NtEmlsUs1miIh9nM92nLw5FBI9FltiYdSNIF3VydUmWrhtNn/wwUDyF9zVOY
+/yV+F80ekJf0Qe+hzqgj2zso8Du4QUQuZN4EziXJv2DenV+KRmegq/An9a4
G1kUzg1BDEnW6pRcZ43mQbT/QQJRvOzqyMRfzX5ik7bguLQUx5ePSUi7Q1Dc
ppeBROVsV4NftufwHiwQn+5iCFEcABpPkW0P8RFunI2/69ljq3I8e7TslgUS
cXTuwbsdeaeO+werq1BtpY4y5wSdalqKDrRHhvnC6yO3Of0bPKbZB4ieU0Rj
/F465jbh2WiqQx8ayhcZotGkBRg+b0q/I7TlmGdSrzYUruwTQRVWJoOtkJmt
jBSKDLUK+xh8OKcbIX5Bsltfj1bMpZ5Qq76/thzORDgIEFeW/5VpUlBfH/e5
QFRFJqj4sbd4aA9CChQjCJ9AlBZLOKUk/YVmKSW6AuFatQSFRX0QRKWxvLxP
bWVjKzQhu0DCjVkrCCSI7+PdfryX7YooK7CSJPk01ARnMaWXDR2z6PpF36Bb
2tmOJuhD2kqoCpzkKRB5la7P1TiezooMbgwuAMENPh1fu7IBafhEO6k7ajix
K/xgNRHDWcByoJjIfcU/d+nmPCIPlAAynMK6sFJlFHAoDODk4FRQvI7z2VDF
IBvlUVkfaIGMWxjwPmv0kSS0WCmS7dn3cvCn/oItBJFjZXNCJgAFR40JGWPb
KL1XP3w4y1ik/Kt8QpRDHopAKYwS+DJ4FyzqaL9EkyPOBb+E84W7SdIgD0cI
E16cG0c3LESethSVNIavCXD4TN6K6IQKZVWoxxwyCVirsPY/rK3yFa5FJ9N7
ZF575lp2Og9XJ7Mw5xhsacxYxAztiomY6DdG5wstvV+dJeZdT6G2zBxO2quQ
s2YEfqhFlzyGcT7NMdKYTSmGNDK4P7XzHVYOfszg5zTKpZr8uuv65f3WAa9i
qkyEVKYORoELqo7WQuv0FN1KVVVpPWaNtkWGW+73bqE3o1vkBoDqVKgjuhLy
YDam6kqKTcU2WxghRW6raiWXMIRzmraanSq2Om2Uj7aaUBIJyHMvRbKWHltM
4nHPsdqpp/HGWdr0ed9b09R9RK0KbYNpnVTHZNwxR1ajmtpaMYFprUxPvozQ
XtBpKRJxaHy/aIdTtdNZVBNzcD2GSOsJwcU6y0F599GOznuy1oxqTbQdZt0q
xXTNbMldOe1SDKrZnmMlsfVSNLMT1lSr0HeR7GcY2evZGC5rdJ3a2Zizb5O3
oK0pdI6jMoY6j6C69ToKVeQMPWdu7+iBmxHGNLEyZNGXmUfqvU1rYxuq8Bte
btrg+4QmBFqOx7700fWo0Yw5u+FxqdYYo2MNpNmqZufoBOmoSLGVC6RUs8t7
4UhGkXw0abpMuqYnv25tib7A8gRbWpbR2aQ745s+0iH62iafkXjbMn9O4n1f
otyT+N9kM+lP4ipv+k7/8JZPeMtjgvLn9LH+f8BcnPll/AEA

-->

</rfc>
