RFC 9146 PROPOSED STANDARD SECURITY · DTLS · TRANSPORT

DTLS Connection ID: Connection Identifier for DTLS 1.2

A connection identifier in the DTLS 1.2 record header, so a session survives a change of IP address or port.

On rfc-editor.org ↗
PUBLISHED
March 2022
AUTHORS
E. Rescorla, H. Tschofenig, T. Fossati, A. Kraus
STREAM
IETF
BUILDS ON
RFC 6347 — DTLS 1.2
UPDATED BY
RFC 9853 — DTLS return routability
EXTENSION TYPE
connection_id (54)
CONTENT TYPE
tls12_cid (25)
CID LENGTH
0 to 2^8-1 bytes
SEQUENCE PLACEHOLDER
8 bytes of 0xff
MAX INNER PLAINTEXT
2^14 bytes
APPLIES TO
DTLS 1.2 only
DOI
10.17487/RFC9146

RFC text

Contents
Original text · RFC Editor View on rfc-editor.org ↗
Internet Engineering Task Force (IETF)                  E. Rescorla, Ed.
Request for Comments: 9146                                       Mozilla
Updates: 6347                                         H. Tschofenig, Ed.
Category: Standards Track                                     T. Fossati
ISSN: 2070-1721                                              Arm Limited
                                                                A. Kraus
                                                           Bosch.IO GmbH
                                                              March 2022


                   Connection Identifier for DTLS 1.2

Abstract

   This document specifies the Connection ID (CID) construct for the
   Datagram Transport Layer Security (DTLS) protocol version 1.2.

   A CID is an identifier carried in the record layer header that gives
   the recipient additional information for selecting the appropriate
   security association.  In "classical" DTLS, selecting a security
   association of an incoming DTLS record is accomplished with the help
   of the 5-tuple.  If the source IP address and/or source port changes
   during the lifetime of an ongoing DTLS session, then the receiver
   will be unable to locate the correct security context.

   The new ciphertext record format with the CID also provides content
   type encryption and record layer padding.

   This document updates RFC 6347.

Status of This Memo

   This is an Internet Standards Track document.

   This document is a product of the Internet Engineering Task Force
   (IETF).  It represents the consensus of the IETF community.  It has
   received public review and has been approved for publication by the
   Internet Engineering Steering Group (IESG).  Further information on
   Internet Standards is available in Section 2 of RFC 7841.

   Information about the current status of this document, any errata,
   and how to provide feedback on it may be obtained at
   https://www.rfc-editor.org/info/rfc9146.

