rfc9588.original | rfc9588.txt | |||
---|---|---|---|---|
Internet Engineering Task Force N. McCallum | Internet Engineering Task Force (IETF) N. McCallum | |||
Internet-Draft S. Sorce | Request for Comments: 9588 S. Sorce | |||
Intended status: Standards Track R. Harwood | Category: Standards Track R. Harwood | |||
Expires: 11 August 2024 Red Hat, Inc. | ISSN: 2070-1721 Red Hat, Inc. | |||
G. Hudson | G. Hudson | |||
MIT | MIT | |||
8 February 2024 | August 2024 | |||
Kerberos SPAKE Pre-Authentication | Kerberos Simple Password-Authenticated Key Exchange (SPAKE) Pre- | |||
draft-ietf-kitten-krb-spake-preauth-13 | authentication | |||
Abstract | Abstract | |||
This document defines a new pre-authentication mechanism for the | This document defines a new pre-authentication mechanism for the | |||
Kerberos protocol. The mechanism uses a password-authenticated key | Kerberos protocol. The mechanism uses a password-authenticated key | |||
exchange to prevent brute-force password attacks, and may optionally | exchange (PAKE) to prevent brute-force password attacks, and it may | |||
incorporate a second factor. | incorporate a second factor. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 11 August 2024. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9588. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2024 IETF Trust and the persons identified as the | Copyright (c) 2024 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
1.1. Properties of PAKE . . . . . . . . . . . . . . . . . . . 3 | 1.1. Properties of PAKE | |||
1.2. PAKE Algorithm Selection . . . . . . . . . . . . . . . . 4 | 1.2. PAKE Algorithm Selection | |||
1.3. PAKE and Two-Factor Authentication . . . . . . . . . . . 4 | 1.3. PAKE and Two-Factor Authentication | |||
1.4. SPAKE Overview . . . . . . . . . . . . . . . . . . . . . 5 | 1.4. SPAKE Overview | |||
2. Document Conventions . . . . . . . . . . . . . . . . . . . . 5 | 2. Document Conventions | |||
3. Prerequisites . . . . . . . . . . . . . . . . . . . . . . . . 6 | 3. Prerequisites | |||
3.1. PA-ETYPE-INFO2 . . . . . . . . . . . . . . . . . . . . . 6 | 3.1. PA-ETYPE-INFO2 | |||
3.2. Cookie Support . . . . . . . . . . . . . . . . . . . . . 6 | 3.2. Cookie Support | |||
3.3. More Pre-Authentication Data Required . . . . . . . . . . 6 | 3.3. More Pre-authentication Data Required | |||
4. SPAKE Pre-Authentication Message Protocol . . . . . . . . . . 6 | 4. SPAKE Pre-authentication Message Protocol | |||
4.1. First Pass . . . . . . . . . . . . . . . . . . . . . . . 7 | 4.1. First Pass | |||
4.2. Second Pass . . . . . . . . . . . . . . . . . . . . . . . 8 | 4.2. Second Pass | |||
4.3. Third Pass . . . . . . . . . . . . . . . . . . . . . . . 9 | 4.3. Third Pass | |||
4.4. Subsequent Passes . . . . . . . . . . . . . . . . . . . . 10 | 4.4. Subsequent Passes | |||
4.5. Reply Key Strengthening . . . . . . . . . . . . . . . . . 11 | 4.5. Reply Key Strengthening | |||
4.6. Optimizations . . . . . . . . . . . . . . . . . . . . . . 11 | 4.6. Optimizations | |||
5. SPAKE Parameters and Conversions . . . . . . . . . . . . . . 12 | 5. SPAKE Parameters and Conversions | |||
6. Transcript Hash . . . . . . . . . . . . . . . . . . . . . . . 12 | 6. Transcript Hash | |||
7. Key Derivation . . . . . . . . . . . . . . . . . . . . . . . 13 | 7. Key Derivation | |||
8. Second Factor Types . . . . . . . . . . . . . . . . . . . . . 14 | 8. Second-Factor Types | |||
9. Hint for Authentication Sets . . . . . . . . . . . . . . . . 14 | 9. Hint for Authentication Sets | |||
10. Security Considerations . . . . . . . . . . . . . . . . . . . 15 | 10. Security Considerations | |||
10.1. SPAKE Computations . . . . . . . . . . . . . . . . . . . 15 | 10.1. SPAKE Computations | |||
10.2. Unauthenticated Plaintext . . . . . . . . . . . . . . . 15 | 10.2. Unauthenticated Plaintext | |||
10.3. Side Channels . . . . . . . . . . . . . . . . . . . . . 16 | 10.3. Side Channels | |||
10.4. KDC State . . . . . . . . . . . . . . . . . . . . . . . 17 | 10.4. KDC State | |||
10.5. Dictionary Attacks . . . . . . . . . . . . . . . . . . . 18 | 10.5. Dictionary Attacks | |||
10.6. Brute Force Attacks . . . . . . . . . . . . . . . . . . 18 | 10.6. Brute-Force Attacks | |||
10.7. Denial of Service Attacks . . . . . . . . . . . . . . . 18 | 10.7. Denial-of-Service Attacks | |||
10.8. Reflection Attacks . . . . . . . . . . . . . . . . . . . 19 | 10.8. Reflection Attacks | |||
10.9. Reply-Key Encryption Type . . . . . . . . . . . . . . . 19 | 10.9. Reply Key Encryption Type | |||
10.10. KDC Authentication . . . . . . . . . . . . . . . . . . . 19 | 10.10. KDC Authentication | |||
11. Assigned Constants . . . . . . . . . . . . . . . . . . . . . 19 | 11. Assigned Constants | |||
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 19 | 12. IANA Considerations | |||
12.1. Kerberos Second Factor Types . . . . . . . . . . . . . . 20 | 12.1. Kerberos Second-Factor Types | |||
12.1.1. Registration Template . . . . . . . . . . . . . . . 20 | 12.1.1. Registration Template | |||
12.1.2. Initial Registry Contents . . . . . . . . . . . . . 20 | 12.1.2. Initial Registry Contents | |||
12.2. Kerberos SPAKE Groups . . . . . . . . . . . . . . . . . 21 | 12.2. Kerberos SPAKE Groups | |||
12.2.1. Registration Template . . . . . . . . . . . . . . . 21 | 12.2.1. Registration Template | |||
12.2.2. Initial Registry Contents . . . . . . . . . . . . . 21 | 12.2.2. Initial Registry Contents | |||
13. Normative References . . . . . . . . . . . . . . . . . . . . 23 | 13. References | |||
14. Informative References . . . . . . . . . . . . . . . . . . . 24 | 13.1. Normative References | |||
Appendix A. ASN.1 Module . . . . . . . . . . . . . . . . . . . . 25 | 13.2. Informative References | |||
Appendix B. SPAKE M and N Value Selection . . . . . . . . . . . 26 | Appendix A. ASN.1 Module | |||
Appendix C. Test Vectors . . . . . . . . . . . . . . . . . . . . 27 | Appendix B. SPAKE M and N Value Selection | |||
Appendix D. Acknowledgements . . . . . . . . . . . . . . . . . . 36 | Appendix C. Test Vectors | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 36 | Acknowledgements | |||
Authors' Addresses | ||||
1. Introduction | 1. Introduction | |||
The Kerberos protocol [RFC4120] commonly uses password-derived long- | The Kerberos protocol [RFC4120] commonly uses password-derived long- | |||
term keys to secure the initial authentication exchange between a | term keys to secure the initial authentication exchange between a | |||
Kerberos client and a Key Distribution Center (KDC). As noted in | Kerberos client and a Key Distribution Center (KDC). As noted in | |||
Section 10 of [RFC4120], an attacker can perform an offline | Section 10 of [RFC4120], an attacker can perform an offline | |||
dictionary attack against the password, either by initiating an | dictionary attack against the password; this is performed either by | |||
authentication exchange to a principal for which the KDC does not | initiating an authentication exchange to a principal for which the | |||
require pre-authentication, or after eavesdropping on a legitimate | KDC does not require pre-authentication or after eavesdropping on a | |||
authentication exchange that uses encrypted timestamp pre- | legitimate authentication exchange that uses encrypted timestamp pre- | |||
authentication (Section 5.2.7.2 of [RFC4120]). | authentication (Section 5.2.7.2 of [RFC4120]). | |||
This document defines a pre-authentication mechanism that | This document defines a pre-authentication mechanism that | |||
authenticates using long-term keys but is resistant to offline | authenticates using long-term keys but is resistant to offline | |||
dictionary attacks. The mechanism additionally enables the use of | dictionary attacks. The mechanism additionally enables the use of | |||
second factor authentication without the need for a separately- | second-factor authentication without the need for a separately | |||
established secure channel, by leveraging the trust relationship | established secure channel, by leveraging the trust relationship | |||
established by the shared long-term key. | established by the shared long-term key. | |||
1.1. Properties of PAKE | 1.1. Properties of PAKE | |||
Password authenticated key exchange (PAKE) algorithms [RFC8125] | Password-authenticated key exchange (PAKE) algorithms [RFC8125] | |||
provide several properties which defend against offline dictionary | provide several properties that defend against offline dictionary | |||
attacks and make them ideal for use in a Kerberos pre-authentication | attacks and make them ideal for use in a Kerberos pre-authentication | |||
mechanism. | mechanism. | |||
1. Each side of the exchange contributes entropy. | 1. Each side of the exchange contributes entropy. | |||
2. Passive attackers cannot determine the shared key. | 2. Passive attackers cannot determine the shared key. | |||
3. Active attackers cannot perform a machine-in-the-middle attack. | 3. Active attackers cannot perform a machine-in-the-middle attack. | |||
These properties of PAKE allow us to establish high-entropy | These properties of PAKE allow us to establish high-entropy | |||
encryption keys resistant to offline brute force attack, even when | encryption keys resistant to offline brute-force attacks, even when | |||
the passwords used are weak (low-entropy). | the passwords used are weak (low entropy). | |||
1.2. PAKE Algorithm Selection | 1.2. PAKE Algorithm Selection | |||
The SPAKE algorithm (defined in [SPAKE]) works by encrypting the | The SPAKE algorithm (defined in [SPAKE]) works by encrypting the | |||
public keys of a Diffie-Hellman key exchange with a shared secret. | public keys of a Diffie-Hellman (DH) key exchange with a shared | |||
SPAKE is selected for this pre-authentication mechanism for the | secret. SPAKE is selected for this pre-authentication mechanism for | |||
following properties: | the following properties: | |||
1. Because SPAKE's encryption method ensures that the result is a | 1. SPAKE's encryption method ensures that the result is a member of | |||
member of the underlying group, it can be used with elliptic | the underlying group, so it can be used with elliptic curve | |||
curve cryptography, which is believed to provide equivalent | cryptography, which is believed to provide equivalent security | |||
security levels to finite-field DH key exchange at much smaller | levels to finite-field DH key exchange at much smaller key sizes. | |||
key sizes. | ||||
2. It can compute the shared key after just one message from each | 2. It can compute the shared key after just one message from each | |||
party, minimizing the need for additional round trips and state. | party, minimizing the need for additional round trips and state. | |||
3. It requires a small number of group operations, and can therefore | 3. It requires a small number of group operations; therefore, it can | |||
be implemented simply and efficiently. | be implemented simply and efficiently. | |||
1.3. PAKE and Two-Factor Authentication | 1.3. PAKE and Two-Factor Authentication | |||
Using PAKE in a pre-authentication mechanism also has another benefit | Using PAKE in a pre-authentication mechanism also has another benefit | |||
when used as a component of two-factor authentication (2FA). 2FA | when used as a component of two-factor authentication (2FA). 2FA | |||
methods often require the secure transfer of plaintext material to | methods often require the secure transfer of plaintext material to | |||
the KDC for verification. This includes one-time passwords, | the KDC for verification. This includes one-time passwords, | |||
challenge/response signatures and biometric data. Encrypting this | challenge/response signatures, and biometric data. Encrypting this | |||
data using the long-term secret results in packets that are | data using the long-term secret results in packets that are | |||
vulnerable to offline brute-force attack on the password, using | vulnerable to offline brute-force attacks on the password, using | |||
either an authentication tag or statistical properties of the 2FA | either an authentication tag or statistical properties of the 2FA | |||
credentials to determine whether a password guess is correct. | credentials to determine whether a password guess is correct. | |||
In the One-Time Password pre-authentication [RFC6560] specification, | In "One-Time Password (OTP) Pre-Authentication" [RFC6560], this | |||
this problem is mitigated by using flexible authentication secure | problem is mitigated using flexible authentication secure tunneling | |||
tunneling (FAST) (Section 5.4 of [RFC6113]), which uses a secondary | (FAST) (Section 5.4 of [RFC6113]), which uses a secondary trust | |||
trust relationship to create a secure encryption channel within which | relationship to create a secure encryption channel within which pre- | |||
pre-authentication data can be sent. However, the requirement for a | authentication data can be sent. However, the requirement for a | |||
secondary trust relationship has proven to be cumbersome to deploy | secondary trust relationship has proven to be cumbersome to deploy | |||
and often introduces third parties into the trust chain (such as | and often introduces third parties into the trust chain (such as | |||
certification authorities). These requirements make it difficult to | certification authorities). These requirements make it difficult to | |||
enable FAST without manual configuration of client hosts. SPAKE pre- | enable FAST without manual configuration of client hosts. In | |||
authentication, in contrast, can create a secure encryption channel | contrast, SPAKE pre-authentication, can create a secure encryption | |||
implicitly, using the key exchange to negotiate a high-entropy | channel implicitly, using the key exchange to negotiate a high- | |||
encryption key. This key can then be used to securely encrypt 2FA | entropy encryption key. This key can then be used to securely | |||
plaintext data without the need for a secondary trust relationship. | encrypt 2FA plaintext data without the need for a secondary trust | |||
Further, if the second factor verifiers are sent at the same time as | relationship. Further, if the second-factor verifiers are sent at | |||
the first factor verifier, and the KDC is careful to prevent timing | the same time as the first-factor verifier, and the KDC is careful to | |||
attacks, then an online brute-force attack cannot be used to attack | prevent timing attacks, then an online brute-force attack cannot be | |||
the factors separately. | used to attack the factors separately. | |||
For these reasons, this document departs from the advice given in | For these reasons, this document departs from the advice given in | |||
Section 1 of RFC 6113 [RFC6113] which states that "Mechanism | Section 1 of [RFC6113], which states: "Mechanism designers should | |||
designers should design FAST factors, instead of new pre- | design FAST factors, instead of new pre-authentication mechanisms | |||
authentication mechanisms outside of FAST." However, the SPAKE pre- | outside of FAST." However, the SPAKE pre-authentication mechanism | |||
authentication mechanism does not intend to replace FAST, and may be | does not intend to replace FAST and may be used with it to further | |||
used with it to further conceal the metadata of the Kerberos | conceal the metadata of the Kerberos messages. | |||
messages. | ||||
1.4. SPAKE Overview | 1.4. SPAKE Overview | |||
The SPAKE algorithm can be broadly described in a series of four | The SPAKE algorithm can be broadly described in a series of four | |||
steps: | steps: | |||
1. Calculation and exchange of the public key | 1. Calculation and exchange of the public key | |||
2. Calculation of the shared secret (K) | 2. Calculation of the shared secret (K) | |||
3. Derivation of an encryption key (K') | 3. Derivation of an encryption key (K') | |||
4. Verification of the derived encryption key (K') | 4. Verification of the derived encryption key (K') | |||
In this mechanism, key verification happens implicitly by a | In this mechanism, key verification happens implicitly by a | |||
successful decryption of the 2FA data, or of a placeholder value when | successful decryption of the 2FA data or of a placeholder value when | |||
no second factor is required. This mechanism uses a tailored method | no second factor is required. This mechanism uses a tailored method | |||
of deriving encryption keys from the calculated shared secret K, for | of deriving encryption keys from the calculated shared secret K, for | |||
several reasons: to fit within the framework of [RFC3961], to ensure | several reasons: | |||
negotiation integrity using a transcript hash, to derive different | ||||
keys for each use, and to bind the KDC-REQ-BODY to the pre- | * to fit within the framework of [RFC3961], | |||
authentication exchange. | ||||
* to ensure negotiation integrity using a transcript hash, | ||||
* to derive different keys for each use, and | ||||
* to bind the KDC-REQ-BODY to the pre-authentication exchange. | ||||
2. Document Conventions | 2. Document Conventions | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
This document refers to numerous terms and protocol messages defined | This document refers to numerous terms and protocol messages defined | |||
in [RFC4120]. | in [RFC4120]. | |||
The terms "encryption type", "key generation seed length", and | The terms "encryption type", "key generation seed length", and | |||
"random-to-key" are defined in [RFC3961]. | "random-to-key" are defined in [RFC3961]. | |||
The terms "FAST", "PA-FX-COOKIE", "KDC_ERR_PREAUTH_EXPIRED", | The terms "FAST", "PA-FX-COOKIE", "KDC_ERR_PREAUTH_EXPIRED", | |||
"KDC_ERR_MORE_PREAUTH_DATA_REQUIRED", "KDC_ERR_PREAUTH_FAILED", "pre- | "KDC_ERR_MORE_PREAUTH_DATA_REQUIRED", "KDC_ERR_PREAUTH_FAILED", "pre- | |||
authentication facility", and "authentication set" are defined in | authentication facility", and "authentication set" are defined in | |||
[RFC6113]. | [RFC6113]. | |||
The [SPAKE] paper defines SPAKE as a family of two key exchange | [SPAKE] defines SPAKE as a family of two key-exchange algorithms | |||
algorithms differing only in derivation of the final key. This | differing only in derivation of the final key. This mechanism uses a | |||
mechanism uses a derivation similar to the second algorithm (SPAKE2). | derivation similar to the second algorithm (SPAKE2). For simplicity, | |||
For simplicity, this document refers to the algorithm as "SPAKE". | this document refers to the algorithm as "SPAKE". | |||
The terms "ASN.1" and "DER" are defined in [CCITT.X680.2002] and | The terms "Abstract Syntax Notation One (ASN.1)" and "Distinguished | |||
[CCITT.X690.2002] respectively. | Encoding Rules (DER)" are defined in [ITU-T.X680.2021] and | |||
[ITU-T.X690.2021], respectively. | ||||
When discussing operations within algebraic groups, this document | When discussing operations within algebraic groups, this document | |||
uses additive notation (as described in Section 2.2 of [RFC6090]). | uses additive notation (as described in Section 2.2 of [RFC6090]). | |||
Group elements are denoted with uppercase letters, while scalar | Group elements are denoted with uppercase letters, while scalar | |||
multiplier values are denoted with lowercase letters. | multiplier values are denoted with lowercase letters. | |||
3. Prerequisites | 3. Prerequisites | |||
3.1. PA-ETYPE-INFO2 | 3.1. PA-ETYPE-INFO2 | |||
This mechanism requires the initial KDC pre-authentication state to | This mechanism requires the initial KDC pre-authentication state to | |||
contain a singular reply key. Therefore, a KDC which offers SPAKE | contain a singular reply key. Therefore, a KDC that offers SPAKE | |||
pre-authentication as a stand-alone mechanism MUST supply a PA-ETYPE- | pre-authentication as a stand-alone mechanism MUST supply a PA-ETYPE- | |||
INFO2 value containing a single ETYPE-INFO2-ENTRY, following the | INFO2 value containing a single ETYPE-INFO2-ENTRY, following the | |||
guidance in Section 2.1 of [RFC6113]. PA-ETYPE-INFO2 is specified in | guidance in Section 2.1 of [RFC6113]. PA-ETYPE-INFO2 is specified in | |||
Section 5.2.7.5 of [RFC4120]. | Section 5.2.7.5 of [RFC4120]. | |||
3.2. Cookie Support | 3.2. Cookie Support | |||
KDCs which implement SPAKE pre-authentication MUST have some secure | KDCs that implement SPAKE pre-authentication MUST have some secure | |||
mechanism for retaining state between AS-REQs. For stateless KDC | mechanism for retaining state between authentication service requests | |||
implementations, this method will most commonly be an encrypted PA- | (AS-REQs). For stateless KDC implementations, this method will most | |||
FX-COOKIE. Clients which implement SPAKE pre-authentication MUST | commonly be an encrypted PA-FX-COOKIE. Clients that implement SPAKE | |||
support PA-FX-COOKIE, as described in Section 5.2 of [RFC6113]. | pre-authentication MUST support PA-FX-COOKIE, as described in | |||
Section 5.2 of [RFC6113]. | ||||
3.3. More Pre-Authentication Data Required | 3.3. More Pre-authentication Data Required | |||
Both KDCs and clients which implement SPAKE pre-authentication MUST | Both KDCs and clients that implement SPAKE pre-authentication MUST | |||
support the use of KDC_ERR_MORE_PREAUTH_DATA_REQUIRED, as described | support the use of KDC_ERR_MORE_PREAUTH_DATA_REQUIRED, as described | |||
in Section 5.2 of [RFC6113]. | in Section 5.2 of [RFC6113]. | |||
4. SPAKE Pre-Authentication Message Protocol | 4. SPAKE Pre-authentication Message Protocol | |||
This mechanism uses the reply key and provides the Client | This mechanism uses the reply key and provides the client | |||
Authentication and Strengthening Reply Key pre-authentication | authentication and strengthening reply key pre-authentication | |||
facilities (Section 3 of [RFC6113]). When the mechanism completes | facilities (Section 3 of [RFC6113]). When the mechanism completes | |||
successfully, the client will have proved knowledge of the original | successfully, the client will have proved knowledge of the original | |||
reply key and possibly a second factor, and the reply key will be | reply key and possibly a second factor, and the reply key will be | |||
strengthened to a more uniform distribution based on the PAKE | strengthened to a more uniform distribution based on the PAKE | |||
exchange. This mechanism also ensures the integrity of the KDC-REQ- | exchange. This mechanism also ensures the integrity of the KDC-REQ- | |||
BODY contents. This mechanism can be used in an authentication set; | BODY contents. This mechanism can be used in an authentication set; | |||
no pa-hint value is required or defined. | no pa-hint value is required or defined. | |||
This mechanism negotiates a choice of group for the SPAKE algorithm. | This mechanism negotiates a choice of group for the SPAKE algorithm. | |||
Groups are defined in the IANA "Kerberos SPAKE Groups" registry | Groups are defined in the "Kerberos SPAKE Groups" registry created by | |||
created by this document. Each group definition specifies an | this document (see Section 12.2). Each group definition specifies an | |||
associated hash function, which will be used for transcript | associated hash function, which will be used for transcript | |||
protection and key derivation. Clients and KDCs MUST implement the | protection and key derivation. Clients and KDCs MUST implement the | |||
edwards25519 group, but MAY choose not to offer or accept it by | edwards25519 group, but they MAY choose not to offer or accept it by | |||
default. | default. | |||
This section will describe the flow of messages when performing SPAKE | The subsections that follow will describe the flow of messages when | |||
pre-authentication. We will begin by explaining the most verbose | performing SPAKE pre-authentication. We will begin by explaining the | |||
version of the protocol which all implementations MUST support. Then | most verbose version of the protocol, which all implementations MUST | |||
we will describe several optional optimizations to reduce round- | support. Then, we will describe several optional optimizations to | |||
trips. | reduce round trips. | |||
Mechanism messages are communicated using PA-DATA elements within the | Mechanism messages are communicated using PA-DATA elements within the | |||
padata field of KDC-REQ messages or within the METHOD-DATA in the | padata field of KDC-REQ messages or within the METHOD-DATA in the | |||
e-data field of KRB-ERROR messages. All PA-DATA elements for this | e-data field of KRB-ERROR messages. All PA-DATA elements for this | |||
mechanism MUST use the following padata-type: | mechanism MUST use the following padata-type: | |||
PA-SPAKE 151 | PA-SPAKE 151 | |||
The padata-value for all PA-SPAKE PA-DATA values MUST be empty or | The padata-value for all PA-SPAKE PA-DATA values MUST be empty or | |||
contain a DER encoding for the ASN.1 type PA-SPAKE. | contain a DER encoding for the ASN.1 type PA-SPAKE. | |||
skipping to change at page 7, line 42 ¶ | skipping to change at line 326 ¶ | |||
challenge [1] SPAKEChallenge, | challenge [1] SPAKEChallenge, | |||
response [2] SPAKEResponse, | response [2] SPAKEResponse, | |||
encdata [3] EncryptedData, | encdata [3] EncryptedData, | |||
... | ... | |||
} | } | |||
4.1. First Pass | 4.1. First Pass | |||
The SPAKE pre-authentication exchange begins when the client sends an | The SPAKE pre-authentication exchange begins when the client sends an | |||
initial authentication service request (AS-REQ) without pre- | initial authentication service request (AS-REQ) without pre- | |||
authentication data. Upon receipt of this AS-REQ, a KDC which | authentication data. Upon receipt of this AS-REQ, a KDC that | |||
requires pre-authentication and supports SPAKE SHOULD (unless | requires pre-authentication and supports SPAKE SHOULD (unless | |||
configuration indicates otherwise) reply with a | configuration indicates otherwise) reply with a | |||
KDC_ERR_PREAUTH_REQUIRED error, with METHOD-DATA containing an empty | KDC_ERR_PREAUTH_REQUIRED error, with METHOD-DATA containing an empty | |||
PA-SPAKE PA-DATA element (possibly in addition to other PA-DATA | PA-SPAKE PA-DATA element (possibly in addition to other PA-DATA | |||
elements). This message indicates to the client that the KDC | elements). This message indicates to the client that the KDC | |||
supports SPAKE pre-authentication. | supports SPAKE pre-authentication. | |||
4.2. Second Pass | 4.2. Second Pass | |||
Once the client knows that the KDC supports SPAKE pre-authentication | Once the client knows that the KDC supports SPAKE pre-authentication | |||
and the client desires to use it, the client will generate a new AS- | and the client wants to use it, the client will generate a new AS-REQ | |||
REQ message containing a PA-SPAKE PA-DATA element using the support | message containing a PA-SPAKE PA-DATA element using the support | |||
choice. This message indicates to the KDC which groups the client | choice. This message indicates to the KDC which groups the client | |||
prefers for the SPAKE operation. The group numbers are defined in | prefers for the SPAKE operation. The group numbers are defined in | |||
the IANA "Kerberos SPAKE Groups" registry created by this document. | the "Kerberos SPAKE Groups" registry (see Section 12.2). The group's | |||
The groups sequence is ordered from the most preferred group to the | sequence is ordered from the most preferred group to the least | |||
least preferred group. | preferred group. | |||
SPAKESupport ::= SEQUENCE { | SPAKESupport ::= SEQUENCE { | |||
groups [0] SEQUENCE (SIZE(1..MAX)) OF Int32, | groups [0] SEQUENCE (SIZE(1..MAX)) OF Int32, | |||
... | ... | |||
} | } | |||
Upon receipt of the support message, the KDC will select a group. | Upon receipt of the support message, the KDC will select a group. | |||
The KDC SHOULD choose a group from the groups provided by the support | The KDC SHOULD choose a group from the groups provided by the support | |||
message. However, if the support message does not contain any group | message. However, if the support message does not contain any group | |||
that is supported by the KDC, the KDC MAY select another group in | that is supported by the KDC, the KDC MAY select another group in | |||
hopes that the client might support it. Otherwise, the KDC MUST | hopes that the client might support it. Otherwise, the KDC MUST | |||
respond with a KDC_ERR_PREAUTH_FAILED error. | respond with a KDC_ERR_PREAUTH_FAILED error. | |||
The group selection determines the group order, which shall be a | The group selection determines the group order, which shall be a | |||
large prime p multiplied by a small cofactor h (possibly 1), as well | large prime p multiplied by a small cofactor h (possibly 1), a | |||
as a generator P of a prime-order subgroup and two masking points M | generator P of a prime-order subgroup, and two masking points M and | |||
and N. The KDC selects a random integer x in the range 0 <= x < h*p, | N. The KDC selects a random integer x in the range 0 <= x < h*p, | |||
which MUST be divisible by h. The KDC computes a public key | which MUST be divisible by h. The KDC computes a public key | |||
T=x*P+w*M, where w is computed from the initial reply key according | T=x*P+w*M, where w is computed from the initial reply key according | |||
to Section 5. | to Section 5. | |||
The KDC will reply to the client with a | The KDC will reply to the client with a | |||
KDC_ERR_MORE_PREAUTH_DATA_REQUIRED error containing a PA-SPAKE PA- | KDC_ERR_MORE_PREAUTH_DATA_REQUIRED error containing a PA-SPAKE PA- | |||
DATA element using the challenge choice. | DATA element using the challenge choice. | |||
SPAKEChallenge ::= SEQUENCE { | SPAKEChallenge ::= SEQUENCE { | |||
group [0] Int32, | group [0] Int32, | |||
pubkey [1] OCTET STRING, | pubkey [1] OCTET STRING, | |||
factors [2] SEQUENCE (SIZE(1..MAX)) OF SPAKESecondFactor, | factors [2] SEQUENCE (SIZE(1..MAX)) OF SPAKESecondFactor, | |||
... | ... | |||
} | } | |||
The group field indicates the KDC-selected group used for all SPAKE | The group field indicates the KDC-selected group used for all SPAKE | |||
calculations as defined in the IANA "Kerberos SPAKE Groups" registry | calculations as defined in the "Kerberos SPAKE Groups" registry (see | |||
created by this document. | Section 12.2). | |||
The pubkey field indicates the KDC's public key T, serialized | The pubkey field indicates the KDC's public key T, serialized | |||
according to Section 5. | according to Section 5. | |||
The factors field contains an unordered list of second factors which | The factors field contains an unordered list of second factors, which | |||
can be used to complete the authentication. Each second factor is | can be used to complete the authentication. Each second factor is | |||
represented by a SPAKESecondFactor. | represented by a SPAKESecondFactor. | |||
SPAKESecondFactor ::= SEQUENCE { | SPAKESecondFactor ::= SEQUENCE { | |||
type [0] Int32, | type [0] Int32, | |||
data [1] OCTET STRING OPTIONAL | data [1] OCTET STRING OPTIONAL | |||
} | } | |||
The type field is a unique integer which identifies the second factor | The type field is a unique integer that identifies the second-factor | |||
type. The factors field of SPAKEChallenge MUST NOT contain more than | type. The factors field of SPAKEChallenge MUST NOT contain more than | |||
one SPAKESecondFactor with the same type value. | one SPAKESecondFactor with the same type value. | |||
The data field contains optional challenge data. The contents in | The data field contains optional challenge data. The contents in | |||
this field will depend upon the second factor type chosen. Note that | this field will depend upon the second-factor type chosen. Note that | |||
this challenge is initially transmitted as unauthenticated plaintext; | this challenge is initially transmitted as unauthenticated plaintext; | |||
see Section 10.2. | see Section 10.2. | |||
The client and KDC will each initialize a transcript hash (Section 6) | The client and KDC will each initialize a transcript hash (Section 6) | |||
using the hash function associated with the chosen group, and update | using the hash function associated with the chosen group and update | |||
it with the concatenation of the DER-encoded PA-SPAKE messages sent | it with the concatenation of the DER-encoded PA-SPAKE messages sent | |||
by the client and the KDC. | by the client and the KDC. | |||
4.3. Third Pass | 4.3. Third Pass | |||
Upon receipt of the challenge message, the client observes which | Upon receipt of the challenge message, the client observes which | |||
group was selected by the KDC and deserializes the KDC's public key | group was selected by the KDC and deserializes the KDC's public key | |||
T. The client selects a random integer y in the range 0 <= x < h*p, | T. The client selects a random integer y in the range 0 <= x < h*p, | |||
which MUST be divisible by h. The client computes a public key | which MUST be divisible by h. The client computes a public key | |||
S=y*P+w*N, where w is computed from the initial reply key according | S=y*P+w*N, where w is computed from the initial reply key according | |||
to Section 5. The client computes a shared group element | to Section 5. The client computes a shared group element | |||
K=y*(T-w*M). | K=y*(T-w*M). | |||
The client will then choose one of the second factor types listed in | The client will then choose one of the second-factor types listed in | |||
the factors field of the challenge message and gather whatever data | the factors field of the challenge message and gather whatever data | |||
is required for the chosen second factor type, possibly using the | is required for the chosen second-factor type, possibly using the | |||
associated challenge data. Finally, the client will send an AS-REQ | associated challenge data. Finally, the client will send an AS-REQ | |||
containing a PA-SPAKE PA-DATA element using the response choice. | containing a PA-SPAKE PA-DATA element using the response choice. | |||
SPAKEResponse ::= SEQUENCE { | SPAKEResponse ::= SEQUENCE { | |||
pubkey [0] OCTET STRING, | pubkey [0] OCTET STRING, | |||
factor [1] EncryptedData, -- SPAKESecondFactor | factor [1] EncryptedData, -- SPAKESecondFactor | |||
... | ... | |||
} | } | |||
The client and KDC will update the transcript hash with the pubkey | The client and KDC will update the transcript hash with the pubkey | |||
value, and use the resulting hash for all encryption key derivations. | value and use the resulting hash for all encryption key derivations. | |||
The pubkey field indicates the client's public key S, serialized | The pubkey field indicates the client's public key S, serialized | |||
according to Section 5. | according to Section 5. | |||
The factor field indicates the client's chosen second factor data. | The factor field indicates the client's chosen second-factor data. | |||
The key for this field is K'[1] as specified in Section 7. The kvno | The key for this field is K'[1] (specified in Section 7). The kvno | |||
field of the EncryptedData sequence is omitted. The key usage number | field of the EncryptedData sequence is omitted. The key usage number | |||
for the encryption is KEY_USAGE_SPAKE. The plain text inside the | for the encryption is KEY_USAGE_SPAKE. The plaintext inside the | |||
EncryptedData is an encoding of SPAKESecondFactor. Once decoded, the | EncryptedData is an encoding of the SPAKESecondFactor. Once decoded, | |||
SPAKESecondFactor contains the type of the second factor and any | the SPAKESecondFactor provides the type of the second factor and any | |||
optional data used. The contents of the data field will depend on | optional data used. The contents of the data field will depend on | |||
the second factor type chosen. The client MUST NOT send a response | the second-factor type chosen. The client MUST NOT send a response | |||
containing a second factor type which was not listed in the factors | containing a second-factor type that was not listed in the factors | |||
field of the challenge message. | field of the challenge message. | |||
When the KDC receives the response message from the client, it | When the KDC receives the response message from the client, it | |||
deserializes the client's public key S, and computes the shared group | deserializes the client's public key S, and computes the shared group | |||
element K=x*(S-w*N). The KDC derives K'[1] and decrypts the factors | element K=x*(S-w*N). The KDC derives K'[1] and decrypts the factors | |||
field. If decryption is successful, the first factor is successfully | field. If decryption is successful, the first factor is successfully | |||
validated. The KDC then validates the second factor. If either | validated. The KDC then validates the second factor. If either | |||
factor fails to validate, the KDC MUST respond with a | factor fails to validate, the KDC MUST respond with a | |||
KDC_ERR_PREAUTH_FAILED error. | KDC_ERR_PREAUTH_FAILED error. | |||
If validation of the second factor requires further round-trips, the | If validation of the second factor requires further round trips, the | |||
KDC MUST reply to the client with KDC_ERR_MORE_PREAUTH_DATA_REQUIRED | KDC MUST reply to the client with a | |||
containing a PA-SPAKE PA-DATA element using the encdata choice. The | KDC_ERR_MORE_PREAUTH_DATA_REQUIRED error containing a PA-SPAKE PA- | |||
kvno field of the EncryptedData sequence is omitted. The key for the | DATA element using the encdata choice. The kvno field of the | |||
EncryptedData value is K'[2] as specified in Section 7, and the key | EncryptedData sequence is omitted. The key for the EncryptedData | |||
usage number is KEY_USAGE_SPAKE. The plain text of this message | value is K'[2] (specified in Section 7), and the key usage number is | |||
contains a DER-encoded SPAKESecondFactor message. As before, the | KEY_USAGE_SPAKE. The plaintext of this message contains a DER- | |||
type field of this message will contain the second factor type, and | encoded SPAKESecondFactor message. As before, the type field of this | |||
the data field will optionally contain second factor type specific | message will contain the second-factor type and the data field will, | |||
data. | optionally, contain data specific to the second-factor type. | |||
4.4. Subsequent Passes | 4.4. Subsequent Passes | |||
Any number of additional round trips may occur using the encdata | Any number of additional round trips may occur using the encdata | |||
choice. The contents of the plaintexts are specific to the second | choice. The contents of the plaintexts are specific to the second- | |||
factor type. If a client receives a PA-SPAKE PA-DATA element using | factor type. If a client receives a PA-SPAKE PA-DATA element using | |||
the encdata choice from the KDC, it MUST reply with a subsequent AS- | the encdata choice from the KDC, it MUST reply with a subsequent AS- | |||
REQ with a PA-SPAKE PA-DATA using the encdata choice, or abort the AS | REQ with a PA-SPAKE PA-DATA element using the encdata choice or abort | |||
exchange. | the AS exchange. | |||
The key for client-originated encdata messages in subsequent passes | The key for client-originated encdata messages in subsequent passes | |||
is K'[3] as specified in Section 7 for the first subsequent pass, | is K'[3] (specified in Section 7) for the first subsequent pass, | |||
K'[5] for the second, and so on. The key for KDC-originated encdata | K'[5] for the second, and so on. The key for KDC-originated encdata | |||
messages is K'[4] for the first subsequent pass, K'[6] for the | messages is K'[4] for the first subsequent pass, K'[6] for the | |||
second, and so on. | second, and so on. | |||
4.5. Reply Key Strengthening | 4.5. Reply Key Strengthening | |||
When the KDC has successfully validated both factors, the reply key | When the KDC has successfully validated both factors, the reply key | |||
is strengthened and the mechanism is complete. To strengthen the | is strengthened and the mechanism is complete. The strengthening of | |||
reply key, the client and KDC replace it with K'[0] as specified in | the reply key is accomplished by the client and KDC replacing it with | |||
Section 7. The KDC then replies with a KDC-REP message, or continues | K'[0] (as specified in Section 7). The KDC then replies with a KDC- | |||
on to the next mechanism in the authentication set. There is no | REP message or continues on to the next mechanism in the | |||
final PA-SPAKE PA-DATA message from the KDC to the client. | authentication set. There is no final PA-SPAKE PA-DATA message from | |||
the KDC to the client. | ||||
Reply key strengthening occurs only once at the end of the exchange. | Reply key strengthening occurs only once: at the end of the exchange. | |||
The client and KDC MUST use the initial reply key as the base key for | The client and KDC MUST use the initial reply key as the base key for | |||
all K'[n] derivations. | all K'[n] derivations. | |||
4.6. Optimizations | 4.6. Optimizations | |||
The full protocol has two possible optimizations. | The full protocol has two possible optimizations. | |||
First, the KDC MAY reply to the initial AS-REQ (containing no pre- | First, the KDC MAY reply to the initial AS-REQ (containing no pre- | |||
authentication data) with a PA-SPAKE PA-DATA element using the | authentication data) with a PA-SPAKE PA-DATA element using the | |||
challenge choice, instead of an empty padata-value. In this case, | challenge choice instead of an empty padata-value. In this case, the | |||
the KDC optimistically selects a group which the client may not | KDC optimistically selects a group that the client may not support. | |||
support. If the group chosen by the challenge message is supported | If the group chosen by the challenge message is supported by the | |||
by the client, the client MUST skip to the third pass by issuing an | client, the client MUST skip to the third pass by issuing an AS-REQ | |||
AS-REQ with a PA-SPAKE message using the response choice. In this | with a PA-SPAKE message using the response choice. In this case, no | |||
case no SPAKESupport message is sent by the client, so the first | SPAKESupport message is sent by the client, so the first update to | |||
update to the transcript hash contains only the KDC's optimistic | the transcript hash contains only the KDC's optimistic challenge. If | |||
challenge. If the KDC's chosen group is not supported by the client, | the KDC's chosen group is not supported by the client, the client | |||
the client MUST continue to the second pass. In this case both the | MUST continue to the second pass. In this case, both the client and | |||
client and KDC MUST reinitialize the transcript hash for the client's | KDC MUST reinitialize the transcript hash for the client's support | |||
support message. Clients MUST support this optimization. | message. Clients MUST support this optimization. | |||
Second, clients MAY skip the first pass and send an AS-REQ with a PA- | Second, clients MAY skip the first pass and send an AS-REQ with a PA- | |||
SPAKE PA-DATA element using the support choice. If the KDC accepts | SPAKE PA-DATA element using the support choice. If the KDC accepts | |||
the support message and generates a challenge, it MUST include a PA- | the support message and generates a challenge, it MUST include a PA- | |||
ETYPE-INFO2 value within the METHOD-DATA of the | ETYPE-INFO2 value within the METHOD-DATA of the | |||
KDC_ERR_MORE_PREAUTH_DATA_REQUIRED error response, as the client may | KDC_ERR_MORE_PREAUTH_DATA_REQUIRED error response, as the client may | |||
not otherwise be able to compute the initial reply key. If the KDC | not otherwise be able to compute the initial reply key. If the KDC | |||
cannot continue with SPAKE (either because initial reply key type is | cannot continue with SPAKE (either because the initial reply key type | |||
incompatible with SPAKE or because it does not support any of the | is incompatible with SPAKE or because it does not support any of the | |||
client's groups) but can offer other pre-authentication mechanisms, | client's groups) but can offer other pre-authentication mechanisms, | |||
it MUST respond with a KDC_ERR_PREAUTH_FAILED error containing | the KDC MUST respond with a KDC_ERR_PREAUTH_FAILED error containing | |||
METHOD-DATA for the available mechanisms. A client supporting this | METHOD-DATA for the available mechanisms. A client supporting this | |||
optimization MUST continue after a KDC_ERR_PREAUTH_FAILED error as | optimization MUST continue after a KDC_ERR_PREAUTH_FAILED error as | |||
described in Section 2 of [RFC6113]. KDCs MUST support this | described in Section 2 of [RFC6113]. KDCs MUST support this | |||
optimization. | optimization. | |||
5. SPAKE Parameters and Conversions | 5. SPAKE Parameters and Conversions | |||
Group elements are converted to and from octet strings using the | Group elements are converted to and from octet strings using the | |||
serialization method defined in the IANA "Kerberos SPAKE Groups" | serialization method defined in the "Kerberos SPAKE Groups" registry | |||
registry created by this document. | (see Section 12.2). | |||
The SPAKE algorithm requires constants M and N for each group. These | The SPAKE algorithm requires constants M and N for each group. These | |||
constants are defined in the IANA "Kerberos SPAKE Groups" registry | constants are defined in the "Kerberos SPAKE Groups" registry (see | |||
created by this document. | Section 12.2). | |||
The SPAKE algorithm requires a shared secret input w to be used as a | The SPAKE algorithm requires a shared secret input w to be used as a | |||
scalar multiplier. This value MUST be produced from the initial | scalar multiplier. This value MUST be produced from the initial | |||
reply key as follows: | reply key as follows: | |||
1. Determine the length of the multiplier octet string as defined in | 1. Determine the length of the multiplier octet string as defined in | |||
the IANA "Kerberos SPAKE Groups" registry created by this | the "Kerberos SPAKE Groups" registry (see Section 12.2). | |||
document. | ||||
2. Compose a pepper string by concatenating the string "SPAKEsecret" | 2. Compose a pepper string by concatenating the string "SPAKEsecret" | |||
and the group number as a big-endian four-byte two's complement | and the group number as a big-endian four-byte two's complement | |||
binary number. | binary number. | |||
3. Produce an octet string of the required length using PRF+(K, | 3. Produce an octet string of the required length using PRF+(K, | |||
pepper), where K is the initial reply key and PRF+ is defined in | pepper), where K is the initial reply key and PRF+ is as defined | |||
Section 5.1 of [RFC6113]. | in Section 5.1 of [RFC6113]. | |||
4. Convert the octet string to a multiplier scalar using the | 4. Convert the octet string to a multiplier scalar using the | |||
multiplier conversion method defined in the IANA "Kerberos SPAKE | multiplier conversion method defined in the "Kerberos SPAKE | |||
Groups" registry created by this document. | Groups" registry (see Section 12.2). | |||
The KDC chooses a secret scalar value x and the client chooses a | The KDC chooses a secret scalar value x and the client chooses a | |||
secret scalar value y. As required by the SPAKE algorithm, these | secret scalar value y. As required by the SPAKE algorithm, these | |||
values are chosen randomly and uniformly. The KDC and client MUST | values are chosen randomly and uniformly. The KDC and client MUST | |||
NOT reuse x or y values for authentications involving different | NOT reuse x or y values for authentications involving different | |||
initial reply keys (see Section 10.4). | initial reply keys (see Section 10.4). | |||
6. Transcript Hash | 6. Transcript Hash | |||
The transcript hash is an octet string of length equal to the output | The transcript hash is an octet string of length equal to the output | |||
length of the hash function associated with the selected group. The | length of the hash function associated with the selected group. All | |||
initial value consists of all bits set to zero. | bits are set to zero in the initial value. | |||
When the transcript hash is updated with an octet string input, the | When the transcript hash is updated with an octet string input, the | |||
new value is the hash function computed over the concatenation of the | new value is the hash function computed over the concatenation of the | |||
old value and the input. | old value and the input. | |||
In the normal message flow or with the second optimization described | In the normal message flow or with the second optimization described | |||
in Section 4.6, the transcript hash is first updated with the | in Section 4.6, the transcript hash is: | |||
concatenation of the client's support message and the KDC's | ||||
challenge, and then updated a second time with the client's pubkey | 1. updated with the concatenation of the client's support message | |||
value. It therefore incorporates the client's supported groups, the | and the KDC's challenge, then | |||
KDC's chosen group, the KDC's initial second-factor messages, and the | ||||
2. updated a second time with the client's pubkey value. | ||||
Therefore, it incorporates the client's supported groups, the KDC's | ||||
chosen group, the KDC's initial second-factor messages, and the | ||||
client and KDC public values. Once the transcript hash is finalized, | client and KDC public values. Once the transcript hash is finalized, | |||
it is used without change for all key derivations (Section 7). In | it is used without change for all key derivations (Section 7). In | |||
particular, encrypted second-factor messages are not included in the | particular, encrypted second-factor messages are not included in the | |||
transcript hash. | transcript hash. | |||
If the first optimization described in Section 4.6 is used | If the first optimization described in Section 4.6 is used | |||
successfully, the transcript hash is updated first with the KDC's | successfully, the transcript hash is first updated with the KDC's | |||
challenge message, and second with the client's pubkey value. | challenge message and updated a second time with the client's pubkey | |||
value. | ||||
If first optimization is used unsuccessfully (i.e. the client does | If the first optimization is used unsuccessfully (i.e., the client | |||
not accept the KDC's selected group), the transcript hash is computed | does not accept the KDC's selected group), the transcript hash is | |||
as in the normal message flow, without including the KDC's optimistic | computed as in the normal message flow, without including the KDC's | |||
challenge. | optimistic challenge. | |||
7. Key Derivation | 7. Key Derivation | |||
Implementations MUST NOT use the shared group element (denoted by K) | Implementations MUST NOT use the shared group element (denoted by K) | |||
directly for any cryptographic operation. Instead, the SPAKE result | directly for any cryptographic operation. Instead, the SPAKE result | |||
is used to derive keys K'[n] as defined in this section. | is used to derive keys K'[n] (defined in this section). | |||
First, compute the hash function associated with the selected group | First, compute the hash function associated with the selected group | |||
over the concatenation of the following values: | over the concatenation of the following values: | |||
* The fixed string "SPAKEkey". | * The fixed string "SPAKEkey". | |||
* The group number as a big-endian four-byte two's complement binary | * The group number as a big-endian four-byte two's complement binary | |||
number. | number. | |||
* The encryption type of the initial reply key as a big-endian four- | * The encryption type of the initial reply key as a big-endian four- | |||
byte two's complement binary number. | byte two's complement binary number. | |||
* The PRF+ output used to compute the initial secret input w as | * The PRF+ output used to compute the initial secret input w (as | |||
specified in Section 5. | specified in Section 5). | |||
* The SPAKE result K, converted to an octet string as specified in | * The SPAKE result K, converted to an octet string (as specified in | |||
Section 5. | Section 5). | |||
* The transcript hash. | * The transcript hash. | |||
* The KDC-REQ-BODY encoding for the request being sent or responded | * The KDC-REQ-BODY encoding for the request being sent or responded | |||
to. Within a FAST channel, the inner KDC-REQ-BODY encoding MUST | to. Within a FAST channel, the inner KDC-REQ-BODY encoding MUST | |||
be used. | be used. | |||
* The value n as a big-endian four-byte unsigned binary number. | * The value n as a big-endian, four-byte, and unsigned binary | |||
number. | ||||
* A single-byte block counter, with the initial value 0x01. | * A single-byte block counter with the initial value 0x01. | |||
If the hash output is too small for the encryption type's key | If the hash output is too small for the encryption type's key | |||
generation seed length, the block counter value is incremented and | generation seed length, the block counter value is incremented and | |||
the hash function re-computed to produce as many blocks as are | the hash function is recomputed to produce as many blocks as are | |||
required. The result is truncated to the key generation seed length, | required. The result is truncated to the key generation seed length, | |||
and the random-to-key function is used to produce an intermediate key | and the random-to-key function is used to produce an intermediate key | |||
with the same encryption type as the initial reply key. | with the same encryption type as the initial reply key. | |||
The key K'[n] has the same encryption type as the initial reply key, | The key K'[n] has the same encryption type as the initial reply key, | |||
and has the value KRB-FX-CF2(initial-reply-key, intermediate-key, | and has the value KRB-FX-CF2(initial-reply-key, intermediate-key, | |||
"SPAKE", "keyderiv"), where KRB-FX-CF2 is defined in Section 5.1 of | "SPAKE", "keyderiv"), where KRB-FX-CF2 is defined in Section 5.1 of | |||
[RFC6113]. | [RFC6113]. | |||
8. Second Factor Types | 8. Second-Factor Types | |||
This document defines one second factor type: | This document defines one second-factor type: | |||
SF-NONE 1 | SF-NONE 1 | |||
This second factor type indicates that no second factor is used. | This second-factor type indicates that no second factor is used. | |||
Whenever a SPAKESecondFactor is used with SF-NONE, the data field | Whenever a SPAKESecondFactor is used with SF-NONE, the data field | |||
MUST be omitted. The SF-NONE second factor always successfully | MUST be omitted. The SF-NONE second factor always successfully | |||
validates. | validates. | |||
9. Hint for Authentication Sets | 9. Hint for Authentication Sets | |||
If a KDC offers SPAKE pre-authentication as part of an authentication | If a KDC offers SPAKE pre-authentication as part of an authentication | |||
set (Section 5.3 of [RFC6113]), it SHOULD provide a pa-hint value | set (Section 5.3 of [RFC6113]), it SHOULD provide a pa-hint value | |||
containing the DER encoding of the ASN.1 type PA-SPAKE-HINT, to help | containing the DER encoding of the ASN.1 type PA-SPAKE-HINT. This | |||
the client determine whether SPAKE pre-authentication is likely to | helps the client determine whether SPAKE pre-authentication is likely | |||
succeed if the authentication set is chosen. | to succeed if the authentication set is chosen. | |||
PA-SPAKE-HINT ::= SEQUENCE { | PA-SPAKE-HINT ::= SEQUENCE { | |||
groups [0] SEQUENCE (SIZE(1..MAX)) OF Int32, | groups [0] SEQUENCE (SIZE(1..MAX)) OF Int32, | |||
factors [1] SEQUENCE (SIZE(1..MAX)) OF SPAKESecondFactor | factors [1] SEQUENCE (SIZE(1..MAX)) OF SPAKESecondFactor | |||
} | } | |||
The groups field indicates the KDC's supported groups. The factors | The groups field indicates the KDC's supported groups. The factors | |||
field indicates the KDC's supported second factors. The KDC MAY omit | field indicates the KDC's supported second factors. The KDC MAY omit | |||
the data field of values in the factors list. | the data field of values in the factors list. | |||
A KDC MUST NOT include a PA-SPAKE-HINT message directly in a pa-value | A KDC MUST NOT include a PA-SPAKE-HINT message directly in a pa-value | |||
field; hints must only be provided within authentication sets. A KDC | field; hints must only be provided within authentication sets. A KDC | |||
SHOULD include a hint if SPAKE pre-authentication is offered as the | SHOULD include a hint if SPAKE pre-authentication is offered as the | |||
second or later element of an authentication set. | second or later element of an authentication set. | |||
The PA-SPAKE-HINT message is not part of the transcript, and does not | The PA-SPAKE-HINT message is not part of the transcript, and it does | |||
replace any part of the SPAKE message flow. | not replace any part of the SPAKE message flow. | |||
10. Security Considerations | 10. Security Considerations | |||
10.1. SPAKE Computations | 10.1. SPAKE Computations | |||
The deserialized public keys S and T MUST be verified to be elements | The deserialized public keys S and T MUST be verified to be elements | |||
of the group, to prevent invalid curve attacks. It is not necessary | of the group to prevent invalid curve attacks. It is not necessary | |||
to verify that they are members of the prime-order subgroup, as the | to verify that they are members of the prime-order subgroup; the | |||
computation of K by both parties involves a multiplication by the | computation of K by both parties involves a multiplication by the | |||
cofactor h. | cofactor h. | |||
The aforementioned cofactor multiplication is accomplished by | The aforementioned cofactor multiplication is accomplished by | |||
choosing private scalars x and y which are divisible by the cofactor. | choosing private scalars x and y, which are divisible by the | |||
If the client or KDC chooses a scalar which might not be divisible by | cofactor. If the client or KDC chooses a scalar that might not be | |||
the cofactor, an attacker might be able to coerce values of K which | divisible by the cofactor, an attacker might be able to coerce values | |||
are not members of the prime-order subgroup, and deduce a limited | of K that are not members of the prime-order subgroup and deduce a | |||
amount of information about w from the order of K. | limited amount of information about w from the order of K. | |||
The scalars x and y MUST be chosen uniformly, and must not be reused | The scalars x and y MUST be chosen uniformly. They MUST NOT be | |||
for different initial reply keys. If an x or y value is reused for | reused for different initial reply keys. If an x or y value is | |||
pre-authentications involving two different initial reply keys, an | reused for pre-authentications involving two different initial reply | |||
attacker who observes both authentications and knows one of the | keys, an attacker who observes both authentications and knows one of | |||
initial reply keys can conduct an offline dictionary attack to | the initial reply keys can conduct an offline dictionary attack to | |||
recover the other one. | recover the other one. | |||
The M and N values for a group MUST NOT have known discrete logs. An | The M and N values for a group MUST NOT have known discrete logs. An | |||
attacker who knows the discrete log of M or N can perform an offline | attacker who knows the discrete log of M or N can perform an offline | |||
dictionary attack on passwords. It is therefore important to | dictionary attack on passwords. Therefore, it is important to | |||
demonstrate that the M and N values for each group were computed | demonstrate that the M and N values for each group were computed | |||
without multiplying a known value by the generator P. | without multiplying a known value by the generator P. | |||
10.2. Unauthenticated Plaintext | 10.2. Unauthenticated Plaintext | |||
This mechanism includes unauthenticated plaintext in the support and | This mechanism includes unauthenticated plaintext in the support and | |||
challenge messages. Beginning with the third pass, the integrity of | challenge messages. Beginning with the third pass, the integrity of | |||
this plaintext is ensured by incorporating the transcript hash into | this plaintext is ensured by incorporating the transcript hash into | |||
the derivation of the final reply key and second factor encryption | the derivation of the final reply key and second-factor encryption | |||
keys. Downgrade attacks on support and challenge messages will | keys. Downgrade attacks on support and challenge messages will | |||
result in the client and KDC deriving different reply keys and | result in the client and KDC deriving different reply keys and | |||
EncryptedData keys. The KDC-REQ-BODY contents are also incorporated | EncryptedData keys. The KDC-REQ-BODY contents are also incorporated | |||
into key derivation, ensuring their integrity. The unauthenticated | into key derivation, ensuring their integrity. The unauthenticated | |||
plaintext in the KDC-REP message is not protected by this mechanism. | plaintext in the KDC-REP message is not protected by this mechanism. | |||
Unless FAST is used, the factors field of a challenge message is not | Unless FAST is used, the factors field of a challenge message is not | |||
integrity-protected until the response is verified. Second factor | integrity protected until the response is verified. Second-factor | |||
types MUST account for this when specifying the semantics of the data | types MUST account for this when specifying the semantics of the data | |||
field. In particular, second factor data in the challenge should not | field. In particular, second-factor data in the challenge should not | |||
be included in user prompts, as it could be modified by an attacker | be included in user prompts: it could be modified by an attacker to | |||
to contain misleading or offensive information. | contain misleading or offensive information. | |||
Unless FAST is used, the factors field of a challenge message is | Unless FAST is used, the factors field of a challenge message is | |||
visible to an attacker, who can use it to determine whether a second | visible to an attacker, who can use it to determine whether a second | |||
factor is required for the client. | factor is required for the client. | |||
Subsequent factor data, including the data in the response, are | Subsequent factor data, including the data in the response, are | |||
encrypted in a derivative of the shared secret K. Therefore, it is | encrypted in a derivative of the shared secret K. Therefore, it is | |||
not possible to exploit the untrustworthiness of the challenge to | not possible to exploit the untrustworthiness of the challenge to | |||
turn the client into an encryption or signing oracle for the second | turn the client into an encryption or signing oracle for the second- | |||
factor credentials, unless the attacker knows the client's long-term | factor credentials, unless the attacker knows the client's long-term | |||
key. | key. | |||
Unless FAST is used, any PA-SPAKE-HINT messages included when SPAKE | Unless FAST is used, any PA-SPAKE-HINT messages are unauthenticated | |||
is advertised in authentication sets are unauthenticated, and are not | and are not protected by the transcript hash if they are included | |||
protected by the transcript hash. Since hints do not replace any | when SPAKE is advertised in authentication sets. Since hints do not | |||
part of the message flow, manipulation of hint messages can only | replace any part of the message flow, manipulation of hint messages | |||
affect the client's decision to use or not use an authentication set, | can only affect the client's decision to use or not use an | |||
which could more easily be accomplished by removing authentication | authentication set, which could more easily be accomplished by | |||
sets entirely. | removing authentication sets entirely. | |||
10.3. Side Channels | 10.3. Side Channels | |||
An implementation of the SPAKE pre-authentication mechanism can have | An implementation of the SPAKE pre-authentication mechanism can have | |||
the property of indistinguishability, meaning that an attacker who | the property of indistinguishability, meaning that an attacker who | |||
guesses a long-term key and a second factor value cannot determine | guesses a long-term key and a second-factor value cannot determine | |||
whether one of the factors was correct unless both are correct. | whether one of the factors was correct unless both are correct. | |||
Indistinguishability is only maintained if the second factor can be | Indistinguishability is only maintained if the second factor can be | |||
validated solely based on the data in the response; the use of | validated solely based on the data in the response; the use of | |||
additional round trips will reveal to the attacker whether the long- | additional round trips will reveal to the attacker whether the long- | |||
term key is correct. Indistinguishability also requires that there | term key is correct. Indistinguishability also requires that there | |||
are no side channels. When processing a response message, whether or | are no side channels. When the KDC processes a response message, | |||
not the KDC successfully decrypts the factor field, it must reply | whether or not it decrypts the factor field, it must reply with the | |||
with the same error fields, take the same amount of time, and make | same error fields, take the same amount of time, and make the same | |||
the same observable communications to other servers. | observable communications to other servers. | |||
Both the size of the EncryptedData and the number of EncryptedData | Both the size of the EncryptedData and the number of EncryptedData | |||
messages used for second-factor data (including the factor field of | messages used for second-factor data (including the factor field of | |||
the SPAKEResponse message and messages using the encdata PA-SPAKE | the SPAKEResponse message and messages using the encdata PA-SPAKE | |||
choice) may reveal information about the second factor used in an | choice) may reveal information about the second factor used in an | |||
authentication. Care should be taken to keep second factor messages | authentication. Care should be taken to keep second-factor messages | |||
as small and as few as possible. | as small and as few as possible. | |||
Any side channels in the creation of the shared secret input w, or in | Any side channels in the creation of the shared secret input w, or in | |||
the multiplications wM and wN, could allow an attacker to recover the | the multiplications wM and wN, could allow an attacker to recover the | |||
client long-term key. Implementations MUST take care to avoid side | client long-term key. Implementations MUST take care to avoid side | |||
channels, particularly timing channels. Generation of the secret | channels, particularly timing channels. Generation of the secret | |||
scalar values x and y need not take constant time, but the amount of | scalar values x and y need not take constant time, but the amount of | |||
time taken MUST NOT provide information about the resulting value. | time taken MUST NOT provide information about the resulting value. | |||
The conversion of the scalar multiplier for the SPAKE w parameter may | The conversion of the scalar multiplier for the SPAKE w parameter may | |||
produce a multiplier that is larger than the order of the group. | produce a multiplier that is larger than the order of the group. | |||
Some group implementations may be unable to handle such a multiplier. | Some group implementations may be unable to handle such a multiplier. | |||
Others may silently accept such a multiplier, but proceed to perform | Others may silently accept such a multiplier but proceed to perform | |||
multiplication that is not constant time. This is only a minor risk | multiplication that is not constant time. This is only a minor risk | |||
in most commonly-used groups, but is a more serious risk for P-521 | in most commonly used groups, but it is a more serious risk for P-521 | |||
due to the extra seven high bits in the input octet string. A common | due to the extra seven high bits in the input octet string. A common | |||
solution to this problem is achieved by reducing the multiplier | solution to this problem is achieved by reducing the multiplier | |||
modulo the group order, taking care to ensure constant time | modulo the group order, taking care to ensure constant time | |||
operation. | operation. | |||
10.4. KDC State | 10.4. KDC State | |||
A stateless KDC implementation generally must use a PA-FX-COOKIE | A stateless KDC implementation generally must use a PA-FX-COOKIE | |||
value to remember its private scalar value x and the transcript hash. | value to remember its private scalar value x and the transcript hash. | |||
The KDC MUST maintain confidentiality and integrity of the cookie | The KDC MUST maintain confidentiality and integrity of the cookie | |||
value, perhaps by encrypting it in a key known only to the realm's | value, perhaps by encrypting it in a key known only to the realm's | |||
KDCs. Cookie values may be replayed by attackers, perhaps splicing | KDCs. Cookie values may be replayed by attackers, perhaps by | |||
them into different SPAKE exchanges. The KDC SHOULD limit the time | splicing them into different SPAKE exchanges. The KDC SHOULD limit | |||
window of replays using a timestamp, and SHOULD prevent cookie values | the time window of replays using a timestamp, and it SHOULD prevent | |||
from being applied to other pre-authentication mechanisms or other | cookie values from being applied to other pre-authentication | |||
client principals. Within the validity period of a cookie, an | mechanisms or other client principals. Within the validity period of | |||
attacker can replay the final message of a pre-authentication | a cookie, an attacker can replay the final message of a pre- | |||
exchange to any of the realm's KDCs and make it appear that the | authentication exchange to any of the realm's KDCs and make it appear | |||
client has authenticated. | that the client has authenticated. | |||
The SPAKE pre-authentication mechanism is not designed to provide | The SPAKE pre-authentication mechanism is not designed to provide | |||
forward secrecy. Nevertheless, some measure of forward secrecy may | forward secrecy. Nevertheless, some measure of forward secrecy may | |||
result depending on implementation choices. A passive attacker who | result depending on implementation choices. A passive attacker who | |||
determines the client long-term key after the exchange generally will | determines the client long-term key after the exchange generally will | |||
not be able to recover the ticket session key; however, an attacker | not be able to recover the ticket session key; however, an attacker | |||
who also determines the PA-FX-COOKIE encryption key (if the KDC uses | who also determines the PA-FX-COOKIE encryption key (if the KDC uses | |||
an encrypted cookie) will be able to recover the ticket session key. | an encrypted cookie) will be able to recover the ticket session key. | |||
If the KDC or client retains the x or y value for reuse with the same | If the KDC or client retains the x or y value for reuse with the same | |||
client long-term key, an attacker who recovers the x or y value and | client long-term key, an attacker who recovers the x or y value and | |||
the long-term key will be able to recover the ticket session key. | the long-term key will be able to recover the ticket session key. | |||
10.5. Dictionary Attacks | 10.5. Dictionary Attacks | |||
Although the SPAKE pre-authentication mechanism is designed to | Although the SPAKE pre-authentication mechanism is designed to | |||
prevent an offline dictionary attack by an active attacker posing as | prevent an offline dictionary attack by an active attacker posing as | |||
the KDC, such an attacker can attempt to downgrade the client to | the KDC, such an attacker can attempt to downgrade the client to the | |||
encrypted timestamp. Client implementations SHOULD provide a | encrypted timestamp pre-authentication mechanism. Client | |||
configuration option to enable or disable encrypted timestamp on a | implementations SHOULD provide a configuration option to enable or | |||
per-realm basis to mitigate this attack. | disable the encrypted timestamp mechanism on a per-realm basis to | |||
mitigate this attack. | ||||
If the user enters the wrong password, the client might fall back to | If the user enters the wrong password, the client might fall back to | |||
encrypted timestamp after receiving a KDC_ERR_PREAUTH_FAILED error | the encrypted timestamp mechanism after receiving a | |||
from the KDC, if encrypted timestamp is offered by the KDC and not | KDC_ERR_PREAUTH_FAILED error from the KDC, if the encrypted timestamp | |||
disabled by client configuration. This fallback will enable a | mechanism is offered by the KDC and not disabled by client | |||
passive attacker to mount an offline dictionary attack against the | configuration. This fallback will enable a passive attacker to mount | |||
incorrect password, which may be similar to the correct password. | an offline dictionary attack against the incorrect password, which | |||
Client implementations SHOULD assume that encrypted timestamp and | may be similar to the correct password. Client implementations | |||
encrypted challenge are unlikely to succeed if SPAKE pre- | SHOULD assume that the encrypted timestamp and encrypted challenge | |||
authentication fails in the second pass and SF-NONE was used. | mechanisms are unlikely to succeed if SPAKE pre-authentication fails | |||
in the second pass and SF-NONE was used. | ||||
Like any other pre-authentication mechanism using the client long- | Like any other pre-authentication mechanism using the client long- | |||
term key, the SPAKE pre-authentication mechanism does not prevent | term key, the SPAKE pre-authentication mechanism does not prevent | |||
online password guessing attacks. The KDC is made aware of | online password guessing attacks. The KDC is made aware of | |||
unsuccessful guesses, and can apply facilities such as rate limiting | unsuccessful guesses and can apply facilities such as rate limiting | |||
to mitigate the risk of online attacks. | to mitigate the risk of online attacks. | |||
10.6. Brute Force Attacks | 10.6. Brute-Force Attacks | |||
The selected group's resistance to offline brute-force attacks may | The selected group's resistance to offline brute-force attacks may | |||
not correspond to the size of the reply key. For performance | not correspond to the size of the reply key. For performance | |||
reasons, a KDC MAY select a group whose brute-force work factor is | reasons, a KDC MAY select a group whose brute-force work factor is | |||
less than the reply key length. A passive attacker who solves the | less than the reply key length. A passive attacker who solves the | |||
group discrete logarithm problem after the exchange will be able to | group discrete logarithm problem after the exchange will be able to | |||
conduct an offline attack against the client long-term key. Although | conduct an offline attack against the client long-term key. Although | |||
the use of password policies and costly, salted string-to-key | the use of password policies and costly, salted string-to-key | |||
functions may increase the cost of such an attack, the resulting cost | functions may increase the cost of such an attack, the resulting cost | |||
will likely not be higher than the cost of solving the group discrete | will likely not be higher than the cost of solving the group discrete | |||
logarithm. | logarithm. | |||
10.7. Denial of Service Attacks | 10.7. Denial-of-Service Attacks | |||
Elliptic curve group operations are more computationally expensive | Elliptic curve group operations are more computationally expensive | |||
than secret-key operations. As a result, the use of this mechanism | than secret-key operations. As a result, the use of this mechanism | |||
may affect the KDC's performance under normal load and its resistance | may affect the KDC's performance under normal load and its resistance | |||
to denial of service attacks. | to denial-of-service attacks. | |||
10.8. Reflection Attacks | 10.8. Reflection Attacks | |||
The encdata choice of PA-SPAKE can be used in either direction, and | The encdata choice of PA-SPAKE can be used in either direction; the | |||
the factor-specific plaintext does not necessarily indicate a | factor-specific plaintext does not necessarily indicate a direction. | |||
direction. However, each encdata message is encrypted using a | However, each encdata message is encrypted using a derived key K'[n], | |||
derived key K'[n], with client-originated messages using only odd | with client-originated messages using only odd values of n and KDC- | |||
values of n and KDC-originated messages using only even values. An | originated messages using only even values. Therefore, an attempted | |||
attempted reflection attack would therefore result in a failed | reflection attack would result in a failed decryption. | |||
decryption. | ||||
10.9. Reply-Key Encryption Type | 10.9. Reply Key Encryption Type | |||
This mechanism does not upgrade the encryption type of the initial | This mechanism does not upgrade the encryption type of the initial | |||
reply key, and relies on that encryption type for confidentiality, | reply key and relies on that encryption type for confidentiality, | |||
integrity, and pseudo-random functions. If the client long-term key | integrity, and pseudorandom functions. If the client long-term key | |||
uses a weak encryption type, an attacker might be able to subvert the | uses a weak encryption type, an attacker might be able to subvert the | |||
exchange, and the replaced reply key will also be of the same weak | exchange, and the replaced reply key will also be of the same weak | |||
encryption type. | encryption type. | |||
10.10. KDC Authentication | 10.10. KDC Authentication | |||
This mechanism does not directly provide the KDC Authentication pre- | This mechanism does not directly provide the KDC Authentication pre- | |||
authentication facility, because it does not send a key confirmation | authentication facility because it does not send a key confirmation | |||
from the KDC to the client. When used as a stand-alone mechanism, | from the KDC to the client. When used as a stand-alone mechanism, | |||
the traditional KDC authentication provided by the KDC-REP enc-part | the preexisting KDC authentication provided by the KDC-REP enc-part | |||
still applies. | still applies. | |||
11. Assigned Constants | 11. Assigned Constants | |||
The following key usage values are assigned for this mechanism: | The following key usage values are assigned for this mechanism: | |||
KEY_USAGE_SPAKE 65 | KEY_USAGE_SPAKE 65 | |||
12. IANA Considerations | 12. IANA Considerations | |||
IANA has assigned the following number for PA-SPAKE in the "Pre- | IANA has assigned the following number for PA-SPAKE in the "Pre- | |||
authentication and Typed Data" registry: | authentication and Typed Data" registry: | |||
+==========+=======+=================+ | +==========+=======+===========+ | |||
| Type | Value | Reference | | | Type | Value | Reference | | |||
+==========+=======+=================+ | +==========+=======+===========+ | |||
| PA-SPAKE | 151 | [this document] | | | PA-SPAKE | 151 | RFC 9588 | | |||
+----------+-------+-----------------+ | +----------+-------+-----------+ | |||
Table 1 | Table 1 | |||
This document establishes two registries with the following | This document establishes two registries (see Sections 12.1 and 12.2) | |||
procedure, in accordance with [RFC8126]: | with the following procedure, in accordance with [RFC8126]: | |||
Registry entries are to be evaluated using the Specification Required | Registry entries are to be evaluated using the Specification Required | |||
method. All specifications must be be published prior to entry | method. All specifications must be published prior to entry | |||
inclusion in the registry. Once published, they can be submitted | inclusion in the registry. Once published, they can be submitted | |||
directly to the krb5-spake-review@ietf.org mailing list, where there | directly to the krb5-spake-review@ietf.org mailing list, where there | |||
will be a three-week long review period by Designated Experts. | will be a three-week-long review period by designated experts. | |||
The Designated Experts ensure that the specification is publicly | The designated experts ensure that the specification is publicly | |||
available. The Designated Experts may provide additional in-depth | available. They may provide additional in-depth reviews, but their | |||
reviews, but their approval should not be taken as endorsement of the | approval should not be taken as endorsement of the specification. | |||
specification. | ||||
Prior to the end of the review period, the Designated Experts must | Prior to the end of the review period, the designated experts must | |||
approve or deny the request. This decision is conveyed to both IANA | approve or deny the request. This decision is conveyed to both IANA | |||
and the submitter. Since the mailing list archives are not public, | and the submitter. Since the mailing list archives are not public, | |||
it should include both a reasonably detailed explanation in the case | it should include both a reasonably detailed explanation in the case | |||
of a denial as well as whether the request can be resubmitted. | of a denial as well as whether the request can be resubmitted. | |||
IANA must only accept registry updates from the designated experts | IANA must only accept registry updates from the designated experts | |||
and should direct all requests for registration to the review mailing | and should direct all requests for registration to the review mailing | |||
list. | list. | |||
12.1. Kerberos Second Factor Types | 12.1. Kerberos Second-Factor Types | |||
This section species the IANA "Kerberos Second Factor Types" | This section specifies the "Kerberos Second-Factor Types" registry, | |||
registry. This registry records the number, name, and reference for | which records the number, name, and reference for each second-factor | |||
each second factor protocol. | protocol. | |||
12.1.1. Registration Template | 12.1.1. Registration Template | |||
ID Number: This is a value that uniquely identifies this entry. It | ID Number: A value that uniquely identifies this entry. It is a | |||
is a signed integer in range -2147483648 to 2147483647, inclusive. | signed integer in the range -2147483648 to 2147483647, inclusive. | |||
Positive values must be assigned only for algorithms specified in | Positive values must be assigned only for algorithms specified in | |||
accordance with these rules for use with Kerberos and related | accordance with these rules for use with Kerberos and related | |||
protocols. Negative values should be used for private and | protocols. Negative values should be used for private and | |||
experimental algorithms only. Zero is reserved and must not be | experimental algorithms only. Zero is reserved and must not be | |||
assigned. Values should be assigned in increasing order. | assigned. Values should be assigned in increasing order. | |||
Name: Brief, unique, human-readable name for this algorithm. | Name: A brief, unique, human-readable name for this algorithm. | |||
Reference: URI or otherwise unique identifier for where the details | Reference: A URI or otherwise unique identifier for where the | |||
of this algorithm can be found. It should be as specific as | details of this algorithm can be found. It should be as specific | |||
reasonably possible. | as reasonably possible. | |||
12.1.2. Initial Registry Contents | 12.1.2. Initial Registry Contents | |||
ID Number: 0 | ||||
Name: Reserved | ||||
Reference: RFC 9588 | ||||
ID Number: 1 | ID Number: 1 | |||
Name: SF-NONE | Name: SF-NONE | |||
Reference: [this document] | Reference: RFC 9588 | |||
12.2. Kerberos SPAKE Groups | 12.2. Kerberos SPAKE Groups | |||
This section specifies the IANA "Kerberos SPAKE Groups" registry. | This section specifies the "Kerberos SPAKE Groups" registry, which | |||
This registry records the number, name, specification, serialization, | records the number, name, specification, serialization, multiplier | |||
multiplier length, multiplier conversion, SPAKE M and N constants, | length, multiplier conversion, SPAKE M and N constants, and | |||
and associated hash function. | associated hash function for each SPAKE Group. | |||
12.2.1. Registration Template | 12.2.1. Registration Template | |||
ID Number: This is a value that uniquely identifies this entry. It | ID Number: A value that uniquely identifies this entry. It is a | |||
is a signed integer in range -2147483648 to 2147483647, inclusive. | signed integer in the range -2147483648 to 2147483647, inclusive. | |||
Positive values must be assigned only for algorithms specified in | Positive values must be assigned only for algorithms specified in | |||
accordance with these rules for use with Kerberos and related | accordance with these rules for use with Kerberos and related | |||
protocols. Negative values should be used for private and | protocols. Negative values should be used for private and | |||
experimental use only. Zero is reserved and must not be assigned. | experimental use only. Zero is reserved and must not be assigned. | |||
Values should be assigned in increasing order. | Values should be assigned in increasing order. | |||
Name: Brief, unique, human readable name for this entry. | Name: A brief, unique, human-readable name for this entry. | |||
Specification: Reference to the definition of the group parameters | Specification: A reference to the definition of the group parameters | |||
and operations. | and operations. | |||
Serialization: Reference to the definition of the method used to | Serialization: A reference to the definition of the method used to | |||
serialize and deserialize group elements. | serialize and deserialize group elements. | |||
Multiplier Length: The length of the input octet string to | Multiplier Length: The length of the input octet string to | |||
multiplication operations. | multiplication operations. | |||
Multiplier Conversion: Reference to the definition of the method | Multiplier Conversion: A reference to the definition of the method | |||
used to convert an octet string to a multiplier scalar. | used to convert an octet string to a multiplier scalar. | |||
SPAKE M Constant: The serialized value of the SPAKE M constant in | SPAKE M Constant: The serialized value of the SPAKE M constant in | |||
hexadecimal notation. | hexadecimal notation. | |||
SPAKE N Constant: The serialized value of the SPAKE N constant in | SPAKE N Constant: The serialized value of the SPAKE N constant in | |||
hexadecimal notation. | hexadecimal notation. | |||
Hash Function: The group's associated hash function. | Hash Function: The group's associated hash function. | |||
skipping to change at page 22, line 9 ¶ | skipping to change at line 1012 ¶ | |||
ID Number: 1 | ID Number: 1 | |||
Name: edwards25519 | Name: edwards25519 | |||
Specification: Section 4.1 of [RFC7748] (edwards25519) | Specification: Section 4.1 of [RFC7748] (edwards25519) | |||
Serialization: Section 3.1 of [RFC8032] | Serialization: Section 3.1 of [RFC8032] | |||
Multiplier Length: 32 | Multiplier Length: 32 | |||
Multiplier Conversion: Section 3.1 of [RFC8032] | Multiplier Conversion: Section 3.1 of [RFC8032] | |||
SPAKE M Constant: | SPAKE M Constant: | |||
d048032c6ea0b6d697ddc2e86bda85a33adac920f1bf18e1b0c6d166a5cecdaf | d048032c6ea0b6d697ddc2e86bda85a33adac920f1bf18e1b0c6d166a5cecdaf | |||
SPAKE N Constant: | SPAKE N Constant: | |||
d3bfb518f44f3430f29d0c92af503865a1ed3281dc69b35dd868ba85f886c4ab | d3bfb518f44f3430f29d0c92af503865a1ed3281dc69b35dd868ba85f886c4ab | |||
Hash function: SHA-256 ([RFC6234]) | Hash function: SHA-256 [RFC6234] | |||
12.2.2.2. P-256 | 12.2.2.2. P-256 | |||
ID Number: 2 | ID Number: 2 | |||
Name: P-256 | Name: P-256 | |||
Specification: Section 2.4.2 of [SEC2] | Specification: Section 2.4.2 of [SEC2] | |||
Serialization: Section 2.3.3 of [SEC1] (compressed format) | Serialization: Section 2.3.3 of [SEC1] (compressed format) | |||
Multiplier Length: 32 | Multiplier Length: 32 | |||
Multiplier Conversion: Section 2.3.8 of [SEC1] | Multiplier Conversion: Section 2.3.8 of [SEC1] | |||
SPAKE M Constant: | SPAKE M Constant: | |||
02886e2f97ace46e55ba9dd7242579f2993b64e16ef3dcab95afd497333d8fa12f | 02886e2f97ace46e55ba9dd7242579f2993b64e16ef3dcab95afd497333d8fa12f | |||
SPAKE N Constant: | SPAKE N Constant: | |||
03d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4f98baa1292b49 | 03d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4f98baa1292b49 | |||
Hash function: SHA-256 ([RFC6234]) | Hash function: SHA-256 [RFC6234] | |||
12.2.2.3. P-384 | 12.2.2.3. P-384 | |||
ID Number: 3 | ID Number: 3 | |||
Name: P-384 | Name: P-384 | |||
Specification: Section 2.5.1 of [SEC2] | Specification: Section 2.5.1 of [SEC2] | |||
Serialization: Section 2.3.3 of [SEC1] (compressed format) | Serialization: Section 2.3.3 of [SEC1] (compressed format) | |||
Multiplier Length: 48 | Multiplier Length: 48 | |||
Multiplier Conversion: Section 2.3.8 of [SEC1] | Multiplier Conversion: Section 2.3.8 of [SEC1] | |||
SPAKE M Constant: | SPAKE M Constant: | |||
030ff0895ae5ebf6187080a82d82b42e2765e3b2f8749c7e05eba366434b363d3d | 030ff0895ae5ebf6187080a82d82b42e2765e3b2f8749c7e05eba366434b363d3d | |||
c36f15314739074d2eb8613fceec2853 | c36f15314739074d2eb8613fceec2853 | |||
SPAKE N Constant: | SPAKE N Constant: | |||
02c72cf2e390853a1c1c4ad816a62fd15824f56078918f43f922ca21518f9c543b | 02c72cf2e390853a1c1c4ad816a62fd15824f56078918f43f922ca21518f9c543b | |||
b252c5490214cf9aa3f0baab4b665c10 | b252c5490214cf9aa3f0baab4b665c10 | |||
Hash function: SHA-384 ([RFC6234]) | Hash function: SHA-384 [RFC6234] | |||
12.2.2.4. P-521 | 12.2.2.4. P-521 | |||
ID Number: 4 | ID Number: 4 | |||
Name: P-521 | Name: P-521 | |||
Specification: Section 2.6.1 of [SEC2] | Specification: Section 2.6.1 of [SEC2] | |||
Serialization: Section 2.3.3 of [SEC1] (compressed format) | Serialization: Section 2.3.3 of [SEC1] (compressed format) | |||
Multiplier Length: 48 | Multiplier Length: 48 | |||
Multiplier Conversion: Section 2.3.8 of [SEC1] | Multiplier Conversion: Section 2.3.8 of [SEC1] | |||
SPAKE M Constant: | SPAKE M Constant: | |||
02003f06f38131b2ba2600791e82488e8d20ab889af753a41806c5db18d37d8560 | 02003f06f38131b2ba2600791e82488e8d20ab889af753a41806c5db18d37d8560 | |||
8cfae06b82e4a72cd744c719193562a653ea1f119eef9356907edc9b56979962d7 | 8cfae06b82e4a72cd744c719193562a653ea1f119eef9356907edc9b56979962d7 | |||
aa | aa | |||
SPAKE N Constant: | SPAKE N Constant: | |||
0200c7924b9ec017f3094562894336a53c50167ba8c5963876880542bc669e494b | 0200c7924b9ec017f3094562894336a53c50167ba8c5963876880542bc669e494b | |||
2532d76c5b53dfb349fdf69154b9e0048c58a42e8ed04cef052a3bc349d95575cd | 2532d76c5b53dfb349fdf69154b9e0048c58a42e8ed04cef052a3bc349d95575cd | |||
25 | 25 | |||
Hash function: SHA-512 ([RFC6234]) | Hash function: SHA-512 [RFC6234] | |||
13. Normative References | 13. References | |||
13.1. Normative References | ||||
[ITU-T.X680.2021] | ||||
ITU-T, "Information technology - Abstract Syntax Notation | ||||
One (ASN.1): Specification of basic notation", ITU-T | ||||
Recommendation X.680, ISO/IEC 8824-1:2021, February 2021. | ||||
[ITU-T.X690.2021] | ||||
ITU-T, "Information technology - ASN.1 encoding rules: | ||||
Specification of Basic Encoding Rules (BER), Canonical | ||||
Encoding Rules (CER) and Distinguished Encoding Rules | ||||
(DER)", ITU-T Recommendation X.690, ISO/IEC 8825-1:2021, | ||||
February 2021. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3961] Raeburn, K., "Encryption and Checksum Specifications for | [RFC3961] Raeburn, K., "Encryption and Checksum Specifications for | |||
Kerberos 5", RFC 3961, DOI 10.17487/RFC3961, February | Kerberos 5", RFC 3961, DOI 10.17487/RFC3961, February | |||
2005, <https://www.rfc-editor.org/info/rfc3961>. | 2005, <https://www.rfc-editor.org/info/rfc3961>. | |||
skipping to change at page 24, line 14 ¶ | skipping to change at line 1120 ¶ | |||
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
<https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[CCITT.X680.2002] | ||||
International Telephone and Telegraph Consultative | ||||
Committee, "Abstract Syntax Notation One (ASN.1): | ||||
Specification of basic notation", CCITT Recommendation | ||||
X.680, July 2002. | ||||
[CCITT.X690.2002] | ||||
International Telephone and Telegraph Consultative | ||||
Committee, "ASN.1 encoding rules: Specification of basic | ||||
encoding Rules (BER), Canonical encoding rules (CER) and | ||||
Distinguished encoding rules (DER)", CCITT Recommendation | ||||
X.690, July 2002. | ||||
[SEC1] Standards for Efficient Cryptography Group, "SEC 1: | [SEC1] Standards for Efficient Cryptography Group, "SEC 1: | |||
Elliptic Curve Cryptography", May 2009. | Elliptic Curve Cryptography", May 2009. | |||
[SEC2] Standards for Efficient Cryptography Group, "SEC 2: | [SEC2] Standards for Efficient Cryptography Group, "SEC 2: | |||
Recommended Elliptic Curve Domain Parameters", January | Recommended Elliptic Curve Domain Parameters", January | |||
2010. | 2010. | |||
14. Informative References | 13.2. Informative References | |||
[RFC6090] McGrew, D., Igoe, K., and M. Salter, "Fundamental Elliptic | [RFC6090] McGrew, D., Igoe, K., and M. Salter, "Fundamental Elliptic | |||
Curve Cryptography Algorithms", RFC 6090, | Curve Cryptography Algorithms", RFC 6090, | |||
DOI 10.17487/RFC6090, February 2011, | DOI 10.17487/RFC6090, February 2011, | |||
<https://www.rfc-editor.org/info/rfc6090>. | <https://www.rfc-editor.org/info/rfc6090>. | |||
[RFC6560] Richards, G., "One-Time Password (OTP) Pre- | [RFC6560] Richards, G., "One-Time Password (OTP) Pre- | |||
Authentication", RFC 6560, DOI 10.17487/RFC6560, April | Authentication", RFC 6560, DOI 10.17487/RFC6560, April | |||
2012, <https://www.rfc-editor.org/info/rfc6560>. | 2012, <https://www.rfc-editor.org/info/rfc6560>. | |||
[RFC8125] Schmidt, J., "Requirements for Password-Authenticated Key | [RFC8125] Schmidt, J., "Requirements for Password-Authenticated Key | |||
Agreement (PAKE) Schemes", RFC 8125, DOI 10.17487/RFC8125, | Agreement (PAKE) Schemes", RFC 8125, DOI 10.17487/RFC8125, | |||
April 2017, <https://www.rfc-editor.org/info/rfc8125>. | April 2017, <https://www.rfc-editor.org/info/rfc8125>. | |||
[SPAKE] Abdalla, M. and D. Pointcheval, "Simple Password-Based | [SPAKE] Abdalla, M. and D. Pointcheval, "Simple Password-Based | |||
Encrypted Key Exchange Protocols", Cryptography-CT-RSA | Encrypted Key Exchange Protocols", CT-RSA 2005, Lecture | |||
2005, Lecture Notes in Computer Science, Volume 3376, | Notes in Computer Science, Volume 3376, pages 191-208, | |||
pages 191-208, Springer, DOI 10.1007/978-3-540-30574-3_14, | Springer, DOI 10.1007/978-3-540-30574-3_14, February 2005, | |||
February 2005, | ||||
<https://doi.org/10.1007/978-3-540-30574-3_14>. | <https://doi.org/10.1007/978-3-540-30574-3_14>. | |||
Appendix A. ASN.1 Module | Appendix A. ASN.1 Module | |||
KerberosV5SPAKE { | KerberosV5SPAKE { | |||
iso(1) identified-organization(3) dod(6) internet(1) | iso(1) identified-organization(3) dod(6) internet(1) | |||
security(5) kerberosV5(2) modules(4) spake(8) | security(5) kerberosV5(2) modules(4) spake(8) | |||
} DEFINITIONS EXPLICIT TAGS ::= BEGIN | } DEFINITIONS EXPLICIT TAGS ::= BEGIN | |||
IMPORTS | IMPORTS | |||
skipping to change at page 27, line 5 ¶ | skipping to change at line 1238 ¶ | |||
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 | |||
The seed initial seed strings are: | The initial seed strings are as follows: | |||
* For group 1 M: edwards25519 point generation seed (M) | * For group 1 M: edwards25519 point generation seed (M) | |||
* For group 1 N: edwards25519 point generation seed (N) | * For group 1 N: edwards25519 point generation seed (N) | |||
* For group 2 M: 1.2.840.10045.3.1.7 point generation seed (M) | * For group 2 M: 1.2.840.10045.3.1.7 point generation seed (M) | |||
* For group 2 N: 1.2.840.10045.3.1.7 point generation seed (N) | * For group 2 N: 1.2.840.10045.3.1.7 point generation seed (N) | |||
* For group 3 M: 1.3.132.0.34 point generation seed (M) | * For group 3 M: 1.3.132.0.34 point generation seed (M) | |||
skipping to change at page 27, line 32 ¶ | skipping to change at line 1265 ¶ | |||
Appendix C. Test Vectors | Appendix C. Test Vectors | |||
For the following text vectors: | For the following text vectors: | |||
* The key is the string-to-key of "password" with the salt | * The key is the string-to-key of "password" with the salt | |||
"ATHENA.MIT.EDUraeburn" for the designated initial reply key | "ATHENA.MIT.EDUraeburn" for the designated initial reply key | |||
encryption type. | encryption type. | |||
* x and y were chosen randomly within the order of the designated | * x and y were chosen randomly within the order of the designated | |||
group, then multiplied by the cofactor.. | group, then multiplied by the cofactor. | |||
* The SPAKESupport message contains only the designated group's | * The SPAKESupport message contains only the designated group's | |||
number. | number. | |||
* The SPAKEChallenge message offers only the SF-NONE second factor | * The SPAKEChallenge message offers only the SF-NONE second-factor | |||
type. | type. | |||
* The KDC-REQ-BODY message contains no KDC options, the client | * The KDC-REQ-BODY message does not contain KDC options, but does | |||
principal name "raeburn@ATHENA.MIT.EDU", the server principal name | contain the client principal name "raeburn@ATHENA.MIT.EDU", the | |||
"krbtgt/ATHENA.MIT.EDU", the realm "ATHENA.MIT.EDU", the till | server principal name "krbtgt/ATHENA.MIT.EDU", the realm | |||
field "19700101000000Z", the nonce zero, and an etype list | "ATHENA.MIT.EDU", the till field "19700101000000Z", the nonce | |||
containing only the designated encryption type. | zero, and an etype list containing only the designated encryption | |||
type. | ||||
des3-cbc-sha1 edwards25519 | des3-cbc-sha1 edwards25519 | |||
key: 850bb51358548cd05e86768c313e3bfef7511937dcf72c3e | key: 850bb51358548cd05e86768c313e3bfef7511937dcf72c3e | |||
w (PRF+ output): 686d84730cb8679ae95416c6567c6a63 | w (PRF+ output): 686d84730cb8679ae95416c6567c6a63 | |||
f2c9cef124f7a3371ae81e11cad42a37 | f2c9cef124f7a3371ae81e11cad42a37 | |||
w (reduced multiplier): a1f1a25cbd8e3092667e2fddba8ecd24 | w (reduced multiplier): a1f1a25cbd8e3092667e2fddba8ecd24 | |||
f2c9cef124f7a3371ae81e11cad42a07 | f2c9cef124f7a3371ae81e11cad42a07 | |||
x: 201012d07bfd48ddfa33c4aac4fb1e229fb0d043cfe65ebfb14399091c71a723 | x: 201012d07bfd48ddfa33c4aac4fb1e229fb0d043cfe65ebfb14399091c71a723 | |||
y: 500b294797b8b042aca1bedc0f5931a4f52c537b3608b2d05cc8a2372f439f25 | y: 500b294797b8b042aca1bedc0f5931a4f52c537b3608b2d05cc8a2372f439f25 | |||
X: ec274df1920dc0f690c8741b794127233745444161016ef950ad75c51db58c3e | X: ec274df1920dc0f690c8741b794127233745444161016ef950ad75c51db58c3e | |||
skipping to change at page 36, line 40 ¶ | skipping to change at line 1685 ¶ | |||
303130313030303030305aa703020100a8053003020112 | 303130313030303030305aa703020100a8053003020112 | |||
K'[0]: 40bceb51bba474fd29ae65950022b704 | K'[0]: 40bceb51bba474fd29ae65950022b704 | |||
17b80d973fa8d8d6cd39833ff89964ad | 17b80d973fa8d8d6cd39833ff89964ad | |||
K'[1]: c29a7315453dc1cce938fa12a9e5c0db | K'[1]: c29a7315453dc1cce938fa12a9e5c0db | |||
2894b2194da14c9cd4f7bc3a6a37223d | 2894b2194da14c9cd4f7bc3a6a37223d | |||
K'[2]: f261984dba3c230fad99d324f871514e | K'[2]: f261984dba3c230fad99d324f871514e | |||
5aad670e44f00daef3264870b0851c25 | 5aad670e44f00daef3264870b0851c25 | |||
K'[3]: d24b2b46bab7c4d1790017d9116a7eeb | K'[3]: d24b2b46bab7c4d1790017d9116a7eeb | |||
ca88b0562a5ad8989c826cb7dab715c7 | ca88b0562a5ad8989c826cb7dab715c7 | |||
Appendix D. Acknowledgements | Acknowledgements | |||
Nico Williams (Cryptonector) | Nico Williams (Cryptonector) | |||
Taylor Yu (MIT) | ||||
Taylor Yu (MIT) | ||||
Authors' Addresses | Authors' Addresses | |||
Nathaniel McCallum | Nathaniel McCallum | |||
Red Hat, Inc. | Red Hat, Inc. | |||
Email: nathaniel@mccallum.life | Email: nathaniel@mccallum.life | |||
Simo Sorce | Simo Sorce | |||
Red Hat, Inc. | Red Hat, Inc. | |||
Email: ssorce@redhat.com | Email: ssorce@redhat.com | |||
Robbie Harwood | Robbie Harwood | |||
Red Hat, Inc. | Red Hat, Inc. | |||
Email: rharwood@pm.me | Email: rharwood@pm.me | |||
Greg Hudson | Greg Hudson | |||
MIT | MIT | |||
End of changes. 139 change blocks. | ||||
384 lines changed or deleted | 401 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |