<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.8 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-tls-ctls-10" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.1 -->
  <front>
    <title abbrev="cTLS 1.3">Compact TLS 1.3</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-tls-ctls-10"/>
    <author initials="E." surname="Rescorla" fullname="Eric Rescorla">
      <organization>Windy Hill Systems, LLC</organization>
      <address>
        <email>ekr@rtfm.com</email>
      </address>
    </author>
    <author initials="R." surname="Barnes" fullname="Richard Barnes">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <author initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization/>
      <address>
        <email>hannes.tschofenig@gmx.net</email>
      </address>
    </author>
    <author initials="B." surname="Schwartz" fullname="Benjamin M. Schwartz">
      <organization>Meta Platforms, Inc.</organization>
      <address>
        <email>ietf@bemasc.net</email>
      </address>
    </author>
    <date year="2024" month="April" day="17"/>
    <area>General</area>
    <workgroup>TLS Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 55?>

<t>This document specifies a "compact" version of TLS 1.3 and DTLS 1.3. It saves bandwidth
by trimming obsolete material, tighter encoding, a template-based specialization technique,
and alternative cryptographic techniques. cTLS is not directly interoperable with
TLS 1.3 or DTLS 1.3 since the over-the-wire framing is different. A single server
can, however, offer cTLS alongside TLS or DTLS.</t>
    </abstract>
  </front>
  <middle>
    <?line 63?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies "compact" versions of TLS <xref target="RFC8446"/> and DTLS
<xref target="RFC9147"/>, respectively known as "Stream cTLS" and "Datagram cTLS".  cTLS
provides equivalent security and functionality to TLS and DTLS, but it is
designed to take up minimal bandwidth. The space reduction
is achieved by five basic techniques:</t>
      <ul spacing="normal">
        <li>
          <t>Omitting unnecessary values that are a holdover from previous versions
of TLS.</t>
        </li>
        <li>
          <t>Omitting the fields and handshake messages required for preserving backwards-compatibility
with earlier TLS versions.</t>
        </li>
        <li>
          <t>More compact encodings.</t>
        </li>
        <li>
          <t>A template-based specialization mechanism that allows pre-populating information
at both endpoints without the need for negotiation.</t>
        </li>
        <li>
          <t>Alternative cryptographic techniques, such as nonce truncation.</t>
        </li>
      </ul>
      <t>For the common (EC)DHE handshake with pre-established certificates, Stream cTLS
achieves an overhead of 53 bytes over the minimum required by the
cryptovariables.  For a PSK handshake, the overhead is 21 bytes.  An annotated
handshake transcript can be found in <xref target="transcripts"/>.</t>
      <ul empty="true">
        <li>
          <t>TODO: Make a PSK transcript and check the overhead.</t>
        </li>
      </ul>
      <t>cTLS supports the functionality of TLS and DTLS 1.3, and is forward-compatible
to future versions of TLS and DTLS.  cTLS itself is versioned by
<tt>CTLSTemplate.version</tt> (currently zero).</t>
      <t>The compression of the handshake while preserving the security guarantees
of TLS has been formally verified in <xref target="Comparse"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>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 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>
      <t>Structure definitions listed below override TLS 1.3 definitions; any PDU
not internally defined is taken from TLS 1.3.</t>
      <section anchor="template-based-specialization">
        <name>Template-based Specialization</name>
        <t>A significant transmission overhead in TLS 1.3 is contributed to by two factors:</t>
        <ul spacing="normal">
          <li>
            <t>the negotiation of algorithm parameters, and extensions,  as well as</t>
          </li>
          <li>
            <t>the exchange of certificates.</t>
          </li>
        </ul>
        <t>TLS 1.3 supports different credential types and modes that
are impacted differently by a compression scheme. For example, TLS supports
certificate-based authentication, raw public key-based authentication as well
as pre-shared key (PSK)-based authentication. PSK-based authentication can be
used with externally configured PSKs or with PSKs established through tickets.</t>
        <t>The basic idea of template-based specialization is that we start with the basic
TLS 1.3 handshake, which is fully general and then remove degrees of freedom,
eliding parts of the handshake which are used to express those degrees of
freedom. For example, if we only support one version of TLS, then it
is not necessary to have version negotiation and the
supported_versions extension can be omitted.  Thus, each specialization
produces a new protocol that preserves the security guarantees of TLS, but has
its own unique handshake.</t>
        <t>By assuming that out-of-band agreements took place already prior to the start of
the cTLS protocol exchange, the amount of data exchanged can be radically reduced.
Because different clients may use different compression templates and because multiple
compression templates may be available for use in different deployment environments,
a client needs to inform the server about the profile it is planning to use. The
profile field in the ClientHello serves this purpose.</t>
        <t>Although the template-based specialization mechanisms described here are general,
we also include specific mechanism for certificate-based exchanges because those are
where the most complexity and size reduction can be obtained. Most of the other exchanges in
TLS 1.3 are highly optimized and do not require compression to be used.</t>
        <t>The compression profile defining the use of algorithms, algorithm parameters, and
extensions is represented by the <tt>CTLSTemplate</tt> structure:</t>
        <artwork><![CDATA[
enum {
  profile(0),
  version(1),
  cipher_suite(2),
  dh_group(3),
  signature_algorithm(4),
  random(5),
  mutual_auth(6),
  handshake_framing(7),
  client_hello_extensions(8),
  server_hello_extensions(9),
  encrypted_extensions(10),
  certificate_request_extensions(11),
  known_certificates(12),
  finished_size(13),
  optional(65535)
} CTLSTemplateElementType;

struct {
  CTLSTemplateElementType type;
  opaque data<0..2^32-1>;
} CTLSTemplateElement;

struct {
  uint16 ctls_version = 0;
  CTLSTemplateElement elements<0..2^32-1>
} CTLSTemplate;
]]></artwork>
        <t>Elements in a <tt>CTLSTemplate</tt> MUST appear sorted by the type field in strictly
ascending order.  The initial elements are defined in the subsections below.
Future elements can be added via an IANA registry (<xref target="template-keys"/>).  When
generating a template, all elements are OPTIONAL to include.  When processing
a template, all elements are mandatory to understand (but see discussion of
<tt>optional</tt> in <xref target="optional"/>).</t>
        <t>For ease of configuration, an equivalent JSON dictionary format is also defined.
It consists of a dictionary whose keys are the name of each element type (converted
from snake_case to camelCase), and whose values are a type-specific representation
of the element intended to maximize legibility.  The cTLS version is represented
by the key "ctlsVersion", whose value is an integer, defaulting to 0 if omitted.</t>
        <t>For example, the following specialization describes a protocol with a single fixed
version (TLS 1.3) and a single fixed cipher suite (TLS_AES_128_GCM_SHA256). On the
wire, ClientHello.cipher_suites, ServerHello.cipher_suites, and the
supported_versions extensions in the ClientHello and ServerHello would be omitted.</t>
        <sourcecode type="JSON"><![CDATA[
{
  "ctlsVersion": 0,
  "profile": "0001020304050607",
  "version": 772,
  "cipherSuite": "TLS_AES_128_GCM_SHA256"
}
]]></sourcecode>
        <section anchor="initial-template-elements">
          <name>Initial template elements</name>
          <section anchor="profile">
            <name><tt>profile</tt></name>
            <t>This element identifies the profile being defined.  Its binary value is:</t>
            <artwork><![CDATA[
opaque ProfileID<1..2^8-1>
]]></artwork>
            <t>This encodes the profile ID, if one is specified.  IDs whose
decoded length is 4 bytes or less are reserved (see <xref target="reserved-profiles"/>). When a
reserved value is used (including the default value), other keys MUST NOT appear
in the template, and a client MUST NOT accept the template unless it recognizes
the ID.</t>
            <t>In JSON, the profile ID is represented as a hexadecimal-encoded string.</t>
          </section>
          <section anchor="version">
            <name><tt>version</tt></name>
            <t>Value: a single <tt>ProtocolVersion</tt> (<xref section="4.1.2" sectionFormat="comma" target="RFC8446"/>) that both parties agree to use. For TLS 1.3, the <tt>ProtocolVersion</tt> is 0x0304.</t>
            <t>When this element is included, the <tt>supported_versions</tt> extension
is omitted from <tt>ClientHello.extensions</tt>.</t>
            <t>In JSON, the version is represented as an integer (772 = 0x0304 for TLS 1.3).</t>
          </section>
          <section anchor="ciphersuite">
            <name><tt>cipher_suite</tt></name>
            <t>Value: a single <tt>CipherSuite</tt> (<xref section="4.1.2" sectionFormat="comma" target="RFC8446"/>) that both parties agree to use.</t>
            <t>When this element is included, the <tt>ClientHello.cipher_suites</tt> and
<tt>ServerHello.cipher_suite</tt> fields are omitted.</t>
            <t>In JSON, the cipher suite is represented using the "TLS_AEAD_HASH" syntax
defined in <xref section="8.4" sectionFormat="comma" target="RFC8446"/>.</t>
          </section>
          <section anchor="dhgroup">
            <name><tt>dh_group</tt></name>
            <t>Value: a single <tt>CTLSKeyShareGroup</tt> to use for key establishment.</t>
            <artwork><![CDATA[
struct {
    NamedGroup group_name;
    uint16 key_share_length;
} CTLSKeyShareGroup;
]]></artwork>
            <t>This is equivalent to adding a "supported_groups" extension to every message
where that is allowed (i.e. ClientHello and EncryptedExtensions, in TLS 1.3)
consisting solely of the group <tt>CTLSKeyShareGroup.group_name</tt>.</t>
            <t>Static vectors (see <xref target="static-vectors"/>):</t>
            <ul spacing="normal">
              <li>
                <t><tt>KeyShareClientHello.client_shares</tt></t>
              </li>
              <li>
                <t><tt>KeyShareEntry.key_exchange</tt>, if <tt>CTLSKeyShareGroup.key_share_length</tt> is non-zero.</t>
              </li>
            </ul>
            <t>In JSON, this value is represented as a dictionary with two keys:</t>
            <ul spacing="normal">
              <li>
                <t><tt>groupName</tt>: a string containing the code point name from the TLS Supported Groups registry (e.g., "x25519").</t>
              </li>
              <li>
                <t><tt>keyShareLength</tt>: an integer, defaulting to zero if omitted.</t>
              </li>
            </ul>
          </section>
          <section anchor="signaturealgorithm">
            <name><tt>signature_algorithm</tt></name>
            <t>Value: a single <tt>CTLSSignatureAlgorithm</tt> to use for authentication.</t>
            <artwork><![CDATA[
struct {
    SignatureScheme signature_scheme;
    uint16 signature_length;
} CTLSSignatureAlgorithm;
]]></artwork>
            <t>This is equivalent to a placing a literal "signature_algorithms" extension
consisting solely of <tt>CTLSSignatureAlgorithm.signature_scheme</tt> in every extensions field where the "signature_algorithms" extension is
permitted to appear (i.e. ClientHello and CertificateRequest, in TLS 1.3).  When this element is included,
<tt>CertificateVerify.algorithm</tt> is omitted.</t>
            <t>Static vectors (see <xref target="static-vectors"/>):</t>
            <ul spacing="normal">
              <li>
                <t><tt>CertificateVerify.signature</tt>, if <tt>CTLSSignatureAlgorithm.signature_length</tt> is non-zero.</t>
              </li>
            </ul>
            <t>In JSON, the