Copyright Notice

   Copyright (c) 2022 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (https://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Revised BSD License text as described in Section 4.e of the
   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
   Contributions published or made publicly available before November
   10, 2008.  The person(s) controlling the copyright in some of this
   material may not have granted the IETF Trust the right to allow
   modifications of such material outside the IETF Standards Process.
   Without obtaining an adequate license from the person(s) controlling
   the copyright in such materials, this document may not be modified
   outside the IETF Standards Process, and derivative works of it may
   not be created outside the IETF Standards Process, except to format
   it for publication as an RFC or to translate it into languages other
   than English.

Table of Contents

   1.  Introduction
   2.  Conventions and Terminology
   3.  The "connection_id" Extension
   4.  Record Layer Extensions
   5.  Record Payload Protection
     5.1.  Block Ciphers
     5.2.  Block Ciphers with Encrypt-then-MAC Processing
     5.3.  AEAD Ciphers
   6.  Peer Address Update
   7.  Example
   8.  Privacy Considerations
   9.  Security Considerations
   10. IANA Considerations
     10.1.  Extra Column Added to the TLS ExtensionType Values
            Registry
     10.2.  New Entry in the TLS ExtensionType Values Registry
     10.3.  New Entry in the TLS ContentType Registry
   11. References
     11.1.  Normative References
     11.2.  Informative References
   Acknowledgements
   Contributors
   Authors' Addresses

1.  Introduction

   The Datagram Transport Layer Security (DTLS) protocol [RFC6347] was
   designed for securing data sent over datagram transports (e.g., UDP).
   DTLS, like TLS, starts with a handshake, which can be computationally
   demanding (particularly when public key cryptography is used).  After
   a successful handshake, symmetric key cryptography is used to apply
   data origin authentication, integrity, and confidentiality
   protection.  This two-step approach allows endpoints to amortize the
   cost of the initial handshake across subsequent application data
   protection.  Ideally, the second phase where application data is
   protected lasts over a long period of time, since the established
   keys will only need to be updated once the key lifetime expires.

   In DTLS as specified in RFC 6347, the IP address and port of the peer
   are used to identify the DTLS association.  Unfortunately, in some
   cases, such as NAT rebinding, these values are insufficient.  This is
   a particular issue in the Internet of Things when devices enter
   extended sleep periods to increase their battery lifetime.  The NAT
   rebinding leads to connection failure, with the resulting cost of a
   new handshake.

   This document defines an extension to DTLS 1.2 to add a Connection ID
   (CID) to the DTLS record layer.  The presence of the CID is
   negotiated via a DTLS extension.

   Adding a CID to the ciphertext record format presents an opportunity
   to make other changes to the record format.  In keeping with the best
   practices established by TLS 1.3, the type of the record is
   encrypted, and a mechanism is provided for adding padding to
   obfuscate the plaintext length.

2.  Conventions and Terminology

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
   "OPTIONAL" in this document are to be interpreted as described in
   BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
   capitals, as shown here.

   This document assumes familiarity with DTLS 1.2 [RFC6347].  The
   presentation language used in this document is described in Section 3
   of [RFC8446].

3.  The "connection_id" Extension

   This document defines the "connection_id" extension, which is used in
   ClientHello and ServerHello messages.

   The extension type is specified as follows.

     enum {
        connection_id(54), (65535)
     } ExtensionType;

   The extension_data field of this extension, when included in the
   ClientHello, MUST contain the ConnectionId structure.  This structure
   contains the CID value the client wishes the server to use when
   sending messages to the client.  A zero-length CID value indicates
   that the client is prepared to send using a CID but does not wish the
   server to use one when sending.

     struct {
         opaque cid<0..2^8-1>;
     } ConnectionId;

   A server willing to use CIDs will respond with a "connection_id"
   extension in the ServerHello, containing the CID it wishes the client
   to use when sending messages towards it.  A zero-length value
   indicates that the server will send using the client's CID but does
   not wish the client to include a CID when sending.

   Because each party sends the value in the "connection_id" extension
   it wants to receive as a CID in encrypted records, it is possible for
   an endpoint to use a deployment-specific constant length for such
   connection identifiers.  This can in turn ease parsing and connection
   lookup -- for example, by having the length in question be a compile-
   time constant.  Such implementations MUST still be able to send CIDs
   of different lengths to other parties.  Since the CID length
   information is not included in the record itself, implementations
   that want to use variable-length CIDs are responsible for
   constructing the CID in such a way that its length can be determined
   on reception.

   In DTLS 1.2, CIDs are exchanged at the beginning of the DTLS session
   only.  There is no dedicated "CID update" message that allows new
   CIDs to be established mid-session, because DTLS 1.2 in general does
   not allow TLS 1.3-style post-handshake messages that do not
   themselves begin other handshakes.  When a DTLS session is resumed or
   renegotiated, the "connection_id" extension is negotiated afresh.

   If DTLS peers have not negotiated the use of CIDs, or a zero-length
   CID has been advertised for a given direction, then the record format
   and content type defined in RFC 6347 MUST be used to send in the
   indicated direction(s).

   If DTLS peers have negotiated the use of a non-zero-length CID for a
   given direction, then once encryption is enabled, they MUST send with
   the record format defined in Figure 3 (see Section 4) with the new
   Message Authentication Code (MAC) computation defined in Section 5
   and the content type tls12_cid.  Plaintext payloads never use the new
   record format or the CID content type.

   When receiving, if the tls12_cid content type is set, then the CID is
   used to look up the connection and the security association.  If the
   tls12_cid content type is not set, then the connection and the
   security association are looked up by the 5-tuple and a check MUST be
   made to determine whether a non-zero-length CID is expected.  If a
   non-zero-length CID is expected for the retrieved association, then
   the datagram MUST be treated as invalid, as described in
   Section 4.1.2.1 of [RFC6347].

   When receiving a datagram with the tls12_cid content type, the new
   MAC computation defined in Section 5 MUST be used.  When receiving a
   datagram with the record format defined in RFC 6347, the MAC
   calculation defined in Section 4.1.2 of [RFC6347] MUST be used.

4.  Record Layer Extensions

   This specification defines the CID-enhanced record layer format for
   DTLS 1.2, and [DTLS13] specifies how to carry the CID in DTLS 1.3.

   To allow a receiver to determine whether a record has a CID or not,
   connections that have negotiated this extension use a distinguished
   record type tls12_cid(25).  The use of this content type has the
   following three implications:

   *  The CID field is present and contains one or more bytes.

   *  The MAC calculation follows the process described in Section 5.

   *  The real content type is inside the encryption envelope, as
      described below.

   Plaintext records are not impacted by this extension.  Hence, the
   format of the DTLSPlaintext structure is left unchanged, as shown in
   Figure 1.

        struct {
            ContentType type;
            ProtocolVersion version;
            uint16 epoch;
            uint48 sequence_number;
            uint16 length;
            opaque fragment[DTLSPlaintext.length];
        } DTLSPlaintext;

                Figure 1: DTLS 1.2 Plaintext Record Payload

   When CIDs are being used, the content to be sent is first wrapped
   along with its content type and optional padding into a
   DTLSInnerPlaintext structure.  This newly introduced structure is
   shown in Figure 2.

        struct {
            opaque content[length];
            ContentType real_type;
            uint8 zeros[length_of_padding];
        } DTLSInnerPlaintext;

             Figure 2: New DTLSInnerPlaintext Payload Structure

   content:  Corresponds to the fragment of a given length.

   real_type:  The content type describing the cleartext payload.

   zeros:  An arbitrary-length run of zero-valued bytes may appear in
      the cleartext after the type field.  This provides an opportunity
      for senders to pad any DTLS record by a chosen amount as long as
      the total stays within record size limits.  See Section 5.4 of
      [RFC8446] for more details.  (Note that the term TLSInnerPlaintext
      in RFC 8446 refers to DTLSInnerPlaintext in this specification.)

   The DTLSInnerPlaintext byte sequence is then encrypted.  To create
   the DTLSCiphertext structure shown in Figure 3, the CID is added.

        struct {
            ContentType outer_type = tls12_cid;
            ProtocolVersion version;
            uint16 epoch;
            uint48 sequence_number;
            opaque cid[cid_length];               // New field
            uint16 length;
            opaque enc_content[DTLSCiphertext.length];
        } DTLSCiphertext;

             Figure 3: DTLS 1.2 CID-Enhanced Ciphertext Record

   outer_type:  The outer content type of a DTLSCiphertext record
      carrying a CID is always set to tls12_cid(25).  The real content
      type of the record is found in DTLSInnerPlaintext.real_type after
      decryption.

   cid:  The CID value, cid_length bytes long, as agreed at the time the
      extension has been negotiated.  Recall that each peer chooses the
      CID value it will receive and use to identify the connection, so
      an implementation can choose to always receive CIDs of a fixed
      length.  If, however, an implementation chooses to receive CIDs of
      different lengths, the assigned CID values must be self-
      delineating, since there is no other mechanism available to
      determine what connection (and thus, what CID length) is in use.

   enc_content:  The encrypted form of the serialized DTLSInnerPlaintext
      structure.

   All other fields are as defined in RFC 6347.

5.  Record Payload Protection

   Several types of ciphers have been defined for use with TLS and DTLS,
   and the MAC calculations for those ciphers differ slightly.

   This specification modifies the MAC calculation as defined in
   [RFC6347] and [RFC7366], as well as the definition of the additional
   data used with Authenticated Encryption with Associated Data (AEAD)
   ciphers provided in [RFC6347], for records with content type
   tls12_cid.  The modified algorithm MUST NOT be applied to records
   that do not carry a CID, i.e., records with content type other than
   tls12_cid.

   The following fields are defined in this document; all other fields
   are as defined in the cited documents.

   cid:  Value of the negotiated CID (variable length).

   cid_length:  The length (in bytes) of the negotiated CID (one-byte
      integer).

   length_of_DTLSInnerPlaintext:  The length (in bytes) of the
      serialized DTLSInnerPlaintext (two-byte integer).  The length MUST
      NOT exceed 2^14.

   seq_num_placeholder:  8 bytes of 0xff.

   Note that "+" denotes concatenation.

5.1.  Block Ciphers

   The following MAC algorithm applies to block ciphers that do not use
   the Encrypt-then-MAC processing described in [RFC7366].

       MAC(MAC_write_key,
           seq_num_placeholder +
           tls12_cid +
           cid_length +
           tls12_cid +
           DTLSCiphertext.version +
           epoch +
           sequence_number +
           cid +
           length_of_DTLSInnerPlaintext +
           DTLSInnerPlaintext.content +
           DTLSInnerPlaintext.real_type +
           DTLSInnerPlaintext.zeros
       );

   The rationale behind this construction is to separate the MAC input
   for DTLS without the connection ID from the MAC input with the
   connection ID.  The former always consists of a sequence number
   followed by some content type other than tls12_cid; the latter always
   consists of the seq_num_placeholder followed by tls12_cid.  Although
   2^64-1 is potentially a valid sequence number, tls12_cid will never
   be a valid content type when the connection ID is not in use.  In
   addition, the epoch and sequence_number are now fed into the MAC in
   the same order as they appear on the wire.

5.2.  Block Ciphers with Encrypt-then-MAC Processing

   The following MAC algorithm applies to block ciphers that use the
   Encrypt-then-MAC processing described in [RFC7366].

       MAC(MAC_write_key,
           seq_num_placeholder +
           tls12_cid +
           cid_length +
           tls12_cid +
           DTLSCiphertext.version +
           epoch +
           sequence_number +
           cid +
           DTLSCiphertext.length +
           IV +
           ENC(content + padding + padding_length)
       );

5.3.  AEAD Ciphers

   For ciphers utilizing AEAD, the following modification is made to the
   additional data calculation.

       additional_data = seq_num_placeholder +
                         tls12_cid +
                         cid_length +
                         tls12_cid +
                         DTLSCiphertext.version +
                         epoch +
                         sequence_number +
                         cid +
                         length_of_DTLSInnerPlaintext;

6.  Peer Address Update

   When a record with a CID is received that has a source address
   different from the one currently associated with the DTLS connection,
   the receiver MUST NOT replace the address it uses for sending records
   to its peer with the source address specified in the received
   datagram, unless the following three conditions are met:

   *  The received datagram has been cryptographically verified using
      the DTLS record layer processing procedures.

   *  The received datagram is "newer" (in terms of both epoch and
      sequence number) than the newest datagram received.  Reordered
      datagrams that are sent prior to a change in a peer address might
      otherwise cause a valid address change to be reverted.  This also
      limits the ability of an attacker to use replayed datagrams to
      force a spurious address change, which could result in denial of
      service.  An attacker might be able to succeed in changing a peer
      address if they are able to rewrite source addresses and if
      replayed packets are able to arrive before any original.

   *  There is a strategy for ensuring that the new peer address is able
      to receive and process DTLS records.  No strategy is mandated by
      this specification, but see note (*) below.

   The conditions above are necessary to protect against attacks that
   use datagrams with spoofed addresses or replayed datagrams to trigger
   attacks.  Note that there is no requirement for the use of the anti-
   replay window mechanism defined in Section 4.1.2.6 of [RFC6347].
   Both solutions, the "anti-replay window" or "newer" algorithm, will
   prevent address updates from replay attacks while the latter will
   only apply to peer address updates and the former applies to any
   application layer traffic.

   Note that datagrams that pass the DTLS cryptographic verification
   procedures but do not trigger a change of peer address are still
   valid DTLS records and are still to be passed to the application.

      (*) Note: Application protocols that implement protection against
      spoofed addresses depend on being aware of changes in peer
      addresses so that they can engage the necessary mechanisms.  When
      delivered such an event, an address validation mechanism specific
      to the application layer can be triggered -- for example, one that
      is based on successful exchange of a minimal amount of ping-pong
      traffic with the peer.  Alternatively, a DTLS-specific mechanism
      may be used, as described in [DTLS-RRC].

   DTLS implementations MUST silently discard records with bad MACs or
   that are otherwise invalid.

7.  Example

   Figure 4 shows an example exchange where a CID is used
   unidirectionally from the client to the server.  To indicate that a
   zero-length CID is present in the "connection_id" extension, we use
   the notation 'connection_id=empty'.

   Client                                             Server
   ------                                             ------

   ClientHello                 -------->
   (connection_id=empty)


                               <--------      HelloVerifyRequest
                                                        (cookie)

   ClientHello                 -------->
   (connection_id=empty)
   (cookie)

                                                     ServerHello
                                             (connection_id=100)
                                                     Certificate
                                               ServerKeyExchange
                                              CertificateRequest
                               <--------         ServerHelloDone

   Certificate
   ClientKeyExchange
   CertificateVerify
   [ChangeCipherSpec]
   Finished                    -------->
   <CID=100>

                                              [ChangeCipherSpec]
                               <--------                Finished


   Application Data            ========>
   <CID=100>

                               <========        Application Data

   Legend:

   <...> indicates that a connection ID is used in the record layer
   (...) indicates an extension
   [...] indicates a payload other than a handshake message

                Figure 4: Example DTLS 1.2 Exchange with CID

      Note: In the example exchange, the CID is included in the record
      layer once encryption is enabled.  In DTLS 1.2, only one handshake
      message is encrypted, namely the Finished message.  Since the
      example shows how to use the CID for payloads sent from the client
      to the server, only the record layer payloads containing the
      Finished message or application data include a CID.

8.  Privacy Considerations

   The CID replaces the previously used 5-tuple and, as such, introduces
   an identifier that remains persistent during the lifetime of a DTLS
   connection.  Every identifier introduces the risk of linkability, as
   explained in [RFC6973].

   An on-path adversary observing the DTLS protocol exchanges between
   the DTLS client and the DTLS server is able to link the observed
   payloads to all subsequent payloads carrying the same ID pair (for
   bidirectional communication).  Without multihoming or mobility, the
   use of the CID exposes the same information as the 5-tuple.

   With multihoming, a passive attacker is able to correlate the
   communication interaction over the two paths.  The lack of a CID
   update mechanism in DTLS 1.2 makes this extension unsuitable for
   mobility scenarios where correlation must be considered.  Deployments
   that use DTLS in multihoming environments and are concerned about
   these aspects SHOULD refuse to use CIDs in DTLS 1.2 and switch to
   DTLS 1.3 where a CID update mechanism is provided and sequence number
   encryption is available.

   This specification introduces record padding for the CID-enhanced
   record layer, which is a privacy feature not available with the
   original DTLS 1.2 specification.  Padding allows the size of the
   ciphertext to be inflated, making traffic analysis more difficult.
   More details about record padding can be found in Section 5.4 and
   Appendix E.3 of [RFC8446].

   Finally, endpoints can use the CID to attach arbitrary per-connection
   metadata to each record they receive on a given connection.  This may
   be used as a mechanism to communicate per-connection information to
   on-path observers.  There is no straightforward way to address this
   concern with CIDs that contain arbitrary values.  Implementations
   concerned about this aspect SHOULD refuse to use CIDs.

9.  Security Considerations

   An on-path adversary can create reflection attacks against third
   parties because a DTLS peer has no means to distinguish a genuine
   address update event (for example, due to a NAT rebinding) from one
   that is malicious.  This attack is of particular concern when the
   request is small and the response large.  See Section 6 for more on
   address updates.

   Additionally, an attacker able to observe the data traffic exchanged
   between two DTLS peers is able to replay datagrams with modified IP
   addresses / port numbers.

   The topic of peer address updates is discussed in Section 6.

10.  IANA Considerations

   This document implements three IANA updates.

10.1.  Extra Column Added to the TLS ExtensionType Values Registry

   IANA has added an extra column named "DTLS-Only" to the "TLS
   ExtensionType Values" registry to indicate whether an extension is
   only applicable to DTLS and to include this document as an additional
   reference for the registry.

10.2.  New Entry in the TLS ExtensionType Values Registry

   IANA has allocated an entry in the existing "TLS ExtensionType
   Values" registry for connection_id(54), as described in the table
   below.  Although the value 53 had been allocated by early allocation
   for a previous version of this document, it is incompatible with this
   document.  Therefore, the early allocation has been deprecated in
   favor of this assignment.

   +=======+===============+=====+===========+=============+===========+
   | Value |Extension Name | TLS | DTLS-Only | Recommended | Reference |
   |       |               | 1.3 |           |             |           |
   +=======+===============+=====+===========+=============+===========+
   | 54    |connection_id  | CH, | Y         | N           | RFC 9146  |
   |       |               | SH  |           |             |           |
   +-------+---------------+-----+-----------+-------------+-----------+

                                  Table 1

   A new column, "DTLS-Only", has been added to the registry.  The valid
   entries are "Y" if the extension is only applicable to DTLS, "N"
   otherwise.  All the pre-existing entries are given the value "N".

      Note: The value "N" in the "Recommended" column is set because
      this extension is intended only for specific use cases.  This
      document describes the behavior of this extension for DTLS 1.2
      only; it is not applicable to TLS, and its usage for DTLS 1.3 is
      described in [DTLS13].

10.3.  New Entry in the TLS ContentType Registry

   IANA has allocated tls12_cid(25) in the "TLS ContentType" registry.
   The tls12_cid content type is only applicable to DTLS 1.2.

11.  References

11.1.  Normative References

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/info/rfc2119>.

   [RFC6347]  Rescorla, E. and N. Modadugu, "Datagram Transport Layer
              Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347,
              January 2012, <https://www.rfc-editor.org/info/rfc6347>.

   [RFC7366]  Gutmann, P., "Encrypt-then-MAC for Transport Layer
              Security (TLS) and Datagram Transport Layer Security
              (DTLS)", RFC 7366, DOI 10.17487/RFC7366, September 2014,
              <https://www.rfc-editor.org/info/rfc7366>.

   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
              2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
              May 2017, <https://www.rfc-editor.org/info/rfc8174>.

   [RFC8446]  Rescorla, E., "The Transport Layer Security (TLS) Protocol
              Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
              <https://www.rfc-editor.org/info/rfc8446>.

11.2.  Informative References

   [DTLS-RRC] Tschofenig, H., Ed. and T. Fossati, "Return Routability
              Check for DTLS 1.2 and DTLS 1.3", Work in Progress,
              Internet-Draft, draft-ietf-tls-dtls-rrc-05, 7 March 2022,
              <https://datatracker.ietf.org/doc/html/draft-ietf-tls-
              dtls-rrc-05>.

   [DTLS13]   Rescorla, E., Tschofenig, H., and N. Modadugu, "The
              Datagram Transport Layer Security (DTLS) Protocol Version
              1.3", Work in Progress, Internet-Draft, draft-ietf-tls-
              dtls13-43, 30 April 2021,
              <https://datatracker.ietf.org/doc/html/draft-ietf-tls-
              dtls13-43>.

   [RFC6973]  Cooper, A., Tschofenig, H., Aboba, B., Peterson, J.,
              Morris, J., Hansen, M., and R. Smith, "Privacy
              Considerations for Internet Protocols", RFC 6973,
              DOI 10.17487/RFC6973, July 2013,
              <https://www.rfc-editor.org/info/rfc6973>.

Acknowledgements

   We would like to thank Hanno Becker, Martin Duke, Lars Eggert, Ben
   Kaduk, Warren Kumari, Francesca Palombini, Tom Petch, John Scudder,
   Sean Turner, Éric Vyncke, and Robert Wilton for their review
   comments.

   Finally, we want to thank the IETF TLS Working Group chairs, Chris
   Wood, Joseph Salowey, and Sean Turner, for their patience, support,
   and feedback.

Contributors

   Many people have contributed to this specification, and we would like
   to thank the following individuals for their contributions:

   Yin Xinxing
   Huawei
   Email: yinxinxing@huawei.com


   Nikos Mavrogiannopoulos
   RedHat
   Email: nmav@redhat.com


   Tobias Gondrom
   Email: tobias.gondrom@gondrom.org


   Additionally, we would like to thank the Connection ID task force
   team members:

   *  Martin Thomson (Mozilla)

   *  Christian Huitema (Private Octopus Inc.)

   *  Jana Iyengar (Google)

   *  Daniel Kahn Gillmor (ACLU)

   *  Patrick McManus (Mozilla)

   *  Ian Swett (Google)

   *  Mark Nottingham (Fastly)

   The task force team discussed various design ideas, including
   cryptographically generated session IDs using hash chains and public
   key encryption, but dismissed them due to their inefficiency.  The
   approach described in this specification is the simplest possible
   design that works, given the limitations of DTLS 1.2.  DTLS 1.3
   provides better privacy features, and developers are encouraged to
   switch to the new version of DTLS.

Authors' Addresses

   Eric Rescorla (editor)
   Mozilla
   Email: ekr@rtfm.com


   Hannes Tschofenig (editor)
   Arm Limited
   Email: hannes.tschofenig@arm.com


   Thomas Fossati
   Arm Limited
   Email: thomas.fossati@arm.com


   Achim Kraus
   Bosch.IO GmbH
   Email: achim.kraus@bosch.io

AI ELI5

On this page
PROBLEMDTLS 1.2 finds the right security context from the sender's 5-tuple. If the source address or port changes mid-session, for example after NAT rebinding, the receiver cannot find the session and a costly new handshake is needed.
MECHANISMBoth sides negotiate a connection_id extension in the hello messages. Afterwards each encrypted record carries the CID the receiver asked for, in a new record format with content type tls12_cid(25), a changed MAC computation, an encrypted real content type and optional padding.
THE CATCHThe receiver can look up the session by CID, while strict rules on peer address updates limit spoofing and replay. The RFC warns that the CID adds linkability and that DTLS 1.2 has no CID update, so DTLS 1.3 is preferred where that matters.

§1Why DTLS Needs a Connection ID

RFC 6347 defines DTLS, which secures data sent over datagram transports such as UDP. Like TLS, it starts with a handshake that can be computationally demanding, and then uses symmetric cryptography for the rest of the session. The idea is to spread the cost of the handshake over a long period of protected traffic.

In DTLS as specified in RFC 6347, the IP address and port of the peer identify the association. In some cases, such as NAT rebinding, these values are not enough. The RFC calls this a particular issue in the Internet of Things, where devices enter extended sleep periods to save battery. A rebinding then causes a connection failure and the cost of a new handshake.

This document adds a Connection ID (CID) to the DTLS 1.2 record layer, negotiated through a DTLS extension. Because the record format changes anyway, it also encrypts the record type and allows padding, following TLS 1.3 practice. The RFC updates RFC 6347.

Usually a computer knows who is talking by looking at where the message came from. If that address changes, it gets confused. A connection ID is a label inside the message, so it still knows who is talking.

§3The connection_id Extension

The connection_id extension (type 54) is carried in the ClientHello and ServerHello. Its data is a ConnectionId structure holding an opaque value of 0 to 2^8-1 bytes. Each side puts in the CID that it wants to receive. The client's value is what it wants the server to use when sending to the client, and the server's reply holds the CID it wants the client to use.

A zero-length value has a special meaning. A client that sends one is prepared to send using a CID but does not want the server to use one. A server that replies with a zero-length value will send using the client's CID but does not want the client to include one. So a CID can be used in one direction only.

Because each party chooses the value it receives, an implementation can use a constant length for its CIDs, which eases parsing. It must still be able to send CIDs of other lengths. If it wants variable-length CIDs, it must build them so the length can be determined on reception, since the record does not carry the length.

CIDs are exchanged only at the start of the session. DTLS 1.2 has no CID update message, and a resumed or renegotiated session negotiates the extension afresh.

If no CID was negotiated, or a zero-length CID was advertised for a direction, the RFC 6347 record format MUST be used in that direction. With a non-zero CID, once encryption is enabled, records MUST use the new format with content type tls12_cid.

On receipt, the tls12_cid content type means the CID is used to look up the connection and security association. Otherwise the lookup uses the 5-tuple, and if a non-zero CID was expected for that association, the datagram MUST be treated as invalid.

Each side tells the other what name tag it wants to see on messages sent to it. If you say your tag is blank, you are saying you will wear a tag for them but they need not wear one for you.

§4The CID-Enhanced Record Format

Records that use a CID have the distinguished content type tls12_cid, value 25. It has three implications: the CID field is present and has one or more bytes, the MAC is calculated as described in the next section, and the real content type is inside the encryption envelope.

Plaintext records are not affected, so the DTLSPlaintext structure is unchanged. For protected records, the content is first wrapped with its real type and optional padding into a DTLSInnerPlaintext: the content, then real_type, then a run of zero bytes. The zeros let a sender pad a record by a chosen amount, within record size limits, as in TLS 1.3.

That structure is encrypted, and the CID is added to form the DTLSCiphertext. Its outer type is always tls12_cid, followed by version, epoch, sequence number, the cid, the length and the encrypted content. The receiver finds the real type only after decryption. If CIDs of different lengths are in use, they must be self-delineating, because nothing else tells the receiver which connection, and therefore which CID length, applies.

The real label for what is inside the envelope is hidden inside it. On the outside there is only a plain stamp saying a connection ID is present, followed by the name tag.

THE CID-ENHANCED CIPHERTEXT RECORD (RFC 9146, FIGURE 3)
DTLSCiphertext
struct {
    ContentType outer_type = tls12_cid;
    ProtocolVersion version;
    uint16 epoch;
    uint48 sequence_number;
    opaque cid[cid_length];               // New field
    uint16 length;
    opaque enc_content[DTLSCiphertext.length];
} DTLSCiphertext;

§5Record Payload Protection

The MAC calculation and, for AEAD ciphers, the additional data differ for records with content type tls12_cid. The modified algorithm MUST NOT be applied to records that carry no CID. The RFC defines the fields cid, cid_length, length_of_DTLSInnerPlaintext (which MUST NOT exceed 2^14) and seq_num_placeholder, which is 8 bytes of 0xff.

Three variants are given. Block ciphers without Encrypt-then-MAC and block ciphers with it get a new MAC input, and AEAD ciphers get a changed additional-data input. All of them start with the placeholder, the tls12_cid type and the CID length, and then feed in the version, epoch, sequence number and CID.

The rationale is to keep the MAC input for DTLS without a CID separate from the input with one. The old form starts with a sequence number followed by a content type other than tls12_cid, and the new form always starts with the placeholder followed by tls12_cid. The epoch and sequence number are now also fed in the order they appear on the wire.

The secret check code now includes the name tag, and it is built in a different way, so a code made for a tagged message can never be mistaken for one made for an untagged message.

§6Updating the Peer Address

When a record with a CID arrives from a source address different from the one currently associated with the connection, the receiver MUST NOT replace the address it sends to unless three conditions are met.

  • The datagram has been cryptographically verified by the normal DTLS record processing.
  • It is newer, in both epoch and sequence number, than the newest datagram received. This stops reordered old datagrams from reverting a valid change and limits an attacker's ability to force a spurious change by replaying datagrams.
  • There is a strategy for ensuring the new address can receive and process DTLS records. The RFC mandates none, but suggests an application-level check, such as a small ping-pong exchange, or a DTLS-specific mechanism as described in the draft it cites.

The RFC does not require the anti-replay window from RFC 6347. Either the window or the newer-than-latest rule prevents address updates from replay attacks. A datagram that passes verification but triggers no address change is still a valid record and goes to the application. Records with bad MACs or that are otherwise invalid MUST be silently discarded.

If a letter arrives from a new return address, you only start writing back to that new address after checking the letter is real, that it is newer than your last letter, and that someone really lives there.

§7Example Exchange

The RFC's example shows a CID used in one direction only, from client to server. The client sends connection_id=empty, meaning it will not receive a CID, and the server answers with connection_id=100. After the handshake reaches encryption, the client's records carry CID=100.

In DTLS 1.2 only one handshake message is encrypted, the Finished message. So in this example only the client's Finished and the application data it sends include a CID. Server-to-client records use the old format because the client asked for no CID.

The server gives the client a name tag, number 100. The client wears it on its secret messages, but the server wears none, so only one side labels its messages.

CID USED FROM CLIENT TO SERVER ONLY (RFC 9146, FIGURE 4, ABRIDGED)
ClientServer
  1. ClientHello (connection_id=empty)The client will not receive a CID.
  2. HelloVerifyRequest (cookie)
  3. ClientHello (connection_id=empty, cookie)
  4. ServerHello (connection_id=100) ... ServerHelloDoneThe server asks the client to send with CID 100.
  5. Certificate ... Finished, with CID=100Finished is the first encrypted record, so it carries the CID.
  6. ChangeCipherSpec, Finished
  7. Application Data, with CID=100
  8. Application Data

§8Privacy and Security Considerations

The CID replaces the 5-tuple as an identifier that persists for the whole connection, and any identifier brings a risk of linkability. An on-path observer can link all payloads that carry the same ID pair. Without multihoming or mobility, the CID exposes the same information as the 5-tuple. With multihoming, a passive attacker can correlate traffic over the two paths. Because DTLS 1.2 has no CID update mechanism, the RFC says the extension is unsuitable for mobility scenarios where correlation matters, and such deployments SHOULD refuse CIDs in DTLS 1.2 and use DTLS 1.3, which has a CID update and sequence number encryption.

On the positive side, the new record format brings padding, which inflates ciphertext size and makes traffic analysis harder. Endpoints can also use the CID to attach arbitrary per-connection metadata to records, which could inform on-path observers. Implementations concerned about this SHOULD refuse to use CIDs.

For security, an on-path adversary can mount reflection attacks against third parties because a peer cannot tell a genuine address change from a malicious one. This matters most when the request is small and the response large. An attacker who sees the traffic can also replay datagrams with modified addresses or ports, which is why the address update rules in the previous section matter.

A name tag that never changes lets people watching you tell it is the same you every time. If that matters, use the newer version, which can change the tag.

§8References