| 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: August 2017 | |||
| 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: Proceedings of USENIX Workshop on Offensive Technologies | |||
| 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: Proceedings of IEEE Symposium on Security and Privacy (Oakland) 20 | |||
| 16 | 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 227 ¶ | |||
| - | - | |||
| 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 17 | refcontent: Proceedings of IEEE Symposium on Security and Privacy (San Jose) 20 17 | |||
| date: 2016-12 | 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: Proceedings of CRYPTO '98 | |||
| 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: ProvSec 2015 | |||
| date: 2015-09 | date: September 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: Proceedings of CRYPTO 2016 | |||
| date: July 2016 | date: July 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: October 2016 | |||
| seriesinfo: Proceedings of ACM CCS 2016 | refcontent: Proceedings of ACM CCS 2016 | |||
| 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: March 2016 | |||
| seriesinfo: Proceedings of Euro S&P 2016 | refcontent: Proceedings of Euro S&P 2016 | |||
| 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: October 2015 | |||
| seriesinfo: Proceedings of ACM CCS 2015 | refcontent: Proceedings of ACM CCS 2015 | |||
| 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: February 2016 | |||
| seriesinfo: TRON 2016 | refcontent: TRON 2016 | |||
| 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: April 2017 | |||
| seriesinfo: Proceedings of Euro S&P 2017 | refcontent: Proceedings of Euro S&P 2017 | |||
| 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: Proceedings of CRYPTO 2010 | |||
| 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 | |||
| 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 | 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. | ||||
| --> | ||||
| 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 508 ¶ | skipping to change at line 598 ¶ | |||
| 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 605 ¶ | skipping to change at line 712 ¶ | |||
| - 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 781 ¶ | |||
| 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 while the figure | ||||
| displays *. Please review. One possible fix would be to move the legend 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 869 ¶ | |||
| 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 MAC (Message Authentication Code) 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 | |||
| ndshake | the handshake | |||
| 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 812 ¶ | skipping to change at line 931 ¶ | |||
| If the client has not provided a sufficient "key_share" extension (e.g., it | If the client has not provided a sufficient "key_share" extension (e.g., it | |||
| includes only DHE or ECDHE groups unacceptable to or unsupported by the | includes only DHE or ECDHE groups unacceptable to or unsupported by the | |||
| server), the server corrects the mismatch with a HelloRetryRequest and | server), the server corrects the mismatch with a HelloRetryRequest and | |||
| the client needs to restart the handshake with an appropriate | the client needs to restart the handshake with an appropriate | |||
| "key_share" extension, as shown in Figure 2. | "key_share" extension, as shown in Figure 2. | |||
| If no common cryptographic parameters can be negotiated, | If no common cryptographic parameters can be negotiated, | |||
| the server MUST abort the handshake with an appropriate alert. | the server MUST abort the handshake with an appropriate alert. | |||
| ~~~ aasvg | ~~~ aasvg | |||
| Client Server | Client Server | |||
| ClientHello | ClientHello | |||
| + key_share --------> | + key_share --------> | |||
| HelloRetryRequest | HelloRetryRequest | |||
| <-------- + key_share | <-------- + key_share | |||
| ClientHello | ClientHello | |||
| + key_share --------> | + key_share --------> | |||
| ServerHello | ServerHello | |||
| + key_share | + key_share | |||
| {EncryptedExtensions} | {EncryptedExtensions} | |||
| {CertificateRequest*} | {CertificateRequest*} | |||
| {Certificate*} | {Certificate*} | |||
| {CertificateVerify*} | {CertificateVerify*} | |||
| {Finished} | {Finished} | |||
| <-------- [Application Data*] | <-------- [Application Data*] | |||
| {Certificate*} | {Certificate*} | |||
| {CertificateVerify*} | {CertificateVerify*} | |||
| {Finished} --------> | {Finished} --------> | |||
| [Application Data] <-------> [Application Data] | [Application Data] <-------> [Application Data] | |||
| ~~~ | ~~~ | |||
| {: #tls-restart title="Message Flow for a Full Handshake with Mismatched Parameters"} | {: #tls-restart title="Message Flow for a Full Handshake with Mismatched Parameters"} | |||
| Note: The handshake transcript incorporates the initial | Note: The handshake transcript incorporates the initial | |||
| ClientHello/HelloRetryRequest exchange; it is not reset with the new | ClientHello/HelloRetryRequest exchange; it is not reset with the new | |||
| ClientHello. | ClientHello. | |||
| TLS also allows several optimized variants of the basic handshake, as | TLS also allows several optimized variants of the basic handshake, as | |||
| described in the following sections. | described in the following sections. | |||
| skipping to change at line 914 ¶ | skipping to change at line 1033 ¶ | |||
| 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 | |||
| as for a 1-RTT handshake with PSK resumption. | as for a 1-RTT handshake with PSK resumption. | |||
| ~~~ aasvg | ~~~ aasvg | |||
| Client Server | Client Server | |||
| ClientHello | ClientHello | |||
| + early_data | + early_data | |||
| + key_share* | + key_share* | |||
| + psk_key_exchange_modes | + psk_key_exchange_modes | |||
| + pre_shared_key | + pre_shared_key | |||
| (Application Data*) --------> | (Application Data*) --------> | |||
| ServerHello | ServerHello | |||
| + pre_shared_key | + pre_shared_key | |||
| + key_share* | + key_share* | |||
| {EncryptedExtensions} | {EncryptedExtensions} | |||
| + early_data* | + early_data* | |||
| {Finished} | {Finished} | |||
| <-------- [Application Data*] | <-------- [Application Data*] | |||
| (EndOfEarlyData) | (EndOfEarlyData) | |||
| {Finished} --------> | {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 client_early_traffic_secret. | derived from a client_early_traffic_secret. | |||
| {} 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-0-rtt title="Message Flow for a 0-RTT Handshake"} | {: #tls-0-rtt title="Message Flow for a 0-RTT Handshake"} | |||
| IMPORTANT NOTE: The security properties for 0-RTT data are weaker than | IMPORTANT NOTE: The security properties for 0-RTT data are weaker than | |||
| those for other kinds of TLS data. Specifically: | those for other kinds of TLS data. Specifically: | |||
| 1. The protocol does not provide any forward secrecy guarantees for this data. | 1. The protocol does not provide any forward secrecy guarantees for this data. | |||
| The server's behavior determines what forward secrecy guarantees, if any, apply | The server's behavior determines what forward secrecy guarantees, if any, apply | |||
| (see {{single-use-tickets}}). This behavior is not communicated to the client | (see {{single-use-tickets}}). This behavior is not communicated to the client | |||
| as part of the protocol. Therefore, absent out-of-band knowledge of the | as part of the protocol. Therefore, absent out-of-band knowledge of the | |||
| skipping to change at line 1365 ¶ | skipping to change at line 1483 ¶ | |||
| 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; | ~~~ | |||
| opaque Random[32]; | uint16 ProtocolVersion; | |||
| 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 1604 ¶ | |||
| ({{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 { | ~~~ | |||
| ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */ | struct { | |||
| Random random; | ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */ | |||
| opaque legacy_session_id_echo<0..32>; | Random random; | |||
| CipherSuite cipher_suite; | opaque legacy_session_id_echo<0..32>; | |||
| uint8 legacy_compression_method = 0; | CipherSuite cipher_suite; | |||
| Extension extensions<6..2^16-1>; | uint8 legacy_compression_method = 0; | |||
| } ServerHello; | Extension extensions<6..2^16-1>; | |||
| } 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 1663 ¶ | |||
| 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 or the "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 1738 ¶ | skipping to change at line 1862 ¶ | |||
| "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 includes only extensions marked | |||
| "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. | |||
| skipping to change at line 2038 ¶ | skipping to change at line 2181 ¶ | |||
| 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 2343 ¶ | skipping to change at line 2486 ¶ | |||
| "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 2532 ¶ | |||
| 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 2469 ¶ | skipping to change at line 2612 ¶ | |||
| 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 | |||
| skipping to change at line 2619 ¶ | skipping to change at line 2762 ¶ | |||
| 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. Clients, however, 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, | |||
| skipping to change at line 2677 ¶ | skipping to change at line 2820 ¶ | |||
| 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 2766 ¶ | skipping to change at line 2909 ¶ | |||
| 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 { | ~~~ | |||
| Extension extensions<0..2^16-1>; | struct { | |||
| } EncryptedExtensions; | Extension extensions<0..2^16-1>; | |||
| } 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. This message, if sent, MUST | |||
| follow EncryptedExtensions. | follow EncryptedExtensions. | |||
| Structure of this message: | Structure of this message: | |||
| struct { | ~~~ | |||
| opaque certificate_request_context<0..2^8-1>; | struct { | |||
| Extension extensions<0..2^16-1>; | opaque certificate_request_context<0..2^8-1>; | |||
| } CertificateRequest; | Extension extensions<0..2^16-1>; | |||
| } 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 2822 ¶ | skipping to change at line 2971 ¶ | |||
| by sending the "signature_algorithms" and optionally "signature_algorithms_cert" | by sending the "signature_algorithms" and optionally "signature_algorithms_cert" | |||
| extensions. The latter is | extensions. The latter is | |||
| 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. I.e., | |||
| skipping to change at line 2913 ¶ | skipping to change at line 3065 ¶ | |||
| 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. Note, however, | |||
| however, that subsequent post-handshake authentications do not include | 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 3110 ¶ | |||
| 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 3157 ¶ | |||
| 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 3087 ¶ | skipping to change at line 3242 ¶ | |||
| 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 3143 ¶ | skipping to change at line 3298 ¶ | |||
| 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 { | ~~~ | |||
| SignatureScheme algorithm; | struct { | |||
| opaque signature<0..2^16-1>; | SignatureScheme algorithm; | |||
| } CertificateVerify; | opaque signature<0..2^16-1>; | |||
| } 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 3328 ¶ | |||
| - 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 3399 ¶ | |||
| 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 { | ~~~ | |||
| opaque verify_data[Hash.length]; | struct { | |||
| } Finished; | opaque verify_data[Hash.length]; | |||
| } Finished; | ||||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| The verify_data value is computed as follows: | The verify_data value is computed as follows: | |||
| verify_data = | ~~~ | |||
| HMAC(finished_key, | verify_data = | |||
| Transcript-Hash(Handshake Context, | HMAC(finished_key, | |||
| Certificate*, CertificateVerify*)) | Transcript-Hash(Handshake Context, | |||
| Certificate*, CertificateVerify*)) | ||||
| ~~~ | ||||
| {: gi="sourcecode"} | ||||
| * Only included if present. | <!--[rfced] We believe the intention of this line is 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: | ||||
| * Only included if present. | ||||
| A definition list will yield 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: | |||
| 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 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 -- | -- 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 3568 ¶ | skipping to change at line 3745 ¶ | |||
| 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. I.e., | |||
| 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}}. | |||
| 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-bit, 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. 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, though. Later documents may define | |||
| skipping to change at line 3863 ¶ | skipping to change at line 4040 ¶ | |||
| 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 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 advertises only | |||
| 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. | |||
| 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. | |||
| For X25519 and X448, the ECDH calculations are as follows: | For X25519 and X448, the ECDH calculations are as follows: | |||
| - The public key to put into the KeyShareEntry.key_exchange structure is the | - The public key to put into the KeyShareEntry.key_exchange structure is the | |||
| result of applying the ECDH scalar multiplication function to the secret key | result of applying the ECDH scalar multiplication function to the secret key | |||
| of appropriate length (into scalar input) and the standard public basepoint | of appropriate length (into scalar input) and the standard public basepoint | |||
| (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) = | |||
| skipping to change at line 4459 ¶ | skipping to change at line 4656 ¶ | |||
| 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. | |||
| skipping to change at line 4490 ¶ | skipping to change at line 4687 ¶ | |||
| 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. It is understood, however, 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 | |||
| skipping to change at line 4571 ¶ | skipping to change at line 4768 ¶ | |||
| as long as the expected_arrival_time is inside the window. | as long as the expected_arrival_time is inside the window. | |||
| 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 | |||
| I.e., 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 4639 ¶ | skipping to change at line 4835 ¶ | |||
| ~~~~ | ~~~~ | |||
| 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 | |||
| skipping to change at line 4676 ¶ | skipping to change at line 4872 ¶ | |||
| 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 4799 ¶ | skipping to change at line 5029 ¶ | |||
| # Security Considerations | # Security Considerations | |||
| Security issues are discussed throughout this memo, especially in | Security issues are discussed throughout this memo, especially in | |||
| {{implementation-notes}}, {{backward-compatibility}}, and {{security-analysis}}. | {{implementation-notes}}, {{backward-compatibility}}, and {{security-analysis}}. | |||
| # 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 "_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}}, | |||
| skipping to change at line 4866 ¶ | skipping to change at line 5094 ¶ | |||
| 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". | |||
| <!--[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 | 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 | |||
| skipping to change at line 4895 ¶ | skipping to change at line 5138 ¶ | |||
| 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 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. | |||
| skipping to change at line 5562 ¶ | skipping to change at line 5806 ¶ | |||
| 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 {{ffdhe-param}} and {{finite-field-diffie-hellman}}) ? | |||
| - 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 | |||
| skipping to change at line 5630 ¶ | skipping to change at line 5874 ¶ | |||
| 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 extension {{PRE-RFC9849}} 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 5860 ¶ | skipping to change at line 6104 ¶ | |||
| 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 | |||
| skipping to change at line 5928 ¶ | skipping to change at line 6172 ¶ | |||
| 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. This party is therefore | |||
| 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 6147 ¶ | skipping to change at line 6391 ¶ | |||
| {{?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 which 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} | |||
| 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 | |||
| skipping to change at line 6400 ¶ | skipping to change at line 6653 ¶ | |||
| 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 prevent 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) | ||||
| 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. 216 change blocks. | ||||
| 408 lines changed or deleted | 633 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||