| draft-ietf-quic-tls-23.txt | draft-ietf-quic-tls-24.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: March 15, 2020 sn3rd | Expires: May 7, 2020 sn3rd | |||
| September 12, 2019 | November 04, 2019 | |||
| Using TLS to Secure QUIC | Using TLS to Secure QUIC | |||
| draft-ietf-quic-tls-23 | draft-ietf-quic-tls-24 | |||
| 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 March 15, 2020. | This Internet-Draft will expire on May 7, 2020. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 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 . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. Notational Conventions . . . . . . . . . . . . . . . . . . . 4 | 2. Notational Conventions . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.1. TLS Overview . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1. TLS Overview . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 3. Protocol Overview . . . . . . . . . . . . . . . . . . . . . . 6 | 3. Protocol Overview . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 4. Carrying TLS Messages . . . . . . . . . . . . . . . . . . . . 8 | 4. Carrying TLS Messages . . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.1. Interface to TLS . . . . . . . . . . . . . . . . . . . . 9 | 4.1. Interface to TLS . . . . . . . . . . . . . . . . . . . . 10 | |||
| 4.1.1. Handshake Complete . . . . . . . . . . . . . . . . . 10 | 4.1.1. Handshake Complete . . . . . . . . . . . . . . . . . 10 | |||
| 4.1.2. Handshake Confirmed . . . . . . . . . . . . . . . . . 10 | 4.1.2. Handshake Confirmed . . . . . . . . . . . . . . . . . 10 | |||
| 4.1.3. Sending and Receiving Handshake Messages . . . . . . 10 | 4.1.3. Sending and Receiving Handshake Messages . . . . . . 10 | |||
| 4.1.4. Encryption Level Changes . . . . . . . . . . . . . . 12 | 4.1.4. Encryption Level Changes . . . . . . . . . . . . . . 12 | |||
| 4.1.5. TLS Interface Summary . . . . . . . . . . . . . . . . 13 | 4.1.5. TLS Interface Summary . . . . . . . . . . . . . . . . 13 | |||
| 4.2. TLS Version . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.2. TLS Version . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.3. ClientHello Size . . . . . . . . . . . . . . . . . . . . 14 | 4.3. ClientHello Size . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.4. Peer Authentication . . . . . . . . . . . . . . . . . . . 15 | 4.4. Peer Authentication . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.5. Enabling 0-RTT . . . . . . . . . . . . . . . . . . . . . 15 | 4.5. Enabling 0-RTT . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.6. Accepting and Rejecting 0-RTT . . . . . . . . . . . . . . 16 | 4.6. Accepting and Rejecting 0-RTT . . . . . . . . . . . . . . 16 | |||
| 4.7. HelloRetryRequest . . . . . . . . . . . . . . . . . . . . 16 | 4.7. Validating 0-RTT Configuration . . . . . . . . . . . . . 17 | |||
| 4.8. TLS Errors . . . . . . . . . . . . . . . . . . . . . . . 16 | 4.8. HelloRetryRequest . . . . . . . . . . . . . . . . . . . . 17 | |||
| 4.9. Discarding Unused Keys . . . . . . . . . . . . . . . . . 17 | 4.9. TLS Errors . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.9.1. Discarding Initial Keys . . . . . . . . . . . . . . . 17 | 4.10. Discarding Unused Keys . . . . . . . . . . . . . . . . . 18 | |||
| 4.9.2. Discarding Handshake Keys . . . . . . . . . . . . . . 18 | 4.10.1. Discarding Initial Keys . . . . . . . . . . . . . . 18 | |||
| 4.9.3. Discarding 0-RTT Keys . . . . . . . . . . . . . . . . 18 | 4.10.2. Discarding Handshake Keys . . . . . . . . . . . . . 19 | |||
| 5. Packet Protection . . . . . . . . . . . . . . . . . . . . . . 18 | 4.10.3. Discarding 0-RTT Keys . . . . . . . . . . . . . . . 19 | |||
| 5.1. Packet Protection Keys . . . . . . . . . . . . . . . . . 18 | 5. Packet Protection . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 5.2. Initial Secrets . . . . . . . . . . . . . . . . . . . . . 19 | 5.1. Packet Protection Keys . . . . . . . . . . . . . . . . . 20 | |||
| 5.3. AEAD Usage . . . . . . . . . . . . . . . . . . . . . . . 20 | 5.2. Initial Secrets . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 5.4. Header Protection . . . . . . . . . . . . . . . . . . . . 21 | 5.3. AEAD Usage . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 5.4.1. Header Protection Application . . . . . . . . . . . . 22 | 5.4. Header Protection . . . . . . . . . . . . . . . . . . . . 23 | |||
| 5.4.2. Header Protection Sample . . . . . . . . . . . . . . 23 | 5.4.1. Header Protection Application . . . . . . . . . . . . 23 | |||
| 5.4.3. AES-Based Header Protection . . . . . . . . . . . . . 24 | 5.4.2. Header Protection Sample . . . . . . . . . . . . . . 25 | |||
| 5.4.4. ChaCha20-Based Header Protection . . . . . . . . . . 25 | 5.4.3. AES-Based Header Protection . . . . . . . . . . . . . 26 | |||
| 5.5. Receiving Protected Packets . . . . . . . . . . . . . . . 25 | 5.4.4. ChaCha20-Based Header Protection . . . . . . . . . . 26 | |||
| 5.6. Use of 0-RTT Keys . . . . . . . . . . . . . . . . . . . . 25 | 5.5. Receiving Protected Packets . . . . . . . . . . . . . . . 27 | |||
| 5.7. Receiving Out-of-Order Protected Frames . . . . . . . . . 26 | 5.6. Use of 0-RTT Keys . . . . . . . . . . . . . . . . . . . . 27 | |||
| 6. Key Update . . . . . . . . . . . . . . . . . . . . . . . . . 27 | 5.7. Receiving Out-of-Order Protected Frames . . . . . . . . . 28 | |||
| 7. Security of Initial Messages . . . . . . . . . . . . . . . . 29 | 6. Key Update . . . . . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 8. QUIC-Specific Additions to the TLS Handshake . . . . . . . . 30 | 6.1. Initiating a Key Update . . . . . . . . . . . . . . . . . 29 | |||
| 8.1. Protocol Negotiation . . . . . . . . . . . . . . . . . . 30 | 6.2. Responding to a Key Update . . . . . . . . . . . . . . . 30 | |||
| 8.2. QUIC Transport Parameters Extension . . . . . . . . . . . 30 | 6.3. Timing of Receive Key Generation . . . . . . . . . . . . 31 | |||
| 8.3. Removing the EndOfEarlyData Message . . . . . . . . . . . 31 | 6.4. Sending with Updated Keys . . . . . . . . . . . . . . . . 32 | |||
| 9. Security Considerations . . . . . . . . . . . . . . . . . . . 31 | 6.5. Receiving with Different Keys . . . . . . . . . . . . . . 32 | |||
| 9.1. Replay Attacks with 0-RTT . . . . . . . . . . . . . . . . 31 | 6.6. Key Update Frequency . . . . . . . . . . . . . . . . . . 33 | |||
| 9.2. Packet Reflection Attack Mitigation . . . . . . . . . . . 32 | 6.7. Key Update Error Code . . . . . . . . . . . . . . . . . . 33 | |||
| 9.3. Header Protection Analysis . . . . . . . . . . . . . . . 33 | 7. Security of Initial Messages . . . . . . . . . . . . . . . . 33 | |||
| 9.4. Key Diversity . . . . . . . . . . . . . . . . . . . . . . 34 | 8. QUIC-Specific Additions to the TLS Handshake . . . . . . . . 34 | |||
| 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 34 | 8.1. Protocol Negotiation . . . . . . . . . . . . . . . . . . 34 | |||
| 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 34 | 8.2. QUIC Transport Parameters Extension . . . . . . . . . . . 34 | |||
| 11.1. Normative References . . . . . . . . . . . . . . . . . . 34 | 8.3. Removing the EndOfEarlyData Message . . . . . . . . . . . 35 | |||
| 11.2. Informative References . . . . . . . . . . . . . . . . . 36 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 36 | |||
| 11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | 9.1. Replay Attacks with 0-RTT . . . . . . . . . . . . . . . . 36 | |||
| Appendix A. Sample Initial Packet Protection . . . . . . . . . . 36 | 9.2. Packet Reflection Attack Mitigation . . . . . . . . . . . 37 | |||
| A.1. Keys . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | 9.3. Header Protection Analysis . . . . . . . . . . . . . . . 37 | |||
| A.2. Client Initial . . . . . . . . . . . . . . . . . . . . . 38 | 9.4. Header Protection Timing Side-Channels . . . . . . . . . 38 | |||
| A.3. Server Initial . . . . . . . . . . . . . . . . . . . . . 39 | 9.5. Key Diversity . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 40 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 39 | |||
| B.1. Since draft-ietf-quic-tls-22 . . . . . . . . . . . . . . 40 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| B.2. Since draft-ietf-quic-tls-21 . . . . . . . . . . . . . . 40 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 39 | |||
| B.3. Since draft-ietf-quic-tls-20 . . . . . . . . . . . . . . 40 | 11.2. Informative References . . . . . . . . . . . . . . . . . 40 | |||
| B.4. Since draft-ietf-quic-tls-18 . . . . . . . . . . . . . . 40 | 11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| B.5. Since draft-ietf-quic-tls-17 . . . . . . . . . . . . . . 41 | Appendix A. Sample Initial Packet Protection . . . . . . . . . . 41 | |||
| B.6. Since draft-ietf-quic-tls-14 . . . . . . . . . . . . . . 41 | A.1. Keys . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| B.7. Since draft-ietf-quic-tls-13 . . . . . . . . . . . . . . 41 | A.2. Client Initial . . . . . . . . . . . . . . . . . . . . . 43 | |||
| B.8. Since draft-ietf-quic-tls-12 . . . . . . . . . . . . . . 41 | A.3. Server Initial . . . . . . . . . . . . . . . . . . . . . 44 | |||
| B.9. Since draft-ietf-quic-tls-11 . . . . . . . . . . . . . . 42 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 45 | |||
| B.10. Since draft-ietf-quic-tls-10 . . . . . . . . . . . . . . 42 | B.1. Since draft-ietf-quic-tls-23 . . . . . . . . . . . . . . 45 | |||
| B.11. Since draft-ietf-quic-tls-09 . . . . . . . . . . . . . . 42 | B.2. Since draft-ietf-quic-tls-22 . . . . . . . . . . . . . . 45 | |||
| B.12. Since draft-ietf-quic-tls-08 . . . . . . . . . . . . . . 42 | B.3. Since draft-ietf-quic-tls-21 . . . . . . . . . . . . . . 46 | |||
| B.13. Since draft-ietf-quic-tls-07 . . . . . . . . . . . . . . 42 | B.4. Since draft-ietf-quic-tls-20 . . . . . . . . . . . . . . 46 | |||
| B.14. Since draft-ietf-quic-tls-05 . . . . . . . . . . . . . . 42 | B.5. Since draft-ietf-quic-tls-18 . . . . . . . . . . . . . . 46 | |||
| B.15. Since draft-ietf-quic-tls-04 . . . . . . . . . . . . . . 42 | B.6. Since draft-ietf-quic-tls-17 . . . . . . . . . . . . . . 46 | |||
| B.16. Since draft-ietf-quic-tls-03 . . . . . . . . . . . . . . 42 | B.7. Since draft-ietf-quic-tls-14 . . . . . . . . . . . . . . 46 | |||
| B.17. Since draft-ietf-quic-tls-02 . . . . . . . . . . . . . . 42 | B.8. Since draft-ietf-quic-tls-13 . . . . . . . . . . . . . . 47 | |||
| B.18. Since draft-ietf-quic-tls-01 . . . . . . . . . . . . . . 43 | B.9. Since draft-ietf-quic-tls-12 . . . . . . . . . . . . . . 47 | |||
| B.19. Since draft-ietf-quic-tls-00 . . . . . . . . . . . . . . 43 | B.10. Since draft-ietf-quic-tls-11 . . . . . . . . . . . . . . 47 | |||
| B.20. Since draft-thomson-quic-tls-01 . . . . . . . . . . . . . 43 | B.11. Since draft-ietf-quic-tls-10 . . . . . . . . . . . . . . 47 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 44 | B.12. Since draft-ietf-quic-tls-09 . . . . . . . . . . . . . . 47 | |||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 44 | B.13. Since draft-ietf-quic-tls-08 . . . . . . . . . . . . . . 47 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 44 | B.14. Since draft-ietf-quic-tls-07 . . . . . . . . . . . . . . 47 | |||
| B.15. Since draft-ietf-quic-tls-05 . . . . . . . . . . . . . . 48 | ||||
| B.16. Since draft-ietf-quic-tls-04 . . . . . . . . . . . . . . 48 | ||||
| B.17. Since draft-ietf-quic-tls-03 . . . . . . . . . . . . . . 48 | ||||
| B.18. Since draft-ietf-quic-tls-02 . . . . . . . . . . . . . . 48 | ||||
| B.19. Since draft-ietf-quic-tls-01 . . . . . . . . . . . . . . 48 | ||||
| B.20. Since draft-ietf-quic-tls-00 . . . . . . . . . . . . . . 48 | ||||
| B.21. Since draft-thomson-quic-tls-01 . . . . . . . . . . . . . 49 | ||||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
| 1. Introduction | 1. Introduction | |||
| This document describes how QUIC [QUIC-TRANSPORT] is secured using | This document describes how QUIC [QUIC-TRANSPORT] is secured using | |||
| TLS [TLS13]. | TLS [TLS13]. | |||
| TLS 1.3 provides critical latency improvements for connection | TLS 1.3 provides critical latency improvements for connection | |||
| establishment over previous versions. Absent packet loss, most new | establishment over previous versions. Absent packet loss, most new | |||
| connections can be established and secured within a single round | connections can be established and secured within a single round | |||
| trip; on subsequent connections between the same client and server, | trip; on subsequent connections between the same client and server, | |||
| skipping to change at page 4, line 34 ¶ | skipping to change at page 4, line 43 ¶ | |||
| For brevity, the acronym TLS is used to refer to TLS 1.3, though a | For brevity, the acronym TLS is used to refer to TLS 1.3, though a | |||
| newer version could be used (see Section 4.2). | 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 in | |||
| below: | Figure 1. | |||
| +--------------+--------------+--------------+ | +-------------+------------+--------------+---------+ | |||
| | Handshake | Alerts | Application | | Handshake | | | Application | | | |||
| | Layer | | Data | | Layer | Handshake | Alerts | Data | ... | | |||
| | | | | | | | | | | | |||
| +--------------+--------------+--------------+ | +-------------+------------+--------------+---------+ | |||
| | | | Record | | | |||
| | Record Layer | | Layer | Records | | |||
| | | | | | | |||
| +--------------------------------------------+ | +---------------------------------------------------+ | |||
| Each upper layer (handshake, alerts, and application data) is carried | Figure 1: TLS Layers | |||
| as a series of typed TLS records. Records are individually | ||||
| cryptographically protected and then transmitted over a reliable | ||||
| transport (typically TCP) which provides sequencing and guaranteed | ||||
| delivery. | ||||
| Change Cipher Spec records cannot be sent in QUIC. | Each Handshake layer message (e.g., Handshake, Alerts, and | |||
| Application Data) is carried as a series of typed TLS records by the | ||||
| Record layer. Records are individually cryptographically protected | ||||
| and then transmitted over a reliable transport (typically TCP) which | ||||
| provides sequencing and guaranteed delivery. | ||||
| The TLS authenticated key exchange occurs between two entities: | The TLS authenticated key exchange occurs between two endpoints: | |||
| client and server. The client initiates the exchange and the server | client and server. The client initiates the exchange and the server | |||
| responds. If the key exchange completes successfully, both client | responds. If the key exchange completes successfully, both client | |||
| and server will agree on a secret. TLS supports both pre-shared key | and server will agree on a secret. TLS supports both pre-shared key | |||
| (PSK) and Diffie-Hellman (DH) key exchanges. PSK is the basis for | (PSK) and Diffie-Hellman over either finite fields or elliptic curves | |||
| 0-RTT; the latter provides perfect forward secrecy (PFS) when the DH | ((EC)DHE) key exchanges. PSK is the basis for 0-RTT; the latter | |||
| keys are destroyed. | provides perfect forward secrecy (PFS) when the (EC)DHE keys are | |||
| destroyed. | ||||
| 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 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 handshake with 0-RTT application data is shown in | A simplified TLS handshake with 0-RTT application data is shown in | |||
| Figure 1. Note that this omits the EndOfEarlyData message, which is | Figure 2. Note that this omits the EndOfEarlyData message, which is | |||
| not used in QUIC (see Section 8.3). | not used in QUIC (see Section 8.3). Likewise, neither | |||
| ChangeCipherSpec nor KeyUpdate messages are used by QUIC; | ||||
| ChangeCipherSpec is redundant in TLS 1.3 and QUIC has defined its own | ||||
| key update mechanism Section 6. | ||||
| 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} --------> | |||
| [Application Data] <-------> [Application Data] | [Application Data] <-------> [Application Data] | |||
| () Indicates messages protected by early data (0-RTT) keys | () Indicates messages protected by Early Data (0-RTT) Keys | |||
| {} Indicates messages protected using handshake keys | {} Indicates messages protected using Handshake Keys | |||
| [] Indicates messages protected using application data | [] Indicates messages protected using Application Data | |||
| (1-RTT) keys | (1-RTT) Keys | |||
| Figure 1: TLS Handshake with 0-RTT | Figure 2: TLS Handshake with 0-RTT | |||
| Data is protected using a number of encryption levels: | Data is protected using a number of encryption levels: | |||
| o Initial Keys | o Initial Keys | |||
| o Early Data (0-RTT) Keys | o Early Data (0-RTT) Keys | |||
| o Handshake Keys | o Handshake Keys | |||
| o Application Data (1-RTT) Keys | o Application Data (1-RTT) Keys | |||
| Application data may appear only in the early data and application | Application Data may appear only in the Early Data and Application | |||
| data levels. Handshake and Alert messages may appear in any level. | Data levels. Handshake and Alert messages may appear in any level. | |||
| 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 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 in Figure 3. | |||
| +--------------+--------------+ +-------------+ | +--------------+--------------+ +-------------+ | |||
| | TLS | TLS | | QUIC | | | TLS | TLS | | QUIC | | |||
| | Handshake | Alerts | | Applications| | | Handshake | Alerts | | Applications| | |||
| | | | | (h3, etc.) | | | | | | (h3, etc.) | | |||
| +--------------+--------------+-+-------------+ | +--------------+--------------+-+-------------+ | |||
| | | | | | | |||
| | QUIC Transport | | | QUIC Transport | | |||
| | (streams, reliability, congestion, etc.) | | | (streams, reliability, congestion, etc.) | | |||
| | | | | | | |||
| +---------------------------------------------+ | +---------------------------------------------+ | |||
| | | | | | | |||
| | QUIC Packet Protection | | | QUIC Packet Protection | | |||
| | | | | | | |||
| +---------------------------------------------+ | +---------------------------------------------+ | |||
| Figure 3: QUIC Layers | ||||
| QUIC also relies on TLS 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 cooperate: QUIC | |||
| QUIC uses the TLS handshake; TLS uses the reliability, ordered | uses the TLS handshake; TLS uses the reliability, ordered delivery, | |||
| delivery, and record layer provided by QUIC. | 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 | |||
| component, with QUIC providing a reliable stream abstraction to | component, with QUIC providing a reliable stream abstraction to | |||
| TLS. | TLS. | |||
| o The TLS component provides a series of updates to the QUIC | o The TLS component provides a series of updates to the QUIC | |||
| component, including (a) new packet protection keys to install (b) | component, including (a) new packet protection keys to install (b) | |||
| state changes such as handshake completion, the server | state changes such as handshake completion, the server | |||
| certificate, etc. | certificate, etc. | |||
| Figure 2 shows these interactions in more detail, with the QUIC | Figure 4 shows these interactions in more detail, with the QUIC | |||
| packet protection being called out specially. | packet protection being called out specially. | |||
| +------------+ +------------+ | +------------+ +------------+ | |||
| | |<- Handshake Messages ->| | | | |<---- Handshake Messages ----->| | | |||
| | |<---- 0-RTT Keys -------| | | | |<- Validate 0-RTT parameters ->| | | |||
| | |<--- Handshake Keys-----| | | | |<--------- 0-RTT Keys ---------| | | |||
| | QUIC |<---- 1-RTT Keys -------| TLS | | | QUIC |<------- Handshake Keys -------| TLS | | |||
| | |<--- Handshake Done ----| | | | |<--------- 1-RTT Keys ---------| | | |||
| +------------+ +------------+ | | |<------- Handshake Done -------| | | |||
| +------------+ +------------+ | ||||
| | ^ | | ^ | |||
| | Protect | Protected | | Protect | Protected | |||
| v | Packet | v | Packet | |||
| +------------+ | +------------+ | |||
| | QUIC | | | QUIC | | |||
| | Packet | | | Packet | | |||
| | Protection | | | Protection | | |||
| +------------+ | +------------+ | |||
| Figure 2: QUIC and TLS Interactions | Figure 4: QUIC and TLS Interactions | |||
| Unlike TLS over TCP, QUIC applications which want to send data do not | Unlike TLS over TCP, QUIC applications which want to send data do not | |||
| send it through TLS "application_data" records. Rather, they send it | send it through TLS "application_data" records. Rather, they send it | |||
| as QUIC STREAM frames or other frame types which are then carried in | as QUIC STREAM frames or other frame types which are then carried in | |||
| QUIC packets. | QUIC packets. | |||
| 4. Carrying TLS Messages | 4. Carrying TLS Messages | |||
| 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 | |||
| skipping to change at page 8, line 52 ¶ | skipping to change at page 9, line 5 ¶ | |||
| QUIC packet as long as they are associated with the same encryption | QUIC packet as long as they are associated with the same encryption | |||
| level. For instance, an implementation might bundle a Handshake | level. For instance, an implementation might bundle a Handshake | |||
| message and an ACK for some Handshake data into the same packet. | message and an ACK for some Handshake data into the same packet. | |||
| Some frames are prohibited in different encryption levels, others | Some frames are prohibited in different encryption levels, others | |||
| cannot be sent. The rules here generalize those of TLS, in that | cannot be sent. The rules here generalize those of TLS, in that | |||
| frames associated with establishing the connection can usually appear | frames associated with establishing the connection can usually appear | |||
| at any encryption level, whereas those associated with transferring | at any encryption level, whereas those associated with transferring | |||
| data can only appear in the 0-RTT and 1-RTT encryption levels: | data can only appear in the 0-RTT and 1-RTT encryption levels: | |||
| o PADDING frames MAY appear in packets of any encryption level. | o PADDING and PING frames MAY appear in packets of any encryption | |||
| level. | ||||
| o CRYPTO and CONNECTION_CLOSE frames MAY appear in packets of any | o CRYPTO and CONNECTION_CLOSE frames MAY appear in packets of any | |||
| encryption level except 0-RTT. | encryption level except 0-RTT. | |||
| 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 All other frame types MUST only be sent in the 0-RTT and 1-RTT | o All other frame types MUST only be sent in the 0-RTT and 1-RTT | |||
| levels. | levels. | |||
| skipping to change at page 9, line 48 ¶ | skipping to change at page 10, line 7 ¶ | |||
| | 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 17 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 4, the interface from QUIC to TLS consists of four | |||
| three primary functions: | primary functions: | |||
| o Sending and receiving handshake messages | o Sending and receiving handshake messages | |||
| o Processing stored transport and application state from a resumed | ||||
| session and determining if it is valid to accept early data | ||||
| o Rekeying (both transmit and receive) | o Rekeying (both transmit and receive) | |||
| o Handshake state updates | o Handshake state updates | |||
| Additional functions might be needed to configure TLS. | Additional functions might be needed to configure TLS. | |||
| 4.1.1. Handshake Complete | 4.1.1. Handshake Complete | |||
| In this document, the TLS handshake is considered complete when the | In this document, the TLS handshake is considered complete when the | |||
| TLS stack has reported that the handshake is complete. This happens | TLS stack has reported that the handshake is complete. This happens | |||
| skipping to change at page 10, line 48 ¶ | skipping to change at page 11, line 10 ¶ | |||
| 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 bytes from TLS. | A QUIC client starts TLS by requesting TLS handshake bytes from TLS. | |||
| The client acquires handshake bytes 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 bytes. | handshake bytes. | |||
| At any given time, the TLS stack at an endpoint will have a current | At any time, the TLS stack at an endpoint will have a current sending | |||
| sending encryption level and receiving encryption level. Each | encryption level and receiving encryption level. Each encryption | |||
| encryption level is associated with a different flow of bytes, which | level is associated with a different flow of bytes, which is reliably | |||
| is reliably transmitted to the peer in CRYPTO frames. When TLS | transmitted to the peer in CRYPTO frames. When TLS provides | |||
| provides handshake bytes to be sent, they are appended to the current | handshake bytes to be sent, they are appended to the current flow and | |||
| flow and any packet that includes the CRYPTO frame is protected using | any packet that includes the CRYPTO frame is protected using keys | |||
| keys from the corresponding encryption level. | 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. | |||
| QUIC is only capable of conveying TLS handshake records in CRYPTO | ||||
| frames. TLS alerts are turned into QUIC CONNECTION_CLOSE error | ||||
| codes; see Section 4.9. TLS application data and other message types | ||||
| cannot be carried by QUIC at any encryption level and is an error if | ||||
| they are received from the TLS stack. | ||||
| 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 | |||
| skipping to change at page 13, line 17 ¶ | skipping to change at page 13, line 33 ¶ | |||
| packets. | packets. | |||
| QUIC also needs access to keys that might not ordinarily be available | QUIC also needs access to keys that might not ordinarily be available | |||
| to a TLS implementation. For instance, a client might need to | to a TLS implementation. For instance, a client might need to | |||
| acknowledge Handshake packets before it is ready to send CRYPTO | acknowledge Handshake packets before it is ready to send CRYPTO | |||
| frames at that encryption level. TLS therefore needs to provide keys | frames at that encryption level. TLS therefore needs to provide keys | |||
| to QUIC before it might produce them for its own use. | to QUIC before it might produce them for its own use. | |||
| 4.1.5. TLS Interface Summary | 4.1.5. TLS Interface Summary | |||
| Figure 3 summarizes the exchange between QUIC and TLS for both client | Figure 5 summarizes the exchange between QUIC and TLS for both client | |||
| and server. Each arrow is tagged with the encryption level used for | and server. Each arrow is tagged with the encryption level used for | |||
| that transmission. | that transmission. | |||
| Client Server | Client Server | |||
| Get Handshake | Get Handshake | |||
| Initial -------------> | Initial -------------> | |||
| Handshake Received | Handshake Received | |||
| Install tx 0-RTT Keys | Install tx 0-RTT Keys | |||
| 0-RTT ---------------> | 0-RTT ---------------> | |||
| skipping to change at page 13, line 51 ¶ | skipping to change at page 14, line 35 ¶ | |||
| Handshake -----------> | Handshake -----------> | |||
| Handshake Received | Handshake Received | |||
| Install rx 1-RTT keys | Install rx 1-RTT keys | |||
| Handshake Complete | Handshake Complete | |||
| Install 1-RTT keys | Install 1-RTT keys | |||
| 1-RTT ---------------> | 1-RTT ---------------> | |||
| Get Handshake | Get Handshake | |||
| <--------------- 1-RTT | <--------------- 1-RTT | |||
| Handshake Received | Handshake Received | |||
| Figure 3: Interaction Summary between QUIC and TLS | Figure 5: Interaction Summary between QUIC and TLS | |||
| Figure 3 shows the multiple packets that form a single "flight" of | Figure 5 shows the multiple packets that form a single "flight" of | |||
| messages being processed individually, to show what incoming messages | messages being processed individually, to show what incoming messages | |||
| trigger different actions. New handshake messages are requested | trigger different actions. New handshake messages are requested | |||
| after all incoming packets have been processed. This process might | after all incoming packets have been processed. This process might | |||
| vary depending on how QUIC implementations and the packets they | vary depending on how QUIC implementations and the packets they | |||
| receive are structured. | receive are structured. | |||
| 4.2. TLS Version | 4.2. TLS Version | |||
| This document describes how TLS 1.3 [TLS13] is used with QUIC. | This document describes how TLS 1.3 [TLS13] is used with QUIC. | |||
| skipping to change at page 14, line 28 ¶ | skipping to change at page 15, line 11 ¶ | |||
| negotiated if both endpoints support that version. This is | negotiated if both endpoints support that version. This is | |||
| acceptable provided that the features of TLS 1.3 that are used by | acceptable provided that the features of TLS 1.3 that are used by | |||
| 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 | The first Initial packet from a client contains the start or all of | |||
| entire cryptographic handshake message, which for TLS is the | its first cryptographic handshake message, which for TLS is the | |||
| ClientHello. Though a packet larger than 1200 bytes might be | ClientHello. Servers might need to parse the entire ClientHello | |||
| supported by the path, a client improves the likelihood that a packet | (e.g., to access extensions such as Server Name Identification (SNI) | |||
| is accepted if it ensures that the first ClientHello message is small | or Application Layer Protocol Negotiation (ALPN)) in order to decide | |||
| enough to stay within this limit. | whether to accept the new incoming QUIC connection. If the | |||
| ClientHello spans multiple Initial packets, such servers would need | ||||
| to buffer the first received fragments, which could consume excessive | ||||
| resources if the client's address has not yet been validated. To | ||||
| avoid this, servers MAY use the Retry feature (see Section 8.1 of | ||||
| [QUIC-TRANSPORT]) to only buffer partial ClientHello messages from | ||||
| clients with a validated address. | ||||
| QUIC packet and framing add at least 36 bytes 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 bytes, 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 byte 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 efficiently. Minimizing the size of these values increases | |||
| probability that they can be successfully used by a client. | the probability that clients can use them and still fit their | |||
| ClientHello message in their first Initial packet. | ||||
| A client is not required to fit the ClientHello that it sends in | ||||
| response to a HelloRetryRequest message into a single UDP datagram. | ||||
| The TLS implementation does not need to ensure that the ClientHello | The TLS implementation does not need to ensure that the ClientHello | |||
| is sufficiently large. QUIC PADDING frames are added to increase the | is sufficiently large. QUIC PADDING frames are added to increase the | |||
| size of the packet as necessary. | size of the packet as necessary. | |||
| 4.4. Peer Authentication | 4.4. Peer Authentication | |||
| The requirements for authentication depend on the application | The requirements for authentication depend on the application | |||
| protocol that is in use. TLS provides server authentication and | protocol that is in use. TLS provides server authentication and | |||
| permits the server to request client authentication. | permits the server to request client authentication. | |||
| skipping to change at page 15, line 28 ¶ | skipping to change at page 16, line 15 ¶ | |||
| A client MUST authenticate the identity of the server. This | A client MUST authenticate the identity of the server. This | |||
| typically involves verification that the identity of the server is | typically involves verification that the identity of the server is | |||
| included in a certificate and that the certificate is issued by a | included in a certificate and that the certificate is issued by a | |||
| trusted entity (see for example [RFC2818]). | trusted entity (see for example [RFC2818]). | |||
| A server MAY request that the client authenticate during the | A server MAY request that the client authenticate during the | |||
| handshake. A server MAY refuse a connection if the client is unable | handshake. A server MAY refuse a connection if the client is unable | |||
| to authenticate when requested. The requirements for client | to authenticate when requested. The requirements for client | |||
| authentication vary based on application protocol and deployment. | authentication vary based on application protocol and deployment. | |||
| A server MUST NOT use post-handshake client authentication (see | A server MUST NOT use post-handshake client authentication (as | |||
| Section 4.6.2 of [TLS13]). | defined in Section 4.6.2 of [TLS13]), because the multiplexing | |||
| offered by QUIC prevents clients from correlating the certificate | ||||
| request with the application-level event that triggered it (see | ||||
| [HTTP2-TLS13]). More specifically, servers MUST NOT send post- | ||||
| handshake TLS CertificateRequest messages and clients MUST treat | ||||
| receipt of such messages as a connection error of type | ||||
| PROTOCOL_VIOLATION. | ||||
| 4.5. Enabling 0-RTT | 4.5. Enabling 0-RTT | |||
| In order to be usable for 0-RTT, TLS MUST provide a NewSessionTicket | To communicate their willingness to process 0-RTT data, servers send | |||
| message that contains the "early_data" extension with a | a NewSessionTicket message that contains the "early_data" extension | |||
| max_early_data_size of 0xffffffff; the amount of data which the | with a max_early_data_size of 0xffffffff; the amount of data which | |||
| client can send in 0-RTT is controlled by the "initial_max_data" | the client can send in 0-RTT is controlled by the "initial_max_data" | |||
| transport parameter supplied by the server. A client MUST treat | transport parameter supplied by the server. Servers MUST NOT send | |||
| receipt of a NewSessionTicket that contains an "early_data" extension | the "early_data" extension with a max_early_data_size set to any | |||
| with any other value as a connection error of type | value other than 0xffffffff. A client MUST treat receipt of a | |||
| PROTOCOL_VIOLATION. | NewSessionTicket that contains an "early_data" extension with any | |||
| other value as a connection error of type PROTOCOL_VIOLATION. | ||||
| A client that wishes to send 0-RTT packets uses the "early_data" | A client that wishes to send 0-RTT packets uses the "early_data" | |||
| extension in the ClientHello message of a subsequent handshake (see | extension in the ClientHello message of a subsequent handshake (see | |||
| Section 4.2.10 of [TLS13]). It then sends the application data in | Section 4.2.10 of [TLS13]). It then sends the application data in | |||
| 0-RTT packets. | 0-RTT packets. | |||
| Early data within the TLS connection MUST NOT be used. As it is for | ||||
| other TLS application data, a server MUST treat receiving early data | ||||
| on the TLS connection as a connection error of type | ||||
| PROTOCOL_VIOLATION. | ||||
| 4.6. Accepting and Rejecting 0-RTT | 4.6. Accepting and Rejecting 0-RTT | |||
| A server accepts 0-RTT by sending an early_data extension in the | A server accepts 0-RTT by sending an early_data extension in the | |||
| EncryptedExtensions (see Section 4.2.10 of [TLS13]). The server then | EncryptedExtensions (see Section 4.2.10 of [TLS13]). The server then | |||
| processes and acknowledges the 0-RTT packets that it receives. | processes and acknowledges the 0-RTT packets that it receives. | |||
| A server rejects 0-RTT by sending the EncryptedExtensions without an | A server rejects 0-RTT by sending the EncryptedExtensions without an | |||
| early_data extension. A server will always reject 0-RTT if it sends | early_data extension. A server will always reject 0-RTT if it sends | |||
| a TLS HelloRetryRequest. When rejecting 0-RTT, a server MUST NOT | a TLS HelloRetryRequest. When rejecting 0-RTT, a server MUST NOT | |||
| process any 0-RTT packets, even if it could. When 0-RTT was | process any 0-RTT packets, even if it could. When 0-RTT was | |||
| skipping to change at page 16, line 29 ¶ | skipping to change at page 17, line 17 ¶ | |||
| When 0-RTT is rejected, all connection characteristics that the | When 0-RTT is rejected, all connection characteristics that the | |||
| client assumed might be incorrect. This includes the choice of | client assumed might be incorrect. This includes the choice of | |||
| application protocol, transport parameters, and any application | application protocol, transport parameters, and any application | |||
| configuration. The client therefore MUST reset the state of all | configuration. The client therefore MUST reset the state of all | |||
| streams, including application state bound to those streams. | streams, including application state bound to those streams. | |||
| A client MAY attempt to send 0-RTT again if it receives a Retry or | A client MAY attempt to send 0-RTT again if it receives a Retry or | |||
| Version Negotiation packet. These packets do not signify rejection | Version Negotiation packet. These packets do not signify rejection | |||
| of 0-RTT. | of 0-RTT. | |||
| 4.7. HelloRetryRequest | 4.7. Validating 0-RTT Configuration | |||
| When a server receives a ClientHello with the "early_data" extension, | ||||
| it has to decide whether to accept or reject early data from the | ||||
| client. Some of this decision is made by the TLS stack (e.g., | ||||
| checking that the cipher suite being resumed was included in the | ||||
| ClientHello; see Section 4.2.10 of [TLS13]). Even when the TLS stack | ||||
| has no reason to reject early data, the QUIC stack or the application | ||||
| protocol using QUIC might reject early data because the configuration | ||||
| of the transport or application associated with the resumed session | ||||
| is not compatible with the server's current configuration. | ||||
| QUIC requires additional transport state to be associated with a | ||||
| 0-RTT session ticket. One common way to implement this is using | ||||
| stateless session tickets and storing this state in the session | ||||
| ticket. Application protocols that use QUIC might have similar | ||||
| requirements regarding associating or storing state. This associated | ||||
| state is used for deciding whether early data must be rejected. For | ||||
| example, HTTP/3 ([QUIC-HTTP]) settings determine how early data from | ||||
| the client is interpreted. Other applications using QUIC could have | ||||
| different requirements for determining whether to accept or reject | ||||
| early data. | ||||
| 4.8. 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 8.1 | 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.9. 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-byte 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.10. 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. | |||
| 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 | |||
| skipping to change at page 17, line 37 ¶ | skipping to change at page 18, line 48 ¶ | |||
| have been acknowledged by its peer. However, this does not guarantee | have been acknowledged by its peer. However, this does not guarantee | |||
| that no further packets will need to be received or sent at that | that no further packets will need to be received or sent at that | |||
| encryption level because a peer might not have received all the | encryption level because a peer might not have received all the | |||
| acknowledgements necessary to reach the same state. | acknowledgements necessary to reach the same state. | |||
| Though an endpoint might retain older keys, new data MUST be sent at | Though an endpoint might retain older keys, new data MUST be sent at | |||
| the highest currently-available encryption level. Only ACK frames | the highest currently-available encryption level. Only ACK frames | |||
| and retransmissions of data in CRYPTO frames are sent at a previous | and retransmissions of data in CRYPTO frames are sent at a previous | |||
| encryption level. These packets MAY also include PADDING frames. | encryption level. These packets MAY also include PADDING frames. | |||
| 4.9.1. Discarding Initial Keys | 4.10.1. Discarding Initial Keys | |||
| Packets protected with Initial secrets (Section 5.2) are not | Packets protected with Initial secrets (Section 5.2) are not | |||
| authenticated, meaning that an attacker could spoof packets with the | authenticated, meaning that an attacker could spoof packets with the | |||
| intent to disrupt a connection. To limit these attacks, Initial | intent to disrupt a connection. To limit these attacks, Initial | |||
| packet protection keys can be discarded more aggressively than other | packet protection keys can be discarded more aggressively than other | |||
| keys. | keys. | |||
| The successful use of Handshake packets indicates that no more | The successful use of Handshake packets indicates that no more | |||
| Initial packets need to be exchanged, as these keys can only be | Initial packets need to be exchanged, as these keys can only be | |||
| produced after receiving all CRYPTO frames from Initial packets. | produced after receiving all CRYPTO frames from Initial packets. | |||
| Thus, a client MUST discard Initial keys when it first sends a | Thus, a client MUST discard Initial keys when it first sends a | |||
| Handshake packet and a server MUST discard Initial keys when it first | Handshake packet and a server MUST discard Initial keys when it first | |||
| successfully processes a Handshake packet. Endpoints MUST NOT send | successfully processes a Handshake packet. Endpoints MUST NOT send | |||
| Initial packets after this point. | Initial packets after this point. | |||
| This results in abandoning loss recovery state for the Initial | This results in abandoning loss recovery state for the Initial | |||
| encryption level and ignoring any outstanding Initial packets. | encryption level and ignoring any outstanding Initial packets. | |||
| 4.9.2. Discarding Handshake Keys | 4.10.2. Discarding Handshake Keys | |||
| An endpoint MUST NOT discard its handshake keys until the TLS | An endpoint MUST NOT discard its handshake keys until the TLS | |||
| handshake is confirmed (Section 4.1.2). An endpoint SHOULD discard | handshake is confirmed (Section 4.1.2). An endpoint SHOULD discard | |||
| its handshake keys as soon as it has confirmed the handshake. Most | its handshake keys as soon as it has confirmed the handshake. Most | |||
| application protocols will send data after the handshake, resulting | application protocols will send data after the handshake, resulting | |||
| in acknowledgements that allow both endpoints to discard their | in acknowledgements that allow both endpoints to discard their | |||
| handshake keys promptly. Endpoints that do not have reason to send | handshake keys promptly. Endpoints that do not have reason to send | |||
| immediately after completing the handshake MAY send ack-eliciting | immediately after completing the handshake MAY send ack-eliciting | |||
| frames, such as PING, which will cause the handshake to be confirmed | frames, such as PING, which will cause the handshake to be confirmed | |||
| when they are acknowledged. | when they are acknowledged. | |||
| 4.9.3. Discarding 0-RTT Keys | 4.10.3. Discarding 0-RTT Keys | |||
| 0-RTT and 1-RTT packets share the same packet number space, and | 0-RTT and 1-RTT packets share the same packet number space, and | |||
| clients do not send 0-RTT packets after sending a 1-RTT packet | clients do not send 0-RTT packets after sending a 1-RTT packet | |||
| (Section 5.6). | (Section 5.6). | |||
| Therefore, a client SHOULD discard 0-RTT keys as soon as it installs | Therefore, a client SHOULD discard 0-RTT keys as soon as it installs | |||
| 1-RTT keys, since they have no use after that moment. | 1-RTT keys, since they have no use after that moment. | |||
| Additionally, a server MAY discard 0-RTT keys as soon as it receives | Additionally, a server MAY discard 0-RTT keys as soon as it receives | |||
| a 1-RTT packet. However, due to packet reordering, a 0-RTT packet | a 1-RTT packet. However, due to packet reordering, a 0-RTT packet | |||
| skipping to change at page 19, line 18 ¶ | skipping to change at page 20, line 32 ¶ | |||
| 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 KDF provided by TLS. In TLS 1.3, the HKDF-Expand-Label | using the KDF provided by TLS. In TLS 1.3, the HKDF-Expand-Label | |||
| function described in Section 7.1 of [TLS13] is used, using the hash | function described in Section 7.1 of [TLS13] is used, using the hash | |||
| function from the negotiated cipher suite. Other versions of TLS | function from the negotiated cipher suite. Other versions of TLS | |||
| MUST provide a similar function in order to be used with QUIC. | MUST provide a similar function in order to be used with QUIC. | |||
| The current encryption level secret and the label "quic key" are | The current encryption level secret and the label "quic key" are | |||
| input to the KDF to produce the AEAD key; the label "quic iv" is used | input to the KDF to produce the AEAD key; the label "quic iv" is used | |||
| to derive the IV; see Section 5.3. The header protection key uses | 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 | the "quic hp" label; see Section 5.4. Using these labels provides | |||
| key separation between QUIC and TLS; see Section 9.4. | key separation between QUIC and TLS; see Section 9.5. | |||
| The KDF used for initial secrets is always the HKDF-Expand-Label | The KDF used for initial secrets is always the HKDF-Expand-Label | |||
| function from TLS 1.3 (see Section 5.2). | function from TLS 1.3 (see Section 5.2). | |||
| 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 Initial packet. | |||
| packet of the connection. Specifically: | Specifically: | |||
| initial_salt = 0xc3eef712c72ebb5a11a7d2432bb46365bef9f502 | initial_salt = 0xc3eef712c72ebb5a11a7d2432bb46365bef9f502 | |||
| 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", "", | |||
| skipping to change at page 20, line 12 ¶ | skipping to change at page 21, line 25 ¶ | |||
| 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 packets from | version of QUIC from seeing or modifying the contents of packets from | |||
| future versions. | future versions. | |||
| The HKDF-Expand-Label function defined in TLS 1.3 MUST be used for | 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 | Initial packets even where the TLS versions offered do not include | |||
| TLS 1.3. | TLS 1.3. | |||
| Appendix A contains test vectors for the initial packet encryption. | The secrets used for protecting Initial packets change when a server | |||
| sends a Retry packet to use the connection ID value selected by the | ||||
| server. The secrets do not change when a client changes the | ||||
| Destination Connection ID it uses in response to an Initial packet | ||||
| from the server. | ||||
| 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. | |||
| Appendix A contains test vectors for the initial packet encryption. | ||||
| 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. | |||
| Packets are protected prior to applying header protection | Packets are protected prior to applying header protection | |||
| (Section 5.4). The unprotected packet header is part of the | (Section 5.4). The unprotected packet header is part of the | |||
| skipping to change at page 22, line 23 ¶ | skipping to change at page 23, line 44 ¶ | |||
| input to an encryption algorithm. The algorithm used depends on the | input to an encryption algorithm. The algorithm used depends on the | |||
| negotiated AEAD. | negotiated AEAD. | |||
| The output of this algorithm is a 5 byte mask which is applied to the | The output of this algorithm is a 5 byte mask which is applied to the | |||
| protected header fields using exclusive OR. The least significant | protected header fields using exclusive OR. The least significant | |||
| bits of the first byte of the packet are masked by the least | 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 | significant bits of the first mask byte, and the packet number is | |||
| masked with the remaining bytes. Any unused bytes of mask that might | masked with the remaining bytes. Any unused bytes of mask that might | |||
| result from a shorter packet number encoding are unused. | result from a shorter packet number encoding are unused. | |||
| Figure 4 shows a sample algorithm for applying header protection. | Figure 6 shows a sample algorithm for applying header protection. | |||
| Removing header protection only differs in the order in which the | Removing header protection only differs in the order in which the | |||
| packet number length (pn_length) is determined. | packet number length (pn_length) is determined. | |||
| mask = header_protection(hp_key, sample) | mask = header_protection(hp_key, sample) | |||
| pn_length = (packet[0] & 0x03) + 1 | pn_length = (packet[0] & 0x03) + 1 | |||
| if (packet[0] & 0x80) == 0x80: | if (packet[0] & 0x80) == 0x80: | |||
| # Long header: 4 bits masked | # Long header: 4 bits masked | |||
| packet[0] ^= mask[0] & 0x0f | packet[0] ^= mask[0] & 0x0f | |||
| else: | else: | |||
| # Short header: 5 bits masked | # Short header: 5 bits masked | |||
| packet[0] ^= mask[0] & 0x1f | packet[0] ^= mask[0] & 0x1f | |||
| # pn_offset is the start of the Packet Number field. | # pn_offset is the start of the Packet Number field. | |||
| packet[pn_offset:pn_offset+pn_length] ^= mask[1:1+pn_length] | packet[pn_offset:pn_offset+pn_length] ^= mask[1:1+pn_length] | |||
| Figure 4: Header Protection Pseudocode | Figure 6: Header Protection Pseudocode | |||
| Figure 5 shows the protected fields of long and short headers marked | Figure 7 shows the protected fields of long and short headers marked | |||
| with an E. Figure 5 also shows the sampled fields. | with an E. Figure 7 also shows the sampled fields. | |||
| Long Header: | Long Header: | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |1|1|T T|E E E E| | |1|1|T T|E E E E| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Version -> Length Fields ... | | Version -> Length Fields ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Short Header: | Short Header: | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 23, line 30 ¶ | skipping to change at page 24, line 48 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |E E E E E E E E E Packet Number (8/16/24/32) E E E E E E E E... | |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)] ... | | [Protected Payload (8/16/24)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Sampled part of Protected Payload (128) ... | | Sampled part of Protected Payload (128) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Protected Payload Remainder (*) ... | | Protected Payload Remainder (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 5: Header Protection and Ciphertext Sample | Figure 7: Header Protection and Ciphertext Sample | |||
| Before a TLS ciphersuite can be used with QUIC, a header protection | Before a TLS ciphersuite can be used with QUIC, a header protection | |||
| algorithm MUST be specified for the AEAD used with that ciphersuite. | algorithm MUST be specified for the AEAD used with that ciphersuite. | |||
| This document defines algorithms for AEAD_AES_128_GCM, | This document defines algorithms for AEAD_AES_128_GCM, | |||
| AEAD_AES_128_CCM, AEAD_AES_256_GCM (all AES AEADs are defined in | AEAD_AES_128_CCM, AEAD_AES_256_GCM (all AES AEADs are defined in | |||
| [AEAD]), and AEAD_CHACHA20_POLY1305 [CHACHA]. Prior to TLS selecting | [AEAD]), and AEAD_CHACHA20_POLY1305 [CHACHA]. Prior to TLS selecting | |||
| a ciphersuite, AES header protection is used (Section 5.4.3), | a ciphersuite, AES header protection is used (Section 5.4.3), | |||
| matching the AEAD_AES_128_GCM packet protection. | matching the AEAD_AES_128_GCM packet protection. | |||
| 5.4.2. Header Protection Sample | 5.4.2. Header Protection Sample | |||
| skipping to change at page 27, line 4 ¶ | skipping to change at page 28, line 30 ¶ | |||
| o The client has not demonstrated liveness, unless a RETRY packet | o The client has not demonstrated liveness, unless a RETRY packet | |||
| was used. | was used. | |||
| o Any received 0-RTT data that the server responds to might be due | o Any received 0-RTT data that the server responds to might be due | |||
| to a replay attack. | to a replay attack. | |||
| Therefore, the server's use of 1-RTT keys is limited before the | Therefore, the server's use of 1-RTT keys is limited before the | |||
| handshake is complete. A server MUST NOT process data from incoming | handshake is complete. A server MUST NOT process data from incoming | |||
| 1-RTT protected packets before the TLS handshake is complete. | 1-RTT protected packets before the TLS handshake is complete. | |||
| Because sending acknowledgments indicates that all frames in a packet | Because sending acknowledgments indicates that all frames in a packet | |||
| have been processed, a server cannot send acknowledgments for 1-RTT | have been processed, a server cannot send acknowledgments for 1-RTT | |||
| packets until the TLS handshake is complete. Received packets | packets until the TLS handshake is complete. Received packets | |||
| protected with 1-RTT keys MAY be stored and later decrypted and used | protected with 1-RTT keys MAY be stored and later decrypted and used | |||
| once the handshake is complete. | once the handshake is complete. | |||
| The requirement for the server to wait for the client Finished | The requirement for the server to wait for the client Finished | |||
| message creates a dependency on that message being delivered. A | message creates a dependency on that message being delivered. A | |||
| client can avoid the potential for head-of-line blocking that this | client can avoid the potential for head-of-line blocking that this | |||
| implies by sending its 1-RTT packets coalesced with a handshake | implies by sending its 1-RTT packets coalesced with a handshake | |||
| packet containing a copy of the CRYPTO frame that carries the | packet containing a copy of the CRYPTO frame that carries the | |||
| Finished message, until one of the handshake packets is acknowledged. | Finished message, until one of the handshake packets is acknowledged. | |||
| This enables immediate server processing for those packets. | This enables immediate server processing for those packets. | |||
| A server could receive packets protected with 0-RTT keys prior to | A server could receive packets protected with 0-RTT keys prior to | |||
| receiving a TLS ClientHello. The server MAY retain these packets for | receiving a TLS ClientHello. The server MAY retain these packets for | |||
| later decryption in anticipation of receiving a ClientHello. | later decryption in anticipation of receiving a ClientHello. | |||
| 6. Key Update | 6. Key Update | |||
| Once the handshake is confirmed, it is possible to update the keys. | Once the handshake is confirmed (see Section 4.1.2), an endpoint MAY | |||
| The KEY_PHASE bit in the short header is used to indicate whether key | initiate a key update. | |||
| updates have occurred. The KEY_PHASE bit is initially set to 0 and | ||||
| then inverted with each key update. | ||||
| The KEY_PHASE bit allows a recipient to detect a change in keying | The Key Phase bit indicates which packet protection keys are used to | |||
| material without necessarily needing to receive the first packet that | protect the packet. The Key Phase bit is initially set to 0 for the | |||
| triggered the change. An endpoint that notices a changed KEY_PHASE | first set of 1-RTT packets and toggled to signal each subsequent key | |||
| bit can update keys and decrypt the packet that contains the changed | update. | |||
| bit. | ||||
| The Key Phase bit allows a recipient to detect a change in keying | ||||
| material without needing to receive the first packet that triggered | ||||
| the change. An endpoint that notices a changed Key Phase bit updates | ||||
| keys and decrypts the packet that contains the changed value. | ||||
| This mechanism replaces the TLS KeyUpdate message. Endpoints MUST | This mechanism replaces the TLS KeyUpdate message. Endpoints MUST | |||
| NOT send a TLS KeyUpdate message. Endpoints MUST treat the receipt | NOT send a TLS KeyUpdate message. Endpoints MUST treat the receipt | |||
| of a TLS KeyUpdate message as a connection error of type 0x10a, | of a TLS KeyUpdate message as a connection error of type 0x10a, | |||
| 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.9). | |||
| An endpoint MUST NOT initiate the first key update until the | Figure 8 shows a key update process, where the initial set of keys | |||
| handshake is confirmed (Section 4.1.2). An endpoint MUST NOT | used (identified with @M) are replaced by updated keys (identified | |||
| initiate a subsequent key update until it has received an | with @N). The value of the Key Phase bit is indicated in brackets | |||
| acknowledgment for a packet sent at the current KEY_PHASE. This can | []. | |||
| be implemented by tracking the lowest packet number sent with each | ||||
| KEY_PHASE, and the highest acknowledged packet number in the 1-RTT | ||||
| space: once the latter is higher than or equal to the former, another | ||||
| key update can be initiated. | ||||
| Endpoints MAY limit the number of keys they retain to two sets for | Initiating Peer Responding Peer | |||
| removing packet protection and one set for protecting packets. Older | ||||
| keys can be discarded. Updating keys multiple times rapidly can | ||||
| cause packets to be effectively lost if packets are significantly | ||||
| reordered. Therefore, an endpoint SHOULD NOT initiate a key update | ||||
| for some time after it has last updated keys; the RECOMMENDED time | ||||
| period is three times the PTO. This avoids valid reordered packets | ||||
| being dropped by the peer as a result of the peer discarding older | ||||
| keys. | ||||
| A receiving endpoint detects an update when the KEY_PHASE bit does | @M [0] QUIC Packets | |||
| 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 | ||||
| the KDF function provided by TLS. The header protection key is not | ||||
| updated. | ||||
| If the packet can be decrypted and authenticated using the updated | ... Update to @N | |||
| key and IV, then the keys the endpoint uses for packet protection are | @N [1] QUIC Packets | |||
| also updated. The next packet sent by the endpoint MUST then use the | --------> | |||
| new keys. Once an endpoint has sent a packet encrypted with a given | Update to @N ... | |||
| key phase, it MUST NOT send a packet encrypted with an older key | QUIC Packets [1] @N | |||
| phase. | <-------- | |||
| QUIC Packets [1] @N | ||||
| containing ACK | ||||
| <-------- | ||||
| ... Key Update Permitted | ||||
| An endpoint does not always need to send packets when it detects that | @N [1] QUIC Packets | |||
| its peer has updated keys. The next packet that it sends will simply | containing ACK for @N packets | |||
| 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 | Key Update Permitted ... | |||
| has updated keys twice without awaiting a reciprocal update. An | ||||
| endpoint MUST treat consecutive key updates as a fatal error and | ||||
| abort the connection. | ||||
| An endpoint SHOULD retain old keys for a period of no more than three | Figure 8: Key Update | |||
| times the PTO. After this period, old keys and their corresponding | ||||
| secrets SHOULD be discarded. Retaining keys allow endpoints to | ||||
| process packets that were sent with old keys and delayed in the | ||||
| network. Packets with higher packet numbers always use the updated | ||||
| keys and MUST NOT be decrypted with old keys. | ||||
| This ensures that once the handshake is complete, packets with the | 6.1. Initiating a Key Update | |||
| same KEY_PHASE will have the same packet protection keys, unless | ||||
| there are multiple key updates in a short time frame succession and | ||||
| significant packet reordering. | ||||
| Initiating Peer Responding Peer | Endpoints maintain separate read and write secrets for packet | |||
| protection. An endpoint initiates a key update by updating its | ||||
| packet protection write secret and using that to protect new packets. | ||||
| @M QUIC Frames | The endpoint creates a new write secret from the existing write | |||
| New Keys -> @N | secret as performed in Section 7.2 of [TLS13]. This uses the KDF | |||
| @N QUIC Frames | function provided by TLS with a label of "quic ku". The | |||
| --------> | corresponding key and IV are created from that secret as defined in | |||
| QUIC Frames @M | Section 5.1. The header protection key is not updated. | |||
| New Keys -> @N | ||||
| QUIC Frames @N | ||||
| <-------- | ||||
| Figure 6: Key Update | For example, to update write keys with TLS 1.3, HKDF-Expand-Label is | |||
| used as: | ||||
| A packet that triggers a key update could arrive after the receiving | secret_<n+1> = HKDF-Expand-Label(secret_<n>, "quic ku", | |||
| endpoint successfully processed a packet with a higher packet number. | "", Hash.length) | |||
| This is only 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 cannot be differentiated from an attack, an endpoint MUST | ||||
| immediately terminate the connection if it detects this condition. | ||||
| In deciding when to update keys, endpoints MUST NOT exceed the limits | The endpoint toggles the value of the Key Phase bit and uses the | |||
| for use of specific keys, as described in Section 5.5 of [TLS13]. | updated key and IV to protect all subsequent packets. | |||
| An endpoint MUST NOT initiate a key update prior to having confirmed | ||||
| the handshake (Section 4.1.2). An endpoint MUST NOT initiate a | ||||
| subsequent key update prior unless it has received an acknowledgment | ||||
| for a packet that was sent protected with keys from the current key | ||||
| phase. This ensures that keys are available to both peers before | ||||
| another key update can be initiated. This can be implemented by | ||||
| tracking the lowest packet number sent with each key phase, and the | ||||
| highest acknowledged packet number in the 1-RTT space: once the | ||||
| latter is higher than or equal to the former, another key update can | ||||
| be initiated. | ||||
| Note: Keys of packets other than the 1-RTT packets are never | ||||
| updated; their keys are derived solely from the TLS handshake | ||||
| state. | ||||
| The endpoint that initiates a key update also updates the keys that | ||||
| it uses for receiving packets. These keys will be needed to process | ||||
| packets the peer sends after updating. | ||||
| An endpoint SHOULD retain old keys so that packets sent by its peer | ||||
| prior to receiving the key update can be processed. Discarding old | ||||
| keys too early can cause delayed packets to be discarded. Discarding | ||||
| packets will be interpreted as packet loss by the peer and could | ||||
| adversely affect performance. | ||||
| 6.2. Responding to a Key Update | ||||
| A peer is permitted to initiate a key update after receiving an | ||||
| acknowledgement of a packet in the current key phase. An endpoint | ||||
| detects a key update when processing a packet with a key phase that | ||||
| differs from the value last used to protect the last packet it sent. | ||||
| To process this packet, the endpoint uses the next packet protection | ||||
| key and IV. See Section 6.3 for considerations about generating | ||||
| these keys. | ||||
| If a packet is successfully processed using the next key and IV, then | ||||
| the peer has initiated a key update. The endpoint MUST update its | ||||
| send keys to the corresponding key phase in response, as described in | ||||
| Section 6.1. Sending keys MUST be updated before sending an | ||||
| acknowledgement for the packet that was received with updated keys. | ||||
| By acknowledging the packet that triggered the key update in a packet | ||||
| protected with the updated keys, the endpoint signals that the key | ||||
| update is complete. | ||||
| An endpoint can defer sending the packet or acknowledgement according | ||||
| to its normal packet sending behaviour; it is not necessary to | ||||
| immediately generate a packet in response to a key update. The next | ||||
| packet sent by the endpoint will use the updated keys. The next | ||||
| packet that contains an acknowledgement will cause the key update to | ||||
| be completed. If an endpoint detects a second update before it has | ||||
| sent any packets with updated keys containing an acknowledgement for | ||||
| the packet that initiated the key update, it indicates that its peer | ||||
| has updated keys twice without awaiting confirmation. An endpoint | ||||
| MAY treat consecutive key updates as a connection error of type | ||||
| KEY_UPDATE_ERROR. | ||||
| An endpoint that receives an acknowledgement that is carried in a | ||||
| packet protected with old keys where any acknowledged packet was | ||||
| protected with newer keys MAY treat that as a connection error of | ||||
| type KEY_UPDATE_ERROR. This indicates that a peer has received and | ||||
| acknowledged a packet that initiates a key update, but has not | ||||
| updated keys in response. | ||||
| 6.3. Timing of Receive Key Generation | ||||
| Endpoints responding to an apparent key update MUST NOT generate a | ||||
| timing side-channel signal that might indicate that the Key Phase bit | ||||
| was invalid (see Section 9.3). Endpoints can use dummy packet | ||||
| protection keys in place of discarded keys when key updates are not | ||||
| yet permitted. Using dummy keys will generate no variation in the | ||||
| timing signal produced by attempting to remove packet protection, and | ||||
| results in all packets with an invalid Key Phase bit being rejected. | ||||
| The process of creating new packet protection keys for receiving | ||||
| packets could reveal that a key update has occurred. An endpoint MAY | ||||
| perform this process as part of packet processing, but this creates a | ||||
| timing signal that can be used by an attacker to learn when key | ||||
| updates happen and thus the value of the Key Phase bit in certain | ||||
| packets. Endpoints SHOULD instead defer the creation of the next set | ||||
| of receive packet protection keys until some time after a key update | ||||
| completes, up to three times the PTO; see Section 6.5. | ||||
| Once generated, the next set of packet protection keys SHOULD be | ||||
| retained, even if the packet that was received was subsequently | ||||
| discarded. Packets containing apparent key updates are easy to forge | ||||
| and - while the process of key update does not require significant | ||||
| effort - triggering this process could be used by an attacker for | ||||
| DoS. | ||||
| For this reason, endpoints MUST be able to retain two sets of packet | ||||
| protection keys for receiving packets: the current and the next. | ||||
| Retaining the previous keys in addition to these might improve | ||||
| performance, but this is not essential. | ||||
| 6.4. Sending with Updated Keys | ||||
| An endpoint always sends packets that are protected with the newest | ||||
| keys. Keys used for packet protection can be discarded immediately | ||||
| after switching to newer keys. | ||||
| Packets with higher packet numbers MUST be protected with either the | ||||
| same or newer packet protection keys than packets with lower packet | ||||
| numbers. An endpoint that successfully removes protection with old | ||||
| keys when newer keys were used for packets with lower packet numbers | ||||
| MUST treat this as a connection error of type KEY_UPDATE_ERROR. | ||||
| 6.5. Receiving with Different Keys | ||||
| For receiving packets during a key update, packets protected with | ||||
| older keys might arrive if they were delayed by the network. | ||||
| Retaining old packet protection keys allows these packets to be | ||||
| successfully processed. | ||||
| As packets protected with keys from the next key phase use the same | ||||
| Key Phase value as those protected with keys from the previous key | ||||
| phase, it can be necessary to distinguish between the two. This can | ||||
| be done using packet numbers. A recovered packet number that is | ||||
| lower than any packet number from the current key phase uses the | ||||
| previous packet protection keys; a recovered packet number that is | ||||
| higher than any packet number from the current key phase requires the | ||||
| use of the next packet protection keys. | ||||
| Some care is necessary to ensure that any process for selecting | ||||
| between previous, current, and next packet protection keys does not | ||||
| expose a timing side channel that might reveal which keys were used | ||||
| to remove packet protection. See Section 9.4 for more information. | ||||
| Alternatively, endpoints can retain only two sets of packet | ||||
| protection keys, swapping previous for next after enough time has | ||||
| passed to allow for reordering in the network. In this case, the Key | ||||
| Phase bit alone can be used to select keys. | ||||
| An endpoint MAY allow a period of approximately the Probe Timeout | ||||
| (PTO; see [QUIC-RECOVERY]) after a key update before it creates the | ||||
| next set of packet protection keys. These updated keys MAY replace | ||||
| the previous keys at that time. With the caveat that PTO is a | ||||
| subjective measure - that is, a peer could have a different view of | ||||
| the RTT - this time is expected to be long enough that any reordered | ||||
| packets would be declared lost by a peer even if they were | ||||
| acknowledged and short enough to allow for subsequent key updates. | ||||
| Endpoints need to allow for the possibility that a peer might not be | ||||
| able to decrypt packets that initiate a key update during the period | ||||
| when it retains old keys. Endpoints SHOULD wait three times the PTO | ||||
| before initiating a key update after receiving an acknowledgment that | ||||
| confirms that the previous key update was received. Failing to allow | ||||
| sufficient time could lead to packets being discarded. | ||||
| An endpoint SHOULD retain old read keys for no more than three times | ||||
| the PTO. After this period, old read keys and their corresponding | ||||
| secrets SHOULD be discarded. | ||||
| 6.6. Key Update Frequency | ||||
| Key updates MUST be initiated before usage limits on packet | ||||
| protection keys are exceeded. For the cipher suites mentioned in | ||||
| this document, the limits in Section 5.5 of [TLS13] apply. Other | ||||
| cipher suites MUST define usage limits in order to be used with QUIC. | ||||
| 6.7. Key Update Error Code | ||||
| The KEY_UPDATE_ERROR error code (0xE) is used to signal errors | ||||
| related to key updates. | ||||
| 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 30, line 22 ¶ | skipping to change at page 34, line 35 ¶ | |||
| 8.1. Protocol Negotiation | 8.1. Protocol Negotiation | |||
| QUIC requires that the cryptographic handshake provide authenticated | QUIC requires that the cryptographic handshake provide authenticated | |||
| protocol negotiation. TLS uses Application Layer Protocol | protocol negotiation. TLS uses Application Layer Protocol | |||
| Negotiation (ALPN) [RFC7301] to select an application protocol. | Negotiation (ALPN) [RFC7301] to select an application protocol. | |||
| Unless another mechanism is used for agreeing on an application | Unless another mechanism is used for agreeing on an application | |||
| protocol, endpoints MUST use ALPN for this purpose. When using ALPN, | protocol, endpoints MUST use ALPN for this purpose. When using ALPN, | |||
| endpoints MUST immediately close a connection (see Section 10.3 in | endpoints MUST immediately close a connection (see Section 10.3 in | |||
| [QUIC-TRANSPORT]) if an application protocol is not negotiated with a | [QUIC-TRANSPORT]) if an application protocol is not negotiated with a | |||
| no_application_protocol TLS alert (QUIC error code 0x178, see | no_application_protocol TLS alert (QUIC error code 0x178, see | |||
| Section 4.8). While [RFC7301] only specifies that servers use this | Section 4.9). While [RFC7301] only specifies that servers use this | |||
| alert, QUIC clients MUST also use it to terminate a connection when | alert, QUIC clients MUST also use it to terminate a connection when | |||
| ALPN negotiation fails. | ALPN negotiation fails. | |||
| An application-layer protocol MAY restrict the QUIC versions that it | An application-layer protocol MAY restrict the QUIC versions that it | |||
| can operate over. Servers MUST select an application protocol | can operate over. Servers MUST select an application protocol | |||
| compatible with the QUIC version that the client has selected. If | compatible with the QUIC version that the client has selected. If | |||
| the server cannot select a compatible combination of application | the server cannot select a compatible combination of application | |||
| protocol and QUIC version, it MUST abort the connection. A client | protocol and QUIC version, it MUST abort the connection. A client | |||
| MUST abort a connection if the server picks an application protocol | MUST abort a connection if the server picks an application protocol | |||
| incompatible with the protocol version being used. | incompatible with the protocol version being used. | |||
| 8.2. QUIC Transport Parameters Extension | 8.2. QUIC Transport Parameters Extension | |||
| QUIC transport parameters are carried in a TLS extension. Different | QUIC transport parameters are carried in a TLS extension. Different | |||
| versions of QUIC might define a different format for this struct. | versions of QUIC might define a different method for negotiating | |||
| transport configuration. | ||||
| Including transport parameters in the TLS handshake provides | Including transport parameters in the TLS handshake provides | |||
| integrity protection for these values. | integrity protection for these values. | |||
| enum { | enum { | |||
| quic_transport_parameters(0xffa5), (65535) | quic_transport_parameters(0xffa5), (65535) | |||
| } ExtensionType; | } ExtensionType; | |||
| The "extension_data" field of the quic_transport_parameters extension | The "extension_data" field of the quic_transport_parameters extension | |||
| contains a value that is defined by the version of QUIC that is in | contains a value that is defined by the version of QUIC that is in | |||
| use. The quic_transport_parameters extension carries a | use. | |||
| TransportParameters struct when the version of QUIC defined in | ||||
| [QUIC-TRANSPORT] is used. | ||||
| The quic_transport_parameters extension is carried in the ClientHello | The quic_transport_parameters extension is carried in the ClientHello | |||
| and the EncryptedExtensions messages during the handshake. Endpoints | and the EncryptedExtensions messages during the handshake. Endpoints | |||
| MUST send the quic_transport_parameters extension; endpoints that | MUST send the quic_transport_parameters extension; endpoints that | |||
| receive ClientHello or EncryptedExtensions messages without the | receive ClientHello or EncryptedExtensions messages without the | |||
| quic_transport_parameters extension MUST close the connection with an | quic_transport_parameters extension MUST close the connection with an | |||
| error of type 0x16d (equivalent to a fatal TLS missing_extension | error of type 0x16d (equivalent to a fatal TLS missing_extension | |||
| alert, see Section 4.8). | alert, see Section 4.9). | |||
| While the transport parameters are technically available prior to the | While the transport parameters are technically available prior to the | |||
| completion of the handshake, they cannot be fully trusted until the | completion of the handshake, they cannot be fully trusted until the | |||
| handshake completes, and reliance on them should be minimized. | handshake completes, and reliance on them should be minimized. | |||
| However, any tampering with the parameters will cause the handshake | However, any tampering with the parameters will cause the handshake | |||
| to fail. | to fail. | |||
| Endpoints MUST NOT send this extension in a TLS connection that does | Endpoints MUST NOT send this extension in a TLS connection that does | |||
| not use QUIC (such as the use of TLS with TCP defined in [TLS13]). A | not use QUIC (such as the use of TLS with TCP defined in [TLS13]). A | |||
| fatal unsupported_extension alert MUST be sent by an implementation | fatal unsupported_extension alert MUST be sent by an implementation | |||
| skipping to change at page 33, line 13 ¶ | skipping to change at page 37, line 30 ¶ | |||
| 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 8.1 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.3. Header Protection Analysis | 9.3. Header Protection Analysis | |||
| Header protection relies on the packet protection AEAD being a | [NAN] analyzes authenticated encryption algorithms which provide | |||
| pseudorandom function (PRF), which is not a property that AEAD | nonce privacy, referred to as "Hide Nonce" (HN) transforms. The | |||
| algorithms guarantee. Therefore, no strong assurances about the | general header protection construction in this document is one of | |||
| general security of this mechanism can be shown in the general case. | those algorithms (HN1). Header protection uses the output of the | |||
| The AEAD algorithms described in this document are assumed to be | packet protection AEAD to derive "sample", and then encrypts the | |||
| PRFs. | header field using a pseudorandom function (PRF) as follows: | |||
| The header protection algorithms defined in this document take the | ||||
| form: | ||||
| protected_field = field XOR PRF(hp_key, sample) | protected_field = field XOR PRF(hp_key, sample) | |||
| This construction is secure against chosen plaintext attacks (IND- | The header protection variants in this document use a pseudorandom | |||
| CPA) [IMC]. | permutation (PRP) in place of a generic PRF. However, since all PRPs | |||
| are also PRFs [IMC], these variants do not deviate from the HN1 | ||||
| construction. | ||||
| As "hp_key" is distinct from the packet protection key, it follows | ||||
| that header protection achieves AE2 security as defined in [NAN] and | ||||
| therefore guarantees privacy of "field", the protected packet header. | ||||
| Future header protection variants based on this construction MUST use | ||||
| a PRF to ensure equivalent security guarantees. | ||||
| 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 header protection. Protecting two different headers | compromising header protection. Protecting two different headers | |||
| with the same key and ciphertext sample reveals the exclusive OR of | with the same key and ciphertext sample reveals the exclusive OR of | |||
| the protected fields. Assuming that the AEAD acts as a PRF, if L | the protected fields. Assuming that the AEAD acts as a PRF, if L | |||
| bits are sampled, the odds of two ciphertext samples being identical | bits are sampled, the odds of two ciphertext samples being identical | |||
| approach 2^(-L/2), that is, the birthday bound. For the algorithms | approach 2^(-L/2), that is, the birthday bound. For the algorithms | |||
| described in this document, that probability is one in 2^64. | described in this document, that probability is one in 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 headers, the header is | To prevent an attacker from modifying packet headers, the header is | |||
| transitively authenticated using packet protection; the entire packet | transitively authenticated using packet protection; the entire packet | |||
| header is part of the authenticated additional data. Protected | header is part of the authenticated additional data. Protected | |||
| fields that are falsified or modified can only be detected once the | fields that are falsified or modified can only be detected once the | |||
| packet protection is removed. | packet protection is removed. | |||
| An attacker could guess values for packet numbers and have an | 9.4. Header Protection Timing Side-Channels | |||
| endpoint confirm guesses through timing side channels. Similarly, | ||||
| guesses for the packet number length can be trialed and exposed. If | An attacker could guess values for packet numbers or Key Phase and | |||
| the recipient of a packet discards packets with duplicate packet | have an endpoint confirm guesses through timing side channels. | |||
| numbers without attempting to remove packet protection they could | Similarly, guesses for the packet number length can be trialed and | |||
| reveal through timing side-channels that the packet number matches a | exposed. If the recipient of a packet discards packets with | |||
| received packet. For authentication to be free from side-channels, | duplicate packet numbers without attempting to remove packet | |||
| the entire process of header protection removal, packet number | protection they could reveal through timing side-channels that the | |||
| recovery, and packet protection removal MUST be applied together | packet number matches a received packet. For authentication to be | |||
| without timing and other side-channels. | free from side-channels, the entire process of header protection | |||
| removal, packet number 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 | During a key update, the time taken to generate new keys could reveal | |||
| through timing side-channels that a key update has occurred. | ||||
| Alternatively, where an attacker injects packets this side-channel | ||||
| could reveal the value of the Key Phase on injected packets. After | ||||
| receiving a key update, an endpoint SHOULD generate and save the next | ||||
| set of receive packet protection keys, as described in Section 6.3. | ||||
| By generating new keys before a key update is received, receipt of | ||||
| packets will not create timing signals that leak the value of the Key | ||||
| Phase. | ||||
| This depends on not doing this key generation during packet | ||||
| processing and it can require that endpoints maintain three sets of | ||||
| packet protection keys for receiving: for the previous key phase, for | ||||
| the current key phase, and for the next key phase. Endpoints can | ||||
| instead choose to defer generation of the next receive packet | ||||
| protection keys until they discard old keys so that only two sets of | ||||
| receive keys need to be retained at any point in time. | ||||
| 9.5. Key Diversity | ||||
| In using TLS, the central key schedule of TLS is used. As a result | 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 the TLS handshake messages being integrated into the calculation | |||
| of secrets, the inclusion of the QUIC transport parameters extension | of secrets, the inclusion of the QUIC transport parameters extension | |||
| ensures that handshake and 1-RTT keys are not the same as those that | ensures that handshake and 1-RTT keys are not the same as those that | |||
| might be produced by a server running TLS over TCP. To avoid the | might be produced by a server running TLS over TCP. To avoid the | |||
| possibility of cross-protocol key synchronization, additional | possibility of cross-protocol key synchronization, additional | |||
| measures are provided to improve key separation. | measures are provided to improve key separation. | |||
| The QUIC packet protection keys and IVs are derived using a different | The QUIC packet protection keys and IVs are derived using a different | |||
| skipping to change at page 34, line 45 ¶ | skipping to change at page 39, line 38 ¶ | |||
| 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. | |||
| o QUIC Error Codes Registry [QUIC-TRANSPORT] - IANA is to register | ||||
| the KEY_UPDATE_ERROR (0xE), as described in Section 6.7. | ||||
| 11. References | 11. References | |||
| 11.1. Normative References | 11.1. Normative References | |||
| [AEAD] McGrew, D., "An Interface and Algorithms for Authenticated | [AEAD] McGrew, D., "An Interface and Algorithms for Authenticated | |||
| Encryption", RFC 5116, DOI 10.17487/RFC5116, January 2008, | Encryption", RFC 5116, DOI 10.17487/RFC5116, January 2008, | |||
| <https://www.rfc-editor.org/info/rfc5116>. | <https://www.rfc-editor.org/info/rfc5116>. | |||
| [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-23 (work | and Congestion Control", draft-ietf-quic-recovery-24 (work | |||
| in progress), September 2019. | in progress), November 2019. | |||
| [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-23 (work in progress), September 2019. | transport-24 (work in progress), November 2019. | |||
| [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>. | |||
| skipping to change at page 36, line 12 ¶ | skipping to change at page 41, line 5 ¶ | |||
| 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>. | |||
| [HTTP2-TLS13] | ||||
| Benjamin, D., "Using TLS 1.3 with HTTP/2", draft-ietf- | ||||
| httpbis-http2-tls13-03 (work in progress), October 2019. | ||||
| [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. | |||
| [NAN] Bellare, M., Ng, R., and B. Tackmann, "Nonces Are Noticed: | ||||
| AEAD Revisited", Advances in Cryptology - CRYPTO 2019 pp. | ||||
| 235-265, DOI 10.1007/978-3-030-26948-7_9, 2019. | ||||
| [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-23 (work in progress), | QUIC", draft-ietf-quic-http-24 (work in progress), | |||
| September 2019. | November 2019. | |||
| [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 38, line 9 ¶ | skipping to change at page 43, line 9 ¶ | |||
| iv = HKDF-Expand-Label(server_initial_secret, "quic iv", _, 12) | iv = HKDF-Expand-Label(server_initial_secret, "quic iv", _, 12) | |||
| = 5e5ae651fd1e8495af13508b | = 5e5ae651fd1e8495af13508b | |||
| hp = HKDF-Expand-Label(server_initial_secret, "quic hp", _, 16) | hp = HKDF-Expand-Label(server_initial_secret, "quic hp", _, 16) | |||
| = a8ed82e6664f865aedf6106943f95fb8 | = a8ed82e6664f865aedf6106943f95fb8 | |||
| A.2. Client Initial | A.2. Client Initial | |||
| The client sends an Initial packet. The unprotected payload of this | The client sends an Initial packet. The unprotected payload of this | |||
| packet contains the following CRYPTO frame, plus enough PADDING | packet contains the following CRYPTO frame, plus enough PADDING | |||
| frames to make an 1163 byte payload: | frames to make a 1162 byte payload: | |||
| 060040c4010000c003036660261ff947 cea49cce6cfad687f457cf1b14531ba1 | 060040c4010000c003036660261ff947 cea49cce6cfad687f457cf1b14531ba1 | |||
| 4131a0e8f309a1d0b9c4000006130113 031302010000910000000b0009000006 | 4131a0e8f309a1d0b9c4000006130113 031302010000910000000b0009000006 | |||
| 736572766572ff01000100000a001400 12001d00170018001901000101010201 | 736572766572ff01000100000a001400 12001d00170018001901000101010201 | |||
| 03010400230000003300260024001d00 204cfdfcd178b784bf328cae793b136f | 03010400230000003300260024001d00 204cfdfcd178b784bf328cae793b136f | |||
| 2aedce005ff183d7bb14952072366470 37002b0003020304000d0020001e0403 | 2aedce005ff183d7bb14952072366470 37002b0003020304000d0020001e0403 | |||
| 05030603020308040805080604010501 060102010402050206020202002d0002 | 05030603020308040805080604010501 060102010402050206020202002d0002 | |||
| 0101001c00024001 | 0101001c00024001 | |||
| The unprotected header includes the connection ID and a 4 byte packet | The unprotected header includes the connection ID and a 4 byte packet | |||
| skipping to change at page 40, line 14 ¶ | skipping to change at page 45, line 14 ¶ | |||
| The header from the server includes a new connection ID and a 2-byte | The header from the server includes a new connection ID and a 2-byte | |||
| packet number encoding for a packet number of 1: | packet number encoding for a packet number of 1: | |||
| c1ff0000170008f067a5502a4262b50040740001 | c1ff0000170008f067a5502a4262b50040740001 | |||
| As a result, after protection, the header protection sample is taken | As a result, after protection, the header protection sample is taken | |||
| starting from the third protected octet: | starting from the third protected octet: | |||
| sample = 7002596f99ae67abf65a5852f54f58c3 | sample = 7002596f99ae67abf65a5852f54f58c3 | |||
| mask = 38168a0c25 | mask = 38168a0c25 | |||
| header = c1ff0000170008f067a5502a4262b5004074168b | header = c9ff0000170008f067a5502a4262b5004074168b | |||
| The final protected packet is then: | The final protected packet is then: | |||
| c9ff0000170008f067a5502a4262b500 4074168bf22b7002596f99ae67abf65a | c9ff0000170008f067a5502a4262b500 4074168bf22b7002596f99ae67abf65a | |||
| 5852f54f58c37c808682e2e40492d8a3 899fb04fc0afe9aabc8767b18a0aa493 | 5852f54f58c37c808682e2e40492d8a3 899fb04fc0afe9aabc8767b18a0aa493 | |||
| 537426373b48d502214dd856d63b78ce e37bc664b3fe86d487ac7a77c53038a3 | 537426373b48d502214dd856d63b78ce e37bc664b3fe86d487ac7a77c53038a3 | |||
| cd32f0b5004d9f5754c4f7f2d1f35cf3 f7116351c92b9cf9bb6d091ddfc8b32d | cd32f0b5004d9f5754c4f7f2d1f35cf3 f7116351c92b9cf9bb6d091ddfc8b32d | |||
| 432348a2c413 | 432348a2c413 | |||
| Appendix B. Change Log | Appendix B. 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. | |||
| B.1. Since draft-ietf-quic-tls-22 | B.1. Since draft-ietf-quic-tls-23 | |||
| o Key update text update (#3050): | ||||
| * Recommend constant-time key replacement (#2792) | ||||
| * Provide explicit labels for key update key derivation (#3054) | ||||
| o Allow first Initial from a client to span multiple packets (#2928, | ||||
| #3045) | ||||
| o PING can be sent at any encryption level (#3034, #3035) | ||||
| B.2. Since draft-ietf-quic-tls-22 | ||||
| o Update the salt used for Initial secrets (#2887, #2980) | o Update the salt used for Initial secrets (#2887, #2980) | |||
| B.2. Since draft-ietf-quic-tls-21 | B.3. Since draft-ietf-quic-tls-21 | |||
| o No changes | o No changes | |||
| B.3. Since draft-ietf-quic-tls-20 | B.4. Since draft-ietf-quic-tls-20 | |||
| o Mandate the use of the QUIC transport parameters extension (#2528, | o Mandate the use of the QUIC transport parameters extension (#2528, | |||
| #2560) | #2560) | |||
| o Define handshake completion and confirmation; define clearer rules | o Define handshake completion and confirmation; define clearer rules | |||
| when it encryption keys should be discarded (#2214, #2267, #2673) | when it encryption keys should be discarded (#2214, #2267, #2673) | |||
| B.4. Since draft-ietf-quic-tls-18 | B.5. Since draft-ietf-quic-tls-18 | |||
| o Increased the set of permissible frames in 0-RTT (#2344, #2355) | o Increased the set of permissible frames in 0-RTT (#2344, #2355) | |||
| o Transport parameter extension is mandatory (#2528, #2560) | o Transport parameter extension is mandatory (#2528, #2560) | |||
| B.5. Since draft-ietf-quic-tls-17 | B.6. Since draft-ietf-quic-tls-17 | |||
| o Endpoints discard initial keys as soon as handshake keys are | o Endpoints discard initial keys as soon as handshake keys are | |||
| available (#1951, #2045) | available (#1951, #2045) | |||
| o Use of ALPN or equivalent is mandatory (#2263, #2284) | o Use of ALPN or equivalent is mandatory (#2263, #2284) | |||
| B.6. Since draft-ietf-quic-tls-14 | B.7. Since draft-ietf-quic-tls-14 | |||
| o Update the salt used for Initial secrets (#1970) | o Update the salt used for Initial secrets (#1970) | |||
| o Clarify that TLS_AES_128_CCM_8_SHA256 isn't supported (#2019) | o Clarify that TLS_AES_128_CCM_8_SHA256 isn't supported (#2019) | |||
| o Change header protection | o Change header protection | |||
| * Sample from a fixed offset (#1575, #2030) | * Sample from a fixed offset (#1575, #2030) | |||
| * Cover part of the first byte, including the key phase (#1322, | * Cover part of the first byte, including the key phase (#1322, | |||
| #2006) | #2006) | |||
| o TLS provides an AEAD and KDF function (#2046) | o TLS provides an AEAD and KDF function (#2046) | |||
| * Clarify that the TLS KDF is used with TLS (#1997) | * Clarify that the TLS KDF is used with TLS (#1997) | |||
| * Change the labels for calculation of QUIC keys (#1845, #1971, | * Change the labels for calculation of QUIC keys (#1845, #1971, | |||
| #1991) | #1991) | |||
| o Initial keys are discarded once Handshake are avaialble (#1951, | o Initial keys are discarded once Handshake keys are available | |||
| #2045) | (#1951, #2045) | |||
| B.7. Since draft-ietf-quic-tls-13 | B.8. Since draft-ietf-quic-tls-13 | |||
| o Updated to TLS 1.3 final (#1660) | o Updated to TLS 1.3 final (#1660) | |||
| B.8. Since draft-ietf-quic-tls-12 | B.9. 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 | |||
| skipping to change at page 42, line 4 ¶ | skipping to change at page 47, line 22 ¶ | |||
| #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) | |||
| B.9. Since draft-ietf-quic-tls-11 | B.10. Since draft-ietf-quic-tls-11 | |||
| o Encrypted packet numbers. | o Encrypted packet numbers. | |||
| B.10. Since draft-ietf-quic-tls-10 | B.11. Since draft-ietf-quic-tls-10 | |||
| o No significant changes. | o No significant changes. | |||
| B.11. Since draft-ietf-quic-tls-09 | B.12. 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) | |||
| B.12. Since draft-ietf-quic-tls-08 | B.13. 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) | |||
| B.13. Since draft-ietf-quic-tls-07 | B.14. 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) | |||
| B.14. Since draft-ietf-quic-tls-05 | B.15. Since draft-ietf-quic-tls-05 | |||
| No significant changes. | No significant changes. | |||
| B.15. Since draft-ietf-quic-tls-04 | B.16. 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) | |||
| B.16. Since draft-ietf-quic-tls-03 | B.17. Since draft-ietf-quic-tls-03 | |||
| No significant changes. | No significant changes. | |||
| B.17. Since draft-ietf-quic-tls-02 | B.18. Since draft-ietf-quic-tls-02 | |||
| o Updates to match changes in transport draft | o Updates to match changes in transport draft | |||
| B.18. Since draft-ietf-quic-tls-01 | B.19. 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 43, line 30 ¶ | skipping to change at page 48, line 46 ¶ | |||
| 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) | |||
| B.19. Since draft-ietf-quic-tls-00 | B.20. 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 | |||
| B.20. Since draft-thomson-quic-tls-01 | B.21. 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. 110 change blocks. | ||||
| 305 lines changed or deleted | 554 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||