signature algorithm is listed by the code point name in <xref section="4.2.3" sectionFormat="comma" target="RFC8446"/>. (e.g., ecdsa_secp256r1_sha256).
In JSON, this value is represented as a dictionary with two keys:</t>
            <ul spacing="normal">
              <li>
                <t><tt>signatureScheme</tt>: a string containing the code point name in the TLS SignatureScheme registry (e.g., "ecdsa_secp256r1_sha256").</t>
              </li>
              <li>
                <t><tt>signatureLength</tt>: an integer, defaulting to zero if omitted.</t>
              </li>
            </ul>
          </section>
          <section anchor="random">
            <name><tt>random</tt></name>
            <t>Value: a single <tt>uint8</tt>.</t>
            <t>The <tt>ClientHello.Random</tt> and <tt>ServerHello.Random</tt> values
are truncated to the given length.  Where a 32-byte <tt>Random</tt> is
required, the Random is padded to the right with 0s and the
anti-downgrade mechanism in <xref section="4.1.3" sectionFormat="comma" target="RFC8446"/> is disabled.
IMPORTANT: Using short Random values can lead to potential
attacks. The Random length MUST be less than or equal to 32 bytes.</t>
            <ul empty="true">
              <li>
                <t>OPEN ISSUE: Karthik Bhargavan suggested the idea of hashing
ephemeral public keys and to use the result (truncated to 32 bytes)
as random values. Such a change would require a security analysis.</t>
              </li>
            </ul>
            <t>In JSON, the length is represented as an integer.</t>
          </section>
          <section anchor="mutualauth">
            <name><tt>mutual_auth</tt></name>
            <t>Value: a single <tt>uint8</tt>, with 1 representing "true" and 0 representing
"false".  All other values are forbidden.</t>
            <t>If set to true, this element indicates that the client must authenticate with
a certificate by sending Certificate and a CertificateVerify message.
If the CertificateRequest message does not add information not already
conveyed in the template, the server SHOULD omit it.</t>
            <t>In JSON, this value is represented as <tt>true</tt> or <tt>false</tt>.</t>
            <ul empty="true">
              <li>
                <t>TODO: It seems like there was an intent to elide the
<tt>Certificate.certificate_request_context</tt> field, but this is not stated
explicitly anywhere.</t>
              </li>
            </ul>
          </section>
          <section anchor="handshakeframing">
            <name><tt>handshake_framing</tt></name>
            <t>Value: <tt>uint8</tt>, with 0 indicating "false" and 1 indicating "true".
If true, handshake messages MUST be conveyed inside a <tt>Handshake</tt>
(<xref section="4" sectionFormat="comma" target="RFC8446"/>) struct on reliable, ordered transports, or a
<tt>DTLSHandshake</tt> (<xref section="5.2" sectionFormat="comma" target="RFC9147"/>) struct otherwise,
and MAY be broken into multiple records as in TLS and DTLS.  If false,
each handshake message is conveyed in a <tt>CTLSHandshake</tt> or
<tt>CTLSDatagramHandshake</tt> struct (<xref target="ctlshandshake"/>), which MUST be the payload
of a single record.</t>
            <t>In JSON, this value is represented as <tt>true</tt> or <tt>false</tt>.</t>
          </section>
          <section anchor="clienthelloextensions-serverhelloextensions-encryptedextensions-and-certificaterequestextensions">
            <name><tt>client_hello_extensions</tt>, <tt>server_hello_extensions</tt>, <tt>encrypted_extensions</tt>, and <tt>certificate_request_extensions</tt></name>
            <t>Value: a single <tt>CTLSExtensionTemplate</tt> struct:</t>
            <artwork><![CDATA[
struct {
  Extension predefined_extensions<0..2^16-1>;
  ExtensionType expected_extensions<0..2^16-1>;
  ExtensionType self_delimiting_extensions<0..2^16-1>;
  uint8 allow_additional;
} CTLSExtensionTemplate;
]]></artwork>
            <t>The <tt>predefined_extensions</tt> field indicates extensions that should be treated
as if they were included in the corresponding message.  This allows these
extensions to be omitted entirely.</t>
            <t>The <tt>expected_extensions</tt> field indicates extensions that must be included
in the corresponding message, at the beginning of its <tt>extensions</tt> field.
The types of these extensions are omitted when serializing the <tt>extensions</tt>
field of the corresponding message.</t>
            <t>The <tt>self_delimiting_extensions</tt> field indicates extensions whose data is
self-delimiting. The cTLS implementation MUST be able to parse all these
extensions, and all extensions listed in <xref section="4.2" sectionFormat="of" target="RFC8446"/>.</t>
            <t>The <tt>allow_additional</tt> field MUST be 0 (false) or 1 (true), indicating whether
additional extensions are allowed here.</t>
            <t><tt>predefined_extensions</tt> and <tt>expected_extensions</tt> MUST be in strictly ascending
order by <tt>ExtensionType</tt>, and a single <tt>ExtensionType</tt> MUST NOT appear in both
lists.  If the <tt>version</tt>, <tt>dh_group</tt>, or <tt>signature_algorithm</tt> element appears
in the template, the corresponding <tt>ExtensionType</tt> MUST NOT appear here.  The
<tt>pre_shared_key</tt> <tt>ExtensionType</tt> MUST NOT appear in either list.</t>
            <ul empty="true">
              <li>
                <t>OPEN ISSUE: Are there other extensions that would benefit from special
treatment, as opposed to hex values.</t>
              </li>
            </ul>
            <t>Static vectors (see <xref target="static-vectors"/>):</t>
            <ul spacing="normal">
              <li>
                <t><tt>Extension.extension_data</tt> for any extension whose type is in
