<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.3.24 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-tls-ctls-03" category="std">

  <front>
    <title abbrev="cTLS 1.3">Compact TLS 1.3</title>

    <author initials="E." surname="Rescorla" fullname="Eric Rescorla">
      <organization>Mozilla</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>Arm Limited</organization>
      <address>
        <email>hannes.tschofenig@arm.com</email>
      </address>
    </author>

    <date year="2021" month="July" day="12"/>

    <area>General</area>
    <workgroup>TLS Working Group</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document specifies a “compact” version of TLS 1.3. It is
isomorphic to TLS 1.3 but saves space by trimming obsolete material,
tighter encoding, and a template-based specialization technique. cTLS
is not directly interoperable with TLS 1.3, but it should eventually be
possible for a cTLS/TLS 1.3 server to exist and successfully interoperate.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>DISCLAIMER: This is a work-in-progress draft of cTLS and has not yet
seen significant security analysis, so could contain major errors. It
should not be used as a basis for building production systems.</t>

<t>This document specifies a “compact” version of TLS 1.3 <xref target="RFC8446"/>. It is isomorphic
to TLS 1.3 but designed to take up minimal bandwidth. The space reduction
is achieved by four basic techniques:</t>

<t><list style="symbols">
  <t>Omitting unnecessary values that are a holdover from previous versions
of TLS.</t>
  <t>Omitting the fields and handshake messages required for preserving backwards-compatibility
with earlier TLS versions.</t>
  <t>More compact encodings.</t>
  <t>A template-based specialization mechanism that allows pre-populating information 
at both endpoints without the need for negotiation.</t>
</list></t>

<t>For the common (EC)DHE handshake with pre-established certificates, cTLS
achieves an overhead of 45 bytes over the minimum required by the
cryptovariables.  For a PSK handshake, the overhead is 21 bytes.  Annotated
handshake transcripts for these cases can be found in <xref target="transcripts"/>.</t>

<t>Because cTLS is semantically equivalent to TLS, it can be viewed either
as a related protocol or as a compression mechanism. Specifically, it
can be implemented by a layer between the TLS handshake state
machine and the record layer.</t>

</section>
<section anchor="conventions-and-definitions" title="Conventions and Definitions">

<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 except for replacing integers
with varints.</t>

</section>
<section anchor="common-primitives" title="Common Primitives">

<section anchor="varints" title="Varints">

<t>cTLS makes use of variable-length integers in order to allow a wide
integer range while still providing for a minimal encoding. The
width of the integer is encoded in the first two bits of the field
as follows, with xs indicating bits that form part of the integer.</t>

<texttable>
      <ttcol align='left'>Bit pattern</ttcol>
      <ttcol align='left'>Length (bytes)</ttcol>
      <c>0xxxxxxx</c>
      <c>1</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>10xxxxxx xxxxxxxx</c>
      <c>2</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>11xxxxxx xxxxxxxx xxxxxxxx</c>
      <c>3</c>
</texttable>

<t>Thus, one byte can be used to carry values up to 127.</t>

<t>In the TLS syntax variable integers are denoted as “varint” and
a vector with a top range of a varint is denoted as:</t>

<figure><artwork><![CDATA[
     opaque foo<1..V>;
]]></artwork></figure>

<t>cTLS uses the varint encoding for all multi-byte integers in TLS,
including:</t>

<t><list style="symbols">
  <t>Values of type uint16, uint24, uint32, uint64</t>
  <t>Array and vector entries of these types</t>
  <t>Encoded lengths for vectors that allow more than 255 entries</t>
  <t>Enums that allow more than 255 entries</t>
</list></t>

<t>Values of type uint8, opaque values, and one-byte enums are not
affected.  We do not show the structures which only change in this way.</t>

</section>
<section anchor="template-specialization" title="Template-based Specialization">

<t>The transmission overhead in TLS 1.3 is largely contributed to by two factors, 
:
- the negotiation of algorithm parameters, and extensions,  as well as 
- the exchange of certificates.</t>

<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.</t>

<t>Importantly, this process is performed only for the wire encoding but
not for the handshake transcript.  The result is that the transcript for a
specialized cTLS handshake is the same as the transcript for a TLS 1.3 handshake
with the same features used.</t>

