| Internet-Draft | Larger Data in TLS 1.3 Handshake | February 2026 |
| Wagner, et al. | Expires 24 August 2026 | [Page] |
This memo discusses possible modifications of TLS 1.3, aimed to allow trasferring data larger than 64 Kbytes in handshake messages. One possible application for this feature is to allow using post-quantum Key Encapsulation Method that have large public key or ciphertext size (like Classic McEliece).¶
This note is to be removed before publishing as an RFC.¶
The latest revision of this draft can be found at https://jwagrunner.github.io/internet-draft/draft-wagner-tls-keysharepqc.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-wagner-tls-keysharepqc/.¶
Discussion of this document takes place on the Transport Layer Security mailing list (mailto:tls@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/tls/. Subscribe at https://www.ietf.org/mailman/listinfo/tls/.¶
Source for this draft and an issue tracker can be found at https://github.com/jwagrunner/internet-draft.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 24 August 2026.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
The Transport Layer Security (TLS) Protocol Version 1.3 ([RFC8446]) is widely used to protect network traffic. To establish secure connection client and server first perform a "handshake" during which they negotiate cipher suites, compute shared session key and perform one-side or mutual authentication. TLS 1.3 handshake protocol consists of several messages, and while the size of each handshake message can be up to 2^24 bytes the size of some individual data blocks inside these messages is limited to 2^16 bytes. This limitation makes it impossible to transfer larger data blocks in TLS 1.3 handshake.¶
One possible application for larger data in TLS 1.3 handshake is post-quantum Key Encapsulation Mechanisms (KEM). Large public key algorithms, including the code-based cryptographic algorithm family Classic McEliece (see [I-D.josefsson-mceliece], [NIST], [DJB25], [RJM78], and [OQS24]), cannot be easily implemented in TLS 1.3 due to the current key share limitations of 65,535 Bytes. It is important to consider such uses of algorithms given that Classic McEliece is a Round 4 algorithm submitted in the National Institute of Standards and Technology (NIST) standardization process (see [PQC25]). Thus, enabling the use of Classic McEliece algorithms to be used in TLS 1.3 key exchanges and also presenting them as an alternative option to replace classical algorithms for future protection against the threat of attackers in possession of powerful quantum computers that will break classical encryption.¶
This document discusses the possible ways how the TLS 1.3 handshake can accommodate data larger than 64 Kbytes with an immediate goal to be able to run large public key KEMs, but not limited to.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
Extended Key Update [I-D.ietf-tls-extended-key-update] is a TLS 1.3 extension that allows to perform post-handshake key exchange in order to update session keys. This mechanism defines new TLS 1.3 handshake message type - ExtendedKeyUpdate. Since TLS 1.3 handshake messages can be up to 2^24 bytes long, this allows to transfer large key shares using this message.¶
Currently, the functionality of Extended Key Update is limited to only allow using exactly the same key exchange mechanism as was negotiated and used during the handshake. However, the mechanism can be extended to also allow performing a different key exchange mechanism, that could be additionally negotiated during the handshake. In this case a modified Extended Key Update must be run immediately after the initial handshake and before any application data sent over the connection. Thus, the resulting key exchange will always be non-composite hybrid key exchange, similar to what IKEv2 does (see [RFC9370]).¶
Client Server
Key ^ ClientHello
Exch | + key_share
| + signature_algorithms
v + additional_key_exchange
-------->
ServerHello ^ Key
+ key_share | Exch
v
{EncryptedExtensions ^ Server
+ additional_key_exchange} | Params
{CertificateRequest} v
{Certificate} ^
{CertificateVerify} | Auth
{Finished} v
<--------
^ {Certificate}
Auth | {CertificateVerify}
v {Finished} -------->
[EKU(key_update_request -------->
(with key_share))]
<-------- [EKU(key_update_response
(with key_share))]
# Server derives new secrets
# and updates SEND keys here
# Client derives new secrets
# and updates RECEIVE keys here
[EKU(new_key_update)] -------->
# Client updates SEND keys here
# Server updates RECEIVE keys here
[Application Data] <-------> [Application Data]
If there is a need to send large pieces of data that do not fit into the existing TLS 1.3 handshake messages during the handshake (e.g. in the case of PQ KEM with large public keys, like Classic McEliece) then the client indicates this with new extension of type aux_data (Figure 7) in the ClientHello message. This extension contains no data.¶
If the server supports this extension, it replies with the HelloRetryRequest that also includes the aux_data extension.¶
Once HelloRetryRequest has been received, the client repeats ClientHello and immediately after that sends a new message AuxHandshakeData (Figure 5) which actually contains large data. The server then responds with ServerHello that also is immediately followed by AuxHandshakeData message, preceding all other other handshake messages (e.g. EncryptedExtensions, etc.).¶
The data in the AuxHandshakeData message is organized as an array of AuxHandshakeDataEntry (Figure 4) structures. When a large piece of data should be used in the protocol, it is referenced from the corresponding item in the ClientHello or ServerHello by its index in the AuxHandshakeData message.¶
For example, with large public keys for some PQ KEMs (like Classic McEliece) the key_share representation would be LargeKeyShareRepresentation (Figure 6), which contains the type of representation and, depending on that type, either the key share itself (e.g. for Classic McEliece ciphertext, which is small) or the index of AuxHandshakeDataEntry data elements in the AuxHandshakeData message, which will contain the large key share (e.g. a Classic McEliece public key).¶
Client Server
ClientHello
+ key_share
+ aux_data -------->
HelloRetryRequest
+ key_share
<-------- + aux_data
ClientHello
+ key_share
+ aux_data
AuxHandshakeData* -------->
ServerHello
+ key_share
+ aux_data
AuxHandshakeData*
{EncryptedExtensions}
{CertificateRequest*}
{Certificate*}
{CertificateVerify*}
{Finished}
<-------- [Application Data*]
{Certificate*}
{CertificateVerify*}
{Finished} -------->
[Application Data] <-------> [Application Data]
enum {
...
aux_handshake_data(TBA),
(65535)
} HandshakeType;
struct {
HandshakeType msg_type; /* handshake type */
uint24 length; /* bytes in message */
select (Handshake.msg_type) {
...
case aux_handshake_data: AuxHandshakeData;
};
} Handshake;
struct {
opaque data<0..2^24-1>;
} AuxHandshakeDataEntry;
struct {
AuxHandshakeDataEntry aux_data<0..2^24-1>;
} AuxHandshakeData;
struct {
uint8 form;
select (LargeKeyShareRepresentation.type) {
case 0: uint16 aux_data_entry_index;
default: opaque key_exchange<0..2^16-1>;
};
} LargeKeyShareRepresentation;
enum {
...
aux_data(TBD),
(65535)
} ExtensionType;
struct {
} AuxData;
This document proposes three possible solutions for transferring large amounts of data during the TLS 1.3 handshake.¶
New Key Share Extension¶
This is a straightforward solution to the problem, it changes the format of the ClientHello and the ServerHello messages in a non-backward compatible way.¶
Advantages:¶
It is the most efficient solution in terms of round trips - the number of round trips needed to establish the TLS connection does not increase.¶
Disadvantages:¶
It can only be used in environments when clients know beforehand that servers they contact support this extension.¶
It deals only with key shares, thus it is not a generic solution to transferring large data in handshake.¶
Since the format of the ClientHello is changed, it is unclear how this extension will interact with Encrypted ClientHello extension.¶
It is not clear how middleboxes will handle modified ClientHello and ServerHello¶
Modified Extended Key Update¶
Advantages:¶
This solution keeps the current TLS 1.3 handshake intact, thus making it friendly to middleboxes.¶
Disadvantages:¶
The number of round trips needed before application data can be sent increases.¶
It complicates the TLS state machine - application data should not be sent once the initial handshake is complete, instead it can only be sent after the modified Extended Key Update immediately following the initial handshake completes.¶
It deals only with key shares, thus it is not a generic solution to transferring large data in a handshake.¶
It is unclear how this would interact with regular Extended Key Update extension either only initial key exchange algorithm is used for rekey using Extended Key Update, or this extension neede to be modified to be able to perform several successive key exchanges (similar to [RFC9370]).¶
New AuxHandshakeData Handshake Message¶
Advantages:¶
This solution keeps the current ClientHello and ServerHello messages intact, but adds a new handshake message following them. It seems that this is more friendly to middleboxes than modifying the format of CH and SH, but this is not for sure.¶
This is a generic solution, allowing to transfer large data of any kind in a TLS handshake.¶
Since the ClientHello format remains the same, it seems that this solution can be used with ECH (requires more investigations).¶
Disadvantages:¶
The solution relies on HelloRetryRequest, thus the number of round trips needed to complete a handshake increases.¶
Thank you D. J. Bernstein and Simon Josefsson as they advised to have at least one reference for the description of Classic McEliece. Thank you also to Eliot Lear for his feedback on other fields regarding the next algorithm needed.¶
Thank you as well to Martin Thomson and David Schinazi, as their Internet Draft template was used to generate this document, before the authors' information was added. The authors also want to thank the contributors of the kramdown-rfc GitHub repository, as their examples helped with the format of the figures, references, and authors' information presented in this document. Thank you also to Joyce Reynolds and Robert Braden, as their Internet Draft [JR04] was helpful as a guide on how to write the citations in this document (i.e., using citation brackets with author's initials, year, etc.).¶
Using Extended Key Update mechanism for transferring large key shares was proposed by John Mattsson.¶