rfc9369.original | rfc9369.txt | |||
---|---|---|---|---|
QUIC M. Duke | Internet Engineering Task Force (IETF) M. Duke | |||
Internet-Draft Google LLC | Request for Comments: 9369 Google LLC | |||
Intended status: Standards Track 15 December 2022 | Category: Standards Track May 2023 | |||
Expires: 18 June 2023 | ISSN: 2070-1721 | |||
QUIC Version 2 | QUIC Version 2 | |||
draft-ietf-quic-v2-10 | ||||
Abstract | Abstract | |||
This document specifies QUIC version 2, which is identical to QUIC | This document specifies QUIC version 2, which is identical to QUIC | |||
version 1 except for some trivial details. Its purpose is to combat | version 1 except for some trivial details. Its purpose is to combat | |||
various ossification vectors and exercise the version negotiation | various ossification vectors and exercise the version negotiation | |||
framework. It also serves as a template for the minimum changes in | framework. It also serves as a template for the minimum changes in | |||
any future version of QUIC. | any future version of QUIC. | |||
Note that "version 2" is an informal name for this proposal that | Note that "version 2" is an informal name for this proposal that | |||
indicates it is the second standards-track QUIC version. The | indicates it is the second version of QUIC to be published as a | |||
protocol specified here uses a version number other than 2 in the | Standards Track document. The protocol specified here uses a version | |||
wire image, in order to minimize ossification risk. | number other than 2 in the wire image, in order to minimize | |||
ossification risks. | ||||
About This Document | ||||
This note is to be removed before publishing as an RFC. | ||||
The latest revision of this draft can be found at https://quicwg.org/ | ||||
quic-v2/draft-ietf-quic-v2.html. Status information for this | ||||
document may be found at https://datatracker.ietf.org/doc/draft-ietf- | ||||
quic-v2/. | ||||
Discussion of this document takes place on the QUIC Working Group | ||||
mailing list (mailto:quic@ietf.org), which is archived at | ||||
https://mailarchive.ietf.org/arch/browse/quic/. Subscribe at | ||||
https://www.ietf.org/mailman/listinfo/quic/. | ||||
Source for this draft and an issue tracker can be found at | ||||
https://github.com/quicwg/quic-v2. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 18 June 2023. | 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/rfc9369. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2022 IETF Trust and the persons identified as the | Copyright (c) 2023 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Conventions | |||
3. Differences with QUIC Version 1 . . . . . . . . . . . . . . . 4 | 3. Differences with QUIC Version 1 | |||
3.1. Version Field . . . . . . . . . . . . . . . . . . . . . . 4 | 3.1. Version Field | |||
3.2. Long Header Packet Types . . . . . . . . . . . . . . . . 4 | 3.2. Long Header Packet Types | |||
3.3. Cryptography changes . . . . . . . . . . . . . . . . . . 5 | 3.3. Cryptography Changes | |||
3.3.1. Initial Salt . . . . . . . . . . . . . . . . . . . . 5 | 3.3.1. Initial Salt | |||
3.3.2. HKDF Labels . . . . . . . . . . . . . . . . . . . . . 5 | 3.3.2. HMAC-based Key Derivation Function (HKDF) Labels | |||
3.3.3. Retry Integrity Tag . . . . . . . . . . . . . . . . . 5 | 3.3.3. Retry Integrity Tag | |||
4. Version Negotiation Considerations . . . . . . . . . . . . . 6 | 4. Version Negotiation Considerations | |||
4.1. Compatible Negotiation Requirements . . . . . . . . . . . 6 | 4.1. Compatible Negotiation Requirements | |||
5. TLS Resumption and NEW_TOKEN Tokens . . . . . . . . . . . . . 7 | 5. TLS Resumption and NEW_TOKEN Tokens | |||
6. Ossification Considerations . . . . . . . . . . . . . . . . . 8 | 6. Ossification Considerations | |||
7. Applicability . . . . . . . . . . . . . . . . . . . . . . . . 8 | 7. Applicability | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 8 | 8. Security Considerations | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9 | 9. IANA Considerations | |||
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 10. References | |||
10.1. Normative References . . . . . . . . . . . . . . . . . . 9 | 10.1. Normative References | |||
10.2. Informative References . . . . . . . . . . . . . . . . . 10 | 10.2. Informative References | |||
Appendix A. Sample Packet Protection . . . . . . . . . . . . . . 10 | Appendix A. Sample Packet Protection | |||
A.1. Keys . . . . . . . . . . . . . . . . . . . . . . . . . . 10 | A.1. Keys | |||
A.2. Client Initial . . . . . . . . . . . . . . . . . . . . . 11 | A.2. Client Initial | |||
A.3. Server Initial . . . . . . . . . . . . . . . . . . . . . 13 | A.3. Server Initial | |||
A.4. Retry . . . . . . . . . . . . . . . . . . . . . . . . . . 14 | A.4. Retry | |||
A.5. ChaCha20-Poly1305 Short Header Packet . . . . . . . . . . 14 | A.5. ChaCha20-Poly1305 Short Header Packet | |||
Acknowledgments | ||||
Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 16 | Author's Address | |||
Appendix C. Changelog . . . . . . . . . . . . . . . . . . . . . 16 | ||||
C.1. since draft-ietf-quic-v2-09 . . . . . . . . . . . . . . . 16 | ||||
C.2. since draft-ietf-quic-v2-08 . . . . . . . . . . . . . . . 16 | ||||
C.3. since draft-ietf-quic-v2-07 . . . . . . . . . . . . . . . 16 | ||||
C.4. since draft-ietf-quic-v2-06 . . . . . . . . . . . . . . . 16 | ||||
C.5. since draft-ietf-quic-v2-05 . . . . . . . . . . . . . . . 16 | ||||
C.6. since draft-ietf-quic-v2-04 . . . . . . . . . . . . . . . 16 | ||||
C.7. since draft-ietf-quic-v2-03 . . . . . . . . . . . . . . . 17 | ||||
C.8. since draft-ietf-quic-v2-02 . . . . . . . . . . . . . . . 17 | ||||
C.9. since draft-ietf-quic-v2-01 . . . . . . . . . . . . . . . 17 | ||||
C.10. since draft-ietf-quic-v2-00 . . . . . . . . . . . . . . . 17 | ||||
C.11. since draft-duke-quic-v2-02 . . . . . . . . . . . . . . . 17 | ||||
C.12. since draft-duke-quic-v2-01 . . . . . . . . . . . . . . . 17 | ||||
C.13. since draft-duke-quic-v2-00 . . . . . . . . . . . . . . . 18 | ||||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 18 | ||||
1. Introduction | 1. Introduction | |||
QUIC version 1[QUIC] has numerous extension points, including the | QUIC version 1 [QUIC] has numerous extension points, including the | |||
version number that occupies the second through fifth bytes of every | version number that occupies the second through fifth bytes of every | |||
long header (see [QUIC-INVARIANTS]). If experimental versions are | long header (see [QUIC-INVARIANTS]). If experimental versions are | |||
rare, and QUIC version 1 constitutes the vast majority of QUIC | rare, and QUIC version 1 constitutes the vast majority of QUIC | |||
traffic, there is the potential for middleboxes to ossify on the | traffic, there is the potential for middleboxes to ossify on the | |||
version bytes always being 0x00000001. | version bytes that are usually 0x00000001. | |||
In QUIC version 1, Initial packets are encrypted with the version- | In QUIC version 1, Initial packets are encrypted with the version- | |||
specific salt as described in Section 5.2 of [QUIC-TLS]. Protecting | specific salt, as described in Section 5.2 of [QUIC-TLS]. Protecting | |||
Initial packets in this way allows observers to inspect their | Initial packets in this way allows observers to inspect their | |||
contents, which includes the TLS Client Hello or Server Hello | contents, which includes the TLS Client Hello or Server Hello | |||
messages. Again, there is the potential for middleboxes to ossify on | messages. Again, there is the potential for middleboxes to ossify on | |||
the version 1 key derivation and packet formats. | the version 1 key derivation and packet formats. | |||
Finally, [QUIC-VN] provides two mechanisms for endpoints to negotiate | Finally, [QUIC-VN] describes two mechanisms endpoints can use to | |||
the QUIC version to use. The "incompatible" version negotiation | negotiate which QUIC version to select. The "incompatible" version | |||
method can support switching from any QUIC version to any other | negotiation method can support switching from any QUIC version to any | |||
version with full generality, at the cost of an additional round-trip | other version with full generality, at the cost of an additional | |||
at the start of the connection. "Compatible" version negotiation | round trip at the start of the connection. "Compatible" version | |||
eliminates the round-trip penalty but levies some restrictions on how | negotiation eliminates the round-trip penalty but levies some | |||
much the two versions can differ semantically. | restrictions on how much the two versions can differ semantically. | |||
QUIC version 2 is meant to mitigate ossification concerns and | QUIC version 2 is meant to mitigate ossification concerns and | |||
exercise the version negotiation mechanisms. The changes provide an | exercise the version negotiation mechanisms. The changes provide an | |||
example of the minimum set of changes necessary to specify a new QUIC | example of the minimum set of changes necessary to specify a new QUIC | |||
version. However, note that the choice of the version number on the | version. However, note that the choice of the version number on the | |||
wire is randomly chosen instead of "2", and the two bits that | wire is randomly chosen instead of "2", and the two bits that | |||
identify each long header packet type are different from version 1; | identify each Long Header packet type are different from version 1; | |||
both of these properties are meant to combat ossification and are not | both of these properties are meant to combat ossification and are not | |||
strictly required of a new QUIC version. | strictly required of a new QUIC version. | |||
Any endpoint that supports two versions needs to implement version | Any endpoint that supports two versions needs to implement version | |||
negotiation to protect against downgrade attacks. | negotiation to protect against downgrade attacks. | |||
2. Conventions | 2. Conventions | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
skipping to change at page 4, line 38 ¶ | skipping to change at line 139 ¶ | |||
the QUIC version 1 specification as described in [QUIC], [QUIC-TLS], | the QUIC version 1 specification as described in [QUIC], [QUIC-TLS], | |||
and [QUIC-RECOVERY]. The remainder of this section lists the | and [QUIC-RECOVERY]. The remainder of this section lists the | |||
differences. | differences. | |||
3.1. Version Field | 3.1. Version Field | |||
The Version field of long headers is 0x6b3343cf. This was generated | The Version field of long headers is 0x6b3343cf. This was generated | |||
by taking the first four bytes of the sha256sum of "QUICv2 version | by taking the first four bytes of the sha256sum of "QUICv2 version | |||
number". | number". | |||
*RFC Editor's Note:* Please remove the sentence below prior to | ||||
publication of a final version of this document. | ||||
This version number will not change in subsequent versions of this | ||||
draft, unless there is a behavior change that breaks compatibility. | ||||
3.2. Long Header Packet Types | 3.2. Long Header Packet Types | |||
All version 2 long header packet types are different. The Type field | All version 2 Long Header packet types are different. The Type field | |||
values are: | values are: | |||
* Initial: 0b01 | * Initial: 0b01 | |||
* 0-RTT: 0b10 | * 0-RTT: 0b10 | |||
* Handshake: 0b11 | * Handshake: 0b11 | |||
* Retry: 0b00 | * Retry: 0b00 | |||
3.3. Cryptography changes | 3.3. Cryptography Changes | |||
The values below were chosen randomly. | ||||
3.3.1. Initial Salt | 3.3.1. Initial Salt | |||
The salt used to derive Initial keys in Section 5.2 of [QUIC-TLS] | The salt used to derive Initial keys in Section 5.2 of [QUIC-TLS] | |||
changes to: | changes to: | |||
initial_salt = 0x0dede3def700a6db819381be6e269dcbf9bd2ed9 | initial_salt = 0x0dede3def700a6db819381be6e269dcbf9bd2ed9 | |||
This is the first 20 bytes of the sha256sum of "QUICv2 salt". | This is the first 20 bytes of the sha256sum of "QUICv2 salt". | |||
3.3.2. HKDF Labels | 3.3.2. HMAC-based Key Derivation Function (HKDF) Labels | |||
*RFC Editor's Note:* Please ensure that the strings in quotes are | ||||
not split up in a line break in this section. | ||||
The labels used in [QUIC-TLS] to derive packet protection keys | The labels used in [QUIC-TLS] to derive packet protection keys | |||
(Section 5.1), header protection keys (Section 5.4), Retry Integrity | (Section 5.1), header protection keys (Section 5.4), Retry Integrity | |||
Tag keys (Section 5.8), and key updates (Section 6.1) change from | Tag keys (Section 5.8), and key updates (Section 6.1) change from | |||
"quic key" to "quicv2 key", from "quic iv" to "quicv2 iv", from "quic | "quic key" to "quicv2 key", from "quic iv" to "quicv2 iv", from | |||
hp" to "quicv2 hp", and from "quic ku" to "quicv2 ku", to meet the | "quic hp" to "quicv2 hp", and from "quic ku" to "quicv2 ku" to meet | |||
guidance for new versions in Section 9.6 of that document. | the guidance for new versions in Section 9.6 of that document. | |||
3.3.3. Retry Integrity Tag | 3.3.3. Retry Integrity Tag | |||
The key and nonce used for the Retry Integrity Tag (Section 5.8 of | The key and nonce used for the Retry Integrity Tag (Section 5.8 of | |||
[QUIC-TLS]) change to: | [QUIC-TLS]) change to: | |||
secret = | secret = | |||
0xc4dd2484d681aefa4ff4d69c2c20299984a765a5d3c31982f38fc74162155e9f | 0xc4dd2484d681aefa4ff4d69c2c20299984a765a5d3c31982f38fc74162155e9f | |||
key = 0x8fb4b01b56ac48e260fbcbcead7ccc92 | key = 0x8fb4b01b56ac48e260fbcbcead7ccc92 | |||
nonce = 0xd86969bc2d7c6d9990efb04a | nonce = 0xd86969bc2d7c6d9990efb04a | |||
skipping to change at page 6, line 15 ¶ | skipping to change at line 196 ¶ | |||
4. Version Negotiation Considerations | 4. Version Negotiation Considerations | |||
QUIC version 2 is not intended to deprecate version 1. Endpoints | QUIC version 2 is not intended to deprecate version 1. Endpoints | |||
that support version 2 might continue support for version 1 to | that support version 2 might continue support for version 1 to | |||
maximize compatibility with other endpoints. In particular, HTTP | maximize compatibility with other endpoints. In particular, HTTP | |||
clients often use Alt-Svc [RFC7838] to discover QUIC support. As | clients often use Alt-Svc [RFC7838] to discover QUIC support. As | |||
this mechanism does not currently distinguish between QUIC versions, | this mechanism does not currently distinguish between QUIC versions, | |||
HTTP servers SHOULD support multiple versions to reduce the | HTTP servers SHOULD support multiple versions to reduce the | |||
probability of incompatibility and the cost associated with QUIC | probability of incompatibility and the cost associated with QUIC | |||
version negotiation or TCP fallback. For example, an origin | version negotiation or TCP fallback. For example, an origin | |||
advertising support for "h3" in Alt-Svc should support QUIC version 1 | advertising support for "h3" in Alt-Svc should support QUIC version | |||
as it was the original QUIC version used by HTTP/3, and therefore | 1, as it was the original QUIC version used by HTTP/3; therefore, | |||
some clients will only support that version. | some clients will only support that version. | |||
Any QUIC endpoint that supports QUIC version 2 MUST send, process, | Any QUIC endpoint that supports QUIC version 2 MUST send, process, | |||
and validate the version_information transport parameter specified in | and validate the version_information transport parameter specified in | |||
[QUIC-VN] to prevent version downgrade attacks. | [QUIC-VN] to prevent version downgrade attacks. | |||
Note that version 2 meets the [QUIC-VN] definition of a compatible | Note that version 2 meets the definition in [QUIC-VN] of a compatible | |||
version with version 1, and version 1 is compatible with version 2. | version with version 1, and version 1 is compatible with version 2. | |||
Therefore, servers can use compatible negotiation to switch a | Therefore, servers can use compatible negotiation to switch a | |||
connection between the two versions. Endpoints that support both | connection between the two versions. Endpoints that support both | |||
versions SHOULD support compatible version negotiation to avoid a | versions SHOULD support compatible version negotiation to avoid a | |||
round trip. | round trip. | |||
4.1. Compatible Negotiation Requirements | 4.1. Compatible Negotiation Requirements | |||
Compatible version negotiation between versions 1 and 2 follow the | Compatible version negotiation between versions 1 and 2 follows the | |||
same requirements in either direction. This section uses the terms | same requirements in either direction. This section uses the terms | |||
"original version" and "negotiated version" from [QUIC-VN]. | "original version" and "negotiated version" from [QUIC-VN]. | |||
If the server sends a Retry packet, it MUST use the original version. | If the server sends a Retry packet, it MUST use the original version. | |||
The client ignores Retry packets using other versions. The client | The client ignores Retry packets using other versions. The client | |||
MUST NOT use a different version in the subsequent Initial packet | MUST NOT use a different version in the subsequent Initial packet | |||
that contains the Retry token. The server MAY encode the QUIC | that contains the Retry token. The server MAY encode the QUIC | |||
version in its Retry token to validate that the client did not switch | version in its Retry token to validate that the client did not switch | |||
versions, and drop the packet if it switched, to enforce client | versions, and drop the packet if it switched, to enforce client | |||
compliance. | compliance. | |||
skipping to change at page 7, line 12 ¶ | skipping to change at line 239 ¶ | |||
connection IDs used in the exchange, as described in Section 7.3 of | connection IDs used in the exchange, as described in Section 7.3 of | |||
[QUIC]. | [QUIC]. | |||
The server cannot send CRYPTO frames until it has processed the | The server cannot send CRYPTO frames until it has processed the | |||
client's transport parameters. The server MUST send all CRYPTO | client's transport parameters. The server MUST send all CRYPTO | |||
frames using the negotiated version. | frames using the negotiated version. | |||
The client learns the negotiated version by observing the first long | The client learns the negotiated version by observing the first long | |||
header Version field that differs from the original version. If the | header Version field that differs from the original version. If the | |||
client receives a CRYPTO frame from the server in the original | client receives a CRYPTO frame from the server in the original | |||
version, that indicates that the negotiated version is equal to the | version, it indicates that the negotiated version is equal to the | |||
original version. | original version. | |||
Before the server is able to process transport parameters from the | Before the server is able to process transport parameters from the | |||
client, it might need to respond to Initial packets from the client. | client, it might need to respond to Initial packets from the client. | |||
For these packets, the server uses the original version. | For these packets, the server uses the original version. | |||
Once the client has learned the negotiated version, it SHOULD send | Once the client has learned the negotiated version, it SHOULD send | |||
subsequent Initial packets using that version. The server MUST NOT | subsequent Initial packets using that version. The server MUST NOT | |||
discard its original version Initial receive keys until it | discard its original version Initial receive keys until it | |||
successfully processes a Handshake packet with the negotiated | successfully processes a Handshake packet with the negotiated | |||
skipping to change at page 7, line 40 ¶ | skipping to change at line 267 ¶ | |||
The client MUST NOT send 0-RTT packets using the negotiated version, | The client MUST NOT send 0-RTT packets using the negotiated version, | |||
even after processing a packet of that version from the server. | even after processing a packet of that version from the server. | |||
Servers can accept 0-RTT and then process 0-RTT packets from the | Servers can accept 0-RTT and then process 0-RTT packets from the | |||
original version. | original version. | |||
5. TLS Resumption and NEW_TOKEN Tokens | 5. TLS Resumption and NEW_TOKEN Tokens | |||
TLS session tickets and NEW_TOKEN tokens are specific to the QUIC | TLS session tickets and NEW_TOKEN tokens are specific to the QUIC | |||
version of the connection that provided them. Clients MUST NOT use a | version of the connection that provided them. Clients MUST NOT use a | |||
session ticket or token from a QUIC version 1 connection to initiate | session ticket or token from a QUIC version 1 connection to initiate | |||
a QUIC version 2 connection, or vice versa. | a QUIC version 2 connection, and vice versa. When a connection | |||
includes compatible version negotiation, any issued server tokens are | ||||
considered to originate from the negotiated version, not the original | ||||
one. | ||||
Servers MUST validate the originating version of any session ticket | Servers MUST validate the originating version of any session ticket | |||
or token and not accept one issued from a different version. A | or token and not accept one issued from a different version. A | |||
rejected ticket results in falling back to a full TLS handshake, | rejected ticket results in falling back to a full TLS handshake, | |||
without 0-RTT. A rejected token results in the client address | without 0-RTT. A rejected token results in the client address | |||
remaining unverified, which limits the amount of data the server can | remaining unverified, which limits the amount of data the server can | |||
send. | send. | |||
After compatible version negotiation, any resulting session ticket | After compatible version negotiation, any resulting session ticket | |||
maps to the negotiated version rather than original one. | maps to the negotiated version rather than the original one. | |||
6. Ossification Considerations | 6. Ossification Considerations | |||
QUIC version 2 provides protection against some forms of | QUIC version 2 provides protection against some forms of | |||
ossification. Devices that assume that all long headers will encode | ossification. Devices that assume that all long headers will encode | |||
version 1, or that the version 1 Initial key derivation formula will | version 1, or that the version 1 Initial key derivation formula will | |||
remain version-invariant, will not correctly process version 2 | remain version-invariant, will not correctly process version 2 | |||
packets. | packets. | |||
However, many middleboxes, such as firewalls, focus on the first | However, many middleboxes, such as firewalls, focus on the first | |||
packet in a connection, which will often remain in the version 1 | packet in a connection, which will often remain in the version 1 | |||
format due to the considerations above. | format due to the considerations above. | |||
Clients interested in combating middlebox ossification can initiate a | Clients interested in combating middlebox ossification can initiate a | |||
connection using version 2 if they are either reasonably certain the | connection using version 2 if they are reasonably certain the server | |||
server supports it, or are willing to suffer a round-trip penalty if | supports it and if they are willing to suffer a round-trip penalty if | |||
they are incorrect. In particular, a server that issues a session | they are incorrect. In particular, a server that issues a session | |||
ticket for version 2 indicates an intent to maintain version 2 | ticket for version 2 indicates an intent to maintain version 2 | |||
support while the ticket remains valid, even if support cannot be | support while the ticket remains valid, even if support cannot be | |||
guaranteed. | guaranteed. | |||
7. Applicability | 7. Applicability | |||
This version of QUIC provides no change from QUIC version 1 relating | QUIC version 2 provides no change from QUIC version 1 for the | |||
to the capabilities available to applications. Therefore, all | capabilities available to applications. Therefore, all Application- | |||
Application Layer Protocol Negotiation (ALPN) ([RFC7301]) codepoints | Layer Protocol Negotiation (ALPN) [RFC7301] codepoints specified to | |||
specified to operate over QUIC version 1 can also operate over this | operate over QUIC version 1 can also operate over this version of | |||
version of QUIC. In particular, both the "h3" [HTTP/3] and "doq" | QUIC. In particular, both the "h3" [HTTP/3] and "doq" [RFC9250] | |||
[RFC9250] ALPNs can operate over QUIC version 2. | ALPNs can operate over QUIC version 2. | |||
Unless otherwise stated, all QUIC extensions defined to work with | Unless otherwise stated, all QUIC extensions defined to work with | |||
version 1 also work with version 2. | version 1 also work with version 2. | |||
8. Security Considerations | 8. Security Considerations | |||
QUIC version 2 introduces no changes to the security or privacy | QUIC version 2 introduces no changes to the security or privacy | |||
properties of QUIC version 1. | properties of QUIC version 1. | |||
The mandatory version negotiation mechanism guards against downgrade | The mandatory version negotiation mechanism guards against downgrade | |||
attacks, but downgrades have no security implications, as the version | attacks, but downgrades have no security implications, as the version | |||
properties are identical. | properties are identical. | |||
Support for QUIC version 2 can help an observer to fingerprint both | Support for QUIC version 2 can help an observer to fingerprint both | |||
client and server devices. | client and server devices. | |||
9. IANA Considerations | 9. IANA Considerations | |||
This document requests that IANA add the following entry to the QUIC | IANA has added the following entries to the "QUIC Versions" registry | |||
version registry maintained at | maintained at <https://www.iana.org/assignments/quic>. | |||
<https://www.iana.org/assignments/quic/quic.xhtml#quic-versions>. | ||||
Value: 0x6b3343cf | Value: 0x6b3343cf | |||
Status: permanent | Status: permanent | |||
Specification: This Document | Specification: RFC 9369 | |||
Change Controller: IETF | Change Controller: IETF | |||
Contact: QUIC WG | Contact: QUIC WG | |||
Value: 0x709a50c4 | Value: 0x709a50c4 | |||
Status: provisional | Status: provisional | |||
Specification: This Document | Specification: RFC 9369 | |||
Change Controller: IETF | Change Controller: IETF | |||
Contact: QUIC WG | Contact: QUIC WG | |||
Note: QUIC v2 draft codepoint | Notes: QUIC v2 draft codepoint | |||
10. References | 10. References | |||
10.1. Normative References | 10.1. Normative References | |||
[QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
Multiplexed and Secure Transport", RFC 9000, | Multiplexed and Secure Transport", RFC 9000, | |||
DOI 10.17487/RFC9000, May 2021, | DOI 10.17487/RFC9000, May 2021, | |||
<https://www.rfc-editor.org/rfc/rfc9000>. | <https://www.rfc-editor.org/info/rfc9000>. | |||
[QUIC-RECOVERY] | [QUIC-RECOVERY] | |||
Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | |||
and Congestion Control", RFC 9002, DOI 10.17487/RFC9002, | and Congestion Control", RFC 9002, DOI 10.17487/RFC9002, | |||
May 2021, <https://www.rfc-editor.org/rfc/rfc9002>. | May 2021, <https://www.rfc-editor.org/info/rfc9002>. | |||
[QUIC-TLS] Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure | [QUIC-TLS] Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure | |||
QUIC", RFC 9001, DOI 10.17487/RFC9001, May 2021, | QUIC", RFC 9001, DOI 10.17487/RFC9001, May 2021, | |||
<https://www.rfc-editor.org/rfc/rfc9001>. | <https://www.rfc-editor.org/info/rfc9001>. | |||
[QUIC-VN] Schinazi, D. and E. Rescorla, "Compatible Version | [QUIC-VN] Schinazi, D. and E. Rescorla, "Compatible Version | |||
Negotiation for QUIC", Work in Progress, Internet-Draft, | Negotiation for QUIC", RFC 9368, DOI 10.17487/RFC9368, May | |||
draft-ietf-quic-version-negotiation-13, 6 November 2022, | 2023, <https://www.rfc-editor.org/info/rfc9368>. | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-quic- | ||||
version-negotiation-13>. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/rfc/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/rfc/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
10.2. Informative References | 10.2. Informative References | |||
[HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, | [HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, | |||
June 2022, <https://www.rfc-editor.org/rfc/rfc9114>. | June 2022, <https://www.rfc-editor.org/info/rfc9114>. | |||
[QUIC-INVARIANTS] | [QUIC-INVARIANTS] | |||
Thomson, M., "Version-Independent Properties of QUIC", | Thomson, M., "Version-Independent Properties of QUIC", | |||
RFC 8999, DOI 10.17487/RFC8999, May 2021, | RFC 8999, DOI 10.17487/RFC8999, May 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8999>. | <https://www.rfc-editor.org/info/rfc8999>. | |||
[RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
"Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
July 2014, <https://www.rfc-editor.org/rfc/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
[RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
April 2016, <https://www.rfc-editor.org/rfc/rfc7838>. | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
[RFC9250] Huitema, C., Dickinson, S., and A. Mankin, "DNS over | [RFC9250] Huitema, C., Dickinson, S., and A. Mankin, "DNS over | |||
Dedicated QUIC Connections", RFC 9250, | Dedicated QUIC Connections", RFC 9250, | |||
DOI 10.17487/RFC9250, May 2022, | DOI 10.17487/RFC9250, May 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9250>. | <https://www.rfc-editor.org/info/rfc9250>. | |||
Appendix A. Sample Packet Protection | Appendix A. Sample Packet Protection | |||
This section shows examples of packet protection so that | This section shows examples of packet protection so that | |||
implementations can be verified incrementally. Samples of Initial | implementations can be verified incrementally. Samples of Initial | |||
packets from both client and server plus a Retry packet are defined. | packets from both the client and server plus a Retry packet are | |||
These packets use an 8-byte client-chosen Destination Connection ID | defined. These packets use an 8-byte client-chosen Destination | |||
of 0x8394c8f03e515708. Some intermediate values are included. All | Connection ID of 0x8394c8f03e515708. Some intermediate values are | |||
values are shown in hexadecimal. | included. All values are shown in hexadecimal. | |||
A.1. Keys | A.1. Keys | |||
The labels generated during the execution of the HKDF-Expand-Label | The labels generated during the execution of the HKDF-Expand-Label | |||
function (that is, HkdfLabel.label) and part of the value given to | function (that is, HkdfLabel.label) and part of the value given to | |||
the HKDF-Expand function in order to produce its output are: | the HKDF-Expand function in order to produce its output are: | |||
client in: 00200f746c73313320636c69656e7420696e00 | client in: 00200f746c73313320636c69656e7420696e00 | |||
server in: 00200f746c7331332073657276657220696e00 | server in: 00200f746c7331332073657276657220696e00 | |||
skipping to change at page 12, line 20 ¶ | skipping to change at line 483 ¶ | |||
0d0010000e0403050306030203080408 050806002d00020101001c0002400100 | 0d0010000e0403050306030203080408 050806002d00020101001c0002400100 | |||
3900320408ffffffffffffffff050480 00ffff07048000ffff08011001048000 | 3900320408ffffffffffffffff050480 00ffff07048000ffff08011001048000 | |||
75300901100f088394c8f03e51570806 048000ffff | 75300901100f088394c8f03e51570806 048000ffff | |||
The unprotected header indicates a length of 1182 bytes: the 4-byte | The unprotected header indicates a length of 1182 bytes: the 4-byte | |||
packet number, 1162 bytes of frames, and the 16-byte authentication | packet number, 1162 bytes of frames, and the 16-byte authentication | |||
tag. The header includes the connection ID and a packet number of 2: | tag. The header includes the connection ID and a packet number of 2: | |||
d36b3343cf088394c8f03e5157080000449e00000002 | d36b3343cf088394c8f03e5157080000449e00000002 | |||
Protecting the payload produces output that is sampled for header | Protecting the payload produces an output that is sampled for header | |||
protection. Because the header uses a 4-byte packet number encoding, | protection. Because the header uses a 4-byte packet number encoding, | |||
the first 16 bytes of the protected payload is sampled and then | the first 16 bytes of the protected payload is sampled and then | |||
applied to the header as follows: | applied to the header as follows: | |||
sample = ffe67b6abcdb4298b485dd04de806071 | sample = ffe67b6abcdb4298b485dd04de806071 | |||
mask = AES-ECB(hp, sample)[0..4] | mask = AES-ECB(hp, sample)[0..4] | |||
= 94a0c95e80 | = 94a0c95e80 | |||
header[0] ^= mask[0] & 0x0f | header[0] ^= mask[0] & 0x0f | |||
skipping to change at page 14, line 4 ¶ | skipping to change at line 549 ¶ | |||
A.3. Server Initial | A.3. Server Initial | |||
The server sends the following payload in response, including an ACK | The server sends the following payload in response, including an ACK | |||
frame, a CRYPTO frame, and no PADDING frames: | frame, a CRYPTO frame, and no PADDING frames: | |||
02000000000600405a020000560303ee fce7f7b37ba1d1632e96677825ddf739 | 02000000000600405a020000560303ee fce7f7b37ba1d1632e96677825ddf739 | |||
88cfc79825df566dc5430b9a045a1200 130100002e00330024001d00209d3c94 | 88cfc79825df566dc5430b9a045a1200 130100002e00330024001d00209d3c94 | |||
0d89690b84d08a60993c144eca684d10 81287c834d5311bcf32bb9da1a002b00 | 0d89690b84d08a60993c144eca684d10 81287c834d5311bcf32bb9da1a002b00 | |||
020304 | 020304 | |||
The header from the server includes a new connection ID and a 2-byte | The header from the server includes a new connection ID and a 2-byte | |||
packet number encoding for a packet number of 1: | packet number encoding for a packet number of 1: | |||
d16b3343cf0008f067a5502a4262b50040750001 | d16b3343cf0008f067a5502a4262b50040750001 | |||
As a result, after protection, the header protection sample is taken | As a result, after protection, the header protection sample is taken, | |||
starting from the third protected byte: | starting from the third protected byte: | |||
sample = 6f05d8a4398c47089698baeea26b91eb | sample = 6f05d8a4398c47089698baeea26b91eb | |||
mask = 4dd92e91ea | mask = 4dd92e91ea | |||
header = dc6b3343cf0008f067a5502a4262b5004075d92f | header = dc6b3343cf0008f067a5502a4262b5004075d92f | |||
The final protected packet is then: | The final protected packet is then: | |||
dc6b3343cf0008f067a5502a4262b500 4075d92faaf16f05d8a4398c47089698 | dc6b3343cf0008f067a5502a4262b500 4075d92faaf16f05d8a4398c47089698 | |||
baeea26b91eb761d9b89237bbf872630 17915358230035f7fd3945d88965cf17 | baeea26b91eb761d9b89237bbf872630 17915358230035f7fd3945d88965cf17 | |||
skipping to change at page 14, line 37 ¶ | skipping to change at line 583 ¶ | |||
Initial packet in Appendix A.2. The integrity check includes the | Initial packet in Appendix A.2. The integrity check includes the | |||
client-chosen connection ID value of 0x8394c8f03e515708, but that | client-chosen connection ID value of 0x8394c8f03e515708, but that | |||
value is not included in the final Retry packet: | value is not included in the final Retry packet: | |||
cf6b3343cf0008f067a5502a4262b574 6f6b656ec8646ce8bfe33952d9555436 | cf6b3343cf0008f067a5502a4262b574 6f6b656ec8646ce8bfe33952d9555436 | |||
65dcc7b6 | 65dcc7b6 | |||
A.5. ChaCha20-Poly1305 Short Header Packet | A.5. ChaCha20-Poly1305 Short Header Packet | |||
This example shows some of the steps required to protect a packet | This example shows some of the steps required to protect a packet | |||
with a short header. This example uses AEAD_CHACHA20_POLY1305. | with a short header. It uses AEAD_CHACHA20_POLY1305. | |||
In this example, TLS produces an application write secret from which | 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 server uses HKDF-Expand-Label to produce four values: a key, an | |||
a header protection key, and the secret that will be used after keys | Initialization Vector (IV), a header protection key, and the secret | |||
are updated (this last value is not used further in this example). | that will be used after keys are updated (this last value is not used | |||
further in this example). | ||||
secret | secret | |||
= 9ac312a7f877468ebe69422748ad00a1 | = 9ac312a7f877468ebe69422748ad00a1 | |||
5443f18203a07d6060f688f30f21632b | 5443f18203a07d6060f688f30f21632b | |||
key = HKDF-Expand-Label(secret, "quicv2 key", "", 32) | key = HKDF-Expand-Label(secret, "quicv2 key", "", 32) | |||
= 3bfcddd72bcf02541d7fa0dd1f5f9eee | = 3bfcddd72bcf02541d7fa0dd1f5f9eee | |||
a817e09a6963a0e6c7df0f9a1bab90f2 | a817e09a6963a0e6c7df0f9a1bab90f2 | |||
iv = HKDF-Expand-Label(secret, "quicv2 iv", "", 12) | iv = HKDF-Expand-Label(secret, "quicv2 iv", "", 12) | |||
skipping to change at page 16, line 5 ¶ | skipping to change at line 636 ¶ | |||
sample = e7b6b932bc27d786f4bc2bb20f2162ba | sample = e7b6b932bc27d786f4bc2bb20f2162ba | |||
mask = 97580e32bf | mask = 97580e32bf | |||
header = 5558b1c6 | header = 5558b1c6 | |||
The protected packet is the smallest possible packet size of 21 | The protected packet is the smallest possible packet size of 21 | |||
bytes. | bytes. | |||
packet = 5558b1c60ae7b6b932bc27d786f4bc2bb20f2162ba | packet = 5558b1c60ae7b6b932bc27d786f4bc2bb20f2162ba | |||
Appendix B. Acknowledgments | Acknowledgments | |||
The author would like to thank Christian Huitema, Lucas Pardue, Kyle | The author would like to thank Christian Huitema, Lucas Pardue, Kyle | |||
Rose, Anthony Rossi, Zahed Sarker, David Schinazi, Tatsuhiro | Rose, Anthony Rossi, Zahed Sarker, David Schinazi, Tatsuhiro | |||
Tsujikawa, and Martin Thomson for their helpful suggestions. | Tsujikawa, and Martin Thomson for their helpful suggestions. | |||
Appendix C. Changelog | ||||
*RFC Editor's Note:* Please remove this section prior to | ||||
publication of a final version of this document. | ||||
C.1. since draft-ietf-quic-v2-09 | ||||
* Added note for provisional IANA registration | ||||
C.2. since draft-ietf-quic-v2-08 | ||||
* Updated IANA considerations in accordance with new constants | ||||
C.3. since draft-ietf-quic-v2-07 | ||||
* Generated new constants and test vectors | ||||
C.4. since draft-ietf-quic-v2-06 | ||||
* Clients MUST NOT use TLS resumption tickets across versions | ||||
* Servers SHOULD support multiple versions | ||||
* Clients SHOULD check path support for QUIC independently by | ||||
version | ||||
* Minor editorial changes | ||||
C.5. since draft-ietf-quic-v2-05 | ||||
* Servers MUST use the negotiated version in Initials with CRYPTO | ||||
frames. | ||||
* Clarified when clients "learn" the negotiated version as required | ||||
in the VN draft. | ||||
* Comments from SECDIR review. | ||||
C.6. since draft-ietf-quic-v2-04 | ||||
* Clarified 0-RTT handling | ||||
* Editorial comments from Zahed Sarker. | ||||
C.7. since draft-ietf-quic-v2-03 | ||||
* a v2 session ticket is an indication of v2 support | ||||
* a v1-only extension is theoretically possible | ||||
* editorial fixes | ||||
C.8. since draft-ietf-quic-v2-02 | ||||
* Editorial comments from Lucas Pardue | ||||
C.9. since draft-ietf-quic-v2-01 | ||||
* Ban use of NEW_TOKEN tokens across versions | ||||
* version-info transport parameter required for all v2 endpoints | ||||
* Explicitly list known ALPN compatibility | ||||
C.10. since draft-ietf-quic-v2-00 | ||||
* Expanded requirements for compatible version negotiation | ||||
* Added test vectors | ||||
* Greased the packet type codepoints | ||||
* Random version number | ||||
* Clarified requirement to use QUIC-VN | ||||
* Banned use of resumption tokens across versions | ||||
C.11. since draft-duke-quic-v2-02 | ||||
* Converted to adopted draft | ||||
* Deleted references to QUIC improvements | ||||
* Clarified status of QUIC extensions | ||||
C.12. since draft-duke-quic-v2-01 | ||||
* Made the final version number TBD. | ||||
* Added ALPN considerations | ||||
C.13. since draft-duke-quic-v2-00 | ||||
* Added provisional versions for interop | ||||
* Change the v1 Retry Tag secret | ||||
* Change labels to create full key separation | ||||
Author's Address | Author's Address | |||
Martin Duke | Martin Duke | |||
Google LLC | Google LLC | |||
Email: martin.h.duke@gmail.com | Email: martin.h.duke@gmail.com | |||
End of changes. 51 change blocks. | ||||
260 lines changed or deleted | 119 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |