<?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.1 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-tls-ctls-09" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="cTLS 1.3">Compact TLS 1.3</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-tls-ctls-09"/>
    <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>Google</organization>
      <address>
        <email>ietf@bemasc.net</email>
      </address>
    </author>
    <date year="2023" month="October" day="23"/>
    <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:
* <tt>groupName</tt>: a string containing the code point name from the TLS Supported Groups registry (e.g., "x25519").
* <tt>keyShareLength</tt>: an integer, defaulting to zero if omitted.</t>
          </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:
* <tt>signatureScheme</tt>: a string containing the code point name in the TLS SignatureScheme registry (e.g., "ecdsa_secp256r1_sha256").
* <tt>signatureLength</tt>: an integer, defaulting to zero if omitted.</t>
          </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 861?>

<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>
