Internet-Draft | CPace | October 2024 |
Abdalla, et al. | Expires 18 April 2025 | [Page] |
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.¶
This note is to be removed before publishing as an RFC.¶
Discussion of this document takes place on the Crypto Forum Research Group mailing list (cfrg@ietf.org), which is archived at https://mailarchive.ietf.org/arch/search/?email_list=cfrg.¶
Source for this draft and an issue tracker can be found at https://github.com/cfrg/draft-irtf-cfrg-cpace.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 18 April 2025.¶
Copyright (c) 2024 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document.¶
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.¶
The CPace design was tailored considering the following main objectives:¶
Efficiency: Deployment of CPace is feasible on resource-constrained devices.¶
Versatility: CPace supports different application scenarios via versatile input formats, and by supporting applications with and without clear initiator and responder roles.¶
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.¶
Post-quantum annoyance: CPace comes with measures to slow down adversaries capable of breaking the discrete logarithm problem on elliptic curves.¶
Section 3 describes the expected properties of an application using CPace, and discusses in particular which application-level aspects are relevant for CPace's security.¶
Section 4 gives an overview of the recommended cipher suites for CPace which were optimized for different types of cryptographic library ecosystems.¶
Section 5 introduces the notation used throughout this document.¶
The appendix provides code and test vectors of all of the functions defined for CPace.¶
As this document is primarily written for implementers and application designers, we would like to refer the theory-inclined reader to the scientific paper [AHH21] which covers the detailed security analysis of the different CPace instantiations as defined in this document via the cipher suites.¶
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 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
CPace enables balanced password-authenticated key establishment. I.e. with CPace the parties start the protocol with a shared secret octet string, namely the password-related string (PRS). PRS can be a low-entropy secret itself, for instance a clear-text password encoded according to [RFC8265], or any string derived from a common secret, for instance by use of a key derivation function.¶
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 [I-D.irtf-cfrg-opaque].¶
In the course of the CPace protocol, A sends one message to B and B sends one message to A. CPace does not mandate any ordering of these two messages. We use the term "initiator-responder" for CPace where A always speaks first, and the term "symmetric" setting where anyone can speak first.¶
CPace's output is an intermediate session key (ISK), but any party might abort in case of an invalid received message. A and B will produce the same ISK value if and only if both sides did initiate the protocol using the same protocol inputs, specifically the same PRS and the same value for the optional input parameters CI, ADa, ADb and sid that will be specified in section Section 3.1.¶
The naming of ISK as "intermediate" session key highlights the fact that it is RECOMMENDED that applications process ISK by use of a suitable strong key derivation function KDF (such as defined in [RFC5869]) before using the key in a higher-level protocol.¶
For accommodating different application settings, CPace offers the following OPTIONAL inputs, i.e. inputs which MAY also be the empty string:¶
Party identity strings (A,B). In CPace each party can be given a party identity string which might be a device name a user name or an URL. CPace offers two alternative options for authenticating the party identifiers in the course of the protocol run. The RECOMMENDED option is to integrate both, A and B, into the channel identifier string CI. This option is to be preferred as A and B will be kept confidential and as this provides security advantages (see Section 9.11 and Section 9.1). Integrating A,B into CI, however, requires that both parties know the party identity string of the communication partner before starting the protocol. If this requirement is not fulfilled in an application setting then CPace offers the alternative of integrating A as part of the optional input ADa and B as part of the optional input ADb. If the key exchange is successful, parties are guaranteed to learn each other's identity string.¶
Channel identifier (CI). CI can be used to bind a session key exchanged with CPace to a specific networking channel which interconnects the protocol parties. CI could for instance include networking addresses of both parties or party identity strings. Both parties are required to have the same view of CI. CI will not be publicly sent on the wire and may also include confidential information. Both parties will only establish a common session key if they initiated the protocol with the same view of CI.¶
Associated data fields (ADa and ADb). These fields can be used for authenticating associated data alongside the CPace protocol. The ADa and ADb will be sent in clear text as part of the protocol messages. ADa and ADb will become authenticated in a CPace protocol run as both parties will only agree on a common key if they have had the same view on ADa and ADb.¶
If an application cannot integrate the party identities (A,B) as part of CI, A SHOULD BE included in ADa and B SHOULD BE included in ADb instead (see Section 9.1).¶
In a setting with clear initiator and responder roles, identity information in ADa sent by the initiator can be used by the responder for choosing the appropriate PRS (respectively password) for this identity. ADa and ADb could also include application protocol version information (e.g. to avoid downgrade attacks).¶
Session identifier (sid). If both parties have access to the same unique public octet string sid being specific for a communication session before starting the protocol, it is RECOMMENDED to use this sid value as an additional input for the protocol as this provides security advantages and will bind the CPace run to this communication session (see Section 9).¶
If a session identifier is not available as input at protocol start CPace can optionally produce a unique public session identifier sid_output as output that might be helpful for the application for actions subsequent to the CPace protocol step (see Section 9.6, [BGHJ24]).¶
The following tasks are out of the scope of this document and left to the application layer¶
Setup phase: The application layer is responsible for the handshake that makes parties agree on a common CPace cipher suite.¶
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 [RFC8265].¶
The application needs to settle whether CPace is used in the initiator-responder or the symmetric setting, as in the symmetric setting transcripts ordered string concatenation must be used for generating protocol transcripts and when integrating the identity strings A and B into the channel identifier CI. In this document we will provide test vectors for both, initiator-responder and symmetric settings.¶
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.¶
For naming cipher suites we use the convention "CPACE-G-H". We RECOMMEND the following cipher suites:¶
CPACE-X25519-SHA512. This suite uses the group environment G_X25519 defined in Section 7.2 and SHA-512 as hash function. This cipher suite comes with the smallest messages on the wire and a low computational cost.¶
CPACE-P256_XMD:SHA-256_SSWU_NU_-SHA256. This suite instantiates the group environment G as specified in Section 7.4 using the encode_to_curve function P256_XMD:SHA-256_SSWU_NU_ from [RFC9380] on curve NIST-P256, and hash function SHA-256.¶
The following RECOMMENDED cipher suites provide higher security margins.¶
CPACE-X448-SHAKE256. This suite uses the group environment G_X448 defined in Section 7.2 and SHAKE-256 as hash function.¶
CPACE-P384_XMD:SHA-384_SSWU_NU_-SHA384. This suite instantiates G as specified in Section 7.4 using the encode_to_curve function P384_XMD:SHA-384_SSWU_NU_ from [RFC9380] on curve NIST-P384 with H = SHA-384.¶
CPACE-P521_XMD:SHA-512_SSWU_NU_-SHA512. This suite instantiates G as specified in Section 7.4 using the encode_to_curve function P521_XMD:SHA-512_SSWU_NU_ from [RFC9380] on curve NIST-P521 with H = SHA-512.¶
CPace can also securely be implemented using the cipher suites CPACE-RISTR255-SHA512 and CPACE-DECAF448-SHAKE256 defined in Section 7.3. Section 9 gives guidance on how to implement CPace on further elliptic curves.¶
Common choices for H are SHA-512 [RFC6234] or SHAKE-256 [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.¶
We use the following notation for referring to the specific properties of a hash function H:¶
H.hash(m,l) is a function that operates on an input octet string m and returns the first l octets of the hash of m.¶
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.¶
H.bmax_in_bytes denotes the maximum 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.¶
H.s_in_bytes denotes the input block size 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 [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.¶
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.¶
G.calculate_generator(H,PRS,CI,sid) denotes a function that outputs a representation of a generator (referred to as "generator" from now on) of the group which is derived from input octet strings PRS, CI, and sid and with the help of a hash function H.¶
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.¶
G.scalar_mult(y,g) is a function operating on a scalar y and a group element g. It returns an octet string representation of the group element Y = y*g.¶
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.¶
G.scalar_mult_vfy(y,g) is a function operating on a scalar y and a group element g. It returns an octet string representation of the group element y*g. Additionally, scalar_mult_vfy specifies validity conditions for y,g and y*g and outputs G.I in case they are not met.¶
G.DSI denotes a domain-separation identifier octet string which SHALL be uniquely identifying the group environment G.¶
bytes1 || bytes2 denotes concatenation of octet strings.¶
len(S) denotes the number of octets in an octet string S.¶
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".¶
We use a preceding lowercase letter b"" in front of the quotation marks if a character sequence is representing an octet string sequence. I.e., we use the notation convention for byte string representations with single-byte ASCII character encodings from the python programming language. b"" denotes the empty string of length 0.¶
LEB128 denotes an algorithm that converts an integer to a variable sized string. The algorithm encodes 7 bits per byte starting with the least significant bits in bits #0 to #6. As long as significant bits remain, bit #7 will be set. This will result in a single-byte encoding for values below 128. Test vectors and reference code for LEB128 encoding are available in the appendix.¶
prepend_len(octet_string) denotes the octet sequence that is obtained from prepending the length of the octet string to the string itself. The length is encoded using LEB128. Test vectors and code for prepend_len are available in the appendix.¶
lv_cat(a0,a1, ...) is the "length-value" encoding function which returns the concatenation of the input strings with an encoding of their respective length prepended. E.g., lv_cat(a0,a1) returns prepend_len(a0) || prepend_len(a1). The detailed specification of lv_cat and reference code is available in the appendix.¶
sample_random_bytes(n) denotes a function that returns n octets, each of which is to be independently sampled from a uniform distribution between 0 and 255.¶
zero_bytes(n) denotes a function that returns n octets with value 0.¶
o_cat(bytes1,bytes2) denotes a function for ordered concatenation of octet strings. It places the lexicographically larger octet string first and prepends the two bytes from the octet string b"oc" to the result. Reference code for this function is available in the appendix.¶
transcript(Ya,ADa,Yb,ADb) denotes a function outputting an octet string for the protocol transcript. In applications where CPace is used without clear initiator and responder roles, i.e. where the ordering of messages is not enforced by the protocol flow, transcript_oc(Ya,Yb,ADa,ADb) = o_cat(lv_cat(Ya,ADa),lv_cat(Yb, ADb)) SHALL be used. In the initiator-responder setting the implementation transcript_ir(Ya,Yb,ADa,ADb) = lv_cat(Ya,ADa) || lv_cat(Yb, ADb) SHALL be used.¶
We use additive notation for the group, i.e., 2*X denotes the element that is obtained by computing X+X, for group element X and group operation +.¶
CPace is a one round protocol between two parties, A and B. At invocation, A and B are provisioned with PRS,G and H. Parties will also be provisioned with OPTIONAL CI,sid,ADa (for A) and CI,sid,ADb (for B) which will default to the empty string b"" if not used. A sends the public share Ya and optional associated data ADa to B. Likewise, B sends the public share Yb and optional associated data ADb to A. Both A and B use the received messages for deriving a shared intermediate session key, ISK.¶
Optional parameters and messages are denoted with [].¶
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¶
A computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar ya = G.sample_scalar() and group element Ya = G.scalar_mult (ya,g). A then transmits Ya and optional associated data ADa to B.¶
B computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar yb = G.sample_scalar() and group element Yb = G.scalar_mult(yb,g). B sends Yb and optional associated data ADb to A.¶
B then computes K = G.scalar_mult_vfy(yb,Ya). B MUST abort if K=G.I. Otherwise B calculates ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K)||transcript(Ya,ADa,Yb,ADb)). B returns ISK and terminates.¶
Likewise upon reception of the message from B, A 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(Ya,ADa,Yb,ADb)). A returns ISK and terminates.¶
The session key ISK returned by A and B is identical if and only if the supplied input parameters PRS, CI and sid match on both sides and the transcript views of both parties match.¶
The different cipher suites for CPace defined in the upcoming sections share the following method for deterministically combining the individual strings PRS, CI, sid and the domain-separation identifier DSI to a generator string:¶
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).¶
len_zpad = MAX(0, s_in_bytes - len(prepend_len(PRS)) - len(prepend_len(G.DSI)) - 1)¶
The zero padding of length len_zpad is designed such that the encoding of DSI and PRS together with the zero padding field completely fills at least the first input block (of length s_in_bytes) of the hash. As a result for the common case of short PRS the number of bytes to hash becomes independent of the actual length of the password (PRS). (Code and test vectors are provided in the appendix.)¶
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.¶
In this section we consider the case of CPace when using the X25519 and X448 Diffie-Hellman functions from [RFC7748] operating on the Montgomery curves Curve25519 and Curve448 [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 Section 9.¶
For the group environment G_X25519 the following definitions apply:¶
G_X25519.field_size_bytes = 32¶
G_X25519.field_size_bits = 255¶
G_X25519.sample_scalar() = sample_random_bytes(G.field_size_bytes)¶
G_X25519.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X25519(y,g)¶
G_X25519.I = zero_bytes(G.field_size_bytes)¶
G_X25519.DSI = b"CPace255"¶
CPace cipher suites using G_X25519 MUST use a hash function producing at least H.b_max_in_bytes >= 32 bytes of output. It is RECOMMENDED to use G_X25519 in combination with SHA-512.¶
For X448 the following definitions apply:¶
G_X448.field_size_bytes = 56¶
G_X448.field_size_bits = 448¶
G_X448.sample_scalar() = sample_random_bytes(G.field_size_bytes)¶
G_X448.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X448(y,g)¶
G_X448.I = zero_bytes(G.field_size_bytes)¶
G_X448.DSI = b"CPace448"¶
CPace cipher suites using G_X448 MUST use a hash function producing at least H.b_max_in_bytes >= 56 bytes of output. It is RECOMMENDED to use G_X448 in combination with SHAKE-256.¶
For both G_X448 and G_X25519 the G.calculate_generator(H, PRS,sid,CI) function shall be implemented as follows.¶
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.¶
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.¶
This result is then considered as a field coordinate using the u = decodeUCoordinate(gen_str_hash, G.field_size_bits) function from [RFC7748] which we repeat in the appendix for convenience.¶
The result point g is then calculated as (g,v) = map_to_curve_elligator2(u) using the function from [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 [RFC9380] for convenience.¶
Code for the functions above is available in the appendix.¶
For single-coordinate Montgomery ladders on Montgomery curves, verification tests according to Section 8 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.¶
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.¶
Corresponding test vectors are provided in the appendix.¶
In this section we consider the case of CPace using the Ristretto255 and Decaf448 group abstractions [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.¶
For Ristretto255 the following definitions apply:¶
G_Ristretto255.DSI = b"CPaceRistretto255"¶
G_Ristretto255.field_size_bytes = 32¶
G_Ristretto255.group_size_bits = 252¶
G_Ristretto255.group_order = 2^252 + 27742317777372353535851937790883648493¶
CPace cipher suites using G_Ristretto255 MUST use a hash function producing at least H.b_max_in_bytes >= 64 bytes of output. It is RECOMMENDED to use G_Ristretto255 in combination with SHA-512.¶
For decaf448 the following definitions apply:¶
G_Decaf448.DSI = b"CPaceDecaf448"¶
G_Decaf448.field_size_bytes = 56¶
G_Decaf448.group_size_bits = 445¶
G_Decaf448.group_order = l = 2^446 - 1381806680989511535200738674851542 6880336692474882178609894547503885¶
CPace cipher suites using G_Decaf448 MUST use a hash function producing at least H.b_max_in_bytes >= 112 bytes of output. It is RECOMMENDED to use G_Decaf448 in combination with SHAKE-256.¶
For both abstractions the following definitions apply:¶
It is RECOMMENDED to implement G.sample_scalar() as follows.¶
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.¶
G.scalar_mult(y,_g) SHALL operate on a scalar y and a group element _g in the internal representation of the group abstraction environment. It returns the value Y = encode(y * (_g)), i.e. it returns a value using the public encoding.¶
G.I = is the public encoding representation of the identity element.¶
G.scalar_mult_vfy(y,X) operates on a value using the public encoding and a scalar and is implemented as follows. If the decode(X) function fails, it returns G.I. Otherwise it returns encode( y * decode(X) ).¶
The G.calculate_generator(H, PRS,sid,CI) function SHALL return a decoded point and SHALL BE implemented as follows.¶
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.¶
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.¶
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.¶
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).¶
For group abstractions verification tests according to Section 8 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.¶
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.¶
Elliptic curves in Short-Weierstrass form are considered in [IEEE1363]. [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.¶
The specification for the group environment objects specified in this section closely follow the ECKAS-DH1 method from [IEEE1363]. I.e. we use the same methods and encodings and protocol sub steps as employed in the TLS [RFC5246] [RFC8446] protocol family.¶
For CPace only the uncompressed full-coordinate encodings from [SEC1] (x and y coordinate) SHOULD be used. Commonly used curve groups are specified in [SEC2] and [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 [IEEE1363].¶
For deriving Diffie-Hellman shared secrets ECKAS-DH1 from [IEEE1363] specifies the use of an ECSVDP-DH method. We use ECSVDP-DH in combination with the identity map such that it either returns "error" or the x-coordinate of the Diffie-Hellman result point as shared secret in big endian format (fixed length output by FE2OSP without truncating leading zeros).¶
All the encode_to_curve methods specified in [RFC9380] are suitable for CPace. For Short-Weierstrass curves it is RECOMMENDED to use the non-uniform variant of the SSWU mapping primitive from [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.)¶
In this paragraph we use the following notation for defining the group object G for a selected curve and encode_to_curve method:¶
With G.group_order we denote the order of the elliptic curve which MUST BE a prime.¶
With is_valid(X) we denote a method which operates on an octet stream according to [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 [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.¶
With encode_to_curve(str,DST) we denote a mapping function from [RFC9380]. I.e. a function that maps octet string str to a point on the group using the domain separation tag DST. [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 [RFC9380].¶
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 [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_".¶
Using the above definitions, the CPace functions required for the group object G are defined as follows.¶
G.DST denotes the domain-separation tag value to use in conjunction with the encode_to_curve function from [RFC9380]. G.DST shall be obtained by concatenating G.DSI and b"_DST".¶
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).¶
G.calculate_generator(H, PRS,sid,CI) function SHALL be implemented as follows.¶
G.scalar_mult(s,X) is a function that operates on a scalar s and an input point X. The input X shall use the same encoding as produced by the G.calculate_generator method above. G.scalar_mult(s,X) SHALL return an encoding of either the point s*X or the point (-s)*X according to [SEC1]. Implementations SHOULD use the full-coordinate format without compression, as important protocols such as TLS 1.3 removed support for compression. Implementations of scalar_mult(s,X) MAY output either s*X or (-s)*X as both points s*X and (-s)*X have the same x-coordinate and result in the same Diffie-Hellman shared secrets K. (This allows implementations to opt for x-coordinate-only scalar multiplication algorithms.)¶
G.scalar_mult_vfy(s,X) merges verification of point X according to [IEEE1363] A.16.10. and the the ECSVDP-DH procedure from [IEEE1363]. It SHALL BE implemented as follows:¶
If is_valid(X) = False then G.scalar_mult_vfy(s,X) SHALL return "error" as specified in [IEEE1363] A.16.10 and 7.2.1.¶
Otherwise G.scalar_mult_vfy(s,X) SHALL return the result of the ECSVDP-DH procedure from [IEEE1363] (section 7.2.1). I.e. it shall either return "error" (in case that s*X is the neutral element) or the secret shared value "z" defined in [IEEE1363] (otherwise). "z" SHALL be encoded by using the big-endian encoding of the x-coordinate of the result point s*X according to [SEC1].¶
We represent the neutral element G.I by using the representation of the "error" result case from [IEEE1363] as used in the G.scalar_mult_vfy method above.¶
For Short-Weierstrass curves verification tests according to Section 8 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.¶
Any CPace implementation MUST be tested against invalid or weak point attacks. Implementation MUST be verified to abort upon conditions where G.scalar_mult_vfy functions outputs G.I. For testing an implementation it is RECOMMENDED to include weak or invalid point encodings within the messages of party A and B and introduce this in a protocol run. It SHALL be verified that the abort condition is properly handled.¶
Corresponding test vectors are given in the appendix for all recommended cipher suites.¶
A security proof of CPace is found in [AHH21]. This proof covers all recommended cipher suites included in this document. The security analysis in [BGHJ24] extends the analysis from [AHH21] by covering the case that no pre-agreed session identifier is available. [BGHJ24] also shows how a unique session id sid_output can be generated along with the protocol for applications that do not have a session identifier input available.¶
If unique strings identifying the protocol partners are included either as part of the channel identifier CI or the associated data fields ADa, ADb, then ISK will provide implicit authentication also regarding the party identities.¶
Incorporating party identifier strings is important for fending off relay attacks. Such attacks become relevant in a setting where several parties, say, A, B and C, share the same password PRS. An adversary might relay messages from an honest user A, who aims at interacting with user B, to a party C instead. If no party identifier strings are used and B and C share the same PRS value then A might be using CPace for establishing a common ISK key with C while assuming to interact with party B. Including and checking party identifiers can fend off such relay attacks.¶
The following guidance SHOULD be followed regarding party identifiers.¶
If an application layer has party identifiers available, it SHOULD integrate party identifiers in the CPace protocol run, either within CI or ADa/ADb.¶
The application SHOULD give preference to the option of integrating party identifiers in CI. This avoids the need of an explicit check for the identity strings.¶
Otherwise A SHOULD integrate its party identifiers in ADa and ADb, such that A integrates its identifier in ADa and B integrates its party identifier as part of ADb. In this case the application layer will have to add an explicit check for the identity string of the actual communication partner for fending off relay attacks.¶
CPace prepends the length of all variable-size input strings before hashing data. Prepending the length of all variable-size input strings results in a so-called prefix-free encoding of transcript strings, using terminology introduced in [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 [CDMP05].¶
A CPace implementation SHALL output ISK but MUST NOT expose K, because a leaked K may enable offline dictionary attack on the password, and a matching value for K does not provide authentication of ADa and ADb.¶
As noted already in Section 6 it is RECOMMENDED to process ISK by use of a suitable strong key derivation function KDF (such as defined in [RFC5869]) first, before using the key in a higher-level protocol.¶
In many applications it is advisable to add an explicit key confirmation round after the CPace protocol flow. However, as some applications might only require implicit authentication and as explicit authentication messages are already a built-in feature in many higher-level protocols (e.g. TLS 1.3), the CPace protocol described here does not mandate key confirmation.¶
Already without explicit key confirmation, CPace enjoys weak forward security under the sCDH and sSDH assumptions [AHH21]. With added explicit confirmation, CPace enjoys perfect forward security also under the strong sCDH and sSDH assumptions [AHH21].¶
Note that in [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.¶
When implementing explicit key confirmation, it is recommended to use an appropriate message-authentication code (MAC) such as HMAC [RFC2104] or CMAC [RFC4493] using a key mac_key derived from ISK.¶
One suitable option that works also in the parallel setting without message ordering is to proceed as follows.¶
First calculate mac_key as mac_key = H.hash(b"CPaceMac" || sid || ISK).¶
Then let each party send an authenticator tag calculated over the protocol message that it has sent previously. I.e. let party A calculate its authentication tag Ta as Ta = MAC(mac_key, lv_cat(Ya,ADa)) and let party B calculate its authentication tag Tb as Tb = MAC(mac_key, lv_cat(Yb,ADb)).¶
Let the receiving party check the remote authentication tag for the correct value and abort in case that it's incorrect.¶
When integrating CPace into a higher-level protocol such as TLS1.3 [RFC8446] it is recommended to use ISK as shared secret (which might otherwise be generated as part of a Diffie-Hellman key exchange output for other cipher suites).¶
Note that unlike the shared secret of a Diffie-Hellman protocol run, ISK will also provide mutual implicit authentication of the protocol partners. For providing explicit authentication, it is recommended to add a key confirmation round along the lines in Section 9.4, such as e.g. done in the "Finished" messages in TLS1.3 [RFC8446].¶
If an embedding protocol uses more than two messages (e.g. four message TLS1.3 [RFC8446] flows involving a hello-retry message and a repeated client-hello message) it is suggested that the CPace layer only considers the two messages used for the CPace run. I.e., it is suggested that authenticating the full message sequence involving also the additional messages that might precede the two CPace messages is done under the responsibility of the embedding application protocol. This could be done by integrating the full protocol transcript as part of a final explicit key confirmation round (as commonly done by TLS 1.3 as part of the "Finished" messages). Alternatively, information on communication rounds preceding the CPace flows can also be integrated as part of the CI field, as this will authenticate the information and will not require both communication partners to keep state information regarding preceding messages in memory until after the CPace run.¶
In case of TLS 1.3 [RFC8446] it is suggested to integrate Ya into the client-hello message and Yb into the server-hello message. Also party identifiers might best be added to the client-hello and server-hello messages as part of extension fields. It is recommended to use the full octet stream encoding of the client-hello message as parameter ADa. Likewise it is recommended to use the encoding of the server-hello message for the parameter ADb. This approach has the drawback that the public points Ya and Yb might show up redundantly duplicated in the hashing operation for CPace's transcript strings but has the advantage of simplicity and the advantage that all meta-information in the extension fields within the client- and server hello fields will always become authenticated as part of the ISK.¶
If CPace was run with an empty string sid available as input, both parties can produce a public session identifier string sid_output = H.hash(b"CPaceSidOutput" || transcript(Ya,ADa,Yb,ADb)) which will be unique for honest parties [BGHJ24].¶
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. [AHH21] demonstrated that non-uniform sampling did not negatively impact security for the case of Curve25519 and Curve448. This analysis however does not transfer to most curves in Short-Weierstrass form.¶
As a result, we recommend rejection sampling if G is as in Section 7.4. Alternatively an algorithm designed along the lines of the hash_to_field() function from [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.¶
The security of the algorithms used for the recommended cipher suites for the Montgomery curves Curve25519 and Curve448 in Section 7.2 rely on the following properties [AHH21]:¶
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.¶
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 [RFC7748]).¶
Both field order q and group order p MUST BE close to a power of two along the lines of [AHH21], Appendix E. Otherwise the simplified scalar sampling specified in Section 7.2 needs to be changed.¶
The representation of the neutral element G.I MUST BE the same for both, the curve and its twist.¶
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.¶
Algorithms for curves other than the ones recommended here can be based on the principles from Section 7.2 given that the above properties hold.¶
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 [AHH21].¶
If the higher-level protocol that integrates CPace is able to establish a unique sid identifier for the communication session, it is RECOMMENDED that this is passed to CPace as sid parameter. One suitable option for generating sid is concatenation of ephemeral random strings contributed by both parties.¶
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 [IEEE1363] describe curve operations with non-constant-time algorithms.¶
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.¶
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.¶
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 [AHH21]). These assumptions are not expected to hold any longer when large-scale quantum computers (LSQC) are available. Still, even in case that LSQC emerge, it is reasonable to assume that discrete-logarithm computations will remain costly. CPace with ephemeral pre-established session id values sid forces the adversary to solve one computational Diffie-Hellman problem per password guess [ES21]. If party identifiers are included as part of CI then the adversary is forced to solve one computational Diffie-Hellman problem per password guess and party identifier pair. For this reason it is RECOMMENDED to use the optional inputs sid if available in an application setting. For the same reason it is RECOMMENDED to integrate party identity strings A,B into CI.¶
In this sense, using the wording suggested by Steve Thomas on the CFRG mailing list, CPace is "quantum-annoying".¶
No IANA action is required.¶
The reference implementation that was used for deriving test vectors is available at [REFIMP]. The embedded base64-encoded test vectors will decode to JSON files having the test vector's octet strings encoded as base16 (i.e. hexadecimal) strings.¶
We would like to thank the participants on the CFRG list for comments and advice. Any comment and advice is appreciated.¶
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¶
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¶
#eyJwcmVwZW5kX2xlbihiJycpIjogIjAwIiwgImInMTIzNCciOiAiMzEzMjMzMzQiLC #AicHJlcGVuZF9sZW4oYicxMjM0JykiOiAiMDQzMTMyMzMzNCIsICJwcmVwZW5kX2xl #bihieXRlcyhyYW5nZSgxMjcpKSkiOiAiN0YwMDAxMDIwMzA0MDUwNjA3MDgwOTBBME #IwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGMjAyMTIyMjMy #NDI1MjYyNzI4MjkyQTJCMkMyRDJFMkYzMDMxMzIzMzM0MzUzNjM3MzgzOTNBM0IzQz #NEM0UzRjQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NEE0QjRDNEQ0RTRGNTA1MTUyNTM1NDU1 #NTY1NzU4NTk1QTVCNUM1RDVFNUY2MDYxNjI2MzY0NjU2NjY3Njg2OTZBNkI2QzZENk #U2RjcwNzE3MjczNzQ3NTc2Nzc3ODc5N0E3QjdDN0Q3RSIsICJwcmVwZW5kX2xlbihi #eXRlcyhyYW5nZSgxMjgpKSkiOiAiODAwMTAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQj #BDMEQwRTBGMTAxMTEyMTMxNDE1MTYxNzE4MTkxQTFCMUMxRDFFMUYyMDIxMjIyMzI0 #MjUyNjI3MjgyOTJBMkIyQzJEMkUyRjMwMzEzMjMzMzQzNTM2MzczODM5M0EzQjNDM0 #QzRTNGNDA0MTQyNDM0NDQ1NDY0NzQ4NDk0QTRCNEM0RDRFNEY1MDUxNTI1MzU0NTU1 #NjU3NTg1OTVBNUI1QzVENUU1RjYwNjE2MjYzNjQ2NTY2Njc2ODY5NkE2QjZDNkQ2RT #ZGNzA3MTcyNzM3NDc1NzY3Nzc4Nzk3QTdCN0M3RDdFN0YifQ==¶
def lv_cat(*args): result = b"" for arg in args: result += prepend_len(arg) return result¶
lv_cat(b"1234",b"5",b"",b"678"): (length: 12 bytes) 043132333401350003363738¶
#eyJiJzEyMzQnIjogIjMxMzIzMzM0IiwgImInNSciOiAiMzUiLCAiYic2NzgnIjogIj #M2MzczOCIsICJsdl9jYXQoYicxMjM0JyxiJzUnLGInJyxiJzY3OCcpIjogIjA0MzEz #MjMzMzQwMTM1MDAwMzM2MzczOCJ9¶
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)¶
For ordered concatenation lexiographical ordering of byte sequences is used:¶
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)¶
With the above definition of lexiographical ordering ordered concatenation is specified as follows.¶
def o_cat(bytes1,bytes2): if lexiographically_larger(bytes1,bytes2): return b"oc" + bytes1 + bytes2 else: return b"oc" + bytes2 + bytes1¶
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¶
#eyJiJ0FCQ0QnIjogIjQxNDI0MzQ0IiwgImInQkNEJyI6ICI0MjQzNDQiLCAiYidBQk #NERSciOiAiNDE0MjQzNDQ0NSIsICJvX2NhdChiJ0FCQ0QnLGInQkNEJykiOiAiNkY2 #MzQyNDM0NDQxNDI0MzQ0IiwgIm9fY2F0KGInQkNEJyxiJ0FCQ0RFJykiOiAiNkY2Mz #QyNDM0NDQxNDI0MzQ0NDUifQ==¶
def transcript_ir(Ya,ADa,Yb,ADb): result = lv_cat(Ya,ADa) + lv_cat(Yb,ADb) return result¶
transcript_ir(b"123", b"PartyA", b"234",b"PartyB"): (length: 22 bytes) 03313233065061727479410332333406506172747942 transcript_ir(b"3456",b"PartyA",b"2345",b"PartyB"): (length: 24 bytes) 043334353606506172747941043233343506506172747942¶
#eyJiJzEyMyciOiAiMzEzMjMzIiwgImInMjM0JyI6ICIzMjMzMzQiLCAiYidQYXJ0eU #EnIjogIjUwNjE3Mjc0Nzk0MSIsICJiJ1BhcnR5QiciOiAiNTA2MTcyNzQ3OTQyIiwg #ImInMzQ1NiciOiAiMzMzNDM1MzYiLCAiYicyMzQ1JyI6ICIzMjMzMzQzNSIsICJ0cm #Fuc2NyaXB0X2lyKGInMTIzJyxiJ1BhcnR5QScsYicyMzQnLGInUGFydHlCJykiOiAi #MDMzMTMyMzMwNjUwNjE3Mjc0Nzk0MTAzMzIzMzM0MDY1MDYxNzI3NDc5NDIiLCAidH #JhbnNjcmlwdF9pcihiJzM0NTYnLGInUGFydHlBJyxiJzIzNDUnLGInUGFydHlCJyki #OiAiMDQzMzM0MzUzNjA2NTA2MTcyNzQ3OTQxMDQzMjMzMzQzNTA2NTA2MTcyNzQ3OT #QyIn0=¶
def transcript_oc(Ya,ADa,Yb,ADb): result = o_cat(lv_cat(Ya,ADa),lv_cat(Yb,ADb)) return result¶
transcript_oc(b"123", b"PartyA", b"234",b"PartyB"): (length: 24 bytes) 6f6303323334065061727479420331323306506172747941 transcript_oc(b"3456",b"PartyA",b"2345",b"PartyB"): (length: 26 bytes) 6f63043334353606506172747941043233343506506172747942¶
#eyJiJzEyMyciOiAiMzEzMjMzIiwgImInMjM0JyI6ICIzMjMzMzQiLCAiYidQYXJ0eU #EnIjogIjUwNjE3Mjc0Nzk0MSIsICJiJ1BhcnR5QiciOiAiNTA2MTcyNzQ3OTQyIiwg #ImInMzQ1NiciOiAiMzMzNDM1MzYiLCAiYicyMzQ1JyI6ICIzMjMzMzQzNSIsICJ0cm #Fuc2NyaXB0X29jKGInMTIzJyxiJ1BhcnR5QScsYicyMzQnLGInUGFydHlCJykiOiAi #NkY2MzAzMzIzMzM0MDY1MDYxNzI3NDc5NDIwMzMxMzIzMzA2NTA2MTcyNzQ3OTQxIi #wgInRyYW5zY3JpcHRfb2MoYiczNDU2JyxiJ1BhcnR5QScsYicyMzQ1JyxiJ1BhcnR5 #QicpIjogIjZGNjMwNDMzMzQzNTM2MDY1MDYxNzI3NDc5NDEwNDMyMzMzNDM1MDY1MD #YxNzI3NDc5NDIifQ==¶
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)])¶
The Elligator 2 map requires a non-square field element Z which shall be calculated as follows.¶
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¶
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.¶
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.¶
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)¶
Inputs H = SHA-512 with input block size 128 bytes. PRS = b'Password' ; ZPAD length: 109 ; DSI = b'CPace255' CI = b'oc\x0bB_responder\x0bA_initiator' CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72 sid = 7e4b4791d6a8ef019b936c79fb7f2c57 Outputs generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes): (length: 172 bytes) 0843506163653235350850617373776f72646d000000000000000000 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001a6f630b425f726573706f6e 6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79 fb7f2c57 hash generator string: (length: 32 bytes) 92806dc608984dbf4e4aae478c6ec453ae979cc01ecc1a2a7cf49f5c ee56551b decoded field element of 255 bits: (length: 32 bytes) 92806dc608984dbf4e4aae478c6ec453ae979cc01ecc1a2a7cf49f5c ee56551b generator g: (length: 32 bytes) 64e8099e3ea682cfdc5cb665c057ebb514d06bf23ebc9f743b51b822 42327074¶
#eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDksICJEU0kiOiAiNDM1MDYx #NjM2NTMyMzUzNSIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyME #I0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3RTRCNDc5MUQ2QThFRjAx #OUI5MzZDNzlGQjdGMkM1NyIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSS #xzaWQsSC5zX2luX2J5dGVzKSI6ICIwODQzNTA2MTYzNjUzMjM1MzUwODUwNjE3Mzcz #Nzc2RjcyNjQ2RDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUE2RjYzMEI0MjVGNzI2NTczNz #A2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMTA3RTRCNDc5MUQ2QThF #RjAxOUI5MzZDNzlGQjdGMkM1NyIsICJoYXNoIGdlbmVyYXRvciBzdHJpbmciOiAiOT #I4MDZEQzYwODk4NERCRjRFNEFBRTQ3OEM2RUM0NTNBRTk3OUNDMDFFQ0MxQTJBN0NG #NDlGNUNFRTU2NTUxQiIsICJkZWNvZGVkIGZpZWxkIGVsZW1lbnQgb2YgMjU1IGJpdH #MiOiAiOTI4MDZEQzYwODk4NERCRjRFNEFBRTQ3OEM2RUM0NTNBRTk3OUNDMDFFQ0Mx #QTJBN0NGNDlGNUNFRTU2NTUxQiIsICJnZW5lcmF0b3IgZyI6ICI2NEU4MDk5RTNFQT #Y4MkNGREM1Q0I2NjVDMDU3RUJCNTE0RDA2QkYyM0VCQzlGNzQzQjUxQjgyMjQyMzI3 #MDc0In0=¶
Inputs ADa = b'ADa' ya (little endian): (length: 32 bytes) 21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971 53044080 Outputs Ya: (length: 32 bytes) 1b02dad6dbd29a07b6d28c9e04cb2f184f0734350e32bb7e62ff9dbc fdb63d15¶
Inputs ADb = b'ADb' yb (little endian): (length: 32 bytes) 848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19 c51ac40a Outputs Yb: (length: 32 bytes) 20cda5955f82c4931545bcbf40758ce1010d7db4db2a907013d79c7a 8fcf957f¶
scalar_mult_vfy(ya,Yb): (length: 32 bytes) f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f950c970 3df7297a scalar_mult_vfy(yb,Ya): (length: 32 bytes) f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f950c970 3df7297a¶
transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes) 201b02dad6dbd29a07b6d28c9e04cb2f184f0734350e32bb7e62ff9d bcfdb63d15034144612020cda5955f82c4931545bcbf40758ce1010d 7db4db2a907013d79c7a8fcf957f03414462 DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes) 43506163653235355f49534b lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb): (length: 137 bytes) 0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f 2c5720f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f9 50c9703df7297a201b02dad6dbd29a07b6d28c9e04cb2f184f073435 0e32bb7e62ff9dbcfdb63d15034144612020cda5955f82c4931545bc bf40758ce1010d7db4db2a907013d79c7a8fcf957f03414462 ISK result: (length: 64 bytes) a051ee5ee2499d16da3f69f430218b8ea94a18a45b67f9e86495b382 c33d14a5c38cecc0cc834f960e39e0d1bf7d76b9ef5d54eecc5e0f38 6c97ad12da8c3d5f¶
transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes) 6f632020cda5955f82c4931545bcbf40758ce1010d7db4db2a907013 d79c7a8fcf957f03414462201b02dad6dbd29a07b6d28c9e04cb2f18 4f0734350e32bb7e62ff9dbcfdb63d1503414461 DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes) 43506163653235355f49534b lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb): (length: 139 bytes) 0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f 2c5720f97fdfcfff1c983ed6283856a401de3191ca919902b323c5f9 50c9703df7297a6f632020cda5955f82c4931545bcbf40758ce1010d 7db4db2a907013d79c7a8fcf957f03414462201b02dad6dbd29a07b6 d28c9e04cb2f184f0734350e32bb7e62ff9dbcfdb63d1503414461 ISK result: (length: 64 bytes) 5cc27e49679423f81a37d7521d9fb1327c840d2ea4a1543652e7de5c abb89ebad27d24761b3288a3fd5764b441ecb78d30abc26161ff45ea 297bb311dde04727¶
H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)): (length: 64 bytes) f7ae11ac3ee85c3c42d8bd51ba823fbe17158f43d34a1296f1cb2567 bcc71dc8b201a134b566b468aad8fd04f02f96e3caf9d5601f7ed760 a0a951a5a861b5e7 H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)): (length: 64 bytes) a38389e34fa492788c1df43b06b427710491174e53c33b01362a490d 116fe1b7e870aa6e2a7fc018725e3b7f969f7508042e44cd3863f39a a75026a190d1902b¶
const unsigned char tc_PRS[] = { 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64, }; const unsigned char tc_CI[] = { 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64, 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74, 0x6f,0x72, }; const unsigned char tc_sid[] = { 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79, 0xfb,0x7f,0x2c,0x57, }; const unsigned char tc_g[] = { 0x64,0xe8,0x09,0x9e,0x3e,0xa6,0x82,0xcf,0xdc,0x5c,0xb6,0x65, 0xc0,0x57,0xeb,0xb5,0x14,0xd0,0x6b,0xf2,0x3e,0xbc,0x9f,0x74, 0x3b,0x51,0xb8,0x22,0x42,0x32,0x70,0x74, }; const unsigned char tc_ya[] = { 0x21,0xb4,0xf4,0xbd,0x9e,0x64,0xed,0x35,0x5c,0x3e,0xb6,0x76, 0xa2,0x8e,0xbe,0xda,0xf6,0xd8,0xf1,0x7b,0xdc,0x36,0x59,0x95, 0xb3,0x19,0x09,0x71,0x53,0x04,0x40,0x80, }; const unsigned char tc_ADa[] = { 0x41,0x44,0x61, }; const unsigned char tc_Ya[] = { 0x1b,0x02,0xda,0xd6,0xdb,0xd2,0x9a,0x07,0xb6,0xd2,0x8c,0x9e, 0x04,0xcb,0x2f,0x18,0x4f,0x07,0x34,0x35,0x0e,0x32,0xbb,0x7e, 0x62,0xff,0x9d,0xbc,0xfd,0xb6,0x3d,0x15, }; const unsigned char tc_yb[] = { 0x84,0x8b,0x07,0x79,0xff,0x41,0x5f,0x0a,0xf4,0xea,0x14,0xdf, 0x9d,0xd1,0xd3,0xc2,0x9a,0xc4,0x1d,0x83,0x6c,0x78,0x08,0x89, 0x6c,0x4e,0xba,0x19,0xc5,0x1a,0xc4,0x0a, }; const unsigned char tc_ADb[] = { 0x41,0x44,0x62, }; const unsigned char tc_Yb[] = { 0x20,0xcd,0xa5,0x95,0x5f,0x82,0xc4,0x93,0x15,0x45,0xbc,0xbf, 0x40,0x75,0x8c,0xe1,0x01,0x0d,0x7d,0xb4,0xdb,0x2a,0x90,0x70, 0x13,0xd7,0x9c,0x7a,0x8f,0xcf,0x95,0x7f, }; const unsigned char tc_K[] = { 0xf9,0x7f,0xdf,0xcf,0xff,0x1c,0x98,0x3e,0xd6,0x28,0x38,0x56, 0xa4,0x01,0xde,0x31,0x91,0xca,0x91,0x99,0x02,0xb3,0x23,0xc5, 0xf9,0x50,0xc9,0x70,0x3d,0xf7,0x29,0x7a, }; const unsigned char tc_ISK_IR[] = { 0xa0,0x51,0xee,0x5e,0xe2,0x49,0x9d,0x16,0xda,0x3f,0x69,0xf4, 0x30,0x21,0x8b,0x8e,0xa9,0x4a,0x18,0xa4,0x5b,0x67,0xf9,0xe8, 0x64,0x95,0xb3,0x82,0xc3,0x3d,0x14,0xa5,0xc3,0x8c,0xec,0xc0, 0xcc,0x83,0x4f,0x96,0x0e,0x39,0xe0,0xd1,0xbf,0x7d,0x76,0xb9, 0xef,0x5d,0x54,0xee,0xcc,0x5e,0x0f,0x38,0x6c,0x97,0xad,0x12, 0xda,0x8c,0x3d,0x5f, }; const unsigned char tc_ISK_SY[] = { 0x5c,0xc2,0x7e,0x49,0x67,0x94,0x23,0xf8,0x1a,0x37,0xd7,0x52, 0x1d,0x9f,0xb1,0x32,0x7c,0x84,0x0d,0x2e,0xa4,0xa1,0x54,0x36, 0x52,0xe7,0xde,0x5c,0xab,0xb8,0x9e,0xba,0xd2,0x7d,0x24,0x76, 0x1b,0x32,0x88,0xa3,0xfd,0x57,0x64,0xb4,0x41,0xec,0xb7,0x8d, 0x30,0xab,0xc2,0x61,0x61,0xff,0x45,0xea,0x29,0x7b,0xb3,0x11, 0xdd,0xe0,0x47,0x27, }; const unsigned char tc_ISK_SY[] = { 0x5c,0xc2,0x7e,0x49,0x67,0x94,0x23,0xf8,0x1a,0x37,0xd7,0x52, 0x1d,0x9f,0xb1,0x32,0x7c,0x84,0x0d,0x2e,0xa4,0xa1,0x54,0x36, 0x52,0xe7,0xde,0x5c,0xab,0xb8,0x9e,0xba,0xd2,0x7d,0x24,0x76, 0x1b,0x32,0x88,0xa3,0xfd,0x57,0x64,0xb4,0x41,0xec,0xb7,0x8d, 0x30,0xab,0xc2,0x61,0x61,0xff,0x45,0xea,0x29,0x7b,0xb3,0x11, 0xdd,0xe0,0x47,0x27, }; const unsigned char tc_sid_out_ir[] = { 0xf7,0xae,0x11,0xac,0x3e,0xe8,0x5c,0x3c,0x42,0xd8,0xbd,0x51, 0xba,0x82,0x3f,0xbe,0x17,0x15,0x8f,0x43,0xd3,0x4a,0x12,0x96, 0xf1,0xcb,0x25,0x67,0xbc,0xc7,0x1d,0xc8,0xb2,0x01,0xa1,0x34, 0xb5,0x66,0xb4,0x68,0xaa,0xd8,0xfd,0x04,0xf0,0x2f,0x96,0xe3, 0xca,0xf9,0xd5,0x60,0x1f,0x7e,0xd7,0x60,0xa0,0xa9,0x51,0xa5, 0xa8,0x61,0xb5,0xe7, }; const unsigned char tc_sid_out_oc[] = { 0xa3,0x83,0x89,0xe3,0x4f,0xa4,0x92,0x78,0x8c,0x1d,0xf4,0x3b, 0x06,0xb4,0x27,0x71,0x04,0x91,0x17,0x4e,0x53,0xc3,0x3b,0x01, 0x36,0x2a,0x49,0x0d,0x11,0x6f,0xe1,0xb7,0xe8,0x70,0xaa,0x6e, 0x2a,0x7f,0xc0,0x18,0x72,0x5e,0x3b,0x7f,0x96,0x9f,0x75,0x08, 0x04,0x2e,0x44,0xcd,0x38,0x63,0xf3,0x9a,0xa7,0x50,0x26,0xa1, 0x90,0xd1,0x90,0x2b, };¶
#eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjY0RTgwOTlFM0 #VBNjgyQ0ZEQzVDQjY2NUMwNTdFQkI1MTREMDZCRjIzRUJDOUY3NDNCNTFCODIyNDIz #MjcwNzQiLCAieWEiOiAiMjFCNEY0QkQ5RTY0RUQzNTVDM0VCNjc2QTI4RUJFREFGNk #Q4RjE3QkRDMzY1OTk1QjMxOTA5NzE1MzA0NDA4MCIsICJBRGEiOiAiNDE0NDYxIiwg #IllhIjogIjFCMDJEQUQ2REJEMjlBMDdCNkQyOEM5RTA0Q0IyRjE4NEYwNzM0MzUwRT #MyQkI3RTYyRkY5REJDRkRCNjNEMTUiLCAieWIiOiAiODQ4QjA3NzlGRjQxNUYwQUY0 #RUExNERGOUREMUQzQzI5QUM0MUQ4MzZDNzgwODg5NkM0RUJBMTlDNTFBQzQwQSIsIC #JBRGIiOiAiNDE0NDYyIiwgIlliIjogIjIwQ0RBNTk1NUY4MkM0OTMxNTQ1QkNCRjQw #NzU4Q0UxMDEwRDdEQjREQjJBOTA3MDEzRDc5QzdBOEZDRjk1N0YiLCAiSyI6ICJGOT #dGREZDRkZGMUM5ODNFRDYyODM4NTZBNDAxREUzMTkxQ0E5MTk5MDJCMzIzQzVGOTUw #Qzk3MDNERjcyOTdBIiwgIklTS19JUiI6ICJBMDUxRUU1RUUyNDk5RDE2REEzRjY5Rj #QzMDIxOEI4RUE5NEExOEE0NUI2N0Y5RTg2NDk1QjM4MkMzM0QxNEE1QzM4Q0VDQzBD #QzgzNEY5NjBFMzlFMEQxQkY3RDc2QjlFRjVENTRFRUNDNUUwRjM4NkM5N0FEMTJEQT #hDM0Q1RiIsICJJU0tfU1kiOiAiNUNDMjdFNDk2Nzk0MjNGODFBMzdENzUyMUQ5RkIx #MzI3Qzg0MEQyRUE0QTE1NDM2NTJFN0RFNUNBQkI4OUVCQUQyN0QyNDc2MUIzMjg4QT #NGRDU3NjRCNDQxRUNCNzhEMzBBQkMyNjE2MUZGNDVFQTI5N0JCMzExRERFMDQ3Mjci #LCAic2lkX291dHB1dF9pciI6ICJGN0FFMTFBQzNFRTg1QzNDNDJEOEJENTFCQTgyM0 #ZCRTE3MTU4RjQzRDM0QTEyOTZGMUNCMjU2N0JDQzcxREM4QjIwMUExMzRCNTY2QjQ2 #OEFBRDhGRDA0RjAyRjk2RTNDQUY5RDU2MDFGN0VENzYwQTBBOTUxQTVBODYxQjVFNy #IsICJzaWRfb3V0cHV0X29jIjogIkEzODM4OUUzNEZBNDkyNzg4QzFERjQzQjA2QjQy #NzcxMDQ5MTE3NEU1M0MzM0IwMTM2MkE0OTBEMTE2RkUxQjdFODcwQUE2RTJBN0ZDMD #E4NzI1RTNCN0Y5NjlGNzUwODA0MkU0NENEMzg2M0YzOUFBNzUwMjZBMTkwRDE5MDJC #In0=¶
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.).¶
u0: 0000000000000000000000000000000000000000000000000000000000000000 u1: 0100000000000000000000000000000000000000000000000000000000000000 u2: ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f u3: e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800 u4: 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157 u5: edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f u6: daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff u7: eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f u8: dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff u9: d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ua: cdeb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880 ub: 4c9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7 u0 ... ub MUST be verified to produce the correct results q0 ... qb: Additionally, u0,u1,u2,u3,u4,u5 and u7 MUST trigger the abort case when included in message from A or B. s = af46e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449aff qN = G_X25519.scalar_mult_vfy(s, uX) q0: 0000000000000000000000000000000000000000000000000000000000000000 q1: 0000000000000000000000000000000000000000000000000000000000000000 q2: 0000000000000000000000000000000000000000000000000000000000000000 q3: 0000000000000000000000000000000000000000000000000000000000000000 q4: 0000000000000000000000000000000000000000000000000000000000000000 q5: 0000000000000000000000000000000000000000000000000000000000000000 q6: d8e2c776bbacd510d09fd9278b7edcd25fc5ae9adfba3b6e040e8d3b71b21806 q7: 0000000000000000000000000000000000000000000000000000000000000000 q8: c85c655ebe8be44ba9c0ffde69f2fe10194458d137f09bbff725ce58803cdb38 q9: db64dafa9b8fdd136914e61461935fe92aa372cb056314e1231bc4ec12417456 qa: e062dcd5376d58297be2618c7498f55baa07d7e03184e8aada20bca28888bf7a qb: 993c6ad11c4c29da9a56f7691fd0ff8d732e49de6250b6c2e80003ff4629a175¶
#eyJJbnZhbGlkIFkwIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMSI6ICIw #MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwIiwgIkludmFsaWQgWTIiOiAiRUNGRkZGRkZGRkZGRkZGRkZG #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsIC #JJbnZhbGlkIFkzIjogIkUwRUI3QTdDM0I0MUI4QUUxNjU2RTNGQUYxOUZDNDZBREEw #OThERUI5QzMyQjFGRDg2NjIwNTE2NUY0OUI4MDAiLCAiSW52YWxpZCBZNCI6ICI1Rj #lDOTVCQ0EzNTA4QzI0QjFEMEIxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIy #NEVEREQwOUYxMTU3IiwgIkludmFsaWQgWTUiOiAiRURGRkZGRkZGRkZGRkZGRkZGRk #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsICJJ #bnZhbGlkIFk2IjogIkRBRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNyI6ICJFRUZG #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk #ZGRkZGRkZGRjdGIiwgIkludmFsaWQgWTgiOiAiREJGRkZGRkZGRkZGRkZGRkZGRkZG #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbn #ZhbGlkIFk5IjogIkQ5RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZMTAiOiAiQ0RFQj #dBN0MzQjQxQjhBRTE2NTZFM0ZBRjE5RkM0NkFEQTA5OERFQjlDMzJCMUZEODY2MjA1 #MTY1RjQ5Qjg4MCIsICJJbnZhbGlkIFkxMSI6ICI0QzlDOTVCQ0EzNTA4QzI0QjFEME #IxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIyNEVEREQwOUYxMUQ3In0=¶
Inputs H = SHAKE-256 with input block size 136 bytes. PRS = b'Password' ; ZPAD length: 117 ; DSI = b'CPace448' CI = b'oc\x0bB_responder\x0bA_initiator' CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72 sid = 5223e0cdc45d6575668d64c552004124 Outputs generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes): (length: 180 bytes) 0843506163653434380850617373776f726475000000000000000000 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000001a6f630b 425f726573706f6e6465720b415f696e69746961746f72105223e0cd c45d6575668d64c552004124 hash generator string: (length: 56 bytes) 98b713f84529194d719a7d86cb0f504b8afeb05354d68747e18b2e7c c8b6da526085e4263bd8bea7d69e479ebad09e30ae062e5d089da7f3 decoded field element of 448 bits: (length: 56 bytes) 98b713f84529194d719a7d86cb0f504b8afeb05354d68747e18b2e7c c8b6da526085e4263bd8bea7d69e479ebad09e30ae062e5d089da7f3 generator g: (length: 56 bytes) e293b7ccf61ca7eb928a26391cf38b660f874a001fdf0bf3a91fd182 f2b6d83e61a9377ede127eba7e0d4c08592eaff33d4aa705d6ce54bb¶
#eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExNywgIkRTSSI6ICI0MzUw #NjE2MzY1MzQzNDM4IiwgIkNJIjogIjZGNjMwQjQyNUY3MjY1NzM3MDZGNkU2NDY1Nz #IwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIiLCAic2lkIjogIjUyMjNFMENEQzQ1RDY1 #NzU2NjhENjRDNTUyMDA0MTI0IiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0ksUFJTLE #NJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjA4NDM1MDYxNjM2NTM0MzQzODA4NTA2MTcz #NzM3NzZGNzI2NDc1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMU #E2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2 #RjcyMTA1MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJoYXNoIGdlbm #VyYXRvciBzdHJpbmciOiAiOThCNzEzRjg0NTI5MTk0RDcxOUE3RDg2Q0IwRjUwNEI4 #QUZFQjA1MzU0RDY4NzQ3RTE4QjJFN0NDOEI2REE1MjYwODVFNDI2M0JEOEJFQTdENj #lFNDc5RUJBRDA5RTMwQUUwNjJFNUQwODlEQTdGMyIsICJkZWNvZGVkIGZpZWxkIGVs #ZW1lbnQgb2YgNDQ4IGJpdHMiOiAiOThCNzEzRjg0NTI5MTk0RDcxOUE3RDg2Q0IwRj #UwNEI4QUZFQjA1MzU0RDY4NzQ3RTE4QjJFN0NDOEI2REE1MjYwODVFNDI2M0JEOEJF #QTdENjlFNDc5RUJBRDA5RTMwQUUwNjJFNUQwODlEQTdGMyIsICJnZW5lcmF0b3IgZy #I6ICJFMjkzQjdDQ0Y2MUNBN0VCOTI4QTI2MzkxQ0YzOEI2NjBGODc0QTAwMUZERjBC #RjNBOTFGRDE4MkYyQjZEODNFNjFBOTM3N0VERTEyN0VCQTdFMEQ0QzA4NTkyRUFGRj #MzRDRBQTcwNUQ2Q0U1NEJCIn0=¶
Inputs ADa = b'ADa' ya (little endian): (length: 56 bytes) 21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971 53044080516bd083bfcce66121a3072646994c8430cc382b8dc543e8 Outputs Ya: (length: 56 bytes) 7f645772cc209bf9fd9d76dbb10283bea71b12235e3bb21878d5e56a 70506e165743a632de98eca9932c5d2efe36500a59b2fdaed0d8a148¶
Inputs ADb = b'ADb' yb (little endian): (length: 56 bytes) 848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19 c51ac40a439caf5e61ec88c307c7d619195229412eaa73fb2a5ea20d Outputs Yb: (length: 56 bytes) a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e2c6ee95844de f2692be77646b20d3b429f8da00d21433ee0891c667658d8d0c48e38¶
scalar_mult_vfy(ya,Yb): (length: 56 bytes) db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbeee5bb2 d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2cede6135a scalar_mult_vfy(yb,Ya): (length: 56 bytes) db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbeee5bb2 d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2cede6135a¶
transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes) 387f645772cc209bf9fd9d76dbb10283bea71b12235e3bb21878d5e5 6a70506e165743a632de98eca9932c5d2efe36500a59b2fdaed0d8a1 480341446138a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e 2c6ee95844def2692be77646b20d3b429f8da00d21433ee0891c6676 58d8d0c48e3803414462 DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes) 43506163653434385f49534b lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb): (length: 209 bytes) 0c43506163653434385f49534b105223e0cdc45d6575668d64c55200 412438db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbe ee5bb2d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2ced e6135a387f645772cc209bf9fd9d76dbb10283bea71b12235e3bb218 78d5e56a70506e165743a632de98eca9932c5d2efe36500a59b2fdae d0d8a1480341446138a4690a0750c42b288ddd0ba08e3f4902dfe70b ae5c9e2c6ee95844def2692be77646b20d3b429f8da00d21433ee089 1c667658d8d0c48e3803414462 ISK result: (length: 64 bytes) 599892a2078a8c988181625e1e5e5f7a6163f7d72f21b93ebefba0f1 7ff7ea3aa0594bd569cf74264157b3c0087bdccf2f59c77156628487 f5ca1645b8e9d05b¶
transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes) 6f6338a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e2c6ee9 5844def2692be77646b20d3b429f8da00d21433ee0891c667658d8d0 c48e3803414462387f645772cc209bf9fd9d76dbb10283bea71b1223 5e3bb21878d5e56a70506e165743a632de98eca9932c5d2efe36500a 59b2fdaed0d8a14803414461 DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes) 43506163653434385f49534b lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb): (length: 211 bytes) 0c43506163653434385f49534b105223e0cdc45d6575668d64c55200 412438db3fff9da59576715b04d4df8dc8d18db2430e57bbed337dbe ee5bb2d6ab6ceddc9c75c5c0b17fad7eb724daa12f8f1903dd6c2ced e6135a6f6338a4690a0750c42b288ddd0ba08e3f4902dfe70bae5c9e 2c6ee95844def2692be77646b20d3b429f8da00d21433ee0891c6676 58d8d0c48e3803414462387f645772cc209bf9fd9d76dbb10283bea7 1b12235e3bb21878d5e56a70506e165743a632de98eca9932c5d2efe 36500a59b2fdaed0d8a14803414461 ISK result: (length: 64 bytes) 3ac73f03030296aa591f01326b18afa47e1189129cd06ae8dfb05e6e b1310cde948b59eef0755365c06a339266afe594948c56a538d98a65 767113938a9a78d8¶
H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)): (length: 64 bytes) 00a2333a79481abe71efd6594d7bbaac55c808482e869c9b65c4b53d 7100d3da8f3cabd59fa0c1f22d6d2f9ac0c093962292798fca2c0b93 268974cad75d575a H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)): (length: 64 bytes) a1ce90537a8d53b06d77e79fe719461cc5ed8300d21d1866a59f9638 601833f57a8b5e88db9a52abfa1b4e8a651a400bc9205082aad81eb3 11c44373b9a19eff¶
const unsigned char tc_PRS[] = { 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64, }; const unsigned char tc_CI[] = { 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64, 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74, 0x6f,0x72, }; const unsigned char tc_sid[] = { 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5, 0x52,0x00,0x41,0x24, }; const unsigned char tc_g[] = { 0xe2,0x93,0xb7,0xcc,0xf6,0x1c,0xa7,0xeb,0x92,0x8a,0x26,0x39, 0x1c,0xf3,0x8b,0x66,0x0f,0x87,0x4a,0x00,0x1f,0xdf,0x0b,0xf3, 0xa9,0x1f,0xd1,0x82,0xf2,0xb6,0xd8,0x3e,0x61,0xa9,0x37,0x7e, 0xde,0x12,0x7e,0xba,0x7e,0x0d,0x4c,0x08,0x59,0x2e,0xaf,0xf3, 0x3d,0x4a,0xa7,0x05,0xd6,0xce,0x54,0xbb, }; const unsigned char tc_ya[] = { 0x21,0xb4,0xf4,0xbd,0x9e,0x64,0xed,0x35,0x5c,0x3e,0xb6,0x76, 0xa2,0x8e,0xbe,0xda,0xf6,0xd8,0xf1,0x7b,0xdc,0x36,0x59,0x95, 0xb3,0x19,0x09,0x71,0x53,0x04,0x40,0x80,0x51,0x6b,0xd0,0x83, 0xbf,0xcc,0xe6,0x61,0x21,0xa3,0x07,0x26,0x46,0x99,0x4c,0x84, 0x30,0xcc,0x38,0x2b,0x8d,0xc5,0x43,0xe8, }; const unsigned char tc_ADa[] = { 0x41,0x44,0x61, }; const unsigned char tc_Ya[] = { 0x7f,0x64,0x57,0x72,0xcc,0x20,0x9b,0xf9,0xfd,0x9d,0x76,0xdb, 0xb1,0x02,0x83,0xbe,0xa7,0x1b,0x12,0x23,0x5e,0x3b,0xb2,0x18, 0x78,0xd5,0xe5,0x6a,0x70,0x50,0x6e,0x16,0x57,0x43,0xa6,0x32, 0xde,0x98,0xec,0xa9,0x93,0x2c,0x5d,0x2e,0xfe,0x36,0x50,0x0a, 0x59,0xb2,0xfd,0xae,0xd0,0xd8,0xa1,0x48, }; const unsigned char tc_yb[] = { 0x84,0x8b,0x07,0x79,0xff,0x41,0x5f,0x0a,0xf4,0xea,0x14,0xdf, 0x9d,0xd1,0xd3,0xc2,0x9a,0xc4,0x1d,0x83,0x6c,0x78,0x08,0x89, 0x6c,0x4e,0xba,0x19,0xc5,0x1a,0xc4,0x0a,0x43,0x9c,0xaf,0x5e, 0x61,0xec,0x88,0xc3,0x07,0xc7,0xd6,0x19,0x19,0x52,0x29,0x41, 0x2e,0xaa,0x73,0xfb,0x2a,0x5e,0xa2,0x0d, }; const unsigned char tc_ADb[] = { 0x41,0x44,0x62, }; const unsigned char tc_Yb[] = { 0xa4,0x69,0x0a,0x07,0x50,0xc4,0x2b,0x28,0x8d,0xdd,0x0b,0xa0, 0x8e,0x3f,0x49,0x02,0xdf,0xe7,0x0b,0xae,0x5c,0x9e,0x2c,0x6e, 0xe9,0x58,0x44,0xde,0xf2,0x69,0x2b,0xe7,0x76,0x46,0xb2,0x0d, 0x3b,0x42,0x9f,0x8d,0xa0,0x0d,0x21,0x43,0x3e,0xe0,0x89,0x1c, 0x66,0x76,0x58,0xd8,0xd0,0xc4,0x8e,0x38, }; const unsigned char tc_K[] = { 0xdb,0x3f,0xff,0x9d,0xa5,0x95,0x76,0x71,0x5b,0x04,0xd4,0xdf, 0x8d,0xc8,0xd1,0x8d,0xb2,0x43,0x0e,0x57,0xbb,0xed,0x33,0x7d, 0xbe,0xee,0x5b,0xb2,0xd6,0xab,0x6c,0xed,0xdc,0x9c,0x75,0xc5, 0xc0,0xb1,0x7f,0xad,0x7e,0xb7,0x24,0xda,0xa1,0x2f,0x8f,0x19, 0x03,0xdd,0x6c,0x2c,0xed,0xe6,0x13,0x5a, }; const unsigned char tc_ISK_IR[] = { 0x59,0x98,0x92,0xa2,0x07,0x8a,0x8c,0x98,0x81,0x81,0x62,0x5e, 0x1e,0x5e,0x5f,0x7a,0x61,0x63,0xf7,0xd7,0x2f,0x21,0xb9,0x3e, 0xbe,0xfb,0xa0,0xf1,0x7f,0xf7,0xea,0x3a,0xa0,0x59,0x4b,0xd5, 0x69,0xcf,0x74,0x26,0x41,0x57,0xb3,0xc0,0x08,0x7b,0xdc,0xcf, 0x2f,0x59,0xc7,0x71,0x56,0x62,0x84,0x87,0xf5,0xca,0x16,0x45, 0xb8,0xe9,0xd0,0x5b, }; const unsigned char tc_ISK_SY[] = { 0x3a,0xc7,0x3f,0x03,0x03,0x02,0x96,0xaa,0x59,0x1f,0x01,0x32, 0x6b,0x18,0xaf,0xa4,0x7e,0x11,0x89,0x12,0x9c,0xd0,0x6a,0xe8, 0xdf,0xb0,0x5e,0x6e,0xb1,0x31,0x0c,0xde,0x94,0x8b,0x59,0xee, 0xf0,0x75,0x53,0x65,0xc0,0x6a,0x33,0x92,0x66,0xaf,0xe5,0x94, 0x94,0x8c,0x56,0xa5,0x38,0xd9,0x8a,0x65,0x76,0x71,0x13,0x93, 0x8a,0x9a,0x78,0xd8, }; const unsigned char tc_ISK_SY[] = { 0x3a,0xc7,0x3f,0x03,0x03,0x02,0x96,0xaa,0x59,0x1f,0x01,0x32, 0x6b,0x18,0xaf,0xa4,0x7e,0x11,0x89,0x12,0x9c,0xd0,0x6a,0xe8, 0xdf,0xb0,0x5e,0x6e,0xb1,0x31,0x0c,0xde,0x94,0x8b,0x59,0xee, 0xf0,0x75,0x53,0x65,0xc0,0x6a,0x33,0x92,0x66,0xaf,0xe5,0x94, 0x94,0x8c,0x56,0xa5,0x38,0xd9,0x8a,0x65,0x76,0x71,0x13,0x93, 0x8a,0x9a,0x78,0xd8, }; const unsigned char tc_sid_out_ir[] = { 0x00,0xa2,0x33,0x3a,0x79,0x48,0x1a,0xbe,0x71,0xef,0xd6,0x59, 0x4d,0x7b,0xba,0xac,0x55,0xc8,0x08,0x48,0x2e,0x86,0x9c,0x9b, 0x65,0xc4,0xb5,0x3d,0x71,0x00,0xd3,0xda,0x8f,0x3c,0xab,0xd5, 0x9f,0xa0,0xc1,0xf2,0x2d,0x6d,0x2f,0x9a,0xc0,0xc0,0x93,0x96, 0x22,0x92,0x79,0x8f,0xca,0x2c,0x0b,0x93,0x26,0x89,0x74,0xca, 0xd7,0x5d,0x57,0x5a, }; const unsigned char tc_sid_out_oc[] = { 0xa1,0xce,0x90,0x53,0x7a,0x8d,0x53,0xb0,0x6d,0x77,0xe7,0x9f, 0xe7,0x19,0x46,0x1c,0xc5,0xed,0x83,0x00,0xd2,0x1d,0x18,0x66, 0xa5,0x9f,0x96,0x38,0x60,0x18,0x33,0xf5,0x7a,0x8b,0x5e,0x88, 0xdb,0x9a,0x52,0xab,0xfa,0x1b,0x4e,0x8a,0x65,0x1a,0x40,0x0b, 0xc9,0x20,0x50,0x82,0xaa,0xd8,0x1e,0xb3,0x11,0xc4,0x43,0x73, 0xb9,0xa1,0x9e,0xff, };¶
#eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1 #MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIkUyOTNCN0NDRj #YxQ0E3RUI5MjhBMjYzOTFDRjM4QjY2MEY4NzRBMDAxRkRGMEJGM0E5MUZEMTgyRjJC #NkQ4M0U2MUE5Mzc3RURFMTI3RUJBN0UwRDRDMDg1OTJFQUZGMzNENEFBNzA1RDZDRT #U0QkIiLCAieWEiOiAiMjFCNEY0QkQ5RTY0RUQzNTVDM0VCNjc2QTI4RUJFREFGNkQ4 #RjE3QkRDMzY1OTk1QjMxOTA5NzE1MzA0NDA4MDUxNkJEMDgzQkZDQ0U2NjEyMUEzMD #cyNjQ2OTk0Qzg0MzBDQzM4MkI4REM1NDNFOCIsICJBRGEiOiAiNDE0NDYxIiwgIllh #IjogIjdGNjQ1NzcyQ0MyMDlCRjlGRDlENzZEQkIxMDI4M0JFQTcxQjEyMjM1RTNCQj #IxODc4RDVFNTZBNzA1MDZFMTY1NzQzQTYzMkRFOThFQ0E5OTMyQzVEMkVGRTM2NTAw #QTU5QjJGREFFRDBEOEExNDgiLCAieWIiOiAiODQ4QjA3NzlGRjQxNUYwQUY0RUExNE #RGOUREMUQzQzI5QUM0MUQ4MzZDNzgwODg5NkM0RUJBMTlDNTFBQzQwQTQzOUNBRjVF #NjFFQzg4QzMwN0M3RDYxOTE5NTIyOTQxMkVBQTczRkIyQTVFQTIwRCIsICJBRGIiOi #AiNDE0NDYyIiwgIlliIjogIkE0NjkwQTA3NTBDNDJCMjg4REREMEJBMDhFM0Y0OTAy #REZFNzBCQUU1QzlFMkM2RUU5NTg0NERFRjI2OTJCRTc3NjQ2QjIwRDNCNDI5RjhEQT #AwRDIxNDMzRUUwODkxQzY2NzY1OEQ4RDBDNDhFMzgiLCAiSyI6ICJEQjNGRkY5REE1 #OTU3NjcxNUIwNEQ0REY4REM4RDE4REIyNDMwRTU3QkJFRDMzN0RCRUVFNUJCMkQ2QU #I2Q0VEREM5Qzc1QzVDMEIxN0ZBRDdFQjcyNERBQTEyRjhGMTkwM0RENkMyQ0VERTYx #MzVBIiwgIklTS19JUiI6ICI1OTk4OTJBMjA3OEE4Qzk4ODE4MTYyNUUxRTVFNUY3QT #YxNjNGN0Q3MkYyMUI5M0VCRUZCQTBGMTdGRjdFQTNBQTA1OTRCRDU2OUNGNzQyNjQx #NTdCM0MwMDg3QkRDQ0YyRjU5Qzc3MTU2NjI4NDg3RjVDQTE2NDVCOEU5RDA1QiIsIC #JJU0tfU1kiOiAiM0FDNzNGMDMwMzAyOTZBQTU5MUYwMTMyNkIxOEFGQTQ3RTExODkx #MjlDRDA2QUU4REZCMDVFNkVCMTMxMENERTk0OEI1OUVFRjA3NTUzNjVDMDZBMzM5Mj #Y2QUZFNTk0OTQ4QzU2QTUzOEQ5OEE2NTc2NzExMzkzOEE5QTc4RDgiLCAic2lkX291 #dHB1dF9pciI6ICIwMEEyMzMzQTc5NDgxQUJFNzFFRkQ2NTk0RDdCQkFBQzU1QzgwOD #Q4MkU4NjlDOUI2NUM0QjUzRDcxMDBEM0RBOEYzQ0FCRDU5RkEwQzFGMjJENkQyRjlB #QzBDMDkzOTYyMjkyNzk4RkNBMkMwQjkzMjY4OTc0Q0FENzVENTc1QSIsICJzaWRfb3 #V0cHV0X29jIjogIkExQ0U5MDUzN0E4RDUzQjA2RDc3RTc5RkU3MTk0NjFDQzVFRDgz #MDBEMjFEMTg2NkE1OUY5NjM4NjAxODMzRjU3QThCNUU4OERCOUE1MkFCRkExQjRFOE #E2NTFBNDAwQkM5MjA1MDgyQUFEODFFQjMxMUM0NDM3M0I5QTE5RUZGIn0=¶
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.¶
Weak points for X448 smaller than the field prime (canonical)¶
u0: (length: 56 bytes) 0000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 u1: (length: 56 bytes) 0100000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 u2: (length: 56 bytes) fefffffffffffffffffffffffffffffffffffffffffffffffffffffffe ffffffffffffffffffffffffffffffffffffffffffffffffffffff¶
Weak points for X448 larger or equal to the field prime (non-canonical)¶
u3: (length: 56 bytes) fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe ffffffffffffffffffffffffffffffffffffffffffffffffffffff u4: (length: 56 bytes) 00000000000000000000000000000000000000000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffff All of the above points u0 ... u4 MUST trigger the abort case when included in the protocol messages from A or B.¶
Expected results for X448 resp. G_X448.scalar_mult_vfy¶
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¶
Test vectors for scalar_mult with nonzero outputs¶
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¶
#eyJJbnZhbGlkIFkxIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMiI6ICIwMT #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwIiwgIkludmFsaWQgWTMiOiAiRkVGRkZGRkZGRkZGRkZGRkZGRkZG #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRk #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbnZh #bGlkIFk0IjogIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk #ZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNSI6ICIwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZG #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk #ZGRkZGIiwgIlZhbGlkIChvbiBjdXJ2ZSkiOiB7InMiOiAiQUY4QTE0MjE4QkYyQTIw #NjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0YxNU #ZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FERCIs #ICJ1X2N1cnZlIjogIkFCMEM2OEQ3NzJFQzJFQjlERTI1QzQ5NzAwRTQ2RDYzMjVFNj #ZENkFBMzlEN0I2NUVCODRBNjhDNTU2OUQ0N0JENzFCNDFGM0UwRDIxMEY0NEUxNDZE #RUM4OTI2QjE3NEFDQjNGOTQwQTBCODJDQUIiLCAicmVzX2N1cnZlIjogIjNCMEZBOU #JDNDBBNkZEQzc4QzlFMDZGRjdBNTRDMTQzQzVENTJGMzY1NjA3MDUzQkYwNjU2RjUx #NDIwNDk2Mjk1RjkxMEExMDFCMzhFREMxQUNEM0JEMjQwRkQ1NURDQjdBMzYwNTUzQj #hBNzYyN0UifSwgIlZhbGlkIChvbiB0d2lzdCkiOiB7InMiOiAiQUY4QTE0MjE4QkYy #QTIwNjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0 #YxNUZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FE #RCIsICJ1X3R3aXN0IjogIkM5ODFDRDFFMUY3MkQ5QzM1QzdEN0NGNkJFNDI2NzU3Qz #BEQzgyMDZBMkZDRkE1NjRBOEU3NjE4QzAzQzBFNjFGOUEyRUIxQzNFMEREOTdENkU5 #QjEwMTBGNUVERDAzMzk3QTgzRjVBOTE0Q0IzRkYiLCAicmVzX3R3aXN0IjogIkQwQT #JCQjdFOUM1QzJDNjI3NzkzRDgzNDJGMjNCNzU5RkU3RDlFMzMyMEE4NUNBNEZENjEz #NzYzMzE1MEZGRDlBOTE0OEE5Qjc1QzM0OUZBQzQzRDY0QkVDNDlBNkUxMjZDQzkyQ0 #JGQkYzNTM5NjEifX0=¶
Inputs H = SHA-512 with input block size 128 bytes. PRS = b'Password' ; ZPAD length: 100 ; DSI = b'CPaceRistretto255' CI = b'oc\x0bB_responder\x0bA_initiator' CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72 sid = 7e4b4791d6a8ef019b936c79fb7f2c57 Outputs generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes): (length: 172 bytes) 11435061636552697374726574746f3235350850617373776f726464 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001a6f630b425f726573706f6e 6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79 fb7f2c57 hash result: (length: 64 bytes) c63a5750e2439c17ccd8213be14fde2f87e1bc637001a97f5929c77b 30ea0e08afbc75ace5d3d73b2842a79d01488c5fd7ea30d475ee6095 45af1bfd1ff77c8e encoded generator g: (length: 32 bytes) a6fc82c3b8968fbb2e06fee81ca858586dea50d248f0c7ca6a18b090 2a30b36b¶
#eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDAsICJEU0kiOiAiNDM1MDYx #NjM2NTUyNjk3Mzc0NzI2NTc0NzQ2RjMyMzUzNSIsICJDSSI6ICI2RjYzMEI0MjVGNz #I2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6 #ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnZW5lcmF0b3Jfc3 #RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIxMTQzNTA2MTYz #NjU1MjY5NzM3NDcyNjU3NDc0NkYzMjM1MzUwODUwNjE3MzczNzc2RjcyNjQ2NDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMU #E2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2 #RjcyMTA3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJoYXNoIHJlc3 #VsdCI6ICJDNjNBNTc1MEUyNDM5QzE3Q0NEODIxM0JFMTRGREUyRjg3RTFCQzYzNzAw #MUE5N0Y1OTI5Qzc3QjMwRUEwRTA4QUZCQzc1QUNFNUQzRDczQjI4NDJBNzlEMDE0OD #hDNUZEN0VBMzBENDc1RUU2MDk1NDVBRjFCRkQxRkY3N0M4RSIsICJlbmNvZGVkIGdl #bmVyYXRvciBnIjogIkE2RkM4MkMzQjg5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQT #UwRDI0OEYwQzdDQTZBMThCMDkwMkEzMEIzNkIifQ==¶
Inputs ADa = b'ADa' ya (little endian): (length: 32 bytes) da3d23700a9e5699258aef94dc060dfda5ebb61f02a5ea77fad53f4f f0976d08 Outputs Ya: (length: 32 bytes) d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c66 9308f87a¶
Inputs ADb = b'ADb' yb (little endian): (length: 32 bytes) d2316b454718c35362d83d69df6320f38578ed5984651435e2949762 d900b80d Outputs Yb: (length: 32 bytes) 08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67 2eb7e307¶
scalar_mult_vfy(ya,Yb): (length: 32 bytes) e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa 0e607e09 scalar_mult_vfy(yb,Ya): (length: 32 bytes) e22b1ef7788f661478f3cddd4c600774fc0f41e6b711569190ff88fa 0e607e09¶
transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes) 20d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c624c 669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d39840 3319c2341bd506a92e672eb7e30703414462 DSI = G.DSI_ISK, b'CPaceRistretto255_ISK': (length: 21 bytes) 435061636552697374726574746f3235355f49534b lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb): (length: 146 bytes) 15435061636552697374726574746f3235355f49534b107e4b4791d6 a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774 fc0f41e6b711569190ff88fa0e607e0920d40fb265a7abeaee7939d9 1a585fe59f7053f982c296ec413c624c669308f87a034144612008bc f6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e672eb7 e30703414462 ISK result: (length: 64 bytes) 4c5469a16b2364c4b944ebc1a79e51d1674ad47db26e8718154f59fa ebfaa52d8346f30aa58377117eb20d527f2cbc5c76381f7fd372e89d f8239f87f2e02ed1¶
transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes) 6f6320d40fb265a7abeaee7939d91a585fe59f7053f982c296ec413c 624c669308f87a034144612008bcf6e9777a9c313a3db6daa510f2d3 98403319c2341bd506a92e672eb7e30703414462 DSI = G.DSI_ISK, b'CPaceRistretto255_ISK': (length: 21 bytes) 435061636552697374726574746f3235355f49534b lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb): (length: 148 bytes) 15435061636552697374726574746f3235355f49534b107e4b4791d6 a8ef019b936c79fb7f2c5720e22b1ef7788f661478f3cddd4c600774 fc0f41e6b711569190ff88fa0e607e096f6320d40fb265a7abeaee79 39d91a585fe59f7053f982c296ec413c624c669308f87a0341446120 08bcf6e9777a9c313a3db6daa510f2d398403319c2341bd506a92e67 2eb7e30703414462 ISK result: (length: 64 bytes) 980dcc5a1c52ceea031e75f38ed266586616488c5c5780285fcbcf79 087c7bcdbd993502eee606b718ba31e840a000a7b7befe15ea427c5c fe88344fa1237f35¶
H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)): (length: 64 bytes) 2a76d3bbc499dfdc4dcacc9ff042f4e1a54e3843258e100ccd7c60f0 a541f9d3ebf025e68a460dde218bd39f0711bc6fa11409c9d7b69d8c cf6b32fc51ddb699 H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)): (length: 64 bytes) ca4b50700c46203ccd10bc0e9f31095e508189cb59857537be561048 d34b9ed9a9697af11c998f484c3d783b0b531434caa6835d4c32344f cd17160c9c348fc7¶
const unsigned char tc_PRS[] = { 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64, }; const unsigned char tc_CI[] = { 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64, 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74, 0x6f,0x72, }; const unsigned char tc_sid[] = { 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79, 0xfb,0x7f,0x2c,0x57, }; const unsigned char tc_g[] = { 0xa6,0xfc,0x82,0xc3,0xb8,0x96,0x8f,0xbb,0x2e,0x06,0xfe,0xe8, 0x1c,0xa8,0x58,0x58,0x6d,0xea,0x50,0xd2,0x48,0xf0,0xc7,0xca, 0x6a,0x18,0xb0,0x90,0x2a,0x30,0xb3,0x6b, }; const unsigned char tc_ya[] = { 0xda,0x3d,0x23,0x70,0x0a,0x9e,0x56,0x99,0x25,0x8a,0xef,0x94, 0xdc,0x06,0x0d,0xfd,0xa5,0xeb,0xb6,0x1f,0x02,0xa5,0xea,0x77, 0xfa,0xd5,0x3f,0x4f,0xf0,0x97,0x6d,0x08, }; const unsigned char tc_ADa[] = { 0x41,0x44,0x61, }; const unsigned char tc_Ya[] = { 0xd4,0x0f,0xb2,0x65,0xa7,0xab,0xea,0xee,0x79,0x39,0xd9,0x1a, 0x58,0x5f,0xe5,0x9f,0x70,0x53,0xf9,0x82,0xc2,0x96,0xec,0x41, 0x3c,0x62,0x4c,0x66,0x93,0x08,0xf8,0x7a, }; const unsigned char tc_yb[] = { 0xd2,0x31,0x6b,0x45,0x47,0x18,0xc3,0x53,0x62,0xd8,0x3d,0x69, 0xdf,0x63,0x20,0xf3,0x85,0x78,0xed,0x59,0x84,0x65,0x14,0x35, 0xe2,0x94,0x97,0x62,0xd9,0x00,0xb8,0x0d, }; const unsigned char tc_ADb[] = { 0x41,0x44,0x62, }; const unsigned char tc_Yb[] = { 0x08,0xbc,0xf6,0xe9,0x77,0x7a,0x9c,0x31,0x3a,0x3d,0xb6,0xda, 0xa5,0x10,0xf2,0xd3,0x98,0x40,0x33,0x19,0xc2,0x34,0x1b,0xd5, 0x06,0xa9,0x2e,0x67,0x2e,0xb7,0xe3,0x07, }; const unsigned char tc_K[] = { 0xe2,0x2b,0x1e,0xf7,0x78,0x8f,0x66,0x14,0x78,0xf3,0xcd,0xdd, 0x4c,0x60,0x07,0x74,0xfc,0x0f,0x41,0xe6,0xb7,0x11,0x56,0x91, 0x90,0xff,0x88,0xfa,0x0e,0x60,0x7e,0x09, }; const unsigned char tc_ISK_IR[] = { 0x4c,0x54,0x69,0xa1,0x6b,0x23,0x64,0xc4,0xb9,0x44,0xeb,0xc1, 0xa7,0x9e,0x51,0xd1,0x67,0x4a,0xd4,0x7d,0xb2,0x6e,0x87,0x18, 0x15,0x4f,0x59,0xfa,0xeb,0xfa,0xa5,0x2d,0x83,0x46,0xf3,0x0a, 0xa5,0x83,0x77,0x11,0x7e,0xb2,0x0d,0x52,0x7f,0x2c,0xbc,0x5c, 0x76,0x38,0x1f,0x7f,0xd3,0x72,0xe8,0x9d,0xf8,0x23,0x9f,0x87, 0xf2,0xe0,0x2e,0xd1, }; const unsigned char tc_ISK_SY[] = { 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3, 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28, 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02, 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7, 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f, 0xa1,0x23,0x7f,0x35, }; const unsigned char tc_ISK_SY[] = { 0x98,0x0d,0xcc,0x5a,0x1c,0x52,0xce,0xea,0x03,0x1e,0x75,0xf3, 0x8e,0xd2,0x66,0x58,0x66,0x16,0x48,0x8c,0x5c,0x57,0x80,0x28, 0x5f,0xcb,0xcf,0x79,0x08,0x7c,0x7b,0xcd,0xbd,0x99,0x35,0x02, 0xee,0xe6,0x06,0xb7,0x18,0xba,0x31,0xe8,0x40,0xa0,0x00,0xa7, 0xb7,0xbe,0xfe,0x15,0xea,0x42,0x7c,0x5c,0xfe,0x88,0x34,0x4f, 0xa1,0x23,0x7f,0x35, }; const unsigned char tc_sid_out_ir[] = { 0x2a,0x76,0xd3,0xbb,0xc4,0x99,0xdf,0xdc,0x4d,0xca,0xcc,0x9f, 0xf0,0x42,0xf4,0xe1,0xa5,0x4e,0x38,0x43,0x25,0x8e,0x10,0x0c, 0xcd,0x7c,0x60,0xf0,0xa5,0x41,0xf9,0xd3,0xeb,0xf0,0x25,0xe6, 0x8a,0x46,0x0d,0xde,0x21,0x8b,0xd3,0x9f,0x07,0x11,0xbc,0x6f, 0xa1,0x14,0x09,0xc9,0xd7,0xb6,0x9d,0x8c,0xcf,0x6b,0x32,0xfc, 0x51,0xdd,0xb6,0x99, }; const unsigned char tc_sid_out_oc[] = { 0xca,0x4b,0x50,0x70,0x0c,0x46,0x20,0x3c,0xcd,0x10,0xbc,0x0e, 0x9f,0x31,0x09,0x5e,0x50,0x81,0x89,0xcb,0x59,0x85,0x75,0x37, 0xbe,0x56,0x10,0x48,0xd3,0x4b,0x9e,0xd9,0xa9,0x69,0x7a,0xf1, 0x1c,0x99,0x8f,0x48,0x4c,0x3d,0x78,0x3b,0x0b,0x53,0x14,0x34, 0xca,0xa6,0x83,0x5d,0x4c,0x32,0x34,0x4f,0xcd,0x17,0x16,0x0c, 0x9c,0x34,0x8f,0xc7, };¶
#eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIkE2RkM4MkMzQj #g5NjhGQkIyRTA2RkVFODFDQTg1ODU4NkRFQTUwRDI0OEYwQzdDQTZBMThCMDkwMkEz #MEIzNkIiLCAieWEiOiAiREEzRDIzNzAwQTlFNTY5OTI1OEFFRjk0REMwNjBERkRBNU #VCQjYxRjAyQTVFQTc3RkFENTNGNEZGMDk3NkQwOCIsICJBRGEiOiAiNDE0NDYxIiwg #IllhIjogIkQ0MEZCMjY1QTdBQkVBRUU3OTM5RDkxQTU4NUZFNTlGNzA1M0Y5ODJDMj #k2RUM0MTNDNjI0QzY2OTMwOEY4N0EiLCAieWIiOiAiRDIzMTZCNDU0NzE4QzM1MzYy #RDgzRDY5REY2MzIwRjM4NTc4RUQ1OTg0NjUxNDM1RTI5NDk3NjJEOTAwQjgwRCIsIC #JBRGIiOiAiNDE0NDYyIiwgIlliIjogIjA4QkNGNkU5Nzc3QTlDMzEzQTNEQjZEQUE1 #MTBGMkQzOTg0MDMzMTlDMjM0MUJENTA2QTkyRTY3MkVCN0UzMDciLCAiSyI6ICJFMj #JCMUVGNzc4OEY2NjE0NzhGM0NEREQ0QzYwMDc3NEZDMEY0MUU2QjcxMTU2OTE5MEZG #ODhGQTBFNjA3RTA5IiwgIklTS19JUiI6ICI0QzU0NjlBMTZCMjM2NEM0Qjk0NEVCQz #FBNzlFNTFEMTY3NEFENDdEQjI2RTg3MTgxNTRGNTlGQUVCRkFBNTJEODM0NkYzMEFB #NTgzNzcxMTdFQjIwRDUyN0YyQ0JDNUM3NjM4MUY3RkQzNzJFODlERjgyMzlGODdGMk #UwMkVEMSIsICJJU0tfU1kiOiAiOTgwRENDNUExQzUyQ0VFQTAzMUU3NUYzOEVEMjY2 #NTg2NjE2NDg4QzVDNTc4MDI4NUZDQkNGNzkwODdDN0JDREJEOTkzNTAyRUVFNjA2Qj #cxOEJBMzFFODQwQTAwMEE3QjdCRUZFMTVFQTQyN0M1Q0ZFODgzNDRGQTEyMzdGMzUi #LCAic2lkX291dHB1dF9pciI6ICIyQTc2RDNCQkM0OTlERkRDNERDQUNDOUZGMDQyRj #RFMUE1NEUzODQzMjU4RTEwMENDRDdDNjBGMEE1NDFGOUQzRUJGMDI1RTY4QTQ2MERE #RTIxOEJEMzlGMDcxMUJDNkZBMTE0MDlDOUQ3QjY5RDhDQ0Y2QjMyRkM1MUREQjY5OS #IsICJzaWRfb3V0cHV0X29jIjogIkNBNEI1MDcwMEM0NjIwM0NDRDEwQkMwRTlGMzEw #OTVFNTA4MTg5Q0I1OTg1NzUzN0JFNTYxMDQ4RDM0QjlFRDlBOTY5N0FGMTFDOTk4Rj #Q4NEMzRDc4M0IwQjUzMTQzNENBQTY4MzVENEMzMjM0NEZDRDE3MTYwQzlDMzQ4RkM3 #In0=¶
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¶
For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.¶
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¶
#eyJWYWxpZCI6IHsicyI6ICI3Q0QwRTA3NUZBNzk1NUJBNTJDMDI3NTlBNkM5MERCQk #ZDMTBFNkQ0MEFFQThEMjgzRTQwN0Q4OENGNTM4QTA1IiwgIlgiOiAiMkMzQzZCOEM0 #RjM4MDBFN0FFRjY4NjQwMjVCNEVENzlCRDU5OTExN0U0MjdDNDFCRDQ3RDkzRDY1NE #I0QTUxQyIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICI3QzEzNjQ1RkU3 #OTBBNDY4RjYyQzM5QkVCNzM4OEU1NDFEODQwNUQxQURFNjlEMTc3OEM1RkUzRTdGNk #I2MDBFIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiN0MxMzY0NUZFNzkwQTQ2 #OEY2MkMzOUJFQjczODhFNTQxRDg0MDVEMUFERTY5RDE3NzhDNUZFM0U3RjZCNjAwRS #J9LCAiSW52YWxpZCBZMSI6ICIyQjNDNkI4QzRGMzgwMEU3QUVGNjg2NDAyNUI0RUQ3 #OUJENTk5MTE3RTQyN0M0MUJENDdEOTNENjU0QjRBNTFDIiwgIkludmFsaWQgWTIiOi #AiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMCJ9¶
Inputs H = SHAKE-256 with input block size 136 bytes. PRS = b'Password' ; ZPAD length: 112 ; DSI = b'CPaceDecaf448' CI = b'oc\x0bB_responder\x0bA_initiator' CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72 sid = 5223e0cdc45d6575668d64c552004124 Outputs generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes): (length: 180 bytes) 0d435061636544656361663434380850617373776f72647000000000 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000001a6f630b 425f726573706f6e6465720b415f696e69746961746f72105223e0cd c45d6575668d64c552004124 hash result: (length: 112 bytes) 7148f4d60587aaafa64d2fd6bcfe45ee71e8b971d1d5ff3bbf8c1451 797c62a1af22ab25638749f97f9b15fedcf4aeee87282cf667594ab0 92b6023c8f8d3a61c38b0af791c9271137df01b57d63b79734bbce69 91e3e2e10fdc805abc9e6e6f3daeff6fd34093d26de240b326764252 encoded generator g: (length: 56 bytes) 9a700ecc378eb98e57387df456d5b4b4f1dceebbb1371527eeb7e1bf bab64ecc9c9303396145ba04f5b5aea5baedfa61f31f00fbc5fd5606¶
#eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExMiwgIkRTSSI6ICI0MzUw #NjE2MzY1NDQ2NTYzNjE2NjM0MzQzOCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNz #A2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1MjIz #RTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnZW5lcmF0b3Jfc3RyaW5nKE #cuRFNJLFBSUyxDSSxzaWQsSC5zX2luX2J5dGVzKSI6ICIwRDQzNTA2MTYzNjU0NDY1 #NjM2MTY2MzQzNDM4MDg1MDYxNzM3Mzc3NkY3MjY0NzAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2 #OTc0Njk2MTc0NkY3MjEwNTIyM0UwQ0RDNDVENjU3NTY2OEQ2NEM1NTIwMDQxMjQiLC #AiaGFzaCByZXN1bHQiOiAiNzE0OEY0RDYwNTg3QUFBRkE2NEQyRkQ2QkNGRTQ1RUU3 #MUU4Qjk3MUQxRDVGRjNCQkY4QzE0NTE3OTdDNjJBMUFGMjJBQjI1NjM4NzQ5Rjk3Rj #lCMTVGRURDRjRBRUVFODcyODJDRjY2NzU5NEFCMDkyQjYwMjNDOEY4RDNBNjFDMzhC #MEFGNzkxQzkyNzExMzdERjAxQjU3RDYzQjc5NzM0QkJDRTY5OTFFM0UyRTEwRkRDOD #A1QUJDOUU2RTZGM0RBRUZGNkZEMzQwOTNEMjZERTI0MEIzMjY3NjQyNTIiLCAiZW5j #b2RlZCBnZW5lcmF0b3IgZyI6ICI5QTcwMEVDQzM3OEVCOThFNTczODdERjQ1NkQ1Qj #RCNEYxRENFRUJCQjEzNzE1MjdFRUI3RTFCRkJBQjY0RUNDOUM5MzAzMzk2MTQ1QkEw #NEY1QjVBRUE1QkFFREZBNjFGMzFGMDBGQkM1RkQ1NjA2In0=¶
Inputs ADa = b'ADa' ya (little endian): (length: 56 bytes) 33d561f13cfc0dca279c30e8cde895175dc25483892819eba132d58c 13c0462a8eb0d73fda941950594bef5191d8394691f86edffcad6c1e Outputs Ya: (length: 56 bytes) 627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be846c c0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e571b¶
Inputs ADb = b'ADb' yb (little endian): (length: 56 bytes) 2523c969f68fa2b2aea294c2539ef36eb1e0558abd14712a7828f16a 85ed2c7e77e2bdd418994405fb1b57b6bbaadd66849892aac9d81402 Outputs Yb: (length: 56 bytes) 8e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3011871 7019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f94772db¶
scalar_mult_vfy(ya,Yb): (length: 56 bytes) 94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97 32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f scalar_mult_vfy(yb,Ya): (length: 56 bytes) 94f4ae494f4e8b07ade3354726eee49c5518b363cda544f5b4541b97 32830be37ea0e63fc83f54be280dea0747a043c76d473e01689af77f¶
transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes) 38627f8bb2ae945e2a518967df9b00aff19253d3086398f2ec18be84 6cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a17e66bb7006e57 1b03414461388e9811e4402fac098743ca7b2b509b91b38c8cf1360c c6cab30118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f 8399f94772db03414462 DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes) 435061636544656361663434385f49534b lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb): (length: 214 bytes) 11435061636544656361663434385f49534b105223e0cdc45d657566 8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363 cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7 6d473e01689af77f38627f8bb2ae945e2a518967df9b00aff19253d3 086398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a937 2a17e66bb7006e571b03414461388e9811e4402fac098743ca7b2b50 9b91b38c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b7 74e6b0e0b826ff4f8399f94772db03414462 ISK result: (length: 64 bytes) 9c2726a6cda1179349cbc38f31765eab646a2a5f176f3019fab4a0aa bd9d17c2ba895998cff698d801761a003512c1cf67d144b21e1cb6d6 b82da71d0da76cad¶
transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes) 6f63388e9811e4402fac098743ca7b2b509b91b38c8cf1360cc6cab3 0118717019782b7f58a591c63d9c9247b774e6b0e0b826ff4f8399f9 4772db0341446238627f8bb2ae945e2a518967df9b00aff19253d308 6398f2ec18be846cc0d1f286c2ce3caf1da639859ccd2a6a01a9372a 17e66bb7006e571b03414461 DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes) 435061636544656361663434385f49534b lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb): (length: 216 bytes) 11435061636544656361663434385f49534b105223e0cdc45d657566 8d64c5520041243894f4ae494f4e8b07ade3354726eee49c5518b363 cda544f5b4541b9732830be37ea0e63fc83f54be280dea0747a043c7 6d473e01689af77f6f63388e9811e4402fac098743ca7b2b509b91b3 8c8cf1360cc6cab30118717019782b7f58a591c63d9c9247b774e6b0 e0b826ff4f8399f94772db0341446238627f8bb2ae945e2a518967df 9b00aff19253d3086398f2ec18be846cc0d1f286c2ce3caf1da63985 9ccd2a6a01a9372a17e66bb7006e571b03414461 ISK result: (length: 64 bytes) 6d2178ed3048703025b9007ec84c4d969e8d8135df455e608c16aa15 2e1219c86cea563254428a9d969903ae3649d1050da1e6e0c1c060e1 ebf7316a7e993389¶
H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)): (length: 64 bytes) 65bffde17b7acf07cfd437bdb973a8f7340bf911d393a61498c0a50e f0d68bca103fbdb0f5b799505562e59811df1bc5d9b4f5f0f7c57c22 cd7ed6db4d153e3a H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)): (length: 64 bytes) 7ce27043d1b1d0d0e02e16979637e2a00547ed6e15ea988f7d3c9b3c 2159b26ab3834bff7ff86240323e25216ba2ee6ea6e1582502017f8e 6d65f8c4a5e65543¶
const unsigned char tc_PRS[] = { 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64, }; const unsigned char tc_CI[] = { 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64, 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74, 0x6f,0x72, }; const unsigned char tc_sid[] = { 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5, 0x52,0x00,0x41,0x24, }; const unsigned char tc_g[] = { 0x9a,0x70,0x0e,0xcc,0x37,0x8e,0xb9,0x8e,0x57,0x38,0x7d,0xf4, 0x56,0xd5,0xb4,0xb4,0xf1,0xdc,0xee,0xbb,0xb1,0x37,0x15,0x27, 0xee,0xb7,0xe1,0xbf,0xba,0xb6,0x4e,0xcc,0x9c,0x93,0x03,0x39, 0x61,0x45,0xba,0x04,0xf5,0xb5,0xae,0xa5,0xba,0xed,0xfa,0x61, 0xf3,0x1f,0x00,0xfb,0xc5,0xfd,0x56,0x06, }; const unsigned char tc_ya[] = { 0x33,0xd5,0x61,0xf1,0x3c,0xfc,0x0d,0xca,0x27,0x9c,0x30,0xe8, 0xcd,0xe8,0x95,0x17,0x5d,0xc2,0x54,0x83,0x89,0x28,0x19,0xeb, 0xa1,0x32,0xd5,0x8c,0x13,0xc0,0x46,0x2a,0x8e,0xb0,0xd7,0x3f, 0xda,0x94,0x19,0x50,0x59,0x4b,0xef,0x51,0x91,0xd8,0x39,0x46, 0x91,0xf8,0x6e,0xdf,0xfc,0xad,0x6c,0x1e, }; const unsigned char tc_ADa[] = { 0x41,0x44,0x61, }; const unsigned char tc_Ya[] = { 0x62,0x7f,0x8b,0xb2,0xae,0x94,0x5e,0x2a,0x51,0x89,0x67,0xdf, 0x9b,0x00,0xaf,0xf1,0x92,0x53,0xd3,0x08,0x63,0x98,0xf2,0xec, 0x18,0xbe,0x84,0x6c,0xc0,0xd1,0xf2,0x86,0xc2,0xce,0x3c,0xaf, 0x1d,0xa6,0x39,0x85,0x9c,0xcd,0x2a,0x6a,0x01,0xa9,0x37,0x2a, 0x17,0xe6,0x6b,0xb7,0x00,0x6e,0x57,0x1b, }; const unsigned char tc_yb[] = { 0x25,0x23,0xc9,0x69,0xf6,0x8f,0xa2,0xb2,0xae,0xa2,0x94,0xc2, 0x53,0x9e,0xf3,0x6e,0xb1,0xe0,0x55,0x8a,0xbd,0x14,0x71,0x2a, 0x78,0x28,0xf1,0x6a,0x85,0xed,0x2c,0x7e,0x77,0xe2,0xbd,0xd4, 0x18,0x99,0x44,0x05,0xfb,0x1b,0x57,0xb6,0xbb,0xaa,0xdd,0x66, 0x84,0x98,0x92,0xaa,0xc9,0xd8,0x14,0x02, }; const unsigned char tc_ADb[] = { 0x41,0x44,0x62, }; const unsigned char tc_Yb[] = { 0x8e,0x98,0x11,0xe4,0x40,0x2f,0xac,0x09,0x87,0x43,0xca,0x7b, 0x2b,0x50,0x9b,0x91,0xb3,0x8c,0x8c,0xf1,0x36,0x0c,0xc6,0xca, 0xb3,0x01,0x18,0x71,0x70,0x19,0x78,0x2b,0x7f,0x58,0xa5,0x91, 0xc6,0x3d,0x9c,0x92,0x47,0xb7,0x74,0xe6,0xb0,0xe0,0xb8,0x26, 0xff,0x4f,0x83,0x99,0xf9,0x47,0x72,0xdb, }; const unsigned char tc_K[] = { 0x94,0xf4,0xae,0x49,0x4f,0x4e,0x8b,0x07,0xad,0xe3,0x35,0x47, 0x26,0xee,0xe4,0x9c,0x55,0x18,0xb3,0x63,0xcd,0xa5,0x44,0xf5, 0xb4,0x54,0x1b,0x97,0x32,0x83,0x0b,0xe3,0x7e,0xa0,0xe6,0x3f, 0xc8,0x3f,0x54,0xbe,0x28,0x0d,0xea,0x07,0x47,0xa0,0x43,0xc7, 0x6d,0x47,0x3e,0x01,0x68,0x9a,0xf7,0x7f, }; const unsigned char tc_ISK_IR[] = { 0x9c,0x27,0x26,0xa6,0xcd,0xa1,0x17,0x93,0x49,0xcb,0xc3,0x8f, 0x31,0x76,0x5e,0xab,0x64,0x6a,0x2a,0x5f,0x17,0x6f,0x30,0x19, 0xfa,0xb4,0xa0,0xaa,0xbd,0x9d,0x17,0xc2,0xba,0x89,0x59,0x98, 0xcf,0xf6,0x98,0xd8,0x01,0x76,0x1a,0x00,0x35,0x12,0xc1,0xcf, 0x67,0xd1,0x44,0xb2,0x1e,0x1c,0xb6,0xd6,0xb8,0x2d,0xa7,0x1d, 0x0d,0xa7,0x6c,0xad, }; const unsigned char tc_ISK_SY[] = { 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e, 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60, 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32, 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05, 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a, 0x7e,0x99,0x33,0x89, }; const unsigned char tc_ISK_SY[] = { 0x6d,0x21,0x78,0xed,0x30,0x48,0x70,0x30,0x25,0xb9,0x00,0x7e, 0xc8,0x4c,0x4d,0x96,0x9e,0x8d,0x81,0x35,0xdf,0x45,0x5e,0x60, 0x8c,0x16,0xaa,0x15,0x2e,0x12,0x19,0xc8,0x6c,0xea,0x56,0x32, 0x54,0x42,0x8a,0x9d,0x96,0x99,0x03,0xae,0x36,0x49,0xd1,0x05, 0x0d,0xa1,0xe6,0xe0,0xc1,0xc0,0x60,0xe1,0xeb,0xf7,0x31,0x6a, 0x7e,0x99,0x33,0x89, }; const unsigned char tc_sid_out_ir[] = { 0x65,0xbf,0xfd,0xe1,0x7b,0x7a,0xcf,0x07,0xcf,0xd4,0x37,0xbd, 0xb9,0x73,0xa8,0xf7,0x34,0x0b,0xf9,0x11,0xd3,0x93,0xa6,0x14, 0x98,0xc0,0xa5,0x0e,0xf0,0xd6,0x8b,0xca,0x10,0x3f,0xbd,0xb0, 0xf5,0xb7,0x99,0x50,0x55,0x62,0xe5,0x98,0x11,0xdf,0x1b,0xc5, 0xd9,0xb4,0xf5,0xf0,0xf7,0xc5,0x7c,0x22,0xcd,0x7e,0xd6,0xdb, 0x4d,0x15,0x3e,0x3a, }; const unsigned char tc_sid_out_oc[] = { 0x7c,0xe2,0x70,0x43,0xd1,0xb1,0xd0,0xd0,0xe0,0x2e,0x16,0x97, 0x96,0x37,0xe2,0xa0,0x05,0x47,0xed,0x6e,0x15,0xea,0x98,0x8f, 0x7d,0x3c,0x9b,0x3c,0x21,0x59,0xb2,0x6a,0xb3,0x83,0x4b,0xff, 0x7f,0xf8,0x62,0x40,0x32,0x3e,0x25,0x21,0x6b,0xa2,0xee,0x6e, 0xa6,0xe1,0x58,0x25,0x02,0x01,0x7f,0x8e,0x6d,0x65,0xf8,0xc4, 0xa5,0xe6,0x55,0x43, };¶
#eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1 #MjIzRTBDREM0NUQ2NTc1NjY4RDY0QzU1MjAwNDEyNCIsICJnIjogIjlBNzAwRUNDMz #c4RUI5OEU1NzM4N0RGNDU2RDVCNEI0RjFEQ0VFQkJCMTM3MTUyN0VFQjdFMUJGQkFC #NjRFQ0M5QzkzMDMzOTYxNDVCQTA0RjVCNUFFQTVCQUVERkE2MUYzMUYwMEZCQzVGRD #U2MDYiLCAieWEiOiAiMzNENTYxRjEzQ0ZDMERDQTI3OUMzMEU4Q0RFODk1MTc1REMy #NTQ4Mzg5MjgxOUVCQTEzMkQ1OEMxM0MwNDYyQThFQjBENzNGREE5NDE5NTA1OTRCRU #Y1MTkxRDgzOTQ2OTFGODZFREZGQ0FENkMxRSIsICJBRGEiOiAiNDE0NDYxIiwgIllh #IjogIjYyN0Y4QkIyQUU5NDVFMkE1MTg5NjdERjlCMDBBRkYxOTI1M0QzMDg2Mzk4Rj #JFQzE4QkU4NDZDQzBEMUYyODZDMkNFM0NBRjFEQTYzOTg1OUNDRDJBNkEwMUE5Mzcy #QTE3RTY2QkI3MDA2RTU3MUIiLCAieWIiOiAiMjUyM0M5NjlGNjhGQTJCMkFFQTI5NE #MyNTM5RUYzNkVCMUUwNTU4QUJEMTQ3MTJBNzgyOEYxNkE4NUVEMkM3RTc3RTJCREQ0 #MTg5OTQ0MDVGQjFCNTdCNkJCQUFERDY2ODQ5ODkyQUFDOUQ4MTQwMiIsICJBRGIiOi #AiNDE0NDYyIiwgIlliIjogIjhFOTgxMUU0NDAyRkFDMDk4NzQzQ0E3QjJCNTA5Qjkx #QjM4QzhDRjEzNjBDQzZDQUIzMDExODcxNzAxOTc4MkI3RjU4QTU5MUM2M0Q5QzkyND #dCNzc0RTZCMEUwQjgyNkZGNEY4Mzk5Rjk0NzcyREIiLCAiSyI6ICI5NEY0QUU0OTRG #NEU4QjA3QURFMzM1NDcyNkVFRTQ5QzU1MThCMzYzQ0RBNTQ0RjVCNDU0MUI5NzMyOD #MwQkUzN0VBMEU2M0ZDODNGNTRCRTI4MERFQTA3NDdBMDQzQzc2RDQ3M0UwMTY4OUFG #NzdGIiwgIklTS19JUiI6ICI5QzI3MjZBNkNEQTExNzkzNDlDQkMzOEYzMTc2NUVBQj #Y0NkEyQTVGMTc2RjMwMTlGQUI0QTBBQUJEOUQxN0MyQkE4OTU5OThDRkY2OThEODAx #NzYxQTAwMzUxMkMxQ0Y2N0QxNDRCMjFFMUNCNkQ2QjgyREE3MUQwREE3NkNBRCIsIC #JJU0tfU1kiOiAiNkQyMTc4RUQzMDQ4NzAzMDI1QjkwMDdFQzg0QzREOTY5RThEODEz #NURGNDU1RTYwOEMxNkFBMTUyRTEyMTlDODZDRUE1NjMyNTQ0MjhBOUQ5Njk5MDNBRT #M2NDlEMTA1MERBMUU2RTBDMUMwNjBFMUVCRjczMTZBN0U5OTMzODkiLCAic2lkX291 #dHB1dF9pciI6ICI2NUJGRkRFMTdCN0FDRjA3Q0ZENDM3QkRCOTczQThGNzM0MEJGOT #ExRDM5M0E2MTQ5OEMwQTUwRUYwRDY4QkNBMTAzRkJEQjBGNUI3OTk1MDU1NjJFNTk4 #MTFERjFCQzVEOUI0RjVGMEY3QzU3QzIyQ0Q3RUQ2REI0RDE1M0UzQSIsICJzaWRfb3 #V0cHV0X29jIjogIjdDRTI3MDQzRDFCMUQwRDBFMDJFMTY5Nzk2MzdFMkEwMDU0N0VE #NkUxNUVBOTg4RjdEM0M5QjNDMjE1OUIyNkFCMzgzNEJGRjdGRjg2MjQwMzIzRTI1Mj #E2QkEyRUU2RUE2RTE1ODI1MDIwMTdGOEU2RDY1RjhDNEE1RTY1NTQzIn0=¶
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¶
For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.¶
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¶
#eyJWYWxpZCI6IHsicyI6ICJERDFCQzcwMTVEQUFCQjc2NzIxMjlDQzM1QTNCQTgxNT #Q4NkIxMzlERUZGOUJERUNBN0E0RkM2MTM0MzIzRDM0NjU4NzYxRTkwRkYwNzk5NzJB #N0NBOEFBNTYwNjQ5OEY0RjRGMEVCQzA5MzNBODE5IiwgIlgiOiAiNjAxNDMxRDVFNT #FGNDNENDIyQTkyRDNGQjIzNzNCREUyODIxN0FBQjQyNTI0QzM0MUFBNDA0RUFCQTVB #QTU1NDFGNzA0MkRCQjMyNTNDRTRDOTBGNzcyQjAzOEE0MTNEQ0IzQTBGNkJGM0FFOU #UyMSIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICIzODhCMzVDNjBFQjQx #QjY2MDg1QTIxMTgzMTYyMTg2ODFENzg5NzlENjY3NzAyREUxMDVGREMxRjIxRkZFOD #g0QTU3N0Q3OTVGNDU2OTE3ODEzOTBBMjI5QTNCRDdCNTI3RTgzMTM4MEYyRjU4NUE0 #IiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiMzg4QjM1QzYwRUI0MUI2NjA4NU #EyMTE4MzE2MjE4NjgxRDc4OTc5RDY2NzcwMkRFMTA1RkRDMUYyMUZGRTg4NEE1NzdE #Nzk1RjQ1NjkxNzgxMzkwQTIyOUEzQkQ3QjUyN0U4MzEzODBGMkY1ODVBNCJ9LCAiSW #52YWxpZCBZMSI6ICI1RjE0MzFENUU1MUY0M0Q0MjJBOTJEM0ZCMjM3M0JERTI4MjE3 #QUFCNDI1MjRDMzQxQUE0MDRFQUJBNUFBNTU0MUY3MDQyREJCMzI1M0NFNEM5MEY3Nz #JCMDM4QTQxM0RDQjNBMEY2QkYzQUU5RTIxIiwgIkludmFsaWQgWTIiOiAiMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMCJ9¶
Inputs H = SHA-256 with input block size 64 bytes. PRS = b'Password' ; ZPAD length: 23 ; DSI = b'CPaceP256_XMD:SHA-256_SSWU_NU_' DST = b'CPaceP256_XMD:SHA-256_SSWU_NU__DST' CI = b'oc\x0bB_responder\x0bA_initiator' CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72 sid = 34b36454cab2e7842c389f7d88ecb7df Outputs generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes): (length: 108 bytes) 1e4350616365503235365f584d443a5348412d3235365f535357555f 4e555f0850617373776f726417000000000000000000000000000000 00000000000000001a6f630b425f726573706f6e6465720b415f696e 69746961746f721034b36454cab2e7842c389f7d88ecb7df generator g: (length: 65 bytes) 04eee577320b1c241a79419fcde5718c2b63f81ef8717d56a57d2fb2 6b65a8beb63573b52605efb32ff4cf31aaef9a92df84e4e8408cc6c7 cf27a535aad2b38a56¶
#eyJIIjogIlNIQS0yNTYiLCAiSC5zX2luX2J5dGVzIjogNjQsICJQUlMiOiAiNTA2MT #czNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDIzLCAiRFNJIjogIjQzNTA2MTYz #NjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4NDEyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNT #U1RiIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NTczNzA2RjZFNjQ2NTcyMEI0MTVGNjk2 #RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIzNEIzNjQ1NENBQjJFNzg0MkMzODlGN0 #Q4OEVDQjdERiIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5z #X2luX2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4ND #EyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDE3MDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2Mz #BCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEw #MzRCMzY0NTRDQUIyRTc4NDJDMzg5RjdEODhFQ0I3REYiLCAiZ2VuZXJhdG9yIGciOi #AiMDRFRUU1NzczMjBCMUMyNDFBNzk0MTlGQ0RFNTcxOEMyQjYzRjgxRUY4NzE3RDU2 #QTU3RDJGQjI2QjY1QThCRUI2MzU3M0I1MjYwNUVGQjMyRkY0Q0YzMUFBRUY5QTkyRE #Y4NEU0RTg0MDhDQzZDN0NGMjdBNTM1QUFEMkIzOEE1NiJ9¶
Inputs ADa = b'ADa' ya (big endian): (length: 32 bytes) 37574cfbf1b95ff6a8e2d7be462d4d01e6dde2618f34f4de9df869b2 4f532c5d Outputs Ya: (length: 65 bytes) 041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364 692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c5d fdfc2ecdf8e42c5e16 Alternative correct value for Ya: (-ya)*g: (length: 65 bytes) 041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e1364 692fdace1715a59cb0e63df85b2ad1529397e85e9c30d0d01dbf93a2 0203d132071bd3a1e9¶
Inputs ADb = b'ADb' yb (big endian): (length: 32 bytes) e5672fc9eb4e721f41d80181ec4c9fd9886668acc48024d33c82bb10 2aecba52 Outputs Yb: (length: 65 bytes) 046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a cc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5ce8b677 a7e38a26f752bf8f84 Alternative correct value for Yb: (-yb)*g: (length: 65 bytes) 046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1617a0a cc8ec3544890612d15def6ece092e1c0a1b9c2d2cdf3b0e0a4174988 581c75d908ad40707b¶
scalar_mult_vfy(ya,Yb): (length: 32 bytes) 3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d 7b8f6b6c scalar_mult_vfy(yb,Ya): (length: 32 bytes) 3e0e2f8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d 7b8f6b6c¶
transcript_ir(Ya,ADa,Yb,ADb): (length: 140 bytes) 41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e13 64692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe3406c 5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8cd 786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e921091320 6d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f8403414462 DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK': (length: 34 bytes) 4350616365503235365f584d443a5348412d3235365f535357555f4e 555f5f49534b lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb): (length: 225 bytes) 224350616365503235365f584d443a5348412d3235365f535357555f 4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f 8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b 6c41041f12ad5fc65010a24fc04c86197109a36df0e9ce85a7479e1e 1364692fdace17ea5a634e19c207a5d52ead6c6817a163cf2f2fe340 6c5dfdfc2ecdf8e42c5e160341446141046a51180b6ebabaf5ed0af8 cd786886d93342bcae4c158ce1617a0acc8ec354486f9ed2e9210913 206d1e3f5e463d2d320c4f1f5ce8b677a7e38a26f752bf8f84034144 62 ISK result: (length: 32 bytes) 9565ed286b6e3cf1f943fd31746f9a22935537025a1328d4980005ba 984f0c39¶
transcript_oc(Ya,ADa,Yb,ADb): (length: 142 bytes) 6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158ce1 617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f5c e8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24fc0 4c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19c2 07a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e160341 4461 DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK': (length: 34 bytes) 4350616365503235365f584d443a5348412d3235365f535357555f4e 555f5f49534b lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb): (length: 227 bytes) 224350616365503235365f584d443a5348412d3235365f535357555f 4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df203e0e2f 8976fb8d0deee30aef4b5cd3631eed249af32f53d0dd009b5d7b8f6b 6c6f6341046a51180b6ebabaf5ed0af8cd786886d93342bcae4c158c e1617a0acc8ec354486f9ed2e9210913206d1e3f5e463d2d320c4f1f 5ce8b677a7e38a26f752bf8f840341446241041f12ad5fc65010a24f c04c86197109a36df0e9ce85a7479e1e1364692fdace17ea5a634e19 c207a5d52ead6c6817a163cf2f2fe3406c5dfdfc2ecdf8e42c5e1603 414461 ISK result: (length: 32 bytes) 62a445a4daa3546dd031c66ead2e4e015abbcc83bde31c90f841149f d441c58a¶
H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)): (length: 32 bytes) a7386d1c2eb06e8056d7fecbcf691e08d189d96236020ef31b414069 8a4b99f9 H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)): (length: 32 bytes) d337dbc0dd797b4e6f2f14ea4925c58e5d5523871e8cb43a3c1b0f2b 1a1ffde3¶
const unsigned char tc_PRS[] = { 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64, }; const unsigned char tc_CI[] = { 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64, 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74, 0x6f,0x72, }; const unsigned char tc_sid[] = { 0x34,0xb3,0x64,0x54,0xca,0xb2,0xe7,0x84,0x2c,0x38,0x9f,0x7d, 0x88,0xec,0xb7,0xdf, }; const unsigned char tc_g[] = { 0x04,0xee,0xe5,0x77,0x32,0x0b,0x1c,0x24,0x1a,0x79,0x41,0x9f, 0xcd,0xe5,0x71,0x8c,0x2b,0x63,0xf8,0x1e,0xf8,0x71,0x7d,0x56, 0xa5,0x7d,0x2f,0xb2,0x6b,0x65,0xa8,0xbe,0xb6,0x35,0x73,0xb5, 0x26,0x05,0xef,0xb3,0x2f,0xf4,0xcf,0x31,0xaa,0xef,0x9a,0x92, 0xdf,0x84,0xe4,0xe8,0x40,0x8c,0xc6,0xc7,0xcf,0x27,0xa5,0x35, 0xaa,0xd2,0xb3,0x8a,0x56, }; const unsigned char tc_ya[] = { 0x37,0x57,0x4c,0xfb,0xf1,0xb9,0x5f,0xf6,0xa8,0xe2,0xd7,0xbe, 0x46,0x2d,0x4d,0x01,0xe6,0xdd,0xe2,0x61,0x8f,0x34,0xf4,0xde, 0x9d,0xf8,0x69,0xb2,0x4f,0x53,0x2c,0x5d, }; const unsigned char tc_ADa[] = { 0x41,0x44,0x61, }; const unsigned char tc_Ya[] = { 0x04,0x1f,0x12,0xad,0x5f,0xc6,0x50,0x10,0xa2,0x4f,0xc0,0x4c, 0x86,0x19,0x71,0x09,0xa3,0x6d,0xf0,0xe9,0xce,0x85,0xa7,0x47, 0x9e,0x1e,0x13,0x64,0x69,0x2f,0xda,0xce,0x17,0xea,0x5a,0x63, 0x4e,0x19,0xc2,0x07,0xa5,0xd5,0x2e,0xad,0x6c,0x68,0x17,0xa1, 0x63,0xcf,0x2f,0x2f,0xe3,0x40,0x6c,0x5d,0xfd,0xfc,0x2e,0xcd, 0xf8,0xe4,0x2c,0x5e,0x16, }; const unsigned char tc_yb[] = { 0xe5,0x67,0x2f,0xc9,0xeb,0x4e,0x72,0x1f,0x41,0xd8,0x01,0x81, 0xec,0x4c,0x9f,0xd9,0x88,0x66,0x68,0xac,0xc4,0x80,0x24,0xd3, 0x3c,0x82,0xbb,0x10,0x2a,0xec,0xba,0x52, }; const unsigned char tc_ADb[] = { 0x41,0x44,0x62, }; const unsigned char tc_Yb[] = { 0x04,0x6a,0x51,0x18,0x0b,0x6e,0xba,0xba,0xf5,0xed,0x0a,0xf8, 0xcd,0x78,0x68,0x86,0xd9,0x33,0x42,0xbc,0xae,0x4c,0x15,0x8c, 0xe1,0x61,0x7a,0x0a,0xcc,0x8e,0xc3,0x54,0x48,0x6f,0x9e,0xd2, 0xe9,0x21,0x09,0x13,0x20,0x6d,0x1e,0x3f,0x5e,0x46,0x3d,0x2d, 0x32,0x0c,0x4f,0x1f,0x5c,0xe8,0xb6,0x77,0xa7,0xe3,0x8a,0x26, 0xf7,0x52,0xbf,0x8f,0x84, }; const unsigned char tc_K[] = { 0x3e,0x0e,0x2f,0x89,0x76,0xfb,0x8d,0x0d,0xee,0xe3,0x0a,0xef, 0x4b,0x5c,0xd3,0x63,0x1e,0xed,0x24,0x9a,0xf3,0x2f,0x53,0xd0, 0xdd,0x00,0x9b,0x5d,0x7b,0x8f,0x6b,0x6c, }; const unsigned char tc_ISK_IR[] = { 0x95,0x65,0xed,0x28,0x6b,0x6e,0x3c,0xf1,0xf9,0x43,0xfd,0x31, 0x74,0x6f,0x9a,0x22,0x93,0x55,0x37,0x02,0x5a,0x13,0x28,0xd4, 0x98,0x00,0x05,0xba,0x98,0x4f,0x0c,0x39, }; const unsigned char tc_ISK_SY[] = { 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e, 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90, 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a, }; const unsigned char tc_ISK_SY[] = { 0x62,0xa4,0x45,0xa4,0xda,0xa3,0x54,0x6d,0xd0,0x31,0xc6,0x6e, 0xad,0x2e,0x4e,0x01,0x5a,0xbb,0xcc,0x83,0xbd,0xe3,0x1c,0x90, 0xf8,0x41,0x14,0x9f,0xd4,0x41,0xc5,0x8a, }; const unsigned char tc_sid_out_ir[] = { 0xa7,0x38,0x6d,0x1c,0x2e,0xb0,0x6e,0x80,0x56,0xd7,0xfe,0xcb, 0xcf,0x69,0x1e,0x08,0xd1,0x89,0xd9,0x62,0x36,0x02,0x0e,0xf3, 0x1b,0x41,0x40,0x69,0x8a,0x4b,0x99,0xf9, }; const unsigned char tc_sid_out_oc[] = { 0xd3,0x37,0xdb,0xc0,0xdd,0x79,0x7b,0x4e,0x6f,0x2f,0x14,0xea, 0x49,0x25,0xc5,0x8e,0x5d,0x55,0x23,0x87,0x1e,0x8c,0xb4,0x3a, 0x3c,0x1b,0x0f,0x2b,0x1a,0x1f,0xfd,0xe3, };¶
#eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICIz #NEIzNjQ1NENBQjJFNzg0MkMzODlGN0Q4OEVDQjdERiIsICJnIjogIjA0RUVFNTc3Mz #IwQjFDMjQxQTc5NDE5RkNERTU3MThDMkI2M0Y4MUVGODcxN0Q1NkE1N0QyRkIyNkI2 #NUE4QkVCNjM1NzNCNTI2MDVFRkIzMkZGNENGMzFBQUVGOUE5MkRGODRFNEU4NDA4Q0 #M2QzdDRjI3QTUzNUFBRDJCMzhBNTYiLCAieWEiOiAiMzc1NzRDRkJGMUI5NUZGNkE4 #RTJEN0JFNDYyRDREMDFFNkRERTI2MThGMzRGNERFOURGODY5QjI0RjUzMkM1RCIsIC #JBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MUYxMkFENUZDNjUwMTBBMjRGQzA0Qzg2 #MTk3MTA5QTM2REYwRTlDRTg1QTc0NzlFMUUxMzY0NjkyRkRBQ0UxN0VBNUE2MzRFMT #lDMjA3QTVENTJFQUQ2QzY4MTdBMTYzQ0YyRjJGRTM0MDZDNURGREZDMkVDREY4RTQy #QzVFMTYiLCAieWIiOiAiRTU2NzJGQzlFQjRFNzIxRjQxRDgwMTgxRUM0QzlGRDk4OD #Y2NjhBQ0M0ODAyNEQzM0M4MkJCMTAyQUVDQkE1MiIsICJBRGIiOiAiNDE0NDYyIiwg #IlliIjogIjA0NkE1MTE4MEI2RUJBQkFGNUVEMEFGOENENzg2ODg2RDkzMzQyQkNBRT #RDMTU4Q0UxNjE3QTBBQ0M4RUMzNTQ0ODZGOUVEMkU5MjEwOTEzMjA2RDFFM0Y1RTQ2 #M0QyRDMyMEM0RjFGNUNFOEI2NzdBN0UzOEEyNkY3NTJCRjhGODQiLCAiSyI6ICIzRT #BFMkY4OTc2RkI4RDBERUVFMzBBRUY0QjVDRDM2MzFFRUQyNDlBRjMyRjUzRDBERDAw #OUI1RDdCOEY2QjZDIiwgIklTS19JUiI6ICI5NTY1RUQyODZCNkUzQ0YxRjk0M0ZEMz #E3NDZGOUEyMjkzNTUzNzAyNUExMzI4RDQ5ODAwMDVCQTk4NEYwQzM5IiwgIklTS19T #WSI6ICI2MkE0NDVBNERBQTM1NDZERDAzMUM2NkVBRDJFNEUwMTVBQkJDQzgzQkRFMz #FDOTBGODQxMTQ5RkQ0NDFDNThBIiwgInNpZF9vdXRwdXRfaXIiOiAiQTczODZEMUMy #RUIwNkU4MDU2RDdGRUNCQ0Y2OTFFMDhEMTg5RDk2MjM2MDIwRUYzMUI0MTQwNjk4QT #RCOTlGOSIsICJzaWRfb3V0cHV0X29jIjogIkQzMzdEQkMwREQ3OTdCNEU2RjJGMTRF #QTQ5MjVDNThFNUQ1NTIzODcxRThDQjQzQTNDMUIwRjJCMUExRkZERTMifQ==¶
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¶
For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.¶
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¶
#eyJWYWxpZCI6IHsicyI6ICJGMDEyNTAxQzA5MUZGOUI5OUExMjNGRkZFNTcxRDhCQz #AxRTgwNzdFRTU4MTM2MkUxQkQyMTM5OTA4MzU2NDNCIiwgIlgiOiAiMDQyNDY0OEVC #OTg2QzJCRTBBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRD #EyQkE0RTBGNzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3 #MzQ2RDEwQTRBQjI1MTRGQUVGNTgzMSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bG #wgY29vcmRpbmF0ZXMpIjogIjA0RjVBMTkxRjA3OEM4N0MzNjYzM0I3OEM3MDE3NTEx #NTlENTZDNTlGM0ZFOTEwNUI1NzIwNjczNDcwRjMwM0FCOTI1QjZBN0ZEMUNERDhGNj #Q5QTIxQ0YzNkI2OEQ5RTlDNEExMTkxOUE5NTE4OTI1MTk3ODYxMDRCMjcwMzM3NTci #LCAiRy5zY2FsYXJfbXVsdF92ZnkocyxYKSAob25seSBYLWNvb3JkaW5hdGUpIjogIk #Y1QTE5MUYwNzhDODdDMzY2MzNCNzhDNzAxNzUxMTU5RDU2QzU5RjNGRTkxMDVCNTcy #MDY3MzQ3MEYzMDNBQjkifSwgIkludmFsaWQgWTEiOiAiMDQyNDY0OEVCOTg2QzJCRT #BBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRDEyQkE0RTBG #NzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3MzQ2RDEwQT #RBQjI1MTRGQUVGNTg1NyIsICJJbnZhbGlkIFkyIjogIjAwIn0=¶
Inputs H = SHA-384 with input block size 128 bytes. PRS = b'Password' ; ZPAD length: 87 ; DSI = b'CPaceP384_XMD:SHA-384_SSWU_NU_' DST = b'CPaceP384_XMD:SHA-384_SSWU_NU__DST' CI = b'oc\x0bB_responder\x0bA_initiator' CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72 sid = 5b3773aa90e8f23c61563a4b645b276c Outputs generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes): (length: 172 bytes) 1e4350616365503338345f584d443a5348412d3338345f535357555f 4e555f0850617373776f726457000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001a6f630b425f726573706f6e 6465720b415f696e69746961746f72105b3773aa90e8f23c61563a4b 645b276c generator g: (length: 97 bytes) 04ffe1bdc3293fdbe31b2959916e52c018e923eac99836bd9a1cbeec 794a8d4d78baa32cdafc9685bc1067a780f4ad9c8a6c6e164aa42906 d1e27f782581adc8e0109219626a2b8fbdc34602e4084554bdd6c0c6 98dd657ac8e31b2bcce1c7b0d8¶
#eyJIIjogIlNIQS0zODQiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2 #MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0ODQxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RT #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiNUIzNzczQUE5MEU4RjIzQzYxNTYzQT #RCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0OD #QxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwNUIzNzczQUE5MEU4RjIzQzYxNT #YzQTRCNjQ1QjI3NkMiLCAiZ2VuZXJhdG9yIGciOiAiMDRGRkUxQkRDMzI5M0ZEQkUz #MUIyOTU5OTE2RTUyQzAxOEU5MjNFQUM5OTgzNkJEOUExQ0JFRUM3OTRBOEQ0RDc4Qk #FBMzJDREFGQzk2ODVCQzEwNjdBNzgwRjRBRDlDOEE2QzZFMTY0QUE0MjkwNkQxRTI3 #Rjc4MjU4MUFEQzhFMDEwOTIxOTYyNkEyQjhGQkRDMzQ2MDJFNDA4NDU1NEJERDZDME #M2OThERDY1N0FDOEUzMUIyQkNDRTFDN0IwRDgifQ==¶
Inputs ADa = b'ADa' ya (big endian): (length: 48 bytes) ef433dd5ad142c860e7cb6400dd315d388d5ec5420c550e9d6f0907f 375d988bc4d704837e43561c497e7dd93edcdb9d Outputs Ya: (length: 97 bytes) 0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7 3b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993a3 6285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1770050 a94d6826d52f211b234792e66d Alternative correct value for Ya: (-ya)*g: (length: 97 bytes) 0434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310b7 3b96fa1ec78619c5a1e524472778331fbe009fa156b5cdfc1bd66c5c 9d7a05ab193dbe7b02dd8ba737887e41e9000b924368f33e4d88ffaf 55b297d92ad0dee4ddb86d1992¶
Inputs ADb = b'ADb' yb (big endian): (length: 48 bytes) 50b0e36b95a2edfaa8342b843dddc90b175330f2399c1b36586dedda 3c255975f30be6a750f9404fccc62a6323b5e471 Outputs Yb: (length: 97 bytes) 040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d 104cdaeb630b7c5c18748deb25653ad2a4cb5e6274841cad328bb031 2628b9b1f51bea72b8c610999a6730f752649205ae85c452ef83f98b e715cd0103186874b07cf02074 Alternative correct value for Yb: (-yb)*g: (length: 97 bytes) 040a6559147fd492ad74ab1f4def6196fd6399540e84706227a1f90d 104cdaeb630b7c5c18748deb25653ad2a4cb5e62747be352cd744fce d9d7464e0ae4158d4739ef666598cf08ad9b6dfa517a3bad0f7c0674 17ea32fefce7978b50830fdf8b¶
scalar_mult_vfy(ya,Yb): (length: 48 bytes) a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6 db858fe161de7576206a8a35bd4a60e00724fd3e scalar_mult_vfy(yb,Ya): (length: 48 bytes) a9acaea95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6 db858fe161de7576206a8a35bd4a60e00724fd3e¶
transcript_ir(Ya,ADa,Yb,ADb): (length: 204 bytes) 610434a04da121995d81d7c5ded02cf2e70954dca49059485ea38310 b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e42993 a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b17700 50a94d6826d52f211b234792e66d0341446161040a6559147fd492ad 74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c5c18 748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea72b8 c610999a6730f752649205ae85c452ef83f98be715cd0103186874b0 7cf0207403414462 DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK': (length: 34 bytes) 4350616365503338345f584d443a5348412d3338345f535357555f4e 555f5f49534b lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb): (length: 305 bytes) 224350616365503338345f584d443a5348412d3338345f535357555f 4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f e161de7576206a8a35bd4a60e00724fd3e610434a04da121995d81d7 c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5a1e5 24472778331fbe009fa1564a3203e42993a36285fa54e6c24184fd22 7458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b2347 92e66d0341446161040a6559147fd492ad74ab1f4def6196fd639954 0e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb5e62 74841cad328bb0312628b9b1f51bea72b8c610999a6730f752649205 ae85c452ef83f98be715cd0103186874b07cf0207403414462 ISK result: (length: 48 bytes) d1b74375c7d63d7de246cbf3fc2b3092645c73a0aa816989c0de6048 ed4ece6a54df82d05d2be3498cb9288be7bdbdb9¶
transcript_oc(Ya,ADa,Yb,ADb): (length: 206 bytes) 6f63610434a04da121995d81d7c5ded02cf2e70954dca49059485ea3 8310b73b96fa1ec78619c5a1e524472778331fbe009fa1564a3203e4 2993a36285fa54e6c24184fd227458c87781be16fff46dbc970cc1b1 770050a94d6826d52f211b234792e66d0341446161040a6559147fd4 92ad74ab1f4def6196fd6399540e84706227a1f90d104cdaeb630b7c 5c18748deb25653ad2a4cb5e6274841cad328bb0312628b9b1f51bea 72b8c610999a6730f752649205ae85c452ef83f98be715cd01031868 74b07cf0207403414462 DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK': (length: 34 bytes) 4350616365503338345f584d443a5348412d3338345f535357555f4e 555f5f49534b lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb): (length: 307 bytes) 224350616365503338345f584d443a5348412d3338345f535357555f 4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c30a9acae a95692a64462067fe8e4321f2fca9793a8a0420f0e253ed0d6db858f e161de7576206a8a35bd4a60e00724fd3e6f63610434a04da121995d 81d7c5ded02cf2e70954dca49059485ea38310b73b96fa1ec78619c5 a1e524472778331fbe009fa1564a3203e42993a36285fa54e6c24184 fd227458c87781be16fff46dbc970cc1b1770050a94d6826d52f211b 234792e66d0341446161040a6559147fd492ad74ab1f4def6196fd63 99540e84706227a1f90d104cdaeb630b7c5c18748deb25653ad2a4cb 5e6274841cad328bb0312628b9b1f51bea72b8c610999a6730f75264 9205ae85c452ef83f98be715cd0103186874b07cf0207403414462 ISK result: (length: 48 bytes) a051d4532ca9fb6774e097ebac69c1d6a18144a15421dc155d0b1e8a ef9f9d8c0fe86e85d3cbee7796ff50171f42801b¶
H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)): (length: 48 bytes) 8d5a03946a69ffa12cd6efd469fe8671bbc25fad6db2656f3963c94e 9c940bdecc2bd555474c211817787d5cf7870ed1 H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)): (length: 48 bytes) c0729db25db40c48a35f787d5410b2cb9a2d9f5e9cf1cf159ed2f63c 6b2185e597e176cc221422e9496eeda2bf123c8b¶
const unsigned char tc_PRS[] = { 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64, }; const unsigned char tc_CI[] = { 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64, 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74, 0x6f,0x72, }; const unsigned char tc_sid[] = { 0x5b,0x37,0x73,0xaa,0x90,0xe8,0xf2,0x3c,0x61,0x56,0x3a,0x4b, 0x64,0x5b,0x27,0x6c, }; const unsigned char tc_g[] = { 0x04,0xff,0xe1,0xbd,0xc3,0x29,0x3f,0xdb,0xe3,0x1b,0x29,0x59, 0x91,0x6e,0x52,0xc0,0x18,0xe9,0x23,0xea,0xc9,0x98,0x36,0xbd, 0x9a,0x1c,0xbe,0xec,0x79,0x4a,0x8d,0x4d,0x78,0xba,0xa3,0x2c, 0xda,0xfc,0x96,0x85,0xbc,0x10,0x67,0xa7,0x80,0xf4,0xad,0x9c, 0x8a,0x6c,0x6e,0x16,0x4a,0xa4,0x29,0x06,0xd1,0xe2,0x7f,0x78, 0x25,0x81,0xad,0xc8,0xe0,0x10,0x92,0x19,0x62,0x6a,0x2b,0x8f, 0xbd,0xc3,0x46,0x02,0xe4,0x08,0x45,0x54,0xbd,0xd6,0xc0,0xc6, 0x98,0xdd,0x65,0x7a,0xc8,0xe3,0x1b,0x2b,0xcc,0xe1,0xc7,0xb0, 0xd8, }; const unsigned char tc_ya[] = { 0xef,0x43,0x3d,0xd5,0xad,0x14,0x2c,0x86,0x0e,0x7c,0xb6,0x40, 0x0d,0xd3,0x15,0xd3,0x88,0xd5,0xec,0x54,0x20,0xc5,0x50,0xe9, 0xd6,0xf0,0x90,0x7f,0x37,0x5d,0x98,0x8b,0xc4,0xd7,0x04,0x83, 0x7e,0x43,0x56,0x1c,0x49,0x7e,0x7d,0xd9,0x3e,0xdc,0xdb,0x9d, }; const unsigned char tc_ADa[] = { 0x41,0x44,0x61, }; const unsigned char tc_Ya[] = { 0x04,0x34,0xa0,0x4d,0xa1,0x21,0x99,0x5d,0x81,0xd7,0xc5,0xde, 0xd0,0x2c,0xf2,0xe7,0x09,0x54,0xdc,0xa4,0x90,0x59,0x48,0x5e, 0xa3,0x83,0x10,0xb7,0x3b,0x96,0xfa,0x1e,0xc7,0x86,0x19,0xc5, 0xa1,0xe5,0x24,0x47,0x27,0x78,0x33,0x1f,0xbe,0x00,0x9f,0xa1, 0x56,0x4a,0x32,0x03,0xe4,0x29,0x93,0xa3,0x62,0x85,0xfa,0x54, 0xe6,0xc2,0x41,0x84,0xfd,0x22,0x74,0x58,0xc8,0x77,0x81,0xbe, 0x16,0xff,0xf4,0x6d,0xbc,0x97,0x0c,0xc1,0xb1,0x77,0x00,0x50, 0xa9,0x4d,0x68,0x26,0xd5,0x2f,0x21,0x1b,0x23,0x47,0x92,0xe6, 0x6d, }; const unsigned char tc_yb[] = { 0x50,0xb0,0xe3,0x6b,0x95,0xa2,0xed,0xfa,0xa8,0x34,0x2b,0x84, 0x3d,0xdd,0xc9,0x0b,0x17,0x53,0x30,0xf2,0x39,0x9c,0x1b,0x36, 0x58,0x6d,0xed,0xda,0x3c,0x25,0x59,0x75,0xf3,0x0b,0xe6,0xa7, 0x50,0xf9,0x40,0x4f,0xcc,0xc6,0x2a,0x63,0x23,0xb5,0xe4,0x71, }; const unsigned char tc_ADb[] = { 0x41,0x44,0x62, }; const unsigned char tc_Yb[] = { 0x04,0x0a,0x65,0x59,0x14,0x7f,0xd4,0x92,0xad,0x74,0xab,0x1f, 0x4d,0xef,0x61,0x96,0xfd,0x63,0x99,0x54,0x0e,0x84,0x70,0x62, 0x27,0xa1,0xf9,0x0d,0x10,0x4c,0xda,0xeb,0x63,0x0b,0x7c,0x5c, 0x18,0x74,0x8d,0xeb,0x25,0x65,0x3a,0xd2,0xa4,0xcb,0x5e,0x62, 0x74,0x84,0x1c,0xad,0x32,0x8b,0xb0,0x31,0x26,0x28,0xb9,0xb1, 0xf5,0x1b,0xea,0x72,0xb8,0xc6,0x10,0x99,0x9a,0x67,0x30,0xf7, 0x52,0x64,0x92,0x05,0xae,0x85,0xc4,0x52,0xef,0x83,0xf9,0x8b, 0xe7,0x15,0xcd,0x01,0x03,0x18,0x68,0x74,0xb0,0x7c,0xf0,0x20, 0x74, }; const unsigned char tc_K[] = { 0xa9,0xac,0xae,0xa9,0x56,0x92,0xa6,0x44,0x62,0x06,0x7f,0xe8, 0xe4,0x32,0x1f,0x2f,0xca,0x97,0x93,0xa8,0xa0,0x42,0x0f,0x0e, 0x25,0x3e,0xd0,0xd6,0xdb,0x85,0x8f,0xe1,0x61,0xde,0x75,0x76, 0x20,0x6a,0x8a,0x35,0xbd,0x4a,0x60,0xe0,0x07,0x24,0xfd,0x3e, }; const unsigned char tc_ISK_IR[] = { 0xd1,0xb7,0x43,0x75,0xc7,0xd6,0x3d,0x7d,0xe2,0x46,0xcb,0xf3, 0xfc,0x2b,0x30,0x92,0x64,0x5c,0x73,0xa0,0xaa,0x81,0x69,0x89, 0xc0,0xde,0x60,0x48,0xed,0x4e,0xce,0x6a,0x54,0xdf,0x82,0xd0, 0x5d,0x2b,0xe3,0x49,0x8c,0xb9,0x28,0x8b,0xe7,0xbd,0xbd,0xb9, }; const unsigned char tc_ISK_SY[] = { 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb, 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15, 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85, 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b, }; const unsigned char tc_ISK_SY[] = { 0xa0,0x51,0xd4,0x53,0x2c,0xa9,0xfb,0x67,0x74,0xe0,0x97,0xeb, 0xac,0x69,0xc1,0xd6,0xa1,0x81,0x44,0xa1,0x54,0x21,0xdc,0x15, 0x5d,0x0b,0x1e,0x8a,0xef,0x9f,0x9d,0x8c,0x0f,0xe8,0x6e,0x85, 0xd3,0xcb,0xee,0x77,0x96,0xff,0x50,0x17,0x1f,0x42,0x80,0x1b, }; const unsigned char tc_sid_out_ir[] = { 0x8d,0x5a,0x03,0x94,0x6a,0x69,0xff,0xa1,0x2c,0xd6,0xef,0xd4, 0x69,0xfe,0x86,0x71,0xbb,0xc2,0x5f,0xad,0x6d,0xb2,0x65,0x6f, 0x39,0x63,0xc9,0x4e,0x9c,0x94,0x0b,0xde,0xcc,0x2b,0xd5,0x55, 0x47,0x4c,0x21,0x18,0x17,0x78,0x7d,0x5c,0xf7,0x87,0x0e,0xd1, }; const unsigned char tc_sid_out_oc[] = { 0xc0,0x72,0x9d,0xb2,0x5d,0xb4,0x0c,0x48,0xa3,0x5f,0x78,0x7d, 0x54,0x10,0xb2,0xcb,0x9a,0x2d,0x9f,0x5e,0x9c,0xf1,0xcf,0x15, 0x9e,0xd2,0xf6,0x3c,0x6b,0x21,0x85,0xe5,0x97,0xe1,0x76,0xcc, 0x22,0x14,0x22,0xe9,0x49,0x6e,0xed,0xa2,0xbf,0x12,0x3c,0x8b, };¶
#eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI1 #QjM3NzNBQTkwRThGMjNDNjE1NjNBNEI2NDVCMjc2QyIsICJnIjogIjA0RkZFMUJEQz #MyOTNGREJFMzFCMjk1OTkxNkU1MkMwMThFOTIzRUFDOTk4MzZCRDlBMUNCRUVDNzk0 #QThENEQ3OEJBQTMyQ0RBRkM5Njg1QkMxMDY3QTc4MEY0QUQ5QzhBNkM2RTE2NEFBND #I5MDZEMUUyN0Y3ODI1ODFBREM4RTAxMDkyMTk2MjZBMkI4RkJEQzM0NjAyRTQwODQ1 #NTRCREQ2QzBDNjk4REQ2NTdBQzhFMzFCMkJDQ0UxQzdCMEQ4IiwgInlhIjogIkVGND #MzREQ1QUQxNDJDODYwRTdDQjY0MDBERDMxNUQzODhENUVDNTQyMEM1NTBFOUQ2RjA5 #MDdGMzc1RDk4OEJDNEQ3MDQ4MzdFNDM1NjFDNDk3RTdERDkzRURDREI5RCIsICJBRG #EiOiAiNDE0NDYxIiwgIllhIjogIjA0MzRBMDREQTEyMTk5NUQ4MUQ3QzVERUQwMkNG #MkU3MDk1NERDQTQ5MDU5NDg1RUEzODMxMEI3M0I5NkZBMUVDNzg2MTlDNUExRTUyND #Q3Mjc3ODMzMUZCRTAwOUZBMTU2NEEzMjAzRTQyOTkzQTM2Mjg1RkE1NEU2QzI0MTg0 #RkQyMjc0NThDODc3ODFCRTE2RkZGNDZEQkM5NzBDQzFCMTc3MDA1MEE5NEQ2ODI2RD #UyRjIxMUIyMzQ3OTJFNjZEIiwgInliIjogIjUwQjBFMzZCOTVBMkVERkFBODM0MkI4 #NDNERERDOTBCMTc1MzMwRjIzOTlDMUIzNjU4NkRFRERBM0MyNTU5NzVGMzBCRTZBNz #UwRjk0MDRGQ0NDNjJBNjMyM0I1RTQ3MSIsICJBRGIiOiAiNDE0NDYyIiwgIlliIjog #IjA0MEE2NTU5MTQ3RkQ0OTJBRDc0QUIxRjRERUY2MTk2RkQ2Mzk5NTQwRTg0NzA2Mj #I3QTFGOTBEMTA0Q0RBRUI2MzBCN0M1QzE4NzQ4REVCMjU2NTNBRDJBNENCNUU2Mjc0 #ODQxQ0FEMzI4QkIwMzEyNjI4QjlCMUY1MUJFQTcyQjhDNjEwOTk5QTY3MzBGNzUyNj #Q5MjA1QUU4NUM0NTJFRjgzRjk4QkU3MTVDRDAxMDMxODY4NzRCMDdDRjAyMDc0Iiwg #IksiOiAiQTlBQ0FFQTk1NjkyQTY0NDYyMDY3RkU4RTQzMjFGMkZDQTk3OTNBOEEwND #IwRjBFMjUzRUQwRDZEQjg1OEZFMTYxREU3NTc2MjA2QThBMzVCRDRBNjBFMDA3MjRG #RDNFIiwgIklTS19JUiI6ICJEMUI3NDM3NUM3RDYzRDdERTI0NkNCRjNGQzJCMzA5Mj #Y0NUM3M0EwQUE4MTY5ODlDMERFNjA0OEVENEVDRTZBNTRERjgyRDA1RDJCRTM0OThD #QjkyODhCRTdCREJEQjkiLCAiSVNLX1NZIjogIkEwNTFENDUzMkNBOUZCNjc3NEUwOT #dFQkFDNjlDMUQ2QTE4MTQ0QTE1NDIxREMxNTVEMEIxRThBRUY5RjlEOEMwRkU4NkU4 #NUQzQ0JFRTc3OTZGRjUwMTcxRjQyODAxQiIsICJzaWRfb3V0cHV0X2lyIjogIjhENU #EwMzk0NkE2OUZGQTEyQ0Q2RUZENDY5RkU4NjcxQkJDMjVGQUQ2REIyNjU2RjM5NjND #OTRFOUM5NDBCREVDQzJCRDU1NTQ3NEMyMTE4MTc3ODdENUNGNzg3MEVEMSIsICJzaW #Rfb3V0cHV0X29jIjogIkMwNzI5REIyNURCNDBDNDhBMzVGNzg3RDU0MTBCMkNCOUEy #RDlGNUU5Q0YxQ0YxNTlFRDJGNjNDNkIyMTg1RTU5N0UxNzZDQzIyMTQyMkU5NDk2RU #VEQTJCRjEyM0M4QiJ9¶
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¶
For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.¶
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¶
#eyJWYWxpZCI6IHsicyI6ICI2RThBOTlBNUNERDQwOEVBRTk4RTFCOEFFRDI4NkU3Qj #EyQURCQkRBQzdGMkM2MjhEOTA2MENFOTJBRTBEOTBCRDU3QTU2NEZEMzUwMEZCQ0NF #MzQyNURDOTRCQTBBREUiLCAiWCI6ICIwNDVCNENENTNDNDUwNkNDMDRCQTRDNDRGMj #c2MkQ1RDMyQzNFNTVERjI1QjhCQUE1NTcxQjE2NTdBRDk1NzZFRkVBODI1OUYwNjg0 #REUwNjVBNDcwNTg1QjRCRTg3Njc0OEM3Nzk3MDU0RjNERUZFRjIxQjc3RjgzRDUzQk #FDNTdDODlENTJBQTRENkRENTg3MkJEMjgxOTg5QjEzODM1OTY5ODAwOUY4QUMxRjMw #MTUzOEJBRENDRTlEOUY0MDM2RSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bGwgY2 #9vcmRpbmF0ZXMpIjogIjA0NjVDMjhEQjA1RkQ5RjlBOTM2NTFDNUNDMzFFQUU0OUM0 #RTUyNDZCNDY0ODlCOEY2MTA1ODczMzE3M0EwMzNDREE3NkMzRTNFQTUzNTJCODA0RT #Y3RkRCRTJFMzM0QkU4MjQ1REFENUM4Qzk5M0U2M0JBQ0YwNDU2NDc4RjI5QjcxQjZD #ODU5RjEzNjc2Rjg0RkYxNTBEMjc0MUYwMjhGNTYwNTg0QTBCREJBMTlBNjNERjYyQz #A4OTQ5QzJGRDZEIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29y #ZGluYXRlKSI6ICI2NUMyOERCMDVGRDlGOUE5MzY1MUM1Q0MzMUVBRTQ5QzRFNTI0Nk #I0NjQ4OUI4RjYxMDU4NzMzMTczQTAzM0NEQTc2QzNFM0VBNTM1MkI4MDRFNjdGREJF #MkUzMzRCRTgifSwgIkludmFsaWQgWTEiOiAiMDQ1QjRDRDUzQzQ1MDZDQzA0QkE0Qz #Q0RjI3NjJENUQzMkMzRTU1REYyNUI4QkFBNTU3MUIxNjU3QUQ5NTc2RUZFQTgyNTlG #MDY4NERFMDY1QTQ3MDU4NUI0QkU4NzY3NDhDNzc5NzA1NEYzREVGRUYyMUI3N0Y4M0 #Q1M0JBQzU3Qzg5RDUyQUE0RDZERDU4NzJCRDI4MTk4OUIxMzgzNTk2OTgwMDlGOEFD #MUYzMDE1MzhCQURDQ0U5RDlGNDAzMDIiLCAiSW52YWxpZCBZMiI6ICIwMCJ9¶
Inputs H = SHA-512 with input block size 128 bytes. PRS = b'Password' ; ZPAD length: 87 ; DSI = b'CPaceP521_XMD:SHA-512_SSWU_NU_' DST = b'CPaceP521_XMD:SHA-512_SSWU_NU__DST' CI = b'oc\x0bB_responder\x0bA_initiator' CI = 6f630b425f726573706f6e6465720b415f696e69746961746f72 sid = 7e4b4791d6a8ef019b936c79fb7f2c57 Outputs generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes): (length: 172 bytes) 1e4350616365503532315f584d443a5348412d3531325f535357555f 4e555f0850617373776f726457000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001a6f630b425f726573706f6e 6465720b415f696e69746961746f72107e4b4791d6a8ef019b936c79 fb7f2c57 generator g: (length: 133 bytes) 0400e58a8fbf08b38e34a3676f6d690bed58aa4115ff32a57ec87172 fc2a1fb89d03258c6429c464981b3284b5fedbd1244bf27432008868 7065b9075dd558e14ed69901d2162db1ba3a49c97dca7c902cb1b96b abe21a31942114c860665b35c46b8213f6de17194de54c441083dd11 63d5907adad8824bb1307dcf6a55c11a8f01d9789b¶
#eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2 #MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0ODQxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RT #U1NUYiLCAiQ0kiOiAiNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjBCNDE1RjY5 #NkU2OTc0Njk2MTc0NkY3MiIsICJzaWQiOiAiN0U0QjQ3OTFENkE4RUYwMTlCOTM2Qz #c5RkI3RjJDNTciLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2lkLEgu #c19pbl9ieXRlcykiOiAiMUU0MzUwNjE2MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0OD #QxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RTU1NUYwODUwNjE3MzczNzc2RjcyNjQ1NzAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFBNkY2MzBCNDI1RjcyNjU3MzcwNkY2RTY0 #NjU3MjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjEwN0U0QjQ3OTFENkE4RUYwMTlCOT #M2Qzc5RkI3RjJDNTciLCAiZ2VuZXJhdG9yIGciOiAiMDQwMEU1OEE4RkJGMDhCMzhF #MzRBMzY3NkY2RDY5MEJFRDU4QUE0MTE1RkYzMkE1N0VDODcxNzJGQzJBMUZCODlEMD #MyNThDNjQyOUM0NjQ5ODFCMzI4NEI1RkVEQkQxMjQ0QkYyNzQzMjAwODg2ODcwNjVC #OTA3NURENTU4RTE0RUQ2OTkwMUQyMTYyREIxQkEzQTQ5Qzk3RENBN0M5MDJDQjFCOT #ZCQUJFMjFBMzE5NDIxMTRDODYwNjY1QjM1QzQ2QjgyMTNGNkRFMTcxOTRERTU0QzQ0 #MTA4M0REMTE2M0Q1OTA3QURBRDg4MjRCQjEzMDdEQ0Y2QTU1QzExQThGMDFEOTc4OU #IifQ==¶
Inputs ADa = b'ADa' ya (big endian): (length: 66 bytes) 006367e9c2aeff9f1db19af600cca73343d47cbe446cebbd1ccd783f 82755a872da86fd0707eb3767c6114f1803deb62d63bdd1e613f67e6 3e8c141ee5310e3ee819 Outputs Ya: (length: 133 bytes) 0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f 30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090 7312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c43961ef 60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f12254 e6f9950dd01fa8e26a8b20736fb63c63c81094f681 Alternative correct value for Ya: (-ya)*g: (length: 133 bytes) 0400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5381f 30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff768090 7312eb724cddb4dcce675b016752bff0107f1e214b43e8a93bc69e10 9f47a0d29d12ba7bab1ee9e95a2e20e1a7f69c97de58c99d060eddab 19066af22fe0571d9574df8c9049c39c37ef6b097e¶
Inputs ADb = b'ADb' yb (big endian): (length: 66 bytes) 009227bf8dc741dacc9422f8bf3c0e96fce9587bc562eaafe0dc5f6f 82f28594e4a6f98553560c62b75fa4abb198cecbbb86ebd41b0ea025 4cde78ac68d39a240ae7 Outputs Yb: (length: 133 bytes) 0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c 709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21 8bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c818 ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92f4 03e0fa3207de8bb41b388d81046a298ed8ddac9b2a Alternative correct value for Yb: (-yb)*g: (length: 133 bytes) 0400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f70c 709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa21 8bfaeb3e1ffd9f19bf062d00094ea363c9ae41b3f7450fe113da37e7 11ed39123b9df9bb4e26830db07978cd2a901ba31871cfd3dde36d0b fc1f05cdf821744be4c7727efb95d67127225364d5¶
scalar_mult_vfy(ya,Yb): (length: 66 bytes) 018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509 516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30 832c23d477c991bea8e5 scalar_mult_vfy(yb,Ya): (length: 66 bytes) 018e0e7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509 516e787a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30 832c23d477c991bea8e5¶
transcript_ir(Ya,ADa,Yb,ADb): (length: 278 bytes) 85010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f81e5 381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130ff76 80907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756c439 61ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662f9f1 2254e6f9950dd01fa8e26a8b20736fb63c63c81094f6810341446185 010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e07f7 0c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316afe2fa 218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec25c8 18ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c221c92 f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462 DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK': (length: 34 bytes) 4350616365503532315f584d443a5348412d3531325f535357555f4e 555f5f49534b lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb): (length: 397 bytes) 224350616365503532315f584d443a5348412d3531325f535357555f 4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e 7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78 7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23 d477c991bea8e585010400c2bfd794467f4438277e85a42e101fa406 1e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad00985 7488db7130ff7680907312eb724cddb4dcce675b0098ad400fef80e1 deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e580963 6821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094 f6810341446185010400706ea69b2b7167773248ea6e69a574e9dd2f f8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03fc24 2e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c 08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56fe45c e78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b 2a03414462 ISK result: (length: 64 bytes) 1669a0a29726adc7eea2510d6f7e004a135fa63ac3c9f9e6ce53cba5 d5e3781aced515956041e43358409a13ef90ddc3c36fd8d7d81424c8 e94592e21854260a¶
transcript_oc(Ya,ADa,Yb,ADb): (length: 280 bytes) 6f6385010400c2bfd794467f4438277e85a42e101fa4061e1ef6e05f 81e5381f30e73b341dd726089cb6a6bbe5a509fad009857488db7130 ff7680907312eb724cddb4dcce675b0098ad400fef80e1deb4bc1756 c43961ef60b85f2d62ed458454e11616a5d1df1e5809636821a73662 f9f12254e6f9950dd01fa8e26a8b20736fb63c63c81094f681034144 6185010400706ea69b2b7167773248ea6e69a574e9dd2ff8a3d04a6e 07f70c709869ca486827d59f9290599d1cf94e1a03fc242e2b1316af e2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651be4c08baf01eec 25c818ee12c6edc4620644b1d97cf24f868732d56fe45ce78e302c22 1c92f403e0fa3207de8bb41b388d81046a298ed8ddac9b2a03414462 DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK': (length: 34 bytes) 4350616365503532315f584d443a5348412d3531325f535357555f4e 555f5f49534b lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb): (length: 399 bytes) 224350616365503532315f584d443a5348412d3531325f535357555f 4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c5742018e0e 7e9ade74917c11c0f6b52f95ed871eab235437cbee8b5c2509516e78 7a80e825ed5d539fa6a0ec32c48fa8fabe85809d000d0cfd30832c23 d477c991bea8e56f6385010400c2bfd794467f4438277e85a42e101f a4061e1ef6e05f81e5381f30e73b341dd726089cb6a6bbe5a509fad0 09857488db7130ff7680907312eb724cddb4dcce675b0098ad400fef 80e1deb4bc1756c43961ef60b85f2d62ed458454e11616a5d1df1e58 09636821a73662f9f12254e6f9950dd01fa8e26a8b20736fb63c63c8 1094f6810341446185010400706ea69b2b7167773248ea6e69a574e9 dd2ff8a3d04a6e07f70c709869ca486827d59f9290599d1cf94e1a03 fc242e2b1316afe2fa218bfaeb3e1ffd9f19bf062d01f6b15c9c3651 be4c08baf01eec25c818ee12c6edc4620644b1d97cf24f868732d56f e45ce78e302c221c92f403e0fa3207de8bb41b388d81046a298ed8dd ac9b2a03414462 ISK result: (length: 64 bytes) f2f3bd8cd442a4e16659b47a7b7a84f29be75893ed2e5f772d7a3c8b 779eb0df937a4ec50a4f1ff01ebbaa97d80e090ea69b00a95200ed25 8e48c6f7e9d8fbc2¶
H.hash(b"CPaceSidOut" + transcript_ir(Ya,ADa, Yb,ADb)): (length: 64 bytes) 56cc3cd8be77cdc84c0d1906de1ffc8ef7cbb326a3f05267b6e8c634 4e2781eb20ef725e84cb1bb45927435051b4e0fae78e975bf15099f9 e38d755413eee2fd H.hash(b"CPaceSidOut" + transcript_oc(Ya,ADa, Yb,ADb)): (length: 64 bytes) a46c7189ba6a36c4447741e057da39c885b7d59e08bd2df1852a5271 f2a8a2e9b187ccd07325a3eede646adee0c06fe58da77f74177896b2 1053c5d107de006d¶
const unsigned char tc_PRS[] = { 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64, }; const unsigned char tc_CI[] = { 0x6f,0x63,0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64, 0x65,0x72,0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74, 0x6f,0x72, }; const unsigned char tc_sid[] = { 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79, 0xfb,0x7f,0x2c,0x57, }; const unsigned char tc_g[] = { 0x04,0x00,0xe5,0x8a,0x8f,0xbf,0x08,0xb3,0x8e,0x34,0xa3,0x67, 0x6f,0x6d,0x69,0x0b,0xed,0x58,0xaa,0x41,0x15,0xff,0x32,0xa5, 0x7e,0xc8,0x71,0x72,0xfc,0x2a,0x1f,0xb8,0x9d,0x03,0x25,0x8c, 0x64,0x29,0xc4,0x64,0x98,0x1b,0x32,0x84,0xb5,0xfe,0xdb,0xd1, 0x24,0x4b,0xf2,0x74,0x32,0x00,0x88,0x68,0x70,0x65,0xb9,0x07, 0x5d,0xd5,0x58,0xe1,0x4e,0xd6,0x99,0x01,0xd2,0x16,0x2d,0xb1, 0xba,0x3a,0x49,0xc9,0x7d,0xca,0x7c,0x90,0x2c,0xb1,0xb9,0x6b, 0xab,0xe2,0x1a,0x31,0x94,0x21,0x14,0xc8,0x60,0x66,0x5b,0x35, 0xc4,0x6b,0x82,0x13,0xf6,0xde,0x17,0x19,0x4d,0xe5,0x4c,0x44, 0x10,0x83,0xdd,0x11,0x63,0xd5,0x90,0x7a,0xda,0xd8,0x82,0x4b, 0xb1,0x30,0x7d,0xcf,0x6a,0x55,0xc1,0x1a,0x8f,0x01,0xd9,0x78, 0x9b, }; const unsigned char tc_ya[] = { 0x00,0x63,0x67,0xe9,0xc2,0xae,0xff,0x9f,0x1d,0xb1,0x9a,0xf6, 0x00,0xcc,0xa7,0x33,0x43,0xd4,0x7c,0xbe,0x44,0x6c,0xeb,0xbd, 0x1c,0xcd,0x78,0x3f,0x82,0x75,0x5a,0x87,0x2d,0xa8,0x6f,0xd0, 0x70,0x7e,0xb3,0x76,0x7c,0x61,0x14,0xf1,0x80,0x3d,0xeb,0x62, 0xd6,0x3b,0xdd,0x1e,0x61,0x3f,0x67,0xe6,0x3e,0x8c,0x14,0x1e, 0xe5,0x31,0x0e,0x3e,0xe8,0x19, }; const unsigned char tc_ADa[] = { 0x41,0x44,0x61, }; const unsigned char tc_Ya[] = { 0x04,0x00,0xc2,0xbf,0xd7,0x94,0x46,0x7f,0x44,0x38,0x27,0x7e, 0x85,0xa4,0x2e,0x10,0x1f,0xa4,0x06,0x1e,0x1e,0xf6,0xe0,0x5f, 0x81,0xe5,0x38,0x1f,0x30,0xe7,0x3b,0x34,0x1d,0xd7,0x26,0x08, 0x9c,0xb6,0xa6,0xbb,0xe5,0xa5,0x09,0xfa,0xd0,0x09,0x85,0x74, 0x88,0xdb,0x71,0x30,0xff,0x76,0x80,0x90,0x73,0x12,0xeb,0x72, 0x4c,0xdd,0xb4,0xdc,0xce,0x67,0x5b,0x00,0x98,0xad,0x40,0x0f, 0xef,0x80,0xe1,0xde,0xb4,0xbc,0x17,0x56,0xc4,0x39,0x61,0xef, 0x60,0xb8,0x5f,0x2d,0x62,0xed,0x45,0x84,0x54,0xe1,0x16,0x16, 0xa5,0xd1,0xdf,0x1e,0x58,0x09,0x63,0x68,0x21,0xa7,0x36,0x62, 0xf9,0xf1,0x22,0x54,0xe6,0xf9,0x95,0x0d,0xd0,0x1f,0xa8,0xe2, 0x6a,0x8b,0x20,0x73,0x6f,0xb6,0x3c,0x63,0xc8,0x10,0x94,0xf6, 0x81, }; const unsigned char tc_yb[] = { 0x00,0x92,0x27,0xbf,0x8d,0xc7,0x41,0xda,0xcc,0x94,0x22,0xf8, 0xbf,0x3c,0x0e,0x96,0xfc,0xe9,0x58,0x7b,0xc5,0x62,0xea,0xaf, 0xe0,0xdc,0x5f,0x6f,0x82,0xf2,0x85,0x94,0xe4,0xa6,0xf9,0x85, 0x53,0x56,0x0c,0x62,0xb7,0x5f,0xa4,0xab,0xb1,0x98,0xce,0xcb, 0xbb,0x86,0xeb,0xd4,0x1b,0x0e,0xa0,0x25,0x4c,0xde,0x78,0xac, 0x68,0xd3,0x9a,0x24,0x0a,0xe7, }; const unsigned char tc_ADb[] = { 0x41,0x44,0x62, }; const unsigned char tc_Yb[] = { 0x04,0x00,0x70,0x6e,0xa6,0x9b,0x2b,0x71,0x67,0x77,0x32,0x48, 0xea,0x6e,0x69,0xa5,0x74,0xe9,0xdd,0x2f,0xf8,0xa3,0xd0,0x4a, 0x6e,0x07,0xf7,0x0c,0x70,0x98,0x69,0xca,0x48,0x68,0x27,0xd5, 0x9f,0x92,0x90,0x59,0x9d,0x1c,0xf9,0x4e,0x1a,0x03,0xfc,0x24, 0x2e,0x2b,0x13,0x16,0xaf,0xe2,0xfa,0x21,0x8b,0xfa,0xeb,0x3e, 0x1f,0xfd,0x9f,0x19,0xbf,0x06,0x2d,0x01,0xf6,0xb1,0x5c,0x9c, 0x36,0x51,0xbe,0x4c,0x08,0xba,0xf0,0x1e,0xec,0x25,0xc8,0x18, 0xee,0x12,0xc6,0xed,0xc4,0x62,0x06,0x44,0xb1,0xd9,0x7c,0xf2, 0x4f,0x86,0x87,0x32,0xd5,0x6f,0xe4,0x5c,0xe7,0x8e,0x30,0x2c, 0x22,0x1c,0x92,0xf4,0x03,0xe0,0xfa,0x32,0x07,0xde,0x8b,0xb4, 0x1b,0x38,0x8d,0x81,0x04,0x6a,0x29,0x8e,0xd8,0xdd,0xac,0x9b, 0x2a, }; const unsigned char tc_K[] = { 0x01,0x8e,0x0e,0x7e,0x9a,0xde,0x74,0x91,0x7c,0x11,0xc0,0xf6, 0xb5,0x2f,0x95,0xed,0x87,0x1e,0xab,0x23,0x54,0x37,0xcb,0xee, 0x8b,0x5c,0x25,0x09,0x51,0x6e,0x78,0x7a,0x80,0xe8,0x25,0xed, 0x5d,0x53,0x9f,0xa6,0xa0,0xec,0x32,0xc4,0x8f,0xa8,0xfa,0xbe, 0x85,0x80,0x9d,0x00,0x0d,0x0c,0xfd,0x30,0x83,0x2c,0x23,0xd4, 0x77,0xc9,0x91,0xbe,0xa8,0xe5, }; const unsigned char tc_ISK_IR[] = { 0x16,0x69,0xa0,0xa2,0x97,0x26,0xad,0xc7,0xee,0xa2,0x51,0x0d, 0x6f,0x7e,0x00,0x4a,0x13,0x5f,0xa6,0x3a,0xc3,0xc9,0xf9,0xe6, 0xce,0x53,0xcb,0xa5,0xd5,0xe3,0x78,0x1a,0xce,0xd5,0x15,0x95, 0x60,0x41,0xe4,0x33,0x58,0x40,0x9a,0x13,0xef,0x90,0xdd,0xc3, 0xc3,0x6f,0xd8,0xd7,0xd8,0x14,0x24,0xc8,0xe9,0x45,0x92,0xe2, 0x18,0x54,0x26,0x0a, }; const unsigned char tc_ISK_SY[] = { 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a, 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77, 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5, 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e, 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7, 0xe9,0xd8,0xfb,0xc2, }; const unsigned char tc_ISK_SY[] = { 0xf2,0xf3,0xbd,0x8c,0xd4,0x42,0xa4,0xe1,0x66,0x59,0xb4,0x7a, 0x7b,0x7a,0x84,0xf2,0x9b,0xe7,0x58,0x93,0xed,0x2e,0x5f,0x77, 0x2d,0x7a,0x3c,0x8b,0x77,0x9e,0xb0,0xdf,0x93,0x7a,0x4e,0xc5, 0x0a,0x4f,0x1f,0xf0,0x1e,0xbb,0xaa,0x97,0xd8,0x0e,0x09,0x0e, 0xa6,0x9b,0x00,0xa9,0x52,0x00,0xed,0x25,0x8e,0x48,0xc6,0xf7, 0xe9,0xd8,0xfb,0xc2, }; const unsigned char tc_sid_out_ir[] = { 0x56,0xcc,0x3c,0xd8,0xbe,0x77,0xcd,0xc8,0x4c,0x0d,0x19,0x06, 0xde,0x1f,0xfc,0x8e,0xf7,0xcb,0xb3,0x26,0xa3,0xf0,0x52,0x67, 0xb6,0xe8,0xc6,0x34,0x4e,0x27,0x81,0xeb,0x20,0xef,0x72,0x5e, 0x84,0xcb,0x1b,0xb4,0x59,0x27,0x43,0x50,0x51,0xb4,0xe0,0xfa, 0xe7,0x8e,0x97,0x5b,0xf1,0x50,0x99,0xf9,0xe3,0x8d,0x75,0x54, 0x13,0xee,0xe2,0xfd, }; const unsigned char tc_sid_out_oc[] = { 0xa4,0x6c,0x71,0x89,0xba,0x6a,0x36,0xc4,0x44,0x77,0x41,0xe0, 0x57,0xda,0x39,0xc8,0x85,0xb7,0xd5,0x9e,0x08,0xbd,0x2d,0xf1, 0x85,0x2a,0x52,0x71,0xf2,0xa8,0xa2,0xe9,0xb1,0x87,0xcc,0xd0, 0x73,0x25,0xa3,0xee,0xde,0x64,0x6a,0xde,0xe0,0xc0,0x6f,0xe5, 0x8d,0xa7,0x7f,0x74,0x17,0x78,0x96,0xb2,0x10,0x53,0xc5,0xd1, 0x07,0xde,0x00,0x6d, };¶
#eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICI2RjYzMEI0MjVGNzI2NT #czNzA2RjZFNjQ2NTcyMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyIiwgInNpZCI6ICI3 #RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQjdGMkM1NyIsICJnIjogIjA0MDBFNThBOE #ZCRjA4QjM4RTM0QTM2NzZGNkQ2OTBCRUQ1OEFBNDExNUZGMzJBNTdFQzg3MTcyRkMy #QTFGQjg5RDAzMjU4QzY0MjlDNDY0OTgxQjMyODRCNUZFREJEMTI0NEJGMjc0MzIwMD #g4Njg3MDY1QjkwNzVERDU1OEUxNEVENjk5MDFEMjE2MkRCMUJBM0E0OUM5N0RDQTdD #OTAyQ0IxQjk2QkFCRTIxQTMxOTQyMTE0Qzg2MDY2NUIzNUM0NkI4MjEzRjZERTE3MT #k0REU1NEM0NDEwODNERDExNjNENTkwN0FEQUQ4ODI0QkIxMzA3RENGNkE1NUMxMUE4 #RjAxRDk3ODlCIiwgInlhIjogIjAwNjM2N0U5QzJBRUZGOUYxREIxOUFGNjAwQ0NBNz #MzNDNENDdDQkU0NDZDRUJCRDFDQ0Q3ODNGODI3NTVBODcyREE4NkZEMDcwN0VCMzc2 #N0M2MTE0RjE4MDNERUI2MkQ2M0JERDFFNjEzRjY3RTYzRThDMTQxRUU1MzEwRTNFRT #gxOSIsICJBRGEiOiAiNDE0NDYxIiwgIllhIjogIjA0MDBDMkJGRDc5NDQ2N0Y0NDM4 #Mjc3RTg1QTQyRTEwMUZBNDA2MUUxRUY2RTA1RjgxRTUzODFGMzBFNzNCMzQxREQ3Mj #YwODlDQjZBNkJCRTVBNTA5RkFEMDA5ODU3NDg4REI3MTMwRkY3NjgwOTA3MzEyRUI3 #MjRDRERCNERDQ0U2NzVCMDA5OEFENDAwRkVGODBFMURFQjRCQzE3NTZDNDM5NjFFRj #YwQjg1RjJENjJFRDQ1ODQ1NEUxMTYxNkE1RDFERjFFNTgwOTYzNjgyMUE3MzY2MkY5 #RjEyMjU0RTZGOTk1MEREMDFGQThFMjZBOEIyMDczNkZCNjNDNjNDODEwOTRGNjgxIi #wgInliIjogIjAwOTIyN0JGOERDNzQxREFDQzk0MjJGOEJGM0MwRTk2RkNFOTU4N0JD #NTYyRUFBRkUwREM1RjZGODJGMjg1OTRFNEE2Rjk4NTUzNTYwQzYyQjc1RkE0QUJCMT #k4Q0VDQkJCODZFQkQ0MUIwRUEwMjU0Q0RFNzhBQzY4RDM5QTI0MEFFNyIsICJBRGIi #OiAiNDE0NDYyIiwgIlliIjogIjA0MDA3MDZFQTY5QjJCNzE2Nzc3MzI0OEVBNkU2OU #E1NzRFOUREMkZGOEEzRDA0QTZFMDdGNzBDNzA5ODY5Q0E0ODY4MjdENTlGOTI5MDU5 #OUQxQ0Y5NEUxQTAzRkMyNDJFMkIxMzE2QUZFMkZBMjE4QkZBRUIzRTFGRkQ5RjE5Qk #YwNjJEMDFGNkIxNUM5QzM2NTFCRTRDMDhCQUYwMUVFQzI1QzgxOEVFMTJDNkVEQzQ2 #MjA2NDRCMUQ5N0NGMjRGODY4NzMyRDU2RkU0NUNFNzhFMzAyQzIyMUM5MkY0MDNFME #ZBMzIwN0RFOEJCNDFCMzg4RDgxMDQ2QTI5OEVEOEREQUM5QjJBIiwgIksiOiAiMDE4 #RTBFN0U5QURFNzQ5MTdDMTFDMEY2QjUyRjk1RUQ4NzFFQUIyMzU0MzdDQkVFOEI1Qz #I1MDk1MTZFNzg3QTgwRTgyNUVENUQ1MzlGQTZBMEVDMzJDNDhGQThGQUJFODU4MDlE #MDAwRDBDRkQzMDgzMkMyM0Q0NzdDOTkxQkVBOEU1IiwgIklTS19JUiI6ICIxNjY5QT #BBMjk3MjZBREM3RUVBMjUxMEQ2RjdFMDA0QTEzNUZBNjNBQzNDOUY5RTZDRTUzQ0JB #NUQ1RTM3ODFBQ0VENTE1OTU2MDQxRTQzMzU4NDA5QTEzRUY5MEREQzNDMzZGRDhEN0 #Q4MTQyNEM4RTk0NTkyRTIxODU0MjYwQSIsICJJU0tfU1kiOiAiRjJGM0JEOENENDQy #QTRFMTY2NTlCNDdBN0I3QTg0RjI5QkU3NTg5M0VEMkU1Rjc3MkQ3QTNDOEI3NzlFQj #BERjkzN0E0RUM1MEE0RjFGRjAxRUJCQUE5N0Q4MEUwOTBFQTY5QjAwQTk1MjAwRUQy #NThFNDhDNkY3RTlEOEZCQzIiLCAic2lkX291dHB1dF9pciI6ICI1NkNDM0NEOEJFNz #dDREM4NEMwRDE5MDZERTFGRkM4RUY3Q0JCMzI2QTNGMDUyNjdCNkU4QzYzNDRFMjc4 #MUVCMjBFRjcyNUU4NENCMUJCNDU5Mjc0MzUwNTFCNEUwRkFFNzhFOTc1QkYxNTA5OU #Y5RTM4RDc1NTQxM0VFRTJGRCIsICJzaWRfb3V0cHV0X29jIjogIkE0NkM3MTg5QkE2 #QTM2QzQ0NDc3NDFFMDU3REEzOUM4ODVCN0Q1OUUwOEJEMkRGMTg1MkE1MjcxRjJBOE #EyRTlCMTg3Q0NEMDczMjVBM0VFREU2NDZBREVFMEMwNkZFNThEQTc3Rjc0MTc3ODk2 #QjIxMDUzQzVEMTA3REUwMDZEIn0=¶
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¶
For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.¶
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¶
#eyJWYWxpZCI6IHsicyI6ICIwMTgyREQ3OTI1RjE3NTM0MTlFNEJGODM0Mjk3NjNBQ0 #QzN0Q2NDAwMENENUExNzVFREY1M0ExNTg3REQ5ODZCQzk1QUNDMTUwNjk5MTcwMkI2 #QkExQTlFRTI0NThGRUU4RUZDMDAxOThDRjAwODhDNDgwOTY1RUY2NUZGMjA0OEI4NT #YiLCAiWCI6ICIwNDAwREM1MDc4QjI0QzRBRjE2MjBDQzEwRkJFQ0M2Q0Q4Q0YxQ0FC #MEIwMTFFRkI3M0M3ODJGMjI2REMyMUM3Q0E3RUI0MDZCRTc0QTY5RUNCQTVCNEE4N0 #MwN0NGQzZFNjg3QjRCRUNBOUE2RURBQzk1OTQwQTNCNDEyMDU3M0IyNkE4MDAwNUU2 #OTc4MzNCMEJBMjg1RkNFN0IzRjFGMjUyNDMwMDg4NjBCOEYxREU3MTBBMERDQzA1Qj #BEMjAzNDFFRkU5MEVCMkJDQ0EyNjc5N0MyRDg1QUU2Q0E3NEMwMDY5NkNCMUIxM0U0 #MEJEQTE1QjI3OTY0RDc2NzA1NzY2NDdCRkFCOSIsICJHLnNjYWxhcl9tdWx0KHMsWC #kgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0MDEyMkY4OENFNzNFQzVBQTJEMUM4QzVE #MDQxNDg3NjBDM0Q5N0JBODdEQUExMEQ4Q0I4QkI3QzczQ0Y2RTk1MUZDOTIyNzIxQk #YxNDM3OTk1Q0ZCMTNFMTMyQTc4QkVCODYzODlFNjBEMzUxN0NERjZEOTlBOEEyRDZE #QjE5RUYyN0JEMDA1NUFGOUU4RERDRjMzN0NFMEE3QzIyQTlDODA5OUJDNEE0NEZBRU #RFRDFFQjcyRUZGRDI2RTRGMzIyMjE3QjY3RDYwQjk0NEIyNjdCM0RGNTA0NjA3OEZE #NTc3RjE3ODU3MjhGNDlCMjQxRkQ1RThDODMyMjNBOTk0QTJEMjE5MjgxIiwgIkcuc2 #NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29yZGluYXRlKSI6ICIwMTIyRjg4 #Q0U3M0VDNUFBMkQxQzhDNUQwNDE0ODc2MEMzRDk3QkE4N0RBQTEwRDhDQjhCQjdDNz #NDRjZFOTUxRkM5MjI3MjFCRjE0Mzc5OTVDRkIxM0UxMzJBNzhCRUI4NjM4OUU2MEQz #NTE3Q0RGNkQ5OUE4QTJENkRCMTlFRjI3QkQifSwgIkludmFsaWQgWTEiOiAiMDQwME #RDNTA3OEIyNEM0QUYxNjIwQ0MxMEZCRUNDNkNEOENGMUNBQjBCMDExRUZCNzNDNzgy #RjIyNkRDMjFDN0NBN0VCNDA2QkU3NEE2OUVDQkE1QjRBODdDMDdDRkM2RTY4N0I0Qk #VDQTlBNkVEQUM5NTk0MEEzQjQxMjA1NzNCMjZBODAwMDVFNjk3ODMzQjBCQTI4NUZD #RTdCM0YxRjI1MjQzMDA4ODYwQjhGMURFNzEwQTBEQ0MwNUIwRDIwMzQxRUZFOTBFQj #JCQ0NBMjY3OTdDMkQ4NUFFNkNBNzRDMDA2OTZDQjFCMTNFNDBCREExNUIyNzk2NEQ3 #NjcwNTc2NjQ3QkZBRjkiLCAiSW52YWxpZCBZMiI6ICIwMCJ9¶