<t>One way of thinking of this is as if specialization is a stateful compression
layer between the handshake and the record layer:</t>

<figure><artwork><![CDATA[
+---------------+---------------+---------------+
|   Handshake   |  Application  |     Alert     |
+---------------+---------------+---------------+    +---------+
|               cTLS Compression Layer          |<---| Profile |
+---------------+---------------+---------------+    +---------+
|          cTLS Record Layer / Application      |
+---------------+---------------+---------------+
]]></artwork></figure>

<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 specified via a JSON dictionary.</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>

<figure><artwork><![CDATA[
{
   "version" : 772,
   "cipherSuite" : "TLS_AES_128_GCM_SHA256"
}
]]></artwork></figure>

<t>The following elements are defined:</t>

<t><list style="hanging">
  <t hangText="profile (integer):">
  identifies the profile being defined.</t>
  <t hangText="version (integer):">
  indicates that both sides agree to the
single TLS version specified by the given integer value
(772 == 0x0304 for TLS 1.3). The supported_versions extension
is omitted from ClientHello.extensions and reconstructed in the transcript as a
single-valued list with the specified value. The supported_versions extension is
omitted from ClientHello.extensions and reconstructed in the transcript with the
specified value.</t>
  <t hangText="cipherSuite (string):">
  indicates that both sides agree to
the single named cipher suite, using the “TLS_AEAD_HASH” syntax
defined in <xref target="RFC8446"/>, Section 8.4. The ClientHello.cipher_suites
field is omitted and reconstructed in the transcript as a single-valued
list with the specified value. The server_hello.cipher_suite field is
omitted and reconstructed in the transcript as the specified value.</t>
  <t hangText="dhGroup (string):">
  specifies a single DH group to use for key establishment. The
group is listed by the code point name in <xref target="RFC8446"/>, Section 4.2.7.
(e.g., x25519). This implies a literal “supported_groups” extension
consisting solely of this group.</t>
  <t hangText="signatureAlgorithm (string):">
  specifies a single signature scheme to use for authentication. The
group is listed by the code point name in <xref target="RFC8446"/>, Section 4.2.7.
(e.g., ed25519). This implies a literal “signature_algorithms” extension
consisting solely of this group.</t>
  <t hangText="random (integer):">
  indicates that the ClientHello.Random and ServerHello.Random values
are truncated to the given length. When the transcript is
reconstructed, the Random is padded to the right with 0s and the
anti-downgrade mechanism in <xref target="RFC8446"/>, Section 4.1.3 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>
</list></t>

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

<t><list style="hanging">
  <t hangText="mutualAuth (boolean):">
  if set to true, indicates that the client must authenticate with
a certificate by sending Certificate and a CertificateVerify message.
The server MUST omit the CertificateRequest message, as its contents
are redundant.
[[OPEN ISSUE: We don’t actually say that you can omit empty messages,
so we need to add that somewhere.]]</t>
  <t hangText="extension_order:">
  indicates in what order extensions appear in respective messages. 
This allows to omit sending the type. If there is only a single 
extension to be transmitted, then the extension length field can also
be omitted. For example, imagine that only the KeyShare extension 
needs to be sent in the ClientHello as the only extension. Then, 
the following structure</t>
</list></t>

<figure><artwork><![CDATA[
   28                    // Extensions.length
   33 26                 // KeyShare
     0024                // client_shares.length
       001d              // KeyShareEntry.group
       0020 a690...af948 // KeyShareEntry.key_exchange
]]></artwork></figure>

<t>is compressed down to (assuming the KeyShare group has been pre-agreed)</t>

<figure><artwork><![CDATA[
   0020 a690...af948 // KeyShareEntry.key_exchange
]]></artwork></figure>