<tt>self_delimiting_extensions</tt>, or is listed in
<xref section="4.2" sectionFormat="of" target="RFC8446"/> except <tt>padding</tt>.  This applies only to the corresponding message.</t>
              </li>
              <li>
                <t>The <tt>extensions</tt> field of the corresponding message, if <tt>allow_additional</tt> is false.</t>
              </li>
            </ul>
            <t>In JSON, this value is represented as a dictionary with three keys:</t>
            <ul spacing="normal">
              <li>
                <t><tt>predefinedExtensions</tt>: a dictionary mapping <tt>ExtensionType</tt> names (<xref section="4.2" sectionFormat="comma" target="RFC8446"/>) to values encoded as hexadecimal strings.</t>
              </li>
              <li>
                <t><tt>expectedExtensions</tt>: an array of <tt>ExtensionType</tt> names.</t>
              </li>
              <li>
                <t><tt>selfDelimitingExtensions</tt>: an array of <tt>ExtensionType</tt> names.</t>
              </li>
              <li>
                <t><tt>allowAdditional</tt>: <tt>true</tt> or <tt>false</tt>.</t>
              </li>
            </ul>
            <t>If <tt>predefinedExtensions</tt> or <tt>expectedExtensions</tt> is empty, it MAY be omitted.</t>
            <ul empty="true">
              <li>
                <t>OPEN ISSUE: Should we have a <tt>certificate_entry_extensions</tt> element?</t>
              </li>
            </ul>
          </section>
          <section anchor="finishedsize">
            <name><tt>finished_size</tt></name>
            <t>Value: <tt>uint8</tt>, indicating that the Finished value is to be truncated to the given
length.</t>
            <ul empty="true">
              <li>
                <t>OPEN ISSUE: How short should we allow this to be? TLS 1.3 uses
the native hash and TLS 1.2 used 12 bytes. More analysis is needed
to know the minimum safe Finished size. See <xref section="E.1" sectionFormat="comma" target="RFC8446"/>
for more on this, as well as
https://mailarchive.ietf.org/arch/msg/tls/TugB5ddJu3nYg7chcyeIyUqWSbA.
The minimum safe size may vary depending on whether the template was
learned via a trusted channel.</t>
              </li>
            </ul>
            <t>In JSON, this length is represented as an integer.</t>
          </section>
          <section anchor="optional">
            <name><tt>optional</tt></name>
            <t>Value: a <tt>CTLSTemplate</tt> containing elements that are not required to be understood
by the client.  Server operators MUST NOT place an element in this section unless
the server is able to determine whether the client is using it from the client data
it receives. A key MUST NOT appear in both the main template and the optional
section.</t>
            <t>In JSON, this value is represented in the same way as the <tt>CTLSTemplate</tt> itself.</t>
          </section>
          <section anchor="known-certs">
            <name><tt>known_certificates</tt></name>
            <t>Value: a <tt>CertificateMap</tt> struct:</t>
            <artwork><![CDATA[
struct {
  opaque id<1..2^8-1>;
  opaque cert_data<1..2^16-1>;
} CertificateMapEntry;

struct {
  CertificateMapEntry entries<2..2^24-1>;
} CertificateMap;
]]></artwork>
            <t>Entries in the certificate map must appear in strictly ascending lexicographic
order by ID.</t>
            <t>In JSON, <tt>CertificateMap</tt> is represented as a dictionary from <tt>id</tt> to <tt>cert_data</tt>,
which are both represented as hexademical strings:</t>
            <sourcecode type="JSON"><![CDATA[
{
  "00": "3082...",
  "01": "3082...",
}
]]></sourcecode>
            <t>Certificates are a major contributor to the size of a TLS handshake.  In order
to avoid this overhead when the parties to a handshake have already exchanged
certificates, a compression profile can specify a dictionary of "known
certificates" that effectively acts as a compression dictionary on certificates.</t>
            <t>When compressing a Certificate message, the sender examines the cert_data field
of each CertificateEntry.  If the cert_data matches a value in the known
certificates object, then the sender replaces the cert_data with the
corresponding key.  Decompression works the opposite way, replacing keys with
values.</t>
            <t>Note that in this scheme, there is no signaling on the wire for whether a given
cert_data value is compressed or uncompressed.  Known certificates objects
SHOULD be constructed in such a way as to avoid a uncompressed object being
mistaken for compressed one and erroneously decompressed.  For X.509, it is
sufficient for the first byte of the compressed value (key) to have a value
other than 0x30, since every X.509 certificate starts with this byte.</t>
            <t>This element can be used to compress both client and server certificates.
However, in most deployments where client certificates are used, it would be
inefficient to encode all client certificates into a single profile.  Instead,
deployments can define a unique profile for each client, distinguished by
the profile ID.  Note that the profile ID is sent in cleartext, so this
strategy has significant privacy implications.</t>
          </section>
        </section>
        <section anchor="static-vectors">
          <name>Static vector compression</name>
          <t>Some cTLS template elements imply that certain vectors (as defined in <xref section="3.4" sectionFormat="comma" target="RFC8446"/>) have a fixed number of elements during the handshake.  These
