| < draft-ietf-quic-tls-16.txt | draft-ietf-quic-tls-17.txt > | |||
|---|---|---|---|---|
| QUIC M. Thomson, Ed. | QUIC M. Thomson, Ed. | |||
| Internet-Draft Mozilla | Internet-Draft Mozilla | |||
| Intended status: Standards Track S. Turner, Ed. | Intended status: Standards Track S. Turner, Ed. | |||
| Expires: April 26, 2019 sn3rd | Expires: June 21, 2019 sn3rd | |||
| October 23, 2018 | December 18, 2018 | |||
| Using Transport Layer Security (TLS) to Secure QUIC | Using TLS to Secure QUIC | |||
| draft-ietf-quic-tls-16 | draft-ietf-quic-tls-17 | |||
| Abstract | Abstract | |||
| This document describes how Transport Layer Security (TLS) is used to | This document describes how Transport Layer Security (TLS) is used to | |||
| secure QUIC. | secure QUIC. | |||
| Note to Readers | Note to Readers | |||
| Discussion of this draft takes place on the QUIC working group | Discussion of this draft takes place on the QUIC working group | |||
| mailing list (quic@ietf.org), which is archived at | mailing list (quic@ietf.org), which is archived at | |||
| skipping to change at page 1, line 42 ¶ | skipping to change at page 1, line 42 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on April 26, 2019. | This Internet-Draft will expire on June 21, 2019. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2018 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 | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 2. Notational Conventions . . . . . . . . . . . . . . . . . . . 3 | 2. Notational Conventions . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.1. TLS Overview . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1. TLS Overview . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 3. Protocol Overview . . . . . . . . . . . . . . . . . . . . . . 6 | 3. Protocol Overview . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 4. Carrying TLS Messages . . . . . . . . . . . . . . . . . . . . 7 | 4. Carrying TLS Messages . . . . . . . . . . . . . . . . . . . . 7 | |||
| 4.1. Interface to TLS . . . . . . . . . . . . . . . . . . . . 9 | 4.1. Interface to TLS . . . . . . . . . . . . . . . . . . . . 9 | |||
| 4.1.1. Sending and Receiving Handshake Messages . . . . . . 9 | 4.1.1. Sending and Receiving Handshake Messages . . . . . . 9 | |||
| 4.1.2. Encryption Level Changes . . . . . . . . . . . . . . 11 | 4.1.2. Encryption Level Changes . . . . . . . . . . . . . . 11 | |||
| 4.1.3. TLS Interface Summary . . . . . . . . . . . . . . . . 11 | 4.1.3. TLS Interface Summary . . . . . . . . . . . . . . . . 12 | |||
| 4.2. TLS Version . . . . . . . . . . . . . . . . . . . . . . . 12 | 4.2. TLS Version . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.3. ClientHello Size . . . . . . . . . . . . . . . . . . . . 13 | 4.3. ClientHello Size . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.4. Peer Authentication . . . . . . . . . . . . . . . . . . . 13 | 4.4. Peer Authentication . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.5. Enabling 0-RTT . . . . . . . . . . . . . . . . . . . . . 14 | 4.5. Enabling 0-RTT . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.6. Rejecting 0-RTT . . . . . . . . . . . . . . . . . . . . . 14 | 4.6. Rejecting 0-RTT . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.7. HelloRetryRequest . . . . . . . . . . . . . . . . . . . . 14 | 4.7. HelloRetryRequest . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.8. TLS Errors . . . . . . . . . . . . . . . . . . . . . . . 15 | 4.8. TLS Errors . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.9. Discarding Unused Keys . . . . . . . . . . . . . . . . . 15 | 4.9. Discarding Unused Keys . . . . . . . . . . . . . . . . . 16 | |||
| 5. Packet Protection . . . . . . . . . . . . . . . . . . . . . . 16 | 4.10. Discarding Initial Keys . . . . . . . . . . . . . . . . . 17 | |||
| 5.1. Packet Protection Keys . . . . . . . . . . . . . . . . . 16 | 5. Packet Protection . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 5.2. Initial Secrets . . . . . . . . . . . . . . . . . . . . . 17 | 5.1. Packet Protection Keys . . . . . . . . . . . . . . . . . 18 | |||
| 5.3. AEAD Usage . . . . . . . . . . . . . . . . . . . . . . . 18 | 5.2. Initial Secrets . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 5.4. Packet Number Protection . . . . . . . . . . . . . . . . 19 | 5.3. AEAD Usage . . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 5.4.1. AES-Based Packet Number Protection . . . . . . . . . 20 | 5.4. Header Protection . . . . . . . . . . . . . . . . . . . . 20 | |||
| 5.4.2. ChaCha20-Based Packet Number Protection . . . . . . . 20 | 5.4.1. Header Protection Application . . . . . . . . . . . . 21 | |||
| 5.5. Receiving Protected Packets . . . . . . . . . . . . . . . 20 | 5.4.2. Header Protection Sample . . . . . . . . . . . . . . 22 | |||
| 5.6. Use of 0-RTT Keys . . . . . . . . . . . . . . . . . . . . 21 | 5.4.3. AES-Based Header Protection . . . . . . . . . . . . . 23 | |||
| 5.7. Receiving Out-of-Order Protected Frames . . . . . . . . . 21 | 5.4.4. ChaCha20-Based Header Protection . . . . . . . . . . 24 | |||
| 6. Key Update . . . . . . . . . . . . . . . . . . . . . . . . . 22 | 5.5. Receiving Protected Packets . . . . . . . . . . . . . . . 24 | |||
| 7. Security of Initial Messages . . . . . . . . . . . . . . . . 23 | 5.6. Use of 0-RTT Keys . . . . . . . . . . . . . . . . . . . . 24 | |||
| 8. QUIC-Specific Additions to the TLS Handshake . . . . . . . . 24 | 5.7. Receiving Out-of-Order Protected Frames . . . . . . . . . 25 | |||
| 8.1. Protocol and Version Negotiation . . . . . . . . . . . . 24 | 6. Key Update . . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 8.2. QUIC Transport Parameters Extension . . . . . . . . . . . 25 | 7. Security of Initial Messages . . . . . . . . . . . . . . . . 27 | |||
| 8.3. Removing the EndOfEarlyData Message . . . . . . . . . . . 25 | 8. QUIC-Specific Additions to the TLS Handshake . . . . . . . . 28 | |||
| 9. Security Considerations . . . . . . . . . . . . . . . . . . . 26 | 8.1. Protocol and Version Negotiation . . . . . . . . . . . . 28 | |||
| 9.1. Packet Reflection Attack Mitigation . . . . . . . . . . . 26 | 8.2. QUIC Transport Parameters Extension . . . . . . . . . . . 28 | |||
| 9.2. Peer Denial of Service . . . . . . . . . . . . . . . . . 26 | 8.3. Removing the EndOfEarlyData Message . . . . . . . . . . . 29 | |||
| 9.3. Packet Number Protection Analysis . . . . . . . . . . . . 26 | ||||
| 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 29 | |||
| 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 9.1. Packet Reflection Attack Mitigation . . . . . . . . . . . 29 | |||
| 11.1. Normative References . . . . . . . . . . . . . . . . . . 28 | 9.2. Peer Denial of Service . . . . . . . . . . . . . . . . . 30 | |||
| 11.2. Informative References . . . . . . . . . . . . . . . . . 29 | 9.3. Header Protection Analysis . . . . . . . . . . . . . . . 30 | |||
| 11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 9.4. Key Diversity . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 30 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 32 | |||
| A.1. Since draft-ietf-quic-tls-13 . . . . . . . . . . . . . . 30 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
| A.2. Since draft-ietf-quic-tls-12 . . . . . . . . . . . . . . 30 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 32 | |||
| A.3. Since draft-ietf-quic-tls-11 . . . . . . . . . . . . . . 30 | 11.2. Informative References . . . . . . . . . . . . . . . . . 33 | |||
| A.4. Since draft-ietf-quic-tls-10 . . . . . . . . . . . . . . 30 | 11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| A.5. Since draft-ietf-quic-tls-09 . . . . . . . . . . . . . . 30 | Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 34 | |||
| A.6. Since draft-ietf-quic-tls-08 . . . . . . . . . . . . . . 30 | A.1. Since draft-ietf-quic-tls-14 . . . . . . . . . . . . . . 34 | |||
| A.7. Since draft-ietf-quic-tls-07 . . . . . . . . . . . . . . 31 | A.2. Since draft-ietf-quic-tls-13 . . . . . . . . . . . . . . 34 | |||
| A.8. Since draft-ietf-quic-tls-05 . . . . . . . . . . . . . . 31 | A.3. Since draft-ietf-quic-tls-12 . . . . . . . . . . . . . . 34 | |||
| A.9. Since draft-ietf-quic-tls-04 . . . . . . . . . . . . . . 31 | A.4. Since draft-ietf-quic-tls-11 . . . . . . . . . . . . . . 35 | |||
| A.10. Since draft-ietf-quic-tls-03 . . . . . . . . . . . . . . 31 | A.5. Since draft-ietf-quic-tls-10 . . . . . . . . . . . . . . 35 | |||
| A.11. Since draft-ietf-quic-tls-02 . . . . . . . . . . . . . . 31 | A.6. Since draft-ietf-quic-tls-09 . . . . . . . . . . . . . . 35 | |||
| A.12. Since draft-ietf-quic-tls-01 . . . . . . . . . . . . . . 31 | A.7. Since draft-ietf-quic-tls-08 . . . . . . . . . . . . . . 35 | |||
| A.13. Since draft-ietf-quic-tls-00 . . . . . . . . . . . . . . 32 | A.8. Since draft-ietf-quic-tls-07 . . . . . . . . . . . . . . 35 | |||
| A.14. Since draft-thomson-quic-tls-01 . . . . . . . . . . . . . 32 | A.9. Since draft-ietf-quic-tls-05 . . . . . . . . . . . . . . 35 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 32 | A.10. Since draft-ietf-quic-tls-04 . . . . . . . . . . . . . . 35 | |||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 32 | A.11. Since draft-ietf-quic-tls-03 . . . . . . . . . . . . . . 36 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 32 | A.12. Since draft-ietf-quic-tls-02 . . . . . . . . . . . . . . 36 | |||
| A.13. Since draft-ietf-quic-tls-01 . . . . . . . . . . . . . . 36 | ||||
| A.14. Since draft-ietf-quic-tls-00 . . . . . . . . . . . . . . 36 | ||||
| A.15. Since draft-thomson-quic-tls-01 . . . . . . . . . . . . . 37 | ||||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 37 | ||||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 37 | ||||
| 1. Introduction | 1. Introduction | |||
| This document describes how QUIC [QUIC-TRANSPORT] is secured using | This document describes how QUIC [QUIC-TRANSPORT] is secured using | |||
| Transport Layer Security (TLS) version 1.3 [TLS13]. TLS 1.3 provides | TLS [TLS13]. | |||
| critical latency improvements for connection establishment over | ||||
| previous versions. Absent packet loss, most new connections can be | ||||
| established and secured within a single round trip; on subsequent | ||||
| connections between the same client and server, the client can often | ||||
| send application data immediately, that is, using a zero round trip | ||||
| setup. | ||||
| This document describes how the standardized TLS 1.3 acts as a | TLS 1.3 provides critical latency improvements for connection | |||
| security component of QUIC. | establishment over previous versions. Absent packet loss, most new | |||
| connections can be established and secured within a single round | ||||
| trip; on subsequent connections between the same client and server, | ||||
| the client can often send application data immediately, that is, | ||||
| using a zero round trip setup. | ||||
| This document describes how TLS acts as a security component of QUIC. | ||||
| 2. Notational Conventions | 2. Notational 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 BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| This document uses the terminology established in [QUIC-TRANSPORT]. | This document uses the terminology established in [QUIC-TRANSPORT]. | |||
| For brevity, the acronym TLS is used to refer to TLS 1.3. | For brevity, the acronym TLS is used to refer to TLS 1.3, though a | |||
| newer version could be used (see Section 4.2). | ||||
| 2.1. TLS Overview | 2.1. TLS Overview | |||
| TLS provides two endpoints with a way to establish a means of | TLS provides two endpoints with a way to establish a means of | |||
| communication over an untrusted medium (that is, the Internet) that | communication over an untrusted medium (that is, the Internet) that | |||
| ensures that messages they exchange cannot be observed, modified, or | ensures that messages they exchange cannot be observed, modified, or | |||
| forged. | forged. | |||
| Internally, TLS is a layered protocol, with the structure shown | Internally, TLS is a layered protocol, with the structure shown | |||
| below: | below: | |||
| skipping to change at page 5, line 5 ¶ | skipping to change at page 5, line 15 ¶ | |||
| After completing the TLS handshake, the client will have learned and | After completing the TLS handshake, the client will have learned and | |||
| authenticated an identity for the server and the server is optionally | authenticated an identity for the server and the server is optionally | |||
| able to learn and authenticate an identity for the client. TLS | able to learn and authenticate an identity for the client. TLS | |||
| supports X.509 [RFC5280] certificate-based authentication for both | supports X.509 [RFC5280] certificate-based authentication for both | |||
| server and client. | server and client. | |||
| The TLS key exchange is resistant to tampering by attackers and it | The TLS key exchange is resistant to tampering by attackers and it | |||
| produces shared secrets that cannot be controlled by either | produces shared secrets that cannot be controlled by either | |||
| participating peer. | participating peer. | |||
| TLS 1.3 provides two basic handshake modes of interest to QUIC: | TLS provides two basic handshake modes of interest to QUIC: | |||
| o A full 1-RTT handshake in which the client is able to send | o A full 1-RTT handshake in which the client is able to send | |||
| application data after one round trip and the server immediately | application data after one round trip and the server immediately | |||
| responds after receiving the first handshake message from the | responds after receiving the first handshake message from the | |||
| client. | client. | |||
| o A 0-RTT handshake in which the client uses information it has | o A 0-RTT handshake in which the client uses information it has | |||
| previously learned about the server to send application data | previously learned about the server to send application data | |||
| immediately. This application data can be replayed by an attacker | immediately. This application data can be replayed by an attacker | |||
| so it MUST NOT carry a self-contained trigger for any non- | so it MUST NOT carry a self-contained trigger for any non- | |||
| idempotent action. | idempotent action. | |||
| A simplified TLS 1.3 handshake with 0-RTT application data is shown | A simplified TLS handshake with 0-RTT application data is shown in | |||
| in Figure 1. Note that this omits the EndOfEarlyData message, which | Figure 1. Note that this omits the EndOfEarlyData message, which is | |||
| is not used in QUIC (see Section 8.3). | not used in QUIC (see Section 8.3). | |||
| Client Server | Client Server | |||
| ClientHello | ClientHello | |||
| (0-RTT Application Data) --------> | (0-RTT Application Data) --------> | |||
| ServerHello | ServerHello | |||
| {EncryptedExtensions} | {EncryptedExtensions} | |||
| {Finished} | {Finished} | |||
| <-------- [Application Data] | <-------- [Application Data] | |||
| {Finished} --------> | {Finished} --------> | |||
| skipping to change at page 6, line 14 ¶ | skipping to change at page 6, line 25 ¶ | |||
| The 0-RTT handshake is only possible if the client and server have | The 0-RTT handshake is only possible if the client and server have | |||
| previously communicated. In the 1-RTT handshake, the client is | previously communicated. In the 1-RTT handshake, the client is | |||
| unable to send protected application data until it has received all | unable to send protected application data until it has received all | |||
| of the handshake messages sent by the server. | of the handshake messages sent by the server. | |||
| 3. Protocol Overview | 3. Protocol Overview | |||
| QUIC [QUIC-TRANSPORT] assumes responsibility for the confidentiality | QUIC [QUIC-TRANSPORT] assumes responsibility for the confidentiality | |||
| and integrity protection of packets. For this it uses keys derived | and integrity protection of packets. For this it uses keys derived | |||
| from a TLS 1.3 handshake [TLS13], but instead of carrying TLS records | from a TLS handshake [TLS13], but instead of carrying TLS records | |||
| over QUIC (as with TCP), TLS Handshake and Alert messages are carried | over QUIC (as with TCP), TLS Handshake and Alert messages are carried | |||
| directly over the QUIC transport, which takes over the | directly over the QUIC transport, which takes over the | |||
| responsibilities of the TLS record layer, as shown below. | responsibilities of the TLS record layer, as shown below. | |||
| +--------------+--------------+ +-------------+ | +--------------+--------------+ +-------------+ | |||
| | TLS | TLS | | QUIC | | | TLS | TLS | | QUIC | | |||
| | Handshake | Alerts | | Applications| | | Handshake | Alerts | | Applications| | |||
| | | | | (h2q, etc.) | | | | | | (h2q, etc.) | | |||
| +--------------+--------------+-+-------------+ | +--------------+--------------+-+-------------+ | |||
| | | | | | | |||
| | QUIC Transport | | | QUIC Transport | | |||
| | (streams, reliability, congestion, etc.) | | | (streams, reliability, congestion, etc.) | | |||
| | | | | | | |||
| +---------------------------------------------+ | +---------------------------------------------+ | |||
| | | | | | | |||
| | QUIC Packet Protection | | | QUIC Packet Protection | | |||
| | | | | | | |||
| +---------------------------------------------+ | +---------------------------------------------+ | |||
| QUIC also relies on TLS 1.3 for authentication and negotiation of | QUIC also relies on TLS for authentication and negotiation of | |||
| parameters that are critical to security and performance. | parameters that are critical to security and performance. | |||
| Rather than a strict layering, these two protocols are co-dependent: | Rather than a strict layering, these two protocols are co-dependent: | |||
| QUIC uses the TLS handshake; TLS uses the reliability, ordered | QUIC uses the TLS handshake; TLS uses the reliability, ordered | |||
| delivery, and record layer provided by QUIC. | delivery, and record layer provided by QUIC. | |||
| At a high level, there are two main interactions between the TLS and | At a high level, there are two main interactions between the TLS and | |||
| QUIC components: | QUIC components: | |||
| o The TLS component sends and receives messages via the QUIC | o The TLS component sends and receives messages via the QUIC | |||
| skipping to change at page 7, line 42 ¶ | skipping to change at page 8, line 5 ¶ | |||
| QUIC carries TLS handshake data in CRYPTO frames, each of which | QUIC carries TLS handshake data in CRYPTO frames, each of which | |||
| consists of a contiguous block of handshake data identified by an | consists of a contiguous block of handshake data identified by an | |||
| offset and length. Those frames are packaged into QUIC packets and | offset and length. Those frames are packaged into QUIC packets and | |||
| encrypted under the current TLS encryption level. As with TLS over | encrypted under the current TLS encryption level. As with TLS over | |||
| TCP, once TLS handshake data has been delivered to QUIC, it is QUIC's | TCP, once TLS handshake data has been delivered to QUIC, it is QUIC's | |||
| responsibility to deliver it reliably. Each chunk of data that is | responsibility to deliver it reliably. Each chunk of data that is | |||
| produced by TLS is associated with the set of keys that TLS is | produced by TLS is associated with the set of keys that TLS is | |||
| currently using. If QUIC needs to retransmit that data, it MUST use | currently using. If QUIC needs to retransmit that data, it MUST use | |||
| the same keys even if TLS has already updated to newer keys. | the same keys even if TLS has already updated to newer keys. | |||
| One important difference between TLS 1.3 records (used with TCP) and | One important difference between TLS records (used with TCP) and QUIC | |||
| QUIC CRYPTO frames is that in QUIC multiple frames may appear in the | CRYPTO frames is that in QUIC multiple frames may appear in the same | |||
| same QUIC packet as long as they are associated with the same | QUIC packet as long as they are associated with the same encryption | |||
| encryption level. For instance, an implementation might bundle a | level. For instance, an implementation might bundle a Handshake | |||
| Handshake message and an ACK for some Handshake data into the same | message and an ACK for some Handshake data into the same packet. | |||
| packet. | ||||
| Each encryption level has a specific list of frames which may appear | Each encryption level has a specific list of frames which may appear | |||
| in it. The rules here generalize those of TLS, in that frames | in it. The rules here generalize those of TLS, in that frames | |||
| associated with establishing the connection can usually appear at any | associated with establishing the connection can usually appear at any | |||
| encryption level, whereas those associated with transferring data can | encryption level, whereas those associated with transferring data can | |||
| only appear in the 0-RTT and 1-RTT encryption levels: | only appear in the 0-RTT and 1-RTT encryption levels: | |||
| o CRYPTO frames MAY appear in packets of any encryption level except | o CRYPTO frames MAY appear in packets of any encryption level except | |||
| 0-RTT. | 0-RTT. | |||
| o CONNECTION_CLOSE MAY appear in packets of any encryption level | o CONNECTION_CLOSE MAY appear in packets of any encryption level | |||
| other than 0-RTT. | other than 0-RTT. | |||
| o APPLICATION_CLOSE MAY appear in packets of any encryption level | ||||
| other than Initial and 0-RTT. | ||||
| o PADDING frames MAY appear in packets of any encryption level. | o PADDING frames MAY appear in packets of any encryption level. | |||
| o ACK frames MAY appear in packets of any encryption level other | o ACK frames MAY appear in packets of any encryption level other | |||
| than 0-RTT, but can only acknowledge packets which appeared in | than 0-RTT, but can only acknowledge packets which appeared in | |||
| that packet number space. | that packet number space. | |||
| o STREAM frames MUST ONLY appear in the 0-RTT and 1-RTT levels. | o STREAM frames MUST ONLY appear in the 0-RTT and 1-RTT levels. | |||
| o All other frame types MUST only appear at the 1-RTT levels. | o All other frame types MUST only appear at the 1-RTT levels. | |||
| skipping to change at page 8, line 48 ¶ | skipping to change at page 9, line 21 ¶ | |||
| | | | | | | | | | | |||
| | Handshake | Handshake | Handshake | | | Handshake | Handshake | Handshake | | |||
| | | | | | | | | | | |||
| | Retry | N/A | N/A | | | Retry | N/A | N/A | | |||
| | | | | | | | | | | |||
| | Short Header | 1-RTT | 0/1-RTT | | | Short Header | 1-RTT | 0/1-RTT | | |||
| +-----------------+------------------+-----------+ | +-----------------+------------------+-----------+ | |||
| Table 1: Encryption Levels by Packet Type | Table 1: Encryption Levels by Packet Type | |||
| Section 6.5 of [QUIC-TRANSPORT] shows how packets at the various | Section 17 of [QUIC-TRANSPORT] shows how packets at the various | |||
| encryption levels fit into the handshake process. | encryption levels fit into the handshake process. | |||
| 4.1. Interface to TLS | 4.1. Interface to TLS | |||
| As shown in Figure 2, the interface from QUIC to TLS consists of | As shown in Figure 2, the interface from QUIC to TLS consists of | |||
| three primary functions: | three primary functions: | |||
| o Sending and receiving handshake messages | o Sending and receiving handshake messages | |||
| o Rekeying (both transmit and receive) | o Rekeying (both transmit and receive) | |||
| skipping to change at page 9, line 28 ¶ | skipping to change at page 9, line 47 ¶ | |||
| 4.1.1. Sending and Receiving Handshake Messages | 4.1.1. Sending and Receiving Handshake Messages | |||
| In order to drive the handshake, TLS depends on being able to send | In order to drive the handshake, TLS depends on being able to send | |||
| and receive handshake messages. There are two basic functions on | and receive handshake messages. There are two basic functions on | |||
| this interface: one where QUIC requests handshake messages and one | this interface: one where QUIC requests handshake messages and one | |||
| where QUIC provides handshake packets. | where QUIC provides handshake packets. | |||
| Before starting the handshake QUIC provides TLS with the transport | Before starting the handshake QUIC provides TLS with the transport | |||
| parameters (see Section 8.2) that it wishes to carry. | parameters (see Section 8.2) that it wishes to carry. | |||
| A QUIC client starts TLS by requesting TLS handshake octets from TLS. | A QUIC client starts TLS by requesting TLS handshake bytes from TLS. | |||
| The client acquires handshake octets before sending its first packet. | The client acquires handshake bytes before sending its first packet. | |||
| A QUIC server starts the process by providing TLS with the client's | A QUIC server starts the process by providing TLS with the client's | |||
| handshake octets. | handshake bytes. | |||
| At any given time, the TLS stack at an endpoint will have a current | At any given time, the TLS stack at an endpoint will have a current | |||
| sending encryption level and receiving encryption level. Each | sending encryption level and receiving encryption level. Each | |||
| encryption level is associated with a different flow of bytes, which | encryption level is associated with a different flow of bytes, which | |||
| is reliably transmitted to the peer in CRYPTO frames. When TLS | is reliably transmitted to the peer in CRYPTO frames. When TLS | |||
| provides handshake octets to be sent, they are appended to the | provides handshake bytes to be sent, they are appended to the current | |||
| current flow and any packet that includes the CRYPTO frame is | flow and any packet that includes the CRYPTO frame is protected using | |||
| protected using keys from the corresponding encryption level. | keys from the corresponding encryption level. | |||
| QUIC takes the unprotected content of TLS handshake records as the | QUIC takes the unprotected content of TLS handshake records as the | |||
| content of CRYPTO frames. TLS record protection is not used by QUIC. | content of CRYPTO frames. TLS record protection is not used by QUIC. | |||
| QUIC assembles CRYPTO frames into QUIC packets, which are protected | QUIC assembles CRYPTO frames into QUIC packets, which are protected | |||
| using QUIC packet protection. | using QUIC packet protection. | |||
| When an endpoint receives a QUIC packet containing a CRYPTO frame | When an endpoint receives a QUIC packet containing a CRYPTO frame | |||
| from the network, it proceeds as follows: | from the network, it proceeds as follows: | |||
| o If the packet was in the TLS receiving encryption level, sequence | o If the packet was in the TLS receiving encryption level, sequence | |||
| skipping to change at page 10, line 4 ¶ | skipping to change at page 10, line 24 ¶ | |||
| content of CRYPTO frames. TLS record protection is not used by QUIC. | content of CRYPTO frames. TLS record protection is not used by QUIC. | |||
| QUIC assembles CRYPTO frames into QUIC packets, which are protected | QUIC assembles CRYPTO frames into QUIC packets, which are protected | |||
| using QUIC packet protection. | using QUIC packet protection. | |||
| When an endpoint receives a QUIC packet containing a CRYPTO frame | When an endpoint receives a QUIC packet containing a CRYPTO frame | |||
| from the network, it proceeds as follows: | from the network, it proceeds as follows: | |||
| o If the packet was in the TLS receiving encryption level, sequence | o If the packet was in the TLS receiving encryption level, sequence | |||
| the data into the input flow as usual. As with STREAM frames, the | the data into the input flow as usual. As with STREAM frames, the | |||
| offset is used to find the proper location in the data sequence. | offset is used to find the proper location in the data sequence. | |||
| If the result of this process is that new data is available, then | If the result of this process is that new data is available, then | |||
| it is delivered to TLS in order. | it is delivered to TLS in order. | |||
| o If the packet is from a previously installed encryption level, it | o If the packet is from a previously installed encryption level, it | |||
| MUST not contain data which extends past the end of previously | MUST not contain data which extends past the end of previously | |||
| received data in that flow. Implementations MUST treat any | received data in that flow. Implementations MUST treat any | |||
| violations of this requirement as a connection error of type | violations of this requirement as a connection error of type | |||
| PROTOCOL_VIOLATION. | PROTOCOL_VIOLATION. | |||
| o If the packet is from a new encryption level, it is saved for | o If the packet is from a new encryption level, it is saved for | |||
| later processing by TLS. Once TLS moves to receiving from this | later processing by TLS. Once TLS moves to receiving from this | |||
| encryption level, saved data can be provided. When providing data | encryption level, saved data can be provided. When providing data | |||
| from any new encryption level to TLS, if there is data from a | from any new encryption level to TLS, if there is data from a | |||
| previous encryption level that TLS has not consumed, this MUST be | previous encryption level that TLS has not consumed, this MUST be | |||
| treated as a connection error of type PROTOCOL_VIOLATION. | treated as a connection error of type PROTOCOL_VIOLATION. | |||
| Each time that TLS is provided with new data, new handshake octets | Each time that TLS is provided with new data, new handshake bytes are | |||
| are requested from TLS. TLS might not provide any octets if the | requested from TLS. TLS might not provide any bytes if the handshake | |||
| handshake messages it has received are incomplete or it has no data | messages it has received are incomplete or it has no data to send. | |||
| to send. | ||||
| Once the TLS handshake is complete, this is indicated to QUIC along | Once the TLS handshake is complete, this is indicated to QUIC along | |||
| with any final handshake octets that TLS needs to send. TLS also | with any final handshake bytes that TLS needs to send. TLS also | |||
| provides QUIC with the transport parameters that the peer advertised | provides QUIC with the transport parameters that the peer advertised | |||
| during the handshake. | during the handshake. | |||
| Once the handshake is complete, TLS becomes passive. TLS can still | Once the handshake is complete, TLS becomes passive. TLS can still | |||
| receive data from its peer and respond in kind, but it will not need | receive data from its peer and respond in kind, but it will not need | |||
| to send more data unless specifically requested - either by an | to send more data unless specifically requested - either by an | |||
| application or QUIC. One reason to send data is that the server | application or QUIC. One reason to send data is that the server | |||
| might wish to provide additional or updated session tickets to a | might wish to provide additional or updated session tickets to a | |||
| client. | client. | |||
| skipping to change at page 11, line 15 ¶ | skipping to change at page 11, line 33 ¶ | |||
| Finished message in multiple packets. This enables immediate | Finished message in multiple packets. This enables immediate | |||
| server processing for those packets. | server processing for those packets. | |||
| 4.1.2. Encryption Level Changes | 4.1.2. Encryption Level Changes | |||
| As keys for new encryption levels become available, TLS provides QUIC | As keys for new encryption levels become available, TLS provides QUIC | |||
| with those keys. Separately, as TLS starts using keys at a given | with those keys. Separately, as TLS starts using keys at a given | |||
| encryption level, TLS indicates to QUIC that it is now reading or | encryption level, TLS indicates to QUIC that it is now reading or | |||
| writing with keys at that encryption level. These events are not | writing with keys at that encryption level. These events are not | |||
| asynchronous; they always occur immediately after TLS is provided | asynchronous; they always occur immediately after TLS is provided | |||
| with new handshake octets, or after TLS produces handshake octets. | with new handshake bytes, or after TLS produces handshake bytes. | |||
| TLS provides QUIC with three items as a new encryption level becomes | ||||
| available: | ||||
| o A secret | ||||
| o An Authenticated Encryption with Associated Data (AEAD) function | ||||
| o A Key Derivation Function (KDF) | ||||
| These values are based on the values that TLS negotiates and are used | ||||
| by QUIC to generate packet and header protection keys (see Section 5 | ||||
| and Section 5.4). | ||||
| If 0-RTT is possible, it is ready after the client sends a TLS | If 0-RTT is possible, it is ready after the client sends a TLS | |||
| ClientHello message or the server receives that message. After | ClientHello message or the server receives that message. After | |||
| providing a QUIC client with the first handshake octets, the TLS | providing a QUIC client with the first handshake bytes, the TLS stack | |||
| stack might signal the change to 0-RTT keys. On the server, after | might signal the change to 0-RTT keys. On the server, after | |||
| receiving handshake octets that contain a ClientHello message, a TLS | receiving handshake bytes that contain a ClientHello message, a TLS | |||
| server might signal that 0-RTT keys are available. | server might signal that 0-RTT keys are available. | |||
| Although TLS only uses one encryption level at a time, QUIC may use | Although TLS only uses one encryption level at a time, QUIC may use | |||
| more than one level. For instance, after sending its Finished | more than one level. For instance, after sending its Finished | |||
| message (using a CRYPTO frame at the Handshake encryption level) an | message (using a CRYPTO frame at the Handshake encryption level) an | |||
| endpoint can send STREAM data (in 1-RTT encryption). If the Finished | endpoint can send STREAM data (in 1-RTT encryption). If the Finished | |||
| message is lost, the endpoint uses the Handshake encryption level to | message is lost, the endpoint uses the Handshake encryption level to | |||
| retransmit the lost message. Reordering or loss of packets can mean | retransmit the lost message. Reordering or loss of packets can mean | |||
| that QUIC will need to handle packets at multiple encryption levels. | that QUIC will need to handle packets at multiple encryption levels. | |||
| During the handshake, this means potentially handling packets at | During the handshake, this means potentially handling packets at | |||
| skipping to change at page 13, line 9 ¶ | skipping to change at page 14, line 9 ¶ | |||
| QUIC are supported by the newer version. | QUIC are supported by the newer version. | |||
| A badly configured TLS implementation could negotiate TLS 1.2 or | A badly configured TLS implementation could negotiate TLS 1.2 or | |||
| another older version of TLS. An endpoint MUST terminate the | another older version of TLS. An endpoint MUST terminate the | |||
| connection if a version of TLS older than 1.3 is negotiated. | connection if a version of TLS older than 1.3 is negotiated. | |||
| 4.3. ClientHello Size | 4.3. ClientHello Size | |||
| QUIC requires that the first Initial packet from a client contain an | QUIC requires that the first Initial packet from a client contain an | |||
| entire cryptographic handshake message, which for TLS is the | entire cryptographic handshake message, which for TLS is the | |||
| ClientHello. Though a packet larger than 1200 octets might be | ClientHello. Though a packet larger than 1200 bytes might be | |||
| supported by the path, a client improves the likelihood that a packet | supported by the path, a client improves the likelihood that a packet | |||
| is accepted if it ensures that the first ClientHello message is small | is accepted if it ensures that the first ClientHello message is small | |||
| enough to stay within this limit. | enough to stay within this limit. | |||
| QUIC packet and framing add at least 36 octets of overhead to the | QUIC packet and framing add at least 36 bytes of overhead to the | |||
| ClientHello message. That overhead increases if the client chooses a | ClientHello message. That overhead increases if the client chooses a | |||
| connection ID without zero length. Overheads also do not include the | connection ID without zero length. Overheads also do not include the | |||
| token or a connection ID longer than 8 octets, both of which might be | token or a connection ID longer than 8 bytes, both of which might be | |||
| required if a server sends a Retry packet. | required if a server sends a Retry packet. | |||
| A typical TLS ClientHello can easily fit into a 1200 octet packet. | A typical TLS ClientHello can easily fit into a 1200 byte packet. | |||
| However, in addition to the overheads added by QUIC, there are | However, in addition to the overheads added by QUIC, there are | |||
| several variables that could cause this limit to be exceeded. Large | several variables that could cause this limit to be exceeded. Large | |||
| session tickets, multiple or large key shares, and long lists of | session tickets, multiple or large key shares, and long lists of | |||
| supported ciphers, signature algorithms, versions, QUIC transport | supported ciphers, signature algorithms, versions, QUIC transport | |||
| parameters, and other negotiable parameters and extensions could | parameters, and other negotiable parameters and extensions could | |||
| cause this message to grow. | cause this message to grow. | |||
| For servers, in addition to connection IDs and tokens, the size of | For servers, in addition to connection IDs and tokens, the size of | |||
| TLS session tickets can have an effect on a client's ability to | TLS session tickets can have an effect on a client's ability to | |||
| connect. Minimizing the size of these values increases the | connect. Minimizing the size of these values increases the | |||
| skipping to change at page 14, line 49 ¶ | skipping to change at page 15, line 49 ¶ | |||
| of 0-RTT. | of 0-RTT. | |||
| 4.7. HelloRetryRequest | 4.7. HelloRetryRequest | |||
| In TLS over TCP, the HelloRetryRequest feature (see Section 4.1.4 of | In TLS over TCP, the HelloRetryRequest feature (see Section 4.1.4 of | |||
| [TLS13]) can be used to correct a client's incorrect KeyShare | [TLS13]) can be used to correct a client's incorrect KeyShare | |||
| extension as well as for a stateless round-trip check. From the | extension as well as for a stateless round-trip check. From the | |||
| perspective of QUIC, this just looks like additional messages carried | perspective of QUIC, this just looks like additional messages carried | |||
| in the Initial encryption level. Although it is in principle | in the Initial encryption level. Although it is in principle | |||
| possible to use this feature for address verification in QUIC, QUIC | possible to use this feature for address verification in QUIC, QUIC | |||
| implementations SHOULD instead use the Retry feature (see Section 4.4 | implementations SHOULD instead use the Retry feature (see Section 8.1 | |||
| of [QUIC-TRANSPORT]). HelloRetryRequest is still used to request key | of [QUIC-TRANSPORT]). HelloRetryRequest is still used to request key | |||
| shares. | shares. | |||
| 4.8. TLS Errors | 4.8. TLS Errors | |||
| If TLS experiences an error, it generates an appropriate alert as | If TLS experiences an error, it generates an appropriate alert as | |||
| defined in Section 6 of [TLS13]. | defined in Section 6 of [TLS13]. | |||
| A TLS alert is turned into a QUIC connection error by converting the | A TLS alert is turned into a QUIC connection error by converting the | |||
| one-octet alert description into a QUIC error code. The alert | one-byte alert description into a QUIC error code. The alert | |||
| description is added to 0x100 to produce a QUIC error code from the | description is added to 0x100 to produce a QUIC error code from the | |||
| range reserved for CRYPTO_ERROR. The resulting value is sent in a | range reserved for CRYPTO_ERROR. The resulting value is sent in a | |||
| QUIC CONNECTION_CLOSE frame. | QUIC CONNECTION_CLOSE frame. | |||
| The alert level of all TLS alerts is "fatal"; a TLS stack MUST NOT | The alert level of all TLS alerts is "fatal"; a TLS stack MUST NOT | |||
| generate alerts at the "warning" level. | generate alerts at the "warning" level. | |||
| 4.9. Discarding Unused Keys | 4.9. Discarding Unused Keys | |||
| After QUIC moves to a new encryption level, packet protection keys | After QUIC moves to a new encryption level, packet protection keys | |||
| for previous encryption levels can be discarded. This occurs several | for previous encryption levels can be discarded. This occurs several | |||
| times during the handshake, as well as when keys are updated (see | times during the handshake, as well as when keys are updated (see | |||
| Section 6). | Section 6). Initial packet protection keys are treated specially, | |||
| see Section 4.10. | ||||
| Packet protection keys are not discarded immediately when new keys | Packet protection keys are not discarded immediately when new keys | |||
| are available. If packets from a lower encryption level contain | are available. If packets from a lower encryption level contain | |||
| CRYPTO frames, frames that retransmit that data MUST be sent at the | CRYPTO frames, frames that retransmit that data MUST be sent at the | |||
| same encryption level. Similarly, an endpoint generates | same encryption level. Similarly, an endpoint generates | |||
| acknowledgements for packets at the same encryption level as the | acknowledgements for packets at the same encryption level as the | |||
| packet being acknowledged. Thus, it is possible that keys for a | packet being acknowledged. Thus, it is possible that keys for a | |||
| lower encryption level are needed for a short time after keys for a | lower encryption level are needed for a short time after keys for a | |||
| newer encryption level are available. | newer encryption level are available. | |||
| skipping to change at page 16, line 29 ¶ | skipping to change at page 17, line 30 ¶ | |||
| sent two updates prior will appear to use the same keys. After the | sent two updates prior will appear to use the same keys. After the | |||
| handshake is complete, endpoints only need to maintain the two latest | handshake is complete, endpoints only need to maintain the two latest | |||
| sets of packet protection keys and MAY discard older keys. Updating | sets of packet protection keys and MAY discard older keys. Updating | |||
| keys multiple times rapidly can cause packets to be effectively lost | keys multiple times rapidly can cause packets to be effectively lost | |||
| if packets are significantly delayed. Because key updates can only | if packets are significantly delayed. Because key updates can only | |||
| be performed once per round trip time, only packets that are delayed | be performed once per round trip time, only packets that are delayed | |||
| by more than a round trip will be lost as a result of changing keys; | by more than a round trip will be lost as a result of changing keys; | |||
| such packets will be marked as lost before this, as they leave a gap | such packets will be marked as lost before this, as they leave a gap | |||
| in the sequence of packet numbers. | in the sequence of packet numbers. | |||
| 4.10. Discarding Initial Keys | ||||
| Packets protected with Initial secrets (Section 5.2) are not | ||||
| authenticated, meaning that an attacker could spoof packets with the | ||||
| intent to disrupt a connection. To limit these attacks, Initial | ||||
| packet protection keys can be discarded more aggressively than other | ||||
| keys. | ||||
| The successful use of Handshake packets indicates that no more | ||||
| Initial packets need to be exchanged, as these keys can only be | ||||
| produced after receiving all CRYPTO frames from Initial packets. | ||||
| Thus, a client MUST discard Initial keys when it first sends a | ||||
| Handshake packet and a server MUST discard Initial keys when it first | ||||
| successfully processes a Handshake packet. Endpoints MUST NOT send | ||||
| Initial packets after this point. | ||||
| This results in abandoning loss recovery state for the Initial | ||||
| encryption level and ignoring any outstanding Initial packets. | ||||
| 5. Packet Protection | 5. Packet Protection | |||
| As with TLS over TCP, QUIC protects packets with keys derived from | As with TLS over TCP, QUIC protects packets with keys derived from | |||
| the TLS handshake, using the AEAD algorithm negotiated by TLS. | the TLS handshake, using the AEAD algorithm negotiated by TLS. | |||
| 5.1. Packet Protection Keys | 5.1. Packet Protection Keys | |||
| QUIC derives packet protection keys in the same way that TLS derives | QUIC derives packet protection keys in the same way that TLS derives | |||
| record protection keys. | record protection keys. | |||
| Each encryption level has separate secret values for protection of | Each encryption level has separate secret values for protection of | |||
| packets sent in each direction. These traffic secrets are derived by | packets sent in each direction. These traffic secrets are derived by | |||
| TLS (see Section 7.1 of [TLS13]) and are used by QUIC for all | TLS (see Section 7.1 of [TLS13]) and are used by QUIC for all | |||
| encryption levels except the Initial encryption level. The secrets | encryption levels except the Initial encryption level. The secrets | |||
| for the Initial encryption level are computed based on the client's | for the Initial encryption level are computed based on the client's | |||
| initial Destination Connection ID, as described in Section 5.2. | initial Destination Connection ID, as described in Section 5.2. | |||
| The keys used for packet protection are computed from the TLS secrets | The keys used for packet protection are computed from the TLS secrets | |||
| using the method described in Section 7.3 of [TLS13]), except that | using the KDF provided by TLS. In TLS 1.3, the HKDF-Expand-Label | |||
| the label for HKDF-Expand-Label uses the prefix "quic " rather than | function described in Section 7.1 of [TLS13]) is used, using the hash | |||
| "tls13 ". A different label provides key separation between TLS and | function from the negotiated cipher suite. Other versions of TLS | |||
| QUIC. | MUST provide a similar function in order to be used QUIC. | |||
| For example, where TLS might use a label of | The current encryption level secret and the label "quic key" are | |||
| 0x002009746c733133206b657900 to derive a key, QUIC uses | input to the KDF to produce the AEAD key; the label "quic iv" is used | |||
| 0x00200871756963206b657900. | to derive the IV, see Section 5.3. The header protection key uses | |||
| the "quic hp" label, see Section 5.4). Using these labels provides | ||||
| key separation between QUIC and TLS, see Section 9.4. | ||||
| The HKDF-Expand-Label function with a "quic " label is also used to | The KDF used for initial secrets is always the HKDF-Expand-Label | |||
| derive the initial secrets (see Section 5.2) and to derive a packet | function from TLS 1.3 (see Section 5.2). | |||
| number protection key (the "pn" label, see Section 5.4). | ||||
| 5.2. Initial Secrets | 5.2. Initial Secrets | |||
| Initial packets are protected with a secret derived from the | Initial packets are protected with a secret derived from the | |||
| Destination Connection ID field from the client's first Initial | Destination Connection ID field from the client's first Initial | |||
| packet of the connection. Specifically: | packet of the connection. Specifically: | |||
| initial_salt = 0x9c108f98520a5c5c32968e950e8a2c5fe06d6c38 | initial_salt = 0xef4fb0abb47470c41befcf8031334fae485e09a0 | |||
| initial_secret = HKDF-Extract(initial_salt, | initial_secret = HKDF-Extract(initial_salt, | |||
| client_dst_connection_id) | client_dst_connection_id) | |||
| client_initial_secret = HKDF-Expand-Label(initial_secret, | client_initial_secret = HKDF-Expand-Label(initial_secret, | |||
| "client in", "", | "client in", "", | |||
| Hash.length) | Hash.length) | |||
| server_initial_secret = HKDF-Expand-Label(initial_secret, | server_initial_secret = HKDF-Expand-Label(initial_secret, | |||
| "server in", "", | "server in", "", | |||
| Hash.length) | Hash.length) | |||
| The hash function for HKDF when deriving initial secrets and keys is | The hash function for HKDF when deriving initial secrets and keys is | |||
| SHA-256 [SHA]. | SHA-256 [SHA]. | |||
| The connection ID used with HKDF-Expand-Label is the Destination | The connection ID used with HKDF-Expand-Label is the Destination | |||
| Connection ID in the Initial packet sent by the client. This will be | Connection ID in the Initial packet sent by the client. This will be | |||
| a randomly-selected value unless the client creates the Initial | a randomly-selected value unless the client creates the Initial | |||
| packet after receiving a Retry packet, where the Destination | packet after receiving a Retry packet, where the Destination | |||
| Connection ID is selected by the server. | Connection ID is selected by the server. | |||
| The value of initial_salt is a 20 octet sequence shown in the figure | The value of initial_salt is a 20 byte sequence shown in the figure | |||
| in hexadecimal notation. Future versions of QUIC SHOULD generate a | in hexadecimal notation. Future versions of QUIC SHOULD generate a | |||
| new salt value, thus ensuring that the keys are different for each | new salt value, thus ensuring that the keys are different for each | |||
| version of QUIC. This prevents a middlebox that only recognizes one | version of QUIC. This prevents a middlebox that only recognizes one | |||
| version of QUIC from seeing or modifying the contents of handshake | version of QUIC from seeing or modifying the contents of handshake | |||
| packets from future versions. | packets from future versions. | |||
| The HKDF-Expand-Label function defined in TLS 1.3 MUST be used for | ||||
| Initial packets even where the TLS versions offered do not include | ||||
| TLS 1.3. | ||||
| Note: The Destination Connection ID is of arbitrary length, and it | Note: The Destination Connection ID is of arbitrary length, and it | |||
| could be zero length if the server sends a Retry packet with a | could be zero length if the server sends a Retry packet with a | |||
| zero-length Source Connection ID field. In this case, the Initial | zero-length Source Connection ID field. In this case, the Initial | |||
| keys provide no assurance to the client that the server received | keys provide no assurance to the client that the server received | |||
| its packet; the client has to rely on the exchange that included | its packet; the client has to rely on the exchange that included | |||
| the Retry packet for that property. | the Retry packet for that property. | |||
| 5.3. AEAD Usage | 5.3. AEAD Usage | |||
| The Authentication Encryption with Associated Data (AEAD) [AEAD] | The Authentication Encryption with Associated Data (AEAD) [AEAD] | |||
| function used for QUIC packet protection is the AEAD that is | function used for QUIC packet protection is the AEAD that is | |||
| negotiated for use with the TLS connection. For example, if TLS is | negotiated for use with the TLS connection. For example, if TLS is | |||
| using the TLS_AES_128_GCM_SHA256, the AEAD_AES_128_GCM function is | using the TLS_AES_128_GCM_SHA256, the AEAD_AES_128_GCM function is | |||
| used. | used. | |||
| QUIC packets are protected prior to applying packet number protection | Packets are protected prior to applying header protection | |||
| (Section 5.4). The unprotected packet number is part of the | (Section 5.4). The unprotected packet header is part of the | |||
| associated data (A). When removing packet protection, an endpoint | associated data (A). When removing packet protection, an endpoint | |||
| first removes the protection from the packet number. | first removes the header protection. | |||
| All QUIC packets other than Version Negotiation and Retry packets are | All QUIC packets other than Version Negotiation and Retry packets are | |||
| protected with an AEAD algorithm [AEAD]. Prior to establishing a | protected with an AEAD algorithm [AEAD]. Prior to establishing a | |||
| shared secret, packets are protected with AEAD_AES_128_GCM and a key | shared secret, packets are protected with AEAD_AES_128_GCM and a key | |||
| derived from the destination connection ID in the client's first | derived from the destination connection ID in the client's first | |||
| Initial packet (see Section 5.2). This provides protection against | Initial packet (see Section 5.2). This provides protection against | |||
| off-path attackers and robustness against QUIC version unaware | off-path attackers and robustness against QUIC version unaware | |||
| middleboxes, but not against on-path attackers. | middleboxes, but not against on-path attackers. | |||
| All ciphersuites currently defined for TLS 1.3 - and therefore QUIC - | QUIC can use any of the ciphersuites defined in [TLS13] with the | |||
| have a 16-byte authentication tag and produce an output 16 bytes | exception of TLS_AES_128_CCM_8_SHA256. The AEAD for that | |||
| larger than their input. | ciphersuite, AEAD_AES_128_CCM_8 [CCM], does not produce a large | |||
| enough authentication tag for use with the header protection designs | ||||
| provided (see Section 5.4). All other ciphersuites defined in | ||||
| [TLS13] have a 16-byte authentication tag and produce an output 16 | ||||
| bytes larger than their input. | ||||
| The key and IV for the packet are computed as described in | The key and IV for the packet are computed as described in | |||
| Section 5.1. The nonce, N, is formed by combining the packet | Section 5.1. The nonce, N, is formed by combining the packet | |||
| protection IV with the packet number. The 64 bits of the | protection IV with the packet number. The 64 bits of the | |||
| reconstructed QUIC packet number in network byte order are left- | reconstructed QUIC packet number in network byte order are left- | |||
| padded with zeros to the size of the IV. The exclusive OR of the | padded with zeros to the size of the IV. The exclusive OR of the | |||
| padded packet number and the IV forms the AEAD nonce. | padded packet number and the IV forms the AEAD nonce. | |||
| The associated data, A, for the AEAD is the contents of the QUIC | The associated data, A, for the AEAD is the contents of the QUIC | |||
| header, starting from the flags octet in either the short or long | header, starting from the flags byte in either the short or long | |||
| header, up to and including the unprotected packet number. | header, up to and including the unprotected packet number. | |||
| The input plaintext, P, for the AEAD is the content of the QUIC frame | The input plaintext, P, for the AEAD is the payload of the QUIC | |||
| following the header, as described in [QUIC-TRANSPORT]. | packet, as described in [QUIC-TRANSPORT]. | |||
| The output ciphertext, C, of the AEAD is transmitted in place of P. | The output ciphertext, C, of the AEAD is transmitted in place of P. | |||
| Some AEAD functions have limits for how many packets can be encrypted | Some AEAD functions have limits for how many packets can be encrypted | |||
| under the same key and IV (see for example [AEBounds]). This might | under the same key and IV (see for example [AEBounds]). This might | |||
| be lower than the packet number limit. An endpoint MUST initiate a | be lower than the packet number limit. An endpoint MUST initiate a | |||
| key update (Section 6) prior to exceeding any limit set for the AEAD | key update (Section 6) prior to exceeding any limit set for the AEAD | |||
| that is in use. | that is in use. | |||
| 5.4. Packet Number Protection | 5.4. Header Protection | |||
| QUIC packet numbers are protected using a key that is derived from | Parts of QUIC packet headers, in particular the Packet Number field, | |||
| the current set of secrets. The key derived using the "pn" label is | are protected using a key that is derived separate to the packet | |||
| used to protect the packet number from casual observation. The | protection key and IV. The key derived using the "quic hp" label is | |||
| packet number protection algorithm depends on the negotiated AEAD. | used to provide confidentiality protection for those fields that are | |||
| not exposed to on-path elements. | ||||
| Packet number protection is applied after packet protection is | This protection applies to the least-significant bits of the first | |||
| applied (see Section 5.3). The ciphertext of the packet is sampled | byte, plus the Packet Number field. The four least-significant bits | |||
| and used as input to an encryption algorithm. | of the first byte are protected for packets with long headers; the | |||
| five least significant bits of the first byte are protected for | ||||
| packets with short headers. For both header forms, this covers the | ||||
| reserved bits and the Packet Number Length field; the Key Phase bit | ||||
| is also protected for packets with a short header. | ||||
| In sampling the packet ciphertext, the packet number length is | The same header protection key is used for the duration of the | |||
| assumed to be 4 octets (its maximum possible encoded length), unless | connection, with the value not changing after a key update (see | |||
| there is insufficient space in the packet for sampling. The sampled | Section 6). This allows header protection to be used to protect the | |||
| ciphertext starts after allowing for a 4 octet packet number unless | key phase. | |||
| this would cause the sample to extend past the end of the packet. If | ||||
| the sample would extend past the end of the packet, the end of the | ||||
| packet is sampled. | ||||
| For example, the sampled ciphertext for a packet with a short header | This process does not apply to Retry or Version Negotiation packets, | |||
| can be determined by: | which do not contain a protected payload or any of the fields that | |||
| are protected by this process. | ||||
| 5.4.1. Header Protection Application | ||||
| Header protection is applied after packet protection is applied (see | ||||
| Section 5.3). The ciphertext of the packet is sampled and used as | ||||
| input to an encryption algorithm. The algorithm used depends on the | ||||
| negotiated AEAD. | ||||
| The output of this algorithm is a 5 byte mask which is applied to the | ||||
| protected header fields using exclusive OR. The least significant | ||||
| bits of the first byte of the packet are masked by the least | ||||
| significant bits of the first mask byte, and the packet number is | ||||
| masked with the remaining bytes. Any unused bytes of mask that might | ||||
| result from a shorter packet number encoding are unused. | ||||
| Figure 4 shows a sample algorithm for applying header protection. | ||||
| Removing header protection only differs in the order in which the | ||||
| packet number length (pn_length) is determined. | ||||
| mask = header_protection(hp_key, sample) | ||||
| pn_length = (packet[0] & 0x03) + 1 | ||||
| if (packet[0] & 0x80) == 0x80: | ||||
| # Long header: 4 bits masked | ||||
| packet[0] ^= mask[0] & 0x0f | ||||
| else: | ||||
| # Short header: 5 bits masked | ||||
| packet[0] ^= mask[0] & 0x1f | ||||
| # pn_offset is the start of the Packet Number field. | ||||
| packet[pn_offset:pn_offset+pn_length] ^= mask[1:1+pn_length] | ||||
| Figure 4: Header Protection Pseudocode | ||||
| Figure 5 shows the protected fields of long and short headers marked | ||||
| with an E. Figure 5 also shows the sampled fields. | ||||
| Long Header: | ||||
| +-+-+-+-+-+-+-+-+ | ||||
| |1|1|T T|E E E E| | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Version -> Length Fields ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Short Header: | ||||
| +-+-+-+-+-+-+-+-+ | ||||
| |0|1|S|E E E E E| | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Destination Connection ID (0/32..144) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Common Fields: | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| |E E E E E E E E E Packet Number (8/16/24/32) E E E E E E E E... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | [Protected Payload (8/16/24)] ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Sampled part of Protected Payload (128) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Protected Payload Remainder (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 5: Header Protection and Ciphertext Sample | ||||
| Before a TLS ciphersuite can be used with QUIC, a header protection | ||||
| algorithm MUST be specified for the AEAD used with that ciphersuite. | ||||
| This document defines algorithms for AEAD_AES_128_GCM, | ||||
| AEAD_AES_128_CCM, AEAD_AES_256_GCM, AEAD_AES_256_CCM (all AES AEADs | ||||
| are defined in [AEAD]), and AEAD_CHACHA20_POLY1305 [CHACHA]. Prior | ||||
| to TLS selecting a ciphersuite, AES header protection is used | ||||
| (Section 5.4.3), matching the AEAD_AES_128_GCM packet protection. | ||||
| 5.4.2. Header Protection Sample | ||||
| The header protection algorithm uses both the header protection key | ||||
| and a sample of the ciphertext from the packet Payload field. | ||||
| The same number of bytes are always sampled, but an allowance needs | ||||
| to be made for the endpoint removing protection, which will not know | ||||
| the length of the Packet Number field. In sampling the packet | ||||
| ciphertext, the Packet Number field is assumed to be 4 bytes long | ||||
| (its maximum possible encoded length). | ||||
| An endpoint MUST discard packets that are not long enough to contain | ||||
| a complete sample. | ||||
| To ensure that sufficient data is available for sampling, packets are | ||||
| padded so that the combined lengths of the encoded packet number and | ||||
| protected payload is at least 4 bytes longer than the sample required | ||||
| for header protection. For the AEAD functions defined in [TLS13], | ||||
| which have 16-byte expansions and 16-byte header protection samples, | ||||
| this results in needing at least 3 bytes of frames in the unprotected | ||||
| payload if the packet number is encoded on a single byte, or 2 bytes | ||||
| of frames for a 2-byte packet number encoding. | ||||
| The sampled ciphertext for a packet with a short header can be | ||||
| determined by the following pseudocode: | ||||
| sample_offset = 1 + len(connection_id) + 4 | sample_offset = 1 + len(connection_id) + 4 | |||
| if sample_offset + sample_length > packet_length then | ||||
| sample_offset = packet_length - sample_length | ||||
| sample = packet[sample_offset..sample_offset+sample_length] | sample = packet[sample_offset..sample_offset+sample_length] | |||
| For example, for a packet with a short header, an 8 byte connection | ||||
| ID, and protected with AEAD_AES_128_GCM, the sample takes bytes 13 to | ||||
| 28 inclusive (using zero-based indexing). | ||||
| A packet with a long header is sampled in the same way, noting that | A packet with a long header is sampled in the same way, noting that | |||
| multiple QUIC packets might be included in the same UDP datagram and | multiple QUIC packets might be included in the same UDP datagram and | |||
| that each one is handled separately. | that each one is handled separately. | |||
| sample_offset = 6 + len(destination_connection_id) + | sample_offset = 6 + len(destination_connection_id) + | |||
| len(source_connection_id) + | len(source_connection_id) + | |||
| len(payload_length) + 4 | len(payload_length) + 4 | |||
| if packet_type == Initial: | if packet_type == Initial: | |||
| sample_offset += len(token_length) + | sample_offset += len(token_length) + | |||
| len(token) | len(token) | |||
| To ensure that this process does not sample the packet number, packet | sample = packet[sample_offset..sample_offset+sample_length] | |||
| number protection algorithms MUST NOT sample more ciphertext than the | ||||
| minimum expansion of the corresponding AEAD. | ||||
| Packet number protection is applied to the packet number encoded as | ||||
| described in Section 4.11 of [QUIC-TRANSPORT]. Since the length of | ||||
| the packet number is stored in the first octet of the encoded packet | ||||
| number, it may be necessary to progressively decrypt the packet | ||||
| number. | ||||
| Before a TLS ciphersuite can be used with QUIC, a packet protection | ||||
| algorithm MUST be specifed for the AEAD used with that ciphersuite. | ||||
| This document defines algorithms for AEAD_AES_128_GCM, | ||||
| AEAD_AES_128_CCM, AEAD_AES_256_GCM, AEAD_AES_256_CCM (all AES AEADs | ||||
| are defined in [AEAD]), and AEAD_CHACHA20_POLY1305 ([CHACHA]). | ||||
| 5.4.1. AES-Based Packet Number Protection | 5.4.3. AES-Based Header Protection | |||
| This section defines the packet protection algorithm for | This section defines the packet protection algorithm for | |||
| AEAD_AES_128_GCM, AEAD_AES_128_CCM, AEAD_AES_256_GCM, and | AEAD_AES_128_GCM, AEAD_AES_128_CCM, AEAD_AES_256_GCM, and | |||
| AEAD_AES_256_CCM. AEAD_AES_128_GCM and AEAD_AES_128_CCM use 128-bit | AEAD_AES_256_CCM. AEAD_AES_128_GCM and AEAD_AES_128_CCM use 128-bit | |||
| AES [AES] in counter (CTR) mode. AEAD_AES_256_GCM, and | AES [AES] in electronic code-book (ECB) mode. AEAD_AES_256_GCM, and | |||
| AEAD_AES_256_CCM use 256-bit AES in CTR mode. | AEAD_AES_256_CCM use 256-bit AES in ECB mode. | |||
| This algorithm samples 16 octets from the packet ciphertext. This | This algorithm samples 16 bytes from the packet ciphertext. This | |||
| value is used as the counter input to AES-CTR. | value is used as the counter input to AES-ECB. In pseudocode: | |||
| encrypted_pn = AES-CTR(pn_key, sample, packet_number) | mask = AES-ECB(pn_key, sample) | |||
| 5.4.2. ChaCha20-Based Packet Number Protection | 5.4.4. ChaCha20-Based Header Protection | |||
| When AEAD_CHACHA20_POLY1305 is in use, packet number protection uses | When AEAD_CHACHA20_POLY1305 is in use, header protection uses the raw | |||
| the raw ChaCha20 function as defined in Section 2.4 of [CHACHA]. | ChaCha20 function as defined in Section 2.4 of [CHACHA]. This uses a | |||
| This uses a 256-bit key and 16 octets sampled from the packet | 256-bit key and 16 bytes sampled from the packet protection output. | |||
| protection output. | ||||
| The first 4 octets of the sampled ciphertext are interpreted as a | The first 4 bytes of the sampled ciphertext are interpreted as a | |||
| 32-bit number in little-endian order and are used as the block count. | 32-bit number in little-endian order and are used as the block count. | |||
| The remaining 12 octets are interpreted as three concatenated 32-bit | The remaining 12 bytes are interpreted as three concatenated 32-bit | |||
| numbers in little-endian order and used as the nonce. | numbers in little-endian order and used as the nonce. | |||
| The encoded packet number is then encrypted with ChaCha20 directly. | The encryption mask is produced by invoking ChaCha20 to protect 5 | |||
| In pseudocode: | zero bytes. In pseudocode: | |||
| counter = DecodeLE(sample[0..3]) | counter = DecodeLE(sample[0..3]) | |||
| nonce = DecodeLE(sample[4..7], sample[8..11], sample[12..15]) | nonce = DecodeLE(sample[4..7], sample[8..11], sample[12..15]) | |||
| encrypted_pn = ChaCha20(pn_key, counter, nonce, packet_number) | mask = ChaCha20(pn_key, counter, nonce, {0,0,0,0,0}) | |||
| 5.5. Receiving Protected Packets | 5.5. Receiving Protected Packets | |||
| Once an endpoint successfully receives a packet with a given packet | Once an endpoint successfully receives a packet with a given packet | |||
| number, it MUST discard all packets in the same packet number space | number, it MUST discard all packets in the same packet number space | |||
| with higher packet numbers if they cannot be successfully unprotected | with higher packet numbers if they cannot be successfully unprotected | |||
| with either the same key, or - if there is a key update - the next | with either the same key, or - if there is a key update - the next | |||
| packet protection key (see Section 6). Similarly, a packet that | packet protection key (see Section 6). Similarly, a packet that | |||
| appears to trigger a key update, but cannot be unprotected | appears to trigger a key update, but cannot be unprotected | |||
| successfully MUST be discarded. | successfully MUST be discarded. | |||
| skipping to change at page 22, line 38 ¶ | skipping to change at page 26, line 20 ¶ | |||
| equivalent to a fatal TLS alert of unexpected_message (see | equivalent to a fatal TLS alert of unexpected_message (see | |||
| Section 4.8). | Section 4.8). | |||
| An endpoint MUST NOT initiate more than one key update at a time. A | An endpoint MUST NOT initiate more than one key update at a time. A | |||
| new key cannot be used until the endpoint has received and | new key cannot be used until the endpoint has received and | |||
| successfully decrypted a packet with a matching KEY_PHASE. | successfully decrypted a packet with a matching KEY_PHASE. | |||
| A receiving endpoint detects an update when the KEY_PHASE bit does | A receiving endpoint detects an update when the KEY_PHASE bit does | |||
| not match what it is expecting. It creates a new secret (see | not match what it is expecting. It creates a new secret (see | |||
| Section 7.2 of [TLS13]) and the corresponding read key and IV using | Section 7.2 of [TLS13]) and the corresponding read key and IV using | |||
| the same variation on HKDF as defined in Section 5.1; that is, the | the KDF function provided by TLS. The header protection key is not | |||
| prefix "quic " is used in place of "tls13 ". | updated. | |||
| If the packet can be decrypted and authenticated using the updated | If the packet can be decrypted and authenticated using the updated | |||
| key and IV, then the keys the endpoint uses for packet protection are | key and IV, then the keys the endpoint uses for packet protection are | |||
| also updated. The next packet sent by the endpoint will then use the | also updated. The next packet sent by the endpoint will then use the | |||
| new keys. | new keys. | |||
| An endpoint does not always need to send packets when it detects that | An endpoint does not always need to send packets when it detects that | |||
| its peer has updated keys. The next packet that it sends will simply | its peer has updated keys. The next packet that it sends will simply | |||
| use the new keys. If an endpoint detects a second update before it | use the new keys. If an endpoint detects a second update before it | |||
| has sent any packets with updated keys, it indicates that its peer | has sent any packets with updated keys, it indicates that its peer | |||
| has updated keys twice without awaiting a reciprocal update. An | has updated keys twice without awaiting a reciprocal update. An | |||
| endpoint MUST treat consecutive key updates as a fatal error and | endpoint MUST treat consecutive key updates as a fatal error and | |||
| abort the connection. | abort the connection. | |||
| An endpoint SHOULD retain old keys for a short period to allow it to | An endpoint SHOULD retain old keys for a period of no more than three | |||
| decrypt packets with smaller packet numbers than the packet that | times the Probe Timeout (PTO, see [QUIC-RECOVERY]). After this | |||
| triggered the key update. This allows an endpoint to consume packets | period, old keys and their corresponding secrets SHOULD be discarded. | |||
| that are reordered around the transition between keys. Packets with | Retaining keys allow endpoints to process packets that were sent with | |||
| higher packet numbers always use the updated keys and MUST NOT be | old keys and delayed in the network. Packets with higher packet | |||
| decrypted with old keys. | numbers always use the updated keys and MUST NOT be decrypted with | |||
| old keys. | ||||
| Keys and their corresponding secrets SHOULD be discarded when an | ||||
| endpoint has received all packets with packet numbers lower than the | ||||
| lowest packet number used for the new key. An endpoint might discard | ||||
| keys if it determines that the length of the delay to affected | ||||
| packets is excessive. | ||||
| This ensures that once the handshake is complete, packets with the | This ensures that once the handshake is complete, packets with the | |||
| same KEY_PHASE will have the same packet protection keys, unless | same KEY_PHASE will have the same packet protection keys, unless | |||
| there are multiple key updates in a short time frame succession and | there are multiple key updates in a short time frame succession and | |||
| significant packet reordering. | significant packet reordering. | |||
| Initiating Peer Responding Peer | Initiating Peer Responding Peer | |||
| @M QUIC Frames | @M QUIC Frames | |||
| New Keys -> @N | New Keys -> @N | |||
| @N QUIC Frames | @N QUIC Frames | |||
| --------> | --------> | |||
| QUIC Frames @M | QUIC Frames @M | |||
| New Keys -> @N | New Keys -> @N | |||
| QUIC Frames @N | QUIC Frames @N | |||
| <-------- | <-------- | |||
| Figure 4: Key Update | Figure 6: Key Update | |||
| A packet that triggers a key update could arrive after successfully | A packet that triggers a key update could arrive after successfully | |||
| processing a packet with a higher packet number. This is only | processing a packet with a higher packet number. This is only | |||
| possible if there is a key compromise and an attack, or if the peer | possible if there is a key compromise and an attack, or if the peer | |||
| is incorrectly reverting to use of old keys. Because the latter | is incorrectly reverting to use of old keys. Because the latter | |||
| cannot be differentiated from an attack, an endpoint MUST immediately | cannot be differentiated from an attack, an endpoint MUST immediately | |||
| terminate the connection if it detects this condition. | terminate the connection if it detects this condition. | |||
| In deciding when to update keys, endpoints MUST NOT exceed the limits | ||||
| for use of specific keys, as described in Section 5.5 of [TLS13]. | ||||
| 7. Security of Initial Messages | 7. Security of Initial Messages | |||
| Initial packets are not protected with a secret key, so they are | Initial packets are not protected with a secret key, so they are | |||
| subject to potential tampering by an attacker. QUIC provides | subject to potential tampering by an attacker. QUIC provides | |||
| protection against attackers that cannot read packets, but does not | protection against attackers that cannot read packets, but does not | |||
| attempt to provide additional protection against attacks where the | attempt to provide additional protection against attacks where the | |||
| attacker can observe and inject packets. Some forms of tampering - | attacker can observe and inject packets. Some forms of tampering - | |||
| such as modifying the TLS messages themselves - are detectable, but | such as modifying the TLS messages themselves - are detectable, but | |||
| some - such as modifying ACKs - are not. | some - such as modifying ACKs - are not. | |||
| skipping to change at page 26, line 24 ¶ | skipping to change at page 30, line 5 ¶ | |||
| 9.1. Packet Reflection Attack Mitigation | 9.1. Packet Reflection Attack Mitigation | |||
| A small ClientHello that results in a large block of handshake | A small ClientHello that results in a large block of handshake | |||
| messages from a server can be used in packet reflection attacks to | messages from a server can be used in packet reflection attacks to | |||
| amplify the traffic generated by an attacker. | amplify the traffic generated by an attacker. | |||
| QUIC includes three defenses against this attack. First, the packet | QUIC includes three defenses against this attack. First, the packet | |||
| containing a ClientHello MUST be padded to a minimum size. Second, | containing a ClientHello MUST be padded to a minimum size. Second, | |||
| if responding to an unverified source address, the server is | if responding to an unverified source address, the server is | |||
| forbidden to send more than three UDP datagrams in its first flight | forbidden to send more than three UDP datagrams in its first flight | |||
| (see Section 4.7 of [QUIC-TRANSPORT]). Finally, because | (see Section 8.1 of [QUIC-TRANSPORT]). Finally, because | |||
| acknowledgements of Handshake packets are authenticated, a blind | acknowledgements of Handshake packets are authenticated, a blind | |||
| attacker cannot forge them. Put together, these defenses limit the | attacker cannot forge them. Put together, these defenses limit the | |||
| level of amplification. | level of amplification. | |||
| 9.2. Peer Denial of Service | 9.2. Peer Denial of Service | |||
| QUIC, TLS, and HTTP/2 all contain messages that have legitimate uses | QUIC, TLS, and HTTP/2 all contain messages that have legitimate uses | |||
| in some contexts, but that can be abused to cause a peer to expend | in some contexts, but that can be abused to cause a peer to expend | |||
| processing resources without having any observable impact on the | processing resources without having any observable impact on the | |||
| state of the connection. If processing is disproportionately large | state of the connection. If processing is disproportionately large | |||
| skipping to change at page 26, line 47 ¶ | skipping to change at page 30, line 28 ¶ | |||
| without consequence. | without consequence. | |||
| QUIC prohibits the sending of empty "STREAM" frames unless they are | QUIC prohibits the sending of empty "STREAM" frames unless they are | |||
| marked with the FIN bit. This prevents "STREAM" frames from being | marked with the FIN bit. This prevents "STREAM" frames from being | |||
| sent that only waste effort. | sent that only waste effort. | |||
| While there are legitimate uses for some redundant packets, | While there are legitimate uses for some redundant packets, | |||
| implementations SHOULD track redundant packets and treat excessive | implementations SHOULD track redundant packets and treat excessive | |||
| volumes of any non-productive packets as indicative of an attack. | volumes of any non-productive packets as indicative of an attack. | |||
| 9.3. Packet Number Protection Analysis | 9.3. Header Protection Analysis | |||
| Packet number protection relies on the packet protection AEAD being a | Header protection relies on the packet protection AEAD being a | |||
| pseudorandom function (PRF), which is not a property that AEAD | pseudorandom function (PRF), which is not a property that AEAD | |||
| algorithms guarantee. Therefore, no strong assurances about the | algorithms guarantee. Therefore, no strong assurances about the | |||
| general security of this mechanism can be shown in the general case. | general security of this mechanism can be shown in the general case. | |||
| The AEAD algorithms described in this document are assumed to be | The AEAD algorithms described in this document are assumed to be | |||
| PRFs. | PRFs. | |||
| The packet number protection algorithms defined in this document take | The header protection algorithms defined in this document take the | |||
| the form: | form: | |||
| encrypted_pn = packet_number XOR PRF(pn_key, sample) | protected_field = field XOR PRF(pn_key, sample) | |||
| This construction is secure against chosen plaintext attacks (IND- | This construction is secure against chosen plaintext attacks (IND- | |||
| CPA) [IMC]. | CPA) [IMC]. | |||
| Use of the same key and ciphertext sample more than once risks | Use of the same key and ciphertext sample more than once risks | |||
| compromising packet number protection. Protecting two different | compromising header protection. Protecting two different headers | |||
| packet numbers with the same key and ciphertext sample reveals the | with the same key and ciphertext sample reveals the exclusive OR of | |||
| exclusive OR of those packet numbers. Assuming that the AEAD acts as | the protected fields. Assuming that the AEAD acts as a PRF, if L | |||
| a PRF, if L bits are sampled, the odds of two ciphertext samples | bits are sampled, the odds of two ciphertext samples being identical | |||
| being identical approach 2^(-L/2), that is, the birthday bound. For | approach 2^(-L/2), that is, the birthday bound. For the algorithms | |||
| the algorithms described in this document, that probability is one in | described in this document, that probability is one in 2^64. | |||
| 2^64. | ||||
| Note: In some cases, inputs shorter than the full size required by | Note: In some cases, inputs shorter than the full size required by | |||
| the packet protection algorithm might be used. | the packet protection algorithm might be used. | |||
| To prevent an attacker from modifying packet numbers, values of | To prevent an attacker from modifying packet headers, the header is | |||
| packet numbers are transitively authenticated using packet | transitively authenticated using packet protection; the entire packet | |||
| protection; packet numbers are part of the authenticated additional | header is part of the authenticated additional data. Protected | |||
| data. A falsified or modified packet number can only be detected | fields that are falsified or modified can only be detected once the | |||
| once the packet protection is removed. | packet protection is removed. | |||
| An attacker can guess values for packet numbers and have an endpoint | An attacker could guess values for packet numbers and have an | |||
| confirm guesses through timing side channels. If the recipient of a | endpoint confirm guesses through timing side channels. Similarly, | |||
| packet discards packets with duplicate packet numbers without | guesses for the packet number length can be trialed and exposed. If | |||
| attempting to remove packet protection they could reveal through | the recipient of a packet discards packets with duplicate packet | |||
| timing side-channels that the packet number matches a received | numbers without attempting to remove packet protection they could | |||
| packet. For authentication to be free from side-channels, the entire | reveal through timing side-channels that the packet number matches a | |||
| process of packet number protection removal, packet number recovery, | received packet. For authentication to be free from side-channels, | |||
| and packet protection removal MUST be applied together without timing | the entire process of header protection removal, packet number | |||
| and other side-channels. | recovery, and packet protection removal MUST be applied together | |||
| without timing and other side-channels. | ||||
| For the sending of packets, construction and protection of packet | For the sending of packets, construction and protection of packet | |||
| payloads and packet numbers MUST be free from side-channels that | payloads and packet numbers MUST be free from side-channels that | |||
| would reveal the packet number or its encoded size. | would reveal the packet number or its encoded size. | |||
| 9.4. Key Diversity | ||||
| In using TLS, the central key schedule of TLS is used. As a result | ||||
| of the TLS handshake messages being integrated into the calculation | ||||
| of secrets, the inclusion of the QUIC transport parameters extension | ||||
| ensures that handshake and 1-RTT keys are not the same as those that | ||||
| might be produced by a server running TLS over TCP. However, 0-RTT | ||||
| keys only include the ClientHello message and might therefore use the | ||||
| same secrets. To avoid the possibility of cross-protocol key | ||||
| synchronization, additional measures are provided to improve key | ||||
| separation. | ||||
| The QUIC packet protection keys and IVs are derived using a different | ||||
| label than the equivalent keys in TLS. | ||||
| To preserve this separation, a new version of QUIC SHOULD define new | ||||
| labels for key derivation for packet protection key and IV, plus the | ||||
| packet number protection keys. | ||||
| The initial secrets also use a key that is specific to the negotiated | ||||
| QUIC version. New QUIC versions SHOULD define a new salt value used | ||||
| in calculating initial secrets. | ||||
| 10. IANA Considerations | 10. IANA Considerations | |||
| This document does not create any new IANA registries, but it | This document does not create any new IANA registries, but it | |||
| registers the values in the following registries: | registers the values in the following registries: | |||
| o TLS ExtensionsType Registry [TLS-REGISTRIES] - IANA is to register | o TLS ExtensionsType Registry [TLS-REGISTRIES] - IANA is to register | |||
| the quic_transport_parameters extension found in Section 8.2. The | the quic_transport_parameters extension found in Section 8.2. The | |||
| Recommended column is to be marked Yes. The TLS 1.3 Column is to | Recommended column is to be marked Yes. The TLS 1.3 Column is to | |||
| include CH and EE. | include CH and EE. | |||
| skipping to change at page 28, line 28 ¶ | skipping to change at page 32, line 33 ¶ | |||
| [AES] "Advanced encryption standard (AES)", National Institute | [AES] "Advanced encryption standard (AES)", National Institute | |||
| of Standards and Technology report, | of Standards and Technology report, | |||
| DOI 10.6028/nist.fips.197, November 2001. | DOI 10.6028/nist.fips.197, November 2001. | |||
| [CHACHA] Nir, Y. and A. Langley, "ChaCha20 and Poly1305 for IETF | [CHACHA] Nir, Y. and A. Langley, "ChaCha20 and Poly1305 for IETF | |||
| Protocols", RFC 8439, DOI 10.17487/RFC8439, June 2018, | Protocols", RFC 8439, DOI 10.17487/RFC8439, June 2018, | |||
| <https://www.rfc-editor.org/info/rfc8439>. | <https://www.rfc-editor.org/info/rfc8439>. | |||
| [QUIC-RECOVERY] | [QUIC-RECOVERY] | |||
| Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | |||
| and Congestion Control", draft-ietf-quic-recovery-16 (work | and Congestion Control", draft-ietf-quic-recovery-17 (work | |||
| in progress), October 2018. | in progress), December 2018. | |||
| [QUIC-TRANSPORT] | [QUIC-TRANSPORT] | |||
| Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", draft-ietf-quic- | Multiplexed and Secure Transport", draft-ietf-quic- | |||
| transport-16 (work in progress), October 2018. | transport-17 (work in progress), December 2018. | |||
| [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>. | |||
| [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/info/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| [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>. | |||
| [SHA] Dang, Q., "Secure Hash Standard", National Institute of | [SHA] Dang, Q., "Secure Hash Standard", National Institute of | |||
| Standards and Technology report, | Standards and Technology report, | |||
| DOI 10.6028/nist.fips.180-4, July 2015. | DOI 10.6028/nist.fips.180-4, July 2015. | |||
| [TLS-REGISTRIES] | [TLS-REGISTRIES] | |||
| Salowey, J. and S. Turner, "IANA Registry Updates for | Salowey, J. and S. Turner, "IANA Registry Updates for TLS | |||
| Transport Layer Security (TLS) and Datagram Transport | and DTLS", RFC 8447, DOI 10.17487/RFC8447, August 2018, | |||
| Layer Security (DTLS)", draft-ietf-tls-iana-registry- | <https://www.rfc-editor.org/info/rfc8447>. | |||
| updates-05 (work in progress), May 2018. | ||||
| [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| <https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| 11.2. Informative References | 11.2. Informative References | |||
| [AEBounds] | [AEBounds] | |||
| Luykx, A. and K. Paterson, "Limits on Authenticated | Luykx, A. and K. Paterson, "Limits on Authenticated | |||
| Encryption Use in TLS", March 2016, | Encryption Use in TLS", March 2016, | |||
| <http://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | <http://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | |||
| [CCM] McGrew, D. and D. Bailey, "AES-CCM Cipher Suites for | ||||
| Transport Layer Security (TLS)", RFC 6655, | ||||
| DOI 10.17487/RFC6655, July 2012, | ||||
| <https://www.rfc-editor.org/info/rfc6655>. | ||||
| [IMC] Katz, J. and Y. Lindell, "Introduction to Modern | [IMC] Katz, J. and Y. Lindell, "Introduction to Modern | |||
| Cryptography, Second Edition", ISBN 978-1466570269, | Cryptography, Second Edition", ISBN 978-1466570269, | |||
| November 2014. | November 2014. | |||
| [QUIC-HTTP] | [QUIC-HTTP] | |||
| Bishop, M., Ed., "Hypertext Transfer Protocol (HTTP) over | Bishop, M., Ed., "Hypertext Transfer Protocol (HTTP) over | |||
| QUIC", draft-ietf-quic-http-16 (work in progress), October | QUIC", draft-ietf-quic-http-17 (work in progress), | |||
| 2018. | December 2018. | |||
| [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | |||
| DOI 10.17487/RFC2818, May 2000, | DOI 10.17487/RFC2818, May 2000, | |||
| <https://www.rfc-editor.org/info/rfc2818>. | <https://www.rfc-editor.org/info/rfc2818>. | |||
| [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | |||
| Housley, R., and W. Polk, "Internet X.509 Public Key | Housley, R., and W. Polk, "Internet X.509 Public Key | |||
| Infrastructure Certificate and Certificate Revocation List | Infrastructure Certificate and Certificate Revocation List | |||
| (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | |||
| <https://www.rfc-editor.org/info/rfc5280>. | <https://www.rfc-editor.org/info/rfc5280>. | |||
| skipping to change at page 30, line 12 ¶ | skipping to change at page 34, line 20 ¶ | |||
| [3] https://github.com/quicwg/base-drafts/labels/-tls | [3] https://github.com/quicwg/base-drafts/labels/-tls | |||
| Appendix A. Change Log | Appendix A. Change Log | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| Issue and pull request numbers are listed with a leading octothorp. | Issue and pull request numbers are listed with a leading octothorp. | |||
| A.1. Since draft-ietf-quic-tls-13 | A.1. Since draft-ietf-quic-tls-14 | |||
| o Update the salt used for Initial secrets (#1970) | ||||
| o Clarify that TLS_AES_128_CCM_8_SHA256 isn't supported (#2019) | ||||
| o Change header protection | ||||
| * Sample from a fixed offset (#1575, #2030) | ||||
| * Cover part of the first byte, including the key phase (#1322, | ||||
| #2006) | ||||
| o TLS provides an AEAD and KDF function (#2046) | ||||
| * Clarify that the TLS KDF is used with TLS (#1997) | ||||
| * Change the labels for calculation of QUIC keys (#1845, #1971, | ||||
| #1991) | ||||
| o Initial keys are discarded once Handshake are avaialble (#1951, | ||||
| #2045) | ||||
| A.2. Since draft-ietf-quic-tls-13 | ||||
| o Updated to TLS 1.3 final (#1660) | o Updated to TLS 1.3 final (#1660) | |||
| A.2. Since draft-ietf-quic-tls-12 | A.3. Since draft-ietf-quic-tls-12 | |||
| o Changes to integration of the TLS handshake (#829, #1018, #1094, | o Changes to integration of the TLS handshake (#829, #1018, #1094, | |||
| #1165, #1190, #1233, #1242, #1252, #1450) | #1165, #1190, #1233, #1242, #1252, #1450) | |||
| * The cryptographic handshake uses CRYPTO frames, not stream 0 | * The cryptographic handshake uses CRYPTO frames, not stream 0 | |||
| * QUIC packet protection is used in place of TLS record | * QUIC packet protection is used in place of TLS record | |||
| protection | protection | |||
| * Separate QUIC packet number spaces are used for the handshake | * Separate QUIC packet number spaces are used for the handshake | |||
| * Changed Retry to be independent of the cryptographic handshake | * Changed Retry to be independent of the cryptographic handshake | |||
| * Limit the use of HelloRetryRequest to address TLS needs (like | * Limit the use of HelloRetryRequest to address TLS needs (like | |||
| key shares) | key shares) | |||
| o Changed codepoint of TLS extension (#1395, #1402) | o Changed codepoint of TLS extension (#1395, #1402) | |||
| A.3. Since draft-ietf-quic-tls-11 | A.4. Since draft-ietf-quic-tls-11 | |||
| o Encrypted packet numbers. | o Encrypted packet numbers. | |||
| A.4. Since draft-ietf-quic-tls-10 | A.5. Since draft-ietf-quic-tls-10 | |||
| o No significant changes. | o No significant changes. | |||
| A.5. Since draft-ietf-quic-tls-09 | A.6. Since draft-ietf-quic-tls-09 | |||
| o Cleaned up key schedule and updated the salt used for handshake | o Cleaned up key schedule and updated the salt used for handshake | |||
| packet protection (#1077) | packet protection (#1077) | |||
| A.6. Since draft-ietf-quic-tls-08 | A.7. Since draft-ietf-quic-tls-08 | |||
| o Specify value for max_early_data_size to enable 0-RTT (#942) | o Specify value for max_early_data_size to enable 0-RTT (#942) | |||
| o Update key derivation function (#1003, #1004) | o Update key derivation function (#1003, #1004) | |||
| A.7. Since draft-ietf-quic-tls-07 | A.8. Since draft-ietf-quic-tls-07 | |||
| o Handshake errors can be reported with CONNECTION_CLOSE (#608, | o Handshake errors can be reported with CONNECTION_CLOSE (#608, | |||
| #891) | #891) | |||
| A.8. Since draft-ietf-quic-tls-05 | A.9. Since draft-ietf-quic-tls-05 | |||
| No significant changes. | No significant changes. | |||
| A.9. Since draft-ietf-quic-tls-04 | A.10. Since draft-ietf-quic-tls-04 | |||
| o Update labels used in HKDF-Expand-Label to match TLS 1.3 (#642) | o Update labels used in HKDF-Expand-Label to match TLS 1.3 (#642) | |||
| A.10. Since draft-ietf-quic-tls-03 | A.11. Since draft-ietf-quic-tls-03 | |||
| No significant changes. | No significant changes. | |||
| A.11. Since draft-ietf-quic-tls-02 | A.12. Since draft-ietf-quic-tls-02 | |||
| o Updates to match changes in transport draft | o Updates to match changes in transport draft | |||
| A.12. Since draft-ietf-quic-tls-01 | A.13. Since draft-ietf-quic-tls-01 | |||
| o Use TLS alerts to signal TLS errors (#272, #374) | o Use TLS alerts to signal TLS errors (#272, #374) | |||
| o Require ClientHello to fit in a single packet (#338) | o Require ClientHello to fit in a single packet (#338) | |||
| o The second client handshake flight is now sent in the clear (#262, | o The second client handshake flight is now sent in the clear (#262, | |||
| #337) | #337) | |||
| o The QUIC header is included as AEAD Associated Data (#226, #243, | o The QUIC header is included as AEAD Associated Data (#226, #243, | |||
| #302) | #302) | |||
| skipping to change at page 32, line 5 ¶ | skipping to change at page 36, line 38 ¶ | |||
| o Require at least TLS 1.3 (#138) | o Require at least TLS 1.3 (#138) | |||
| o Define transport parameters as a TLS extension (#122) | o Define transport parameters as a TLS extension (#122) | |||
| o Define handling for protected packets before the handshake | o Define handling for protected packets before the handshake | |||
| completes (#39) | completes (#39) | |||
| o Decouple QUIC version and ALPN (#12) | o Decouple QUIC version and ALPN (#12) | |||
| A.13. Since draft-ietf-quic-tls-00 | A.14. Since draft-ietf-quic-tls-00 | |||
| o Changed bit used to signal key phase | o Changed bit used to signal key phase | |||
| o Updated key phase markings during the handshake | o Updated key phase markings during the handshake | |||
| o Added TLS interface requirements section | o Added TLS interface requirements section | |||
| o Moved to use of TLS exporters for key derivation | o Moved to use of TLS exporters for key derivation | |||
| o Moved TLS error code definitions into this document | o Moved TLS error code definitions into this document | |||
| A.14. Since draft-thomson-quic-tls-01 | A.15. Since draft-thomson-quic-tls-01 | |||
| o Adopted as base for draft-ietf-quic-tls | o Adopted as base for draft-ietf-quic-tls | |||
| o Updated authors/editors list | o Updated authors/editors list | |||
| o Added status note | o Added status note | |||
| Acknowledgments | Acknowledgments | |||
| This document has benefited from input from Dragana Damjanovic, | This document has benefited from input from Dragana Damjanovic, | |||
| End of changes. 94 change blocks. | ||||
| 245 lines changed or deleted | 421 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||