<t><list style="hanging">
  <t hangText="clientHelloExtensions (predefined extensions):">
  Predefined ClientHello extensions, see {predefined-extensions}</t>
  <t hangText="serverHelloExtensions (predefined extensions):">
  Predefined ServerHello extensions, see {predefined-extensions}</t>
  <t hangText="encryptedExtensions (predefined extensions):">
  Predefined EncryptedExtensions extensions, see {predefined-extensions}</t>
  <t hangText="certRequestExtensions (predefined extensions):">
  Predefined CertificateRequest extensions, see {predefined-extensions}</t>
  <t hangText="knownCertificates (known certificates):">
  A compression dictionary for the Certificate message, see {known-certs}</t>
  <t hangText="finishedSize (integer):">
  indicates that the Finished value is to be truncated to the given
length. When the transcript is reconstructed, the remainder of the
Finished value is filled in by the receiving side.</t>
</list></t>

<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 target="RFC8446"/>;
Section E.1 for more on this, as well as
https://mailarchive.ietf.org/arch/msg/tls/TugB5ddJu3nYg7chcyeIyUqWSbA.]]</t>

<section anchor="requirements-on-tls-implementations" title="Requirements on TLS Implementations">

<t>To be compatible with the specializations described in this section, a
TLS stack needs to provide the following features:</t>

<t><list style="symbols">
  <t>If specialization of extensions is to be used, then the TLS stack MUST order
each vector of Extension values in ascending order according to the
ExtensionType.  This allows for a deterministic reconstruction of the extension
list.</t>
  <t>If truncated Random values are to be used, then the TLS stack MUST be
configurable to set the remaining bytes of the random values to zero.  This
ensures that the reconstructed, padded random value matches the original.</t>
  <t>If truncated Finished values are to be used, then the TLS stack MUST be
configurable so that only the provided bytes of the Finished are verified,
or so that the expected remaining values can be computed.</t>
</list></t>

</section>
<section anchor="predefined-extensions" title="Predefined Extensions">

<t>Extensions used in the ClientHello, ServerHello, EncryptedExtensions, and
CertificateRequest messages can be “predefined” in a compression profile, so
that they do not have to be sent on the wire.  A predefined extensions object is
a dictionary whose keys are extension names specified in the TLS
ExtensionTypeRegistry specified in <xref target="RFC8446"/>.  The corresponding value is a
hex-encoded value for the ExtensionData field of the extension.</t>

<t>When compressing a handshake message, the sender compares the extensions in the
message being compressed to the predefined extensions object, applying the
following rules:</t>

<t><list style="symbols">
  <t>If the extensions list in the message is not sorted in ascending order by
extension type, it is an error, because the decompressed message will not
match.</t>
  <t>If there is no entry in the predefined extensions object for the type of the
extension, then the extension is included in the compressed message</t>
  <t>If there is an entry:  <list style="symbols">
      <t>If the ExtensionData of the extension does not match the value in the
dictionary, it is an error, because decompression will not produce the
correct result.</t>
      <t>If the ExtensionData matches, then the extension is removed, and not
included in the compressed message.</t>
    </list></t>
</list></t>

<t>When decompressing a handshake message the receiver reconstitutes the original
extensions list using the predefined extensions:</t>

<t><list style="symbols">
  <t>If there is an extension in the compressed message with a type that exists in
the predefined extensions object, it is an error, because such an extension
would not have been sent by a sender with a compatible compression profile.</t>
  <t>For each entry in the predefined extensions dictionary, an extension is added
to the decompressed message with the specified type and value.</t>
  <t>The resulting vector of extensions MUST be sorted in ascending order by
extension type.</t>
</list></t>

<t>Note that the “version”, “dhGroup”, and “signatureAlgorithm” fields in the
compression profile are specific instances of this algorithm for the
corresponding extensions.</t>

<t>[[OPEN ISSUE: Are there other extensions that would benefit from special
treatment, as opposed to hex values.]]</t>

</section>
<section anchor="known-certs" title="Known Certificates">

<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>A known certificates object is a JSON dictionary whose keys are strings containing
hex-encoded compressed values.  The corresponding values are hex-encoded strings
representing the uncompressed values.  For example:</t>

<figure><artwork><![CDATA[
{
  "00": "3082...",
  "01": "3082...",
}
]]></artwork></figure>

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

</section>
</section>
<section anchor="record-layer" title="Record Layer">

