rfc9846.original.md   rfc9846.md 
--- ---
title: The Transport Layer Security (TLS) Protocol Version 1.3 title: The Transport Layer Security (TLS) Protocol Version 1.3
abbrev: TLS abbrev: TLS
docname: draft-ietf-tls-rfc8446bis-latest number: 9846
docname: draft-ietf-tls-rfc8446bis-14
submissiontype: IETF submissiontype: IETF
consensus: true
category: std category: std
updates: 5705, 6066, 7627, 8422 updates: 5705, 6066, 7627, 8422
obsoletes: 8446 obsoletes: 8446
v: 3 v: 3
lang: en
ipr: pre5378Trust200902 ipr: pre5378Trust200902
area: Security area: SEC
workgroup: Transport Layer Security workgroup: tls
keyword: Internet-Draft
stand_alone: yes stand_alone: yes
pi: pi:
rfcedstyle: yes rfcedstyle: yes
toc: yes toc: yes
tocindent: yes tocindent: yes
sortrefs: yes sortrefs: yes
symrefs: yes symrefs: yes
strict: yes strict: yes
comments: yes comments: yes
inline: yes inline: yes
skipping to change at line 57 skipping to change at line 58
RFC8126: RFC8126:
RFC8174: RFC8174:
RFC5116: RFC5116:
X690: X690:
title: "Information technology - ASN.1 encoding Rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)" title: "Information technology - ASN.1 encoding Rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)"
date: February 2021 date: February 2021
author: author:
org: ITU-T org: ITU-T
seriesinfo: seriesinfo:
ITU-T X.690 ITU-T: Recommendation X.690
target: https://www.itu.int/rec/T-REC-X.690-202102-I/en target: https://www.itu.int/rec/T-REC-X.690-202102-I/en
GCM: GCM:
title: "Recommendation for Block Cipher Modes of Operation: Galois/Counter Mo de (GCM) and GMAC" title: "Recommendation for Block Cipher Modes of Operation: Galois/Counter Mo de (GCM) and GMAC"
date: 2007-11 date: 2007-11
author: author:
- ins: M. Dworkin - ins: M. Dworkin
seriesinfo: seriesinfo:
NIST: Special Publication 800-38D NIST: SP 800-38D
DOI: 10.6028/NIST.SP.800-38D
target: https://doi.org/10.6028/NIST.SP.800-38D target: https://doi.org/10.6028/NIST.SP.800-38D
informative: informative:
RFC4086: RFC4086:
RFC4346: RFC4346:
RFC4366: RFC4366:
RFC4492: RFC4492:
RFC5077: RFC5077:
RFC5246: RFC5246:
RFC5764: RFC5764:
RFC5929: RFC5929:
RFC6091: RFC6091:
RFC6176: RFC6176:
RFC6520: RFC6520:
RFC7465: RFC7465:
RFC7250: RFC7250:
RFC7568: RFC7568:
RFC7624: RFC7624:
RFC7685: RFC7685:
RFC8305: RFC8305:
RFC8844: RFC8844:
RFC8849: RFC8449:
RFC8870: RFC8870:
RFC8937: RFC8937:
RFC9001: RFC9001:
RFC9112: RFC9112:
RFC9162: RFC9162:
RFC9146: RFC9146:
RFC9149: RFC9149:
RFC9257: RFC9257:
RFC9258: RFC9258:
RFC9345: RFC9345:
DH76: DOI.10.1109/TIT.1976.1055638 DH76: DOI.10.1109/TIT.1976.1055638
SSL2: SSL2:
title: "The SSL Protocol" title: "The SSL Protocol"
author: author:
name: Kipp Hickman name: Kipp Hickman
org: Netscape Communications Corp. org: Netscape Communications Corp.
date: 1995-02-09 date: 1995-02-09
TIMING: TIMING:
title: "Remote Timing Attacks Are Practical" title: "Remote Timing Attacks Are Practical"
target: https://www.usenix.org/conference/12th-usenix-security-symposium/remot e-timing-attacks-are-practical
author: author:
- -
ins: D. Boneh ins: D. Boneh
- -
ins: D. Brumley ins: D. Brumley
seriesinfo: refcontent: 12th USENIX Security Symposium (USENIX Security 03)
USENIX: Security Symposium
date: 2003 date: 2003
X501: X501:
title: "Information Technology - Open Systems Interconnection - The Directory: Models" title: "Information Technology - Open Systems Interconnection - The Directory: Models"
date: October 2019 date: October 2019
target: https://www.itu.int/rec/T-REC-X.501-201910-I/en
author: author:
org: ITU-T org: ITU-T
seriesinfo: seriesinfo:
ISO/IEC 9594-2:2020 ITU-T: Recommendation X.501
ISO/IEC: 9594-2:2020
PSK-FINISHED: PSK-FINISHED:
title: "Revision 10: possible attack if client authentication is allowed durin g PSK" title: "Revision 10: possible attack if client authentication is allowed durin g PSK"
date: 2015 date: 2015-10-31
seriesinfo: message to the TLS mailing list, refcontent: message to the TLS mailing list
target: https://www.ietf.org/mail-archive/web/tls/current/msg18215.html target: https://mailarchive.ietf.org/arch/msg/tls/TugB5ddJu3nYg7chcyeIyUqWSbA/
author: author:
- -
ins: C. Cremers ins: C. Cremers
- -
ins: M. Horvat ins: M. Horvat
- -
ins: T. van der Merwe ins: T. van der Merwe
- -
ins: S. Scott ins: S. Scott
CHHSV17: CHHSV17:
title: "Awkward Handshake: Possible mismatch of client/server view on client a uthentication in post-handshake mode in Revision 18" title: "Awkward Handshake: Possible mismatch of client/server view on client a uthentication in post-handshake mode in Revision 18"
date: 10 February, 2017 date: 2017-02-10
target: https://www.ietf.org/mail-archive/web/tls/current/msg22382.html target: https://mailarchive.ietf.org/arch/msg/tls/crdSCgiW-94z2joulYJtuA52E9E/
seriesinfo: message to the TLS mailing list refcontent: message to the TLS mailing list
author: author:
- -
ins: C. Cremers ins: C. Cremers
- -
ins: M. Horvat ins: M. Horvat
- -
ins: J. Hoyland ins: J. Hoyland
- -
ins: T. van der Merwe ins: T. van der Merwe
- -
ins: S. Scott ins: S. Scott
AEAD-LIMITS: AEAD-LIMITS:
title: "Limits on Authenticated Encryption Use in TLS" title: "Limits on Authenticated Encryption Use in TLS"
author: author:
- -
ins: A. Luykx ins: A. Luykx
- -
ins: K. Paterson ins: K. Paterson
target: https://eprint.iacr.org/2024/051.pdf target: https://eprint.iacr.org/2024/051
date: August 2017 date: 2024
refcontent: Cryptology ePrint Archive, Paper 2024/051
HGFS15: HGFS15:
title: "Prying Open Pandora's Box: KCI Attacks against TLS" title: "Prying Open Pandora's Box: KCI Attacks against TLS"
target: https://www.usenix.org/conference/woot15/workshop-program/presentation /hlauschek
author: author:
- -
ins: C. Hlauschek ins: C. Hlauschek
- -
ins: M. Gruber ins: M. Gruber
- -
ins: F. Fankhauser ins: F. Fankhauser
- -
ins: C. Schanes ins: C. Schanes
seriesinfo: Proceedings of USENIX Workshop on Offensive Technologies refcontent: 9th USENIX Workshop on Offensive Technologies (WOOT 15)
date: 2015 date: 2015
FGSW16: FGSW16:
title: "Key Confirmation in Key Exchange: A Formal Treatment and Implications for TLS 1.3" title: "Key Confirmation in Key Exchange: A Formal Treatment and Implications for TLS 1.3"
author: author:
- -
ins: M. Fischlin ins: M. Fischlin
- -
ins: F. Guenther ins: F. Guenther
- -
ins: B. Schmidt ins: B. Schmidt
- -
ins: B. Warinschi ins: B. Warinschi
seriesinfo: Proceedings of IEEE Symposium on Security and Privacy (Oakland) 20 refcontent: 2016 IEEE Symposium on Security and Privacy (SP), pp. 452-469
16 seriesinfo:
DOI: 10.1109/SP.2016.34
target: http://ieeexplore.ieee.org/document/7546517/ target: http://ieeexplore.ieee.org/document/7546517/
date: 2016 date: 2016
FW15: FW15:
title: "Factoring RSA Keys With TLS Perfect Forward Secrecy" title: "Factoring RSA Keys With TLS Perfect Forward Secrecy"
target: https://www.redhat.com/en/blog/factoring-rsa-keys-tls-perfect-forward- secrecy
author: author:
- -
ins: F. Weimer ins: F. Weimer
org: Red Hat Product Security org: Red Hat Product Security
date: 2015-09 date: 2015-09-02
refcontent: Red Hat Blog
BDFKPPRSZZ16: BDFKPPRSZZ16:
title: "Implementing and Proving the TLS 1.3 Record Layer" title: "Implementing and Proving the TLS 1.3 Record Layer"
author: author:
- -
ins: K. Bhargavan ins: K. Bhargavan
- -
ins: A. Delignat-Lavaud ins: A. Delignat-Lavaud
- -
ins: C. Fournet ins: C. Fournet
- -
skipping to change at line 219 skipping to change at line 228
- -
ins: J. Protzenko ins: J. Protzenko
- -
ins: A. Rastogi ins: A. Rastogi
- -
ins: N. Swamy ins: N. Swamy
- -
ins: S. Zanella-Beguelin ins: S. Zanella-Beguelin
- -
ins: J. Zinzindohoue ins: J. Zinzindohoue
seriesinfo: Proceedings of IEEE Symposium on Security and Privacy (San Jose) 20 refcontent: Cryptology ePrint Archive, Paper 2016/1178
17 date: 2016
date: 2016-12
target: https://eprint.iacr.org/2016/1178 target: https://eprint.iacr.org/2016/1178
Blei98: Blei98:
title: "Chosen Ciphertext Attacks against Protocols Based on RSA Encryption Sta ndard PKCS #1" title: "Chosen Ciphertext Attacks against Protocols Based on RSA Encryption Sta ndard PKCS #1"
target: https://link.springer.com/chapter/10.1007/bfb0055716
author: author:
- -
ins: D. Bleichenbacher ins: D. Bleichenbacher
seriesinfo: Proceedings of CRYPTO '98 refcontent: Advances in Cryptology - CRYPTO '98, Lecture Notes in Computer Scie nce, vol. 1462, pp. 1-12
date: 1998 date: 1998
BMMRT15: BMMRT15:
title: "Augmented Secure Channels and the Goal of the TLS 1.3 Record Layer" title: "Augmented Secure Channels and the Goal of the TLS 1.3 Record Layer"
author: author:
- -
ins: C. Badertscher ins: C. Badertscher
- -
ins: C. Matt ins: C. Matt
- -
ins: U. Maurer ins: U. Maurer
- -
ins: P. Rogaway ins: P. Rogaway
- -
ins: B. Tackmann ins: B. Tackmann
seriesinfo: ProvSec 2015 refcontent: Cryptology ePrint Archive, Paper 2015/394
date: 2015-09 date: 2015
target: https://eprint.iacr.org/2015/394 target: https://eprint.iacr.org/2015/394
BT16: BT16:
title: "The Multi-User Security of Authenticated Encryption: AES-GCM in TLS 1.3 " title: "The Multi-User Security of Authenticated Encryption: AES-GCM in TLS 1.3 "
author: author:
- -
ins: M. Bellare ins: M. Bellare
- -
ins: B. Tackmann ins: B. Tackmann
seriesinfo: Proceedings of CRYPTO 2016 refcontent: Cryptology ePrint Archive, Paper 2016/564
date: July 2016 date: 2016
target: https://eprint.iacr.org/2016/564 target: https://eprint.iacr.org/2016/564
Kraw16: Kraw16:
title: "A Unilateral-to-Mutual Authentication Compiler for Key Exchange (with Applications to Client Authentication in TLS 1.3" title: "A Unilateral-to-Mutual Authentication Compiler for Key Exchange (with Applications to Client Authentication in TLS 1.3"
date: October2016 date: 2016
seriesinfo: Proceedings of ACM CCS 2016 refcontent: Cryptology ePrint Archive, Paper 2016/711
target: https://eprint.iacr.org/2016/711 target: https://eprint.iacr.org/2016/711
author: author:
- -
ins: H. Krawczyk ins: H. Krawczyk
KW16: KW16:
title: "The OPTLS Protocol and TLS 1.3" title: "The OPTLS Protocol and TLS 1.3"
date: 2016 date: 2015
seriesinfo: Proceedings of Euro S&P 2016 refcontent: Cryptology ePrint Archive, Paper 2015/978
target: https://eprint.iacr.org/2015/978 target: https://eprint.iacr.org/2015/978
author: author:
- -
ins: H. Krawczyk ins: H. Krawczyk
- -
ins: H. Wee ins: H. Wee
DFGS15: DFGS15:
title: "A Cryptographic Analysis of the TLS 1.3 draft-10 Full and Pre-shared K ey Handshake Protocol" title: "A Cryptographic Analysis of the TLS 1.3 draft-10 Full and Pre-shared K ey Handshake Protocol"
date: 2015 date: 2015
seriesinfo: Proceedings of ACM CCS 2015 refcontent: Cryptology ePrint Archive, Paper 2015/914
date: October 2016,
target: https://eprint.iacr.org/2015/914 target: https://eprint.iacr.org/2015/914
author: author:
- -
ins: B. Dowling ins: B. Dowling
- -
ins: M. Fischlin ins: M. Fischlin
- -
ins: F. Guenther ins: F. Guenther
- -
ins: D. Stebila ins: D. Stebila
DFGS16: DFGS16:
title: "A Cryptographic Analysis of the TLS 1.3 draft-10 Full and Pre-shared K ey Handshake Protocol" title: "A Cryptographic Analysis of the TLS 1.3 draft-10 Full and Pre-shared K ey Handshake Protocol"
date: February 2016 date: 2016
seriesinfo: TRON 2016 refcontent: Cryptology ePrint Archive, Paper 2016/081
target: https://eprint.iacr.org/2016/081 target: https://eprint.iacr.org/2016/081
author: author:
- -
ins: B. Dowling ins: B. Dowling
- -
ins: M. Fischlin ins: M. Fischlin
- -
ins: F. Guenther ins: F. Guenther
- -
ins: D. Stebila ins: D. Stebila
FG17: FG17:
title: "Replay Attacks on Zero Round-Trip Time: The Case of the TLS 1.3 Handsh ake Candidates" title: "Replay Attacks on Zero Round-Trip Time: The Case of the TLS 1.3 Handsh ake Candidates"
date: 2017 date: 2017
seriesinfo: Proceedings of Euro S&P 2017 refcontent: Cryptology ePrint Archive, Paper 2017/082
target: https://eprint.iacr.org/2017/082 target: https://eprint.iacr.org/2017/082
author: author:
- -
ins: M. Fischlin ins: M. Fischlin
- -
ins: F. Guenther ins: F. Guenther
Kraw10: Kraw10:
title: "Cryptographic Extraction and Key Derivation: The HKDF Scheme" title: "Cryptographic Extraction and Key Derivation: The HKDF Scheme"
date: 2010 date: 2010
seriesinfo: Proceedings of CRYPTO 2010 refcontent: Cryptology ePrint Archive, Paper 2010/264
target: https://eprint.iacr.org/2010/264 target: https://eprint.iacr.org/2010/264
data: August 2010
author: author:
- -
ins: H. Krawczyk ins: H. Krawczyk
Mac17: Mac17:
title: "Security Review of TLS1.3 0-RTT" title: "Security Review of TLS1.3 0-RTT"
date: March 2017 date: May 2017
target: https://github.com/tlswg/tls13-spec/issues/1001 target: https://github.com/tlswg/tls13-spec/issues/1001
author: author:
- -
ins: C. MacCarthaigh ins: C. MacCarthaigh
Res17a: Res17a:
title: Preliminary data on Firefox TLS 1.3 Middlebox experiment title: Preliminary data on Firefox TLS 1.3 Middlebox experiment
date: 2017 date: 2017-12-05
target: https://www.ietf.org/mail-archive/web/tls/current/msg25091.html target: https://mailarchive.ietf.org/arch/msg/tls/RBp0X-OWNuWXugFJRV7c_hIU0dI/
seriesinfo: message to the TLS mailing list refcontent: message to the TLS mailing list
author: author:
- -
ins: E. Rescorla ins: E. Rescorla
Res17b: Res17b:
title: More compatibility measurement results title: More compatibility measurement results
date: 22 December 2017 date: 2017-12-22
target: https://www.ietf.org/mail-archive/web/tls/current/msg25179.html target: https://mailarchive.ietf.org/arch/msg/tls/6pGGT-wm5vSkacMFPEPvFMEnj-M/
seriesinfo: message to the TLS mailing list refcontent: message to the TLS mailing list
author: author:
- -
ins: E. Rescorla ins: E. Rescorla
Ben17a: Ben17a:
title: Presentation before the TLS WG at IETF 100 title: Presentation before the TLS WG at IETF 100
date: 2017 date: November 2017
target: https://datatracker.ietf.org/meeting/100/materials/slides-100-tls-sess a-tls13/ target: https://datatracker.ietf.org/meeting/100/materials/slides-100-tls-sess a-tls13/
author: author:
- -
ins: D. Benjamin ins: D. Benjamin
refcontent: IETF 100 Proceedings
Ben17b: Ben17b:
title: Additional TLS 1.3 results from Chrome title: Additional TLS 1.3 results from Chrome
date: 2017 date: 2017-12-18
target: https://www.ietf.org/mail-archive/web/tls/current/msg25168.html target: https://mailarchive.ietf.org/arch/msg/tls/i9blmvG2BEPf1s1OJkenHknRw9c/
refcontent: message to the TLS mailing list
author: author:
- -
ins: D. Benjamin ins: D. Benjamin
PS18: PS18:
title: "Partially specified title: "Partially specified
channels: The TLS 1.3 record layer without elision" channels: The TLS 1.3 record layer without elision"
date: 2018 date: 2018
refcontent: Cryptology ePrint Archive, Paper 2018/634
author: author:
- -
ins: C. Patton ins: C. Patton
- -
ins: T. Shrimpton ins: T. Shrimpton
target: https://eprint.iacr.org/2018/634 target: https://eprint.iacr.org/2018/634
FETCH: FETCH:
title: "Fetch Standard" title: "Fetch"
date: Living Standard date: false
author: author:
org: WHATWG org: WHATWG
target: https://fetch.spec.whatwg.org/ target: https://fetch.spec.whatwg.org/
refcontent: WHATWG Living Standard
ann: >
Commit snapshot: https://fetch.spec.whatwg.org/commit-snapshots/4775fcb48042
c8411df497c0b7cf167b4240004f/
DSA-1571-1: DSA-1571-1:
title: "openssl -- predictable random number generator" title: "[SECURITY] [DSA 1571-1] New openssl packages fix predictable random nu mber generator"
author: author:
org: The Debian Project -
ins: F. Weimer
date: May 2008 date: May 2008
target: https://www.debian.org/security/2008/dsa-1571 target: https://www.debian.org/security/2008/dsa-1571
refcontent: message to the debian-security-announce mailing list
MM24: MM24:
title: "Misbinding Raw Public Keys to Identities in TLS" title: "Misbinding Raw Public Keys to Identities in TLS"
date: 2024 date: 2025-09-29
refcontent:
arxiv:2411.09770
target: https://arxiv.org/pdf/2411.09770 target: https://arxiv.org/pdf/2411.09770
author: author:
- -
ins: M. Moustafa ins: M. Moustafa
- -
ins: M. Sethi ins: M. Sethi
- -
ins: T. Aura ins: T. Aura
Selfie: Selfie:
title: "Selfie: reflections on TLS 1.3 with PSK" title: "Selfie: reflections on TLS 1.3 with PSK"
date: 2019 date: 2019
target: https://eprint.iacr.org/2019/347.pdf refcontent: Cryptology ePrint Archive, Paper 2019/347
target: https://eprint.iacr.org/2019/347
author: author:
- -
ins: N. Drucker ins: N. Drucker
- -
ins: S. Gueron ins: S. Gueron
PRE-RFC9849:
title: >
TLS Encrypted Client Hello
target: https://www.rfc-editor.org/info/rfc9849
seriesinfo:
RFC: PRE-RFC9849
DOI: 10.17487/preRFC9849
date: December 2025
author:
-
ins: E. Rescorla
surname: Rescorla
fullname: Eric Rescorla
-
ins: K. Oku
surname: Oku
fullname: Kazuho Oku
-
ins: N. Sullivan
surname: Sullivan
fullname: Nick Sullivan
-
ins: C. A. Wood
surname: Wood
fullname: Christopher A. Wood
--- abstract --- abstract
<!-- [rfced] Please insert any keywords (beyond those that appear in
the title) for use on https://www.rfc-editor.org/search. -->
<!-- [rfced] The document header indicates it obsoletes and updates the following RFC
s:
Obsoletes: 8446
Updates: 5705, 6066, 7627, 8422
In the body of the document, we see the text below. Note that the mentions of update
s seem consistent with the document header. However, the text specifies that it obso
letes more than just RFC 8446, likely because RFC 8446 obsoleted those documents. Pl
ease review and let us know how/if the header can be consistent with the body of the
document.
a) Abstract: Note that we removed 8422 from the obsoletes list because this doc seemi
ngly updates it.
This document updates RFCs 5705, 6066, 7627, and 8422 and obsoletes
RFCs 5077, 5246, 6961, 8422, and 8446.
b) Introduction:
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.
-->
<!--[rfced] The following RFCs have been obsoleted as follows. May they be
replaced with the obsoleting RFC?
RFC 6347 has been obsoleted by RFC 9147
RFC 6962 has been obsoleted by RFC 9162
RFC 7507 has been obsoleted by RFC 8996
-->
<!-- [rfced] This reference appears to match the information for the following
Internet-Draft: https://datatracker.ietf.org/doc/draft-hickman-netscape-ssl/
May we update this reference to point to this I-D?
Current:
[SSL2] Hickman, K., "The SSL Protocol", 9 February 1995.
Perhaps:
[SSL2] Elgamal, T. and K. E. Hickman, "The SSL Protocol", Work in
Progress, Internet-Draft, draft-hickman-netscape-ssl-00,
19 April 1995, <https://datatracker.ietf.org/doc/html/
draft-hickman-netscape-ssl-00>.
-->
<!-- [rfced] We updated [I-D.ietf-tls-esni] to [PRE-RFC9849] for now. We will make t
he final updates in RFCXML.
In addition, we have a handful of other reference updates that will be incorporated i
nto the XML file (once created). We will ask you to review at that time, as the upda
tes were challenging to upate in the markdown.
-->
This document specifies version 1.3 of the Transport Layer Security This document specifies version 1.3 of the Transport Layer Security
(TLS) protocol. TLS allows client/server applications to communicate (TLS) protocol. TLS allows client/server applications to communicate
over the Internet in a way that is designed to prevent eavesdropping, over the Internet in a way that is designed to prevent eavesdropping,
tampering, and message forgery. tampering, and message forgery.
This document updates RFCs 5705, 6066, 7627, and 8422 and obsoletes This document updates RFCs 5705, 6066, 7627, and 8422 and obsoletes
RFCs 5077, 5246, 6961, 8422, and 8446. This document also specifies RFCs 5077, 5246, 6961, 8422, and 8446. This document also specifies
new requirements for TLS 1.2 implementations. new requirements for TLS 1.2 implementations.
--- middle --- middle
# Introduction # Introduction
RFC EDITOR: PLEASE REMOVE THE FOLLOWING PARAGRAPH
The source for this draft is maintained in GitHub. Suggested changes
should be submitted as pull requests at
https://github.com/ekr/tls13-spec. Instructions are on that page as
well.
The primary goal of TLS is to provide a secure channel between two The primary goal of TLS is to provide a secure channel between two
communicating peers; the only requirement from the underlying communicating peers; the only requirement from the underlying
transport is a reliable, in-order data stream. Specifically, the transport is a reliable, in-order data stream. Specifically, the
secure channel should provide the following properties: secure channel should provide the following properties:
* Authentication: The server side of the channel is always * Authentication: The server side of the channel is always
authenticated; the client side is optionally authenticated; the client side is optionally
authenticated. Authentication can happen via asymmetric cryptography authenticated. Authentication can happen via asymmetric cryptography
(e.g., RSA {{?RSA=DOI.10.1145/359340.359342}}, the Elliptic Curve Digital Signature (e.g., RSA {{?RSA=DOI.10.1145/359340.359342}}, the Elliptic Curve Digital Signature
Algorithm (ECDSA) {{?DSS=DOI.10.6028/NIST.FIPS.186-5}}, or the Edwards-Curve Digita l Signature Algorithm (ECDSA) {{?DSS=DOI.10.6028/NIST.FIPS.186-5}}, or the Edwards-Curve Digita l Signature
skipping to change at line 482 skipping to change at line 577
the peers to negotiate different parameters than they would the peers to negotiate different parameters than they would
if the connection were not under attack. if the connection were not under attack.
* A record protocol ({{record-protocol}}) that uses the parameters established by the * A record protocol ({{record-protocol}}) that uses the parameters established by the
handshake protocol to protect traffic between the communicating handshake protocol to protect traffic between the communicating
peers. The record protocol divides traffic up into a series of peers. The record protocol divides traffic up into a series of
records, each of which is independently protected using the records, each of which is independently protected using the
traffic keys. traffic keys.
TLS is application protocol independent; higher-level protocols can TLS is application protocol independent; higher-level protocols can
layer on top of TLS transparently. The TLS standard, however, does not layer on top of TLS transparently. However, the TLS standard does not
specify how protocols add security with TLS; how to specify how protocols add security with TLS; how to
initiate TLS handshaking and how to interpret the authentication initiate TLS handshaking and how to interpret the authentication
certificates exchanged are left to the judgment of the designers and certificates exchanged are left to the judgment of the designers and
implementors of protocols that run on top of TLS. Application implementors of protocols that run on top of TLS. Application
protocols using TLS MUST specify how TLS works with their protocols using TLS MUST specify how TLS works with their
application protocol, including how and when handshaking application protocol, including how and when handshaking
occurs, and how to do identity verification. {{?RFC9525}} occurs, and how to do identity verification. {{?RFC9525}}
provides useful guidance on integrating TLS with application provides useful guidance on integrating TLS with application
protocols. protocols.
skipping to change at line 508 skipping to change at line 603
This document supersedes and obsoletes previous versions of TLS, This document supersedes and obsoletes previous versions of TLS,
including version 1.2 {{RFC5246}}. It also obsoletes the TLS ticket including version 1.2 {{RFC5246}}. It also obsoletes the TLS ticket
mechanism defined in {{RFC5077}} and replaces it with the mechanism mechanism defined in {{RFC5077}} and replaces it with the mechanism
defined in {{resumption-and-psk}}. Because TLS 1.3 changes the way keys are derived, it defined in {{resumption-and-psk}}. Because TLS 1.3 changes the way keys are derived, it
updates {{RFC5705}} as described in {{exporters}}. It also changes updates {{RFC5705}} as described in {{exporters}}. It also changes
how Online Certificate Status Protocol (OCSP) messages are carried and therefore upda tes {{RFC6066}} how Online Certificate Status Protocol (OCSP) messages are carried and therefore upda tes {{RFC6066}}
and obsoletes {{RFC6961}} as described in {{ocsp-and-sct}}. and obsoletes {{RFC6961}} as described in {{ocsp-and-sct}}.
## Conventions and Terminology ## Conventions and Terminology
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", {::boilerplate bcp14-tagged}
"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: The following terms are used:
client: The endpoint initiating the TLS connection. client:
: The endpoint initiating the TLS connection.
connection: A transport-layer connection between two endpoints. connection:
: A transport-layer connection between two endpoints.
endpoint: Either the client or server of the connection. endpoint:
: Either the client or server of the connection.
handshake: An initial negotiation between client and server that establishes the par handshake:
ameters of their subsequent interactions within TLS. : 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 endpo peer:
int that is not the primary subject of discussion. : An endpoint. When discussing a particular endpoint, "peer" refers to the endpoint t
hat is not the primary subject of discussion.
receiver: An endpoint that is receiving records. receiver:
: An endpoint that is receiving records.
sender: An endpoint that is transmitting records. sender:
: An endpoint that is transmitting records.
server: The endpoint that did not initiate the TLS connection. server:
: The endpoint that did not initiate the TLS connection.
## Relationship to RFC 8446 ## Relationship to RFC 8446
TLS 1.3 was originally specified in {{?RFC8446}}. This document is a 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 minor update to TLS 1.3 that retains the same version number and is
backward compatible. It tightens some requirements and contains backward compatible. It tightens some requirements and contains
updated text in areas which were found to be unclear as well as other 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 editorial improvements. In addition, it removes the use of the term
"master" as applied to secrets in favor of the term "main" or shorter "master" as applied to secrets in favor of the term "main" or shorter
names where no term was necessary. This document makes the following names where no term was necessary. This document makes the following
specific technical changes: specific technical changes:
<!--[rfced] As "requiring" and "should" seem to contradict in this
statement, may we remove "should" from the text below?
Original:
* Clarify behavior around "user_canceled", requiring that
"close_notify" be sent and that "user_canceled" should be ignored.
Perhaps:
* Clarify behavior around "user_canceled", requiring that
"close_notify" be sent and that "user_canceled" be ignored.
-->
- Forbid negotiating TLS 1.0 and 1.1 as they are now deprecated by {{!RFC8996}}. - 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 - Removes ambiguity around which hash is used with PreSharedKeys and
HelloRetryRequest. HelloRetryRequest.
- Require that clients ignore NewSessionTicket if they do not - Require that clients ignore NewSessionTicket if they do not
support resumption. support resumption.
- Upgrade the requirement to initiate key update before exceeding - Upgrade the requirement to initiate key update before exceeding
key usage limits to MUST. key usage limits to MUST.
skipping to change at line 582 skipping to change at line 694
The following is a list of the major functional differences between 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 TLS 1.2 and TLS 1.3. It is not intended to be exhaustive, and there
are many minor differences. are many minor differences.
- The list of supported symmetric encryption algorithms has been pruned of all algori thms that - The list of supported symmetric encryption algorithms has been pruned of all algori thms that
are considered legacy. Those that remain are all Authenticated Encryption are considered legacy. Those that remain are all Authenticated Encryption
with Associated Data (AEAD) algorithms. The cipher suite concept has been with Associated Data (AEAD) algorithms. The cipher suite concept has been
changed to separate the authentication and key exchange mechanisms from changed to separate the authentication and key exchange mechanisms from
the record protection algorithm (including secret key length) and a hash the record protection algorithm (including secret key length) and a hash
to be used with both the key derivation function and handshake message to be used with both the key derivation function and handshake Message
authentication code (MAC). Authentication Code (MAC).
- A zero round-trip time (0-RTT) mode was added, saving a round trip at connection se tup for - A zero round-trip time (0-RTT) mode was added, saving a round trip at connection se tup for
some application data, at the cost of certain security properties. some application data, at the cost of certain security properties.
- Static RSA and Diffie-Hellman cipher suites have been removed; - Static RSA and Diffie-Hellman cipher suites have been removed;
all public-key based key exchange mechanisms now provide forward secrecy. all public-key-based key exchange mechanisms now provide forward secrecy.
- All handshake messages after the ServerHello are now encrypted. The - All handshake messages after the ServerHello are now encrypted. The
newly introduced EncryptedExtensions message allows various extensions newly introduced EncryptedExtensions message allows various extensions
previously sent in the clear in the ServerHello to also enjoy previously sent in the clear in the ServerHello to also enjoy
confidentiality protection. confidentiality protection.
- The key derivation function has been redesigned. The new design allows - The key derivation function has been redesigned. The new design allows
easier analysis by cryptographers due to their improved key separation easier analysis by cryptographers due to their improved key separation
properties. The HMAC-based Extract-and-Expand Key Derivation Function (HKDF) properties. The HMAC-based Extract-and-Expand Key Derivation Function (HKDF)
is used as an underlying primitive. is used as an underlying primitive.
- The handshake state machine has been significantly restructured to - The handshake state machine has been significantly restructured to
be more consistent and to remove superfluous messages such as be more consistent and to remove superfluous messages such as
ChangeCipherSpec (except when needed for middlebox compatibility). ChangeCipherSpec (except when needed for middlebox compatibility).
- Elliptic curve algorithms are now in the base spec and new signature - Elliptic curve algorithms are now in the base specification, and new signature
algorithms, such as EdDSA, are included. TLS 1.3 removed point format algorithms, such as EdDSA, are included. TLS 1.3 removed point format
negotiation in favor of a single point format for each curve. negotiation in favor of a single point format for each curve.
- Other cryptographic improvements were made, including changing the RSA padding to u se - Other cryptographic improvements were made, including changing the RSA padding to u se
the RSA Probabilistic Signature Scheme (RSASSA-PSS), and the removal the RSA Probabilistic Signature Scheme (RSASSA-PSS) and the removal
of compression, the Digital Signature Algorithm (DSA), and of compression, the Digital Signature Algorithm (DSA), and
custom Ephemeral Diffie-Hellman (DHE) groups. custom Ephemeral Diffie-Hellman (DHE) groups.
- The TLS 1.2 version negotiation mechanism has been deprecated in favor - The TLS 1.2 version negotiation mechanism has been deprecated in favor
of a version list in an extension. This increases compatibility with of a version list in an extension. This increases compatibility with
existing servers that incorrectly implemented version negotiation. existing servers that incorrectly implemented version negotiation.
- Session resumption with and without server-side state as well as the - 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 PSK-based cipher suites of earlier TLS versions have been replaced by a
single new PSK exchange. single new PSK exchange.
skipping to change at line 674 skipping to change at line 786
TLS supports three basic key exchange modes: TLS supports three basic key exchange modes:
- (EC)DHE (Diffie-Hellman over either finite fields or elliptic curves) - (EC)DHE (Diffie-Hellman over either finite fields or elliptic curves)
- PSK-only - PSK-only
- PSK with (EC)DHE - PSK with (EC)DHE
{{tls-full}} below shows the basic full TLS handshake: {{tls-full}} below shows the basic full TLS handshake:
<!--[rfced] FYI - We have updated Figure 1 to fit the 72-character limit.
Please review and let us know if any further updates are needed.
-->
~~~ aasvg ~~~ aasvg
Client Server Client Server
Key ^ ClientHello Key ^ ClientHello
Exch | + key_share* Exch | + key_share*
| + signature_algorithms* | + signature_algorithms*
| + psk_key_exchange_modes* | + psk_key_exchange_modes*
v + pre_shared_key* --------> v + pre_shared_key* -------->
ServerHello ^ Key ServerHello ^ Key
+ key_share* | Exch + key_share* | Exch
+ pre_shared_key* v + pre_shared_key* v
{EncryptedExtensions} ^ Server {EncryptedExtensions} ^ Server
{CertificateRequest*} v Params {CertificateRequest*} v Params
{Certificate*} ^ {Certificate*} ^
{CertificateVerify*} | Auth {CertificateVerify*} | Auth
{Finished} v {Finished} v
<-------- [Application Data*] <-------- [Application Data*]
^ {Certificate*} ^ {Certificate*}
Auth | {CertificateVerify*} Auth | {CertificateVerify*}
v {Finished} --------> v {Finished} -------->
[Application Data] <-------> [Application Data] [Application Data] <-------> [Application Data]
+ Indicates noteworthy extensions sent in the + Indicates noteworthy extensions sent in the
previously noted message. previously noted message.
* Indicates optional or situation-dependent * Indicates optional or situation-dependent
messages/extensions that are not always sent. messages/extensions that are not always sent.
{} Indicates messages protected using keys {} Indicates messages protected using keys
derived from a [sender]_handshake_traffic_secret. derived from a [sender]_handshake_traffic_secret.
[] Indicates messages protected using keys [] Indicates messages protected using keys
derived from [sender]_application_traffic_secret_N. derived from [sender]_application_traffic_secret_N.
~~~ ~~~
{: #tls-full title="Message Flow for Full TLS Handshake"} {: #tls-full title="Message Flow for Full TLS Handshake"}
<!--[rfced] The SVG in Figures 1 and 4 are outputting a solid circle for this text, w
hile the figure displays *. Please review. One possible fix would be to move the le
gend outside of the figure. Please review and let us know how this may be updated.
Original:
* Indicates optional or situation-dependent
messages/extensions that are not always sent.
-->
The handshake can be thought of as having three phases (indicated The handshake can be thought of as having three phases (indicated
in the diagram above): in the diagram above):
- Key Exchange: Establish shared keying material and select the - Key Exchange: Establish shared keying material and select the
cryptographic parameters. Everything after this phase is cryptographic parameters. Everything after this phase is
encrypted. encrypted.
- Server Parameters: Establish other handshake parameters - Server Parameters: Establish other handshake parameters
(whether the client is authenticated, application-layer protocol support, etc.). (whether the client is authenticated, application-layer protocol support, etc.).
skipping to change at line 751 skipping to change at line 874
in use, then the ServerHello contains a "pre_shared_key" in use, then the ServerHello contains a "pre_shared_key"
extension indicating which of the client's offered PSKs was selected. extension indicating which of the client's offered PSKs was selected.
Note that implementations can use (EC)DHE and PSK together, in which Note that implementations can use (EC)DHE and PSK together, in which
case both extensions will be supplied. case both extensions will be supplied.
The server then sends two messages to establish the Server Parameters: The server then sends two messages to establish the Server Parameters:
EncryptedExtensions: EncryptedExtensions:
: responses to ClientHello extensions that are not required to : responses to ClientHello extensions that are not required to
determine the cryptographic parameters, other than those determine the cryptographic parameters, other than those
that are specific to individual certificates. \[{{encrypted-extensions}}] that are specific to individual certificates. {{encrypted-extensions}}
CertificateRequest: CertificateRequest:
: if certificate-based client authentication is desired, the : if certificate-based client authentication is desired, the
desired parameters for that certificate. This message is desired parameters for that certificate. This message is
omitted if client authentication is not desired. \[{{certificate-request}}] omitted if client authentication is not desired. {{certificate-request}}
Finally, the client and server exchange Authentication messages. TLS Finally, the client and server exchange Authentication messages. TLS
uses the same set of messages every time that certificate-based uses the same set of messages every time that certificate-based
authentication is needed. (PSK-based authentication happens as a side authentication is needed. (PSK-based authentication happens as a side
effect of key exchange.) effect of key exchange.)
Specifically: Specifically:
Certificate: Certificate:
: The certificate of the endpoint and any per-certificate extensions. : The certificate of the endpoint and any per-certificate extensions.
This message is omitted by the server if not authenticating with a This message is omitted by the server if not authenticating with a
certificate and by the client if the server did not send certificate and by the client if the server did not send
CertificateRequest (thus indicating that the client should not CertificateRequest (thus indicating that the client should not
authenticate with a certificate). Note that if raw authenticate with a certificate). Note that if raw
public keys {{RFC7250}} or the cached information extension public keys {{RFC7250}} or the cached information extension
{{?RFC7924}} are in use, then this message will not {{?RFC7924}} are in use, then this message will not
contain a certificate but rather some other value corresponding to contain a certificate but rather some other value corresponding to
the server's long-term key. \[{{certificate}}] the server's long-term key. {{certificate}}
CertificateVerify: CertificateVerify:
: A signature over the entire handshake using the private key : A signature over the entire handshake using the private key
corresponding to the public key in the Certificate message. This corresponding to the public key in the Certificate message. This
message is omitted if the endpoint is not authenticating via a message is omitted if the endpoint is not authenticating via a
certificate. \[{{certificate-verify}}] certificate. {{certificate-verify}}
Finished: Finished:
: A MAC (Message Authentication Code) over the entire handshake. : A Message Authentication Code (MAC) over the entire handshake.
This message provides key confirmation for the shared secrets established in the ha This message provides key confirmation for the shared secrets established in the ha
ndshake ndshake,
binds the endpoint's identity to the exchanged keys, and in PSK mode binds the endpoint's identity to the exchanged keys, and in PSK mode
also authenticates the handshake. \[{{finished}}] also authenticates the handshake. {{finished}}
{:br } {:br }
Upon receiving the server's messages, the client responds with its Authentication Upon receiving the server's messages, the client responds with its Authentication
messages, namely Certificate and CertificateVerify (if requested), and Finished. messages, namely Certificate and CertificateVerify (if requested), and Finished.
At this point, the handshake is complete, and the client and server At this point, the handshake is complete, and the client and server
derive the keying material required by the record layer to exchange derive the keying material required by the record layer to exchange
application-layer data protected through authenticated encryption. application-layer data protected through authenticated encryption.
Application Data MUST NOT be sent prior to sending the Finished message, Application Data MUST NOT be sent prior to sending the Finished message,
except as specified except as specified
skipping to change at line 914 skipping to change at line 1037
allow the server to decline resumption and fall back allow the server to decline resumption and fall back
to a full handshake, if needed. The server responds with a "pre_shared_key" 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) 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 respond with a "key_share" extension to do (EC)DHE key establishment, thus
providing forward secrecy. providing forward secrecy.
When PSKs are provisioned externally, the PSK identity and the KDF hash When PSKs are provisioned externally, the PSK identity and the KDF hash
algorithm to algorithm to
be used with the PSK MUST also be provisioned. be used with the PSK MUST also be provisioned.
Note: Note: When using an externally provisioned pre-shared secret, a critical
: When using an externally provisioned pre-shared secret, a critical consideration is using sufficient entropy during the key generation, as
consideration is using sufficient entropy during the key generation, as discussed in {{RFC4086}}. Deriving a shared secret from a password or other
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
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
subject to dictionary attacks based on the PSK binder. The specified PSK authentication is not a strong password-based authenticated key exchange even
authentication is not a strong password-based authenticated key exchange even when used with Diffie-Hellman key establishment. Specifically, it does not
when used with Diffie-Hellman key establishment. Specifically, it does not prevent an attacker that can observe the handshake from performing
prevent an attacker that can observe the handshake from performing a brute-force attack on the password/pre-shared key.
a brute-force attack on the password/pre-shared key.
## 0-RTT Data {#zero-rtt-data} ## 0-RTT Data {#zero-rtt-data}
When clients and servers share a PSK (either obtained externally or 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 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 first flight ("early data"). The client uses the PSK to authenticate
the server and to encrypt the early data. the server and to encrypt the early data.
As shown in {{tls-0-rtt}}, the 0-RTT data is just added to the 1-RTT As shown in {{tls-0-rtt}}, 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 handshake in the first flight. The rest of the handshake uses the same messages
skipping to change at line 1268 skipping to change at line 1390
The key exchange messages are used to determine the security capabilities The key exchange messages are used to determine the security capabilities
of the client and the server and to establish shared secrets, including 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. the traffic keys used to protect the rest of the handshake and the data.
### Cryptographic Negotiation ### Cryptographic Negotiation
In TLS, the cryptographic negotiation proceeds by the client offering the In TLS, the cryptographic negotiation proceeds by the client offering the
following four sets of options in its ClientHello: following four sets of options in its ClientHello:
- A list of cipher suites which indicates the AEAD algorithm/HKDF hash - A list of cipher suites that indicates the AEAD algorithm / HKDF hash
pairs which the client supports. pairs which the client supports.
- A "supported_groups" ({{supported-groups}}) extension which indicates the (EC)DHE g roups - A "supported_groups" ({{supported-groups}}) extension which indicates the (EC)DHE g roups
which the client supports and a "key_share" ({{key-share}}) extension which contain s that the client supports and a "key_share" ({{key-share}}) extension which contains
(EC)DHE shares for some or all of these groups. (EC)DHE shares for some or all of these groups.
- A "signature_algorithms" ({{signature-algorithms}}) extension which indicates the s ignature - A "signature_algorithms" ({{signature-algorithms}}) extension which indicates the s ignature
algorithms which the client can accept. A "signature_algorithms_cert" extension ({{ signature-algorithms}}) may also be algorithms that the client can accept. A "signature_algorithms_cert" extension ({{s ignature-algorithms}}) may also be
added to indicate certificate-specific signature algorithms. added to indicate certificate-specific signature algorithms.
- A "pre_shared_key" ({{pre-shared-key-extension}}) extension which - A "pre_shared_key" ({{pre-shared-key-extension}}) extension which
contains a list of symmetric key identities known to the client and a contains a list of symmetric key identities known to the client and a
"psk_key_exchange_modes" ({{pre-shared-key-exchange-modes}}) "psk_key_exchange_modes" ({{pre-shared-key-exchange-modes}})
extension which indicates the key exchange modes that may be used extension which indicates the key exchange modes that may be used
with PSKs. with PSKs.
If the server does not select a PSK, then the first three of these If the server does not select a PSK, then the first three of these
options are entirely orthogonal: the server independently selects a options are entirely orthogonal: The server independently selects a
cipher suite, an (EC)DHE group and key share for key establishment, cipher suite, an (EC)DHE group and key share for key establishment,
and a signature algorithm/certificate pair to authenticate itself to and a signature algorithm/certificate pair to authenticate itself to
the client. If there is no overlap between the received "supported_groups" 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 and the groups supported by the server, then the server MUST abort the
handshake with a "handshake_failure" or an "insufficient_security" alert. handshake with a "handshake_failure" or an "insufficient_security" alert.
If the server selects a PSK, then it MUST also select a key If the server selects a PSK, then it MUST also select a key
establishment mode from the list indicated by the client's establishment mode from the list indicated by the client's
"psk_key_exchange_modes" extension (at present, PSK alone or with (EC)DHE). Note "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 that if the PSK can be used without (EC)DHE, then non-overlap in the
skipping to change at line 1314 skipping to change at line 1436
- If PSK is being used, then the server will send a - If PSK is being used, then the server will send a
"pre_shared_key" extension indicating the selected key. "pre_shared_key" extension indicating the selected key.
- When (EC)DHE is in use, the server will also provide a "key_share" - 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 extension. If PSK is not being used, then (EC)DHE and certificate-based
authentication are always used. authentication are always used.
- When authenticating via a certificate, the server will send - When authenticating via a certificate, the server will send
the Certificate ({{certificate}}) and CertificateVerify the Certificate ({{certificate}}) and CertificateVerify
({{certificate-verify}}) messages. In TLS 1.3 ({{certificate-verify}}) messages. In TLS 1.3,
as defined by this document, either a PSK or a certificate as defined by this document, either a PSK or a certificate
is always used, but not both. Future documents may define how is always used, but not both. Future documents may define how
to use them together. to use them together.
If the server is unable to negotiate a supported set of parameters If the server is unable to negotiate a supported set of parameters
(i.e., there is no overlap between the client and server parameters), (i.e., there is no overlap between the client and server parameters),
it MUST abort the handshake with either it MUST abort the handshake with either
a "handshake_failure" or "insufficient_security" fatal alert a "handshake_failure" or "insufficient_security" fatal alert
(see {{alert-protocol}}). (see {{alert-protocol}}).
skipping to change at line 1365 skipping to change at line 1487
Because TLS 1.3 forbids renegotiation, if a server has negotiated TLS 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 1.3 and receives a ClientHello at any other time, it MUST terminate
the connection with an "unexpected_message" alert. the connection with an "unexpected_message" alert.
If a server established a TLS connection with a previous version of TLS 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 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. previous protocol version. In particular, it MUST NOT negotiate TLS 1.3.
Structure of this message: Structure of this message:
~~~
uint16 ProtocolVersion; uint16 ProtocolVersion;
opaque Random[32]; opaque Random[32];
uint8 CipherSuite[2]; /* Cryptographic suite selector */ uint8 CipherSuite[2]; /* Cryptographic suite selector */
struct { struct {
ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */ ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */
Random random; Random random;
opaque legacy_session_id<0..32>; opaque legacy_session_id<0..32>;
CipherSuite cipher_suites<2..2^16-2>; CipherSuite cipher_suites<2..2^16-2>;
opaque legacy_compression_methods<1..2^8-1>; opaque legacy_compression_methods<1..2^8-1>;
Extension extensions<8..2^16-1>; Extension extensions<8..2^16-1>;
} ClientHello; } ClientHello;
~~~
{: gi="sourcecode"}
legacy_version: legacy_version:
: In previous versions of TLS, this field was used for version negotiation : In previous versions of TLS, this field was used for version negotiation
and represented the highest version number supported by the client. and represented the highest version number supported by the client.
Experience has shown that many servers do not properly implement Experience has shown that many servers do not properly implement
version negotiation, leading to "version intolerance" in which version negotiation, leading to "version intolerance" in which
the server rejects an otherwise acceptable ClientHello with a version the server rejects an otherwise acceptable ClientHello with a version
number higher than it supports. number higher than it supports.
In TLS 1.3, the client indicates its version preferences in the In TLS 1.3, the client indicates its version preferences in the
"supported_versions" extension ({{supported-versions}}) and the legacy_version fiel d MUST "supported_versions" extension ({{supported-versions}}) and the legacy_version fiel d MUST
skipping to change at line 1483 skipping to change at line 1608
({{zero-rtt-data}}) while waiting for the next handshake message. ({{zero-rtt-data}}) while waiting for the next handshake message.
### Server Hello {#server-hello} ### Server Hello {#server-hello}
The server will send this message in response to a ClientHello 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 to proceed with the handshake if it is able to negotiate an acceptable
set of handshake parameters based on the ClientHello. set of handshake parameters based on the ClientHello.
Structure of this message: Structure of this message:
~~~
struct { struct {
ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */ ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */
Random random; Random random;
opaque legacy_session_id_echo<0..32>; opaque legacy_session_id_echo<0..32>;
CipherSuite cipher_suite; CipherSuite cipher_suite;
uint8 legacy_compression_method = 0; uint8 legacy_compression_method = 0;
Extension extensions<6..2^16-1>; Extension extensions<6..2^16-1>;
} ServerHello; } ServerHello;
~~~
{: gi="sourcecode"}
legacy_version: legacy_version:
: In previous versions of TLS, this field was used for version negotiation : In previous versions of TLS, this field was used for version negotiation
and represented the selected version number for the connection. Unfortunately, and represented the selected version number for the connection. Unfortunately,
some middleboxes fail when presented with new values. some middleboxes fail when presented with new values.
In TLS 1.3, the TLS server indicates its version using the In TLS 1.3, the TLS server indicates its version using the
"supported_versions" extension ({{supported-versions}}), "supported_versions" extension ({{supported-versions}}),
and the legacy_version field MUST and the legacy_version field MUST
be set to 0x0303, which is the version number for TLS 1.2. be set to 0x0303, which is the version number for TLS 1.2.
(See {{backward-compatibility}} for details about backward compatibility.) (See {{backward-compatibility}} for details about backward compatibility.)
skipping to change at line 1539 skipping to change at line 1667
legacy_compression_method: legacy_compression_method:
: A single byte which MUST have the value 0. If a TLS 1.3 ServerHello : A single byte which MUST have the value 0. If a TLS 1.3 ServerHello
is received with any other value in this field, the client MUST is received with any other value in this field, the client MUST
abort the handshake with an "illegal_parameter" alert. abort the handshake with an "illegal_parameter" alert.
extensions: extensions:
: A list of extensions. The ServerHello MUST only include extensions : A list of extensions. The ServerHello MUST only include extensions
which are required to establish the cryptographic context and negotiate which are required to establish the cryptographic context and negotiate
the protocol version. All TLS 1.3 ServerHello messages MUST contain the the protocol version. All TLS 1.3 ServerHello messages MUST contain the
"supported_versions" extension. Current ServerHello messages additionally contain "supported_versions" extension. Current ServerHello messages additionally contain
either the "pre_shared_key" extension or the "key_share" extension, or both (when u sing the "pre_shared_key" extension, "key_share" extension, or both (when using
a PSK with (EC)DHE key establishment). Other extensions a PSK with (EC)DHE key establishment). Other extensions
(see {{extensions}}) are sent (see {{extensions}}) are sent
separately in the EncryptedExtensions message. separately in the EncryptedExtensions message.
{:br } {:br }
For reasons of backward compatibility with middleboxes For reasons of backward compatibility with middleboxes
(see {{middlebox}}), the HelloRetryRequest (see {{middlebox}}), the HelloRetryRequest
message uses the same structure as the ServerHello, but with message uses the same structure as the ServerHello but with
Random set to the special value of the SHA-256 of Random set to the special value of the SHA-256 of
"HelloRetryRequest": "HelloRetryRequest":
CF 21 AD 74 E5 9A 61 11 BE 1D 8C 02 1E 65 B8 91 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 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 Upon receiving a message with type server_hello, implementations
MUST first examine the Random value and, if it matches MUST first examine the Random value and, if it matches
this value, process it as described in {{hello-retry-request}}). this value, process it as described in {{hello-retry-request}}.
TLS 1.3 has a downgrade protection mechanism embedded in the server's 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 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 response to a ClientHello MUST set the last 8 bytes of their
Random value specially in their ServerHello. Random value specially in their ServerHello.
If negotiating TLS 1.2, TLS 1.3 servers MUST set the last 8 bytes of their If negotiating TLS 1.2, TLS 1.3 servers MUST set the last 8 bytes of their
Random value to the bytes: Random value to the bytes:
44 4F 57 4E 47 52 44 01 44 4F 57 4E 47 52 44 01
skipping to change at line 1717 skipping to change at line 1845
The list of extension types is maintained by IANA as described in The list of extension types is maintained by IANA as described in
{{iana-considerations}}. {{iana-considerations}}.
Extensions are generally structured in a request/response fashion, Extensions are generally structured in a request/response fashion,
though some extensions are just requests with no corresponding though some extensions are just requests with no corresponding
response (i.e., indications). The client sends its extension requests response (i.e., indications). The client sends its extension requests
in the ClientHello message, and the server sends its extension in the ClientHello message, and the server sends its extension
responses in the ServerHello, EncryptedExtensions, HelloRetryRequest, responses in the ServerHello, EncryptedExtensions, HelloRetryRequest,
and Certificate messages. The server sends extension requests in the and Certificate messages. The server sends extension requests in the
CertificateRequest message which a client MAY respond to with a CertificateRequest message, which a client MAY respond to with a
Certificate message. The server MAY also send unsolicited extensions Certificate message. The server MAY also send unsolicited extensions
in the NewSessionTicket, though the client does not respond directly in the NewSessionTicket, though the client does not respond directly
to these. to these.
Implementations MUST NOT send extension responses Implementations MUST NOT send extension responses
(i.e., in the ServerHello, EncryptedExtensions, HelloRetryRequest, (i.e., in the ServerHello, EncryptedExtensions, HelloRetryRequest,
and Certificate messages) and Certificate messages)
if the remote endpoint did not send the corresponding extension requests, if the remote endpoint did not send the corresponding extension requests,
with the exception of the "cookie" extension in the HelloRetryRequest. with the exception of the "cookie" extension in the HelloRetryRequest.
Upon receiving such an extension, an endpoint MUST abort the handshake with an Upon receiving such an extension, an endpoint MUST abort the handshake with an
"unsupported_extension" alert. "unsupported_extension" alert.
The table below indicates the messages where a given extension may The table below indicates the messages where a given extension may
appear, using the following notation: CH (ClientHello), SH appear, using the following notation: CH (ClientHello), SH
(ServerHello), EE (EncryptedExtensions), CT (Certificate), CR (ServerHello), EE (EncryptedExtensions), CT (Certificate), CR
(CertificateRequest), NST (NewSessionTicket), and HRR (CertificateRequest), NST (NewSessionTicket), and HRR
(HelloRetryRequest). If an implementation receives an extension which (HelloRetryRequest). If an implementation receives an extension which
it recognizes and which is not specified for the message in which it it recognizes and which is not specified for the message in which it
appears, it MUST abort the handshake with an "illegal_parameter" alert. appears, it MUST abort the handshake with an "illegal_parameter" alert.
<!--[rfced] Table 1
a) FYI - We have updated the citation for "record_size_limit" from [RFC8849]
to [RFC8449], as [RFC8449] defines the extension and [RFC8849] does not
have any mention of it.
Original:
record_size_limit [RFC8849]
Current:
record_size_limit [RFC8449]
b) We note that RFC 9345 uses "delegated_credential" rather than
"delegated_credentials" (no "s"). May we update the extension to reflect RFC 9345?
Current:
delegated_credentials {{RFC9345}}
-->
| Extension | TLS 1.3 | | Extension | TLS 1.3 |
|:-----------------------------------------|------------:| |:-----------------------------------------|------------:|
| server_name [RFC6066] | CH, EE | | server_name {{RFC6066}} | CH, EE |
| max_fragment_length [RFC6066] | CH, EE | | max_fragment_length {{RFC6066}} | CH, EE |
| status_request [RFC6066] | CH, CR, CT | | status_request {{RFC6066}} | CH, CR, CT |
| supported_groups [RFC7919] | CH, EE | | supported_groups {{RFC7919}} | CH, EE |
| signature_algorithms [RFC8446] | CH, CR | | signature_algorithms {{RFC8446}} | CH, CR |
| use_srtp [RFC5764] | CH, EE | | use_srtp {{RFC5764}} | CH, EE |
| heartbeat [RFC6520] | CH, EE | | heartbeat {{RFC6520}} | CH, EE |
| application_layer_protocol_negotiation [RFC7301]| CH, EE | | application_layer_protocol_negotiation {{RFC7301}}| CH, EE |
| signed_certificate_timestamp [RFC6962] | CH, CR, CT | | signed_certificate_timestamp {{RFC6962}} | CH, CR, CT |
| client_certificate_type [RFC7250] | CH, EE | | client_certificate_type {{RFC7250}} | CH, EE |
| server_certificate_type [RFC7250] | CH, EE | | server_certificate_type {{RFC7250}} | CH, EE |
| padding [RFC7685] | CH | | padding {{RFC7685}} | CH |
| cached_info [RFC7924] | CH, EE | | cached_info {{RFC7924}} | CH, EE |
| compress_certificate [RFC8879] | CH, CR | | compress_certificate {{RFC8879}} | CH, CR |
| record_size_limit [RFC8849] | CH, EE | | record_size_limit {{RFC8449}} | CH, EE |
| delegated_credentials [RFC9345] | CH, CR, CT | | delegated_credentials {{RFC9345}} | CH, CR, CT |
| supported_ekt_ciphers [RFC8870] | CH, EE | | supported_ekt_ciphers {{RFC8870}} | CH, EE |
| pre_shared_key [RFC8446] | CH, SH | | pre_shared_key {{RFC8446}} | CH, SH |
| early_data [RFC8446] | CH, EE, NST | | early_data {{RFC8446}} | CH, EE, NST |
| psk_key_exchange_modes [RFC8446]| CH | | psk_key_exchange_modes {{RFC8446}}| CH |
| cookie [RFC8446] | CH, HRR | | cookie {{RFC8446}} | CH, HRR |
| supported_versions [RFC8446] | CH, SH, HRR | | supported_versions {{RFC8446}} | CH, SH, HRR |
| certificate_authorities [RFC8446]| CH, CR | | certificate_authorities {{RFC8446}}| CH, CR |
| oid_filters [RFC8446] | CR | | oid_filters {{RFC8446}} | CR |
| post_handshake_auth [RFC8446] | CH | | post_handshake_auth {{RFC8446}} | CH |
| signature_algorithms_cert [RFC8446]| CH, CR | | signature_algorithms_cert {{RFC8446}}| CH, CR |
| key_share [RFC8446] | CH, SH, HRR | | key_share {{RFC8446}} | CH, SH, HRR |
| transparency_info [RFC9162] | CH, CR, CT | | transparency_info {{RFC9162}} | CH, CR, CT |
| connection_id [RFC9146] | CH, SH | | connection_id {{RFC9146}} | CH, SH |
| external_id_hash [RFC8844] | CH, EE | | external_id_hash {{RFC8844}} | CH, EE |
| external_session_id [RFC8844] | CH, EE | | external_session_id {{RFC8844}} | CH, EE |
| quic_transport_parameters [RFC9001] | CH, EE | | quic_transport_parameters {{RFC9001}} | CH, EE |
| ticket_request [RFC9149] | CH, EE| | ticket_request {{RFC9149}} | CH, EE|
{: #extensions-list title="TLS Extensions"} {: #extensions-list title="TLS Extensions"}
Note: this table includes only extensions marked Note: This table only includes extensions marked as
"Recommended" at the time of this writing. "Recommended" at the time of this writing.
When multiple extensions of different types are present, the When multiple extensions of different types are present, the
extensions MAY appear in any order, with the exception of extensions MAY appear in any order, with the exception of
"pre_shared_key" ({{pre-shared-key-extension}}) which MUST be "pre_shared_key" ({{pre-shared-key-extension}}), which MUST be
the last extension in the ClientHello (but can appear anywhere in the last extension in the ClientHello (but can appear anywhere in
the ServerHello extensions block). the ServerHello extensions block).
There MUST NOT be more than one extension of the same type in a given There MUST NOT be more than one extension of the same type in a given
extension block. extension block.
In TLS 1.3, unlike TLS 1.2, extensions are negotiated for each 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 handshake even when in resumption-PSK mode. However, 0-RTT parameters are
those negotiated in the previous handshake; mismatches may require those negotiated in the previous handshake; mismatches may require
rejecting 0-RTT (see {{early-data-indication}}). rejecting 0-RTT (see {{early-data-indication}}).
There are subtle (and not so subtle) interactions that may occur in this 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 protocol between new features and existing features, which may result in a
significant reduction in overall security. The following considerations should significant reduction in overall security. The following considerations should
be taken into account when designing new extensions: be taken into account when designing new extensions:
- Some cases where a server does not agree to an extension are error - Some cases where a server does not agree to an extension are error
conditions (e.g., the handshake cannot continue), and some are conditions (e.g., the handshake cannot continue), and some are
simply refusals to support particular features. In general, error simply refusals to support particular features. In general, error
alerts should be used for the former and a field in the server alerts should be used for the former and a field in the server
extension response for the latter. extension response for the latter.
- Extensions should, as far as possible, be designed to prevent any attack that - Extensions should, as far as possible, be designed to prevent any attack that
skipping to change at line 2021 skipping to change at line 2168
both the corresponding hash algorithm as defined in {{!SHS}}. both the corresponding hash algorithm as defined in {{!SHS}}.
The length of the Salt MUST be equal to the length of the digest 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, 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, it MUST use the RSASSA-PSS OID {{!RFC5756}}. When used in certificate signatures,
the algorithm parameters MUST be DER encoded. If the corresponding the algorithm parameters MUST be DER encoded. If the corresponding
public key's parameters are present, then the parameters in the signature public key's parameters are present, then the parameters in the signature
MUST be identical to those in the public key. MUST be identical to those in the public key.
Legacy algorithms: Legacy algorithms:
: Indicates algorithms which are being deprecated because they use : Indicates algorithms which are being deprecated because they use
algorithms with known weaknesses, specifically SHA-1 which is used 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 va lues in this context with either (1) RSA using RSASSA-PKCS1-v1_5 or (2) ECDSA. These va lues
refer solely to signatures which appear in certificates (see refer solely to signatures which appear in certificates (see
{{certificate-selection}}) and are not defined for use in {{certificate-selection}}) and are not defined for use in
signed TLS handshake messages, although they MAY appear in "signature_algorithms" signed TLS handshake messages, although they MAY appear in "signature_algorithms"
and "signature_algorithms_cert" for backward compatibility with TLS 1.2. and "signature_algorithms_cert" for backward compatibility with TLS 1.2.
Endpoints SHOULD NOT negotiate these algorithms Endpoints SHOULD NOT negotiate these algorithms
but are permitted to do so solely for backward compatibility. Clients but are permitted to do so solely for backward compatibility. Clients
offering these values MUST list offering these values MUST list
them as the lowest priority (listed after all other algorithms in them as the lowest priority (listed after all other algorithms in
SignatureSchemeList). TLS 1.3 servers MUST NOT offer a SHA-1 signed SignatureSchemeList). TLS 1.3 servers MUST NOT offer a SHA-1 signed
certificate unless no valid certificate chain can be produced certificate unless no valid certificate chain can be produced
without it (see {{certificate-selection}}). without it (see {{certificate-selection}}).
{:br } {:br }
The signatures on certificates that are self-signed or certificates that are The signatures on certificates that are self-signed or certificates that are
trust anchors are not validated, since they begin a certification path (see trust anchors are not validated, since they begin a certification path (see
{{RFC5280}}, Section 3.2). A certificate that begins a certification {{RFC5280, Section 3.2}}). A certificate that begins a certification
path MAY use a signature algorithm that is not advertised as being supported path MAY use a signature algorithm that is not advertised as being supported
in the "signature_algorithms" and "signature_algorithms_cert" extensions. in the "signature_algorithms" and "signature_algorithms_cert" extensions.
Note that TLS 1.2 defines this extension differently. TLS 1.3 implementations 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 willing to negotiate TLS 1.2 MUST behave in accordance with the requirements of
{{RFC5246}} when negotiating that version. In particular: {{RFC5246}} when negotiating that version. In particular:
* TLS 1.2 ClientHellos MAY omit this extension. * TLS 1.2 ClientHellos MAY omit this extension.
* In TLS 1.2, the extension contained hash/signature pairs. The pairs are * In TLS 1.2, the extension contained hash/signature pairs. The pairs are
skipping to change at line 2091 skipping to change at line 2238
certificate authorities, represented in DER-encoded {{X690}} format. These certificate authorities, represented in DER-encoded {{X690}} format. These
distinguished names specify a desired distinguished name for a trust anchor distinguished names specify a desired distinguished name for a trust anchor
or subordinate CA; thus, this message can be used to or subordinate CA; thus, this message can be used to
describe known trust anchors as well as a desired authorization space. describe known trust anchors as well as a desired authorization space.
{:br} {:br}
The client MAY send the "certificate_authorities" extension in the ClientHello The client MAY send the "certificate_authorities" extension in the ClientHello
message. The server MAY send it in the CertificateRequest message. message. The server MAY send it in the CertificateRequest message.
The "trusted_ca_keys" extension {{RFC6066}}, which serves a similar The "trusted_ca_keys" extension {{RFC6066}}, which serves a similar
purpose, but is more complicated, is not used in TLS 1.3 purpose but is more complicated, is not used in TLS 1.3
(although it may appear in ClientHello messages from clients which are (although it may appear in ClientHello messages from clients which are
offering prior versions of TLS). offering prior versions of TLS).
### OID Filters ### OID Filters
The "oid_filters" extension allows servers to provide a list of OID/value 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 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 mes sage. extension, if provided by the server, MUST only be sent in the CertificateRequest mes sage.
struct { struct {
skipping to change at line 2123 skipping to change at line 2270
represented in DER-encoded {{X690}} format. Some certificate extension OIDs represented in DER-encoded {{X690}} format. Some certificate extension OIDs
allow multiple values (e.g., Extended Key Usage). If the server has included allow multiple values (e.g., Extended Key Usage). If the server has included
a non-empty filters list, the client certificate included in a non-empty filters list, the client certificate included in
the response MUST contain all of the specified extension OIDs that the client 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 recognizes. For each extension OID recognized by the client, all of the
specified values MUST be present in the client certificate (but the specified values MUST be present in the client certificate (but the
certificate MAY have other values as well). However, the client MUST ignore certificate MAY have other values as well). However, the client MUST ignore
and skip any unrecognized certificate extension OIDs. If the client ignored and skip any unrecognized certificate extension OIDs. If the client ignored
some of the required certificate extension OIDs and supplied a certificate some of the required certificate extension OIDs and supplied a certificate
that does not satisfy the request, the server MAY at its discretion either that does not satisfy the request, the server MAY at its discretion either
continue the connection without client authentication or abort the handshake continue the connection without client authentication, or abort the handshake
with an "unsupported_certificate" alert. Any given OID MUST NOT appear with an "unsupported_certificate" alert. Any given OID MUST NOT appear
more than once in the filters list. more than once in the filters list.
PKIX RFCs define a variety of certificate extension OIDs and their corresponding PKIX RFCs define a variety of certificate extension OIDs and their corresponding
value types. Depending on the type, matching certificate extension values are value types. Depending on the type, matching certificate extension values are
not necessarily bitwise-equal. It is expected that TLS implementations will rely not necessarily bitwise-equal. It is expected that TLS implementations will rely
on their PKI libraries to perform certificate selection using certificate on their PKI libraries to perform certificate selection using certificate
extension OIDs. extension OIDs.
This document defines matching rules for two standard certificate extensions This document defines matching rules for two standard certificate extensions
skipping to change at line 2282 skipping to change at line 2429
though saving the round trip of HelloRetryRequest. Servers though saving the round trip of HelloRetryRequest. Servers
that wish to respect the client's group preferences SHOULD first that wish to respect the client's group preferences SHOULD first
select a group based on "supported_groups" and then either send a select a group based on "supported_groups" and then either send a
ServerHello or a HelloRetryRequest depending on the contents of ServerHello or a HelloRetryRequest depending on the contents of
KeyshareClienthello. KeyshareClienthello.
Clients can offer as many KeyShareEntry values as the number of supported Clients can offer as many KeyShareEntry values as the number of supported
groups it is offering, each groups it is offering, each
representing a single set of key exchange parameters. For instance, a representing a single set of key exchange parameters. For instance, a
client might offer shares for several elliptic curves or multiple client might offer shares for several elliptic curves or multiple
FFDHE groups. The key_exchange values for each KeyShareEntry MUST be Finite Field DHE (FFDHE) groups. The key_exchange values for each KeyShareEntry MUST be
generated independently. Clients MUST NOT offer multiple generated independently. Clients MUST NOT offer multiple
KeyShareEntry values for the same group. Clients MUST NOT offer any KeyShareEntry values for the same group. Clients MUST NOT offer any
KeyShareEntry values for groups not listed in the client's KeyShareEntry values for groups not listed in the client's
"supported_groups" extension. Servers MAY check for violations of "supported_groups" extension. Servers MAY check for violations of
these rules and abort the handshake with an "illegal_parameter" alert these rules and abort the handshake with an "illegal_parameter" alert
if one is violated. if one is violated.
In a HelloRetryRequest message, the "extension_data" field of this In a HelloRetryRequest message, the "extension_data" field of this
extension contains a KeyShareHelloRetryRequest value: extension contains a KeyShareHelloRetryRequest value:
skipping to change at line 2343 skipping to change at line 2490
"key_share" extension was received by the client, the client MUST verify that the "key_share" extension was received by the client, the client MUST verify that the
selected NamedGroup in the ServerHello is the same as that in the HelloRetryRequest. selected NamedGroup in the ServerHello is the same as that in the HelloRetryRequest.
If this check fails, the client MUST abort the handshake with an "illegal_parameter" If this check fails, the client MUST abort the handshake with an "illegal_parameter"
alert. alert.
#### Diffie-Hellman Parameters {#ffdhe-param} #### Diffie-Hellman Parameters {#ffdhe-param}
Diffie-Hellman {{DH76}} parameters for both clients and servers are encoded in Diffie-Hellman {{DH76}} parameters for both clients and servers are encoded in
the opaque key_exchange field of a KeyShareEntry in a KeyShare structure. the opaque key_exchange field of a KeyShareEntry in a KeyShare structure.
The opaque value contains the The opaque value contains the
Diffie-Hellman public value (Y = g^X mod p) for the specified group Diffie-Hellman public value (Y = g<sup>X</sup> mod p) for the specified group
(see {{RFC7919}} for group definitions) (see {{RFC7919}} for group definitions)
encoded as a big-endian integer and padded to the left with zeros to the size of p in encoded as a big-endian integer and padded to the left with zeros to the size of p in
bytes. bytes.
Note: For a given Diffie-Hellman group, the padding results in all public keys Note: For a given Diffie-Hellman group, the padding results in all public keys
having the same length. having the same length.
Peers MUST validate each other's public key Y by ensuring that 1 < Y Peers MUST validate each other's public key Y by ensuring that 1 < Y
< p-1. This check ensures that the remote peer is properly behaved and < p-1. This check ensures that the remote peer is properly behaved and
isn't forcing the local system into a small subgroup. isn't forcing the local system into a small subgroup.
skipping to change at line 2389 skipping to change at line 2536
The appropriate validation procedures are defined in Appendix D.1 of {{ECDP}} The appropriate validation procedures are defined in Appendix D.1 of {{ECDP}}
and alternatively in Section 5.6.2.3 of {{!KEYAGREEMENT=DOI.10.6028/NIST.SP.800-56Ar3 }}. and alternatively in Section 5.6.2.3 of {{!KEYAGREEMENT=DOI.10.6028/NIST.SP.800-56Ar3 }}.
This process consists of three This process consists of three
steps: (1) verify that Q is not the point at infinity (O), (2) verify steps: (1) verify that Q is not the point at infinity (O), (2) verify
that for Q = (x, y) both integers x and y are in the correct interval, and (3) that for Q = (x, y) both integers x and y are in the correct interval, and (3)
ensure that (x, y) is a correct solution to the elliptic curve ensure that (x, y) is a correct solution to the elliptic curve
equation. For these curves, implementors do not need to verify equation. For these curves, implementors do not need to verify
membership in the correct subgroup. membership in the correct subgroup.
For X25519 and X448, the content of the public value is the K_A For X25519 and X448, the content of the public value is the K_A
or K_B value described in Section 6 of {{RFC7748}}. or K_B value described in {{Section 6 of RFC7748}}.
This is 32 bytes for X25519 and 56 bytes for X448. This is 32 bytes for X25519 and 56 bytes for X448.
Note: Versions of TLS prior to 1.3 permitted point format negotiation; Note: Versions of TLS prior to 1.3 permitted point format negotiation;
TLS 1.3 removes this feature in favor of a single point format TLS 1.3 removes this feature in favor of a single point format
for each curve. for each curve.
### Pre-Shared Key Exchange Modes ### Pre-Shared Key Exchange Modes
To use PSKs, clients MUST also send a "psk_key_exchange_modes" To use PSKs, clients MUST also send a "psk_key_exchange_modes"
extension. The semantics of this extension are that the client only extension. The semantics of this extension are that the client only
skipping to change at line 2439 skipping to change at line 2586
{:br} {:br}
Any future values that are allocated must ensure that the transmitted Any future values that are allocated must ensure that the transmitted
protocol messages unambiguously identify which mode was selected by protocol messages unambiguously identify which mode was selected by
the server; at present, this is indicated by the presence of the "key_share" the server; at present, this is indicated by the presence of the "key_share"
in the ServerHello. in the ServerHello.
### Early Data Indication ### Early Data Indication
When a PSK is used and early data is allowed for that PSK When a PSK is used and early data is allowed for that PSK
(see for instance {{ticket-establishment}}), the client can send Application Data (for instance, see {{ticket-establishment}}), the client can send Application Data
in its first flight of messages. If the client opts to do so, it MUST 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. supply both the "pre_shared_key" and "early_data" extensions.
The "extension_data" field of this extension contains an The "extension_data" field of this extension contains an
"EarlyDataIndication" value. "EarlyDataIndication" value.
struct {} Empty; struct {} Empty;
struct { struct {
select (Handshake.msg_type) { select (Handshake.msg_type) {
skipping to change at line 2469 skipping to change at line 2616
Application-Layer Protocol Negotiation (ALPN) {{RFC7301}} protocol, Application-Layer Protocol Negotiation (ALPN) {{RFC7301}} protocol,
etc.) are those associated with the PSK in use. etc.) are those associated with the PSK in use.
For externally provisioned PSKs, the associated values are those For externally provisioned PSKs, the associated values are those
provisioned along with the key. For PSKs established via a NewSessionTicket provisioned along with the key. For PSKs established via a NewSessionTicket
message, the associated values are those which were negotiated in the connection message, the associated values are those which were negotiated in the connection
which established the PSK. The PSK used to encrypt the early data 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. MUST be the first PSK listed in the client's "pre_shared_key" extension.
For PSKs provisioned via NewSessionTicket, a server MUST validate that For PSKs provisioned via NewSessionTicket, a server MUST validate that
the ticket age for the selected PSK identity (computed by subtracting the ticket age for the selected PSK identity (computed by subtracting
ticket_age_add from PskIdentity.obfuscated_ticket_age modulo 2^32) ticket_age_add from PskIdentity.obfuscated_ticket_age modulo 2<sup>32</sup>)
is within a small tolerance of the is within a small tolerance of the
time since the ticket was issued (see {{anti-replay}}). If it is not, time since the ticket was issued (see {{anti-replay}}). If it is not,
the server SHOULD proceed with the handshake but reject 0-RTT, and the server SHOULD proceed with the handshake but reject 0-RTT and
SHOULD NOT take any other action that assumes that this ClientHello is SHOULD NOT take any other action that assumes that this ClientHello is
fresh. fresh.
0-RTT messages sent in the first flight have the same (encrypted) content types 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 as messages of the same type sent in other flights (handshake and
application_data) but are protected under application_data) but are protected under
different keys. After receiving the server's Finished message, if the different keys. After receiving the server's Finished message, if the
server has accepted early data, an EndOfEarlyData message server has accepted early data, an EndOfEarlyData message
will be sent to indicate the key change. This message will be encrypted will be sent to indicate the key change. This message will be encrypted
with the 0-RTT traffic keys. with the 0-RTT traffic keys.
skipping to change at line 2619 skipping to change at line 2766
Each PSK is associated with a single Hash algorithm. For PSKs established Each PSK is associated with a single Hash algorithm. For PSKs established
via the ticket mechanism ({{NSTMessage}}), this is the KDF Hash algorithm via the ticket mechanism ({{NSTMessage}}), this is the KDF Hash algorithm
on the connection where the ticket was established. on the connection where the ticket was established.
For externally established PSKs, the Hash algorithm MUST be set when the For externally established PSKs, the Hash algorithm MUST be set when the
PSK is established or default to SHA-256 if no such algorithm PSK is established or default to SHA-256 if no such algorithm
is defined. The server MUST ensure that it selects a compatible is defined. The server MUST ensure that it selects a compatible
PSK (if any) and cipher suite. PSK (if any) and cipher suite.
In TLS versions prior to TLS 1.3, the Server Name Indication (SNI) value was In TLS versions prior to TLS 1.3, the Server Name Indication (SNI) value was
intended to be associated with the session (Section 3 of {{RFC6066}}), with the intended to be associated with the session ({{Section 3 of RFC6066}}), with the
server being required to enforce that the SNI value associated with the session server being required to enforce that the SNI value associated with the session
matches the one specified in the resumption handshake. However, in reality the matches the one specified in the resumption handshake. However, in reality the
implementations were not consistent on which of two supplied SNI values they implementations were not consistent on which of two supplied SNI values they
would use, leading to the consistency requirement being de facto enforced by the would use, leading to the consistency requirement being de facto enforced by the
clients. In TLS 1.3, the SNI value is always explicitly specified in the clients. In TLS 1.3, the SNI value is always explicitly specified in the
resumption handshake, and there is no need for the server to associate an SNI value w ith the resumption handshake, and there is no need for the server to associate an SNI value w ith the
ticket. Clients, however, SHOULD store the SNI with the PSK to fulfill ticket. However, clients SHOULD store the SNI with the PSK to fulfill
the requirements of {{NSTMessage}}. the requirements of {{NSTMessage}}.
Implementor's note: When session resumption is the primary use case of PSKs, Implementor's note: When session resumption is the primary use case of PSKs,
the most straightforward way to implement the the most straightforward way to implement the
PSK/cipher suite matching requirements is to negotiate the cipher PSK / cipher suite matching requirements is to negotiate the cipher
suite first and then exclude any incompatible PSKs. Any unknown PSKs suite first and then exclude any incompatible PSKs. Any unknown PSKs
(e.g., ones not in the PSK database or encrypted with an (e.g., ones not in the PSK database or encrypted with an
unknown key) SHOULD simply be ignored. If no acceptable PSKs are unknown key) SHOULD simply be ignored. If no acceptable PSKs are
found, the server SHOULD perform a non-PSK handshake if possible. found, the server SHOULD perform a non-PSK handshake if possible.
If backward compatibility is important, client-provided, externally If backward compatibility is important, client-provided, externally
established PSKs SHOULD influence cipher suite selection. established PSKs SHOULD influence cipher suite selection.
Prior to accepting PSK key establishment, the server MUST validate the Prior to accepting PSK key establishment, the server MUST validate the
corresponding binder value (see {{psk-binder}} below). If this value is corresponding binder value (see {{psk-binder}} below). If this value is
not present or does not validate, the server MUST abort the handshake. not present or does not validate, the server MUST abort the handshake.
Servers SHOULD NOT attempt to validate multiple binders; rather, they Servers SHOULD NOT attempt to validate multiple binders; rather, they
SHOULD select a single PSK and validate solely the binder that SHOULD select a single PSK and solely validate the binder that
corresponds to that PSK. corresponds to that PSK.
See {{client-hello-recording}} and {{psk-identity-exposure}} for the See {{client-hello-recording}} and {{psk-identity-exposure}} for the
security rationale for this requirement. security rationale for this requirement.
To accept PSK key establishment, the To accept PSK key establishment, the
server sends a "pre_shared_key" extension indicating the selected server sends a "pre_shared_key" extension indicating the selected
identity. identity.
Clients MUST verify that the server's selected_identity is within the Clients MUST verify that the server's selected_identity is within the
range supplied by the client, that the server selected a cipher suite range supplied by the client, that the server selected a cipher suite
indicating a Hash associated with the PSK, and that a server indicating a Hash associated with the PSK, and that a server
skipping to change at line 2677 skipping to change at line 2824
fail the handshake with an "illegal_parameter" alert. fail the handshake with an "illegal_parameter" alert.
#### Ticket Age #### Ticket Age
The client's view of the age of a ticket is the time since the receipt The client's view of the age of a ticket is the time since the receipt
of the NewSessionTicket message. Clients MUST NOT attempt to use of the NewSessionTicket message. Clients MUST NOT attempt to use
tickets which have ages greater than the "ticket_lifetime" value which tickets which have ages greater than the "ticket_lifetime" value which
was provided with the ticket. The "obfuscated_ticket_age" field of was provided with the ticket. The "obfuscated_ticket_age" field of
each PskIdentity contains an obfuscated version of the ticket age each PskIdentity contains an obfuscated version of the ticket age
formed by taking the age in milliseconds and adding the "ticket_age_add" formed by taking the age in milliseconds and adding the "ticket_age_add"
value that was included with the ticket (see {{NSTMessage}}), modulo 2^32. value that was included with the ticket (see {{NSTMessage}}), modulo 2<sup>32</sup>.
This addition prevents passive observers from correlating connections This addition prevents passive observers from correlating connections
unless tickets or key shares are reused. Note that the "ticket_lifetime" field in unless tickets or key shares are reused. Note that the "ticket_lifetime" field in
the NewSessionTicket message is in seconds but the "obfuscated_ticket_age" the NewSessionTicket message is in seconds but the "obfuscated_ticket_age"
is in milliseconds. Because ticket lifetimes are is in milliseconds. Because ticket lifetimes are
restricted to a week, 32 bits is enough to represent any plausible restricted to a week, 32 bits is enough to represent any plausible
age, even in milliseconds. age, even in milliseconds.
#### PSK Binder #### PSK Binder
The PSK binder value forms a binding between a PSK and the current The PSK binder value forms a binding between a PSK and the current
skipping to change at line 2711 skipping to change at line 2858
derived via the key schedule from the corresponding PSK which derived via the key schedule from the corresponding PSK which
is being offered (see {{key-schedule}}). is being offered (see {{key-schedule}}).
If the handshake includes a HelloRetryRequest, the initial ClientHello If the handshake includes a HelloRetryRequest, the initial ClientHello
and HelloRetryRequest are included in the transcript along with the and HelloRetryRequest are included in the transcript along with the
new ClientHello. For instance, if the client sends ClientHello1, its new ClientHello. For instance, if the client sends ClientHello1, its
binder will be computed over: binder will be computed over:
Transcript-Hash(Truncate(ClientHello1)) Transcript-Hash(Truncate(ClientHello1))
Where Truncate() removes the binders list from the ClientHello. where Truncate() removes the binders list from the ClientHello.
Note that this hash will be computed using the hash associated with Note that this hash will be computed using the hash associated with
the PSK, as the client does not know which cipher suite the server the PSK, as the client does not know which cipher suite the server
will select. will select.
If the server responds with a HelloRetryRequest and the client then sends If the server responds with a HelloRetryRequest and the client then sends
ClientHello2, its binder will be computed over: ClientHello2, its binder will be computed over:
Transcript-Hash(ClientHello1, Transcript-Hash(ClientHello1,
HelloRetryRequest, HelloRetryRequest,
Truncate(ClientHello2)) Truncate(ClientHello2))
skipping to change at line 2766 skipping to change at line 2913
The EncryptedExtensions message contains extensions The EncryptedExtensions message contains extensions
that can be protected, i.e., any which are not needed to that can be protected, i.e., any which are not needed to
establish the cryptographic context but which are not establish the cryptographic context but which are not
associated with individual certificates. The client associated with individual certificates. The client
MUST check EncryptedExtensions for the presence of any forbidden MUST check EncryptedExtensions for the presence of any forbidden
extensions and if any are found MUST abort the handshake with an extensions and if any are found MUST abort the handshake with an
"illegal_parameter" alert. "illegal_parameter" alert.
Structure of this message: Structure of this message:
~~~
struct { struct {
Extension extensions<0..2^16-1>; Extension extensions<0..2^16-1>;
} EncryptedExtensions; } EncryptedExtensions;
~~~
{: gi="sourcecode"}
extensions: extensions:
: A list of extensions. For more information, see the table in {{extensions}}. : A list of extensions. For more information, see the table in {{extensions}}.
{:br } {:br }
### Certificate Request ### Certificate Request
A server which is authenticating with a certificate MAY optionally A server which is authenticating with a certificate MAY optionally
request a certificate from the client. This message, if sent, MUST request a certificate from the client. If sent, this message MUST
follow EncryptedExtensions. follow EncryptedExtensions.
Structure of this message: Structure of this message:
~~~
struct { struct {
opaque certificate_request_context<0..2^8-1>; opaque certificate_request_context<0..2^8-1>;
Extension extensions<0..2^16-1>; Extension extensions<0..2^16-1>;
} CertificateRequest; } CertificateRequest;
~~~
{: gi="sourcecode"}
certificate_request_context: certificate_request_context:
: An opaque string which identifies the certificate request and : An opaque string which identifies the certificate request and
which will be echoed in the client's Certificate message. The which will be echoed in the client's Certificate message. The
certificate_request_context MUST be unique within the scope certificate_request_context MUST be unique within the scope
of this connection (thus preventing replay of client of this connection (thus preventing replay of client
CertificateVerify messages). This field SHALL be zero length CertificateVerify messages). This field SHALL be zero length
unless used for the post-handshake authentication exchanges unless used for the post-handshake authentication exchanges
described in {{post-handshake-authentication}}. described in {{post-handshake-authentication}}.
When requesting post-handshake authentication, the server SHOULD When requesting post-handshake authentication, the server SHOULD
skipping to change at line 2824 skipping to change at line 2977
expressed by sending the "certificate_authorities" extension expressed by sending the "certificate_authorities" extension
(see {{certificate-authorities}}). (see {{certificate-authorities}}).
Servers which are authenticating with a resumption PSK MUST NOT send the Servers which are authenticating with a resumption PSK MUST NOT send the
CertificateRequest message in the main handshake, though they CertificateRequest message in the main handshake, though they
MAY send it in post-handshake authentication (see {{post-handshake-authentication}}) MAY send it in post-handshake authentication (see {{post-handshake-authentication}})
provided that the client has sent the "post_handshake_auth" provided that the client has sent the "post_handshake_auth"
extension (see {{post_handshake_auth}}). extension (see {{post_handshake_auth}}).
In the absence of some other specification to the contrary, In the absence of some other specification to the contrary,
servers which are authenticating with an external PSK servers which are authenticating with an external PSK
MUST NOT send the CertificateRequest message either in the main handshake MUST NOT send the CertificateRequest message in the main handshake
or request post-handshake authentication. or request post-handshake authentication.
{{RFC8773}} provides an extension to permit this, {{RFC8773}} provides an extension to permit this
but has received less analysis than this specification. but has received less analysis than this specification.
## Authentication Messages ## Authentication Messages
As discussed in {{protocol-overview}}, TLS generally uses a common As discussed in {{protocol-overview}}, TLS generally uses a common
set of messages for authentication, key confirmation, and handshake set of messages for authentication, key confirmation, and handshake
integrity: Certificate, CertificateVerify, and Finished. integrity: Certificate, CertificateVerify, and Finished.
(The PSK binders also perform key confirmation, in a (The PSK binders also perform key confirmation in a
similar fashion.) These three similar fashion.) These three
messages are always sent as the last messages in their handshake messages are always sent as the last messages in their handshake
flight. The Certificate and CertificateVerify messages are only flight. The Certificate and CertificateVerify messages are only
sent under certain circumstances, as defined below. The Finished sent under certain circumstances, as defined below. The Finished
message is always sent as part of the Authentication Block. message is always sent as part of the Authentication Block.
These messages are encrypted under keys derived from the These messages are encrypted under keys derived from the
\[sender]_handshake_traffic_secret, \[sender\]_handshake_traffic_secret,
except for post-handshake authentication. except for post-handshake authentication.
The computations for the Authentication messages all uniformly The computations for the Authentication messages all uniformly
take the following inputs: take the following inputs:
- The certificate and signing key to be used. - The certificate and signing key to be used.
- A Handshake Context consisting of the list of messages to be - A Handshake Context consisting of the list of messages to be
included in the transcript hash. included in the transcript hash.
- A Base Key to be used to compute a MAC key. - A Base Key to be used to compute a MAC key.
Based on these inputs, the messages then contain: Based on these inputs, the messages then contain:
Certificate Certificate:
: The certificate to be used for authentication, and any : The certificate to be used for authentication, and any
supporting certificates in the chain. Note that certificate-based supporting certificates in the chain. Note that certificate-based
client authentication is not available in PSK handshake flows client authentication is not available in PSK handshake flows
(including 0-RTT). (including 0-RTT).
CertificateVerify: CertificateVerify:
: A signature over the value Transcript-Hash(Handshake Context, Certificate) : A signature over the value Transcript-Hash(Handshake Context, Certificate).
Finished: Finished:
: A MAC over the value Transcript-Hash(Handshake Context, Certificate, CertificateVer ify) : A MAC over the value Transcript-Hash(Handshake Context, Certificate, CertificateVer ify)
using a MAC key derived from the Base Key. using a MAC key derived from the Base Key.
{:br} {:br}
<!-- [rfced] Table 2 extends one character line beyond the width limit. We will play
with this in the RFCXML file, but please let us know if you see a good way to break
the lines differently.
-->
The following table defines the Handshake Context and MAC Base Key The following table defines the Handshake Context and MAC Base Key
for each scenario: for each scenario:
| Mode | Handshake Context | Base Key | | Mode | Handshake Context | Base Key |
|------|-------------------|----------| |------|-------------------|----------|
| Server | ClientHello ... later of EncryptedExtensions/CertificateRequest | server_h andshake_traffic_secret | | Server | ClientHello ... later of EncryptedExtensions/CertificateRequest | server_h andshake_traffic_secret |
| Client | ClientHello ... later of server Finished/EndOfEarlyData | client_handshake _traffic_secret | | Client | ClientHello ... later of server Finished/EndOfEarlyData | client_handshake _traffic_secret |
| Post-Handshake | ClientHello ... client Finished + CertificateRequest | [sender]_ap plication_traffic_secret_N | | Post-Handshake | ClientHello ... client Finished + CertificateRequest | \[sender\]_ application_traffic_secret_N |
{: #hs-ctx-and-keys title="Authentication Inputs"} {: #hs-ctx-and-keys title="Authentication Inputs"}
### The Transcript Hash ### The Transcript Hash
Many of the cryptographic computations in TLS make use of a transcript Many of the cryptographic computations in TLS make use of a transcript
hash. This value is computed by hashing the concatenation of hash. This value is computed by hashing the concatenation of
each included handshake message, including the handshake each included handshake message, including the handshake
message header carrying the handshake message type and length fields, message header carrying the handshake message type and length fields
but not including record layer headers. I.e., but not including record layer headers. That is,
Transcript-Hash(M1, M2, ... Mn) = Hash(M1 || M2 || ... || Mn) Transcript-Hash(M1, M2, ... Mn) = Hash(M1 || M2 || ... || Mn)
As an exception to this general rule, when the server responds to a As an exception to this general rule, when the server responds to a
ClientHello with a HelloRetryRequest, the value of ClientHello1 is ClientHello with a HelloRetryRequest, the value of ClientHello1 is
replaced with a special synthetic handshake message of handshake replaced with a special synthetic handshake message of handshake
type "message_hash" containing Hash(ClientHello1). I.e., type "message_hash" containing Hash(ClientHello1). That is,
Transcript-Hash(ClientHello1, HelloRetryRequest, ... Mn) = Transcript-Hash(ClientHello1, HelloRetryRequest, ... Mn) =
Hash(message_hash || /* Handshake type */ Hash(message_hash || /* Handshake type */
00 00 Hash.length || /* Handshake message length (bytes) */ 00 00 Hash.length || /* Handshake message length (bytes) */
Hash(ClientHello1) || /* Hash of ClientHello1 */ Hash(ClientHello1) || /* Hash of ClientHello1 */
HelloRetryRequest || ... || Mn) HelloRetryRequest || ... || Mn)
The reason for this construction is to allow the server to do a The reason for this construction is to allow the server to do a
stateless HelloRetryRequest by storing just the hash of ClientHello1 stateless HelloRetryRequest by storing just the hash of ClientHello1
in the cookie, rather than requiring it to export the entire intermediate in the cookie, rather than requiring it to export the entire intermediate
skipping to change at line 2913 skipping to change at line 3069
For concreteness, the transcript hash is always taken from the For concreteness, the transcript hash is always taken from the
following sequence of handshake messages, starting at the first following sequence of handshake messages, starting at the first
ClientHello and including only those messages that were sent: ClientHello and including only those messages that were sent:
ClientHello, HelloRetryRequest, ClientHello, ServerHello, ClientHello, HelloRetryRequest, ClientHello, ServerHello,
EncryptedExtensions, server CertificateRequest, server Certificate, EncryptedExtensions, server CertificateRequest, server Certificate,
server CertificateVerify, server Finished, EndOfEarlyData, client server CertificateVerify, server Finished, EndOfEarlyData, client
Certificate, client CertificateVerify, and client Finished. Certificate, client CertificateVerify, and client Finished.
In general, implementations can implement the transcript by keeping a In general, implementations can implement the transcript by keeping a
running transcript hash value based on the negotiated hash. Note, running transcript hash value based on the negotiated hash. However,
however, that subsequent post-handshake authentications do not include note that subsequent post-handshake authentications do not include
each other, just the messages through the end of the main handshake. each other, just the messages through the end of the main handshake.
### Certificate ### Certificate
This message conveys the endpoint's certificate chain to the peer. This message conveys the endpoint's certificate chain to the peer.
The server MUST send a Certificate message whenever the agreed-upon The server MUST send a Certificate message whenever the agreed-upon
key exchange method uses certificates for authentication (this key exchange method uses certificates for authentication (this
includes all key exchange methods defined in this document except PSK). 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 The client MUST send a Certificate message if and only if the server has
requested certificate-based client authentication via a CertificateRequest message requested certificate-based client authentication via a CertificateRequest message
({{certificate-request}}). If the server requests certificate-based client authentica tion ({{certificate-request}}). If the server requests certificate-based client authentica tion
but no suitable certificate is available, the client but no suitable certificate is available, the client
MUST send a Certificate message containing no certificates (i.e., with MUST send a Certificate message containing no certificates (i.e., with
the "certificate_list" field having length 0). A Finished message MUST the "certificate_list" field having length 0). A Finished message MUST
be sent regardless of whether the Certificate message is empty. be sent regardless of whether the Certificate message is empty.
Structure of this message: Structure of this message:
~~~
enum { enum {
X509(0), X509(0),
RawPublicKey(2), RawPublicKey(2),
(255) (255)
} CertificateType; } CertificateType;
struct { struct {
select (certificate_type) { select (certificate_type) {
case RawPublicKey: case RawPublicKey:
/* From RFC 7250 ASN.1_subjectPublicKeyInfo */ /* From RFC 7250 ASN.1_subjectPublicKeyInfo */
skipping to change at line 2957 skipping to change at line 3114
case X509: case X509:
opaque cert_data<1..2^24-1>; opaque cert_data<1..2^24-1>;
}; };
Extension extensions<0..2^16-1>; Extension extensions<0..2^16-1>;
} CertificateEntry; } CertificateEntry;
struct { struct {
opaque certificate_request_context<0..2^8-1>; opaque certificate_request_context<0..2^8-1>;
CertificateEntry certificate_list<0..2^24-1>; CertificateEntry certificate_list<0..2^24-1>;
} Certificate; } Certificate;
~~~
{: gi="sourcecode"}
certificate_request_context: certificate_request_context:
: If this message is in response to a CertificateRequest, the : If this message is in response to a CertificateRequest, the
value of certificate_request_context in that message. Otherwise value of certificate_request_context in that message. Otherwise
(in the case of server authentication), this field SHALL be zero length. (in the case of server authentication), this field SHALL be zero length.
certificate_list: certificate_list:
: A list (chain) of CertificateEntry structures, each : A list (chain) of CertificateEntry structures, each
containing a single certificate and list of extensions. containing a single certificate and list of extensions.
skipping to change at line 3002 skipping to change at line 3161
to certify the one immediately preceding it; to certify the one immediately preceding it;
however, some implementations allowed some flexibility. Servers sometimes send however, some implementations allowed some flexibility. Servers sometimes send
both a current and deprecated intermediate for transitional purposes, and others both a current and deprecated intermediate for transitional purposes, and others
are simply configured incorrectly, but these cases can nonetheless be validated are simply configured incorrectly, but these cases can nonetheless be validated
properly. For maximum compatibility, all implementations SHOULD be prepared to properly. For maximum compatibility, all implementations SHOULD be prepared to
handle potentially extraneous certificates and arbitrary orderings from any TLS handle potentially extraneous certificates and arbitrary orderings from any TLS
version, with the exception of the end-entity certificate which MUST be first. version, with the exception of the end-entity certificate which MUST be first.
If the RawPublicKey certificate type was negotiated, then the If the RawPublicKey certificate type was negotiated, then the
certificate_list MUST contain no more than one CertificateEntry, which certificate_list MUST contain no more than one CertificateEntry, which
contains an ASN1_subjectPublicKeyInfo value as defined in {{RFC7250}}, contains an ASN1_subjectPublicKeyInfo value as defined in {{RFC7250,
Section 3. Section 3}}.
The OpenPGP certificate type {{RFC6091}} MUST NOT be used with TLS 1.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 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 send an empty certificate_list if it does not have an appropriate
certificate to send in response to the server's authentication certificate to send in response to the server's authentication
request. request.
#### OCSP Status and SCT Extensions {#ocsp-and-sct} #### OCSP Status and SCT Extensions {#ocsp-and-sct}
skipping to change at line 3073 skipping to change at line 3232
extension, the end-entity certificate MUST match the extension OIDs extension, the end-entity certificate MUST match the extension OIDs
that are recognized by the client, as described in {{oid-filters}}. that are recognized by the client, as described in {{oid-filters}}.
The following rule additionally applies to certificates sent by the server: The following rule additionally applies to certificates sent by the server:
- The "server_name" {{RFC6066}} extension is used to guide certificate - The "server_name" {{RFC6066}} extension is used to guide certificate
selection. As servers MAY require the presence of the "server_name" extension, selection. As servers MAY require the presence of the "server_name" extension,
clients SHOULD send this extension when the server is identified by name. clients SHOULD send this extension when the server is identified by name.
All certificates provided by the sender MUST be signed by a All certificates provided by the sender MUST be signed by a
signature algorithm advertised by the peer, if it is able to provide such signature algorithm advertised by the peer if it is able to provide such
a chain (see {{signature-algorithms}}). a chain (see {{signature-algorithms}}).
Certificates that are self-signed Certificates that are self-signed
or certificates that are expected to be trust anchors are not validated as 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. part of the chain and therefore MAY be signed with any algorithm.
If the sender is the server, and the server If the sender is the server, and the server
cannot produce a certificate chain that is signed only via the cannot produce a certificate chain that is signed only via the
indicated supported algorithms, then it SHOULD continue the handshake by sending indicated supported algorithms, then it SHOULD continue the handshake by sending
a certificate chain of its choice that may include algorithms that are not known a certificate chain of its choice that may include algorithms that are not known
to be supported by the client. to be supported by the client.
This fallback chain MUST NOT use the deprecated SHA-1 hash, This fallback chain MUST NOT use the deprecated SHA-1 hash,
unless the client specifically advertises that it is willing to accept SHA-1. unless the client specifically advertises that it is willing to accept SHA-1.
If the sender is the client, the client MAY use a fallback chain as above, or If the sender is the client, the client MAY use a fallback chain as above or
continue the handshake anonymously. continue the handshake anonymously.
If the receiver cannot construct an acceptable chain using the provided If the receiver cannot construct an acceptable chain using the provided
certificates and decides to abort the handshake, then it MUST abort the certificates and decides to abort the handshake, then it MUST abort the
handshake with an appropriate certificate-related alert (by default, handshake with an appropriate certificate-related alert (by default,
"unsupported_certificate"; see {{error-alerts}} for more information). "unsupported_certificate"; see {{error-alerts}} for more information).
If the sender has multiple certificates, it chooses one of them based on the If the sender has multiple certificates, it chooses one of them based on the
above-mentioned criteria (in addition to other criteria, such as transport-layer endp oint, local configuration, and preferences). above-mentioned criteria (in addition to other criteria, such as transport-layer endp oint, local configuration, and preferences).
skipping to change at line 3109 skipping to change at line 3268
In general, detailed certificate validation procedures are out of scope for In general, detailed certificate validation procedures are out of scope for
TLS (see {{RFC5280}}). This section provides TLS-specific requirements. TLS (see {{RFC5280}}). This section provides TLS-specific requirements.
If the server supplies an empty Certificate message, the client MUST abort If the server supplies an empty Certificate message, the client MUST abort
the handshake with a "decode_error" alert. the handshake with a "decode_error" alert.
If the client does not send any certificates (i.e., it sends an empty If the client does not send any certificates (i.e., it sends an empty
Certificate message), Certificate message),
the server MAY at its discretion either continue the handshake without client 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 authentication or abort the handshake with a "certificate_required" alert. Also, if s ome
aspect of the certificate chain was unacceptable (e.g., it was not signed by a 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 known, trusted CA), the server MAY at its discretion either continue the
handshake (considering the client unauthenticated) or abort the handshake. handshake (considering the client unauthenticated) or abort the handshake.
Any endpoint receiving any certificate which it would need to validate Any endpoint receiving any certificate which it would need to validate
using any signature algorithm using an MD5 hash MUST abort the using any signature algorithm using an MD5 hash MUST abort the
handshake with a "bad_certificate" alert. SHA-1 is deprecated and it handshake with a "bad_certificate" alert. SHA-1 is deprecated and it
is RECOMMENDED that any endpoint receiving any certificate which it is RECOMMENDED that any endpoint receiving any certificate which it
would need to validate using any signature algorithm using a SHA-1 would need to validate using any signature algorithm using a SHA-1
hash abort the handshake with a "bad_certificate" alert. For clarity, hash abort the handshake with a "bad_certificate" alert. For clarity,
skipping to change at line 3143 skipping to change at line 3302
This message is used to provide explicit proof that an endpoint This message is used to provide explicit proof that an endpoint
possesses the private key corresponding to its certificate. possesses the private key corresponding to its certificate.
The CertificateVerify message also provides integrity for the handshake up The CertificateVerify message also provides integrity for the handshake up
to this point. Servers MUST send this message when authenticating via a certificate. 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 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 immediatel y the Certificate message is non-empty). When sent, this message MUST appear immediatel y
after the Certificate message and immediately prior to the Finished message. after the Certificate message and immediately prior to the Finished message.
Structure of this message: Structure of this message:
~~~
struct { struct {
SignatureScheme algorithm; SignatureScheme algorithm;
opaque signature<0..2^16-1>; opaque signature<0..2^16-1>;
} CertificateVerify; } CertificateVerify;
~~~
{: gi="sourcecode"}
The algorithm field specifies the signature algorithm used (see The algorithm field specifies the signature algorithm used (see
{{signature-algorithms}} for the definition of this type). The {{signature-algorithms}} for the definition of this type). The
signature is a digital signature using that algorithm. The signature is a digital signature using that algorithm. The
content that is covered under the signature is the hash output as described in content that is covered under the signature is the hash output as described in
{{the-transcript-hash}}, namely: {{the-transcript-hash}}, namely:
Transcript-Hash(Handshake Context, Certificate) Transcript-Hash(Handshake Context, Certificate)
The digital signature is then computed over the concatenation of: The digital signature is then computed over the concatenation of:
skipping to change at line 3170 skipping to change at line 3332
- A single 0 byte which serves as the separator - A single 0 byte which serves as the separator
- The content to be signed - The content to be signed
This structure is intended to prevent an attack on previous versions This structure is intended to prevent an attack on previous versions
of TLS in which the ServerKeyExchange format meant that of TLS in which the ServerKeyExchange format meant that
attackers could obtain a signature of a message with a chosen 32-byte attackers could obtain a signature of a message with a chosen 32-byte
prefix (ClientHello.random). The initial 64-byte pad clears that prefix prefix (ClientHello.random). The initial 64-byte pad clears that prefix
along with the server-controlled ServerHello.random. along with the server-controlled ServerHello.random.
The context string for a server signature is The context string for a server signature is
"TLS 1.3, server CertificateVerify" "TLS 1.3, server CertificateVerify".
The context string for a client signature is The context string for a client signature is
"TLS 1.3, client CertificateVerify" "TLS 1.3, client CertificateVerify".
It is used to provide separation between signatures made in different It is used to provide separation between signatures made in different
contexts, helping against potential cross-protocol attacks. contexts, helping against potential cross-protocol attacks.
For example, if the transcript hash was 32 bytes of For example, if the transcript hash was 32 bytes of
01 (this length would make sense for SHA-256), the content covered by 01 (this length would make sense for SHA-256), the content covered by
the digital signature for a server CertificateVerify would be: the digital signature for a server CertificateVerify would be:
2020202020202020202020202020202020202020202020202020202020202020 2020202020202020202020202020202020202020202020202020202020202020
2020202020202020202020202020202020202020202020202020202020202020 2020202020202020202020202020202020202020202020202020202020202020
544c5320312e332c207365727665722043657274696669636174655665726966 544c5320312e332c207365727665722043657274696669636174655665726966
skipping to change at line 3241 skipping to change at line 3403
correct and if incorrect MUST terminate the connection correct and if incorrect MUST terminate the connection
with a "decrypt_error" alert. with a "decrypt_error" alert.
Once a side has sent its Finished message and has received and 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 validated the Finished message from its peer, it may begin to send and
receive Application Data over the connection. There are two receive Application Data over the connection. There are two
settings in which it is permitted to send data prior to settings in which it is permitted to send data prior to
receiving the peer's Finished: receiving the peer's Finished:
1. Clients sending 0-RTT data as described in {{early-data-indication}}. 1. Clients sending 0-RTT data as described in {{early-data-indication}}.
2. Servers MAY send data after sending their first flight, but 2. Servers MAY send data after sending their first flight, but
because the handshake is not yet complete, they have no assurance because the handshake is not yet complete, they have no assurance
of either the peer's identity or its liveness (i.e., of either the peer's identity or its liveness (i.e.,
the ClientHello might have been replayed). the ClientHello might have been replayed).
The key used to compute the Finished message is computed from the The key used to compute the Finished message is computed from the
Base Key defined in {{authentication-messages}} using HKDF (see Base Key defined in {{authentication-messages}} using HKDF (see
{{key-schedule}}). Specifically: {{key-schedule}}). Specifically:
~~~ ~~~
finished_key = finished_key =
HKDF-Expand-Label(BaseKey, "finished", "", Hash.length) HKDF-Expand-Label(BaseKey, "finished", "", Hash.length)
~~~ ~~~
{: gi="sourcecode"}
Structure of this message: Structure of this message:
~~~
struct { struct {
opaque verify_data[Hash.length]; opaque verify_data[Hash.length];
} Finished; } Finished;
~~~
{: gi="sourcecode"}
The verify_data value is computed as follows: The verify_data value is computed as follows:
~~~
verify_data = verify_data =
HMAC(finished_key, HMAC(finished_key,
Transcript-Hash(Handshake Context, Transcript-Hash(Handshake Context,
Certificate*, CertificateVerify*)) Certificate*, CertificateVerify*))
~~~
{: gi="sourcecode"}
* Only included if present. <!--[rfced] We believe the intention of this line to note that the asterisk
has a specific meaning when present. Please note that we will update the XML to trea
t this as <dl>. Currently, kramdown treats this as a bulleted list item, and definit
ion list yeilds the following:
*: Only included if present.
-->
* Only included if present.
HMAC {{RFC2104}} uses the Hash algorithm for the handshake. HMAC {{RFC2104}} uses the Hash algorithm for the handshake.
As noted above, the HMAC input can generally be implemented by a running As noted above, the HMAC input can generally be implemented by a running
hash, i.e., just the handshake hash at this point. hash, i.e., just the handshake hash at this point.
In previous versions of TLS, the verify_data was always 12 octets long. In 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. 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 Note: Alerts and any other non-handshake record types are not handshake messages
and are not included in the hash computations. and are not included in the hash computations.
skipping to change at line 3307 skipping to change at line 3483
This message is encrypted under keys derived from the client_early_traffic_secret. This message is encrypted under keys derived from the client_early_traffic_secret.
## Post-Handshake Messages ## Post-Handshake Messages
TLS also allows other messages to be sent after the main handshake. TLS also allows other messages to be sent after the main handshake.
These messages use a handshake content type and are encrypted under the These messages use a handshake content type and are encrypted under the
appropriate application traffic key. appropriate application traffic key.
### New Session Ticket Message {#NSTMessage} ### New Session Ticket Message {#NSTMessage}
If the client's hello contained a suitable "psk_key_exchange_modes" extension, If the client's hello contained a suitable "psk_key_exchange_modes" extension
at any time after the server has received the client Finished message, at any time after the server has received the client Finished message,
it MAY send a NewSessionTicket message. This message creates a unique it MAY send a NewSessionTicket message. This message creates a unique
association between the ticket value and a secret PSK association between the ticket value and a secret PSK
derived from the resumption secret (see {{cryptographic-computations}}). derived from the resumption secret (see {{cryptographic-computations}}).
The client MAY use this PSK for future handshakes by including the The client MAY use this PSK for future handshakes by including the
ticket value in the "pre_shared_key" extension in its ClientHello ticket value in the "pre_shared_key" extension in its ClientHello
({{pre-shared-key-extension}}). ({{pre-shared-key-extension}}).
Clients which receive a NewSessionTicket message but do Clients which receive a NewSessionTicket message but do
not support resumption MUST silently ignore this message. not support resumption MUST silently ignore this message.
Resumption MAY be done while the Resumption MAY be done while the
original connection is still open. Servers MAY send multiple tickets on a original connection is still open. Servers MAY send multiple tickets on a
single connection, either immediately after each other or single connection, either immediately after each other or
after specific events (see {{client-tracking}}). after specific events (see {{client-tracking}}).
For instance, the server might send a new ticket after post-handshake For instance, the server might send a new ticket after post-handshake
authentication thus encapsulating the additional client authentication, thus encapsulating the additional client
authentication state. Multiple tickets are useful for clients authentication state. Multiple tickets are useful for clients
for a variety of purposes, including: for a variety of purposes, including:
- Opening multiple parallel HTTP connections. - Opening multiple parallel HTTP connections.
- Performing connection racing across interfaces and address families - Performing connection racing across interfaces and address families
via (for example) Happy Eyeballs {{RFC8305}} or related techniques. via, for example, Happy Eyeballs {{RFC8305}} or related techniques.
Any ticket MUST only be resumed with a cipher suite that has the 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. 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 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 certificate presented in the original session, and SHOULD only resume if
the SNI value matches the one used in the original session. The latter the SNI value matches the one used in the original session. The latter
is a performance optimization: normally, there is no reason to expect is a performance optimization: normally, there is no reason to expect
that different servers covered by a single certificate would be able to that different servers covered by a single certificate would be able to
accept each other's tickets; hence, attempting resumption in that case accept each other's tickets; hence, attempting resumption in that case
skipping to change at line 3381 skipping to change at line 3557
The value of zero indicates that the ticket should be discarded The value of zero indicates that the ticket should be discarded
immediately. Clients MUST NOT use tickets for longer than immediately. Clients MUST NOT use tickets for longer than
7 days after issuance, regardless of the ticket_lifetime, and MAY delete tickets 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 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 for a shorter period of time than what is stated in the
ticket_lifetime. ticket_lifetime.
ticket_age_add: ticket_age_add:
: A securely generated, random 32-bit value that is used to obscure the age of : 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 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 The client-side ticket age is added to this value modulo 2<sup>32</sup> to
obtain the value that is transmitted by the client. obtain the value that is transmitted by the client.
The server MUST generate a fresh value for each ticket it sends. The server MUST generate a fresh value for each ticket it sends.
ticket_nonce: ticket_nonce:
: A per-ticket value that is unique across all tickets issued on this connection. : A per-ticket value that is unique across all tickets issued on this connection.
ticket: ticket:
: The value of the ticket to be used as the PSK identity. : 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 The ticket itself is an opaque label. It MAY be either a database
lookup key or a self-encrypted and self-authenticated value. lookup key or a self-encrypted and self-authenticated value.
skipping to change at line 3420 skipping to change at line 3596
will be unable to differentiate padding from content, so clients SHOULD NOT 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. depend on being able to send large quantities of padding in early data records.
{:br } {:br }
The PSK associated with the ticket is computed as: The PSK associated with the ticket is computed as:
~~~~ ~~~~
HKDF-Expand-Label(resumption_secret, HKDF-Expand-Label(resumption_secret,
"resumption", ticket_nonce, Hash.length) "resumption", ticket_nonce, Hash.length)
~~~~ ~~~~
{: gi="sourcecode"}
Because the ticket_nonce value is distinct for each NewSessionTicket Because the ticket_nonce value is distinct for each NewSessionTicket
message, a different PSK will be derived for each ticket. message, a different PSK will be derived for each ticket.
Note that in principle it is possible to continue issuing new tickets Note that in principle it is possible to continue issuing new tickets
which indefinitely extend the lifetime of the keying which indefinitely extend the lifetime of the keying
material originally derived from an initial non-PSK handshake (which material originally derived from an initial non-PSK handshake (which
was most likely tied to the peer's certificate). It is RECOMMENDED was most likely tied to the peer's certificate). It is RECOMMENDED
that implementations place limits on the total lifetime of such keying that implementations place limits on the total lifetime of such keying
material; these limits should take into account the lifetime of the material; these limits should take into account the lifetime of the
skipping to change at line 3458 skipping to change at line 3635
alert. alert.
Note: Because certificate-based client authentication could involve prompting the use r, servers Note: Because certificate-based client authentication could involve prompting the use r, servers
MUST be prepared for some delay, including receiving an arbitrary number of MUST be prepared for some delay, including receiving an arbitrary number of
other messages between sending the CertificateRequest and receiving a other messages between sending the CertificateRequest and receiving a
response. In addition, clients which receive multiple CertificateRequests in response. In addition, clients which receive multiple CertificateRequests in
close succession MAY respond to them in a different order than they were close succession MAY respond to them in a different order than they were
received (the certificate_request_context value allows the server to received (the certificate_request_context value allows the server to
disambiguate the responses). disambiguate the responses).
### Key and Initialization Vector Update {#key-update} ### Key and Initialization Vector (IV) Update {#key-update}
The KeyUpdate handshake message is used to indicate that the sender is The KeyUpdate handshake message is used to indicate that the sender is
updating its sending cryptographic keys. This message can be sent by updating its sending cryptographic keys. This message can be sent by
either peer after it has sent a Finished message. either peer after it has sent a Finished message.
Implementations that receive a KeyUpdate message prior to receiving a Finished messag e Implementations that receive a KeyUpdate message prior to receiving a Finished messag e
MUST terminate the connection with an "unexpected_message" alert. MUST terminate the connection with an "unexpected_message" alert.
After sending a KeyUpdate message, the sender SHALL send all its traffic using the After sending a KeyUpdate message, the sender SHALL send all its traffic using the
next generation of keys, computed as described in {{updating-traffic-keys}}. next generation of keys, computed as described in {{updating-traffic-keys}}.
Upon receiving a KeyUpdate, the receiver MUST update its receiving keys. Upon receiving a KeyUpdate, the receiver MUST update its receiving keys.
skipping to change at line 3512 skipping to change at line 3689
request_update set to "update_requested", and they cross in flight, then each side 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 will also send a response, with the result that each side increments
by two generations. by two generations.
Both sender and receiver MUST encrypt their KeyUpdate Both sender and receiver MUST encrypt their KeyUpdate
messages with the old keys. Additionally, both sides MUST enforce that messages with the old keys. Additionally, both sides MUST enforce that
a KeyUpdate with the old key is received before accepting any messages 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 encrypted with the new key. Failure to do so may allow message truncation
attacks. attacks.
With a 128-bit key as in AES-128, rekeying 2^64 times has a high With a 128-bit key as in AES-128, rekeying 2<sup>64</sup> times has a high
probability of key reuse within a given connection. Note that even probability of key reuse within a given connection. Note that even
if the key repeats, the IV is also independently generated, so the if the key repeats, the IV is also independently generated, so the
chance of a joint key/IV collision is much lower. chance of a joint key/IV collision is much lower.
To provide an extra margin of security, sending implementations MUST To provide an extra margin of security, sending implementations MUST
NOT allow the epoch -- and hence the number of key updates -- 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 to exceed 2<sup>48</sup>-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 receiving implementations MUST NOT enforce this
rule. If a sending implementation receives a KeyUpdate with rule. If a sending implementation receives a KeyUpdate with
request_update set to "update_requested", it MUST NOT send its own request_update set to "update_requested", it MUST NOT send its own
KeyUpdate if that would cause it to exceed these limits and SHOULD KeyUpdate if that would cause it to exceed these limits and SHOULD
instead ignore the "update_requested" flag. This may result in instead ignore the "update_requested" flag. This may result in
an eventual need to terminate the connection when the an eventual need to terminate the connection when the
limits in {{limits-on-key-usage}} are reached. limits described in {{limits-on-key-usage}} are reached.
# Record Protocol # Record Protocol
The TLS record protocol takes messages to be transmitted, fragments The TLS record protocol takes messages to be transmitted, fragments
the data into manageable blocks, protects the records, and transmits the data into manageable blocks, protects the records, and transmits
the result. Received data is verified, decrypted, reassembled, and the result. Received data is verified, decrypted, reassembled, and
then delivered to higher-level clients. then delivered to higher-level clients.
TLS records are typed, which allows multiple higher-level protocols to TLS records are typed, which allows multiple higher-level protocols to
be multiplexed over the same record layer. This document specifies be multiplexed over the same record layer. This document specifies
skipping to change at line 3562 skipping to change at line 3739
handshake with an "unexpected_message" alert. If an implementation detects handshake with an "unexpected_message" alert. If an implementation detects
a change_cipher_spec record a change_cipher_spec record
received before the first ClientHello message or after the peer's Finished received before the first ClientHello message or after the peer's Finished
message, it MUST be treated as an unexpected record type (though stateless message, it MUST be treated as an unexpected record type (though stateless
servers may not be able to distinguish these cases from allowed cases). servers may not be able to distinguish these cases from allowed cases).
Implementations MUST NOT send record types not defined in this Implementations MUST NOT send record types not defined in this
document unless negotiated by some extension. If a TLS implementation document unless negotiated by some extension. If a TLS implementation
receives an unexpected record type, it MUST terminate the connection receives an unexpected record type, it MUST terminate the connection
with an "unexpected_message" alert. New record content type values with an "unexpected_message" alert. New record content type values
are assigned by IANA in the TLS ContentType registry as described in are assigned by IANA in the "TLS ContentType" registry as described in
{{iana-considerations}}. {{iana-considerations}}.
## Record Layer ## Record Layer
The record layer fragments information blocks into TLSPlaintext The record layer fragments information blocks into TLSPlaintext
records carrying data in chunks of 2^14 bytes or less. Message records carrying data in chunks of 2<sup>14</sup> bytes or less. Message
boundaries are handled differently depending on the underlying boundaries are handled differently depending on the underlying
ContentType. Any future content types MUST specify appropriate ContentType. Any future content types MUST specify appropriate
rules. rules.
Note that these rules are stricter than what was enforced in TLS 1.2. Note that these rules are stricter than what was enforced in TLS 1.2.
Handshake messages MAY be coalesced into a single TLSPlaintext Handshake messages MAY be coalesced into a single TLSPlaintext
record or fragmented across several records, provided that: record or fragmented across several records, provided that:
- Handshake messages MUST NOT be interleaved with other record - Handshake messages MUST NOT be interleaved with other record
types. That is, if a handshake message is split over two or more types. That is, if a handshake message is split over two or more
skipping to change at line 3634 skipping to change at line 3811
: MUST be set to 0x0303 for all records generated by a : MUST be set to 0x0303 for all records generated by a
TLS 1.3 implementation other than an initial ClientHello (i.e., one TLS 1.3 implementation other than an initial ClientHello (i.e., one
not generated after a HelloRetryRequest), where it not generated after a HelloRetryRequest), where it
MAY also be 0x0301 for compatibility purposes. MAY also be 0x0301 for compatibility purposes.
This field is deprecated and MUST be ignored for all purposes. This field is deprecated and MUST be ignored for all purposes.
Previous versions of TLS would use other values in this field Previous versions of TLS would use other values in this field
under some circumstances. under some circumstances.
length: length:
: The length (in bytes) of the following TLSPlaintext.fragment. The : The length (in bytes) of the following TLSPlaintext.fragment. The
length MUST NOT exceed 2^14 bytes. An endpoint that receives a record length MUST NOT exceed 2<sup>14</sup> bytes. An endpoint that receives a record
that exceeds this length MUST terminate the connection with a that exceeds this length MUST terminate the connection with a
"record_overflow" alert. "record_overflow" alert.
fragment fragment
: The data being transmitted. This value is transparent and is treated as an : The data being transmitted. This value is transparent and is treated as an
independent block to be dealt with by the higher-level protocol independent block to be dealt with by the higher-level protocol
specified by the type field. specified by the type field.
{:br } {:br }
This document describes TLS 1.3, which uses the version 0x0304. This document describes TLS 1.3, which uses the version 0x0304.
skipping to change at line 3718 skipping to change at line 3895
: The legacy_record_version field is always 0x0303. TLS 1.3 TLSCiphertexts : 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 are not generated until after TLS 1.3 has been negotiated, so there are
no historical compatibility concerns where other values might be received. no historical compatibility concerns where other values might be received.
Note that the handshake protocol, including the ClientHello and ServerHello Note that the handshake protocol, including the ClientHello and ServerHello
messages, authenticates the protocol version, so this value is redundant. messages, authenticates the protocol version, so this value is redundant.
length: length:
: The length (in bytes) of the following TLSCiphertext.encrypted_record, which : 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 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. for the inner content type, plus any expansion added by the AEAD algorithm.
The length MUST NOT exceed 2^14 + 256 bytes. The length MUST NOT exceed 2<sup>14</sup> + 256 bytes.
An endpoint that receives a record that exceeds this length MUST An endpoint that receives a record that exceeds this length MUST
terminate the connection with a "record_overflow" alert. terminate the connection with a "record_overflow" alert.
encrypted_record: encrypted_record:
: The AEAD-encrypted form of the serialized TLSInnerPlaintext structure. : The AEAD-encrypted form of the serialized TLSInnerPlaintext structure.
{:br } {:br }
AEAD algorithms take as input a single key, a nonce, a plaintext, and "additional 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 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, 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 the nonce is derived from the sequence number and the
client_write_iv or server_write_iv (see {{nonce}}), and the additional data input is the client_write_iv or server_write_iv (see {{nonce}}), and the additional data input is the
record header. I.e., record header. That is,
additional_data = TLSCiphertext.opaque_type || additional_data = TLSCiphertext.opaque_type ||
TLSCiphertext.legacy_record_version || TLSCiphertext.legacy_record_version ||
TLSCiphertext.length TLSCiphertext.length
The plaintext input to the AEAD algorithm is the encoded TLSInnerPlaintext structure. The plaintext input to the AEAD algorithm is the encoded TLSInnerPlaintext structure.
Derivation of traffic keys is defined in {{traffic-key-calculation}}. Derivation of traffic keys is defined in {{traffic-key-calculation}}.
The AEAD output consists of the ciphertext output from the AEAD The AEAD output consists of the ciphertext output from the AEAD
encryption operation. The length of the plaintext is greater than the encryption operation. The length of the plaintext is greater than the
skipping to change at line 3759 skipping to change at line 3936
AEADEncrypted = AEADEncrypted =
AEAD-Encrypt(write_key, nonce, additional_data, plaintext) AEAD-Encrypt(write_key, nonce, additional_data, plaintext)
The encrypted_record field of TLSCiphertext is set to AEADEncrypted. The encrypted_record field of TLSCiphertext is set to AEADEncrypted.
To decrypt and verify, the cipher takes as input the key, nonce, To decrypt and verify, the cipher takes as input the key, nonce,
additional data, and the AEADEncrypted value. The output is either the plaintext additional data, and the AEADEncrypted value. The output is either the plaintext
or an error indicating that the decryption failed. There is no separate or an error indicating that the decryption failed. There is no separate
integrity check. Symbolically, integrity check. Symbolically,
plaintext of encrypted_record = plaintext of encrypted_record =
AEAD-Decrypt(peer_write_key, nonce, additional_data, AEADEncrypted) AEAD-Decrypt(peer_write_key, nonce, additional_data, AEADEncrypted)
If the decryption fails, the receiver MUST terminate the connection If the decryption fails, the receiver MUST terminate the connection
with a "bad_record_mac" alert. with a "bad_record_mac" alert.
An AEAD algorithm used in TLS 1.3 MUST NOT produce an expansion greater than 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 255 octets. An endpoint that receives a record from its peer with
TLSCiphertext.length larger than 2^14 + 256 octets MUST terminate TLSCiphertext.length larger than 2<sup>14</sup> + 256 octets MUST terminate
the connection with a "record_overflow" alert. the connection with a "record_overflow" alert.
This limit is derived from the maximum TLSInnerPlaintext length of This limit is derived from the maximum TLSInnerPlaintext length of
2^14 octets + 1 octet for ContentType + the maximum AEAD expansion of 255 octets. 2<sup>14</sup> octets + 1 octet for ContentType + the maximum AEAD expansion of 255 o ctets.
## Per-Record Nonce {#nonce} ## Per-Record Nonce {#nonce}
A 64-bit sequence number is maintained separately for reading and writing A 64-bit sequence number is maintained separately for reading and writing
records. The appropriate sequence number is incremented by one after records. The appropriate sequence number is incremented by one after
reading or writing each record. Each sequence number is set to zero 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 at the beginning of a connection and whenever the key is changed; the
first record transmitted under a particular traffic key MUST use first record transmitted under a particular traffic key MUST use
sequence number 0. sequence number 0.
Because the size of sequence numbers is 64-bit, they should not Because the size of sequence numbers is 64 bits, they should not
wrap. If a TLS implementation would need to wrap. If a TLS implementation would need to
wrap a sequence number, it MUST either rekey ({{key-update}}) or wrap a sequence number, it MUST either rekey ({{key-update}}) or
terminate the connection. terminate the connection.
Each AEAD algorithm will specify a range of possible lengths for the 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}}. 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 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). 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. 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 per-record nonce for the AEAD construction is formed as follows:
1. The 64-bit record sequence number is encoded in network byte order 1. The 64-bit record sequence number is encoded in network byte order
and padded to the left with zeros to iv_length. and padded to the left with zeros to iv_length.
2. The padded sequence number is XORed with either the static client_write_iv 2. The padded sequence number is XORed with either the static client_write_iv
or server_write_iv (depending on the role). or server_write_iv (depending on the role).
The resulting quantity (of length iv_length) is used as the per-record nonce. 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 Note: This is a different construction from that in TLS 1.2, which
specified a partially explicit nonce. specified a partially explicit nonce.
## Record Padding ## Record Padding
All encrypted TLS records can be padded to inflate the size of the All encrypted TLS records can be padded to inflate the size of the
TLSCiphertext. This allows the sender to hide the size of the TLSCiphertext. This allows the sender to hide the size of the
skipping to change at line 3841 skipping to change at line 4018
limits) without introducing new content types. The design also limits) without introducing new content types. The design also
enforces all-zero padding octets, which allows for quick detection of enforces all-zero padding octets, which allows for quick detection of
padding errors. padding errors.
Implementations MUST limit their scanning to the cleartext returned Implementations MUST limit their scanning to the cleartext returned
from the AEAD decryption. If a receiving implementation does not find from the AEAD decryption. If a receiving implementation does not find
a non-zero octet in the cleartext, it MUST terminate the a non-zero octet in the cleartext, it MUST terminate the
connection with an "unexpected_message" alert. connection with an "unexpected_message" alert.
The presence of padding does not change the overall record size limitations: 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 The full encoded TLSInnerPlaintext MUST NOT exceed 2<sup>14</sup> + 1 octets. If the
maximum fragment length is reduced -- as for example by the record_size_limit 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, extension from {{?RFC8449}} -- then the reduced limit applies to the full plaintext,
including the content type and padding. including the content type and padding.
Selecting a padding policy that suggests when and how much to pad is a 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 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 application-layer protocol on top of TLS has its own padding, it may be
preferable to pad Application Data TLS records within the application preferable to pad Application Data TLS records within the application
layer. Padding for encrypted Handshake or Alert records must layer. However, padding for encrypted Handshake or Alert records must
still be handled at the TLS layer, though. Later documents may define still be handled at the TLS layer. Later documents may define
padding selection algorithms or define a padding policy request padding selection algorithms or define a padding policy request
mechanism through TLS extensions or some other means. mechanism through TLS extensions or some other means.
## Limits on Key Usage ## Limits on Key Usage
There are cryptographic limits on the amount of plaintext which can be There are cryptographic limits on the amount of plaintext which can be
safely encrypted under a given set of keys. {{AEAD-LIMITS}} provides safely encrypted under a given set of keys. {{AEAD-LIMITS}} provides
an analysis of these limits under the assumption that the underlying an analysis of these limits under the assumption that the underlying
primitive (AES or ChaCha20) has no weaknesses. Implementations MUST primitive (AES or ChaCha20) has no weaknesses. Implementations MUST
either close the connection or either close the connection or
do a key update as described in {{key-update}} prior to reaching these limits. do a key update as described in {{key-update}} prior to reaching these limits.
Note that it is not possible to perform a KeyUpdate for early data Note that it is not possible to perform a KeyUpdate for early data;
and therefore implementations MUST NOT exceed the limits therefore, implementations MUST NOT exceed the limits
when sending early data. Receiving implementations SHOULD NOT enforce when sending early data. Receiving implementations SHOULD NOT enforce
these limits, as future analyses may result in updated values. these limits, as future analyses may result in updated values.
For AES-GCM, up to 2^24.5 full-size records (about 24 million) For AES-GCM, up to 2<sup>24.5</sup> full-size records (about 24 million)
may be encrypted on a given connection while keeping a safety may be encrypted on a given connection while keeping a safety
margin of approximately 2^-57 for Authenticated Encryption (AE) security. margin of approximately 2<sup>-57</sup> for Authenticated Encryption (AE) security.
For ChaCha20/Poly1305, the record sequence number would wrap before the For ChaCha20/Poly1305, the record sequence number would wrap before the
safety limit is reached. safety limit is reached.
# Alert Protocol # Alert Protocol
TLS provides an Alert content type to indicate closure information TLS provides an Alert content type to indicate closure information
and errors. Like other messages, alert messages are encrypted as and errors. Like other messages, alert messages are encrypted as
specified by the current connection state. specified by the current connection state.
Alert messages convey a description of the alert and a legacy field Alert messages convey a description of the alert and a legacy field
skipping to change at line 3992 skipping to change at line 4169
a change from versions of TLS prior to TLS 1.3 in which implementations were 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 required to react to a "close_notify" by discarding pending writes and
sending an immediate "close_notify" alert of their own. That previous sending an immediate "close_notify" alert of their own. That previous
requirement could cause truncation in the read side. Both parties need not 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 wait to receive a "close_notify" alert before closing their read side of the
connection, though doing so would introduce the possibility of truncation. connection, though doing so would introduce the possibility of truncation.
Application protocols MAY choose to flush their send buffers and immediately Application protocols MAY choose to flush their send buffers and immediately
send a close_notify upon receiving a close_notify, but this allows an attacker send a close_notify upon receiving a close_notify, but this allows an attacker
to influence the data that the peer receives by delaying the close_notify or to influence the data that the peer receives by delaying the close_notify or
by delaying the transport level delivery of the application's packets. These by delaying the transport-level delivery of the application's packets. These
issues can be addressed at the application layer, for instance by ignoring issues can be addressed at the application layer, for instance by ignoring
packets received after transmitting the close_notify. packets received after transmitting the close_notify.
If the application protocol using TLS provides that any data may be carried 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 over the underlying transport after the TLS connection is closed, the TLS
implementation MUST receive a "close_notify" alert before indicating implementation MUST receive a "close_notify" alert before indicating
end-of-data to the application layer. No part of this 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 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. manages its data transport, including when connections are opened or closed.
skipping to change at line 4017 skipping to change at line 4194
Error handling in TLS is very simple. When an Error handling in TLS is very simple. When an
error is detected, the detecting party sends a message to its error is detected, the detecting party sends a message to its
peer. Upon transmission or receipt of a fatal alert message, both peer. Upon transmission or receipt of a fatal alert message, both
parties MUST immediately close the connection. parties MUST immediately close the connection.
Whenever an implementation encounters a fatal error condition, it Whenever an implementation encounters a fatal error condition, it
SHOULD send an appropriate fatal alert and MUST close the connection SHOULD send an appropriate fatal alert and MUST close the connection
without sending or receiving any additional data. Throughout this without sending or receiving any additional data. Throughout this
specification, when the phrases "terminate the connection" and "abort the specification, when the phrases "terminate the connection" and "abort the
handshake" are used without a specific alert it means that the handshake" are used without a specific alert, it means that the
implementation SHOULD send the alert indicated by the descriptions implementation SHOULD send the alert indicated by the descriptions
below. The phrases "terminate the connection with an X alert" and below. The phrases "terminate the connection with an X alert" and
"abort the handshake with an X alert" mean that the implementation "abort the handshake with an X alert" mean that the implementation
MUST send alert X if it sends any alert. All MUST send alert X if it sends any alert. All
alerts defined below in this section, as well as all unknown alerts, alerts defined below in this section, as well as all unknown alerts,
are universally considered fatal as of TLS 1.3 (see {{alert-protocol}}). are universally considered fatal as of TLS 1.3 (see {{alert-protocol}}).
The implementation SHOULD provide a way to facilitate logging The implementation SHOULD provide a way to facilitate logging
the sending and receiving of alerts. the sending and receiving of alerts.
The following error alerts are defined: The following error alerts are defined:
skipping to change at line 4045 skipping to change at line 4222
: This alert is returned if a record is received which cannot be : This alert is returned if a record is received which cannot be
deprotected. Because AEAD algorithms combine decryption and deprotected. Because AEAD algorithms combine decryption and
verification, and also to avoid side-channel attacks, verification, and also to avoid side-channel attacks,
this alert is used for all deprotection failures. this alert is used for all deprotection failures.
This alert should never be observed in communication between This alert should never be observed in communication between
proper implementations, except when messages were corrupted proper implementations, except when messages were corrupted
in the network. in the network.
record_overflow: record_overflow:
: A TLSCiphertext record was received that had a length more than : A TLSCiphertext record was received that had a length more than
2^14 + 256 bytes, or a record decrypted to a TLSPlaintext record 2<sup>14</sup> + 256 bytes, or a record decrypted to a TLSPlaintext record
with more than 2^14 bytes (or some other negotiated limit). with more than 2<sup>14</sup> bytes (or some other negotiated limit).
This alert should never be observed in communication between This alert should never be observed in communication between
proper implementations, except when messages were corrupted proper implementations, except when messages were corrupted
in the network. in the network.
handshake_failure: handshake_failure:
: Receipt of a "handshake_failure" alert message indicates that the : Receipt of a "handshake_failure" alert message indicates that the
sender was unable to negotiate an acceptable set of security sender was unable to negotiate an acceptable set of security
parameters given the options available. parameters given the options available.
bad_certificate: bad_certificate:
skipping to change at line 4129 skipping to change at line 4306
missing_extension: missing_extension:
: Sent by endpoints that receive a handshake message not containing an : Sent by endpoints that receive a handshake message not containing an
extension that is mandatory to send for the offered TLS version extension that is mandatory to send for the offered TLS version
or other negotiated parameters. or other negotiated parameters.
unsupported_extension: unsupported_extension:
: Sent by endpoints receiving any handshake message containing an extension : Sent by endpoints receiving any handshake message containing an extension
in a ServerHello, HelloRetryRequest, EncryptedExtensions, or Certificate not first offered in the in a ServerHello, HelloRetryRequest, EncryptedExtensions, or Certificate not first offered in the
corresponding ClientHello or CertificateRequest. corresponding ClientHello or CertificateRequest.
<!--[rfced] May we rephrase the definition of this error alert to improve
readability and provide clarity?
Original:
unrecognized_name: Sent by servers when no server exists identified
by the name provided by the client via the "server_name" extension
(see [RFC6066]).
Perhaps:
unrecognized_name: Sent by servers when no server that can be identified
by the name provided by the client via the "server_name" extension
(see [RFC6066]) exists.
-->
unrecognized_name: unrecognized_name:
: Sent by servers when no server exists identified by the name : Sent by servers when no server exists identified by the name
provided by the client via the "server_name" extension provided by the client via the "server_name" extension
(see {{RFC6066}}). (see {{RFC6066}}).
bad_certificate_status_response: bad_certificate_status_response:
: Sent by clients when an invalid or unacceptable OCSP response is : Sent by clients when an invalid or unacceptable OCSP response is
provided by the server via the "status_request" extension provided by the server via the "status_request" extension
(see {{RFC6066}}). (see {{RFC6066}}).
skipping to change at line 4157 skipping to change at line 4348
the client. the client.
general_error: general_error:
: Sent to indicate an error condition in cases when either no : Sent to indicate an error condition in cases when either no
more specific error is available or the senders wishes to conceal more specific error is available or the senders wishes to conceal
the specific error code. Implementations SHOULD use more specific the specific error code. Implementations SHOULD use more specific
errors when available. errors when available.
no_application_protocol: no_application_protocol:
: Sent by servers when a client : Sent by servers when a client
"application_layer_protocol_negotiation" extension advertises "application_layer_protocol_negotiation" extension only advertises
only protocols that the server does not support protocols that the server does not support
(see {{RFC7301}}). (see {{RFC7301}}).
{:br } {:br }
New Alert values are assigned by IANA as described in {{iana-considerations}}. New Alert values are assigned by IANA as described in {{iana-considerations}}.
# Cryptographic Computations # Cryptographic Computations
The TLS handshake establishes one or more input secrets which The TLS handshake establishes one or more input secrets which
are combined to create the actual working keying material, as detailed are combined to create the actual working keying material, as detailed
below. The key derivation process incorporates both the input secrets below. The key derivation process incorporates both the input secrets
skipping to change at line 4184 skipping to change at line 4375
## Key Schedule ## Key Schedule
The key derivation process makes use of the HKDF-Extract and HKDF-Expand The key derivation process makes use of the HKDF-Extract and HKDF-Expand
functions as defined for HKDF {{RFC5869}}, as well as the functions functions as defined for HKDF {{RFC5869}}, as well as the functions
defined below: defined below:
~~~~ ~~~~
HKDF-Expand-Label(Secret, Label, Context, Length) = HKDF-Expand-Label(Secret, Label, Context, Length) =
HKDF-Expand(Secret, HkdfLabel, Length) HKDF-Expand(Secret, HkdfLabel, Length)
~~~~
{: gi="sourcecode"}
Where HkdfLabel is specified as: where HkdfLabel is specified as:
~~~~
struct { struct {
uint16 length = Length; uint16 length = Length;
opaque label<7..255> = "tls13 " + Label; opaque label<7..255> = "tls13 " + Label;
opaque context<0..255> = Context; opaque context<0..255> = Context;
} HkdfLabel; } HkdfLabel;
Derive-Secret(Secret, Label, Messages) = Derive-Secret(Secret, Label, Messages) =
HKDF-Expand-Label(Secret, Label, HKDF-Expand-Label(Secret, Label,
Transcript-Hash(Messages), Hash.length) Transcript-Hash(Messages), Hash.length)
~~~~ ~~~~
{: gi="sourcecode"}
The Hash function used by Transcript-Hash and HKDF is the cipher suite hash The Hash function used by Transcript-Hash and HKDF is the cipher suite hash
algorithm. algorithm.
Hash.length is its output length in bytes. Messages is the concatenation of the Hash.length is its output length in bytes. Messages is the concatenation of the
indicated handshake messages, including the handshake message type indicated handshake messages, including the handshake message type
and length fields, but not including record layer headers. Note that and length fields but not including record layer headers. Note that
in some cases a zero-length Context (indicated by "") is passed to in some cases a zero-length Context (indicated by "") is passed to
HKDF-Expand-Label. The labels specified in this document are all HKDF-Expand-Label. The labels specified in this document are all
ASCII strings and do not include a trailing NUL byte. ASCII strings and do not include a trailing NUL byte.
Any extensions to TLS which use "HKDF-Expand-Label" use the Any extensions to TLS which use "HKDF-Expand-Label" use the
HkdfLabel definition associated with the version of TLS with which HkdfLabel definition associated with the version of TLS with which
they are being used. When used with this specification, that means they are being used. When used with this specification, that means
using HkdfLabel as defined above; when used with DTLS {{?RFC9147}} that using HkdfLabel as defined above; when used with DTLS {{?RFC9147}} that
means using the version defined in {{RFC9147, Section 5.9}}. means using the version defined in {{RFC9147, Section 5.9}}.
skipping to change at line 4230 skipping to change at line 4425
for adding a new secret is to use HKDF-Extract with the Salt 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 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 secret to be added. In this version of TLS 1.3, the two
input secrets are: input secrets are:
- PSK (a pre-shared key established externally or derived from - PSK (a pre-shared key established externally or derived from
the resumption_secret value from a previous connection) the resumption_secret value from a previous connection)
- (EC)DHE shared secret ({{ecdhe-shared-secret-calculation}}) - (EC)DHE shared secret ({{ecdhe-shared-secret-calculation}})
This produces the key schedule shown in the diagram below This produces the key schedule shown in the diagram below
({{key-schedule-diagram}}. In this diagram, the following formatting conventions appl y: ({{key-schedule-diagram}}). In this diagram, the following formatting conventions app ly:
- HKDF-Extract is drawn as taking the Salt argument from the top and - 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 IKM argument from the left, with its output to the bottom and
the name of the output on the right. the name of the output on the right.
- Derive-Secret's Secret argument is indicated by the incoming - Derive-Secret's Secret argument is indicated by the incoming
arrow. For instance, the Early Secret is the Secret for arrow. For instance, the Early Secret is the Secret for
generating the client_early_traffic_secret. generating the client_early_traffic_secret.
- "0" indicates a string of Hash.length bytes set to zero. - "0" indicates a string of Hash.length bytes set to zero.
Note: the key derivation labels use the string "master" even though Note: The key derivation labels use the string "master" even though
the values are referred to as "main" secrets. This mismatch is a the values are referred to as "main" secrets. This mismatch is a
result of renaming the values while retaining compatibility. result of renaming the values while retaining compatibility.
Note: this does not show all the leaf keys such as the separate Note: This does not show all the leaf keys such as the separate
AEAD and IV keys but rather the first set of secrets derived AEAD and IV keys but rather the first set of secrets derived
from the handshake. from the handshake.
~~~~ aasvg ~~~~ aasvg
0 0
| |
v v
PSK --> HKDF-Extract = Early Secret PSK --> HKDF-Extract = Early Secret
| |
+-----> Derive-Secret(., +-----> Derive-Secret(.,
skipping to change at line 4349 skipping to change at line 4544
this section and then re-deriving the traffic keys as described in this section and then re-deriving the traffic keys as described in
{{traffic-key-calculation}}. {{traffic-key-calculation}}.
The next-generation application_traffic_secret is computed as: The next-generation application_traffic_secret is computed as:
~~~~ ~~~~
application_traffic_secret_N+1 = application_traffic_secret_N+1 =
HKDF-Expand-Label(application_traffic_secret_N, HKDF-Expand-Label(application_traffic_secret_N,
"traffic upd", "", Hash.length) "traffic upd", "", Hash.length)
~~~~ ~~~~
{: gi="sourcecode"}
Once client_/server_application_traffic_secret_N+1 and its associated Once client_/server_application_traffic_secret_N+1 and its associated
traffic keys have been computed, implementations SHOULD delete traffic keys have been computed, implementations SHOULD delete
client_/server_application_traffic_secret_N and its associated traffic keys. client_/server_application_traffic_secret_N and its associated traffic keys.
## Traffic Key Calculation ## Traffic Key Calculation
The traffic keying material is generated from the following input values: The traffic keying material is generated from the following input values:
- A secret value - A secret value
- A purpose value indicating the specific value being generated - A purpose value indicating the specific value being generated
- The length of the key being generated - The length of the key being generated
The traffic keying material is generated from an input traffic secret value using: 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_key = HKDF-Expand-Label(Secret, "key", "", key_length)
[sender]_write_iv = HKDF-Expand-Label(Secret, "iv", "", iv_length) [sender]_write_iv = HKDF-Expand-Label(Secret, "iv", "", iv_length)
~~~~ ~~~~
{: gi="sourcecode"}
\[sender] denotes the sending side. The value of Secret for each category \[sender\] denotes the sending side. The value of Secret for each category
of data is shown in the table below. of data is shown in the table below.
| Data Type | Secret | | Data Type | Secret |
|:------------|--------| |:------------|--------|
| 0-RTT Application and EndOfEarlyData | client_early_traffic_secret | | 0-RTT Application and EndOfEarlyData | client_early_traffic_secret |
| Initial Handshake | \[sender]_handshake_traffic_secret | | Initial Handshake | \[sender\]_handshake_traffic_secret |
| Post-Handshake and Application Data | \[sender]_application_traffic_secret_N | | Post-Handshake and Application Data | \[sender\]_application_traffic_secret_N |
{: #traffic-key-table title="Secrets for Traffic Keys"} {: #traffic-key-table title="Secrets for Traffic Keys"}
Alerts are sent with the then current sending key (or as Alerts are sent with the then-current sending key (or as
plaintext if no such key has been established.) plaintext if no such key has been established.)
All the traffic keying material is recomputed whenever the All the traffic keying material is recomputed whenever the
underlying Secret changes (e.g., when changing from the handshake to underlying Secret changes (e.g., when changing from the handshake to
Application Data keys or upon a key update). Application Data keys or upon a key update).
## (EC)DHE Shared Secret Calculation {#ecdhe-shared-secret-calculation} ## (EC)DHE Shared Secret Calculation {#ecdhe-shared-secret-calculation}
### Finite Field Diffie-Hellman ### Finite Field Diffie-Hellman
For finite field groups, a conventional Diffie-Hellman For finite field groups, a conventional Diffie-Hellman
{{KEYAGREEMENT}} computation is performed. {{KEYAGREEMENT}} computation is performed.
The negotiated key (Z) is converted to a byte string by encoding in big-endian form a nd The negotiated key (Z) is converted to a byte string by encoding in big-endian form a nd
left-padded with zeros up to the size of the prime. This byte string is used as the left-padded with zeros up to the size of the prime. This byte string is used as the
shared secret in the key schedule as specified above. shared secret in the key schedule as specified above.
Note that this construction differs from previous versions of TLS which remove Note that this construction differs from previous versions of TLS, which remove
leading zeros. leading zeros.
### Elliptic Curve Diffie-Hellman ### Elliptic Curve Diffie-Hellman
For secp256r1, secp384r1 and secp521r1, ECDH calculations (including key For secp256r1, secp384r1, and secp521r1, ECDH calculations (including key
generation and shared secret calculation) are performed according to generation and shared secret calculation) are performed according to
Sections 5.6.1.2 and 5.7.1.2 of {{KEYAGREEMENT}} using the Elliptic Curve Sections 5.6.1.2 and 5.7.1.2 of {{KEYAGREEMENT}} using the Elliptic Curve
Cryptography Cofactor Diffie-Hellman Primitive. The shared secret Z is Cryptography Cofactor Diffie-Hellman Primitive. The shared secret Z is
the x-coordinate of the ECDH shared secret elliptic curve point represented the x-coordinate of the ECDH shared secret elliptic curve point represented
as an octet string. Note that the octet string Z as output by the as an octet string. Note that the octet string Z as output by the
Field-Element-to-Byte String Conversion specified in Appendix C.2 of Field-Element-to-Byte String Conversion specified in Appendix C.2 of
{{KEYAGREEMENT}} has constant length for any given field; leading zeros {{KEYAGREEMENT}} has constant length for any given field; leading zeros
found in this octet string MUST NOT be truncated. See {{ecdhe-param}} for found in this octet string MUST NOT be truncated. See {{ecdhe-param}} for
requirements on public-key validation. requirements on public-key validation.
skipping to change at line 4426 skipping to change at line 4623
(into u-coordinate point input). (into u-coordinate point input).
- The ECDH shared secret is the result of applying the ECDH scalar multiplication - The ECDH shared secret is the result of applying the ECDH scalar multiplication
function to the secret key (into scalar input) and the peer's public key function to the secret key (into scalar input) and the peer's public key
(into u-coordinate point input). The output is used raw, with no processing. (into u-coordinate point input). The output is used raw, with no processing.
For these curves, implementations SHOULD use the approach specified For these curves, implementations SHOULD use the approach specified
in {{RFC7748}} to calculate the Diffie-Hellman shared secret. in {{RFC7748}} to calculate the Diffie-Hellman shared secret.
Implementations MUST check whether the computed Diffie-Hellman Implementations MUST check whether the computed Diffie-Hellman
shared secret is the all-zero value and abort if so, as described in shared secret is the all-zero value and abort if so, as described in
Section 6 of {{RFC7748}}. If implementors use an alternative {{Section 6 of RFC7748}}. If implementors use an alternative
implementation of these elliptic curves, they SHOULD perform the implementation of these elliptic curves, they SHOULD perform the
additional checks specified in Section 7 of {{RFC7748}}. additional checks specified in {{Section 7 of RFC7748}}.
## Exporters ## Exporters
{{!RFC5705}} defines keying material exporters for TLS in terms of the TLS {{!RFC5705}} defines keying material exporters for TLS in terms of the TLS
pseudorandom function (PRF). This document replaces the PRF with HKDF, thus pseudorandom function (PRF). This document replaces the PRF with HKDF, thus
requiring a new construction. The exporter interface remains the same. requiring a new construction. The exporter interface remains the same.
The exporter value is computed as: The exporter value is computed as:
TLS-Exporter(label, context_value, key_length) = TLS-Exporter(label, context_value, key_length) =
HKDF-Expand-Label(Derive-Secret(Secret, label, ""), HKDF-Expand-Label(Derive-Secret(Secret, label, ""),
"exporter", Hash(context_value), key_length) "exporter", Hash(context_value), key_length)
Where Secret is either the early_exporter_secret or the where Secret is either the early_exporter_secret or the
exporter_secret. Implementations MUST use the exporter_secret unless exporter_secret. Implementations MUST use the exporter_secret unless
explicitly specified by the application. The early_exporter_secret is explicitly specified by the application. The early_exporter_secret is
defined for use in settings where an exporter is needed for 0-RTT data. 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 A separate interface for the early exporter is RECOMMENDED; this avoids
the exporter user accidentally using an early exporter when a regular the exporter user accidentally using an early exporter when a regular
one is desired or vice versa. one is desired or vice versa.
If no context is provided, the context_value is zero length. Consequently, If no context is provided, the context_value is zero length. Consequently,
providing no context computes the same value as providing an empty context. 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 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 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 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 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 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. a context in all exporter computations, though the value could be empty.
Requirements for the format of exporter labels are defined in Section 4 Requirements for the format of exporter labels are defined in {{Section 4
of {{RFC5705}}. of RFC5705}}.
# 0-RTT and Anti-Replay {#anti-replay} # 0-RTT and Anti-Replay {#anti-replay}
As noted in {{zero-rtt-data}} and {{replay-0rtt}}, TLS does not provide inherent repl ay As noted in {{zero-rtt-data}} and {{replay-0rtt}}, TLS does not provide inherent repl ay
protections for 0-RTT data. There are two potential threats to be protections for 0-RTT data. There are two potential threats to be
concerned with: concerned with:
- Network attackers who mount a replay attack by simply duplicating a - Network attackers who mount a replay attack by simply duplicating a
flight of 0-RTT data. flight of 0-RTT data.
- Network attackers who take advantage of client retry behavior - Network attackers who take advantage of client retry behavior
to arrange for the server to receive multiple copies of an application to arrange for the server to receive multiple copies of an application
message. This threat already exists message. This threat already exists
to some extent because clients that value robustness respond to network errors by to some extent because clients that value robustness respond to network errors by
attempting to retry requests. However, 0-RTT adds an additional attempting to retry requests. However, 0-RTT adds an additional
dimension for any server system which does not maintain globally dimension for any server system which does not maintain globally
consistent server state. Specifically, if a server system has consistent server state. Specifically, if a server system has
multiple zones where tickets from zone A will not be accepted in multiple zones where tickets from zone A will not be accepted in
zone B, then an attacker can duplicate a ClientHello and early 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 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 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 data and instead force a full handshake. If the attacker blocks
the ServerHello from A, then the client will complete the the ServerHello from A, then the client will complete the
handshake with B and probably retry the request, leading to duplication on handshake with B and probably retry the request, leading to duplication on
the server system as a whole. the server system as a whole.
The first class of attack can be prevented by sharing state to guarantee that 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 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 replay safety by implementing one of the methods described in this section or
by equivalent means. It is understood, however, that due to operational by equivalent means. However, it is understood that due to operational
concerns not all deployments will maintain state at that level. Therefore, in concerns not all deployments will maintain state at that level. Therefore, in
normal operation, clients will not know which, if any, of these mechanisms 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 servers actually implement and hence MUST only send early data which they deem
safe to be replayed. safe to be replayed.
In addition to the direct effects of replays, there is a class of attacks where 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 even operations normally considered idempotent could be exploited by a large
number of replays (timing attacks, resource limit exhaustion and others, as number of replays (timing attacks, resource limit exhaustion, and others, as
described in {{replay-0rtt}}). Those can be mitigated by ensuring that every described in {{replay-0rtt}}). Those can be mitigated by ensuring that every
0-RTT payload can be replayed only a limited number of times. The server MUST 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 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 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 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 server instances in the deployment. Such a guarantee can be accomplished by
locally recording data from recently received ClientHellos and rejecting locally recording data from recently received ClientHellos and rejecting
repeats, or by any other method that provides the same or a stronger guarantee. 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; The "at most once per server instance" guarantee is a minimum requirement;
servers SHOULD limit 0-RTT replays further when feasible. servers SHOULD limit 0-RTT replays further when feasible.
The second class of attack cannot be prevented at the TLS layer and 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 MUST be dealt with by any application. Note that any application whose
clients implement any kind of retry behavior already needs to clients implement any kind of retry behavior already needs to
implement some sort of anti-replay defense. implement some sort of anti-replay defense.
## Single-Use Tickets {#single-use-tickets} ## Single-Use Tickets {#single-use-tickets}
The simplest form of anti-replay defense is for the server to only 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 allow each session ticket to be used once. For instance, the server
can maintain a database of all outstanding valid tickets, deleting each can maintain a database of all outstanding valid tickets, deleting each
ticket from the database as it is used. If an unknown ticket is ticket from the database as it is used. If an unknown ticket is
provided, the server would then fall back to a full handshake. provided, the server would then fall back to a full handshake.
If the tickets are not self-contained but rather are database keys, If the tickets are not self-contained but rather are database keys,
and the corresponding PSKs are deleted upon use, then connections established and the corresponding PSKs are deleted upon use, then connections established
using PSKs enjoy not only anti-replay protection, but also forward secrecy once 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. 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 This mechanism also improves security for PSK usage when PSK is used without
(EC)DHE. (EC)DHE.
Because this mechanism requires sharing the session database between Because this mechanism requires sharing the session database between
server nodes in environments with multiple distributed servers, server nodes in environments with multiple distributed servers,
it may be hard to achieve high rates of successful PSK 0-RTT it may be hard to achieve high rates of successful PSK 0-RTT
connections when compared to self-encrypted tickets. Unlike connections when compared to self-encrypted tickets. Unlike
session databases, session tickets can successfully do PSK-based session databases, session tickets can successfully do PSK-based
session establishment even without consistent storage, though when session establishment even without consistent storage, though when
skipping to change at line 4572 skipping to change at line 4769
Servers MAY also implement data stores with false positives, such as Servers MAY also implement data stores with false positives, such as
Bloom filters, in which case they MUST respond to apparent replay by Bloom filters, in which case they MUST respond to apparent replay by
rejecting 0-RTT but MUST NOT abort the handshake. rejecting 0-RTT but MUST NOT abort the handshake.
The server MUST derive the storage key only from validated sections The server MUST derive the storage key only from validated sections
of the ClientHello. If the ClientHello contains multiple of the ClientHello. If the ClientHello contains multiple
PSK identities, then an attacker can create multiple ClientHellos PSK identities, then an attacker can create multiple ClientHellos
with different binder values for the less-preferred identity on the with different binder values for the less-preferred identity on the
assumption that the server will not verify it (as recommended assumption that the server will not verify it (as recommended
by {{pre-shared-key-extension}}). by {{pre-shared-key-extension}}).
I.e., if the That is, if the
client sends PSKs A and B but the server prefers A, then 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 attacker can change the binder for B without affecting the binder
for A. If the binder for B is part of the storage key, for A. If the binder for B is part of the storage key,
then this ClientHello will not appear as a duplicate, then this ClientHello will not appear as a duplicate,
which will cause the ClientHello to be accepted, and may which will cause the ClientHello to be accepted, and may
cause side effects such as replay cache pollution, although any cause side effects such as replay cache pollution, although any
0-RTT data will not be decryptable because it will use different 0-RTT data will not be decryptable because it will use different
keys. If the validated binder or the ClientHello.random keys. If the validated binder or the ClientHello.random
is used as the storage key, then this attack is not possible. is used as the storage key, then this attack is not possible.
skipping to change at line 4625 skipping to change at line 4822
likely sent reasonably recently and only accept 0-RTT for such a likely sent reasonably recently and only accept 0-RTT for such a
ClientHello, otherwise falling back to a 1-RTT handshake. ClientHello, otherwise falling back to a 1-RTT handshake.
This is necessary for the ClientHello storage mechanism This is necessary for the ClientHello storage mechanism
described in {{client-hello-recording}} because otherwise the server described in {{client-hello-recording}} because otherwise the server
needs to store an unlimited number of ClientHellos, and is a useful optimization for 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 ClientHell os self-contained single-use tickets because it allows efficient rejection of ClientHell os
which cannot be used for 0-RTT. which cannot be used for 0-RTT.
To implement this mechanism, a server needs to store the time To implement this mechanism, a server needs to store the time
that the server generated the session ticket, offset by an estimate of that the server generated the session ticket, offset by an estimate of
the round-trip time between client and server. I.e., the round-trip time between client and server. That is,
~~~~ ~~~~
adjusted_creation_time = creation_time + estimated_RTT adjusted_creation_time = creation_time + estimated_RTT
~~~~ ~~~~
This value can be encoded in the ticket, thus avoiding the need to This value can be encoded in the ticket, thus avoiding the need to
keep state for each outstanding ticket. The server can determine the 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 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 "ticket_age_add" value from the "obfuscated_ticket_age" parameter in
the client's "pre_shared_key" extension. The server can determine the the client's "pre_shared_key" extension. The server can determine the
expected_arrival_time of the ClientHello as: expected_arrival_time of the ClientHello as:
~~~~ ~~~~
expected_arrival_time = adjusted_creation_time + clients_ticket_age expected_arrival_time = adjusted_creation_time + clients_ticket_age
~~~~ ~~~~
When a new ClientHello is received, the expected_arrival_time is then When a new ClientHello is received, the expected_arrival_time is then
compared against the current server wall clock time and if they differ 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 by more than a certain amount, 0-RTT is rejected, though the 1-RTT
handshake can be allowed to complete. handshake can be allowed to complete.
There are several potential sources of error that might cause There are several potential sources of error that might cause
mismatches between the expected_arrival_time and the measured mismatches between the expected_arrival_time and the measured
time. Variations in client and server clock time. Variations in client and server clock
rates are likely to be minimal, though potentially the absolute rates are likely to be minimal, though potentially the absolute
times may be off by large values. times may be off by large values.
Network propagation delays are the most likely causes of Network propagation delays are the most likely causes of
a mismatch in legitimate values for elapsed time. Both the a mismatch in legitimate values for elapsed time. Both the
skipping to change at line 4676 skipping to change at line 4873
billions of replays in real-world settings. In addition, this billions of replays in real-world settings. In addition, this
freshness checking is only done at the time the ClientHello is freshness checking is only done at the time the ClientHello is
received, and not when subsequent early Application Data records are received, and not when subsequent early Application Data records are
received. After early data is accepted, records may continue to be received. After early data is accepted, records may continue to be
streamed to the server over a longer time period. streamed to the server over a longer time period.
# Compliance Requirements # Compliance Requirements
## Mandatory-to-Implement Cipher Suites ## Mandatory-to-Implement Cipher Suites
<!--[rfced] In Section 9.1, may we format these two items into an
unordered list?
Original:
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].
Perhaps:
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: In the absence of an application profile standard specifying otherwise:
A TLS-compliant application MUST implement the TLS_AES_128_GCM_SHA256 [GCM] 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 cipher suite and SHOULD implement the TLS_AES_256_GCM_SHA384 {{GCM}} and
TLS_CHACHA20_POLY1305_SHA256 {{RFC8439}} cipher suites (see TLS_CHACHA20_POLY1305_SHA256 {{RFC8439}} cipher suites (see
{{cipher-suites}}). {{cipher-suites}}).
A TLS-compliant application MUST support digital signatures with A TLS-compliant application MUST support digital signatures with
rsa_pkcs1_sha256 (for certificates), rsa_pss_rsae_sha256 (for rsa_pkcs1_sha256 (for certificates), rsa_pss_rsae_sha256 (for
CertificateVerify and certificates), and ecdsa_secp256r1_sha256. A CertificateVerify and certificates), and ecdsa_secp256r1_sha256. A
TLS-compliant application MUST support key exchange with secp256r1 TLS-compliant application MUST support key exchange with secp256r1
(NIST P-256) and SHOULD support key exchange with X25519 {{RFC7748}}. (NIST P-256) and SHOULD support key exchange with X25519 {{RFC7748}}.
## Mandatory-to-Implement Extensions {#mti-extensions} ## Mandatory-to-Implement Extensions {#mti-extensions}
In the absence of an application profile standard specifying otherwise, a In the absence of an application profile standard specifying otherwise, a
TLS-compliant application MUST implement the following TLS extensions: TLS-compliant application MUST implement the following TLS extensions:
* Supported Versions ("supported_versions"; {{supported-versions}}) * Supported Versions ("supported_versions"; {{supported-versions}})
* Cookie ("cookie"; {{cookie}}) * Cookie ("cookie"; {{cookie}})
* Signature Algorithms ("signature_algorithms"; {{signature-algorithms}}) * Signature Algorithms ("signature_algorithms"; {{signature-algorithms}})
* Signature Algorithms Certificate ("signature_algorithms_cert"; {{signature-algor ithms}}) * Signature Algorithms Certificate ("signature_algorithms_cert"; {{signature-algor ithms}})
* Negotiated Groups ("supported_groups"; {{supported-groups}}) * Negotiated Groups ("supported_groups"; {{supported-groups}})
* Key Share ("key_share"; {{key-share}}) * Key Share ("key_share"; {{key-share}})
* Server Name Indication ("server_name"; Section 3 of {{RFC6066}}) * Server Name Indication ("server_name"; {{Section 3 of RFC6066}})
All implementations MUST send and use these extensions when offering All implementations MUST send and use these extensions when offering
applicable features: applicable features:
* "supported_versions" is REQUIRED for all ClientHello, ServerHello, and HelloRet ryRequest messages. * "supported_versions" is REQUIRED for all ClientHello, ServerHello, and HelloRet ryRequest messages.
* "signature_algorithms" is REQUIRED for certificate authentication. * "signature_algorithms" is REQUIRED for certificate authentication.
* "supported_groups" is REQUIRED for ClientHello messages using * "supported_groups" is REQUIRED for ClientHello messages using
DHE or ECDHE key exchange. DHE or ECDHE key exchange.
* "key_share" is REQUIRED for DHE or ECDHE key exchange. * "key_share" is REQUIRED for DHE or ECDHE key exchange.
* "pre_shared_key" is REQUIRED for PSK key agreement. * "pre_shared_key" is REQUIRED for PSK key agreement.
skipping to change at line 4792 skipping to change at line 5023
the ClientHello arbitrarily. In particular, the values sent in the ServerHello 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 ServerHello format might change, and the TLSCiphertext format
might change. might change.
The design of TLS 1.3 was constrained by widely deployed non-compliant TLS The design of TLS 1.3 was constrained by widely deployed non-compliant TLS
middleboxes (see {{middlebox}}); however, it does not relax the invariants. middleboxes (see {{middlebox}}); however, it does not relax the invariants.
Those middleboxes continue to be non-compliant. Those middleboxes continue to be non-compliant.
# Security Considerations # Security Considerations
Security issues are discussed throughout this memo, especially in Security issues are discussed throughout this memo, especially in Appendices
{{implementation-notes}}, {{backward-compatibility}}, and {{security-analysis}}. {{implementation-notes}}{: format="counter"}, {{backward-compatibility}}{: format="co
unter"}, and {{security-analysis}}{: format="counter"}.
# IANA Considerations # IANA Considerations
This document uses several registries that were originally created in This document uses several registries that were originally created in
{{RFC4346}} and updated in {{RFC8446}} and {{?RFC8447}}. The changes {{RFC4346}} and updated in {{RFC8446}} and {{?RFC8447}}. The changes
between {{RFC8446}} and {{RFC8447}} this document are described in {{bis-changes}}. between {{RFC8446}}, {{RFC8447}}, and this document are described in {{bis-changes}}.
IANA has updated these to reference this document. IANA has replaced references to these RFCs with references to this document. The regi
stries and their allocation policies are below:
The registries and their allocation policies are below:
- TLS Cipher Suites registry: values with the first byte in the range - "TLS Cipher Suites" registry: Values with the first byte in the range
0-254 (decimal) are assigned via Specification Required {{RFC8126}}. 0-254 (decimal) are assigned via Specification Required {{RFC8126}}.
Values with the first byte 255 (decimal) are reserved for Private Values with the first byte 255 (decimal) are reserved for Private
Use {{RFC8126}}. Use {{RFC8126}}.
IANA has added the cipher suites listed in {{cipher-suites}} to IANA has added the cipher suites listed in {{cipher-suites}} to
the registry. The "Value" and "Description" columns are taken from the table. 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 The "DTLS-OK" and "Recommended" columns are both marked as "Y" for each new
cipher suite. cipher suite.
- TLS ContentType registry: Future values are allocated via - "TLS ContentType" registry: Future values are allocated via
Standards Action {{RFC8126}}. Standards Action {{RFC8126}}.
- TLS Alerts registry: Future values are allocated via Standards - "TLS Alerts" registry: Future values are allocated via Standards
Action {{RFC8126}}. IANA [is requested to/has] populated this registry Action {{RFC8126}}. IANA has populated this registry
with the values from {{alert-messages-appendix}}. The with the values from {{alert-messages-appendix}}. The
"DTLS-OK" column is marked as "Y" for all such values. "DTLS-OK" column is marked as "Y" for all such values.
Values marked as "_RESERVED" have comments Values marked as "_RESERVED" have comments
describing their previous usage. describing their previous usage.
- TLS HandshakeType registry: Future values are allocated via - "TLS HandshakeType" registry: Future values are allocated via
Standards Action {{RFC8126}}. IANA has updated this registry Standards Action {{RFC8126}}. IANA has updated this registry
to rename item 4 from "NewSessionTicket" to "new_session_ticket" to rename item 4 from "NewSessionTicket" to "new_session_ticket"
and populated this registry with the values from {{handshake-protocol-appendix}}. and populated this registry with the values from {{handshake-protocol-appendix}}.
The "DTLS-OK" column is marked as "Y" for all such values. The "DTLS-OK" column is marked as "Y" for all such values.
Values marked "_RESERVED" have comments describing their previous or Values marked as "_RESERVED" have comments describing their previous or
temporary usage. temporary usage.
This document also uses the TLS ExtensionType Values registry originally created in This document also uses the "TLS ExtensionType Values" registry originally created in
{{RFC4366}}. IANA has updated it to reference this document. Changes to the {{RFC4366}}. IANA has updated it to reference this document. Changes to the
registry follow: registry follow:
- IANA has updated the registration policy as follows: - IANA has updated the registration policy as follows:
Values with the first byte in the range 0-254 (decimal) are assigned Values with the first byte in the range 0-254 (decimal) are assigned
via Specification Required [RFC8126]. Values with the first byte via Specification Required {{RFC8126}}. Values with the first byte
255 (decimal) are reserved for Private Use [RFC8126]. 255 (decimal) are reserved for Private Use {{RFC8126}}.
- IANA has updated this registry to include the - IANA has updated this registry to include the
"key_share", "pre_shared_key", "psk_key_exchange_modes", "key_share", "pre_shared_key", "psk_key_exchange_modes",
"early_data", "cookie", "supported_versions", "early_data", "cookie", "supported_versions",
"certificate_authorities", "oid_filters", "post_handshake_auth", and "signature_alg orithms_cert" extensions with the values defined in this document and the "Recommend ed" value of "Y". "certificate_authorities", "oid_filters", "post_handshake_auth", and "signature_alg orithms_cert" extensions with the values defined in this document and the "Recommend ed" value of "Y".
- IANA has updated this registry to include a "TLS - IANA has updated this registry to include a "TLS
1.3" column which lists the messages in which the extension may 1.3" column, which lists the messages in which the extension may
appear. This column has been appear. This column has been
initially populated from the table in {{extensions}}, initially populated from the table in {{extensions}},
with any extension not listed there marked as "-" to indicate that with any extension not listed there marked as "-" to indicate that
it is not used by TLS 1.3. it is not used by TLS 1.3.
This document updates two entries in the TLS Certificate Types registry This document updates two entries in the "TLS Certificate Types" registry
originally created in {{RFC6091}} and updated in {{RFC8447}}. IANA has originally created in {{RFC6091}} and updated in {{RFC8447}}. IANA has
updated the entry for value 1 to have the name "OpenPGP_RESERVED", updated the entry for value 1 to have the name "OpenPGP_RESERVED",
"Recommended" value "N", and comment "Used in TLS versions prior "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 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". "X509", "Recommended" value "Y", and comment "Was X.509 before TLS 1.3.".
This document updates an entry in the TLS Certificate Status Types This document updates an entry in the "TLS Certificate Status Types"
registry originally created in {{RFC6961}}. IANA has updated the entry registry originally created in {{RFC6961}}. IANA has updated the entry
for value 2 to have the name "ocsp_multi_RESERVED" and comment "Used for value 2 to have the name "ocsp_multi_RESERVED" and comment "Used
in TLS versions prior to 1.3". in TLS versions prior to 1.3.".
This document updates two entries in the TLS Supported Groups <!--[rfced] FYI, we have updated the parenthetical text as follows to
better describe the "TLS Supported Groups" registry. Please review and
let us know of any objections.
Original:
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].
Current:
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]).
-->
This document updates two entries in the "TLS Supported Groups"
registry (created under a different name by {{RFC4492}}; now maintained registry (created under a different name by {{RFC4492}}; now maintained
by {{RFC8422}}) and updated by {{RFC7919}} and {{RFC8447}}. The entries by {{RFC8422}} and updated by {{RFC7919}} and {{RFC8447}}). The entries
for values 29 and 30 (x25519 and x448) have been updated to also for values 29 and 30 (x25519 and x448) have been updated to also
refer to this document. refer to this document.
In addition, this document defines two new registries that are maintained In addition, this document defines two new registries that are maintained
by IANA: by IANA:
- TLS SignatureScheme registry: Values with the first byte in the range - "TLS SignatureScheme" registry: Values with the first byte in the range
0-253 (decimal) are assigned via Specification Required {{RFC8126}}. 0-253 (decimal) are assigned via Specification Required {{RFC8126}}.
Values with the first byte 254 or 255 (decimal) are reserved for Private 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 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 second byte in the range 0-3 that are not currently allocated are reserved for
backward compatibility. backward compatibility.
This registry has a "Recommended" column. This registry has a "Recommended" column.
The registry has been initially populated with the values described in The registry has been initially populated with the values described in
{{signature-algorithms}}. The following values are marked as {{signature-algorithms}}. The following values are marked as
"Recommended": ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, "Recommended": ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384,
rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, 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. rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, and ed25519.
The The
"Recommended" column is assigned a value of "N" unless explicitly "Recommended" column is assigned a value of "N" unless explicitly
requested, and adding a value with a "Recommended" value of "Y" requested, and adding a value with a "Recommended" value of "Y"
requires Standards Action {{RFC8126}}. IESG Approval is REQUIRED requires Standards Action {{RFC8126}}. IESG Approval is REQUIRED
for a Y->N transition. for a Y->N transition.
- TLS PskKeyExchangeMode registry: Values in the - "TLS PskKeyExchangeMode" registry: Values in the
range 0-253 (decimal) are assigned via Specification Required range 0-253 (decimal) are assigned via Specification Required
[RFC8126]. The values 254 and 255 (decimal) are {{RFC8126}}. The values 254 and 255 (decimal) are
reserved for Private Use [RFC8126]. This registry has a reserved for Private Use {{RFC8126}}. This registry has a
"Recommended" column. The registry has been initially "Recommended" column. The registry has been initially
populated with psk_ke (0) and psk_dhe_ke (1). Both are marked as populated with psk_ke (0) and psk_dhe_ke (1). Both are marked as
"Recommended". The "Recommended". The
"Recommended" column is assigned a value of "N" unless explicitly "Recommended" column is assigned a value of "N" unless explicitly
requested, and adding a value with a "Recommended" value of "Y" requested, and adding a value with a "Recommended" value of "Y"
requires Standards Action {{RFC8126}}. IESG Approval is REQUIRED requires Standards Action {{RFC8126}}. IESG Approval is REQUIRED
for a Y->N transition. for a Y->N transition.
## Changes for this RFC {#bis-changes} ## Changes for this RFC {#bis-changes}
IANA [shall update/has updated] all references to RFC 8446 in the IANA IANA has updated all references to {{RFC8446}} in the IANA
registries with references to this document. registries with references to this document.
IANA [shall rename/has renamed] the "extended_master_secret" value IANA has renamed the "extended_master_secret" value
in the TLS ExtensionType Values registry to "extended_main_secret". in the "TLS ExtensionType Values" registry to "extended_main_secret".
IANA [shall create/has created] a value for the "general_error" IANA has created a value for the "general_error"
alert in the TLS Alerts Registry with the value given in {{alert-protocol}}. alert in the "TLS Alerts" registry with the value given in {{alert-protocol}}.
--- back --- back
# State Machine # State Machine
This appendix provides a summary of the legal state transitions for the This appendix provides a summary of the legal state transitions for the
client and server handshakes. State names (in all capitals, e.g., client and server handshakes. State names (in all capitals, e.g.,
START) have no formal meaning but are provided for ease of START) have no formal meaning but are provided for ease of
comprehension. Actions which are taken only in certain circumstances are comprehension. Actions which are taken only in certain circumstances are
indicated in []. The notation "K_{send,recv} = foo" means "set the send/recv indicated in \[\]. The notation "K_{send,recv} = foo" means "set the send/recv
key to the given key". key to the given key".
## Client ## Client
~~~~ aasvg ~~~~ aasvg
START <----+ START <----+
Send ClientHello | | Recv HelloRetryRequest Send ClientHello | | Recv HelloRetryRequest
[K_send = early data] | | [K_send = early data] | |
v | v |
+-> WAIT_SH ----+ +-> WAIT_SH ----+
skipping to change at line 5351 skipping to change at line 5595
(0xFFFF) (0xFFFF)
} NamedGroup; } NamedGroup;
struct { struct {
NamedGroup named_group_list<2..2^16-1>; NamedGroup named_group_list<2..2^16-1>;
} NamedGroupList; } NamedGroupList;
Values within "obsolete_RESERVED" ranges are used in previous versions Values within "obsolete_RESERVED" ranges are used in previous versions
of TLS and MUST NOT be offered or negotiated by TLS 1.3 implementations. of TLS and MUST NOT be offered or negotiated by TLS 1.3 implementations.
The obsolete curves have various known/theoretical weaknesses or have The obsolete curves have various known/theoretical weaknesses or have
had very little usage, in some cases only due to unintentional had very little usage, in some cases, only due to unintentional
server configuration issues. They are no longer considered appropriate server configuration issues. They are no longer considered appropriate
for general use and should be assumed to be potentially unsafe. The set for general use and should be assumed to be potentially unsafe. The set
of curves specified here is sufficient for interoperability with all of curves specified here is sufficient for interoperability with all
currently deployed and properly configured TLS implementations. currently deployed and properly configured TLS implementations.
### Server Parameters Messages ### Server Parameters Messages
opaque DistinguishedName<1..2^16-1>; opaque DistinguishedName<1..2^16-1>;
struct { struct {
skipping to change at line 5457 skipping to change at line 5701
~~~ ~~~
CipherSuite TLS_AEAD_HASH = VALUE; CipherSuite TLS_AEAD_HASH = VALUE;
~~~ ~~~
| Component | Contents | | Component | Contents |
|:----------|:---------| |:----------|:---------|
| TLS | The string "TLS" | | TLS | The string "TLS" |
| AEAD | The AEAD algorithm used for record protection | | AEAD | The AEAD algorithm used for record protection |
| HASH | The hash algorithm used with HKDF and Transcript-Hash | | HASH | The hash algorithm used with HKDF and Transcript-Hash |
| VALUE | The two byte ID assigned for this cipher suite | | VALUE | The two-byte ID assigned for this cipher suite |
{: #cs-components title="Cipher Suite Name Structure"} {: #cs-components title="Cipher Suite Name Structure"}
This specification defines the following cipher suites for use with TLS 1.3. This specification defines the following cipher suites for use with TLS 1.3.
| Description | Value | | Description | Value |
|:--------------------------------|:------------| |:--------------------------------|:------------|
| TLS_AES_128_GCM_SHA256 | {0x13,0x01} | | TLS_AES_128_GCM_SHA256 | {0x13,0x01} |
| TLS_AES_256_GCM_SHA384 | {0x13,0x02} | | TLS_AES_256_GCM_SHA384 | {0x13,0x02} |
| TLS_CHACHA20_POLY1305_SHA256 | {0x13,0x03} | | TLS_CHACHA20_POLY1305_SHA256 | {0x13,0x03} |
| TLS_AES_128_CCM_SHA256 | {0x13,0x04} | | TLS_AES_128_CCM_SHA256 | {0x13,0x04} |
skipping to change at line 5493 skipping to change at line 5737
# Implementation Notes # Implementation Notes
The TLS protocol cannot prevent many common security mistakes. This appendix The TLS protocol cannot prevent many common security mistakes. This appendix
provides several recommendations to assist implementors. provides several recommendations to assist implementors.
{{?RFC8448}} provides test vectors for TLS 1.3 handshakes. {{?RFC8448}} provides test vectors for TLS 1.3 handshakes.
## Random Number Generation and Seeding ## Random Number Generation and Seeding
TLS requires a cryptographically secure pseudorandom number generator (CSPRNG). TLS requires a cryptographically secure pseudorandom number generator (CSPRNG).
A performant and appropriately-secure CSPRNG is provided by most operating A performant and appropriately secure CSPRNG is provided by most operating
systems or can be sourced from a cryptographic library. systems or can be sourced from a cryptographic library.
It is RECOMMENDED to use an existing CSPRNG implementation in It is RECOMMENDED to use an existing CSPRNG implementation in
preference to crafting a new one. Many adequate cryptographic libraries preference to crafting a new one. Many adequate cryptographic libraries
are already available under favorable license terms. Should those prove are already available under favorable license terms. Should those prove
unsatisfactory, {{RFC4086}} provides guidance on the generation of random values. unsatisfactory, {{RFC4086}} provides guidance on the generation of random values.
TLS uses random values (1) in public protocol fields such as the TLS uses random values (1) in public protocol fields such as the
public Random values in the ClientHello and ServerHello and (2) to public Random values in the ClientHello and ServerHello and (2) to
generate keying material. With a properly functioning CSPRNG, this generate keying material. With a properly functioning CSPRNG, this
does not present a security problem, as it is not feasible to determine does not present a security problem, as it is not feasible to determine
skipping to change at line 5533 skipping to change at line 5777
indication from an application profile, certificates should indication from an application profile, certificates should
always be verified to ensure proper signing by a trusted certificate authority 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. (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. Users should be able to view information about the certificate and trust anchor.
Applications SHOULD also enforce minimum and maximum key sizes. For example, Applications SHOULD also enforce minimum and maximum key sizes. For example,
certification paths containing keys or signatures weaker than 2048-bit RSA or certification paths containing keys or signatures weaker than 2048-bit RSA or
224-bit ECDSA are not appropriate for secure applications. 224-bit ECDSA are not appropriate for secure applications.
Note that it is common practice in some protocols to use the same 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 certificate in both client and server modes. This setting has not been
extensively analyzed and it is the responsibility of the higher level extensively analyzed, and it is the responsibility of the higher-level
protocol to ensure there is no ambiguity in this case about the protocol to ensure there is no ambiguity in this case about the
higher-level semantics. higher-level semantics.
## Implementation Pitfalls ## Implementation Pitfalls
Implementation experience has shown that certain parts of earlier TLS Implementation experience has shown that certain parts of earlier TLS
specifications are not easy to understand and have been a source of specifications are not easy to understand and have been a source of
interoperability and security problems. Many of these areas have been clarified 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 in this document, but this appendix contains a short list of the most important
things that require special attention from implementors. things that require special attention from implementors.
TLS protocol issues: TLS protocol issues:
- Do you correctly handle handshake messages that are fragmented to - Do you correctly handle handshake messages that are fragmented to
multiple TLS records (see {{record-layer}})? Do you correctly handle multiple TLS records (see {{record-layer}})? Do you correctly handle
corner cases like a ClientHello that is split into several small fragments? Do corner cases like a ClientHello that is split into several small fragments? Do
you fragment handshake messages that exceed the maximum fragment you fragment handshake messages that exceed the maximum fragment
size? In particular, the Certificate and CertificateRequest size? In particular, the Certificate and CertificateRequest
handshake messages can be large enough to require fragmentation. handshake messages can be large enough to require fragmentation.
Certificate compression as defined in {{?RFC8879}} can be used Certificate compression as defined in {{?RFC8879}} can be used
to reduce the risk of fragmentation. to reduce the risk of fragmentation.
- Do you ignore the TLS record layer version number in all unencrypted TLS - Do you ignore the TLS record layer version number in all unencrypted TLS
records (see {{backward-compatibility}})? records (see {{backward-compatibility}})?
- Have you ensured that all support for SSL, RC4, EXPORT ciphers, and - Have you ensured that all support for SSL, RC4, EXPORT ciphers, and
MD5 (via the "signature_algorithms" extension) is completely removed from MD5 (via the "signature_algorithms" extension) is completely removed from
all possible configurations that support TLS 1.3 or later, and that all possible configurations that support TLS 1.3 or later, and that
attempts to use these obsolete capabilities fail correctly? attempts to use these obsolete capabilities fail correctly
(see {{backward-compatibility}})? (see {{backward-compatibility}})?
- Do you handle TLS extensions in ClientHellos correctly, including - Do you handle TLS extensions in ClientHellos correctly, including
unknown extensions? unknown extensions?
- When the server has requested a client certificate but no - When the server has requested a client certificate but no
suitable certificate is available, do you correctly send an empty suitable certificate is available, do you correctly send an empty
Certificate message, instead of omitting the whole message (see Certificate message, instead of omitting the whole message (see
{{certificate}})? {{certificate}})?
skipping to change at line 5604 skipping to change at line 5848
- When using Diffie-Hellman key exchange, do you correctly preserve - When using Diffie-Hellman key exchange, do you correctly preserve
leading zero bytes in the negotiated key (see {{finite-field-diffie-hellman}})? leading zero bytes in the negotiated key (see {{finite-field-diffie-hellman}})?
- Does your TLS client check that the Diffie-Hellman parameters sent - Does your TLS client check that the Diffie-Hellman parameters sent
by the server are acceptable (see {{ffdhe-param}})? by the server are acceptable (see {{ffdhe-param}})?
- Do you use a strong and, most importantly, properly seeded random number - Do you use a strong and, most importantly, properly seeded random number
generator (see {{random-number-generation-and-seeding}}) when generating Diffie-Hel lman generator (see {{random-number-generation-and-seeding}}) when generating Diffie-Hel lman
private values, the ECDSA "k" parameter, and other security-critical values? private values, the ECDSA "k" parameter, and other security-critical values?
It is RECOMMENDED that implementations implement "deterministic ECDSA" It is RECOMMENDED that implementations implement "deterministic ECDSA"
as specified in {{!RFC6979}}. Note that purely deterministic ECC signatures such as as specified in {{!RFC6979}}. Note that purely deterministic Elliptic Curve Cryptog raphy (ECC) signatures such as
deterministic ECDSA and EdDSA may be vulnerable to certain side-channel and fault deterministic ECDSA and EdDSA may be vulnerable to certain side-channel and fault
injection attacks in easily accessible IoT devices. injection attacks in easily accessible Internet of Things (IoT) devices.
- Do you zero-pad Diffie-Hellman public key values and shared - Do you zero-pad Diffie-Hellman public key values and shared
secrets to the group size (see {{ffdhe-param}} and {{finite-field-diffie-hellman}}) ? secrets to the group size (see Sections {{ffdhe-param}}{: format="counter"} and {{f inite-field-diffie-hellman}}{: format="counter"})?
- Do you verify signatures after making them, to protect against RSA-CRT - Do you verify signatures after making them to protect against RSA-CRT
key leaks {{FW15}}? key leaks {{FW15}}?
## Client and Server Tracking Prevention {#client-tracking} ## Client and Server Tracking Prevention {#client-tracking}
Clients SHOULD NOT reuse a ticket for multiple connections. Reuse Clients SHOULD NOT reuse a ticket for multiple connections. Reuse
of a ticket allows passive observers to correlate different connections. of a ticket allows passive observers to correlate different connections.
Servers that issue tickets SHOULD offer at least as many tickets 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 as the number of connections that a client might use; for example, a web browser
using HTTP/1.1 {{RFC9112}} might open six connections to a server. Servers SHOULD using HTTP/1.1 {{RFC9112}} might open six connections to a server. Servers SHOULD
issue new tickets with every connection. This ensures that clients are issue new tickets with every connection. This ensures that clients are
always able to use a new ticket when creating a new connection. always able to use a new ticket when creating a new connection.
Offering a ticket to a server additionally allows the server to correlate Offering a ticket to a server additionally allows the server to correlate
different connections. This is possible independent of ticket reuse. Client different connections. This is possible independent of ticket reuse. Client
applications SHOULD NOT offer tickets across connections that are meant to be applications SHOULD NOT offer tickets across connections that are meant to be
uncorrelated. For example, {{FETCH}} defines network partition keys to separate uncorrelated. For example, {{FETCH}} defines network partition keys to separate
cache lookups in web browsers. cache lookups in web browsers.
Clients and Servers SHOULD NOT reuse a key share for multiple connections. Reuse 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 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. 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 It is RECOMMENDED that the labels for external identities be selected so that they
do not provide additional information about the identity of the do not provide additional information about the identity of the
user. For instance, if the label includes an e-mail address, then user. For instance, if the label includes an email address, then
this trivially identifies the user to a passive attacker, this trivially identifies the user to a passive attacker,
unlike the client's Certificate, which is encrypted. There are a number of potential 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 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) (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. using the Encrypted Client Hello extension {{PRE-RFC9849}}.
If an external PSK identity is used for multiple connections, then it If an external PSK identity is used for multiple connections, then it
will generally be possible for an external observer to track will generally be possible for an external observer to track
clients and/or servers across connections. Use of the clients and/or servers across connections. Use of the
Encrypted Client Hello {{?I-D.ietf-tls-esni}} extension can Encrypted Client Hello {{PRE-RFC9849}} extension can
mitigate this risk, as can mechanisms external to TLS that mitigate this risk, as can mechanisms external to TLS that
rotate or encrypt the PSK identity. rotate or encrypt the PSK identity.
## Unauthenticated Operation ## Unauthenticated Operation
Previous versions of TLS offered explicitly unauthenticated cipher suites based Previous versions of TLS offered explicitly unauthenticated cipher suites based
on anonymous Diffie-Hellman. These modes have been deprecated in TLS 1.3. 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 However, it is still possible to negotiate parameters that do not provide
verifiable server authentication by several methods, including: verifiable server authentication by several methods, including:
skipping to change at line 5668 skipping to change at line 5912
- Using a public key contained in a certificate but without - Using a public key contained in a certificate but without
validation of the certificate chain or any of its contents. validation of the certificate chain or any of its contents.
Either technique used alone is vulnerable to man-in-the-middle attacks Either technique used alone is vulnerable to man-in-the-middle attacks
and therefore unsafe for general use. However, it is also possible to and therefore unsafe for general use. However, it is also possible to
bind such connections to an external authentication mechanism via bind such connections to an external authentication mechanism via
out-of-band validation of the server's public key, trust on first out-of-band validation of the server's public key, trust on first
use, or a mechanism such as channel bindings (though the use, or a mechanism such as channel bindings (though the
channel bindings described in {{RFC5929}} are not defined for channel bindings described in {{RFC5929}} are not defined for
TLS 1.3). If no such mechanism is used, then the connection has no protection 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 against an active man-in-the-middle attack; applications MUST NOT use TLS
in such a way absent explicit configuration or a specific application in such a way absent explicit configuration or a specific application
profile. profile.
# Updates to TLS 1.2 {#update-tls12} # Updates to TLS 1.2 {#update-tls12}
To align with the names used this document, the following terms from To align with the names used this document, the following terms from
{{RFC5246}} are renamed: {{RFC5246}} are renamed:
* The master secret, computed in Section 8.1 of {{RFC5246}}, is renamed to * 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 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 structures, instead of master_secret. However, the label parameter to the PRF
function is left unchanged for compatibility. function is left unchanged for compatibility.
* The premaster secret is renamed to the preliminary secret. It is referred to * The premaster secret is renamed to the preliminary secret. It is referred to
as preliminary_secret in formulas and structures, instead of as preliminary_secret in formulas and structures, instead of
pre_master_secret. pre_master_secret.
* The PreMasterSecret and EncryptedPreMasterSecret structures, defined in * The PreMasterSecret and EncryptedPreMasterSecret structures, defined in
Section 7.4.7.1 of {{RFC5246}}, are renamed to PreliminarySecret and {{Section 7.4.7.1 of RFC5246}}, are renamed to PreliminarySecret and
EncryptedPreliminarySecret, respectively. EncryptedPreliminarySecret, respectively.
Correspondingly, the extension defined in {{RFC7627}} is renamed to the Correspondingly, the extension defined in {{RFC7627}} is renamed to the
"Extended Main Secret" extension. The extension code point is renamed to "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 "extended_main_secret". The label parameter to the PRF function in {{Section 4 of
{{RFC7627}} is left unchanged for compatibility. RFC7627}} is left unchanged for compatibility.
# Backward Compatibility # Backward Compatibility
The TLS protocol provides a built-in mechanism for version negotiation between The TLS protocol provides a built-in mechanism for version negotiation between
endpoints potentially supporting different versions of TLS. endpoints potentially supporting different versions of TLS.
TLS 1.x and SSL 3.0 use compatible ClientHello messages. Servers can also handle 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 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 remains compatible and there is at least one protocol version supported by
both the client and the server. both the client and the server.
skipping to change at line 5764 skipping to change at line 6008
TLS extensions or versions which they are not aware of. Interoperability TLS extensions or versions which they are not aware of. Interoperability
with buggy servers is a complex topic beyond the scope of this document. with buggy servers is a complex topic beyond the scope of this document.
Multiple connection attempts may be required to negotiate Multiple connection attempts may be required to negotiate
a backward-compatible connection; however, this practice is vulnerable a backward-compatible connection; however, this practice is vulnerable
to downgrade attacks and is NOT RECOMMENDED. to downgrade attacks and is NOT RECOMMENDED.
## Negotiating with an Older Client ## Negotiating with an Older Client
A TLS server can also receive a ClientHello indicating a version number smaller A TLS server can also receive a ClientHello indicating a version number smaller
than its highest supported version. If the "supported_versions" extension than its highest supported version. If the "supported_versions" extension
is present, the server MUST negotiate using that extension as described in is present, the server MUST negotiate using that extension, as described in
{{supported-versions}}. If the "supported_versions" extension is not {{supported-versions}}. If the "supported_versions" extension is not
present, the server MUST negotiate the minimum of ClientHello.legacy_version 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 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. 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 If the "supported_versions" extension is absent and the server only supports
versions greater than ClientHello.legacy_version, the server MUST abort the handshake versions greater than ClientHello.legacy_version, the server MUST abort the handshake
with a "protocol_version" alert. with a "protocol_version" alert.
Note that earlier versions of TLS did not clearly specify the record layer Note that earlier versions of TLS did not clearly specify the record layer
version number value in all cases (TLSPlaintext.legacy_record_version). Servers version number value in all cases (TLSPlaintext.legacy_record_version). Servers
will receive various TLS 1.x versions in this field, but its value will receive various TLS 1.x versions in this field, but its value
MUST always be ignored. MUST always be ignored.
skipping to change at line 5821 skipping to change at line 6065
handshake flight. If offering early data, the record is placed handshake flight. If offering early data, the record is placed
immediately after the first ClientHello. immediately after the first ClientHello.
- The server sends a dummy change_cipher_spec record immediately - The server sends a dummy change_cipher_spec record immediately
after its first handshake message. This may either be after a after its first handshake message. This may either be after a
ServerHello or a HelloRetryRequest. ServerHello or a HelloRetryRequest.
When put together, these changes make the TLS 1.3 handshake resemble When put together, these changes make the TLS 1.3 handshake resemble
TLS 1.2 session resumption, which improves the chance of successfully TLS 1.2 session resumption, which improves the chance of successfully
connecting through middleboxes. This "compatibility mode" is partially connecting through middleboxes. This "compatibility mode" is partially
negotiated: the client can opt to provide a session ID or not, 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 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, 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 but if the client sends a non-empty session ID, the server MUST send
the change_cipher_spec as described in this appendix. the change_cipher_spec, as described in this appendix.
## Security Restrictions Related to Backward Compatibility {#backward-compatibility-s ecurity} ## Security Restrictions Related to Backward Compatibility {#backward-compatibility-s ecurity}
Implementations negotiating the use of older versions of TLS SHOULD prefer Implementations negotiating the use of older versions of TLS SHOULD prefer
forward secret and AEAD cipher suites, when available. forward secret and AEAD cipher suites, when available.
The security of RC4 cipher suites is considered insufficient for the reasons The security of RC4 cipher suites is considered insufficient for the reasons
cited in {{RFC7465}}. Implementations MUST NOT offer or negotiate RC4 cipher suites cited in {{RFC7465}}. Implementations MUST NOT offer or negotiate RC4 cipher suites
for any version of TLS for any reason. for any version of TLS for any reason.
Old versions of TLS permitted the use of very low strength ciphers. 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 Ciphers with a strength less than 112 bits MUST NOT be offered or
negotiated for any version of TLS for any reason. negotiated for any version of TLS for any reason.
The security of SSL 2.0 {{SSL2}}, SSL 3.0 {{?RFC6101}}, TLS 1.0 The security of SSL 2.0 {{SSL2}}, SSL 3.0 {{?RFC6101}}, TLS 1.0
{{?RFC2246}}, and TLS 1.1 {{RFC4346}} are considered insufficient for {{?RFC2246}}, and TLS 1.1 {{RFC4346}} are considered insufficient for
the reasons enumerated in {{RFC6176}}, {{RFC7568}}, and {{RFC8996}} the reasons enumerated in {{RFC6176}}, {{RFC7568}}, and {{RFC8996}},
and they MUST NOT be negotiated for any reason. and they MUST NOT be negotiated for any reason.
Implementations MUST NOT send an SSL version 2.0 compatible CLIENT-HELLO. 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 compatib le Implementations MUST NOT negotiate TLS 1.3 or later using an SSL version 2.0 compatib le
CLIENT-HELLO. Implementations are NOT RECOMMENDED to accept an SSL version 2.0 compat ible CLIENT-HELLO. Implementations are NOT RECOMMENDED to accept an SSL version 2.0 compat ible
CLIENT-HELLO to negotiate older versions of TLS. CLIENT-HELLO to negotiate older versions of TLS.
Implementations MUST NOT send a ClientHello.legacy_version or ServerHello.legacy_vers ion Implementations MUST NOT send a ClientHello.legacy_version or ServerHello.legacy_vers ion
set to 0x0300 or less. Any endpoint receiving a Hello message with set to 0x0300 or less. Any endpoint receiving a Hello message with
ClientHello.legacy_version or ServerHello.legacy_version set to 0x0300 MUST ClientHello.legacy_version or ServerHello.legacy_version set to 0x0300 MUST
abort the handshake with a "protocol_version" alert. abort the handshake with a "protocol_version" alert.
Implementations MUST NOT send any records with a version less than 0x0300. Implementations MUST NOT send any records with a version less than 0x0300.
Implementations SHOULD NOT accept 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). (but may inadvertently do so if the record version number is ignored completely).
Implementations MUST NOT use the Truncated HMAC extension, defined in Implementations MUST NOT use the Truncated HMAC extension, defined in
Section 7 of [RFC6066], as it is not applicable to AEAD algorithms and has {{Section 7 of RFC6066}}, as it is not applicable to AEAD algorithms and has
been shown to be insecure in some scenarios. been shown to be insecure in some scenarios.
# Overview of Security Properties {#security-analysis} # Overview of Security Properties {#security-analysis}
A complete security analysis of TLS is outside the scope of this document. 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 In this appendix, we provide an informal description of the desired properties
as well as references to more detailed work in the research literature as well as references to more detailed work in the research literature
which provides more formal definitions. which provides more formal definitions.
We cover properties of the handshake separately from those of the record layer. We cover properties of the handshake separately from those of the record layer.
## Handshake {#security-handshake} ## Handshake {#security-handshake}
The TLS handshake is an Authenticated Key Exchange (AKE) protocol which The TLS handshake is an Authenticated Key Exchange (AKE) protocol which
is intended to provide both one-way authenticated (server-only) and is intended to provide both one-way authenticated (server-only) and
mutually authenticated (client and server) functionality. At the completion mutually authenticated (client and server) functionality. At the completion
of the handshake, each side outputs its view of the following values: 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) - A set of "session keys" (the various secrets derived from the main secret)
from which can be derived a set of working keys. Note that when early data from which a set of working keys can be derived. Note that when early data
is in use, secrets are also derived from the early secret. These enjoy is in use, secrets are also derived from the early secret. These enjoy
somewhat weaker properties than those derived from the main secret, somewhat weaker properties than those derived from the main secret,
as detailed below. as detailed below.
- A set of cryptographic parameters (algorithms, etc.). - A set of cryptographic parameters (algorithms, etc.).
- The identities of the communicating parties. - The identities of the communicating parties.
We assume the attacker to be an active network attacker, which means it 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 {{RFC35 52}}. has complete control over the network used to communicate between the parties {{RFC35 52}}.
Even under these conditions, the handshake should provide the properties listed below . Even under these conditions, the handshake should provide the properties listed below .
Note that these properties are not necessarily independent, but reflect Note that these properties are not necessarily independent but reflect
the protocol consumers' needs. the protocol consumers' needs.
Establishing the same session keys: Establishing the same session keys:
: The handshake needs to output the same set of session keys on both sides of : 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 the handshake, provided that it completes successfully on each endpoint
(see {{CK01}}, Definition 1, part 1). (see {{CK01}}, Definition 1, part 1).
Secrecy of the session keys: Secrecy of the session keys:
: The shared session keys should be known only to the communicating : The shared session keys should be known only to the communicating
parties and not to the attacker (see {{?CK01=DOI.10.1007/3-540-44987-6_28}}; Defini tion 1, part 2). parties and not to the attacker (see {{?CK01=DOI.10.1007/3-540-44987-6_28}}, Defini tion 1, part 2).
Note that in a unilaterally authenticated connection, the attacker can establish 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 its own session keys with the server, but those session keys are distinct from
those established by the client. those established by the client.
Peer Authentication: Peer Authentication:
: The client's view of the peer identity should reflect the server's : 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 identity. If the client is authenticated, the server's view of the
peer identity should match the client's identity. peer identity should match the client's identity.
Uniqueness of the session keys: Uniqueness of the session keys:
: Any two distinct handshakes should produce distinct, unrelated session : Any two distinct handshakes should produce distinct, unrelated session
keys. Individual session keys produced by a handshake should also be distinct keys. Individual session keys produced by a handshake should also be distinct
and independent. and independent.
Downgrade Protection: Downgrade Protection:
: The cryptographic parameters should be the same on both sides and : The cryptographic parameters should be the same on both sides and
should be the same as if the peers had been communicating in the should be the same as if the peers had been communicating in the
absence of an attack (see {{?BBFGKZ16=DOI.10.1109/SP.2016.37}}; Definitions 8 and 9 ). absence of an attack (see {{?BBFGKZ16=DOI.10.1109/SP.2016.37}}; Definitions 8 and 9 ).
Forward secret with respect to long-term keys: Forward secret with respect to long-term keys:
: If the long-term keying material (in this case the signature keys in : If the long-term keying material (in this case, the signature keys in
certificate-based authentication modes or the external/resumption certificate-based authentication modes or the external/resumption
PSK in PSK with (EC)DHE modes) is compromised after the handshake is PSK in PSK with (EC)DHE modes) is compromised after the handshake is
complete, this does not compromise the security of the session key complete, this does not compromise the security of the session key
(see {{?DOW92=DOI.10.1007/BF00124891}}), as long as the session key (see {{?DOW92=DOI.10.1007/BF00124891}}), as long as the session key
itself (and all material that could be used to recreate the session itself (and all material that could be used to recreate the session
key) has been erased. In particular, private keys corresponding to key key) has been erased. In particular, private keys corresponding to key
shares, shared secrets, and keys derived in the TLS Key Schedule shares, shared secrets, and keys derived in the TLS key schedule
other than `binder_key`, `resumption_secret`, and PSKs derived from other than `binder_key`, `resumption_secret`, and PSKs derived from
the `resumption_secret` also need to be erased. The forward secrecy the `resumption_secret` also need to be erased. The forward secrecy
property is not satisfied when PSK is used in the "psk_ke" property is not satisfied when PSK is used in the "psk_ke"
PskKeyExchangeMode. Failing to erase keys or secrets intended to be PskKeyExchangeMode. Failing to erase keys or secrets intended to be
ephemeral or connection-specific in effect creates additional ephemeral or connection-specific in effect creates additional
long-term keys that must be protected. Compromise of those long-term long-term keys that must be protected. Compromise of those long-term
keys (even after the handshake is complete) can result in loss of keys (even after the handshake is complete) can result in loss of
protection for the connection's traffic. protection for the connection's traffic.
Key Compromise Impersonation (KCI) resistance: Key Compromise Impersonation (KCI) resistance:
: In a mutually authenticated connection with certificates, compromising the long-ter m : In a mutually authenticated connection with certificates, compromising the long-ter m
secret of one actor should not break that actors authentication of their peer in 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 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 cli ent compromised, it should not be possible to impersonate arbitrary servers to that cli ent
in subsequent handshakes. in subsequent handshakes.
Protection of endpoint identities: Protection of endpoint identities:
: The server's identity (certificate) should be protected against passive : The server's identity (certificate) should be protected against passive
attackers. The client's identity (certificate) should be protected against attackers. The client's identity (certificate) should be protected against
both passive and active attackers. This property does not hold for cipher both passive and active attackers. This property does not hold for cipher
suites without confidentiality; while this specification does not define any such c ipher suites, suites without confidentiality; while this specification does not define any such c ipher suites,
other documents may do so. other documents may do so.
skipping to change at line 5992 skipping to change at line 6236
rerunning (EC)DHE. If a long-term authentication key has been rerunning (EC)DHE. If a long-term authentication key has been
compromised, a full handshake with (EC)DHE gives protection against compromised, a full handshake with (EC)DHE gives protection against
passive attackers. If the resumption_secret has been passive attackers. If the resumption_secret has been
compromised, a resumption handshake with (EC)DHE gives protection compromised, a resumption handshake with (EC)DHE gives protection
against passive attackers and a full handshake with (EC)DHE gives against passive attackers and a full handshake with (EC)DHE gives
protection against active attackers. If a traffic secret has been protection against active attackers. If a traffic secret has been
compromised, any handshake with (EC)DHE gives protection against compromised, any handshake with (EC)DHE gives protection against
active attackers. Using the terms in {{RFC7624}}, forward secrecy active attackers. Using the terms in {{RFC7624}}, forward secrecy
without rerunning (EC)DHE does not stop an attacker from doing static without rerunning (EC)DHE does not stop an attacker from doing static
key exfiltration. After key exfiltration of key exfiltration. After key exfiltration of
application_traffic_secret_N, an attacker can e.g., passively application_traffic_secret_N, an attacker can, e.g., passively
eavesdrop on all future data sent on the connection including data eavesdrop on all future data sent on the connection including data
encrypted with application_traffic_secret_N+1, encrypted with application_traffic_secret_N+1,
application_traffic_secret_N+2, etc. Frequently rerunning (EC)DHE application_traffic_secret_N+2, etc. Frequently rerunning (EC)DHE
forces an attacker to do dynamic key exfiltration (or content forces an attacker to do dynamic key exfiltration (or content
exfiltration). exfiltration).
The PSK binder value forms a binding between a PSK The PSK binder value forms a binding between a PSK
and the current handshake, as well as between the session where the and the current handshake, as well as between the session where the
PSK was established and the current session. This binding PSK was established and the current session. This binding
transitively includes the original handshake transcript, because that transitively includes the original handshake transcript, because that
skipping to change at line 6094 skipping to change at line 6338
### Certificate-Based Client Authentication ### Certificate-Based Client Authentication
A client that has sent certificate-based authentication data to a server, either duri ng A client that has sent certificate-based authentication data to a server, either duri ng
the handshake or in post-handshake authentication, cannot be sure whether the handshake or in post-handshake authentication, cannot be sure whether
the server afterwards considers the client to be authenticated or not. the server afterwards considers the client to be authenticated or not.
If the client needs to determine if the server considers the If the client needs to determine if the server considers the
connection to be unilaterally or mutually authenticated, this has to connection to be unilaterally or mutually authenticated, this has to
be provisioned by the application layer. See {{CHHSV17}} for details. be provisioned by the application layer. See {{CHHSV17}} for details.
In addition, the analysis of post-handshake authentication from In addition, the analysis of post-handshake authentication from
[Kraw16] shows that the client identified by the certificate sent in {{Kraw16}} shows that the client identified by the certificate sent in
the post-handshake phase possesses the traffic key. This party is the post-handshake phase possesses the traffic key. Therefore, this party is
therefore the client that participated in the original handshake or the client that participated in the original handshake or
one to whom the original client delegated the traffic key (assuming one to whom the original client delegated the traffic key (assuming
that the traffic key has not been compromised). that the traffic key has not been compromised).
### 0-RTT ### 0-RTT
The 0-RTT mode of operation generally provides security 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 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 encryption keys do not provide full forward secrecy and that the
server is not able to guarantee uniqueness of the handshake server is not able to guarantee uniqueness of the handshake
(non-replayability) without keeping potentially undue amounts of (non-replayability) without keeping potentially undue amounts of
skipping to change at line 6127 skipping to change at line 6371
possible. If the total set of exporter labels is known, then possible. If the total set of exporter labels is known, then
implementations SHOULD pre-compute the inner Derive-Secret implementations SHOULD pre-compute the inner Derive-Secret
stage of the exporter computation for all those labels, stage of the exporter computation for all those labels,
then erase the \[early_]exporter_secret, followed by then erase the \[early_]exporter_secret, followed by
each inner values as soon as it is known that it will not be each inner values as soon as it is known that it will not be
needed again. needed again.
### Post-Compromise Security ### Post-Compromise Security
TLS does not provide security for handshakes which take place after the peer's 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 long-term secret (signature key or external PSK) is compromised. Therefore, it
does not provide post-compromise security {{?CCG16=DOI.10.1109/CSF.2016.19}}, sometim es also referred to does not provide post-compromise security {{?CCG16=DOI.10.1109/CSF.2016.19}}, sometim es also referred to
as backwards or future secrecy. This is in contrast to KCI resistance, which as backward or future secrecy. This is in contrast to KCI resistance, which
describes the security guarantees that a party has after its own long-term describes the security guarantees that a party has after its own long-term
secret has been compromised. secret has been compromised.
### External References ### External References
The reader should refer to the following references for analysis of the The reader should refer to the following references for analysis of the
TLS handshake: {{DFGS15}}, {{?CHSV16=DOI.10.1109/SP.2016.35}}, {{DFGS16}}, {{KW16}}, {{Kraw16}}, {{FGSW16}}, TLS handshake: {{DFGS15}}, {{?CHSV16=DOI.10.1109/SP.2016.35}}, {{DFGS16}}, {{KW16}}, {{Kraw16}}, {{FGSW16}},
{{?LXZFH16=DOI.10.1109/SP.2016.36}}, {{FG17}}, and {{?BBK17=DOI.10.1109/SP.2017.26}}. {{?LXZFH16=DOI.10.1109/SP.2016.36}}, {{FG17}}, and {{?BBK17=DOI.10.1109/SP.2017.26}}.
## Record Layer {#security-record-layer} ## Record Layer {#security-record-layer}
The record layer depends on the handshake producing strong traffic secrets The record layer depends on the handshake producing strong traffic secrets
which can be used to derive bidirectional encryption keys and nonces. 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 Assuming that is true, and the keys are used for no more data than
indicated in {{limits-on-key-usage}}, then the record layer should provide the follow ing indicated in {{limits-on-key-usage}}, then the record layer should provide the follow ing
guarantees: guarantees:
<!--[rfced] We note that some author comments are present in the markdown file.
Please confirm that no updates related to these comments are outstanding. Note
that the comments will be deleted prior to publication.
{::comment}Cite IND-CPA?{:/comment}
{::comment}Cite INT-CTXT?{:/comment}
-->
Confidentiality: Confidentiality:
: An attacker should not be able to determine the plaintext contents : An attacker should not be able to determine the plaintext contents
of a given record. of a given record.
{::comment}Cite IND-CPA?{:/comment} {::comment}Cite IND-CPA?{:/comment}
Integrity: Integrity:
: An attacker should not be able to craft a new record which is : An attacker should not be able to craft a new record that is
different from an existing record which will be accepted by the receiver. different from an existing record which will be accepted by the receiver.
{::comment}Cite INT-CTXT?{:/comment} {::comment}Cite INT-CTXT?{:/comment}
Order protection/non-replayability: Order protection/non-replayability:
: An attacker should not be able to cause the receiver to accept a : 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 which it has already accepted or cause the receiver to accept
record N+1 without having first processed record N. record N+1 without having first processed record N.
Length concealment: Length concealment:
: Given a record with a given external length, the attacker should not be able : Given a record with a given external length, the attacker should not be able
skipping to change at line 6177 skipping to change at line 6430
: If the traffic key update mechanism described in {{key-update}} has been : If the traffic key update mechanism described in {{key-update}} has been
used and the previous generation key is deleted, an attacker who compromises 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. the endpoint should not be able to decrypt traffic encrypted with the old key.
{:br} {:br}
Informally, TLS 1.3 provides these properties by AEAD-protecting the Informally, TLS 1.3 provides these properties by AEAD-protecting the
plaintext with a strong key. AEAD encryption {{RFC5116}} provides confidentiality plaintext with a strong key. AEAD encryption {{RFC5116}} provides confidentiality
and integrity for the data. Non-replayability is provided by using and integrity for the data. Non-replayability is provided by using
a separate nonce for each record, with the nonce being derived from a separate nonce for each record, with the nonce being derived from
the record sequence number ({{nonce}}), with the sequence the record sequence number ({{nonce}}), with the sequence
number being maintained independently at both sides; thus records which number being maintained independently at both sides; thus, records which
are delivered out of order result in AEAD deprotection failures. are delivered out of order result in AEAD deprotection failures.
In order to prevent mass cryptanalysis when the same plaintext is In order to prevent mass cryptanalysis when the same plaintext is
repeatedly encrypted by different users under the same key repeatedly encrypted by different users under the same key
(as is commonly the case for HTTP), the nonce is formed by mixing (as is commonly the case for HTTP), the nonce is formed by mixing
the sequence number with a secret per-connection initialization the sequence number with a secret per-connection initialization
vector derived along with the traffic keys. vector derived along with the traffic keys.
See {{BT16}} for analysis of this construction. See {{BT16}} for analysis of this construction.
The rekeying technique in TLS 1.3 (see {{updating-traffic-keys}}) follows the The rekeying technique in TLS 1.3 (see {{updating-traffic-keys}}) follows the
construction of the serial generator as discussed in {{?REKEY=DOI.10.1007/3-540-44448 -3_42}}, which shows that rekeying can construction of the serial generator as discussed in {{?REKEY=DOI.10.1007/3-540-44448 -3_42}}, which shows that rekeying can
allow keys to be used for a larger number of encryptions than without 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 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 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 one way, it is not possible to compute traffic keys from prior to a key change
(forward secrecy). (forward secrecy).
TLS does not provide security for data which is communicated on a connection 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 after a traffic secret of that connection is compromised. That is, TLS does not
provide post-compromise security/future secrecy/backward secrecy with respect provide post-compromise security / future secrecy / backward secrecy with respect
to the traffic secret. Indeed, an attacker who learns a traffic secret can 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 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 guarantees need to do a fresh handshake and establish a new connection with an
(EC)DHE exchange. (EC)DHE exchange.
### External References ### External References
The reader should refer to the following references for analysis of the TLS record la yer: The reader should refer to the following references for analysis of the TLS record la yer:
{{BMMRT15}}, {{BT16}}, {{BDFKPPRSZZ16}}, {{BBK17}}, and {{PS18}}. {{BMMRT15}}, {{BT16}}, {{BDFKPPRSZZ16}}, {{BBK17}}, and {{PS18}}.
skipping to change at line 6226 skipping to change at line 6479
information even in more complicated scenarios. information even in more complicated scenarios.
TLS does not provide any specific defenses against this form of attack TLS does not provide any specific defenses against this form of attack
but does include a padding mechanism for use by applications: The but does include a padding mechanism for use by applications: The
plaintext protected by the AEAD function consists of content plus plaintext protected by the AEAD function consists of content plus
variable-length padding, which allows the application to produce variable-length padding, which allows the application to produce
arbitrary-length encrypted records as well as padding-only cover traffic to arbitrary-length encrypted records as well as padding-only cover traffic to
conceal the difference between periods of transmission and periods conceal the difference between periods of transmission and periods
of silence. Because the of silence. Because the
padding is encrypted alongside the actual content, an attacker cannot padding is encrypted alongside the actual content, an attacker cannot
directly determine the length of the padding, but may be able to directly determine the length of the padding but may be able to
measure it indirectly by the use of timing channels exposed during measure it indirectly by the use of timing channels exposed during
record processing (i.e., seeing how long it takes to process a record processing (i.e., seeing how long it takes to process a
record or trickling in records to see which ones elicit a response 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 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 these channels because even a constant-time padding removal function will
likely feed the content into data-dependent functions. likely feed the content into data-dependent functions.
At minimum, a fully constant-time server or client would require close At minimum, a fully constant-time server or client would require close
cooperation with the application-layer protocol implementation, including cooperation with the application-layer protocol implementation, including
making that higher-level protocol constant time. making that higher-level protocol constant time.
skipping to change at line 6273 skipping to change at line 6526
TLS, in application protocols and the applications that use TLS, in application protocols and the applications that use
them. Resistance to side-channel attacks depends on applications and them. Resistance to side-channel attacks depends on applications and
application protocols separately ensuring that confidential application protocols separately ensuring that confidential
information is not inadvertently leaked. information is not inadvertently leaked.
## Replay Attacks on 0-RTT {#replay-0rtt} ## Replay Attacks on 0-RTT {#replay-0rtt}
Replayable 0-RTT data presents a number of security threats to Replayable 0-RTT data presents a number of security threats to
TLS-using applications, unless those applications are specifically TLS-using applications, unless those applications are specifically
engineered to be safe under replay engineered to be safe under replay
(minimally, this means idempotent, but in many cases may (minimally, this means idempotent but in many cases may
also require other stronger conditions, such as constant-time also require other stronger conditions, such as constant-time
response). Potential attacks include: response). Potential attacks include:
- Duplication of actions which cause side effects (e.g., purchasing an - Duplication of actions which cause side effects (e.g., purchasing an
item or transferring money) to be duplicated, thus harming the site or item or transferring money) to be duplicated, thus harming the site or
the user. the user.
- Attackers can store and replay 0-RTT messages to - Attackers can store and replay 0-RTT messages to
reorder them with respect to other messages (e.g., moving reorder them with respect to other messages (e.g., moving
a delete to after a create). a delete to after a create).
- Amplifying existing information leaks caused by side effects like - Amplifying existing information leaks caused by side effects like
caching. An attacker could learn information about the content of a 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 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 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 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. 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 If data can be replayed a large number of times, additional attacks
become possible, such as making repeated measurements of the become possible, such as making repeated measurements of the
speed of cryptographic operations. In addition, they may speed of cryptographic operations. In addition, they may
be able to overload rate-limiting systems. For a further description of be able to overload rate-limiting systems. For a further description of
these attacks, see {{Mac17}}. these attacks, see {{Mac17}}.
Ultimately, servers have the responsibility to protect themselves Ultimately, servers have the responsibility to protect themselves
against attacks employing 0-RTT data replication. The mechanisms against attacks employing 0-RTT data replication. The mechanisms
described in {{anti-replay}} are intended to described in {{anti-replay}} are intended to
prevent replay at the TLS layer but do not provide complete protection prevent replay at the TLS layer but do not provide complete protection
against receiving multiple copies of client data. against receiving multiple copies of client data.
TLS 1.3 falls back to the 1-RTT TLS 1.3 falls back to the 1-RTT
handshake when the server does not have any information about the handshake when the server does not have any information about the
client, e.g., because it is in a different cluster which does not 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 share state or because the ticket has been deleted, as described in
{{single-use-tickets}}. If the application-layer protocol retransmits {{single-use-tickets}}. If the application-layer protocol retransmits
data in this setting, then it is possible for an attacker to induce data in this setting, then it is possible for an attacker to induce
message duplication by sending the ClientHello to both the original cluster message duplication by sending the ClientHello to both the original cluster
(which processes the data immediately) and another cluster which will (which processes the data immediately) and another cluster which will
fall back to 1-RTT and process the data upon application-layer fall back to 1-RTT and process the data upon application-layer
replay. The scale of this attack is limited by the client's replay. The scale of this attack is limited by the client's
willingness to retry transactions and therefore only allows a limited amount willingness to retry transactions and therefore only allows a limited amount
of duplication, with each copy appearing as a new connection at of duplication, with each copy appearing as a new connection at
the server. the server.
If implemented correctly, the mechanisms described in If implemented correctly, the mechanisms described in Sections
{{single-use-tickets}} and {{client-hello-recording}} prevent a {{single-use-tickets}}{: format="counter"} and {{client-hello-recording}}{: format="c
ounter"} prevent a
replayed ClientHello and its associated 0-RTT data from being accepted replayed ClientHello and its associated 0-RTT data from being accepted
multiple times by any cluster with consistent state; for servers 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 which limit the use of 0-RTT to one cluster for a single ticket, a given
ClientHello and its associated 0-RTT data will only be accepted once. ClientHello and its associated 0-RTT data will only be accepted once.
However, if state is not completely consistent, However, if state is not completely consistent,
then an attacker might be able to have multiple copies of the data be then an attacker might be able to have multiple copies of the data be
accepted during the replication window. accepted during the replication window.
Because clients do not know the exact details of server behavior, they 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 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 replayed and which they would not be willing to retry across multiple
1-RTT connections. 1-RTT connections.
Application protocols MUST NOT use 0-RTT data without a profile that Application protocols MUST NOT use 0-RTT data without a profile that
skipping to change at line 6399 skipping to change at line 6652
## External PSKs and Rerouting ## External PSKs and Rerouting
External PSKs in TLS are designed to be known to exactly one client External PSKs in TLS are designed to be known to exactly one client
and one server. However, as noted in {{RFC9257}}, there are use cases and one server. However, as noted in {{RFC9257}}, there are use cases
where PSKs are shared between more than two entities. In such where PSKs are shared between more than two entities. In such
scenarios, in addition to the expected security weakness where a scenarios, in addition to the expected security weakness where a
compromised group member can impersonate any other member, a malicious compromised group member can impersonate any other member, a malicious
non-member can reroute handshakes between honest group members to non-member can reroute handshakes between honest group members to
connect them in unintended ways {{Selfie}}. {{RFC9257}} provides connect them in unintended ways {{Selfie}}. {{RFC9257}} provides
recommendations for external PSK usage, including the use of external recommendations for external PSK usage, including the use of external
PSK importers as defined in {{RFC9258}}, that prevent such malicious PSK importers as defined in {{RFC9258}}, that prevents such malicious
rerouting of messages rerouting of messages.
## Misbinding when using Self-Signed Certificates or Raw Public Keys ## Misbinding When Using Self-Signed Certificates or Raw Public Keys
When TLS 1.3 is used with self-signed certificates without useful When TLS 1.3 is used with self-signed certificates without useful
identities (as in DTLS-SRTP {{?RFC5763}}) or raw public keys identities (as in DTLS-SRTP {{?RFC5763}}) or raw public keys
{{RFC7250}} for peer authentication, it may be vulnerable to {{RFC7250}} for peer authentication, it may be vulnerable to
misbinding attacks {{MM24}}. This risk can be mitigated by using misbinding attacks {{MM24}}. This risk can be mitigated by using
the "external_id_hash" extension {{?RFC8844}} or, if only the "external_id_hash" extension {{RFC8844}} or, if only
the server is being authenticated, by the server verifying the server is being authenticated, by the server verifying
that the "server_name" extension matches its expected identity. that the "server_name" extension matches its expected identity.
## Attacks on Static RSA ## Attacks on Static RSA
Although TLS 1.3 does not use RSA key transport and so is not 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 directly susceptible to Bleichenbacher-type attacks {{Blei98}}, if TLS 1.3
servers also support static RSA in the context of previous servers also support static RSA in the context of previous
versions of TLS, then it may be possible to impersonate the server versions of TLS, then it may be possible to impersonate the server
for TLS 1.3 connections {{?JSS15=DOI.10.1145/2810103.2813657}}. TLS for TLS 1.3 connections {{?JSS15=DOI.10.1145/2810103.2813657}}. TLS
1.3 implementations can prevent this attack by disabling support 1.3 implementations can prevent this attack by disabling support
for static RSA across all versions of TLS. In principle, implementations for static RSA across all versions of TLS. In principle, implementations
might also be able to separate certificates with different keyUsage might also be able to separate certificates with different keyUsage
bits for static RSA decryption and RSA signature, but this technique bits for static RSA decryption and RSA signature, but this technique
relies on clients refusing to accept signatures using keys relies on clients refusing to accept signatures using keys
in certificates that do not have the digitalSignature bit set, in certificates that do not have the digitalSignature bit set,
and many clients do not enforce this restriction. and many clients do not enforce this restriction.
# Change Log
[[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
RFC 9525 (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
* Update TLS 1.2 terminology
* Specify "certificate-based" client authentication
* Clarify that privacy guarantees don't apply when you have null encryption
* Shorten some names
* Address tracking implications of resumption
# Contributors # Contributors
{:numbered="false"} {:numbered="false"}
~~~~
~~~
Martin Abadi Martin Abadi
University of California, Santa Cruz University of California, Santa Cruz
abadi@cs.ucsc.edu abadi@cs.ucsc.edu
Christopher Allen Christopher Allen
(co-editor of TLS 1.0) (co-editor of TLS 1.0)
Alacrity Ventures Alacrity Ventures
ChristopherA@AlacrityManagement.com ChristopherA@AlacrityManagement.com
Nimrod Aviram Nimrod Aviram
skipping to change at line 6502 skipping to change at line 6714
David Benjamin David Benjamin
Google Google
davidben@google.com davidben@google.com
Benjamin Beurdouche Benjamin Beurdouche
INRIA & Microsoft Research INRIA & Microsoft Research
benjamin.beurdouche@ens.fr benjamin.beurdouche@ens.fr
Karthikeyan Bhargavan Karthikeyan Bhargavan
(editor of [RFC7627]) (editor of {{RFC7627}})
INRIA INRIA
karthikeyan.bhargavan@inria.fr karthikeyan.bhargavan@inria.fr
Simon Blake-Wilson Simon Blake-Wilson
(co-author of [RFC4492]) (co-author of {{RFC4492}})
BCI BCI
sblakewilson@bcisse.com sblakewilson@bcisse.com
Nelson Bolyard Nelson Bolyard
(co-author of [RFC4492]) (co-author of {{RFC4492}})
Sun Microsystems, Inc. Sun Microsystems, Inc.
nelson@bolyard.com nelson@bolyard.com
Ran Canetti Ran Canetti
IBM IBM
canetti@watson.ibm.com canetti@watson.ibm.com
Matt Caswell Matt Caswell
OpenSSL OpenSSL
matt@openssl.org matt@openssl.org
skipping to change at line 6541 skipping to change at line 6753
Katriel Cohn-Gordon Katriel Cohn-Gordon
University of Oxford University of Oxford
me@katriel.co.uk me@katriel.co.uk
Cas Cremers Cas Cremers
University of Oxford University of Oxford
cas.cremers@cs.ox.ac.uk cas.cremers@cs.ox.ac.uk
Antoine Delignat-Lavaud Antoine Delignat-Lavaud
(co-author of [RFC7627]) (co-author of {{RFC7627}})
INRIA INRIA
antdl@microsoft.com antdl@microsoft.com
Tim Dierks Tim Dierks
(co-author of TLS 1.0, co-editor of TLS 1.1 and 1.2) (co-author of TLS 1.0, co-editor of TLS 1.1 and 1.2)
Independent Independent
tim@dierks.org tim@dierks.org
Roelof DuToit Roelof DuToit
Symantec Corporation Symantec Corporation
skipping to change at line 6597 skipping to change at line 6809
Jens Guballa Jens Guballa
ETAS ETAS
jens.guballa@etas.com jens.guballa@etas.com
Felix Guenther Felix Guenther
TU Darmstadt TU Darmstadt
mail@felixguenther.info mail@felixguenther.info
Vipul Gupta Vipul Gupta
(co-author of [RFC4492]) (co-author of {{RFC4492}})
Sun Microsystems Laboratories Sun Microsystems Laboratories
vipul.gupta@sun.com vipul.gupta@sun.com
Chris Hawk Chris Hawk
(co-author of [RFC4492]) (co-author of {{RFC4492}})
Corriente Networks LLC Corriente Networks LLC
chris@corriente.net chris@corriente.net
Kipp Hickman Kipp Hickman
Alfred Hoenes Alfred Hoenes
David Hopwood David Hopwood
Independent Consultant Independent Consultant
david.hopwood@blueyonder.co.uk david.hopwood@blueyonder.co.uk
skipping to change at line 6651 skipping to change at line 6863
Paul Kocher Paul Kocher
(co-author of SSL 3.0) (co-author of SSL 3.0)
Cryptography Research Cryptography Research
paul@cryptography.com paul@cryptography.com
Hugo Krawczyk Hugo Krawczyk
IBM IBM
hugokraw@us.ibm.com hugokraw@us.ibm.com
Adam Langley Adam Langley
(co-author of [RFC7627]) (co-author of {{RFC7627}})
Google Google
agl@google.com agl@google.com
Olivier Levillain Olivier Levillain
ANSSI ANSSI
olivier.levillain@ssi.gouv.fr olivier.levillain@ssi.gouv.fr
Xiaoyin Liu Xiaoyin Liu
University of North Carolina at Chapel Hill University of North Carolina at Chapel Hill
xiaoyin.l@outlook.com xiaoyin.l@outlook.com
skipping to change at line 6684 skipping to change at line 6896
Carl Mehner Carl Mehner
USAA USAA
carl.mehner@usaa.com carl.mehner@usaa.com
Jan Mikkelsen Jan Mikkelsen
Transactionware Transactionware
janm@transactionware.com janm@transactionware.com
Bodo Moeller Bodo Moeller
(co-author of [RFC4492]) (co-author of {{RFC4492}})
Google Google
bodo@acm.org bodo@acm.org
Kyle Nekritz Kyle Nekritz
Facebook Facebook
knekritz@fb.com knekritz@fb.com
Erik Nygren Erik Nygren
Akamai Technologies Akamai Technologies
erik+ietf@nygren.org erik+ietf@nygren.org
skipping to change at line 6713 skipping to change at line 6925
Kenny Paterson Kenny Paterson
Royal Holloway, University of London Royal Holloway, University of London
kenny.paterson@rhul.ac.uk kenny.paterson@rhul.ac.uk
Christopher Patton Christopher Patton
University of Florida University of Florida
cjpatton@ufl.edu cjpatton@ufl.edu
Alfredo Pironti Alfredo Pironti
(co-author of [RFC7627]) (co-author of {{RFC7627}})
INRIA INRIA
alfredo.pironti@inria.fr alfredo.pironti@inria.fr
Andrei Popov Andrei Popov
Microsoft Microsoft
andrei.popov@microsoft.com andrei.popov@microsoft.com
John {{{Preuß Mattsson}}} John Preuß Mattsson
Ericsson Ericsson
john.mattsson@ericsson.com john.mattsson@ericsson.com
Marsh Ray Marsh Ray
(co-author of [RFC7627]) (co-author of {{RFC7627}})
Microsoft Microsoft
maray@microsoft.com maray@microsoft.com
Robert Relyea Robert Relyea
Netscape Communications Netscape Communications
relyea@netscape.com relyea@netscape.com
Kyle Rose Kyle Rose
Akamai Technologies Akamai Technologies
krose@krose.org krose@krose.org
skipping to change at line 6853 skipping to change at line 7065
Vodafone Vodafone
timothy.wright@vodafone.com timothy.wright@vodafone.com
Peter Wu Peter Wu
Independent Independent
peter@lekensteyn.nl peter@lekensteyn.nl
Kazu Yamamoto Kazu Yamamoto
Internet Initiative Japan Inc. Internet Initiative Japan Inc.
kazu@iij.ad.jp kazu@iij.ad.jp
~~~~ ~~~
<!--[rfced] FYI - We have updated some artwork to sourcecode. Please review
and let us know if further updates are necessary.
-->
<!-- [rfced] Please review whether any of the notes in this document
should be in the <aside> element. It is defined as "a container for
content that is semantically less important or tangential to the
content that surrounds it" (https://authors.ietf.org/en/rfcxml-vocabulary#aside).
-->
<!-- [rfced] FYI - We have added expansions for the following abbreviations
per Section 3.6 of RFC 7322 ("RFC Style Guide"). Please review each
expansion in the document carefully to ensure correctness.
Elliptic Curve Cryptography (ECC)
Finite Field DHE (FFDHE)
Internet of Things (IoT)
-->
<!-- [rfced] Please review the "Inclusive Language" portion of the online
Style Guide <https://www.rfc-editor.org/styleguide/part2/#inclusive_language>
and let us know if any changes are needed. Updates of this nature typically
result in more precise language, which is helpful for readers.
For example, please consider whether the following should be updated:
dummy
man-in-the-middle
In addition, please consider whether "traditionally" should be updated for clarity.
While the NIST website
<https://web.archive.org/web/20250203031433/https://nvlpubs.nist.gov/nistpubs/ir/2021
/NIST.IR.8366.pdf>
indicates that this term is potentially biased, it is also ambiguous.
"Tradition" is a subjective term, as it is not the same for everyone.
-->
<!-- [rfced] FYI - we will convert the list of Contributors contained within <artwork
> to be listed with the <contact> element once the file is converted to RFCXML.
In addition, we will update the following reference entries that were a challenge to
update in markdown.
[BBFGKZ16]
[BBK17]
[CCG16]
[CHECKOWAY]
[CHSV16]
[JSS15]
[LXZFH16]
[SLOTH]
[CK01]
[CLINIC]
[DH76]
[DOW92]
[HCJC16]
[RSA]
[SIGMA]
[FETCH]
[SHS]
[DSS]
[ECDP]
[KEYAGREEMENT]
-->
 End of changes. 293 change blocks. 
408 lines changed or deleted 638 lines changed or added

This html diff was produced by rfcdiff 1.48.