| 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 actor’s 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 | |||
| 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}}) | |||
| 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}}) | |||
| bodo@acm.org | bodo@acm.org | |||
| Kyle Nekritz | Kyle Nekritz | |||
| 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. | ||||