<t>The only cTLS records that are sent in plaintext are handshake records
(ClientHello and ServerHello/HRR).  The content type is therefore constant (it
is always <spanx style="verb">handshake</spanx>), so we instead set the <spanx style="verb">content_type</spanx> 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>

<t>The <spanx style="verb">profile_id</spanx> field allows the client and server to agree on which
compression profile should be used for this session (see
<xref target="template-specialization"/>).  This field MUST be set to zero if and only
if no compression profile is used.  Non-zero values are negotiated out of band
between the client and server, as part of the specification of the compression
profile.</t>

<figure><artwork><![CDATA[
      struct {
          ContentType content_type = ctls_handshake;
          varint profile_id; 
          opaque fragment<0..V>;
      } CTLSPlaintext;
]]></artwork></figure>

<t>[[OPEN ISSUE: The profile_id is needed in the ClientHello to inform the server
what compression profile to use. For a ServerHello this field is not required. 
Should we make this field optional?]]</t>

<t>Encrypted records use DTLS 1.3 record framing, comprising a configuration octet
followed by optional connection ID, sequence number, and length fields.</t>

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

<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.  In cases where a sequence number is not required (e.g., when a
reliable transport is in use), a cTLS implementation may suppress it by setting
the <spanx style="verb">suppressSequenceNumber</spanx> flag in the compression profile being used (see
<xref target="template-specialization"/>).  When this flag is enabled, the S bit in the
configuration octet MUST be cleared.</t>

</section>
<section anchor="handshake-layer" title="Handshake Layer">

<t>The cTLS handshake framing is same as the TLS 1.3 handshake
framing, except for two changes:</t>

<t><list style="symbols">
  <t>The length field is omitted.</t>
  <t>The HelloRetryRequest message is a true handshake message
instead of a specialization of ServerHello.</t>
</list></t>

<figure><artwork><![CDATA[
      struct {
          HandshakeType msg_type;    /* handshake type */
          select (Handshake.msg_type) {
              case client_hello:          ClientHello;
              case server_hello:          ServerHello;
              case hello_retry_request:   HelloRetryRequest;
              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;
          };
      } Handshake;
]]></artwork></figure>

</section>
</section>
<section anchor="handshake-messages" title="Handshake Messages">

<t>In general, we retain the basic structure of each individual
TLS 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" title="ClientHello">

<t>The cTLS ClientHello is defined as follows.</t>

<figure><artwork><![CDATA[
      opaque Random[RandomLength];      // variable length

      struct {
          Random random;
          CipherSuite cipher_suites<1..V>;
          Extension extensions<1..V>;
      } ClientHello;
]]></artwork></figure>

</section>
<section anchor="serverhello" title="ServerHello">

<t>We redefine ServerHello in the following way.</t>

<figure><artwork><![CDATA[
      struct {
          Random random;
          CipherSuite cipher_suite;
          Extension extensions<1..V>;
      } ServerHello;
]]></artwork></figure>

</section>
<section anchor="helloretryrequest" title="HelloRetryRequest">

<t>The HelloRetryRequest has the following format.</t>

<figure><artwork><![CDATA[
      struct {
          CipherSuite cipher_suite;
          Extension extensions<2..V>;
      } HelloRetryRequest;
]]></artwork></figure>

<t>The HelloRetryRequest is the same as the ServerHello above 
but without the unnecessary sentinel Random value.</t>

</section>
</section>
<section anchor="examples" title="Examples">

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

<figure><artwork><![CDATA[
{
   "Version" : 0x0304
   "Profile" : 1, 
   "Version" : 772,
   "Random": 16,
   "CipherSuite" : "TLS_AES_128_GCM_SHA256",
   "DHGroup": "X25519",
   "Extensions": {
      "named_groups": 29,
      "application_layer_protocol_negotiation" : "030016832",
      "..." : null
    }
}
]]></artwork></figure>

<t>Version 772 corresponds to the hex representation 0x0304, named group “29”
(0x001D) represents X25519.</t>

<t>[[OPEN ISSUE: Should we have a registry of well-known profiles?]]</t>

</section>
<section anchor="security-considerations" title="Security Considerations">

<t>WARNING: This document is effectively brand new and has seen no
analysis. The idea here is that cTLS is isomorphic to TLS 1.3, and
therefore should provide equivalent security guarantees.</t>

<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>Transcript expansion also needs some analysis and we need to determine
whether we need an extension to indicate that cTLS is in use and with
which profile.</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

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

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>DTLS-OK</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>TBD</c>
      <c>ctls</c>
      <c>N</c>
      <c>RFCXXXX</c>
</texttable>

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

<t>[[OPEN ISSUE: Should we require standards action for all profile IDs that would fit in 2 octets.]]</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<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" target='https://www.rfc-editor.org/info/rfc8446'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<date year='2018' month='August' />
<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="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<date year='2017' month='May' />
<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>



<section anchor="transcripts" title="Example Exchange">

<t>The follow exchange illustrates a complete cTLS-based exchange supporting 
mutual authentication using certificates. The digital signatures use ECDSA with SHA256 
and NIST P256r1. The ephemeral Diffie-Hellman uses the FX25519 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>

<figure><artwork><![CDATA[
                     ECDHE
              ------------------
              TLS  CTLS  Overhead
              ---  ----  --------
ClientHello   132   36       4
ServerHello    90   36       4
ServerFlight  478   80       7
ClientFlight  458   80       7
==================================
Total        1158  232      22
]]></artwork></figure>

<t>The following compression profile was used in this example:</t>

<figure><artwork><![CDATA[
{
  "profile": 1, 
  "version": 772,
  "cipherSuite": "TLS_AES_128_CCM_8_SHA256",
  "dhGroup": "X25519",
  "signatureAlgorithm": "ECDSA_P256_SHA256",
  "finishedSize": 8,
  "clientHelloExtensions": {
    "server_name": "000e00000b6578616d706c652e636f6d",
  },
  "certificateRequestExtensions": {
    "certificate_request_context": 0, 
    "signature_algorithms": "00020403"
  },
  "mutualAuth": true, 
  "extension-order": {
       "clientHelloExtensions": {
          Key_share
       },
       "ServerHelloExtensions": {
          Key_share
       },
  },
  
  "knownCertificates": {
    "61": "3082...",
    "62": "3082...", 
    "63": "...", 
    "64": "...", 
    ...
  }
}
]]></artwork></figure>

<t>ClientHello: 36 bytes = DH(32) + Overhead(4)</t>

<figure><artwork><![CDATA[
01                    // ClientHello
01                    // Profile ID
0020 a690...af948     // KeyShareEntry.key_exchange
]]></artwork></figure>

<t>ServerHello: 36 = DH(32) + Overhead(4)</t>

<figure><artwork><![CDATA[
02                 // ServerHello
26                 // Extensions.length
0020 9fbc...0f49   // KeyShareEntry.key_exchange
]]></artwork></figure>

<t>Server Flight: 80 = SIG(64) + MAC(8) + CERTID(1) + Overhead(7)</t>

<t>The EncryptedExtensions, and the CertificateRequest messages 
are omitted because they are empty.</t>

<figure><artwork><![CDATA[
0b                 // Certificate
  03               //   CertificateList
    01             //     CertData.length
      61           //       CertData = 'a'

0f                 // CertificateVerify
  4064             //   Signature.length
       3045...10ce //   Signature
  
14                 // Finished
  bfc9d66715bb2b04 //   VerifyData
]]></artwork></figure>

<t>Client Flight: 80 bytes = SIG(64) + MAC(8) + CERTID(1) + Overhead(7)</t>

<figure><artwork><![CDATA[
0b                 // Certificate
  03               //   CertificateList
    01             //     CertData.length
      62           //       CertData = 'b'


0f                 // CertificateVerify
  4064             //   Signature.length
       3045...f60e //   Signature

14                 // Finished
  35e9c34eec2c5dc1 //   VerifyData
]]></artwork></figure>

</section>
<section numbered="false" anchor="acknowledgments" title="Acknowledgments">

<t>We would like to thank Karthikeyan Bhargavan, Owen Friel, Sean Turner, Martin Thomson and Chris Wood.</t>

</section>


  </back>

<!-- ##markdown-source:
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
/wuix4tEI2QAAA==

-->

</rfc>