template elements note these "static vectors" in their definition.  When encoding
a "static vector", its length prefix is omitted.</t>
          <t>For example, suppose that the cTLS template is:</t>
          <sourcecode type="JSON"><![CDATA[
{
  "ctlsVersion": 0,
  "version": 772,
  "dhGroup": {
    "groupName": "x25519",
    "keyShareLength": 32
  },
  "clientHelloExtensions": {
    "expectedExtensions": ["key_share"],
    "allowAdditional": false
  }
}
]]></sourcecode>
          <t>Then, the following structure:</t>
          <artwork><![CDATA[
   28                 // length(extensions)
   33 26              // extension_type = KeyShare
     0024             // length(client_shares)
       001d           // KeyShareEntry.group
       0020           // length(KeyShareEntry.key_exchange)
         a690...af948 // KeyShareEntry.key_exchange
]]></artwork>
          <t>is compressed down to:</t>
          <artwork><![CDATA[
   a690...af948 // KeyShareEntry.key_exchange
]]></artwork>
          <t>according to the following rationale:</t>
          <ul spacing="normal">
            <li>
              <t>The length of <tt>extensions</tt> is omitted because <tt>allowAdditional</tt> is false, so
the number of items in <tt>extensions</tt> (i.e., 1) is known in advance.</t>
            </li>
            <li>
              <t><tt>extension_type</tt> is omitted because it is specified by <tt>expected_extensions</tt>.</t>
            </li>
            <li>
              <t>The length of <tt>client_shares</tt> is omitted because the use of <tt>dhGroup</tt> implies
that there can only be one <tt>KeyShareEntry</tt>.</t>
            </li>
            <li>
              <t><tt>KeyShareEntry.group</tt> is omitted because it is specified by <tt>dhGroup</tt>.</t>
            </li>
            <li>
              <t>The length of the <tt>key_exchange</tt> is omitted because the "x25519" key share
has a fixed size (32 bytes).</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="record-layer">
        <name>Record Layer</name>
        <t>The only cTLS records that are sent in plaintext are handshake records
(ClientHello and ServerHello/HRR) and alerts. cTLS alerts are the same
as TLS/DTLS alerts and use the same content types.  For handshake records,
we set the <tt>content_type</tt> field to a fixed cTLS-specific value to
distinguish cTLS plaintext records from encrypted records, TLS/DTLS
records, and other protocols using the same 5-tuple.</t>
        <artwork><![CDATA[
      struct {
          ContentType content_type = ctls_handshake;
          opaque profile_id<0..2^8-1>;
          opaque fragment<0..2^16-1>;
      } CTLSClientPlaintext;
]]></artwork>
        <t>The <tt>profile_id</tt> field MUST identify the profile that is in use. A
zero-length ID corresponds to the cTLS default protocol.
The server's reply does not include the <tt>profile_id</tt>, because the server
must be using the same profile indicated by the client.</t>
        <artwork><![CDATA[
      struct {
          ContentType content_type = ctls_handshake;
          opaque fragment<0..2^16-1>;
      } CTLSServerPlaintext;
]]></artwork>
        <t>Encrypted records use DTLS 1.3 <xref target="RFC9147"/> record framing, comprising a configuration octet
followed by optional connection ID, sequence number, and length fields. The
encryption process and additional data are also as described in DTLS.</t>
        <artwork><![CDATA[
      0 1 2 3 4 5 6 7
      +-+-+-+-+-+-+-+-+
      |0|0|1|C|S|L|E E|
      +-+-+-+-+-+-+-+-+
      | Connection ID |   Legend:
      | (if any,      |
      /  length as    /   C   - Connection ID (CID) present
      |  negotiated)  |   S   - Sequence number length
      +-+-+-+-+-+-+-+-+   L   - Length present
      | 8 or 16 bit   |   E   - Epoch
      |Sequence Number|
      | (if present)  |
      +-+-+-+-+-+-+-+-+
      | 16 bit Length |
      | (if present)  |
      +-+-+-+-+-+-+-+-+

      struct {
          opaque unified_hdr[variable];
          opaque encrypted_record[length];
      } CTLSCiphertext;
]]></artwork>
        <t>The presence and size of the connection ID field is negotiated as in DTLS.</t>
        <t>As with DTLS, the length field MAY be omitted by clearing the L bit, which means
that the record consumes the entire rest of the data in the lower level
transport.  In this case it is not possible to have multiple DTLSCiphertext
format records without length fields in the same datagram.  In stream-oriented
transports (e.g., TCP), the length field MUST be present. For use over other
transports length information may be inferred from the underlying layer.</t>
        <t>Normal DTLS does not provide a mechanism for suppressing the sequence number
field entirely. When a reliable, ordered transport (e.g., TCP) is in use, the
S bit in the configuration octet MUST be cleared and the sequence number
MUST be omitted. When an unreliable transport is in use, the S bit
has its usual meaning and the sequence number MUST be included.</t>
      </section>
      <section anchor="ctlshandshake">
        <name>cTLS Handshake Layer</name>
        <t>The cTLS handshake is modeled in three layers:</t>
        <ol spacing="normal" type="1"><li>
            <t>The Transport layer</t>
          </li>
          <li>
            <t>The Transcript layer</t>
          </li>
          <li>
            <t>The Logical layer</t>
          </li>
        </ol>
        <section anchor="the-transport-layer">
          <name>The Transport layer</name>
          <t>When <tt>template.handshake_framing</tt> is false, the cTLS transport layer
uses a custom handshake
framing that saves space by relying on the record layer for message lengths.
(This saves 3 bytes per message compared to TLS, or 9 bytes compared to DTLS.)
This compact framing is defined by the <tt>CTLSHandshake</tt> and
<tt>CTLSDatagramHandshake</tt> structs.</t>
          <t>Any handshake type registered in the IANA TLS HandshakeType Registry can be
conveyed in a <tt>CTLS[Datagram]Handshake</tt>, but not all messages are actually
allowed on a given connection.  This definition shows the messages types
supported in <tt>CTLSHandshake</tt> as of TLS 1.3 and DTLS 1.3, but any future
message types are also permitted.</t>
          <artwork><![CDATA[
      struct {
          HandshakeType msg_type;    /* handshake type */
          select (CTLSHandshake.msg_type) {
              case client_hello:          ClientHello;
              case server_hello:          ServerHello;
              case hello_retry_request:   HelloRetryRequest;  /* New */
              case end_of_early_data:     EndOfEarlyData;
              case encrypted_extensions:  EncryptedExtensions;
              case certificate_request:   CertificateRequest;
              case certificate:           Certificate;
              case certificate_verify:    CertificateVerify;
              case finished:              Finished;
              case new_session_ticket:    NewSessionTicket;
              case key_update:            KeyUpdate;
              case request_connection_id: RequestConnectionId;
              case new_connection_id:     NewConnectionId;
          };
      } CTLSHandshake;

      struct {
          HandshakeType msg_type;    /* handshake type */
          uint16 message_seq;        /* DTLS-required field */
          select (CTLSDatagramHandshake.msg_type) {
            ... /* same as CTLSHandshake */
          };
      } CTLSDatagramHandshake;
]]></artwork>
          <t>Each <tt>CTLSHandshake</tt> or <tt>CTLSDatagramHandshake</tt> MUST be conveyed as a single
<tt>CTLSClientPlaintext.fragment</tt>, <tt>CTLSServerPlaintext.fragment</tt>, or
<tt>CTLSCiphertext.encrypted_record</tt>, and is therefore limited to a maximum
length of <tt>2^16-1</tt> or less.  When operating over UDP, large
<tt>CTLSDatagramHandshake</tt> messages will also require the use of IP
fragmentation, which is sometimes undesirable.  Operators can avoid these
concerns by setting <tt>template.handshakeFraming = true</tt>.</t>
          <t>On unreliable transports, the DTLS 1.3 ACK system is used.</t>
        </section>
        <section anchor="the-transcript-layer">
          <name>The Transcript layer</name>
          <t>TLS and DTLS start the handshake with an empty transcript.  cTLS is different:
it starts the transcript with a "virtual message" whose HandshakeType is
<tt>ctls_template</tt> (<xref target="template-handshaketype"/>) containing the <tt>CTLSTemplate</tt> used
for this connection.  This message is included in the transcript even though it
is not exchanged during connection setup, in order to ensure that both parties
are using the same template.  Subsequent messages are appended to the transcript
as usual.</t>
          <t>When computing the handshake transcript, all handshake messages are represented
in TLS <tt>Handshake</tt> messages, as in DTLS 1.3 (<xref section="5.2" sectionFormat="comma" target="RFC9147"/>),
regardless of <tt>template.handshake_framing</tt>.</t>
          <t>To ensure that all parties agree about what protocol is in use, and whether
records are subject to loss, the Cryptographic Label Prefix used for the
handshake SHALL be "Sctls " (for "Stream cTLS") if <tt>Handshake</tt> or <tt>CTLSHandshake</tt>
transport was used, and "Dctls " (for "Datagram cTLS") otherwise.  (This is
similar to the prefix substitution in <xref section="5.9" sectionFormat="of" target="RFC9147"/>).</t>
        </section>
        <section anchor="the-logical-layer">
          <name>The Logical layer</name>
          <t>The logical handshake layer consists of handshake messages that are reconstructed
following the instructions in the template.  At this layer, predefined extensions
are reintroduced, truncated Random values are extended, and all information is
prepared to enable the cryptographic handshake and any import or export of
key material and configuration.</t>
          <t>There is no obligation to reconstruct logical handshake messages in any specific
format, and client and server do not need to agree on the precise representation
of these messages, so long as they agree on their logical contents.</t>
        </section>
      </section>
    </section>
    <section anchor="handshake-messages">
      <name>Handshake Messages</name>
      <t>In general, we retain the basic structure of each individual
TLS or DTLS handshake message. However, the following handshake
messages have been modified for space reduction and cleaned
up to remove pre-TLS 1.3 baggage.</t>
      <section anchor="clienthello">
        <name>ClientHello</name>
        <t>The cTLS ClientHello is defined as follows.</t>
        <artwork><![CDATA[
      opaque Random[RandomLength];      // variable length

      struct {
          Random random;
          CipherSuite cipher_suites<1..2^16-1>;
          Extension extensions<1..2^16-1>;
      } ClientHello;
]]></artwork>
      </section>
      <section anchor="serverhello">
        <name>ServerHello</name>
        <t>We redefine ServerHello in the following way.</t>
        <artwork><![CDATA[
      struct {
          Random random;
          CipherSuite cipher_suite;
          Extension extensions<1..2^16-1>;
      } ServerHello;
]]></artwork>
      </section>
      <section anchor="helloretryrequest">
        <name>HelloRetryRequest</name>
        <t>In cTLS, the HelloRetryRequest message is a true handshake message
instead of a specialization of ServerHello.  The HelloRetryRequest has
the following format.</t>
        <artwork><![CDATA[
      struct {
          CipherSuite cipher_suite;
          Extension extensions<2..2^16-1>;
      } HelloRetryRequest;
]]></artwork>
        <t>The HelloRetryRequest is the same as the ServerHello above
but without the unnecessary sentinel Random value.</t>
        <ul empty="true">
          <li>
            <t>OPEN ISSUE: Should we define a <tt>hello_retry_request_extensions</tt> template
  element?  Or is this too far off the happy path to be worth optimizing?</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>This section provides some example specializations.</t>
      <t>For this example we use TLS 1.3 only with AES_GCM,
x25519, ALPN h2, short random values, and everything
else is ordinary TLS 1.3.</t>
      <sourcecode type="JSON"><![CDATA[
{
   "ctlsVersion": 0,
   "profile": "0504030201",
   "version" : 772,
   "random": 16,
   "cipherSuite" : "TLS_AES_128_GCM_SHA256",
   "dhGroup": {
     "groupName": "x25519",
     "keyShareLength": 32
   },
   "clientHelloExtensions": {
      "predefinedExtensions": {
          "application_layer_protocol_negotiation" : "030016832",
      },
      "allowAdditional": true
    }
}
]]></sourcecode>
      <t>Version 772 corresponds to the hex representation 0x0304 (i.e. 1.3).</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The use of key ids is a new feature introduced in this document, which
requires some analysis, especially as it looks like a potential source
of identity misbinding. This is, however, entirely separable
from the rest of the specification.</t>
      <t>Once the handshake has completed, this specification is intended to
provide a fully secured connection even if the client initially learned the
template through an untrusted channel.  However, this security relies on
the use of a cryptographically strong Finished message.  If the Finished
message has not yet been received, or the transcript hash has been
truncated by use of a small <tt>finished_size</tt> template element value, an
attacker could be using a forged template to impersonate the other party.
This should not impact any ordinary use of TLS, including Early Data (which
is secured by the previously completed handshake).</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="adding-a-contenttype">
        <name>Adding a ContentType</name>
        <t>This document requests that a code point be allocated from the "TLS ContentType
registry.  This value must be in the range 0-31 (inclusive).  The row to be
added in the registry has the following form:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Description</th>
              <th align="left">DTLS-OK</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">TBD</td>
              <td align="left">ctls</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">TBD</td>
              <td align="left">ctls_handshake</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
          </tbody>
        </table>
        <ul empty="true">
          <li>
            <t>RFC EDITOR: Please replace the value TBD with the value assigned by IANA, and
the value XXXX to the RFC number assigned for this document.</t>
          </li>
        </ul>
      </section>
      <section anchor="template-keys">
        <name>Template Keys</name>
        <t>This document requests that IANA open a new registry entitled "cTLS Template Keys", on the Transport Layer Security (TLS) Parameters page, with a "Specification Required" registration policy and the following initial contents:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Value</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">profile</td>
              <td align="left">0</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">version</td>
              <td align="left">1</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">cipher_suite</td>
              <td align="left">2</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">dh_group</td>
              <td align="left">3</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">signature_algorithm</td>
              <td align="left">4</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">random</td>
              <td align="left">5</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">mutual_auth</td>
              <td align="left">6</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">handshake_framing</td>
              <td align="left">7</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">client_hello_extensions</td>
              <td align="left">8</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">server_hello_extensions</td>
              <td align="left">9</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">encrypted_extensions</td>
              <td align="left">10</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">certificate_request_extensions</td>
              <td align="left">11</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">known_certificates</td>
              <td align="left">12</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">finished_size</td>
              <td align="left">13</td>
              <td align="left">(This document)</td>
            </tr>
            <tr>
              <td align="left">optional</td>
              <td align="left">65535</td>
              <td align="left">(This document)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="template-handshaketype">
        <name>Adding a cTLS Template message type</name>
        <t>IANA is requested to add the following entry to the TLS HandshakeType registry.</t>
        <ul spacing="normal">
          <li>
            <t>Value: TBD</t>
          </li>
          <li>
            <t>Description: ctls_template</t>
          </li>
          <li>
            <t>DTLS-OK: Y</t>
          </li>
          <li>
            <t>Reference: (This document)</t>
          </li>
          <li>
            <t>Comment: Virtual message used in cTLS.</t>
          </li>
        </ul>
      </section>
      <section anchor="activating-the-helloretryrequest-messagetype">
        <name>Activating the HelloRetryRequest MessageType</name>
        <t>This document requests that IANA change the name of entry 6 in the TLS
HandshakeType Registry from "hello_retry_request_RESERVED" to
"hello_retry_request", and set its Reference field to this document.</t>
      </section>
      <section anchor="reserved-profiles">
        <name>Reserved profiles</name>
        <t>This document requests that IANA open a new registry entitled "Well-known
cTLS Profile IDs", on the Transport Layer Security (TLS) Parameters page,
with the following columns:</t>
        <ul spacing="normal">
          <li>
            <t>ID value: A sequence of 1-4 octets.</t>
          </li>
          <li>
            <t>Template: A JSON object.</t>
          </li>
          <li>
            <t>Note: An explanation or reference.</t>
          </li>
        </ul>
        <t>The ID values of length 1 are subject to a "Standards Action" registry
policy. Values of length 2 are subject to an "RFC Required" policy. Values
of length 3 and 4 are subject to a "First Come First Served" policy. Values
longer than 4 octets are not subject to registration and MUST NOT appear
in this registry.</t>
        <t>The initial registry contents are:</t>
        <table>
          <thead>
            <tr>
              <th align="left">ID value</th>
              <th align="left">Template</th>
              <th align="left">Note</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>[0x00]</tt></td>
              <td align="left">
                <tt>{"version": 772}</tt></td>
              <td align="left">cTLS 1.3-only</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9147">
          <front>
            <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
            <date month="April" year="2022"/>
            <abstract>
              <t>This document specifies version 1.3 of the Datagram Transport Layer Security (DTLS) protocol. DTLS 1.3 allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>The DTLS 1.3 protocol is based on the Transport Layer Security (TLS) 1.3 protocol and provides equivalent security guarantees with the exception of order protection / non-replayability. Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t>
              <t>This document obsoletes RFC 6347.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9147"/>
          <seriesInfo name="DOI" value="10.17487/RFC9147"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="Comparse" target="https://eprint.iacr.org/2023/1390">
          <front>
            <title>Comparse: Provably Secure Formats for Cryptographic Protocols</title>
            <author initials="T." surname="Wallez" fullname="Theophile Wallez">
              <organization/>
            </author>
            <author initials="J." surname="Protzenko" fullname="Jonathan Protzenko">
              <organization/>
            </author>
            <author initials="K." surname="Bhargavan" fullname="Karthikeyan Bhargavan">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 863?>

