rfc9383.original.xml | rfc9383.xml | |||
---|---|---|---|---|
<?xml version='1.0' encoding='utf-8'?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE rfc [ | <!DOCTYPE rfc [ | |||
<!ENTITY nbsp " "> | <!ENTITY nbsp " "> | |||
<!ENTITY zwsp "​"> | <!ENTITY zwsp "​"> | |||
<!ENTITY nbhy "‑"> | <!ENTITY nbhy "‑"> | |||
<!ENTITY wj "⁠"> | <!ENTITY wj "⁠"> | |||
]> | ]> | |||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | ||||
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.17 --> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" | |||
<?rfc toc="yes"?> | ipr="trust200902" | |||
<?rfc sortrefs="yes"?> | docName="draft-bar-cfrg-spake2plus-08" | |||
<?rfc symrefs="yes"?> | number="9383" | |||
<?rfc docmapping="yes"?> | submissionType="independent" | |||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | category="info" | |||
-bar-cfrg-spake2plus-08" category="info" obsoletes="" updates="" submissionType= | obsoletes="" | |||
"IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3 | updates="" | |||
"> | xml:lang="en" | |||
tocInclude="true" | ||||
sortRefs="true" | ||||
symRefs="true" | ||||
version="3"> | ||||
<!-- xml2rfc v2v3 conversion 3.11.1 --> | <!-- xml2rfc v2v3 conversion 3.11.1 --> | |||
<front> | <front> | |||
<title abbrev="spake2plus">SPAKE2+, an Augmented PAKE</title> | <title abbrev="spake2plus">SPAKE2+, an Augmented Password-Authenticated Key | |||
<seriesInfo name="Internet-Draft" value="draft-bar-cfrg-spake2plus-08"/> | Exchange (PAKE) Protocol</title> | |||
<seriesInfo name="RFC" value="9383"/> | ||||
<author initials="T." surname="Taubert" fullname="Tim Taubert"> | <author initials="T." surname="Taubert" fullname="Tim Taubert"> | |||
<organization>Apple Inc.</organization> | <organization>Apple Inc.</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>One Apple Park Way</street> | <street>One Apple Park Way</street> | |||
<city>Cupertino, California 95014</city> | <city>Cupertino</city> | |||
<region>California</region> | ||||
<code>95014</code> | ||||
<country>United States of America</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<email>ttaubert@apple.com</email> | <email>ttaubert@apple.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="C.A." surname="Wood" fullname="Christopher A. Wood"> | <author initials="C. A." surname="Wood" fullname="Christopher A. Wood"> | |||
<organization/> | <organization/> | |||
<address> | <address> | |||
<email>caw@heapingbits.net</email> | <email>caw@heapingbits.net</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date/> | <date year="2023" month="September" /> | |||
<keyword>Internet-Draft</keyword> | ||||
<abstract> | <abstract> | |||
<t>This document describes SPAKE2+, a Password Authenticated Key Exchange (PAKE) protocol | <t>This document describes SPAKE2+, a Password-Authenticated Key Exchange (PAKE) protocol | |||
run between two parties for deriving a strong shared key with no risk of disclos ing the password. | run between two parties for deriving a strong shared key with no risk of disclos ing the password. | |||
SPAKE2+ is an augmented PAKE protocol, as only one party has knowledge of the pa ssword. | SPAKE2+ is an augmented PAKE protocol, as only one party has knowledge of the pa ssword. | |||
This method is simple to implement, compatible with any prime order group and is | This method is simple to implement, compatible with any prime-order group, and c | |||
computationally efficient.</t> | omputationally efficient.</t> | |||
<t>This document was produced outside of the IETF and IRTF, and represents | <t>This document was produced outside of the IETF and IRTF and represents | |||
the opinions of the authors. | the opinions of the authors. | |||
Publication of this document as an RFC in the Independent Submissions Stream doe s not imply endorsement | Publication of this document as an RFC in the Independent Submissions Stream doe s not imply endorsement | |||
of SPAKE2+ by the IETF or IRTF.</t> | of SPAKE2+ by the IETF or IRTF.</t> | |||
</abstract> | </abstract> | |||
<note removeInRFC="true"> | ||||
<name>Discussion Venues</name> | ||||
<t>Source for this draft and an issue tracker can be found at | ||||
<eref target="https://github.com/chris-wood/draft-bar-cfrg-spake2plus"/>.</t> | ||||
</note> | ||||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="introduction" numbered="true" toc="default"> | <section anchor="introduction" numbered="true" toc="default"> | |||
<name>Introduction</name> | <name>Introduction</name> | |||
<t>This document describes SPAKE2+, a Password Authenticated Key Exchange (PAKE) protocol | <t>This document describes SPAKE2+, a Password-Authenticated Key Exchange (PAKE) protocol | |||
run between two parties for deriving a strong shared key with no risk of disclos ing the password. | run between two parties for deriving a strong shared key with no risk of disclos ing the password. | |||
SPAKE2+ is an augmented PAKE protocol, as only one party makes direct use of the password during the execution of the protocol. | SPAKE2+ is an augmented PAKE protocol, as only one party makes direct use of the password during the execution of the protocol. | |||
The other party only needs a record corresponding to the other party's registrat ion at the time of the protocol execution instead of the password. | The other party only needs a record corresponding to the first party's registrat ion at the time of the protocol execution instead of the password. | |||
This record can be computed once, during an offline registration phase. | This record can be computed once, during an offline registration phase. | |||
The party using the password directly would typically be a client, and acts as a | The party using the password directly would typically be a client and would act | |||
prover, | as a Prover, | |||
while the other party would be a server, and acts as verifier.</t> | while the other party would be a server and would act as a Verifier.</t> | |||
<t>The protocol is augmented in the sense that it provides some resilience | ||||
to the compromise or extraction of the registration record. | <t>The protocol is augmented in the sense that it provides some resilience | |||
against the compromise or extraction of the registration record. | ||||
The design of the protocol forces the adversary to recover the password from the record to successfully execute the protocol. | The design of the protocol forces the adversary to recover the password from the record to successfully execute the protocol. | |||
Hence this protocol can be advantageously combined with a salted Password Hashin | Hence, this protocol can be advantageously combined with a salted Password Hashi | |||
g Function to increase the cost of the recovery and slow down attacks. | ng Function to increase the cost of the recovery and slow down attacks. | |||
The record cannot be used directly to successfully run the protocol as a prover, | The record cannot be used directly to successfully run the protocol as a Prover, | |||
making this protocol more robust than balanced PAKEs which don't benefit from Pa | making this protocol more robust than balanced PAKEs, which don't benefit from P | |||
ssword Hashing Functions to the same extent.</t> | assword Hashing Functions to the same extent.</t> | |||
<t>This augmented property is especially valuable in scenarios where the e xecution of the protocol is constrained | <t>This augmented property is especially valuable in scenarios where the e xecution of the protocol is constrained | |||
and the adversary cannot query the salt of the password hash function ahead of t | and the adversary cannot query the salt of the Password Hashing Function ahead o | |||
he attack. | f the attack. | |||
Constraints may consist in being in physical proximity through a local network o | For example, a constraint may be when physical proximity through a local network | |||
r | is required or when a first authentication factor is required for initiation of | |||
when initiation of the protocol requires a first authentication factor.</t> | the protocol.</t> | |||
<t>This document has content split out from a related document specifying | ||||
SPAKE2 <xref target="I-D.irtf-cfrg-spake2" format="default"/>, | <t>This document has content split out from a related document, | |||
which is a symmetric PAKE protocol, where both parties have knowledge of the pas | <xref target="RFC9382" format="default"/>, which specifies SPAKE2. | |||
sword. | SPAKE2 is a symmetric PAKE protocol, where both parties have knowledge of the pa | |||
ssword. | ||||
SPAKE2+ is the asymmetric or augmented version of SPAKE2, wherein only one party has knowledge of the password. | SPAKE2+ is the asymmetric or augmented version of SPAKE2, wherein only one party has knowledge of the password. | |||
SPAKE2+ is specified separately in this document because the use cases for symme tric and augmented PAKEs | SPAKE2+ is specified separately in this document because the use cases for symme tric and augmented PAKEs | |||
are different, and therefore warrant different technical specifications. Neither | are different and therefore warrant different technical specifications. Neither | |||
SPAKE2 nor SPAKE2+ | SPAKE2 nor SPAKE2+ | |||
was selected as the result of the CFRG PAKE selection competition. However, this | was selected as the result of the Crypto Forum Research Group (CFRG) PAKE select | |||
password-based key exchange | ion competition. However, this password-based key exchange | |||
protocol appears in <xref target="TDH" format="default"/> and is proven secure i n <xref target="SPAKE2P-Analysis" format="default"/>. It is compatible with any | protocol appears in <xref target="TDH" format="default"/> and is proven secure i n <xref target="SPAKE2P-Analysis" format="default"/>. It is compatible with any | |||
prime-order group and relies only on group operations, making it simple and comp utationally efficient. | prime-order group and relies only on group operations, making it simple and comp utationally efficient. | |||
Thus, it was felt that publication was beneficial to make the protocol available for wider consideration.</t> | Thus, it was felt that publication was beneficial to make the protocol available for wider consideration.</t> | |||
<t>This document was produced outside of the IETF and IRTF, and represents the opinions of the authors. | <t>This document was produced outside of the IETF and IRTF and represents the opinions of the authors. | |||
Publication of this document as an RFC in the Independent Submissions Stream doe s not imply endorsement | Publication of this document as an RFC in the Independent Submissions Stream doe s not imply endorsement | |||
of SPAKE2+ by the IETF or IRTF.</t> | of SPAKE2+ by the IETF or IRTF.</t> | |||
</section> | </section> | |||
<section anchor="requirements-notation" numbered="true" toc="default"> | <section anchor="requirements-notation" numbered="true" toc="default"> | |||
<name>Requirements Notation</name> | <name>Requirements Notation</name> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | |||
14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="defa | "<bcp14>SHOULD NOT</bcp14>", | |||
ult"/> when, and only when, they appear in all | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
capitals, as shown here.</t> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document | |||
are to be interpreted as described in BCP 14 | ||||
<xref target="RFC2119"/> <xref target="RFC8174"/> when, and only | ||||
when, they appear in all capitals, as shown here.</t> | ||||
</section> | </section> | |||
<section anchor="definition-of-spake2" numbered="true" toc="default"> | <section anchor="definition-of-spake2" numbered="true" toc="default"> | |||
<name>Definition of SPAKE2+</name> | <name>Definition of SPAKE2+</name> | |||
<t>Let G be a group in which the computational Diffie-Hellman (CDH) | <t>Let G be a group in which the computational Diffie-Hellman (CDH) | |||
problem is hard. Suppose G has order p*h where p is a large prime; | problem is hard. Suppose G has order p*h where p is a large prime; | |||
h will be called the cofactor. Let I be the unit element in | h will be called the cofactor. Let I be the unit element in | |||
G, e.g., the point at infinity if G is an elliptic curve group. We denote the | G, e.g., the point at infinity if G is an elliptic curve group. We denote the | |||
operations in the group additively. We assume there is a representation of | operations in the group additively. We assume that there is a representation of | |||
elements of G as byte strings: common choices would be SEC1 | elements of G as byte strings: common choices would be SEC 1 | |||
uncompressed or compressed <xref target="SEC1" format="default"/> for elliptic c | uncompressed or compressed <xref target="SEC1"/> for elliptic curve groups or bi | |||
urve groups or big | g-endian integers of a fixed (per-group) length for prime field DH. | |||
endian integers of a fixed (per-group) length for prime field DH. | We fix a generator P of the (large) prime-order subgroup of G. P is specified | |||
We fix a generate P of (large) prime-order subgroup of G. P is specified | ||||
in the document defining the group, and so we do not repeat it here.</t> | in the document defining the group, and so we do not repeat it here.</t> | |||
<t>|| denotes concatenation of strings. We also let len(S) denote the | <t>|| denotes concatenation of strings. We also let len(S) denote the | |||
length of a string in bytes, represented as an eight-byte little | length of a string in bytes, represented as an eight-byte little-endian number. | |||
endian number. Finally, let nil represent an empty string, i.e., | Finally, let nil represent an empty string, i.e., | |||
len(nil) = 0.</t> | len(nil) = 0.</t> | |||
<t>KDF is a key-derivation function that takes as input a salt, intermedia te | <t>KDF is a key derivation function that takes as input a salt, input | |||
keying material (IKM), info string, and derived key length L to derive a | keying material (IKM), info string, and derived key length L to derive a | |||
cryptographic key of length L. | cryptographic key of length L. | |||
MAC is a Message Authentication Code algorithm that takes a secret key and | MAC is a Message Authentication Code algorithm that takes a secret key and | |||
message as input to produce an output. | message as input to produce an output. | |||
Let Hash be a hash function from arbitrary strings to bit strings of a fixed len gth. Common choices | Let Hash be a hash function from arbitrary strings to bit strings of a fixed len gth. Common choices | |||
for Hash are SHA256 or SHA512 <xref target="RFC6234" format="default"/>. | for Hash are SHA256 or SHA512 <xref target="RFC6234" format="default"/>. | |||
<xref target="Ciphersuites" format="default"/> specifies variants of KDF, MAC, a nd Hash | <xref target="Ciphersuites" format="default"/> specifies variants of KDF, MAC, a nd Hash | |||
suitable for use with the protocols contained herein.</t> | suitable for use with the protocols contained herein.</t> | |||
<t>Let there be two parties, a prover and a verifier. Their identities, de noted as | <t>Let there be two parties, a Prover and a Verifier. Their identities, de noted as | |||
idProver and idVerifier, may also have digital representations such as Media Acc ess Control addresses | idProver and idVerifier, may also have digital representations such as Media Acc ess Control addresses | |||
or other names (hostnames, usernames, etc). The parties may share additional dat | or other names (hostnames, usernames, etc.). The parties may share additional da | |||
a | ta | |||
(the context) separate from their identities which they may want to include in | (the context) separate from their identities, which they may want to include in | |||
the protocol transcript. | the protocol transcript. | |||
One example of additional data is a list of supported protocol versions if SPAKE 2+ were | One example of additional data is a list of supported protocol versions if SPAKE 2+ were | |||
used in a higher-level protocol which negotiates the use of a particular PAKE. A | used in a higher-level protocol that negotiates the use of a particular PAKE. An | |||
nother | other | |||
example is the inclusion of the application name. Including those would ensure t | example is the inclusion of the application name. Including these data points wo | |||
hat | uld ensure that | |||
both parties agree upon the same set of supported protocols and therefore preven | both parties agree upon the same set of supported protocols and therefore preven | |||
t downgrade and | ts downgrade and | |||
cross-protocol attacks. Specification of precise context values is out of scope for this document.</t> | cross-protocol attacks. Specification of precise context values is out of scope for this document.</t> | |||
<section anchor="protocol-overview" numbered="true" toc="default"> | <section anchor="protocol-overview" numbered="true" toc="default"> | |||
<name>Protocol Overview</name> | <name>Protocol Overview</name> | |||
<t>SPAKE2+ is a two round protocol that establishes a shared secret with an | <t>SPAKE2+ is a two-round protocol that establishes a shared secret with an | |||
additional round for key confirmation. Prior to invocation, both parties are | additional round for key confirmation. Prior to invocation, both parties are | |||
provisioned with information such as the input password needed to run the | provisioned with information such as the input password needed to run the | |||
protocol. The registration phase may include communicating identities, protocol | protocol. The registration phase may include communicating identities, protocol | |||
version and other parameters related to the registration record; see | version, and other parameters related to the registration record; see | |||
<xref target="offline-registration" format="default"/> for details.</t> | <xref target="offline-registration" format="default"/> for details.</t> | |||
<t>During the first round, the prover sends a public share shareP to the | <t>During the first round, the Prover sends a public share, shareP, to t | |||
verifier, which in turn | he Verifier, which in turn | |||
responds with its own public share shareV. Both parties then derive a shared sec | responds with its own public share, shareV. Both parties then derive a shared se | |||
ret | cret | |||
used to produce encryption and authentication keys. The latter are used during t he second | used to produce encryption and authentication keys. The latter are used during t he second | |||
round for key confirmation. (<xref target="keys" format="default"/> details the key derivation and confirmation steps.) | round for key confirmation. (<xref target="keys" format="default"/> details the key derivation and confirmation steps.) | |||
In particular, the verifier sends a key confirmation message confirmV to the pro | In particular, the Verifier sends a key confirmation message, confirmV, to the P | |||
ver, | rover, | |||
which in turn responds with its own key confirmation message confirmP. | which in turn responds with its own key confirmation message, confirmP. | |||
(Note that shareV and confirmV MAY be sent in the same message.) | (Note that shareV and confirmV <bcp14>MAY</bcp14> be sent in the same message.) | |||
Both parties MUST NOT consider the protocol complete prior to receipt and | Both parties <bcp14>MUST NOT</bcp14> consider the protocol complete prior to rec | |||
eipt and | ||||
validation of these key confirmation messages.</t> | validation of these key confirmation messages.</t> | |||
<t>A sample trace is shown below.</t> | <t>A sample trace is shown below.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
Prover Verifier | Prover Verifier | |||
| (registration) | | | (registration) | | |||
|<- - - - - - - - - - - - ->| | |<- - - - - - - - - - - - ->| | |||
| | | | | | |||
| (setup protocol) | | | (set up the protocol) | | |||
(compute shareP) | shareP | | (compute shareP) | shareP | | |||
|-------------------------->| | |-------------------------->| | |||
| shareV | (compute shareV) | | shareV | (compute shareV) | |||
|<--------------------------| | |<--------------------------| | |||
| | | | | | |||
| (derive secrets) | (compute confirmV) | | (derive secrets) | (compute confirmV) | |||
| confirmV | | | confirmV | | |||
|<--------------------------| | |<--------------------------| | |||
(compute confirmP) | confirmP | | (compute confirmP) | confirmP | | |||
|-------------------------->| | |-------------------------->| | |||
skipping to change at line 163 ¶ | skipping to change at line 176 ¶ | |||
(compute shareP) | shareP | | (compute shareP) | shareP | | |||
|-------------------------->| | |-------------------------->| | |||
| shareV | (compute shareV) | | shareV | (compute shareV) | |||
|<--------------------------| | |<--------------------------| | |||
| | | | | | |||
| (derive secrets) | (compute confirmV) | | (derive secrets) | (compute confirmV) | |||
| confirmV | | | confirmV | | |||
|<--------------------------| | |<--------------------------| | |||
(compute confirmP) | confirmP | | (compute confirmP) | confirmP | | |||
|-------------------------->| | |-------------------------->| | |||
]]></artwork> | ]]></artwork> | |||
</section> | </section> | |||
<section anchor="offline-registration" numbered="true" toc="default"> | <section anchor="offline-registration" numbered="true" toc="default"> | |||
<name>Offline Registration</name> | <name>Offline Registration</name> | |||
<t>The registration phase computes the values w0 and w1, as well as the registration | <t>The registration phase computes the values w0 and w1, as well as the registration | |||
record L=w1*P. w0 and w1 are derived by hashing the password pw with the identit | record L=w1*P. w0 and w1 are derived by hashing the password pw with the i | |||
ies | dentities | |||
of the two participants. w0 and the record L are then shared with the verifier a | of the two participants. w0 and the record L are then shared with the Veri | |||
nd | fier and | |||
stored as part of the registration record associated with the prover. The prover | stored as part of the registration record associated with the Prover. The Prover | |||
SHOULD derive w0 and w1 from the password before the protocol begins. Both w0 an | <bcp14>SHOULD</bcp14> derive w0 and w1 from the password before the protocol beg | |||
d | ins. Both w0 and | |||
w1 are derived using a function with range [0, p-1], which is modeled as a rando m | w1 are derived using a function with range [0, p-1], which is modeled as a rando m | |||
oracle in <xref target="SPAKE2P-Analysis" format="default"/>.</t> | oracle in <xref target="SPAKE2P-Analysis" format="default"/>.</t> | |||
<t>The registration phase also produces two random elements M and N in t he prime-order | <t>The registration phase also produces two random elements, M and N, in the prime-order | |||
subgroup of G. The algorithm for selecting M and N is defined in <xref target="p ointgen" format="default"/>. | subgroup of G. The algorithm for selecting M and N is defined in <xref target="p ointgen" format="default"/>. | |||
Importantly, this algorithm chooses M and N such that their discrete logs are no t | Importantly, this algorithm chooses M and N such that their discrete logs are no t | |||
known. Pre-computed values for M and N are listed in <xref target="Ciphersuites" | known. Precomputed values for M and N are listed in <xref target="Ciphersuites" | |||
format="default"/> for each | format="default"/> for each | |||
group. Applications MAY use different M and N values provided they are computed, | group. Applications <bcp14>MAY</bcp14> use different M and N values, provided th | |||
ey are computed, | ||||
e.g., using different input seeds to the algorithm in <xref target="pointgen" fo rmat="default"/>, as random elements | e.g., using different input seeds to the algorithm in <xref target="pointgen" fo rmat="default"/>, as random elements | |||
for which the discrete log is unknown.</t> | for which the discrete log is unknown.</t> | |||
<t>Applications using this specification MUST define the method used to compute w0 and w1. | <t>Applications using this specification <bcp14>MUST</bcp14> define the method used to compute w0 and w1. | |||
For example, it may be necessary to carry out various forms of normalization of the | For example, it may be necessary to carry out various forms of normalization of the | |||
password before hashing <xref target="RFC8265" format="default"/>. This section contains requirements and default | password before hashing <xref target="RFC8265" format="default"/>. This section contains requirements and default | |||
recommendations for computing w0 and w1.</t> | recommendations for computing w0 and w1.</t> | |||
<t>The RECOMMENDED method for generating w0 and w1 is via a Password-Bas ed Key | <t>The <bcp14>RECOMMENDED</bcp14> method for generating w0 and w1 is via a Password-Based Key | |||
Derivation Function (PBKDF), which is a function designed to slow down brute-for ce | Derivation Function (PBKDF), which is a function designed to slow down brute-for ce | |||
attackers. Brute-force resistance may be obtained through various computation ha rdness | attackers. Brute-force resistance may be obtained through various computation ha rdness | |||
parameters such as memory or CPU cycles, and are typically configurable. | parameters such as memory or CPU cycles and are typically configurable. | |||
Scrypt <xref target="RFC7914" format="default"/> and Argon2id <xref target="RFC9 | The scrypt <xref target="RFC7914" format="default"/> function and the Argon2id < | |||
106" format="default"/> are common examples of PBKDFs. | xref target="RFC9106" format="default"/> function are common examples of PBKDFs. | |||
Absent an application-specific profile, RECOMMENDED parameters (N, r, p) | Absent an application-specific profile, <bcp14>RECOMMENDED</bcp14> parameters (N | |||
for Scrypt are (32768,8,1), and RECOMMENDED parameters for Argon2id | , r, p) | |||
are in Section 4 of <xref target="RFC9106" format="default"/>.</t> | for scrypt are (32768,8,1), and <bcp14>RECOMMENDED</bcp14> parameters for Argon2 | |||
id | ||||
are in <xref target="RFC9106" sectionFormat="of" section="4"/>.</t> | ||||
<t>Each half of the output of the PBKDF will be interpreted as an intege r and reduced | <t>Each half of the output of the PBKDF will be interpreted as an intege r and reduced | |||
modulo p. To control bias, each half must be of length at least ceil(log2(p)) + k | modulo p. To control bias, each half must be of length at least ceil(log2(p)) + k | |||
bits, with k >= 64. Reducing such integers mod p gives bias at most 2^-k for any | bits, with k >= 64. Reducing such integers mod p gives bias at most 2^-k for any | |||
p; this bias is negligible for any k >= 64.</t> | p; this bias is negligible for any k >= 64.</t> | |||
<t>The minimum total output length of the PBKDF then is 2 * (ceil(log2(p )) + k) bits. | <t>The minimum total output length of the PBKDF then is 2 * (ceil(log2(p )) + k) bits. | |||
For example, given the prime order of the P-256 curve, the output of the PBKDF | For example, given the prime order of the P-256 curve, the output of the PBKDF | |||
SHOULD be at least 640 bits or 80 bytes.</t> | <bcp14>SHOULD</bcp14> be at least 640 bits or 80 bytes.</t> | |||
<t>Given a PBKDF, password pw, and identities idProver and idVerifier, t | <t>Given a PBKDF, password pw, and identities idProver and idVerifier, t | |||
he RECOMMENDED | he <bcp14>RECOMMENDED</bcp14> | |||
method for computing w0 and w1 is as follows:</t> | method for computing w0 and w1 is as follows:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<sourcecode type="pseudocode"><![CDATA[ | ||||
w0s || w1s = PBKDF(len(pw) || pw || | w0s || w1s = PBKDF(len(pw) || pw || | |||
len(idProver) || idProver || | len(idProver) || idProver || | |||
len(idVerifier) || idVerifier) | len(idVerifier) || idVerifier) | |||
w0 = w0s mod p | w0 = w0s mod p | |||
w1 = w1s mod p | w1 = w1s mod p | |||
]]></artwork> | ]]></sourcecode> | |||
<t>If an identity is unknown at the time of computing w0s or w1s, its le ngth is given | <t>If an identity is unknown at the time of computing w0s or w1s, its le ngth is given | |||
as zero and the identity itself is represented as the empty octet string. If bot h | as zero and the identity itself is represented as an empty octet string. If both | |||
idProver and idVerifier are unknown, then their lengths are given as zero and bo th | idProver and idVerifier are unknown, then their lengths are given as zero and bo th | |||
identities will be represented as empty octet strings. idProver and idVerifier a re | identities will be represented as empty octet strings. idProver and idVeri fier are | |||
included in the transcript TT as part of the protocol flow.</t> | included in the transcript TT as part of the protocol flow.</t> | |||
</section> | </section> | |||
<section anchor="online-authentication" numbered="true" toc="default"> | <section anchor="online-authentication" numbered="true" toc="default"> | |||
<name>Online Authentication</name> | <name>Online Authentication</name> | |||
<t>The online SPAKE2+ protocol runs between the prover and verifier to p | <t>The online SPAKE2+ protocol runs between the Prover and Verifier to p | |||
roduce a | roduce a | |||
single shared secret upon completion. To begin, the prover selects x uniformly | single shared secret upon completion. To begin, the Prover selects x uniformly | |||
at random from the integers in [0, p-1], computes the public share shareP=X, | at random from the integers in [0, p-1], computes the public share shareP=X, | |||
and transmits it to the verifier.</t> | and transmits it to the Verifier.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode"><![CDATA[ | |||
x <- [0, p-1] | x <- [0, p-1] | |||
X = x*P + w0*M | X = x*P + w0*M | |||
]]></artwork> | ]]></sourcecode> | |||
<t>Upon receipt of X, the verifier checks the received element for group | <t>Upon receipt of X, the Verifier checks the received element for group | |||
membership | membership | |||
and aborts if X is not in the large prime-order subgroup of G; see <xref target= "security" format="default"/> | and aborts if X is not in the large prime-order subgroup of G; see <xref target= "security" format="default"/> | |||
for details. The verifier then selects y uniformly at random from the integers | for details. The Verifier then selects y uniformly at random from the integers | |||
in [0, p-1], computes the public share shareV=Y and transmits it to the prover. | in [0, p-1], computes the public share shareV=Y, and transmits it to the Prover. | |||
Upon receipt of Y, the prover checks the received element for group membership | Upon receipt of Y, the Prover checks the received element for group membership | |||
and aborts if Y is not in the large prime-order subgroup of G.</t> | and aborts if Y is not in the large prime-order subgroup of G.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode"><![CDATA[ | |||
y <- [0, p-1] | y <- [0, p-1] | |||
Y = y*P + w0*N | Y = y*P + w0*N | |||
]]></artwork> | ]]></sourcecode> | |||
<t>Both participants compute Z and V that are now shared as common value | <t>Both participants compute Z and V; Z and V are then shared as common | |||
s. | values. | |||
The prover computes:</t> | The Prover computes:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<sourcecode type="pseudocode"><![CDATA[ | ||||
Z = h*x*(Y - w0*N) | Z = h*x*(Y - w0*N) | |||
V = h*w1*(Y - w0*N) | V = h*w1*(Y - w0*N) | |||
]]></artwork> | ]]></sourcecode> | |||
<t>The verifier computes:</t> | <t>The Verifier computes:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode"><![CDATA[ | |||
Z = h*y*(X - w0*M) | Z = h*y*(X - w0*M) | |||
V = h*y*L | V = h*y*L | |||
]]></artwork> | ]]></sourcecode> | |||
<t>The multiplication by the cofactor h prevents small subgroup confinem ent attacks. | <t>The multiplication by the cofactor h prevents small subgroup confinem ent attacks. | |||
All proofs of security hold even if the discrete log of the fixed group element | All proofs of security hold even if the discrete log of the fixed group element | |||
N is known to the adversary. In particular, one MAY set N=I, i.e. set N to the | N is known to the adversary. In particular, one <bcp14>MAY</bcp14> set N=I, i.e. , set N to the | |||
unit element in G.</t> | unit element in G.</t> | |||
<t>It is essential that both Z and V be used in combination with the tra nscript to | <t>It is essential that both Z and V be used in combination with the tra nscript to | |||
derive the keying material. The protocol transcript encoding is shown below.</t> | derive the keying material. The protocol transcript encoding is shown below.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode"><![CDATA[ | |||
TT = len(Context) || Context | TT = len(Context) || Context | |||
|| len(idProver) || idProver | || len(idProver) || idProver | |||
|| len(idVerifier) || idVerifier | || len(idVerifier) || idVerifier | |||
|| len(M) || M | || len(M) || M | |||
|| len(N) || N | || len(N) || N | |||
|| len(shareP) || shareP | || len(shareP) || shareP | |||
|| len(shareV) || shareV | || len(shareV) || shareV | |||
|| len(Z) || Z | || len(Z) || Z | |||
|| len(V) || V | || len(V) || V | |||
|| len(w0) || w0 | || len(w0) || w0 | |||
]]></artwork> | ]]></sourcecode> | |||
<t>Context is an application-specific customization string shared betwee n both | <t>Context is an application-specific customization string shared betwee n both | |||
parties and MUST precede the remaining transcript. It might contain the | parties and <bcp14>MUST</bcp14> precede the remaining transcript. It might conta in the | |||
name and version number of the higher-level protocol, or simply the name and ver sion | name and version number of the higher-level protocol, or simply the name and ver sion | |||
number of the application. The context MAY include additional data such as the | number of the application. The context <bcp14>MAY</bcp14> include additional dat a such as the | |||
chosen ciphersuite and PBKDF parameters like the iteration count or salt. | chosen ciphersuite and PBKDF parameters like the iteration count or salt. | |||
The context and its length prefix MAY be omitted.</t> | The context and its length prefix <bcp14>MAY</bcp14> be omitted.</t> | |||
<t>If an identity is absent, its length is given as zero and the identit y itself | <t>If an identity is absent, its length is given as zero and the identit y itself | |||
is represented as the empty octet string. If both identities are absent, then | is represented as an empty octet string. If both identities are absent, then | |||
their lengths are given as zero and both are represented as empty octet strings. | their lengths are given as zero and both are represented as empty octet strings. | |||
In applications where identities are not implicit, idProver and idVerifier SHOUL | In applications where identities are not implicit, idProver and idVerifier <bcp1 | |||
D always be | 4>SHOULD</bcp14> always be | |||
non-empty. Otherwise, the protocol risks Unknown Key Share attacks (discussion | non-empty. Otherwise, the protocol risks unknown key-share attacks (discussion | |||
of Unknown Key Share attacks in a specific protocol is given in <xref target="RF | of unknown key-share attacks in a specific protocol is given in <xref target="RF | |||
C8844" format="default"/>).</t> | C8844" format="default"/>).</t> | |||
<t>Upon completion of this protocol, both parties compute shared secrets K_main, | <t>Upon completion of this protocol, both parties compute shared secrets K_main, | |||
K_shared, K_confirmP, and K_confirmV as specified in <xref target="keys" format= | K_shared, K_confirmP, and K_confirmV as specified in <xref target="keys" format= | |||
"default"/>. The verifier MUST send a key | "default"/>. The Verifier <bcp14>MUST</bcp14> send a key | |||
confirmation message confirmV to the prover so both parties can confirm that the | confirmation message, confirmV, to the Prover so both parties can confirm that t | |||
y | hey | |||
agree upon these shared secrets. After receipt and verification of the verifier' | agree upon these shared secrets. After receipt and verification of the Verifier' | |||
s | s | |||
confirmation message, the prover MUST respond with its confirmation message. | confirmation message, the Prover <bcp14>MUST</bcp14> respond with its confirmati | |||
The verifier MUST NOT send application data to the prover until it has received | on message. | |||
The Verifier <bcp14>MUST NOT</bcp14> send application data to the Prover until i | ||||
t has received | ||||
and verified the confirmation message. Key confirmation verification requires | and verified the confirmation message. Key confirmation verification requires | |||
recomputation of confirmP or confirmV and checking for equality against that whi ch was | recomputation of confirmP or confirmV and checking for equality against the data that was | |||
received.</t> | received.</t> | |||
</section> | </section> | |||
<section anchor="keys" numbered="true" toc="default"> | <section anchor="keys" numbered="true" toc="default"> | |||
<name>Key Schedule and Key Confirmation</name> | <name>Key Schedule and Key Confirmation</name> | |||
<t>The protocol transcript TT, as defined in <xref target="online-authen tication" format="default"/>, is unique and secret to | <t>The protocol transcript TT, as defined in <xref target="online-authen tication" format="default"/>, is unique and secret to | |||
the participants. Both parties use TT to derive the shared symmetric secret K_ma in from the | the participants. Both parties use TT to derive the shared symmetric secret K_ma in from the | |||
protocol. The length of K_main is equal to the length of the digest output, e.g. , 256 bits | protocol. The length of K_main is equal to the length of the digest output, e.g. , 256 bits | |||
for Hash() = SHA-256. The confirmation keys K_confirmP and K_confirmV, as well a s the shared | for Hash() = SHA-256. The confirmation keys K_confirmP and K_confirmV, as well a s the shared | |||
key K_shared are derived from K_main.</t> | key K_shared, are derived from K_main.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode"><![CDATA[ | |||
K_main = Hash(TT) | K_main = Hash(TT) | |||
K_confirmP || K_confirmV = KDF(nil, K_main, "ConfirmationKeys") | K_confirmP || K_confirmV = KDF(nil, K_main, "ConfirmationKeys") | |||
K_shared = KDF(nil, K_main, "SharedKey") | K_shared = KDF(nil, K_main, "SharedKey") | |||
]]></artwork> | ]]></sourcecode> | |||
<t>Neither K_main nor its derived confirmation keys are used for anythin g except key | <t>Neither K_main nor its derived confirmation keys are used for anythin g except key | |||
derivation and confirmation and MUST be discarded after the protocol execution. | derivation and confirmation and <bcp14>MUST</bcp14> be discarded after the proto | |||
Applications MAY derive additional keys from K_shared as needed.</t> | col execution. | |||
Applications <bcp14>MAY</bcp14> derive additional keys from K_shared as needed.< | ||||
/t> | ||||
<t>The length of each confirmation key is dependent on the MAC function of the chosen | <t>The length of each confirmation key is dependent on the MAC function of the chosen | |||
ciphersuite. For HMAC, the RECOMMENDED key length is equal to the output length of | ciphersuite. For HMAC, the <bcp14>RECOMMENDED</bcp14> key length is equal to the output length of | |||
the digest output, e.g., 256 bits for Hash() = SHA-256. For CMAC-AES, each | the digest output, e.g., 256 bits for Hash() = SHA-256. For CMAC-AES, each | |||
confirmation key MUST be of length k, where k is the chosen AES key size, | confirmation key <bcp14>MUST</bcp14> be of length k, where k is the chosen AES k ey size, | |||
e.g., 128 bits for CMAC-AES-128.</t> | e.g., 128 bits for CMAC-AES-128.</t> | |||
<t>Both endpoints MUST employ a MAC that produces pseudorandom tags for key confirmation. | <t>Both endpoints <bcp14>MUST</bcp14> employ a MAC that produces pseudor andom tags for key confirmation. | |||
K_confirmP and K_confirmV are symmetric keys used to compute tags confirmP and | K_confirmP and K_confirmV are symmetric keys used to compute tags confirmP and | |||
confirmV over the public key shares received from the other peer earlier.</t> | confirmV over the public key shares received from the other peer earlier.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode"><![CDATA[ | |||
confirmP = MAC(K_confirmP, shareV) | confirmP = MAC(K_confirmP, shareV) | |||
confirmV = MAC(K_confirmV, shareP) | confirmV = MAC(K_confirmV, shareP) | |||
]]></artwork> | ]]></sourcecode> | |||
<t>Once key confirmation is complete, applications MAY use K_shared as a | <t>Once key confirmation is complete, applications <bcp14>MAY</bcp14> us | |||
n authenticated | e K_shared as an authenticated | |||
shared secret as needed. For example, applications MAY derive one or more AEAD | shared secret as needed. For example, applications <bcp14>MAY</bcp14> derive one | |||
keys and nonces from K_shared for subsequent application data encryption.</t> | or more keys and nonces from K_shared, for use with Authenticated Encryption wi | |||
th Associated Data (AEAD) and subsequent application data encryption.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="Ciphersuites" numbered="true" toc="default"> | <section anchor="Ciphersuites" numbered="true" toc="default"> | |||
<name>Ciphersuites</name> | <name>Ciphersuites</name> | |||
<t>This section documents SPAKE2+ ciphersuite configurations. A ciphersuit e | <t>This section documents SPAKE2+ ciphersuite configurations. A ciphersuit e | |||
indicates a group, cryptographic hash algorithm, and pair of KDF and MAC functio ns, e.g., | indicates a group, cryptographic hash algorithm, and pair of KDF and MAC functio ns, e.g., | |||
P256-SHA256-HKDF-HMAC-SHA256. This ciphersuite indicates a SPAKE2+ protocol inst ance over | P256-SHA256-HKDF-HMAC-SHA256. This ciphersuite indicates a SPAKE2+ protocol inst ance over | |||
P-256 that uses SHA256 along with HKDF <xref target="RFC5869" format="default"/> and HMAC <xref target="RFC2104" format="default"/> | P-256 that uses SHA256 along with HKDF <xref target="RFC5869" format="default"/> and HMAC <xref target="RFC2104" format="default"/> | |||
for G, Hash, KDF, and MAC functions, respectively. Since the choice of PBKDF | for G, Hash, KDF, and MAC functions, respectively. Since the choice of PBKDF, | |||
and its parameters for computing w0 and w1 and distributing does not affect | its parameters for computing w0 and w1, and the distribution of w0 and w1 do not | |||
affect | ||||
interoperability, the PBKDF is not included as part of the ciphersuite.</t> | interoperability, the PBKDF is not included as part of the ciphersuite.</t> | |||
<t>If no MAC algorithm is used in the key confirmation phase, its respecti ve column | <t>If no MAC algorithm is used in the key confirmation phase, its respecti ve column | |||
in Table 1 can be ignored and the ciphersuite name will contain no MAC | in <xref target="tab-1"/> can be ignored and the ciphersuite name will contain n o MAC | |||
identifier.</t> | identifier.</t> | |||
<table align="center"> | <table anchor="tab-1" align="center"> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">G</th> | <th align="left">G</th> | |||
<th align="center">Hash</th> | <th align="center">Hash</th> | |||
<th align="center">KDF</th> | <th align="center">KDF</th> | |||
<th align="center">MAC</th> | <th align="center">MAC</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
skipping to change at line 397 ¶ | skipping to change at line 413 ¶ | |||
<td align="center">CMAC-AES-128 <xref target="RFC4493" format="defau lt"/></td> | <td align="center">CMAC-AES-128 <xref target="RFC4493" format="defau lt"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">P-256</td> | <td align="left">P-256</td> | |||
<td align="center">SHA512 <xref target="RFC6234" format="default"/>< /td> | <td align="center">SHA512 <xref target="RFC6234" format="default"/>< /td> | |||
<td align="center">HKDF-SHA512 <xref target="RFC5869" format="defaul t"/></td> | <td align="center">HKDF-SHA512 <xref target="RFC5869" format="defaul t"/></td> | |||
<td align="center">CMAC-AES-128 <xref target="RFC4493" format="defau lt"/></td> | <td align="center">CMAC-AES-128 <xref target="RFC4493" format="defau lt"/></td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
<t>The following points represent permissible point generation seeds for t he groups listed | <t>The following points represent permissible point generation seeds for t he groups listed | |||
in Table 1, using the algorithm presented in <xref target="pointgen" format="def ault"/>. These bytestrings are | in <xref target="tab-1"/>, using the algorithm presented in <xref target="pointg en" format="default"/>. These byte strings are | |||
compressed points as in <xref target="SEC1" format="default"/> for curves from < xref target="SEC1" format="default"/> and <xref target="RFC8032" format="default "/>. Note that | compressed points as in <xref target="SEC1" format="default"/> for curves from < xref target="SEC1" format="default"/> and <xref target="RFC8032" format="default "/>. Note that | |||
these values are identical to those used in the companion SPAKE2 specification < | these values are identical to those used in the companion SPAKE2 specification < | |||
xref target="I-D.irtf-cfrg-spake2" format="default"/>.</t> | xref target="RFC9382" format="default"/>.</t> | |||
<t>For P256:</t> | <t>For P-256:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
M = | M = | |||
02886e2f97ace46e55ba9dd7242579f2993b64e16ef3dcab95afd497333d8fa12f | 02886e2f97ace46e55ba9dd7242579f2993b64e16ef3dcab95afd497333d8fa12f | |||
seed: 1.2.840.10045.3.1.7 point generation seed (M) | seed: 1.2.840.10045.3.1.7 point generation seed (M) | |||
N = | N = | |||
03d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4f98baa1292b49 | 03d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4f98baa1292b49 | |||
seed: 1.2.840.10045.3.1.7 point generation seed (N) | seed: 1.2.840.10045.3.1.7 point generation seed (N) | |||
]]></artwork> | ]]></artwork> | |||
<t>For P384:</t> | <t>For P-384:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
M = | M = | |||
030ff0895ae5ebf6187080a82d82b42e2765e3b2f8749c7e05eba366434b363d3dc | 030ff0895ae5ebf6187080a82d82b42e2765e3b2f8749c7e05eba366434b363d3dc | |||
36f15314739074d2eb8613fceec2853 | 36f15314739074d2eb8613fceec2853 | |||
seed: 1.3.132.0.34 point generation seed (M) | seed: 1.3.132.0.34 point generation seed (M) | |||
N = | N = | |||
02c72cf2e390853a1c1c4ad816a62fd15824f56078918f43f922ca21518f9c543bb | 02c72cf2e390853a1c1c4ad816a62fd15824f56078918f43f922ca21518f9c543bb | |||
252c5490214cf9aa3f0baab4b665c10 | 252c5490214cf9aa3f0baab4b665c10 | |||
seed: 1.3.132.0.34 point generation seed (N) | seed: 1.3.132.0.34 point generation seed (N) | |||
]]></artwork> | ]]></artwork> | |||
<t>For P521:</t> | <t>For P-521:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
M = | M = | |||
02003f06f38131b2ba2600791e82488e8d20ab889af753a41806c5db18d37d85608 | 02003f06f38131b2ba2600791e82488e8d20ab889af753a41806c5db18d37d85608 | |||
cfae06b82e4a72cd744c719193562a653ea1f119eef9356907edc9b56979962d7aa | cfae06b82e4a72cd744c719193562a653ea1f119eef9356907edc9b56979962d7aa | |||
seed: 1.3.132.0.35 point generation seed (M) | seed: 1.3.132.0.35 point generation seed (M) | |||
N = | N = | |||
0200c7924b9ec017f3094562894336a53c50167ba8c5963876880542bc669e494b25 | 0200c7924b9ec017f3094562894336a53c50167ba8c5963876880542bc669e494b25 | |||
32d76c5b53dfb349fdf69154b9e0048c58a42e8ed04cef052a3bc349d95575cd25 | 32d76c5b53dfb349fdf69154b9e0048c58a42e8ed04cef052a3bc349d95575cd25 | |||
seed: 1.3.132.0.35 point generation seed (N) | seed: 1.3.132.0.35 point generation seed (N) | |||
skipping to change at line 460 ¶ | skipping to change at line 477 ¶ | |||
seed: edwards448 point generation seed (M) | seed: edwards448 point generation seed (M) | |||
N = | N = | |||
6034c65b66e4cd7a49b0edec3e3c9ccc4588afd8cf324e29f0a84a072531c4db | 6034c65b66e4cd7a49b0edec3e3c9ccc4588afd8cf324e29f0a84a072531c4db | |||
f97ff9af195ed714a689251f08f8e06e2d1f24a0ffc0146600 | f97ff9af195ed714a689251f08f8e06e2d1f24a0ffc0146600 | |||
seed: edwards448 point generation seed (N) | seed: edwards448 point generation seed (N) | |||
]]></artwork> | ]]></artwork> | |||
</section> | </section> | |||
<section anchor="iana-considerations" numbered="true" toc="default"> | <section anchor="iana-considerations" numbered="true" toc="default"> | |||
<name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
<t>No IANA action is required.</t> | <t>This document has no IANA actions.</t> | |||
</section> | </section> | |||
<section anchor="security" numbered="true" toc="default"> | <section anchor="security" numbered="true" toc="default"> | |||
<name>Security Considerations</name> | <name>Security Considerations</name> | |||
<t>SPAKE2+ appears in <xref target="TDH" format="default"/> and is proven secure in <xref target="SPAKE2P-Analysis" format="default"/>.</t> | <t>SPAKE2+ appears in <xref target="TDH" format="default"/> and is proven secure in <xref target="SPAKE2P-Analysis" format="default"/>.</t> | |||
<t>The ephemeral randomness used by the prover and verifier MUST be | <t>The ephemeral randomness used by the Prover and Verifier <bcp14>MUST</b | |||
generated using a cryptographically secure PRNG.</t> | cp14> be | |||
<t>Elements received from a peer MUST be checked for group membership: fai | generated using a cryptographically secure Pseudorandom Number Generator (PRNG). | |||
lure to | </t> | |||
<t>Elements received from a peer <bcp14>MUST</bcp14> be checked for group | ||||
membership: failure to | ||||
properly deserialize and validate group elements can lead to attacks. An endpoin t | properly deserialize and validate group elements can lead to attacks. An endpoin t | |||
MUST abort the protocol if any received public value is not a member of the | <bcp14>MUST</bcp14> abort the protocol if any received public value is not a mem ber of the | |||
large prime-order subgroup of G. Multiplication of a public value V by the | large prime-order subgroup of G. Multiplication of a public value V by the | |||
cofactor h will yield the identity element I whenever V is an element of a | cofactor h will yield the identity element I whenever V is an element of a | |||
small-order subgroup. Consequently, prover and verifier MUST abort the protocol | small-order subgroup. Consequently, the Prover and Verifier <bcp14>MUST</bcp14> | |||
upon of any received value V such that V*h = I. Failure to do so may lead to sub | abort the protocol | |||
group | upon receiving any value V such that V*h = I. Failure to do so may lead to subgr | |||
oup | ||||
confinement attacks.</t> | confinement attacks.</t> | |||
</section> | </section> | |||
<section anchor="acknowledgements" numbered="true" toc="default"> | ||||
<name>Acknowledgements</name> | ||||
<t>Thanks to Ben Kaduk and Watson Ladd, from which this specification orig | ||||
inally emanated.</t> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<references> | <references> | |||
<name>References</name> | <name>References</name> | |||
<references> | <references> | |||
<name>Normative References</name> | <name>Normative References</name> | |||
<reference anchor="TDH"> | <reference anchor="TDH"> | |||
<front> | <front> | |||
<title>The Twin-Diffie Hellman Problem and Applications</title> | <title>The Twin-Diffie Hellman Problem and Applications</title> | |||
<author> | <author initials="D" surname="Cash" fullname="David Cash"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date year="2008"/> | <author initials="E" surname="Kiltz" fullname="Eike Kiltz"> | |||
</front> | ||||
<seriesInfo name="EUROCRYPT 2008, Volume 4965 of Lecture notes in Comp | ||||
uter Science, pages 127-145, Springer-Verlag, Berlin, Germany" value=""/> | ||||
</reference> | ||||
<reference anchor="SPAKE2P-Analysis" target="https://eprint.iacr.org/202 | ||||
0/313.pdf"> | ||||
<front> | ||||
<title>Security analysis of SPAKE2+</title> | ||||
<author> | ||||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date year="2020"/> | <author initials="V" surname="Shoup" fullname="Victor Shoup"> | |||
</front> | ||||
</reference> | ||||
<reference anchor="SEC1" target="https://secg.org/sec1-v2.pdf"> | ||||
<front> | ||||
<title>Elliptic Curve Cryptography, Standards for Efficient Cryptogr | ||||
aphy Group, ver. 2</title> | ||||
<author> | ||||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date year="2009"/> | <date month="April" year="2008"/> | |||
</front> | </front> | |||
<refcontent>EUROCRYPT 2008, Lecture Notes in Computer Science, Volume | ||||
4965, pages 127-145, Springer-Verlag, Berlin, Germany</refcontent> | ||||
<seriesInfo name="DOI" value="10.1007/978-3-540-78967-3_8"/> | ||||
</reference> | </reference> | |||
<reference anchor="I-D.irtf-cfrg-spake2"> | ||||
<front> | ||||
<title>SPAKE2, a PAKE</title> | ||||
<author fullname="Watson Ladd"> | ||||
<organization>Sealance</organization> | ||||
</author> | ||||
<author fullname="Benjamin Kaduk"> | ||||
<organization>Akamai Technologies</organization> | ||||
</author> | ||||
<date day="8" month="February" year="2022"/> | ||||
<abstract> | ||||
<t> This document describes SPAKE2 which is a protocol for two p | ||||
arties | ||||
that share a password to derive a strong shared key without | ||||
disclosing the password. This method is compatible with any group, | ||||
is computationally efficient, and SPAKE2 has a security proof. This | ||||
document predated the CFRG PAKE competition and it was not selected, | ||||
however, given existing use of variants in Kerberos and other | ||||
applications it was felt publication was beneficial. Applications | ||||
that need a symmetric PAKE (password authenticated key exchange) and | ||||
where hashing onto an elliptic curve at execution time is not | ||||
possible can use SPAKE2. This document is a product of the Crypto | ||||
Forum Research Group (CFRG) in the IRTF. | ||||
</t> | <reference anchor="SPAKE2P-Analysis" target="https://eprint.iacr.org/202 | |||
</abstract> | 0/313.pdf"> | |||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-spake2-26"/> | ||||
</reference> | ||||
<reference anchor="RFC2119"> | ||||
<front> | ||||
<title>Key words for use in RFCs to Indicate Requirement Levels</tit | ||||
le> | ||||
<author fullname="S. Bradner" initials="S." surname="Bradner"> | ||||
<organization/> | ||||
</author> | ||||
<date month="March" year="1997"/> | ||||
<abstract> | ||||
<t>In many standards track documents several words are used to sig | ||||
nify the requirements in the specification. These words are often capitalized. | ||||
This document defines these words as they should be interpreted in IETF document | ||||
s. This document specifies an Internet Best Current Practices for the Internet | ||||
Community, and requests discussion and suggestions for improvements.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="2119"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
</reference> | ||||
<reference anchor="RFC8174"> | ||||
<front> | ||||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | ||||
tle> | ||||
<author fullname="B. Leiba" initials="B." surname="Leiba"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2017"/> | ||||
<abstract> | ||||
<t>RFC 2119 specifies common key words that may be used in protoco | ||||
l specifications. This document aims to reduce the ambiguity by clarifying tha | ||||
t only UPPERCASE usage of the key words have the defined special meanings.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="8174"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
</reference> | ||||
<reference anchor="RFC6234"> | ||||
<front> | ||||
<title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</ | ||||
title> | ||||
<author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3 | ||||
rd"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="T. Hansen" initials="T." surname="Hansen"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2011"/> | ||||
<abstract> | ||||
<t>Federal Information Processing Standard, FIPS</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6234"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6234"/> | ||||
</reference> | ||||
<reference anchor="RFC8265"> | ||||
<front> | ||||
<title>Preparation, Enforcement, and Comparison of Internationalized | ||||
Strings Representing Usernames and Passwords</title> | ||||
<author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre | ||||
"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="A. Melnikov" initials="A." surname="Melnikov"> | ||||
<organization/> | ||||
</author> | ||||
<date month="October" year="2017"/> | ||||
<abstract> | ||||
<t>This document describes updated methods for handling Unicode st | ||||
rings representing usernames and passwords. The previous approach was known as | ||||
SASLprep (RFC 4013) and was based on Stringprep (RFC 3454). The methods specifie | ||||
d in this document provide a more sustainable approach to the handling of intern | ||||
ationalized usernames and passwords. This document obsoletes RFC 7613.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8265"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8265"/> | ||||
</reference> | ||||
<reference anchor="RFC5869"> | ||||
<front> | ||||
<title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)< | ||||
/title> | ||||
<author fullname="H. Krawczyk" initials="H." surname="Krawczyk"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="P. Eronen" initials="P." surname="Eronen"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2010"/> | ||||
<abstract> | ||||
<t>This document specifies a simple Hashed Message Authentication | ||||
Code (HMAC)-based key derivation function (HKDF), which can be used as a buildin | ||||
g block in various protocols and applications. The key derivation function (KDF | ||||
) is intended to support a wide range of applications and requirements, and is c | ||||
onservative in its use of cryptographic hash functions. This document is not an | ||||
Internet Standards Track specification; it is published for informational pur | ||||
poses.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5869"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5869"/> | ||||
</reference> | ||||
<reference anchor="RFC2104"> | ||||
<front> | ||||
<title>HMAC: Keyed-Hashing for Message Authentication</title> | ||||
<author fullname="H. Krawczyk" initials="H." surname="Krawczyk"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="M. Bellare" initials="M." surname="Bellare"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="R. Canetti" initials="R." surname="Canetti"> | ||||
<organization/> | ||||
</author> | ||||
<date month="February" year="1997"/> | ||||
<abstract> | ||||
<t>This document describes HMAC, a mechanism for message authentic | ||||
ation using cryptographic hash functions. HMAC can be used with any iterative cr | ||||
yptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared | ||||
key. The cryptographic strength of HMAC depends on the properties of the under | ||||
lying hash function. This memo provides information for the Internet community. | ||||
This memo does not specify an Internet standard of any kind</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="2104"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2104"/> | ||||
</reference> | ||||
<reference anchor="RFC4493"> | ||||
<front> | ||||
<title>The AES-CMAC Algorithm</title> | ||||
<author fullname="JH. Song" initials="JH." surname="Song"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="R. Poovendran" initials="R." surname="Poovendran"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="J. Lee" initials="J." surname="Lee"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="T. Iwata" initials="T." surname="Iwata"> | ||||
<organization/> | ||||
</author> | ||||
<date month="June" year="2006"/> | ||||
<abstract> | ||||
<t>The National Institute of Standards and Technology (NIST) has r | ||||
ecently specified the Cipher-based Message Authentication Code (CMAC), which is | ||||
equivalent to the One-Key CBC MAC1 (OMAC1) submitted by Iwata and Kurosawa. Thi | ||||
s memo specifies an authentication algorithm based on CMAC with the 128-bit Adva | ||||
nced Encryption Standard (AES). This new authentication algorithm is named AES-C | ||||
MAC. The purpose of this document is to make the AES-CMAC algorithm conveniently | ||||
available to the Internet Community. This memo provides information for the In | ||||
ternet community.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4493"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4493"/> | ||||
</reference> | ||||
<reference anchor="RFC8032"> | ||||
<front> | <front> | |||
<title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title> | <title>Security analysis of SPAKE2+</title> | |||
<author fullname="S. Josefsson" initials="S." surname="Josefsson"> | <author initials="V." surname="Shoup" fullname="Victor Shoup"> | |||
<organization/> | ||||
</author> | ||||
<author fullname="I. Liusvaara" initials="I." surname="Liusvaara"> | ||||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date month="January" year="2017"/> | <date month="March" year="2020"/> | |||
<abstract> | ||||
<t>This document describes elliptic curve signature scheme Edwards | ||||
-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with | ||||
recommended parameters for the edwards25519 and edwards448 curves. An example i | ||||
mplementation and test vectors are provided.</t> | ||||
</abstract> | ||||
</front> | </front> | |||
<seriesInfo name="RFC" value="8032"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8032"/> | ||||
</reference> | </reference> | |||
<reference anchor="RFC5480"> | ||||
<reference anchor="SEC1" target="https://secg.org/sec1-v2.pdf"> | ||||
<front> | <front> | |||
<title>Elliptic Curve Cryptography Subject Public Key Information</t | <title>SEC 1: Elliptic Curve Cryptography</title> | |||
itle> | <author> | |||
<author fullname="S. Turner" initials="S." surname="Turner"> | <organization>Standards for Efficient Cryptography Group</organiza | |||
<organization/> | tion> | |||
</author> | ||||
<author fullname="D. Brown" initials="D." surname="Brown"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="K. Yiu" initials="K." surname="Yiu"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="R. Housley" initials="R." surname="Housley"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="T. Polk" initials="T." surname="Polk"> | ||||
<organization/> | ||||
</author> | </author> | |||
<date month="March" year="2009"/> | <date month="May" year="2009"/> | |||
<abstract> | ||||
<t>This document specifies the syntax and semantics for the Subjec | ||||
t Public Key Information field in certificates that support Elliptic Curve Crypt | ||||
ography. This document updates Sections 2.3.5 and 5, and the ASN.1 module of "A | ||||
lgorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certi | ||||
ficate and Certificate Revocation List (CRL) Profile", RFC 3279. [STANDARDS-TRA | ||||
CK]</t> | ||||
</abstract> | ||||
</front> | </front> | |||
<seriesInfo name="RFC" value="5480"/> | <refcontent>version 2.0</refcontent> | |||
<seriesInfo name="DOI" value="10.17487/RFC5480"/> | ||||
</reference> | </reference> | |||
<!-- draft-irtf-cfrg-spake2 (RFC 9382) --> | ||||
<reference anchor='RFC9382' target='https://www.rfc-editor.org/info/rfc9382'> | ||||
<front> | ||||
<title>SPAKE2, a Password-Authenticated Key Exchange</title> | ||||
<author initials='W' surname='Ladd' fullname='Watson Ladd'> | ||||
<organization /> | ||||
</author> | ||||
<date year='2023' month='September' /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="9382"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9382"/> | ||||
</reference> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml" | ||||
/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml" | ||||
/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml" | ||||
/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8265.xml" | ||||
/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5869.xml" | ||||
/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2104.xml" | ||||
/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4493.xml" | ||||
/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8032.xml" | ||||
/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5480.xml" | ||||
/> | ||||
</references> | </references> | |||
<references> | <references> | |||
<name>Informative References</name> | <name>Informative References</name> | |||
<reference anchor="RFC7914"> | ||||
<front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7914.xml" | |||
<title>The scrypt Password-Based Key Derivation Function</title> | /> | |||
<author fullname="C. Percival" initials="C." surname="Percival"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9106.xml" | |||
<organization/> | /> | |||
</author> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8844.xml" | |||
<author fullname="S. Josefsson" initials="S." surname="Josefsson"> | /> | |||
<organization/> | ||||
</author> | ||||
<date month="August" year="2016"/> | ||||
<abstract> | ||||
<t>This document specifies the password-based key derivation funct | ||||
ion scrypt. The function derives one or more secret keys from a secret string. | ||||
It is based on memory-hard functions, which offer added protection against atta | ||||
cks using custom hardware. The document also provides an ASN.1 schema.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7914"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7914"/> | ||||
</reference> | ||||
<reference anchor="RFC9106"> | ||||
<front> | ||||
<title>Argon2 Memory-Hard Function for Password Hashing and Proof-of | ||||
-Work Applications</title> | ||||
<author fullname="A. Biryukov" initials="A." surname="Biryukov"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="D. Dinu" initials="D." surname="Dinu"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="D. Khovratovich" initials="D." surname="Khovratovi | ||||
ch"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="S. Josefsson" initials="S." surname="Josefsson"> | ||||
<organization/> | ||||
</author> | ||||
<date month="September" year="2021"/> | ||||
<abstract> | ||||
<t>This document describes the Argon2 memory-hard function for pas | ||||
sword hashing and proof-of-work applications. We provide an implementer-oriente | ||||
d description with test vectors. The purpose is to simplify adoption of Argon2 | ||||
for Internet protocols. This document is a product of the Crypto Forum Research | ||||
Group (CFRG) in the IRTF.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="9106"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9106"/> | ||||
</reference> | ||||
<reference anchor="RFC8844"> | ||||
<front> | ||||
<title>Unknown Key-Share Attacks on Uses of TLS with the Session Des | ||||
cription Protocol (SDP)</title> | ||||
<author fullname="M. Thomson" initials="M." surname="Thomson"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="E. Rescorla" initials="E." surname="Rescorla"> | ||||
<organization/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
<abstract> | ||||
<t>This document describes unknown key-share attacks on the use of | ||||
Datagram Transport Layer Security for the Secure Real-Time Transport Protocol ( | ||||
DTLS-SRTP). Similar attacks are described on the use of DTLS-SRTP with the ident | ||||
ity bindings used in Web Real-Time Communications (WebRTC) and SIP identity. Th | ||||
ese attacks are difficult to mount, but they cause a victim to be misled about t | ||||
he identity of a communicating peer. This document defines mitigation technique | ||||
s that implementations of RFC 8122 are encouraged to deploy.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8844"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8844"/> | ||||
</reference> | ||||
</references> | </references> | |||
</references> | </references> | |||
<section anchor="flow" numbered="true" toc="default"> | <section anchor="flow" numbered="true" toc="default"> | |||
<name>Protocol Flow</name> | <name>Protocol Flow</name> | |||
<t>This section describes the flow of the SPAKE2+ protocol, including comp utations | <t>This section describes the flow of the SPAKE2+ protocol, including comp utations | |||
and mandatory checks performed by the prover and verifier. The constants M, N, | and mandatory checks performed by the Prover and Verifier. The constants M, N, | |||
P, p, and h are defined by the chosen ciphersuite.</t> | P, p, and h are defined by the chosen ciphersuite.</t> | |||
<section anchor="prover" numbered="true" toc="default"> | <section anchor="prover" numbered="true" toc="default"> | |||
<name>Prover</name> | <name>Prover</name> | |||
<t>The Prover's behavior consists of two functions, ProverInit and Prove rFinish, which | <t>The Prover implements two functions, ProverInit and ProverFinish, whi ch | |||
are described below.</t> | are described below.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<sourcecode type="pseudocode"><![CDATA[ | ||||
def ProverInit(w0): | def ProverInit(w0): | |||
// Compute prover key share | // Compute Prover key share | |||
x <- [0, p-1] | x <- [0, p-1] | |||
X = x*P + w0*M | X = x*P + w0*M | |||
return (x, X) | return (x, X) | |||
def ProverFinish(w0, w1, x, Y): | def ProverFinish(w0, w1, x, Y): | |||
if not_in_subgroup(Y): | if not_in_subgroup(Y): | |||
raise "invalid input" | raise "invalid input" | |||
// Compute shared values | // Compute shared values | |||
Z = h*x*(Y - w0*N) | Z = h*x*(Y - w0*N) | |||
V = h*w1*(Y - w0*N) | V = h*w1*(Y - w0*N) | |||
return (Y, Z, V) | return (Y, Z, V) | |||
]]></artwork> | ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="verifier" numbered="true" toc="default"> | <section anchor="verifier" numbered="true" toc="default"> | |||
<name>Verifier</name> | <name>Verifier</name> | |||
<t>The Verifier's behavior consists of a single function, VerifierFinish , which | <t>The Verifier implements a single function, VerifierFinish, which | |||
is described below.</t> | is described below.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode"><![CDATA[ | |||
def VerifierFinish(w0, L, X): | def VerifierFinish(w0, L, X): | |||
if not_in_subgroup(X): | if not_in_subgroup(X): | |||
raise "invalid input" | raise "invalid input" | |||
// Compute verifier key share | // Compute Verifier key share | |||
y <- [0, p-1] | y <- [0, p-1] | |||
Y = y*P + w0*N | Y = y*P + w0*N | |||
// Compute shared values | // Compute shared values | |||
Z = h*y*(X - w0*M) | Z = h*y*(X - w0*M) | |||
V = h*y*L | V = h*y*L | |||
return (Z, V) | return (Z, V) | |||
]]></artwork> | ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="transcript-computation" numbered="true" toc="default"> | <section anchor="transcript-computation" numbered="true" toc="default"> | |||
<name>Transcript Computation</name> | <name>Transcript Computation</name> | |||
<t>Both Prover and Verifier share the same function to compute the proto | ||||
col | <t>Both the Prover and the Verifier share the same function to compute t | |||
he protocol | ||||
transcript, ComputeTranscript, which is described below.</t> | transcript, ComputeTranscript, which is described below.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode"><![CDATA[ | |||
def ComputeTranscript(Context, idProver, idVerifier, shareP, shareV, Z, V, w0): | def ComputeTranscript(Context, idProver, idVerifier, | |||
shareP, shareV, Z, V, w0): | ||||
TT = len(Context) || Context | TT = len(Context) || Context | |||
|| len(idProver) || idProver | || len(idProver) || idProver | |||
|| len(idVerifier) || idVerifier | || len(idVerifier) || idVerifier | |||
|| len(M) || M | || len(M) || M | |||
|| len(N) || N | || len(N) || N | |||
|| len(shareP) || shareP | || len(shareP) || shareP | |||
|| len(shareV) || shareV | || len(shareV) || shareV | |||
|| len(Z) || Z | || len(Z) || Z | |||
|| len(V) || V | || len(V) || V | |||
|| len(w0) || w0 | || len(w0) || w0 | |||
]]></artwork> | ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="key-schedule-computation" numbered="true" toc="default"> | <section anchor="key-schedule-computation" numbered="true" toc="default"> | |||
<name>Key Schedule Computation</name> | <name>Key Schedule Computation</name> | |||
<t>Both Prover and Verifier share the same function to compute | <t>Both the Prover and the Verifier share the same function to compute | |||
the key schedule, ComputeKeySchedule, which is described below.</t> | the key schedule, ComputeKeySchedule, which is described below.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode"><![CDATA[ | |||
def ComputeKeySchedule(TT): | def ComputeKeySchedule(TT): | |||
K_main = Hash(TT) | K_main = Hash(TT) | |||
K_confirmP || K_confirmV = KDF(nil, K_main, "ConfirmationKeys") | K_confirmP || K_confirmV = KDF(nil, K_main, "ConfirmationKeys") | |||
K_shared = KDF(nil, K_main, "SharedKey") | K_shared = KDF(nil, K_main, "SharedKey") | |||
return K_confirmP, K_confirmV, K_shared | return K_confirmP, K_confirmV, K_shared | |||
]]></artwork> | ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="protocol-run" numbered="true" toc="default"> | <section anchor="protocol-run" numbered="true" toc="default"> | |||
<name>Protocol Run</name> | <name>Protocol Run</name> | |||
<t>A full SPAKE2+ protocol run initiated by the prover will look as foll ows, | <t>A full SPAKE2+ protocol run initiated by the Prover will look as foll ows, | |||
where Transmit and Receive are shorthand for sending and receiving | where Transmit and Receive are shorthand for sending and receiving | |||
a message to the peer:</t> | a message to the peer:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<sourcecode type="pseudocode"><![CDATA[ | ||||
Prover(Context, idProver, idVerifier, w0, w1): | Prover(Context, idProver, idVerifier, w0, w1): | |||
(x, X) = ProverInit(w0) | (x, X) = ProverInit(w0) | |||
Transmit(X) | Transmit(X) | |||
Y = Receive() | Y = Receive() | |||
(Z, V) = ProverFinish(w0, w1, x, Y) | (Z, V) = ProverFinish(w0, w1, x, Y) | |||
TT = ComputeTranscript(Context, idProver, idVerifier, X, Y, Z, V, w0) | TT = ComputeTranscript(Context, idProver, idVerifier, X, Y, | |||
Z, V, w0) | ||||
(K_confirmP, K_confirmV, K_shared) = ComputeKeySchedule(TT) | (K_confirmP, K_confirmV, K_shared) = ComputeKeySchedule(TT) | |||
expected_confirmV = MAC(K_confirmV, X) | expected_confirmV = MAC(K_confirmV, X) | |||
confirmV = Receive() | confirmV = Receive() | |||
if not_equal_constant_time(expected_confirmV, confirmV): | if not_equal_constant_time(expected_confirmV, confirmV): | |||
raise "invalid confirmation message" | raise "invalid confirmation message" | |||
confirmP = MAC(K_confirmP, Y) | confirmP = MAC(K_confirmP, Y) | |||
Transmit(confirmP) | Transmit(confirmP) | |||
return K_shared | return K_shared | |||
Verifier(Context, idProver, idVerifier, w0, L): | Verifier(Context, idProver, idVerifier, w0, L): | |||
X = Receive() | X = Receive() | |||
(Y, Z, V) = VerifierFinish(w0, L, X) | (Y, Z, V) = VerifierFinish(w0, L, X) | |||
Transmit(Y) | Transmit(Y) | |||
TT = ComputeTranscript(Context, idProver, idVerifier, X, Y, Z, V, w0) | TT = ComputeTranscript(Context, idProver, idVerifier, X, Y, | |||
Z, V, w0) | ||||
(K_confirmP, K_confirmV, K_shared) = ComputeKeySchedule(TT) | (K_confirmP, K_confirmV, K_shared) = ComputeKeySchedule(TT) | |||
confirmV = MAC(K_confirmV, X) | confirmV = MAC(K_confirmV, X) | |||
Transmit(confirmV) | Transmit(confirmV) | |||
expected_confirmP = MAC(K_confirmP, Y) | expected_confirmP = MAC(K_confirmP, Y) | |||
confirmP = Receive() | confirmP = Receive() | |||
if not_equal_constant_time(expected_confirmP, confirmP): | if not_equal_constant_time(expected_confirmP, confirmP): | |||
raise "invalid confirmation message" | raise "invalid confirmation message" | |||
return K_shared | return K_shared | |||
]]></artwork> | ]]></sourcecode> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="pointgen" numbered="true" toc="default"> | <section anchor="pointgen" numbered="true" toc="default"> | |||
<name>Algorithm used for Point Generation</name> | <name>Algorithm Used for Point Generation</name> | |||
<t>This section describes the algorithm that was used to generate | <t>This section describes the algorithm that was used to generate | |||
the points M and N in the table in <xref target="Ciphersuites" format="default"/ >. This algorithm | the points M and N in <xref target="tab-1"/> (<xref target="Ciphersuites"/>). Th is algorithm | |||
produces M and N such that they are indistinguishable from two random | produces M and N such that they are indistinguishable from two random | |||
points in the prime-order subgroup of G, where the discrete log | points in the prime-order subgroup of G, where the discrete log | |||
of these points is unknown. See <xref target="SPAKE2P-Analysis" format="default" /> for additional | of these points is unknown. See <xref target="SPAKE2P-Analysis" format="default" /> for additional | |||
details on this requirement.</t> | details on this requirement.</t> | |||
<t>For each curve in the table below, we construct a string | <t>For each curve in <xref target="tab-1"/>, we construct a string | |||
using the curve OID from <xref target="RFC5480" format="default"/> (as an ASCII | using the curve OID from <xref target="RFC5480" format="default"/> (as an ASCII | |||
string) or its name, | string) or its name, | |||
combined with the needed constant, for instance "1.3.132.0.35 | combined with the needed constant -- for instance, "1.3.132.0.35 | |||
point generation seed (M)" for P-512. This string is turned | point generation seed (M)" for P-521. This string is turned | |||
into a series of blocks by hashing with SHA256, and hashing that | into a series of blocks by hashing with SHA256, and hashing that | |||
output again to generate the next 32 bytes, and so on. This | output again to generate the next 32 bytes, and so on. This | |||
pattern is repeated for each group and value, with the string | pattern is repeated for each group and value, with the string | |||
modified appropriately.</t> | modified appropriately.</t> | |||
<t>A byte string of length equal to that of an encoded group | <t>A byte string of length equal to that of an encoded group | |||
element is constructed by concatenating as many blocks as are | element is constructed by concatenating as many blocks as are | |||
required, starting from the first block, and truncating to the | required, starting from the first block, and truncating to the | |||
desired length. The byte string is then formatted as required | desired length. The byte string is then formatted as required | |||
for the group. In the case of Weierstrass curves, we take the | for the group. In the case of Weierstrass curves, we take the | |||
desired length as the length for representing a compressed point | desired length as the length for representing a compressed point | |||
(section 2.3.4 of <xref target="SEC1" format="default"/>), | (<xref target="SEC1" sectionFormat="of" section="2.3.4" relative="#subsubsection .2.3.4"/>) | |||
and use the low-order bit of the first byte as the sign bit. | and use the low-order bit of the first byte as the sign bit. | |||
In order to obtain the correct format, the value of the first | In order to obtain the correct format, the value of the first | |||
byte is set to 0x02 or 0x03 (clearing the first six bits | byte is set to 0x02 or 0x03 (clearing the first six bits | |||
and setting the seventh bit), leaving the sign bit as it was | and setting the seventh bit), leaving the sign bit as it was | |||
in the byte string constructed by concatenating hash blocks. | in the byte string constructed by concatenating hash blocks. | |||
For the <xref target="RFC8032" format="default"/> curves a different procedure i | For the curves described in <xref target="RFC8032" format="default"/>, a differe | |||
s used. | nt procedure is used. | |||
For edwards448 the 57-byte input has the least-significant 7 bits of the | For edwards448, the 57-byte input has the least-significant 7 bits of the | |||
last byte set to zero, and for edwards25519 the 32-byte input is | last byte set to zero, and for edwards25519, the 32-byte input is | |||
not modified. For both the <xref target="RFC8032" format="default"/> curves the | not modified. For both of the curves described in <xref target="RFC8032" format | |||
="default"/>, the | ||||
(modified) input is then interpreted | (modified) input is then interpreted | |||
as the representation of the group element. | as the representation of the group element. | |||
If this interpretation yields a valid group element with the | If this interpretation yields a valid group element with the | |||
correct order (p), the (modified) byte string is the output. Otherwise, | correct order (p), the (modified) byte string is the output. Otherwise, | |||
the initial hash block is discarded and a new byte string constructed | the initial hash block is discarded and a new byte string constructed | |||
from the remaining hash blocks. The procedure of constructing a | from the remaining hash blocks. The procedure for constructing a | |||
byte string of the appropriate length, formatting it as | byte string of the appropriate length, formatting it as | |||
required for the curve, and checking if it is a valid point of the correct | required for the curve, and checking to see if it is a valid point of the correc | |||
order, is repeated | t | |||
order is repeated | ||||
until a valid element is found.</t> | until a valid element is found.</t> | |||
<t>The following python snippet generates the above points, | <t>The following Python snippet generates the above points, | |||
assuming an elliptic curve implementation following the | assuming an elliptic curve implementation following the | |||
interface of Edwards25519Point.stdbase() and | interface of Edwards25519Point.stdbase() and | |||
Edwards448Point.stdbase() in Appendix A of <xref target="RFC8032" format="defaul | Edwards448Point.stdbase() in <xref target="RFC8032" sectionFormat="of" section=" | |||
t"/>:</t> | A"/>:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="python"><![CDATA[ | |||
def iterated_hash(seed, n): | def iterated_hash(seed, n): | |||
h = seed | h = seed | |||
for i in range(n): | for i in range(n): | |||
h = hashlib.sha256(h).digest() | h = hashlib.sha256(h).digest() | |||
return h | return h | |||
def bighash(seed, start, sz): | def bighash(seed, start, sz): | |||
n = -(-sz // 32) | n = -(-sz // 32) | |||
hashes = [iterated_hash(seed, i) for i in range(start, start + n)] | hashes = [iterated_hash(seed, i) for i in range(start, start + n)] | |||
return b''.join(hashes)[:sz] | return b''.join(hashes)[:sz] | |||
skipping to change at line 966 ¶ | skipping to change at line 774 ¶ | |||
def gen_point(seed, ecname, ec): | def gen_point(seed, ecname, ec): | |||
for i in range(1, 1000): | for i in range(1, 1000): | |||
hval = bighash(seed, i, len(ec.encode())) | hval = bighash(seed, i, len(ec.encode())) | |||
pointstr = canon_pointstr(ecname, hval) | pointstr = canon_pointstr(ecname, hval) | |||
try: | try: | |||
p = ec.decode(pointstr) | p = ec.decode(pointstr) | |||
if p != ec.zero_elem() and p * p.l() == ec.zero_elem(): | if p != ec.zero_elem() and p * p.l() == ec.zero_elem(): | |||
return pointstr, i | return pointstr, i | |||
except Exception: | except Exception: | |||
pass | pass | |||
]]></artwork> | ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="testvectors" numbered="true" toc="default"> | <section anchor="testvectors" numbered="true" toc="default"> | |||
<name>Test Vectors</name> | <name>Test Vectors</name> | |||
<t>This section contains various test vectors for SPAKE2+. | <t>This section contains various test vectors for SPAKE2+. | |||
(Choice of PBKDF is omitted and values for w0 and w1 are provided directly.) | (The choice of PBKDF is omitted, and values for w0 and w1 are provided directly. ) | |||
All points are encoded using the uncompressed format, i.e., with a 0x04 octet | All points are encoded using the uncompressed format, i.e., with a 0x04 octet | |||
prefix, specified in <xref target="SEC1" format="default"/>. idProver and idVeri fier identity strings | prefix, specified in <xref target="SEC1" format="default"/>. idProver and idVerifier identity strings | |||
are provided in the protocol invocation.</t> | are provided in the protocol invocation.</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<sourcecode type="test-vectors"><![CDATA[ | ||||
[Context=b'SPAKE2+-P256-SHA256-HKDF-SHA256-HMAC-SHA256 Test Vectors | [Context=b'SPAKE2+-P256-SHA256-HKDF-SHA256-HMAC-SHA256 Test Vectors | |||
'] | '] | |||
[idProver=b'client'] | [idProver=b'client'] | |||
[idVerifier=b'server'] | [idVerifier=b'server'] | |||
w0 = 0xbb8e1bbcf3c48f62c08db243652ae55d3e5586053fca77102994f23ad9549 | w0 = 0xbb8e1bbcf3c48f62c08db243652ae55d3e5586053fca77102994f23ad9549 | |||
1b3 | 1b3 | |||
w1 = 0x7e945f34d78785b8a3ef44d0df5a1a97d6b3b460409a345ca7830387a74b1 | w1 = 0x7e945f34d78785b8a3ef44d0df5a1a97d6b3b460409a345ca7830387a74b1 | |||
dba | dba | |||
L = 0x04eb7c9db3d9a9eb1f8adab81b5794c1f13ae3e225efbe91ea487425854c7f | L = 0x04eb7c9db3d9a9eb1f8adab81b5794c1f13ae3e225efbe91ea487425854c7f | |||
c00f00bfedcbd09b2400142d40a14f2064ef31dfaa903b91d1faea7093d835966efd | c00f00bfedcbd09b2400142d40a14f2064ef31dfaa903b91d1faea7093d835966efd | |||
skipping to change at line 1029 ¶ | skipping to change at line 838 ¶ | |||
K_confirmP = 0x871ae3f7b78445e34438fb284504240239031c39d80ac23eb5ab9 | K_confirmP = 0x871ae3f7b78445e34438fb284504240239031c39d80ac23eb5ab9 | |||
be5ad6db58a | be5ad6db58a | |||
K_confirmV = 0xccd53c7c1fa37b64a462b40db8be101cedcf838950162902054e6 | K_confirmV = 0xccd53c7c1fa37b64a462b40db8be101cedcf838950162902054e6 | |||
44b400f1680 | 44b400f1680 | |||
HMAC(K_confirmP, shareV) = 0x926cc713504b9b4d76c9162ded04b5493e89109 | HMAC(K_confirmP, shareV) = 0x926cc713504b9b4d76c9162ded04b5493e89109 | |||
f6d89462cd33adc46fda27527 | f6d89462cd33adc46fda27527 | |||
HMAC(K_confirmV, shareP) = 0x9747bcc4f8fe9f63defee53ac9b07876d907d55 | HMAC(K_confirmV, shareP) = 0x9747bcc4f8fe9f63defee53ac9b07876d907d55 | |||
047e6ff2def2e7529089d3e68 | 047e6ff2def2e7529089d3e68 | |||
K_shared = 0x0c5f8ccd1413423a54f6c1fb26ff01534a87f893779c6e68666d772 | K_shared = 0x0c5f8ccd1413423a54f6c1fb26ff01534a87f893779c6e68666d772 | |||
bfd91f3e7 | bfd91f3e7 | |||
]]></sourcecode> | ||||
<sourcecode type="test-vectors"><![CDATA[ | ||||
[Context=b'SPAKE2+-P256-SHA512-HKDF-SHA512-HMAC-SHA512 Test Vectors | [Context=b'SPAKE2+-P256-SHA512-HKDF-SHA512-HMAC-SHA512 Test Vectors | |||
'] | '] | |||
[idProver=b'client'] | [idProver=b'client'] | |||
[idVerifier=b'server'] | [idVerifier=b'server'] | |||
w0 = 0x1cc5207d6e34b8f7828206fb64b86aa9c712bc952abf251bb9f5856b24d8c | w0 = 0x1cc5207d6e34b8f7828206fb64b86aa9c712bc952abf251bb9f5856b24d8c | |||
8cc | 8cc | |||
w1 = 0x4279649e62532b01dc27d2ed39100ba350518fb969672061a01edce752d0e | w1 = 0x4279649e62532b01dc27d2ed39100ba350518fb969672061a01edce752d0e | |||
672 | 672 | |||
L = 0x043a348ad475d2200d46df876f1eb2e136056da31dafff52cc7762bf3be84d | L = 0x043a348ad475d2200d46df876f1eb2e136056da31dafff52cc7762bf3be84d | |||
e0097c4e69b0b9321326af1f0af4a14561a9c7b640cb5afd6822d14cb34830fc4511 | e0097c4e69b0b9321326af1f0af4a14561a9c7b640cb5afd6822d14cb34830fc4511 | |||
skipping to change at line 1089 ¶ | skipping to change at line 899 ¶ | |||
aa58f61 | aa58f61 | |||
HMAC(K_confirmP, shareV) = 0x6b2469b56cf8ac3f94a8d0b533380ea6b3d0f46 | HMAC(K_confirmP, shareV) = 0x6b2469b56cf8ac3f94a8d0b533380ea6b3d0f46 | |||
b3e12ee82550d49e129c2412728c9437a64ee5f80c8cdc5e8a30faa0a6deb8a52513 | b3e12ee82550d49e129c2412728c9437a64ee5f80c8cdc5e8a30faa0a6deb8a52513 | |||
46ba81bb6fc955b2304fc | 46ba81bb6fc955b2304fc | |||
HMAC(K_confirmV, shareP) = 0x154174fc278a935e290b3352ba877e179fa9281 | HMAC(K_confirmV, shareP) = 0x154174fc278a935e290b3352ba877e179fa9281 | |||
c0a76928faea703c72d383b267511a5cf084cb07147efece94e3cfd91944e7baab85 | c0a76928faea703c72d383b267511a5cf084cb07147efece94e3cfd91944e7baab85 | |||
6858fbebc087167b0f409 | 6858fbebc087167b0f409 | |||
K_shared = 0x11887659d9e002f34fa6cc270d33570f001b2a3fc0522b643c07327 | K_shared = 0x11887659d9e002f34fa6cc270d33570f001b2a3fc0522b643c07327 | |||
d09a4a9f47aab85813d13c585b53adf5ac9de5707114848f3dc31a4045f69a2cc197 | d09a4a9f47aab85813d13c585b53adf5ac9de5707114848f3dc31a4045f69a2cc197 | |||
2b098 | 2b098 | |||
]]></sourcecode> | ||||
<sourcecode type="test-vectors"><![CDATA[ | ||||
[Context=b'SPAKE2+-P384-SHA256-HKDF-SHA256-HMAC-SHA256 Test Vectors | [Context=b'SPAKE2+-P384-SHA256-HKDF-SHA256-HMAC-SHA256 Test Vectors | |||
'] | '] | |||
[idProver=b'client'] | [idProver=b'client'] | |||
[idVerifier=b'server'] | [idVerifier=b'server'] | |||
w0 = 0x097a61cbb1cee72bb654be96d80f46e0e3531151003903b572fc193f23377 | w0 = 0x097a61cbb1cee72bb654be96d80f46e0e3531151003903b572fc193f23377 | |||
2c23c22228884a0d5447d0ab49a656ce1d2 | 2c23c22228884a0d5447d0ab49a656ce1d2 | |||
w1 = 0x18772816140e6c3c3938a693c600b2191118a34c7956e1f1cd5b0d519b56e | w1 = 0x18772816140e6c3c3938a693c600b2191118a34c7956e1f1cd5b0d519b56e | |||
a5858060966cfaf27679c9182129949e74f | a5858060966cfaf27679c9182129949e74f | |||
L = 0x04f27dd5384d6b9beb4c5022c94b1978d632779e1d3abe458611e734a529d0 | L = 0x04f27dd5384d6b9beb4c5022c94b1978d632779e1d3abe458611e734a529d0 | |||
04e25053398e5dc9eeaa4ffa59743ca7ddbc0e7ce69155295cb2b846da83ee6a4449 | 04e25053398e5dc9eeaa4ffa59743ca7ddbc0e7ce69155295cb2b846da83ee6a4449 | |||
skipping to change at line 1154 ¶ | skipping to change at line 965 ¶ | |||
K_confirmP = 0x2c8940419d94e53d5d240801e702c4658531aa7a9f14ec75f0d67 | K_confirmP = 0x2c8940419d94e53d5d240801e702c4658531aa7a9f14ec75f0d67 | |||
f12fa84196c | f12fa84196c | |||
K_confirmV = 0x8e74afe16c53a44590ad6bf43aa89324978b8f20014336675f618 | K_confirmV = 0x8e74afe16c53a44590ad6bf43aa89324978b8f20014336675f618 | |||
387f99f3fdc | 387f99f3fdc | |||
HMAC(K_confirmP, shareV) = 0x7ae825e242a5a1f86ad7db172c2c12fcb458b6a | HMAC(K_confirmP, shareV) = 0x7ae825e242a5a1f86ad7db172c2c12fcb458b6a | |||
2b1ddfc96b2b7cfd2eed5f7ab | 2b1ddfc96b2b7cfd2eed5f7ab | |||
HMAC(K_confirmV, shareP) = 0x1581062167d6a3d14493447cd170d408f6fdc58 | HMAC(K_confirmV, shareP) = 0x1581062167d6a3d14493447cd170d408f6fdc58 | |||
e31225438db86214167426a7a | e31225438db86214167426a7a | |||
K_shared = 0x99758e838ae1a856589689fb55b6befe4e2382e6ebbeca1a6232a68 | K_shared = 0x99758e838ae1a856589689fb55b6befe4e2382e6ebbeca1a6232a68 | |||
f9dc04c1a | f9dc04c1a | |||
]]></sourcecode> | ||||
<sourcecode type="test-vectors"><![CDATA[ | ||||
[Context=b'SPAKE2+-P384-SHA512-HKDF-SHA512-HMAC-SHA512 Test Vectors | [Context=b'SPAKE2+-P384-SHA512-HKDF-SHA512-HMAC-SHA512 Test Vectors | |||
'] | '] | |||
[idProver=b'client'] | [idProver=b'client'] | |||
[idVerifier=b'server'] | [idVerifier=b'server'] | |||
w0 = 0xb8d44a0982b88abe19b724d4bdafba8c90dc93130e0bf4f8062810992326d | w0 = 0xb8d44a0982b88abe19b724d4bdafba8c90dc93130e0bf4f8062810992326d | |||
a126fd01db53e40250ca33a3ff302044cb0 | a126fd01db53e40250ca33a3ff302044cb0 | |||
w1 = 0x2373e2071c3bb2a6d53ece57830d56f8080189816803c22375d6a4a514f9d | w1 = 0x2373e2071c3bb2a6d53ece57830d56f8080189816803c22375d6a4a514f9d | |||
161b64d0f05b97735b98b348f9b33cc2e30 | 161b64d0f05b97735b98b348f9b33cc2e30 | |||
L = 0x049ca7217ff6456bb2e2bcf71b31d9b1e5ed6e0c9700936ae617e990cee87e | L = 0x049ca7217ff6456bb2e2bcf71b31d9b1e5ed6e0c9700936ae617e990cee87e | |||
e1ce3a03629dd5532948c39b89f38b39f13c7f513c5b1ada00f6533a4a8b02b9cd04 | e1ce3a03629dd5532948c39b89f38b39f13c7f513c5b1ada00f6533a4a8b02b9cd04 | |||
skipping to change at line 1225 ¶ | skipping to change at line 1037 ¶ | |||
3fbc731 | 3fbc731 | |||
HMAC(K_confirmP, shareV) = 0x7f806ae56ea3e49a8b16ffee528086489418913 | HMAC(K_confirmP, shareV) = 0x7f806ae56ea3e49a8b16ffee528086489418913 | |||
641f529d50ff92aa456ad4648e522f9540b403bff6bd94ee1adc95c7d1b2666f7ba6 | 641f529d50ff92aa456ad4648e522f9540b403bff6bd94ee1adc95c7d1b2666f7ba6 | |||
f9c10748bc7bfb4181d27 | f9c10748bc7bfb4181d27 | |||
HMAC(K_confirmV, shareP) = 0x8daa262decb79cceda4421f4f8dacf22ec027c0 | HMAC(K_confirmV, shareP) = 0x8daa262decb79cceda4421f4f8dacf22ec027c0 | |||
8e036f071beea563c8e00813a29807963ff9d7d6bbff48dd5bdcdd9ca9fd7ffc272b | 8e036f071beea563c8e00813a29807963ff9d7d6bbff48dd5bdcdd9ca9fd7ffc272b | |||
162258d981913f7253dcb | 162258d981913f7253dcb | |||
K_shared = 0x31e0075a823b9269af5769d71ef3b2f5001cbfe044584fe8551124a | K_shared = 0x31e0075a823b9269af5769d71ef3b2f5001cbfe044584fe8551124a | |||
217dad078415630bf3eda16b5a38341d418a6d72b3960f818a0926f0de88784b59d6 | 217dad078415630bf3eda16b5a38341d418a6d72b3960f818a0926f0de88784b59d6 | |||
a694b | a694b | |||
]]></sourcecode> | ||||
<sourcecode type="test-vectors"><![CDATA[ | ||||
[Context=b'SPAKE2+-P521-SHA512-HKDF-SHA512-HMAC-SHA512 Test Vectors | [Context=b'SPAKE2+-P521-SHA512-HKDF-SHA512-HMAC-SHA512 Test Vectors | |||
'] | '] | |||
[idProver=b'client'] | [idProver=b'client'] | |||
[idVerifier=b'server'] | [idVerifier=b'server'] | |||
w0 = 0x009c79bcd7656716314fca5a6e2c5cda7ef86131399438e012a043051e863 | w0 = 0x009c79bcd7656716314fca5a6e2c5cda7ef86131399438e012a043051e863 | |||
f60b5aeb3c101731e1505e721580f48535a9b0456b231b9266ae6fff49ee90d25f72 | f60b5aeb3c101731e1505e721580f48535a9b0456b231b9266ae6fff49ee90d25f72 | |||
f5f | f5f | |||
w1 = 0x01632c15f51fcd916cd79e19075f8a69b72b0099922ad62ff8d540b469569 | w1 = 0x01632c15f51fcd916cd79e19075f8a69b72b0099922ad62ff8d540b469569 | |||
f0aa027047aed2b3f242ea0ac4288b4e4db6a4e5946d8ad32b42192c5aa66d9ef8e1 | f0aa027047aed2b3f242ea0ac4288b4e4db6a4e5946d8ad32b42192c5aa66d9ef8e1 | |||
b33 | b33 | |||
skipping to change at line 1312 ¶ | skipping to change at line 1125 ¶ | |||
d18f0c6 | d18f0c6 | |||
HMAC(K_confirmP, shareV) = 0xf0f5c903dfa42fe367659656a26058cd984b76a | HMAC(K_confirmP, shareV) = 0xf0f5c903dfa42fe367659656a26058cd984b76a | |||
8e91ae4d0fa4c13db149008e2ae57713fb230a627761174fefd263b9c10e9a4b6a37 | 8e91ae4d0fa4c13db149008e2ae57713fb230a627761174fefd263b9c10e9a4b6a37 | |||
46cde59c5943040c17133 | 46cde59c5943040c17133 | |||
HMAC(K_confirmV, shareP) = 0xa8f7ab43f3a800171d3a3fb26d742e1ed236c2d | HMAC(K_confirmV, shareP) = 0xa8f7ab43f3a800171d3a3fb26d742e1ed236c2d | |||
5804ecd328f220a7d245cd2e3bfb6c0526983bff9229c94f70fe64ba9bb5a4d0dc10 | 5804ecd328f220a7d245cd2e3bfb6c0526983bff9229c94f70fe64ba9bb5a4d0dc10 | |||
afcda64a4c96d4c3d81ad | afcda64a4c96d4c3d81ad | |||
K_shared = 0xd1c170e4e55efacb9db8abad286293ebd1dcf24f13973427b9632bb | K_shared = 0xd1c170e4e55efacb9db8abad286293ebd1dcf24f13973427b9632bb | |||
c323e42e447afca2aa7f74f2af3fb5f51684ec543db854b7002cde6799c330b032ba | c323e42e447afca2aa7f74f2af3fb5f51684ec543db854b7002cde6799c330b032ba | |||
8820a | 8820a | |||
]]></sourcecode> | ||||
<sourcecode type="test-vectors"><![CDATA[ | ||||
[Context=b'SPAKE2+-P256-SHA256-HKDF-SHA256-CMAC-AES-128 Test Vector | [Context=b'SPAKE2+-P256-SHA256-HKDF-SHA256-CMAC-AES-128 Test Vector | |||
s'] | s'] | |||
[idProver=b'client'] | [idProver=b'client'] | |||
[idVerifier=b'server'] | [idVerifier=b'server'] | |||
w0 = 0x9aad90c603cf16cec4ee40d81acd7a865130b28cc6d0664ae2e0f406aa47e | w0 = 0x9aad90c603cf16cec4ee40d81acd7a865130b28cc6d0664ae2e0f406aa47e | |||
d61 | d61 | |||
w1 = 0x872be859cec1e78d191882bd9c2f032af018a25016813788fe8954bfffc58 | w1 = 0x872be859cec1e78d191882bd9c2f032af018a25016813788fe8954bfffc58 | |||
c8e | c8e | |||
L = 0x04d79a53698c5dd79e14b426e73b4a7f1b42469815fe24e8f53ce01579e902 | L = 0x04d79a53698c5dd79e14b426e73b4a7f1b42469815fe24e8f53ce01579e902 | |||
eb198d59f05bc451c41826b88e3db5476a69e197fdf474c75b387f6d40361c3fda35 | eb198d59f05bc451c41826b88e3db5476a69e197fdf474c75b387f6d40361c3fda35 | |||
skipping to change at line 1362 ¶ | skipping to change at line 1176 ¶ | |||
55706f0b062aa880617bd219d09391ad8576d3a73e9233f5720000000000000009aa | 55706f0b062aa880617bd219d09391ad8576d3a73e9233f5720000000000000009aa | |||
d90c603cf16cec4ee40d81acd7a865130b28cc6d0664ae2e0f406aa47ed61 | d90c603cf16cec4ee40d81acd7a865130b28cc6d0664ae2e0f406aa47ed61 | |||
K_main = 0x6002da6b2740056f2836ac0316ae9e02e2b24c5c109883136e90ed868 | K_main = 0x6002da6b2740056f2836ac0316ae9e02e2b24c5c109883136e90ed868 | |||
b2fcf62 | b2fcf62 | |||
K_confirmP = 0x857d0db7f5e06385853bf4b8abd43b5a | K_confirmP = 0x857d0db7f5e06385853bf4b8abd43b5a | |||
K_confirmV = 0x268c75933332157118063550c6bfe846 | K_confirmV = 0x268c75933332157118063550c6bfe846 | |||
CMAC(K_confirmP, shareV) = 0xd340bc94a03feafd14491e316514ca5f | CMAC(K_confirmP, shareV) = 0xd340bc94a03feafd14491e316514ca5f | |||
CMAC(K_confirmV, shareP) = 0x2b42d0fe76bcf9ccc208d06d60082f96 | CMAC(K_confirmV, shareP) = 0x2b42d0fe76bcf9ccc208d06d60082f96 | |||
K_shared = 0xe832094adfc028bf288e49ab902fc208b7eeff084f259da7613c047 | K_shared = 0xe832094adfc028bf288e49ab902fc208b7eeff084f259da7613c047 | |||
9869d4fc9 | 9869d4fc9 | |||
]]></sourcecode> | ||||
<sourcecode type="test-vectors"><![CDATA[ | ||||
[Context=b'SPAKE2+-P256-SHA512-HKDF-SHA512-CMAC-AES-128 Test Vector | [Context=b'SPAKE2+-P256-SHA512-HKDF-SHA512-CMAC-AES-128 Test Vector | |||
s'] | s'] | |||
[idProver=b'client'] | [idProver=b'client'] | |||
[idVerifier=b'server'] | [idVerifier=b'server'] | |||
w0 = 0x56e0299ac95739b616a973276c1338e3651285345dde2f7faf74c25c0b50e | w0 = 0x56e0299ac95739b616a973276c1338e3651285345dde2f7faf74c25c0b50e | |||
b90 | b90 | |||
w1 = 0x462fe5b522a17d3d35b27323113bdd252de9cbfdd6f264b35721bf59a9a74 | w1 = 0x462fe5b522a17d3d35b27323113bdd252de9cbfdd6f264b35721bf59a9a74 | |||
f0b | f0b | |||
L = 0x040540332ffec8a2faa8d17ae6da5973c11e078b8c10c89fd6af996726b802 | L = 0x040540332ffec8a2faa8d17ae6da5973c11e078b8c10c89fd6af996726b802 | |||
3513eff2914c3ced64fbedd4e261438fb0ea6ef9fc1faef4ba1ead780636faac1bc1 | 3513eff2914c3ced64fbedd4e261438fb0ea6ef9fc1faef4ba1ead780636faac1bc1 | |||
skipping to change at line 1414 ¶ | skipping to change at line 1229 ¶ | |||
K_main = 0x111790ae23de3fc5bb43bdc1f63106461dbd8d86360adf056bf117164 | K_main = 0x111790ae23de3fc5bb43bdc1f63106461dbd8d86360adf056bf117164 | |||
8bfb231503853db2625275b7136b5a823dd5a94482514fce7f791c4daca2b21c7bde | 8bfb231503853db2625275b7136b5a823dd5a94482514fce7f791c4daca2b21c7bde | |||
756 | 756 | |||
K_confirmP = 0xb234d2e152a03168b76c6474d5322070 | K_confirmP = 0xb234d2e152a03168b76c6474d5322070 | |||
K_confirmV = 0x683d62024626fe0c5126ef4df58b88ee | K_confirmV = 0x683d62024626fe0c5126ef4df58b88ee | |||
CMAC(K_confirmP, shareV) = 0x0dc514d262e37470eb43e058e0d615f4 | CMAC(K_confirmP, shareV) = 0x0dc514d262e37470eb43e058e0d615f4 | |||
CMAC(K_confirmV, shareP) = 0xde076589efcd5d96c2ea6061d96772d9 | CMAC(K_confirmV, shareP) = 0xde076589efcd5d96c2ea6061d96772d9 | |||
K_shared = 0x488a34663d6be5e02590bb8e9ad9ad3e0f580dec41e8b99ed4ae4b7 | K_shared = 0x488a34663d6be5e02590bb8e9ad9ad3e0f580dec41e8b99ed4ae4b7 | |||
34da49287638cac4c9f17fe3c3ae18dda0d6d7f14c17e4640d5a2aaab959efa0cbea | 34da49287638cac4c9f17fe3c3ae18dda0d6d7f14c17e4640d5a2aaab959efa0cbea | |||
4e546 | 4e546 | |||
]]></artwork> | ]]></sourcecode> | |||
</section> | ||||
<section anchor="acknowledgements" numbered="false" toc="default"> | ||||
<name>Acknowledgements</name> | ||||
<t>Thanks to <contact fullname="Ben Kaduk"/> and <contact fullname="Watson | ||||
Ladd"/>, from whom this specification originally emanated.</t> | ||||
</section> | </section> | |||
</back> | </back> | |||
<!-- ##markdown-source: | ||||
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 | ||||
5PtOpgzopGQLxwTbnVnEzS7csAncHMCnBBekl3OAw/pRpoav63X1yy/4dl19 | ||||
nPtyRInzq9fH9DHo2C8HSSddM3QrXTn28b7rh56XO8a36AWeTl1JSkPE5+PU | ||||
pfw2UdhnMWl5lsrNxEPtF41NR56EjoZOUmRctAS3polmEMbfw2o5Msht4xtQ | ||||
klilYrKdlYpU1ZLWGpZuE4a091mFzlGi6a58b84+5O6eZMXMfCT3KDORrHzT | ||||
PpUmt4nWYvx7nbrdIeD7PT1hJSc1Fo1tM7LVy5f7jHhb3JWDawolFimS2F2O | ||||
yNa5zF8Nqb9tUcz1Yr2th9wmmah3Iy2fLkow4hnzsJcRTJnRkkxI+ZmXy8yc | ||||
9zJXxCfX1RtawyS+ML+B6xv4z8jHR6SCGLb8eSf0OZD7+vgvJ7leiYR2SWo1 | ||||
2+znw0oO4k31X07HltlfoNNvPnoO8Hldf/RVVuo/XeUwI6VCIPC/7CWJ3EVw | ||||
Pw5BFq6iMGBYkk2kIvFqOFuLcVzMrlLPjAU/TjnxvyREXY4ZnMla8KHVxJRB | ||||
hFtal7r2X39l06xhYu7byUoRVpH0zVbS1T2SZg+R9KuPv6vuEnQJv27J77sd | ||||
PfiN0vvuYdIrk36zM+nfYdJvhkn/Ok/6NnFWwtiRHP81DfhVjlhydPJ6sIBU | ||||
HpbITo4YzoZi0DTSIsoC6n/FUy8+evPR0XfVaXrwMXuVPnrNp5+l3uxM6sF2 | ||||
bj46+ku+56uhnZuPvtzefQmOPNsufJTykqGqoLoYFibADkHY51upJfK3yPMx | ||||
VlI+nqd1mmVMZG5QxepiSesmhJCzeDteKViVFx5z42WiWQoms6MYoqShypCW | ||||
Z3YStFSKRpEaLbl8/fGzvJKc35Wb2V5VRJr2XBRFa3FAQ1MWNtLCwzChQzHo | ||||
bFHKUs02gN9D4M2SlRRCyTRP15rHhMP+Uhqlw5dpnelgNhSw/nHywU+GNT04 | ||||
4PIa7hpv7nTo06/v8N/bS75K33y1/eDr9MHX2w+GpCTe5pd7X73afvVq+9Vf | ||||
06d/3X6QL5tc8bpOn7yus16WsQ3F8YcCAAfeu7wc4sdSo1CMbfBUyQOPq0eY | ||||
yhTl0kpZ8KEAy6UpFRbbdU0qk7ukioYhuEyqQyuCg8NLCz25tmFQ3oMrlSdE | ||||
YNa5nIsu2m+D7bYxGWhWlWExj7R6WIraX2WdLHoxR6uUUNJtaiM9LTPqSXAz | ||||
n5WKOlxRMkVpx1vqrplvMjoNT08cZEvAID+qdilLDJiDDZjM2SGKZ1IMd5C9 | ||||
VW9hb+zB7G1KudOieHk4eTr2rnwtffUOBI3Whsw0sZKLtva6MNTywVOQFO7g | ||||
dCXoMPPX5oZYFltAz9NDz6pvaCHx9WwdRs9YCNlsDdf4p0KhaSvLi1wJkHG4 | ||||
OiJ8vU7lhZR9vfvCtMo+jarHCu8soJSJokBXqQbx/PFZYT1bFjfWPW6VfmfV | ||||
dmfxYKCC6+qLH8jyTtgXP+QvTvDJkDDPIdT4/lUq0xtrhlOX8rLeHqlJ5k0r | ||||
c3lhjj1gYY5Kqna7bRbDpWMKEjx0Z4V/vT+qs+pxpOXKyfJY6d20RnTb4w/X | ||||
B/u4Q4PSoMo64XaZ8NBtZ+y2NGhRL0tkUtyQcGN3+DD+2TzVkJn1SLfYhN8P | ||||
xYYHHpvUauebnTEPFfU5ETfmn1KsVxZIUsQ7zDWtYxL1I1ROWdl/vTbztE/z | ||||
nBJ9pWQ4p9Bem9Rs6m2ObpKK435/XaqR6YMn0879/LukPHvbcXaiqJNcezpJ | ||||
YefI6HR3nZoysymSnf3rdX5YCXTAAjZDpc642LGz4krZZLj1bT1ZWqItyjSW | ||||
t5fmsq2MhHyvdGGbPSnXEZshmQ1TvJte8bPzsN6U9MdQFEq5EcpyjPVdR1R4 | ||||
9+Lzx5Q1GX3RVoYkwYnB7tnrrSWmPDAqvasGe99ZG0kjy70vlKcM5ePcmZcv | ||||
j9nkaWAKE3D4mCrIqFbwZACV6oPphEMB1h8cj0Bz8PoEih5XflB49VD7X/pB | ||||
tf9kdkOHbwtjrFAoea9NSlyHNy5cpUI+dl/FwchNbGbGZkXxvUlYsoP7456c | ||||
M3ZrgWKovNjyg9SxItttHJJLYUo+bqsbKaW4P668lDPUrJe6JqpsHNPWRasy | ||||
82AT5nFWUXLu81TYt5fpmtZU7ivrfkqQvVVnq8M6S09/gqefPn76IidM2a3R | ||||
DTLfJk9/HPbS/DiUiRVOhVbSLevZ38OwpsOF2vZgeNYpPj0rYSLkllZxSoUF | ||||
nPp8eUMloZBg3vgwLMpdrcO1X5bIe2PO14crWtidNpcUcIscaer3V29Su9P7 | ||||
2Xj3doNfjuTTUElltt5gmxAo5U0h0JLZar5NmYxtf0xDPJp69KF2YGK2O5e8 | ||||
OhkqHrIBfkPrGbfKSMruFSpGOdklYMMS3VTT08bazXbPL9tNR21todrJI99q | ||||
t1gWxZe4Lm3je/z08ScsGz6mYUHbU/dNLa2NXoOFwjlQiLzvgLclUGnjwXQ9 | ||||
Ej5qZ3my7GYZ1ryG2r1xm/MO4x8XZco2psfTb9ls4ZMw1sNOhpNqt5A51Q2P | ||||
S5GZil2Z2aqU6masmiDAutgjew6zO80lwaef48pTsv3yQVm0m3Zz2pFbCUfy | ||||
82lFK8WwOXefDOaa1odL3TGdNXKeKRE9r6wStqrTZeGJOjBuF6mbkhD77CSh | ||||
xUkuPD4wnFXaJDlsY3gxy1tWQ6mBHhep2BAX7a0aHcrdp/VIWpaf2fzVuNfH | ||||
xIhnsbQilHZV2BmRnZPJUsiYxyp5370U7xRzUxS2WKYRTZaT12P+Yqh/27Gq | ||||
VCWQw7Tt2HHJ/PpyQUm/l6kWmw87dWfni1x8UUK36aymCDdluofYOfemJMJL | ||||
evWX6rP9wpxUVE4vaMTpBY0hVc388mi/8qZ88OjAC7Sd1eWXQU2mRen0IFLN | ||||
na+KxvxSTRR2R22qvVb3S90nrW6/utXq9qudVqVq/h36Orb6D+1rK/g/vNXg | ||||
X9ORJqJtuf6HC6I03jTq30Ea76llU6JQvmsaLX+rmt3XbKJ6eeWQwKdwku0e | ||||
HOBO2oxIZp73hg31DpRbSzUquXB83DuVK2km4HAyOWxhizzbRMp+IRDFFHDX | ||||
aT217D6hxa3JDq7SS1P2u062c6VV3OJuxy8IjUqdSC0FPWEskWU5Vi+1OmZM | ||||
1LiBdlJt/xQh0w5Z2vE57P3dLZb5+efDe7WBbEQkyBGWFPxX1cesFkp1QUTd | ||||
GxeaLrStNdr7XjSi7XUUWkvbNYF3IUrvjNWtib7RvZTSq2i4iIym4FHFz8SZ | ||||
auozXtdNeybP+Fl/eLaqo6+OEcLQs9GEtb5zndSuE1r2tm681n2Uysm+r3ue | ||||
Pvd9zRs81IjGNlEra/BcLWyjH/7sYWkiiQI4NBWFrGOsFUYY2mBjx1Vfq9oo | ||||
4RWeJYLouzZIK6LqG+36UOMqI7uukY2VnfSQD5Nd5K3kTS913TdeBKs6LqML | ||||
wQnVyrG/6KMUZ/WZbN4qJOF64aIIaBEtGO64a4xXvDOdiJ63SjSx7epeaa5i | ||||
I6MWwhnBW7zTrm2ktUy0Aq90LXjjojZGxhoytI3tutbx+gG92hEfAHdHk+oa | ||||
DXeYPC65FdaIrq57zQN6qFRQXtTGKqVN7DGOhqu6c623XHnZe4UhKOaiCXVn | ||||
lQiNwah93zQOSsC1bDthulYGwyPnOoRIH0HGwTtt8arXuhO+N+b2YNq3i7iu | ||||
Xa+hXTq4mkP9at3ggUo3Unamla6teddbo1yrO6n6Tqm6bYR1XadDoxsrWibx | ||||
dIzHttJHKxsdfew0b6lNaCXuVAY6pIKvGxdi3QojrcN1Xrdt3zqPJt6959Np | ||||
mLqoyXTgOQQ1rgumtp2HhLx36EBnvVGtkdJ447SoI7eRq8Bt7TrPOwzXBefN | ||||
YNY7DvAtcvTSRkt61zRRNrAmmG6NZ5jY1lJ1reHBS6G4d522svVedbBl1UZA | ||||
EHTaPuCRBwQANzoZvu0E3KFUpu9bjAeKaJrQeA8zipgoEzT30sXaoX82KLwQ | ||||
0UBMMAlYCBdMNyK2Rouu6XiNiRRAnKbDwAKZetsAk1yvGuV1dBJqrerd7pNX | ||||
f4u8ulo2rmvxyNBA102jbY2Iz8kgnXbONa1SQFvlohRNEDoCjBpT9wII4xpv | ||||
GVA7oreR6zb4njemU1q0HCAWFewoCM+jwB0xQq2bDub4zn0cBPy76tnjrx9T | ||||
jnJ7fsEa3V/mz8uZPrOxwjElOqvx9Lrd+xA5juv/2z1cv/XgiEwgAmj+JR40 | ||||
LxUCVD2Y3WZZND5UFVJSLGzYGr0thN4JO1M5YenF82+/pnXZp0Nx8m4CwuTE | ||||
w5C6SaniEm3vVwQ8qqKZzdNevSXLp+DMaevPOq3Gzv5e1uLy/pWwu/KcVwDm | ||||
dCYNKMK47+7xYkzqsNSFVHCwm6SbxVT4Nna7pFQS/RiCOVO6OVS+vq06ofpq | ||||
d5k+73ScNvyqzAKbLN2nQOwm7VPfWWMbVsCfpTMS6BgS3D7s/s9f0QNYWvHf | ||||
689Z0ric1KAa7jsn/bZkWFo4We6JZ+j+ttr7FR2D8HH17Kz6dJw/2u2+XqYK | ||||
12FShh6xg5UIsJHHbjyPJtdMQ43N4sdUcP1HaP0Xxl//mHr+Z7NZo2tfGu9P | ||||
spoNpdW3KqXBbM9n5WCTS7MwefGTzqyzeDA9dtxM+SmV8f78Oyq9upXCGU+q | ||||
S5UPdGEJ5/dzIScl8CejmayfrFP64ZIOhNxQrW6ploGKUyHPvTY55vMpx0K5 | ||||
yZPq6xP2HFOZ0yEXJTeflz+GgpBbS8vjzlFK0SSAyK8/pEXMC/PTbLkazmvK | ||||
B6e8Xk6zLPniZ1SQkdao09tPZ4sZpWaS9PNJPuMJINOKCHRu0gCVD6RjNP/w | ||||
h+FQ0mHcYx6Tvt6t6MIHe0Vd+GQV0r68ozcn1V/gQ7bPyT3Dk07SHhp8/11+ | ||||
5owSLpsfZosfBn08Kt9Qc4b25H4wWySQyUX/H7C9rpZ8YQ5P6LsDBUD49FAN | ||||
0LTL351Ufz2pXh2Pe4a2G+Nocl6Na46Hp8dUpWZvmKOT8ZbdWZmt75mU3VuS | ||||
uL4kUd4lqr88TFQjwuzM683+vO7Vbb2bvHcKpUZ5U63UVMq7In65XTV8srXN | ||||
kv2fLPePi/25Qm4z7MeMk9Prxiz9FDG3y5InQ/9fTj4aNxLcPSO37hqqiLYV | ||||
CSc7Zck5DT9k7LNS4UnFxN5Si1S9tRypeqeKpOpAUVJ1oC6purc0qbq3Oqk6 | ||||
UKBUHahRqu4qU9pfbp6qwG/QADYkadel4XHq8bQX42fvPveT22gpNc3j7QXW | ||||
9OFvW2NNTbzjMuvWpqbLRNP1oKGpUdijY/32ekH7iOkkxoPFysMBf7fcYCJE | ||||
8+Xyx0kpPe3JphW/l6VSNe8Kyewkr6pdgMhcmLLLnKop8iGkvnAYvGNmrC8Z | ||||
6ipAUkuwlLXgbWaXPUuenOx+qKR/x8cl+yu9BHIOSFf6epQ+yAA13nrIbY1m | ||||
/GBo+MtJ9d0EENLz3jZ7x9sH7ekh3R7eXKVD9H64Z10wj3Rywc6Ai1NJi8g/ | ||||
DKTmB9pOcHSr8ZPt9uA73M6hApfshe5Z2/xud2bG3cBsR8mLMrNBnO+iEF/m | ||||
fv7l1iwPzh5f3OVyd/r0zzXrb53sfVm+yrLcn9C7J2Nywftqy/NRW54/XFv2 | ||||
Z71E+o/HzPhYK/I8ZQc+22YHfv7dmCa/N2jYOzuKTjgcFvyHYDtXIZUKhN0t | ||||
vpvh6Nf9nbBlqXZsnY01Cge35ebdrrSYu6aFzWuoYD65KRULjFuNWenF7Q3G | ||||
u4HuyeQA2mmNOBuPlhga2u5xrV6kfQ+38xa5Fmesh2HDISDLcv7gZMtoSd3n | ||||
Iph0SNyOnJJjPaFD1/LBt9duM56MxrYLH/nOb559MqxNpBWaRtXoy1EuSHj8 | ||||
4smzZyzfeVyVsiJaNT1hu0cep3rhfGrNoKcnaUDj2vgH0zwmuzMT9kFWs9OW | ||||
i7OqbJ4tR7qt0ykkaR2Hkhzl1yBoIux8SeHkZKN/6lRe0Sph4ngCgNmwUraT | ||||
SvSmGliG8WZTSTGcH1dOsKMi59QddpUOeSk5LjrMrphGmo3taaSJsJ9spVPE | ||||
f7n0uUDRXFGOZzVL58mmg0YmRwlOanwm9UYmJzoWuQB/2H3Axh0C6+18Zy4x | ||||
OVCPOACdwrW4GaRl8hrWkKcDhd5QuR/VMQ6lM/m4nnR9OZoWdKUcK1T2KNBG | ||||
4NXkBLYUrU9HMitH7eSDj0qV8vBQtrNQh7uflSUtk8/H+nMAptP5AOt1WUdL | ||||
ar0pZ6zuPX0o4JscfjiuGpYs3t6CHTsa0EpAO8tO2bxEd5y3Xg1n+sKiCgLQ | ||||
EXTjHpAkHxrtUDtIR5XjilRzna+HoPIW57JYt0pn4WdxlC1YKac0bZOlNhOY | ||||
pn1I9ZtakPnhX1kduXkwe0cqrWdvcklkruvcbLbnDtF2mAv68pgONDQ/jd+U | ||||
rqY1y4TIw4mO0+m7V6NS9U1Wp7y7le6eLmsOi59mcpYA1N7Bv+YzNskHnO1l | ||||
7VMrbZ9PaMwnD1yMM2vWm1PqeUpxobW+7HcdEpPDfBTBUb18Vt24tzSS2pNi | ||||
+hQYN2U7BxOFOlLHUqH1XQOjhx4NNxyP7WSVn2ycZuPxJXsnim61f0hmnlFV | ||||
TEL88f58cUqNkiyzO9+5acQZNihYVr6jq+OsY5NO3rbO4VDGalLCn7xxjkzm | ||||
k4lOIdy26DNVry/C67t0hk1O3h82r0y1ZthjVDQil1nnm5PFsj1QLBtPBuQs | ||||
pn4yoEs53jnVWWeEGUsBymbqnYJt8KtZ3rdTZJrd0lCqlCXJkiRPpnjPcgH6 | ||||
cNcEgCOd73V2q4ThZnNBPm4xu7oKo9sbmJEFiS1EAZhDh9CWn43YOwh2/K2W | ||||
cpjo2DxNe9KVaHLF19OJnifGdrbeeDqr++g4FVI+HW1t/1sgwOMrqqAFnjzO | ||||
cDjq/KNtqJ534oB90lweke8+qRaJd1IqnN7jZXL/1GI6NuZoUXgpXUG3zWf2 | ||||
DPQLHvro4vgsF80m2lvY6EVOaNrZ+eQhyUfhn7+nxigjcHp0uv47JcykoJvp | ||||
2kD7y78/1MfZ8X6vhgbpn+r3GMTftj2wH3549r8hoKPc6PH3j9Z//1vuFbBn | ||||
ufghT9pmdRTST5ehmdQtqFX+oPr44+rDKeh8mEVQ2qd0XpgfvBpTs3ft949O | ||||
+d+q32dacvT9+nt6+5/hEVT9t+PU0Drs3FEuPFp/X9OFnI57En+jAwnW3/NH | ||||
ZRxQxTyKIqBhIMGlkewJCzE5r+t6mEhoPwS9O0Gzk5R7Cu4sk5Sj4+N8uNUg | ||||
K9xxh/CovXwt/ZhZiWGucD0a8yE1NtwznJcF2V1V/yldQUj/A1li1nF8/lF1 | ||||
dTanMuv974e2R1ENzaL7+XfNciH80/QPbG3sDKxzCI5eUo33q0BrV7SOSYVB | ||||
P+V3+4HQeOjLcLAJXVuVi5OIS1bojB092a3aTCdi5j1rW1KZ79k962o80mf4 | ||||
CZCz47y7tZQlrcJIGrcBwM6B1AMhSQcaD79jAr7R5M1kLG+kO9nf2pTJ0t1n | ||||
AIyreKVuiu30dgywxkra4TTNkhdk35dw/2P7YZHS6a3S3eH1pLZuOjvsw7+x | ||||
74f+oZ38szn5w6Gf+Dj/HA4+TgdE1G+spSoI66J0jYqdcLXyVjSya4UJbesl | ||||
/lJd3croTN/zWmjdRCGN122jGbcyHy1Rv+mDbtooG9+rXrVWGRli0/jax9Zw | ||||
o3vfWWmbrm5qbWTTojUla6l60zeWMyAz+zK1UzfB9k57K702OlgelfHGKm7b | ||||
XjeORy5NkEGINkQbNA+mUX0jWtU2ro/M1XWsaxuDd9bXGkOpa94I39SGo+N1 | ||||
14QouY/G6FpazT2PJpi+1tIr2equC9GzN6knngspnAqqw5e1kJ3Sfed43wRR | ||||
K6VabhXEhBH21NEQ0IjrTN0aEY1vmdSsHAxYhhUleoS7Yq+MELIJDsLhusd7 | ||||
oequjkGrtmtriYFay3sp6ecdWSMcb13tuA9c9L3oY8OVpa4aPCd6zITpQtPS | ||||
WDBBLeQsJSSmIVpNdUQySNZw3Mhu8kxxfIPnK8MVRtJy9Ft5qTnmyDXSt5Ca | ||||
aDzG0kfXxLpREoKIpmt55xXDlJfjCPO4XB0hBVN7zrXoLebbt13tOh24772W | ||||
GiKxdVBKaK4UntFr6JJnkHqreB1t6xyHOjS6waTroESMIrZ1BxWEAvYdJBFq | ||||
rVVnoD+YatdrZbTpVCMZ1c6ptKueumJtdKH3vo8QlOI0LKoJaxoTba+7pq/b | ||||
ttPoIhfRamGMpJIm3UDnWwZhc1O7NnIvIejYdopL20rZRx2a0PVBONNJySG+ | ||||
JlrftjAF6lPfyBaC4wozPgilVRZ9cJ11pubcaRcwDxCCVg1mpYcFYOJ1b7Xs | ||||
OqFNa7TsHYaNayFh3fLGKmE1FM8o03Sh68jqPCyj5lBt1UOBW1l7W3MnQmjq | ||||
VsjackVlhLyzncob1Os3UtU7f1rZ1g1ab1ophBUe6iZkKzu8gkY0fHiH17Zh | ||||
TXPoC48G5N7nddt0bS8xPdDAru3wqovQOVmzbrcHneygHLgk9E29910Pg8JN | ||||
Hf3d8MkXjP5qfmPRJottjBIMpZOhkQ4Y0oQaqtnh41oYmHrregtdw+Q4gFio | ||||
nWmbHjONm4PwApLLPdn+ad6rmJNNqjlrmERtTGdhzTDjulbQso7UDh1VrkNz | ||||
1kuqmlK1crCtBvdYHjoGEXoLKfJ6r08PgBo2xZr3hRo2xZoENbf79FaYYIdx | ||||
4mEwwQ7jRIKJ2326Ay/YOwHGW/CCvRNg3O7TDnKwB0LHQeRgD4QOsdelRBHY | ||||
+3IEogjjwmb9pnEtZtyhww4S7ThEyq3XjWwa6CqvFdW1OihJS5WIVHPYd9F2 | ||||
TjDTSCiznm63owZVz8EHYm971TQt1A+XRSsULKmB8xcSfp47qb2qjRMy2BbI | ||||
wGxoje+8bZVhO2uq9RsHG5OuB9Mw0JuugRBhppCXsoFDZpBhVFLRDxND/jUh | ||||
H2yxgV2DesBia/b5HRvtUvNadA6WQjBstW2ofFajIU8lshbykphpeGQW4Wuh | ||||
LsJ5Klp1QFPoZt/Ci39+xya93Hzf9NbBbSvYeOwkwp8QWmmctjWYWecJb1p4 | ||||
u6YPHSwI34uAZjUkj4mE45isFsOTQb8VJMIB9A2mtG0iKBDki3trDg9goE8K | ||||
Ggjzh66prus8gIPZ6DWPMvT3ctuWi9PJ9onT6eaOfwC3hZq1guAVWmFVwj4Q | ||||
QGgT3nUggJgGYZ2GFsPkgJZWR9DIDqrtlWMY9sBtG0FgoEMn4DVhN96J3otA | ||||
nAnmYTCXVP8LddZdjycAFsjSSKy+JiAQI7eVhniXb/rWC9iZbzofMSuRBysC | ||||
B8q3nYdFeBNjbAUUpYfyAc0DvC4LgJzeQdswlzB/Ad8LYOaxNrEBu23xYIwJ | ||||
w6udJd8HUxaYOWfxTFmDy7WcF24LxQcSKRl53zpuBIzOdobj/wI0WMioAJ02 | ||||
RAdYgZ8E1W5UAFrwiKcbJuQutwUwCeVgAn3sINu2N4gAgnUWI7NedB0wP/CW | ||||
QLRv2lQF76DcDBeKCAYBO2hrmF3nQEdaB2wKDgAO5AXSKN+bKCMMwsEnewsz | ||||
AfRIdLwTcNYU4TemcFtDyol5BmvlmG/ftCJAKIgKnIQ9N6Zto4EqRK0c7A2+ | ||||
zEi4X/gHjYtBk3e5bYPLhA6y94BvYEdEd8BOeq2hBBreywZpYgs/2Rkna9Fa | ||||
CTZSMyA78WbYhAMnsfB16Htw1knfO4VoAjZOuxkaU9fGEyoZLgHriHt0B9kB | ||||
Q3sGMGv9yG2N4gFQGYCLCtwlKPLulvAcOtLgISAwnZFaY8b6DrTPgNAYJeCN | ||||
HYO8W0AtGD5mFACp8BQPZQbCWqgZxBQc/CXubmjiuQbYuxggN9Fxh/4DT0du | ||||
60MNBxJ15yA/YwFQ3HF8hmEYzHenHeGZaw3xOS2dis57DyPzGA4MxYJ2gpUh | ||||
7PMC/QF4Ayu6oCESq72TgLkOlgFCVStIRmrbtfC4qoXNWdsY897ctpUwmUPc | ||||
dvvFLrfNn/8Ht/0n4rYPgBo2xZr3hRo2xZoENbf79FaYYIdx4mEwwQ7jRIKJ | ||||
A3I6jBfsnQDjLXjB3gkwbvdpBznYA6HjIHKwB0LHPrdNFIG9L0cgijDhtiBn | ||||
HWgSng6+YEhpOMyxEaYRvDPKawGZeBFB6AX3HmoOwtjUVjCF2ICDFxoHFUJ8 | ||||
E4FfsAZis4bsou5IFxooaeABVFY6PL9TMTa0O6dV3vGGCaX2yXGdLNH3lgbV | ||||
O2E0fF3XQ3/AEEE5EVFB02LwOgLQXIsozQRQfWE5ogfMawtSoyAZgbCqh7lQ | ||||
/k5BA4JBhGQpY0SbjXjLNWSnEVI2AVqkbWQ0gapX++yadrLVUvkga4yMA3Oh | ||||
5h3xKcJpPLLTEJMOwCnEKQBiWEPLtKFuWAzXoK+wR8WVAOHp+wgODytFxAkh | ||||
Qdcp9IDMZANHDypqyezy9jaGsAfRC7+fntPMdikGiQqmGjUa8zWFdbAQKKlF | ||||
d2HFzEqEyLAqxJ5QOIQ0ArPeIA4EOCGa6Q3QOoA711ASKHRQBgzMmNp0Plhl | ||||
ELNyyZrOwkwtoAsa1lrEYU109/N7xEW8x1UC0ZKWbQBxRxDeCjTU94HDVxjg | ||||
I2eYyL7Dq5zdRDwjvIQERdeDBJrWxVqBGALCEQfAbiHvIB05Yt00oad9kqpl | ||||
nYLELMC1RpTVAf5jU+vdAIFTrN61wCOwUwBsEw30WPQ1wpa2p1wsB9AgMkSY | ||||
KWBV0kExQG58rU1jdGz69CiEzp5LB9OCqA3ljAFxoSUfw+GJFXk9yU2D+DiC | ||||
gIIZAwUZuLhWhyMMqZr/C9lz8HFDeGcRFoYeEAMVtEEjdCMlCXUgBgHrqGsK | ||||
Qy08f0THJYJj+E8mEI86gT9K0Q433yIG9rWB3zSgEIj7vRgiEI7ZxbR2gIsA | ||||
Z4F4FnbXASFBMqzgmmMeQG8d2SBIOsy6tWiQkyYHBsVvKe2jO6i1iYAphGsa | ||||
JsTJXjTcbBwjFHzr4cTAhDrEp8EiYK8F/CNAV/cK9i4Q66Fr0hB7Vh3ig554 | ||||
Ne16RFQZBIIhCdMPrXc6ACeaGE0L2i+dQcvQpdC7QJtEcQusW1iFIAgWG0Jn | ||||
GrhSVnuvIEOLIKeOHeBNkO/y9HSP2aeke8cD5KWscKQQMW0uFaFVvfTwTjnE | ||||
EcQHbPAGLgWBLoZiapAYL+F1TNBoqYPCyY7oiHKwHQVzji06YRplQYXIOWEK | ||||
4f86ghbl8TkGpyKnHa39XgikI9gROmIwup6CkBaPMYg1fI2QAxQSIR2UWsND | ||||
tBZQ0XLAOSWs2p6DsQWEeT00pvadh7NBrAbBgMSB5GiKCMEWIEnYO/gtdKcl | ||||
mSGO9B1ixZY5U8N4A+RM+SARMPDONsDT1tMOSAliw6MOiL7qtuZSw+QgTgXP | ||||
S0kFSo4Bd2KJoax1BpwRg4HogodF99JyxIrAEfJiUDvVwSAl9UcrQKzGvMPx | ||||
ImyPnCGi7GOdmIMC58IT0Dj8FzGCNvGj3RgLzBYkIIKKAF9dQ//jkAmEAteG | ||||
6DpQCohSF6IP0K6G8xowrxgcIfwSFIUSKaDkmE84Lsp+NBJ9gItF2IqgD+yi | ||||
JgBTJAaNSBaMnkODMe2OURuQaU9ZDrh2eFogIzSSkp/wGXBN0BHglqaMqNAI | ||||
7CE69IpyeVIoUGER2DZIA9YruImWUBXT2yCuxlQ5biEAQflCCi96+EfwPdp4 | ||||
L2i1jFaw6igZ8Tj4iBqi8rABsBBgSgRPtD0YPJiPakL0lGftwMKNhR5pkE7M | ||||
OeISeGSwEsswQQgItKYd7hwIYVoIs1Od5w4iBoYocvhRRHCBHjqNJixpGdDK | ||||
wFv2Y5THXdqOKxU6ampYhXaR96BLgbQPrx1gz3WRdtl6H/GsIMAPewGPyUQL | ||||
NYm9p23VmFF4PdyKqAMeAv/J1rSRUpY97eaXqm1kE0DQQOQACtw2PCCWYQ5W | ||||
rWWAGtGcIbxDPARjhZAMNcYR5bV5QFB9bih+A3y1vidGoYJ4QJgI5w6e9k+3 | ||||
BNLdDhN/42ENDG70/sMaNJmOaxF19uDeoIpwwYBp2LPg5AlqUzMOuodGQZDB | ||||
yAADaAlgRDYMth5aLWsN9+5d14PuOYRfGr0ArIEIeV8GNYk1m/c+64ENhz28 | ||||
5awHUuMeegKYgsXWwAfwXt5L3iKcZD1JCq4BbgHuBYICM4owNqg3HCjFoYLH | ||||
2NJahQFjB12GkgVSSQouewlW1LFbwc57OARGHuG3OgRGHuG3OgRGHiF2twf1 | ||||
ELBmW7R+f7BmW7R+f7BmW7T2twf1jqjNDsL2A1GbHYTtB6I2uwXbtwf1Vvxm | ||||
9wD4O+M3uwfA3xm/2R0ALvfGdC/bZm+j2+/CtifBPMwS4YsCyLah9rEPGoJG | ||||
GwLeG0F4QNAJLHNAhgamzQn5676uHTyGo+A27sfiAnExxscRKjWhBRx6UCxV | ||||
gz7XwsFzAPq4MT1iIt4EByWH5feMVh4NfIzu3H4oDQ4KDAm8c3SwTNMChMHZ | ||||
AZAAGah7A4O2Kgqqf5HwAWgR/oJJmIHWsDW/H2nuRcK9oeg2QJMBITwC7H3v | ||||
LWWHBOL26CwtVXbw9ZZDfRwIO1QeoIOoGDS9N/ZtgazidScQVnqgCVAJ2IIZ | ||||
cZ4jdoRgYocetgqsCLYMBaPsHC5vOC3twibMbhyq4bdUUIiKoEm0tq10pwDB | ||||
CKs7iwgXgYlUInTB2uAMJ7UVpiMH4hFDOG7uDSP/nReqgMYNVFLDiSuFuApe | ||||
pxfgGNabSOfv6BqxlOTA3BrzGxHKISSqtcYYOs8MF5BVzT1C59DUCMAcHXQj | ||||
YYK1qBsK84cwUsgejgUe3ZHPNB2xcYcwW0nYQ4eGoY8KaN2pmmxF9q2neAjI | ||||
CDkxhJ+I4IF2NSCs7wnIFK0tRW2lRNAPtR/DSA2/B6iOgCgCOFAT62LPreRe | ||||
Ww724mGvDu6n1rIzAfgStK4pT9kHFmDgAC1JyWXfAic0MFpqeIQIPJOwEOko | ||||
hQy4t0BnU1NtAYbcGKCdsNr5ukEjGCGdtAQwDq6NwCYN3mJgSl1XS7j8xgJj | ||||
KWUZ+pRvMOQLwL/gK0NrSxjZIjRt4YF7yABSgpsCRxKgCUr7qGnhG4FN4nQe | ||||
XiAA+iAbXXddhOuPrKm1hSMHF5GeyJEB1eIWSEHFV72XvtkNI0UkNUXQ2QGF | ||||
nTaAT08IA3RqXeODAFJyaQ2sgLwHDBuOBTFvBxcKi+0D1VYY1WPK4LRq31Om | ||||
u8EgVVptNo6SUj2m3sAVIlCTgCSMRhnExayFGnYOpBI2gc5reCfFhY+QLLAu | ||||
Injv4L4BA8Sl0KtIJNYgUO9CsJyKIlpMXgkjnaKYvrW1wsRbKCl4l6LMKJDK | ||||
YNqAl1G18KUdHdYDmiwoXxEhKYrBmQa89RRvBocBwDOTg20doB3+jCsQh90w | ||||
0vcCkgkBIoHjaGEiTUpnImCH9HCPlDWcOA2xhYeAy/fwtYFpABncoeUtXvWw | ||||
Oy6ksQa6Sr10INU1JtkpYESDsaguKNxAZxeBM1jyyY1lQvNo8J+Dc0Z7PHHW | ||||
AMyVwnpQ8D4ClijJDq8mFOWqibCJVBECYwVMIYgXYxgpne3gioGx8CoOHCPV | ||||
aSAsb6MF+4K6R9yLO6FV0DVJFTMNGCKMSjMyFFpLFhLXUgpdwSMj9o7BEs+y | ||||
oDJ1AGdAOG8hgramVE2A0nNyYa01PiomQGmE8h2VViK2gM+wAjxRpQmBdwJc | ||||
wJ6hRryBSTXQEl0HD2MCebAw3TGMBInB3HAF4g420YFpGOg0+FlH+aMa3h4x | ||||
PVTSRACB650EKwZb1iAgNdNCAb8QBsFSQAqaDuqIgKcNCC+oz1SSAv4tAVDQ | ||||
IU3ZG5ipAtxrYXouG4iX1YguKIiDR+yplgKRAOYIptVKWvi0VOwIVZSc1qYg | ||||
DeptA2gCSxewnYdU0u2Gkf80q43/EUb+PxxGvodDYOQRfqtDYOQRfqtDYOQR | ||||
wu3g5EFgzbZo/f5gzbZo/f5gzbZoLW4P6h1Rmx2E7QeiNjsI2w9EbXYLtm8P | ||||
6q34ze4B8HfGb3YPgL8zfrM7AHw/jLyXbbO30e13YdvTNeGeG2CSNtQUYn9Y | ||||
HtgLUENCZKoh6ICFaQ3TsprqRY2CCYCZsw4TS+WcNRgmDM2RvcFEEL64VlP9 | ||||
KLVgm1oi4BMU6FrNe+AXgjA4i552ANQMdHQ/DoVEQJ6pdAnSt8BleAKE7LFH | ||||
iNfjwx7PUYjhvPU9rbpiSoRkFlACA0R8LmlVsw4dZgOEF9ADPet0S5MG/o64 | ||||
HcgPdYTT4h4CBAghOgR3i4GB+tKmg/1AVvgUCQigIsh+Zw0t+rcasVoXDG2x | ||||
QBwBg/QWM4mu6t6CWTLovFUUllMpBwI+kHkOK+WYOotB0Dhc68ipkk1AUH2P | ||||
0Ft1ntY3MSsCpoce4Vr5ljXhnlQArpJ6ExoNDeRdpLJKqLeC/9LAb80l6xoe | ||||
aR2shaVTsTAiHwOlhz63mCDdAgwwXUChjipeAwJV6Fnreo9IBTEJseSOXBGH | ||||
QwXB7W0EOhHQv6XmU8EmBZWQYu61c8EbGB0nzQW8RyECxA8HzFRASBXhiG2g | ||||
tBNQJpBAoT4a/kcDvCJhOcI1YDkttlmPmUAkR4eHRlpzFhZBIMJxBUFyDDnS | ||||
qZze2d1YXEJPaoRUCmCGUElT5UuHljnVpVPNdk0lItClplUAOAU+TubP4LC8 | ||||
8XDQDUfvYDAyrd4BbolXcZAlMgx0QuoOsQPeAWEwIB+Uwk0ASk8JKQ1CfjCY | ||||
bwX/vxDMI6J1vbZgBh2hWQeOFOEDKL0GffSmD5GYEqfaGYkZ4NB7AFjLg+ok | ||||
i12N8QYrKRMIzQxgS22Ao2spyQVe0xpta4qpheQkXQqeI+ZLB6AqOAGmhGrB | ||||
hoi/Rgeoqh/RcnRULIN+aUBeTVlUyArQZ9FjgJswnhZKEcSRnsKiEUtEEDLo | ||||
DnyxofyepLwmyIuBpwVM0dGyFrEaqFrTeQohiT1y4n3GdJ3XGClVjks5pgVq | ||||
KnzuBWVMoYo6AEkknBCt37a0rN0CkiGPAD/miLvWngqwdVQAJga2CwraUkrO | ||||
AuV6KiwIPdQeRgmVE1Ta1fXAKfAV66SAisGVwzM1UCx45dqGjvmeeiEM13TQ | ||||
rO3gADuE4baBLFsi2hSk1xAWJ5SE6SBEofVt+DeqbJc6dhE+zwQq86kdnB2m | ||||
11ugqIYix5pKOQQmorZ1S3/ZWnfkcQT5Rrhm2xgy9XaoxIU/AiEE9+QteXCH | ||||
CBixBTg/l7IJJAUAOeBdoxGq+Icfh9umQkCqFmOQDlBV09wHggGYB2VpqRIZ | ||||
FBg8CRZGK7Fk+0aDk1LNB/gtCC68uYBKSEoe7CYhatosB98UPIhsC6VoYaUd | ||||
OAncAdUg6lAD3DC/oo9UmgO4Aec3DE6Fd0TVbRR4fidAfSLIIDANpKWxvZGU | ||||
YQe7pipxZ8DLaN8FfAOeqOFSDS2Io9UAhoZQH285HDEsRvfoCG1EA4ExEjwX | ||||
GBQ6qtTCuFyHwMtSBKK0rwHyEaEFDQKeIUL9laEGFXdwCkaALcZIWSjAQY1m | ||||
EfhFPLGFU2ipYkxHC2pIS6Gmg7st2YyaKrOBW62AYwNNxKAdLYdohEQ9NFCB | ||||
1EfaxxAspXXaHnwTz0KgA3qiaVAN9EI5KmmxoARB0W5GeEPfUdbLG/xfd56W | ||||
EGg13ZB9QnOgDgEs3EDLG6a73ZRHzU3SS2IePQYKr9ZDdcAWqCYCjfEIjQNl | ||||
D7QtAz7GIoADxQFrp+qa3qsaYRqgyEGVg268rB3oYMrIIO6jFRD4V8S1vaFq | ||||
SPh1FQDNRrSaM4Hosw20DaKGNQOfgNMtbkAwg8nlADeEhp3W6B0kBhWwtAkG | ||||
XAgdDbAV+pLVlBQE9iHCqU1va3iggMgPNterHmyaw5cKbnRDXBbyBI0CAegE | ||||
VeEZeFKInyo1aI/JX0ehBFlzgAQ4G7ll09JR6zA/cMOGoMY7BWIXEIzVQVEg | ||||
2lq4OAvr9qyn7BTIYIi4lxYitKH0Xh/hl4zG/yyH/nV4vAE4R0OeS1FVHHg8 | ||||
MAT0EFwWHXUAEDqqHRoDX2uD9akMtwP30/CxMF1QcNnSflmtKEIFlGC4YLUS | ||||
kROoO7hsX0vtgf/AMoPYrumhswhaiJTC3uCmWytADUyL2YFV5dUSIAawG7gk | ||||
pNvuRsTYEFgJ2j5FK3WSKsRALn2HSI7KHKGMCMnAOgCZUBaKKTtEGwhn+8C6 | ||||
wB25Grh/aCHomaSVikh8C7ADCgxPTY64BXtHpKYQNTo4gZbWpDBEByqPUD+i | ||||
xboj3ZRtQDQOOwUVolQB+BjMD1YHhREOTJ73ECpxS6HAF0USCmzXsB6OAKAV | ||||
Um8gEaipp8hNYXzQ9wYe0zcEemB4PR1vjiluEXZbWgMDb6Na3wdkc/AKvumf | ||||
Lpuj2tvZnN/2EwSMUrS/9ScIGJymBeRQ5SsoBM2+0kAVC1TDzQHxOSJXXAhy | ||||
gEABXQG1iFAlC22ADVHpbWT04wPAfA2KzT0tRQAOwD+4B+oDuy058QZ6hnjZ | ||||
Y0C9r6n6k1bXQQGIekA6+1Xs7/UzB2zndw7e82cO2OR3DuA7gFshdC39OIDq | ||||
aTs1WAzoP1CM6pIRtcPj92RWCF89omYIs+9qBsH16Rx8eMgWIQUIkqCj8yHF | ||||
hpa/LcIt8F/akkdL5riFtrljwDIGiuAMHACQFs5ANjvKU6Tzzr6eTZ39+/p6 | ||||
NnX27+vr2dTZv6+vZ1Nnn3z9Aem8zcWywz72YS6WHfaxD3Ox7LCPfZiLZYd9 | ||||
bHKxh6Rz0Neyd3K2b/G17J2c7Vt8LXsnZ/sWX8veydkeks7E67IHut2DXpc9 | ||||
0O0e9LrsgW73oNdlD3S7zf7GCwqS2ftGydMgmb1vlExB8iRRFyEm00tEVm1H | ||||
HtMBv6UsJUqwAwWHheAW4AYVAdZw2hAcASXwFB1t2paRfmyFdstqYE6knZSA | ||||
jAi2rymHCmfRUxN1WvOmFRhpMa1EDJq6Z0Da/USdQZQGbQe2eGC5hTXRZiyj | ||||
WwABIREchzNQZgS4knoA3EG0TUW48Db4FijQIGiE7HEXgk4oq7PWExJFKmKG | ||||
s9G0x4ay/gT+Du6GVmF7zyB/6J3dT9TVcOdUfwZol1JzSnZKCE3BJiitQxl/ | ||||
xMcKvsR0rtaGVrg9o9BWOdgU+T/oc2MidNMh2q0B3gQ0KhpKLsZgqfysw1eW | ||||
qstqRamflgJpBjIQaSPVvYk64HTrwCuhxWRTsqOdCZhPIkToAtViwXwMUwFY | ||||
FaiSwQCBgSW80XWtAm1n7yk1S1sxgEZwv5x2W8B0gMWWMnNBm8Z2EABr0M/Q | ||||
arAG6GVTQ3qI2O9P1NHOUwMHEaUB/cQNnhLHhGRQgwCxUb5aeAYtboKjXw2K | ||||
hJk9WC5xiEC/NETJTgGKQHlELYR2uol9DUNvLHQeAqMzd8gugF+YhgYjBAMj | ||||
xFTc+N1EnefoNYwztEAH46yGThvMgVC03Q9ICt4VRRNhhT1CqB5cToKDMQdm | ||||
DLVCKNHjKXCzpqc0iKC9c7ZNe/uo5KKBZBXpfU2JhkD74ZwEbNVoBJOgMLQH | ||||
HX2083N6k0wdW79fpk4bk3bngVVAD11wDS3YkJzod4kUCBo6i5idqtc7SDLA | ||||
hdIinTEN4iJ4lSHJBvUH7kEXguMBTIzTCRbCerI0DJZSR8oQBaQjInqlIjn1 | ||||
xlLpXauYAz37cqxioHUNTC8tcVKiDtGGQEQgLXh55Jb2e2l4kRjgOIH80gEa | ||||
4VOAaoIFghrfaqrPoc3edMQECAlCAEm7pKjamlJ/ZO1NDzrWWioGg3LUhPQS | ||||
jle2JSulPdyxpK1C9BtSvQeV7Exs8QcsC64HntkbsJYoLO2jAEem5cHQRA93 | ||||
JpnhuwkljFkg7IAGwXrAwYEuYKrgfLT/h3gvZahsyux5Wi0KznjXKwZ1pNIe | ||||
C+vkEbwNIAKP1dEmIuFpBx03jSFK3nf0I1dUZkJ7/BTsSNChEeAADQM3g+vM | ||||
aRwoIJwkwrMOBk372RTCCCcE2RW4Nac9k5IorgdrtpoOlfC0OiRoQ75kw+8V | ||||
b88+ajXFRiAPjiidssp1oCHQH1r5pFWrHtbqEc4E4K1u6TSTrmOWNq86ouje | ||||
cAcECLSLsqeqStt66CEUqnUAwbYGC3KRhgrMVvDv0dABISA5DIML7Zj3ABmE | ||||
E+4N5r+GckFwqolUZCQoEw/U0l1AREOnmdSgzoL2NnZU2kX73sEABVW/gi1g | ||||
EkAJAXSSTvwIICbRSQSS0mCGG0cFO8FFSlJq2XCMK1k0JLY9+whTisjREHME | ||||
pzEcIVxN1bgYBh1hgVAQ4ErFBuD7tEU5BPhoOBQQQtZJGIpzpF4YLDQWtK/t | ||||
wf3xEMQYBsFZx3vrMYsgMzLtjwXnAZD2EpRHUgXrGOPrt8b4Dzz7SA4xPv6m | ||||
ujRPMT6kc1eUz+R+JP8eO8RLPPvbdogzLn77DvHb1QnvsUOc7fyW5XvuEGeh | ||||
u3OH+DuDDdtFm/cDG7aLNglsDp1+dC9QsLuQ4iFAwe5CigQUt/t0EDHYO0LG | ||||
vYjB3hEyDpx+tMUO9mDwOIAd7MHgsR+ogCSw92cJRBKmReVgQiBlFiSYFhQQ | ||||
N0uEo7Xk9NOMoaYqWQGBgb4hUiVPFFJ9RgdPKGg/hrh1+lHbg+5BS2CuHULE | ||||
lE9riMUBrEAGby21w6b6FvJCaJM2bkAiwAQ6yQSkpOnYk/v4NWL72lKtCBw/ | ||||
LXdQ0TZ5TMigoTKXvbv32C8tDoJyh57qPuiXHuGoITLYP0wo6m6XmwYlMfFN | ||||
Lh4gRQaNAYLAOiEJ3Gn7EKiIDbSz1YhXECw62D5DsKU9Ykn9oJOH/tHUEuBE | ||||
x2AZh4CcTiHABGva99wh3EA4C6DnVCXXgOUB0/towJ8dlBdxbR0YVW4MRw91 | ||||
CGRa2wpBpzHQeViWSmUl1Xx5BLIwLe1spGos0VGBCYJgG1ttNAJ3BsXfLr22 | ||||
4HlS0G/bKzqiEmElFYh1nnbnIpLmoSYMpDI3paMH3dN0nBH4I6glqKCEuAWC | ||||
Pgff4bsGIZqnHALlVlS0tDc+RB3p2CwAraWMr+9Juzo8ivbSDAueom3QcYHv | ||||
QkAkFekEA3TfAKlqSp8huALw0G+3SuA+kd4AY6b8QN/YmgWzt++26wj2bE2n | ||||
WwAo4XujokwHVcwhvIEIELdB3DoY2hzSeQfSzRmFqKqhba4QaAs/Cg0D5kqD | ||||
SVDKaTgtScde0E+JtjDqjoongqWDuvAZ/C+4MRO0V7hQy063loofKUtBp711 | ||||
HWwFaELZUipmhlQ5xdk1GA1V8HnADqw3WGAl9LYxu9Sy4xFhYLAIw8CuY8NT | ||||
9XPf0LFaHe30QPSlAYNR0Jl7BHFGax3pnDare47AGV1RrZMWgQei/14EILkC | ||||
x3dQjh52QFvp654SIinVJkHeG6rmix0Du8DoxiU1cJkevhSRXkvr+95JDBSP | ||||
o3p8eHmwHVpUbqlwAJroWutp/w/lyxSDf1eA+gCrREBoEs/BTDVUrAfYpiJw | ||||
yshQIsqGNihMT0epVgX5uqDpaIjt0UONoJM4UkmPpgp+CVJAu9ehLaA7VGNJ | ||||
1YE9oBJORFOVG3rubaqfY11sHS3Gwmf2cN90GgkicaHA8KhoERNPxbCUoEdc | ||||
3koAq+Zd7fpIka6ViIKlf29q+dblo/+glv8PUMt3Bhu2izbvBzZsF20S2Nzu | ||||
01uAgt2FFA8BCnYXUiSguN2ng4jB3hEy7kUM9o6QceCQpi12sAeDxwHsYA8G | ||||
j31qSUdzvD9LIJIwoZac8x7zg+ABsUmEQC0IoKe9upLX9HPenk64Ul1yHpHO | ||||
bqVzn3jXMJArSpPTr5W3aV0FrKJvbQ/6aVMRn/etQbCgBO0DcwERlaZf4ga7 | ||||
F7S8gbkJDMHKPjdFo7QvgEPqxHDB2GDNDWRHGFn39T437ZREaAQj6QQt9TkM | ||||
HojT+EhF4Qr6cy83raFEQAL0nuanh3waGepWhRocvI3N/dwU89nTnsEQAQSe | ||||
VAh8BsECXvaI/vYOvaEzryRto/YdKWANBppOSdXG4394LFkkYp6GB0WbfT2i | ||||
gsYCsiG0hhZ/QdWdcY3TEZgRpJMmcOXpdNzOg/EQlATaUA3BI2whxEXPTE2B | ||||
HmsQy3Xp2Pj/AySLEbKFzgAA | ||||
</rfc> | </rfc> | |||
End of changes. 143 change blocks. | ||||
1013 lines changed or deleted | 355 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |