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/