Internet-Draft TLS Flags July 2022
Nir Expires 27 January 2023 [Page]
Intended Status:
Standards Track
Y. Nir
Dell Technologies

A Flags Extension for TLS 1.3


A number of extensions are proposed in the TLS working group that carry no interesting information except the 1-bit indication that a certain optional feature is supported. Such extensions take 4 octets each. This document defines a flags extension that can provide such indications at an average marginal cost of 1 bit each. More precisely, it provides as many flag extensions as needed at 4 + the order of the last set bit divided by 8.

Status of This Memo

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

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 27 January 2023.

Table of Contents

1. Introduction

Since the publication of TLS 1.3 ([RFC8446]) there have been several proposals for extensions to this protocol, where the presence of the content-free extension in both the ClientHello and either the ServerHello or EncryptedExtensions indicates nothing except either support for the optional feature or an intent to use the optional feature. Examples:

This document proposes a single extension called tls_flags that can enumerate such flag extensions and allowing both client and server to indicate support for optional features in a concise way.

None of the current proposed extensions allow for indication of support in ServerHello (SH), EncryptedExtensions (EE), Certificate (CT), or HelloRetryRequest (HRR) without first being indicated in ClientHello (CH). Similarly, none of the current proposed extensions allow for an indication of support in the client-side Certificate (CT) message without first being indicated in the server's CertificateRequest (CR) message. This restriction is enforced by the rules in Section 3.

1.1. Requirements and Other Notation

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD 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 term "flag extension" is used to denote an extension where the extension_data field is always zero-length in a particular context, and the presence of the extension denotes either support for some feature or the intent to use that feature.

The term "flag-type feature" denotes an options TLS 1.3 feature the support for which is negotiated using a flag extension, whether that flag extension is its own extension or a value in the extension defined in this document.

2. The tls_flags Extension

This document defines the following extension code point:

   enum {
   } ExtensionType;

This document also defines the data for this extension as a variable-length bit string, allowing for the encoding of up to 2040 features.

   struct {
      opaque flags<1..255>;
   } FlagExtensions;

The FlagExtensions field contains 8 flags in each octet. The length of the extension is the minimal length that allows it to encode all of the present flags. Within each octet, the bits are packed such that the first bit is the least significant bit and the eighth bit is the most significant. Using zero-based indexing, the first octet holds flags 0-7, the second octet holds bits 8-15 and so on. For example, if we want to encode only flag number zero, the FlagExtension field will be 1 octet long, that is encoded as follows:


If we want to encode flags 1 and 5, the field will still be 1 octet long:


If we want to encode flags 3, 5, and 23, the field will have to be 3 octets long:

   00101000 00000000 10000000

An implementation that receives an all-zero value for this extension or a value that contains trailing zero bytes MUST generate a fatal illegal_parameter alert.

Note that this document does not define any particular bits for this string. That is left to the protocol documents such as the ones in the examples from the previous section. Such documents will have to define which bit to set to show support, and the order of the bits within the bit string shall be enumerated in network order: bit zero is the high-order bit of the first octet as the flags field is transmitted.

3. Rules for The Flags Extension

Any TLS implementation that intends to propose or indicate support for a flag extension SHALL send this extension with the relevant bits set. It MUST NOT send this extension empty -- with a length of zero.

This specification does not require every flag extension to be acknowledged. Acknowledging a flag extension is typically needed to inform the peer proposing the extension that the other side understands and supports the extension, but some extensions do not require this acknowledgement.

For a flag that does require a response, the only proper response is the same flag in a flags extension. This extension MUST NOT be used to specify extensions where the response is a proper extension with content.

A flag proposed by the client in ClientHello (CH) that requires acknowledgement SHOULD be acknowledged in either ServerHello (SH), in EncryptedExtensions (EE), in Certificate (CT), or in HelloRetryRequest (HRR) as the corresponding flag document specifies. Similarly, a flag proposed by the server in the CertificateRequest (CR) message that requires acknowledgement SHOULD be acknowledged in the client's Certificate (CT) message. A flag proposed by the server in the NewSessionTicket (NST) message is never acknowledged as there is not client-side response message.

Multiple flags can be proposed or acknowledged in the same extension.

In all of the above cases, a flag MUST NOT be acknowledged in SH, EE, CT, or HRR without first having been proposed in CH or CR. Unsolicited flags may appear only in CH, CR, and NST. And endpoint that receives an unsolicited flag in another message (HRR, SH, EE, or CT) MUST generate a fatal illegal_parameter alert.

A client that supports this extension and at least one flag extension SHALL send this extension with the flags field having bits set only for those extensions that it intends to set. It MUST NOT send this extension with a length of zero.

An implementation that receives an invalid tls_flags extension MUST terminate the TLS handshake with a fatal illegal_parameter alert.

3.1. Interaction with the 0-RTT Handshake

The 0-RTT handshake, defined in section 2.3 of [RFC8446], has a ClientHello message, a ServerHello message, and an EncryptedExtensions message. Those can include the tls_flags extension just as they can in a regular handshake.

Future flag extensions MUST define their interaction with 0-RTT, just as other extensions are required to.

4. IANA Considerations

IANA is requested to assign a new value from the TLS ExtensionType Values registry:

IANA is also requested to create a new registry under the TLS namespace with name "TLS Flags" and the following fields:

The policy for this shall be "Specification Required" as described in Section 4.6 of [RFC8126] with the exception of flags numbered from 0-15, which follow the "Standards Action" policy (Section 4.9 of [RFC8126]). Designated expert(s) are advised to follow the advice in Section 17 of [RFC8447] when reviewing registration requests.

The initial contents of the registry shall be one entry, as follows:

5. Security Considerations

The extension described in this document provides a more concise way to express data that could otherwise be expressed in individual extensions. It does not send in the clear any information that would otherwise be sent encrypted, nor vice versa. For this reason this extension is neutral as far as security is concerned.

Extension authors should be aware that acknowledging flags in a tls_flags extension of the ServerHello and HelloRetryRequest messages expose this response to passive observers. Unless there is a special reason to place the response in the ServerHello, most flags should go in other (encrypted) messages.

6. Acknowledgements

The idea for writing this was expressed at the mic during the TLS session at IETF 104 by Eric Rescorla.

The current bitwise formatting was suggested on the mailing list by Nikos Mavrogiannopoulos.

Improvement to the encoding were suggested by Ilari Liusvaara, who also asked for a better explanation of the semantics of missing extensions.

Useful comments received from Martin Thomson, including the suggestion to eliminate the option to have the server send unsolicited flag types and the rules for where unsolicited flags can appear.

7. References

7.1. Normative References

Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", DOI 10.17487/RFC2119, BCP 14, RFC 2119, , <>.
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", DOI 10.17487/RFC8174, RFC 8174, BCP 14, , <>.
Rescorla, E., "The Transport Layer Security (TLS) Protocol Version 1.3", RFC 8446, DOI 10.17487/RFC8446, , <>.
Salowey, J. and S. Turner, "IANA Registry Updates for TLS and DTLS", RFC 8447, DOI 10.17487/RFC8447, , <>.

7.2. Informative References

Vasiliev, V., "Transport Layer Security (TLS) Resumption across Server Names", Work in Progress, Internet-Draft, draft-ietf-tls-cross-sni-resumption-02, , <>.
Housley, R., "TLS 1.3 Extension for Certificate-Based Authentication with an External Pre-Shared Key", Work in Progress, Internet-Draft, draft-ietf-tls-tls13-cert-with-extern-psk-07, , <>.
Sy, E., "TLS Resumption across Server Name Indications for TLS 1.3", Work in Progress, Internet-Draft, draft-sy-tls-resumption-group-00, , <>.
Rescorla, E., Ray, M., Dispensa, S., and N. Oskov, "Transport Layer Security (TLS) Renegotiation Indication Extension", RFC 5746, DOI 10.17487/RFC5746, , <>.
Cotton, M., Leiba, B., and T. Narten, "Guidelines for Writing an IANA Considerations Section in RFCs", RFC 8126, DOI 10.17487/RFC8126, BCP 26, , <>.

Appendix A. Change Log


draft-ietf-tls-tlsflags-02 set the maximum number of flags to 2048, and added guidance for the IANA experts.

draft-ietf-tls-tlsflags-01 allows server-only flags and allows the client to send an empty extension. Also modified the packing order of the bits.

draft-ietf-tls-tlsflags-00 had the same text as draft-nir-tls-tlsflags-02, and was re-submitted as a working group document following the adoption call.

Version -02 replaced the fixed 64-bit string with an unlimited bitstring, where only the necessary octets are encoded.

Version -01 replaced the enumeration of 8-bit values with a 64-bit bitstring.

Version -00 was a quickly-thrown-together draft with the list of supported features encoded as an array of 8-bit values.

Author's Address

Yoav Nir
Dell Technologies
9 Andrei Sakharov St
Haifa 3190500