<section anchor="transcripts">
      <name>Example Exchange</name>
      <t>The follow exchange illustrates a complete cTLS-based exchange supporting
mutual authentication using certificates. The digital signatures use Ed25519.
The ephemeral Diffie-Hellman uses the X25519 curve and
the exchange negotiates TLS-AES-128-CCM8-SHA256.
The certificates are exchanged using certificate identifiers.</t>
      <t>The resulting byte counts are as follows:</t>
      <artwork><![CDATA[
                     ECDHE
              ------------------
              TLS  CTLS  Cryptovariables
              ---  ----  ---------------
ClientHello   132   74       64
ServerHello    90   68       64
ServerFlight  478   92       72
ClientFlight  458   91       72
========================================
Total        1158  325      272
]]></artwork>
      <t>The following compression profile was used in this example:</t>
      <sourcecode type="JSON"><![CDATA[
{
  "ctlsVersion": 0,
  "profile": "abcdef1234",
  "version": 772,
  "cipherSuite": "TLS_AES_128_CCM_8_SHA256",
  "dhGroup": {
    "groupName": "x25519",
    "keyShareLength": 32
  },
  "signatureAlgorithm": {
    "signatureScheme": "ed25519",
    "signatureLength": 64
  },
  "finishedSize": 8,
  "clientHelloExtensions": {
    "predefinedExtensions": {
      "server_name": "000e00000b6578616d706c652e636f6d"
    },
    "expectedExtensions": ["key_share"],
    "allowAdditional": false
  },
  "serverHelloExtensions": {
    "expectedExtensions": ["key_share"],
    "allowAdditional": false
  },
  "encryptedExtensions": {
    "allowAdditional": false
  },
  "mutualAuth": true,
  "knownCertificates": {
    "61": "3082...",
    "62": "3082...",
    "63": "...",
    "64": "...",
    ...
  }
}
]]></sourcecode>
      <t>ClientHello: 74 bytes = Profile ID(5) + Random(32) + DH(32) + Overhead(5)</t>
      <artwork><![CDATA[
$TBD               // CTLSClientPlaintext.message_type = ctls_handshake
05 abcdef1234      // CTLSClientPlaintext.profile_id
0041               // CTLSClientPlaintext.fragment length = 65
  01               // CTLSHandshake.msg_type = client_hello
    5856...c130    //   ClientHello.random (32 bytes)
// ClientHello.extensions is omitted except for the key share contents.
      a690...f948  //     KeyShareEntry.key_exchange (32 bytes)
]]></artwork>
      <t>ServerHello: 68 bytes = Random(32) + DH(32) + Overhead(4)</t>
      <artwork><![CDATA[
$TBD               // CTLSServerPlaintext.message_type = ctls_handshake
0041               // CTLSServerPlaintext.fragment length
  02               //   CTLSHandshake.msg_type = server_hello
    cff4...9ca8    //     ServerHello.random (32 bytes)
// ServerHello.extensions is omitted except for the key share contents.
      9fbc...0f49  //       KeyShareEntry.key_exchange (32 bytes)
]]></artwork>
      <t>Server Flight: 92 =
    SIG(64) + Finished(8) + MAC(8) + CERTID(1) + Overhead(11)</t>
      <artwork><![CDATA[
24                 // CTLSCipherText header, L=1, C,S,E=0
0059               // CTLSCipherText.length = 89

// BEGIN ENCRYPTED CONTENT

08                 // CTLSHandshake.msg_type = encrypted_extensions

// The EncryptedExtensions body is omitted because there are no more
// extensions.  The length is also omitted, because allowAdditional is
// false.

// The CertificateRequest message is omitted because "mutualAuth" and
// "signatureAlgorithm" are specified in the template.

0b                 // CTLSHandshake.msg_type = certificate
  00               //   Certificate.certificate_request_context = ""
  03               //   Certificate.certificate_list length
    01             //     CertificateEntry.cert_data length
      61           //       cert_data = 'a'
    00             //     CertificateEntry.extensions

0f                 // CTLShandshake.msg_type = certificate_verify
  3045...10ce      //   CertificateVerify.signature

14                 // CTLSHandshake.msg_type = finished
  bfc9d66715bb2b04 //   Finished.verify_data

// END ENCRYPTED CONTENT

b3d9...0aa7        // CCM-8 MAC (8 bytes)
]]></artwork>
      <t>Client Flight: 91 bytes =
    SIG(64) + Finished(8) + MAC(8) + CERTID(1) + Overhead(10)</t>
      <artwork><![CDATA[
24                 // CTLSCipherText header, L=1, C,S,E=0
0058               // CTLSCipherText.length = 88

// BEGIN ENCRYPTED CONTENT

0b                 // CTLSHandshake.msg_type = certificate
  00               //   Certificate.certificate_request_context = ""
  03               //   Certificate.certificate_list length
    01             //     CertificateEntry.cert_data length
      62           //       cert_data = 'b'
    00             //     CertificateEntry.extensions

0f                 // CTLSHandshake.msg_type = certificate_verify
                   //   CertificateVerify.algorithm is omitted
                   //   CertificateVerify.signature length is omitted
  3045...f60e      //   CertificateVerify.signature (64 bytes)

14                 // CTLSHandshake.msg_type = finished
  35e9c34eec2c5dc1 //   Finished.verify_data

// END ENCRYPTED CONTENT

09c5..37b1         // CCM-8 MAC (8 bytes)
]]></artwork>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>We would like to thank Karthikeyan Bhargavan, Owen Friel, Sean Turner, Martin Thomson, Chris Wood, Theophile Wallez, and John Preuß Mattsson.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
