diff --git a/draft-ietf-tls-rfc8446bis.html b/draft-ietf-tls-rfc8446bis.html index b1fa63c9..6ddf2088 100644 --- a/draft-ietf-tls-rfc8446bis.html +++ b/draft-ietf-tls-rfc8446bis.html @@ -15,12 +15,12 @@ RFCs 5077, 5246, 6961, and 8446. This document also specifies new requirements for TLS 1.2 implementations. " name="description"> - + - - - - - -
-Internet-Draft | -TLS | -January 2024 | -
Rescorla | -Expires 26 July 2024 | -[Page] | -
This document specifies version 1.3 of the Transport Layer Security -(TLS) protocol. TLS allows client/server applications to communicate -over the Internet in a way that is designed to prevent eavesdropping, -tampering, and message forgery.¶
-This document updates RFCs 5705, 6066, 7627, and 8422 and obsoletes -RFCs 5077, 5246, 6961, and 8446. This document also specifies new -requirements for TLS 1.2 implementations.¶
-- This Internet-Draft is submitted in full conformance with the - 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 - and may be updated, replaced, or obsoleted by other documents at any - time. It is inappropriate to use Internet-Drafts as reference - material or to cite them other than as "work in progress."¶
-- This Internet-Draft will expire on 26 July 2024.¶
-- Copyright (c) 2024 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.¶
-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/ekr/tls13-spec. Instructions are on that page as -well.¶
-The primary goal of TLS is to provide a secure channel between two -communicating peers; the only requirement from the underlying -transport is a reliable, in-order data stream. Specifically, the -secure channel should provide the following properties:¶
-Authentication: The server side of the channel is always -authenticated; the client side is optionally -authenticated. Authentication can happen via asymmetric cryptography -(e.g., RSA [RSA], the Elliptic Curve Digital Signature -Algorithm (ECDSA) [DSS], or the Edwards-Curve Digital Signature -Algorithm (EdDSA) [RFC8032]) or a symmetric pre-shared key -(PSK).¶
-Confidentiality: Data sent over the channel after establishment -is only visible to the -endpoints. TLS does not hide the length of the data it transmits, -though endpoints are able to pad TLS records in order to obscure lengths -and improve protection against traffic analysis techniques.¶
-Integrity: Data sent over the channel after establishment cannot be -modified by attackers without detection.¶
-These properties should be true even in the face of an attacker who has complete -control of the network, as described in [RFC3552]. -See Appendix F for a more complete statement of the relevant security -properties.¶
-TLS consists of two primary components:¶
-A handshake protocol (Section 4) that authenticates the communicating parties, -negotiates cryptographic modes and parameters, and establishes -shared keying material. The handshake protocol is designed to -resist tampering; an active attacker should not be able to force -the peers to negotiate different parameters than they would -if the connection were not under attack.¶
-A record protocol (Section 5) that uses the parameters established by the -handshake protocol to protect traffic between the communicating -peers. The record protocol divides traffic up into a series of -records, each of which is independently protected using the -traffic keys.¶
-TLS is application protocol independent; higher-level protocols can -layer on top of TLS transparently. The TLS standard, however, does not -specify how protocols add security with TLS; how to -initiate TLS handshaking and how to interpret the authentication -certificates exchanged are left to the judgment of the designers and -implementors of protocols that run on top of TLS. Application -protocols using TLS MUST specify how TLS works with their -application protocol, including how and when handshaking -occurs, and how to do identity verification. [I-D.ietf-uta-rfc6125bis] -provides useful guidance on integrating TLS with application -protocols.¶
-This document defines TLS version 1.3. While TLS 1.3 is not directly -compatible with previous versions, all versions of TLS incorporate a -versioning mechanism which allows clients and servers to interoperably -negotiate a common version if one is supported by both peers.¶
-This document supersedes and obsoletes previous versions of TLS, -including version 1.2 [RFC5246]. It also obsoletes the TLS ticket -mechanism defined in [RFC5077] and replaces it with the mechanism -defined in Section 2.2. Because TLS 1.3 changes the way keys are derived, it -updates [RFC5705] as described in Section 7.5. It also changes -how Online Certificate Status Protocol (OCSP) messages are carried and therefore updates [RFC6066] -and obsoletes [RFC6961] as described in Section 4.4.2.1.¶
-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.¶
-The following terms are used:¶
-client: The endpoint initiating the TLS connection.¶
-connection: A transport-layer connection between two endpoints.¶
-endpoint: Either the client or server of the connection.¶
-handshake: An initial negotiation between client and server that establishes the parameters of their subsequent interactions within TLS.¶
-peer: An endpoint. When discussing a particular endpoint, "peer" refers to the endpoint that is not the primary subject of discussion.¶
-receiver: An endpoint that is receiving records.¶
-sender: An endpoint that is transmitting records.¶
-server: The endpoint that did not initiate the TLS connection.¶
-TLS 1.3 was originally specified in [RFC8446]. This document is a -minor update to TLS 1.3 that retains the same version number and is -backward compatible. It tightens some requirements and contains -updated text in areas which were found to be unclear as well as other -editorial improvements. In addition, it removes the use of the term -"master" as applied to secrets in favor of the term "main" or shorter -names where no term was necessary. This document makes the following -specific technical changes:¶
-Forbid negotiating TLS 1.0 and 1.1 as they are now deprecated by [RFC8996].¶
-Removes ambiguity around which hash is used with PreSharedKeys and -HelloRetryRequest.¶
-Require that clients ignore NewSessionTicket if they do not -support resumption.¶
-Upgrade the requirement to initiate key update before exceeding -key usage limits to MUST.¶
-Limit the number of permitted KeyUpdate messages.¶
-Restore text defining the level of "close_notify" to "warning". -Clarify behavior around "user_canceled", requiring that -"close_notify" be sent and that "user_canceled" should -be ignored.¶
-Add a "general_error" generic alert.¶
-Corrected the lower bound on CertificateRequest.extensions -to be 0 bytes. This was an error in the syntax as it -is possible to send no extensions, which results in -length 0.¶
-In addition, there have been some improvements to the -security considerations, especially around privacy.¶
-The following is a list of the major functional differences between -TLS 1.2 and TLS 1.3. It is not intended to be exhaustive, and there -are many minor differences.¶
-The list of supported symmetric encryption algorithms has been pruned of all algorithms that -are considered legacy. Those that remain are all Authenticated Encryption -with Associated Data (AEAD) algorithms. The cipher suite concept has been -changed to separate the authentication and key exchange mechanisms from -the record protection algorithm (including secret key length) and a hash -to be used with both the key derivation function and handshake message -authentication code (MAC).¶
-A zero round-trip time (0-RTT) mode was added, saving a round trip at connection setup for -some application data, at the cost of certain security properties.¶
-Static RSA and Diffie-Hellman cipher suites have been removed; -all public-key based key exchange mechanisms now provide forward secrecy.¶
-All handshake messages after the ServerHello are now encrypted. The -newly introduced EncryptedExtensions message allows various extensions -previously sent in the clear in the ServerHello to also enjoy -confidentiality protection.¶
-The key derivation function has been redesigned. The new design allows -easier analysis by cryptographers due to their improved key separation -properties. The HMAC-based Extract-and-Expand Key Derivation Function (HKDF) -is used as an underlying primitive.¶
-The handshake state machine has been significantly restructured to -be more consistent and to remove superfluous messages such as -ChangeCipherSpec (except when needed for middlebox compatibility).¶
-Elliptic curve algorithms are now in the base spec, and new signature -algorithms, such as EdDSA, are included. TLS 1.3 removed point format -negotiation in favor of a single point format for each curve.¶
-Other cryptographic improvements were made, including changing the RSA padding to use -the RSA Probabilistic Signature Scheme (RSASSA-PSS), and the removal -of compression, the Digital Signature Algorithm (DSA), and -custom Ephemeral Diffie-Hellman (DHE) groups.¶
-The TLS 1.2 version negotiation mechanism has been deprecated in favor -of a version list in an extension. This increases compatibility with -existing servers that incorrectly implemented version negotiation.¶
-Session resumption with and without server-side state as well as the -PSK-based cipher suites of earlier TLS versions have been replaced by a -single new PSK exchange.¶
-References have been updated to point to the updated versions of RFCs, as -appropriate (e.g., RFC 5280 rather than RFC 3280).¶
-This document defines several changes that optionally affect -implementations of TLS 1.2, including those which do not also -support TLS 1.3:¶
-A version downgrade protection mechanism is described in Section 4.1.3.¶
-RSASSA-PSS signature schemes are defined in Section 4.2.3.¶
-The "supported_versions" ClientHello extension can be used to negotiate -the version of TLS to use, in preference to the legacy_version field of -the ClientHello.¶
-The "signature_algorithms_cert" extension allows a client to indicate -which signature algorithms it can validate in X.509 certificates.¶
-The term "master" as applied to secrets has been removed, and the -"extended_master_secret" extension [RFC7627] has been renamed to -"extended_main_secret".¶
-Additionally, this document clarifies some compliance requirements for earlier -versions of TLS; see Section 9.3.¶
-The cryptographic parameters used by the secure channel are produced by the -TLS handshake protocol. This sub-protocol of TLS is used by the client -and server when first communicating with each other. -The handshake protocol allows peers to negotiate a protocol version, -select cryptographic algorithms, authenticate each other (with -client authentication being optional), and establish shared secret keying material. -Once the handshake is complete, the peers use the established keys -to protect the application-layer traffic.¶
-A failure of the handshake or other protocol error triggers the -termination of the connection, optionally preceded by an alert message -(Section 6).¶
-TLS supports three basic key exchange modes:¶
-(EC)DHE (Diffie-Hellman over either finite fields or elliptic curves)¶
-PSK-only¶
-PSK with (EC)DHE¶
-Figure 1 below shows the basic full TLS handshake:¶
-The handshake can be thought of as having three phases (indicated -in the diagram above):¶
-Key Exchange: Establish shared keying material and select the - cryptographic parameters. Everything after this phase is - encrypted.¶
-Server Parameters: Establish other handshake parameters - (whether the client is authenticated, application-layer protocol support, etc.).¶
-Authentication: Authenticate the server (and, optionally, the client) - and provide key confirmation and handshake integrity.¶
-In the Key Exchange phase, the client sends the ClientHello -(Section 4.1.2) message, which contains a random nonce -(ClientHello.random); its offered protocol versions; a list of -symmetric cipher/HKDF hash pairs; either a list of Diffie-Hellman key shares (in the -"key_share" (Section 4.2.8) extension), a list of pre-shared key labels (in the -"pre_shared_key" (Section 4.2.11) extension), or both; and -potentially additional extensions. Additional fields and/or messages -may also be present for middlebox compatibility.¶
-The server processes the ClientHello and determines the appropriate -cryptographic parameters for the connection. It then responds with its -own ServerHello (Section 4.1.3), which indicates the negotiated connection -parameters. The combination of the ClientHello -and the ServerHello determines the shared keys. If (EC)DHE -key establishment is in use, then the ServerHello -contains a "key_share" extension with the server's ephemeral -Diffie-Hellman share; the server's share MUST be in the same group as one of the -client's shares. If PSK key establishment is -in use, then the ServerHello contains a "pre_shared_key" -extension indicating which of the client's offered PSKs was selected. -Note that implementations can use (EC)DHE and PSK together, in which -case both extensions will be supplied.¶
-The server then sends two messages to establish the Server Parameters:¶
-responses to ClientHello extensions that are not required to -determine the cryptographic parameters, other than those -that are specific to individual certificates. [Section 4.3.1]¶
-if certificate-based client authentication is desired, the -desired parameters for that certificate. This message is -omitted if client authentication is not desired. [Section 4.3.2]¶
-Finally, the client and server exchange Authentication messages. TLS -uses the same set of messages every time that certificate-based -authentication is needed. (PSK-based authentication happens as a side -effect of key exchange.) -Specifically:¶
-The certificate of the endpoint and any per-certificate extensions. -This message is omitted by the server if not authenticating with a -certificate and by the client if the server did not send -CertificateRequest (thus indicating that the client should not -authenticate with a certificate). Note that if raw -public keys [RFC7250] or the cached information extension -[RFC7924] are in use, then this message will not -contain a certificate but rather some other value corresponding to -the server's long-term key. [Section 4.4.2]¶
-A signature over the entire handshake using the private key -corresponding to the public key in the Certificate message. This -message is omitted if the endpoint is not authenticating via a -certificate. [Section 4.4.3]¶
-A MAC (Message Authentication Code) over the entire handshake. -This message provides key confirmation, binds the endpoint's identity -to the exchanged keys, and in PSK mode -also authenticates the handshake. [Section 4.4.4]¶
-Upon receiving the server's messages, the client responds with its Authentication -messages, namely Certificate and CertificateVerify (if requested), and Finished.¶
-At this point, the handshake is complete, and the client and server -derive the keying material required by the record layer to exchange -application-layer data protected through authenticated encryption. -Application Data MUST NOT be sent prior to sending the Finished message, -except as specified -in Section 2.3. -Note that while the server may send Application Data prior to receiving -the client's Authentication messages, any data sent at that point is, -of course, being sent to an unauthenticated peer.¶
- -Although TLS PSKs can be established externally, -PSKs can also be established in a previous connection and -then used to establish a new connection ("session resumption" or "resuming" with a PSK). -Once a handshake has completed, the server can -send the client a PSK identity that corresponds to a unique key derived from -the initial handshake (see Section 4.6.1). The client -can then use that PSK identity in future handshakes to negotiate the use -of the associated PSK. If the server accepts the PSK, then the security context of the -new connection is cryptographically tied to the original connection and the key derived -from the initial handshake is used to bootstrap the cryptographic state -instead of a full handshake. -In TLS 1.2 and below, this functionality was provided by "session IDs" and -"session tickets" [RFC5077]. Both mechanisms are obsoleted in TLS 1.3.¶
-PSKs can be used with (EC)DHE key exchange in order to provide forward -secrecy in combination with shared keys, or can be used alone, at the -cost of losing forward secrecy for the application data.¶
-Figure 3 shows a pair of handshakes in which the first handshake establishes -a PSK and the second handshake uses it:¶
-As the server is authenticating via a PSK, it does not send a -Certificate or a CertificateVerify message. When a client offers resumption -via a PSK, it SHOULD also supply a "key_share" extension to the server to -allow the server to decline resumption and fall back -to a full handshake, if needed. The server responds with a "pre_shared_key" -extension to negotiate the use of PSK key establishment and can (as shown here) -respond with a "key_share" extension to do (EC)DHE key establishment, thus -providing forward secrecy.¶
-When PSKs are provisioned externally, the PSK identity and the KDF hash -algorithm to -be used with the PSK MUST also be provisioned.¶
-When using an externally provisioned pre-shared secret, a critical -consideration is using sufficient entropy during the key generation, as -discussed in [RFC4086]. Deriving a shared secret from a password or other -low-entropy sources is not secure. A low-entropy secret, or password, is -subject to dictionary attacks based on the PSK binder. The specified PSK -authentication is not a strong password-based authenticated key exchange even -when used with Diffie-Hellman key establishment. Specifically, it does not -prevent an attacker that can observe the handshake from performing -a brute-force attack on the password/pre-shared key.¶
-When clients and servers share a PSK (either obtained externally or -via a previous handshake), TLS 1.3 allows clients to send data on the -first flight ("early data"). The client uses the PSK to authenticate -the server and to encrypt the early data.¶
-As shown in Figure 4, the 0-RTT data is just added to the 1-RTT -handshake in the first flight. The rest of the handshake uses the same messages -as for a 1-RTT handshake with PSK resumption.¶
-IMPORTANT NOTE: The security properties for 0-RTT data are weaker than -those for other kinds of TLS data. Specifically:¶
-The protocol does not provide any forward secrecy guarantees for this data. -The server's behavior determines what forward secrecy guarantees, if any, apply -(see Section 8.1). This behavior is not communicated to the client -as part of the protocol. Therefore, absent out-of-band knowledge of the -server's behavior, the client should assume that this data is not forward -secret.¶
-There are no guarantees of non-replay between connections. -Protection against replay for ordinary TLS 1.3 1-RTT data is -provided via the server's Random value, but 0-RTT data does not depend -on the ServerHello and therefore has weaker guarantees. This is especially -relevant if the data is authenticated either with TLS client -authentication or inside the application protocol. The same warnings -apply to any use of the early_exporter_secret.¶
-0-RTT data cannot be duplicated within a connection (i.e., the server will -not process the same data twice for the same connection), and an -attacker will not be able to make 0-RTT data appear to be 1-RTT data -(because it is protected with different keys). Appendix F.5 -contains a description of potential attacks, and Section 8 -describes mechanisms which the server can use to limit the impact of -replay.¶
-This document deals with the formatting of data in an external representation. -The following very basic and somewhat casually defined presentation syntax will -be used.¶
-In the definitions below, optional components of this syntax are denoted by -enclosing them in "[[ ]]" (double brackets).¶
-The representation of all data items is explicitly specified. The basic data -block size is one byte (i.e., 8 bits). Multiple-byte data items are -concatenations of bytes, from left to right, from top to bottom. From the byte -stream, a multi-byte item (a numeric in the following example) is formed (using C -notation) by:¶
-- value = (byte[0] << 8*(n-1)) | (byte[1] << 8*(n-2)) | - ... | byte[n-1]; -¶ -
This byte ordering for multi-byte values is the commonplace network byte order -or big-endian format.¶
-Comments begin with "/*" and end with "*/".¶
-Single-byte entities containing uninterpreted data are of type -opaque.¶
-A type alias T' for an existing type T is defined by:¶
-- T T'; -¶ -
The basic numeric data type is an unsigned byte (uint8). All larger numeric -data types are constructed from a fixed-length series of bytes concatenated as -described in Section 3.1 and are also unsigned. The following numeric -types are predefined.¶
-- uint8 uint16[2]; - uint8 uint24[3]; - uint8 uint32[4]; - uint8 uint64[8]; -¶ -
All values, here and elsewhere in the specification, are transmitted in network byte -(big-endian) order; the uint32 represented by the hex bytes 01 02 03 04 is -equivalent to the decimal value 16909060.¶
-A vector (single-dimensioned array) is a stream of homogeneous data elements. -For presentation purposes, this specification refers to vectors as lists. -The size of the vector may be specified at documentation time or left -unspecified until runtime. In either case, the length declares the number of -bytes, not the number of elements, in the vector. The syntax for specifying a -new type, T', that is a fixed-length vector of type T is¶
-- T T'[n]; -¶ -
Here, T' occupies n bytes in the data stream, where n is a multiple of the size -of T. The length of the vector is not included in the encoded stream.¶
-In the following example, Datum is defined to be three consecutive bytes that -the protocol does not interpret, while Data is three consecutive Datum, -consuming a total of nine bytes.¶
-- opaque Datum[3]; /* three uninterpreted bytes */ - Datum Data[9]; /* three consecutive 3-byte vectors */ -¶ -
Variable-length vectors are defined by specifying a subrange of legal lengths, -inclusively, using the notation <floor..ceiling>. When these are encoded, the -actual length precedes the vector's contents in the byte stream. The length -will be in the form of a number consuming as many bytes as required to hold the -vector's specified maximum (ceiling) length. A variable-length vector with an -actual length field of zero is referred to as an empty vector.¶
-- T T'<floor..ceiling>; -¶ -
In the following example, "mandatory" is a vector that must contain between 300 -and 400 bytes of type opaque. It can never be empty. The actual length field -consumes two bytes, a uint16, which is sufficient to represent the value 400 -(see Section 3.3). Similarly, "longer" can represent up to 800 bytes of -data, or 400 uint16 elements, and it may be empty. Its encoding will include a -two-byte actual length field prepended to the vector. The length of an encoded -vector must be an exact multiple of the length of a single element (e.g., -a 17-byte vector of uint16 would be illegal).¶
-- opaque mandatory<300..400>; - /* length field is two bytes, cannot be empty */ - uint16 longer<0..800>; - /* zero to 400 16-bit unsigned integers */ -¶ -
An additional sparse data type, called "enum" or -"enumerated", is available. Each definition is a different type. Only enumerateds of -the same type may be assigned or compared. Every element of an -enumerated must be assigned a value, as demonstrated in the following -example. Since the elements of the enumerated are not ordered, they -can be assigned any unique value, in any order.¶
-- enum { e1(v1), e2(v2), ... , en(vn) [[, (n)]] } Te; -¶ -
Future extensions or additions to the protocol may define new values. -Implementations need to be able to parse and ignore unknown values unless the -definition of the field states otherwise.¶
-An enumerated occupies as much space in the byte stream as would its maximal -defined ordinal value. The following definition would cause one byte to be used -to carry fields of type Color.¶
-- enum { red(3), blue(5), white(7) } Color; -¶ -
One may optionally specify a value without its associated tag to force the -width definition without defining a superfluous element.¶
-In the following example, Taste will consume two bytes in the data stream but -can only assume the values 1, 2, or 4 in the current version of the protocol.¶
-- enum { sweet(1), sour(2), bitter(4), (32000) } Taste; -¶ -
The names of the elements of an enumeration are scoped within the defined type. -In the first example, a fully qualified reference to the second element of the -enumeration would be Color.blue. Such qualification is not required if the -target of the assignment is well specified.¶
-- Color color = Color.blue; /* overspecified, legal */ - Color color = blue; /* correct, type implicit */ -¶ -
The names assigned to enumerateds do not need to be unique. The numerical value -can describe a range over which the same name applies. The value includes the -minimum and maximum inclusive values in that range, separated by two period -characters. This is principally useful for reserving regions of the space.¶
-- enum { sad(0), meh(1..254), happy(255) } Mood; -¶ -
Structure types may be constructed from primitive types for convenience. Each -specification declares a new, unique type. The syntax used for definitions is much -like that of C.¶
-- struct { - T1 f1; - T2 f2; - ... - Tn fn; - } T; -¶ -
Fixed- and variable-length list (vector) fields are allowed using the standard list -syntax. Structures V1 and V2 in the variants example (Section 3.8) demonstrate this.¶
-The fields within a structure may be qualified using the type's name, with a -syntax much like that available for enumerateds. For example, T.f2 refers to -the second field of the previous declaration.¶
-Fields and variables may be assigned a fixed value using "=", as in:¶
-- struct { - T1 f1 = 8; /* T.f1 must always be 8 */ - T2 f2; - } T; -¶ -
Defined structures may have variants based on some knowledge that is -available within the environment. The selector must be an enumerated -type that defines the possible variants the structure defines. Each -arm of the select (below) specifies the type of that variant's field and an -optional field label. The mechanism by which the variant is selected -at runtime is not prescribed by the presentation language.¶
-- struct { - T1 f1; - T2 f2; - .... - Tn fn; - select (E) { - case e1: Te1 [[fe1]]; - case e2: Te2 [[fe2]]; - .... - case en: Ten [[fen]]; - }; - } Tv; -¶ -
For example:¶
-- enum { apple(0), orange(1) } VariantTag; - - struct { - uint16 number; - opaque string<0..10>; /* variable length */ - } V1; - - struct { - uint32 number; - opaque string[10]; /* fixed length */ - } V2; - - struct { - VariantTag type; - select (VariantRecord.type) { - case apple: V1; - case orange: V2; - }; - } VariantRecord; -¶ -
The handshake protocol is used to negotiate the security parameters -of a connection. Handshake messages are supplied to the TLS record layer, where -they are encapsulated within one or more TLSPlaintext or TLSCiphertext structures which are -processed and transmitted as specified by the current active connection state.¶
-- enum { - client_hello(1), - server_hello(2), - new_session_ticket(4), - end_of_early_data(5), - encrypted_extensions(8), - certificate(11), - certificate_request(13), - certificate_verify(15), - finished(20), - key_update(24), - message_hash(254), - (255) - } HandshakeType; - - struct { - HandshakeType msg_type; /* handshake type */ - uint24 length; /* remaining bytes in message */ - select (Handshake.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; - }; - } Handshake; -¶ -
Protocol messages MUST be sent in the order defined in -Section 4.4.1 and shown in the diagrams in Section 2. -A peer which receives a handshake message in an unexpected order -MUST abort the handshake with an "unexpected_message" alert.¶
-New handshake message types are assigned by IANA as described in -Section 11.¶
-The key exchange messages are used to determine the security capabilities -of the client and the server and to establish shared secrets, including -the traffic keys used to protect the rest of the handshake and the data.¶
-In TLS, the cryptographic negotiation proceeds by the client offering the -following four sets of options in its ClientHello:¶
-A list of cipher suites which indicates the AEAD algorithm/HKDF hash -pairs which the client supports.¶
-A "supported_groups" (Section 4.2.7) extension which indicates the (EC)DHE groups -which the client supports and a "key_share" (Section 4.2.8) extension which contains -(EC)DHE shares for some or all of these groups.¶
-A "signature_algorithms" (Section 4.2.3) extension which indicates the signature -algorithms which the client can accept. A "signature_algorithms_cert" extension (Section 4.2.3) may also be -added to indicate certificate-specific signature algorithms.¶
-A "pre_shared_key" (Section 4.2.11) extension which -contains a list of symmetric key identities known to the client and a -"psk_key_exchange_modes" (Section 4.2.9) -extension which indicates the key exchange modes that may be used -with PSKs.¶
-If the server does not select a PSK, then the first three of these -options are entirely orthogonal: the server independently selects a -cipher suite, an (EC)DHE group and key share for key establishment, -and a signature algorithm/certificate pair to authenticate itself to -the client. If there is no overlap between the received "supported_groups" -and the groups supported by the server, then the server MUST abort the -handshake with a "handshake_failure" or an "insufficient_security" alert.¶
-If the server selects a PSK, then it MUST also select a key -establishment mode from the list indicated by the client's -"psk_key_exchange_modes" extension (at present, PSK alone or with (EC)DHE). Note -that if the PSK can be used without (EC)DHE, then non-overlap in the -"supported_groups" parameters need not be fatal, as it is in the -non-PSK case discussed in the previous paragraph.¶
-If the server selects an (EC)DHE group and the client did not offer a -compatible "key_share" extension in the initial ClientHello, the server MUST -respond with a HelloRetryRequest (Section 4.1.4) message.¶
-If the server successfully selects parameters and does not require a -HelloRetryRequest, it indicates the selected parameters in the ServerHello as -follows:¶
-If PSK is being used, then the server will send a -"pre_shared_key" extension indicating the selected key.¶
-When (EC)DHE is in use, the server will also provide a "key_share" -extension. If PSK is not being used, then (EC)DHE and certificate-based -authentication are always used.¶
-When authenticating via a certificate, the server will send -the Certificate (Section 4.4.2) and CertificateVerify -(Section 4.4.3) messages. In TLS 1.3 -as defined by this document, either a PSK or a certificate -is always used, but not both. Future documents may define how -to use them together.¶
-If the server is unable to negotiate a supported set of parameters -(i.e., there is no overlap between the client and server parameters), -it MUST abort the handshake with either -a "handshake_failure" or "insufficient_security" fatal alert -(see Section 6).¶
-When a client first connects to a server, it is REQUIRED to send the -ClientHello as its first TLS message. The client will also send a -ClientHello when the server has responded to its ClientHello with a -HelloRetryRequest. In that case, the client MUST send the same -ClientHello without modification, except as follows:¶
-If a "key_share" extension was supplied in the HelloRetryRequest, -replacing the list of shares with a list containing a single -KeyShareEntry from the indicated group.¶
-Removing the "early_data" extension (Section 4.2.10) if one was -present. Early data is not permitted after a HelloRetryRequest.¶
-Including a "cookie" extension if one was provided in the -HelloRetryRequest.¶
-Updating the "pre_shared_key" extension if present by -recomputing the "obfuscated_ticket_age" and binder values -and (optionally) removing -any PSKs which are incompatible with the server's indicated -cipher suite.¶
-Optionally adding, removing, or changing the length of the "padding" -extension [RFC7685].¶
-Other modifications that may be allowed by an extension defined in the -future and present in the HelloRetryRequest.¶
-Because TLS 1.3 forbids renegotiation, if a server has negotiated TLS -1.3 and receives a ClientHello at any other time, it MUST terminate -the connection with an "unexpected_message" alert.¶
-If a server established a TLS connection with a previous version of TLS -and receives a TLS 1.3 ClientHello in a renegotiation, it MUST retain the -previous protocol version. In particular, it MUST NOT negotiate TLS 1.3.¶
-Structure of this message:¶
-- uint16 ProtocolVersion; - opaque Random[32]; - - uint8 CipherSuite[2]; /* Cryptographic suite selector */ - - struct { - ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */ - Random random; - opaque legacy_session_id<0..32>; - CipherSuite cipher_suites<2..2^16-2>; - opaque legacy_compression_methods<1..2^8-1>; - Extension extensions<8..2^16-1>; - } ClientHello; -¶ -
In previous versions of TLS, this field was used for version negotiation -and represented the highest version number supported by the client. -Experience has shown that many servers do not properly implement -version negotiation, leading to "version intolerance" in which -the server rejects an otherwise acceptable ClientHello with a version -number higher than it supports. -In TLS 1.3, the client indicates its version preferences in the -"supported_versions" extension (Section 4.2.1) and the legacy_version field MUST -be set to 0x0303, which is the version number for TLS 1.2. -TLS 1.3 ClientHellos are identified as having -a legacy_version of 0x0303 and a supported_versions extension -present with 0x0304 as the highest version indicated therein. -(See Appendix E for details about backward compatibility.) -A server which receives a legacy_version value not equal to 0x0303 MUST abort -the handshake with an "illegal_parameter" alert.¶
-32 bytes generated by a secure random number generator. -See Appendix C for additional information.¶
-Versions of TLS before TLS 1.3 supported a "session resumption" -feature which has been merged with pre-shared keys in this version -(see Section 2.2). A client which has a cached session ID -set by a pre-TLS 1.3 server SHOULD set this field to that value. In -compatibility mode (see Appendix E.4), this field MUST be non-empty, -so a client not offering a pre-TLS 1.3 session MUST generate a -new 32-byte value. This value need not be random but SHOULD be -unpredictable to avoid implementations fixating on a specific value -(also known as ossification). -Otherwise, it MUST be set as a zero-length list (i.e., a -zero-valued single byte length field).¶
-A list of the symmetric cipher options supported by the -client, specifically the record protection algorithm (including -secret key length) and a hash to be used with HKDF, in descending -order of client preference. Values are defined in Appendix B.4. -If the list contains cipher suites that -the server does not recognize, support, or wish to use, the server -MUST ignore those cipher suites and process the remaining ones as -usual. If the client is -attempting a PSK key establishment, it SHOULD advertise at least one -cipher suite indicating a Hash associated with the PSK.¶
-Versions of TLS before 1.3 supported compression with the list of -supported compression methods being sent in this field. For every TLS 1.3 -ClientHello, this list MUST contain exactly one byte, set to -zero, which corresponds to the "null" compression method in -prior versions of TLS. If a TLS 1.3 ClientHello is -received with any other value in this field, the server MUST -abort the handshake with an "illegal_parameter" alert. Note that TLS 1.3 -servers might receive TLS 1.2 or prior ClientHellos which contain -other compression methods and (if negotiating such a prior version) -MUST follow the procedures for -the appropriate prior version of TLS.¶
-Clients request extended functionality from servers by sending -data in the extensions field. The actual "Extension" format is -defined in Section 4.2. In TLS 1.3, the use -of certain extensions is mandatory, as functionality has moved into -extensions to preserve ClientHello compatibility with previous versions of TLS. -Servers MUST ignore unrecognized extensions.¶
-All versions of TLS allow an extensions field to optionally follow the -compression_methods field. TLS 1.3 ClientHello -messages always contain extensions (minimally "supported_versions", otherwise, -they will be interpreted as TLS 1.2 ClientHello messages). -However, TLS 1.3 servers might receive ClientHello messages without an -extensions field from prior versions of TLS. -The presence of extensions can be detected by determining whether there -are bytes following the compression_methods field at the end of the -ClientHello. Note that this method of detecting optional data differs -from the normal TLS method of having a variable-length field, but it -is used for compatibility with TLS before extensions were defined. -TLS 1.3 servers will need to perform this check first and only -attempt to negotiate TLS 1.3 if the "supported_versions" extension -is present. -If negotiating a version of TLS prior to 1.3, a server MUST check that -the message either contains no data after legacy_compression_methods -or that it contains a valid extensions block with no data following. -If not, then it MUST abort the handshake with a "decode_error" alert.¶
-In the event that a client requests additional functionality using -extensions and this functionality is not supplied by the server, the -client MAY abort the handshake.¶
-After sending the ClientHello message, the client waits for a ServerHello -or HelloRetryRequest message. If early data -is in use, the client may transmit early Application Data -(Section 2.3) while waiting for the next handshake message.¶
-The server will send this message in response to a ClientHello message -to proceed with the handshake if it is able to negotiate an acceptable -set of handshake parameters based on the ClientHello.¶
-Structure of this message:¶
-- struct { - ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */ - Random random; - opaque legacy_session_id_echo<0..32>; - CipherSuite cipher_suite; - uint8 legacy_compression_method = 0; - Extension extensions<6..2^16-1>; - } ServerHello; -¶ -
In previous versions of TLS, this field was used for version negotiation -and represented the selected version number for the connection. Unfortunately, -some middleboxes fail when presented with new values. -In TLS 1.3, the TLS server indicates its version using the -"supported_versions" extension (Section 4.2.1), -and the legacy_version field MUST -be set to 0x0303, which is the version number for TLS 1.2. -(See Appendix E for details about backward compatibility.)¶
-32 bytes generated by a secure random number generator. -See Appendix C for additional information. -The last 8 bytes MUST be overwritten as described -below if negotiating TLS 1.2 or TLS 1.1, but the -remaining bytes MUST be random. -This structure is generated by the server and MUST be -generated independently of the ClientHello.random.¶
-The contents of the client's legacy_session_id field. Note that -this field is echoed even if the client's value corresponded to -a cached pre-TLS 1.3 session which the server has chosen not -to resume. A client which receives a legacy_session_id_echo field -that does not match what it sent in the ClientHello -MUST abort the handshake with an "illegal_parameter" -alert.¶
-The single cipher suite selected by the server from the ClientHello.cipher_suites -list. A client which receives a cipher suite -that was not offered MUST abort the handshake with an "illegal_parameter" -alert.¶
-A single byte which MUST have the value 0.¶
-A list of extensions. The ServerHello MUST only include extensions -which are required to establish the cryptographic context and negotiate -the protocol version. All TLS 1.3 ServerHello messages MUST contain the -"supported_versions" extension. Current ServerHello messages additionally contain -either the "pre_shared_key" extension or the "key_share" extension, or both (when using -a PSK with (EC)DHE key establishment). Other extensions -(see Section 4.2) are sent -separately in the EncryptedExtensions message.¶
-For reasons of backward compatibility with middleboxes -(see Appendix E.4), the HelloRetryRequest -message uses the same structure as the ServerHello, but with -Random set to the special value of the SHA-256 of -"HelloRetryRequest":¶
-- CF 21 AD 74 E5 9A 61 11 BE 1D 8C 02 1E 65 B8 91 - C2 A2 11 16 7A BB 8C 5E 07 9E 09 E2 C8 A8 33 9C -¶ -
Upon receiving a message with type server_hello, implementations -MUST first examine the Random value and, if it matches -this value, process it as described in Section 4.1.4).¶
-TLS 1.3 has a downgrade protection mechanism embedded in the server's -random value. TLS 1.3 servers which negotiate TLS 1.2 or below in -response to a ClientHello MUST set the last 8 bytes of their -Random value specially in their ServerHello.¶
-If negotiating TLS 1.2, TLS 1.3 servers MUST set the last 8 bytes of their -Random value to the bytes:¶
-- 44 4F 57 4E 47 52 44 01 -¶ -
[RFC8996] and Appendix E.5 forbid -the negotiation of TLS versions below 1.2. However, server -implementations which do not follow that guidance MUST -set the last 8 bytes of their ServerHello.random value to the -bytes:¶
-- 44 4F 57 4E 47 52 44 00 -¶ -
TLS 1.3 clients receiving a ServerHello indicating TLS 1.2 or below -MUST check that the last 8 bytes are not equal to either of these values. -TLS 1.2 clients SHOULD also check that the last 8 bytes are not -equal to the second value if the ServerHello indicates TLS 1.1 or -below. If a match is found, the client MUST abort the handshake -with an "illegal_parameter" alert. This mechanism provides limited -protection against downgrade attacks over and above what is provided -by the Finished exchange: because the ServerKeyExchange, a message -present in TLS 1.2 and below, includes a signature over both random -values, it is not possible for an active attacker to modify the -random values without detection as long as ephemeral ciphers are used. -It does not provide downgrade protection when static RSA is used.¶
-Note: This is a change from [RFC5246], so in practice many TLS 1.2 clients -and servers will not behave as specified above.¶
-A legacy TLS client performing renegotiation with TLS 1.2 or prior -and which receives a TLS 1.3 ServerHello during renegotiation -MUST abort the handshake with a "protocol_version" alert. -Note that renegotiation is not possible when TLS 1.3 has been -negotiated.¶
-The server will send this message in response to a ClientHello message -if it is able to find an acceptable set of parameters but the -ClientHello does not contain sufficient information to proceed with -the handshake. As discussed in Section 4.1.3, the HelloRetryRequest -has the same format as a ServerHello message, and the -legacy_version, legacy_session_id_echo, cipher_suite, and legacy_compression_method fields have the same meaning. However, for convenience we -discuss "HelloRetryRequest" throughout this document as if it were -a distinct message.¶
-The server's extensions MUST contain "supported_versions". -Additionally, it SHOULD contain the minimal set of extensions necessary for the -client to generate a correct ClientHello pair. As with the ServerHello, a -HelloRetryRequest MUST NOT contain any extensions that were not first -offered by the client in its ClientHello, with the exception of -optionally the "cookie" (see Section 4.2.2) extension.¶
-Upon receipt of a HelloRetryRequest, the client MUST check -the legacy_version, legacy_session_id_echo, cipher_suite, -and legacy_compression_method as specified in Section 4.1.3 and then process the -extensions, starting with determining the version using -"supported_versions". Clients MUST abort the handshake with -an "illegal_parameter" alert if the HelloRetryRequest would not result in -any change in the ClientHello. If a client receives a second -HelloRetryRequest in the same connection (i.e., where -the ClientHello was itself in response to a HelloRetryRequest), it -MUST abort the handshake with an "unexpected_message" alert.¶
-Otherwise, the client MUST process all extensions in the -HelloRetryRequest and send a second updated ClientHello. The -HelloRetryRequest extensions defined in this specification are:¶
-supported_versions (see Section 4.2.1)¶
-cookie (see Section 4.2.2)¶
-key_share (see Section 4.2.8)¶
-A client which receives a cipher suite that was not -offered MUST abort the handshake. Servers MUST ensure that they -negotiate the same cipher suite when receiving a conformant updated -ClientHello (if the server selects the cipher suite as the first step -in the negotiation, then this will happen automatically). Upon -receiving the ServerHello, clients MUST check that the cipher suite -supplied in the ServerHello is the same as that in the -HelloRetryRequest and otherwise abort the handshake with an -"illegal_parameter" alert.¶
-In addition, in its updated ClientHello, the client SHOULD NOT offer -any pre-shared keys associated with a hash other than that of the -selected cipher suite. This allows the client to avoid having to -compute partial hash transcripts for multiple hashes in the second -ClientHello.¶
-The value of selected_version in the HelloRetryRequest "supported_versions" -extension MUST be retained in the ServerHello, and a client MUST abort the -handshake with an "illegal_parameter" alert if the value changes.¶
-A number of TLS messages contain tag-length-value encoded extensions structures.¶
-- struct { - ExtensionType extension_type; - opaque extension_data<0..2^16-1>; - } Extension; - - enum { - server_name(0), /* RFC 6066 */ - max_fragment_length(1), /* RFC 6066 */ - status_request(5), /* RFC 6066 */ - supported_groups(10), /* RFC 8422, 7919 */ - signature_algorithms(13), /* RFC 8446 */ - use_srtp(14), /* RFC 5764 */ - heartbeat(15), /* RFC 6520 */ - application_layer_protocol_negotiation(16), /* RFC 7301 */ - signed_certificate_timestamp(18), /* RFC 6962 */ - client_certificate_type(19), /* RFC 7250 */ - server_certificate_type(20), /* RFC 7250 */ - padding(21), /* RFC 7685 */ - pre_shared_key(41), /* RFC 8446 */ - early_data(42), /* RFC 8446 */ - supported_versions(43), /* RFC 8446 */ - cookie(44), /* RFC 8446 */ - psk_key_exchange_modes(45), /* RFC 8446 */ - certificate_authorities(47), /* RFC 8446 */ - oid_filters(48), /* RFC 8446 */ - post_handshake_auth(49), /* RFC 8446 */ - signature_algorithms_cert(50), /* RFC 8446 */ - key_share(51), /* RFC 8446 */ - (65535) - } ExtensionType; -¶ -
Here:¶
-"extension_type" identifies the particular extension type.¶
-"extension_data" contains information specific to the particular -extension type.¶
-The contents of the "extension_data" field are typically defined by an -extension-specific structure defined in the TLS presentation language. Unless -otherwise specified, trailing data is forbidden. That is, senders MUST NOT -include data after the structure in the "extension_data" field. When -processing an extension, receivers MUST abort the handshake with a -"decode_error" alert if there is data left over after parsing the structure. -This does not apply if the receiver does not implement or is configured to -ignore an extension.¶
-The list of extension types is maintained by IANA as described in -Section 11.¶
-Extensions are generally structured in a request/response fashion, -though some extensions are just requests with no corresponding -response (i.e., indications). The client sends its extension requests -in the ClientHello message, and the server sends its extension -responses in the ServerHello, EncryptedExtensions, HelloRetryRequest, -and Certificate messages. The server sends extension requests in the -CertificateRequest message which a client MAY respond to with a -Certificate message. The server MAY also send unsolicited extensions -in the NewSessionTicket, though the client does not respond directly -to these.¶
-Implementations MUST NOT send extension responses -(i.e., in the ServerHello, EncryptedExtensions, HelloRetryRequest, -and Certificate messages) -if the remote endpoint did not send the corresponding extension requests, -with the exception of the "cookie" extension in the HelloRetryRequest. -Upon receiving such an extension, an endpoint MUST abort the handshake with an -"unsupported_extension" alert.¶
-The table below indicates the messages where a given extension may -appear, using the following notation: CH (ClientHello), SH -(ServerHello), EE (EncryptedExtensions), CT (Certificate), CR -(CertificateRequest), NST (NewSessionTicket), and HRR -(HelloRetryRequest). If an implementation receives an extension which -it recognizes and which is not specified for the message in which it -appears, it MUST abort the handshake with an "illegal_parameter" alert.¶
-Extension | -TLS 1.3 | -
---|---|
server_name [RFC6066] - | -CH, EE | -
max_fragment_length [RFC6066] - | -CH, EE | -
status_request [RFC6066] - | -CH, CR, CT | -
supported_groups [RFC7919] - | -CH, EE | -
signature_algorithms [RFC8446] - | -CH, CR | -
use_srtp [RFC5764] - | -CH, EE | -
heartbeat [RFC6520] - | -CH, EE | -
application_layer_protocol_negotiation [RFC7301] - | -CH, EE | -
signed_certificate_timestamp [RFC6962] - | -CH, CR, CT | -
client_certificate_type [RFC7250] - | -CH, EE | -
server_certificate_type [RFC7250] - | -CH, EE | -
padding [RFC7685] - | -CH | -
cached_info [RFC7924] - | -CH, EE | -
compress_certificate [RFC8879] - | -CH, CR | -
record_size_limit [RFC8849] - | -CH, EE | -
delegated_credentials [RFC9345] - | -CH, CR, CT | -
supported_ekt_ciphers [RFC8870] - | -CH, EE | -
pre_shared_key [RFC8446] - | -CH, SH | -
early_data [RFC8446] - | -CH, EE, NST | -
psk_key_exchange_modes [RFC8446] - | -CH | -
cookie [RFC8446] - | -CH, HRR | -
supported_versions [RFC8446] - | -CH, SH, HRR | -
certificate_authorities [RFC8446] - | -CH, CR | -
oid_filters [RFC8446] - | -CR | -
post_handshake_auth [RFC8446] - | -CH | -
signature_algorithms_cert [RFC8446] - | -CH, CR | -
key_share [RFC8446] - | -CH, SH, HRR | -
transparency_info [RFC9162] - | -CH, CR, CT | -
connection_id [RFC9146] - | -CH, SH | -
external_id_hash [RFC8844] - | -CH, EE | -
external_session_id [RFC8844] - | -CH, EE | -
quic_transport_parameters [RFC9001] - | -CH, EE | -
ticket_request [RFC9149] - | -CH, EE | -
Note: this table includes only extensions marked -"Recommended" at the time of this writing.¶
-When multiple extensions of different types are present, the -extensions MAY appear in any order, with the exception of -"pre_shared_key" (Section 4.2.11) which MUST be -the last extension in the ClientHello (but can appear anywhere in -the ServerHello extensions block). -There MUST NOT be more than one extension of the same type in a given -extension block.¶
-In TLS 1.3, unlike TLS 1.2, extensions are negotiated for each -handshake even when in resumption-PSK mode. However, 0-RTT parameters are -those negotiated in the previous handshake; mismatches may require -rejecting 0-RTT (see Section 4.2.10).¶
-There are subtle (and not so subtle) interactions that may occur in this -protocol between new features and existing features which may result in a -significant reduction in overall security. The following considerations should -be taken into account when designing new extensions:¶
-Some cases where a server does not agree to an extension are error -conditions (e.g., the handshake cannot continue), and some are -simply refusals to support particular features. In general, error -alerts should be used for the former and a field in the server -extension response for the latter.¶
-Extensions should, as far as possible, be designed to prevent any attack that -forces use (or non-use) of a particular feature by manipulation of handshake -messages. This principle should be followed regardless of whether the feature -is believed to cause a security problem. -Often the fact that the extension fields are included in the inputs to the -Finished message hashes will be sufficient, but extreme care is needed when -the extension changes the meaning of messages sent in the handshake phase. -Designers and implementors should be aware of the fact that until the -handshake has been authenticated, active attackers can modify messages and -insert, remove, or replace extensions.¶
-- struct { - select (Handshake.msg_type) { - case client_hello: - ProtocolVersion versions<2..254>; - - case server_hello: /* and HelloRetryRequest */ - ProtocolVersion selected_version; - }; - } SupportedVersions; -¶ -
The "supported_versions" extension is used by the client to indicate -which versions of TLS it supports and by the server to indicate -which version it is using. The extension contains a list of -supported versions in preference order, with the most preferred -version first. Implementations of this specification MUST send this -extension in the ClientHello containing all versions of TLS which they are -prepared to negotiate (for this specification, that means minimally -0x0304, but if previous versions of TLS are allowed to be negotiated, -they MUST be present as well).¶
-If this extension is not present, servers which are compliant with -this specification and which also support TLS 1.2 -MUST negotiate TLS 1.2 or prior as specified in -[RFC5246], even if ClientHello.legacy_version is 0x0304 or later. -Servers MAY abort the handshake upon receiving a ClientHello with -legacy_version 0x0304 or later.¶
-If this extension is present in the ClientHello, servers MUST NOT use the -ClientHello.legacy_version value for version negotiation and MUST use only the -"supported_versions" extension to determine client -preferences. Servers MUST only select a version of TLS present in that -extension and MUST ignore any unknown versions that are present in that -extension. Note that this -mechanism makes it possible to negotiate a version prior to TLS 1.2 if -one side supports a sparse range. Implementations of TLS 1.3 which choose -to support prior versions of TLS SHOULD support TLS 1.2. -Servers MUST be prepared to receive ClientHellos that include this -extension but do not include 0x0304 in the list of versions.¶
-A server which negotiates a version of TLS prior to TLS 1.3 MUST -set ServerHello.version and MUST NOT send the "supported_versions" -extension. A server which negotiates TLS 1.3 MUST respond by sending a -"supported_versions" extension containing the selected version value -(0x0304). It MUST set the ServerHello.legacy_version field to 0x0303 (TLS -1.2).¶
-After checking ServerHello.random to determine if the server handshake message -is a ServerHello or HelloRetryRequest, clients MUST check for this extension -prior to processing the rest of the ServerHello. This will require clients to -parse the ServerHello in order to read the extension. -If this extension is present, clients MUST ignore the -ServerHello.legacy_version value and MUST use only the -"supported_versions" extension to determine the selected version. If the -"supported_versions" extension in the ServerHello contains a version not offered by the -client or contains a version prior to TLS 1.3, the client MUST abort the handshake with an -"illegal_parameter" alert.¶
-TLS 1.3 provides two extensions for indicating which signature -algorithms may be used in digital signatures. The -"signature_algorithms_cert" extension applies to signatures in -certificates, and the "signature_algorithms" extension, which originally -appeared in TLS 1.2, applies to signatures in CertificateVerify -messages. The keys found in certificates MUST also be of -appropriate type for the signature algorithms they are used -with. This is a particular issue for RSA keys and PSS signatures, -as described below. If no "signature_algorithms_cert" extension is present, -then the "signature_algorithms" extension also applies to signatures -appearing in certificates. Clients which desire the server to authenticate -itself via a certificate MUST send the "signature_algorithms" extension. If a server -is authenticating via a certificate and the client has not sent a -"signature_algorithms" extension, then the server MUST abort the -handshake with a "missing_extension" alert (see Section 9.2).¶
-The "signature_algorithms_cert" extension was added to allow implementations -which supported different sets of algorithms for certificates and in TLS itself -to clearly signal their capabilities. TLS 1.2 implementations SHOULD also process -this extension. Implementations which have the same policy in both cases -MAY omit the "signature_algorithms_cert" extension.¶
-The "extension_data" field of these extensions contains a -SignatureSchemeList value:¶
-- enum { - /* RSASSA-PKCS1-v1_5 algorithms */ - rsa_pkcs1_sha256(0x0401), - rsa_pkcs1_sha384(0x0501), - rsa_pkcs1_sha512(0x0601), - - /* ECDSA algorithms */ - ecdsa_secp256r1_sha256(0x0403), - ecdsa_secp384r1_sha384(0x0503), - ecdsa_secp521r1_sha512(0x0603), - - /* RSASSA-PSS algorithms with public key OID rsaEncryption */ - rsa_pss_rsae_sha256(0x0804), - rsa_pss_rsae_sha384(0x0805), - rsa_pss_rsae_sha512(0x0806), - - /* EdDSA algorithms */ - ed25519(0x0807), - ed448(0x0808), - - /* RSASSA-PSS algorithms with public key OID RSASSA-PSS */ - rsa_pss_pss_sha256(0x0809), - rsa_pss_pss_sha384(0x080a), - rsa_pss_pss_sha512(0x080b), - - /* Legacy algorithms */ - rsa_pkcs1_sha1(0x0201), - ecdsa_sha1(0x0203), - - /* Reserved Code Points */ - private_use(0xFE00..0xFFFF), - (0xFFFF) - } SignatureScheme; - - struct { - SignatureScheme supported_signature_algorithms<2..2^16-2>; - } SignatureSchemeList; -¶ -
Note: This enum is named "SignatureScheme" because there is already -a "SignatureAlgorithm" type in TLS 1.2, which this replaces. -We use the term "signature algorithm" throughout the text.¶
-Each SignatureScheme value lists a single signature algorithm that the -client is willing to verify. The values are indicated in descending order -of preference. Note that a signature algorithm takes as input an -arbitrary-length message, rather than a digest. Algorithms which -traditionally act on a digest should be defined in TLS to first -hash the input with a specified hash algorithm and then proceed as usual. -The code point groups listed above have the following meanings:¶
-Indicates a signature algorithm using RSASSA-PKCS1-v1_5 [RFC8017] -with the corresponding hash algorithm as defined in [SHS]. These values -refer solely to signatures which appear in certificates (see -Section 4.4.2.2) and are not defined for use in signed -TLS handshake messages, although they MAY appear in "signature_algorithms" -and "signature_algorithms_cert" for backward compatibility with TLS 1.2.¶
-Indicates a signature algorithm using ECDSA [DSS], the corresponding curve as defined in NIST SP 800-186 [ECDP], and the -corresponding hash algorithm as defined in [SHS]. The signature is -represented as a DER-encoded [X690] ECDSA-Sig-Value structure as defined in [RFC4492].¶
-Indicates a signature algorithm using RSASSA-PSS with a mask -generation function of MGF1, as defined in [RFC8017]. The -digest used in MGF1 and the digest being signed are -both the corresponding hash algorithm as defined in [SHS]. -The length of the Salt MUST be equal to the length of the output of the -digest algorithm. If the public key is carried -in an X.509 certificate, it MUST use the rsaEncryption OID [RFC5280].¶
-Indicates a signature algorithm using EdDSA as defined in -[RFC8032] or its successors. Note that these correspond to the -"PureEdDSA" algorithms and not the "prehash" variants.¶
-Indicates a signature algorithm using RSASSA-PSS with a mask -generation function of MGF1, as defined in [RFC8017]. The -digest used in MGF1 and the digest being signed are -both the corresponding hash algorithm as defined in [SHS]. -The length of the Salt MUST be equal to the length of the digest -algorithm. If the public key is carried in an X.509 certificate, -it MUST use the RSASSA-PSS OID [RFC5756]. When used in certificate signatures, -the algorithm parameters MUST be DER encoded. If the corresponding -public key's parameters are present, then the parameters in the signature -MUST be identical to those in the public key.¶
-Indicates algorithms which are being deprecated because they use -algorithms with known weaknesses, specifically SHA-1 which is used -in this context with either (1) RSA using RSASSA-PKCS1-v1_5 or (2) ECDSA. These values -refer solely to signatures which appear in certificates (see -Section 4.4.2.2) and are not defined for use in -signed TLS handshake messages, although they MAY appear in "signature_algorithms" -and "signature_algorithms_cert" for backward compatibility with TLS 1.2. -Endpoints SHOULD NOT negotiate these algorithms -but are permitted to do so solely for backward compatibility. Clients -offering these values MUST list -them as the lowest priority (listed after all other algorithms in -SignatureSchemeList). TLS 1.3 servers MUST NOT offer a SHA-1 signed -certificate unless no valid certificate chain can be produced -without it (see Section 4.4.2.2).¶
-The signatures on certificates that are self-signed or certificates that are -trust anchors are not validated, since they begin a certification path (see -[RFC5280], Section 3.2). A certificate that begins a certification -path MAY use a signature algorithm that is not advertised as being supported -in the "signature_algorithms" and "signature_algorithms_cert" extensions.¶
-Note that TLS 1.2 defines this extension differently. TLS 1.3 implementations -willing to negotiate TLS 1.2 MUST behave in accordance with the requirements of -[RFC5246] when negotiating that version. In particular:¶
-TLS 1.2 ClientHellos MAY omit this extension.¶
-In TLS 1.2, the extension contained hash/signature pairs. The pairs are -encoded in two octets, so SignatureScheme values have been allocated to -align with TLS 1.2's encoding. Some legacy pairs are left unallocated. These -algorithms are deprecated as of TLS 1.3. They MUST NOT be offered or -negotiated by any implementation. In particular, MD5 [SLOTH], SHA-224, and -DSA MUST NOT be used.¶
-ECDSA signature schemes align with TLS 1.2's ECDSA hash/signature pairs. -However, the old semantics did not constrain the signing curve. If TLS 1.2 is -negotiated, implementations MUST be prepared to accept a signature that uses -any curve that they advertised in the "supported_groups" extension.¶
-Implementations that advertise support for RSASSA-PSS (which is mandatory in -TLS 1.3) MUST be prepared to accept a signature using that scheme even when -TLS 1.2 is negotiated. In TLS 1.2, RSASSA-PSS is used with RSA cipher suites.¶
-The "oid_filters" extension allows servers to provide a list of OID/value -pairs which it would like the client's certificate to match. This -extension, if provided by the server, MUST only be sent in the CertificateRequest message.¶
-- struct { - opaque certificate_extension_oid<1..2^8-1>; - opaque certificate_extension_values<0..2^16-1>; - } OIDFilter; - - struct { - OIDFilter filters<0..2^16-1>; - } OIDFilterExtension; -¶ -
A list of certificate extension OIDs [RFC5280] with their allowed value(s) and -represented in DER-encoded [X690] format. Some certificate extension OIDs -allow multiple values (e.g., Extended Key Usage). If the server has included -a non-empty filters list, the client certificate included in -the response MUST contain all of the specified extension OIDs that the client -recognizes. For each extension OID recognized by the client, all of the -specified values MUST be present in the client certificate (but the -certificate MAY have other values as well). However, the client MUST ignore -and skip any unrecognized certificate extension OIDs. If the client ignored -some of the required certificate extension OIDs and supplied a certificate -that does not satisfy the request, the server MAY at its discretion either -continue the connection without client authentication or abort the handshake -with an "unsupported_certificate" alert. Any given OID MUST NOT appear -more than once in the filters list.¶
-PKIX RFCs define a variety of certificate extension OIDs and their corresponding -value types. Depending on the type, matching certificate extension values are -not necessarily bitwise-equal. It is expected that TLS implementations will rely -on their PKI libraries to perform certificate selection using certificate -extension OIDs.¶
-This document defines matching rules for two standard certificate extensions -defined in [RFC5280]:¶
-The Key Usage extension in a certificate matches the request when all key -usage bits asserted in the request are also asserted in the Key Usage -certificate extension.¶
-The Extended Key Usage extension in a certificate matches the request when all -key purpose OIDs present in the request are also found in the Extended Key -Usage certificate extension. The special anyExtendedKeyUsage OID MUST NOT be -used in the request.¶
-Separate specifications may define matching rules for other certificate -extensions.¶
-The "post_handshake_auth" extension is used to indicate that a client is willing -to perform post-handshake authentication (Section 4.6.2). Servers -MUST NOT send a post-handshake CertificateRequest to clients which do not -offer this extension. Servers MUST NOT send this extension.¶
-- struct {} PostHandshakeAuth; -¶ -
The "extension_data" field of the "post_handshake_auth" extension is zero length.¶
-When sent by the client, the "supported_groups" extension indicates -the named groups which the client supports for key exchange, ordered -from most preferred to least preferred.¶
-Note: In versions of TLS prior to TLS 1.3, this extension was named -"elliptic_curves" and only contained elliptic curve groups. See [RFC8422] and -[RFC7919]. This extension was also used to negotiate -ECDSA curves. Signature algorithms are now negotiated independently (see -Section 4.2.3).¶
-The "extension_data" field of this extension contains a -"NamedGroupList" value:¶
-- enum { - - /* Elliptic Curve Groups (ECDHE) */ - secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019), - x25519(0x001D), x448(0x001E), - - /* Finite Field Groups (DHE) */ - ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102), - ffdhe6144(0x0103), ffdhe8192(0x0104), - - /* Reserved Code Points */ - ffdhe_private_use(0x01FC..0x01FF), - ecdhe_private_use(0xFE00..0xFEFF), - (0xFFFF) - } NamedGroup; - - struct { - NamedGroup named_group_list<2..2^16-1>; - } NamedGroupList; -¶ -
Indicates support for the corresponding named curve, defined -in either NIST SP 800-186 [ECDP] or in [RFC7748]. -Values 0xFE00 through 0xFEFF are reserved for Private Use [RFC8126].¶
-Indicates support for the corresponding finite field -group, defined in [RFC7919]. -Values 0x01FC through 0x01FF are reserved for Private Use.¶
-Items in "named_group_list" are ordered according to the sender's -preferences (most preferred choice first).¶
-As of TLS 1.3, servers are permitted to send the "supported_groups" -extension to the client. Clients MUST NOT act upon any information -found in "supported_groups" prior to successful completion of the -handshake but MAY use the information learned from a successfully -completed handshake to change what groups they use in their -"key_share" extension in subsequent connections. -If the server has a group it prefers to the -ones in the "key_share" extension but is still willing to accept the -ClientHello, it SHOULD send "supported_groups" to update the client's -view of its preferences; this extension SHOULD contain all groups -the server supports, regardless of whether they are currently -supported by the client.¶
-When a PSK is used and early data is allowed for that PSK -(see for instance Appendix B.3.4), the client can send Application Data -in its first flight of messages. If the client opts to do so, it MUST -supply both the "pre_shared_key" and "early_data" extensions.¶
-The "extension_data" field of this extension contains an -"EarlyDataIndication" value.¶
-- struct {} Empty; - - struct { - select (Handshake.msg_type) { - case new_session_ticket: uint32 max_early_data_size; - case client_hello: Empty; - case encrypted_extensions: Empty; - }; - } EarlyDataIndication; -¶ -
See Section 4.6.1 for details regarding the use of the max_early_data_size field.¶
-The parameters for the 0-RTT data (version, symmetric cipher suite, -Application-Layer Protocol Negotiation (ALPN) [RFC7301] protocol, -etc.) are those associated with the PSK in use. -For externally provisioned PSKs, the associated values are those -provisioned along with the key. For PSKs established via a NewSessionTicket -message, the associated values are those which were negotiated in the connection -which established the PSK. The PSK used to encrypt the early data -MUST be the first PSK listed in the client's "pre_shared_key" extension.¶
-For PSKs provisioned via NewSessionTicket, a server MUST validate that -the ticket age for the selected PSK identity (computed by subtracting -ticket_age_add from PskIdentity.obfuscated_ticket_age modulo 2^32) -is within a small tolerance of the -time since the ticket was issued (see Section 8). If it is not, -the server SHOULD proceed with the handshake but reject 0-RTT, and -SHOULD NOT take any other action that assumes that this ClientHello is -fresh.¶
-0-RTT messages sent in the first flight have the same (encrypted) content types -as messages of the same type sent in other flights (handshake and -application_data) but are protected under -different keys. After receiving the server's Finished message, if the -server has accepted early data, an EndOfEarlyData message -will be sent to indicate the key change. This message will be encrypted -with the 0-RTT traffic keys.¶
-A server which receives an "early_data" extension -MUST behave in one of three ways:¶
-Ignore the extension and return a regular 1-RTT response. The server then -skips past early data by attempting to deprotect received records using the handshake traffic -key, discarding records which fail deprotection (up to the configured max_early_data_size). -Once a record is deprotected -successfully, it is treated as the start of the client's second flight -and the server proceeds as with an ordinary 1-RTT handshake.¶
-Request that the client send another ClientHello by responding with a -HelloRetryRequest. A client MUST NOT include the "early_data" extension in -its followup ClientHello. The server then ignores early data by skipping -all records with an external content type of "application_data" (indicating -that they are encrypted), up to the configured max_early_data_size.¶
-Return its own "early_data" extension in EncryptedExtensions, -indicating that it intends to -process the early data. It is not possible for the server -to accept only a subset of the early data messages. -Even though the server sends a message accepting early data, the actual early -data itself may already be in flight by the time the server generates this message.¶
-In order to accept early data, the server MUST have selected the first -key offered in the client's "pre_shared_key" extension. In addition, -it MUST verify that the following values are the same as those -associated with the selected PSK:¶
- -These requirements are a superset of those needed to perform a 1-RTT -handshake using the PSK in question.¶
-Future extensions MUST define their interaction with 0-RTT.¶
-If any of these checks fail, the server MUST NOT respond -with the extension and must discard all the first-flight -data using one of the first two mechanisms listed above -(thus falling back to 1-RTT or 2-RTT). If the client attempts -a 0-RTT handshake but the server rejects it, the server will generally -not have the 0-RTT record protection keys and must instead -use trial decryption (either with the 1-RTT handshake keys or -by looking for a cleartext ClientHello in the case of a HelloRetryRequest) to -find the first non-0-RTT message.¶
-If the server chooses to accept the "early_data" extension, -then it MUST comply with the same error-handling requirements -specified for all records when processing early data records. -Specifically, if the server fails to decrypt a 0-RTT record following -an accepted "early_data" extension, it MUST terminate the connection -with a "bad_record_mac" alert as per Section 5.2.¶
-If the server rejects the "early_data" extension, the client -application MAY opt to retransmit the Application Data previously -sent in early data once the handshake has -been completed. Note that automatic retransmission of early data -could result in incorrect assumptions regarding the status of the connection. For instance, when the negotiated connection selects a -different ALPN protocol from what was used for the early data, an -application might need to construct different messages. Similarly, if -early data assumes anything about the connection state, it might be -sent in error after the handshake completes.¶
-A TLS implementation SHOULD NOT automatically resend early data; -applications are in a better position to decide when retransmission -is appropriate. A TLS implementation MUST NOT automatically resend -early data unless the negotiated connection selects the same ALPN -protocol.¶
-The next two messages from the server, EncryptedExtensions and -CertificateRequest, contain information from the server -that determines the rest of the handshake. These messages -are encrypted with keys derived from the server_handshake_traffic_secret.¶
-In all handshakes, the server MUST send the -EncryptedExtensions message immediately after the -ServerHello message. This is the first message that is encrypted -under keys derived from the server_handshake_traffic_secret.¶
-The EncryptedExtensions message contains extensions -that can be protected, i.e., any which are not needed to -establish the cryptographic context but which are not -associated with individual certificates. The client -MUST check EncryptedExtensions for the presence of any forbidden -extensions and if any are found MUST abort the handshake with an -"illegal_parameter" alert.¶
-Structure of this message:¶
-- struct { - Extension extensions<0..2^16-1>; - } EncryptedExtensions; -¶ -
A list of extensions. For more information, see the table in Section 4.2.¶
-A server which is authenticating with a certificate MAY optionally -request a certificate from the client. This message, if sent, MUST -follow EncryptedExtensions.¶
-Structure of this message:¶
-- struct { - opaque certificate_request_context<0..2^8-1>; - Extension extensions<0..2^16-1>; - } CertificateRequest; -¶ -
An opaque string which identifies the certificate request and -which will be echoed in the client's Certificate message. The -certificate_request_context MUST be unique within the scope -of this connection (thus preventing replay of client -CertificateVerify messages). This field SHALL be zero length -unless used for the post-handshake authentication exchanges -described in Section 4.6.2. -When requesting post-handshake authentication, the server SHOULD -make the context unpredictable to the client (e.g., by -randomly generating it) in order to prevent an attacker who -has temporary access to the client's private key from -pre-computing valid CertificateVerify messages.¶
-A list of extensions describing the parameters of the -certificate being requested. The "signature_algorithms" -extension MUST be specified, and other extensions may optionally be -included if defined for this message. -Clients MUST ignore unrecognized extensions.¶
-In prior versions of TLS, the CertificateRequest message -carried a list of signature algorithms and certificate authorities -which the server would accept. In TLS 1.3, the former is expressed -by sending the "signature_algorithms" and optionally "signature_algorithms_cert" -extensions. The latter is -expressed by sending the "certificate_authorities" extension -(see Section 4.2.4).¶
-Servers which are authenticating with a resumption PSK MUST NOT send the -CertificateRequest message in the main handshake, though they -MAY send it in post-handshake authentication (see Section 4.6.2) -provided that the client has sent the "post_handshake_auth" -extension (see Section 4.2.6). -In the absence of some other specification to the contrary, -servers which are authenticating with an external PSK -MUST NOT send the CertificateRequest message either in the main handshake -or request post-handshake authentication. -[RFC8773] provides an extension to permit this, -but has not received the level of analysis as this specification.¶
-As discussed in Section 2, TLS generally uses a common -set of messages for authentication, key confirmation, and handshake -integrity: Certificate, CertificateVerify, and Finished. -(The PSK binders also perform key confirmation, in a -similar fashion.) These three -messages are always sent as the last messages in their handshake -flight. The Certificate and CertificateVerify messages are only -sent under certain circumstances, as defined below. The Finished -message is always sent as part of the Authentication Block. -These messages are encrypted under keys derived from the -[sender]_handshake_traffic_secret.¶
-The computations for the Authentication messages all uniformly -take the following inputs:¶
-The certificate and signing key to be used.¶
-A Handshake Context consisting of the list of messages to be -included in the transcript hash.¶
-A Base Key to be used to compute a MAC key.¶
-Based on these inputs, the messages then contain:¶
-The certificate to be used for authentication, and any -supporting certificates in the chain. Note that certificate-based -client authentication is not available in PSK handshake flows -(including 0-RTT).¶
-A signature over the value Transcript-Hash(Handshake Context, Certificate)¶
-A MAC over the value Transcript-Hash(Handshake Context, Certificate, CertificateVerify) -using a MAC key derived from the Base Key.¶
-The following table defines the Handshake Context and MAC Base Key -for each scenario:¶
-Mode | -Handshake Context | -Base Key | -
---|---|---|
Server | -ClientHello ... later of EncryptedExtensions/CertificateRequest | -server_handshake_traffic_secret | -
Client | -ClientHello ... later of server Finished/EndOfEarlyData | -client_handshake_traffic_secret | -
Post-Handshake | -ClientHello ... client Finished + CertificateRequest | -client_application_traffic_secret_N | -
Many of the cryptographic computations in TLS make use of a transcript -hash. This value is computed by hashing the concatenation of -each included handshake message, including the handshake -message header carrying the handshake message type and length fields, -but not including record layer headers. I.e.,¶
-- Transcript-Hash(M1, M2, ... Mn) = Hash(M1 || M2 || ... || Mn) -¶ -
As an exception to this general rule, when the server responds to a -ClientHello with a HelloRetryRequest, the value of ClientHello1 is -replaced with a special synthetic handshake message of handshake -type "message_hash" containing Hash(ClientHello1). I.e.,¶
-- Transcript-Hash(ClientHello1, HelloRetryRequest, ... Mn) = - Hash(message_hash || /* Handshake type */ - 00 00 Hash.length || /* Handshake message length (bytes) */ - Hash(ClientHello1) || /* Hash of ClientHello1 */ - HelloRetryRequest || ... || Mn) -¶ -
The reason for this construction is to allow the server to do a -stateless HelloRetryRequest by storing just the hash of ClientHello1 -in the cookie, rather than requiring it to export the entire intermediate -hash state (see Section 4.2.2).¶
-For concreteness, the transcript hash is always taken from the -following sequence of handshake messages, starting at the first -ClientHello and including only those messages that were sent: -ClientHello, HelloRetryRequest, ClientHello, ServerHello, -EncryptedExtensions, server CertificateRequest, server Certificate, -server CertificateVerify, server Finished, EndOfEarlyData, client -Certificate, client CertificateVerify, client Finished.¶
-In general, implementations can implement the transcript by keeping a -running transcript hash value based on the negotiated hash. Note, -however, that subsequent post-handshake authentications do not include -each other, just the messages through the end of the main handshake.¶
-This message conveys the endpoint's certificate chain to the peer.¶
-The server MUST send a Certificate message whenever the agreed-upon -key exchange method uses certificates for authentication (this -includes all key exchange methods defined in this document except PSK).¶
-The client MUST send a Certificate message if and only if the server has -requested certificate-based client authentication via a CertificateRequest message -(Section 4.3.2). If the server requests certificate-based client authentication -but no suitable certificate is available, the client -MUST send a Certificate message containing no certificates (i.e., with -the "certificate_list" field having length 0). A Finished message MUST -be sent regardless of whether the Certificate message is empty.¶
-Structure of this message:¶
-- enum { - X509(0), - RawPublicKey(2), - (255) - } CertificateType; - - struct { - select (certificate_type) { - case RawPublicKey: - /* From RFC 7250 ASN.1_subjectPublicKeyInfo */ - opaque ASN1_subjectPublicKeyInfo<1..2^24-1>; - - case X509: - opaque cert_data<1..2^24-1>; - }; - Extension extensions<0..2^16-1>; - } CertificateEntry; - - struct { - opaque certificate_request_context<0..2^8-1>; - CertificateEntry certificate_list<0..2^24-1>; - } Certificate; -¶ -
If this message is in response to a CertificateRequest, the -value of certificate_request_context in that message. Otherwise -(in the case of server authentication), this field SHALL be zero length.¶
-A list (chain) of CertificateEntry structures, each -containing a single certificate and list of extensions.¶
-A list of extension values for the CertificateEntry. The "Extension" -format is defined in Section 4.2. Valid extensions for server certificates -at present include the OCSP Status extension [RFC6066] and the -SignedCertificateTimestamp extension [RFC6962]; future extensions may -be defined for this message as well. Extensions in the Certificate -message from the server MUST correspond to ones from the ClientHello message. -Extensions in the Certificate message from the client MUST correspond to -extensions in the CertificateRequest message from the server. -If an extension applies to the entire chain, it SHOULD be included -in the first CertificateEntry.¶
-If the corresponding certificate type extension -("server_certificate_type" or "client_certificate_type") was not negotiated -in EncryptedExtensions, or the X.509 certificate type was negotiated, then each -CertificateEntry contains a DER-encoded X.509 certificate. The sender's -certificate MUST come in the first CertificateEntry in the list. Each -following certificate SHOULD directly certify the one immediately preceding it. -Because certificate validation requires that trust anchors be -distributed independently, a certificate that specifies a trust anchor -MAY be omitted from the chain, provided that supported peers are known -to possess any omitted certificates.¶
-Note: Prior to TLS 1.3, "certificate_list" ordering required each certificate -to certify the one immediately preceding it; -however, some implementations allowed some flexibility. Servers sometimes send -both a current and deprecated intermediate for transitional purposes, and others -are simply configured incorrectly, but these cases can nonetheless be validated -properly. For maximum compatibility, all implementations SHOULD be prepared to -handle potentially extraneous certificates and arbitrary orderings from any TLS -version, with the exception of the end-entity certificate which MUST be first.¶
-If the RawPublicKey certificate type was negotiated, then the -certificate_list MUST contain no more than one CertificateEntry, which -contains an ASN1_subjectPublicKeyInfo value as defined in [RFC7250], -Section 3.¶
-The OpenPGP certificate type [RFC6091] MUST NOT be used with TLS 1.3.¶
-The server's certificate_list MUST always be non-empty. A client will -send an empty certificate_list if it does not have an appropriate -certificate to send in response to the server's authentication -request.¶
-[RFC6066] and [RFC6961] provide extensions to negotiate the server -sending OCSP responses to the client. In TLS 1.2 and below, the -server replies with an empty extension to indicate negotiation of this -extension and the OCSP information is carried in a CertificateStatus -message. In TLS 1.3, the server's OCSP information is carried in -an extension in the CertificateEntry containing the associated -certificate. Specifically, the body of the "status_request" extension -from the server MUST be a CertificateStatus structure as defined -in [RFC6066], which is interpreted as defined in [RFC6960].¶
-Note: The status_request_v2 extension [RFC6961] is deprecated. TLS 1.3 servers -MUST NOT act upon its presence or information in it when processing ClientHello messages; in particular, they MUST NOT send the status_request_v2 extension in the -EncryptedExtensions, CertificateRequest, or Certificate messages. -TLS 1.3 servers MUST be able to process ClientHello messages that include it, -as it MAY be sent by clients that wish to use it in earlier protocol versions.¶
-A server MAY request that a client present an OCSP response with its -certificate by sending an empty "status_request" extension in its -CertificateRequest message. If the client opts to send an OCSP response, the -body of its "status_request" extension MUST be a CertificateStatus structure as -defined in [RFC6066].¶
-Similarly, [RFC6962] provides a mechanism for a server to send a -Signed Certificate Timestamp (SCT) as an extension in the ServerHello -in TLS 1.2 and below. -In TLS 1.3, the server's SCT information is carried in an extension in the -CertificateEntry.¶
-The following rules apply to the certificates sent by the server:¶
-The certificate type MUST be X.509v3 [RFC5280], unless explicitly negotiated -otherwise (e.g., [RFC7250]).¶
-The end-entity certificate MUST allow the key to be used for signing with -a signature scheme indicated in the client's "signature_algorithms" -extension (see Section 4.2.3). That is, the digitalSignature bit -MUST be set if the Key Usage extension is present, and the public key (with -associated restrictions) MUST be compatible with some supported signature -scheme.¶
-The "server_name" [RFC6066] and "certificate_authorities" extensions are used to -guide certificate selection. As servers MAY require the presence of the "server_name" -extension, clients SHOULD send this extension when the server is identified by name.¶
-All certificates provided by the server MUST be signed by a -signature algorithm advertised by the client, if it is able to provide such -a chain (see Section 4.2.3). -Certificates that are self-signed -or certificates that are expected to be trust anchors are not validated as -part of the chain and therefore MAY be signed with any algorithm.¶
-If the server cannot produce a certificate chain that is signed only via the -indicated supported algorithms, then it SHOULD continue the handshake by sending -the client a certificate chain of its choice that may include algorithms -that are not known to be supported by the client. -This fallback chain SHOULD NOT use the deprecated SHA-1 hash algorithm in general, -but MAY do so if the client's advertisement permits it, -and MUST NOT do so otherwise.¶
-If the client cannot construct an acceptable chain using the provided -certificates and decides to abort the handshake, then it MUST abort the -handshake with an appropriate certificate-related alert (by default, -"unsupported_certificate"; see Section 6.2 for more information).¶
-If the server has multiple certificates, it chooses one of them based on the -above-mentioned criteria (in addition to other criteria, such as transport-layer endpoint, local configuration, and preferences).¶
-The following rules apply to certificates sent by the client:¶
-The certificate type MUST be X.509v3 [RFC5280], unless explicitly negotiated -otherwise (e.g., [RFC7250]).¶
-If the "certificate_authorities" extension in the CertificateRequest -message was present, at least one of the certificates in the certificate -chain SHOULD be issued by one of the listed CAs.¶
-The certificates MUST be signed using an acceptable signature -algorithm, as described in Section 4.3.2. Note that this -relaxes the constraints on certificate-signing algorithms found in -prior versions of TLS.¶
-If the CertificateRequest message contained a non-empty "oid_filters" -extension, the end-entity certificate MUST match the extension OIDs -that are recognized by the client, as described in Section 4.2.5.¶
-In general, detailed certificate validation procedures are out of scope for -TLS (see [RFC5280]). This section provides TLS-specific requirements.¶
-If the server supplies an empty Certificate message, the client MUST abort -the handshake with a "decode_error" alert.¶
-If the client does not send any certificates (i.e., it sends an empty -Certificate message), -the server MAY at its discretion either continue the handshake without client -authentication, or abort the handshake with a "certificate_required" alert. Also, if some -aspect of the certificate chain was unacceptable (e.g., it was not signed by a -known, trusted CA), the server MAY at its discretion either continue the -handshake (considering the client unauthenticated) or abort the handshake.¶
-Any endpoint receiving any certificate which it would need to validate -using any signature algorithm using an MD5 hash MUST abort the -handshake with a "bad_certificate" alert. SHA-1 is deprecated and it -is RECOMMENDED that any endpoint receiving any certificate which it -would need to validate using any signature algorithm using a SHA-1 -hash abort the handshake with a "bad_certificate" alert. For clarity, -this means that endpoints can accept these algorithms for -certificates that are self-signed or are trust anchors.¶
-All endpoints are RECOMMENDED to transition to SHA-256 or better as soon -as possible to maintain interoperability with implementations -currently in the process of phasing out SHA-1 support.¶
-Note that a certificate containing a key for one signature algorithm -MAY be signed using a different signature algorithm (for instance, -an RSA key signed with an ECDSA key).¶
-This message is used to provide explicit proof that an endpoint -possesses the private key corresponding to its certificate. -The CertificateVerify message also provides integrity for the handshake up -to this point. Servers MUST send this message when authenticating via a certificate. -Clients MUST send this message whenever authenticating via a certificate (i.e., when -the Certificate message is non-empty). When sent, this message MUST appear immediately -after the Certificate message and immediately prior to the Finished message.¶
-Structure of this message:¶
-- struct { - SignatureScheme algorithm; - opaque signature<0..2^16-1>; - } CertificateVerify; -¶ -
The algorithm field specifies the signature algorithm used (see -Section 4.2.3 for the definition of this type). The -signature is a digital signature using that algorithm. The -content that is covered under the signature is the hash output as described in -Section 4.4.1, namely:¶
-- Transcript-Hash(Handshake Context, Certificate) -¶ -
The digital signature is then computed over the concatenation of:¶
-A string that consists of octet 32 (0x20) repeated 64 times¶
-The context string (defined below)¶
-A single 0 byte which serves as the separator¶
-The content to be signed¶
-This structure is intended to prevent an attack on previous versions -of TLS in which the ServerKeyExchange format meant that -attackers could obtain a signature of a message with a chosen 32-byte -prefix (ClientHello.random). The initial 64-byte pad clears that prefix -along with the server-controlled ServerHello.random.¶
-The context string for a server signature is -"TLS 1.3, server CertificateVerify" -The context string for a client signature is -"TLS 1.3, client CertificateVerify" -It is used to provide separation between signatures made in different -contexts, helping against potential cross-protocol attacks.¶
-For example, if the transcript hash was 32 bytes of -01 (this length would make sense for SHA-256), the content covered by -the digital signature for a server CertificateVerify would be:¶
-- 2020202020202020202020202020202020202020202020202020202020202020 - 2020202020202020202020202020202020202020202020202020202020202020 - 544c5320312e332c207365727665722043657274696669636174655665726966 - 79 - 00 - 0101010101010101010101010101010101010101010101010101010101010101 -¶ -
On the sender side, the process for computing the signature field of the -CertificateVerify message takes as input:¶
-The content covered by the digital signature¶
-The private signing key corresponding to the certificate sent in the -previous message¶
-If the CertificateVerify message is sent by a server, the signature -algorithm MUST be one offered in the client's "signature_algorithms" extension -unless no valid certificate chain can be produced without unsupported -algorithms (see Section 4.2.3).¶
-If sent by a client, the signature algorithm used in the signature -MUST be one of those present in the supported_signature_algorithms -field of the "signature_algorithms" extension in the CertificateRequest message.¶
-In addition, the signature algorithm MUST be compatible with the key -in the sender's end-entity certificate. RSA signatures MUST use an -RSASSA-PSS algorithm, regardless of whether RSASSA-PKCS1-v1_5 algorithms -appear in "signature_algorithms". The SHA-1 algorithm MUST NOT be used -in any signatures of CertificateVerify messages. -All SHA-1 signature algorithms in this specification are defined solely -for use in legacy certificates and are not valid for CertificateVerify -signatures.¶
-The receiver of a CertificateVerify message MUST verify the signature field. -The verification process takes as input:¶
-The content covered by the digital signature¶
-The public key contained in the end-entity certificate found in the -associated Certificate message¶
-The digital signature received in the signature field of the -CertificateVerify message¶
-If the verification fails, the receiver MUST terminate the handshake -with a "decrypt_error" alert.¶
-The Finished message is the final message in the Authentication -Block. It is essential for providing authentication of the handshake -and of the computed keys.¶
-Recipients of Finished messages MUST verify that the contents are -correct and if incorrect MUST terminate the connection -with a "decrypt_error" alert.¶
-Once a side has sent its Finished message and has received and -validated the Finished message from its peer, it may begin to send and -receive Application Data over the connection. There are two -settings in which it is permitted to send data prior to -receiving the peer's Finished:¶
-Clients sending 0-RTT data as described in Section 4.2.10.¶
-Servers MAY send data after sending their first flight, but -because the handshake is not yet complete, they have no assurance -of either the peer's identity or its liveness (i.e., -the ClientHello might have been replayed).¶
-The key used to compute the Finished message is computed from the -Base Key defined in Section 4.4 using HKDF (see -Section 7.1). Specifically:¶
--finished_key = - HKDF-Expand-Label(BaseKey, "finished", "", Hash.length) -¶ -
Structure of this message:¶
-- struct { - opaque verify_data[Hash.length]; - } Finished; -¶ -
The verify_data value is computed as follows:¶
-- verify_data = - HMAC(finished_key, - Transcript-Hash(Handshake Context, - Certificate*, CertificateVerify*)) - - * Only included if present. -¶ -
HMAC [RFC2104] uses the Hash algorithm for the handshake. -As noted above, the HMAC input can generally be implemented by a running -hash, i.e., just the handshake hash at this point.¶
-In previous versions of TLS, the verify_data was always 12 octets long. In -TLS 1.3, it is the size of the HMAC output for the Hash used for the handshake.¶
-Note: Alerts and any other non-handshake record types are not handshake messages -and are not included in the hash computations.¶
-Any records following a Finished message MUST be encrypted under the -appropriate application traffic key as described in Section 7.2. -In particular, this includes any alerts sent by the -server in response to client Certificate and CertificateVerify messages.¶
-- struct {} EndOfEarlyData; -¶ -
If the server sent an "early_data" extension in EncryptedExtensions, the client MUST send an -EndOfEarlyData message after receiving the server Finished. If the server does -not send an "early_data" extension in EncryptedExtensions, then the client MUST NOT send an -EndOfEarlyData message. This message indicates that all -0-RTT application_data messages, if any, have been transmitted and -that the following records are protected under handshake traffic keys. -Servers MUST NOT send this message, and clients receiving it -MUST terminate the connection with an "unexpected_message" alert. -This message is encrypted under keys derived from the client_early_traffic_secret.¶
-TLS also allows other messages to be sent after the main handshake. -These messages use a handshake content type and are encrypted under the -appropriate application traffic key.¶
-At any time after the server has received the client Finished message, -it MAY send a NewSessionTicket message. This message creates a unique -association between the ticket value and a secret PSK -derived from the resumption secret (see Section 7).¶
-The client MAY use this PSK for future handshakes by including the -ticket value in the "pre_shared_key" extension in its ClientHello -(Section 4.2.11). -Clients which receive a NewSessionTicket message but do -not support resumption MUST silently ignore this message. -Resumption MAY be done while the -original connection is still open. Servers MAY send multiple tickets on a -single connection, either immediately after each other or -after specific events (see Appendix C.4). -For instance, the server might send a new ticket after post-handshake -authentication in order to encapsulate the additional client -authentication state. Multiple tickets are useful for clients -for a variety of purposes, including:¶
-Opening multiple parallel HTTP connections.¶
-Performing connection racing across interfaces and address families -via (for example) Happy Eyeballs [RFC8305] or related techniques.¶
-Any ticket MUST only be resumed with a cipher suite that has the -same KDF hash algorithm as that used to establish the original connection.¶
-Clients MUST only resume if the new SNI value is valid for the server -certificate presented in the original session, and SHOULD only resume if -the SNI value matches the one used in the original session. The latter -is a performance optimization: normally, there is no reason to expect -that different servers covered by a single certificate would be able to -accept each other's tickets; hence, attempting resumption in that case -would waste a single-use ticket. If such an indication is provided -(externally or by any other means), clients MAY resume with a different -SNI value.¶
-On resumption, if reporting an SNI value to the calling application, -implementations MUST use the value sent in the resumption ClientHello rather -than the value sent in the previous session. Note that if a server -implementation declines all PSK identities with different SNI values, these two -values are always the same.¶
-Note: Although the resumption secret depends on the client's second -flight, a server which does not request certificate-based client authentication MAY compute -the remainder of the transcript independently and then send a -NewSessionTicket immediately upon sending its Finished rather than -waiting for the client Finished. This might be appropriate in cases -where the client is expected to open multiple TLS connections in -parallel and would benefit from the reduced overhead of a resumption -handshake, for example.¶
-- struct { - uint32 ticket_lifetime; - uint32 ticket_age_add; - opaque ticket_nonce<0..255>; - opaque ticket<1..2^16-1>; - Extension extensions<0..2^16-1>; - } NewSessionTicket; -¶ -
Indicates the lifetime in seconds as a 32-bit unsigned integer in -network byte order from the time of ticket issuance. -Servers MUST NOT use any value greater than 604800 seconds (7 days). -The value of zero indicates that the ticket should be discarded -immediately. Clients MUST NOT use tickets for longer than -7 days after issuance, regardless of the ticket_lifetime, and MAY delete tickets -earlier based on local policy. A server MAY treat a ticket as valid -for a shorter period of time than what is stated in the -ticket_lifetime.¶
-A securely generated, random 32-bit value that is used to obscure the age of -the ticket that the client includes in the "pre_shared_key" extension. -The client-side ticket age is added to this value modulo 2^32 to -obtain the value that is transmitted by the client. -The server MUST generate a fresh value for each ticket it sends.¶
-A per-ticket value that is unique across all tickets issued on this connection.¶
-The value of the ticket to be used as the PSK identity. -The ticket itself is an opaque label. It MAY be either a database -lookup key or a self-encrypted and self-authenticated value.¶
-A list of extension values for the ticket. The "Extension" -format is defined in Section 4.2. Clients MUST ignore -unrecognized extensions.¶
-The sole extension currently defined for NewSessionTicket is -"early_data", indicating that the ticket may be used to send 0-RTT data -(Section 4.2.10). It contains the following value:¶
-The maximum amount of 0-RTT data that the client is allowed to send when using -this ticket, in bytes. Only Application Data payload (i.e., plaintext but -not padding or the inner content type byte) is counted. A server -receiving more than max_early_data_size bytes of 0-RTT data -SHOULD terminate the connection with an "unexpected_message" alert. -Note that servers that reject early data due to lack of cryptographic material -will be unable to differentiate padding from content, so clients SHOULD NOT -depend on being able to send large quantities of padding in early data records.¶
-The PSK associated with the ticket is computed as:¶
-- HKDF-Expand-Label(resumption_secret, - "resumption", ticket_nonce, Hash.length) -¶ -
Because the ticket_nonce value is distinct for each NewSessionTicket -message, a different PSK will be derived for each ticket.¶
-Note that in principle it is possible to continue issuing new tickets -which indefinitely extend the lifetime of the keying -material originally derived from an initial non-PSK handshake (which -was most likely tied to the peer's certificate). It is RECOMMENDED -that implementations place limits on the total lifetime of such keying -material; these limits should take into account the lifetime of the -peer's certificate, the likelihood of intervening revocation, -and the time since the peer's online CertificateVerify signature.¶
-When the client has sent the "post_handshake_auth" extension (see -Section 4.2.6), a server MAY request certificate-based client authentication at any time -after the handshake has completed by sending a CertificateRequest message. The -client MUST respond with the appropriate Authentication messages (see -Section 4.4). If the client chooses to authenticate, it MUST -send Certificate, CertificateVerify, and Finished. If it declines, it MUST send -a Certificate message containing no certificates followed by Finished. -All of the client's messages for a given response -MUST appear consecutively on the wire with no intervening messages of other types.¶
-A client that receives a CertificateRequest message without having sent -the "post_handshake_auth" extension MUST send an "unexpected_message" fatal -alert.¶
-Note: Because certificate-based client authentication could involve prompting the user, servers -MUST be prepared for some delay, including receiving an arbitrary number of -other messages between sending the CertificateRequest and receiving a -response. In addition, clients which receive multiple CertificateRequests in -close succession MAY respond to them in a different order than they were -received (the certificate_request_context value allows the server to -disambiguate the responses).¶
-The KeyUpdate handshake message is used to indicate that the sender is -updating its sending cryptographic keys. This message can be sent by -either peer after it has sent a Finished message. -Implementations that receive a KeyUpdate message prior to receiving a Finished message -MUST terminate the connection with an "unexpected_message" alert. -After sending a KeyUpdate message, the sender SHALL send all its traffic using the -next generation of keys, computed as described in Section 7.2. -Upon receiving a KeyUpdate, the receiver MUST update its receiving keys.¶
-- enum { - update_not_requested(0), update_requested(1), (255) - } KeyUpdateRequest; - - struct { - KeyUpdateRequest request_update; - } KeyUpdate; -¶ -
Indicates whether the recipient of the KeyUpdate should respond with its -own KeyUpdate. If an implementation receives any other value, it MUST -terminate the connection with an "illegal_parameter" alert.¶
-If the request_update field is set to "update_requested", then the receiver MUST -send a KeyUpdate of its own with request_update set to "update_not_requested" prior -to sending its next Application Data record. This mechanism allows either side to force an update to the -entire connection, but causes an implementation which -receives multiple KeyUpdates while it is silent to respond with -a single update. Note that implementations may receive an arbitrary -number of messages between sending a KeyUpdate with request_update set -to "update_requested" and receiving the -peer's KeyUpdate, because those messages may already be in flight. -However, because send and receive keys are derived from independent -traffic secrets, retaining the receive traffic secret does not threaten -the forward secrecy of data sent before the sender changed keys.¶
-If implementations independently send their own KeyUpdates with -request_update set to "update_requested", and they cross in flight, then each side -will also send a response, with the result that each side increments -by two generations.¶
-Both sender and receiver MUST encrypt their KeyUpdate -messages with the old keys. Additionally, both sides MUST enforce that -a KeyUpdate with the old key is received before accepting any messages -encrypted with the new key. Failure to do so may allow message truncation -attacks.¶
-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, so the -chance of a joint key/IV collision is much lower. In order -to provide an extra margin of security, sending implementations MUST -NOT allow the epoch -- and hence the number of key updates -- -to exceed 2^48-1. In order to allow this value to be changed later --- for instance for ciphers with more than 128-bit keys -- -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. This may result in -an eventual need to terminate the connection when the -limits in Section 5.5 are reached.¶
-The TLS record protocol takes messages to be transmitted, fragments -the data into manageable blocks, protects the records, and transmits -the result. Received data is verified, decrypted, reassembled, and -then delivered to higher-level clients.¶
-TLS records are typed, which allows multiple higher-level protocols to -be multiplexed over the same record layer. This document specifies -four content types: handshake, application_data, alert, and -change_cipher_spec. -The change_cipher_spec record is used only for compatibility purposes -(see Appendix E.4).¶
-An implementation may receive an unencrypted record of type -change_cipher_spec consisting of the single byte value 0x01 at any -time after the first ClientHello message has been sent or received and before -the peer's Finished message has been received and MUST simply drop it without -further processing. Note that this record may appear at a point at the -handshake where the implementation is expecting protected records, -and so it is necessary to detect this -condition prior to attempting to deprotect the record. An -implementation which receives any other change_cipher_spec value or -which receives a protected change_cipher_spec record MUST abort the -handshake with an "unexpected_message" alert. If an implementation detects -a change_cipher_spec record -received before the first ClientHello message or after the peer's Finished -message, it MUST be treated as an unexpected record type (though stateless -servers may not be able to distinguish these cases from allowed cases).¶
-Implementations MUST NOT send record types not defined in this -document unless negotiated by some extension. If a TLS implementation -receives an unexpected record type, it MUST terminate the connection -with an "unexpected_message" alert. New record content type values -are assigned by IANA in the TLS ContentType registry as described in -Section 11.¶
-The record layer fragments information blocks into TLSPlaintext -records carrying data in chunks of 2^14 bytes or less. Message -boundaries are handled differently depending on the underlying -ContentType. Any future content types MUST specify appropriate -rules. -Note that these rules are stricter than what was enforced in TLS 1.2.¶
-Handshake messages MAY be coalesced into a single TLSPlaintext -record or fragmented across several records, provided that:¶
-Handshake messages MUST NOT be interleaved with other record -types. That is, if a handshake message is split over two or more -records, there MUST NOT be any other records between them.¶
-Handshake messages MUST NOT span key changes. Implementations MUST verify that -all messages immediately preceding a key change align with a record boundary; -if not, then they MUST terminate the connection with an "unexpected_message" -alert. Because the ClientHello, EndOfEarlyData, ServerHello, Finished, and -KeyUpdate messages can immediately precede a key change, implementations MUST -send these messages in alignment with a record boundary.¶
-Implementations MUST NOT send zero-length fragments of Handshake -types, even if those fragments contain padding.¶
-Alert messages (Section 6) MUST NOT be fragmented across -records, and multiple alert messages MUST NOT be coalesced into a -single TLSPlaintext record. In other words, a record with an Alert -type MUST contain exactly one message.¶
-Application Data messages contain data that is opaque to -TLS. Application Data messages are always protected. Zero-length -fragments of Application Data MAY be sent, as they are potentially -useful as a traffic analysis countermeasure. Application Data fragments -MAY be split across multiple records or coalesced into a single record.¶
-- enum { - invalid(0), - change_cipher_spec(20), - alert(21), - handshake(22), - application_data(23), - (255) - } ContentType; - - struct { - ContentType type; - ProtocolVersion legacy_record_version; - uint16 length; - opaque fragment[TLSPlaintext.length]; - } TLSPlaintext; -¶ -
The higher-level protocol used to process the enclosed fragment.¶
-MUST be set to 0x0303 for all records generated by a -TLS 1.3 implementation other than an initial ClientHello (i.e., one -not generated after a HelloRetryRequest), where it -MAY also be 0x0301 for compatibility purposes. -This field is deprecated and MUST be ignored for all purposes. -Previous versions of TLS would use other values in this field -under some circumstances.¶
-The length (in bytes) of the following TLSPlaintext.fragment. The -length MUST NOT exceed 2^14 bytes. An endpoint that receives a record -that exceeds this length MUST terminate the connection with a -"record_overflow" alert.¶
-The data being transmitted. This value is transparent and is treated as an -independent block to be dealt with by the higher-level protocol -specified by the type field.¶
-This document describes TLS 1.3, which uses the version 0x0304. -This version value is historical, deriving from the use of 0x0301 -for TLS 1.0 and 0x0300 for SSL 3.0. In order to maximize backward -compatibility, a record containing an initial ClientHello SHOULD have version -0x0301 (reflecting TLS 1.0) and a record containing a second ClientHello or -a ServerHello MUST have version -0x0303 (reflecting TLS 1.2). -When negotiating prior versions of TLS, endpoints -follow the procedure and requirements provided in Appendix E.¶
-When record protection has not yet been engaged, TLSPlaintext -structures are written directly onto the wire. Once record protection -has started, TLSPlaintext records are protected and sent as -described in the following section. Note that Application Data -records MUST NOT be written to the wire unprotected (see -Section 2 for details).¶
-The record protection functions translate a TLSPlaintext structure into a -TLSCiphertext structure. The deprotection functions reverse the process. In TLS 1.3, -as opposed to previous versions of TLS, all ciphers are modeled as -"Authenticated Encryption with Associated Data" (AEAD) [RFC5116]. -AEAD functions provide a unified encryption and authentication -operation which turns plaintext into authenticated ciphertext and -back again. Each encrypted record consists of a plaintext header followed -by an encrypted body, which itself contains a type and optional padding.¶
-- struct { - opaque content[TLSPlaintext.length]; - ContentType type; - uint8 zeros[length_of_padding]; - } TLSInnerPlaintext; - - struct { - ContentType opaque_type = application_data; /* 23 */ - ProtocolVersion legacy_record_version = 0x0303; /* TLS v1.2 */ - uint16 length; - opaque encrypted_record[TLSCiphertext.length]; - } TLSCiphertext; -¶ -
The TLSPlaintext.fragment value, containing the byte encoding of a -handshake or an alert message, or the raw bytes of the application's -data to send.¶
-The TLSPlaintext.type value containing the content type of the record.¶
-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 TLS record by a chosen amount as -long as the total stays within record size limits. See -Section 5.4 for more details.¶
-The outer opaque_type field of a TLSCiphertext record is always set to the -value 23 (application_data) for outward compatibility with -middleboxes accustomed to parsing previous versions of TLS. The -actual content type of the record is found in TLSInnerPlaintext.type after -decryption.¶
-The legacy_record_version field is always 0x0303. TLS 1.3 TLSCiphertexts -are not generated until after TLS 1.3 has been negotiated, so there are -no historical compatibility concerns where other values might be received. -Note that the handshake protocol, including the ClientHello and ServerHello -messages, authenticates the protocol version, so this value is redundant.¶
-The length (in bytes) of the following TLSCiphertext.encrypted_record, which -is the sum of the lengths of the content and the padding, plus one -for the inner content type, plus any expansion added by the AEAD algorithm. -The length MUST NOT exceed 2^14 + 256 bytes. -An endpoint that receives a record that exceeds this length MUST -terminate the connection with a "record_overflow" alert.¶
-The AEAD-encrypted form of the serialized TLSInnerPlaintext structure.¶
-AEAD algorithms take as input a single key, a nonce, a plaintext, and "additional -data" to be included in the authentication check, as described in Section 2.1 -of [RFC5116]. The key is either the client_write_key or the server_write_key, -the nonce is derived from the sequence number and the -client_write_iv or server_write_iv (see Section 5.3), and the additional data input is the -record header. I.e.,¶
-- additional_data = TLSCiphertext.opaque_type || - TLSCiphertext.legacy_record_version || - TLSCiphertext.length -¶ -
The plaintext input to the AEAD algorithm is the encoded TLSInnerPlaintext structure. -Derivation of traffic keys is defined in Section 7.3.¶
-The AEAD output consists of the ciphertext output from the AEAD -encryption operation. The length of the plaintext is greater than the -corresponding TLSPlaintext.length due to the inclusion of TLSInnerPlaintext.type and -any padding supplied by the sender. The length of the -AEAD output will generally be larger than the plaintext, but by an -amount that varies with the AEAD algorithm. Since the ciphers might -incorporate padding, the amount of overhead could vary with different -lengths of plaintext. Symbolically,¶
-- AEADEncrypted = - AEAD-Encrypt(write_key, nonce, additional_data, plaintext) -¶ -
The encrypted_record field of TLSCiphertext is set to AEADEncrypted.¶
-In order to decrypt and verify, the cipher takes as input the key, nonce, -additional data, and the AEADEncrypted value. The output is either the plaintext -or an error indicating that the decryption failed. There is no separate -integrity check. Symbolically,¶
-- plaintext of encrypted_record = - AEAD-Decrypt(peer_write_key, nonce, additional_data, AEADEncrypted) -¶ -
If the decryption fails, the receiver MUST terminate the connection -with a "bad_record_mac" alert.¶
-An AEAD algorithm used in TLS 1.3 MUST NOT produce an expansion greater than -255 octets. An endpoint that receives a record from its peer with -TLSCiphertext.length larger than 2^14 + 256 octets MUST terminate -the connection with a "record_overflow" alert. -This limit is derived from the maximum TLSInnerPlaintext length of -2^14 octets + 1 octet for ContentType + the maximum AEAD expansion of 255 octets.¶
-A 64-bit sequence number is maintained separately for reading and writing -records. The appropriate sequence number is incremented by one after -reading or writing each record. Each sequence number is set to zero -at the beginning of a connection and whenever the key is changed; the -first record transmitted under a particular traffic key MUST use -sequence number 0.¶
-Because the size of sequence numbers is 64-bit, they should not -wrap. If a TLS implementation would need to -wrap a sequence number, it MUST either rekey (Section 4.6.3) or -terminate the connection.¶
-Each AEAD algorithm will specify a range of possible lengths for the -per-record nonce, from N_MIN bytes to N_MAX bytes of input [RFC5116]. -The length of the TLS per-record nonce (iv_length) is set to the larger of -8 bytes and N_MIN for the AEAD algorithm (see [RFC5116], Section 4). -An AEAD algorithm where N_MAX is less than 8 bytes MUST NOT be used with TLS. -The per-record nonce for the AEAD construction is formed as follows:¶
-The 64-bit record sequence number is encoded in network byte order -and padded to the left with zeros to iv_length.¶
-The padded sequence number is XORed with either the static client_write_iv -or server_write_iv (depending on the role).¶
-The resulting quantity (of length iv_length) is used as the per-record nonce.¶
-Note: This is a different construction from that in TLS 1.2, which -specified a partially explicit nonce.¶
-All encrypted TLS records can be padded to inflate the size of the -TLSCiphertext. This allows the sender to hide the size of the -traffic from an observer.¶
-When generating a TLSCiphertext record, implementations MAY choose to pad. -An unpadded record is just a record with a padding length of zero. -Padding is a string of zero-valued bytes appended to the ContentType -field before encryption. Implementations MUST set the padding octets -to all zeros before encrypting.¶
-Application Data records may contain a zero-length TLSInnerPlaintext.content if -the sender desires. This permits generation of plausibly sized cover -traffic in contexts where the presence or absence of activity may be -sensitive. Implementations MUST NOT send Handshake and Alert records -that have a zero-length TLSInnerPlaintext.content; if such a message -is received, the receiving implementation MUST terminate the connection -with an "unexpected_message" alert.¶
-The padding sent is automatically verified by the record protection -mechanism; upon successful decryption of a TLSCiphertext.encrypted_record, -the receiving implementation scans the field from the end toward the -beginning until it finds a non-zero octet. This non-zero octet is the -content type of the message. -This padding scheme was selected because it allows padding of any encrypted -TLS record by an arbitrary size (from zero up to TLS record size -limits) without introducing new content types. The design also -enforces all-zero padding octets, which allows for quick detection of -padding errors.¶
-Implementations MUST limit their scanning to the cleartext returned -from the AEAD decryption. If a receiving implementation does not find -a non-zero octet in the cleartext, it MUST terminate the -connection with an "unexpected_message" alert.¶
-The presence of padding does not change the overall record size limitations: -the full encoded TLSInnerPlaintext MUST NOT exceed 2^14 + 1 octets. If the -maximum fragment length is reduced -- as for example by the record_size_limit -extension from [RFC8449] -- then the reduced limit applies to the full plaintext, -including the content type and padding.¶
-Selecting a padding policy that suggests when and how much to pad is a -complex topic and is beyond the scope of this specification. If the -application-layer protocol on top of TLS has its own padding, it may be -preferable to pad Application Data TLS records within the application -layer. Padding for encrypted Handshake or Alert records must -still be handled at the TLS layer, though. Later documents may define -padding selection algorithms or define a padding policy request -mechanism through TLS extensions or some other means.¶
-There are cryptographic limits on the amount of plaintext which can be -safely encrypted under a given set of keys. [AEAD-LIMITS] provides -an analysis of these limits under the assumption that the underlying -primitive (AES or ChaCha20) has no weaknesses. Implementations MUST -either close the connection or -do a key update as described in Section 4.6.3 prior to reaching these limits. -Note that it is not possible to perform a KeyUpdate for early data -and therefore implementations MUST not exceed the limits -when sending early data. Receiving implementations SHOULD NOT enforce -these limits, as future analyses may result in updated values.¶
-For AES-GCM, up to 2^24.5 full-size records (about 24 million) -may be encrypted on a given connection while keeping a safety -margin of approximately 2^-57 for Authenticated Encryption (AE) security. -For ChaCha20/Poly1305, the record sequence number would wrap before the -safety limit is reached.¶
-TLS provides an Alert content type to indicate closure information -and errors. Like other messages, alert messages are encrypted as -specified by the current connection state.¶
-Alert messages convey a description of the alert and a legacy field -that conveyed the severity level of the message in previous versions of -TLS. Alerts are divided into -two classes: closure alerts and error alerts. In TLS 1.3, the -severity is implicit in the type of alert -being sent, and the "level" field can safely be ignored. The "close_notify" alert -is used to indicate orderly closure of one direction of the connection. -Upon receiving such an alert, the TLS implementation SHOULD -indicate end-of-data to the application.¶
-Error alerts indicate abortive closure of the -connection (see Section 6.2). Upon receiving an error alert, -the TLS implementation SHOULD indicate an error to the application and -MUST NOT allow any further data to be sent or received on the -connection. Servers and clients MUST forget the secret values and -keys established in failed connections, with the exception of -the PSKs associated with session tickets, which SHOULD be discarded if -possible.¶
-All the alerts listed in Section 6.2 MUST be sent with -AlertLevel=fatal and MUST be treated as error alerts when received -regardless of the AlertLevel in the -message. Unknown Alert types MUST be treated as error alerts.¶
-Note: TLS defines two generic alerts (see Section 6) to use -upon failure to parse a message. Peers which receive a message which -cannot be parsed according to the syntax (e.g., have a length -extending beyond the message boundary or contain an out-of-range -length) MUST terminate the connection with a "decode_error" -alert. Peers which receive a message which is syntactically correct -but semantically invalid (e.g., a DHE share of p - 1, or an invalid -enum) MUST terminate the connection with an "illegal_parameter" alert.¶
-- enum { warning(1), fatal(2), (255) } AlertLevel; - - enum { - close_notify(0), - unexpected_message(10), - bad_record_mac(20), - record_overflow(22), - handshake_failure(40), - bad_certificate(42), - unsupported_certificate(43), - certificate_revoked(44), - certificate_expired(45), - certificate_unknown(46), - illegal_parameter(47), - unknown_ca(48), - access_denied(49), - decode_error(50), - decrypt_error(51), - protocol_version(70), - insufficient_security(71), - internal_error(80), - inappropriate_fallback(86), - user_canceled(90), - missing_extension(109), - unsupported_extension(110), - unrecognized_name(112), - bad_certificate_status_response(113), - unknown_psk_identity(115), - certificate_required(116), - general_error(117), - no_application_protocol(120), - (255) - } AlertDescription; - - struct { - AlertLevel level; - AlertDescription description; - } Alert; -¶ -
The client and the server must share knowledge that the connection is ending in -order to avoid a truncation attack.¶
-This alert notifies the recipient that the sender will not send -any more messages on this connection. Any data received after a -closure alert has been received MUST be ignored. This alert MUST be -sent with AlertLevel=warning.¶
-This alert notifies the recipient that the sender is canceling the -handshake for some reason unrelated to a protocol failure. If a user -cancels an operation after the handshake is complete, just closing the -connection by sending a "close_notify" is more appropriate. This alert -MUST be followed by a "close_notify". This alert generally -has AlertLevel=warning. Receiving implementations SHOULD -continue to read data from the peer until a "close_notify" is received, -though they MAY log or otherwise record them.¶
-Either party MAY initiate a close of its write side of the connection by -sending a "close_notify" alert. Any data received after a "close_notify" alert has -been received MUST be ignored. If a transport-level close is received prior -to a "close_notify", the receiver cannot know that all the data that was sent -has been received.¶
-Each party MUST send a "close_notify" alert before closing its write side -of the connection, unless it has already sent some error alert. This -does not have any effect on its read side of the connection. Note that this is -a change from versions of TLS prior to TLS 1.3 in which implementations were -required to react to a "close_notify" by discarding pending writes and -sending an immediate "close_notify" alert of their own. That previous -requirement could cause truncation in the read side. Both parties need not -wait to receive a "close_notify" alert before closing their read side of the -connection, though doing so would introduce the possibility of truncation.¶
-If the application protocol using TLS provides that any data may be carried -over the underlying transport after the TLS connection is closed, the TLS -implementation MUST receive a "close_notify" alert before indicating -end-of-data to the application layer. No part of this -standard should be taken to dictate the manner in which a usage profile for TLS -manages its data transport, including when connections are opened or closed.¶
-Note: It is assumed that closing the write side of a connection reliably -delivers pending data before destroying the transport.¶
-Error handling in TLS is very simple. When an -error is detected, the detecting party sends a message to its -peer. Upon transmission or receipt of a fatal alert message, both -parties MUST immediately close the connection.¶
-Whenever an implementation encounters a fatal error condition, it -SHOULD send an appropriate fatal alert and MUST close the connection -without sending or receiving any additional data. Throughout this -specification, when the phrases "terminate the connection" and "abort the -handshake" are used without a specific alert it means that the -implementation SHOULD send the alert indicated by the descriptions -below. The phrases "terminate the connection with an X alert" and -"abort the handshake with an X alert" mean that the implementation -MUST send alert X if it sends any alert. All -alerts defined below in this section, as well as all unknown alerts, -are universally considered fatal as of TLS 1.3 (see Section 6). -The implementation SHOULD provide a way to facilitate logging -the sending and receiving of alerts.¶
-The following error alerts are defined:¶
-An inappropriate message (e.g., the wrong handshake message, premature -Application Data, etc.) was received. This alert should never be -observed in communication between proper implementations.¶
-This alert is returned if a record is received which cannot be -deprotected. Because AEAD algorithms combine decryption and -verification, and also to avoid side-channel attacks, -this alert is used for all deprotection failures. -This alert should never be observed in communication between -proper implementations, except when messages were corrupted -in the network.¶
-A TLSCiphertext record was received that had a length more than -2^14 + 256 bytes, or a record decrypted to a TLSPlaintext record -with more than 2^14 bytes (or some other negotiated limit). -This alert should never be observed in communication between -proper implementations, except when messages were corrupted -in the network.¶
-Receipt of a "handshake_failure" alert message indicates that the -sender was unable to negotiate an acceptable set of security -parameters given the options available.¶
-A certificate was corrupt, contained signatures that did not -verify correctly, etc.¶
-A certificate was of an unsupported type.¶
-A certificate was revoked by its signer.¶
-A certificate has expired or is not currently valid.¶
-Some other (unspecified) issue arose in processing the -certificate, rendering it unacceptable.¶
-A field in the handshake was incorrect or inconsistent with -other fields. This alert is used for errors which conform to -the formal protocol syntax but are otherwise incorrect.¶
-A valid certificate chain or partial chain was received, but the -certificate was not accepted because the CA certificate could not -be located or could not be matched with a known trust anchor.¶
-A valid certificate or PSK was received, but when access control was -applied, the sender decided not to proceed with negotiation.¶
-A message could not be decoded because some field was out of the -specified range or the length of the message was incorrect. -This alert is used for errors where the message does not conform -to the formal protocol syntax. -This alert should never be observed in communication between -proper implementations, except when messages were corrupted -in the network.¶
-A handshake (not record layer) cryptographic operation failed, including being unable -to correctly verify a signature or validate a Finished message -or a PSK binder.¶
-The protocol version the peer has attempted to negotiate is -recognized but not supported (see Appendix E).¶
-Returned instead of "handshake_failure" when a negotiation has -failed specifically because the server requires parameters more -secure than those supported by the client.¶
-An internal error unrelated to the peer or the correctness of the -protocol (such as a memory allocation failure) makes it impossible -to continue.¶
-Sent by a server in response to an invalid connection retry attempt -from a client (see [RFC7507]).¶
-Sent by endpoints that receive a handshake message not containing an -extension that is mandatory to send for the offered TLS version -or other negotiated parameters.¶
-Sent by endpoints receiving any handshake message containing an extension -known to be prohibited for inclusion in the given handshake message, or including -any extensions in a ServerHello or Certificate not first offered in the -corresponding ClientHello or CertificateRequest.¶
-Sent by servers when no server exists identified by the name -provided by the client via the "server_name" extension -(see [RFC6066]).¶
-Sent by clients when an invalid or unacceptable OCSP response is -provided by the server via the "status_request" extension -(see [RFC6066]).¶
-Sent by servers when PSK key establishment is desired but no - acceptable PSK identity is provided by the client. Sending this alert - is OPTIONAL; servers MAY instead choose to send a "decrypt_error" - alert to merely indicate an invalid PSK identity.¶
-Sent by servers when a client certificate is desired but none was provided by -the client.¶
-Sent to indicate an error condition in cases when either no -more specific error is available or the senders wishes to conceal -the specific error code. Implementations SHOULD use more specific -errors when available.¶
-Sent by servers when a client -"application_layer_protocol_negotiation" extension advertises -only protocols that the server does not support -(see [RFC7301]).¶
-New Alert values are assigned by IANA as described in Section 11.¶
-The TLS handshake establishes one or more input secrets which -are combined to create the actual working keying material, as detailed -below. The key derivation process incorporates both the input secrets -and the handshake transcript. Note that because the handshake -transcript includes the random values from the Hello messages, -any given handshake will have different traffic secrets, even -if the same input secrets are used, as is the case when -the same PSK is used for multiple connections.¶
-The key derivation process makes use of the HKDF-Extract and HKDF-Expand -functions as defined for HKDF [RFC5869], as well as the functions -defined below:¶
-- HKDF-Expand-Label(Secret, Label, Context, Length) = - HKDF-Expand(Secret, HkdfLabel, Length) - - Where HkdfLabel is specified as: - - struct { - uint16 length = Length; - opaque label<7..255> = "tls13 " + Label; - opaque context<0..255> = Context; - } HkdfLabel; - - Derive-Secret(Secret, Label, Messages) = - HKDF-Expand-Label(Secret, Label, - Transcript-Hash(Messages), Hash.length) -¶ -
The Hash function used by Transcript-Hash and HKDF is the cipher suite hash -algorithm. -Hash.length is its output length in bytes. Messages is the concatenation of the -indicated handshake messages, including the handshake message type -and length fields, but not including record layer headers. Note that -in some cases a zero-length Context (indicated by "") is passed to -HKDF-Expand-Label. The labels specified in this document are all -ASCII strings and do not include a trailing NUL byte.¶
-Note: With common hash functions, any label longer than 12 characters -requires an additional iteration of the hash function to compute. -The labels in this specification have all been chosen to fit within -this limit.¶
-Keys are derived from two input secrets using -the HKDF-Extract and Derive-Secret functions. The general pattern -for adding a new secret is to use HKDF-Extract with the Salt -being the current secret state and the Input Keying Material (IKM) being the new -secret to be added. In this version of TLS 1.3, the two -input secrets are:¶
-PSK (a pre-shared key established externally or derived from -the resumption_secret value from a previous connection)¶
-(EC)DHE shared secret (Section 7.4)¶
-This produces a full key derivation schedule shown in the diagram below. -In this diagram, the following formatting conventions apply:¶
-HKDF-Extract is drawn as taking the Salt argument from the top and -the IKM argument from the left, with its output to the bottom and -the name of the output on the right.¶
-Derive-Secret's Secret argument is indicated by the incoming -arrow. For instance, the Early Secret is the Secret for -generating the client_early_traffic_secret.¶
-"0" indicates a string of Hash.length bytes set to zero.¶
-Note: the key derivation labels use the string "master" even though -the values are referred to as "main" secrets. This mismatch is a -result of renaming the values while retaining compatibility.¶
-The general pattern here is that the secrets shown down the left side -of the diagram are just raw entropy without context, whereas the -secrets down the right side include Handshake Context and therefore -can be used to derive working keys without additional context. -Note that the different -calls to Derive-Secret may take different Messages arguments, -even with the same secret. In a 0-RTT exchange, Derive-Secret is -called with four distinct transcripts; in a 1-RTT-only exchange, -it is called with three distinct transcripts.¶
-If a given secret is not available, then the 0-value consisting of -a string of Hash.length bytes set to zeros is used. Note that this does not mean skipping -rounds, so if PSK is not in use, Early Secret will still be -HKDF-Extract(0, 0). For the computation of the binder_key, the label is -"ext binder" for external PSKs (those provisioned outside of TLS) -and "res binder" for resumption PSKs (those provisioned as the resumption -secret of a previous handshake). The different labels prevent -the substitution of one type of PSK for the other.¶
-There are multiple potential Early Secret values, depending on -which PSK the server ultimately selects. The client will need to compute -one for each potential PSK; if no PSK is selected, it will then need to -compute the Early Secret corresponding to the zero PSK.¶
-Once all the values which are to be derived from a given secret have -been computed, that secret SHOULD be erased.¶
-Once the handshake is complete, it is possible for either side to -update its sending traffic keys using the KeyUpdate handshake message -defined in Section 4.6.3. The next generation of traffic keys is computed by -generating client_/server_application_traffic_secret_N+1 from -client_/server_application_traffic_secret_N as described in -this section and then re-deriving the traffic keys as described in -Section 7.3.¶
-The next-generation application_traffic_secret is computed as:¶
-- application_traffic_secret_N+1 = - HKDF-Expand-Label(application_traffic_secret_N, - "traffic upd", "", Hash.length) -¶ -
Once client_/server_application_traffic_secret_N+1 and its associated -traffic keys have been computed, implementations SHOULD delete -client_/server_application_traffic_secret_N and its associated traffic keys.¶
-The traffic keying material is generated from the following input values:¶
-A secret value¶
-A purpose value indicating the specific value being generated¶
-The length of the key being generated¶
-The traffic keying material is generated from an input traffic secret value using:¶
-- [sender]_write_key = HKDF-Expand-Label(Secret, "key", "", key_length) - [sender]_write_iv = HKDF-Expand-Label(Secret, "iv", "", iv_length) -¶ -
[sender] denotes the sending side. The value of Secret for each category -of data is shown in the table below.¶
-Data Type | -Secret | -
---|---|
0-RTT Application and EndOfEarlyData | -client_early_traffic_secret | -
Initial Handshake | -[sender]_handshake_traffic_secret | -
Post-Handshake and Application Data | -[sender]_application_traffic_secret_N | -
Alerts are sent with the then current sending key (or as -plaintext if no such key has been established.) -All the traffic keying material is recomputed whenever the -underlying Secret changes (e.g., when changing from the handshake to -Application Data keys or upon a key update).¶
-[RFC5705] defines keying material exporters for TLS in terms of the TLS -pseudorandom function (PRF). This document replaces the PRF with HKDF, thus -requiring a new construction. The exporter interface remains the same.¶
-The exporter value is computed as:¶
--TLS-Exporter(label, context_value, key_length) = - HKDF-Expand-Label(Derive-Secret(Secret, label, ""), - "exporter", Hash(context_value), key_length) -¶ -
Where Secret is either the early_exporter_secret or the -exporter_secret. Implementations MUST use the exporter_secret unless -explicitly specified by the application. The early_exporter_secret is -defined for use in settings where an exporter is needed for 0-RTT data. -A separate interface for the early exporter is RECOMMENDED; this avoids -the exporter user accidentally using an early exporter when a regular -one is desired or vice versa.¶
-If no context is provided, the context_value is zero length. Consequently, -providing no context computes the same value as providing an empty context. -This is a change from previous versions of TLS where an empty context produced a -different output than an absent context. As of this document's publication, no -allocated exporter label is used both with and without a context. Future -specifications MUST NOT define a use of exporters that permit both an empty -context and no context with the same label. New uses of exporters SHOULD provide -a context in all exporter computations, though the value could be empty.¶
-Requirements for the format of exporter labels are defined in Section 4 -of [RFC5705].¶
-As noted in Section 2.3 and Appendix F.5, TLS does not provide inherent replay -protections for 0-RTT data. There are two potential threats to be -concerned with:¶
-Network attackers who mount a replay attack by simply duplicating a -flight of 0-RTT data.¶
-Network attackers who take advantage of client retry behavior -to arrange for the server to receive multiple copies of an application -message. This threat already exists -to some extent because clients that value robustness respond to network errors by -attempting to retry requests. However, 0-RTT adds an additional -dimension for any server system which does not maintain globally -consistent server state. Specifically, if a server system has -multiple zones where tickets from zone A will not be accepted in -zone B, then an attacker can duplicate a ClientHello and early -data intended for A to both A and B. At A, the data will -be accepted in 0-RTT, but at B the server will reject 0-RTT -data and instead force a full handshake. If the attacker blocks -the ServerHello from A, then the client will complete the -handshake with B and probably retry the request, leading to duplication on -the server system as a whole.¶
-The first class of attack can be prevented by sharing state to guarantee that -the 0-RTT data is accepted at most once. Servers SHOULD provide that level of -replay safety by implementing one of the methods described in this section or -by equivalent means. It is understood, however, that due to operational -concerns not all deployments will maintain state at that level. Therefore, in -normal operation, clients will not know which, if any, of these mechanisms -servers actually implement and hence MUST only send early data which they deem -safe to be replayed.¶
-In addition to the direct effects of replays, there is a class of attacks where -even operations normally considered idempotent could be exploited by a large -number of replays (timing attacks, resource limit exhaustion and others, as -described in Appendix F.5). Those can be mitigated by ensuring that every -0-RTT payload can be replayed only a limited number of times. The server MUST -ensure that any instance of it (be it a machine, a thread, or any other entity -within the relevant serving infrastructure) would accept 0-RTT for the same -0-RTT handshake at most once; this limits the number of replays to the number of -server instances in the deployment. Such a guarantee can be accomplished by -locally recording data from recently received ClientHellos and rejecting -repeats, or by any other method that provides the same or a stronger guarantee. -The "at most once per server instance" guarantee is a minimum requirement; -servers SHOULD limit 0-RTT replays further when feasible.¶
-The second class of attack cannot be prevented at the TLS layer and -MUST be dealt with by any application. Note that any application whose -clients implement any kind of retry behavior already needs to -implement some sort of anti-replay defense.¶
-The simplest form of anti-replay defense is for the server to only -allow each session ticket to be used once. For instance, the server -can maintain a database of all outstanding valid tickets, deleting each -ticket from the database as it is used. If an unknown ticket is -provided, the server would then fall back to a full handshake.¶
-If the tickets are not self-contained but rather are database keys, -and the corresponding PSKs are deleted upon use, then connections established -using PSKs enjoy not only anti-replay protection, but also forward secrecy once -all copies of the PSK from the database entry have been deleted. -This mechanism also improves security for PSK usage when PSK is used without -(EC)DHE.¶
-Because this mechanism requires sharing the session database between -server nodes in environments with multiple distributed servers, -it may be hard to achieve high rates of successful PSK 0-RTT -connections when compared to self-encrypted tickets. Unlike -session databases, session tickets can successfully do PSK-based -session establishment even without consistent storage, though when -0-RTT is allowed they still require consistent storage for anti-replay -of 0-RTT data, as detailed in the following -section.¶
-An alternative form of anti-replay is to record a unique value derived -from the ClientHello (generally either the random value or the PSK -binder) and reject duplicates. Recording all ClientHellos causes state -to grow without bound, but a server can instead record ClientHellos within -a given time window and use the "obfuscated_ticket_age" to ensure that -tickets aren't reused outside that window.¶
-In order to implement this, when a ClientHello is received, the server -first verifies the PSK binder as described in -Section 4.2.11. It then computes the -expected_arrival_time as described in the next section and rejects -0-RTT if it is outside the recording window, falling back to the -1-RTT handshake.¶
-If the expected_arrival_time is in the window, then the server -checks to see if it has recorded a matching ClientHello. If one -is found, it either aborts the handshake with an "illegal_parameter" alert -or accepts the PSK but rejects 0-RTT. If no matching ClientHello -is found, then it accepts 0-RTT and then stores the ClientHello for -as long as the expected_arrival_time is inside the window. -Servers MAY also implement data stores with false positives, such as -Bloom filters, in which case they MUST respond to apparent replay by -rejecting 0-RTT but MUST NOT abort the handshake.¶
-The server MUST derive the storage key only from validated sections -of the ClientHello. If the ClientHello contains multiple -PSK identities, then an attacker can create multiple ClientHellos -with different binder values for the less-preferred identity on the -assumption that the server will not verify it (as recommended -by Section 4.2.11). -I.e., if the -client sends PSKs A and B but the server prefers A, then the -attacker can change the binder for B without affecting the binder -for A. If the binder for B is part of the storage key, -then this ClientHello will not appear as a duplicate, -which will cause the ClientHello to be accepted, and may -cause side effects such as replay cache pollution, although any -0-RTT data will not be decryptable because it will use different -keys. If the validated binder or the ClientHello.random -is used as the storage key, then this attack is not possible.¶
-Because this mechanism does not require storing all outstanding -tickets, it may be easier to implement in distributed systems with -high rates of resumption and 0-RTT, at the cost of potentially -weaker anti-replay defense because of the difficulty of reliably -storing and retrieving the received ClientHello messages. -In many such systems, it is impractical to have globally -consistent storage of all the received ClientHellos. -In this case, the best anti-replay protection is provided by -having a single storage zone be -authoritative for a given ticket and refusing 0-RTT for that -ticket in any other zone. This approach prevents simple -replay by the attacker because only one zone will accept -0-RTT data. A weaker design is to implement separate storage for -each zone but allow 0-RTT in any zone. This approach limits -the number of replays to once per zone. Application message -duplication of course remains possible with either design.¶
-When implementations are freshly started, they SHOULD -reject 0-RTT as long as any portion of their recording window overlaps -the startup time. Otherwise, they run the risk of accepting -replays which were originally sent during that period.¶
-Note: If the client's clock is running much faster than the server's, -then a ClientHello may be received that is outside the window in the -future, in which case it might be accepted for 1-RTT, causing a client retry, -and then acceptable later for 0-RTT. This is another variant of -the second form of attack described in Section 8.¶
-Because the ClientHello indicates the time at which the client sent -it, it is possible to efficiently determine whether a ClientHello was -likely sent reasonably recently and only accept 0-RTT for such a -ClientHello, otherwise falling back to a 1-RTT handshake. -This is necessary for the ClientHello storage mechanism -described in Section 8.2 because otherwise the server -needs to store an unlimited number of ClientHellos, and is a useful optimization for -self-contained single-use tickets because it allows efficient rejection of ClientHellos -which cannot be used for 0-RTT.¶
-In order to implement this mechanism, a server needs to store the time -that the server generated the session ticket, offset by an estimate of -the round-trip time between client and server. I.e.,¶
-- adjusted_creation_time = creation_time + estimated_RTT -¶ -
This value can be encoded in the ticket, thus avoiding the need to -keep state for each outstanding ticket. The server can determine the -client's view of the age of the ticket by subtracting the ticket's -"ticket_age_add" value from the "obfuscated_ticket_age" parameter in -the client's "pre_shared_key" extension. The server can determine the -expected_arrival_time of the ClientHello as:¶
-- expected_arrival_time = adjusted_creation_time + clients_ticket_age -¶ -
When a new ClientHello is received, the expected_arrival_time is then -compared against the current server wall clock time and if they differ -by more than a certain amount, 0-RTT is rejected, though the 1-RTT -handshake can be allowed to complete.¶
-There are several potential sources of error that might cause -mismatches between the expected_arrival_time and the measured -time. Variations in client and server clock -rates are likely to be minimal, though potentially the absolute -times may be off by large values. -Network propagation delays are the most likely causes of -a mismatch in legitimate values for elapsed time. Both the -NewSessionTicket and ClientHello messages might be retransmitted and -therefore delayed, which might be hidden by TCP. For clients -on the Internet, this implies windows -on the order of ten seconds to account for errors in clocks and -variations in measurements; other deployment scenarios -may have different needs. Clock skew distributions are not -symmetric, so the optimal tradeoff may involve an asymmetric range -of permissible mismatch values.¶
-Note that freshness checking alone is not sufficient to prevent -replays because it does not detect them during the error window, -which -- depending on bandwidth and system capacity -- could include -billions of replays in real-world settings. In addition, this -freshness checking is only done at the time the ClientHello is -received, and not when subsequent early Application Data records are -received. After early data is accepted, records may continue to be -streamed to the server over a longer time period.¶
-In the absence of an application profile standard specifying otherwise:¶
-A TLS-compliant application MUST implement the TLS_AES_128_GCM_SHA256 [GCM] -cipher suite and SHOULD implement the TLS_AES_256_GCM_SHA384 [GCM] and -TLS_CHACHA20_POLY1305_SHA256 [RFC8439] cipher suites (see -Appendix B.4).¶
-A TLS-compliant application MUST support digital signatures with -rsa_pkcs1_sha256 (for certificates), rsa_pss_rsae_sha256 (for -CertificateVerify and certificates), and ecdsa_secp256r1_sha256. A -TLS-compliant application MUST support key exchange with secp256r1 -(NIST P-256) and SHOULD support key exchange with X25519 [RFC7748].¶
-In the absence of an application profile standard specifying otherwise, a -TLS-compliant application MUST implement the following TLS extensions:¶
-Supported Versions ("supported_versions"; Section 4.2.1)¶
-Cookie ("cookie"; Section 4.2.2)¶
-Signature Algorithms ("signature_algorithms"; Section 4.2.3)¶
-Signature Algorithms Certificate ("signature_algorithms_cert"; Section 4.2.3)¶
-Negotiated Groups ("supported_groups"; Section 4.2.7)¶
-Key Share ("key_share"; Section 4.2.8)¶
-Server Name Indication ("server_name"; Section 3 of [RFC6066])¶
-All implementations MUST send and use these extensions when offering -applicable features:¶
-"supported_versions" is REQUIRED for all ClientHello, ServerHello, and HelloRetryRequest messages.¶
-"signature_algorithms" is REQUIRED for certificate authentication.¶
-"supported_groups" is REQUIRED for ClientHello messages using - DHE or ECDHE key exchange.¶
-"key_share" is REQUIRED for DHE or ECDHE key exchange.¶
-"pre_shared_key" is REQUIRED for PSK key agreement.¶
-"psk_key_exchange_modes" is REQUIRED for PSK key agreement.¶
-A client is considered to be attempting to negotiate using this -specification if the ClientHello contains a "supported_versions" -extension with 0x0304 contained in its body. -Such a ClientHello message MUST meet the following requirements:¶
-If not containing a "pre_shared_key" extension, it MUST contain both -a "signature_algorithms" extension and a "supported_groups" extension.¶
-If containing a "supported_groups" extension, it MUST also contain a -"key_share" extension, and vice versa. An empty KeyShare.client_shares -list is permitted.¶
-Servers receiving a ClientHello which does not conform to these -requirements MUST abort the handshake with a "missing_extension" -alert.¶
-Additionally, all implementations MUST support the use of the "server_name" -extension with applications capable of using it. -Servers MAY require clients to send a valid "server_name" extension. -Servers requiring this extension SHOULD respond to a ClientHello -lacking a "server_name" extension by terminating the connection with a -"missing_extension" alert.¶
-This section describes invariants that TLS endpoints and middleboxes MUST -follow. It also applies to earlier versions of TLS.¶
-TLS is designed to be securely and compatibly extensible. Newer clients or -servers, when communicating with newer peers, should negotiate the -most preferred common parameters. The TLS handshake provides downgrade -protection: Middleboxes passing traffic between a newer client and -newer server without terminating TLS should be unable to influence the -handshake (see Appendix F.1). At the same time, deployments -update at different rates, so a newer client or server MAY continue to -support older parameters, which would allow it to interoperate with -older endpoints.¶
-For this to work, implementations MUST correctly handle extensible fields:¶
-A client sending a ClientHello MUST support all parameters advertised in it. -Otherwise, the server may fail to interoperate by selecting one of those -parameters.¶
-A server receiving a ClientHello MUST correctly ignore all unrecognized -cipher suites, extensions, and other parameters. Otherwise, it may fail to -interoperate with newer clients. In TLS 1.3, a client receiving a -CertificateRequest or NewSessionTicket MUST also ignore all unrecognized -extensions.¶
-A middlebox which terminates a TLS connection MUST behave as a compliant -TLS server (to the original client), including having a certificate -which the client is willing to accept, and also as a compliant TLS client (to the -original server), including verifying the original server's certificate. -In particular, it MUST generate its own ClientHello -containing only parameters it understands, and it MUST generate a fresh -ServerHello random value, rather than forwarding the endpoint's value.¶
--Note that TLS's protocol requirements and security analysis only apply to the -two connections separately. Safely deploying a TLS terminator requires -additional security considerations which are beyond the scope of this document.¶
-A middlebox which forwards ClientHello parameters it does not understand MUST -NOT process any messages beyond that ClientHello. It MUST forward all -subsequent traffic unmodified. Otherwise, it may fail to interoperate with -newer clients and servers.¶
--Forwarded ClientHellos may contain advertisements for features not supported -by the middlebox, so the response may include future TLS additions the -middlebox does not recognize. These additions MAY change any message beyond -the ClientHello arbitrarily. In particular, the values sent in the ServerHello -might change, the ServerHello format might change, and the TLSCiphertext format -might change.¶
-The design of TLS 1.3 was constrained by widely deployed non-compliant TLS -middleboxes (see Appendix E.4); however, it does not relax the invariants. -Those middleboxes continue to be non-compliant.¶
-Security issues are discussed throughout this memo, especially in -Appendix C, Appendix E, and Appendix F.¶
-This document uses several registries that were originally created in -[RFC4346] and updated in [RFC8446] and [RFC8447]. The changes -between [RFC8446] and [RFC8447] this document are described in Section 11.1. -IANA has updated these to reference this document.¶
-The registries and their allocation policies are below:¶
-TLS Cipher Suites registry: values with the first byte in the range -0-254 (decimal) are assigned via Specification Required [RFC8126]. -Values with the first byte 255 (decimal) are reserved for Private -Use [RFC8126].¶
--IANA has added the cipher suites listed in Appendix B.4 to -the registry. The "Value" and "Description" columns are taken from the table. -The "DTLS-OK" and "Recommended" columns are both marked as "Y" for each new -cipher suite.¶
-TLS ContentType registry: Future values are allocated via -Standards Action [RFC8126].¶
-TLS Alerts registry: Future values are allocated via Standards -Action [RFC8126]. IANA [is requested to/has] populated this registry -with the values from Appendix B.2. The -"DTLS-OK" column is marked as "Y" for all such values. -Values marked as "_RESERVED" have comments - describing their previous usage.¶
-TLS HandshakeType registry: Future values are allocated via -Standards Action [RFC8126]. IANA has updated this registry -to rename item 4 from "NewSessionTicket" to "new_session_ticket" -and populated this registry with the values from Appendix B.3. -The "DTLS-OK" column is marked as "Y" for all such values. -Values marked "_RESERVED" have comments describing their previous or -temporary usage.¶
-This document also uses the TLS ExtensionType Values registry originally created in -[RFC4366]. IANA has updated it to reference this document. Changes to the -registry follow:¶
-IANA has updated the registration policy as follows:¶
--Values with the first byte in the range 0-254 (decimal) are assigned -via Specification Required [RFC8126]. Values with the first byte -255 (decimal) are reserved for Private Use [RFC8126].¶
-IANA has updated this registry to include the -"key_share", "pre_shared_key", "psk_key_exchange_modes", -"early_data", "cookie", "supported_versions", -"certificate_authorities", "oid_filters", "post_handshake_auth", and "signature_algorithms_cert" extensions with the values defined in this document and the "Recommended" value of "Y".¶
-IANA has updated this registry to include a "TLS -1.3" column which lists the messages in which the extension may -appear. This column has been -initially populated from the table in Section 4.2, -with any extension not listed there marked as "-" to indicate that -it is not used by TLS 1.3.¶
-This document updates an entry in the TLS Certificate Types registry -originally created in [RFC6091] and updated in [RFC8447]. IANA has -updated the entry for value 1 to have the name "OpenPGP_RESERVED", -"Recommended" value "N", and comment "Used in TLS versions prior -to 1.3." IANA has updated the entry for value 0 to have the name -"X509", "Recommended" value "Y", and comment "Was X.509 before TLS 1.3".¶
-This document updates an entry in the TLS Certificate Status Types -registry originally created in [RFC6961]. IANA has updated the entry -for value 2 to have the name "ocsp_multi_RESERVED" and comment "Used -in TLS versions prior to 1.3".¶
-This document updates two entries in the TLS Supported Groups -registry (created under a different name by [RFC4492]; now maintained -by [RFC8422]) and updated by [RFC7919] and [RFC8447]. The entries -for values 29 and 30 (x25519 and x448) have been updated to also -refer to this document.¶
-In addition, this document defines two new registries that are maintained -by IANA:¶
-TLS SignatureScheme registry: Values with the first byte in the range -0-253 (decimal) are assigned via Specification Required [RFC8126]. -Values with the first byte 254 or 255 (decimal) are reserved for Private -Use [RFC8126]. Values with the first byte in the range 0-6 or with the -second byte in the range 0-3 that are not currently allocated are reserved for -backward compatibility. -This registry has a "Recommended" column. -The registry has been initially populated with the values described in -Section 4.2.3. The following values are marked as -"Recommended": ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, -rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, -rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, and ed25519. -The -"Recommended" column is assigned a value of "N" unless explicitly - requested, and adding a value with a "Recommended" value of "Y" - requires Standards Action [RFC8126]. IESG Approval is REQUIRED - for a Y->N transition.¶
-TLS PskKeyExchangeMode registry: Values in the -range 0-253 (decimal) are assigned via Specification Required -[RFC8126]. The values 254 and 255 (decimal) are -reserved for Private Use [RFC8126]. This registry has a -"Recommended" column. The registry has been initially -populated with psk_ke (0) and psk_dhe_ke (1). Both are marked as -"Recommended". The -"Recommended" column is assigned a value of "N" unless explicitly -requested, and adding a value with a "Recommended" value of "Y" -requires Standards Action [RFC8126]. IESG Approval is REQUIRED -for a Y->N transition.¶
-IANA [shall update/has updated] the TLS registries to reference this document.¶
-IANA [shall rename/has renamed] the "extended_master_secret" value -in the TLS ExtensionType Values registry to "extended_main_secret".¶
-IANA [shall create/has created] a value for the "general_error" -alert in the TLS Alerts Registry with the value given in Section 6.¶
-This appendix provides a summary of the legal state transitions for the -client and server handshakes. State names (in all capitals, e.g., -START) have no formal meaning but are provided for ease of -comprehension. Actions which are taken only in certain circumstances are -indicated in []. The notation "K_{send,recv} = foo" means "set the send/recv -key to the given key".¶
- - -This appendix provides the normative protocol types and the definitions -for constants. Values listed as -"_RESERVED" were used in previous versions of TLS and are listed here -for completeness. TLS 1.3 implementations MUST NOT send them but -might receive them from older TLS implementations.¶
-- enum { - invalid(0), - change_cipher_spec(20), - alert(21), - handshake(22), - application_data(23), - (255) - } ContentType; - - struct { - ContentType type; - ProtocolVersion legacy_record_version; - uint16 length; - opaque fragment[TLSPlaintext.length]; - } TLSPlaintext; - - struct { - opaque content[TLSPlaintext.length]; - ContentType type; - uint8 zeros[length_of_padding]; - } TLSInnerPlaintext; - - struct { - ContentType opaque_type = application_data; /* 23 */ - ProtocolVersion legacy_record_version = 0x0303; /* TLS v1.2 */ - uint16 length; - opaque encrypted_record[TLSCiphertext.length]; - } TLSCiphertext; -¶ -
- enum { warning(1), fatal(2), (255) } AlertLevel; - - enum { - close_notify(0), - unexpected_message(10), - bad_record_mac(20), - decryption_failed_RESERVED(21), - record_overflow(22), - decompression_failure_RESERVED(30), - handshake_failure(40), - no_certificate_RESERVED(41), - bad_certificate(42), - unsupported_certificate(43), - certificate_revoked(44), - certificate_expired(45), - certificate_unknown(46), - illegal_parameter(47), - unknown_ca(48), - access_denied(49), - decode_error(50), - decrypt_error(51), - export_restriction_RESERVED(60), - protocol_version(70), - insufficient_security(71), - internal_error(80), - inappropriate_fallback(86), - user_canceled(90), - no_renegotiation_RESERVED(100), - missing_extension(109), - unsupported_extension(110), - certificate_unobtainable_RESERVED(111), - unrecognized_name(112), - bad_certificate_status_response(113), - bad_certificate_hash_value_RESERVED(114), - unknown_psk_identity(115), - certificate_required(116), - general_error(117), - no_application_protocol(120), - (255) - } AlertDescription; - - struct { - AlertLevel level; - AlertDescription description; - } Alert; -¶ -
- 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 { - HandshakeType msg_type; /* handshake type */ - uint24 length; /* remaining bytes in message */ - select (Handshake.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; - }; - } Handshake; -¶ -
- uint16 ProtocolVersion; - opaque Random[32]; - - uint8 CipherSuite[2]; /* Cryptographic suite selector */ - - struct { - ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */ - Random random; - opaque legacy_session_id<0..32>; - CipherSuite cipher_suites<2..2^16-2>; - opaque legacy_compression_methods<1..2^8-1>; - Extension extensions<8..2^16-1>; - } ClientHello; - - struct { - ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */ - Random random; - opaque legacy_session_id_echo<0..32>; - CipherSuite cipher_suite; - uint8 legacy_compression_method = 0; - Extension extensions<6..2^16-1>; - } ServerHello; - - struct { - ExtensionType extension_type; - opaque extension_data<0..2^16-1>; - } Extension; - - enum { - server_name(0), /* RFC 6066 */ - max_fragment_length(1), /* RFC 6066 */ - status_request(5), /* RFC 6066 */ - supported_groups(10), /* RFC 8422, 7919 */ - signature_algorithms(13), /* RFC 8446 */ - use_srtp(14), /* RFC 5764 */ - heartbeat(15), /* RFC 6520 */ - application_layer_protocol_negotiation(16), /* RFC 7301 */ - signed_certificate_timestamp(18), /* RFC 6962 */ - client_certificate_type(19), /* RFC 7250 */ - server_certificate_type(20), /* RFC 7250 */ - padding(21), /* RFC 7685 */ - pre_shared_key(41), /* RFC 8446 */ - early_data(42), /* RFC 8446 */ - supported_versions(43), /* RFC 8446 */ - cookie(44), /* RFC 8446 */ - psk_key_exchange_modes(45), /* RFC 8446 */ - certificate_authorities(47), /* RFC 8446 */ - oid_filters(48), /* RFC 8446 */ - post_handshake_auth(49), /* RFC 8446 */ - signature_algorithms_cert(50), /* RFC 8446 */ - key_share(51), /* RFC 8446 */ - (65535) - } ExtensionType; - - struct { - NamedGroup group; - opaque key_exchange<1..2^16-1>; - } KeyShareEntry; - - struct { - KeyShareEntry client_shares<0..2^16-1>; - } KeyShareClientHello; - - struct { - NamedGroup selected_group; - } KeyShareHelloRetryRequest; - - struct { - KeyShareEntry server_share; - } KeyShareServerHello; - - struct { - uint8 legacy_form = 4; - opaque X[coordinate_length]; - opaque Y[coordinate_length]; - } UncompressedPointRepresentation; - - enum { psk_ke(0), psk_dhe_ke(1), (255) } PskKeyExchangeMode; - - struct { - PskKeyExchangeMode ke_modes<1..255>; - } PskKeyExchangeModes; - - struct {} Empty; - - struct { - select (Handshake.msg_type) { - case new_session_ticket: uint32 max_early_data_size; - case client_hello: Empty; - case encrypted_extensions: Empty; - }; - } EarlyDataIndication; - - struct { - opaque identity<1..2^16-1>; - uint32 obfuscated_ticket_age; - } PskIdentity; - - opaque PskBinderEntry<32..255>; - - struct { - PskIdentity identities<7..2^16-1>; - PskBinderEntry binders<33..2^16-1>; - } OfferedPsks; - - struct { - select (Handshake.msg_type) { - case client_hello: OfferedPsks; - case server_hello: uint16 selected_identity; - }; - } PreSharedKeyExtension; -¶ -
- struct { - select (Handshake.msg_type) { - case client_hello: - ProtocolVersion versions<2..254>; - - case server_hello: /* and HelloRetryRequest */ - ProtocolVersion selected_version; - }; - } SupportedVersions; -¶ -
- enum { - /* RSASSA-PKCS1-v1_5 algorithms */ - rsa_pkcs1_sha256(0x0401), - rsa_pkcs1_sha384(0x0501), - rsa_pkcs1_sha512(0x0601), - - /* ECDSA algorithms */ - ecdsa_secp256r1_sha256(0x0403), - ecdsa_secp384r1_sha384(0x0503), - ecdsa_secp521r1_sha512(0x0603), - - /* RSASSA-PSS algorithms with public key OID rsaEncryption */ - rsa_pss_rsae_sha256(0x0804), - rsa_pss_rsae_sha384(0x0805), - rsa_pss_rsae_sha512(0x0806), - - /* EdDSA algorithms */ - ed25519(0x0807), - ed448(0x0808), - - /* RSASSA-PSS algorithms with public key OID RSASSA-PSS */ - rsa_pss_pss_sha256(0x0809), - rsa_pss_pss_sha384(0x080a), - rsa_pss_pss_sha512(0x080b), - - /* Legacy algorithms */ - rsa_pkcs1_sha1(0x0201), - ecdsa_sha1(0x0203), - - /* Reserved Code Points */ - obsolete_RESERVED(0x0000..0x0200), - dsa_sha1_RESERVED(0x0202), - obsolete_RESERVED(0x0204..0x0400), - dsa_sha256_RESERVED(0x0402), - obsolete_RESERVED(0x0404..0x0500), - dsa_sha384_RESERVED(0x0502), - obsolete_RESERVED(0x0504..0x0600), - dsa_sha512_RESERVED(0x0602), - obsolete_RESERVED(0x0604..0x06FF), - private_use(0xFE00..0xFFFF), - (0xFFFF) - } SignatureScheme; - - struct { - SignatureScheme supported_signature_algorithms<2..2^16-2>; - } SignatureSchemeList; -¶ -
- enum { - unallocated_RESERVED(0x0000), - - /* Elliptic Curve Groups (ECDHE) */ - obsolete_RESERVED(0x0001..0x0016), - secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019), - obsolete_RESERVED(0x001A..0x001C), - x25519(0x001D), x448(0x001E), - - /* Finite Field Groups (DHE) */ - ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102), - ffdhe6144(0x0103), ffdhe8192(0x0104), - - /* Reserved Code Points */ - ffdhe_private_use(0x01FC..0x01FF), - ecdhe_private_use(0xFE00..0xFEFF), - obsolete_RESERVED(0xFF01..0xFF02), - (0xFFFF) - } NamedGroup; - - struct { - NamedGroup named_group_list<2..2^16-1>; - } NamedGroupList; -¶ -
Values within "obsolete_RESERVED" ranges are used in previous versions -of TLS and MUST NOT be offered or negotiated by TLS 1.3 implementations. -The obsolete curves have various known/theoretical weaknesses or have -had very little usage, in some cases only due to unintentional -server configuration issues. They are no longer considered appropriate -for general use and should be assumed to be potentially unsafe. The set -of curves specified here is sufficient for interoperability with all -currently deployed and properly configured TLS implementations.¶
-- opaque DistinguishedName<1..2^16-1>; - - struct { - DistinguishedName authorities<3..2^16-1>; - } CertificateAuthoritiesExtension; - - struct { - opaque certificate_extension_oid<1..2^8-1>; - opaque certificate_extension_values<0..2^16-1>; - } OIDFilter; - - struct { - OIDFilter filters<0..2^16-1>; - } OIDFilterExtension; - - struct {} PostHandshakeAuth; - - struct { - Extension extensions<0..2^16-1>; - } EncryptedExtensions; - - struct { - opaque certificate_request_context<0..2^8-1>; - Extension extensions<0..2^16-1>; - } CertificateRequest; -¶ -
- enum { - X509(0), - OpenPGP_RESERVED(1), - RawPublicKey(2), - (255) - } CertificateType; - - struct { - select (certificate_type) { - case RawPublicKey: - /* From RFC 7250 ASN.1_subjectPublicKeyInfo */ - opaque ASN1_subjectPublicKeyInfo<1..2^24-1>; - - case X509: - opaque cert_data<1..2^24-1>; - }; - Extension extensions<0..2^16-1>; - } CertificateEntry; - - struct { - opaque certificate_request_context<0..2^8-1>; - CertificateEntry certificate_list<0..2^24-1>; - } Certificate; - - struct { - SignatureScheme algorithm; - opaque signature<0..2^16-1>; - } CertificateVerify; - - struct { - opaque verify_data[Hash.length]; - } Finished; -¶ -
- struct { - uint32 ticket_lifetime; - uint32 ticket_age_add; - opaque ticket_nonce<0..255>; - opaque ticket<1..2^16-1>; - Extension extensions<0..2^16-1>; - } NewSessionTicket; -¶ -
- struct {} EndOfEarlyData; - - enum { - update_not_requested(0), update_requested(1), (255) - } KeyUpdateRequest; - - struct { - KeyUpdateRequest request_update; - } KeyUpdate; -¶ -
A cipher suite defines the pair of the AEAD algorithm and hash -algorithm to be used with HKDF. -Cipher suite names follow the naming convention:¶
-- CipherSuite TLS_AEAD_HASH = VALUE; -¶ -
Component | -Contents | -
---|---|
TLS | -The string "TLS" | -
AEAD | -The AEAD algorithm used for record protection | -
HASH | -The hash algorithm used with HKDF | -
VALUE | -The two byte ID assigned for this cipher suite | -
This specification defines the following cipher suites for use with TLS 1.3.¶
-Description | -Value | -
---|---|
TLS_AES_128_GCM_SHA256 | -{0x13,0x01} | -
TLS_AES_256_GCM_SHA384 | -{0x13,0x02} | -
TLS_CHACHA20_POLY1305_SHA256 | -{0x13,0x03} | -
TLS_AES_128_CCM_SHA256 | -{0x13,0x04} | -
TLS_AES_128_CCM_8_SHA256 | -{0x13,0x05} | -
The corresponding AEAD algorithms AEAD_AES_128_GCM, AEAD_AES_256_GCM, and -AEAD_AES_128_CCM are defined in [RFC5116]. AEAD_CHACHA20_POLY1305 is defined -in [RFC8439]. AEAD_AES_128_CCM_8 is defined in [RFC6655]. The corresponding -hash algorithms are defined in [SHS].¶
-Although TLS 1.3 uses the same cipher suite space as previous versions -of TLS, TLS 1.3 cipher suites are defined differently, only specifying -the symmetric ciphers, and cannot be used for TLS 1.2. Similarly, -cipher suites for TLS 1.2 and lower cannot be used with TLS 1.3.¶
-New cipher suite values are assigned by IANA as described in -Section 11.¶
-The TLS protocol cannot prevent many common security mistakes. This appendix -provides several recommendations to assist implementors. -[RFC8448] provides test vectors for TLS 1.3 handshakes.¶
-TLS requires a cryptographically secure pseudorandom number generator (CSPRNG). -In most cases, the operating system provides an appropriate facility such -as /dev/urandom, which should be used absent other (e.g., performance) concerns. -It is RECOMMENDED to use an existing CSPRNG implementation in -preference to crafting a new one. Many adequate cryptographic libraries -are already available under favorable license terms. Should those prove -unsatisfactory, [RFC4086] provides guidance on the generation of random values.¶
-TLS uses random values (1) in public protocol fields such as the -public Random values in the ClientHello and ServerHello and (2) to -generate keying material. With a properly functioning CSPRNG, this -does not present a security problem, as it is not feasible to determine -the CSPRNG state from its output. However, with a broken CSPRNG, it -may be possible for an attacker to use the public output to determine -the CSPRNG internal state and thereby predict the keying material, as -documented in [CHECKOWAY] and -[DSA-1571-1].¶
-Implementations can provide extra security against -this form of attack by using separate CSPRNGs to generate public and -private values.¶
-[RFC8937] describes a way way for security protocol implementations -to augment their (pseudo)random number generators using a long-term private key -and a deterministic signature function. This improves randomness from broken or -otherwise subverted random number generators.¶
-Implementations are responsible for verifying the integrity of certificates and -should generally support certificate revocation messages. Absent a specific -indication from an application profile, certificates should -always be verified to ensure proper signing by a trusted certificate authority -(CA). The selection and addition of trust anchors should be done very carefully. -Users should be able to view information about the certificate and trust anchor. -Applications SHOULD also enforce minimum and maximum key sizes. For example, -certification paths containing keys or signatures weaker than 2048-bit RSA or -224-bit ECDSA are not appropriate for secure applications.¶
-Note that it is common practice in some protocols to use the same -certificate in both client and server modes. This setting has not been -extensively analyzed and it is the responsibility of the higher level -protocol to ensure there is no ambiguity in this case about the -higher-level semantics.¶
-Implementation experience has shown that certain parts of earlier TLS -specifications are not easy to understand and have been a source of -interoperability and security problems. Many of these areas have been clarified -in this document but this appendix contains a short list of the most important -things that require special attention from implementors.¶
-TLS protocol issues:¶
-Do you correctly handle handshake messages that are fragmented to -multiple TLS records (see Section 5.1)? Do you correctly handle -corner cases like a ClientHello that is split into several small fragments? Do -you fragment handshake messages that exceed the maximum fragment -size? In particular, the Certificate and CertificateRequest -handshake messages can be large enough to require fragmentation. -Certificate compression as defined in [RFC8879] can be used -to reduce the risk of fragmentation.¶
-Do you ignore the TLS record layer version number in all unencrypted TLS -records (see Appendix E)?¶
-Have you ensured that all support for SSL, RC4, EXPORT ciphers, and -MD5 (via the "signature_algorithms" extension) is completely removed from -all possible configurations that support TLS 1.3 or later, and that -attempts to use these obsolete capabilities fail correctly? -(see Appendix E)?¶
-Do you handle TLS extensions in ClientHellos correctly, including -unknown extensions?¶
-When the server has requested a client certificate but no -suitable certificate is available, do you correctly send an empty -Certificate message, instead of omitting the whole message (see -Section 4.4.2)?¶
-When processing the plaintext fragment produced by AEAD-Decrypt and -scanning from the end for the ContentType, do you avoid scanning -past the start of the cleartext in the event that the peer has sent -a malformed plaintext of all zeros?¶
-Do you properly ignore unrecognized cipher suites -(Section 4.1.2), hello extensions (Section 4.2), named groups -(Section 4.2.7), key shares (Section 4.2.8), -supported versions (Section 4.2.1), -and signature algorithms (Section 4.2.3) in the -ClientHello?¶
-As a server, do you send a HelloRetryRequest to clients which -support a compatible (EC)DHE group but do not predict it in the -"key_share" extension? As a client, do you correctly handle a -HelloRetryRequest from the server?¶
-Cryptographic details:¶
-What countermeasures do you use to prevent timing attacks [TIMING]?¶
-When using Diffie-Hellman key exchange, do you correctly preserve -leading zero bytes in the negotiated key (see Section 7.4.1)?¶
-Does your TLS client check that the Diffie-Hellman parameters sent -by the server are acceptable (see Section 4.2.8.1)?¶
-Do you use a strong and, most importantly, properly seeded random number -generator (see Appendix C.1) when generating Diffie-Hellman -private values, the ECDSA "k" parameter, and other security-critical values? -It is RECOMMENDED that implementations implement "deterministic ECDSA" -as specified in [RFC6979]. Note that purely deterministic ECC signatures such as -deterministic ECDSA and EdDSA may be vulnerable to certain side-channel and fault -injection attacks in easily accessible IoT devices.¶
-Do you zero-pad Diffie-Hellman public key values and shared -secrets to the group size (see Section 4.2.8.1 and Section 7.4.1)?¶
-Do you verify signatures after making them, to protect against RSA-CRT -key leaks [FW15]?¶
-Clients SHOULD NOT reuse a ticket for multiple connections. Reuse -of a ticket allows passive observers to correlate different connections. -Servers that issue tickets SHOULD offer at least as many tickets -as the number of connections that a client might use; for example, a web browser -using HTTP/1.1 [RFC7230] might open six connections to a server. Servers SHOULD -issue new tickets with every connection. This ensures that clients are -always able to use a new ticket when creating a new connection.¶
-Offering a ticket to a server additionally allows the server to correlate -different connections. This is possible independent of ticket reuse. Client -applications SHOULD NOT offer tickets across connections that are meant to be -uncorrelated. For example, [FETCH] defines network partition keys to separate -cache lookups in web browsers.¶
-Clients and Servers SHOULD NOT reuse a key share for multiple connections. Reuse -of a key share allows passive observers to correlate different connections. Reuse -of a client key share to the same server additionally allows the server to correlate different connections.¶
-It is RECOMMENDED that the labels for external identities be selected so that they -do not provide additional information about the identity of the -user. For instance, if the label includes an e-mail address, then -this trivially identifies the user to a passive attacker, -unlike the client's Certificate, which is encrypted. There are a number of potential -ways to avoid this risk, including (1) using random identity labels -(2) pre-encrypting the identity under a key known to the server or (3) -using the Encrypted Client Hello [I-D.ietf-tls-esni] extension.¶
-If an external PSK identity is used for multiple connections, then it -will generally be possible for an external observer to track -clients and/or servers across connections. Use of the -Encrypted Client Hello [I-D.ietf-tls-esni] extension can -mitigate this risk, as can mechanisms external to TLS that -rotate the PSK identity.¶
-Previous versions of TLS offered explicitly unauthenticated cipher suites based -on anonymous Diffie-Hellman. These modes have been deprecated in TLS 1.3. -However, it is still possible to negotiate parameters that do not provide -verifiable server authentication by several methods, including:¶
-Using a public key contained in a certificate but without -validation of the certificate chain or any of its contents.¶
-Either technique used alone is vulnerable to man-in-the-middle attacks -and therefore unsafe for general use. However, it is also possible to -bind such connections to an external authentication mechanism via -out-of-band validation of the server's public key, trust on first -use, or a mechanism such as channel bindings (though the -channel bindings described in [RFC5929] are not defined for -TLS 1.3). If no such mechanism is used, then the connection has no protection -against active man-in-the-middle attack; applications MUST NOT use TLS -in such a way absent explicit configuration or a specific application -profile.¶
-To align with the names used this document, the following terms from -[RFC5246] are renamed:¶
-The master secret, computed in Section 8.1 of [RFC5246], is renamed to -the main secret. It is referred to as main_secret in formulas and -structures, instead of master_secret. However, the label parameter to the PRF -function is left unchanged for compatibility.¶
-The premaster secret is renamed to the preliminary secret. It is referred to -as preliminary_secret in formulas and structures, instead of -pre_master_secret.¶
-The PreMasterSecret and EncryptedPreMasterSecret structures, defined in -Section 7.4.7.1 of [RFC5246], are renamed to PreliminarySecret and -EncryptedPreliminarySecret, respectively.¶
-Correspondingly, the extension defined in [RFC7627] is renamed to the -"Extended Main Secret" extension. The extension code point is renamed to -"extended_main_secret". The label parameter to the PRF function in Section 4 of -[RFC7627] is left unchanged for compatibility.¶
-The TLS protocol provides a built-in mechanism for version negotiation between -endpoints potentially supporting different versions of TLS.¶
-TLS 1.x and SSL 3.0 use compatible ClientHello messages. Servers can also handle -clients trying to use future versions of TLS as long as the ClientHello format -remains compatible and there is at least one protocol version supported by -both the client and the server.¶
-Prior versions of TLS used the record layer version number -(TLSPlaintext.legacy_record_version and -TLSCiphertext.legacy_record_version) for various purposes. -As of TLS 1.3, this field is deprecated. The value of -TLSPlaintext.legacy_record_version MUST be ignored by all implementations. -The value of TLSCiphertext.legacy_record_version is included in the -additional data for deprotection but MAY otherwise be ignored -or MAY be validated to match the fixed constant value. -Version negotiation is performed using only the handshake versions -(ClientHello.legacy_version and ServerHello.legacy_version, as well as the -ClientHello, HelloRetryRequest, and ServerHello "supported_versions" extensions). -In order to maximize interoperability with older endpoints, implementations -that negotiate the use of TLS 1.0-1.2 SHOULD set the record layer -version number to the negotiated version for the ServerHello and all -records thereafter.¶
-For maximum compatibility with previously non-standard behavior and misconfigured -deployments, all implementations SHOULD support validation of certification paths -based on the expectations in this document, even when handling prior TLS versions' -handshakes (see Section 4.4.2.2).¶
-TLS 1.2 and prior supported an "Extended Main Secret" [RFC7627] extension -which digested large parts of the handshake transcript into the secret and -derived keys. Note this extension was renamed in Appendix D. Because TLS -1.3 always hashes in the transcript up to the server Finished, implementations -which support both TLS 1.3 and earlier versions SHOULD indicate the use of the -Extended Main Secret extension in their APIs whenever TLS 1.3 is used.¶
-A TLS 1.3 client who wishes to negotiate with servers that do not -support TLS 1.3 will send a -normal TLS 1.3 ClientHello containing 0x0303 (TLS 1.2) in -ClientHello.legacy_version but with the correct version(s) in the -"supported_versions" extension. If the server does not support TLS 1.3, it -will respond with a ServerHello containing an older version number. If the -client agrees to use this version, the negotiation will proceed as appropriate -for the negotiated protocol. A client using a ticket for resumption SHOULD initiate the -connection using the version that was previously negotiated.¶
-Note that 0-RTT data is not compatible with older servers and SHOULD NOT -be sent absent knowledge that the server supports TLS 1.3. -See Appendix E.3.¶
-If the version chosen by the server is not supported by the client (or is not -acceptable), the client MUST abort the handshake with a "protocol_version" alert.¶
-Some legacy server implementations are known to not implement the TLS -specification properly and might abort connections upon encountering -TLS extensions or versions which they are not aware of. Interoperability -with buggy servers is a complex topic beyond the scope of this document. -Multiple connection attempts may be required in order to negotiate -a backward-compatible connection; however, this practice is vulnerable -to downgrade attacks and is NOT RECOMMENDED.¶
-A TLS server can also receive a ClientHello indicating a version number smaller -than its highest supported version. If the "supported_versions" extension -is present, the server MUST negotiate using that extension as described in -Section 4.2.1. If the "supported_versions" extension is not -present, the server MUST negotiate the minimum of ClientHello.legacy_version -and TLS 1.2. For example, if the server supports TLS 1.0, 1.1, and 1.2, -and legacy_version is TLS 1.0, the server will proceed with a TLS 1.0 ServerHello. -If the "supported_versions" extension is absent and the server only supports -versions greater than ClientHello.legacy_version, the server MUST abort the handshake -with a "protocol_version" alert.¶
-Note that earlier versions of TLS did not clearly specify the record layer -version number value in all cases (TLSPlaintext.legacy_record_version). Servers -will receive various TLS 1.x versions in this field, but its value -MUST always be ignored.¶
-0-RTT data is not compatible with older servers. An older server will respond -to the ClientHello with an older ServerHello, but it will not correctly skip -the 0-RTT data and will fail to complete the handshake. This can cause issues when -a client attempts to use 0-RTT, particularly against multi-server deployments. For -example, a deployment could deploy TLS 1.3 gradually with some servers -implementing TLS 1.3 and some implementing TLS 1.2, or a TLS 1.3 deployment -could be downgraded to TLS 1.2.¶
-A client that attempts to send 0-RTT data MUST fail a connection if it receives -a ServerHello with TLS 1.2 or older. It can then retry -the connection with 0-RTT disabled. To avoid a downgrade attack, the -client SHOULD NOT disable TLS 1.3, only 0-RTT.¶
-To avoid this error condition, multi-server deployments SHOULD ensure a uniform -and stable deployment of TLS 1.3 without 0-RTT prior to enabling 0-RTT.¶
-Field measurements -[Ben17a] [Ben17b] [Res17a] [Res17b] have found that a significant number of middleboxes -misbehave when a TLS client/server pair negotiates TLS 1.3. Implementations -can increase the chance of making connections through those middleboxes -by making the TLS 1.3 handshake look more like a TLS 1.2 handshake:¶
-The client always provides a non-empty session ID in the ClientHello, -as described in the legacy_session_id section of Section 4.1.2.¶
-If not offering early data, the client sends a dummy -change_cipher_spec record (see the third paragraph of Section 5) -immediately before its second flight. This -may either be before its second ClientHello or before its encrypted -handshake flight. If offering early data, the record is placed -immediately after the first ClientHello.¶
-The server sends a dummy change_cipher_spec record immediately -after its first handshake message. This may either be after a -ServerHello or a HelloRetryRequest.¶
-When put together, these changes make the TLS 1.3 handshake resemble -TLS 1.2 session resumption, which improves the chance of successfully -connecting through middleboxes. This "compatibility mode" is partially -negotiated: the client can opt to provide a session ID or not, -and the server has to echo it. Either side can send change_cipher_spec -at any time during the handshake, as they must be ignored by the peer, -but if the client sends a non-empty session ID, the server MUST send -the change_cipher_spec as described in this appendix.¶
-Implementations negotiating the use of older versions of TLS SHOULD prefer -forward secret and AEAD cipher suites, when available.¶
-The security of RC4 cipher suites is considered insufficient for the reasons -cited in [RFC7465]. Implementations MUST NOT offer or negotiate RC4 cipher suites -for any version of TLS for any reason.¶
-Old versions of TLS permitted the use of very low strength ciphers. -Ciphers with a strength less than 112 bits MUST NOT be offered or -negotiated for any version of TLS for any reason.¶
-The security of SSL 2.0 [SSL2], SSL 3.0 [RFC6101], TLS 1.0 -[RFC2246], and TLS 1.1 [RFC4346] are considered insufficient for -the reasons enumerated in [RFC6176], [RFC7568], and [RFC8996] -and they MUST NOT be negotiated for any reason.¶
-Implementations MUST NOT send an SSL version 2.0 compatible CLIENT-HELLO. -Implementations MUST NOT negotiate TLS 1.3 or later using an SSL version 2.0 compatible -CLIENT-HELLO. Implementations are NOT RECOMMENDED to accept an SSL version 2.0 compatible -CLIENT-HELLO in order to negotiate older versions of TLS.¶
-Implementations MUST NOT send a ClientHello.legacy_version or ServerHello.legacy_version -set to 0x0300 or less. Any endpoint receiving a Hello message with -ClientHello.legacy_version or ServerHello.legacy_version set to 0x0300 MUST -abort the handshake with a "protocol_version" alert.¶
-Implementations MUST NOT send any records with a version less than 0x0300. -Implementations SHOULD NOT accept any records with a version less than 0x0300 -(but may inadvertently do so if the record version number is ignored completely).¶
-Implementations MUST NOT use the Truncated HMAC extension, defined in -Section 7 of [RFC6066], as it is not applicable to AEAD algorithms and has -been shown to be insecure in some scenarios.¶
-A complete security analysis of TLS is outside the scope of this document. -In this appendix, we provide an informal description of the desired properties -as well as references to more detailed work in the research literature -which provides more formal definitions.¶
-We cover properties of the handshake separately from those of the record layer.¶
-The TLS handshake is an Authenticated Key Exchange (AKE) protocol which -is intended to provide both one-way authenticated (server-only) and -mutually authenticated (client and server) functionality. At the completion -of the handshake, each side outputs its view of the following values:¶
-A set of "session keys" (the various secrets derived from the main secret) -from which can be derived a set of working keys.¶
-A set of cryptographic parameters (algorithms, etc.).¶
-The identities of the communicating parties.¶
-We assume the attacker to be an active network attacker, which means it -has complete control over the network used to communicate between the parties [RFC3552]. -Even under these conditions, the handshake should provide the properties listed below. -Note that these properties are not necessarily independent, but reflect -the protocol consumers' needs.¶
-The handshake needs to output the same set of session keys on both sides of -the handshake, provided that it completes successfully on each endpoint -(see [CK01], Definition 1, part 1).¶
-The shared session keys should be known only to the communicating -parties and not to the attacker (see [CK01]; Definition 1, part 2). -Note that in a unilaterally authenticated connection, the attacker can establish -its own session keys with the server, but those session keys are distinct from -those established by the client.¶
-The client's view of the peer identity should reflect the server's -identity. If the client is authenticated, the server's view of the -peer identity should match the client's identity.¶
-Any two distinct handshakes should produce distinct, unrelated session -keys. Individual session keys produced by a handshake should also be distinct -and independent.¶
-The cryptographic parameters should be the same on both sides and -should be the same as if the peers had been communicating in the -absence of an attack (see [BBFGKZ16]; Definitions 8 and 9).¶
-If the long-term keying material (in this case the signature keys in
-certificate-based authentication modes or the external/resumption
-PSK in PSK with (EC)DHE modes) is compromised after the handshake is
-complete, this does not compromise the security of the session key
-(see [DOW92]), as long as the session key
-itself (and all material that could be used to recreate the session
-key) has been erased. In particular, private keys corresponding to key
-shares, shared secrets, and keys derived in the TLS Key Schedule
-other than binder_key
, resumption_secret
, and PSKs derived from
-the resumption_secret
also need to be erased. The forward secrecy
-property is not satisfied when PSK is used in the "psk_ke"
-PskKeyExchangeMode. Failing to erase keys or secrets intended to be
-ephemeral or connection-specific in effect creates additional
-long-term keys that must be protected. Compromise of those long-term
-keys (even after the handshake is complete) can result in loss of
-protection for the connection's traffic.¶
In a mutually authenticated connection with certificates, compromising the long-term -secret of one actor should not break that actor’s authentication of their peer in -the given connection (see [HGFS15]). For example, if a client's signature key is -compromised, it should not be possible to impersonate arbitrary servers to that client -in subsequent handshakes.¶
-The server's identity (certificate) should be protected against passive -attackers. The client's identity (certificate) should be protected against -both passive and active attackers. This property does not hold for cipher -suites without confidentiality; while this specification does not define any such cipher suites, -other documents may do so.¶
-Informally, the signature-based modes of TLS 1.3 provide for the -establishment of a unique, secret, shared key established by an -(EC)DHE key exchange and authenticated by the server's signature over -the handshake transcript, as well as tied to the server's identity by -a MAC. If the client is authenticated by a certificate, it also signs -over the handshake transcript and provides a MAC tied to both -identities. [SIGMA] describes the design and analysis of this type of key -exchange protocol. If fresh (EC)DHE keys are used for each connection, -then the output keys are forward secret.¶
-The external PSK and resumption PSK bootstrap from a long-term shared -secret into a unique per-connection set of short-term session keys. This -secret may have been established in a previous handshake. If -PSK with (EC)DHE key establishment is used, these session keys will also be forward -secret. The resumption PSK has been designed so that the -resumption secret computed by connection N and needed to form -connection N+1 is separate from the traffic keys used by connection N, -thus providing forward secrecy between the connections. -In addition, if multiple tickets are established on the same -connection, they are associated with different keys, so compromise of -the PSK associated with one ticket does not lead to the compromise of -connections established with PSKs associated with other tickets. -This property is most interesting if tickets are stored in a database -(and so can be deleted) rather than if they are self-encrypted.¶
-Forward secrecy limits the effect of key leakage in one direction -(compromise of a key at time T2 does not compromise some key at time -T1 where T1 < T2). Protection in the other direction (compromise at -time T1 does not compromise keys at time T2) can be achieved by -rerunning (EC)DHE. If a long-term authentication key has been -compromised, a full handshake with (EC)DHE gives protection against -passive attackers. If the resumption_secret has been -compromised, a resumption handshake with (EC)DHE gives protection -against passive attackers and a full handshake with (EC)DHE gives -protection against active attackers. If a traffic secret has been -compromised, any handshake with (EC)DHE gives protection against -active attackers. Using the terms in [RFC7624], forward secrecy -without rerunning (EC)DHE does not stop an attacker from doing static -key exfiltration. After key exfiltration of -application_traffic_secret_N, an attacker can e.g., passively -eavesdrop on all future data sent on the connection including data -encrypted with application_traffic_secret_N+1, -application_traffic_secret_N+2, etc. Frequently rerunning (EC)DHE -forces an attacker to do dynamic key exfiltration (or content -exfiltration).¶
-The PSK binder value forms a binding between a PSK -and the current handshake, as well as between the session where the -PSK was established and the current session. This binding -transitively includes the original handshake transcript, because that -transcript is digested into the values which produce the resumption -secret. This requires that both the KDF used to produce the -resumption secret and the MAC used to compute the binder be collision -resistant. See Appendix F.1.1 for more on this. -Note: The binder does not cover the binder values from other -PSKs, though they are included in the Finished MAC.¶
-Note: This specification does not currently permit the server to send a certificate_request -message in non-certificate-based handshakes (e.g., PSK). -If this restriction were to be relaxed in future, the -client's signature would not cover the server's certificate directly. -However, if the PSK was established through a NewSessionTicket, the client's -signature would transitively cover the server's certificate through -the PSK binder. [PSK-FINISHED] -describes a concrete attack on constructions that do not bind to -the server's certificate (see also [Kraw16]). It is unsafe to use certificate-based client -authentication when the client might potentially share the same -PSK/key-id pair with two different endpoints. In the absence -of some other specification to the contrary, implementations MUST -NOT combine external PSKs with certificate-based authentication of -either the client or server. [RFC8773] provides an extension -to permit this, but has not received the level of analysis as this -specification.¶
-If an exporter is used, then it produces values which are unique -and secret (because they are generated from a unique session key). -Exporters computed with different labels and contexts are computationally -independent, so it is not feasible to compute one from another or -the session secret from the exported value. -Note: Exporters can -produce arbitrary-length values; if exporters are to be -used as channel bindings, the exported value MUST be large -enough to provide collision resistance. The exporters provided in -TLS 1.3 are derived from the same Handshake Contexts as the -early traffic keys and the application traffic keys, respectively, -and thus have similar security properties. Note that they do -not include the client's certificate; future applications -which wish to bind to the client's certificate may need -to define a new exporter that includes the full handshake -transcript.¶
-For all handshake modes, the Finished MAC (and, where present, the -signature) prevents downgrade attacks. In addition, the use of -certain bytes in the random nonces as described in Section 4.1.3 -allows the detection of downgrade to previous TLS versions. -See [BBFGKZ16] for more details on TLS 1.3 and downgrade.¶
-As soon as the client and the server have exchanged enough information -to establish shared keys, the remainder of the handshake is encrypted, -thus providing protection against passive attackers, even if the -computed shared key is not authenticated. Because the server -authenticates before the client, the client can ensure that if it -authenticates to the server, it only -reveals its identity to an authenticated server. Note that implementations -must use the provided record-padding mechanism during the handshake -to avoid leaking information about the identities due to length. -The client's proposed PSK identities are not encrypted, nor is the -one that the server selects.¶
-Key derivation in TLS 1.3 uses HKDF as defined in [RFC5869] and -its two components, HKDF-Extract and HKDF-Expand. The full rationale for the HKDF -construction can be found in [Kraw10] and the rationale for the way it is used -in TLS 1.3 in [KW16]. Throughout this document, each -application of HKDF-Extract is followed by one or more invocations of -HKDF-Expand. This ordering should always be followed (including in future -revisions of this document); in particular, one SHOULD NOT use an output of -HKDF-Extract as an input to another application of HKDF-Extract without an -HKDF-Expand in between. Multiple applications of HKDF-Expand to some of -the same inputs are allowed as -long as these are differentiated via the key and/or the labels.¶
-Note that HKDF-Expand implements a pseudorandom function (PRF) with both inputs and -outputs of variable length. In some of the uses of HKDF in this document -(e.g., for generating exporters and the resumption_secret), it is necessary -that the application of HKDF-Expand be collision resistant; namely, it should -be infeasible to find two different inputs to HKDF-Expand that output the same -value. This requires the underlying hash function to be collision resistant -and the output length from HKDF-Expand to be of size at least 256 bits (or as -much as needed for the hash function to prevent finding collisions).¶
-A client that has sent certificate-based authentication data to a server, either during -the handshake or in post-handshake authentication, cannot be sure whether -the server afterwards considers the client to be authenticated or not. -If the client needs to determine if the server considers the -connection to be unilaterally or mutually authenticated, this has to -be provisioned by the application layer. See [CHHSV17] for details. -In addition, the analysis of post-handshake authentication from -[Kraw16] shows that the client identified by the certificate sent in -the post-handshake phase possesses the traffic key. This party is -therefore the client that participated in the original handshake or -one to whom the original client delegated the traffic key (assuming -that the traffic key has not been compromised).¶
-The 0-RTT mode of operation generally provides security -properties similar to those of 1-RTT data, with the two exceptions that the 0-RTT -encryption keys do not provide full forward secrecy and that the -server is not able to guarantee uniqueness of the handshake -(non-replayability) without keeping potentially undue amounts of -state. See Section 8 for mechanisms to limit -the exposure to replay.¶
-The exporter_secret and early_exporter_secret are -derived to be independent of the traffic keys and therefore do -not represent a threat to the security of traffic encrypted with -those keys. However, because these secrets can be used to -compute any exporter value, they SHOULD be erased as soon as -possible. If the total set of exporter labels is known, then -implementations SHOULD pre-compute the inner Derive-Secret -stage of the exporter computation for all those labels, -then erase the [early_]exporter_secret, followed by -each inner values as soon as it is known that it will not be -needed again.¶
-TLS does not provide security for handshakes which take place after the peer's -long-term secret (signature key or external PSK) is compromised. It therefore -does not provide post-compromise security [CCG16], sometimes also referred to -as backwards or future secrecy. This is in contrast to KCI resistance, which -describes the security guarantees that a party has after its own long-term -secret has been compromised.¶
-The record layer depends on the handshake producing strong traffic secrets -which can be used to derive bidirectional encryption keys and nonces. -Assuming that is true, and the keys are used for no more data than -indicated in Section 5.5, then the record layer should provide the following -guarantees:¶
-An attacker should not be able to determine the plaintext contents -of a given record.¶
-An attacker should not be able to craft a new record which is -different from an existing record which will be accepted by the receiver.¶
-An attacker should not be able to cause the receiver to accept a -record which it has already accepted or cause the receiver to accept -record N+1 without having first processed record N.¶
-Given a record with a given external length, the attacker should not be able -to determine the amount of the record that is content versus padding.¶
-If the traffic key update mechanism described in Section 4.6.3 has been -used and the previous generation key is deleted, an attacker who compromises -the endpoint should not be able to decrypt traffic encrypted with the old key.¶
-Informally, TLS 1.3 provides these properties by AEAD-protecting the -plaintext with a strong key. AEAD encryption [RFC5116] provides confidentiality -and integrity for the data. Non-replayability is provided by using -a separate nonce for each record, with the nonce being derived from -the record sequence number (Section 5.3), with the sequence -number being maintained independently at both sides; thus records which -are delivered out of order result in AEAD deprotection failures. -In order to prevent mass cryptanalysis when the same plaintext is -repeatedly encrypted by different users under the same key -(as is commonly the case for HTTP), the nonce is formed by mixing -the sequence number with a secret per-connection initialization -vector derived along with the traffic keys. -See [BT16] for analysis of this construction.¶
-The rekeying technique in TLS 1.3 (see Section 7.2) follows the -construction of the serial generator as discussed in [REKEY], which shows that rekeying can -allow keys to be used for a larger number of encryptions than without -rekeying. This relies on the security of the HKDF-Expand-Label function as a -pseudorandom function (PRF). In addition, as long as this function is truly -one way, it is not possible to compute traffic keys from prior to a key change -(forward secrecy).¶
-TLS does not provide security for data which is communicated on a connection -after a traffic secret of that connection is compromised. That is, TLS does not -provide post-compromise security/future secrecy/backward secrecy with respect -to the traffic secret. Indeed, an attacker who learns a traffic secret can -compute all future traffic secrets on that connection. Systems which want such -guarantees need to do a fresh handshake and establish a new connection with an -(EC)DHE exchange.¶
-The reader should refer to the following references for analysis of the TLS record layer: -[BMMRT15], [BT16], [BDFKPPRSZZ16], [BBK17], and [PS18].¶
-TLS is susceptible to a variety of traffic analysis attacks based on -observing the length and timing of encrypted packets -[CLINIC] - [HCJC16]. -This is particularly easy when there is a small -set of possible messages to be distinguished, such as for a video -server hosting a fixed corpus of content, but still provides usable -information even in more complicated scenarios.¶
-TLS does not provide any specific defenses against this form of attack -but does include a padding mechanism for use by applications: The -plaintext protected by the AEAD function consists of content plus -variable-length padding, which allows the application to produce -arbitrary-length encrypted records as well as padding-only cover traffic to -conceal the difference between periods of transmission and periods -of silence. Because the -padding is encrypted alongside the actual content, an attacker cannot -directly determine the length of the padding, but may be able to -measure it indirectly by the use of timing channels exposed during -record processing (i.e., seeing how long it takes to process a -record or trickling in records to see which ones elicit a response -from the server). In general, it is not known how to remove all of -these channels because even a constant-time padding removal function will -likely feed the content into data-dependent functions. -At minimum, a fully constant-time server or client would require close -cooperation with the application-layer protocol implementation, including -making that higher-level protocol constant time.¶
-Note: Robust -traffic analysis defenses will likely lead to inferior performance -due to delays in transmitting packets and increased traffic volume.¶
-In general, TLS does not have specific defenses against side-channel -attacks (i.e., those which attack the communications via secondary -channels such as timing), leaving those to the implementation of the relevant -cryptographic primitives. However, certain features of TLS are -designed to make it easier to write side-channel resistant code:¶
-Unlike previous versions of TLS which used a composite -MAC-then-encrypt structure, TLS 1.3 only uses AEAD algorithms, -allowing implementations to use self-contained constant-time -implementations of those primitives.¶
-TLS uses a uniform "bad_record_mac" alert for all decryption -errors, which is intended to prevent an attacker from gaining -piecewise insight into portions of the message. Additional resistance -is provided by terminating the connection on such errors; a new -connection will have different cryptographic material, preventing -attacks against the cryptographic primitives that require multiple -trials.¶
-Information leakage through side channels can occur at layers above -TLS, in application protocols and the applications that use -them. Resistance to side-channel attacks depends on applications and -application protocols separately ensuring that confidential -information is not inadvertently leaked.¶
-Replayable 0-RTT data presents a number of security threats to -TLS-using applications, unless those applications are specifically -engineered to be safe under replay -(minimally, this means idempotent, but in many cases may -also require other stronger conditions, such as constant-time -response). Potential attacks include:¶
-Duplication of actions which cause side effects (e.g., purchasing an -item or transferring money) to be duplicated, thus harming the site or -the user.¶
-Attackers can store and replay 0-RTT messages in order to -reorder them with respect to other messages (e.g., moving -a delete to after a create).¶
-Amplifying existing information leaks caused by side effects like -caching. An attacker could learn information about the content of a -0-RTT message by replaying it to some cache node that has not cached -some resource of interest, and then using a separate connection to check -whether that resource has been added to the cache. This could be repeated -with different cache nodes as often as the 0-RTT message is replayable.¶
-If data can be replayed a large number of times, additional attacks -become possible, such as making repeated measurements of the -speed of cryptographic operations. In addition, they may -be able to overload rate-limiting systems. For a further description of -these attacks, see [Mac17].¶
-Ultimately, servers have the responsibility to protect themselves -against attacks employing 0-RTT data replication. The mechanisms -described in Section 8 are intended to -prevent replay at the TLS layer but do not provide complete protection -against receiving multiple copies of client data. -TLS 1.3 falls back to the 1-RTT -handshake when the server does not have any information about the -client, e.g., because it is in a different cluster which does not -share state or because the ticket has been deleted as described in -Section 8.1. If the application-layer protocol retransmits -data in this setting, then it is possible for an attacker to induce -message duplication by sending the ClientHello to both the original cluster -(which processes the data immediately) and another cluster which will -fall back to 1-RTT and process the data upon application-layer -replay. The scale of this attack is limited by the client's -willingness to retry transactions and therefore only allows a limited amount -of duplication, with each copy appearing as a new connection at -the server.¶
-If implemented correctly, the mechanisms described in -Section 8.1 and Section 8.2 prevent a -replayed ClientHello and its associated 0-RTT data from being accepted -multiple times by any cluster with consistent state; for servers -which limit the use of 0-RTT to one cluster for a single ticket, then a given -ClientHello and its associated 0-RTT data will only be accepted once. -However, if state is not completely consistent, -then an attacker might be able to have multiple copies of the data be -accepted during the replication window. -Because clients do not know the exact details of server behavior, they -MUST NOT send messages in early data which are not safe to have -replayed and which they would not be willing to retry across multiple -1-RTT connections.¶
-Application protocols MUST NOT use 0-RTT data without a profile that -defines its use. That profile needs to identify which messages or -interactions are safe to use with 0-RTT and how to handle the -situation when the server rejects 0-RTT and falls back to 1-RTT.¶
-In addition, to avoid accidental misuse, TLS implementations MUST NOT -enable 0-RTT (either sending or accepting) unless specifically -requested by the application and MUST NOT automatically resend 0-RTT -data if it is rejected by the server unless instructed by the -application. Server-side applications may wish to implement special -processing for 0-RTT data for some kinds of application traffic (e.g., -abort the connection, request that data be resent at the application -layer, or delay processing until the handshake completes). In order to -allow applications to implement this kind of processing, TLS -implementations MUST provide a way for the application to determine if -the handshake has completed.¶
-Replays of the ClientHello produce the same early exporter, thus -requiring additional care by applications which use these exporters. -In particular, if these exporters are used as an authentication -channel binding (e.g., by signing the output of the exporter) -an attacker who compromises the PSK can transplant authenticators -between connections without compromising the authentication key.¶
-In addition, the early exporter SHOULD NOT be used to generate -server-to-client encryption keys because that would entail -the reuse of those keys. This parallels the use of the early -application traffic keys only in the client-to-server direction.¶
-Because implementations respond to an invalid PSK binder by aborting -the handshake, it may be possible for an attacker to verify whether -a given PSK identity is valid. Specifically, if a server accepts -both external-PSK and certificate-based handshakes, a valid PSK identity -will result in a failed handshake, whereas an invalid identity will -just be skipped and result in a successful certificate handshake. -Servers which solely support PSK handshakes may be able to resist -this form of attack by treating the cases where there is no -valid PSK identity and where there is an identity but it has an -invalid binder identically.¶
-Although TLS 1.3 does not use RSA key transport and so is not -directly susceptible to Bleichenbacher-type attacks [Blei98] if TLS 1.3 -servers also support static RSA in the context of previous -versions of TLS, then it may be possible to impersonate the server -for TLS 1.3 connections [JSS15]. TLS -1.3 implementations can prevent this attack by disabling support -for static RSA across all versions of TLS. In principle, implementations -might also be able to separate certificates with different keyUsage -bits for static RSA decryption and RSA signature, but this technique -relies on clients refusing to accept signatures using keys -in certificates that do not have the digitalSignature bit set, -and many clients do not enforce this restriction.¶
-[[RFC EDITOR: Please remove in final RFC.]] -Since -06 -- Updated text about differences from RFC 8446. -- Clarify which parts of IANA considerations are new to this document. -- Upgrade the requirement to initiate key update before exceeding - key usage limits to MUST. -- Add some text around use of the same cert for client and server.¶
-Since -05¶
-Port in text on key update limits from RFC 9147 (Issue 1257)¶
-Clarify that you need to ignore NST if you don't do resumption -(Issue 1280)¶
-Discuss the privacy implications of external key reuse (Issue 1287)¶
-Advice on key deletion (PR 1282)¶
-Clarify what unsolicited extensions means (PR 1275)¶
-close_notify should be warning (PR 1290)¶
-Reference RFC 8773 (PR 1296)¶
-Add some more information about application bindings and cite -6125-bis (PR 1297)¶
-Since -04¶
-Update the extension table (Issue 1241)¶
-Clarify user_canceled (Issue 1208)¶
-Clarify 0-RTT cache side channels (Issue 1225)¶
-Require that message reinjection be done with the current hash. -Potentially a clarification and potentially a wire format -change depending on previous interpretation (Issue 1227)¶
-Changelog not updated between -00 and -03¶
-Since -00¶
- -- Martin Abadi - University of California, Santa Cruz - abadi@cs.ucsc.edu - - Christopher Allen - (co-editor of TLS 1.0) - Alacrity Ventures - ChristopherA@AlacrityManagement.com - - Nimrod Aviram - Tel Aviv University - nimrod.aviram@gmail.com - - Richard Barnes - Cisco - rlb@ipv.sx - - Steven M. Bellovin - Columbia University - smb@cs.columbia.edu - - David Benjamin - Google - davidben@google.com - - Benjamin Beurdouche - INRIA & Microsoft Research - benjamin.beurdouche@ens.fr - - Karthikeyan Bhargavan - (editor of [RFC7627]) - INRIA - karthikeyan.bhargavan@inria.fr - - Simon Blake-Wilson - (co-author of [RFC4492]) - BCI - sblakewilson@bcisse.com - - Nelson Bolyard - (co-author of [RFC4492]) - Sun Microsystems, Inc. - nelson@bolyard.com - - Ran Canetti - IBM - canetti@watson.ibm.com - - Matt Caswell - OpenSSL - matt@openssl.org - - Stephen Checkoway - University of Illinois at Chicago - sfc@uic.edu - - Pete Chown - Skygate Technology Ltd - pc@skygate.co.uk - - Katriel Cohn-Gordon - University of Oxford - me@katriel.co.uk - - Cas Cremers - University of Oxford - cas.cremers@cs.ox.ac.uk - - Antoine Delignat-Lavaud - (co-author of [RFC7627]) - INRIA - antdl@microsoft.com - - Tim Dierks - (co-author of TLS 1.0, co-editor of TLS 1.1 and 1.2) - Independent - tim@dierks.org - - Roelof DuToit - Symantec Corporation - roelof_dutoit@symantec.com - - Taher Elgamal - Securify - taher@securify.com - - Pasi Eronen - Nokia - pasi.eronen@nokia.com - - Cedric Fournet - Microsoft - fournet@microsoft.com - - Anil Gangolli - anil@busybuddha.org - - David M. Garrett - dave@nulldereference.com - - Illya Gerasymchuk - Independent - illya@iluxonchik.me - - Alessandro Ghedini - Cloudflare Inc. - alessandro@cloudflare.com - - Daniel Kahn Gillmor - ACLU - dkg@fifthhorseman.net - - Matthew Green - Johns Hopkins University - mgreen@cs.jhu.edu - - Jens Guballa - ETAS - jens.guballa@etas.com - - Felix Guenther - TU Darmstadt - mail@felixguenther.info - - Vipul Gupta - (co-author of [RFC4492]) - Sun Microsystems Laboratories - vipul.gupta@sun.com - - Chris Hawk - (co-author of [RFC4492]) - Corriente Networks LLC - chris@corriente.net - - Kipp Hickman - - Alfred Hoenes - - David Hopwood - Independent Consultant - david.hopwood@blueyonder.co.uk - - Marko Horvat - MPI-SWS - mhorvat@mpi-sws.org - - Jonathan Hoyland - Royal Holloway, University of London - jonathan.hoyland@gmail.com - - Subodh Iyengar - Facebook - subodh@fb.com - - Benjamin Kaduk - Akamai Technologies - kaduk@mit.edu - - Hubert Kario - Red Hat Inc. - hkario@redhat.com - - Phil Karlton - (co-author of SSL 3.0) - - Leon Klingele - Independent - mail@leonklingele.de - - Paul Kocher - (co-author of SSL 3.0) - Cryptography Research - paul@cryptography.com - - Hugo Krawczyk - IBM - hugokraw@us.ibm.com - - Adam Langley - (co-author of [RFC7627]) - Google - agl@google.com - - Olivier Levillain - ANSSI - olivier.levillain@ssi.gouv.fr - - Xiaoyin Liu - University of North Carolina at Chapel Hill - xiaoyin.l@outlook.com - - Ilari Liusvaara - Independent - ilariliusvaara@welho.com - - Atul Luykx - K.U. Leuven - atul.luykx@kuleuven.be - - Colm MacCarthaigh - Amazon Web Services - colm@allcosts.net - - Carl Mehner - USAA - carl.mehner@usaa.com - - Jan Mikkelsen - Transactionware - janm@transactionware.com - - Bodo Moeller - (co-author of [RFC4492]) - Google - bodo@acm.org - - Kyle Nekritz - Facebook - knekritz@fb.com - - Erik Nygren - Akamai Technologies - erik+ietf@nygren.org - - Magnus Nystrom - Microsoft - mnystrom@microsoft.com - - Kazuho Oku - DeNA Co., Ltd. - kazuhooku@gmail.com - - Kenny Paterson - Royal Holloway, University of London - kenny.paterson@rhul.ac.uk - - Christopher Patton - University of Florida - cjpatton@ufl.edu - - Alfredo Pironti - (co-author of [RFC7627]) - INRIA - alfredo.pironti@inria.fr - - Andrei Popov - Microsoft - andrei.popov@microsoft.com - - John {{{Preuß Mattsson}}} - Ericsson - john.mattsson@ericsson.com - - Marsh Ray - (co-author of [RFC7627]) - Microsoft - maray@microsoft.com - - Robert Relyea - Netscape Communications - relyea@netscape.com - - Kyle Rose - Akamai Technologies - krose@krose.org - - Jim Roskind - Amazon - jroskind@amazon.com - - Michael Sabin - - Joe Salowey - Tableau Software - joe@salowey.net - - Rich Salz - Akamai - rsalz@akamai.com - - David Schinazi - Apple Inc. - dschinazi@apple.com - - Sam Scott - Royal Holloway, University of London - me@samjs.co.uk - - Thomas Shrimpton - University of Florida - teshrim@ufl.edu - - Dan Simon - Microsoft, Inc. - dansimon@microsoft.com - - Brian Smith - Independent - brian@briansmith.org - - Ben Smyth - Ampersand - www.bensmyth.com - - Brian Sniffen - Akamai Technologies - ietf@bts.evenmere.org - - Nick Sullivan - Cloudflare Inc. - nick@cloudflare.com - - Bjoern Tackmann - University of California, San Diego - btackmann@eng.ucsd.edu - - Tim Taubert - Mozilla - ttaubert@mozilla.com - - Martin Thomson - Mozilla - mt@mozilla.com - - Hannes Tschofenig - Arm Limited - Hannes.Tschofenig@arm.com - - Sean Turner - sn3rd - sean@sn3rd.com - - Steven Valdez - Google - svaldez@google.com - - Filippo Valsorda - Cloudflare Inc. - filippo@cloudflare.com - - Thyla van der Merwe - Royal Holloway, University of London - tjvdmerwe@gmail.com - - Victor Vasiliev - Google - vasilvv@google.com - - Hoeteck Wee - Ecole Normale Superieure, Paris - hoeteck@alum.mit.edu - - Tom Weinstein - - David Wong - NCC Group - david.wong@nccgroup.trust - - Christopher A. Wood - Apple Inc. - cawood@apple.com - - Tim Wright - Vodafone - timothy.wright@vodafone.com - - Peter Wu - Independent - peter@lekensteyn.nl - - Kazu Yamamoto - Internet Initiative Japan Inc. - kazu@iij.ad.jp -¶ -