summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9001.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9001.txt')
-rw-r--r--doc/rfc/rfc9001.txt2756
1 files changed, 2756 insertions, 0 deletions
diff --git a/doc/rfc/rfc9001.txt b/doc/rfc/rfc9001.txt
new file mode 100644
index 0000000..331e442
--- /dev/null
+++ b/doc/rfc/rfc9001.txt
@@ -0,0 +1,2756 @@
+
+
+
+
+Internet Engineering Task Force (IETF) M. Thomson, Ed.
+Request for Comments: 9001 Mozilla
+Category: Standards Track S. Turner, Ed.
+ISSN: 2070-1721 sn3rd
+ May 2021
+
+
+ Using TLS to Secure QUIC
+
+Abstract
+
+ This document describes how Transport Layer Security (TLS) is used to
+ secure QUIC.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9001.
+
+Copyright Notice
+
+ Copyright (c) 2021 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 2. Notational Conventions
+ 2.1. TLS Overview
+ 3. Protocol Overview
+ 4. Carrying TLS Messages
+ 4.1. Interface to TLS
+ 4.1.1. Handshake Complete
+ 4.1.2. Handshake Confirmed
+ 4.1.3. Sending and Receiving Handshake Messages
+ 4.1.4. Encryption Level Changes
+ 4.1.5. TLS Interface Summary
+ 4.2. TLS Version
+ 4.3. ClientHello Size
+ 4.4. Peer Authentication
+ 4.5. Session Resumption
+ 4.6. 0-RTT
+ 4.6.1. Enabling 0-RTT
+ 4.6.2. Accepting and Rejecting 0-RTT
+ 4.6.3. Validating 0-RTT Configuration
+ 4.7. HelloRetryRequest
+ 4.8. TLS Errors
+ 4.9. Discarding Unused Keys
+ 4.9.1. Discarding Initial Keys
+ 4.9.2. Discarding Handshake Keys
+ 4.9.3. Discarding 0-RTT Keys
+ 5. Packet Protection
+ 5.1. Packet Protection Keys
+ 5.2. Initial Secrets
+ 5.3. AEAD Usage
+ 5.4. Header Protection
+ 5.4.1. Header Protection Application
+ 5.4.2. Header Protection Sample
+ 5.4.3. AES-Based Header Protection
+ 5.4.4. ChaCha20-Based Header Protection
+ 5.5. Receiving Protected Packets
+ 5.6. Use of 0-RTT Keys
+ 5.7. Receiving Out-of-Order Protected Packets
+ 5.8. Retry Packet Integrity
+ 6. Key Update
+ 6.1. Initiating a Key Update
+ 6.2. Responding to a Key Update
+ 6.3. Timing of Receive Key Generation
+ 6.4. Sending with Updated Keys
+ 6.5. Receiving with Different Keys
+ 6.6. Limits on AEAD Usage
+ 6.7. Key Update Error Code
+ 7. Security of Initial Messages
+ 8. QUIC-Specific Adjustments to the TLS Handshake
+ 8.1. Protocol Negotiation
+ 8.2. QUIC Transport Parameters Extension
+ 8.3. Removing the EndOfEarlyData Message
+ 8.4. Prohibit TLS Middlebox Compatibility Mode
+ 9. Security Considerations
+ 9.1. Session Linkability
+ 9.2. Replay Attacks with 0-RTT
+ 9.3. Packet Reflection Attack Mitigation
+ 9.4. Header Protection Analysis
+ 9.5. Header Protection Timing Side Channels
+ 9.6. Key Diversity
+ 9.7. Randomness
+ 10. IANA Considerations
+ 11. References
+ 11.1. Normative References
+ 11.2. Informative References
+ Appendix A. Sample Packet Protection
+ A.1. Keys
+ A.2. Client Initial
+ A.3. Server Initial
+ A.4. Retry
+ A.5. ChaCha20-Poly1305 Short Header Packet
+ Appendix B. AEAD Algorithm Analysis
+ B.1. Analysis of AEAD_AES_128_GCM and AEAD_AES_256_GCM Usage
+ Limits
+ B.1.1. Confidentiality Limit
+ B.1.2. Integrity Limit
+ B.2. Analysis of AEAD_AES_128_CCM Usage Limits
+ Contributors
+ Authors' Addresses
+
+1. Introduction
+
+ This document describes how QUIC [QUIC-TRANSPORT] is secured using
+ TLS [TLS13].
+
+ TLS 1.3 provides critical latency improvements for connection
+ establishment over previous versions. Absent packet loss, most new
+ connections can be established and secured within a single round
+ trip; on subsequent connections between the same client and server,
+ the client can often send application data immediately, that is,
+ using a zero round-trip setup.
+
+ This document describes how TLS acts as a security component of QUIC.
+
+2. Notational Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in BCP
+ 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+ This document uses the terminology established in [QUIC-TRANSPORT].
+
+ For brevity, the acronym TLS is used to refer to TLS 1.3, though a
+ newer version could be used; see Section 4.2.
+
+2.1. TLS Overview
+
+ TLS provides two endpoints with a way to establish a means of
+ communication over an untrusted medium (for example, the Internet).
+ TLS enables authentication of peers and provides confidentiality and
+ integrity protection for messages that endpoints exchange.
+
+ Internally, TLS is a layered protocol, with the structure shown in
+ Figure 1.
+
+ +-------------+------------+--------------+---------+
+ Content | | | Application | |
+ Layer | Handshake | Alerts | Data | ... |
+ | | | | |
+ +-------------+------------+--------------+---------+
+ Record | |
+ Layer | Records |
+ | |
+ +---------------------------------------------------+
+
+ Figure 1: TLS Layers
+
+ Each content-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 endpoints:
+ client and server. The client initiates the exchange and the server
+ responds. If the key exchange completes successfully, both client
+ and server will agree on a secret. TLS supports both pre-shared key
+ (PSK) and Diffie-Hellman over either finite fields or elliptic curves
+ ((EC)DHE) key exchanges. PSK is the basis for Early Data (0-RTT);
+ the latter provides forward secrecy (FS) when the (EC)DHE keys are
+ destroyed. The two modes can also be combined to provide forward
+ secrecy while using the PSK for authentication.
+
+ After completing the TLS handshake, the client will have learned and
+ authenticated an identity for the server, and the server is
+ optionally able to learn and authenticate an identity for the client.
+ TLS supports X.509 [RFC5280] certificate-based authentication for
+ both server and client. When PSK key exchange is used (as in
+ resumption), knowledge of the PSK serves to authenticate the peer.
+
+ The TLS key exchange is resistant to tampering by attackers, and it
+ produces shared secrets that cannot be controlled by either
+ participating peer.
+
+ TLS provides two basic handshake modes of interest to QUIC:
+
+ * A full 1-RTT handshake, in which the client is able to send
+ application data after one round trip and the server immediately
+ responds after receiving the first handshake message from the
+ client.
+
+ * A 0-RTT handshake, in which the client uses information it has
+ previously learned about the server to send application data
+ immediately. This application data can be replayed by an
+ attacker, so 0-RTT is not suitable for carrying instructions that
+ might initiate any action that could cause unwanted effects if
+ replayed.
+
+ A simplified TLS handshake with 0-RTT application data is shown in
+ Figure 2.
+
+ Client Server
+
+ ClientHello
+ (0-RTT Application Data) -------->
+ ServerHello
+ {EncryptedExtensions}
+ {Finished}
+ <-------- [Application Data]
+ {Finished} -------->
+
+ [Application Data] <-------> [Application Data]
+
+ () Indicates messages protected by Early Data (0-RTT) Keys
+ {} Indicates messages protected using Handshake Keys
+ [] Indicates messages protected using Application Data
+ (1-RTT) Keys
+
+ Figure 2: TLS Handshake with 0-RTT
+
+ Figure 2 omits the EndOfEarlyData message, which is 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;
+ see Section 8.4. QUIC has its own key update mechanism; see
+ Section 6.
+
+ Data is protected using a number of encryption levels:
+
+ * Initial keys
+
+ * Early data (0-RTT) keys
+
+ * Handshake keys
+
+ * Application data (1-RTT) keys
+
+ Application data can only appear in the early data and application
+ data levels. Handshake and alert messages may appear in any level.
+
+ The 0-RTT handshake can be used if the client and server have
+ previously communicated. In the 1-RTT handshake, the client is
+ unable to send protected application data until it has received all
+ of the handshake messages sent by the server.
+
+3. Protocol Overview
+
+ QUIC [QUIC-TRANSPORT] assumes responsibility for the confidentiality
+ and integrity protection of packets. For this it uses keys derived
+ from a TLS handshake [TLS13], but instead of carrying TLS records
+ over QUIC (as with TCP), TLS handshake and alert messages are carried
+ directly over the QUIC transport, which takes over the
+ responsibilities of the TLS record layer, as shown in Figure 3.
+
+ +--------------+--------------+ +-------------+
+ | TLS | TLS | | QUIC |
+ | Handshake | Alerts | | Applications|
+ | | | | (h3, etc.) |
+ +--------------+--------------+-+-------------+
+ | |
+ | QUIC Transport |
+ | (streams, reliability, congestion, etc.) |
+ | |
+ +---------------------------------------------+
+ | |
+ | QUIC Packet Protection |
+ | |
+ +---------------------------------------------+
+
+ Figure 3: QUIC Layers
+
+ QUIC also relies on TLS for authentication and negotiation of
+ parameters that are critical to security and performance.
+
+ Rather than a strict layering, these two protocols cooperate: QUIC
+ uses the TLS handshake; TLS uses the reliability, ordered delivery,
+ and record layer provided by QUIC.
+
+ At a high level, there are two main interactions between the TLS and
+ QUIC components:
+
+ * The TLS component sends and receives messages via the QUIC
+ component, with QUIC providing a reliable stream abstraction to
+ TLS.
+
+ * The TLS component provides a series of updates to the QUIC
+ component, including (a) new packet protection keys to install and
+ (b) state changes such as handshake completion, the server
+ certificate, etc.
+
+ Figure 4 shows these interactions in more detail, with the QUIC
+ packet protection being called out specially.
+
+ +------------+ +------------+
+ | |<---- Handshake Messages ----->| |
+ | |<- Validate 0-RTT Parameters ->| |
+ | |<--------- 0-RTT Keys ---------| |
+ | QUIC |<------- Handshake Keys -------| TLS |
+ | |<--------- 1-RTT Keys ---------| |
+ | |<------- Handshake Done -------| |
+ +------------+ +------------+
+ | ^
+ | Protect | Protected
+ v | Packet
+ +------------+
+ | QUIC |
+ | Packet |
+ | Protection |
+ +------------+
+
+ Figure 4: QUIC and TLS Interactions
+
+ Unlike TLS over TCP, QUIC applications that want to send data do not
+ send it using TLS Application Data records. Rather, they send it as
+ QUIC STREAM frames or other frame types, which are then carried in
+ QUIC packets.
+
+4. Carrying TLS Messages
+
+ QUIC carries TLS handshake data in CRYPTO frames, each of which
+ consists of a contiguous block of handshake data identified by an
+ offset and length. Those frames are packaged into QUIC packets and
+ encrypted under the current encryption level. As with TLS over TCP,
+ once TLS handshake data has been delivered to QUIC, it is QUIC's
+ responsibility to deliver it reliably. Each chunk of data that is
+ produced by TLS is associated with the set of keys that TLS is
+ currently using. If QUIC needs to retransmit that data, it MUST use
+ the same keys even if TLS has already updated to newer keys.
+
+ Each encryption level corresponds to a packet number space. The
+ packet number space that is used determines the semantics of frames.
+ Some frames are prohibited in different packet number spaces; see
+ Section 12.5 of [QUIC-TRANSPORT].
+
+ Because packets could be reordered on the wire, QUIC uses the packet
+ type to indicate which keys were used to protect a given packet, as
+ shown in Table 1. When packets of different types need to be sent,
+ endpoints SHOULD use coalesced packets to send them in the same UDP
+ datagram.
+
+ +=====================+=================+==================+
+ | Packet Type | Encryption Keys | PN Space |
+ +=====================+=================+==================+
+ | Initial | Initial secrets | Initial |
+ +=====================+-----------------+------------------+
+ | 0-RTT Protected | 0-RTT | Application data |
+ +=====================+-----------------+------------------+
+ | Handshake | Handshake | Handshake |
+ +=====================+-----------------+------------------+
+ | Retry | Retry | N/A |
+ +=====================+-----------------+------------------+
+ | Version Negotiation | N/A | N/A |
+ +=====================+-----------------+------------------+
+ | Short Header | 1-RTT | Application data |
+ +=====================+-----------------+------------------+
+
+ Table 1: Encryption Keys by Packet Type
+
+ Section 17 of [QUIC-TRANSPORT] shows how packets at the various
+ encryption levels fit into the handshake process.
+
+4.1. Interface to TLS
+
+ As shown in Figure 4, the interface from QUIC to TLS consists of four
+ primary functions:
+
+ * Sending and receiving handshake messages
+
+ * Processing stored transport and application state from a resumed
+ session and determining if it is valid to generate or accept 0-RTT
+ data
+
+ * Rekeying (both transmit and receive)
+
+ * Updating handshake state
+
+ Additional functions might be needed to configure TLS. In
+ particular, QUIC and TLS need to agree on which is responsible for
+ validation of peer credentials, such as certificate validation
+ [RFC5280].
+
+4.1.1. Handshake Complete
+
+ In this document, the TLS handshake is considered complete when the
+ TLS stack has reported that the handshake is complete. This happens
+ when the TLS stack has both sent a Finished message and verified the
+ peer's Finished message. Verifying the peer's Finished message
+ provides the endpoints with an assurance that previous handshake
+ messages have not been modified. Note that the handshake does not
+ complete at both endpoints simultaneously. Consequently, any
+ requirement that is based on the completion of the handshake depends
+ on the perspective of the endpoint in question.
+
+4.1.2. Handshake Confirmed
+
+ In this document, the TLS handshake is considered confirmed at the
+ server when the handshake completes. The server MUST send a
+ HANDSHAKE_DONE frame as soon as the handshake is complete. At the
+ client, the handshake is considered confirmed when a HANDSHAKE_DONE
+ frame is received.
+
+ Additionally, a client MAY consider the handshake to be confirmed
+ when it receives an acknowledgment for a 1-RTT packet. This can be
+ implemented by recording the lowest packet number sent with 1-RTT
+ keys and comparing it to the Largest Acknowledged field in any
+ received 1-RTT ACK frame: once the latter is greater than or equal to
+ the former, the handshake is confirmed.
+
+4.1.3. Sending and Receiving Handshake Messages
+
+ In order to drive the handshake, TLS depends on being able to send
+ and receive handshake messages. There are two basic functions on
+ this interface: one where QUIC requests handshake messages and one
+ where QUIC provides bytes that comprise handshake messages.
+
+ Before starting the handshake, QUIC provides TLS with the transport
+ parameters (see Section 8.2) that it wishes to carry.
+
+ A QUIC client starts TLS by requesting TLS handshake bytes from TLS.
+ The client acquires handshake bytes before sending its first packet.
+ A QUIC server starts the process by providing TLS with the client's
+ handshake bytes.
+
+ At any time, the TLS stack at an endpoint will have a current sending
+ encryption level and a receiving encryption level. TLS encryption
+ levels determine the QUIC packet type and keys that are used for
+ protecting data.
+
+ Each encryption level is associated with a different sequence of
+ bytes, which is reliably transmitted to the peer in CRYPTO frames.
+ When TLS provides handshake bytes to be sent, they are appended to
+ the handshake bytes for the current encryption level. The encryption
+ level then determines the type of packet that the resulting CRYPTO
+ frame is carried in; see Table 1.
+
+ Four encryption levels are used, producing keys for Initial, 0-RTT,
+ Handshake, and 1-RTT packets. CRYPTO frames are carried in just
+ three of these levels, omitting the 0-RTT level. These four levels
+ correspond to three packet number spaces: Initial and Handshake
+ encrypted packets use their own separate spaces; 0-RTT and 1-RTT
+ packets use the application data packet number space.
+
+ QUIC takes the unprotected content of TLS handshake records as the
+ content of CRYPTO frames. TLS record protection is not used by QUIC.
+ QUIC assembles CRYPTO frames into QUIC packets, which are protected
+ using QUIC packet protection.
+
+ QUIC CRYPTO frames only carry TLS handshake messages. TLS alerts are
+ turned into QUIC CONNECTION_CLOSE error codes; see Section 4.8. TLS
+ application data and other content types cannot be carried by QUIC at
+ any encryption level; it is an error if they are received from the
+ TLS stack.
+
+ When an endpoint receives a QUIC packet containing a CRYPTO frame
+ from the network, it proceeds as follows:
+
+ * If the packet uses the current TLS receiving encryption level,
+ sequence 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. If the result of this process is that new data is
+ available, then it is delivered to TLS in order.
+
+ * If the packet is from a previously installed encryption level, it
+ MUST NOT contain data that extends past the end of previously
+ received data in that flow. Implementations MUST treat any
+ violations of this requirement as a connection error of type
+ PROTOCOL_VIOLATION.
+
+ * If the packet is from a new encryption level, it is saved for
+ later processing by TLS. Once TLS moves to receiving from this
+ encryption level, saved data can be provided to TLS. When TLS
+ provides keys for a higher encryption level, if there is data from
+ a previous encryption level that TLS has not consumed, this MUST
+ be treated as a connection error of type PROTOCOL_VIOLATION.
+
+ Each time that TLS is provided with new data, new handshake bytes are
+ requested from TLS. TLS might not provide any bytes if the handshake
+ messages it has received are incomplete or it has no data to send.
+
+ The content of CRYPTO frames might either be processed incrementally
+ by TLS or buffered until complete messages or flights are available.
+ TLS is responsible for buffering handshake bytes that have arrived in
+ order. QUIC is responsible for buffering handshake bytes that arrive
+ out of order or for encryption levels that are not yet ready. QUIC
+ does not provide any means of flow control for CRYPTO frames; see
+ Section 7.5 of [QUIC-TRANSPORT].
+
+ Once the TLS handshake is complete, this is indicated to QUIC along
+ with any final handshake bytes that TLS needs to send. At this
+ stage, the transport parameters that the peer advertised during the
+ handshake are authenticated; see Section 8.2.
+
+ Once the handshake is complete, TLS becomes passive. TLS can still
+ receive data from its peer and respond in kind, but it will not need
+ to send more data unless specifically requested -- either by an
+ application or QUIC. One reason to send data is that the server
+ might wish to provide additional or updated session tickets to a
+ client.
+
+ When the handshake is complete, QUIC only needs to provide TLS with
+ any data that arrives in CRYPTO streams. In the same manner that is
+ used during the handshake, new data is requested from TLS after
+ providing received data.
+
+4.1.4. Encryption Level Changes
+
+ As keys at a given encryption level become available to TLS, TLS
+ indicates to QUIC that reading or writing keys at that encryption
+ level are available.
+
+ The availability of new keys is always a result of providing inputs
+ to TLS. TLS only provides new keys after being initialized (by a
+ client) or when provided with new handshake data.
+
+ However, a TLS implementation could perform some of its processing
+ asynchronously. In particular, the process of validating a
+ certificate can take some time. While waiting for TLS processing to
+ complete, an endpoint SHOULD buffer received packets if they might be
+ processed using keys that are not yet available. These packets can
+ be processed once keys are provided by TLS. An endpoint SHOULD
+ continue to respond to packets that can be processed during this
+ time.
+
+ After processing inputs, TLS might produce handshake bytes, keys for
+ new encryption levels, or both.
+
+ TLS provides QUIC with three items as a new encryption level becomes
+ available:
+
+ * A secret
+
+ * An Authenticated Encryption with Associated Data (AEAD) function
+
+ * A Key Derivation Function (KDF)
+
+ These values are based on the values that TLS negotiates and are used
+ by QUIC to generate packet and header protection keys; see Section 5
+ and Section 5.4.
+
+ If 0-RTT is possible, it is ready after the client sends a TLS
+ ClientHello message or the server receives that message. After
+ providing a QUIC client with the first handshake bytes, the TLS stack
+ might signal the change to 0-RTT keys. On the server, after
+ receiving handshake bytes that contain a ClientHello message, a TLS
+ server might signal that 0-RTT keys are available.
+
+ Although TLS only uses one encryption level at a time, QUIC may use
+ more than one level. For instance, after sending its Finished
+ message (using a CRYPTO frame at the Handshake encryption level) an
+ endpoint can send STREAM data (in 1-RTT encryption). If the Finished
+ message is lost, the endpoint uses the Handshake encryption level to
+ retransmit the lost message. Reordering or loss of packets can mean
+ that QUIC will need to handle packets at multiple encryption levels.
+ During the handshake, this means potentially handling packets at
+ higher and lower encryption levels than the current encryption level
+ used by TLS.
+
+ In particular, server implementations need to be able to read packets
+ at the Handshake encryption level at the same time as the 0-RTT
+ encryption level. A client could interleave ACK frames that are
+ protected with Handshake keys with 0-RTT data, and the server needs
+ to process those acknowledgments in order to detect lost Handshake
+ packets.
+
+ QUIC also needs access to keys that might not ordinarily be available
+ to a TLS implementation. For instance, a client might need to
+ acknowledge Handshake packets before it is ready to send CRYPTO
+ frames at that encryption level. TLS therefore needs to provide keys
+ to QUIC before it might produce them for its own use.
+
+4.1.5. TLS Interface Summary
+
+ Figure 5 summarizes the exchange between QUIC and TLS for both client
+ and server. Solid arrows indicate packets that carry handshake data;
+ dashed arrows show where application data can be sent. Each arrow is
+ tagged with the encryption level used for that transmission.
+
+ Client Server
+ ====== ======
+
+ Get Handshake
+ Initial ------------->
+ Install tx 0-RTT keys
+ 0-RTT - - - - - - - ->
+
+ Handshake Received
+ Get Handshake
+ <------------- Initial
+ Install rx 0-RTT keys
+ Install Handshake keys
+ Get Handshake
+ <----------- Handshake
+ Install tx 1-RTT keys
+ <- - - - - - - - 1-RTT
+
+ Handshake Received (Initial)
+ Install Handshake keys
+ Handshake Received (Handshake)
+ Get Handshake
+ Handshake ----------->
+ Handshake Complete
+ Install 1-RTT keys
+ 1-RTT - - - - - - - ->
+
+ Handshake Received
+ Handshake Complete
+ Handshake Confirmed
+ Install rx 1-RTT keys
+ <--------------- 1-RTT
+ (HANDSHAKE_DONE)
+ Handshake Confirmed
+
+ Figure 5: Interaction Summary between QUIC and TLS
+
+ Figure 5 shows the multiple packets that form a single "flight" of
+ messages being processed individually, to show what incoming messages
+ trigger different actions. This shows multiple "Get Handshake"
+ invocations to retrieve handshake messages at different encryption
+ levels. New handshake messages are requested after incoming packets
+ have been processed.
+
+ Figure 5 shows one possible structure for a simple handshake
+ exchange. The exact process varies based on the structure of
+ endpoint implementations and the order in which packets arrive.
+ Implementations could use a different number of operations or execute
+ them in other orders.
+
+4.2. TLS Version
+
+ This document describes how TLS 1.3 [TLS13] is used with QUIC.
+
+ In practice, the TLS handshake will negotiate a version of TLS to
+ use. This could result in a version of TLS newer than 1.3 being
+ negotiated if both endpoints support that version. This is
+ acceptable provided that the features of TLS 1.3 that are used by
+ QUIC are supported by the newer version.
+
+ Clients MUST NOT offer TLS versions older than 1.3. A badly
+ configured TLS implementation could negotiate TLS 1.2 or another
+ older version of TLS. An endpoint MUST terminate the connection if a
+ version of TLS older than 1.3 is negotiated.
+
+4.3. ClientHello Size
+
+ The first Initial packet from a client contains the start or all of
+ its first cryptographic handshake message, which for TLS is the
+ ClientHello. Servers might need to parse the entire ClientHello
+ (e.g., to access extensions such as Server Name Identification (SNI)
+ or Application-Layer Protocol Negotiation (ALPN)) in order to decide
+ 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
+ ClientHello message. That overhead increases if the client chooses a
+ Source Connection ID field longer than zero bytes. Overheads also do
+ not include the token or a Destination Connection ID longer than 8
+ bytes, both of which might be required if a server sends a Retry
+ packet.
+
+ A typical TLS ClientHello can easily fit into a 1200-byte packet.
+ However, in addition to the overheads added by QUIC, there are
+ several variables that could cause this limit to be exceeded. Large
+ session tickets, multiple or large key shares, and long lists of
+ supported ciphers, signature algorithms, versions, QUIC transport
+ parameters, and other negotiable parameters and extensions could
+ cause this message to grow.
+
+ 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
+ connect efficiently. Minimizing the size of these values increases
+ the probability that clients can use them and still fit their entire
+ ClientHello message in their first Initial packet.
+
+ The TLS implementation does not need to ensure that the ClientHello
+ is large enough to meet QUIC's requirements for datagrams that carry
+ Initial packets; see Section 14.1 of [QUIC-TRANSPORT]. QUIC
+ implementations use PADDING frames or packet coalescing to ensure
+ that datagrams are large enough.
+
+4.4. Peer Authentication
+
+ The requirements for authentication depend on the application
+ protocol that is in use. TLS provides server authentication and
+ permits the server to request client authentication.
+
+ A client MUST authenticate the identity of the server. This
+ typically involves verification that the identity of the server is
+ included in a certificate and that the certificate is issued by a
+ trusted entity (see for example [RFC2818]).
+
+ | Note: Where servers provide certificates for authentication,
+ | the size of the certificate chain can consume a large number of
+ | bytes. Controlling the size of certificate chains is critical
+ | to performance in QUIC as servers are limited to sending 3
+ | bytes for every byte received prior to validating the client
+ | address; see Section 8.1 of [QUIC-TRANSPORT]. The size of a
+ | certificate chain can be managed by limiting the number of
+ | names or extensions; using keys with small public key
+ | representations, like ECDSA; or by using certificate
+ | compression [COMPRESS].
+
+ A server MAY request that the client authenticate during the
+ handshake. A server MAY refuse a connection if the client is unable
+ to authenticate when requested. The requirements for client
+ authentication vary based on application protocol and deployment.
+
+ A server MUST NOT use post-handshake client authentication (as
+ 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. Session Resumption
+
+ QUIC can use the session resumption feature of TLS 1.3. It does this
+ by carrying NewSessionTicket messages in CRYPTO frames after the
+ handshake is complete. Session resumption can be used to provide
+ 0-RTT and can also be used when 0-RTT is disabled.
+
+ Endpoints that use session resumption might need to remember some
+ information about the current connection when creating a resumed
+ connection. TLS requires that some information be retained; see
+ Section 4.6.1 of [TLS13]. QUIC itself does not depend on any state
+ being retained when resuming a connection unless 0-RTT is also used;
+ see Section 7.4.1 of [QUIC-TRANSPORT] and Section 4.6.1. Application
+ protocols could depend on state that is retained between resumed
+ connections.
+
+ Clients can store any state required for resumption along with the
+ session ticket. Servers can use the session ticket to help carry
+ state.
+
+ Session resumption allows servers to link activity on the original
+ connection with the resumed connection, which might be a privacy
+ issue for clients. Clients can choose not to enable resumption to
+ avoid creating this correlation. Clients SHOULD NOT reuse tickets as
+ that allows entities other than the server to correlate connections;
+ see Appendix C.4 of [TLS13].
+
+4.6. 0-RTT
+
+ The 0-RTT feature in QUIC allows a client to send application data
+ before the handshake is complete. This is made possible by reusing
+ negotiated parameters from a previous connection. To enable this,
+ 0-RTT depends on the client remembering critical parameters and
+ providing the server with a TLS session ticket that allows the server
+ to recover the same information.
+
+ This information includes parameters that determine TLS state, as
+ governed by [TLS13], QUIC transport parameters, the chosen
+ application protocol, and any information the application protocol
+ might need; see Section 4.6.3. This information determines how 0-RTT
+ packets and their contents are formed.
+
+ To ensure that the same information is available to both endpoints,
+ all information used to establish 0-RTT comes from the same
+ connection. Endpoints cannot selectively disregard information that
+ might alter the sending or processing of 0-RTT.
+
+ [TLS13] sets a limit of seven days on the time between the original
+ connection and any attempt to use 0-RTT. There are other constraints
+ on 0-RTT usage, notably those caused by the potential exposure to
+ replay attack; see Section 9.2.
+
+4.6.1. Enabling 0-RTT
+
+ The TLS early_data extension in the NewSessionTicket message is
+ defined to convey (in the max_early_data_size parameter) the amount
+ of TLS 0-RTT data the server is willing to accept. QUIC does not use
+ TLS early data. QUIC uses 0-RTT packets to carry early data.
+ Accordingly, the max_early_data_size parameter is repurposed to hold
+ a sentinel value 0xffffffff to indicate that the server is willing to
+ accept QUIC 0-RTT data. To indicate that the server does not accept
+ 0-RTT data, the early_data extension is omitted from the
+ NewSessionTicket. The amount of data that the client can send in
+ QUIC 0-RTT is controlled by the initial_max_data transport parameter
+ supplied by the server.
+
+ Servers MUST NOT send the early_data extension with a
+ max_early_data_size field set to any value other than 0xffffffff. A
+ client MUST treat receipt of a 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
+ extension in the ClientHello message of a subsequent handshake; see
+ Section 4.2.10 of [TLS13]. It then sends application data in 0-RTT
+ packets.
+
+ A client that attempts 0-RTT might also provide an address validation
+ token if the server has sent a NEW_TOKEN frame; see Section 8.1 of
+ [QUIC-TRANSPORT].
+
+4.6.2. Accepting and Rejecting 0-RTT
+
+ A server accepts 0-RTT by sending an early_data extension in the
+ EncryptedExtensions; see Section 4.2.10 of [TLS13]. The server then
+ processes and acknowledges the 0-RTT packets that it receives.
+
+ A server rejects 0-RTT by sending the EncryptedExtensions without an
+ early_data extension. A server will always reject 0-RTT if it sends
+ a TLS HelloRetryRequest. When rejecting 0-RTT, a server MUST NOT
+ process any 0-RTT packets, even if it could. When 0-RTT was
+ rejected, a client SHOULD treat receipt of an acknowledgment for a
+ 0-RTT packet as a connection error of type PROTOCOL_VIOLATION, if it
+ is able to detect the condition.
+
+ When 0-RTT is rejected, all connection characteristics that the
+ client assumed might be incorrect. This includes the choice of
+ application protocol, transport parameters, and any application
+ configuration. The client therefore MUST reset the state of all
+ streams, including application state bound to those streams.
+
+ A client MAY reattempt 0-RTT if it receives a Retry or Version
+ Negotiation packet. These packets do not signify rejection of 0-RTT.
+
+4.6.3. Validating 0-RTT Configuration
+
+ When a server receives a ClientHello with the early_data extension,
+ it has to decide whether to accept or reject 0-RTT 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 0-RTT data, the QUIC stack or the application
+ protocol using QUIC might reject 0-RTT 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 0-RTT data must be rejected. For
+ example, HTTP/3 settings [QUIC-HTTP] determine how 0-RTT data from
+ the client is interpreted. Other applications using QUIC could have
+ different requirements for determining whether to accept or reject
+ 0-RTT data.
+
+4.7. HelloRetryRequest
+
+ The HelloRetryRequest message (see Section 4.1.4 of [TLS13]) can be
+ used to request that a client provide new information, such as a key
+ share, or to validate some characteristic of the client. From the
+ perspective of QUIC, HelloRetryRequest is not differentiated from
+ other cryptographic handshake messages that are carried in Initial
+ packets. Although it is in principle possible to use this feature
+ for address verification, QUIC implementations SHOULD instead use the
+ Retry feature; see Section 8.1 of [QUIC-TRANSPORT].
+
+4.8. TLS Errors
+
+ If TLS experiences an error, it generates an appropriate alert as
+ defined in Section 6 of [TLS13].
+
+ A TLS alert is converted into a QUIC connection error. The
+ AlertDescription value is added to 0x0100 to produce a QUIC error
+ code from the range reserved for CRYPTO_ERROR; see Section 20.1 of
+ [QUIC-TRANSPORT]. The resulting value is sent in a QUIC
+ CONNECTION_CLOSE frame of type 0x1c.
+
+ QUIC is only able to convey an alert level of "fatal". In TLS 1.3,
+ the only existing uses for the "warning" level are to signal
+ connection close; see Section 6.1 of [TLS13]. As QUIC provides
+ alternative mechanisms for connection termination and the TLS
+ connection is only closed if an error is encountered, a QUIC endpoint
+ MUST treat any alert from TLS as if it were at the "fatal" level.
+
+ QUIC permits the use of a generic code in place of a specific error
+ code; see Section 11 of [QUIC-TRANSPORT]. For TLS alerts, this
+ includes replacing any alert with a generic alert, such as
+ handshake_failure (0x0128 in QUIC). Endpoints MAY use a generic
+ error code to avoid possibly exposing confidential information.
+
+4.9. Discarding Unused Keys
+
+ After QUIC has completed a move to a new encryption level, packet
+ protection keys for previous encryption levels can be discarded.
+ This occurs several times during the handshake, as well as when keys
+ are updated; see Section 6.
+
+ Packet protection keys are not discarded immediately when new keys
+ are available. If packets from a lower encryption level contain
+ CRYPTO frames, frames that retransmit that data MUST be sent at the
+ same encryption level. Similarly, an endpoint generates
+ acknowledgments for packets at the same encryption level as the
+ packet being acknowledged. Thus, it is possible that keys for a
+ lower encryption level are needed for a short time after keys for a
+ newer encryption level are available.
+
+ An endpoint cannot discard keys for a given encryption level unless
+ it has received all the cryptographic handshake messages from its
+ peer at that encryption level and its peer has done the same.
+ Different methods for determining this are provided for Initial keys
+ (Section 4.9.1) and Handshake keys (Section 4.9.2). These methods do
+ not prevent packets from being received or sent at that encryption
+ level because a peer might not have received all the acknowledgments
+ necessary.
+
+ Though an endpoint might retain older keys, new data MUST be sent at
+ the highest currently available encryption level. Only ACK frames
+ and retransmissions of data in CRYPTO frames are sent at a previous
+ encryption level. These packets MAY also include PADDING frames.
+
+4.9.1. Discarding Initial Keys
+
+ Packets protected with Initial secrets (Section 5.2) are not
+ authenticated, meaning that an attacker could spoof packets with the
+ intent to disrupt a connection. To limit these attacks, Initial
+ packet protection keys are discarded more aggressively than other
+ keys.
+
+ The successful use of Handshake packets indicates that no more
+ Initial packets need to be exchanged, as these keys can only be
+ produced after receiving all CRYPTO frames from Initial packets.
+ Thus, a client MUST discard Initial keys when it first sends a
+ Handshake packet and a server MUST discard Initial keys when it first
+ successfully processes a Handshake packet. Endpoints MUST NOT send
+ Initial packets after this point.
+
+ This results in abandoning loss recovery state for the Initial
+ encryption level and ignoring any outstanding Initial packets.
+
+4.9.2. Discarding Handshake Keys
+
+ An endpoint MUST discard its Handshake keys when the TLS handshake is
+ confirmed (Section 4.1.2).
+
+4.9.3. Discarding 0-RTT Keys
+
+ 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
+ (Section 5.6).
+
+ Therefore, a client SHOULD discard 0-RTT keys as soon as it installs
+ 1-RTT keys as they have no use after that moment.
+
+ 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
+ could arrive after a 1-RTT packet. Servers MAY temporarily retain
+ 0-RTT keys to allow decrypting reordered packets without requiring
+ their contents to be retransmitted with 1-RTT keys. After receiving
+ a 1-RTT packet, servers MUST discard 0-RTT keys within a short time;
+ the RECOMMENDED time period is three times the Probe Timeout (PTO,
+ see [QUIC-RECOVERY]). A server MAY discard 0-RTT keys earlier if it
+ determines that it has received all 0-RTT packets, which can be done
+ by keeping track of missing packet numbers.
+
+5. Packet Protection
+
+ As with TLS over TCP, QUIC protects packets with keys derived from
+ the TLS handshake, using the AEAD algorithm [AEAD] negotiated by TLS.
+
+ QUIC packets have varying protections depending on their type:
+
+ * Version Negotiation packets have no cryptographic protection.
+
+ * Retry packets use AEAD_AES_128_GCM to provide protection against
+ accidental modification and to limit the entities that can produce
+ a valid Retry; see Section 5.8.
+
+ * Initial packets use AEAD_AES_128_GCM with keys derived from the
+ Destination Connection ID field of the first Initial packet sent
+ by the client; see Section 5.2.
+
+ * All other packets have strong cryptographic protections for
+ confidentiality and integrity, using keys and algorithms
+ negotiated by TLS.
+
+ This section describes how packet protection is applied to Handshake
+ packets, 0-RTT packets, and 1-RTT packets. The same packet
+ protection process is applied to Initial packets. However, as it is
+ trivial to determine the keys used for Initial packets, these packets
+ are not considered to have confidentiality or integrity protection.
+ Retry packets use a fixed key and so similarly lack confidentiality
+ and integrity protection.
+
+5.1. Packet Protection Keys
+
+ QUIC derives packet protection keys in the same way that TLS derives
+ record protection keys.
+
+ Each encryption level has separate secret values for protection of
+ packets sent in each direction. These traffic secrets are derived by
+ TLS (see Section 7.1 of [TLS13]) and are used by QUIC for all
+ encryption levels except the Initial encryption level. The secrets
+ for the Initial encryption level are computed based on the client's
+ initial Destination Connection ID, as described in Section 5.2.
+
+ 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
+ function described in Section 7.1 of [TLS13] is used with the hash
+ function from the negotiated cipher suite. All uses of HKDF-Expand-
+ Label in QUIC use a zero-length Context.
+
+ Note that labels, which are described using strings, are encoded as
+ bytes using ASCII [ASCII] without quotes or any trailing NUL byte.
+
+ Other versions of TLS MUST provide a similar function in order to be
+ used with QUIC.
+
+ 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
+ to derive the Initialization Vector (IV); see Section 5.3. The
+ header protection key uses the "quic hp" label; see Section 5.4.
+ Using these labels provides key separation between QUIC and TLS; see
+ Section 9.6.
+
+ Both "quic key" and "quic hp" are used to produce keys, so the Length
+ provided to HKDF-Expand-Label along with these labels is determined
+ by the size of keys in the AEAD or header protection algorithm. The
+ Length provided with "quic iv" is the minimum length of the AEAD
+ nonce or 8 bytes if that is larger; see [AEAD].
+
+ The KDF used for initial secrets is always the HKDF-Expand-Label
+ function from TLS 1.3; see Section 5.2.
+
+5.2. Initial Secrets
+
+ Initial packets apply the packet protection process, but use a secret
+ derived from the Destination Connection ID field from the client's
+ first Initial packet.
+
+ This secret is determined by using HKDF-Extract (see Section 2.2 of
+ [HKDF]) with a salt of 0x38762cf7f55934b34d179ae6a4c80cadccbb7f0a and
+ the input keying material (IKM) of the Destination Connection ID
+ field. This produces an intermediate pseudorandom key (PRK) that is
+ used to derive two separate secrets for sending and receiving.
+
+ The secret used by clients to construct Initial packets uses the PRK
+ and the label "client in" as input to the HKDF-Expand-Label function
+ from TLS [TLS13] to produce a 32-byte secret. Packets constructed by
+ the server use the same process with the label "server in". The hash
+ function for HKDF when deriving initial secrets and keys is SHA-256
+ [SHA].
+
+ This process in pseudocode is:
+
+ initial_salt = 0x38762cf7f55934b34d179ae6a4c80cadccbb7f0a
+ initial_secret = HKDF-Extract(initial_salt,
+ client_dst_connection_id)
+
+ client_initial_secret = HKDF-Expand-Label(initial_secret,
+ "client in", "",
+ Hash.length)
+ server_initial_secret = HKDF-Expand-Label(initial_secret,
+ "server in", "",
+ Hash.length)
+
+ The connection ID used with HKDF-Expand-Label is the Destination
+ Connection ID in the Initial packet sent by the client. This will be
+ a randomly selected value unless the client creates the Initial
+ packet after receiving a Retry packet, where the Destination
+ Connection ID is selected by the server.
+
+ Future versions of QUIC SHOULD generate a new salt value, thus
+ ensuring that the keys are different for each version of QUIC. This
+ prevents a middlebox that recognizes only one version of QUIC from
+ seeing or modifying the contents of packets from future versions.
+
+ The HKDF-Expand-Label function defined in TLS 1.3 MUST be used for
+ Initial packets even where the TLS versions offered do not include
+ TLS 1.3.
+
+ The secrets used for constructing subsequent 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 field could be any length
+ | up to 20 bytes, including zero length if the server sends a
+ | Retry packet with a zero-length Source Connection ID field.
+ | After a Retry, the Initial keys provide the client no assurance
+ | that the server received its packet, so the client has to rely
+ | on the exchange that included the Retry packet to validate the
+ | server address; see Section 8.1 of [QUIC-TRANSPORT].
+
+ Appendix A contains sample Initial packets.
+
+5.3. AEAD Usage
+
+ The Authenticated Encryption with Associated Data (AEAD) function
+ (see [AEAD]) used for QUIC packet protection is the AEAD that is
+ negotiated for use with the TLS connection. For example, if TLS is
+ using the TLS_AES_128_GCM_SHA256 cipher suite, the AEAD_AES_128_GCM
+ function is used.
+
+ QUIC can use any of the cipher suites defined in [TLS13] with the
+ exception of TLS_AES_128_CCM_8_SHA256. A cipher suite MUST NOT be
+ negotiated unless a header protection scheme is defined for the
+ cipher suite. This document defines a header protection scheme for
+ all cipher suites defined in [TLS13] aside from
+ TLS_AES_128_CCM_8_SHA256. These cipher suites have a 16-byte
+ authentication tag and produce an output 16 bytes larger than their
+ input.
+
+ An endpoint MUST NOT reject a ClientHello that offers a cipher suite
+ that it does not support, or it would be impossible to deploy a new
+ cipher suite. This also applies to TLS_AES_128_CCM_8_SHA256.
+
+ When constructing packets, the AEAD function is applied prior to
+ applying header protection; see Section 5.4. The unprotected packet
+ header is part of the associated data (A). When processing packets,
+ an endpoint first removes the header protection.
+
+ The key and IV for the packet are computed as described in
+ Section 5.1. The nonce, N, is formed by combining the packet
+ protection IV with the packet number. The 62 bits of the
+ reconstructed QUIC packet number in network byte order are left-
+ padded with zeros to the size of the IV. The exclusive OR of the
+ padded packet number and the IV forms the AEAD nonce.
+
+ The associated data, A, for the AEAD is the contents of the QUIC
+ header, starting from the first byte of either the short or long
+ header, up to and including the unprotected packet number.
+
+ The input plaintext, P, for the AEAD is the payload of the QUIC
+ packet, as described in [QUIC-TRANSPORT].
+
+ The output ciphertext, C, of the AEAD is transmitted in place of P.
+
+ Some AEAD functions have limits for how many packets can be encrypted
+ under the same key and IV; see Section 6.6. This might be lower than
+ the packet number limit. An endpoint MUST initiate a key update
+ (Section 6) prior to exceeding any limit set for the AEAD that is in
+ use.
+
+5.4. Header Protection
+
+ Parts of QUIC packet headers, in particular the Packet Number field,
+ are protected using a key that is derived separately from the packet
+ protection key and IV. The key derived using the "quic hp" label is
+ used to provide confidentiality protection for those fields that are
+ not exposed to on-path elements.
+
+ This protection applies to the least significant bits of the first
+ byte, plus the Packet Number field. The four least significant bits
+ of the first byte are protected for packets with long headers; the
+ five least significant bits of the first byte are protected for
+ packets with short headers. For both header forms, this covers the
+ reserved bits and the Packet Number Length field; the Key Phase bit
+ is also protected for packets with a short header.
+
+ The same header protection key is used for the duration of the
+ connection, with the value not changing after a key update (see
+ Section 6). This allows header protection to be used to protect the
+ key phase.
+
+ This process does not apply to Retry or Version Negotiation packets,
+ which do not contain a protected payload or any of the fields that
+ are protected by this process.
+
+5.4.1. Header Protection Application
+
+ Header protection is applied after packet protection is applied (see
+ Section 5.3). The ciphertext of the packet is sampled and used as
+ input to an encryption algorithm. The algorithm used depends on the
+ negotiated AEAD.
+
+ The output of this algorithm is a 5-byte mask that is applied to the
+ protected header fields using exclusive OR. The least significant
+ bits of the first byte of the packet are masked by the least
+ significant bits of the first mask byte, and the packet number is
+ masked with the remaining bytes. Any unused bytes of mask that might
+ result from a shorter packet number encoding are unused.
+
+ Figure 6 shows a sample algorithm for applying header protection.
+ Removing header protection only differs in the order in which the
+ packet number length (pn_length) is determined (here "^" is used to
+ represent exclusive OR).
+
+ mask = header_protection(hp_key, sample)
+
+ pn_length = (packet[0] & 0x03) + 1
+ if (packet[0] & 0x80) == 0x80:
+ # Long header: 4 bits masked
+ packet[0] ^= mask[0] & 0x0f
+ else:
+ # Short header: 5 bits masked
+ packet[0] ^= mask[0] & 0x1f
+
+ # pn_offset is the start of the Packet Number field.
+ packet[pn_offset:pn_offset+pn_length] ^= mask[1:1+pn_length]
+
+ Figure 6: Header Protection Pseudocode
+
+ Specific header protection functions are defined based on the
+ selected cipher suite; see Section 5.4.3 and Section 5.4.4.
+
+ Figure 7 shows an example long header packet (Initial) and a short
+ header packet (1-RTT). Figure 7 shows the fields in each header that
+ are covered by header protection and the portion of the protected
+ packet payload that is sampled.
+
+ Initial Packet {
+ Header Form (1) = 1,
+ Fixed Bit (1) = 1,
+ Long Packet Type (2) = 0,
+ Reserved Bits (2), # Protected
+ Packet Number Length (2), # Protected
+ Version (32),
+ DCID Len (8),
+ Destination Connection ID (0..160),
+ SCID Len (8),
+ Source Connection ID (0..160),
+ Token Length (i),
+ Token (..),
+ Length (i),
+ Packet Number (8..32), # Protected
+ Protected Payload (0..24), # Skipped Part
+ Protected Payload (128), # Sampled Part
+ Protected Payload (..) # Remainder
+ }
+
+ 1-RTT Packet {
+ Header Form (1) = 0,
+ Fixed Bit (1) = 1,
+ Spin Bit (1),
+ Reserved Bits (2), # Protected
+ Key Phase (1), # Protected
+ Packet Number Length (2), # Protected
+ Destination Connection ID (0..160),
+ Packet Number (8..32), # Protected
+ Protected Payload (0..24), # Skipped Part
+ Protected Payload (128), # Sampled Part
+ Protected Payload (..), # Remainder
+ }
+
+ Figure 7: Header Protection and Ciphertext Sample
+
+ Before a TLS cipher suite can be used with QUIC, a header protection
+ algorithm MUST be specified for the AEAD used with that cipher suite.
+ This document defines algorithms for AEAD_AES_128_GCM,
+ AEAD_AES_128_CCM, AEAD_AES_256_GCM (all these AES AEADs are defined
+ in [AEAD]), and AEAD_CHACHA20_POLY1305 (defined in [CHACHA]). Prior
+ to TLS selecting a cipher suite, AES header protection is used
+ (Section 5.4.3), matching the AEAD_AES_128_GCM packet protection.
+
+5.4.2. Header Protection Sample
+
+ The header protection algorithm uses both the header protection key
+ and a sample of the ciphertext from the packet Payload field.
+
+ The same number of bytes are always sampled, but an allowance needs
+ to be made for the removal of protection by a receiving endpoint,
+ which will not know the length of the Packet Number field. The
+ sample of ciphertext is taken starting from an offset of 4 bytes
+ after the start of the Packet Number field. That is, in sampling
+ packet ciphertext for header protection, the Packet Number field is
+ assumed to be 4 bytes long (its maximum possible encoded length).
+
+ An endpoint MUST discard packets that are not long enough to contain
+ a complete sample.
+
+ To ensure that sufficient data is available for sampling, packets are
+ padded so that the combined lengths of the encoded packet number and
+ protected payload is at least 4 bytes longer than the sample required
+ for header protection. The cipher suites defined in [TLS13] -- other
+ than TLS_AES_128_CCM_8_SHA256, for which a header protection scheme
+ is not defined in this document -- have 16-byte expansions and
+ 16-byte header protection samples. This results in needing at least
+ 3 bytes of frames in the unprotected payload if the packet number is
+ encoded on a single byte, or 2 bytes of frames for a 2-byte packet
+ number encoding.
+
+ The sampled ciphertext can be determined by the following pseudocode:
+
+ # pn_offset is the start of the Packet Number field.
+ sample_offset = pn_offset + 4
+
+ sample = packet[sample_offset..sample_offset+sample_length]
+
+ Where the packet number offset of a short header packet can be
+ calculated as:
+
+ pn_offset = 1 + len(connection_id)
+
+ And the packet number offset of a long header packet can be
+ calculated as:
+
+ pn_offset = 7 + len(destination_connection_id) +
+ len(source_connection_id) +
+ len(payload_length)
+ if packet_type == Initial:
+ pn_offset += len(token_length) +
+ len(token)
+
+ For example, for a packet with a short header, an 8-byte connection
+ ID, and protected with AEAD_AES_128_GCM, the sample takes bytes 13 to
+ 28 inclusive (using zero-based indexing).
+
+ Multiple QUIC packets might be included in the same UDP datagram.
+ Each packet is handled separately.
+
+5.4.3. AES-Based Header Protection
+
+ This section defines the packet protection algorithm for
+ AEAD_AES_128_GCM, AEAD_AES_128_CCM, and AEAD_AES_256_GCM.
+ AEAD_AES_128_GCM and AEAD_AES_128_CCM use 128-bit AES in Electronic
+ Codebook (ECB) mode. AEAD_AES_256_GCM uses 256-bit AES in ECB mode.
+ AES is defined in [AES].
+
+ This algorithm samples 16 bytes from the packet ciphertext. This
+ value is used as the input to AES-ECB. In pseudocode, the header
+ protection function is defined as:
+
+ header_protection(hp_key, sample):
+ mask = AES-ECB(hp_key, sample)
+
+5.4.4. ChaCha20-Based Header Protection
+
+ When AEAD_CHACHA20_POLY1305 is in use, header protection uses the raw
+ ChaCha20 function as defined in Section 2.4 of [CHACHA]. This uses a
+ 256-bit key and 16 bytes sampled from the packet protection output.
+
+ The first 4 bytes of the sampled ciphertext are the block counter. A
+ ChaCha20 implementation could take a 32-bit integer in place of a
+ byte sequence, in which case, the byte sequence is interpreted as a
+ little-endian value.
+
+ The remaining 12 bytes are used as the nonce. A ChaCha20
+ implementation might take an array of three 32-bit integers in place
+ of a byte sequence, in which case, the nonce bytes are interpreted as
+ a sequence of 32-bit little-endian integers.
+
+ The encryption mask is produced by invoking ChaCha20 to protect 5
+ zero bytes. In pseudocode, the header protection function is defined
+ as:
+
+ header_protection(hp_key, sample):
+ counter = sample[0..3]
+ nonce = sample[4..15]
+ mask = ChaCha20(hp_key, counter, nonce, {0,0,0,0,0})
+
+5.5. Receiving Protected Packets
+
+ Once an endpoint successfully receives a packet with a given packet
+ number, it MUST discard all packets in the same packet number space
+ with higher packet numbers if they cannot be successfully unprotected
+ with either the same key, or -- if there is a key update -- a
+ subsequent packet protection key; see Section 6. Similarly, a packet
+ that appears to trigger a key update but cannot be unprotected
+ successfully MUST be discarded.
+
+ Failure to unprotect a packet does not necessarily indicate the
+ existence of a protocol error in a peer or an attack. The truncated
+ packet number encoding used in QUIC can cause packet numbers to be
+ decoded incorrectly if they are delayed significantly.
+
+5.6. Use of 0-RTT Keys
+
+ If 0-RTT keys are available (see Section 4.6.1), the lack of replay
+ protection means that restrictions on their use are necessary to
+ avoid replay attacks on the protocol.
+
+ Of the frames defined in [QUIC-TRANSPORT], the STREAM, RESET_STREAM,
+ STOP_SENDING, and CONNECTION_CLOSE frames are potentially unsafe for
+ use with 0-RTT as they carry application data. Application data that
+ is received in 0-RTT could cause an application at the server to
+ process the data multiple times rather than just once. Additional
+ actions taken by a server as a result of processing replayed
+ application data could have unwanted consequences. A client
+ therefore MUST NOT use 0-RTT for application data unless specifically
+ requested by the application that is in use.
+
+ An application protocol that uses QUIC MUST include a profile that
+ defines acceptable use of 0-RTT; otherwise, 0-RTT can only be used to
+ carry QUIC frames that do not carry application data. For example, a
+ profile for HTTP is described in [HTTP-REPLAY] and used for HTTP/3;
+ see Section 10.9 of [QUIC-HTTP].
+
+ Though replaying packets might result in additional connection
+ attempts, the effect of processing replayed frames that do not carry
+ application data is limited to changing the state of the affected
+ connection. A TLS handshake cannot be successfully completed using
+ replayed packets.
+
+ A client MAY wish to apply additional restrictions on what data it
+ sends prior to the completion of the TLS handshake.
+
+ A client otherwise treats 0-RTT keys as equivalent to 1-RTT keys,
+ except that it cannot send certain frames with 0-RTT keys; see
+ Section 12.5 of [QUIC-TRANSPORT].
+
+ A client that receives an indication that its 0-RTT data has been
+ accepted by a server can send 0-RTT data until it receives all of the
+ server's handshake messages. A client SHOULD stop sending 0-RTT data
+ if it receives an indication that 0-RTT data has been rejected.
+
+ A server MUST NOT use 0-RTT keys to protect packets; it uses 1-RTT
+ keys to protect acknowledgments of 0-RTT packets. A client MUST NOT
+ attempt to decrypt 0-RTT packets it receives and instead MUST discard
+ them.
+
+ Once a client has installed 1-RTT keys, it MUST NOT send any more
+ 0-RTT packets.
+
+ | Note: 0-RTT data can be acknowledged by the server as it
+ | receives it, but any packets containing acknowledgments of
+ | 0-RTT data cannot have packet protection removed by the client
+ | until the TLS handshake is complete. The 1-RTT keys necessary
+ | to remove packet protection cannot be derived until the client
+ | receives all server handshake messages.
+
+5.7. Receiving Out-of-Order Protected Packets
+
+ Due to reordering and loss, protected packets might be received by an
+ endpoint before the final TLS handshake messages are received. A
+ client will be unable to decrypt 1-RTT packets from the server,
+ whereas a server will be able to decrypt 1-RTT packets from the
+ client. Endpoints in either role MUST NOT decrypt 1-RTT packets from
+ their peer prior to completing the handshake.
+
+ Even though 1-RTT keys are available to a server after receiving the
+ first handshake messages from a client, it is missing assurances on
+ the client state:
+
+ * The client is not authenticated, unless the server has chosen to
+ use a pre-shared key and validated the client's pre-shared key
+ binder; see Section 4.2.11 of [TLS13].
+
+ * The client has not demonstrated liveness, unless the server has
+ validated the client's address with a Retry packet or other means;
+ see Section 8.1 of [QUIC-TRANSPORT].
+
+ * Any received 0-RTT data that the server responds to might be due
+ to a replay attack.
+
+ Therefore, the server's use of 1-RTT keys before the handshake is
+ complete is limited to sending data. A server MUST NOT process
+ incoming 1-RTT protected packets before the TLS handshake is
+ complete. Because sending acknowledgments indicates that all frames
+ in a packet have been processed, a server cannot send acknowledgments
+ for 1-RTT packets until the TLS handshake is complete. Received
+ packets protected with 1-RTT keys MAY be stored and later decrypted
+ and used once the handshake is complete.
+
+ | Note: TLS implementations might provide all 1-RTT secrets prior
+ | to handshake completion. Even where QUIC implementations have
+ | 1-RTT read keys, those keys are not to be used prior to
+ | completing the handshake.
+
+ The requirement for the server to wait for the client Finished
+ message creates a dependency on that message being delivered. A
+ client can avoid the potential for head-of-line blocking that this
+ implies by sending its 1-RTT packets coalesced with a Handshake
+ packet containing a copy of the CRYPTO frame that carries the
+ Finished message, until one of the Handshake packets is acknowledged.
+ This enables immediate server processing for those packets.
+
+ A server could receive packets protected with 0-RTT keys prior to
+ receiving a TLS ClientHello. The server MAY retain these packets for
+ later decryption in anticipation of receiving a ClientHello.
+
+ A client generally receives 1-RTT keys at the same time as the
+ handshake completes. Even if it has 1-RTT secrets, a client MUST NOT
+ process incoming 1-RTT protected packets before the TLS handshake is
+ complete.
+
+5.8. Retry Packet Integrity
+
+ Retry packets (see Section 17.2.5 of [QUIC-TRANSPORT]) carry a Retry
+ Integrity Tag that provides two properties: it allows the discarding
+ of packets that have accidentally been corrupted by the network, and
+ only an entity that observes an Initial packet can send a valid Retry
+ packet.
+
+ The Retry Integrity Tag is a 128-bit field that is computed as the
+ output of AEAD_AES_128_GCM [AEAD] used with the following inputs:
+
+ * The secret key, K, is 128 bits equal to
+ 0xbe0c690b9f66575a1d766b54e368c84e.
+
+ * The nonce, N, is 96 bits equal to 0x461599d35d632bf2239825bb.
+
+ * The plaintext, P, is empty.
+
+ * The associated data, A, is the contents of the Retry Pseudo-
+ Packet, as illustrated in Figure 8:
+
+ The secret key and the nonce are values derived by calling HKDF-
+ Expand-Label using
+ 0xd9c9943e6101fd200021506bcc02814c73030f25c79d71ce876eca876e6fca8e as
+ the secret, with labels being "quic key" and "quic iv" (Section 5.1).
+
+ Retry Pseudo-Packet {
+ ODCID Length (8),
+ Original Destination Connection ID (0..160),
+ Header Form (1) = 1,
+ Fixed Bit (1) = 1,
+ Long Packet Type (2) = 3,
+ Unused (4),
+ Version (32),
+ DCID Len (8),
+ Destination Connection ID (0..160),
+ SCID Len (8),
+ Source Connection ID (0..160),
+ Retry Token (..),
+ }
+
+ Figure 8: Retry Pseudo-Packet
+
+ The Retry Pseudo-Packet is not sent over the wire. It is computed by
+ taking the transmitted Retry packet, removing the Retry Integrity
+ Tag, and prepending the two following fields:
+
+ ODCID Length: The ODCID Length field contains the length in bytes of
+ the Original Destination Connection ID field that follows it,
+ encoded as an 8-bit unsigned integer.
+
+ Original Destination Connection ID: The Original Destination
+ Connection ID contains the value of the Destination Connection ID
+ from the Initial packet that this Retry is in response to. The
+ length of this field is given in ODCID Length. The presence of
+ this field ensures that a valid Retry packet can only be sent by
+ an entity that observes the Initial packet.
+
+6. Key Update
+
+ Once the handshake is confirmed (see Section 4.1.2), an endpoint MAY
+ initiate a key update.
+
+ The Key Phase bit indicates which packet protection keys are used to
+ protect the packet. The Key Phase bit is initially set to 0 for the
+ first set of 1-RTT packets and toggled to signal each subsequent key
+ update.
+
+ 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.
+
+ Initiating a key update results in both endpoints updating keys.
+ This differs from TLS where endpoints can update keys independently.
+
+ This mechanism replaces the key update mechanism of TLS, which relies
+ on KeyUpdate messages sent using 1-RTT encryption keys. Endpoints
+ MUST NOT send a TLS KeyUpdate message. Endpoints MUST treat the
+ receipt of a TLS KeyUpdate message as a connection error of type
+ 0x010a, equivalent to a fatal TLS alert of unexpected_message; see
+ Section 4.8.
+
+ Figure 9 shows a key update process, where the initial set of keys
+ used (identified with @M) are replaced by updated keys (identified
+ with @N). The value of the Key Phase bit is indicated in brackets
+ [].
+
+ Initiating Peer Responding Peer
+
+ @M [0] QUIC Packets
+
+ ... Update to @N
+ @N [1] QUIC Packets
+ -------->
+ Update to @N ...
+ QUIC Packets [1] @N
+ <--------
+ QUIC Packets [1] @N
+ containing ACK
+ <--------
+ ... Key Update Permitted
+
+ @N [1] QUIC Packets
+ containing ACK for @N packets
+ -------->
+ Key Update Permitted ...
+
+ Figure 9: Key Update
+
+6.1. Initiating a Key Update
+
+ 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.
+ The endpoint creates a new write secret from the existing write
+ secret as performed in Section 7.2 of [TLS13]. This uses the KDF
+ function provided by TLS with a label of "quic ku". The
+ corresponding key and IV are created from that secret as defined in
+ Section 5.1. The header protection key is not updated.
+
+ For example, to update write keys with TLS 1.3, HKDF-Expand-Label is
+ used as:
+
+ secret_<n+1> = HKDF-Expand-Label(secret_<n>, "quic ku",
+ "", Hash.length)
+
+ The endpoint toggles the value of the Key Phase bit and uses the
+ 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 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 MUST retain old keys until it has successfully
+ unprotected a packet sent using the new keys. An endpoint SHOULD
+ retain old keys for some time after unprotecting a packet sent using
+ the new keys. 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
+ acknowledgment 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 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
+ acknowledgment 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 acknowledgment according
+ to its normal packet sending behavior; 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 acknowledgment 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 acknowledgment for
+ the packet that initiated the key update, it indicates that its peer
+ has updated keys twice without awaiting confirmation. An endpoint
+ MAY treat such consecutive key updates as a connection error of type
+ KEY_UPDATE_ERROR.
+
+ An endpoint that receives an acknowledgment 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.5). Endpoints can use randomized packet
+ protection keys in place of discarded keys when key updates are not
+ yet permitted. Using randomized keys ensures that attempting to
+ remove packet protection does not result in timing variations, and
+ results in 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
+ generate new keys as part of packet processing, but this creates a
+ timing signal that could be used by an attacker to learn when key
+ updates happen and thus leak the value of the Key Phase bit.
+
+ Endpoints are generally expected to have current and next receive
+ packet protection keys available. For a short period after a key
+ update completes, up to the PTO, endpoints MAY defer generation of
+ the next set of receive packet protection keys. This allows
+ endpoints to retain only two sets of receive keys; 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 never sends packets that are protected with old keys.
+ Only the current keys are used. Keys used for protecting packets 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 is necessary to distinguish between the two if packets
+ protected with old keys are to be processed. 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.5 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 promoting the next set of receive
+ keys to be current before it creates the subsequent 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 a peer to initiate further 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 the peer 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 having received a packet protected using the new keys.
+ After this period, old read keys and their corresponding secrets
+ SHOULD be discarded.
+
+6.6. Limits on AEAD Usage
+
+ This document sets usage limits for AEAD algorithms to ensure that
+ overuse does not give an adversary a disproportionate advantage in
+ attacking the confidentiality and integrity of communications when
+ using QUIC.
+
+ The usage limits defined in TLS 1.3 exist for protection against
+ attacks on confidentiality and apply to successful applications of
+ AEAD protection. The integrity protections in authenticated
+ encryption also depend on limiting the number of attempts to forge
+ packets. TLS achieves this by closing connections after any record
+ fails an authentication check. In comparison, QUIC ignores any
+ packet that cannot be authenticated, allowing multiple forgery
+ attempts.
+
+ QUIC accounts for AEAD confidentiality and integrity limits
+ separately. The confidentiality limit applies to the number of
+ packets encrypted with a given key. The integrity limit applies to
+ the number of packets decrypted within a given connection. Details
+ on enforcing these limits for each AEAD algorithm follow below.
+
+ Endpoints MUST count the number of encrypted packets for each set of
+ keys. If the total number of encrypted packets with the same key
+ exceeds the confidentiality limit for the selected AEAD, the endpoint
+ MUST stop using those keys. Endpoints MUST initiate a key update
+ before sending more protected packets than the confidentiality limit
+ for the selected AEAD permits. If a key update is not possible or
+ integrity limits are reached, the endpoint MUST stop using the
+ connection and only send stateless resets in response to receiving
+ packets. It is RECOMMENDED that endpoints immediately close the
+ connection with a connection error of type AEAD_LIMIT_REACHED before
+ reaching a state where key updates are not possible.
+
+ For AEAD_AES_128_GCM and AEAD_AES_256_GCM, the confidentiality limit
+ is 2^23 encrypted packets; see Appendix B.1. For
+ AEAD_CHACHA20_POLY1305, the confidentiality limit is greater than the
+ number of possible packets (2^62) and so can be disregarded. For
+ AEAD_AES_128_CCM, the confidentiality limit is 2^21.5 encrypted
+ packets; see Appendix B.2. Applying a limit reduces the probability
+ that an attacker can distinguish the AEAD in use from a random
+ permutation; see [AEBounds], [ROBUST], and [GCM-MU].
+
+ In addition to counting packets sent, endpoints MUST count the number
+ of received packets that fail authentication during the lifetime of a
+ connection. If the total number of received packets that fail
+ authentication within the connection, across all keys, exceeds the
+ integrity limit for the selected AEAD, the endpoint MUST immediately
+ close the connection with a connection error of type
+ AEAD_LIMIT_REACHED and not process any more packets.
+
+ For AEAD_AES_128_GCM and AEAD_AES_256_GCM, the integrity limit is
+ 2^52 invalid packets; see Appendix B.1. For AEAD_CHACHA20_POLY1305,
+ the integrity limit is 2^36 invalid packets; see [AEBounds]. For
+ AEAD_AES_128_CCM, the integrity limit is 2^21.5 invalid packets; see
+ Appendix B.2. Applying this limit reduces the probability that an
+ attacker can successfully forge a packet; see [AEBounds], [ROBUST],
+ and [GCM-MU].
+
+ Endpoints that limit the size of packets MAY use higher
+ confidentiality and integrity limits; see Appendix B for details.
+
+ Future analyses and specifications MAY relax confidentiality or
+ integrity limits for an AEAD.
+
+ Any TLS cipher suite that is specified for use with QUIC MUST define
+ limits on the use of the associated AEAD function that preserves
+ margins for confidentiality and integrity. That is, limits MUST be
+ specified for the number of packets that can be authenticated and for
+ the number of packets that can fail authentication. Providing a
+ reference to any analysis upon which values are based -- and any
+ assumptions used in that analysis -- allows limits to be adapted to
+ varying usage conditions.
+
+6.7. Key Update Error Code
+
+ The KEY_UPDATE_ERROR error code (0x0e) is used to signal errors
+ related to key updates.
+
+7. Security of Initial Messages
+
+ Initial packets are not protected with a secret key, so they are
+ subject to potential tampering by an attacker. QUIC provides
+ protection against attackers that cannot read packets but does not
+ attempt to provide additional protection against attacks where the
+ attacker can observe and inject packets. Some forms of tampering --
+ such as modifying the TLS messages themselves -- are detectable, but
+ some -- such as modifying ACKs -- are not.
+
+ For example, an attacker could inject a packet containing an ACK
+ frame to make it appear that a packet had not been received or to
+ create a false impression of the state of the connection (e.g., by
+ modifying the ACK Delay). Note that such a packet could cause a
+ legitimate packet to be dropped as a duplicate. Implementations
+ SHOULD use caution in relying on any data that is contained in
+ Initial packets that is not otherwise authenticated.
+
+ It is also possible for the attacker to tamper with data that is
+ carried in Handshake packets, but because that sort of tampering
+ requires modifying TLS handshake messages, any such tampering will
+ cause the TLS handshake to fail.
+
+8. QUIC-Specific Adjustments to the TLS Handshake
+
+ Certain aspects of the TLS handshake are different when used with
+ QUIC.
+
+ QUIC also requires additional features from TLS. In addition to
+ negotiation of cryptographic parameters, the TLS handshake carries
+ and authenticates values for QUIC transport parameters.
+
+8.1. Protocol Negotiation
+
+ QUIC requires that the cryptographic handshake provide authenticated
+ protocol negotiation. TLS uses Application-Layer Protocol
+ Negotiation [ALPN] to select an application protocol. Unless another
+ mechanism is used for agreeing on an application protocol, endpoints
+ MUST use ALPN for this purpose.
+
+ When using ALPN, endpoints MUST immediately close a connection (see
+ Section 10.2 of [QUIC-TRANSPORT]) with a no_application_protocol TLS
+ alert (QUIC error code 0x0178; see Section 4.8) if an application
+ protocol is not negotiated. While [ALPN] only specifies that servers
+ use this alert, QUIC clients MUST use error 0x0178 to terminate a
+ connection when ALPN negotiation fails.
+
+ An application protocol MAY restrict the QUIC versions that it can
+ operate over. Servers MUST select an application protocol compatible
+ with the QUIC version that the client has selected. The server MUST
+ treat the inability to select a compatible application protocol as a
+ connection error of type 0x0178 (no_application_protocol).
+ Similarly, a client MUST treat the selection of an incompatible
+ application protocol by a server as a connection error of type
+ 0x0178.
+
+8.2. QUIC Transport Parameters Extension
+
+ QUIC transport parameters are carried in a TLS extension. Different
+ versions of QUIC might define a different method for negotiating
+ transport configuration.
+
+ Including transport parameters in the TLS handshake provides
+ integrity protection for these values.
+
+ enum {
+ quic_transport_parameters(0x39), (65535)
+ } ExtensionType;
+
+ The extension_data field of the quic_transport_parameters extension
+ contains a value that is defined by the version of QUIC that is in
+ use.
+
+ The quic_transport_parameters extension is carried in the ClientHello
+ and the EncryptedExtensions messages during the handshake. Endpoints
+ MUST send the quic_transport_parameters extension; endpoints that
+ receive ClientHello or EncryptedExtensions messages without the
+ quic_transport_parameters extension MUST close the connection with an
+ error of type 0x016d (equivalent to a fatal TLS missing_extension
+ alert, see Section 4.8).
+
+ Transport parameters become available prior to the completion of the
+ handshake. A server might use these values earlier than handshake
+ completion. However, the value of transport parameters is not
+ authenticated until the handshake completes, so any use of these
+ parameters cannot depend on their authenticity. Any tampering with
+ transport parameters will cause the handshake to fail.
+
+ 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
+ fatal unsupported_extension alert MUST be sent by an implementation
+ that supports this extension if the extension is received when the
+ transport is not QUIC.
+
+ Negotiating the quic_transport_parameters extension causes the
+ EndOfEarlyData to be removed; see Section 8.3.
+
+8.3. Removing the EndOfEarlyData Message
+
+ The TLS EndOfEarlyData message is not used with QUIC. QUIC does not
+ rely on this message to mark the end of 0-RTT data or to signal the
+ change to Handshake keys.
+
+ Clients MUST NOT send the EndOfEarlyData message. A server MUST
+ treat receipt of a CRYPTO frame in a 0-RTT packet as a connection
+ error of type PROTOCOL_VIOLATION.
+
+ As a result, EndOfEarlyData does not appear in the TLS handshake
+ transcript.
+
+8.4. Prohibit TLS Middlebox Compatibility Mode
+
+ Appendix D.4 of [TLS13] describes an alteration to the TLS 1.3
+ handshake as a workaround for bugs in some middleboxes. The TLS 1.3
+ middlebox compatibility mode involves setting the legacy_session_id
+ field to a 32-byte value in the ClientHello and ServerHello, then
+ sending a change_cipher_spec record. Both field and record carry no
+ semantic content and are ignored.
+
+ This mode has no use in QUIC as it only applies to middleboxes that
+ interfere with TLS over TCP. QUIC also provides no means to carry a
+ change_cipher_spec record. A client MUST NOT request the use of the
+ TLS 1.3 compatibility mode. A server SHOULD treat the receipt of a
+ TLS ClientHello with a non-empty legacy_session_id field as a
+ connection error of type PROTOCOL_VIOLATION.
+
+9. Security Considerations
+
+ All of the security considerations that apply to TLS also apply to
+ the use of TLS in QUIC. Reading all of [TLS13] and its appendices is
+ the best way to gain an understanding of the security properties of
+ QUIC.
+
+ This section summarizes some of the more important security aspects
+ specific to the TLS integration, though there are many security-
+ relevant details in the remainder of the document.
+
+9.1. Session Linkability
+
+ Use of TLS session tickets allows servers and possibly other entities
+ to correlate connections made by the same client; see Section 4.5 for
+ details.
+
+9.2. Replay Attacks with 0-RTT
+
+ As described in Section 8 of [TLS13], use of TLS early data comes
+ with an exposure to replay attack. The use of 0-RTT in QUIC is
+ similarly vulnerable to replay attack.
+
+ Endpoints MUST implement and use the replay protections described in
+ [TLS13], however it is recognized that these protections are
+ imperfect. Therefore, additional consideration of the risk of replay
+ is needed.
+
+ QUIC is not vulnerable to replay attack, except via the application
+ protocol information it might carry. The management of QUIC protocol
+ state based on the frame types defined in [QUIC-TRANSPORT] is not
+ vulnerable to replay. Processing of QUIC frames is idempotent and
+ cannot result in invalid connection states if frames are replayed,
+ reordered, or lost. QUIC connections do not produce effects that
+ last beyond the lifetime of the connection, except for those produced
+ by the application protocol that QUIC serves.
+
+ TLS session tickets and address validation tokens are used to carry
+ QUIC configuration information between connections, specifically, to
+ enable a server to efficiently recover state that is used in
+ connection establishment and address validation. These MUST NOT be
+ used to communicate application semantics between endpoints; clients
+ MUST treat them as opaque values. The potential for reuse of these
+ tokens means that they require stronger protections against replay.
+
+ A server that accepts 0-RTT on a connection incurs a higher cost than
+ accepting a connection without 0-RTT. This includes higher
+ processing and computation costs. Servers need to consider the
+ probability of replay and all associated costs when accepting 0-RTT.
+
+ Ultimately, the responsibility for managing the risks of replay
+ attacks with 0-RTT lies with an application protocol. An application
+ protocol that uses QUIC MUST describe how the protocol uses 0-RTT and
+ the measures that are employed to protect against replay attack. An
+ analysis of replay risk needs to consider all QUIC protocol features
+ that carry application semantics.
+
+ Disabling 0-RTT entirely is the most effective defense against replay
+ attack.
+
+ QUIC extensions MUST either describe how replay attacks affect their
+ operation or prohibit the use of the extension in 0-RTT. Application
+ protocols MUST either prohibit the use of extensions that carry
+ application semantics in 0-RTT or provide replay mitigation
+ strategies.
+
+9.3. Packet Reflection Attack Mitigation
+
+ A small ClientHello that results in a large block of handshake
+ messages from a server can be used in packet reflection attacks to
+ amplify the traffic generated by an attacker.
+
+ QUIC includes three defenses against this attack. First, the packet
+ containing a ClientHello MUST be padded to a minimum size. Second,
+ if responding to an unverified source address, the server is
+ forbidden to send more than three times as many bytes as the number
+ of bytes it has received (see Section 8.1 of [QUIC-TRANSPORT]).
+ Finally, because acknowledgments of Handshake packets are
+ authenticated, a blind attacker cannot forge them. Put together,
+ these defenses limit the level of amplification.
+
+9.4. Header Protection Analysis
+
+ [NAN] analyzes authenticated encryption algorithms that provide nonce
+ privacy, referred to as "Hide Nonce" (HN) transforms. The general
+ header protection construction in this document is one of those
+ algorithms (HN1). Header protection is applied after the packet
+ protection AEAD, sampling a set of bytes ("sample") from the AEAD
+ output and encrypting the header field using a pseudorandom function
+ (PRF) as follows:
+
+ protected_field = field XOR PRF(hp_key, sample)
+
+ The header protection variants in this document use a pseudorandom
+ 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
+ compromising header protection. Protecting two different headers
+ 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
+ bits are sampled, the odds of two ciphertext samples being identical
+ approach 2^(-L/2), that is, the birthday bound. For the algorithms
+ described in this document, that probability is one in 2^64.
+
+ To prevent an attacker from modifying packet headers, the header is
+ transitively authenticated using packet protection; the entire packet
+ header is part of the authenticated additional data. Protected
+ fields that are falsified or modified can only be detected once the
+ packet protection is removed.
+
+9.5. Header Protection Timing Side Channels
+
+ An attacker could guess values for packet numbers or Key Phase and
+ have an endpoint confirm guesses through timing side channels.
+ Similarly, guesses for the packet number length can be tried and
+ exposed. If the recipient of a packet discards packets with
+ duplicate packet numbers without attempting to remove packet
+ protection, they could reveal through timing side channels that the
+ packet number matches a received packet. For authentication to be
+ 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
+ payloads and packet numbers MUST be free from side channels that
+ would reveal the packet number or its encoded size.
+
+ 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.6. Key Diversity
+
+ In using TLS, the central key schedule of TLS is used. As a result
+ of the TLS handshake messages being integrated into the calculation
+ of secrets, the inclusion of the QUIC transport parameters extension
+ ensures that the 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 possibility of cross-protocol key synchronization, additional
+ measures are provided to improve key separation.
+
+ The QUIC packet protection keys and IVs are derived using a different
+ label than the equivalent keys in TLS.
+
+ To preserve this separation, a new version of QUIC SHOULD define new
+ labels for key derivation for packet protection key and IV, plus the
+ header protection keys. This version of QUIC uses the string "quic".
+ Other versions can use a version-specific label in place of that
+ string.
+
+ The initial secrets use a key that is specific to the negotiated QUIC
+ version. New QUIC versions SHOULD define a new salt value used in
+ calculating initial secrets.
+
+9.7. Randomness
+
+ QUIC depends on endpoints being able to generate secure random
+ numbers, both directly for protocol values such as the connection ID,
+ and transitively via TLS. See [RFC4086] for guidance on secure
+ random number generation.
+
+10. IANA Considerations
+
+ IANA has registered a codepoint of 57 (or 0x39) for the
+ quic_transport_parameters extension (defined in Section 8.2) in the
+ "TLS ExtensionType Values" registry [TLS-REGISTRIES].
+
+ The Recommended column for this extension is marked Yes. The TLS 1.3
+ Column includes CH (ClientHello) and EE (EncryptedExtensions).
+
+ +=======+===========================+=====+=============+===========+
+ | Value | Extension Name | TLS | Recommended | Reference |
+ | | | 1.3 | | |
+ +=======+===========================+=====+=============+===========+
+ | 57 | quic_transport_parameters | CH, | Y | This |
+ | | | EE | | document |
+ +-------+---------------------------+-----+-------------+-----------+
+
+ Table 2: TLS ExtensionType Values Registry Entry
+
+11. References
+
+11.1. Normative References
+
+ [AEAD] McGrew, D., "An Interface and Algorithms for Authenticated
+ Encryption", RFC 5116, DOI 10.17487/RFC5116, January 2008,
+ <https://www.rfc-editor.org/info/rfc5116>.
+
+ [AES] "Advanced encryption standard (AES)", National Institute
+ of Standards and Technology report,
+ DOI 10.6028/nist.fips.197, November 2001,
+ <https://doi.org/10.6028/nist.fips.197>.
+
+ [ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan,
+ "Transport Layer Security (TLS) Application-Layer Protocol
+ Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301,
+ July 2014, <https://www.rfc-editor.org/info/rfc7301>.
+
+ [CHACHA] Nir, Y. and A. Langley, "ChaCha20 and Poly1305 for IETF
+ Protocols", RFC 8439, DOI 10.17487/RFC8439, June 2018,
+ <https://www.rfc-editor.org/info/rfc8439>.
+
+ [HKDF] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand
+ Key Derivation Function (HKDF)", RFC 5869,
+ DOI 10.17487/RFC5869, May 2010,
+ <https://www.rfc-editor.org/info/rfc5869>.
+
+ [QUIC-RECOVERY]
+ Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection
+ and Congestion Control", RFC 9002, DOI 10.17487/RFC9002,
+ May 2021, <https://www.rfc-editor.org/info/rfc9002>.
+
+ [QUIC-TRANSPORT]
+ Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based
+ Multiplexed and Secure Transport", RFC 9000,
+ DOI 10.17487/RFC9000, May 2021,
+ <https://www.rfc-editor.org/info/rfc9000>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker,
+ "Randomness Requirements for Security", BCP 106, RFC 4086,
+ DOI 10.17487/RFC4086, June 2005,
+ <https://www.rfc-editor.org/info/rfc4086>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [SHA] Dang, Q., "Secure Hash Standard", National Institute of
+ Standards and Technology report,
+ DOI 10.6028/nist.fips.180-4, July 2015,
+ <https://doi.org/10.6028/nist.fips.180-4>.
+
+ [TLS-REGISTRIES]
+ Salowey, J. and S. Turner, "IANA Registry Updates for TLS
+ and DTLS", RFC 8447, DOI 10.17487/RFC8447, August 2018,
+ <https://www.rfc-editor.org/info/rfc8447>.
+
+ [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol
+ Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
+ <https://www.rfc-editor.org/info/rfc8446>.
+
+11.2. Informative References
+
+ [AEBounds] Luykx, A. and K. Paterson, "Limits on Authenticated
+ Encryption Use in TLS", 28 August 2017,
+ <https://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>.
+
+ [ASCII] Cerf, V., "ASCII format for network interchange", STD 80,
+ RFC 20, DOI 10.17487/RFC0020, October 1969,
+ <https://www.rfc-editor.org/info/rfc20>.
+
+ [CCM-ANALYSIS]
+ Jonsson, J., "On the Security of CTR + CBC-MAC", Selected
+ Areas in Cryptography, SAC 2002, Lecture Notes in Computer
+ Science, vol 2595, pp. 76-93, DOI 10.1007/3-540-36492-7_7,
+ 2003, <https://doi.org/10.1007/3-540-36492-7_7>.
+
+ [COMPRESS] Ghedini, A. and V. Vasiliev, "TLS Certificate
+ Compression", RFC 8879, DOI 10.17487/RFC8879, December
+ 2020, <https://www.rfc-editor.org/info/rfc8879>.
+
+ [GCM-MU] Hoang, V., Tessaro, S., and A. Thiruvengadam, "The Multi-
+ user Security of GCM, Revisited: Tight Bounds for Nonce
+ Randomization", CCS '18: Proceedings of the 2018 ACM
+ SIGSAC Conference on Computer and Communications Security,
+ pp. 1429-1440, DOI 10.1145/3243734.3243816, 2018,
+ <https://doi.org/10.1145/3243734.3243816>.
+
+ [HTTP-REPLAY]
+ Thomson, M., Nottingham, M., and W. Tarreau, "Using Early
+ Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September
+ 2018, <https://www.rfc-editor.org/info/rfc8470>.
+
+ [HTTP2-TLS13]
+ Benjamin, D., "Using TLS 1.3 with HTTP/2", RFC 8740,
+ DOI 10.17487/RFC8740, February 2020,
+ <https://www.rfc-editor.org/info/rfc8740>.
+
+ [IMC] Katz, J. and Y. Lindell, "Introduction to Modern
+ Cryptography, Second Edition", ISBN 978-1466570269, 6
+ November 2014.
+
+ [NAN] Bellare, M., Ng, R., and B. Tackmann, "Nonces Are Noticed:
+ AEAD Revisited", Advances in Cryptology - CRYPTO 2019,
+ Lecture Notes in Computer Science, vol 11692, pp. 235-265,
+ DOI 10.1007/978-3-030-26948-7_9, 2019,
+ <https://doi.org/10.1007/978-3-030-26948-7_9>.
+
+ [QUIC-HTTP]
+ Bishop, M., Ed., "Hypertext Transfer Protocol Version 3
+ (HTTP/3)", Work in Progress, Internet-Draft, draft-ietf-
+ quic-http-34, 2 February 2021,
+ <https://tools.ietf.org/html/draft-ietf-quic-http-34>.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
+ DOI 10.17487/RFC2818, May 2000,
+ <https://www.rfc-editor.org/info/rfc2818>.
+
+ [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S.,
+ Housley, R., and W. Polk, "Internet X.509 Public Key
+ Infrastructure Certificate and Certificate Revocation List
+ (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008,
+ <https://www.rfc-editor.org/info/rfc5280>.
+
+ [ROBUST] Fischlin, M., Günther, F., and C. Janson, "Robust
+ Channels: Handling Unreliable Networks in the Record
+ Layers of QUIC and DTLS 1.3", 16 May 2020,
+ <https://eprint.iacr.org/2020/718>.
+
+Appendix A. Sample Packet Protection
+
+ This section shows examples of packet protection so that
+ implementations can be verified incrementally. Samples of Initial
+ packets from both client and server plus a Retry packet are defined.
+ These packets use an 8-byte client-chosen Destination Connection ID
+ of 0x8394c8f03e515708. Some intermediate values are included. All
+ values are shown in hexadecimal.
+
+A.1. Keys
+
+ The labels generated during the execution of the HKDF-Expand-Label
+ function (that is, HkdfLabel.label) and part of the value given to
+ the HKDF-Expand function in order to produce its output are:
+
+ client in: 00200f746c73313320636c69656e7420696e00
+
+ server in: 00200f746c7331332073657276657220696e00
+
+ quic key: 00100e746c7331332071756963206b657900
+
+ quic iv: 000c0d746c733133207175696320697600
+
+ quic hp: 00100d746c733133207175696320687000
+
+ The initial secret is common:
+
+ initial_secret = HKDF-Extract(initial_salt, cid)
+ = 7db5df06e7a69e432496adedb0085192
+ 3595221596ae2ae9fb8115c1e9ed0a44
+
+ The secrets for protecting client packets are:
+
+ client_initial_secret
+ = HKDF-Expand-Label(initial_secret, "client in", "", 32)
+ = c00cf151ca5be075ed0ebfb5c80323c4
+ 2d6b7db67881289af4008f1f6c357aea
+
+ key = HKDF-Expand-Label(client_initial_secret, "quic key", "", 16)
+ = 1f369613dd76d5467730efcbe3b1a22d
+
+ iv = HKDF-Expand-Label(client_initial_secret, "quic iv", "", 12)
+ = fa044b2f42a3fd3b46fb255c
+
+ hp = HKDF-Expand-Label(client_initial_secret, "quic hp", "", 16)
+ = 9f50449e04a0e810283a1e9933adedd2
+
+ The secrets for protecting server packets are:
+
+ server_initial_secret
+ = HKDF-Expand-Label(initial_secret, "server in", "", 32)
+ = 3c199828fd139efd216c155ad844cc81
+ fb82fa8d7446fa7d78be803acdda951b
+
+ key = HKDF-Expand-Label(server_initial_secret, "quic key", "", 16)
+ = cf3a5331653c364c88f0f379b6067e37
+
+ iv = HKDF-Expand-Label(server_initial_secret, "quic iv", "", 12)
+ = 0ac1493ca1905853b0bba03e
+
+ hp = HKDF-Expand-Label(server_initial_secret, "quic hp", "", 16)
+ = c206b8d9b9f0f37644430b490eeaa314
+
+A.2. Client Initial
+
+ The client sends an Initial packet. The unprotected payload of this
+ packet contains the following CRYPTO frame, plus enough PADDING
+ frames to make a 1162-byte payload:
+
+ 060040f1010000ed0303ebf8fa56f129 39b9584a3896472ec40bb863cfd3e868
+ 04fe3a47f06a2b69484c000004130113 02010000c000000010000e00000b6578
+ 616d706c652e636f6dff01000100000a 00080006001d00170018001000070005
+ 04616c706e0005000501000000000033 00260024001d00209370b2c9caa47fba
+ baf4559fedba753de171fa71f50f1ce1 5d43e994ec74d748002b000302030400
+ 0d0010000e0403050306030203080408 050806002d00020101001c0002400100
+ 3900320408ffffffffffffffff050480 00ffff07048000ffff08011001048000
+ 75300901100f088394c8f03e51570806 048000ffff
+
+ The unprotected header indicates a length of 1182 bytes: the 4-byte
+ packet number, 1162 bytes of frames, and the 16-byte authentication
+ tag. The header includes the connection ID and a packet number of 2:
+
+ c300000001088394c8f03e5157080000449e00000002
+
+ Protecting the payload produces output that is sampled for header
+ protection. Because the header uses a 4-byte packet number encoding,
+ the first 16 bytes of the protected payload is sampled and then
+ applied to the header as follows:
+
+ sample = d1b1c98dd7689fb8ec11d242b123dc9b
+
+ mask = AES-ECB(hp, sample)[0..4]
+ = 437b9aec36
+
+ header[0] ^= mask[0] & 0x0f
+ = c0
+ header[18..21] ^= mask[1..4]
+ = 7b9aec34
+ header = c000000001088394c8f03e5157080000449e7b9aec34
+
+ The resulting protected packet is:
+
+ c000000001088394c8f03e5157080000 449e7b9aec34d1b1c98dd7689fb8ec11
+ d242b123dc9bd8bab936b47d92ec356c 0bab7df5976d27cd449f63300099f399
+ 1c260ec4c60d17b31f8429157bb35a12 82a643a8d2262cad67500cadb8e7378c
+ 8eb7539ec4d4905fed1bee1fc8aafba1 7c750e2c7ace01e6005f80fcb7df6212
+ 30c83711b39343fa028cea7f7fb5ff89 eac2308249a02252155e2347b63d58c5
+ 457afd84d05dfffdb20392844ae81215 4682e9cf012f9021a6f0be17ddd0c208
+ 4dce25ff9b06cde535d0f920a2db1bf3 62c23e596d11a4f5a6cf3948838a3aec
+ 4e15daf8500a6ef69ec4e3feb6b1d98e 610ac8b7ec3faf6ad760b7bad1db4ba3
+ 485e8a94dc250ae3fdb41ed15fb6a8e5 eba0fc3dd60bc8e30c5c4287e53805db
+ 059ae0648db2f64264ed5e39be2e20d8 2df566da8dd5998ccabdae053060ae6c
+ 7b4378e846d29f37ed7b4ea9ec5d82e7 961b7f25a9323851f681d582363aa5f8
+ 9937f5a67258bf63ad6f1a0b1d96dbd4 faddfcefc5266ba6611722395c906556
+ be52afe3f565636ad1b17d508b73d874 3eeb524be22b3dcbc2c7468d54119c74
+ 68449a13d8e3b95811a198f3491de3e7 fe942b330407abf82a4ed7c1b311663a
+ c69890f4157015853d91e923037c227a 33cdd5ec281ca3f79c44546b9d90ca00
+ f064c99e3dd97911d39fe9c5d0b23a22 9a234cb36186c4819e8b9c5927726632
+ 291d6a418211cc2962e20fe47feb3edf 330f2c603a9d48c0fcb5699dbfe58964
+ 25c5bac4aee82e57a85aaf4e2513e4f0 5796b07ba2ee47d80506f8d2c25e50fd
+ 14de71e6c418559302f939b0e1abd576 f279c4b2e0feb85c1f28ff18f58891ff
+ ef132eef2fa09346aee33c28eb130ff2 8f5b766953334113211996d20011a198
+ e3fc433f9f2541010ae17c1bf202580f 6047472fb36857fe843b19f5984009dd
+ c324044e847a4f4a0ab34f719595de37 252d6235365e9b84392b061085349d73
+ 203a4a13e96f5432ec0fd4a1ee65accd d5e3904df54c1da510b0ff20dcc0c77f
+ cb2c0e0eb605cb0504db87632cf3d8b4 dae6e705769d1de354270123cb11450e
+ fc60ac47683d7b8d0f811365565fd98c 4c8eb936bcab8d069fc33bd801b03ade
+ a2e1fbc5aa463d08ca19896d2bf59a07 1b851e6c239052172f296bfb5e724047
+ 90a2181014f3b94a4e97d117b4381303 68cc39dbb2d198065ae3986547926cd2
+ 162f40a29f0c3c8745c0f50fba3852e5 66d44575c29d39a03f0cda721984b6f4
+ 40591f355e12d439ff150aab7613499d bd49adabc8676eef023b15b65bfc5ca0
+ 6948109f23f350db82123535eb8a7433 bdabcb909271a6ecbcb58b936a88cd4e
+ 8f2e6ff5800175f113253d8fa9ca8885 c2f552e657dc603f252e1a8e308f76f0
+ be79e2fb8f5d5fbbe2e30ecadd220723 c8c0aea8078cdfcb3868263ff8f09400
+ 54da48781893a7e49ad5aff4af300cd8 04a6b6279ab3ff3afb64491c85194aab
+ 760d58a606654f9f4400e8b38591356f bf6425aca26dc85244259ff2b19c41b9
+ f96f3ca9ec1dde434da7d2d392b905dd f3d1f9af93d1af5950bd493f5aa731b4
+ 056df31bd267b6b90a079831aaf579be 0a39013137aac6d404f518cfd4684064
+ 7e78bfe706ca4cf5e9c5453e9f7cfd2b 8b4c8d169a44e55c88d4a9a7f9474241
+ e221af44860018ab0856972e194cd934
+
+A.3. Server Initial
+
+ The server sends the following payload in response, including an ACK
+ frame, a CRYPTO frame, and no PADDING frames:
+
+ 02000000000600405a020000560303ee fce7f7b37ba1d1632e96677825ddf739
+ 88cfc79825df566dc5430b9a045a1200 130100002e00330024001d00209d3c94
+ 0d89690b84d08a60993c144eca684d10 81287c834d5311bcf32bb9da1a002b00
+ 020304
+
+ The header from the server includes a new connection ID and a 2-byte
+ packet number encoding for a packet number of 1:
+
+ c1000000010008f067a5502a4262b50040750001
+
+ As a result, after protection, the header protection sample is taken
+ starting from the third protected byte:
+
+ sample = 2cd0991cd25b0aac406a5816b6394100
+ mask = 2ec0d8356a
+ header = cf000000010008f067a5502a4262b5004075c0d9
+
+ The final protected packet is then:
+
+ cf000000010008f067a5502a4262b500 4075c0d95a482cd0991cd25b0aac406a
+ 5816b6394100f37a1c69797554780bb3 8cc5a99f5ede4cf73c3ec2493a1839b3
+ dbcba3f6ea46c5b7684df3548e7ddeb9 c3bf9c73cc3f3bded74b562bfb19fb84
+ 022f8ef4cdd93795d77d06edbb7aaf2f 58891850abbdca3d20398c276456cbc4
+ 2158407dd074ee
+
+A.4. Retry
+
+ This shows a Retry packet that might be sent in response to the
+ Initial packet in Appendix A.2. The integrity check includes the
+ client-chosen connection ID value of 0x8394c8f03e515708, but that
+ value is not included in the final Retry packet:
+
+ ff000000010008f067a5502a4262b574 6f6b656e04a265ba2eff4d829058fb3f
+ 0f2496ba
+
+A.5. ChaCha20-Poly1305 Short Header Packet
+
+ This example shows some of the steps required to protect a packet
+ with a short header. This example uses AEAD_CHACHA20_POLY1305.
+
+ In this example, TLS produces an application write secret from which
+ a server uses HKDF-Expand-Label to produce four values: a key, an IV,
+ a header protection key, and the secret that will be used after keys
+ are updated (this last value is not used further in this example).
+
+ secret
+ = 9ac312a7f877468ebe69422748ad00a1
+ 5443f18203a07d6060f688f30f21632b
+
+ key = HKDF-Expand-Label(secret, "quic key", "", 32)
+ = c6d98ff3441c3fe1b2182094f69caa2e
+ d4b716b65488960a7a984979fb23e1c8
+
+ iv = HKDF-Expand-Label(secret, "quic iv", "", 12)
+ = e0459b3474bdd0e44a41c144
+
+ hp = HKDF-Expand-Label(secret, "quic hp", "", 32)
+ = 25a282b9e82f06f21f488917a4fc8f1b
+ 73573685608597d0efcb076b0ab7a7a4
+
+ ku = HKDF-Expand-Label(secret, "quic ku", "", 32)
+ = 1223504755036d556342ee9361d25342
+ 1a826c9ecdf3c7148684b36b714881f9
+
+ The following shows the steps involved in protecting a minimal packet
+ with an empty Destination Connection ID. This packet contains a
+ single PING frame (that is, a payload of just 0x01) and has a packet
+ number of 654360564. In this example, using a packet number of
+ length 3 (that is, 49140 is encoded) avoids having to pad the payload
+ of the packet; PADDING frames would be needed if the packet number is
+ encoded on fewer bytes.
+
+ pn = 654360564 (decimal)
+ nonce = e0459b3474bdd0e46d417eb0
+ unprotected header = 4200bff4
+ payload plaintext = 01
+ payload ciphertext = 655e5cd55c41f69080575d7999c25a5bfb
+
+ The resulting ciphertext is the minimum size possible. One byte is
+ skipped to produce the sample for header protection.
+
+ sample = 5e5cd55c41f69080575d7999c25a5bfb
+ mask = aefefe7d03
+ header = 4cfe4189
+
+ The protected packet is the smallest possible packet size of 21
+ bytes.
+
+ packet = 4cfe4189655e5cd55c41f69080575d7999c25a5bfb
+
+Appendix B. AEAD Algorithm Analysis
+
+ This section documents analyses used in deriving AEAD algorithm
+ limits for AEAD_AES_128_GCM, AEAD_AES_128_CCM, and AEAD_AES_256_GCM.
+ The analyses that follow use symbols for multiplication (*), division
+ (/), and exponentiation (^), plus parentheses for establishing
+ precedence. The following symbols are also used:
+
+ t: The size of the authentication tag in bits. For these ciphers, t
+ is 128.
+
+ n: The size of the block function in bits. For these ciphers, n is
+ 128.
+
+ k: The size of the key in bits. This is 128 for AEAD_AES_128_GCM
+ and AEAD_AES_128_CCM; 256 for AEAD_AES_256_GCM.
+
+ l: The number of blocks in each packet (see below).
+
+ q: The number of genuine packets created and protected by endpoints.
+ This value is the bound on the number of packets that can be
+ protected before updating keys.
+
+ v: The number of forged packets that endpoints will accept. This
+ value is the bound on the number of forged packets that an
+ endpoint can reject before updating keys.
+
+ o: The amount of offline ideal cipher queries made by an adversary.
+
+ The analyses that follow rely on a count of the number of block
+ operations involved in producing each message. This analysis is
+ performed for packets of size up to 2^11 (l = 2^7) and 2^16 (l =
+ 2^12). A size of 2^11 is expected to be a limit that matches common
+ deployment patterns, whereas the 2^16 is the maximum possible size of
+ a QUIC packet. Only endpoints that strictly limit packet size can
+ use the larger confidentiality and integrity limits that are derived
+ using the smaller packet size.
+
+ For AEAD_AES_128_GCM and AEAD_AES_256_GCM, the message length (l) is
+ the length of the associated data in blocks plus the length of the
+ plaintext in blocks.
+
+ For AEAD_AES_128_CCM, the total number of block cipher operations is
+ the sum of the following: the length of the associated data in
+ blocks, the length of the ciphertext in blocks, the length of the
+ plaintext in blocks, plus 1. In this analysis, this is simplified to
+ a value of twice the length of the packet in blocks (that is, "2l =
+ 2^8" for packets that are limited to 2^11 bytes, or "2l = 2^13"
+ otherwise). This simplification is based on the packet containing
+ all of the associated data and ciphertext. This results in a one to
+ three block overestimation of the number of operations per packet.
+
+B.1. Analysis of AEAD_AES_128_GCM and AEAD_AES_256_GCM Usage Limits
+
+ [GCM-MU] specifies concrete bounds for AEAD_AES_128_GCM and
+ AEAD_AES_256_GCM as used in TLS 1.3 and QUIC. This section documents
+ this analysis using several simplifying assumptions:
+
+ * The number of ciphertext blocks an attacker uses in forgery
+ attempts is bounded by v * l, which is the number of forgery
+ attempts multiplied by the size of each packet (in blocks).
+
+ * The amount of offline work done by an attacker does not dominate
+ other factors in the analysis.
+
+ The bounds in [GCM-MU] are tighter and more complete than those used
+ in [AEBounds], which allows for larger limits than those described in
+ [TLS13].
+
+B.1.1. Confidentiality Limit
+
+ For confidentiality, Theorem (4.3) in [GCM-MU] establishes that, for
+ a single user that does not repeat nonces, the dominant term in
+ determining the distinguishing advantage between a real and random
+ AEAD algorithm gained by an attacker is:
+
+ 2 * (q * l)^2 / 2^n
+
+ For a target advantage of 2^-57, this results in the relation:
+
+ q <= 2^35 / l
+
+ Thus, endpoints that do not send packets larger than 2^11 bytes
+ cannot protect more than 2^28 packets in a single connection without
+ causing an attacker to gain a more significant advantage than the
+ target of 2^-57. The limit for endpoints that allow for the packet
+ size to be as large as 2^16 is instead 2^23.
+
+B.1.2. Integrity Limit
+
+ For integrity, Theorem (4.3) in [GCM-MU] establishes that an attacker
+ gains an advantage in successfully forging a packet of no more than
+ the following:
+
+ (1 / 2^(8 * n)) + ((2 * v) / 2^(2 * n))
+ + ((2 * o * v) / 2^(k + n)) + (n * (v + (v * l)) / 2^k)
+
+ The goal is to limit this advantage to 2^-57. For AEAD_AES_128_GCM,
+ the fourth term in this inequality dominates the rest, so the others
+ can be removed without significant effect on the result. This
+ produces the following approximation:
+
+ v <= 2^64 / l
+
+ Endpoints that do not attempt to remove protection from packets
+ larger than 2^11 bytes can attempt to remove protection from at most
+ 2^57 packets. Endpoints that do not restrict the size of processed
+ packets can attempt to remove protection from at most 2^52 packets.
+
+ For AEAD_AES_256_GCM, the same term dominates, but the larger value
+ of k produces the following approximation:
+
+ v <= 2^192 / l
+
+ This is substantially larger than the limit for AEAD_AES_128_GCM.
+ However, this document recommends that the same limit be applied to
+ both functions as either limit is acceptably large.
+
+B.2. Analysis of AEAD_AES_128_CCM Usage Limits
+
+ TLS [TLS13] and [AEBounds] do not specify limits on usage for
+ AEAD_AES_128_CCM. However, any AEAD that is used with QUIC requires
+ limits on use that ensure that both confidentiality and integrity are
+ preserved. This section documents that analysis.
+
+ [CCM-ANALYSIS] is used as the basis of this analysis. The results of
+ that analysis are used to derive usage limits that are based on those
+ chosen in [TLS13].
+
+ For confidentiality, Theorem 2 in [CCM-ANALYSIS] establishes that an
+ attacker gains a distinguishing advantage over an ideal pseudorandom
+ permutation (PRP) of no more than the following:
+
+ (2l * q)^2 / 2^n
+
+ The integrity limit in Theorem 1 in [CCM-ANALYSIS] provides an
+ attacker a strictly higher advantage for the same number of messages.
+ As the targets for the confidentiality advantage and the integrity
+ advantage are the same, only Theorem 1 needs to be considered.
+
+ Theorem 1 establishes that an attacker gains an advantage over an
+ ideal PRP of no more than the following:
+
+ v / 2^t + (2l * (v + q))^2 / 2^n
+
+ As "t" and "n" are both 128, the first term is negligible relative to
+ the second, so that term can be removed without a significant effect
+ on the result.
+
+ This produces a relation that combines both encryption and decryption
+ attempts with the same limit as that produced by the theorem for
+ confidentiality alone. For a target advantage of 2^-57, this results
+ in the following:
+
+ v + q <= 2^34.5 / l
+
+ By setting "q = v", values for both confidentiality and integrity
+ limits can be produced. Endpoints that limit packets to 2^11 bytes
+ therefore have both confidentiality and integrity limits of 2^26.5
+ packets. Endpoints that do not restrict packet size have a limit of
+ 2^21.5.
+
+Contributors
+
+ The IETF QUIC Working Group received an enormous amount of support
+ from many people. The following people provided substantive
+ contributions to this document:
+
+ * Adam Langley
+ * Alessandro Ghedini
+ * Christian Huitema
+ * Christopher Wood
+ * David Schinazi
+ * Dragana Damjanovic
+ * Eric Rescorla
+ * Felix Günther
+ * Ian Swett
+ * Jana Iyengar
+ * 奥 一穂 (Kazuho Oku)
+ * Marten Seemann
+ * Martin Duke
+ * Mike Bishop
+ * Mikkel Fahnøe Jørgensen
+ * Nick Banks
+ * Nick Harper
+ * Roberto Peon
+ * Rui Paulo
+ * Ryan Hamilton
+ * Victor Vasiliev
+
+Authors' Addresses
+
+ Martin Thomson (editor)
+ Mozilla
+
+ Email: mt@lowentropy.net
+
+
+ Sean Turner (editor)
+ sn3rd
+
+ Email: sean@sn3rd.com