diff options
Diffstat (limited to 'doc/rfc/rfc9001.txt')
-rw-r--r-- | doc/rfc/rfc9001.txt | 2756 |
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 |