rfc9147.original | rfc9147.txt | |||
---|---|---|---|---|
TLS E. Rescorla | Internet Engineering Task Force (IETF) E. Rescorla | |||
Internet-Draft RTFM, Inc. | Request for Comments: 9147 Mozilla | |||
Obsoletes: 6347 (if approved) H. Tschofenig | Obsoletes: 6347 H. Tschofenig | |||
Intended status: Standards Track Arm Limited | Category: Standards Track Arm Limited | |||
Expires: 1 November 2021 N. Modadugu | ISSN: 2070-1721 N. Modadugu | |||
Google, Inc. | Google, Inc. | |||
30 April 2021 | March 2022 | |||
The Datagram Transport Layer Security (DTLS) Protocol Version 1.3 | The Datagram Transport Layer Security (DTLS) Protocol Version 1.3 | |||
draft-ietf-tls-dtls13-43 | ||||
Abstract | Abstract | |||
This document specifies Version 1.3 of the Datagram Transport Layer | This document specifies version 1.3 of the Datagram Transport Layer | |||
Security (DTLS) protocol. DTLS 1.3 allows client/server applications | Security (DTLS) protocol. DTLS 1.3 allows client/server applications | |||
to communicate over the Internet in a way that is designed to prevent | to communicate over the Internet in a way that is designed to prevent | |||
eavesdropping, tampering, and message forgery. | eavesdropping, tampering, and message forgery. | |||
The DTLS 1.3 protocol is intentionally based on the Transport Layer | The DTLS 1.3 protocol is based on the Transport Layer Security (TLS) | |||
Security (TLS) 1.3 protocol and provides equivalent security | 1.3 protocol and provides equivalent security guarantees with the | |||
guarantees with the exception of order protection/non-replayability. | exception of order protection / non-replayability. Datagram | |||
Datagram semantics of the underlying transport are preserved by the | semantics of the underlying transport are preserved by the DTLS | |||
DTLS protocol. | protocol. | |||
This document obsoletes RFC 6347. | This document obsoletes RFC 6347. | |||
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 1 November 2021. | 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/rfc9147. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2022 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 Simplified BSD License text | to this document. Code Components extracted from this document must | |||
as 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 Simplified BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
This document may contain material from IETF Documents or IETF | This document may contain material from IETF Documents or IETF | |||
Contributions published or made publicly available before November | Contributions published or made publicly available before November | |||
10, 2008. The person(s) controlling the copyright in some of this | 10, 2008. The person(s) controlling the copyright in some of this | |||
material may not have granted the IETF Trust the right to allow | material may not have granted the IETF Trust the right to allow | |||
modifications of such material outside the IETF Standards Process. | modifications of such material outside the IETF Standards Process. | |||
Without obtaining an adequate license from the person(s) controlling | Without obtaining an adequate license from the person(s) controlling | |||
the copyright in such materials, this document may not be modified | the copyright in such materials, this document may not be modified | |||
outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
than English. | than English. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction | |||
2. Conventions and Terminology . . . . . . . . . . . . . . . . . 4 | 2. Conventions and Terminology | |||
3. DTLS Design Rationale and Overview . . . . . . . . . . . . . 6 | 3. DTLS Design Rationale and Overview | |||
3.1. Packet Loss . . . . . . . . . . . . . . . . . . . . . . . 7 | 3.1. Packet Loss | |||
3.2. Reordering . . . . . . . . . . . . . . . . . . . . . . . 8 | 3.2. Reordering | |||
3.3. Fragmentation . . . . . . . . . . . . . . . . . . . . . . 8 | 3.3. Fragmentation | |||
3.4. Replay Detection . . . . . . . . . . . . . . . . . . . . 8 | 3.4. Replay Detection | |||
4. The DTLS Record Layer . . . . . . . . . . . . . . . . . . . . 8 | 4. The DTLS Record Layer | |||
4.1. Demultiplexing DTLS Records . . . . . . . . . . . . . . . 12 | 4.1. Demultiplexing DTLS Records | |||
4.2. Sequence Number and Epoch . . . . . . . . . . . . . . . . 14 | 4.2. Sequence Number and Epoch | |||
4.2.1. Processing Guidelines . . . . . . . . . . . . . . . . 14 | 4.2.1. Processing Guidelines | |||
4.2.2. Reconstructing the Sequence Number and Epoch . . . . 15 | 4.2.2. Reconstructing the Sequence Number and Epoch | |||
4.2.3. Record Number Encryption . . . . . . . . . . . . . . 15 | 4.2.3. Record Number Encryption | |||
4.3. Transport Layer Mapping . . . . . . . . . . . . . . . . . 16 | 4.3. Transport Layer Mapping | |||
4.4. PMTU Issues . . . . . . . . . . . . . . . . . . . . . . . 17 | 4.4. PMTU Issues | |||
4.5. Record Payload Protection . . . . . . . . . . . . . . . . 19 | 4.5. Record Payload Protection | |||
4.5.1. Anti-Replay . . . . . . . . . . . . . . . . . . . . . 19 | 4.5.1. Anti-Replay | |||
4.5.2. Handling Invalid Records . . . . . . . . . . . . . . 20 | 4.5.2. Handling Invalid Records | |||
4.5.3. AEAD Limits . . . . . . . . . . . . . . . . . . . . . 20 | 4.5.3. AEAD Limits | |||
5. The DTLS Handshake Protocol . . . . . . . . . . . . . . . . . 22 | 5. The DTLS Handshake Protocol | |||
5.1. Denial-of-Service Countermeasures . . . . . . . . . . . . 22 | 5.1. Denial-of-Service Countermeasures | |||
5.2. DTLS Handshake Message Format . . . . . . . . . . . . . . 25 | 5.2. DTLS Handshake Message Format | |||
5.3. ClientHello Message . . . . . . . . . . . . . . . . . . . 27 | 5.3. ClientHello Message | |||
5.4. ServerHello Message . . . . . . . . . . . . . . . . . . . 28 | 5.4. ServerHello Message | |||
5.5. Handshake Message Fragmentation and Reassembly . . . . . 28 | 5.5. Handshake Message Fragmentation and Reassembly | |||
5.6. End Of Early Data . . . . . . . . . . . . . . . . . . . . 29 | 5.6. EndOfEarlyData Message | |||
5.7. DTLS Handshake Flights . . . . . . . . . . . . . . . . . 30 | 5.7. DTLS Handshake Flights | |||
5.8. Timeout and Retransmission . . . . . . . . . . . . . . . 34 | 5.8. Timeout and Retransmission | |||
5.8.1. State Machine . . . . . . . . . . . . . . . . . . . . 34 | 5.8.1. State Machine | |||
5.8.2. Timer Values . . . . . . . . . . . . . . . . . . . . 37 | 5.8.2. Timer Values | |||
5.8.3. Large Flight Sizes . . . . . . . . . . . . . . . . . 38 | 5.8.3. Large Flight Sizes | |||
5.8.4. State machine duplication for post-handshake | 5.8.4. State Machine Duplication for Post-Handshake Messages | |||
messages . . . . . . . . . . . . . . . . . . . . . . 38 | 5.9. Cryptographic Label Prefix | |||
5.9. CertificateVerify and Finished Messages . . . . . . . . . 40 | 5.10. Alert Messages | |||
5.10. Cryptographic Label Prefix . . . . . . . . . . . . . . . 40 | 5.11. Establishing New Associations with Existing Parameters | |||
5.11. Alert Messages . . . . . . . . . . . . . . . . . . . . . 40 | 6. Example of Handshake with Timeout and Retransmission | |||
5.12. Establishing New Associations with Existing Parameters . 40 | 6.1. Epoch Values and Rekeying | |||
6. Example of Handshake with Timeout and Retransmission . . . . 41 | 7. ACK Message | |||
6.1. Epoch Values and Rekeying . . . . . . . . . . . . . . . . 42 | 7.1. Sending ACKs | |||
7. ACK Message . . . . . . . . . . . . . . . . . . . . . . . . . 45 | 7.2. Receiving ACKs | |||
7.1. Sending ACKs . . . . . . . . . . . . . . . . . . . . . . 46 | 7.3. Design Rationale | |||
7.2. Receiving ACKs . . . . . . . . . . . . . . . . . . . . . 47 | 8. Key Updates | |||
7.3. Design Rationale . . . . . . . . . . . . . . . . . . . . 48 | 9. Connection ID Updates | |||
8. Key Updates . . . . . . . . . . . . . . . . . . . . . . . . . 48 | 9.1. Connection ID Example | |||
9. Connection ID Updates . . . . . . . . . . . . . . . . . . . . 50 | 10. Application Data Protocol | |||
9.1. Connection ID Example . . . . . . . . . . . . . . . . . . 51 | 11. Security Considerations | |||
10. Application Data Protocol . . . . . . . . . . . . . . . . . . 53 | 12. Changes since DTLS 1.2 | |||
11. Security Considerations . . . . . . . . . . . . . . . . . . . 53 | 13. Updates Affecting DTLS 1.2 | |||
12. Changes since DTLS 1.2 . . . . . . . . . . . . . . . . . . . 55 | 14. IANA Considerations | |||
13. Updates affecting DTLS 1.2 . . . . . . . . . . . . . . . . . 56 | 15. References | |||
14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 56 | 15.1. Normative References | |||
15. References . . . . . . . . . . . . . . . . . . . . . . . . . 57 | 15.2. Informative References | |||
15.1. Normative References . . . . . . . . . . . . . . . . . . 57 | Appendix A. Protocol Data Structures and Constant Values | |||
15.2. Informative References . . . . . . . . . . . . . . . . . 58 | A.1. Record Layer | |||
Appendix A. Protocol Data Structures and Constant Values . . . . 61 | A.2. Handshake Protocol | |||
A.1. Record Layer . . . . . . . . . . . . . . . . . . . . . . 61 | A.3. ACKs | |||
A.2. Handshake Protocol . . . . . . . . . . . . . . . . . . . 62 | A.4. Connection ID Management | |||
A.3. ACKs . . . . . . . . . . . . . . . . . . . . . . . . . . 64 | Appendix B. Analysis of Limits on CCM Usage | |||
A.4. Connection ID Management . . . . . . . . . . . . . . . . 64 | B.1. Confidentiality Limits | |||
Appendix B. Analysis of Limits on CCM Usage . . . . . . . . . . 64 | B.2. Integrity Limits | |||
B.1. Confidentiality Limits . . . . . . . . . . . . . . . . . 65 | B.3. Limits for AEAD_AES_128_CCM_8 | |||
B.2. Integrity Limits . . . . . . . . . . . . . . . . . . . . 66 | Appendix C. Implementation Pitfalls | |||
B.3. Limits for AEAD_AES_128_CCM_8 . . . . . . . . . . . . . . 66 | Contributors | |||
Appendix C. Implementation Pitfalls . . . . . . . . . . . . . . 67 | Authors' Addresses | |||
Appendix D. History . . . . . . . . . . . . . . . . . . . . . . 67 | ||||
Appendix E. Working Group Information . . . . . . . . . . . . . 70 | ||||
Appendix F. Contributors . . . . . . . . . . . . . . . . . . . . 70 | ||||
Appendix G. Acknowledgements . . . . . . . . . . . . . . . . . . 71 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 71 | ||||
1. Introduction | 1. Introduction | |||
RFC EDITOR: PLEASE REMOVE THE FOLLOWING PARAGRAPH | ||||
The source for this draft is maintained in GitHub. Suggested changes | ||||
should be submitted as pull requests at https://github.com/tlswg/ | ||||
dtls13-spec. Instructions are on that page as well. Editorial | ||||
changes can be managed in GitHub, but any substantive change should | ||||
be discussed on the TLS mailing list. | ||||
The primary goal of the TLS protocol is to establish an | The primary goal of the TLS protocol is to establish an | |||
authenticated, confidentiality and integrity protected channel | authenticated, confidentiality- and integrity-protected channel | |||
between two communicating peers. The TLS protocol is composed of two | between two communicating peers. The TLS protocol is composed of two | |||
layers: the TLS Record Protocol and the TLS Handshake Protocol. | layers: the TLS record protocol and the TLS handshake protocol. | |||
However, TLS must run over a reliable transport channel - typically | However, TLS must run over a reliable transport channel -- typically | |||
TCP [RFC0793]. | TCP [RFC0793]. | |||
There are applications that use UDP [RFC0768] as a transport and to | There are applications that use UDP [RFC0768] as a transport and the | |||
offer communication security protection for those applications the | Datagram Transport Layer Security (DTLS) protocol has been developed | |||
Datagram Transport Layer Security (DTLS) protocol has been developed. | to offer communication security protection for those applications. | |||
DTLS is deliberately designed to be as similar to TLS as possible, | DTLS is deliberately designed to be as similar to TLS as possible, | |||
both to minimize new security invention and to maximize the amount of | both to minimize new security invention and to maximize the amount of | |||
code and infrastructure reuse. | code and infrastructure reuse. | |||
DTLS 1.0 [RFC4347] was originally defined as a delta from TLS 1.1 | DTLS 1.0 [RFC4347] was originally defined as a delta from TLS 1.1 | |||
[RFC4346] and DTLS 1.2 [RFC6347] was defined as a series of deltas to | [RFC4346], and DTLS 1.2 [RFC6347] was defined as a series of deltas | |||
TLS 1.2 [RFC5246]. There is no DTLS 1.1; that version number was | to TLS 1.2 [RFC5246]. There is no DTLS 1.1; that version number was | |||
skipped in order to harmonize version numbers with TLS. This | skipped in order to harmonize version numbers with TLS. This | |||
specification describes the most current version of the DTLS protocol | specification describes the most current version of the DTLS protocol | |||
as a delta from TLS 1.3 [TLS13]. It obsoletes DTLS 1.2. | as a delta from TLS 1.3 [TLS13]. It obsoletes DTLS 1.2. | |||
Implementations that speak both DTLS 1.2 and DTLS 1.3 can | Implementations that speak both DTLS 1.2 and DTLS 1.3 can | |||
interoperate with those that speak only DTLS 1.2 (using DTLS 1.2 of | interoperate with those that speak only DTLS 1.2 (using DTLS 1.2 of | |||
course), just as TLS 1.3 implementations can interoperate with TLS | course), just as TLS 1.3 implementations can interoperate with TLS | |||
1.2 (see Appendix D of [TLS13] for details). While backwards | 1.2 (see Appendix D of [TLS13] for details). While backwards | |||
compatibility with DTLS 1.0 is possible the use of DTLS 1.0 is not | compatibility with DTLS 1.0 is possible, the use of DTLS 1.0 is not | |||
recommended as explained in Section 3.1.2 of RFC 7525 [RFC7525] and | recommended, as explained in Section 3.1.2 of [RFC7525]. [DEPRECATE] | |||
[DEPRECATE]. | forbids the use of DTLS 1.0. | |||
2. Conventions and Terminology | 2. Conventions and Terminology | |||
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 | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
The following terms are used: | The following terms are used: | |||
* client: The endpoint initiating the DTLS connection. | client: The endpoint initiating the DTLS connection. | |||
* association: Shared state between two endpoints established with a | association: Shared state between two endpoints established with a | |||
DTLS handshake. | DTLS handshake. | |||
* connection: Synonym for association. | connection: Synonym for association. | |||
* endpoint: Either the client or server of the connection. | endpoint: Either the client or server of the connection. | |||
* epoch: one set of cryptographic keys used for encryption and | epoch: One set of cryptographic keys used for encryption and | |||
decryption. | decryption. | |||
* handshake: An initial negotiation between client and server that | handshake: An initial negotiation between client and server that | |||
establishes the parameters of the connection. | establishes the parameters of the connection. | |||
* peer: An endpoint. When discussing a particular endpoint, "peer" | peer: An endpoint. When discussing a particular endpoint, "peer" | |||
refers to the endpoint that is remote to the primary subject of | refers to the endpoint that is remote to the primary subject of | |||
discussion. | discussion. | |||
* receiver: An endpoint that is receiving records. | receiver: An endpoint that is receiving records. | |||
* sender: An endpoint that is transmitting records. | sender: An endpoint that is transmitting records. | |||
* server: The endpoint which did not initiate the DTLS connection. | server: The endpoint that did not initiate the DTLS connection. | |||
* CID: Connection ID | CID: Connection ID. | |||
* MSL: Maximum Segment Lifetime | MSL: Maximum Segment Lifetime. | |||
The reader is assumed to be familiar with [TLS13]. As in TLS 1.3, | The reader is assumed to be familiar with [TLS13]. As in TLS 1.3, | |||
the HelloRetryRequest has the same format as a ServerHello message, | the HelloRetryRequest has the same format as a ServerHello message, | |||
but for convenience we use the term HelloRetryRequest throughout this | but for convenience we use the term HelloRetryRequest throughout this | |||
document as if it were a distinct message. | document as if it were a distinct message. | |||
DTLS 1.3 uses network byte order (big-endian) format for encoding | DTLS 1.3 uses network byte order (big-endian) format for encoding | |||
messages based on the encoding format defined in [TLS13] and earlier | messages based on the encoding format defined in [TLS13] and earlier | |||
(D)TLS specifications. | (D)TLS specifications. | |||
The reader is also assumed to be familiar with | The reader is also assumed to be familiar with [RFC9146], as this | |||
[I-D.ietf-tls-dtls-connection-id] as this document applies the CID | document applies the CID functionality to DTLS 1.3. | |||
functionality to DTLS 1.3. | ||||
Figures in this document illustrate various combinations of the DTLS | Figures in this document illustrate various combinations of the DTLS | |||
protocol exchanges and the symbols have the following meaning: | protocol exchanges, and the symbols have the following meaning: | |||
* '+' indicates noteworthy extensions sent in the previously noted | '+' indicates noteworthy extensions sent in the previously noted | |||
message. | message. | |||
* '*' indicates optional or situation-dependent messages/extensions | '*' indicates optional or situation-dependent messages/extensions | |||
that are not always sent. | that are not always sent. | |||
* '{}' indicates messages protected using keys derived from a | '{}' indicates messages protected using keys derived from a | |||
[sender]_handshake_traffic_secret. | [sender]_handshake_traffic_secret. | |||
* '[]' indicates messages protected using keys derived from | '[]' indicates messages protected using keys derived from | |||
traffic_secret_N. | traffic_secret_N. | |||
3. DTLS Design Rationale and Overview | 3. DTLS Design Rationale and Overview | |||
The basic design philosophy of DTLS is to construct "TLS over | The basic design philosophy of DTLS is to construct "TLS over | |||
datagram transport". Datagram transport does not require nor provide | datagram transport". Datagram transport neither requires nor | |||
reliable or in-order delivery of data. The DTLS protocol preserves | provides reliable or in-order delivery of data. The DTLS protocol | |||
this property for application data. Applications, such as media | preserves this property for application data. Applications such as | |||
streaming, Internet telephony, and online gaming use datagram | media streaming, Internet telephony, and online gaming use datagram | |||
transport for communication due to the delay-sensitive nature of | transport for communication due to the delay-sensitive nature of | |||
transported data. The behavior of such applications is unchanged | transported data. The behavior of such applications is unchanged | |||
when the DTLS protocol is used to secure communication, since the | when the DTLS protocol is used to secure communication, since the | |||
DTLS protocol does not compensate for lost or reordered data traffic. | DTLS protocol does not compensate for lost or reordered data traffic. | |||
Note that while low-latency streaming and gaming use DTLS to protect | Note that while low-latency streaming and gaming use DTLS to protect | |||
data (e.g. for protection of a WebRTC data channel), telephony | data (e.g., for protection of a WebRTC data channel), telephony | |||
utilizes DTLS for key establishment, and Secure Real-time Transport | utilizes DTLS for key establishment and the Secure Real-time | |||
Protocol (SRTP) for protection of data [RFC5763]. | Transport Protocol (SRTP) for protection of data [RFC5763]. | |||
TLS cannot be used directly over datagram transports the following | TLS cannot be used directly over datagram transports for the | |||
five reasons: | following four reasons: | |||
1. TLS relies on an implicit sequence number on records. If a | 1. TLS relies on an implicit sequence number on records. If a | |||
record is not received, then the recipient will use the wrong | record is not received, then the recipient will use the wrong | |||
sequence number when attempting to remove record protection from | sequence number when attempting to remove record protection from | |||
subsequent records. DTLS solves this problem by adding sequence | subsequent records. DTLS solves this problem by adding sequence | |||
numbers to records. | numbers to records. | |||
2. The TLS handshake is a lock-step cryptographic protocol. | 2. The TLS handshake is a lock-step cryptographic protocol. | |||
Messages must be transmitted and received in a defined order; any | Messages must be transmitted and received in a defined order; any | |||
other order is an error. The DTLS handshake includes message | other order is an error. The DTLS handshake includes message | |||
sequence numbers to enable fragmented message reassembly and in- | sequence numbers to enable fragmented message reassembly and in- | |||
order delivery in case datagrams are lost or reordered. | order delivery in case datagrams are lost or reordered. | |||
3. During the handshake, messages are implicitly acknowledged by | 3. Handshake messages are potentially larger than can be contained | |||
other handshake messages. Some handshake messages, such as the | ||||
NewSessionTicket message, do not result in any direct response | ||||
that would allow the sender to detect loss. DTLS adds an | ||||
acknowledgment message to enable better loss recovery. | ||||
4. Handshake messages are potentially larger than can be contained | ||||
in a single datagram. DTLS adds fields to handshake messages to | in a single datagram. DTLS adds fields to handshake messages to | |||
support fragmentation and reassembly. | support fragmentation and reassembly. | |||
5. Datagram transport protocols, like UDP, are susceptible to | 4. Datagram transport protocols are susceptible to abusive behavior | |||
abusive behavior effecting denial of service attacks against | effecting denial-of-service (DoS) attacks against | |||
nonparticipants. DTLS adds a return-routability check and DTLS | nonparticipants. DTLS adds a return-routability check and DTLS | |||
1.3 uses the TLS 1.3 HelloRetryRequest message (see Section 5.1 | 1.3 uses the TLS 1.3 HelloRetryRequest message (see Section 5.1 | |||
for details). | for details). | |||
3.1. Packet Loss | 3.1. Packet Loss | |||
DTLS uses a simple retransmission timer to handle packet loss. | DTLS uses a simple retransmission timer to handle packet loss. | |||
Figure 1 demonstrates the basic concept, using the first phase of the | Figure 1 demonstrates the basic concept, using the first phase of the | |||
DTLS handshake: | DTLS handshake: | |||
skipping to change at page 7, line 33 ¶ | skipping to change at line 291 ¶ | |||
ClientHello ------> | ClientHello ------> | |||
X<-- HelloRetryRequest | X<-- HelloRetryRequest | |||
(lost) | (lost) | |||
[Timer Expires] | [Timer Expires] | |||
ClientHello ------> | ClientHello ------> | |||
(retransmit) | (retransmit) | |||
Figure 1: DTLS retransmission example | Figure 1: DTLS Retransmission Example | |||
Once the client has transmitted the ClientHello message, it expects | Once the client has transmitted the ClientHello message, it expects | |||
to see a HelloRetryRequest or a ServerHello from the server. | to see a HelloRetryRequest or a ServerHello from the server. | |||
However, if the timer expires, the client knows that either the | However, if the timer expires, the client knows that either the | |||
ClientHello or the response from the server has been lost, which | ClientHello or the response from the server has been lost, which | |||
causes the the client to retransmit the ClientHello. When the server | causes the client to retransmit the ClientHello. When the server | |||
receives the retransmission, it knows to retransmit its | receives the retransmission, it knows to retransmit its | |||
HelloRetryRequest or ServerHello. | HelloRetryRequest or ServerHello. | |||
The server also maintains a retransmission timer for messages it | The server also maintains a retransmission timer for messages it | |||
sends (other than HelloRetryRequest) and retransmits when that timer | sends (other than HelloRetryRequest) and retransmits when that timer | |||
expires. Not applying retransmissions to the HelloRetryRequest | expires. Not applying retransmissions to the HelloRetryRequest | |||
avoids the need to create state on the server. The HelloRetryRequest | avoids the need to create state on the server. The HelloRetryRequest | |||
is designed to be small enough that it will not itself be fragmented, | is designed to be small enough that it will not itself be fragmented, | |||
thus avoiding concerns about interleaving multiple | thus avoiding concerns about interleaving multiple | |||
HelloRetryRequests. | HelloRetryRequests. | |||
skipping to change at page 8, line 33 ¶ | skipping to change at line 339 ¶ | |||
a recipient in possession of all bytes of a handshake message can | a recipient in possession of all bytes of a handshake message can | |||
reassemble the original unfragmented message. | reassemble the original unfragmented message. | |||
3.4. Replay Detection | 3.4. Replay Detection | |||
DTLS optionally supports record replay detection. The technique used | DTLS optionally supports record replay detection. The technique used | |||
is the same as in IPsec AH/ESP, by maintaining a bitmap window of | is the same as in IPsec AH/ESP, by maintaining a bitmap window of | |||
received records. Records that are too old to fit in the window and | received records. Records that are too old to fit in the window and | |||
records that have previously been received are silently discarded. | records that have previously been received are silently discarded. | |||
The replay detection feature is optional, since packet duplication is | The replay detection feature is optional, since packet duplication is | |||
not always malicious, but can also occur due to routing errors. | not always malicious but can also occur due to routing errors. | |||
Applications may conceivably detect duplicate packets and accordingly | Applications may conceivably detect duplicate packets and accordingly | |||
modify their data transmission strategy. | modify their data transmission strategy. | |||
4. The DTLS Record Layer | 4. The DTLS Record Layer | |||
The DTLS 1.3 record layer is different from the TLS 1.3 record layer | The DTLS 1.3 record layer is different from the TLS 1.3 record layer | |||
and also different from the DTLS 1.2 record layer. | and also different from the DTLS 1.2 record layer. | |||
1. The DTLSCiphertext structure omits the superfluous version number | 1. The DTLSCiphertext structure omits the superfluous version number | |||
and type fields. | and type fields. | |||
2. DTLS adds an epoch and sequence number to the TLS record header. | 2. DTLS adds an epoch and sequence number to the TLS record header. | |||
This sequence number allows the recipient to correctly verify the | This sequence number allows the recipient to correctly decrypt | |||
DTLS MAC. However, the number of bits used for the epoch and | and verify DTLS records. However, the number of bits used for | |||
sequence number fields in the DTLSCiphertext structure have been | the epoch and sequence number fields in the DTLSCiphertext | |||
reduced from those in previous versions. | structure has been reduced from those in previous versions. | |||
3. The DTLSCiphertext structure has a variable length header. | 3. The DTLS epoch serialized in DTLSPlaintext is 2 octets long for | |||
compatibility with DTLS 1.2. However, this value is set as the | ||||
least significant 2 octets of the connection epoch, which is an 8 | ||||
octet counter incremented on every KeyUpdate. See Section 4.2 | ||||
for details. The sequence number is set to be the low order 48 | ||||
bits of the 64 bit sequence number. Plaintext records MUST NOT | ||||
be sent with sequence numbers that would exceed 2^48-1, so the | ||||
upper 16 bits will always be 0. | ||||
4. The DTLSCiphertext structure has a variable-length header. | ||||
DTLSPlaintext records are used to send unprotected records and | DTLSPlaintext records are used to send unprotected records and | |||
DTLSCiphertext records are used to send protected records. | DTLSCiphertext records are used to send protected records. | |||
The DTLS record formats are shown below. Unless explicitly stated | The DTLS record formats are shown below. Unless explicitly stated | |||
the meaning of the fields is unchanged from previous TLS / DTLS | the meaning of the fields is unchanged from previous TLS/DTLS | |||
versions. | versions. | |||
struct { | struct { | |||
ContentType type; | ContentType type; | |||
ProtocolVersion legacy_record_version; | ProtocolVersion legacy_record_version; | |||
uint16 epoch = 0 | uint16 epoch = 0 | |||
uint48 sequence_number; | uint48 sequence_number; | |||
uint16 length; | uint16 length; | |||
opaque fragment[DTLSPlaintext.length]; | opaque fragment[DTLSPlaintext.length]; | |||
} DTLSPlaintext; | } DTLSPlaintext; | |||
skipping to change at page 9, line 34 ¶ | skipping to change at line 397 ¶ | |||
uint8 zeros[length_of_padding]; | uint8 zeros[length_of_padding]; | |||
} DTLSInnerPlaintext; | } DTLSInnerPlaintext; | |||
struct { | struct { | |||
opaque unified_hdr[variable]; | opaque unified_hdr[variable]; | |||
opaque encrypted_record[length]; | opaque encrypted_record[length]; | |||
} DTLSCiphertext; | } DTLSCiphertext; | |||
Figure 2: DTLS 1.3 Record Formats | Figure 2: DTLS 1.3 Record Formats | |||
legacy_record_version This value MUST be set to {254, 253} for all | legacy_record_version: This value MUST be set to {254, 253} for all | |||
records other than the initial ClientHello (i.e., one not | records other than the initial ClientHello (i.e., one not | |||
generated after a HelloRetryRequest), where it may also be {254, | generated after a HelloRetryRequest), where it may also be {254, | |||
255} for compatibility purposes. It MUST be ignored for all | 255} for compatibility purposes. It MUST be ignored for all | |||
purposes. See [TLS13]; Appendix D.1 for the rationale for this. | purposes. See [TLS13], Appendix D.1 for the rationale for this. | |||
epoch: The least significant 2 bytes of the connection epoch value. | ||||
unified_hdr: The unified header (unified_hdr) is a structure of | unified_hdr: The unified header (unified_hdr) is a structure of | |||
variable length, as shown in Figure 3. | variable length, shown in Figure 3. | |||
encrypted_record: The AEAD-encrypted form of the serialized | encrypted_record: The encrypted form of the serialized | |||
DTLSInnerPlaintext structure. | DTLSInnerPlaintext structure. | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
|0|0|1|C|S|L|E E| | |0|0|1|C|S|L|E E| | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| Connection ID | Legend: | | Connection ID | Legend: | |||
| (if any, | | | (if any, | | |||
/ length as / C - Connection ID (CID) present | / length as / C - Connection ID (CID) present | |||
| negotiated) | S - Sequence number length | | negotiated) | S - Sequence number length | |||
skipping to change at page 10, line 29 ¶ | skipping to change at line 435 ¶ | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
Figure 3: DTLS 1.3 Unified Header | Figure 3: DTLS 1.3 Unified Header | |||
Fixed Bits: The three high bits of the first byte of the unified | Fixed Bits: The three high bits of the first byte of the unified | |||
header are set to 001. This ensures that the value will fit | header are set to 001. This ensures that the value will fit | |||
within the DTLS region when multiplexing is performed as described | within the DTLS region when multiplexing is performed as described | |||
in [RFC7983]. It also ensures that distinguishing encrypted DTLS | in [RFC7983]. It also ensures that distinguishing encrypted DTLS | |||
1.3 records from encrypted DTLS 1.2 records is possible when they | 1.3 records from encrypted DTLS 1.2 records is possible when they | |||
are carried on the same host/port quartet; such multiplexing is | are carried on the same host/port quartet; such multiplexing is | |||
only possible when CIDs [I-D.ietf-tls-dtls-connection-id] are in | only possible when CIDs [RFC9146] are in use, in which case DTLS | |||
use, in which case DTLS 1.2 records will have the content type | 1.2 records will have the content type tls12_cid (25). | |||
tls12_cid (25). | ||||
C: The C bit (0x10) is set if the Connection ID is present. | C: The C bit (0x10) is set if the Connection ID is present. | |||
S: The S bit (0x08) indicates the size of the sequence number. 0 | S: The S bit (0x08) indicates the size of the sequence number. 0 | |||
means an 8-bit sequence number, 1 means 16-bit. Implementations | means an 8-bit sequence number, 1 means 16-bit. Implementations | |||
MAY mix sequence numbers of different lengths on the same | MAY mix sequence numbers of different lengths on the same | |||
connection. | connection. | |||
L: The L bit (0x04) is set if the length is present. | L: The L bit (0x04) is set if the length is present. | |||
E: The two low bits (0x03) include the low order two bits of the | E: The two low bits (0x03) include the low-order two bits of the | |||
epoch. | epoch. | |||
Connection ID: Variable length CID. The CID functionality is | Connection ID: Variable-length CID. The CID functionality is | |||
described in [I-D.ietf-tls-dtls-connection-id]. An example can be | described in [RFC9146]. An example can be found in Section 9.1. | |||
found in Section 9.1. | ||||
Sequence Number: The low order 8 or 16 bits of the record sequence | Sequence Number: The low-order 8 or 16 bits of the record sequence | |||
number. This value is 16 bits if the S bit is set to 1, and 8 | number. This value is 16 bits if the S bit is set to 1, and 8 | |||
bits if the S bit is 0. | bits if the S bit is 0. | |||
Length: Identical to the length field in a TLS 1.3 record. | Length: Identical to the length field in a TLS 1.3 record. | |||
As with previous versions of DTLS, multiple DTLSPlaintext and | As with previous versions of DTLS, multiple DTLSPlaintext and | |||
DTLSCiphertext records can be included in the same underlying | DTLSCiphertext records can be included in the same underlying | |||
transport datagram. | transport datagram. | |||
Figure 4 illustrates different record headers. | Figure 4 illustrates different record headers. | |||
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 | |||
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ | |||
| Content Type | |0|0|1|1|1|1|E E| |0|0|1|0|0|0|E E| | | Content Type | |0|0|1|1|1|1|E E| |0|0|1|0|0|0|E E| | |||
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ | |||
| 16 bit | | | |8-bit Seq. No. | | | 16 bit | | | |8 bit Seq. No. | | |||
| Version | / Connection ID / +-+-+-+-+-+-+-+-+ | | Version | / Connection ID / +-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+ | | | | | +-+-+-+-+-+-+-+-+ | | | | | |||
| 16 bit | +-+-+-+-+-+-+-+-+ | Encrypted | | | 16 bit | +-+-+-+-+-+-+-+-+ | Encrypted | | |||
| Epoch | | 16 bit | / Record / | | Epoch | | 16 bit | / Record / | |||
+-+-+-+-+-+-+-+-+ |Sequence Number| | | | +-+-+-+-+-+-+-+-+ |Sequence Number| | | | |||
| | +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ | | | +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ | |||
| | | 16 bit | | | | | 16 bit | | |||
| 48 bit | | Length | DTLSCiphertext | | 48 bit | | Length | DTLSCiphertext | |||
|Sequence Number| +-+-+-+-+-+-+-+-+ Structure | |Sequence Number| +-+-+-+-+-+-+-+-+ Structure | |||
| | | | (minimal) | | | | | (minimal) | |||
skipping to change at page 11, line 46 ¶ | skipping to change at line 498 ¶ | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
DTLSPlaintext | DTLSPlaintext | |||
Structure | Structure | |||
Figure 4: DTLS 1.3 Header Examples | Figure 4: DTLS 1.3 Header Examples | |||
The length field MAY be omitted by clearing the L bit, which means | The length field MAY be omitted by clearing the L bit, which means | |||
that the record consumes the entire rest of the datagram in the lower | that the record consumes the entire rest of the datagram in the lower | |||
level transport. In this case it is not possible to have multiple | level transport. In this case, it is not possible to have multiple | |||
DTLSCiphertext format records without length fields in the same | DTLSCiphertext format records without length fields in the same | |||
datagram. Omitting the length field MUST only be used for the last | datagram. Omitting the length field MUST only be used for the last | |||
record in a datagram. Implementations MAY mix records with and | record in a datagram. Implementations MAY mix records with and | |||
without length fields on the same connection. | without length fields on the same connection. | |||
If a Connection ID is negotiated, then it MUST be contained in all | If a Connection ID is negotiated, then it MUST be contained in all | |||
datagrams. Sending implementations MUST NOT mix records from | datagrams. Sending implementations MUST NOT mix records from | |||
multiple DTLS associations in the same datagram. If the second or | multiple DTLS associations in the same datagram. If the second or | |||
later record has a connection ID which does not correspond to the | later record has a connection ID which does not correspond to the | |||
same association used for previous records, the rest of the datagram | same association used for previous records, the rest of the datagram | |||
MUST be discarded. | MUST be discarded. | |||
When expanded, the epoch and sequence number can be combined into an | When expanded, the epoch and sequence number can be combined into an | |||
unpacked RecordNumber structure, as shown below: | unpacked RecordNumber structure, as shown below: | |||
struct { | struct { | |||
uint16 epoch; | uint64 epoch; | |||
uint48 sequence_number; | uint64 sequence_number; | |||
} RecordNumber; | } RecordNumber; | |||
This 64-bit value is used in the ACK message as well as in the | This 128-bit value is used in the ACK message as well as in the | |||
"record_sequence_number" input to the AEAD function. | "record_sequence_number" input to the Authenticated Encryption with | |||
Associated Data (AEAD) function. The entire header value shown in | ||||
The entire header value shown in Figure 4 (but prior to record number | Figure 4 (but prior to record number encryption; see Section 4.2.3) | |||
encryption, see Section 4.2.3) is used as as the additional data | is used as the additional data value for the AEAD function. For | |||
value for the AEAD function. For instance, if the minimal variant is | instance, if the minimal variant is used, the Associated Data (AD) is | |||
used, the AAD is 2 octets long. Note that this design is different | 2 octets long. Note that this design is different from the | |||
from the additional data calculation for DTLS 1.2 and for DTLS 1.2 | additional data calculation for DTLS 1.2 and for DTLS 1.2 with | |||
with Connection ID. | Connection IDs. In DTLS 1.3 the 64-bit sequence_number is used as | |||
the sequence number for the AEAD computation; unlike DTLS 1.2, the | ||||
epoch is not included. | ||||
4.1. Demultiplexing DTLS Records | 4.1. Demultiplexing DTLS Records | |||
DTLS 1.3 uses a variable length record format and hence the | DTLS 1.3's header format is more complicated to demux than DTLS 1.2, | |||
demultiplexing process is more complex since more header formats need | which always carried the content type as the first byte. As | |||
to be distinguished. Implementations can demultiplex DTLS 1.3 | described in Figure 5, the first byte determines how an incoming DTLS | |||
records by examining the first byte as follows: | record is demultiplexed. The first 3 bits of the first byte | |||
distinguish a DTLS 1.3 encrypted record from record types used in | ||||
previous DTLS versions and plaintext DTLS 1.3 record types. Hence, | ||||
the range 32 (0b0010 0000) to 63 (0b0011 1111) needs to be excluded | ||||
from future allocations by IANA to avoid problems while | ||||
demultiplexing; see Section 14. Implementations can demultiplex DTLS | ||||
1.3 records by examining the first byte as follows: | ||||
* If the first byte is alert(21), handshake(22), or ack(proposed, | * If the first byte is alert(21), handshake(22), or ack(proposed, | |||
26), the record MUST be interpreted as a DTLSPlaintext record. | 26), the record MUST be interpreted as a DTLSPlaintext record. | |||
* If the first byte is any other value, then receivers MUST check to | * If the first byte is any other value, then receivers MUST check to | |||
see if the leading bits of the first byte are 001. If so, the | see if the leading bits of the first byte are 001. If so, the | |||
implementation MUST process the record as DTLSCiphertext; the true | implementation MUST process the record as DTLSCiphertext; the true | |||
content type will be inside the protected portion. | content type will be inside the protected portion. | |||
* Otherwise, the record MUST be rejected as if it had failed | * Otherwise, the record MUST be rejected as if it had failed | |||
deprotection, as described in Section 4.5.2. | deprotection, as described in Section 4.5.2. | |||
Figure 5 shows this demultiplexing procedure graphically taking DTLS | Figure 5 shows this demultiplexing procedure graphically, taking DTLS | |||
1.3 and earlier versions of DTLS into account. | 1.3 and earlier versions of DTLS into account. | |||
+----------------+ | +----------------+ | |||
| Outer Content | | | Outer Content | | |||
| Type (OCT) | | | Type (OCT) | | |||
| | | | | | |||
| OCT == 20 -+--> ChangeCipherSpec (DTLS <1.3) | | OCT == 20 -+--> ChangeCipherSpec (DTLS <1.3) | |||
| OCT == 21 -+--> Alert (Plaintext) | | OCT == 21 -+--> Alert (Plaintext) | |||
| OCT == 22 -+--> Handshake (Plaintext) | | OCT == 22 -+--> DTLSHandshake (Plaintext) | |||
| OCT == 23 -+--> Application Data (DTLS <1.3) | | OCT == 23 -+--> Application Data (DTLS <1.3) | |||
| OCT == 24 -+--> Heartbeat (DTLS <1.3) | | OCT == 24 -+--> Heartbeat (DTLS <1.3) | |||
packet --> | OCT == 25 -+--> DTLSCipherText with CID (DTLS 1.2) | packet --> | OCT == 25 -+--> DTLSCiphertext with CID (DTLS 1.2) | |||
| OCT == 26 -+--> ACK (DTLS 1.3, Plaintext) | | OCT == 26 -+--> ACK (DTLS 1.3, Plaintext) | |||
| | | | | | |||
| | /+----------------+\ | | | /+----------------+\ | |||
| 31 < OCT < 64 -+--> |DTLS Ciphertext | | | 31 < OCT < 64 -+--> |DTLSCiphertext | | |||
| | |(header bits | | | | |(header bits | | |||
| else | | start with 001)| | | else | | start with 001)| | |||
| | | /+-------+--------+\ | | | | /+-------+--------+\ | |||
+-------+--------+ | | +-------+--------+ | | |||
| | | | | | |||
v Decryption | | v Decryption | | |||
+---------+ +------+ | +---------+ +------+ | |||
| Reject | | | | Reject | | | |||
+---------+ v | +---------+ v | |||
+----------------+ | +----------------+ | |||
| Decrypted | | | Decrypted | | |||
| Content Type | | | Content Type | | |||
| (DCT) | | | (DCT) | | |||
| | | | | | |||
| DCT == 21 -+--> Alert | | DCT == 21 -+--> Alert | |||
| DCT == 22 -+--> Handshake | | DCT == 22 -+--> DTLSHandshake | |||
| DCT == 23 -+--> Application Data | | DCT == 23 -+--> Application Data | |||
| DCT == 24 -+--> Heartbeat | | DCT == 24 -+--> Heartbeat | |||
| DCT == 26 -+--> ACK | | DCT == 26 -+--> ACK | |||
| | | | else ------+--> Error | |||
+----------------+ | +----------------+ | |||
Figure 5: Demultiplexing DTLS 1.2 and DTLS 1.3 Records | Figure 5: Demultiplexing DTLS 1.2 and DTLS 1.3 Records | |||
Note: The optimized DTLS header format shown in Figure 3, which does | ||||
not carry the Content Type in the Unified Header format, requires a | ||||
different demultilexing strategy compared to what was used in | ||||
previous DTLS versions where the Content Type was conveyed in every | ||||
record. As described in Figure 5, the first byte determines how an | ||||
incoming DTLS record is demultiplexed. The first 3 bits of the first | ||||
byte distinguish a DTLS 1.3 encrypted record from record types used | ||||
in previous DTLS versions and plaintext DTLS 1.3 record types. | ||||
Hence, the range 32 (0b0010 0000) to 63 (0b0011 1111) needs to be | ||||
excluded from future allocations by IANA to avoid problems while | ||||
demultiplexing; see Section 14. | ||||
4.2. Sequence Number and Epoch | 4.2. Sequence Number and Epoch | |||
DTLS uses an explicit or partly explicit sequence number, rather than | DTLS uses an explicit or partly explicit sequence number, rather than | |||
an implicit one, carried in the sequence_number field of the record. | an implicit one, carried in the sequence_number field of the record. | |||
Sequence numbers are maintained separately for each epoch, with each | Sequence numbers are maintained separately for each epoch, with each | |||
sequence_number initially being 0 for each epoch. | sequence_number initially being 0 for each epoch. | |||
The epoch number is initially zero and is incremented each time | The epoch number is initially zero and is incremented each time | |||
keying material changes and a sender aims to rekey. More details are | keying material changes and a sender aims to rekey. More details are | |||
provided in Section 6.1. | provided in Section 6.1. | |||
4.2.1. Processing Guidelines | 4.2.1. Processing Guidelines | |||
Because DTLS records could be reordered, a record from epoch M may be | Because DTLS records could be reordered, a record from epoch M may be | |||
received after epoch N (where N > M) has begun. Implementations | received after epoch N (where N > M) has begun. Implementations | |||
SHOULD discard records from earlier epochs, but MAY choose to retain | SHOULD discard records from earlier epochs but MAY choose to retain | |||
keying material from previous epochs for up to the default MSL | keying material from previous epochs for up to the default MSL | |||
specified for TCP [RFC0793] to allow for packet reordering. (Note | specified for TCP [RFC0793] to allow for packet reordering. (Note | |||
that the intention here is that implementers use the current guidance | that the intention here is that implementers use the current guidance | |||
from the IETF for MSL, as specified in [RFC0793] or successors, not | from the IETF for MSL, as specified in [RFC0793] or successors, not | |||
that they attempt to interrogate the MSL that the system TCP stack is | that they attempt to interrogate the MSL that the system TCP stack is | |||
using.) | using.) | |||
Conversely, it is possible for records that are protected with the | Conversely, it is possible for records that are protected with the | |||
new epoch to be received prior to the completion of a handshake. For | new epoch to be received prior to the completion of a handshake. For | |||
instance, the server may send its Finished message and then start | instance, the server may send its Finished message and then start | |||
transmitting data. Implementations MAY either buffer or discard such | transmitting data. Implementations MAY either buffer or discard such | |||
records, though when DTLS is used over reliable transports (e.g., | records, though when DTLS is used over reliable transports (e.g., | |||
SCTP [RFC4960]), they SHOULD be buffered and processed once the | SCTP [RFC4960]), they SHOULD be buffered and processed once the | |||
handshake completes. Note that TLS's restrictions on when records | handshake completes. Note that TLS's restrictions on when records | |||
may be sent still apply, and the receiver treats the records as if | may be sent still apply, and the receiver treats the records as if | |||
they were sent in the right order. | they were sent in the right order. | |||
Implementations MUST send retransmissions of lost messages using the | Implementations MUST send retransmissions of lost messages using the | |||
same epoch and keying material as the original transmission. | same epoch and keying material as the original transmission. | |||
Implementations MUST either abandon an association or re-key prior to | Implementations MUST either abandon an association or rekey prior to | |||
allowing the sequence number to wrap. | allowing the sequence number to wrap. | |||
Implementations MUST NOT allow the epoch to wrap, but instead MUST | Implementations MUST NOT allow the epoch to wrap, but instead MUST | |||
establish a new association, terminating the old association. | establish a new association, terminating the old association. | |||
4.2.2. Reconstructing the Sequence Number and Epoch | 4.2.2. Reconstructing the Sequence Number and Epoch | |||
When receiving protected DTLS records, the recipient does not have a | When receiving protected DTLS records, the recipient does not have a | |||
full epoch or sequence number value in the record and so there is | full epoch or sequence number value in the record and so there is | |||
some opportunity for ambiguity. Because the full epoch and sequence | some opportunity for ambiguity. Because the full sequence number is | |||
number are used to compute the per-record nonce, failure to | used to compute the per-record nonce and the epoch determines the | |||
reconstruct these values leads to failure to deprotect the record, | keys, failure to reconstruct these values leads to failure to | |||
and so implementations MAY use a mechanism of their choice to | deprotect the record, and so implementations MAY use a mechanism of | |||
determine the full values. This section provides an algorithm which | their choice to determine the full values. This section provides an | |||
is comparatively simple and which implementations are RECOMMENDED to | algorithm which is comparatively simple and which implementations are | |||
follow. | RECOMMENDED to follow. | |||
If the epoch bits match those of the current epoch, then | If the epoch bits match those of the current epoch, then | |||
implementations SHOULD reconstruct the sequence number by computing | implementations SHOULD reconstruct the sequence number by computing | |||
the full sequence number which is numerically closest to one plus the | the full sequence number which is numerically closest to one plus the | |||
sequence number of the highest successfully deprotected record in the | sequence number of the highest successfully deprotected record in the | |||
current epoch. | current epoch. | |||
During the handshake phase, the epoch bits unambiguously indicate the | During the handshake phase, the epoch bits unambiguously indicate the | |||
correct key to use. After the handshake is complete, if the epoch | correct key to use. After the handshake is complete, if the epoch | |||
bits do not match those from the current epoch implementations SHOULD | bits do not match those from the current epoch, implementations | |||
use the most recent past epoch which has matching bits, and then | SHOULD use the most recent past epoch which has matching bits, and | |||
reconstruct the sequence number for that epoch as described above. | then reconstruct the sequence number for that epoch as described | |||
above. | ||||
4.2.3. Record Number Encryption | 4.2.3. Record Number Encryption | |||
In DTLS 1.3, when records are encrypted, record sequence numbers are | In DTLS 1.3, when records are encrypted, record sequence numbers are | |||
also encrypted. The basic pattern is that the underlying encryption | also encrypted. The basic pattern is that the underlying encryption | |||
algorithm used with the AEAD algorithm is used to generate a mask | algorithm used with the AEAD algorithm is used to generate a mask | |||
which is then XORed with the sequence number. | which is then XORed with the sequence number. | |||
When the AEAD is based on AES, then the Mask is generated by | When the AEAD is based on AES, then the mask is generated by | |||
computing AES-ECB on the first 16 bytes of the ciphertext: | computing AES-ECB on the first 16 bytes of the ciphertext: | |||
Mask = AES-ECB(sn_key, Ciphertext[0..15]) | Mask = AES-ECB(sn_key, Ciphertext[0..15]) | |||
When the AEAD is based on ChaCha20, then the mask is generated by | When the AEAD is based on ChaCha20, then the mask is generated by | |||
treating the first 4 bytes of the ciphertext as the block counter and | treating the first 4 bytes of the ciphertext as the block counter and | |||
the next 12 bytes as the nonce, passing them to the ChaCha20 block | the next 12 bytes as the nonce, passing them to the ChaCha20 block | |||
function (Section 2.3 of [CHACHA]): | function (Section 2.3 of [CHACHA]): | |||
Mask = ChaCha20(sn_key, Ciphertext[0..3], Ciphertext[4..15]) | Mask = ChaCha20(sn_key, Ciphertext[0..3], Ciphertext[4..15]) | |||
The sn_key is computed as follows: | The sn_key is computed as follows: | |||
[sender]_sn_key = HKDF-Expand-Label(Secret, "sn" , "", key_length) | [sender]_sn_key = HKDF-Expand-Label(Secret, "sn", "", key_length) | |||
[sender] denotes the sending side. The Secret value to be used is | [sender] denotes the sending side. The per-epoch Secret value to be | |||
described in Section 7.3 of [TLS13]. Note that a new key is used for | used is described in Section 7.3 of [TLS13]. Note that a new key is | |||
each epoch: because the epoch is sent in the clear, this does not | used for each epoch: because the epoch is sent in the clear, this | |||
result in ambiguity. | does not result in ambiguity. | |||
The encrypted sequence number is computed by XORing the leading bytes | The encrypted sequence number is computed by XORing the leading bytes | |||
of the Mask with the on-the-wire representation of the sequence | of the mask with the on-the-wire representation of the sequence | |||
number. Decryption is accomplished by the same process. | number. Decryption is accomplished by the same process. | |||
This procedure requires the ciphertext length be at least 16 bytes. | This procedure requires the ciphertext length to be at least 16 | |||
Receivers MUST reject shorter records as if they had failed | bytes. Receivers MUST reject shorter records as if they had failed | |||
deprotection, as described in Section 4.5.2. Senders MUST pad short | deprotection, as described in Section 4.5.2. Senders MUST pad short | |||
plaintexts out (using the conventional record padding mechanism) in | plaintexts out (using the conventional record padding mechanism) in | |||
order to make a suitable-length ciphertext. Note most of the DTLS | order to make a suitable-length ciphertext. Note that most of the | |||
AEAD algorithms have a 16-byte authentication tag and need no | DTLS AEAD algorithms have a 16 byte authentication tag and need no | |||
padding. However, some algorithms such as TLS_AES_128_CCM_8_SHA256 | padding. However, some algorithms, such as TLS_AES_128_CCM_8_SHA256, | |||
have a shorter authentication tag and may require padding for short | have a shorter authentication tag and may require padding for short | |||
inputs. | inputs. | |||
Future cipher suites, which are not based on AES or ChaCha20, MUST | Future cipher suites, which are not based on AES or ChaCha20, MUST | |||
define their own record sequence number encryption in order to be | define their own record sequence number encryption in order to be | |||
used with DTLS. | used with DTLS. | |||
Note that sequence number encryption is only applied to the | Note that sequence number encryption is only applied to the | |||
DTLSCiphertext structure and not to the DTLSPlaintext structure, | DTLSCiphertext structure and not to the DTLSPlaintext structure, even | |||
which also contains a sequence number. | though it also contains a sequence number. | |||
4.3. Transport Layer Mapping | 4.3. Transport Layer Mapping | |||
DTLS messages MAY be fragmented into multiple DTLS records. Each | DTLS messages MAY be fragmented into multiple DTLS records. Each | |||
DTLS record MUST fit within a single datagram. In order to avoid IP | DTLS record MUST fit within a single datagram. In order to avoid IP | |||
fragmentation, clients of the DTLS record layer SHOULD attempt to | fragmentation, clients of the DTLS record layer SHOULD attempt to | |||
size records so that they fit within any Path MTU (PMTU) estimates | size records so that they fit within any Path MTU (PMTU) estimates | |||
obtained from the record layer. For more information about PMTU | obtained from the record layer. For more information about PMTU | |||
issues see Section 4.4. | issues, see Section 4.4. | |||
Multiple DTLS records MAY be placed in a single datagram. Records | Multiple DTLS records MAY be placed in a single datagram. Records | |||
are encoded consecutively. The length field from DTLS records | are encoded consecutively. The length field from DTLS records | |||
containing that field can be used to determine the boundaries between | containing that field can be used to determine the boundaries between | |||
records. The final record in a datagram can omit the length field. | records. The final record in a datagram can omit the length field. | |||
The first byte of the datagram payload MUST be the beginning of a | The first byte of the datagram payload MUST be the beginning of a | |||
record. Records MUST NOT span datagrams. | record. Records MUST NOT span datagrams. | |||
DTLS records without CIDs do not contain any association identifiers | DTLS records without CIDs do not contain any association identifiers, | |||
and applications must arrange to multiplex between associations. | and applications must arrange to multiplex between associations. | |||
With UDP, the host/port number is used to look up the appropriate | With UDP, the host/port number is used to look up the appropriate | |||
security association for incoming records without CIDs. | security association for incoming records without CIDs. | |||
Some transports, such as DCCP [RFC4340], provide their own sequence | Some transports, such as DCCP [RFC4340], provide their own sequence | |||
numbers. When carried over those transports, both the DTLS and the | numbers. When carried over those transports, both the DTLS and the | |||
transport sequence numbers will be present. Although this introduces | transport sequence numbers will be present. Although this introduces | |||
a small amount of inefficiency, the transport layer and DTLS sequence | a small amount of inefficiency, the transport layer and DTLS sequence | |||
numbers serve different purposes; therefore, for conceptual | numbers serve different purposes; therefore, for conceptual | |||
simplicity, it is superior to use both sequence numbers. | simplicity, it is superior to use both sequence numbers. | |||
skipping to change at page 17, line 29 ¶ | skipping to change at line 753 ¶ | |||
handshake retransmissions may be held rather than transmitted | handshake retransmissions may be held rather than transmitted | |||
immediately, potentially leading to timeouts and spurious | immediately, potentially leading to timeouts and spurious | |||
retransmission. When DTLS is used over such transports, care should | retransmission. When DTLS is used over such transports, care should | |||
be taken not to overrun the likely congestion window. [RFC5238] | be taken not to overrun the likely congestion window. [RFC5238] | |||
defines a mapping of DTLS to DCCP that takes these issues into | defines a mapping of DTLS to DCCP that takes these issues into | |||
account. | account. | |||
4.4. PMTU Issues | 4.4. PMTU Issues | |||
In general, DTLS's philosophy is to leave PMTU discovery to the | In general, DTLS's philosophy is to leave PMTU discovery to the | |||
application. However, DTLS cannot completely ignore PMTU for three | application. However, DTLS cannot completely ignore the PMTU for | |||
reasons: | three reasons: | |||
* The DTLS record framing expands the datagram size, thus lowering | * The DTLS record framing expands the datagram size, thus lowering | |||
the effective PMTU from the application's perspective. | the effective PMTU from the application's perspective. | |||
* In some implementations, the application may not directly talk to | * In some implementations, the application may not directly talk to | |||
the network, in which case the DTLS stack may absorb ICMP | the network, in which case the DTLS stack may absorb ICMP | |||
[RFC1191] "Datagram Too Big" indications or ICMPv6 [RFC4443] | "Datagram Too Big" indications [RFC1191] or ICMPv6 "Packet Too | |||
"Packet Too Big" indications. | Big" indications [RFC4443]. | |||
* The DTLS handshake messages can exceed the PMTU. | * The DTLS handshake messages can exceed the PMTU. | |||
In order to deal with the first two issues, the DTLS record layer | In order to deal with the first two issues, the DTLS record layer | |||
SHOULD behave as described below. | SHOULD behave as described below. | |||
If PMTU estimates are available from the underlying transport | If PMTU estimates are available from the underlying transport | |||
protocol, they should be made available to upper layer protocols. In | protocol, they should be made available to upper layer protocols. In | |||
particular: | particular: | |||
skipping to change at page 18, line 15 ¶ | skipping to change at line 786 ¶ | |||
* For DTLS over DCCP, the upper layer protocol SHOULD be allowed to | * For DTLS over DCCP, the upper layer protocol SHOULD be allowed to | |||
obtain the current estimate of the PMTU. | obtain the current estimate of the PMTU. | |||
* For DTLS over TCP or SCTP, which automatically fragment and | * For DTLS over TCP or SCTP, which automatically fragment and | |||
reassemble datagrams, there is no PMTU limitation. However, the | reassemble datagrams, there is no PMTU limitation. However, the | |||
upper layer protocol MUST NOT write any record that exceeds the | upper layer protocol MUST NOT write any record that exceeds the | |||
maximum record size of 2^14 bytes. | maximum record size of 2^14 bytes. | |||
The DTLS record layer SHOULD also allow the upper layer protocol to | The DTLS record layer SHOULD also allow the upper layer protocol to | |||
discover the amount of record expansion expected by the DTLS | discover the amount of record expansion expected by the DTLS | |||
processing; alternately it MAY report PMTU estimates minus the | processing; alternately, it MAY report PMTU estimates minus the | |||
estimated expansion from the transport layer and DTLS record framing. | estimated expansion from the transport layer and DTLS record framing. | |||
Note that DTLS does not defend against spoofed ICMP messages; | Note that DTLS does not defend against spoofed ICMP messages; | |||
implementations SHOULD ignore any such messages that indicate PMTUs | implementations SHOULD ignore any such messages that indicate PMTUs | |||
below the IPv4 and IPv6 minimums of 576 and 1280 bytes respectively. | below the IPv4 and IPv6 minimums of 576 and 1280 bytes, respectively. | |||
If there is a transport protocol indication that the PMTU was | If there is a transport protocol indication that the PMTU was | |||
exceeded (either via ICMP or via a refusal to send the datagram as in | exceeded (either via ICMP or via a refusal to send the datagram as in | |||
Section 14 of [RFC4340]), then the DTLS record layer MUST inform the | Section 14 of [RFC4340]), then the DTLS record layer MUST inform the | |||
upper layer protocol of the error. | upper layer protocol of the error. | |||
The DTLS record layer SHOULD NOT interfere with upper layer protocols | The DTLS record layer SHOULD NOT interfere with upper layer protocols | |||
performing PMTU discovery, whether via [RFC1191] and [RFC4821] for | performing PMTU discovery, whether via [RFC1191] and [RFC4821] for | |||
IPv4 or via [RFC8201] for IPv6. In particular: | IPv4 or via [RFC8201] for IPv6. In particular: | |||
* Where allowed by the underlying transport protocol, the upper | * Where allowed by the underlying transport protocol, the upper | |||
layer protocol SHOULD be allowed to set the state of the DF bit | layer protocol SHOULD be allowed to set the state of the Don't | |||
(in IPv4) or prohibit local fragmentation (in IPv6). | Fragment (DF) bit (in IPv4) or prohibit local fragmentation (in | |||
IPv6). | ||||
* If the underlying transport protocol allows the application to | * If the underlying transport protocol allows the application to | |||
request PMTU probing (e.g., DCCP), the DTLS record layer SHOULD | request PMTU probing (e.g., DCCP), the DTLS record layer SHOULD | |||
honor this request. | honor this request. | |||
The final issue is the DTLS handshake protocol. From the perspective | The final issue is the DTLS handshake protocol. From the perspective | |||
of the DTLS record layer, this is merely another upper layer | of the DTLS record layer, this is merely another upper layer | |||
protocol. However, DTLS handshakes occur infrequently and involve | protocol. However, DTLS handshakes occur infrequently and involve | |||
only a few round trips; therefore, the handshake protocol PMTU | only a few round trips; therefore, the handshake protocol PMTU | |||
handling places a premium on rapid completion over accurate PMTU | handling places a premium on rapid completion over accurate PMTU | |||
skipping to change at page 19, line 30 ¶ | skipping to change at line 849 ¶ | |||
protection. Sequence number verification SHOULD be performed using | protection. Sequence number verification SHOULD be performed using | |||
the following sliding window procedure, borrowed from Section 3.4.3 | the following sliding window procedure, borrowed from Section 3.4.3 | |||
of [RFC4303]. Because each epoch resets the sequence number space, a | of [RFC4303]. Because each epoch resets the sequence number space, a | |||
separate sliding window is needed for each epoch. | separate sliding window is needed for each epoch. | |||
The received record counter for an epoch MUST be initialized to zero | The received record counter for an epoch MUST be initialized to zero | |||
when that epoch is first used. For each received record, the | when that epoch is first used. For each received record, the | |||
receiver MUST verify that the record contains a sequence number that | receiver MUST verify that the record contains a sequence number that | |||
does not duplicate the sequence number of any other record received | does not duplicate the sequence number of any other record received | |||
in that epoch during the lifetime of the association. This check | in that epoch during the lifetime of the association. This check | |||
SHOULD happen after deprotecting the record; otherwise the record | SHOULD happen after deprotecting the record; otherwise, the record | |||
discard might itself serve as a timing channel for the record number. | discard might itself serve as a timing channel for the record number. | |||
Note that computing the full record number from the partial is still | Note that computing the full record number from the partial is still | |||
a potential timing channel for the record number, though a less | a potential timing channel for the record number, though a less | |||
powerful one than whether the record was deprotected. | powerful one than whether the record was deprotected. | |||
Duplicates are rejected through the use of a sliding receive window. | Duplicates are rejected through the use of a sliding receive window. | |||
(How the window is implemented is a local matter, but the following | (How the window is implemented is a local matter, but the following | |||
text describes the functionality that the implementation must | text describes the functionality that the implementation must | |||
exhibit.) The receiver SHOULD pick a window large enough to handle | exhibit.) The receiver SHOULD pick a window large enough to handle | |||
any plausible reordering, which depends on the data rate. (The | any plausible reordering, which depends on the data rate. (The | |||
skipping to change at page 20, line 5 ¶ | skipping to change at line 872 ¶ | |||
The "right" edge of the window represents the highest validated | The "right" edge of the window represents the highest validated | |||
sequence number value received in the epoch. Records that contain | sequence number value received in the epoch. Records that contain | |||
sequence numbers lower than the "left" edge of the window are | sequence numbers lower than the "left" edge of the window are | |||
rejected. Records falling within the window are checked against a | rejected. Records falling within the window are checked against a | |||
list of received records within the window. An efficient means for | list of received records within the window. An efficient means for | |||
performing this check, based on the use of a bit mask, is described | performing this check, based on the use of a bit mask, is described | |||
in Section 3.4.3 of [RFC4303]. If the received record falls within | in Section 3.4.3 of [RFC4303]. If the received record falls within | |||
the window and is new, or if the record is to the right of the | the window and is new, or if the record is to the right of the | |||
window, then the record is new. | window, then the record is new. | |||
The window MUST NOT be updated until the record has been deprotected | The window MUST NOT be updated due to a received record until that | |||
successfully. | record has been deprotected successfully. | |||
4.5.2. Handling Invalid Records | 4.5.2. Handling Invalid Records | |||
Unlike TLS, DTLS is resilient in the face of invalid records (e.g., | Unlike TLS, DTLS is resilient in the face of invalid records (e.g., | |||
invalid formatting, length, MAC, etc.). In general, invalid records | invalid formatting, length, MAC, etc.). In general, invalid records | |||
SHOULD be silently discarded, thus preserving the association; | SHOULD be silently discarded, thus preserving the association; | |||
however, an error MAY be logged for diagnostic purposes. | however, an error MAY be logged for diagnostic purposes. | |||
Implementations which choose to generate an alert instead, MUST | Implementations which choose to generate an alert instead MUST | |||
generate fatal alerts to avoid attacks where the attacker repeatedly | generate fatal alerts to avoid attacks where the attacker repeatedly | |||
probes the implementation to see how it responds to various types of | probes the implementation to see how it responds to various types of | |||
error. Note that if DTLS is run over UDP, then any implementation | error. Note that if DTLS is run over UDP, then any implementation | |||
which does this will be extremely susceptible to denial-of-service | which does this will be extremely susceptible to DoS attacks because | |||
(DoS) attacks because UDP forgery is so easy. Thus, generating fatal | UDP forgery is so easy. Thus, generating fatal alerts is NOT | |||
alerts is NOT RECOMMENDED for such transports, both to increase the | RECOMMENDED for such transports, both to increase the reliability of | |||
reliability of DTLS service and to avoid the risk of spoofing attacks | DTLS service and to avoid the risk of spoofing attacks sending | |||
sending traffic to unrelated third parties. | traffic to unrelated third parties. | |||
If DTLS is being carried over a transport that is resistant to | If DTLS is being carried over a transport that is resistant to | |||
forgery (e.g., SCTP with SCTP-AUTH), then it is safer to send alerts | forgery (e.g., SCTP with SCTP-AUTH), then it is safer to send alerts | |||
because an attacker will have difficulty forging a datagram that will | because an attacker will have difficulty forging a datagram that will | |||
not be rejected by the transport layer. | not be rejected by the transport layer. | |||
Note that because invalid records are rejected at a layer lower than | Note that because invalid records are rejected at a layer lower than | |||
the handshake state machine, they do not affect pending | the handshake state machine, they do not affect pending | |||
retransmission timers. | retransmission timers. | |||
4.5.3. AEAD Limits | 4.5.3. AEAD Limits | |||
Section 5.5 of TLS [TLS13] defines limits on the number of records | Section 5.5 of [TLS13] defines limits on the number of records that | |||
that can be protected using the same keys. These limits are specific | can be protected using the same keys. These limits are specific to | |||
to an AEAD algorithm, and apply equally to DTLS. Implementations | an AEAD algorithm and apply equally to DTLS. Implementations SHOULD | |||
SHOULD NOT protect more records than allowed by the limit specified | NOT protect more records than allowed by the limit specified for the | |||
for the negotiated AEAD. Implementations SHOULD initiate a key | negotiated AEAD. Implementations SHOULD initiate a key update before | |||
update before reaching this limit. | reaching this limit. | |||
[TLS13] does not specify a limit for AEAD_AES_128_CCM, but the | [TLS13] does not specify a limit for AEAD_AES_128_CCM, but the | |||
analysis in Appendix B shows that a limit of 2^23 packets can be used | analysis in Appendix B shows that a limit of 2^23 packets can be used | |||
to obtain the same confidentiality protection as the limits specified | to obtain the same confidentiality protection as the limits specified | |||
in TLS. | in TLS. | |||
The usage limits defined in TLS 1.3 exist for protection against | The usage limits defined in TLS 1.3 exist for protection against | |||
attacks on confidentiality and apply to successful applications of | attacks on confidentiality and apply to successful applications of | |||
AEAD protection. The integrity protections in authenticated | AEAD protection. The integrity protections in authenticated | |||
encryption also depend on limiting the number of attempts to forge | encryption also depend on limiting the number of attempts to forge | |||
packets. TLS achieves this by closing connections after any record | packets. TLS achieves this by closing connections after any record | |||
fails an authentication check. In comparison, DTLS ignores any | fails an authentication check. In comparison, DTLS ignores any | |||
packet that cannot be authenticated, allowing multiple forgery | packet that cannot be authenticated, allowing multiple forgery | |||
attempts. | attempts. | |||
Implementations MUST count the number of received packets that fail | Implementations MUST count the number of received packets that fail | |||
authentication with each key. If the number of packets that fail | authentication with each key. If the number of packets that fail | |||
authentication exceed a limit that is specific to the AEAD in use, an | authentication exceeds a limit that is specific to the AEAD in use, | |||
implementation SHOULD immediately close the connection. | an implementation SHOULD immediately close the connection. | |||
Implementations SHOULD initiate a key update with update_requested | Implementations SHOULD initiate a key update with update_requested | |||
before reaching this limit. Once a key update has been initiated, | before reaching this limit. Once a key update has been initiated, | |||
the previous keys can be dropped when the limit is reached rather | the previous keys can be dropped when the limit is reached rather | |||
than closing the connection. Applying a limit reduces the | than closing the connection. Applying a limit reduces the | |||
probability that an attacker is able to successfully forge a packet; | probability that an attacker is able to successfully forge a packet; | |||
see [AEBounds] and [ROBUST]. | see [AEBounds] and [ROBUST]. | |||
For AEAD_AES_128_GCM, AEAD_AES_256_GCM, and AEAD_CHACHA20_POLY1305, | For AEAD_AES_128_GCM, AEAD_AES_256_GCM, and AEAD_CHACHA20_POLY1305, | |||
the limit on the number of records that fail authentication is 2^36. | the limit on the number of records that fail authentication is 2^36. | |||
Note that the analysis in [AEBounds] supports a higher limit for the | Note that the analysis in [AEBounds] supports a higher limit for | |||
AEAD_AES_128_GCM and AEAD_AES_256_GCM, but this specification | AEAD_AES_128_GCM and AEAD_AES_256_GCM, but this specification | |||
recommends a lower limit. For AEAD_AES_128_CCM, the limit on the | recommends a lower limit. For AEAD_AES_128_CCM, the limit on the | |||
number of records that fail authentication is 2^23.5; see Appendix B. | number of records that fail authentication is 2^23.5; see Appendix B. | |||
The AEAD_AES_128_CCM_8 AEAD, as used in TLS_AES_128_CCM_8_SHA256, | The AEAD_AES_128_CCM_8 AEAD, as used in TLS_AES_128_CCM_8_SHA256, | |||
does not have a limit on the number of records that fail | does not have a limit on the number of records that fail | |||
authentication that both limits the probability of forgery by the | authentication that both limits the probability of forgery by the | |||
same amount and does not expose implementations to the risk of denial | same amount and does not expose implementations to the risk of denial | |||
of service; see Appendix B.3. Therefore, TLS_AES_128_CCM_8_SHA256 | of service; see Appendix B.3. Therefore, TLS_AES_128_CCM_8_SHA256 | |||
MUST NOT be used in DTLS without additional safeguards against | MUST NOT be used in DTLS without additional safeguards against | |||
forgery. Implementations MUST set usage limits for | forgery. Implementations MUST set usage limits for | |||
AEAD_AES_128_CCM_8 based on an understanding of any additional | AEAD_AES_128_CCM_8 based on an understanding of any additional | |||
forgery protections that are used. | forgery protections that are used. | |||
Any TLS cipher suite that is specified for use with DTLS MUST define | Any TLS cipher suite that is specified for use with DTLS MUST define | |||
limits on the use of the associated AEAD function that preserves | limits on the use of the associated AEAD function that preserves | |||
margins for both confidentiality and integrity. That is, limits MUST | margins for both confidentiality and integrity. That is, limits MUST | |||
be specified for the number of packets that can be authenticated and | be specified for the number of packets that can be authenticated and | |||
for the number of packets that can fail authentication before a key | for the number of packets that can fail authentication before a key | |||
update is required. Providing a reference to any analysis upon which | update is required. Providing a reference to any analysis upon which | |||
values are based - and any assumptions used in that analysis - allows | values are based -- and any assumptions used in that analysis -- | |||
limits to be adapted to varying usage conditions. | allows limits to be adapted to varying usage conditions. | |||
5. The DTLS Handshake Protocol | 5. The DTLS Handshake Protocol | |||
DTLS 1.3 re-uses the TLS 1.3 handshake messages and flows, with the | DTLS 1.3 reuses the TLS 1.3 handshake messages and flows, with the | |||
following changes: | following changes: | |||
1. To handle message loss, reordering, and fragmentation | 1. To handle message loss, reordering, and fragmentation, | |||
modifications to the handshake header are necessary. | modifications to the handshake header are necessary. | |||
2. Retransmission timers are introduced to handle message loss. | 2. Retransmission timers are introduced to handle message loss. | |||
3. A new ACK content type has been added for reliable message | 3. A new ACK content type has been added for reliable message | |||
delivery of handshake messages. | delivery of handshake messages. | |||
Note that TLS 1.3 already supports a cookie extension, which is used | In addition, DTLS reuses TLS 1.3's "cookie" extension to provide a | |||
to prevent denial-of-service attacks. This DoS prevention mechanism | return-routability check as part of connection establishment. This | |||
is described in more detail below since UDP-based protocols are more | is an important DoS prevention mechanism for UDP-based protocols, | |||
vulnerable to amplification attacks than a connection-oriented | unlike TCP-based protocols, for which TCP establishes return- | |||
transport like TCP that performs return-routability checks as part of | routability as part of the connection establishment. | |||
the connection establishment. | ||||
DTLS implementations do not use the TLS 1.3 "compatibility mode" | DTLS implementations do not use the TLS 1.3 "compatibility mode" | |||
described in Section D.4 of [TLS13]. DTLS servers MUST NOT echo the | described in Appendix D.4 of [TLS13]. DTLS servers MUST NOT echo the | |||
"legacy_session_id" value from the client and endpoints MUST NOT send | "legacy_session_id" value from the client and endpoints MUST NOT send | |||
ChangeCipherSpec messages. | ChangeCipherSpec messages. | |||
With these exceptions, the DTLS message formats, flows, and logic are | With these exceptions, the DTLS message formats, flows, and logic are | |||
the same as those of TLS 1.3. | the same as those of TLS 1.3. | |||
5.1. Denial-of-Service Countermeasures | 5.1. Denial-of-Service Countermeasures | |||
Datagram security protocols are extremely susceptible to a variety of | Datagram security protocols are extremely susceptible to a variety of | |||
DoS attacks. Two attacks are of particular concern: | DoS attacks. Two attacks are of particular concern: | |||
1. An attacker can consume excessive resources on the server by | 1. An attacker can consume excessive resources on the server by | |||
transmitting a series of handshake initiation requests, causing | transmitting a series of handshake initiation requests, causing | |||
the server to allocate state and potentially to perform expensive | the server to allocate state and potentially to perform expensive | |||
cryptographic operations. | cryptographic operations. | |||
2. An attacker can use the server as an amplifier by sending | 2. An attacker can use the server as an amplifier by sending | |||
connection initiation messages with a forged source address that | connection initiation messages with a forged source address that | |||
belongs to a victim. The server then sends its response to the | belongs to a victim. The server then sends its response to the | |||
victim machine, thus flooding it. Depending on the selected | victim machine, thus flooding it. Depending on the selected | |||
parameters this response message can be quite large, as is the | parameters, this response message can be quite large, as is the | |||
case for a Certificate message. | case for a Certificate message. | |||
In order to counter both of these attacks, DTLS borrows the stateless | In order to counter both of these attacks, DTLS borrows the stateless | |||
cookie technique used by Photuris [RFC2522] and IKE [RFC7296]. When | cookie technique used by Photuris [RFC2522] and IKE [RFC7296]. When | |||
the client sends its ClientHello message to the server, the server | the client sends its ClientHello message to the server, the server | |||
MAY respond with a HelloRetryRequest message. The HelloRetryRequest | MAY respond with a HelloRetryRequest message. The HelloRetryRequest | |||
message, as well as the cookie extension, is defined in TLS 1.3. The | message, as well as the "cookie" extension, is defined in TLS 1.3. | |||
HelloRetryRequest message contains a stateless cookie (see [TLS13]; | The HelloRetryRequest message contains a stateless cookie (see | |||
Section 4.2.2). The client MUST send a new ClientHello with the | [TLS13], Section 4.2.2). The client MUST send a new ClientHello with | |||
cookie added as an extension. The server then verifies the cookie | the cookie added as an extension. The server then verifies the | |||
and proceeds with the handshake only if it is valid. This mechanism | cookie and proceeds with the handshake only if it is valid. This | |||
forces the attacker/client to be able to receive the cookie, which | mechanism forces the attacker/client to be able to receive the | |||
makes DoS attacks with spoofed IP addresses difficult. This | cookie, which makes DoS attacks with spoofed IP addresses difficult. | |||
mechanism does not provide any defense against DoS attacks mounted | This mechanism does not provide any defense against DoS attacks | |||
from valid IP addresses. | mounted from valid IP addresses. | |||
The DTLS 1.3 specification changes how cookies are exchanged compared | The DTLS 1.3 specification changes how cookies are exchanged compared | |||
to DTLS 1.2. DTLS 1.3 re-uses the HelloRetryRequest message and | to DTLS 1.2. DTLS 1.3 reuses the HelloRetryRequest message and | |||
conveys the cookie to the client via an extension. The client | conveys the cookie to the client via an extension. The client | |||
receiving the cookie uses the same extension to place the cookie | receiving the cookie uses the same extension to place the cookie | |||
subsequently into a ClientHello message. DTLS 1.2 on the other hand | subsequently into a ClientHello message. DTLS 1.2, on the other | |||
used a separate message, namely the HelloVerifyRequest, to pass a | hand, used a separate message, namely the HelloVerifyRequest, to pass | |||
cookie to the client and did not utilize the extension mechanism. | a cookie to the client and did not utilize the extension mechanism. | |||
For backwards compatibility reasons, the cookie field in the | For backwards compatibility reasons, the cookie field in the | |||
ClientHello is present in DTLS 1.3 but is ignored by a DTLS 1.3 | ClientHello is present in DTLS 1.3 but is ignored by a DTLS | |||
compliant server implementation. | 1.3-compliant server implementation. | |||
The exchange is shown in Figure 6. Note that the figure focuses on | The exchange is shown in Figure 6. Note that the figure focuses on | |||
the cookie exchange; all other extensions are omitted. | the cookie exchange; all other extensions are omitted. | |||
Client Server | Client Server | |||
------ ------ | ------ ------ | |||
ClientHello ------> | ClientHello ------> | |||
<----- HelloRetryRequest | <----- HelloRetryRequest | |||
+ cookie | + cookie | |||
ClientHello ------> | ClientHello ------> | |||
+ cookie | + cookie | |||
[Rest of handshake] | [Rest of handshake] | |||
Figure 6: DTLS exchange with HelloRetryRequest containing the | Figure 6: DTLS Exchange with HelloRetryRequest Containing the | |||
"cookie" extension | "cookie" Extension | |||
The cookie extension is defined in Section 4.2.2 of [TLS13]. When | The "cookie" extension is defined in Section 4.2.2 of [TLS13]. When | |||
sending the initial ClientHello, the client does not have a cookie | sending the initial ClientHello, the client does not have a cookie | |||
yet. In this case, the cookie extension is omitted and the | yet. In this case, the "cookie" extension is omitted and the | |||
legacy_cookie field in the ClientHello message MUST be set to a zero- | legacy_cookie field in the ClientHello message MUST be set to a zero- | |||
length vector (i.e., a zero-valued single byte length field). | length vector (i.e., a zero-valued single byte length field). | |||
When responding to a HelloRetryRequest, the client MUST create a new | When responding to a HelloRetryRequest, the client MUST create a new | |||
ClientHello message following the description in Section 4.1.2 of | ClientHello message following the description in Section 4.1.2 of | |||
[TLS13]. | [TLS13]. | |||
If the HelloRetryRequest message is used, the initial ClientHello and | If the HelloRetryRequest message is used, the initial ClientHello and | |||
the HelloRetryRequest are included in the calculation of the | the HelloRetryRequest are included in the calculation of the | |||
transcript hash. The computation of the message hash for the | transcript hash. The computation of the message hash for the | |||
HelloRetryRequest is done according to the description in | HelloRetryRequest is done according to the description in | |||
Section 4.4.1 of [TLS13]. | Section 4.4.1 of [TLS13]. | |||
The handshake transcript is not reset with the second ClientHello and | The handshake transcript is not reset with the second ClientHello, | |||
a stateless server-cookie implementation requires the content or hash | and a stateless server-cookie implementation requires the content or | |||
of the initial ClientHello (and HelloRetryRequest) to be stored in | hash of the initial ClientHello (and HelloRetryRequest) to be stored | |||
the cookie. The initial ClientHello is included in the handshake | in the cookie. The initial ClientHello is included in the handshake | |||
transcript as a synthetic "message_hash" message, so only the hash | transcript as a synthetic "message_hash" message, so only the hash | |||
value is needed for the handshake to complete, though the complete | value is needed for the handshake to complete, though the complete | |||
HelloRetryRequest contents are needed. | HelloRetryRequest contents are needed. | |||
When the second ClientHello is received, the server can verify that | When the second ClientHello is received, the server can verify that | |||
the cookie is valid and that the client can receive packets at the | the cookie is valid and that the client can receive packets at the | |||
given IP address. If the client's apparent IP address is embedded in | given IP address. If the client's apparent IP address is embedded in | |||
the cookie, this prevents an attacker from generating an acceptable | the cookie, this prevents an attacker from generating an acceptable | |||
ClientHello apparently from another user. | ClientHello apparently from another user. | |||
skipping to change at page 24, line 42 ¶ | skipping to change at line 1090 ¶ | |||
defend against this attack by changing the secret value frequently, | defend against this attack by changing the secret value frequently, | |||
thus invalidating those cookies. If the server wishes to allow | thus invalidating those cookies. If the server wishes to allow | |||
legitimate clients to handshake through the transition (e.g., a | legitimate clients to handshake through the transition (e.g., a | |||
client received a cookie with Secret 1 and then sent the second | client received a cookie with Secret 1 and then sent the second | |||
ClientHello after the server has changed to Secret 2), the server can | ClientHello after the server has changed to Secret 2), the server can | |||
have a limited window during which it accepts both secrets. | have a limited window during which it accepts both secrets. | |||
[RFC7296] suggests adding a key identifier to cookies to detect this | [RFC7296] suggests adding a key identifier to cookies to detect this | |||
case. An alternative approach is simply to try verifying with both | case. An alternative approach is simply to try verifying with both | |||
secrets. It is RECOMMENDED that servers implement a key rotation | secrets. It is RECOMMENDED that servers implement a key rotation | |||
scheme that allows the server to manage keys with overlapping | scheme that allows the server to manage keys with overlapping | |||
lifetime. | lifetimes. | |||
Alternatively, the server can store timestamps in the cookie and | Alternatively, the server can store timestamps in the cookie and | |||
reject cookies that were generated outside a certain interval of | reject cookies that were generated outside a certain interval of | |||
time. | time. | |||
DTLS servers SHOULD perform a cookie exchange whenever a new | DTLS servers SHOULD perform a cookie exchange whenever a new | |||
handshake is being performed. If the server is being operated in an | handshake is being performed. If the server is being operated in an | |||
environment where amplification is not a problem, the server MAY be | environment where amplification is not a problem, e.g., where ICE | |||
configured not to perform a cookie exchange. The default SHOULD be | [RFC8445] has been used to establish bidirectional connectivity, the | |||
that the exchange is performed, however. In addition, the server MAY | server MAY be configured not to perform a cookie exchange. The | |||
choose not to do a cookie exchange when a session is resumed or, more | default SHOULD be that the exchange is performed, however. In | |||
generically, when the DTLS handshake uses a PSK-based key exchange | addition, the server MAY choose not to do a cookie exchange when a | |||
and the IP address matches one associated with the PSK. Servers | session is resumed or, more generically, when the DTLS handshake uses | |||
which process 0-RTT requests and send 0.5-RTT responses without a | a PSK-based key exchange and the IP address matches one associated | |||
cookie exchange risk being used in an amplification attack if the | with the PSK. Servers which process 0-RTT requests and send 0.5-RTT | |||
size of outgoing messages greatly exceeds the size of those that are | responses without a cookie exchange risk being used in an | |||
received. A server SHOULD limit the amount of data it sends toward a | amplification attack if the size of outgoing messages greatly exceeds | |||
client address to three times the amount of data sent by the client | the size of those that are received. A server SHOULD limit the | |||
before it verifies that the client is able to receive data at that | amount of data it sends toward a client address to three times the | |||
address. A client address is valid after a cookie exchange or | amount of data sent by the client before it verifies that the client | |||
handshake completion. Clients MUST be prepared to do a cookie | is able to receive data at that address. A client address is valid | |||
exchange with every handshake. Note that cookies are only valid for | after a cookie exchange or handshake completion. Clients MUST be | |||
the existing handshake and cannot be stored for future handshakes. | prepared to do a cookie exchange with every handshake. Note that | |||
cookies are only valid for the existing handshake and cannot be | ||||
stored for future handshakes. | ||||
If a server receives a ClientHello with an invalid cookie, it MUST | If a server receives a ClientHello with an invalid cookie, it MUST | |||
terminate the handshake with an "illegal_parameter" alert. This | terminate the handshake with an "illegal_parameter" alert. This | |||
allows the client to restart the connection from scratch without a | allows the client to restart the connection from scratch without a | |||
cookie. | cookie. | |||
As described in Section 4.1.4 of [TLS13], clients MUST abort the | As described in Section 4.1.4 of [TLS13], clients MUST abort the | |||
handshake with an "unexpected_message" alert in response to any | handshake with an "unexpected_message" alert in response to any | |||
second HelloRetryRequest which was sent in the same connection (i.e., | second HelloRetryRequest which was sent in the same connection (i.e., | |||
where the ClientHello was itself in response to a HelloRetryRequest). | where the ClientHello was itself in response to a HelloRetryRequest). | |||
DTLS clients which do not want to receive a Connection ID SHOULD | DTLS clients which do not want to receive a Connection ID SHOULD | |||
still offer the "connection_id" extension unless there is an | still offer the "connection_id" extension [RFC9146] unless there is | |||
application profile to the contrary. This permits a server which | an application profile to the contrary. This permits a server which | |||
wants to receive a CID to negotiate one. | wants to receive a CID to negotiate one. | |||
5.2. DTLS Handshake Message Format | 5.2. DTLS Handshake Message Format | |||
In order to support message loss, reordering, and message | DTLS uses the same Handshake messages as TLS 1.3. However, prior to | |||
fragmentation, DTLS modifies the TLS 1.3 handshake header: | transmission they are converted to DTLSHandshake messages, which | |||
contain extra data needed to support message loss, reordering, and | ||||
message fragmentation. | ||||
enum { | enum { | |||
client_hello(1), | client_hello(1), | |||
server_hello(2), | server_hello(2), | |||
new_session_ticket(4), | new_session_ticket(4), | |||
end_of_early_data(5), | end_of_early_data(5), | |||
encrypted_extensions(8), | encrypted_extensions(8), | |||
request_connection_id(9), /* New */ | ||||
new_connection_id(10), /* New */ | ||||
certificate(11), | certificate(11), | |||
certificate_request(13), | certificate_request(13), | |||
certificate_verify(15), | certificate_verify(15), | |||
finished(20), | finished(20), | |||
key_update(24), | key_update(24), | |||
message_hash(254), | message_hash(254), | |||
(255) | (255) | |||
} HandshakeType; | } HandshakeType; | |||
struct { | struct { | |||
skipping to change at page 26, line 37 ¶ | skipping to change at line 1173 ¶ | |||
case client_hello: ClientHello; | case client_hello: ClientHello; | |||
case server_hello: ServerHello; | case server_hello: ServerHello; | |||
case end_of_early_data: EndOfEarlyData; | case end_of_early_data: EndOfEarlyData; | |||
case encrypted_extensions: EncryptedExtensions; | case encrypted_extensions: EncryptedExtensions; | |||
case certificate_request: CertificateRequest; | case certificate_request: CertificateRequest; | |||
case certificate: Certificate; | case certificate: Certificate; | |||
case certificate_verify: CertificateVerify; | case certificate_verify: CertificateVerify; | |||
case finished: Finished; | case finished: Finished; | |||
case new_session_ticket: NewSessionTicket; | case new_session_ticket: NewSessionTicket; | |||
case key_update: KeyUpdate; | case key_update: KeyUpdate; | |||
case request_connection_id: RequestConnectionId; | ||||
case new_connection_id: NewConnectionId; | ||||
} body; | } body; | |||
} Handshake; | } DTLSHandshake; | |||
In DTLS 1.3, the message transcript is computed over the original TLS | ||||
1.3-style Handshake messages without the message_seq, | ||||
fragment_offset, and fragment_length values. Note that this is a | ||||
change from DTLS 1.2 where those values were included in the | ||||
transcript. | ||||
The first message each side transmits in each association always has | The first message each side transmits in each association always has | |||
message_seq = 0. Whenever a new message is generated, the | message_seq = 0. Whenever a new message is generated, the | |||
message_seq value is incremented by one. When a message is | message_seq value is incremented by one. When a message is | |||
retransmitted, the old message_seq value is re-used, i.e., not | retransmitted, the old message_seq value is reused, i.e., not | |||
incremented. From the perspective of the DTLS record layer, the | incremented. From the perspective of the DTLS record layer, the | |||
retransmission is a new record. This record will have a new | retransmission is a new record. This record will have a new | |||
DTLSPlaintext.sequence_number value. | DTLSPlaintext.sequence_number value. | |||
Note: In DTLS 1.2 the message_seq was reset to zero in case of a | Note: In DTLS 1.2, the message_seq was reset to zero in case of a | |||
rehandshake (i.e., renegotiation). On the surface, a rehandshake in | rehandshake (i.e., renegotiation). On the surface, a rehandshake | |||
DTLS 1.2 shares similarities with a post-handshake message exchange | in DTLS 1.2 shares similarities with a post-handshake message | |||
in DTLS 1.3. However, in DTLS 1.3 the message_seq is not reset to | exchange in DTLS 1.3. However, in DTLS 1.3 the message_seq is not | |||
allow distinguishing a retransmission from a previously sent post- | reset, to allow distinguishing a retransmission from a previously | |||
handshake message from a newly sent post-handshake message. | sent post-handshake message from a newly sent post-handshake | |||
message. | ||||
DTLS implementations maintain (at least notionally) a | DTLS implementations maintain (at least notionally) a | |||
next_receive_seq counter. This counter is initially set to zero. | next_receive_seq counter. This counter is initially set to zero. | |||
When a handshake message is received, if its message_seq value | When a handshake message is received, if its message_seq value | |||
matches next_receive_seq, next_receive_seq is incremented and the | matches next_receive_seq, next_receive_seq is incremented and the | |||
message is processed. If the sequence number is less than | message is processed. If the sequence number is less than | |||
next_receive_seq, the message MUST be discarded. If the sequence | next_receive_seq, the message MUST be discarded. If the sequence | |||
number is greater than next_receive_seq, the implementation SHOULD | number is greater than next_receive_seq, the implementation SHOULD | |||
queue the message but MAY discard it. (This is a simple space/ | queue the message but MAY discard it. (This is a simple space/ | |||
bandwidth tradeoff). | bandwidth trade-off). | |||
In addition to the handshake messages that are deprecated by the TLS | In addition to the handshake messages that are deprecated by the TLS | |||
1.3 specification, DTLS 1.3 furthermore deprecates the | 1.3 specification, DTLS 1.3 furthermore deprecates the | |||
HelloVerifyRequest message originally defined in DTLS 1.0. DTLS | HelloVerifyRequest message originally defined in DTLS 1.0. DTLS | |||
1.3-compliant implements MUST NOT use the HelloVerifyRequest to | 1.3-compliant implementations MUST NOT use the HelloVerifyRequest to | |||
execute a return-routability check. A dual-stack DTLS 1.2/DTLS 1.3 | execute a return-routability check. A dual-stack DTLS 1.2 / DTLS 1.3 | |||
client MUST, however, be prepared to interact with a DTLS 1.2 server. | client MUST, however, be prepared to interact with a DTLS 1.2 server. | |||
5.3. ClientHello Message | 5.3. ClientHello Message | |||
The format of the ClientHello used by a DTLS 1.3 client differs from | The format of the ClientHello used by a DTLS 1.3 client differs from | |||
the TLS 1.3 ClientHello format as shown below. | the TLS 1.3 ClientHello format, as shown below. | |||
uint16 ProtocolVersion; | uint16 ProtocolVersion; | |||
opaque Random[32]; | opaque Random[32]; | |||
uint8 CipherSuite[2]; /* Cryptographic suite selector */ | uint8 CipherSuite[2]; /* Cryptographic suite selector */ | |||
struct { | struct { | |||
ProtocolVersion legacy_version = { 254,253 }; // DTLSv1.2 | ProtocolVersion legacy_version = { 254,253 }; // DTLSv1.2 | |||
Random random; | Random random; | |||
opaque legacy_session_id<0..32>; | opaque legacy_session_id<0..32>; | |||
skipping to change at page 28, line 15 ¶ | skipping to change at line 1252 ¶ | |||
ClientHello with a version number higher than it supports. In | ClientHello with a version number higher than it supports. In | |||
DTLS 1.3, the client indicates its version preferences in the | DTLS 1.3, the client indicates its version preferences in the | |||
"supported_versions" extension (see Section 4.2.1 of [TLS13]) and | "supported_versions" extension (see Section 4.2.1 of [TLS13]) and | |||
the legacy_version field MUST be set to {254, 253}, which was the | the legacy_version field MUST be set to {254, 253}, which was the | |||
version number for DTLS 1.2. The supported_versions entries for | version number for DTLS 1.2. The supported_versions entries for | |||
DTLS 1.0 and DTLS 1.2 are 0xfeff and 0xfefd (to match the wire | DTLS 1.0 and DTLS 1.2 are 0xfeff and 0xfefd (to match the wire | |||
versions). The value 0xfefc is used to indicate DTLS 1.3. | versions). The value 0xfefc is used to indicate DTLS 1.3. | |||
random: Same as for TLS 1.3, except that the downgrade sentinels | random: Same as for TLS 1.3, except that the downgrade sentinels | |||
described in Section 4.1.3 of [TLS13] when TLS 1.2 and TLS 1.1 and | described in Section 4.1.3 of [TLS13] when TLS 1.2 and TLS 1.1 and | |||
below are negotiated apply to DTLS 1.2 and DTLS 1.0 respectively. | below are negotiated apply to DTLS 1.2 and DTLS 1.0, respectively. | |||
legacy_session_id: Versions of TLS and DTLS before version 1.3 | legacy_session_id: Versions of TLS and DTLS before version 1.3 | |||
supported a "session resumption" feature which has been merged | supported a "session resumption" feature, which has been merged | |||
with pre-shared keys in version 1.3. A client which has a cached | with pre-shared keys (PSK) in version 1.3. A client which has a | |||
session ID set by a pre-DTLS 1.3 server SHOULD set this field to | cached session ID set by a pre-DTLS 1.3 server SHOULD set this | |||
that value. Otherwise, it MUST be set as a zero-length vector | field to that value. Otherwise, it MUST be set as a zero-length | |||
(i.e., a zero-valued single byte length field). | vector (i.e., a zero-valued single byte length field). | |||
legacy_cookie: A DTLS 1.3-only client MUST set the legacy_cookie | legacy_cookie: A DTLS 1.3-only client MUST set the legacy_cookie | |||
field to zero length. If a DTLS 1.3 ClientHello is received with | field to zero length. If a DTLS 1.3 ClientHello is received with | |||
any other value in this field, the server MUST abort the handshake | any other value in this field, the server MUST abort the handshake | |||
with an "illegal_parameter" alert. | with an "illegal_parameter" alert. | |||
cipher_suites: Same as for TLS 1.3; only suites with DTLS-OK=Y may | cipher_suites: Same as for TLS 1.3; only suites with DTLS-OK=Y may | |||
be used. | be used. | |||
legacy_compression_methods: Same as for TLS 1.3. | legacy_compression_methods: Same as for TLS 1.3. | |||
skipping to change at page 28, line 44 ¶ | skipping to change at line 1281 ¶ | |||
extensions: Same as for TLS 1.3. | extensions: Same as for TLS 1.3. | |||
5.4. ServerHello Message | 5.4. ServerHello Message | |||
The DTLS 1.3 ServerHello message is the same as the TLS 1.3 | The DTLS 1.3 ServerHello message is the same as the TLS 1.3 | |||
ServerHello message, except that the legacy_version field is set to | ServerHello message, except that the legacy_version field is set to | |||
0xfefd, indicating DTLS 1.2. | 0xfefd, indicating DTLS 1.2. | |||
5.5. Handshake Message Fragmentation and Reassembly | 5.5. Handshake Message Fragmentation and Reassembly | |||
As described in Section 4.3 one or more handshake messages may be | As described in Section 4.3, one or more handshake messages may be | |||
carried in a single datagram. However, handshake messages are | carried in a single datagram. However, handshake messages are | |||
potentially bigger than the size allowed by the underlying datagram | potentially bigger than the size allowed by the underlying datagram | |||
transport. DTLS provides a mechanism for fragmenting a handshake | transport. DTLS provides a mechanism for fragmenting a handshake | |||
message over a number of records, each of which can be transmitted in | message over a number of records, each of which can be transmitted in | |||
separate datagrams, thus avoiding IP fragmentation. | separate datagrams, thus avoiding IP fragmentation. | |||
When transmitting the handshake message, the sender divides the | When transmitting the handshake message, the sender divides the | |||
message into a series of N contiguous data ranges. The ranges MUST | message into a series of N contiguous data ranges. The ranges MUST | |||
NOT overlap. The sender then creates N handshake messages, all with | NOT overlap. The sender then creates N DTLSHandshake messages, all | |||
the same message_seq value as the original handshake message. Each | with the same message_seq value as the original DTLSHandshake | |||
new message is labeled with the fragment_offset (the number of bytes | message. Each new message is labeled with the fragment_offset (the | |||
contained in previous fragments) and the fragment_length (the length | number of bytes contained in previous fragments) and the | |||
of this fragment). The length field in all messages is the same as | fragment_length (the length of this fragment). The length field in | |||
the length field of the original message. An unfragmented message is | all messages is the same as the length field of the original message. | |||
a degenerate case with fragment_offset=0 and fragment_length=length. | An unfragmented message is a degenerate case with fragment_offset=0 | |||
Each handshake message fragment that is placed into a record MUST be | and fragment_length=length. Each handshake message fragment that is | |||
delivered in a single UDP datagram. | placed into a record MUST be delivered in a single UDP datagram. | |||
When a DTLS implementation receives a handshake message fragment | When a DTLS implementation receives a handshake message fragment | |||
corresponding to the next expected handshake message sequence number, | corresponding to the next expected handshake message sequence number, | |||
it MUST buffer it until it has the entire handshake message. DTLS | it MUST process it, either by buffering it until it has the entire | |||
implementations MUST be able to handle overlapping fragment ranges. | handshake message or by processing any in-order portions of the | |||
This allows senders to retransmit handshake messages with smaller | message. The transcript consists of complete TLS Handshake messages | |||
fragment sizes if the PMTU estimate changes. Senders MUST NOT change | (reassembled as necessary). Note that this requires removing the | |||
handshake message bytes upon retransmission. Receivers MAY check | message_seq, fragment_offset, and fragment_length fields to create | |||
that retransmitted bytes are identical and SHOULD abort the handshake | the Handshake structure. | |||
with an "illegal_parameter" alert if the value of a byte changes. | ||||
DTLS implementations MUST be able to handle overlapping fragment | ||||
ranges. This allows senders to retransmit handshake messages with | ||||
smaller fragment sizes if the PMTU estimate changes. Senders MUST | ||||
NOT change handshake message bytes upon retransmission. Receivers | ||||
MAY check that retransmitted bytes are identical and SHOULD abort the | ||||
handshake with an "illegal_parameter" alert if the value of a byte | ||||
changes. | ||||
Note that as with TLS, multiple handshake messages may be placed in | Note that as with TLS, multiple handshake messages may be placed in | |||
the same DTLS record, provided that there is room and that they are | the same DTLS record, provided that there is room and that they are | |||
part of the same flight. Thus, there are two acceptable ways to pack | part of the same flight. Thus, there are two acceptable ways to pack | |||
two DTLS handshake messages into the same datagram: in the same | two DTLS handshake messages into the same datagram: in the same | |||
record or in separate records. | record or in separate records. | |||
5.6. End Of Early Data | 5.6. EndOfEarlyData Message | |||
The DTLS 1.3 handshake has one important difference from the TLS 1.3 | The DTLS 1.3 handshake has one important difference from the TLS 1.3 | |||
handshake: the EndOfEarlyData message is omitted both from the wire | handshake: the EndOfEarlyData message is omitted both from the wire | |||
and the handshake transcript: because DTLS records have epochs, | and the handshake transcript. Because DTLS records have epochs, | |||
EndOfEarlyData is not necessary to determine when the early data is | EndOfEarlyData is not necessary to determine when the early data is | |||
complete, and because DTLS is lossy, attackers can trivially mount | complete, and because DTLS is lossy, attackers can trivially mount | |||
the deletion attacks that EndOfEarlyData prevents in TLS. Servers | the deletion attacks that EndOfEarlyData prevents in TLS. Servers | |||
SHOULD NOT accept records from epoch 1 indefinitely once they are | SHOULD NOT accept records from epoch 1 indefinitely once they are | |||
able to process records from epoch 3. Though reordering of IP | able to process records from epoch 3. Though reordering of IP | |||
packets can result in records from epoch 1 arriving after records | packets can result in records from epoch 1 arriving after records | |||
from epoch 3, this is not likely to persist for very long relative to | from epoch 3, this is not likely to persist for very long relative to | |||
the round trip time. Servers could discard epoch 1 keys after the | the round trip time. Servers could discard epoch 1 keys after the | |||
first epoch 3 data arrives, or retain keys for processing epoch 1 | first epoch 3 data arrives, or retain keys for processing epoch 1 | |||
data for a short period. (See Section 6.1 for the definitions of | data for a short period. (See Section 6.1 for the definitions of | |||
skipping to change at page 30, line 30 ¶ | skipping to change at line 1365 ¶ | |||
| | | x | ServerHello, EncryptedExtensions, | | | | | x | ServerHello, EncryptedExtensions, | | |||
| | | | CertificateRequest, Certificate, | | | | | | CertificateRequest, Certificate, | | |||
| | | | CertificateVerify, Finished | | | | | | CertificateVerify, Finished | | |||
+------+--------+--------+-----------------------------------+ | +------+--------+--------+-----------------------------------+ | |||
| 1 | x | | Certificate, CertificateVerify, | | | 1 | x | | Certificate, CertificateVerify, | | |||
| | | | Finished | | | | | | Finished | | |||
+------+--------+--------+-----------------------------------+ | +------+--------+--------+-----------------------------------+ | |||
| 1 | | x | NewSessionTicket | | | 1 | | x | NewSessionTicket | | |||
+------+--------+--------+-----------------------------------+ | +------+--------+--------+-----------------------------------+ | |||
Table 1: Flight Handshake Message Combinations. | Table 1: Flight Handshake Message Combinations | |||
Remarks: | Remarks: | |||
* Table 1 does not highlight any of the optional messages. | * Table 1 does not highlight any of the optional messages. | |||
* Regarding note (1): When a handshake flight is sent without any | * Regarding note (1): When a handshake flight is sent without any | |||
expected response, as it is the case with the client's final | expected response, as is the case with the client's final flight | |||
flight or with the NewSessionTicket message, the flight must be | or with the NewSessionTicket message, the flight must be | |||
acknowledged with an ACK message. | acknowledged with an ACK message. | |||
Below are several example message exchange illustrating the flight | Below are several example message exchanges illustrating the flight | |||
concept. The notational conventions from [TLS13] are used. | concept. The notational conventions from [TLS13] are used. | |||
Client Server | Client Server | |||
+--------+ | +--------+ | |||
ClientHello | Flight | | ClientHello | Flight | | |||
--------> +--------+ | --------> +--------+ | |||
+--------+ | +--------+ | |||
<-------- HelloRetryRequest | Flight | | <-------- HelloRetryRequest | Flight | | |||
+ cookie +--------+ | + cookie +--------+ | |||
+--------+ | +--------+ | |||
ClientHello | Flight | | ClientHello | Flight | | |||
+ cookie --------> +--------+ | + cookie --------> +--------+ | |||
ServerHello | ServerHello | |||
{EncryptedExtensions} +--------+ | {EncryptedExtensions} +--------+ | |||
{CertificateRequest*} | Flight | | {CertificateRequest*} | Flight | | |||
{Certificate*} +--------+ | {Certificate*} +--------+ | |||
{CertificateVerify*} | {CertificateVerify*} | |||
{Finished} | {Finished} | |||
<-------- [Application Data*] | <-------- [Application Data*] | |||
{Certificate*} +--------+ | {Certificate*} +--------+ | |||
{CertificateVerify*} | Flight | | {CertificateVerify*} | Flight | | |||
{Finished} --------> +--------+ | {Finished} --------> +--------+ | |||
[Application Data] | [Application Data] | |||
+--------+ | +--------+ | |||
<-------- [ACK] | Flight | | <-------- [ACK] | Flight | | |||
[Application Data*] +--------+ | [Application Data*] +--------+ | |||
[Application Data] <-------> [Application Data] | [Application Data] <-------> [Application Data] | |||
Figure 7: Message flights for a full DTLS Handshake (with cookie | Figure 7: Message Flights for a Full DTLS Handshake (with Cookie | |||
exchange) | Exchange) | |||
ClientHello +--------+ | ClientHello +--------+ | |||
+ pre_shared_key | Flight | | + pre_shared_key | Flight | | |||
+ psk_key_exchange_modes +--------+ | + psk_key_exchange_modes +--------+ | |||
+ key_share* --------> | + key_share* --------> | |||
ServerHello | ServerHello | |||
+ pre_shared_key +--------+ | + pre_shared_key +--------+ | |||
+ key_share* | Flight | | + key_share* | Flight | | |||
{EncryptedExtensions} +--------+ | {EncryptedExtensions} +--------+ | |||
skipping to change at page 32, line 26 ¶ | skipping to change at line 1435 ¶ | |||
+--------+ | +--------+ | |||
{Finished} --------> | Flight | | {Finished} --------> | Flight | | |||
[Application Data*] +--------+ | [Application Data*] +--------+ | |||
+--------+ | +--------+ | |||
<-------- [ACK] | Flight | | <-------- [ACK] | Flight | | |||
[Application Data*] +--------+ | [Application Data*] +--------+ | |||
[Application Data] <-------> [Application Data] | [Application Data] <-------> [Application Data] | |||
Figure 8: Message flights for resumption and PSK handshake | Figure 8: Message Flights for Resumption and PSK Handshake | |||
(without cookie exchange) | (without Cookie Exchange) | |||
Client Server | Client Server | |||
ClientHello | ClientHello | |||
+ early_data | + early_data | |||
+ psk_key_exchange_modes +--------+ | + psk_key_exchange_modes +--------+ | |||
+ key_share* | Flight | | + key_share* | Flight | | |||
+ pre_shared_key +--------+ | + pre_shared_key +--------+ | |||
(Application Data*) --------> | (Application Data*) --------> | |||
skipping to change at page 33, line 31 ¶ | skipping to change at line 1464 ¶ | |||
+--------+ | +--------+ | |||
{Finished} --------> | Flight | | {Finished} --------> | Flight | | |||
[Application Data*] +--------+ | [Application Data*] +--------+ | |||
+--------+ | +--------+ | |||
<-------- [ACK] | Flight | | <-------- [ACK] | Flight | | |||
[Application Data*] +--------+ | [Application Data*] +--------+ | |||
[Application Data] <-------> [Application Data] | [Application Data] <-------> [Application Data] | |||
Figure 9: Message flights for the Zero-RTT handshake | Figure 9: Message Flights for the Zero-RTT Handshake | |||
Client Server | Client Server | |||
+--------+ | +--------+ | |||
<-------- [NewSessionTicket] | Flight | | <-------- [NewSessionTicket] | Flight | | |||
+--------+ | +--------+ | |||
+--------+ | +--------+ | |||
[ACK] --------> | Flight | | [ACK] --------> | Flight | | |||
+--------+ | +--------+ | |||
Figure 10: Message flights for the NewSessionTicket message | Figure 10: Message Flights for the NewSessionTicket Message | |||
KeyUpdate, NewConnectionId and RequestConnectionId follow a similar | KeyUpdate, NewConnectionId, and RequestConnectionId follow a similar | |||
pattern to NewSessionTicket: a single message sent by one side | pattern to NewSessionTicket: a single message sent by one side | |||
followed by an ACK by the other. | followed by an ACK by the other. | |||
5.8. Timeout and Retransmission | 5.8. Timeout and Retransmission | |||
5.8.1. State Machine | 5.8.1. State Machine | |||
DTLS uses a simple timeout and retransmission scheme with the state | DTLS uses a simple timeout and retransmission scheme with the state | |||
machine shown in Figure 11. | machine shown in Figure 11. | |||
skipping to change at page 36, line 5 ¶ | skipping to change at line 1537 ¶ | |||
| | | | | | |||
+-----------+ | +-----------+ | |||
| /|\ | | /|\ | |||
| | | | | | |||
| | | | | | |||
+---+ | +---+ | |||
Server read retransmit | Server read retransmit | |||
Retransmit ACK | Retransmit ACK | |||
Figure 11: DTLS timeout and retransmission state machine | Figure 11: DTLS Timeout and Retransmission State Machine | |||
The state machine has four basic states: PREPARING, SENDING, WAITING, | The state machine has four basic states: PREPARING, SENDING, WAITING, | |||
and FINISHED. | and FINISHED. | |||
In the PREPARING state, the implementation does whatever computations | In the PREPARING state, the implementation does whatever computations | |||
are necessary to prepare the next flight of messages. It then | are necessary to prepare the next flight of messages. It then | |||
buffers them up for transmission (emptying the transmission buffer | buffers them up for transmission (emptying the transmission buffer | |||
first) and enters the SENDING state. | first) and enters the SENDING state. | |||
In the SENDING state, the implementation transmits the buffered | In the SENDING state, the implementation transmits the buffered | |||
flight of messages. If the implementation has received one or more | flight of messages. If the implementation has received one or more | |||
ACKs (see Section 7) from the peer, then it SHOULD omit any messages | ACKs (see Section 7) from the peer, then it SHOULD omit any messages | |||
or message fragments which have already been ACKed. Once the | or message fragments which have already been acknowledged. Once the | |||
messages have been sent, the implementation then sets a retransmit | messages have been sent, the implementation then sets a retransmit | |||
timer and enters the WAITING state. | timer and enters the WAITING state. | |||
There are four ways to exit the WAITING state: | There are four ways to exit the WAITING state: | |||
1. The retransmit timer expires: the implementation transitions to | 1. The retransmit timer expires: the implementation transitions to | |||
the SENDING state, where it retransmits the flight, adjusts and | the SENDING state, where it retransmits the flight, adjusts and | |||
re-arms the retransmit timer (see Section 5.8.2), and returns to | re-arms the retransmit timer (see Section 5.8.2), and returns to | |||
the WAITING state. | the WAITING state. | |||
2. The implementation reads an ACK from the peer: upon receiving an | 2. The implementation reads an ACK from the peer: upon receiving an | |||
ACK for a partial flight (as mentioned in Section 7.1), the | ACK for a partial flight (as mentioned in Section 7.1), the | |||
implementation transitions to the SENDING state, where it | implementation transitions to the SENDING state, where it | |||
retransmits the unacked portion of the flight, adjusts and re- | retransmits the unacknowledged portion of the flight, adjusts and | |||
arms the retransmit timer, and returns to the WAITING state. | re-arms the retransmit timer, and returns to the WAITING state. | |||
Upon receiving an ACK for a complete flight, the implementation | Upon receiving an ACK for a complete flight, the implementation | |||
cancels all retransmissions and either remains in WAITING, or, if | cancels all retransmissions and either remains in WAITING, or, if | |||
the ACK was for the final flight, transitions to FINISHED. | the ACK was for the final flight, transitions to FINISHED. | |||
3. The implementation reads a retransmitted flight from the peer: | 3. The implementation reads a retransmitted flight from the peer | |||
the implementation transitions to the SENDING state, where it | when none of the messages that it sent in response to that flight | |||
retransmits the flight, adjusts and re-arms the retransmit timer, | have been acknowledged: the implementation transitions to the | |||
and returns to the WAITING state. The rationale here is that the | SENDING state, where it retransmits the flight, adjusts and re- | |||
receipt of a duplicate message is the likely result of timer | arms the retransmit timer, and returns to the WAITING state. The | |||
expiry on the peer and therefore suggests that part of one's | rationale here is that the receipt of a duplicate message is the | |||
previous flight was lost. | likely result of timer expiry on the peer and therefore suggests | |||
that part of one's previous flight was lost. | ||||
4. The implementation receives some or all of the next flight of | 4. The implementation receives some or all of the next flight of | |||
messages: if this is the final flight of messages, the | messages: if this is the final flight of messages, the | |||
implementation transitions to FINISHED. If the implementation | implementation transitions to FINISHED. If the implementation | |||
needs to send a new flight, it transitions to the PREPARING | needs to send a new flight, it transitions to the PREPARING | |||
state. Partial reads (whether partial messages or only some of | state. Partial reads (whether partial messages or only some of | |||
the messages in the flight) may also trigger the implementation | the messages in the flight) may also trigger the implementation | |||
to send an ACK, as described in Section 7.1. | to send an ACK, as described in Section 7.1. | |||
Because DTLS clients send the first message (ClientHello), they start | Because DTLS clients send the first message (ClientHello), they start | |||
skipping to change at page 37, line 28 ¶ | skipping to change at line 1610 ¶ | |||
until they have received the Finished message from the peer. | until they have received the Finished message from the peer. | |||
Implementations MAY treat receipt of application data with a new | Implementations MAY treat receipt of application data with a new | |||
epoch prior to receipt of the corresponding Finished message as | epoch prior to receipt of the corresponding Finished message as | |||
evidence of reordering or packet loss and retransmit their final | evidence of reordering or packet loss and retransmit their final | |||
flight immediately, shortcutting the retransmission timer. | flight immediately, shortcutting the retransmission timer. | |||
5.8.2. Timer Values | 5.8.2. Timer Values | |||
The configuration of timer settings varies with implementations, and | The configuration of timer settings varies with implementations, and | |||
certain deployment environments require timer value adjustments. | certain deployment environments require timer value adjustments. | |||
Mishandling of the timer can lead to serious congestion problems, for | Mishandling of the timer can lead to serious congestion problems -- | |||
example if many instances of a DTLS time out early and retransmit too | for example, if many instances of a DTLS time out early and | |||
quickly on a congested link. | retransmit too quickly on a congested link. | |||
Unless implementations have deployment-specific and/or external | Unless implementations have deployment-specific and/or external | |||
information about the round trip time, implementations SHOULD use an | information about the round trip time, implementations SHOULD use an | |||
initial timer value of 1000 ms and double the value at each | initial timer value of 1000 ms and double the value at each | |||
retransmission, up to no less than 60 seconds (the RFC 6298 [RFC6298] | retransmission, up to no less than 60 seconds (the maximum as | |||
maximum). Application specific profiles MAY recommend shorter or | specified in RFC 6298 [RFC6298]). Application-specific profiles MAY | |||
longer timer values. For instance: | recommend shorter or longer timer values. For instance: | |||
* Profiles for specific deployment environments, such as in low- | * Profiles for specific deployment environments, such as in low- | |||
power, multi-hop mesh scenarios as used in some Internet of Things | power, multi-hop mesh scenarios as used in some Internet of Things | |||
(IoT) networks, MAY specify longer timeouts. See | (IoT) networks, MAY specify longer timeouts. See [IOT-PROFILE] | |||
[I-D.ietf-uta-tls13-iot-profile] for more information about one | for more information about one such DTLS 1.3 IoT profile. | |||
such DTLS 1.3 IoT profile. | ||||
* Real-time protocols MAY specify shorter timeouts. It is | * Real-time protocols MAY specify shorter timeouts. It is | |||
RECOMMENDED that for DTLS-SRTP [RFC5764], a default timeout of | RECOMMENDED that for DTLS-SRTP [RFC5764], a default timeout of 400 | |||
400ms be used; because customer experience degrades with one-way | ms be used; because customer experience degrades with one-way | |||
latencies of greater than 200ms, real-time deployments are less | latencies of greater than 200 ms, real-time deployments are less | |||
likely to have long latencies. | likely to have long latencies. | |||
In settings where there is external information (for instance from an | In settings where there is external information (for instance, from | |||
ICE [RFC8445] handshake, or from previous connections to the same | an ICE [RFC8445] handshake, or from previous connections to the same | |||
server) about the RTT, implementations SHOULD use 1.5 times that RTT | server) about the RTT, implementations SHOULD use 1.5 times that RTT | |||
estimate as the retransmit timer. | estimate as the retransmit timer. | |||
Implementations SHOULD retain the current timer value until a message | Implementations SHOULD retain the current timer value until a message | |||
is transmitted and acknowledged without having to be retransmitted, | is transmitted and acknowledged without having to be retransmitted, | |||
at which time the value SHOULD be adjusted to 1.5 times the measured | at which time the value SHOULD be adjusted to 1.5 times the measured | |||
round trip time for that message. After a long period of idleness, | round trip time for that message. After a long period of idleness, | |||
no less than 10 times the current timer value, implementations MAY | no less than 10 times the current timer value, implementations MAY | |||
reset the timer to the initial value. | reset the timer to the initial value. | |||
Note that because retransmission is for the handshake and not | Note that because retransmission is for the handshake and not | |||
dataflow, the effect on congestion of shorter timeouts is smaller | dataflow, the effect on congestion of shorter timeouts is smaller | |||
than in generic protocols such as TCP or QUIC. Experience with DTLS | than in generic protocols such as TCP or QUIC. Experience with DTLS | |||
1.2, which uses a simpler "retransmit everything on timeout" | 1.2, which uses a simpler "retransmit everything on timeout" | |||
approach, has not shown serious congestion problems in practice. | approach, has not shown serious congestion problems in practice. | |||
5.8.3. Large Flight Sizes | 5.8.3. Large Flight Sizes | |||
DTLS does not have any built-in congestion control or rate control; | DTLS does not have any built-in congestion control or rate control; | |||
in general this is not an issue because messages tend to be small. | in general, this is not an issue because messages tend to be small. | |||
However, in principle, some messages - especially Certificate - can | However, in principle, some messages -- especially Certificate -- can | |||
be quite large. If all the messages in a large flight are sent at | be quite large. If all the messages in a large flight are sent at | |||
once, this can result in network congestion. A better strategy is to | once, this can result in network congestion. A better strategy is to | |||
send out only part of the flight, sending more when messages are | send out only part of the flight, sending more when messages are | |||
acknowledged. Several extensions have been standardized to reduce | acknowledged. Several extensions have been standardized to reduce | |||
the size of the certificate message, for example the cached | the size of the Certificate message -- for example, the "cached_info" | |||
information extension [RFC7924], certificate compression [RFC8879] | extension [RFC7924]; certificate compression [RFC8879]; and | |||
and [RFC6066], which defines the "client_certificate_url" extension | [RFC6066], which defines the "client_certificate_url" extension | |||
allowing DTLS clients to send a sequence of Uniform Resource Locators | allowing DTLS clients to send a sequence of Uniform Resource Locators | |||
(URLs) instead of the client certificate. | (URLs) instead of the client certificate. | |||
DTLS stacks SHOULD NOT send more than 10 records in a single | DTLS stacks SHOULD NOT send more than 10 records in a single | |||
transmission. | transmission. | |||
5.8.4. State machine duplication for post-handshake messages | 5.8.4. State Machine Duplication for Post-Handshake Messages | |||
DTLS 1.3 makes use of the following categories of post-handshake | DTLS 1.3 makes use of the following categories of post-handshake | |||
messages: | messages: | |||
1. NewSessionTicket | 1. NewSessionTicket | |||
2. KeyUpdate | 2. KeyUpdate | |||
3. NewConnectionId | 3. NewConnectionId | |||
skipping to change at page 39, line 4 ¶ | skipping to change at line 1680 ¶ | |||
DTLS 1.3 makes use of the following categories of post-handshake | DTLS 1.3 makes use of the following categories of post-handshake | |||
messages: | messages: | |||
1. NewSessionTicket | 1. NewSessionTicket | |||
2. KeyUpdate | 2. KeyUpdate | |||
3. NewConnectionId | 3. NewConnectionId | |||
4. RequestConnectionId | 4. RequestConnectionId | |||
5. Post-handshake client authentication | 5. Post-handshake client authentication | |||
Messages of each category can be sent independently, and reliability | Messages of each category can be sent independently, and reliability | |||
is established via independent state machines each of which behaves | is established via independent state machines, each of which behaves | |||
as described in Section 5.8.1. For example, if a server sends a | as described in Section 5.8.1. For example, if a server sends a | |||
NewSessionTicket and a CertificateRequest message, two independent | NewSessionTicket and a CertificateRequest message, two independent | |||
state machines will be created. | state machines will be created. | |||
As explained in the corresponding sections, sending multiple | Sending multiple instances of messages of a given category without | |||
instances of messages of a given category without having completed | having completed earlier transmissions is allowed for some | |||
earlier transmissions is allowed for some categories, but not for | categories, but not for others. Specifically, a server MAY send | |||
others. Specifically, a server MAY send multiple NewSessionTicket | multiple NewSessionTicket messages at once without awaiting ACKs for | |||
messages at once without awaiting ACKs for earlier NewSessionTicket | earlier NewSessionTicket messages first. Likewise, a server MAY send | |||
first. Likewise, a server MAY send multiple CertificateRequest | multiple CertificateRequest messages at once without having completed | |||
messages at once without having completed earlier client | earlier client authentication requests before. In contrast, | |||
authentication requests before. In contrast, implementations MUST | implementations MUST NOT send KeyUpdate, NewConnectionId, or | |||
NOT send KeyUpdate, NewConnectionId or RequestConnectionId messages | RequestConnectionId messages if an earlier message of the same type | |||
if an earlier message of the same type has not yet been acknowledged. | has not yet been acknowledged. | |||
Note: Except for post-handshake client authentication, which involves | Note: Except for post-handshake client authentication, which | |||
handshake messages in both directions, post-handshake messages are | involves handshake messages in both directions, post-handshake | |||
single-flight, and their respective state machines on the sender side | messages are single-flight, and their respective state machines on | |||
reduce to waiting for an ACK and retransmitting the original message. | the sender side reduce to waiting for an ACK and retransmitting | |||
In particular, note that a RequestConnectionId message does not force | the original message. In particular, note that a | |||
the receiver to send a NewConnectionId message in reply, and both | RequestConnectionId message does not force the receiver to send a | |||
messages are therefore treated independently. | NewConnectionId message in reply, and both messages are therefore | |||
treated independently. | ||||
Creating and correctly updating multiple state machines requires | Creating and correctly updating multiple state machines requires | |||
feedback from the handshake logic to the state machine layer, | feedback from the handshake logic to the state machine layer, | |||
indicating which message belongs to which state machine. For | indicating which message belongs to which state machine. For | |||
example, if a server sends multiple CertificateRequest messages and | example, if a server sends multiple CertificateRequest messages and | |||
receives a Certificate message in response, the corresponding state | receives a Certificate message in response, the corresponding state | |||
machine can only be determined after inspecting the | machine can only be determined after inspecting the | |||
certificate_request_context field. Similarly, a server sending a | certificate_request_context field. Similarly, a server sending a | |||
single CertificateRequest and receiving a NewConnectionId message in | single CertificateRequest and receiving a NewConnectionId message in | |||
response can only decide that the NewConnectionId message should be | response can only decide that the NewConnectionId message should be | |||
treated through an independent state machine after inspecting the | treated through an independent state machine after inspecting the | |||
handshake message type. | handshake message type. | |||
5.9. CertificateVerify and Finished Messages | 5.9. Cryptographic Label Prefix | |||
CertificateVerify and Finished messages have the same format as in | ||||
TLS 1.3. Hash calculations include entire handshake messages, | ||||
including DTLS-specific fields: message_seq, fragment_offset, and | ||||
fragment_length. However, in order to remove sensitivity to | ||||
handshake message fragmentation, the CertificateVerify and the | ||||
Finished messages MUST be computed as if each handshake message had | ||||
been sent as a single fragment following the algorithm described in | ||||
Section 4.4.3 and Section 4.4.4 of [TLS13], respectively. | ||||
5.10. Cryptographic Label Prefix | ||||
Section 7.1 of [TLS13] specifies that HKDF-Expand-Label uses a label | Section 7.1 of [TLS13] specifies that HKDF-Expand-Label uses a label | |||
prefix of "tls13 ". For DTLS 1.3, that label SHALL be "dtls13". | prefix of "tls13 ". For DTLS 1.3, that label SHALL be "dtls13". | |||
This ensures key separation between DTLS 1.3 and TLS 1.3. Note that | This ensures key separation between DTLS 1.3 and TLS 1.3. Note that | |||
there is no trailing space; this is necessary in order to keep the | there is no trailing space; this is necessary in order to keep the | |||
overall label size inside of one hash iteration because "DTLS" is one | overall label size inside of one hash iteration because "DTLS" is one | |||
letter longer than "TLS". | letter longer than "TLS". | |||
5.11. Alert Messages | 5.10. Alert Messages | |||
Note that Alert messages are not retransmitted at all, even when they | Note that alert messages are not retransmitted at all, even when they | |||
occur in the context of a handshake. However, a DTLS implementation | occur in the context of a handshake. However, a DTLS implementation | |||
which would ordinarily issue an alert SHOULD generate a new alert | which would ordinarily issue an alert SHOULD generate a new alert | |||
message if the offending record is received again (e.g., as a | message if the offending record is received again (e.g., as a | |||
retransmitted handshake message). Implementations SHOULD detect when | retransmitted handshake message). Implementations SHOULD detect when | |||
a peer is persistently sending bad messages and terminate the local | a peer is persistently sending bad messages and terminate the local | |||
connection state after such misbehavior is detected. Note that | connection state after such misbehavior is detected. Note that | |||
alerts are not reliably transmitted; implementation SHOULD NOT depend | alerts are not reliably transmitted; implementations SHOULD NOT | |||
on receiving alerts in order to signal errors or connection closure. | depend on receiving alerts in order to signal errors or connection | |||
closure. | ||||
5.12. Establishing New Associations with Existing Parameters | Any data received with an epoch/sequence number pair after that of a | |||
valid received closure alert MUST be ignored. Note: this is a change | ||||
from TLS 1.3 which depends on the order of receipt rather than the | ||||
epoch and sequence number. | ||||
5.11. Establishing New Associations with Existing Parameters | ||||
If a DTLS client-server pair is configured in such a way that | If a DTLS client-server pair is configured in such a way that | |||
repeated connections happen on the same host/port quartet, then it is | repeated connections happen on the same host/port quartet, then it is | |||
possible that a client will silently abandon one connection and then | possible that a client will silently abandon one connection and then | |||
initiate another with the same parameters (e.g., after a reboot). | initiate another with the same parameters (e.g., after a reboot). | |||
This will appear to the server as a new handshake with epoch=0. In | This will appear to the server as a new handshake with epoch=0. In | |||
cases where a server believes it has an existing association on a | cases where a server believes it has an existing association on a | |||
given host/port quartet and it receives an epoch=0 ClientHello, it | given host/port quartet and it receives an epoch=0 ClientHello, it | |||
SHOULD proceed with a new handshake but MUST NOT destroy the existing | SHOULD proceed with a new handshake but MUST NOT destroy the existing | |||
association until the client has demonstrated reachability either by | association until the client has demonstrated reachability either by | |||
completing a cookie exchange or by completing a complete handshake | completing a cookie exchange or by completing a complete handshake | |||
including delivering a verifiable Finished message. After a correct | including delivering a verifiable Finished message. After a correct | |||
Finished message is received, the server MUST abandon the previous | Finished message is received, the server MUST abandon the previous | |||
association to avoid confusion between two valid associations with | association to avoid confusion between two valid associations with | |||
overlapping epochs. The reachability requirement prevents off-path/ | overlapping epochs. The reachability requirement prevents off-path/ | |||
blind attackers from destroying associations merely by sending forged | blind attackers from destroying associations merely by sending forged | |||
ClientHellos. | ClientHellos. | |||
Note: it is not always possible to distinguish which association a | Note: It is not always possible to distinguish which association a | |||
given record is from. For instance, if the client performs a | given record is from. For instance, if the client performs a | |||
handshake, abandons the connection, and then immediately starts a new | handshake, abandons the connection, and then immediately starts a | |||
handshake, it may not be possible to tell which connection a given | new handshake, it may not be possible to tell which connection a | |||
protected record is for. In these cases, trial decryption may be | given protected record is for. In these cases, trial decryption | |||
necessary, though implementations could use CIDs to avoid the 5- | may be necessary, though implementations could use CIDs to avoid | |||
tuple-based ambiguity. | the 5-tuple-based ambiguity. | |||
6. Example of Handshake with Timeout and Retransmission | 6. Example of Handshake with Timeout and Retransmission | |||
The following is an example of a handshake with lost packets and | The following is an example of a handshake with lost packets and | |||
retransmissions. Note that the client sends an empty ACK message | retransmissions. Note that the client sends an empty ACK message | |||
because it can only acknowledge Record 2 sent by the server once it | because it can only acknowledge Record 2 sent by the server once it | |||
has processed messages in Record 0 needed to establish epoch 2 keys, | has processed messages in Record 0 needed to establish epoch 2 keys, | |||
which are needed to encrypt or decrypt messages found in Record 2. | which are needed to encrypt or decrypt messages found in Record 2. | |||
Section 7 provides the necessary background details for this | Section 7 provides the necessary background details for this | |||
interaction. Note: for simplicity we are not re-setting record | interaction. Note: For simplicity, we are not resetting record | |||
numbers in this diagram, so "Record 1" is really "Epoch 2, Record 0, | numbers in this diagram, so "Record 1" is really "Epoch 2, Record 0", | |||
etc.". | etc. | |||
Client Server | Client Server | |||
------ ------ | ------ ------ | |||
Record 0 --------> | Record 0 --------> | |||
ClientHello | ClientHello | |||
(message_seq=0) | (message_seq=0) | |||
X<----- Record 0 | X<----- Record 0 | |||
(lost) ServerHello | (lost) ServerHello | |||
skipping to change at page 42, line 29 ¶ | skipping to change at line 1837 ¶ | |||
Certificate | Certificate | |||
(message_seq=1) | (message_seq=1) | |||
CertificateVerify | CertificateVerify | |||
(message_seq=2) | (message_seq=2) | |||
Finished | Finished | |||
(message_seq=3) | (message_seq=3) | |||
<-------- Record 5 | <-------- Record 5 | |||
ACK [2] | ACK [2] | |||
Figure 12: Example DTLS exchange illustrating message loss | Figure 12: Example DTLS Exchange Illustrating Message Loss | |||
6.1. Epoch Values and Rekeying | 6.1. Epoch Values and Rekeying | |||
A recipient of a DTLS message needs to select the correct keying | A recipient of a DTLS message needs to select the correct keying | |||
material in order to process an incoming message. With the | material in order to process an incoming message. With the | |||
possibility of message loss and re-ordering, an identifier is needed | possibility of message loss and reordering, an identifier is needed | |||
to determine which cipher state has been used to protect the record | to determine which cipher state has been used to protect the record | |||
payload. The epoch value fulfills this role in DTLS. In addition to | payload. The epoch value fulfills this role in DTLS. In addition to | |||
the TLS 1.3-defined key derivation steps, see Section 7 of [TLS13], a | the TLS 1.3-defined key derivation steps (see Section 7 of [TLS13]), | |||
sender may want to rekey at any time during the lifetime of the | a sender may want to rekey at any time during the lifetime of the | |||
connection. It therefore needs to indicate that it is updating its | connection. It therefore needs to indicate that it is updating its | |||
sending cryptographic keys. | sending cryptographic keys. | |||
This version of DTLS assigns dedicated epoch values to messages in | This version of DTLS assigns dedicated epoch values to messages in | |||
the protocol exchange to allow identification of the correct cipher | the protocol exchange to allow identification of the correct cipher | |||
state: | state: | |||
* epoch value (0) is used with unencrypted messages. There are | * Epoch value (0) is used with unencrypted messages. There are | |||
three unencrypted messages in DTLS, namely ClientHello, | three unencrypted messages in DTLS, namely ClientHello, | |||
ServerHello, and HelloRetryRequest. | ServerHello, and HelloRetryRequest. | |||
* epoch value (1) is used for messages protected using keys derived | * Epoch value (1) is used for messages protected using keys derived | |||
from client_early_traffic_secret. Note this epoch is skipped if | from client_early_traffic_secret. Note that this epoch is skipped | |||
the client does not offer early data. | if the client does not offer early data. | |||
* epoch value (2) is used for messages protected using keys derived | * Epoch value (2) is used for messages protected using keys derived | |||
from [sender]_handshake_traffic_secret. Messages transmitted | from [sender]_handshake_traffic_secret. Messages transmitted | |||
during the initial handshake, such as EncryptedExtensions, | during the initial handshake, such as EncryptedExtensions, | |||
CertificateRequest, Certificate, CertificateVerify, and Finished | CertificateRequest, Certificate, CertificateVerify, and Finished, | |||
belong to this category. Note, however, post-handshake are | belong to this category. Note, however, that post-handshake | |||
protected under the appropriate application traffic key and are | messages are protected under the appropriate application traffic | |||
not included in this category. | key and are not included in this category. | |||
* epoch value (3) is used for payloads protected using keys derived | * Epoch value (3) is used for payloads protected using keys derived | |||
from the initial [sender]_application_traffic_secret_0. This may | from the initial [sender]_application_traffic_secret_0. This may | |||
include handshake messages, such as post-handshake messages (e.g., | include handshake messages, such as post-handshake messages (e.g., | |||
a NewSessionTicket message). | a NewSessionTicket message). | |||
* epoch value (4 to 2^16-1) is used for payloads protected using | * Epoch values (4 to 2^64-1) are used for payloads protected using | |||
keys from the [sender]_application_traffic_secret_N (N>0). | keys from the [sender]_application_traffic_secret_N (N>0). | |||
Using these reserved epoch values a receiver knows what cipher state | Using these reserved epoch values, a receiver knows what cipher state | |||
has been used to encrypt and integrity protect a message. | has been used to encrypt and integrity protect a message. | |||
Implementations that receive a record with an epoch value for which | Implementations that receive a record with an epoch value for which | |||
no corresponding cipher state can be determined SHOULD handle it as a | no corresponding cipher state can be determined SHOULD handle it as a | |||
record which fails deprotection. | record which fails deprotection. | |||
Note that epoch values do not wrap. If a DTLS implementation would | Note that epoch values do not wrap. If a DTLS implementation would | |||
need to wrap the epoch value, it MUST terminate the connection. | need to wrap the epoch value, it MUST terminate the connection. | |||
The traffic key calculation is described in Section 7.3 of [TLS13]. | The traffic key calculation is described in Section 7.3 of [TLS13]. | |||
skipping to change at page 44, line 48 ¶ | skipping to change at line 1951 ¶ | |||
Some time later ... | Some time later ... | |||
(Rekeying) | (Rekeying) | |||
Record 5 | Record 5 | |||
<-------- [Application Data] | <-------- [Application Data] | |||
(epoch=4) | (epoch=4) | |||
Record 5 | Record 5 | |||
[Application Data] --------> | [Application Data] --------> | |||
(epoch=4) | (epoch=4) | |||
Figure 13: Example DTLS exchange with epoch information | Figure 13: Example DTLS Exchange with Epoch Information | |||
7. ACK Message | 7. ACK Message | |||
The ACK message is used by an endpoint to indicate which handshake | The ACK message is used by an endpoint to indicate which handshake | |||
records it has received and processed from the other side. ACK is | records it has received and processed from the other side. ACK is | |||
not a handshake message but is rather a separate content type, with | not a handshake message but is rather a separate content type, with | |||
code point TBD (proposed, 25). This avoids having ACK being added to | code point 26. This avoids having ACK being added to the handshake | |||
the handshake transcript. Note that ACKs can still be sent in the | transcript. Note that ACKs can still be sent in the same UDP | |||
same UDP datagram as handshake records. | datagram as handshake records. | |||
struct { | struct { | |||
RecordNumber record_numbers<0..2^16-1>; | RecordNumber record_numbers<0..2^16-1>; | |||
} ACK; | } ACK; | |||
record_numbers: a list of the records containing handshake messages | record_numbers: A list of the records containing handshake messages | |||
in the current flight which the endpoint has received and either | in the current flight which the endpoint has received and either | |||
processed or buffered, in numerically increasing order. | processed or buffered, in numerically increasing order. | |||
Implementations MUST NOT acknowledge records containing handshake | Implementations MUST NOT acknowledge records containing handshake | |||
messages or fragments which have not been processed or buffered. | messages or fragments which have not been processed or buffered. | |||
Otherwise, deadlock can ensue. As an example, implementations MUST | Otherwise, deadlock can ensue. As an example, implementations MUST | |||
NOT send ACKs for handshake messages which they discard because they | NOT send ACKs for handshake messages which they discard because they | |||
are not the next expected message. | are not the next expected message. | |||
During the handshake, ACKs only cover the current outstanding flight | During the handshake, ACKs only cover the current outstanding flight | |||
(this is possible because DTLS is generally a lockstep protocol). In | (this is possible because DTLS is generally a lock-step protocol). | |||
particular, receiving a message from a handshake flight implicitly | In particular, receiving a message from a handshake flight implicitly | |||
acknowledges all messages from the previous flight(s). Accordingly, | acknowledges all messages from the previous flight(s). Accordingly, | |||
an ACK from the server would not cover both the ClientHello and the | an ACK from the server would not cover both the ClientHello and the | |||
client's Certificate, because the ClientHello and client Certificate | client's Certificate message, because the ClientHello and client | |||
are in different flights. Implementations can accomplish this by | Certificate are in different flights. Implementations can accomplish | |||
clearing their ACK list upon receiving the start of the next flight. | this by clearing their ACK list upon receiving the start of the next | |||
flight. | ||||
After the handshake, ACKs SHOULD be sent once for each received and | For post-handshake messages, ACKs SHOULD be sent once for each | |||
processed handshake record (potentially subject to some delay) and | received and processed handshake record (potentially subject to some | |||
MAY cover more than one flight. This includes records containing | delay) and MAY cover more than one flight. This includes records | |||
messages which are discarded because a previous copy has been | containing messages which are discarded because a previous copy has | |||
received. | been received. | |||
During the handshake, ACK records MUST be sent with an epoch that is | During the handshake, ACK records MUST be sent with an epoch which is | |||
equal to or higher than the record which is being acknowledged. Note | equal to or higher than the record which is being acknowledged. Note | |||
that some care is required when processing flights spanning multiple | that some care is required when processing flights spanning multiple | |||
epochs. For instance, if the client receives only the Server Hello | epochs. For instance, if the client receives only the ServerHello | |||
and Certificate and wishes to ACK them in a single record, it must do | and Certificate and wishes to ACK them in a single record, it must do | |||
so in epoch 2, as it is required to use an epoch greater than or | so in epoch 2, as it is required to use an epoch greater than or | |||
equal to 2 and cannot yet send with any greater epoch. | equal to 2 and cannot yet send with any greater epoch. | |||
Implementations SHOULD simply use the highest current sending epoch, | Implementations SHOULD simply use the highest current sending epoch, | |||
which will generally be the highest available. After the handshake, | which will generally be the highest available. After the handshake, | |||
implementations MUST use the highest available sending epoch. | implementations MUST use the highest available sending epoch. | |||
7.1. Sending ACKs | 7.1. Sending ACKs | |||
When an implementation detects a disruption in the receipt of the | When an implementation detects a disruption in the receipt of the | |||
skipping to change at page 46, line 23 ¶ | skipping to change at line 2021 ¶ | |||
* When they receive a message or fragment which is out of order, | * When they receive a message or fragment which is out of order, | |||
either because it is not the next expected message or because it | either because it is not the next expected message or because it | |||
is not the next piece of the current message. | is not the next piece of the current message. | |||
* When they have received part of a flight and do not immediately | * When they have received part of a flight and do not immediately | |||
receive the rest of the flight (which may be in the same UDP | receive the rest of the flight (which may be in the same UDP | |||
datagram). "Immediately" is hard to define. One approach is to | datagram). "Immediately" is hard to define. One approach is to | |||
set a timer for 1/4 the current retransmit timer value when the | set a timer for 1/4 the current retransmit timer value when the | |||
first record in the flight is received and then send an ACK when | first record in the flight is received and then send an ACK when | |||
that timer expires. Note: the 1/4 value here is somewhat | that timer expires. Note: The 1/4 value here is somewhat | |||
arbitrary. Given that the round trip estimates in the DTLS | arbitrary. Given that the round trip estimates in the DTLS | |||
handshake are generally very rough (or the default), any value | handshake are generally very rough (or the default), any value | |||
will be an approximation, and there is an inherent compromise due | will be an approximation, and there is an inherent compromise due | |||
to competition between retransmision due to over-agressive ACKing | to competition between retransmission due to over-aggressive | |||
and over-aggressive timeout-based retransmission. As a comparison | ACKing and over-aggressive timeout-based retransmission. As a | |||
point, QUIC's loss-based recovery algorithms | comparison point, QUIC's loss-based recovery algorithms | |||
([I-D.ietf-quic-recovery]; Section 6.1.2) work out to a delay of | ([RFC9002], Section 6.1.2) work out to a delay of about 1/3 of the | |||
about 1/3 of the retransmit timer. | retransmit timer. | |||
In general, flights MUST be ACKed unless they are implicitly | In general, flights MUST be ACKed unless they are implicitly | |||
acknowledged. In the present specification the following flights are | acknowledged. In the present specification, the following flights | |||
implicitly acknowledged by the receipt of the next flight, which | are implicitly acknowledged by the receipt of the next flight, which | |||
generally immediately follows the flight, | generally immediately follows the flight: | |||
1. Handshake flights other than the client's final flight of the | 1. Handshake flights other than the client's final flight of the | |||
main handshake. | main handshake. | |||
2. The server's post-handshake CertificateRequest. | 2. The server's post-handshake CertificateRequest. | |||
ACKs SHOULD NOT be sent for these flights unless the responding | ACKs SHOULD NOT be sent for these flights unless the responding | |||
flight cannot be generated immediately. In this case, | flight cannot be generated immediately. All other flights MUST be | |||
implementations MAY send explicit ACKs for the complete received | ACKed. In this case, implementations MAY send explicit ACKs for the | |||
flight even though it will eventually also be implicitly acknowledged | complete received flight even though it will eventually also be | |||
through the responding flight. A notable example for this is the | implicitly acknowledged through the responding flight. A notable | |||
case of client authentication in constrained environments, where | example for this is the case of client authentication in constrained | |||
generating the CertificateVerify message can take considerable time | environments, where generating the CertificateVerify message can take | |||
on the client. All other flights MUST be ACKed. Implementations MAY | considerable time on the client. Implementations MAY acknowledge the | |||
acknowledge the records corresponding to each transmission of each | records corresponding to each transmission of each flight or simply | |||
flight or simply acknowledge the most recent one. In general, | acknowledge the most recent one. In general, implementations SHOULD | |||
implementations SHOULD ACK as many received packets as can fit into | ACK as many received packets as can fit into the ACK record, as this | |||
the ACK record, as this provides the most complete information and | provides the most complete information and thus reduces the chance of | |||
thus reduces the chance of spurious retransmission; if space is | spurious retransmission; if space is limited, implementations SHOULD | |||
limited, implementations SHOULD favor including records which have | favor including records which have not yet been acknowledged. | |||
not yet been acknowledged. | ||||
Note: While some post-handshake messages follow a request/response | Note: While some post-handshake messages follow a request/response | |||
pattern, this does not necessarily imply receipt. For example, a | pattern, this does not necessarily imply receipt. For example, a | |||
KeyUpdate sent in response to a KeyUpdate with request_update set to | KeyUpdate sent in response to a KeyUpdate with request_update set | |||
'update_requested' does not implicitly acknowledge the earlier | to "update_requested" does not implicitly acknowledge the earlier | |||
KeyUpdate message because the two KeyUpdate messages might have | KeyUpdate message because the two KeyUpdate messages might have | |||
crossed in flight. | crossed in flight. | |||
ACKs MUST NOT be sent for other records of any content type other | ACKs MUST NOT be sent for records of any content type other than | |||
than handshake or for records which cannot be unprotected. | handshake or for records which cannot be deprotected. | |||
Note that in some cases it may be necessary to send an ACK which does | Note that in some cases it may be necessary to send an ACK which does | |||
not contain any record numbers. For instance, a client might receive | not contain any record numbers. For instance, a client might receive | |||
an EncryptedExtensions message prior to receiving a ServerHello. | an EncryptedExtensions message prior to receiving a ServerHello. | |||
Because it cannot decrypt the EncryptedExtensions, it cannot safely | Because it cannot decrypt the EncryptedExtensions, it cannot safely | |||
acknowledge it (as it might be damaged). If the client does not send | acknowledge it (as it might be damaged). If the client does not send | |||
an ACK, the server will eventually retransmit its first flight, but | an ACK, the server will eventually retransmit its first flight, but | |||
this might take far longer than the actual round trip time between | this might take far longer than the actual round trip time between | |||
client and server. Having the client send an empty ACK shortcuts | client and server. Having the client send an empty ACK shortcuts | |||
this process. | this process. | |||
7.2. Receiving ACKs | 7.2. Receiving ACKs | |||
When an implementation receives an ACK, it SHOULD record that the | When an implementation receives an ACK, it SHOULD record that the | |||
messages or message fragments sent in the records being ACKed were | messages or message fragments sent in the records being ACKed were | |||
received and omit them from any future retransmissions. Upon receipt | received and omit them from any future retransmissions. Upon receipt | |||
of an ACK that leaves it with only some messages from a flight having | of an ACK that leaves it with only some messages from a flight having | |||
been acknowledged an implementation SHOULD retransmit the | been acknowledged, an implementation SHOULD retransmit the | |||
unacknowledged messages or fragments. Note that this requires | unacknowledged messages or fragments. Note that this requires | |||
implementations to track which messages appear in which records. | implementations to track which messages appear in which records. | |||
Once all the messages in a flight have been acknowledged, the | Once all the messages in a flight have been acknowledged, the | |||
implementation MUST cancel all retransmissions of that flight. | implementation MUST cancel all retransmissions of that flight. | |||
Implementations MUST treat a record as having been acknowledged if it | Implementations MUST treat a record as having been acknowledged if it | |||
appears in any ACK; this prevents spurious retransmission in cases | appears in any ACK; this prevents spurious retransmission in cases | |||
where a flight is very large and the receiver is forced to elide | where a flight is very large and the receiver is forced to elide | |||
acknowledgements for records which have already been ACKed. As noted | acknowledgements for records which have already been ACKed. As noted | |||
above, the receipt of any record responding to a given flight MUST be | above, the receipt of any record responding to a given flight MUST be | |||
taken as an implicit acknowledgement for the entire flight to which | taken as an implicit acknowledgement for the entire flight to which | |||
it is responding. | it is responding. | |||
7.3. Design Rationale | 7.3. Design Rationale | |||
ACK messages are used in two circumstances, namely : | ACK messages are used in two circumstances, namely: | |||
* on sign of disruption, or lack of progress, and | * On sign of disruption, or lack of progress; and | |||
* to indicate complete receipt of the last flight in a handshake. | * To indicate complete receipt of the last flight in a handshake. | |||
In the first case the use of the ACK message is optional because the | In the first case, the use of the ACK message is optional, because | |||
peer will retransmit in any case and therefore the ACK just allows | the peer will retransmit in any case and therefore the ACK just | |||
for selective or early retransmission, as opposed to the timeout- | allows for selective or early retransmission, as opposed to the | |||
based whole flight retransmission in previous versions of DTLS. When | timeout-based whole flight retransmission in previous versions of | |||
DTLS 1.3 is used in deployments with lossy networks, such as low- | DTLS. When DTLS 1.3 is used in deployments with lossy networks, such | |||
power, long range radio networks as well as low-power mesh networks, | as low-power, long-range radio networks as well as low-power mesh | |||
the use of ACKs is recommended. | networks, the use of ACKs is recommended. | |||
The use of the ACK for the second case is mandatory for the proper | The use of the ACK for the second case is mandatory for the proper | |||
functioning of the protocol. For instance, the ACK message sent by | functioning of the protocol. For instance, the ACK message sent by | |||
the client in Figure 13, acknowledges receipt and processing of | the client in Figure 13 acknowledges receipt and processing of Record | |||
record 4 (containing the NewSessionTicket message) and if it is not | 4 (containing the NewSessionTicket message), and if it is not sent, | |||
sent the server will continue retransmission of the NewSessionTicket | the server will continue retransmission of the NewSessionTicket | |||
indefinitely until its maximum retransmission count is reached. | indefinitely until its maximum retransmission count is reached. | |||
8. Key Updates | 8. Key Updates | |||
As with TLS 1.3, DTLS 1.3 implementations send a KeyUpdate message to | As with TLS 1.3, DTLS 1.3 implementations send a KeyUpdate message to | |||
indicate that they are updating their sending keys. As with other | indicate that they are updating their sending keys. As with other | |||
handshake messages with no built-in response, KeyUpdates MUST be | handshake messages with no built-in response, KeyUpdates MUST be | |||
acknowledged. In order to facilitate epoch reconstruction | acknowledged. In order to facilitate epoch reconstruction | |||
Section 4.2.2 implementations MUST NOT send records with the new keys | (Section 4.2.2), implementations MUST NOT send records with the new | |||
or send a new KeyUpdate until the previous KeyUpdate has been | keys or send a new KeyUpdate until the previous KeyUpdate has been | |||
acknowledged (this avoids having too many epochs in active use). | acknowledged (this avoids having too many epochs in active use). | |||
Due to loss and/or re-ordering, DTLS 1.3 implementations may receive | Due to loss and/or reordering, DTLS 1.3 implementations may receive a | |||
a record with an older epoch than the current one (the requirements | record with an older epoch than the current one (the requirements | |||
above preclude receiving a newer record). They SHOULD attempt to | above preclude receiving a newer record). They SHOULD attempt to | |||
process those records with that epoch (see Section 4.2.2 for | process those records with that epoch (see Section 4.2.2 for | |||
information on determining the correct epoch), but MAY opt to discard | information on determining the correct epoch) but MAY opt to discard | |||
such out-of-epoch records. | such out-of-epoch records. | |||
Due to the possibility of an ACK message for a KeyUpdate being lost | Due to the possibility of an ACK message for a KeyUpdate being lost | |||
and thereby preventing the sender of the KeyUpdate from updating its | and thereby preventing the sender of the KeyUpdate from updating its | |||
keying material, receivers MUST retain the pre-update keying material | keying material, receivers MUST retain the pre-update keying material | |||
until receipt and successful decryption of a message using the new | until receipt and successful decryption of a message using the new | |||
keys. | keys. | |||
Figure 14 shows an example exchange illustrating that a successful | Figure 14 shows an example exchange illustrating that successful ACK | |||
ACK processing updates the keys of the KeyUpdate message sender, | processing updates the keys of the KeyUpdate message sender, which is | |||
which is reflected in the change of epoch values. | reflected in the change of epoch values. | |||
Client Server | Client Server | |||
/-------------------------------------------\ | /-------------------------------------------\ | |||
| | | | | | |||
| Initial Handshake | | | Initial Handshake | | |||
\-------------------------------------------/ | \-------------------------------------------/ | |||
[Application Data] --------> | [Application Data] --------> | |||
(epoch=3) | (epoch=3) | |||
skipping to change at page 49, line 37 ¶ | skipping to change at line 2173 ¶ | |||
[Application Data] --------> | [Application Data] --------> | |||
(epoch=3) | (epoch=3) | |||
[KeyUpdate] | [KeyUpdate] | |||
(+ update_requested --------> | (+ update_requested --------> | |||
(epoch 3) | (epoch 3) | |||
<-------- [Application Data] | <-------- [Application Data] | |||
(epoch=3) | (epoch=3) | |||
[Ack] | [ACK] | |||
<-------- (epoch=3) | <-------- (epoch=3) | |||
[Application Data] | [Application Data] | |||
(epoch=4) --------> | (epoch=4) --------> | |||
<-------- [KeyUpdate] | <-------- [KeyUpdate] | |||
(epoch=3) | (epoch=3) | |||
[Ack] --------> | [ACK] --------> | |||
(epoch=4) | (epoch=4) | |||
<-------- [Application Data] | <-------- [Application Data] | |||
(epoch=4) | (epoch=4) | |||
Figure 14: Example DTLS Key Update | Figure 14: Example DTLS Key Update | |||
With a 128-bit key as in AES-128, rekeying 2^64 times has a high | ||||
probability of key reuse within a given connection. Note that even | ||||
if the key repeats, the IV is also independently generated. In order | ||||
to provide an extra margin of security, sending implementations MUST | ||||
NOT allow the epoch to exceed 2^48-1. In order to allow this value | ||||
to be changed later, receiving implementations MUST NOT enforce this | ||||
rule. If a sending implementation receives a KeyUpdate with | ||||
request_update set to "update_requested", it MUST NOT send its own | ||||
KeyUpdate if that would cause it to exceed these limits and SHOULD | ||||
instead ignore the "update_requested" flag. Note: this overrides the | ||||
requirement in TLS 1.3 to always send a KeyUpdate in response to | ||||
"update_requested". | ||||
9. Connection ID Updates | 9. Connection ID Updates | |||
If the client and server have negotiated the "connection_id" | If the client and server have negotiated the "connection_id" | |||
extension [I-D.ietf-tls-dtls-connection-id], either side can send a | extension [RFC9146], either side can send a new CID that it wishes | |||
new CID which it wishes the other side to use in a NewConnectionId | the other side to use in a NewConnectionId message. | |||
message. | ||||
enum { | enum { | |||
cid_immediate(0), cid_spare(1), (255) | cid_immediate(0), cid_spare(1), (255) | |||
} ConnectionIdUsage; | } ConnectionIdUsage; | |||
opaque ConnectionId<0..2^8-1>; | opaque ConnectionId<0..2^8-1>; | |||
struct { | struct { | |||
ConnectionIds cids<0..2^16-1>; | ConnectionId cids<0..2^16-1>; | |||
ConnectionIdUsage usage; | ConnectionIdUsage usage; | |||
} NewConnectionId; | } NewConnectionId; | |||
cid Indicates the set of CIDs which the sender wishes the peer to | cids: Indicates the set of CIDs that the sender wishes the peer to | |||
use. | use. | |||
usage Indicates whether the new CIDs should be used immediately or | usage: Indicates whether the new CIDs should be used immediately or | |||
are spare. If usage is set to "cid_immediate", then one of the | are spare. If usage is set to "cid_immediate", then one of the | |||
new CID MUST be used immediately for all future records. If it is | new CIDs MUST be used immediately for all future records. If it | |||
set to "cid_spare", then either existing or new CID MAY be used. | is set to "cid_spare", then either an existing or new CID MAY be | |||
used. | ||||
Endpoints SHOULD use receiver-provided CIDs in the order they were | Endpoints SHOULD use receiver-provided CIDs in the order they were | |||
provided. Implementations which receive more spare CIDs than they | provided. Implementations which receive more spare CIDs than they | |||
wish to maintain MAY simply discard any extra CIDs. Endpoints MUST | wish to maintain MAY simply discard any extra CIDs. Endpoints MUST | |||
NOT have more than one NewConnectionId message outstanding. | NOT have more than one NewConnectionId message outstanding. | |||
Implementations which either did not negotiate the "connection_id" | Implementations which either did not negotiate the "connection_id" | |||
extension or which have negotiated receiving an empty CID MUST NOT | extension or which have negotiated receiving an empty CID MUST NOT | |||
send NewConnectionId. Implementations MUST NOT send | send NewConnectionId. Implementations MUST NOT send | |||
RequestConnectionId when sending an empty Connection ID. | RequestConnectionId when sending an empty Connection ID. | |||
Implementations which detect a violation of these rules MUST | Implementations which detect a violation of these rules MUST | |||
terminate the connection with an "unexpected_message" alert. | terminate the connection with an "unexpected_message" alert. | |||
Implementations SHOULD use a new CID whenever sending on a new path, | Implementations SHOULD use a new CID whenever sending on a new path | |||
and SHOULD request new CIDs for this purpose if path changes are | and SHOULD request new CIDs for this purpose if path changes are | |||
anticipated. | anticipated. | |||
struct { | struct { | |||
uint8 num_cids; | uint8 num_cids; | |||
} RequestConnectionId; | } RequestConnectionId; | |||
num_cids The number of CIDs desired. | num_cids: The number of CIDs desired. | |||
Endpoints SHOULD respond to RequestConnectionId by sending a | Endpoints SHOULD respond to RequestConnectionId by sending a | |||
NewConnectionId with usage "cid_spare" containing num_cid CIDs soon | NewConnectionId with usage "cid_spare" containing num_cids CIDs as | |||
as possible. Endpoints MUST NOT send a RequestConnectionId message | soon as possible. Endpoints MUST NOT send a RequestConnectionId | |||
when an existing request is still unfulfilled; this implies that | message when an existing request is still unfulfilled; this implies | |||
endpoints needs to request new CIDs well in advance. An endpoint MAY | that endpoints need to request new CIDs well in advance. An endpoint | |||
handle requests, which it considers excessive, by responding with a | MAY handle requests which it considers excessive by responding with a | |||
NewConnectionId message containing fewer than num_cid CIDs, including | NewConnectionId message containing fewer than num_cids CIDs, | |||
no CIDs at all. Endpoints MAY handle an excessive number of | including no CIDs at all. Endpoints MAY handle an excessive number | |||
RequestConnectionId messages by terminating the connection using a | of RequestConnectionId messages by terminating the connection using a | |||
"too_many_cids_requested" (alert number 52) alert. | "too_many_cids_requested" (alert number 52) alert. | |||
Endpoints MUST NOT send either of these messages if they did not | Endpoints MUST NOT send either of these messages if they did not | |||
negotiate a CID. If an implementation receives these messages when | negotiate a CID. If an implementation receives these messages when | |||
CIDs were not negotiated, it MUST abort the connection with an | CIDs were not negotiated, it MUST abort the connection with an | |||
unexpected_message alert. | "unexpected_message" alert. | |||
9.1. Connection ID Example | 9.1. Connection ID Example | |||
Below is an example exchange for DTLS 1.3 using a single CID in each | Below is an example exchange for DTLS 1.3 using a single CID in each | |||
direction. | direction. | |||
Note: The connection_id extension is defined in | Note: The "connection_id" extension, which is used in ClientHello | |||
[I-D.ietf-tls-dtls-connection-id], which is used in ClientHello and | and ServerHello messages, is defined in [RFC9146]. | |||
ServerHello messages. | ||||
Client Server | Client Server | |||
------ ------ | ------ ------ | |||
ClientHello | ClientHello | |||
(connection_id=5) | (connection_id=5) | |||
--------> | --------> | |||
<-------- HelloRetryRequest | <-------- HelloRetryRequest | |||
(cookie) | (cookie) | |||
ClientHello --------> | ClientHello --------> | |||
(connection_id=5) | (connection_id=5) | |||
+cookie | + cookie | |||
<-------- ServerHello | <-------- ServerHello | |||
(connection_id=100) | (connection_id=100) | |||
EncryptedExtensions | EncryptedExtensions | |||
(cid=5) | (cid=5) | |||
Certificate | Certificate | |||
(cid=5) | (cid=5) | |||
CertificateVerify | CertificateVerify | |||
(cid=5) | (cid=5) | |||
Finished | Finished | |||
(cid=5) | (cid=5) | |||
Certificate --------> | Certificate --------> | |||
(cid=100) | (cid=100) | |||
CertificateVerify | CertificateVerify | |||
(cid=100) | (cid=100) | |||
Finished | Finished | |||
(cid=100) | (cid=100) | |||
<-------- Ack | <-------- ACK | |||
(cid=5) | (cid=5) | |||
Application Data ========> | Application Data ========> | |||
(cid=100) | (cid=100) | |||
<======== Application Data | <======== Application Data | |||
(cid=5) | (cid=5) | |||
Figure 15: Example DTLS 1.3 Exchange with CIDs | Figure 15: Example DTLS 1.3 Exchange with CIDs | |||
If no CID is negotiated, then the receiver MUST reject any records it | If no CID is negotiated, then the receiver MUST reject any records it | |||
skipping to change at page 53, line 31 ¶ | skipping to change at line 2345 ¶ | |||
that do not use the cookie exchange may be used as attack amplifiers | that do not use the cookie exchange may be used as attack amplifiers | |||
even if they themselves are not experiencing DoS. Therefore, DTLS | even if they themselves are not experiencing DoS. Therefore, DTLS | |||
servers SHOULD use the cookie exchange unless there is good reason to | servers SHOULD use the cookie exchange unless there is good reason to | |||
believe that amplification is not a threat in their environment. | believe that amplification is not a threat in their environment. | |||
Clients MUST be prepared to do a cookie exchange with every | Clients MUST be prepared to do a cookie exchange with every | |||
handshake. | handshake. | |||
Some key properties required of the cookie for the cookie-exchange | Some key properties required of the cookie for the cookie-exchange | |||
mechanism to be functional are described in Section 3.3 of [RFC2522]: | mechanism to be functional are described in Section 3.3 of [RFC2522]: | |||
* the cookie MUST depend on the client's address. | * The cookie MUST depend on the client's address. | |||
* it MUST NOT be possible for anyone other than the issuing entity | * It MUST NOT be possible for anyone other than the issuing entity | |||
to generate cookies that are accepted as valid by that entity. | to generate cookies that are accepted as valid by that entity. | |||
This typically entails an integrity check based on a secret key. | This typically entails an integrity check based on a secret key. | |||
* cookie generation and verification are triggered by | * Cookie generation and verification are triggered by | |||
unauthenticated parties, and as such their resource consumption | unauthenticated parties, and as such their resource consumption | |||
needs to be restrained in order to avoid having the cookie- | needs to be restrained in order to avoid having the cookie- | |||
exchange mechanism itself serve as a DoS vector. | exchange mechanism itself serve as a DoS vector. | |||
Although the cookie must allow the server to produce the right | Although the cookie must allow the server to produce the right | |||
handshake transcript, it SHOULD be constructed so that knowledge of | handshake transcript, it SHOULD be constructed so that knowledge of | |||
the cookie is insufficient to reproduce the ClientHello contents. | the cookie is insufficient to reproduce the ClientHello contents. | |||
Otherwise, this may create problems with future extensions such as | Otherwise, this may create problems with future extensions such as | |||
[I-D.ietf-tls-esni]. | Encrypted Client Hello [TLS-ECH]. | |||
When cookies are generated using a keyed authentication mechanism it | When cookies are generated using a keyed authentication mechanism, it | |||
should be possible to rotate the associated secret key, so that | should be possible to rotate the associated secret key, so that | |||
temporary compromise of the key does not permanently compromise the | temporary compromise of the key does not permanently compromise the | |||
integrity of the cookie-exchange mechanism. Though this secret is | integrity of the cookie-exchange mechanism. Though this secret is | |||
not as high-value as, e.g., a session-ticket-encryption key, rotating | not as high-value as, e.g., a session-ticket-encryption key, rotating | |||
the cookie-generation key on a similar timescale would ensure that | the cookie-generation key on a similar timescale would ensure that | |||
the key-rotation functionality is exercised regularly and thus in | the key rotation functionality is exercised regularly and thus in | |||
working order. | working order. | |||
The cookie exchange provides address validation during the initial | The cookie exchange provides address validation during the initial | |||
handshake. DTLS with Connection IDs allows for endpoint addresses to | handshake. DTLS with Connection IDs allows for endpoint addresses to | |||
change during the association; any such updated addresses are not | change during the association; any such updated addresses are not | |||
covered by the cookie exchange during the handshake. DTLS | covered by the cookie exchange during the handshake. DTLS | |||
implementations MUST NOT update the address they send to in response | implementations MUST NOT update the address they send to in response | |||
to packets from a different address unless they first perform some | to packets from a different address unless they first perform some | |||
reachability test; no such test is defined in this specification. | reachability test; no such test is defined in this specification and | |||
Even with such a test, an active on-path adversary can also black- | a future specification would need to specify a complete procedure for | |||
hole traffic or create a reflection attack against third parties | how and when to update addresses. Even with such a test, an active | |||
because a DTLS peer has no means to distinguish a genuine address | on-path adversary can also black-hole traffic or create a reflection | |||
update event (for example, due to a NAT rebinding) from one that is | attack against third parties because a DTLS peer has no means to | |||
malicious. This attack is of concern when there is a large asymmetry | distinguish a genuine address update event (for example, due to a NAT | |||
of request/response message sizes. | rebinding) from one that is malicious. This attack is of concern | |||
when there is a large asymmetry of request/response message sizes. | ||||
With the exception of order protection and non-replayability, the | With the exception of order protection and non-replayability, the | |||
security guarantees for DTLS 1.3 are the same as TLS 1.3. While TLS | security guarantees for DTLS 1.3 are the same as TLS 1.3. While TLS | |||
always provides order protection and non-replayability, DTLS does not | always provides order protection and non-replayability, DTLS does not | |||
provide order protection and may not provide replay protection. | provide order protection and may not provide replay protection. | |||
Unlike TLS implementations, DTLS implementations SHOULD NOT respond | Unlike TLS implementations, DTLS implementations SHOULD NOT respond | |||
to invalid records by terminating the connection. | to invalid records by terminating the connection. | |||
TLS 1.3 requires replay protection for 0-RTT data (or rather, for | TLS 1.3 requires replay protection for 0-RTT data (or rather, for | |||
connections that use 0-RTT data; see Section 8 of [TLS13]). DTLS | connections that use 0-RTT data; see Section 8 of [TLS13]). DTLS | |||
provides an optional per-record replay-protection mechanism, since | provides an optional per-record replay-protection mechanism, since | |||
datagram protocols are inherently subject to message reordering and | datagram protocols are inherently subject to message reordering and | |||
replay. These two replay-protection mechanisms are orthogonal, and | replay. These two replay-protection mechanisms are orthogonal, and | |||
neither mechanism meets the requirements for the other. | neither mechanism meets the requirements for the other. | |||
The security and privacy properties of the CID for DTLS 1.3 builds on | DTLS 1.3's handshake transcript does not include the new DTLS fields, | |||
top of what is described for DTLS 1.2 in | which makes it have the same format as TLS 1.3. However, the DTLS | |||
[I-D.ietf-tls-dtls-connection-id]. There are, however, several | 1.3 and TLS 1.3 transcripts are disjoint because they use different | |||
differences: | version numbers. Additionally, the DTLS 1.3 key schedule uses a | |||
different label and so will produce different keys for the same | ||||
transcript. | ||||
* In both versions of DTLS extension negotiation is used to agree on | The security and privacy properties of the CID for DTLS 1.3 build on | |||
the use of the CID feature and the CID values. In both versions | top of what is described for DTLS 1.2 in [RFC9146]. There are, | |||
the CID is carried in the DTLS record header (if negotiated). | however, several differences: | |||
However, the way the CID is included in the record header differs | ||||
between the two versions. | ||||
* The use of the Post-Handshake message allows the client and the | * In both versions of DTLS, extension negotiation is used to agree | |||
server to update their CIDs and those values are exchanged with | on the use of the CID feature and the CID values. In both | |||
versions, the CID is carried in the DTLS record header (if | ||||
negotiated). However, the way the CID is included in the record | ||||
header differs between the two versions. | ||||
* The use of the post-handshake message allows the client and the | ||||
server to update their CIDs, and those values are exchanged with | ||||
confidentiality protection. | confidentiality protection. | |||
* The ability to use multiple CIDs allows for improved privacy | * The ability to use multiple CIDs allows for improved privacy | |||
properties in multi-homed scenarios. When only a single CID is in | properties in multihomed scenarios. When only a single CID is in | |||
use on multiple paths from such a host, an adversary can correlate | use on multiple paths from such a host, an adversary can correlate | |||
the communication interaction across paths, which adds further | the communication interaction across paths, which adds further | |||
privacy concerns. In order to prevent this, implementations | privacy concerns. In order to prevent this, implementations | |||
SHOULD attempt to use fresh CIDs whenever they change local | SHOULD attempt to use fresh CIDs whenever they change local | |||
addresses or ports (though this is not always possible to detect). | addresses or ports (though this is not always possible to detect). | |||
The RequestConnectionId message can be used by a peer to ask for | The RequestConnectionId message can be used by a peer to ask for | |||
new CIDs to ensure that a pool of suitable CIDs is available. | new CIDs to ensure that a pool of suitable CIDs is available. | |||
* The mechanism for encrypting sequence numbers (Section 4.2.3) | * The mechanism for encrypting sequence numbers (Section 4.2.3) | |||
prevents trivial tracking by on-path adversaries that attempt to | prevents trivial tracking by on-path adversaries that attempt to | |||
skipping to change at page 55, line 37 ¶ | skipping to change at line 2454 ¶ | |||
* DTLS 1.3 encrypts handshake messages much earlier than in previous | * DTLS 1.3 encrypts handshake messages much earlier than in previous | |||
DTLS versions. Therefore, less information identifying the DTLS | DTLS versions. Therefore, less information identifying the DTLS | |||
client, such as the client certificate, is available to an on-path | client, such as the client certificate, is available to an on-path | |||
adversary. | adversary. | |||
12. Changes since DTLS 1.2 | 12. Changes since DTLS 1.2 | |||
Since TLS 1.3 introduces a large number of changes with respect to | Since TLS 1.3 introduces a large number of changes with respect to | |||
TLS 1.2, the list of changes from DTLS 1.2 to DTLS 1.3 is equally | TLS 1.2, the list of changes from DTLS 1.2 to DTLS 1.3 is equally | |||
large. For this reason this section focuses on the most important | large. For this reason, this section focuses on the most important | |||
changes only. | changes only. | |||
* New handshake pattern, which leads to a shorter message exchange | * New handshake pattern, which leads to a shorter message exchange. | |||
* Only AEAD ciphers are supported. Additional data calculation has | * Only AEAD ciphers are supported. Additional data calculation has | |||
been simplified. | been simplified. | |||
* Removed support for weaker and older cryptographic algorithms | * Removed support for weaker and older cryptographic algorithms. | |||
* HelloRetryRequest of TLS 1.3 used instead of HelloVerifyRequest | * HelloRetryRequest of TLS 1.3 used instead of HelloVerifyRequest. | |||
* More flexible ciphersuite negotiation | * More flexible cipher suite negotiation. | |||
* New session resumption mechanism | * New session resumption mechanism. | |||
* PSK authentication redefined | ||||
* PSK authentication redefined. | ||||
* New key derivation hierarchy utilizing a new key derivation | * New key derivation hierarchy utilizing a new key derivation | |||
construct | construct. | |||
* Improved version negotiation | * Improved version negotiation. | |||
* Optimized record layer encoding and thereby its size | * Optimized record layer encoding and thereby its size. | |||
* Added CID functionality | * Added CID functionality. | |||
* Sequence numbers are encrypted. | * Sequence numbers are encrypted. | |||
13. Updates affecting DTLS 1.2 | 13. Updates Affecting DTLS 1.2 | |||
This document defines several changes that optionally affect | This document defines several changes that optionally affect | |||
implementations of DTLS 1.2, including those which do not also | implementations of DTLS 1.2, including those which do not also | |||
support DTLS 1.3. | support DTLS 1.3. | |||
* A version downgrade protection mechanism as described in [TLS13]; | * A version downgrade protection mechanism as described in [TLS13], | |||
Section 4.1.3 and applying to DTLS as described in Section 5.3. | Section 4.1.3 and applying to DTLS as described in Section 5.3. | |||
* The updates described in [TLS13]; Section 3. | * The updates described in [TLS13], Section 1.3. | |||
* The new compliance requirements described in [TLS13]; Section 9.3. | * The new compliance requirements described in [TLS13], Section 9.3. | |||
14. IANA Considerations | 14. IANA Considerations | |||
IANA is requested to allocate a new value in the "TLS ContentType" | IANA has allocated the content type value 26 in the "TLS ContentType" | |||
registry for the ACK message, defined in Section 7, with content type | registry for the ACK message, defined in Section 7. The value for | |||
26. The value for the "DTLS-OK" column is "Y". IANA is requested to | the "DTLS-OK" column is "Y". IANA has reserved the content type | |||
reserve the content type range 32-63 so that content types in this | range 32-63 so that content types in this range are not allocated. | |||
range are not allocated. | ||||
IANA is requested to allocate "the too_many_cids_requested" alert in | IANA has allocated value 52 for the "too_many_cids_requested" alert | |||
the "TLS Alerts" registry with value 52. | in the "TLS Alerts" registry. The value for the "DTLS-OK" column is | |||
"Y". | ||||
IANA is requested to allocate two values in the "TLS Handshake Type" | IANA has allocated two values in the "TLS HandshakeType" registry, | |||
registry, defined in [TLS13], for RequestConnectionId (TBD), and | defined in [TLS13], for request_connection_id (9) and | |||
NewConnectionId (TBD), as defined in this document. The value for | new_connection_id (10), as defined in this document. The value for | |||
the "DTLS-OK" columns are "Y". | the "DTLS-OK" column is "Y". | |||
IANA is requested to add this RFC as a reference to the TLS Cipher | IANA has added this RFC as a reference to the "TLS Cipher Suites" | |||
Suite Registry along with the following Note: | registry along with the following Note: | |||
Any TLS cipher suite that is specified for use with DTLS MUST | | Any TLS cipher suite that is specified for use with DTLS MUST | |||
define limits on the use of the associated AEAD function that | | define limits on the use of the associated AEAD function that | |||
preserves margins for both confidentiality and integrity, | | preserves margins for both confidentiality and integrity, as | |||
as specified in [THIS RFC; Section TODO] | | specified in Section 4.5.3 of RFC 9147. | |||
15. References | 15. References | |||
15.1. Normative References | 15.1. Normative References | |||
[CHACHA] Nir, Y. and A. Langley, "ChaCha20 and Poly1305 for IETF | [CHACHA] Nir, Y. and A. Langley, "ChaCha20 and Poly1305 for IETF | |||
Protocols", RFC 8439, DOI 10.17487/RFC8439, June 2018, | Protocols", RFC 8439, DOI 10.17487/RFC8439, June 2018, | |||
<https://www.rfc-editor.org/info/rfc8439>. | <https://www.rfc-editor.org/info/rfc8439>. | |||
[I-D.ietf-tls-dtls-connection-id] | ||||
Rescorla, E., Tschofenig, H., Fossati, T., and A. Kraus, | ||||
"Connection Identifiers for DTLS 1.2", Work in Progress, | ||||
Internet-Draft, draft-ietf-tls-dtls-connection-id-11, 14 | ||||
April 2021, <https://www.ietf.org/internet-drafts/draft- | ||||
ietf-tls-dtls-connection-id-11.txt>. | ||||
[RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | [RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | |||
DOI 10.17487/RFC0768, August 1980, | DOI 10.17487/RFC0768, August 1980, | |||
<https://www.rfc-editor.org/info/rfc768>. | <https://www.rfc-editor.org/info/rfc768>. | |||
[RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
<https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
[RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | |||
DOI 10.17487/RFC1191, November 1990, | DOI 10.17487/RFC1191, November 1990, | |||
skipping to change at page 58, line 14 ¶ | skipping to change at line 2564 ¶ | |||
[RFC6298] Paxson, V., Allman, M., Chu, J., and M. Sargent, | [RFC6298] Paxson, V., Allman, M., Chu, J., and M. Sargent, | |||
"Computing TCP's Retransmission Timer", RFC 6298, | "Computing TCP's Retransmission Timer", RFC 6298, | |||
DOI 10.17487/RFC6298, June 2011, | DOI 10.17487/RFC6298, June 2011, | |||
<https://www.rfc-editor.org/info/rfc6298>. | <https://www.rfc-editor.org/info/rfc6298>. | |||
[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/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[RFC9146] Rescorla, E., Ed., Tschofenig, H., Ed., Fossati, T., and | ||||
A. Kraus, "Connection Identifier for DTLS 1.2", RFC 9146, | ||||
DOI 10.17487/RFC9146, March 2022, | ||||
<https://www.rfc-editor.org/info/rfc9146>. | ||||
[TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
15.2. Informative References | 15.2. Informative References | |||
[AEAD-LIMITS] | ||||
Günther, F., Thomson, M., and C.A. Wood, "Usage Limits on | ||||
AEAD Algorithms", Work in Progress, Internet-Draft, draft- | ||||
irtf-cfrg-aead-limits-03, 12 July 2021, | ||||
<https://datatracker.ietf.org/doc/html/draft-irtf-cfrg- | ||||
aead-limits-03>. | ||||
[AEBounds] Luykx, A. and K. Paterson, "Limits on Authenticated | [AEBounds] Luykx, A. and K. Paterson, "Limits on Authenticated | |||
Encryption Use in TLS", 8 March 2016, | Encryption Use in TLS", 28 August 2017, | |||
<http://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | <https://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | |||
[CCM-ANALYSIS] | [CCM-ANALYSIS] | |||
Jonsson, J., "On the Security of CTR + CBC-MAC", Selected | Jonsson, J., "On the Security of CTR + CBC-MAC", Selected | |||
Areas in Cryptography pp. 76-93, | Areas in Cryptography pp. 76-93, | |||
DOI 10.1007/3-540-36492-7_7, 2003, | DOI 10.1007/3-540-36492-7_7, February 2003, | |||
<https://doi.org/10.1007/3-540-36492-7_7>. | <https://doi.org/10.1007/3-540-36492-7_7>. | |||
[DEPRECATE] | [DEPRECATE] | |||
Moriarty, K. and S. Farrell, "Deprecating TLSv1.0 and | Moriarty, K. and S. Farrell, "Deprecating TLS 1.0 and TLS | |||
TLSv1.1", Work in Progress, Internet-Draft, draft-ietf- | 1.1", BCP 195, RFC 8996, DOI 10.17487/RFC8996, March 2021, | |||
tls-oldversions-deprecate-12, 21 January 2021, | <https://www.rfc-editor.org/info/rfc8996>. | |||
<http://www.ietf.org/internet-drafts/draft-ietf-tls- | ||||
oldversions-deprecate-12.txt>. | ||||
[I-D.ietf-quic-recovery] | ||||
Iyengar, J. and I. Swett, "QUIC Loss Detection and | ||||
Congestion Control", Work in Progress, Internet-Draft, | ||||
draft-ietf-quic-recovery-34, 14 January 2021, | ||||
<https://www.ietf.org/internet-drafts/draft-ietf-quic- | ||||
recovery-34.txt>. | ||||
[I-D.ietf-tls-esni] | ||||
Rescorla, E., Oku, K., Sullivan, N., and C. Wood, "TLS | ||||
Encrypted Client Hello", Work in Progress, Internet-Draft, | ||||
draft-ietf-tls-esni-10, 8 March 2021, | ||||
<https://www.ietf.org/internet-drafts/draft-ietf-tls-esni- | ||||
10.txt>. | ||||
[I-D.ietf-uta-tls13-iot-profile] | [IOT-PROFILE] | |||
Tschofenig, H. and T. Fossati, "TLS/DTLS 1.3 Profiles for | Tschofenig, H. and T. Fossati, "TLS/DTLS 1.3 Profiles for | |||
the Internet of Things", Work in Progress, Internet-Draft, | the Internet of Things", Work in Progress, Internet-Draft, | |||
draft-ietf-uta-tls13-iot-profile-01, 22 February 2021, | draft-ietf-uta-tls13-iot-profile-04, 7 March 2022, | |||
<https://www.ietf.org/internet-drafts/draft-ietf-uta- | <https://datatracker.ietf.org/doc/html/draft-ietf-uta- | |||
tls13-iot-profile-01.txt>. | tls13-iot-profile-04>. | |||
[RFC2522] Karn, P. and W. Simpson, "Photuris: Session-Key Management | [RFC2522] Karn, P. and W. Simpson, "Photuris: Session-Key Management | |||
Protocol", RFC 2522, DOI 10.17487/RFC2522, March 1999, | Protocol", RFC 2522, DOI 10.17487/RFC2522, March 1999, | |||
<https://www.rfc-editor.org/info/rfc2522>. | <https://www.rfc-editor.org/info/rfc2522>. | |||
[RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)", | [RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)", | |||
RFC 4303, DOI 10.17487/RFC4303, December 2005, | RFC 4303, DOI 10.17487/RFC4303, December 2005, | |||
<https://www.rfc-editor.org/info/rfc4303>. | <https://www.rfc-editor.org/info/rfc4303>. | |||
[RFC4340] Kohler, E., Handley, M., and S. Floyd, "Datagram | [RFC4340] Kohler, E., Handley, M., and S. Floyd, "Datagram | |||
skipping to change at page 61, line 9 ¶ | skipping to change at line 2698 ¶ | |||
[RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive | [RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive | |||
Connectivity Establishment (ICE): A Protocol for Network | Connectivity Establishment (ICE): A Protocol for Network | |||
Address Translator (NAT) Traversal", RFC 8445, | Address Translator (NAT) Traversal", RFC 8445, | |||
DOI 10.17487/RFC8445, July 2018, | DOI 10.17487/RFC8445, July 2018, | |||
<https://www.rfc-editor.org/info/rfc8445>. | <https://www.rfc-editor.org/info/rfc8445>. | |||
[RFC8879] Ghedini, A. and V. Vasiliev, "TLS Certificate | [RFC8879] Ghedini, A. and V. Vasiliev, "TLS Certificate | |||
Compression", RFC 8879, DOI 10.17487/RFC8879, December | Compression", RFC 8879, DOI 10.17487/RFC8879, December | |||
2020, <https://www.rfc-editor.org/info/rfc8879>. | 2020, <https://www.rfc-editor.org/info/rfc8879>. | |||
[RFC9000] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | ||||
Multiplexed and Secure Transport", RFC 9000, | ||||
DOI 10.17487/RFC9000, May 2021, | ||||
<https://www.rfc-editor.org/info/rfc9000>. | ||||
[RFC9002] Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | ||||
and Congestion Control", RFC 9002, DOI 10.17487/RFC9002, | ||||
May 2021, <https://www.rfc-editor.org/info/rfc9002>. | ||||
[ROBUST] Fischlin, M., Günther, F., and C. Janson, "Robust | [ROBUST] Fischlin, M., Günther, F., and C. Janson, "Robust | |||
Channels: Handling Unreliable Networks in the Record | Channels: Handling Unreliable Networks in the Record | |||
Layers of QUIC and DTLS 1.3", 15 June 2020, | Layers of QUIC and DTLS 1.3", received 15 June 2020, last | |||
revised 22 February 2021, | ||||
<https://eprint.iacr.org/2020/718>. | <https://eprint.iacr.org/2020/718>. | |||
[TLS-ECH] Rescorla, E., Oku, K., Sullivan, N., and C.A. Wood, "TLS | ||||
Encrypted Client Hello", Work in Progress, Internet-Draft, | ||||
draft-ietf-tls-esni-11, 7 July 2021, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-tls- | ||||
esni-11>. | ||||
Appendix A. Protocol Data Structures and Constant Values | Appendix A. Protocol Data Structures and Constant Values | |||
This section provides the normative protocol types and constants | This section provides the normative protocol types and constants | |||
definitions. | definitions. | |||
A.1. Record Layer | A.1. Record Layer | |||
struct { | ||||
ContentType type; | ||||
ProtocolVersion legacy_record_version; | ||||
uint16 epoch = 0 | ||||
uint48 sequence_number; | ||||
uint16 length; | ||||
opaque fragment[DTLSPlaintext.length]; | ||||
} DTLSPlaintext; | ||||
struct { | struct { | |||
opaque content[DTLSPlaintext.length]; | ContentType type; | |||
ContentType type; | ProtocolVersion legacy_record_version; | |||
uint8 zeros[length_of_padding]; | uint16 epoch = 0 | |||
} DTLSInnerPlaintext; | uint48 sequence_number; | |||
uint16 length; | ||||
opaque fragment[DTLSPlaintext.length]; | ||||
} DTLSPlaintext; | ||||
struct { | struct { | |||
opaque unified_hdr[variable]; | opaque content[DTLSPlaintext.length]; | |||
opaque encrypted_record[length]; | ContentType type; | |||
} DTLSCiphertext; | uint8 zeros[length_of_padding]; | |||
} DTLSInnerPlaintext; | ||||
0 1 2 3 4 5 6 7 | struct { | |||
+-+-+-+-+-+-+-+-+ | opaque unified_hdr[variable]; | |||
|0|0|1|C|S|L|E E| | opaque encrypted_record[length]; | |||
+-+-+-+-+-+-+-+-+ | } DTLSCiphertext; | |||
| Connection ID | Legend: | ||||
| (if any, | | ||||
/ length as / C - Connection ID (CID) present | ||||
| negotiated) | S - Sequence number length | ||||
+-+-+-+-+-+-+-+-+ L - Length present | ||||
| 8 or 16 bit | E - Epoch | ||||
|Sequence Number| | ||||
+-+-+-+-+-+-+-+-+ | ||||
| 16 bit Length | | ||||
| (if present) | | ||||
+-+-+-+-+-+-+-+-+ | ||||
struct { | 0 1 2 3 4 5 6 7 | |||
uint16 epoch; | +-+-+-+-+-+-+-+-+ | |||
uint48 sequence_number; | |0|0|1|C|S|L|E E| | |||
} RecordNumber; | +-+-+-+-+-+-+-+-+ | |||
| Connection ID | Legend: | ||||
| (if any, | | ||||
/ length as / C - Connection ID (CID) present | ||||
| negotiated) | S - Sequence number length | ||||
+-+-+-+-+-+-+-+-+ L - Length present | ||||
| 8 or 16 bit | E - Epoch | ||||
|Sequence Number| | ||||
+-+-+-+-+-+-+-+-+ | ||||
| 16 bit Length | | ||||
| (if present) | | ||||
+-+-+-+-+-+-+-+-+ | ||||
struct { | ||||
uint64 epoch; | ||||
uint64 sequence_number; | ||||
} RecordNumber; | ||||
A.2. Handshake Protocol | A.2. Handshake Protocol | |||
enum { | ||||
hello_request_RESERVED(0), | ||||
client_hello(1), | ||||
server_hello(2), | ||||
hello_verify_request_RESERVED(3), | ||||
new_session_ticket(4), | ||||
end_of_early_data(5), | ||||
hello_retry_request_RESERVED(6), | ||||
encrypted_extensions(8), | ||||
certificate(11), | ||||
server_key_exchange_RESERVED(12), | ||||
certificate_request(13), | ||||
server_hello_done_RESERVED(14), | ||||
certificate_verify(15), | ||||
client_key_exchange_RESERVED(16), | ||||
finished(20), | ||||
certificate_url_RESERVED(21), | ||||
certificate_status_RESERVED(22), | ||||
supplemental_data_RESERVED(23), | ||||
key_update(24), | ||||
message_hash(254), | ||||
(255) | ||||
} HandshakeType; | ||||
struct { | enum { | |||
HandshakeType msg_type; /* handshake type */ | hello_request_RESERVED(0), | |||
uint24 length; /* bytes in message */ | client_hello(1), | |||
uint16 message_seq; /* DTLS-required field */ | server_hello(2), | |||
uint24 fragment_offset; /* DTLS-required field */ | hello_verify_request_RESERVED(3), | |||
uint24 fragment_length; /* DTLS-required field */ | new_session_ticket(4), | |||
select (msg_type) { | end_of_early_data(5), | |||
case client_hello: ClientHello; | hello_retry_request_RESERVED(6), | |||
case server_hello: ServerHello; | encrypted_extensions(8), | |||
case end_of_early_data: EndOfEarlyData; | request_connection_id(9), /* New */ | |||
case encrypted_extensions: EncryptedExtensions; | new_connection_id(10), /* New */ | |||
case certificate_request: CertificateRequest; | certificate(11), | |||
case certificate: Certificate; | server_key_exchange_RESERVED(12), | |||
case certificate_verify: CertificateVerify; | certificate_request(13), | |||
case finished: Finished; | server_hello_done_RESERVED(14), | |||
case new_session_ticket: NewSessionTicket; | certificate_verify(15), | |||
case key_update: KeyUpdate; | client_key_exchange_RESERVED(16), | |||
} body; | finished(20), | |||
} Handshake; | certificate_url_RESERVED(21), | |||
certificate_status_RESERVED(22), | ||||
supplemental_data_RESERVED(23), | ||||
key_update(24), | ||||
message_hash(254), | ||||
(255) | ||||
} HandshakeType; | ||||
uint16 ProtocolVersion; | struct { | |||
opaque Random[32]; | HandshakeType msg_type; /* handshake type */ | |||
uint24 length; /* bytes in message */ | ||||
uint16 message_seq; /* DTLS-required field */ | ||||
uint24 fragment_offset; /* DTLS-required field */ | ||||
uint24 fragment_length; /* DTLS-required field */ | ||||
select (msg_type) { | ||||
case client_hello: ClientHello; | ||||
case server_hello: ServerHello; | ||||
case end_of_early_data: EndOfEarlyData; | ||||
case encrypted_extensions: EncryptedExtensions; | ||||
case certificate_request: CertificateRequest; | ||||
case certificate: Certificate; | ||||
case certificate_verify: CertificateVerify; | ||||
case finished: Finished; | ||||
case new_session_ticket: NewSessionTicket; | ||||
case key_update: KeyUpdate; | ||||
case request_connection_id: RequestConnectionId; | ||||
case new_connection_id: NewConnectionId; | ||||
} body; | ||||
} Handshake; | ||||
uint8 CipherSuite[2]; /* Cryptographic suite selector */ | uint16 ProtocolVersion; | |||
struct { | opaque Random[32]; | |||
ProtocolVersion legacy_version = { 254,253 }; // DTLSv1.2 | ||||
Random random; | uint8 CipherSuite[2]; /* Cryptographic suite selector */ | |||
opaque legacy_session_id<0..32>; | ||||
opaque legacy_cookie<0..2^8-1>; // DTLS | struct { | |||
CipherSuite cipher_suites<2..2^16-2>; | ProtocolVersion legacy_version = { 254,253 }; // DTLSv1.2 | |||
opaque legacy_compression_methods<1..2^8-1>; | Random random; | |||
Extension extensions<8..2^16-1>; | opaque legacy_session_id<0..32>; | |||
} ClientHello; | opaque legacy_cookie<0..2^8-1>; // DTLS | |||
CipherSuite cipher_suites<2..2^16-2>; | ||||
opaque legacy_compression_methods<1..2^8-1>; | ||||
Extension extensions<8..2^16-1>; | ||||
} ClientHello; | ||||
A.3. ACKs | A.3. ACKs | |||
struct { | struct { | |||
RecordNumber record_numbers<0..2^16-1>; | RecordNumber record_numbers<0..2^16-1>; | |||
} ACK; | } ACK; | |||
A.4. Connection ID Management | A.4. Connection ID Management | |||
enum { | enum { | |||
cid_immediate(0), cid_spare(1), (255) | cid_immediate(0), cid_spare(1), (255) | |||
} ConnectionIdUsage; | } ConnectionIdUsage; | |||
opaque ConnectionId<0..2^8-1>; | opaque ConnectionId<0..2^8-1>; | |||
struct { | struct { | |||
ConnectionIds cids<0..2^16-1>; | ConnectionId cids<0..2^16-1>; | |||
ConnectionIdUsage usage; | ConnectionIdUsage usage; | |||
} NewConnectionId; | } NewConnectionId; | |||
struct { | struct { | |||
uint8 num_cids; | uint8 num_cids; | |||
} RequestConnectionId; | } RequestConnectionId; | |||
Appendix B. Analysis of Limits on CCM Usage | Appendix B. Analysis of Limits on CCM Usage | |||
TLS [TLS13] and [AEBounds] do not specify limits on key usage for | TLS [TLS13] and [AEBounds] do not specify limits on key usage for | |||
AEAD_AES_128_CCM. However, any AEAD that is used with DTLS requires | AEAD_AES_128_CCM. However, any AEAD that is used with DTLS requires | |||
limits on use that ensure that both confidentiality and integrity are | limits on use that ensure that both confidentiality and integrity are | |||
preserved. This section documents that analysis for | preserved. This section documents that analysis for | |||
AEAD_AES_128_CCM. | AEAD_AES_128_CCM. | |||
[CCM-ANALYSIS] is used as the basis of this analysis. The results of | [CCM-ANALYSIS] is used as the basis of this analysis. The results of | |||
that analysis are used to derive usage limits that are based on those | that analysis are used to derive usage limits that are based on those | |||
chosen in [TLS13]. | chosen in [TLS13]. | |||
This analysis uses symbols for multiplication (*), division (/), and | This analysis uses symbols for multiplication (*), division (/), and | |||
exponentiation (^), plus parentheses for establishing precedence. | exponentiation (^), plus parentheses for establishing precedence. | |||
The following symbols are also used: | The following symbols are also used: | |||
t: The size of the authentication tag in bits. For this cipher, t | t: The size of the authentication tag in bits. For this cipher, t | |||
is 128. | is 128. | |||
n: The size of the block function in bits. For this cipher, n is | n: The size of the block function in bits. For this cipher, n is | |||
128. | 128. | |||
l: The number of blocks in each packet (see below). | l: The number of blocks in each packet (see below). | |||
q: The number of genuine packets created and protected by endpoints. | q: The number of genuine packets created and protected by endpoints. | |||
This value is the bound on the number of packets that can be | This value is the bound on the number of packets that can be | |||
protected before updating keys. | protected before updating keys. | |||
v: The number of forged packets that endpoints will accept. This | v: The number of forged packets that endpoints will accept. This | |||
value is the bound on the number of forged packets that an | value is the bound on the number of forged packets that an | |||
endpoint can reject before updating keys. | endpoint can reject before updating keys. | |||
The analysis of AEAD_AES_128_CCM relies on a count of the number of | The analysis of AEAD_AES_128_CCM relies on a count of the number of | |||
block operations involved in producing each message. For simplicity, | block operations involved in producing each message. For simplicity, | |||
and to match the analysis of other AEAD functions in [AEBounds], this | and to match the analysis of other AEAD functions in [AEBounds], this | |||
analysis assumes a packet length of 2^10 blocks and a packet size | analysis assumes a packet length of 2^10 blocks and a packet size | |||
limit of 2^14 bytes. | limit of 2^14 bytes. | |||
For AEAD_AES_128_CCM, the total number of block cipher operations is | For AEAD_AES_128_CCM, the total number of block cipher operations is | |||
the sum of: the length of the associated data in blocks, the length | the sum of: the length of the associated data in blocks, the length | |||
of the ciphertext in blocks, and the length of the plaintext in | of the ciphertext in blocks, and the length of the plaintext in | |||
blocks, plus 1. In this analysis, this is simplified to a value of | blocks, plus 1. In this analysis, this is simplified to a value of | |||
twice the maximum length of a record in blocks (that is, "2l = | twice the maximum length of a record in blocks (that is, 2l = 2^11). | |||
2^11"). This simplification is based on the associated data being | This simplification is based on the associated data being limited to | |||
limited to one block. | one block. | |||
B.1. Confidentiality Limits | B.1. Confidentiality Limits | |||
For confidentiality, Theorem 2 in [CCM-ANALYSIS] establishes that an | For confidentiality, Theorem 2 in [CCM-ANALYSIS] establishes that an | |||
attacker gains a distinguishing advantage over an ideal pseudorandom | attacker gains a distinguishing advantage over an ideal pseudorandom | |||
permutation (PRP) of no more than: | permutation (PRP) of no more than: | |||
(2l * q)^2 / 2^n | (2l * q)^2 / 2^n | |||
For a target advantage of 2^-60, which matches that used by [TLS13], | For a target advantage in a single-key setting of 2^-60, which | |||
this results in the relation: | matches that used by TLS 1.3, as summarized in [AEAD-LIMITS], this | |||
results in the relation: | ||||
q <= 2^23 | q <= 2^23 | |||
That is, endpoints cannot protect more than 2^23 packets with the | That is, endpoints cannot protect more than 2^23 packets with the | |||
same set of keys without causing an attacker to gain an larger | same set of keys without causing an attacker to gain a larger | |||
advantage than the target of 2^-60. | advantage than the target of 2^-60. | |||
B.2. Integrity Limits | B.2. Integrity Limits | |||
For integrity, Theorem 1 in [CCM-ANALYSIS] establishes that an | For integrity, Theorem 1 in [CCM-ANALYSIS] establishes that an | |||
attacker gains an advantage over an ideal PRP of no more than: | attacker gains an advantage over an ideal PRP of no more than: | |||
v / 2^t + (2l * (v + q))^2 / 2^n | v / 2^t + (2l * (v + q))^2 / 2^n | |||
The goal is to limit this advantage to 2^-57, to match the target in | The goal is to limit this advantage to 2^-57, to match the target in | |||
[TLS13]. As "t" and "n" are both 128, the first term is negligible | TLS 1.3, as summarized in [AEAD-LIMITS]. As t and n are both 128, | |||
relative to the second, so that term can be removed without a | the first term is negligible relative to the second, so that term can | |||
significant effect on the result. This produces the relation: | be removed without a significant effect on the result. This produces | |||
the relation: | ||||
v + q <= 2^24.5 | v + q <= 2^24.5 | |||
Using the previously-established value of 2^23 for "q" and rounding, | Using the previously established value of 2^23 for q and rounding, | |||
this leads to an upper limit on "v" of 2^23.5. That is, endpoints | this leads to an upper limit on v of 2^23.5. That is, endpoints | |||
cannot attempt to authenticate more than 2^23.5 packets with the same | cannot attempt to authenticate more than 2^23.5 packets with the same | |||
set of keys without causing an attacker to gain an larger advantage | set of keys without causing an attacker to gain a larger advantage | |||
than the target of 2^-57. | than the target of 2^-57. | |||
B.3. Limits for AEAD_AES_128_CCM_8 | B.3. Limits for AEAD_AES_128_CCM_8 | |||
The TLS_AES_128_CCM_8_SHA256 cipher suite uses the AEAD_AES_128_CCM_8 | The TLS_AES_128_CCM_8_SHA256 cipher suite uses the AEAD_AES_128_CCM_8 | |||
function, which uses a short authentication tag (that is, t=64). | function, which uses a short authentication tag (that is, t=64). | |||
The confidentiality limits of AEAD_AES_128_CCM_8 are the same as | The confidentiality limits of AEAD_AES_128_CCM_8 are the same as | |||
those for AEAD_AES_128_CCM, as this does not depend on the tag | those for AEAD_AES_128_CCM, as this does not depend on the tag | |||
length; see Appendix B.1. | length; see Appendix B.1. | |||
The shorter tag length of 64 bits means that the simplification used | The shorter tag length of 64 bits means that the simplification used | |||
in Appendix B.2 does not apply to AEAD_AES_128_CCM_8. If the goal is | in Appendix B.2 does not apply to AEAD_AES_128_CCM_8. If the goal is | |||
to preserve the same margins as other cipher suites, then the limit | to preserve the same margins as other cipher suites, then the limit | |||
on forgeries is largely dictated by the first term of the advantage | on forgeries is largely dictated by the first term of the advantage | |||
formula: | formula: | |||
v <= 2^7 | v <= 2^7 | |||
As this represents attempts to fail authentication, applying this | As this represents attempts that fail authentication, applying this | |||
limit might be feasible in some environments. However, applying this | limit might be feasible in some environments. However, applying this | |||
limit in an implementation intended for general use exposes | limit in an implementation intended for general use exposes | |||
connections to an inexpensive denial of service attack. | connections to an inexpensive denial-of-service attack. | |||
This analysis supports the view that TLS_AES_128_CCM_8_SHA256 is not | This analysis supports the view that TLS_AES_128_CCM_8_SHA256 is not | |||
suitable for general use. Specifically, TLS_AES_128_CCM_8_SHA256 | suitable for general use. Specifically, TLS_AES_128_CCM_8_SHA256 | |||
cannot be used without additional measures to prevent forgery of | cannot be used without additional measures to prevent forgery of | |||
records, or to mitigate the effect of forgeries. This might require | records, or to mitigate the effect of forgeries. This might require | |||
understanding the constraints that exist in a particular deployment | understanding the constraints that exist in a particular deployment | |||
or application. For instance, it might be possible to set a | or application. For instance, it might be possible to set a | |||
different target for the advantage an attacker gains based on an | different target for the advantage an attacker gains based on an | |||
understanding of the constraints imposed on a specific usage of DTLS. | understanding of the constraints imposed on a specific usage of DTLS. | |||
Appendix C. Implementation Pitfalls | Appendix C. Implementation Pitfalls | |||
In addition to the aspects of TLS that have been a source of | In addition to the aspects of TLS that have been a source of | |||
interoperability and security problems (Section C.3 of [TLS13]), DTLS | interoperability and security problems (Appendix C.3 of [TLS13]), | |||
presents a few new potential sources of issues, noted here. | DTLS presents a few new potential sources of issues, noted here. | |||
* Do you correctly handle messages received from multiple epochs | * Do you correctly handle messages received from multiple epochs | |||
during a key transition? This includes locating the correct key | during a key transition? This includes locating the correct key | |||
as well as performing replay detection, if enabled. | as well as performing replay detection, if enabled. | |||
* Do you retransmit handshake messages that are not (implicitly or | * Do you retransmit handshake messages that are not (implicitly or | |||
explicitly) acknowledged (Section 5.8)? | explicitly) acknowledged (Section 5.8)? | |||
* Do you correctly handle handshake message fragments received, | * Do you correctly handle handshake message fragments received, | |||
including when they are out of order? | including when they are out of order? | |||
* Do you correctly handle handshake messages received out of order? | * Do you correctly handle handshake messages received out of order? | |||
This may include either buffering or discarding them. | This may include either buffering or discarding them. | |||
* Do you limit how much data you send to a peer before its address | * Do you limit how much data you send to a peer before its address | |||
is validated? | is validated? | |||
* Do you verify that the explicit record length is contained within | * Do you verify that the explicit record length is contained within | |||
the datagram in which it is contained? | the datagram in which it is contained? | |||
Appendix D. History | Contributors | |||
RFC EDITOR: PLEASE REMOVE THE THIS SECTION | ||||
(*) indicates a change that may affect interoperability. | ||||
IETF Drafts draft-42 | ||||
* SHOULD level requirement for the client to offer CID extension. | ||||
* Change the default retransmission timer to 1s and allow people to | ||||
do otherwise if they have side knowledge. | ||||
* Cap any given flight to 10 records | ||||
* Don't re-set the timer to the initial value but to 1.5 times the | ||||
measured RTT. | ||||
* A bunch more clarity about the reliability algorithms and timers | ||||
(including changing reset to re-arm) | ||||
* Update IANA considerations | ||||
draft-40 | ||||
- Clarified encrypted_record structure in DTLS 1.3 record layer | ||||
- Added description of the demultiplexing process | ||||
- Added text about the DTLS 1.2 and DTLS 1.3 CID mechanism | ||||
- Forbid going from an empty CID to a non-empty CID (*) | ||||
- Add warning about certificates and congestion | ||||
- Use DTLS style version values, even for DTLS 1.3 (*) | ||||
- Describe how to distinguish DTLS 1.2 and DTLS 1.3 connections | ||||
- Updated examples | ||||
- Included editorial improvements from Ben Kaduk | ||||
- Removed stale text about out-of-epoch records | ||||
- Added clarifications around when ACKs are sent | ||||
- Noted that alerts are unreliable | ||||
- Clarify when you can reset the timer | ||||
- Indicated that records with bogus epochs should be discarded | ||||
- Relax age out text | ||||
- Updates to cookie text | ||||
- Require that cipher suites define a record number encryption algorithm | ||||
- Clean up use of connection and association | ||||
- Reference tls-old-versions-deprecate | ||||
draft-39 - Updated Figure 4 due to misalignment with Figure 3 content | ||||
draft-38 - Ban implicit Connection IDs (*) - ACKs are processed as | ||||
the union. | ||||
draft-37: - Fix the other place where we have ACK. | ||||
draft-36: - Some editorial changes. - Changed the content type to not | ||||
conflict with existing allocations (*) | ||||
draft-35: - I-D.ietf-tls-dtls-connection-id became a normative | ||||
reference - Removed duplicate reference to I-D.ietf-tls-dtls- | ||||
connection-id. - Fix figure 11 to have the right numbers andno cookie | ||||
in message 1. - Clarify when you can ACK. - Clarify additional data | ||||
computation. | ||||
draft-33: - Key separation between TLS and DTLS. Issue #72. | ||||
draft-32: - Editorial improvements and clarifications. | ||||
draft-31: - Editorial improvements in text and figures. - Added | ||||
normative reference to ChaCha20 and Poly1305. | ||||
draft-30: - Changed record format - Added text about end of early | ||||
data - Changed format of the Connection ID Update message - Added | ||||
Appendix A "Protocol Data Structures and Constant Values" | ||||
draft-29: - Added support for sequence number encryption - Update to | ||||
new record format - Emphasize that compatibility mode isn't used. | ||||
draft-28: - Version bump to align with TLS 1.3 pre-RFC version. | ||||
draft-27: - Incorporated unified header format. - Added support for | ||||
CIDs. | ||||
draft-04 - 26: - Submissions to align with TLS 1.3 draft versions | ||||
draft-03 - Only update keys after KeyUpdate is ACKed. | ||||
draft-02 - Shorten the protected record header and introduce an | ||||
ultra-short version of the record header. - Reintroduce KeyUpdate, | ||||
which works properly now that we have ACK. - Clarify the ACK rules. | ||||
draft-01 - Restructured the ACK to contain a list of records and also | ||||
be a record rather than a handshake message. | ||||
draft-00 - First IETF Draft | ||||
Personal Drafts draft-01 - Alignment with version -19 of the TLS 1.3 | ||||
specification | ||||
draft-00 | ||||
* Initial version using TLS 1.3 as a baseline. | ||||
* Use of epoch values instead of KeyUpdate message | ||||
* Use of cookie extension instead of cookie field in ClientHello and | ||||
HelloVerifyRequest messages | ||||
* Added ACK message | ||||
* Text about sequence number handling | ||||
Appendix E. Working Group Information | ||||
RFC EDITOR: PLEASE REMOVE THIS SECTION. | ||||
The discussion list for the IETF TLS working group is located at the | ||||
e-mail address tls@ietf.org (mailto:tls@ietf.org). Information on | ||||
the group and information on how to subscribe to the list is at | ||||
https://www1.ietf.org/mailman/listinfo/tls | ||||
(https://www1.ietf.org/mailman/listinfo/tls) | ||||
Archives of the list can be found at: https://www.ietf.org/mail- | ||||
archive/web/tls/current/index.html (https://www.ietf.org/mail- | ||||
archive/web/tls/current/index.html) | ||||
Appendix F. Contributors | ||||
Many people have contributed to previous DTLS versions and they are | Many people have contributed to previous DTLS versions, and they are | |||
acknowledged in prior versions of DTLS specifications or in the | acknowledged in prior versions of DTLS specifications or in the | |||
referenced specifications. The sequence number encryption concept is | referenced specifications. | |||
taken from the QUIC specification. We would like to thank the | ||||
authors of the QUIC specification for their work. Felix Guenther and | ||||
Martin Thomson contributed the analysis in Appendix B. | ||||
In addition, we would like to thank: | ||||
* David Benjamin | ||||
davidben@google.com | ||||
* Thomas Fossati | Hanno Becker | |||
Arm Limited | Arm Limited | |||
Thomas.Fossati@arm.com | Email: Hanno.Becker@arm.com | |||
* Tobias Gondrom | David Benjamin | |||
Huawei | ||||
tobias.gondrom@gondrom.org | Email: davidben@google.com | |||
* Felix Günther | Thomas Fossati | |||
ETH Zurich | Arm Limited | |||
mail@felixguenther.info | Email: thomas.fossati@arm.com | |||
* Benjamin Kaduk | Tobias Gondrom | |||
Akamai Technologies | Huawei | |||
kaduk@mit.edu | Email: tobias.gondrom@gondrom.org | |||
* Ilari Liusvaara | Felix Günther | |||
Independent | ETH Zurich | |||
ilariliusvaara@welho.com | Email: mail@felixguenther.info | |||
* Martin Thomson | Benjamin Kaduk | |||
Mozilla | Akamai Technologies | |||
martin.thomson@gmail.com | Email: kaduk@mit.edu | |||
* Christopher A. Wood | Ilari Liusvaara | |||
Apple Inc. | Independent | |||
cawood@apple.com | Email: ilariliusvaara@welho.com | |||
* Yin Xinxing | Martin Thomson | |||
Huawei | Mozilla | |||
yinxinxing@huawei.com | Email: martin.thomson@gmail.com | |||
* Hanno Becker | Christopher A. Wood | |||
Arm Limited | Cloudflare | |||
Hanno.Becker@arm.com | Email: caw@heapingbits.net | |||
Appendix G. Acknowledgements | Yin Xinxing | |||
Huawei | ||||
Email: yinxinxing@huawei.com | ||||
We would like to thank Jonathan Hammell, Bernard Aboba and Andy | The sequence number encryption concept is taken from QUIC [RFC9000]. | |||
We would like to thank the authors of RFC 9000 for their work. Felix | ||||
Günther and Martin Thomson contributed the analysis in Appendix B. | ||||
We would like to thank Jonathan Hammell, Bernard Aboba, and Andy | ||||
Cunningham for their review comments. | Cunningham for their review comments. | |||
Additionally, we would like to thank the IESG members for their | Additionally, we would like to thank the IESG members for their | |||
review comments: Martin Duke, Erik Kline, Francesca Palombini, Lars | review comments: Martin Duke, Erik Kline, Francesca Palombini, Lars | |||
Eggert, Zaheduzzaman Sarker, John Scudder, Eric Vyncke, Robert | Eggert, Zaheduzzaman Sarker, John Scudder, Éric Vyncke, Robert | |||
Wilton, Roman Danyliw, Benjamin Kaduk, Murray Kucherawy, Martin | Wilton, Roman Danyliw, Benjamin Kaduk, Murray Kucherawy, Martin | |||
Vigoureux, and Alvaro Retana | Vigoureux, and Alvaro Retana. | |||
Authors' Addresses | Authors' Addresses | |||
Eric Rescorla | Eric Rescorla | |||
RTFM, Inc. | Mozilla | |||
Email: ekr@rtfm.com | Email: ekr@rtfm.com | |||
Hannes Tschofenig | Hannes Tschofenig | |||
Arm Limited | Arm Limited | |||
Email: hannes.tschofenig@arm.com | Email: hannes.tschofenig@arm.com | |||
Nagendra Modadugu | Nagendra Modadugu | |||
Google, Inc. | Google, Inc. | |||
Email: nagendra@cs.stanford.edu | Email: nagendra@cs.stanford.edu | |||
End of changes. 297 change blocks. | ||||
963 lines changed or deleted | 869 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |