| draft-ietf-quic-tls-10.txt | draft-ietf-quic-tls-11.txt | |||
|---|---|---|---|---|
| QUIC M. Thomson, Ed. | QUIC M. Thomson, Ed. | |||
| Internet-Draft Mozilla | Internet-Draft Mozilla | |||
| Intended status: Standards Track S. Turner, Ed. | Intended status: Standards Track S. Turner, Ed. | |||
| Expires: September 6, 2018 sn3rd | Expires: October 19, 2018 sn3rd | |||
| March 05, 2018 | April 17, 2018 | |||
| Using Transport Layer Security (TLS) to Secure QUIC | Using Transport Layer Security (TLS) to Secure QUIC | |||
| draft-ietf-quic-tls-10 | draft-ietf-quic-tls-11 | |||
| Abstract | Abstract | |||
| This document describes how Transport Layer Security (TLS) is used to | This document describes how Transport Layer Security (TLS) is used to | |||
| secure QUIC. | secure QUIC. | |||
| Note to Readers | Note to Readers | |||
| Discussion of this draft takes place on the QUIC working group | Discussion of this draft takes place on the QUIC working group | |||
| mailing list (quic@ietf.org), which is archived at | mailing list (quic@ietf.org), which is archived at | |||
| skipping to change at page 1, line 42 ¶ | skipping to change at page 1, line 42 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on September 6, 2018. | This Internet-Draft will expire on October 19, 2018. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2018 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 33 ¶ | skipping to change at page 2, line 33 ¶ | |||
| 4.1. Handshake and Setup Sequence . . . . . . . . . . . . . . 8 | 4.1. Handshake and Setup Sequence . . . . . . . . . . . . . . 8 | |||
| 4.2. Interface to TLS . . . . . . . . . . . . . . . . . . . . 9 | 4.2. Interface to TLS . . . . . . . . . . . . . . . . . . . . 9 | |||
| 4.2.1. Handshake Interface . . . . . . . . . . . . . . . . . 10 | 4.2.1. Handshake Interface . . . . . . . . . . . . . . . . . 10 | |||
| 4.2.2. Source Address Validation . . . . . . . . . . . . . . 11 | 4.2.2. Source Address Validation . . . . . . . . . . . . . . 11 | |||
| 4.2.3. Key Ready Events . . . . . . . . . . . . . . . . . . 12 | 4.2.3. Key Ready Events . . . . . . . . . . . . . . . . . . 12 | |||
| 4.2.4. Secret Export . . . . . . . . . . . . . . . . . . . . 12 | 4.2.4. Secret Export . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.2.5. TLS Interface Summary . . . . . . . . . . . . . . . . 12 | 4.2.5. TLS Interface Summary . . . . . . . . . . . . . . . . 12 | |||
| 4.3. TLS Version . . . . . . . . . . . . . . . . . . . . . . . 13 | 4.3. TLS Version . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.4. ClientHello Size . . . . . . . . . . . . . . . . . . . . 13 | 4.4. ClientHello Size . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.5. Peer Authentication . . . . . . . . . . . . . . . . . . . 14 | 4.5. Peer Authentication . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.6. TLS Errors . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.6. Rejecting 0-RTT . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 5. QUIC Packet Protection . . . . . . . . . . . . . . . . . . . 14 | 4.7. TLS Errors . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 5. QUIC Packet Protection . . . . . . . . . . . . . . . . . . . 15 | ||||
| 5.1. Installing New Keys . . . . . . . . . . . . . . . . . . . 15 | 5.1. Installing New Keys . . . . . . . . . . . . . . . . . . . 15 | |||
| 5.2. QUIC Key Expansion . . . . . . . . . . . . . . . . . . . 15 | 5.2. Enabling 0-RTT . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 5.2.1. QHKDF-Expand . . . . . . . . . . . . . . . . . . . . 15 | 5.3. QUIC Key Expansion . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.2.2. Handshake Secrets . . . . . . . . . . . . . . . . . . 16 | 5.3.1. QHKDF-Expand . . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.2.3. 0-RTT Secret . . . . . . . . . . . . . . . . . . . . 17 | 5.3.2. Handshake Secrets . . . . . . . . . . . . . . . . . . 17 | |||
| 5.2.4. 1-RTT Secrets . . . . . . . . . . . . . . . . . . . . 17 | 5.3.3. 0-RTT Secret . . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.2.5. Updating 1-RTT Secrets . . . . . . . . . . . . . . . 17 | 5.3.4. 1-RTT Secrets . . . . . . . . . . . . . . . . . . . . 18 | |||
| 5.2.6. Packet Protection Keys . . . . . . . . . . . . . . . 18 | 5.3.5. Updating 1-RTT Secrets . . . . . . . . . . . . . . . 18 | |||
| 5.3. QUIC AEAD Usage . . . . . . . . . . . . . . . . . . . . . 18 | 5.3.6. Packet Protection Keys . . . . . . . . . . . . . . . 18 | |||
| 5.4. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 19 | 5.4. QUIC AEAD Usage . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 5.5. Receiving Protected Packets . . . . . . . . . . . . . . . 20 | 5.5. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 5.6. Packet Number Gaps . . . . . . . . . . . . . . . . . . . 20 | 5.6. Receiving Protected Packets . . . . . . . . . . . . . . . 21 | |||
| 6. Key Phases . . . . . . . . . . . . . . . . . . . . . . . . . 20 | 5.7. Packet Number Gaps . . . . . . . . . . . . . . . . . . . 21 | |||
| 6.1. Packet Protection for the TLS Handshake . . . . . . . . . 21 | 6. Key Phases . . . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 6.1.1. Initial Key Transitions . . . . . . . . . . . . . . . 21 | 6.1. Packet Protection for the TLS Handshake . . . . . . . . . 22 | |||
| 6.1.1. Initial Key Transitions . . . . . . . . . . . . . . . 22 | ||||
| 6.1.2. Retransmission and Acknowledgment of Unprotected | 6.1.2. Retransmission and Acknowledgment of Unprotected | |||
| Packets . . . . . . . . . . . . . . . . . . . . . . . 22 | Packets . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 6.2. Key Update . . . . . . . . . . . . . . . . . . . . . . . 23 | 6.2. Key Update . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 7. Client Address Validation . . . . . . . . . . . . . . . . . . 25 | 7. Client Address Validation . . . . . . . . . . . . . . . . . . 25 | |||
| 7.1. HelloRetryRequest Address Validation . . . . . . . . . . 25 | 7.1. HelloRetryRequest Address Validation . . . . . . . . . . 26 | |||
| 7.1.1. Stateless Address Validation . . . . . . . . . . . . 26 | 7.1.1. Stateless Address Validation . . . . . . . . . . . . 26 | |||
| 7.1.2. Sending HelloRetryRequest . . . . . . . . . . . . . . 26 | 7.1.2. Sending HelloRetryRequest . . . . . . . . . . . . . . 27 | |||
| 7.2. NewSessionTicket Address Validation . . . . . . . . . . . 26 | 7.2. NewSessionTicket Address Validation . . . . . . . . . . . 27 | |||
| 7.3. Address Validation Token Integrity . . . . . . . . . . . 27 | 7.3. Address Validation Token Integrity . . . . . . . . . . . 28 | |||
| 8. Pre-handshake QUIC Messages . . . . . . . . . . . . . . . . . 27 | 8. Pre-handshake QUIC Messages . . . . . . . . . . . . . . . . . 28 | |||
| 8.1. Unprotected Packets Prior to Handshake Completion . . . . 28 | 8.1. Unprotected Packets Prior to Handshake Completion . . . . 29 | |||
| 8.1.1. STREAM Frames . . . . . . . . . . . . . . . . . . . . 28 | 8.1.1. STREAM Frames . . . . . . . . . . . . . . . . . . . . 29 | |||
| 8.1.2. ACK Frames . . . . . . . . . . . . . . . . . . . . . 29 | 8.1.2. ACK Frames . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 8.1.3. Updates to Data and Stream Limits . . . . . . . . . . 29 | 8.1.3. Updates to Data and Stream Limits . . . . . . . . . . 30 | |||
| 8.1.4. Handshake Failures . . . . . . . . . . . . . . . . . 30 | 8.1.4. Handshake Failures . . . . . . . . . . . . . . . . . 31 | |||
| 8.1.5. Address Verification . . . . . . . . . . . . . . . . 30 | 8.1.5. Address Verification . . . . . . . . . . . . . . . . 31 | |||
| 8.1.6. Denial of Service with Unprotected Packets . . . . . 30 | 8.1.6. Denial of Service with Unprotected Packets . . . . . 31 | |||
| 8.2. Use of 0-RTT Keys . . . . . . . . . . . . . . . . . . . . 31 | 8.2. Use of 0-RTT Keys . . . . . . . . . . . . . . . . . . . . 32 | |||
| 8.3. Receiving Out-of-Order Protected Frames . . . . . . . . . 31 | 8.3. Receiving Out-of-Order Protected Frames . . . . . . . . . 32 | |||
| 9. QUIC-Specific Additions to the TLS Handshake . . . . . . . . 32 | 9. QUIC-Specific Additions to the TLS Handshake . . . . . . . . 33 | |||
| 9.1. Protocol and Version Negotiation . . . . . . . . . . . . 32 | 9.1. Protocol and Version Negotiation . . . . . . . . . . . . 33 | |||
| 9.2. QUIC Transport Parameters Extension . . . . . . . . . . . 32 | 9.2. QUIC Transport Parameters Extension . . . . . . . . . . . 33 | |||
| 9.3. Priming 0-RTT . . . . . . . . . . . . . . . . . . . . . . 33 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 34 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 33 | ||||
| 10.1. Packet Reflection Attack Mitigation . . . . . . . . . . 34 | 10.1. Packet Reflection Attack Mitigation . . . . . . . . . . 34 | |||
| 10.2. Peer Denial of Service . . . . . . . . . . . . . . . . . 34 | 10.2. Peer Denial of Service . . . . . . . . . . . . . . . . . 34 | |||
| 11. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 34 | 11. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 35 | 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 36 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 36 | 13.1. Normative References . . . . . . . . . . . . . . . . . . 36 | |||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 37 | 13.2. Informative References . . . . . . . . . . . . . . . . . 37 | |||
| 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 37 | Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 38 | |||
| Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 38 | Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 38 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 38 | Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 38 | |||
| C.1. Since draft-ietf-quic-tls-09 . . . . . . . . . . . . . . 38 | C.1. Since draft-ietf-quic-tls-10 . . . . . . . . . . . . . . 38 | |||
| C.2. Since draft-ietf-quic-tls-08 . . . . . . . . . . . . . . 38 | C.2. Since draft-ietf-quic-tls-09 . . . . . . . . . . . . . . 38 | |||
| C.3. Since draft-ietf-quic-tls-07 . . . . . . . . . . . . . . 38 | C.3. Since draft-ietf-quic-tls-08 . . . . . . . . . . . . . . 38 | |||
| C.4. Since draft-ietf-quic-tls-05 . . . . . . . . . . . . . . 38 | C.4. Since draft-ietf-quic-tls-07 . . . . . . . . . . . . . . 38 | |||
| C.5. Since draft-ietf-quic-tls-04 . . . . . . . . . . . . . . 38 | C.5. Since draft-ietf-quic-tls-05 . . . . . . . . . . . . . . 39 | |||
| C.6. Since draft-ietf-quic-tls-03 . . . . . . . . . . . . . . 38 | C.6. Since draft-ietf-quic-tls-04 . . . . . . . . . . . . . . 39 | |||
| C.7. Since draft-ietf-quic-tls-02 . . . . . . . . . . . . . . 38 | C.7. Since draft-ietf-quic-tls-03 . . . . . . . . . . . . . . 39 | |||
| C.8. Since draft-ietf-quic-tls-01 . . . . . . . . . . . . . . 39 | C.8. Since draft-ietf-quic-tls-02 . . . . . . . . . . . . . . 39 | |||
| C.9. Since draft-ietf-quic-tls-00 . . . . . . . . . . . . . . 39 | C.9. Since draft-ietf-quic-tls-01 . . . . . . . . . . . . . . 39 | |||
| C.10. Since draft-thomson-quic-tls-01 . . . . . . . . . . . . . 39 | C.10. Since draft-ietf-quic-tls-00 . . . . . . . . . . . . . . 39 | |||
| C.11. Since draft-thomson-quic-tls-01 . . . . . . . . . . . . . 40 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 40 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 1. Introduction | 1. Introduction | |||
| This document describes how QUIC [QUIC-TRANSPORT] is secured using | This document describes how QUIC [QUIC-TRANSPORT] is secured using | |||
| Transport Layer Security (TLS) version 1.3 [TLS13]. TLS 1.3 provides | Transport Layer Security (TLS) version 1.3 [TLS13]. TLS 1.3 provides | |||
| critical latency improvements for connection establishment over | critical latency improvements for connection establishment over | |||
| previous versions. Absent packet loss, most new connections can be | previous versions. Absent packet loss, most new connections can be | |||
| established and secured within a single round trip; on subsequent | established and secured within a single round trip; on subsequent | |||
| connections between the same client and server, the client can often | connections between the same client and server, the client can often | |||
| skipping to change at page 8, line 10 ¶ | skipping to change at page 8, line 10 ¶ | |||
| QUIC permits a client to send frames on streams starting from the | QUIC permits a client to send frames on streams starting from the | |||
| first packet. The initial packet from a client contains a stream | first packet. The initial packet from a client contains a stream | |||
| frame for stream 0 that contains the first TLS handshake messages | frame for stream 0 that contains the first TLS handshake messages | |||
| from the client. This allows the TLS handshake to start with the | from the client. This allows the TLS handshake to start with the | |||
| first packet that a client sends. | first packet that a client sends. | |||
| QUIC packets are protected using a scheme that is specific to QUIC, | QUIC packets are protected using a scheme that is specific to QUIC, | |||
| see Section 5. Keys are exported from the TLS connection when they | see Section 5. Keys are exported from the TLS connection when they | |||
| become available using a TLS exporter (see Section 7.5 of [TLS13] and | become available using a TLS exporter (see Section 7.5 of [TLS13] and | |||
| Section 5.2). After keys are exported from TLS, QUIC manages its own | Section 5.3). After keys are exported from TLS, QUIC manages its own | |||
| key schedule. | key schedule. | |||
| 4.1. Handshake and Setup Sequence | 4.1. Handshake and Setup Sequence | |||
| The integration of QUIC with a TLS handshake is shown in more detail | The integration of QUIC with a TLS handshake is shown in more detail | |||
| in Figure 3. QUIC "STREAM" frames on stream 0 carry the TLS | in Figure 3. QUIC "STREAM" frames on stream 0 carry the TLS | |||
| handshake. QUIC performs loss recovery [QUIC-RECOVERY] for this | handshake. QUIC performs loss recovery [QUIC-RECOVERY] for this | |||
| stream and ensures that TLS handshake messages are delivered in the | stream and ensures that TLS handshake messages are delivered in the | |||
| correct order. | correct order. | |||
| skipping to change at page 10, line 29 ¶ | skipping to change at page 10, line 29 ¶ | |||
| A QUIC server starts the process by providing TLS with stream 0 | A QUIC server starts the process by providing TLS with stream 0 | |||
| octets. | octets. | |||
| Each time that an endpoint receives data on stream 0, it delivers the | Each time that an endpoint receives data on stream 0, it delivers the | |||
| octets to TLS if it is able. Each time that TLS is provided with new | octets to TLS if it is able. Each time that TLS is provided with new | |||
| data, new handshake octets are requested from TLS. TLS might not | data, new handshake octets are requested from TLS. TLS might not | |||
| provide any octets if the handshake messages it has received are | provide any octets if the handshake messages it has received are | |||
| incomplete or it has no data to send. | incomplete or it has no data to send. | |||
| At the server, when TLS provides handshake octets, it also needs to | ||||
| indicate whether the octets contain a HelloRetryRequest. A | ||||
| HelloRetryRequest MUST always be sent in a Retry packet, so the QUIC | ||||
| server needs to know whether the octets are a HelloRetryRequest. | ||||
| Once the TLS handshake is complete, this is indicated to QUIC along | Once the TLS handshake is complete, this is indicated to QUIC along | |||
| with any final handshake octets that TLS needs to send. TLS also | with any final handshake octets that TLS needs to send. TLS also | |||
| provides QUIC with the transport parameters that the peer advertised | provides QUIC with the transport parameters that the peer advertised | |||
| during the handshake. | during the handshake. | |||
| Once the handshake is complete, TLS becomes passive. TLS can still | 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 | receive data from its peer and respond in kind, but it will not need | |||
| to send more data unless specifically requested - either by an | to send more data unless specifically requested - either by an | |||
| application or QUIC. One reason to send data is that the server | application or QUIC. One reason to send data is that the server | |||
| might wish to provide additional or updated session tickets to a | might wish to provide additional or updated session tickets to a | |||
| skipping to change at page 12, line 20 ¶ | skipping to change at page 12, line 24 ¶ | |||
| TLS produces handshake octets. | TLS produces handshake octets. | |||
| When TLS completed its handshake, 1-RTT keys can be provided to QUIC. | When TLS completed its handshake, 1-RTT keys can be provided to QUIC. | |||
| On both client and server, this occurs after sending the TLS Finished | On both client and server, this occurs after sending the TLS Finished | |||
| message. | message. | |||
| This ordering means that there could be frames that carry TLS | This ordering means that there could be frames that carry TLS | |||
| handshake messages ready to send at the same time that application | handshake messages ready to send at the same time that application | |||
| data is available. An implementation MUST ensure that TLS handshake | data is available. An implementation MUST ensure that TLS handshake | |||
| messages are always sent in packets protected with handshake keys | messages are always sent in packets protected with handshake keys | |||
| (see Section 5.2.2). Separate packets are required for data that | (see Section 5.3.2). Separate packets are required for data that | |||
| needs protection from 1-RTT keys. | needs protection from 1-RTT keys. | |||
| If 0-RTT is possible, it is ready after the client sends a TLS | If 0-RTT is possible, it is ready after the client sends a TLS | |||
| ClientHello message or the server receives that message. After | ClientHello message or the server receives that message. After | |||
| providing a QUIC client with the first handshake octets, the TLS | providing a QUIC client with the first handshake octets, the TLS | |||
| stack might signal that 0-RTT keys are ready. On the server, after | stack might signal that 0-RTT keys are ready. On the server, after | |||
| receiving handshake octets that contain a ClientHello message, a TLS | receiving handshake octets that contain a ClientHello message, a TLS | |||
| server might signal that 0-RTT keys are available. | server might signal that 0-RTT keys are available. | |||
| 1-RTT keys are used for packets in both directions. 0-RTT keys are | 1-RTT keys are used for packets in both directions. 0-RTT keys are | |||
| only used to protect packets sent by the client. | only used to protect packets sent by the client. | |||
| 4.2.4. Secret Export | 4.2.4. Secret Export | |||
| Details how secrets are exported from TLS are included in | Details how secrets are exported from TLS are included in | |||
| Section 5.2. | Section 5.3. | |||
| 4.2.5. TLS Interface Summary | 4.2.5. TLS Interface Summary | |||
| Figure 4 summarizes the exchange between QUIC and TLS for both client | Figure 4 summarizes the exchange between QUIC and TLS for both client | |||
| and server. | and server. | |||
| Client Server | Client Server | |||
| Get Handshake | Get Handshake | |||
| 0-RTT Key Ready | 0-RTT Key Ready | |||
| skipping to change at page 13, line 48 ¶ | skipping to change at page 13, line 48 ¶ | |||
| A badly configured TLS implementation could negotiate TLS 1.2 or | A badly configured TLS implementation could negotiate TLS 1.2 or | |||
| another older version of TLS. An endpoint MUST terminate the | another older version of TLS. An endpoint MUST terminate the | |||
| connection if a version of TLS older than 1.3 is negotiated. | connection if a version of TLS older than 1.3 is negotiated. | |||
| 4.4. ClientHello Size | 4.4. ClientHello Size | |||
| QUIC requires that the initial handshake packet from a client fit | QUIC requires that the initial handshake packet from a client fit | |||
| within the payload of a single packet. The size limits on QUIC | within the payload of a single packet. The size limits on QUIC | |||
| packets mean that a record containing a ClientHello needs to fit | packets mean that a record containing a ClientHello needs to fit | |||
| within 1171 octets. | within 1129 octets, though endpoints can reduce the size of their | |||
| connection ID to increase by up to 22 octets. | ||||
| A TLS ClientHello can fit within this limit with ample space | A TLS ClientHello can fit within this limit with ample space | |||
| remaining. However, there are several variables that could cause | remaining. However, there are several variables that could cause | |||
| this limit to be exceeded. Implementations are reminded that large | this limit to be exceeded. Implementations are reminded that large | |||
| session tickets or HelloRetryRequest cookies, multiple or large key | session tickets or HelloRetryRequest cookies, multiple or large key | |||
| shares, and long lists of supported ciphers, signature algorithms, | shares, and long lists of supported ciphers, signature algorithms, | |||
| versions, QUIC transport parameters, and other negotiable parameters | versions, QUIC transport parameters, and other negotiable parameters | |||
| and extensions could cause this message to grow. | and extensions could cause this message to grow. | |||
| For servers, the size of the session tickets and HelloRetryRequest | For servers, the size of the session tickets and HelloRetryRequest | |||
| skipping to change at page 14, line 37 ¶ | skipping to change at page 14, line 38 ¶ | |||
| trusted entity (see for example [RFC2818]). | trusted entity (see for example [RFC2818]). | |||
| A server MAY request that the client authenticate during the | A server MAY request that the client authenticate during the | |||
| handshake. A server MAY refuse a connection if the client is unable | handshake. A server MAY refuse a connection if the client is unable | |||
| to authenticate when requested. The requirements for client | to authenticate when requested. The requirements for client | |||
| authentication vary based on application protocol and deployment. | authentication vary based on application protocol and deployment. | |||
| A server MUST NOT use post-handshake client authentication (see | A server MUST NOT use post-handshake client authentication (see | |||
| Section 4.6.2 of [TLS13]). | Section 4.6.2 of [TLS13]). | |||
| 4.6. TLS Errors | 4.6. Rejecting 0-RTT | |||
| A server rejects 0-RTT by rejecting 0-RTT at the TLS layer. This | ||||
| results in early exporter keys being unavailable, thereby preventing | ||||
| the use of 0-RTT for QUIC. | ||||
| A client that attempts 0-RTT MUST also consider 0-RTT to be rejected | ||||
| if it receives a Retry or Version Negotiation packet. | ||||
| 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. | ||||
| 4.7. TLS Errors | ||||
| Errors in the TLS connection SHOULD be signaled using TLS alerts on | Errors in the TLS connection SHOULD be signaled using TLS alerts on | |||
| stream 0. A failure in the handshake MUST be treated as a QUIC | stream 0. A failure in the handshake MUST be treated as a QUIC | |||
| connection error of type TLS_HANDSHAKE_FAILED. Once the handshake is | connection error of type TLS_HANDSHAKE_FAILED. Once the handshake is | |||
| complete, an error in the TLS connection that causes a TLS alert to | complete, an error in the TLS connection that causes a TLS alert to | |||
| be sent or received MUST be treated as a QUIC connection error of | be sent or received MUST be treated as a QUIC connection error of | |||
| type TLS_FATAL_ALERT_GENERATED or TLS_FATAL_ALERT_RECEIVED | type TLS_FATAL_ALERT_GENERATED or TLS_FATAL_ALERT_RECEIVED | |||
| respectively. | respectively. | |||
| 5. QUIC Packet Protection | 5. QUIC Packet Protection | |||
| QUIC packet protection provides authenticated encryption of packets. | QUIC packet protection provides authenticated encryption of packets. | |||
| This provides confidentiality and integrity protection for the | This provides confidentiality and integrity protection for the | |||
| content of packets (see Section 5.3). Packet protection uses keys | content of packets (see Section 5.4). Packet protection uses keys | |||
| that are exported from the TLS connection (see Section 5.2). | that are exported from the TLS connection (see Section 5.3). | |||
| Different keys are used for QUIC packet protection and TLS record | Different keys are used for QUIC packet protection and TLS record | |||
| protection. TLS handshake messages are protected solely with TLS | protection. TLS handshake messages are protected solely with TLS | |||
| record protection, but post-handshake messages are redundantly | record protection, but post-handshake messages are redundantly | |||
| proteted with both both the QUIC packet protection and the TLS record | protected with both the QUIC packet protection and the TLS record | |||
| protection. These messages are limited in number, and so the | protection. These messages are limited in number, and so the | |||
| additional overhead is small. | additional overhead is small. | |||
| 5.1. Installing New Keys | 5.1. Installing New Keys | |||
| As TLS reports the availability of keying material, the packet | As TLS reports the availability of keying material, the packet | |||
| protection keys and initialization vectors (IVs) are updated (see | protection keys and initialization vectors (IVs) are updated (see | |||
| Section 5.2). The selection of AEAD function is also updated to | Section 5.3). The selection of AEAD function is also updated to | |||
| match the AEAD negotiated by TLS. | match the AEAD negotiated by TLS. | |||
| For packets other than any handshake packets (see Section 6.1), once | For packets other than any handshake packets (see Section 6.1), once | |||
| a change of keys has been made, packets with higher packet numbers | a change of keys has been made, packets with higher packet numbers | |||
| MUST be sent with the new keying material. The KEY_PHASE bit on | MUST be sent with the new keying material. The KEY_PHASE bit on | |||
| these packets is inverted each time new keys are installed to signal | these packets is inverted each time new keys are installed to signal | |||
| the use of the new keys to the recipient (see Section 6 for details). | the use of the new keys to the recipient (see Section 6 for details). | |||
| An endpoint retransmits stream data in a new packet. New packets | An endpoint retransmits stream data in a new packet. New packets | |||
| have new packet numbers and use the latest packet protection keys. | have new packet numbers and use the latest packet protection keys. | |||
| This simplifies key management when there are key updates (see | This simplifies key management when there are key updates (see | |||
| Section 6.2). | Section 6.2). | |||
| 5.2. QUIC Key Expansion | 5.2. Enabling 0-RTT | |||
| In order to be usable for 0-RTT, TLS MUST provide a NewSessionTicket | ||||
| message that contains the "max_early_data" extension with the value | ||||
| 0xffffffff; the amount of data which the client can send in 0-RTT is | ||||
| controlled by the "initial_max_data" transport parameter supplied by | ||||
| the server. A client MUST treat receipt of a NewSessionTicket that | ||||
| contains a "max_early_data" extension with any other value as a | ||||
| connection error of type PROTOCOL_VIOLATION. | ||||
| Early data within the TLS connection MUST NOT be used. As it is for | ||||
| other TLS application data, a server MUST treat receiving early data | ||||
| on the TLS connection as a connection error of type | ||||
| PROTOCOL_VIOLATION. | ||||
| 5.3. QUIC Key Expansion | ||||
| QUIC uses a system of packet protection secrets, keys and IVs that | QUIC uses a system of packet protection secrets, keys and IVs that | |||
| are modelled on the system used in TLS [TLS13]. The secrets that | are modelled on the system used in TLS [TLS13]. The secrets that | |||
| QUIC uses as the basis of its key schedule are obtained using TLS | QUIC uses as the basis of its key schedule are obtained using TLS | |||
| exporters (see Section 7.5 of [TLS13]). | exporters (see Section 7.5 of [TLS13]). | |||
| 5.2.1. QHKDF-Expand | 5.3.1. QHKDF-Expand | |||
| QUIC uses the Hash-based Key Derivation Function (HKDF) [HKDF] with | QUIC uses the Hash-based Key Derivation Function (HKDF) [HKDF] with | |||
| the same hash function negotiated by TLS for key derivation. For | the same hash function negotiated by TLS for key derivation. For | |||
| example, if TLS is using the TLS_AES_128_GCM_SHA256, the SHA-256 hash | example, if TLS is using the TLS_AES_128_GCM_SHA256, the SHA-256 hash | |||
| function is used. | function is used. | |||
| Most key derivations in this document use the QHKDF-Expand function, | Most key derivations in this document use the QHKDF-Expand function, | |||
| which uses the HKDF expand function and is modelled on the HKDF- | which uses the HKDF expand function and is modelled on the HKDF- | |||
| Expand-Label function from TLS 1.3 (see Section 7.1 of [TLS13]). | Expand-Label function from TLS 1.3 (see Section 7.1 of [TLS13]). | |||
| QHKDF-Expand differs from HKDF-Expand-Label in that it uses a | QHKDF-Expand differs from HKDF-Expand-Label in that it uses a | |||
| different base label and omits the Context argument. | different base label and omits the Context argument. | |||
| QHKDF-Expand(Secret, Label, Length) = | QHKDF-Expand(Secret, Label, Length) = | |||
| HKDF-Expand(Secret, QhkdfExpandInfo, Length) | HKDF-Expand(Secret, QhkdfExpandInfo, Length) | |||
| The HKDF-Expand function used by QHKDF-Expand uses the PRF hash | The HKDF-Expand function used by QHKDF-Expand uses the PRF hash | |||
| function negotiated by TLS, except for handshake secrets and keys | function negotiated by TLS, except for handshake secrets and keys | |||
| derived from them (see Section 5.2.2). | derived from them (see Section 5.3.2). | |||
| Where the "info" parameter of HKDF-Expand is an encoded | Where the "info" parameter of HKDF-Expand is an encoded | |||
| "QhkdfExpandInfo" structure: | "QhkdfExpandInfo" structure: | |||
| struct { | struct { | |||
| uint16 length = Length; | uint16 length = Length; | |||
| opaque label<6..255> = "QUIC " + Label; | opaque label<6..255> = "QUIC " + Label; | |||
| } QhkdfExpandInfo; | } QhkdfExpandInfo; | |||
| For example, assuming a hash function with a 32 octet output, | For example, assuming a hash function with a 32 octet output, | |||
| derivation for a client packet protection key would use HKDF-Expand | derivation for a client packet protection key would use HKDF-Expand | |||
| with an "info" parameter of 0x00200851554943206b6579. | with an "info" parameter of 0x00200851554943206b6579. | |||
| 5.2.2. Handshake Secrets | 5.3.2. Handshake Secrets | |||
| Packets that carry the TLS handshake (Initial, Retry, and Handshake) | Packets that carry the TLS handshake (Initial, Retry, and Handshake) | |||
| are protected with a secret derived from the connection ID used in | are protected with a secret derived from the Destination Connection | |||
| the client's Initial packet. Specifically: | ID field from the client's Initial packet. Specifically: | |||
| handshake_salt = 0x9c108f98520a5c5c32968e950e8a2c5fe06d6c38 | handshake_salt = 0x9c108f98520a5c5c32968e950e8a2c5fe06d6c38 | |||
| handshake_secret = | handshake_secret = | |||
| HKDF-Extract(handshake_salt, client_connection_id) | HKDF-Extract(handshake_salt, client_dst_connection_id) | |||
| client_handshake_secret = | client_handshake_secret = | |||
| QHKDF-Expand(handshake_secret, "client hs", Hash.length) | QHKDF-Expand(handshake_secret, "client hs", Hash.length) | |||
| server_handshake_secret = | server_handshake_secret = | |||
| QHKDF-Expand(handshake_secret, "server hs", Hash.length) | QHKDF-Expand(handshake_secret, "server hs", Hash.length) | |||
| The hash function for HKDF when deriving handshake secrets and keys | The hash function for HKDF when deriving handshake secrets and keys | |||
| is SHA-256 [FIPS180]. The connection ID used with QHKDF-Expand is | is SHA-256 [FIPS180]. The connection ID used with QHKDF-Expand is | |||
| the connection ID chosen by the client. | the connection ID chosen by the client. | |||
| The handshake salt is a 20 octet sequence shown in the figure in | The handshake salt is a 20 octet sequence shown in the figure in | |||
| hexadecimal notation. Future versions of QUIC SHOULD generate a new | hexadecimal notation. Future versions of QUIC SHOULD generate a new | |||
| salt value, thus ensuring that the keys are different for each | salt value, thus ensuring that the keys are different for each | |||
| version of QUIC. This prevents a middlebox that only recognizes one | version of QUIC. This prevents a middlebox that only recognizes one | |||
| version of QUIC from seeing or modifying the contents of handshake | version of QUIC from seeing or modifying the contents of handshake | |||
| packets from future versions. | packets from future versions. | |||
| 5.2.3. 0-RTT Secret | Note: The Destination Connection ID is of arbitrary length, and it | |||
| could be zero length if the server sends a Retry packet with a | ||||
| zero-length Source Connection ID field. In this case, the | ||||
| handshake keys provide no assurance to the client that the server | ||||
| received its packet; the client has to rely on the exchange that | ||||
| included the Retry packet for that property. | ||||
| 5.3.3. 0-RTT Secret | ||||
| 0-RTT keys are those keys that are used in resumed connections prior | 0-RTT keys are those keys that are used in resumed connections prior | |||
| to the completion of the TLS handshake. Data sent using 0-RTT keys | to the completion of the TLS handshake. Data sent using 0-RTT keys | |||
| might be replayed and so has some restrictions on its use, see | might be replayed and so has some restrictions on its use, see | |||
| Section 8.2. 0-RTT keys are used after sending or receiving a | Section 8.2. 0-RTT keys are used after sending or receiving a | |||
| ClientHello. | ClientHello. | |||
| The secret is exported from TLS using the exporter label "EXPORTER- | The secret is exported from TLS using the exporter label "EXPORTER- | |||
| QUIC 0rtt" and an empty context. The size of the secret MUST be the | QUIC 0rtt" and an empty context. The size of the secret MUST be the | |||
| size of the hash output for the PRF hash function negotiated by TLS. | size of the hash output for the PRF hash function negotiated by TLS. | |||
| This uses the TLS early_exporter_secret. The QUIC 0-RTT secret is | This uses the TLS early_exporter_secret. The QUIC 0-RTT secret is | |||
| only used for protection of packets sent by the client. | only used for protection of packets sent by the client. | |||
| client_0rtt_secret = | client_0rtt_secret = | |||
| TLS-Early-Exporter("EXPORTER-QUIC 0rtt", "", Hash.length) | TLS-Early-Exporter("EXPORTER-QUIC 0rtt", "", Hash.length) | |||
| 5.2.4. 1-RTT Secrets | 5.3.4. 1-RTT Secrets | |||
| 1-RTT keys are used by both client and server after the TLS handshake | 1-RTT keys are used by both client and server after the TLS handshake | |||
| completes. There are two secrets used at any time: one is used to | completes. There are two secrets used at any time: one is used to | |||
| derive packet protection keys for packets sent by the client, the | derive packet protection keys for packets sent by the client, the | |||
| other for packet protection keys on packets sent by the server. | other for packet protection keys on packets sent by the server. | |||
| The initial client packet protection secret is exported from TLS | The initial client packet protection secret is exported from TLS | |||
| using the exporter label "EXPORTER-QUIC client 1rtt"; the initial | using the exporter label "EXPORTER-QUIC client 1rtt"; the initial | |||
| server packet protection secret uses the exporter label "EXPORTER- | server packet protection secret uses the exporter label "EXPORTER- | |||
| QUIC server 1rtt". Both exporters use an empty context. The size of | QUIC server 1rtt". Both exporters use an empty context. The size of | |||
| the secret MUST be the size of the hash output for the PRF hash | the secret MUST be the size of the hash output for the PRF hash | |||
| function negotiated by TLS. | function negotiated by TLS. | |||
| client_pp_secret_0 = | client_pp_secret<0> = | |||
| TLS-Exporter("EXPORTER-QUIC client 1rtt", "", Hash.length) | TLS-Exporter("EXPORTER-QUIC client 1rtt", "", Hash.length) | |||
| server_pp_secret_0 = | server_pp_secret<0> = | |||
| TLS-Exporter("EXPORTER-QUIC server 1rtt", "", Hash.length) | TLS-Exporter("EXPORTER-QUIC server 1rtt", "", Hash.length) | |||
| These secrets are used to derive the initial client and server packet | These secrets are used to derive the initial client and server packet | |||
| protection keys. | protection keys. | |||
| 5.2.5. Updating 1-RTT Secrets | 5.3.5. Updating 1-RTT Secrets | |||
| After a key update (see Section 6.2), the 1-RTT secrets are updated | After a key update (see Section 6.2), the 1-RTT secrets are updated | |||
| using QHKDF-Expand. Updated secrets are derived from the existing | using QHKDF-Expand. Updated secrets are derived from the existing | |||
| packet protection secret. A Label parameter of "client 1rtt" is used | packet protection secret. A Label parameter of "client 1rtt" is used | |||
| for the client secret and "server 1rtt" for the server. The Length | for the client secret and "server 1rtt" for the server. The Length | |||
| is the same as the native output of the PRF hash function. | is the same as the native output of the PRF hash function. | |||
| client_pp_secret_<N+1> = | client_pp_secret<N+1> = | |||
| QHKDF-Update(client_pp_secret_<N>, "client 1rtt", Hash.length) | QHKDF-Expand(client_pp_secret<N>, "client 1rtt", Hash.length) | |||
| server_pp_secret_<N+1> = | server_pp_secret<N+1> = | |||
| QHKDF-Update(server_pp_secret_<N>, "server 1rtt", Hash.length) | QHKDF-Expand(server_pp_secret<N>, "server 1rtt", Hash.length) | |||
| This allows for a succession of new secrets to be created as needed. | This allows for a succession of new secrets to be created as needed. | |||
| 5.2.6. Packet Protection Keys | 5.3.6. Packet Protection Keys | |||
| The complete key expansion uses a similar process for key expansion | The complete key expansion uses a similar process for key expansion | |||
| to that defined in Section 7.3 of [TLS13], using QHKDF-Expand in | to that defined in Section 7.3 of [TLS13], using QHKDF-Expand in | |||
| place of HKDF-Expand-Label. QUIC uses the AEAD function negotiated | place of HKDF-Expand-Label. QUIC uses the AEAD function negotiated | |||
| by TLS. | by TLS. | |||
| The packet protection key and IV used to protect the 0-RTT packets | The packet protection key and IV used to protect the 0-RTT packets | |||
| sent by a client are derived from the QUIC 0-RTT secret. The packet | sent by a client are derived from the QUIC 0-RTT secret. The packet | |||
| protection keys and IVs for 1-RTT packets sent by the client and | protection keys and IVs for 1-RTT packets sent by the client and | |||
| server are derived from the current generation of client and server | server are derived from the current generation of client and server | |||
| 1-RTT secrets (client_pp_secret_<i> and server_pp_secret_<i>) | 1-RTT secrets (client_pp_secret<i> and server_pp_secret<i>) | |||
| respectively. | respectively. | |||
| The length of the QHKDF-Expand output is determined by the | The length of the QHKDF-Expand output is determined by the | |||
| requirements of the AEAD function selected by TLS. The key length is | requirements of the AEAD function selected by TLS. The key length is | |||
| the AEAD key size. As defined in Section 5.3 of [TLS13], the IV | the AEAD key size. As defined in Section 5.3 of [TLS13], the IV | |||
| length is the larger of 8 or N_MIN (see Section 4 of [AEAD]; all | length is the larger of 8 or N_MIN (see Section 4 of [AEAD]; all | |||
| ciphersuites defined in [TLS13] have N_MIN set to 12). | ciphersuites defined in [TLS13] have N_MIN set to 12). | |||
| For any secret S, the AEAD key uses a label of "key", and the IV uses | For any secret S, the AEAD key uses a label of "key", and the IV uses | |||
| a label of "iv": | a label of "iv": | |||
| key = QHKDF-Expand(S, "key", key_length) | key = QHKDF-Expand(S, "key", key_length) | |||
| iv = QHKDF-Expand(S, "iv", iv_length) | iv = QHKDF-Expand(S, "iv", iv_length) | |||
| Separate keys are derived for packet protection by clients and | ||||
| servers. Each endpoint uses the packet protection key of its peer to | ||||
| remove packet protection. For example, client packet protection keys | ||||
| and IVs - which are also used by the server to remove the protection | ||||
| added by a client - for AEAD_AES_128_GCM are derived from 1-RTT | ||||
| secrets as follows: | ||||
| client_pp_key<i> = QHKDF-Expand(client_pp_secret<i>, "key", 16) | ||||
| client_pp_iv<i> = QHKDF-Expand(client_pp_secret<i>, "iv", 12) | ||||
| The QUIC record protection initially starts with keying material | The QUIC record protection initially starts with keying material | |||
| derived from handshake keys. For a client, when the TLS state | derived from handshake keys. For a client, when the TLS state | |||
| machine reports that the ClientHello has been sent, 0-RTT keys can be | machine reports that the ClientHello has been sent, 0-RTT keys can be | |||
| generated and installed for writing, if 0-RTT is available. Finally, | generated and installed for writing, if 0-RTT is available. Finally, | |||
| the TLS state machine reports completion of the handshake and 1-RTT | the TLS state machine reports completion of the handshake and 1-RTT | |||
| keys can be generated and installed for writing. | keys can be generated and installed for writing. | |||
| 5.3. QUIC AEAD Usage | 5.4. QUIC AEAD Usage | |||
| The Authentication Encryption with Associated Data (AEAD) [AEAD] | The Authentication Encryption with Associated Data (AEAD) [AEAD] | |||
| function used for QUIC packet protection is AEAD that is negotiated | function used for QUIC packet protection is AEAD that is negotiated | |||
| for use with the TLS connection. For example, if TLS is using the | for use with the TLS connection. For example, if TLS is using the | |||
| TLS_AES_128_GCM_SHA256, the AEAD_AES_128_GCM function is used. | TLS_AES_128_GCM_SHA256, the AEAD_AES_128_GCM function is used. | |||
| All QUIC packets other than Version Negotiation and Stateless Reset | All QUIC packets other than Version Negotiation and Stateless Reset | |||
| packets are protected with an AEAD algorithm [AEAD]. Prior to | packets are protected with an AEAD algorithm [AEAD]. Prior to | |||
| establishing a shared secret, packets are protected with | establishing a shared secret, packets are protected with | |||
| AEAD_AES_128_GCM and a key derived from the client's connection ID | AEAD_AES_128_GCM and a key derived from the client's connection ID | |||
| (see Section 5.2.2). This provides protection against off-path | (see Section 5.3.2). This provides protection against off-path | |||
| attackers and robustness against QUIC version unaware middleboxes, | attackers and robustness against QUIC version unaware middleboxes, | |||
| but not against on-path attackers. | but not against on-path attackers. | |||
| All ciphersuites currently defined for TLS 1.3 - and therefore QUIC - | All ciphersuites currently defined for TLS 1.3 - and therefore QUIC - | |||
| have a 16-byte authentication tag and produce an output 16 bytes | have a 16-byte authentication tag and produce an output 16 bytes | |||
| larger than their input. | larger than their input. | |||
| Once TLS has provided a key, the contents of regular QUIC packets | Once TLS has provided a key, the contents of regular QUIC packets | |||
| immediately after any TLS messages have been sent are protected by | immediately after any TLS messages have been sent are protected by | |||
| the AEAD selected by TLS. | the AEAD selected by TLS. | |||
| The key, K, is either the client packet protection key | The key, K, is either the client packet protection key | |||
| (client_pp_key_<i>) or the server packet protection key | (client_pp_key<i>) or the server packet protection key | |||
| (server_pp_key_<i>), derived as defined in Section 5.2. | (server_pp_key<i>), derived as defined in Section 5.3. | |||
| The nonce, N, is formed by combining the packet protection IV (either | The nonce, N, is formed by combining the packet protection IV (either | |||
| client_pp_iv_<i> or server_pp_iv_<i>) with the packet number. The 64 | client_pp_iv<i> or server_pp_iv<i>) with the packet number. The 64 | |||
| bits of the reconstructed QUIC packet number in network byte order is | bits of the reconstructed QUIC packet number in network byte order is | |||
| left-padded with zeros to the size of the IV. The exclusive OR of | 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 padded packet number and the IV forms the AEAD nonce. | |||
| The associated data, A, for the AEAD is the contents of the QUIC | The associated data, A, for the AEAD is the contents of the QUIC | |||
| header, starting from the flags octet in either the short or long | header, starting from the flags octet in either the short or long | |||
| header. | header. | |||
| The input plaintext, P, for the AEAD is the content of the QUIC frame | The input plaintext, P, for the AEAD is the content of the QUIC frame | |||
| following the header, as described in [QUIC-TRANSPORT]. | following the header, as described in [QUIC-TRANSPORT]. | |||
| The output ciphertext, C, of the AEAD is transmitted in place of P. | The output ciphertext, C, of the AEAD is transmitted in place of P. | |||
| 5.4. Packet Numbers | 5.5. Packet Numbers | |||
| QUIC has a single, contiguous packet number space. In comparison, | QUIC has a single, contiguous packet number space. In comparison, | |||
| TLS restarts its sequence number each time that record protection | TLS restarts its sequence number each time that record protection | |||
| keys are changed. The sequence number restart in TLS ensures that a | keys are changed. The sequence number restart in TLS ensures that a | |||
| compromise of the current traffic keys does not allow an attacker to | compromise of the current traffic keys does not allow an attacker to | |||
| truncate the data that is sent after a key update by sending | truncate the data that is sent after a key update by sending | |||
| additional packets under the old key (causing new packets to be | additional packets under the old key (causing new packets to be | |||
| discarded). | discarded). | |||
| QUIC does not assume a reliable transport and is required to handle | QUIC does not assume a reliable transport and is required to handle | |||
| skipping to change at page 20, line 19 ¶ | skipping to change at page 21, line 15 ¶ | |||
| Some AEAD functions have limits for how many packets can be encrypted | Some AEAD functions have limits for how many packets can be encrypted | |||
| under the same key and IV (see for example [AEBounds]). This might | under the same key and IV (see for example [AEBounds]). This might | |||
| be lower than the packet number limit. An endpoint MUST initiate a | be lower than the packet number limit. An endpoint MUST initiate a | |||
| key update (Section 6.2) prior to exceeding any limit set for the | key update (Section 6.2) prior to exceeding any limit set for the | |||
| AEAD that is in use. | AEAD that is in use. | |||
| TLS maintains a separate sequence number that is used for record | TLS maintains a separate sequence number that is used for record | |||
| protection on the connection that is hosted on stream 0. This | protection on the connection that is hosted on stream 0. This | |||
| sequence number is not visible to QUIC. | sequence number is not visible to QUIC. | |||
| 5.5. Receiving Protected Packets | 5.6. Receiving Protected Packets | |||
| Once an endpoint successfully receives a packet with a given packet | Once an endpoint successfully receives a packet with a given packet | |||
| number, it MUST discard all packets with higher packet numbers if | number, it MUST discard all packets with higher packet numbers if | |||
| they cannot be successfully unprotected with either the same key, or | they cannot be successfully unprotected with either the same key, or | |||
| - if there is a key update - the next packet protection key (see | - if there is a key update - the next packet protection key (see | |||
| Section 6.2). Similarly, a packet that appears to trigger a key | Section 6.2). Similarly, a packet that appears to trigger a key | |||
| update, but cannot be unprotected successfully MUST be discarded. | update, but cannot be unprotected successfully MUST be discarded. | |||
| Failure to unprotect a packet does not necessarily indicate the | Failure to unprotect a packet does not necessarily indicate the | |||
| existence of a protocol error in a peer or an attack. The truncated | 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 | packet number encoding used in QUIC can cause packet numbers to be | |||
| decoded incorrectly if they are delayed significantly. | decoded incorrectly if they are delayed significantly. | |||
| 5.6. Packet Number Gaps | 5.7. Packet Number Gaps | |||
| Section 7.7.1.1 of [QUIC-TRANSPORT] also requires a secret to compute | Section 6.8.5.1 of [QUIC-TRANSPORT] also requires a secret to compute | |||
| packet number gaps on connection ID transitions. That secret is | packet number gaps on connection ID transitions. That secret is | |||
| computed as: | computed as: | |||
| packet_number_secret = | packet_number_secret = | |||
| TLS-Exporter("EXPORTER-QUIC packet number", "", Hash.length) | TLS-Exporter("EXPORTER-QUIC packet number", "", Hash.length) | |||
| 6. Key Phases | 6. Key Phases | |||
| As TLS reports the availability of 0-RTT and 1-RTT keys, new keying | As TLS reports the availability of 0-RTT and 1-RTT keys, new keying | |||
| material can be exported from TLS and used for QUIC packet | material can be exported from TLS and used for QUIC packet | |||
| skipping to change at page 21, line 24 ¶ | skipping to change at page 22, line 19 ¶ | |||
| header. | header. | |||
| Transitions between keys during the handshake are complicated by the | Transitions between keys during the handshake are complicated by the | |||
| need to ensure that TLS handshake messages are sent with the correct | need to ensure that TLS handshake messages are sent with the correct | |||
| packet protection. | packet protection. | |||
| 6.1. Packet Protection for the TLS Handshake | 6.1. Packet Protection for the TLS Handshake | |||
| The initial exchange of packets that carry the TLS handshake are | The initial exchange of packets that carry the TLS handshake are | |||
| AEAD-protected using the handshake secrets generated as described in | AEAD-protected using the handshake secrets generated as described in | |||
| Section 5.2.2. All TLS handshake messages up to the TLS Finished | Section 5.3.2. All TLS handshake messages up to the TLS Finished | |||
| message sent by either endpoint use packets protected with handshake | message sent by either endpoint use packets protected with handshake | |||
| keys. | keys. | |||
| Any TLS handshake messages that are sent after completing the TLS | Any TLS handshake messages that are sent after completing the TLS | |||
| handshake do not need special packet protection rules. Packets | handshake do not need special packet protection rules. Packets | |||
| containing these messages use the packet protection keys that are | containing these messages use the packet protection keys that are | |||
| current at the time of sending (or retransmission). | current at the time of sending (or retransmission). | |||
| Like the client, a server MUST send retransmissions of its | Like the client, a server MUST send retransmissions of its | |||
| unprotected handshake messages or acknowledgments for unprotected | unprotected handshake messages or acknowledgments for unprotected | |||
| skipping to change at page 22, line 28 ¶ | skipping to change at page 23, line 22 ¶ | |||
| The server transitions to using 1-RTT keys after sending its first | The server transitions to using 1-RTT keys after sending its first | |||
| flight of TLS handshake messages, ending in the Finished. From this | flight of TLS handshake messages, ending in the Finished. From this | |||
| point, the server protects all packets with 1-RTT keys. Future | point, the server protects all packets with 1-RTT keys. Future | |||
| packets are therefore protected with 1-RTT keys. Initially, these | packets are therefore protected with 1-RTT keys. Initially, these | |||
| are marked with a KEY_PHASE of 0. | are marked with a KEY_PHASE of 0. | |||
| 6.1.2. Retransmission and Acknowledgment of Unprotected Packets | 6.1.2. Retransmission and Acknowledgment of Unprotected Packets | |||
| TLS handshake messages from both client and server are critical to | TLS handshake messages from both client and server are critical to | |||
| the key exchange. The contents of these messages determines the keys | the key exchange. The contents of these messages determine the keys | |||
| used to protect later messages. If these handshake messages are | used to protect later messages. If these handshake messages are | |||
| included in packets that are protected with these keys, they will be | included in packets that are protected with these keys, they will be | |||
| indecipherable to the recipient. | indecipherable to the recipient. | |||
| Even though newer keys could be available when retransmitting, | Even though newer keys could be available when retransmitting, | |||
| retransmissions of these handshake messages MUST be sent in packets | retransmissions of these handshake messages MUST be sent in packets | |||
| protected with handshake keys. An endpoint MUST generate ACK frames | protected with handshake keys. An endpoint MUST generate ACK frames | |||
| for these messages and send them in packets protected with handshake | for these messages and send them in packets protected with handshake | |||
| keys. | keys. | |||
| A HelloRetryRequest handshake message might be used to reject an | A HelloRetryRequest handshake message might be used to reject an | |||
| initial ClientHello. A HelloRetryRequest handshake message is sent | initial ClientHello. A HelloRetryRequest handshake message is sent | |||
| in a Retry packet; any second ClientHello that is sent in response | in a Retry packet; any second ClientHello that is sent in response | |||
| uses a Initial packet type. These packets are only protected with a | uses a Initial packet type. These packets are only protected with a | |||
| predictable key (see Section 5.2.2). This is natural, because no | predictable key (see Section 5.3.2). This is natural, because no | |||
| shared secret will be available when these messages need to be sent. | shared secret will be available when these messages need to be sent. | |||
| Upon receipt of a HelloRetryRequest, a client SHOULD cease any | Upon receipt of a HelloRetryRequest, a client SHOULD cease any | |||
| transmission of 0-RTT data; 0-RTT data will only be discarded by any | transmission of 0-RTT data; 0-RTT data will only be discarded by any | |||
| server that sends a HelloRetryRequest. | server that sends a HelloRetryRequest. | |||
| The packet type ensures that protected packets are clearly | The packet type ensures that protected packets are clearly | |||
| distinguished from unprotected packets. Loss or reordering might | distinguished from unprotected packets. Loss or reordering might | |||
| cause unprotected packets to arrive once 1-RTT keys are in use, | cause unprotected packets to arrive once 1-RTT keys are in use, | |||
| unprotected packets are easily distinguished from 1-RTT packets using | unprotected packets are easily distinguished from 1-RTT packets using | |||
| the packet type. | the packet type. | |||
| skipping to change at page 23, line 35 ¶ | skipping to change at page 24, line 28 ¶ | |||
| the KEY_PHASE bit indicates that a new key is in use. | the KEY_PHASE bit indicates that a new key is in use. | |||
| An endpoint MUST NOT initiate more than one key update at a time. A | An endpoint MUST NOT initiate more than one key update at a time. A | |||
| new key cannot be used until the endpoint has received and | new key cannot be used until the endpoint has received and | |||
| successfully decrypted a packet with a matching KEY_PHASE. Note that | successfully decrypted a packet with a matching KEY_PHASE. Note that | |||
| when 0-RTT is attempted the value of the KEY_PHASE bit will be | when 0-RTT is attempted the value of the KEY_PHASE bit will be | |||
| different on packets sent by either peer. | different on packets sent by either peer. | |||
| A receiving endpoint detects an update when the KEY_PHASE bit doesn't | A receiving endpoint detects an update when the KEY_PHASE bit doesn't | |||
| match what it is expecting. It creates a new secret (see | match what it is expecting. It creates a new secret (see | |||
| Section 5.2) and the corresponding read key and IV. If the packet | Section 5.3) and the corresponding read key and IV. If the packet | |||
| can be decrypted and authenticated using these values, then the keys | can be decrypted and authenticated using these values, then the keys | |||
| it uses for packet protection are also updated. The next packet sent | it uses for packet protection are also updated. The next packet sent | |||
| by the endpoint will then use the new keys. | by the endpoint will then use the new keys. | |||
| An endpoint doesn't need to send packets immediately when it detects | An endpoint doesn't need to send packets immediately when it detects | |||
| that its peer has updated keys. The next packet that it sends will | that its peer has updated keys. The next packet that it sends will | |||
| simply use the new keys. If an endpoint detects a second update | simply use the new keys. If an endpoint detects a second update | |||
| before it has sent any packets with updated keys it indicates that | before it has sent any packets with updated keys it indicates that | |||
| its peer has updated keys twice without awaiting a reciprocal update. | its peer has updated keys twice without awaiting a reciprocal update. | |||
| An endpoint MUST treat consecutive key updates as a fatal error and | An endpoint MUST treat consecutive key updates as a fatal error and | |||
| abort the connection. | abort the connection. | |||
| An endpoint SHOULD retain old keys for a short period to allow it to | An endpoint SHOULD retain old keys for a short period to allow it to | |||
| decrypt packets with smaller packet numbers than the packet that | decrypt packets with smaller packet numbers than the packet that | |||
| triggered the key update. This allows an endpoint to consume packets | triggered the key update. This allows an endpoint to consume packets | |||
| that are reordered around the transition between keys. Packets with | that are reordered around the transition between keys. Packets with | |||
| higher packet numbers always use the updated keys and MUST NOT be | higher packet numbers always use the updated keys and MUST NOT be | |||
| decrypted with old keys. | decrypted with old keys. | |||
| Keys and their corresponding secrets SHOULD be discarded when an | Keys and their corresponding secrets SHOULD be discarded when an | |||
| endpoint has received all packets with sequence numbers lower than | endpoint has received all packets with packet numbers lower than the | |||
| the lowest sequence number used for the new key. An endpoint might | lowest packet number used for the new key. An endpoint might discard | |||
| discard keys if it determines that the length of the delay to | keys if it determines that the length of the delay to affected | |||
| affected packets is excessive. | packets is excessive. | |||
| This ensures that once the handshake is complete, packets with the | This ensures that once the handshake is complete, packets with the | |||
| same KEY_PHASE will have the same packet protection keys, unless | same KEY_PHASE will have the same packet protection keys, unless | |||
| there are multiple key updates in a short time frame succession and | there are multiple key updates in a short time frame succession and | |||
| significant packet reordering. | significant packet reordering. | |||
| Initiating Peer Responding Peer | Initiating Peer Responding Peer | |||
| @M QUIC Frames | @M QUIC Frames | |||
| New Keys -> @N | New Keys -> @N | |||
| skipping to change at page 24, line 34 ¶ | skipping to change at page 25, line 28 ¶ | |||
| QUIC Frames @M | QUIC Frames @M | |||
| New Keys -> @N | New Keys -> @N | |||
| QUIC Frames @N | QUIC Frames @N | |||
| <-------- | <-------- | |||
| Figure 5: Key Update | Figure 5: Key Update | |||
| As shown in Figure 3 and Figure 5, there is never a situation where | As shown in Figure 3 and Figure 5, there is never a situation where | |||
| there are more than two different sets of keying material that might | there are more than two different sets of keying material that might | |||
| be received by a peer. Once both sending and receiving keys have | be received by a peer. Once both sending and receiving keys have | |||
| been updated, | been updated, the peers immediately begin to use them. | |||
| A server cannot initiate a key update until it has received the | A server cannot initiate a key update until it has received the | |||
| client's Finished message. Otherwise, packets protected by the | client's Finished message. Otherwise, packets protected by the | |||
| updated keys could be confused for retransmissions of handshake | updated keys could be confused for retransmissions of handshake | |||
| messages. A client cannot initiate a key update until all of its | messages. A client cannot initiate a key update until all of its | |||
| handshake messages have been acknowledged by the server. | handshake messages have been acknowledged by the server. | |||
| A packet that triggers a key update could arrive after successfully | A packet that triggers a key update could arrive after successfully | |||
| processing a packet with a higher packet number. This is only | processing a packet with a higher packet number. This is only | |||
| possible if there is a key compromise and an attack, or if the peer | possible if there is a key compromise and an attack, or if the peer | |||
| skipping to change at page 30, line 29 ¶ | skipping to change at page 31, line 23 ¶ | |||
| In order to perform source-address verification before the handshake | In order to perform source-address verification before the handshake | |||
| is complete, "PATH_CHALLENGE" and "PATH_RESPONSE" frames MAY be | is complete, "PATH_CHALLENGE" and "PATH_RESPONSE" frames MAY be | |||
| exchanged unprotected. | exchanged unprotected. | |||
| 8.1.6. Denial of Service with Unprotected Packets | 8.1.6. Denial of Service with Unprotected Packets | |||
| Accepting unprotected - specifically unauthenticated - packets | Accepting unprotected - specifically unauthenticated - packets | |||
| presents a denial of service risk to endpoints. An attacker that is | presents a denial of service risk to endpoints. An attacker that is | |||
| able to inject unprotected packets can cause a recipient to drop even | able to inject unprotected packets can cause a recipient to drop even | |||
| protected packets with a matching sequence number. The spurious | protected packets with a matching packet number. The spurious packet | |||
| packet shadows the genuine packet, causing the genuine packet to be | shadows the genuine packet, causing the genuine packet to be ignored | |||
| ignored as redundant. | as redundant. | |||
| Once the TLS handshake is complete, both peers MUST ignore | Once the TLS handshake is complete, both peers MUST ignore | |||
| unprotected packets. From that point onward, unprotected messages | unprotected packets. From that point onward, unprotected messages | |||
| can be safely dropped. | can be safely dropped. | |||
| Since only TLS handshake packets and acknowledgments are sent in the | Since only TLS handshake packets and acknowledgments are sent in the | |||
| clear, an attacker is able to force implementations to rely on | clear, an attacker is able to force implementations to rely on | |||
| retransmission for packets that are lost or shadowed. Thus, an | retransmission for packets that are lost or shadowed. Thus, an | |||
| attacker that intends to deny service to an endpoint has to drop or | attacker that intends to deny service to an endpoint has to drop or | |||
| shadow protected packets in order to ensure that their victim | shadow protected packets in order to ensure that their victim | |||
| skipping to change at page 31, line 4 ¶ | skipping to change at page 31, line 47 ¶ | |||
| packets means that an attacker does not need to be on path. | packets means that an attacker does not need to be on path. | |||
| In addition to causing valid packets to be dropped, an attacker can | In addition to causing valid packets to be dropped, an attacker can | |||
| generate packets with an intent of causing the recipient to expend | generate packets with an intent of causing the recipient to expend | |||
| processing resources. See Section 10.2 for a discussion of these | processing resources. See Section 10.2 for a discussion of these | |||
| risks. | risks. | |||
| To avoid receiving TLS packets that contain no useful data, a TLS | To avoid receiving TLS packets that contain no useful data, a TLS | |||
| implementation MUST reject empty TLS handshake records and any record | implementation MUST reject empty TLS handshake records and any record | |||
| that is not permitted by the TLS state machine. Any TLS application | that is not permitted by the TLS state machine. Any TLS application | |||
| data or alerts that is received prior to the end of the handshake | data or alerts that are received prior to the end of the handshake | |||
| MUST be treated as a fatal error. | MUST be treated as a connection error of type PROTOCOL_VIOLATION. | |||
| 8.2. Use of 0-RTT Keys | 8.2. Use of 0-RTT Keys | |||
| If 0-RTT keys are available, the lack of replay protection means that | If 0-RTT keys are available (see Section 5.2), the lack of replay | |||
| restrictions on their use are necessary to avoid replay attacks on | protection means that restrictions on their use are necessary to | |||
| the protocol. | avoid replay attacks on the protocol. | |||
| A client MUST only use 0-RTT keys to protect data that is idempotent. | A client MUST only use 0-RTT keys to protect data that is idempotent. | |||
| A client MAY wish to apply additional restrictions on what data it | A client MAY wish to apply additional restrictions on what data it | |||
| sends prior to the completion of the TLS handshake. A client | sends prior to the completion of the TLS handshake. A client | |||
| otherwise treats 0-RTT keys as equivalent to 1-RTT keys. | otherwise treats 0-RTT keys as equivalent to 1-RTT keys. | |||
| A client that receives an indication that its 0-RTT data has been | 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 | 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 | server's handshake messages. A client SHOULD stop sending 0-RTT data | |||
| if it receives an indication that 0-RTT data has been rejected. | if it receives an indication that 0-RTT data has been rejected. | |||
| A server MUST NOT use 0-RTT keys to protect packets. | A server MUST NOT use 0-RTT keys to protect packets. | |||
| If a server rejects 0-RTT, then the TLS stream will not include any | ||||
| TLS records protected with 0-RTT keys. | ||||
| 8.3. Receiving Out-of-Order Protected Frames | 8.3. Receiving Out-of-Order Protected Frames | |||
| Due to reordering and loss, protected packets might be received by an | Due to reordering and loss, protected packets might be received by an | |||
| endpoint before the final TLS handshake messages are received. A | endpoint before the final TLS handshake messages are received. A | |||
| client will be unable to decrypt 1-RTT packets from the server, | 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 | whereas a server will be able to decrypt 1-RTT packets from the | |||
| client. | client. | |||
| Packets protected with 1-RTT keys MAY be stored and later decrypted | Packets protected with 1-RTT keys MAY be stored and later decrypted | |||
| and used once the handshake is complete. A server MUST NOT use 1-RTT | and used once the handshake is complete. A server MUST NOT use 1-RTT | |||
| skipping to change at page 33, line 10 ¶ | skipping to change at page 34, line 10 ¶ | |||
| The "extension_data" field of the quic_transport_parameters extension | The "extension_data" field of the quic_transport_parameters extension | |||
| contains a value that is defined by the version of QUIC that is in | contains a value that is defined by the version of QUIC that is in | |||
| use. The quic_transport_parameters extension carries a | use. The quic_transport_parameters extension carries a | |||
| TransportParameters when the version of QUIC defined in | TransportParameters when the version of QUIC defined in | |||
| [QUIC-TRANSPORT] is used. | [QUIC-TRANSPORT] is used. | |||
| The quic_transport_parameters extension is carried in the ClientHello | The quic_transport_parameters extension is carried in the ClientHello | |||
| and the EncryptedExtensions messages during the handshake. | and the EncryptedExtensions messages during the handshake. | |||
| 9.3. Priming 0-RTT | ||||
| QUIC uses TLS without modification. Therefore, it is possible to use | ||||
| a pre-shared key that was established in a TLS handshake over TCP to | ||||
| enable 0-RTT in QUIC. Similarly, QUIC can provide a pre-shared key | ||||
| that can be used to enable 0-RTT in TCP. | ||||
| All the restrictions on the use of 0-RTT apply, with the exception of | ||||
| the ALPN label, which MUST only change to a label that is explicitly | ||||
| designated as being compatible. The client indicates which ALPN | ||||
| label it has chosen by placing that ALPN label first in the ALPN | ||||
| extension. In order to be usable for 0-RTT, the NewSessionTicket | ||||
| MUST contain the "max_early_data" extension with the value | ||||
| 0xffffffff; the amount of data which the client can send in 0-RTT is | ||||
| controlled by the "initial_max_data" transport parameter supplied by | ||||
| the server. A client MUST treat receipt of a NewSessionTicket that | ||||
| contains a "max_early_data" extension with any other value as a | ||||
| connection error of type PROTOCOL_VIOLATION. | ||||
| The certificate that the server uses MUST be considered valid for | ||||
| both connections, which will use different protocol stacks and could | ||||
| use different port numbers. For instance, HTTP/1.1 and HTTP/2 | ||||
| operate over TLS and TCP, whereas QUIC operates over UDP. | ||||
| Source address validation is not completely portable between | ||||
| different protocol stacks. Even if the source IP address remains | ||||
| constant, the port number is likely to be different. Packet | ||||
| reflection attacks are still possible in this situation, though the | ||||
| set of hosts that can initiate these attacks is greatly reduced. A | ||||
| server might choose to avoid source address validation for such a | ||||
| connection, or allow an increase to the amount of data that it sends | ||||
| toward the client without source validation. | ||||
| 10. Security Considerations | 10. Security Considerations | |||
| There are likely to be some real clangers here eventually, but the | There are likely to be some real clangers here eventually, but the | |||
| current set of issues is well captured in the relevant sections of | current set of issues is well captured in the relevant sections of | |||
| the main text. | the main text. | |||
| Never assume that because it isn't in the security considerations | Never assume that because it isn't in the security considerations | |||
| section it doesn't affect security. Most of this document does. | section it doesn't affect security. Most of this document does. | |||
| 10.1. Packet Reflection Attack Mitigation | 10.1. Packet Reflection Attack Mitigation | |||
| skipping to change at page 34, line 39 ¶ | skipping to change at page 35, line 5 ¶ | |||
| without consequence. | without consequence. | |||
| QUIC prohibits the sending of empty "STREAM" frames unless they are | QUIC prohibits the sending of empty "STREAM" frames unless they are | |||
| marked with the FIN bit. This prevents "STREAM" frames from being | marked with the FIN bit. This prevents "STREAM" frames from being | |||
| sent that only waste effort. | sent that only waste effort. | |||
| TLS records SHOULD always contain at least one octet of a handshake | TLS records SHOULD always contain at least one octet of a handshake | |||
| messages or alert. Records containing only padding are permitted | messages or alert. Records containing only padding are permitted | |||
| during the handshake, but an excessive number might be used to | during the handshake, but an excessive number might be used to | |||
| generate unnecessary work. Once the TLS handshake is complete, | generate unnecessary work. Once the TLS handshake is complete, | |||
| endpoints SHOULD NOT send TLS application data records unless it is | endpoints MUST NOT send TLS application data records. Receiving TLS | |||
| to hide the length of QUIC records. QUIC packet protection does not | application data MUST be treated as a connection error of type | |||
| include any allowance for padding; padded TLS application data | PROTOCOL_VIOLATION. | |||
| records can be used to mask the length of QUIC frames. | ||||
| While there are legitimate uses for some redundant packets, | While there are legitimate uses for some redundant packets, | |||
| implementations SHOULD track redundant packets and treat excessive | implementations SHOULD track redundant packets and treat excessive | |||
| volumes of any non-productive packets as indicative of an attack. | volumes of any non-productive packets as indicative of an attack. | |||
| 11. Error Codes | 11. Error Codes | |||
| This section defines error codes from the error code space used in | This section defines error codes from the error code space used in | |||
| [QUIC-TRANSPORT]. | [QUIC-TRANSPORT]. | |||
| skipping to change at page 35, line 32 ¶ | skipping to change at page 35, line 45 ¶ | |||
| register the three error codes found in Section 11, these are | register the three error codes found in Section 11, these are | |||
| summarized in Table 1. | summarized in Table 1. | |||
| o TLS ExtensionsType Registry [TLS-REGISTRIES] - IANA is to register | o TLS ExtensionsType Registry [TLS-REGISTRIES] - IANA is to register | |||
| the quic_transport_parameters extension found in Section 9.2. | the quic_transport_parameters extension found in Section 9.2. | |||
| Assigning 26 to the extension would be greatly appreciated. The | Assigning 26 to the extension would be greatly appreciated. The | |||
| Recommended column is to be marked Yes. The TLS 1.3 Column is to | Recommended column is to be marked Yes. The TLS 1.3 Column is to | |||
| include CH and EE. | include CH and EE. | |||
| o TLS Exporter Label Registry [TLS-REGISTRIES] - IANA is requested | o TLS Exporter Label Registry [TLS-REGISTRIES] - IANA is requested | |||
| to register "EXPORTER-QUIC 0rtt" from Section 5.2.3; "EXPORTER- | to register "EXPORTER-QUIC 0rtt" from Section 5.3.3; "EXPORTER- | |||
| QUIC client 1rtt" and "EXPORTER-QUIC server 1-RTT" from | QUIC client 1rtt" and "EXPORTER-QUIC server 1-RTT" from | |||
| Section 5.2.4. The DTLS column is to be marked No. The | Section 5.3.4. The DTLS column is to be marked No. The | |||
| Recommended column is to be marked Yes. | Recommended column is to be marked Yes. | |||
| +-------+---------------------------+---------------+---------------+ | +-------+---------------------------+---------------+---------------+ | |||
| | Value | Error | Description | Specification | | | Value | Error | Description | Specification | | |||
| +-------+---------------------------+---------------+---------------+ | +-------+---------------------------+---------------+---------------+ | |||
| | 0x201 | TLS_HANDSHAKE_FAILED | TLS handshake | Section 11 | | | 0x201 | TLS_HANDSHAKE_FAILED | TLS handshake | Section 11 | | |||
| | | | failure | | | | | | failure | | | |||
| | | | | | | | | | | | | |||
| | 0x202 | TLS_FATAL_ALERT_GENERATED | Sent TLS | Section 11 | | | 0x202 | TLS_FATAL_ALERT_GENERATED | Sent TLS | Section 11 | | |||
| | | | alert | | | | | | alert | | | |||
| skipping to change at page 36, line 26 ¶ | skipping to change at page 36, line 41 ¶ | |||
| fips-180-4.pdf>. | fips-180-4.pdf>. | |||
| [HKDF] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand | [HKDF] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand | |||
| Key Derivation Function (HKDF)", RFC 5869, | Key Derivation Function (HKDF)", RFC 5869, | |||
| DOI 10.17487/RFC5869, May 2010, | DOI 10.17487/RFC5869, May 2010, | |||
| <https://www.rfc-editor.org/info/rfc5869>. | <https://www.rfc-editor.org/info/rfc5869>. | |||
| [QUIC-TRANSPORT] | [QUIC-TRANSPORT] | |||
| Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", draft-ietf-quic- | Multiplexed and Secure Transport", draft-ietf-quic- | |||
| transport-10 (work in progress), March 2018. | transport-11 (work in progress), April 2018. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/info/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| skipping to change at page 37, line 14 ¶ | skipping to change at page 37, line 27 ¶ | |||
| 13.2. Informative References | 13.2. Informative References | |||
| [AEBounds] | [AEBounds] | |||
| Luykx, A. and K. Paterson, "Limits on Authenticated | Luykx, A. and K. Paterson, "Limits on Authenticated | |||
| Encryption Use in TLS", March 2016, | Encryption Use in TLS", March 2016, | |||
| <http://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | <http://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | |||
| [QUIC-HTTP] | [QUIC-HTTP] | |||
| Bishop, M., Ed., "Hypertext Transfer Protocol (HTTP) over | Bishop, M., Ed., "Hypertext Transfer Protocol (HTTP) over | |||
| QUIC", draft-ietf-quic-http-10 (work in progress), March | QUIC", draft-ietf-quic-http-11 (work in progress), April | |||
| 2018. | 2018. | |||
| [QUIC-RECOVERY] | [QUIC-RECOVERY] | |||
| Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | |||
| and Congestion Control", draft-ietf-quic-recovery-10 (work | and Congestion Control", draft-ietf-quic-recovery-11 (work | |||
| in progress), March 2018. | in progress), April 2018. | |||
| [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | |||
| DOI 10.17487/RFC2818, May 2000, | DOI 10.17487/RFC2818, May 2000, | |||
| <https://www.rfc-editor.org/info/rfc2818>. | <https://www.rfc-editor.org/info/rfc2818>. | |||
| [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | |||
| Housley, R., and W. Polk, "Internet X.509 Public Key | Housley, R., and W. Polk, "Internet X.509 Public Key | |||
| Infrastructure Certificate and Certificate Revocation List | Infrastructure Certificate and Certificate Revocation List | |||
| (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | |||
| <https://www.rfc-editor.org/info/rfc5280>. | <https://www.rfc-editor.org/info/rfc5280>. | |||
| skipping to change at page 38, line 18 ¶ | skipping to change at page 38, line 30 ¶ | |||
| Christian Huitema, Jana Iyengar, Adam Langley, Roberto Peon, Eric | Christian Huitema, Jana Iyengar, Adam Langley, Roberto Peon, Eric | |||
| Rescorla, Ian Swett, and many others. | Rescorla, Ian Swett, and many others. | |||
| Appendix C. Change Log | Appendix C. Change Log | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| Issue and pull request numbers are listed with a leading octothorp. | Issue and pull request numbers are listed with a leading octothorp. | |||
| C.1. Since draft-ietf-quic-tls-09 | C.1. Since draft-ietf-quic-tls-10 | |||
| o No significant changes. | ||||
| C.2. Since draft-ietf-quic-tls-09 | ||||
| o Cleaned up key schedule and updated the salt used for handshake | o Cleaned up key schedule and updated the salt used for handshake | |||
| packet protection (#1077) | packet protection (#1077) | |||
| C.2. Since draft-ietf-quic-tls-08 | C.3. Since draft-ietf-quic-tls-08 | |||
| o Specify value for max_early_data_size to enable 0-RTT (#942) | o Specify value for max_early_data_size to enable 0-RTT (#942) | |||
| o Update key derivation function (#1003, #1004) | o Update key derivation function (#1003, #1004) | |||
| C.3. Since draft-ietf-quic-tls-07 | C.4. Since draft-ietf-quic-tls-07 | |||
| o Handshake errors can be reported with CONNECTION_CLOSE (#608, | o Handshake errors can be reported with CONNECTION_CLOSE (#608, | |||
| #891) | #891) | |||
| C.4. Since draft-ietf-quic-tls-05 | C.5. Since draft-ietf-quic-tls-05 | |||
| No significant changes. | No significant changes. | |||
| C.5. Since draft-ietf-quic-tls-04 | C.6. Since draft-ietf-quic-tls-04 | |||
| o Update labels used in HKDF-Expand-Label to match TLS 1.3 (#642) | o Update labels used in HKDF-Expand-Label to match TLS 1.3 (#642) | |||
| C.6. Since draft-ietf-quic-tls-03 | C.7. Since draft-ietf-quic-tls-03 | |||
| No significant changes. | No significant changes. | |||
| C.7. Since draft-ietf-quic-tls-02 | C.8. Since draft-ietf-quic-tls-02 | |||
| o Updates to match changes in transport draft | o Updates to match changes in transport draft | |||
| C.8. Since draft-ietf-quic-tls-01 | C.9. Since draft-ietf-quic-tls-01 | |||
| o Use TLS alerts to signal TLS errors (#272, #374) | o Use TLS alerts to signal TLS errors (#272, #374) | |||
| o Require ClientHello to fit in a single packet (#338) | o Require ClientHello to fit in a single packet (#338) | |||
| o The second client handshake flight is now sent in the clear (#262, | o The second client handshake flight is now sent in the clear (#262, | |||
| #337) | #337) | |||
| o The QUIC header is included as AEAD Associated Data (#226, #243, | o The QUIC header is included as AEAD Associated Data (#226, #243, | |||
| #302) | #302) | |||
| skipping to change at page 39, line 30 ¶ | skipping to change at page 39, line 46 ¶ | |||
| o Require at least TLS 1.3 (#138) | o Require at least TLS 1.3 (#138) | |||
| o Define transport parameters as a TLS extension (#122) | o Define transport parameters as a TLS extension (#122) | |||
| o Define handling for protected packets before the handshake | o Define handling for protected packets before the handshake | |||
| completes (#39) | completes (#39) | |||
| o Decouple QUIC version and ALPN (#12) | o Decouple QUIC version and ALPN (#12) | |||
| C.9. Since draft-ietf-quic-tls-00 | C.10. Since draft-ietf-quic-tls-00 | |||
| o Changed bit used to signal key phase | o Changed bit used to signal key phase | |||
| o Updated key phase markings during the handshake | o Updated key phase markings during the handshake | |||
| o Added TLS interface requirements section | o Added TLS interface requirements section | |||
| o Moved to use of TLS exporters for key derivation | o Moved to use of TLS exporters for key derivation | |||
| o Moved TLS error code definitions into this document | o Moved TLS error code definitions into this document | |||
| C.10. Since draft-thomson-quic-tls-01 | C.11. Since draft-thomson-quic-tls-01 | |||
| o Adopted as base for draft-ietf-quic-tls | o Adopted as base for draft-ietf-quic-tls | |||
| o Updated authors/editors list | o Updated authors/editors list | |||
| o Added status note | o Added status note | |||
| Authors' Addresses | Authors' Addresses | |||
| Martin Thomson (editor) | Martin Thomson (editor) | |||
| End of changes. 72 change blocks. | ||||
| 163 lines changed or deleted | 189 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||