<?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.2.7 -->

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

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

<rfc docName="draft-friel-tls-atls-01" category="std">

  <front>
    <title abbrev="ATLS">Application-Layer TLS</title>

    <author initials="O." surname="Friel" fullname="Owen Friel">
      <organization>Cisco</organization>
      <address>
        <email>ofriel@cisco.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="M." surname="Pritikin" fullname="Max Pritikin">
      <organization>Cisco</organization>
      <address>
        <email>pritikin@cisco.com</email>
      </address>
    </author>
    <author initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization>ARM Limited</organization>
      <address>
        <email>hannes.tschofenig@gmx.net</email>
      </address>
    </author>
    <author initials="M." surname="Baugher" fullname="Mark Baugher">
      <organization>Consultant</organization>
      <address>
        <email>mark@mbaugher.com</email>
      </address>
    </author>

    <date year="2018" month="July" day="31"/>

    
    
    

    <abstract>


<t>This document specifies how TLS sessions can be established at the application layer over untrusted transport between clients and services for the purposes of establishing secure end-to-end encrypted communications channels. Transport layer encodings for application layer TLS records are specified for HTTP and CoAP transport. Explicit identification of application layer TLS packets enables middleboxes to provide transport services and enforce suitable transport policies for these payloads, without requiring access to the unencrypted payload content. Multiple scenarios are presented identifying the need for end-to-end application layer encryption between clients and services, and the benefits of reusing the well-defined TLS protocol, and a standard TLS stack, to accomplish this are described. Application software architectures for building, and network architectures for deploying application layer TLS are outlined.</t>



    </abstract>


  </front>

  <middle>


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

<t>There are multiple scenarios where there is a need for application layer end-to-end security between clients and application services. Two examples include:</t>

<t><list style="symbols">
  <t>Bootstrapping devices that must connect to HTTP application services across untrusted TLS interception middleboxes</t>
  <t>Constrained devices connecting via gateways to application services, where different transport layer protocols may be in use on either side of the gateway, with the gateway transcoding between the different transport layer protocols.</t>
</list></t>

<t>These two scenarios are described in more detail in <xref target="application-layer-end-to-end-security-use-cases"/>.</t>

<t>Related to this document, there is ongoing work across the industry to define requirements for end-to-end security. <xref target="I-D.hartke-core-e2e-security-reqs"/> documents requirements for CoAP <xref target="RFC7252"/> End-to-End Security. The Open Mobile Alliance (OMA) has published a candidate standard Lightweight Machine to Machine Requirements <xref target="LwM2M"></xref> which defines multiple requirements for end-to-end security.</t>

<t>This document describes how clients and applications can leverage standard TLS software stacks to establish secure end-to-end encrypted connections at the application layer. The connections may establish TLS <xref target="RFC5246"/> <xref target="I-D.ietf-tls-tls13"/> or DTLS <xref target="RFC6347"/> <xref target="I-D.ietf-tls-dtls13"/> sessions. There are multiple advantages to reuse of existing TLS software stacks for establishment of application layer secure connections. These include:</t>

<t><list style="symbols">
  <t>many clients and application services already include a TLS software stack, so there is no need to include yet another software stack in the software build</t>
  <t>no need to define a new cryptographic negotiation, authentication, and key exchange protocol between clients and services</t>
  <t>provides standards based PKI mutual authentication between clients and services</t>
  <t>no need to train software developers on how to use a new cryptographic protocols or libraries</t>
  <t>automatically benefit from new cipher suites by simply upgrading the TLS software stack</t>
  <t>automatically benefit from new features, bugfixes, etc. in TLS software stack upgrades</t>
</list></t>

<t>This document also explicitly defines how application layer TLS connections can be established using HTTP <xref target="RFC7230"/> <xref target="RFC7540"/> or CoAP as transport layers. This document does not preclude the user of other transport layers, however defining how application layer TLS connections can be established over other transport layers such as <xref target="ZigBee"></xref> or <xref target="Bluetooth"></xref> is beyond the scope of this document.</t>

<t>Explicitly identifying application layer TLS packets enables transport layer middleboxes to provide transport capabilities and enforce suitable transport policies for these payloads, without requiring access to unencrypted application data.</t>

</section>
<section anchor="terminology" title="Terminology">

<t>Application layer TLS is referred to as ATLS throughout this document.</t>

</section>
<section anchor="application-layer-end-to-end-security-use-cases" title="Application Layer End-to-End Security Use Cases">

<t>This section describes in more detail the bootstrapping and constrained device use cases mentioned in the introduction.</t>

<section anchor="bootstrapping-devices" title="Bootstrapping Devices">

<t>There are far more classes of clients being deployed on today’s networks than at any time previously. This poses challenges for network administrators who need to manage their network and the clients connecting to their network, and poses challenges for client vendors and client software developers who must ensure that their clients can connect to all required services.</t>

<t>One common example is where a client is deployed on a local domain TCP/IP network that protects its perimeter using a TLS terminating middlebox, and the client needs to establish a secure connection to a service in a different network via the middlebox. This is illustrated in <xref target="bootstrap-device"/>.</t>

<t>Traditionally, this has been enabled by the network administrator deploying the necessary certificate authority trusted roots on the client. This can be achieved at scale using standard tools that enable the administrator to automatically push trusted roots out to all client machines in the network from a centralized domain controller. This works for personal computers, laptops and servers running standard Operating Systems that can be centrally managed. This client management process breaks for multiple classes of clients that are being deployed today, there is no standard mechanism for configuring trusted roots on these clients, and there is no standard mechanism for these clients to securely traverse middleboxes.</t>

<figure title="Bootstrapping Devices" anchor="bootstrap-device"><artwork><![CDATA[
+--------+    C->M TLS    +-----------+   M->S TLS   +---------+
| Client |--------------->| Middlebox |------------->| Service |
+--------+                +-----------+              +---------+
    ^                                                     ^
    |                                                     |
    +-----------Client to Service ATLS Connection---------+
]]></artwork></figure>

<t>The ATLS mechanism defined in this document enables clients to traverse middleboxes and establish secure connections to services across network domain boundaries. The purpose of this connection may simply be to facilitate a bootstrapping process, for example <xref target="I-D.ietf-anima-bootstrapping-keyinfra"/>, whereby the client securely discovers the local domain certificate authorities required to establish a trusted network layer TLS connection to the middlebox.</t>

</section>
<section anchor="constrained-devices" title="Constrained Devices">

<t>Two constrained device use cases are outlined here.</t>

<section anchor="constrained-device-connecting-over-a-closed-network" title="Constrained Device Connecting over a Closed Network">

<t>There are industry examples of home smart lighting systems where the smart light bulbs connect using ZigBee to a gateway device. A controller application running on a mobile device connects to the gateway using CoAP over DTLS. The controller can then control the light bulbs by sending messages and commands via the gateway. The gateway device has full access to all messages sent between the light bulbs and the controller application.</t>

<t>A generic use case similar to the smart lighting system outlined above has an IoT device talking ZigBee to a gateway, with the gateway in turn talking CoAP over DTLS to a controller application running on a mobile device. This is illustrated in <xref target="zigbee-gateway"/>.</t>

<t>There are scenarios where the messages sent between the IoT device and the controller application must not be exposed to the gateway function. Additionally, the end devices (the IoT device and the controller application service) have no visibility to and no guarantees about what transport layer security and encryption is enforced across all hops end-to-end as they only have visibility to their immediate next hop. ATLS addresses these concerns.</t>

<figure title="IoT Closed Network Gateway" anchor="zigbee-gateway"><artwork><![CDATA[
+--------+    ZigBee     +---------+  CoAP/DTLS   +------------+
| Device |-------------->| Gateway |------------->| Mobile App |
+--------+               +---------+              +------------+
    ^                                                   ^
    |                                                   |
    +--------Device to Mobile App ATLS Connection-------+
]]></artwork></figure>

</section>
<section anchor="constrained-device-connecting-over-the-internet" title="Constrained Device Connecting over the Internet">

<t>A somewhat similar example has an IoT device connecting to a gateway using a suitable transport mechanism such as ZigBee, CoAP, MQTT, etc. The gateway function in turn talks HTTP over TLS (or, for example, HTTP over QUIC) to an application service over the Internet. This is illustrated in <xref target="coap-internet"/>.</t>

<t>The gateway may not be trusted and all messages between the IoT device and the application service must be end-to-end encrypted. Similar to the previous use case, the endpoints have no guarantees about what level of transport layer security is enforced across all hops. Again, ATLS addresses these concerns.</t>

<figure title="IoT Internet Gateway" anchor="coap-internet"><artwork><![CDATA[
+--------+  CoAP/DTLS    +------------------+  HTTP/TLS   +---------+
| Device |-------------->| Internet Gateway |------------>| Service |
+--------+               +------------------+             +---------+
    ^                                                          ^
    |                                                          |
    +---------Device to Cloud Service ATLS Connection----------+
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="current-approaches-to-application-layer-end-to-end-security" title="Current Approaches to Application Layer End-to-End Security">

<t>End-to-end security at the application layer is increasing seen as a key requirement across multiple applications and services. Some examples of end-to-end security mechanisms are outlined here. All the solutions outlined here have some common characteristics. The solutions:</t>

<t><list style="symbols">
  <t>do not rely on transport layer security</t>
  <t>define a new handshake protocol for establishment of a secure end-to-end session</t>
</list></t>

<section anchor="noise" title="Noise">

<t><xref target="Noise"></xref> is a framework for cryptographic protocols based on Elliptic Curve Diffie-Hellman (ECDH) key agreement, AEAD encryption, and BLAKE2 and SHA2 hash functions. Noise is currently used by WhatsApp, WireGuard, and Lightning.</t>

<t>The current Noise protocol framework defines mechanisms for proving possession of a private key, but does not define authentication mechanisms. Section 14 “Security Considerations” of Noise states:
~~~
it’s up to the application to determine whether the remote party’s static public key is acceptable
~~~</t>

</section>
<section anchor="signal" title="Signal">

<t>The <xref target="Signal"></xref> protocol provides end-to-end encryption and uses EdDSA signatures, Triple Diffie-Hellman handshake for shared secret establishment, and the Double Ratchet Algorithm for key management. It is used by Open Whisper Systems, WhatsApp and Google.</t>

<t>Similar to Noise, Signal does not define an authentication mechanism. The current [X3DH] specification states in section 4.1 “Authentication”:</t>

<figure><artwork><![CDATA[
Methods for doing this are outside the scope of this document
]]></artwork></figure>

</section>
<section anchor="google-alts" title="Google ALTS">

<t>Google’s Application Layer Transport Security <xref target="ALTS"></xref> is a mutual authentication and transport encryption system used for securing Remote Procedure Call (RPC) communications within Google’s infrastructure. ALTS uses an ECDH handshake protocol and a record protocol containing AES encrypted payloads.</t>

</section>
<section anchor="ephemeral-diffie-hellman-over-cose" title="Ephemeral Diffie-Hellman Over COSE">

<t>There is ongoing work to standardise <xref target="I-D.selander-ace-cose-ecdhe"/>. This defines a ECDH SIGMA based authenticated key exchange algorithm using COSE and COBR objects.</t>

</section>
</section>
<section anchor="atls-goals" title="ATLS Goals">

<t>The high level goals driving the design of this mechanism are:</t>

<t><list style="symbols">
  <t>enable authenticated key exchange at the application layer by reusing existing technologies</t>
  <t>ensure that ATLS packets are explicitly identified thus ensuring that any middleboxes or gateways at the transport layer are content aware</t>
  <t>leverage existing TLS stacks and handshake protocols thus avoiding introducing new software or protocol dependencies in clients and applications</t>
  <t>reuse existing TLS <xref target="RFC5246"/> <xref target="I-D.ietf-tls-tls13"/> and DTLS <xref target="RFC6347"/> <xref target="I-D.ietf-tls-dtls13"/> specifications as is without requiring any protocol changes or software stack changes</t>
  <t>do not mandate constraints on how the TLS stack is configured or used</t>
  <t>be forward compatible with future TLS versions</t>
  <t>avoid introducing TLS protocol handling logic or semantics into the application layer i.e. TLS protocol knowledge and logic is handled by the TLS stack, not the application</t>
  <t>ensure the client and server software implementations are as simple as possible</t>
</list></t>

</section>
<section anchor="architecture-overview" title="Architecture Overview">

<section anchor="application-architecture" title="Application Architecture">

<t>TLS software stacks allow application developers to ‘unplug’ the default network socket transport layer and read and write TLS records directly from byte buffers. This enables application developers to create application layer TLS sessions, extract the raw TLS record bytes from the bottom of the TLS stack, and transport these bytes over any suitable transport. The TLS software stacks can generate byte streams of full TLS flights which may include multiple TLS records. Additionally, TLS software stacks support Keying Material Exporters <xref target="RFC5705"/> and allow applications to export keying material from established TLS sessions. This keying material can then be used by the application for encryption of data outside the context of the TLS session. This is illustrated in <xref target="tls-interface"/> below.</t>

<figure title="TLS Stack Interfaces" anchor="tls-interface"><artwork><![CDATA[
                    +------------+                    +---------+
 Handshake Records  |            | Handshake Records  |         |
------------------->|            |------------------->|         |
                    |            |                    |  Byte   |
 Unencrypted Data   |    TLS     | Encrypted Data     |         |
------------------->|            |------------------->| Buffers |
                    |  Software  |                    |         |
 Encrypted Data     |            | Unencrypted Data   |         |
------------------->|   Stack    |------------------->|         |
                    |            |                    +---------+
 Keying Material    |            |
<-------------------|            |
                    + -----------+
]]></artwork></figure>

<t>These TLS software stack APIs enable application developers to build the software architectures illustrated in <xref target="app-architecture-1"/> and <xref target="app-architecture-2"/>.</t>

<t>In both architectures, the application creates and interacts with an application layer TLS session in order to generate and consume raw TLS records. The application transports these raw TLS records inside transport layer message bodies using whatever standard transport layer stack is suitable for the application or architecture. This document does not place any restrictions on the choice of transport layer and any suitable protocol such as HTTP, TCP, CoAP, ZigBee, Bluetooth, etc. could be used.</t>

<t>The transport layer will typically encrypt data, and this encryption is completely independent from any application layer encryption. The transport stack may create a transport layer TLS session. The application layer TLS session and transport layer TLS session can both leverage a shared, common TLS software stack. This high level architecture is applicable to both clients and application services. The key differences between the architectures are as follows.</t>

<t>In the model illustrated in <xref target="app-architecture-1"/>, the application sends all sensitive data that needs to be securely exchanged with the peer application through the Application TLS session in order to be encrypted and decrypted. All sensitive application data is thus encoded within TLS records by the TLS stack, and these TLS records are transmitted over the transport layer.</t>

<figure title="TLS Stack used for all data encryption" anchor="app-architecture-1"><artwork><![CDATA[
+-------------+ 
|             |    App
|             |    Data    +---------+
| Application |<---------->|   App   |      +---------+
|             |    TLS     |   TLS   |----->|   TLS   |
|             |  Records   | Session |      |  Stack  |
|        +--->|<---------->|         |      +---------+
|        |    |            +---------+           ^
|        |    |                                  |? 
|        |    | Transport +-----------+    +------------+
|        |    |  Payload  | Transport |    | Transport  |
|        +--->|<--------->|   Stack   |--->| Encryption |-->Packets
+-------------+           +-----------+    +------------+
]]></artwork></figure>

<t>In the model illustrated in <xref target="app-architecture-2"/>, the application establishes an application layer TLS session purely for the purposes of key exchange. Therefore, the only TLS records that are sent or received by the application layer are TLS handshake records. Once the application layer TLS session is established, the application uses Keying Material Exporter <xref target="RFC5705"/> APIs to export keying material from the TLS stack from this application layer TLS session. The application can then use these exported keys to derive suitable shared encryption keys with its peer for exchange of encrypted data. The application encrypts and decrypts sensitive data using these shared encryption keys using any suitable cryptographic library (which may be part of the same library that provides the TLS stack), and transports the encrypted data directly over the transport layer.</t>

<figure title="TLS stack used for key agreement and exporting" anchor="app-architecture-2"><artwork><![CDATA[
+--------------+
|              |
| Application  |
|              |
| +-------+    |            +---------+
| | App   |    | Key Export |         |
| | Data  |<---|<-----------|         |
| | Crypto|    |            |   App   |
| +-------+    |    TLS     |   TLS   |      +---------+
|    ^         | Handshake  | Session |----->|   TLS   |
|    |         |  Records   |         |      |  Stack  |
|    |    +--->|<---------->|         |      +---------+
|    |    |    |            +---------+           ^
|    |    |    |                                  |?
|    |    |    | Transport +-----------+    +------------+
|    |    |    |  Payload  | Transport |    | Transport  |
|    +----+--->|<--------->|   Stack   |--->| Encryption |-->Packets
+--------------+           +-----------+    +------------+
]]></artwork></figure>

<t>The choice of which application architecture to use will depend on the overall solution architecture, and the underlying transport layer or layers in use. While the choice of application architecture is outside the scope of this document, some considerations are outlined here.</t>

<t><list style="symbols">
  <t>for constrained devices, every single byte of payload is important. <xref target="I-D.mattsson-core-security-overhead"/> analyses the overhead of TLS headers compared with OSCORE <xref target="I-D.ietf-core-object-security"/> illustrating the additional overhead associated with TLS headers. It may be more appropriate to use the architecture defined in <xref target="app-architecture-2"/> in order to establish shared encryption keys, and then transport encrypted data directly without the overhead of unwanted TLS record headers.</t>
  <t>when using HTTP as a transport layer, it may be more appropriate to use the architecture defined in <xref target="app-architecture-2"/> in order to avoid any TLS session vs. HTTP session affinity issues.</t>
</list></t>

<section anchor="application-architecture-benefits" title="Application Architecture Benefits">

<t>There are several benefits to using a standard TLS software stack to establish an application layer secure communications channel between a client and a service. These include:</t>

<t><list style="symbols">
  <t>no need to define a new cryptographic negotiation and exchange protocol between client and service</t>
  <t>automatically benefit from new cipher suites by simply upgrading the TLS software stack</t>
  <t>automatically benefit from new features, bugfixes, etc. in TLS software stack upgrades</t>
</list></t>

</section>
<section anchor="atls-packet-identification" title="ATLS Packet Identification">

<t>It is recommended that ATLS packets are explicitly identified by a standardized, transport-specific identifier enabling any gateways and middleboxes to identify ATLS packets. Middleboxes have to contend with a vast number of applications and network operators have difficulty configuring middleboxes to distinguish unencrypted but not explicitly identified application data from end-to-end encrypted data. This specification aims to assist network operators by explicitly identifying ATLS packets. The HTTP and CoAP encodings documented in <xref target="atls-over-http-transport"/> and <xref target="atls-over-coap-transport"/> explicitly identify ATLS packets.</t>

</section>
<section anchor="atls-session-tracking" title="ATLS Session Tracking">

<t>The ATLS application service establishes multiple ATLS sessions with multiple clients. As TLS sessions are stateful, the application service must be able to correlate ATLS records from different clients across the relevant ATLS sessions. The details of how session tracking is implemented are outside the scope of this document. Recommendations are given in <xref target="atls-over-http-transport"/> and <xref target="atls-over-coap-transport"/>, but session tracking is application and implementation specific.</t>

</section>
<section anchor="atls-record-inspection" title="ATLS Record Inspection">

<t>It should not be necessary for the application layer to have to inspect, parse or understand the contents of ATLS records. No constraints are placed on the ContentType contained within the transported TLS records. The TLS records may contain handshake, application_data, alert or change_cipher_spec messages. If new ContentType messages are defined in future TLS versions, these may also be transported using this protocol.</t>

</section>
<section anchor="implementation" title="Implementation">

<t>Pseudo code illustrating how to read and write TLS records directly from byte buffers using both OpenSSL BIO functions and Java JSSE SSLEngine is given in the appendices. A blog post by <xref target="Norrell"></xref> outlines a similar approach to leveraging OpenSSL BIO functions, and Oracle publish example code for leveraging <xref target="SSLEngine"></xref>.</t>

</section>
</section>
<section anchor="functional-design" title="Functional Design">

<t>[ todo: insert Hannes functional design section here including the policy layers ]</t>

<t>Policy examples:</t>

<t>Mention that the app layer policy could be to not do ATLS if the transport layer establishes an e2e session with the peer. e.g. for HTTP use cases where there is no middlebox and cert validation passes.</t>

<t>Mention that the client could report in the ATLS session any middlebox cert seen at the transport layer.</t>

</section>
<section anchor="network-architecture" title="Network Architecture">

<t>An example network deployment is illustrated in <xref target="coap-arch"/>. It shows a constrained client connecting to an application service via an internet gateway. The client uses CoAP over DTLS to communicate with the gateway. The gateway extracts the messages the client sent over CoAP and sends these messages inside HTTP message bodies to the application service. It also shows a TLS terminator deployed in front of the application service. The client establishes a transport layer CoAP/DTLS connection with the gateway (C-&gt;G DTLS), the gateway in turn opens a transport layer TLS connection with the TLS terminator deployed in front of the service (G-&gt;T TLS). The client can ignore any certificate validation errors when it connects to the gateway. CoAP messages are transported between the client and the gateway, and HTTP messages are transported between the client and the service. Finally, application layer TLS messages are exchanged inside the CoAP and HTTP message bodies in order to establish an end-to-end TLS session between the client and the service (C-&gt;S TLS).</t>

<figure title="Constrained Device Gateway Network Architecture" anchor="coap-arch"><artwork><![CDATA[
       +----------+        +----------+
       | App Data |        | App Data |
       +----------+        +----------+         +----------+
       | C->S TLS |        | C->S TLS |         | App Data |
       +----------+        +----------+         +----------+
       |   CoAP   |        |   HTTP   |         | C->S TLS |
       +----------+        +----------+         +----------+
       | C->G DTLS|        | M->T TLS |         |   HTTP   |
       +----------+        +----------+         +----------+
       |   UDP    |        |   TCP    |         |   TCP    |
       +----------+        +----------+         +----------+

+--------+      +-----------+      +----------------+     +---------+
| Client |----->|  Gateway  |----->| TLS Terminator |---->| Service |
+--------+      +-----------+      +----------------+     +---------+
   ^                                                           ^
   |                                                           |
   +-------------Client to Service ATLS Connection-------------+
]]></artwork></figure>

<t>Another typical network deployment is illustrated in <xref target="http-arch"/>. It shows a client connecting to a service via a middlebox. It also shows a TLS terminator deployed in front of the service. The client establishes a transport layer TLS connection with the middlebox (C-&gt;M TLS), the middlebox in turn opens a transport layer TLS connection with the TLS terminator deployed in front of the service (M-&gt;T TLS). The client can ignore any certificate validation errors when it connects to the middlebox. HTTP messages are transported over this layer between the client and the service. Finally, application layer TLS messages are exchanged inside the HTTP message bodies in order to establish an end-to-end TLS session between the client and the service (C-&gt;S TLS).</t>

<figure title="HTTP Middlebox Network Architecture" anchor="http-arch"><artwork><![CDATA[
       +----------+        +----------+
       | App Data |        | App Data |
       +----------+        +----------+         +----------+
       | C->S TLS |        | C->S TLS |         | App Data |
       +----------+        +----------+         +----------+
       |   HTTP   |        |   HTTP   |         | C->S TLS |
       +----------+        +----------+         +----------+
       | C->M TLS |        | M->T TLS |         |   HTTP   |
       +----------+        +----------+         +----------+
       |   TCP    |        |   TCP    |         |   TCP    |
       +----------+        +----------+         +----------+

+--------+      +-----------+      +----------------+     +---------+
| Client |----->| Middlebox |----->| TLS Terminator |---->| Service |
+--------+      +-----------+      +----------------+     +---------+
   ^                                                           ^
   |                                                           |
   +-------------Client to Service ATLS Connection-------------+
]]></artwork></figure>

</section>
</section>
<section anchor="key-exporting-and-application-data-encryption" title="Key Exporting and Application Data Encryption">

<t>When solutions implement the architecture described in <xref target="app-architecture-2"/>, they leverage <xref target="RFC5705"/> for key exporting from the ATLS session. The client and service then use the exported keys to derive shared encryption keys. The encryption keys are then used with a suitable cipher suite to encrypt application data for exchange with the peer.</t>

<section anchor="key-exporter-label" title="Key Exporter Label">

<t>A new TLS Exporter Label is defined for ATLS key exporting. Its value is:</t>

<figure><artwork><![CDATA[
TLS Exporter Label: application-layer-tls
]]></artwork></figure>

</section>
<section anchor="cipher-suite-selection" title="Cipher Suite Selection">

<t>Application layer encryption performed outside the context of the ATLS session using exported keys should use the cipher suite negotiated during ATLS session establishment.</t>

</section>
<section anchor="key-derivation" title="Key Derivation">

<t><xref target="RFC5705"/> key exporting functions allow specification of the number of bytes of keying material that should be exported from the TLS session. The application should export the exact number of bytes required to generate the necessary client and server cipher suite encryption key and IV values.</t>

<t>[[TODO]] Maybe need to reference the relevant sections from https://tools.ietf.org/html/draft-ietf-tls-tls13-23#section-7 and https://tools.ietf.org/html/rfc5246#section-6.3.</t>

</section>
</section>
<section anchor="atls-session-establishment" title="ATLS Session Establishment">

<t><xref target="atls-session"/> illustrates how an ATLS session is established using the key exporting architectural model shown in <xref target="app-architecture-2"/>. The outline is as follows:</t>

<t><list style="symbols">
  <t>the client creates an ATLS session object</t>
  <t>the client initiates a TLS handshake on the session</t>
  <t>the client extracts the TLS records for the first TLS flight (the first RTT)</t>
  <t>the client sends the TLS records over the transport layer to the server</t>
  <t>on receipt of the TLS flight, the server creates an ATLS session object</t>
  <t>the server injects the received TLS flight into the session</t>
  <t>the server extracts the TLS records for the first TLS flight response</t>
  <t>the server sends the TLS response records over the transport layer to the client</t>
  <t>the client injects the received TLS records into its TLS session completing the first full RTT</t>
  <t>the client and server repeat the above process and complete the second RTT</t>
  <t>once the ATLS session is up, both sides export keying material</t>
  <t>both sides now can exchange data encrypted using shared keys derived from the keying material</t>
</list></t>

<figure title="ATLS Session Establishment" anchor="atls-session"><artwork><![CDATA[
+-------------------------------+  +-------------------------------+
|             Client            |  |           ATLS Server         |
+---------+---+-----+---+-------+  +-------+---+-----+---+---------+
|  ATLS   |  | App |  |Transport|  |Transport|  | App |  |  ATLS   |
| Session |  +-----+  |  Stack  |  |  Stack  |  +-----+  | Session |
+---------+     |     +---------+  +---------+     |     +---------+
     |          |         |             |          |          |
     |          |         |             |          |          |
     |          |         |             |          |          |
     |  Create  |         |             |          |          |
     |  Session |         |             |          |          |
 +   |<---------|         |             |          |          |
 |   |  Start   |         |             |          |          |
 |   | Handshake|         |             |          |          |
 |   |<---------|         |             |          |          |
 |   |   TLS    |         |             |          |          |
 |   | Records  |  Pack   |             |          |          |
 |   |--------->| Records |             |          |          |
     |          |-------->| send packet | Unpack   |          |
 R   |          |         |------------>| Records  | Create   |
 T   |          |         |             |--------->| Session  |
 T   |          |         |             |          |--------->|
     |          |         |             |          |   TLS    |
 1   |          |         |             |          | Records  |
     |          |         |             |          |--------->|
 |   |          |         |             |          |   TLS    |
 |   |          |         |             |  Pack    | Records  |
 |   |          |         |             | Records  |<---------|
 |   |          | Unpack  |send response|<---------|          |
 |   |   TLS    | Records |<------------|          |          |
 |   | Records  |<--------|             |          |          |
 +   |<---------|         |             |          |          |
     |   TLS    |         |             |          |          |
     | Records  |         |             |          |          |
 +   |--------->|-------->|------------>|--------->|--------->|
 |   |          |         |             |          |          |
     |          |         |             |          | Session  |
 R   |          |         |             |          |    Up    |
 T   |          |         |             |          |<---------|
 T   |          |         |             |          |   TLS    |
     |          |         |             |          | Records  |
 2   |<---------|<--------|<------------|<---------|<---------|
     | Session  |         |             |          |          |
 |   |    Up    |         |             |          |          |
 +   |--------->|         |             |          |          |
     |  Export  |         |             |          |  Export  |
     |   Keys   |         |             |          |   Keys   |
     |--------->|         | E2E Session |          |<---------|
     |          |<--------|-------------|--------->|          |
]]></artwork></figure>

</section>
<section anchor="atls-over-http-transport" title="ATLS over HTTP Transport">

<t>The assumption is that the client will establish a transport layer connection to the server for exchange of HTTP messages. The underlying transport layer connection could be over TCP or TLS. The client will then establish an application layer TLS connection with the server by exchanging TLS records with the server inside HTTP message request and response bodies.</t>

<section anchor="protocol-summary" title="Protocol Summary">

<t>All ATLS records are transported unmodified as binary data within HTTP message bodies. The application simply extracts the TLS records from the TLS stack and inserts them directly into HTTP message bodies. Each message body contains a full TLS flight, which may contain multiple TLS records.</t>

<t>The client sends all ATLS records to the server in the bodies of POST requests.</t>

<t>The server sends all ATLS records to the client in the bodies of 200 OK responses to the POST requests.</t>

</section>
<section anchor="content-type-header" title="Content-Type Header">

<t>A new Content-Type header value is defined:</t>

<figure><artwork><![CDATA[
Content-type: application/atls+octet-stream
]]></artwork></figure>

<t>All message bodies containing ATLS records must set this Content-Type. This enables middleboxes to readily identify ATLS payloads.</t>

</section>
<section anchor="http-status-codes" title="HTTP Status Codes">

<t>This document does not define any new HTTP status codes, and does not specify additional semantics or refine existing semantics for status codes. This is the best current practice as outlined in <xref target="I-D.ietf-httpbis-bcp56bis"/>.</t>

</section>
<section anchor="atls-session-tracking-1" title="ATLS Session Tracking">

<t>The application service needs to track multiple client application layer TLS sessions so that it can correlate TLS records received in HTTP message bodies with the appropriate TLS session. The application service should use stateful cookies <xref target="RFC6265"/> in order to achieve this as recommended in <xref target="I-D.ietf-httpbis-bcp56bis"/>.</t>

</section>
<section anchor="session-establishment-and-key-exporting" title="Session Establishment and Key Exporting">

<t>It is recommended that applications using ATLS over HTTP transport only use ATLS for session establishment and key exchange, resulting in only 2 ATLS RTTs between the client and the application service.</t>

<t>Key exporting must be carried out as described in <xref target="key-derivation"/>.</t>

</section>
<section anchor="application-data-encryption" title="Application Data Encryption">

<t>[editors note: I am on the fence about using <xref target="RFC8188"/> as this hardcodes the ciphersuite to aes128gcm. It would be nice to use the cipher suite negotiated as part of ATLS session establishment. ]</t>

</section>
<section anchor="illustrative-atls-over-http-session-establishment" title="Illustrative ATLS over HTTP Session Establishment">

<t>A client initiates an ATLS session by sending the first TLS flight in a POST request message body to the ATLS server.</t>

<figure><artwork><![CDATA[
POST /atls
Content-Type: application/atls+octet-stream

<binary TLS client flight 1 records>
]]></artwork></figure>

<t>The server handles the request, creates an ATLS session object, and replies by including its first TLS flight in a 200 OK message body. The server also sets a suitable cookie for session tracking purposes.</t>

<figure><artwork><![CDATA[
200 OK
Content-Type: application/atls+octet-stream
Set-Cookie: my-atls-cookie=my-cookie-value

<binary TLS server flight 1 records>
]]></artwork></figure>

<t>The client handles the server first flight TLS records and replies with its second flight.</t>

<figure><artwork><![CDATA[
POST /atls
Content-Type: application/atls+octet-stream
Cookie: my-atls-cookie=my-cookie-value

<binary TLS client flight 2 records>
]]></artwork></figure>

<t>The server handles the second flight, establishes the ATLS session, and replies with its second flight.</t>

<figure><artwork><![CDATA[
200 OK
Content-Type: application/atls+octet-stream

<binary TLS server flight 2 records>
]]></artwork></figure>

</section>
<section anchor="atls-and-http-connect" title="ATLS and HTTP CONNECT">

<t>It is worthwhile comparing and contrasting ATLS with HTTP CONNECT tunneling.</t>

<t>First, let us introduce some terminology:</t>

<t><list style="symbols">
  <t>HTTP Proxy: A HTTP Proxy operates at the application layer, handles HTTP CONNECT messages from clients, and opens tunnels to remote origin servers on behalf of clients. If a client establishes a tunneled TLS connection to the origin server, the HTTP Proxy does not attempt to intercept or inspect the HTTP messages exchanged between the client and the server</t>
  <t>middlebox: A middlebox operates at the transport layer, terminates TLS connections from clients, and originates new TLS connections to services. A middlebox inspects all messages sent between clients and services. Middleboxes are generally completely transparent to applications, provided that the necessary PKI root Certificate Authority is installed in the client’s trust store.</t>
</list></t>

<t>HTTP Proxies and middleboxes are logically separate entities and one or both of these may be deployed in a network.</t>

<t>HTTP CONNECT is used by clients to instruct a HTTP Forward Proxy deployed in the local domain to open up a tunnel to a remote origin server that is typically deployed in a different domain. Assuming that TLS transport is used between both client and proxy, and proxy and origin server, the network architecture is as illustrated in <xref target="connect-tunnel"/>. Once the proxy opens the transport tunnel to the service, the client establishes an end-to-end TLS session with the service, and the proxy is blindly transporting TLS records (the C-&gt;S TLS session records) between the client and the service. From the client perspective, it is tunneling a TLS session to the service inside the TLS session it has established to the proxy (the C-&gt;P TLS session). No middlebox is attempting to intercept or inspect the HTTP messages between the client and the service.</t>

<figure title="HTTP Proxy transport layers" anchor="connect-tunnel"><artwork><![CDATA[
       +----------+        +----------+         
       | C->S HTTP|        | C->S HTTP|
       +----------+        +----------+
       | C->S TLS |        | C->S TLS |
       +----------+        +----------+
       | C->P TLS |        | P->S TCP |
       +----------+        +----------+
       | C->P TCP |
       +----------+

+--------+      +------------+      +---------+
| Client |----->| HTTP Proxy |----->| Service |
+--------+      +------------+      +---------+
]]></artwork></figure>

<t>A more complex network topology where the network operator has both a HTTP Proxy and a middlebox deployed is illustrated in <xref target="middlebox"/>. In this scenario, the proxy has tunneled the TLS session from the client towards the origin server, however the middlebox is intercepting and terminating this TLS session. A TLS session is established between the client and the middlebox (C-&gt;M TLS), and not end-to-end between the client and the server. It can clearly be seen that HTTP CONNECT and HTTP Proxies serve completely different functions than middleboxes.</t>

<t>Additionally, the fact that the TLS session is established between the client and the middlebox can be problematic for two reasons:</t>

<t><list style="symbols">
  <t>the middle box is inspecting traffic that is sent between the client and the service</t>
  <t>the client may not have the necessary PKI root Certificate Authority installed that would enable it to validate the TLS connection to the middlebox. This is the scenario outlined in <xref target="bootstrapping-devices"/>.</t>
</list></t>

<figure title="HTTP Proxy and middlebox transport layers" anchor="middlebox"><artwork><![CDATA[
       +----------+        +----------+       +----------+
       | C->S HTTP|        | C->S HTTP|       | C->S HTTP|
       +----------+        +----------+       +----------+
       | C->M TLS |        | C->M TLS |       | M->S TLS |
       +----------+        +----------+       +----------+
       | C->P TLS |        | P->M TCP |       | M->S TCP |
       +----------+        +----------+       +----------+
       | C->P TCP |
       +----------+

+--------+      +------------+      +-----------+      +---------+
| Client |----->| HTTP Proxy |----->| Middlebox |----->| Service |
+--------+      +------------+      +-----------+      +---------+
]]></artwork></figure>

<t>As HTTP CONNECT can be used to establish a tunneled TLS connection, one hypothetical solution to this middlebox issue is for the client to issue a HTTP CONNECT command to a HTTP Reverse Proxy deployed in front of the origin server. This solution is not practical for several reasons:</t>

<t><list style="symbols">
  <t>if there is a local domain HTTP Forward Proxy deployed, this would result in the client doing a first HTTP CONNECT to get past the Forward Proxy, and then a second HTTP CONNECT to get past the Reverse Proxy. No client or client library supports the concept of HTTP CONNECT inside HTTP CONNECT.</t>
  <t>if there is no local domain HTTP Proxy deployed, the client still has to do a HTTP CONNECT to the HTTP Reverse Proxy. This breaks with standard and expected HTTP CONNECT operation, as HTTP CONNECT is only ever called if there is a local domain proxy.</t>
  <t>clients cannot generate CONNECT from XHR in web applications.</t>
  <t>this would require the deployment of a Reverse Proxy in front of the origin server, or else support of the HTTP CONNECT method in standard web frameworks. This is not an elegant design.</t>
  <t>using HTTP CONNECT with HTTP 1.1 to a Reverse Proxy will break middleboxes inspecting HTTP traffic, as the middlebox would see TLS records when it expects to see HTTP payloads.</t>
</list></t>

<t>In contrast to trying to force HTTP CONNECT to address a problem for which it was not designed to address, and having to address all the issues just outlined; ATLS is specifically designed to address the middlebox issue in a simple, easy to develop, and easy to deploy fashion.</t>

<t><list style="symbols">
  <t>ATLS works seamlessly with HTTP Proxy deployments</t>
  <t>no changes are required to HTTP CONNECT semantics</t>
  <t>no changes are required to HTTP libraries or stacks</t>
  <t>no additional Reverse Proxy is required to be deployed in front of origin servers</t>
</list></t>

<t>It is also worth noting that if HTTP CONNECT to a Reverse Proxy were a conceptually sound solution, the solution still ultimately results in encrypted traffic traversing the middlebox that the middlebox cannot intercept and inspect. That is ultimately what ATLS results in - traffic traversing the middle box that the middlebox cannot intercept and inspect. Therefore, from a middlebox perspective, the differences between the two solutions are in the areas of solution complexity and protocol semantics. It is clear that ATLS is a simpler, more elegant solution that HTTP CONNECT.</t>

</section>
</section>
<section anchor="atls-over-coap-transport" title="ATLS over CoAP Transport">

<t>[ todo: Help needed Hannes ]</t>

</section>
<section anchor="rtt-considerations" title="RTT Considerations">

<t>The number of RTTs that take place when establishing a TLS session depends on the version of TLS and what capabilities are enabled on the TLS software stack. For example, a 0-RTT exchange is possible with TLS1.3.</t>

<t>If applications wish to ensure a predictable number of RTTs when establishing an application layer TLS connection, this may be achieved by configuring the TLS software stack appropriately. Relevant configuration parameters for OpenSSL and Java SunJSSE stacks are outlined in the appendix.</t>

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

<t>[[ TODO - New Content-Type and TLS Exporter Label must be registered. ]]</t>

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

<t>[[ TODO ]]</t>

</section>


  </middle>

  <back>


    <references title='Informative References'>

<reference anchor="Noise" target="http://noiseprotocol.org/">
  <front>
    <title>Noise Protocol Framework</title>
    <author initials="T." surname="Perrin" fullname="Trevor Perrin">
      <organization>noiseprotocol.org</organization>
    </author>
    <date year="2017" month="October" day="04"/>
  </front>
</reference>
<reference anchor="LwM2M" target="http://www.openmobilealliance.org/">
  <front>
    <title>Lightweight Machine to Machine Requirements</title>
    <author >
      <organization>Open Mobile Alliance</organization>
    </author>
    <date year="2017" month="December" day="08"/>
  </front>
</reference>
<reference anchor="Signal" target="https://signal.org/">
  <front>
    <title>Signal Protocol</title>
    <author >
      <organization>Open Whisper Systems</organization>
    </author>
    <date year="2016"/>
  </front>
</reference>
<reference anchor="ALTS" target="https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security/">
  <front>
    <title>Application Layer Transport Security</title>
    <author >
      <organization>Google</organization>
    </author>
    <date year="2017" month="December"/>
  </front>
</reference>
<reference anchor="ZigBee" target="http://www.zigbee.org">
  <front>
    <title>ZigBee Specification</title>
    <author >
      <organization>ZigBee Alliance</organization>
    </author>
    <date year="2012"/>
  </front>
</reference>
<reference anchor="Bluetooth" target="https://www.bluetooth.com/">
  <front>
    <title>Bluetooth Core Specification v5.0</title>
    <author >
      <organization>Bluetooth</organization>
    </author>
    <date year="2016"/>
  </front>
</reference>
<reference anchor="Norrell" target="https://thekerneldiaries.com/2016/06/13/openssl-ssltls-within-a-different-protocol/">
  <front>
    <title>Use SSL/TLS within a different protocol with BIO pairs</title>
    <author initials="." surname="Norrell" fullname="Norrell">
      <organization></organization>
    </author>
    <date year="2016"/>
  </front>
</reference>
<reference anchor="SSLEngine" target="https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java">
  <front>
    <title>SSLEngineSimpleDemo.java</title>
    <author >
      <organization>Oracle</organization>
    </author>
    <date year="2004"/>
  </front>
</reference>




<reference anchor="I-D.hartke-core-e2e-security-reqs">
<front>
<title>Requirements for CoAP End-To-End Security</title>

<author initials='G' surname='Selander' fullname='Goeran Selander'>
    <organization />
</author>

<author initials='F' surname='Palombini' fullname='Francesca Palombini'>
    <organization />
</author>

<author initials='K' surname='Hartke' fullname='Klaus Hartke'>
    <organization />
</author>

<date month='July' day='29' year='2017' />

<abstract><t>This document analyses threats to CoAP message exchanges traversing proxies and derives security requirements for mitigating those threats.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-hartke-core-e2e-security-reqs-03' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-hartke-core-e2e-security-reqs-03.txt' />
</reference>



<reference  anchor="RFC7252" target='https://www.rfc-editor.org/info/rfc7252'>
<front>
<title>The Constrained Application Protocol (CoAP)</title>
<author initials='Z.' surname='Shelby' fullname='Z. Shelby'><organization /></author>
<author initials='K.' surname='Hartke' fullname='K. Hartke'><organization /></author>
<author initials='C.' surname='Bormann' fullname='C. Bormann'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks.  The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s.  The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t><t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types.  CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t></abstract>
</front>
<seriesInfo name='RFC' value='7252'/>
<seriesInfo name='DOI' value='10.17487/RFC7252'/>
</reference>



<reference  anchor="RFC5246" target='https://www.rfc-editor.org/info/rfc5246'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
<author initials='T.' surname='Dierks' fullname='T. Dierks'><organization /></author>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<date year='2008' month='August' />
<abstract><t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol.  The TLS protocol provides communications security over the Internet.  The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='5246'/>
<seriesInfo name='DOI' value='10.17487/RFC5246'/>
</reference>



<reference anchor="I-D.ietf-tls-tls13">
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>

<author initials='E' surname='Rescorla' fullname='Eric Rescorla'>
    <organization />
</author>

<date month='March' day='20' 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.  This document updates RFCs 4492, 5705, and 6066 and it obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-tls-tls13-28' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-tls-tls13-28.txt' />
</reference>



<reference  anchor="RFC6347" target='https://www.rfc-editor.org/info/rfc6347'>
<front>
<title>Datagram Transport Layer Security Version 1.2</title>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<author initials='N.' surname='Modadugu' fullname='N. Modadugu'><organization /></author>
<date year='2012' month='January' />
<abstract><t>This document specifies version 1.2 of the Datagram Transport Layer Security (DTLS) protocol.  The DTLS protocol provides communications privacy for datagram protocols.  The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery.  The DTLS protocol is based on the Transport Layer Security (TLS) protocol and provides equivalent security guarantees.  Datagram semantics of the underlying transport are preserved by the DTLS protocol.  This document updates DTLS 1.0 to work with TLS version 1.2.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6347'/>
<seriesInfo name='DOI' value='10.17487/RFC6347'/>
</reference>



<reference anchor="I-D.ietf-tls-dtls13">
<front>
<title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>

<author initials='E' surname='Rescorla' fullname='Eric Rescorla'>
    <organization />
</author>

<author initials='H' surname='Tschofenig' fullname='Hannes Tschofenig'>
    <organization />
</author>

<author initials='N' surname='Modadugu' fullname='Nagendra Modadugu'>
    <organization />
</author>

<date month='July' day='2' year='2018' />

<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.  The DTLS 1.3 protocol is intentionally based on the Transport Layer Security (TLS) 1.3 protocol and provides equivalent security guarantees.  Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-tls-dtls13-28' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-tls-dtls13-28.txt' />
</reference>



<reference  anchor="RFC7230" target='https://www.rfc-editor.org/info/rfc7230'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the &quot;http&quot; and &quot;https&quot; Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='7230'/>
<seriesInfo name='DOI' value='10.17487/RFC7230'/>
</reference>



<reference  anchor="RFC7540" target='https://www.rfc-editor.org/info/rfc7540'>
<front>
<title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
<author initials='M.' surname='Belshe' fullname='M. Belshe'><organization /></author>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='M.' surname='Thomson' fullname='M. Thomson' role='editor'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2).  HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection.  It also introduces unsolicited push of representations from servers to clients.</t><t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax.  HTTP's existing semantics remain unchanged.</t></abstract>
</front>
<seriesInfo name='RFC' value='7540'/>
<seriesInfo name='DOI' value='10.17487/RFC7540'/>
</reference>



<reference anchor="I-D.ietf-anima-bootstrapping-keyinfra">
<front>
<title>Bootstrapping Remote Secure Key Infrastructures (BRSKI)</title>

<author initials='M' surname='Pritikin' fullname='Max Pritikin'>
    <organization />
</author>

<author initials='M' surname='Richardson' fullname='Michael Richardson'>
    <organization />
</author>

<author initials='M' surname='Behringer' fullname='Michael Behringer'>
    <organization />
</author>

<author initials='S' surname='Bjarnason' fullname='Steinthor Bjarnason'>
    <organization />
</author>

<author initials='K' surname='Watsen' fullname='Kent Watsen'>
    <organization />
</author>

<date month='June' day='22' year='2018' />

<abstract><t>This document specifies automated bootstrapping of a remote secure key infrastructure (BRSKI) using manufacturer installed X.509 certificate, in combination with a manufacturer's authorizing service, both online and offline.  Bootstrapping a new device can occur using a routable address and a cloud service, or using only link-local connectivity, or on limited/disconnected networks. Support for lower security models, including devices with minimal identity, is described for legacy reasons but not encouraged. Bootstrapping is complete when the cryptographic identity of the new key infrastructure is successfully deployed to the device but the established secure connection can be used to deploy a locally issued certificate to the device as well.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-anima-bootstrapping-keyinfra-16' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-anima-bootstrapping-keyinfra-16.txt' />
</reference>



<reference anchor="I-D.selander-ace-cose-ecdhe">
<front>
<title>Ephemeral Diffie-Hellman Over COSE (EDHOC)</title>

<author initials='G' surname='Selander' fullname='Goeran Selander'>
    <organization />
</author>

<author initials='J' surname='Mattsson' fullname='John Mattsson'>
    <organization />
</author>

<author initials='F' surname='Palombini' fullname='Francesca Palombini'>
    <organization />
</author>

<date month='July' day='2' year='2018' />

<abstract><t>This document specifies Ephemeral Diffie-Hellman Over COSE (EDHOC), a compact, and lightweight authenticated Diffie-Hellman key exchange with ephemeral keys that can be used over any layer.  EDHOC messages are encoded with CBOR and COSE, allowing reuse of existing libraries.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-selander-ace-cose-ecdhe-09' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-selander-ace-cose-ecdhe-09.txt' />
</reference>



<reference  anchor="RFC5705" target='https://www.rfc-editor.org/info/rfc5705'>
<front>
<title>Keying Material Exporters for Transport Layer Security (TLS)</title>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<date year='2010' month='March' />
<abstract><t>A number of protocols wish to leverage Transport Layer Security (TLS) to perform key establishment but then use some of the keying material for their own purposes.  This document describes a general mechanism for allowing that.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='5705'/>
<seriesInfo name='DOI' value='10.17487/RFC5705'/>
</reference>



<reference anchor="I-D.mattsson-core-security-overhead">
<front>
<title>Message Size Overhead of CoAP Security Protocols</title>

<author initials='J' surname='Mattsson' fullname='John Mattsson'>
    <organization />
</author>

<date month='November' day='11' year='2017' />

<abstract><t>This document analyzes and compares per-packet message size overheads when using different security protocols to secure CoAP.  The analyzed security protocols are DTLS 1.2, DTLS 1.3, TLS 1.2, TLS 1.3, and OSCORE.  DTLS and TLS are analyzed with and without compression. DTLS are analyzed with two different alternatives for header compression as well as with and without Connection ID.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-mattsson-core-security-overhead-02' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-mattsson-core-security-overhead-02.txt' />
</reference>



<reference anchor="I-D.ietf-core-object-security">
<front>
<title>Object Security for Constrained RESTful Environments (OSCORE)</title>

<author initials='G' surname='Selander' fullname='Goeran Selander'>
    <organization />
</author>

<author initials='J' surname='Mattsson' fullname='John Mattsson'>
    <organization />
</author>

<author initials='F' surname='Palombini' fullname='Francesca Palombini'>
    <organization />
</author>

<author initials='L' surname='Seitz' fullname='Ludwig Seitz'>
    <organization />
</author>

<date month='July' day='26' year='2018' />

<abstract><t>This document defines Object Security for Constrained RESTful Environments (OSCORE), a method for application-layer protection of the Constrained Application Protocol (CoAP), using CBOR Object Signing and Encryption (COSE).  OSCORE provides end-to-end protection between endpoints communicating using CoAP or CoAP-mappable HTTP. OSCORE is designed for constrained nodes and networks supporting a range of proxy operations, including translation between different transport protocols.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-core-object-security-14' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-core-object-security-14.txt' />
</reference>



<reference anchor="I-D.ietf-httpbis-bcp56bis">
<front>
<title>Building Protocols with HTTP</title>

<author initials='M' surname='Nottingham' fullname='Mark Nottingham'>
    <organization />
</author>

<date month='July' day='1' year='2018' />

<abstract><t>HTTP is often used as a substrate for other application protocols (a.k.a.  HTTP-based APIs).  This document specifies best practices for these protocols' use of HTTP.  Note to Readers  Discussion of this draft takes place on the HTTP working group mailing list (ietf-http-wg@w3.org), which is archived at https://lists.w3.org/Archives/Public/ietf-http-wg/ [1].  Working Group information can be found at http://httpwg.github.io/ [2]; source code and issues list for this draft can be found at https://github.com/httpwg/http-extensions/labels/bcp56bis [3].</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-httpbis-bcp56bis-06' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-httpbis-bcp56bis-06.txt' />
</reference>



<reference  anchor="RFC6265" target='https://www.rfc-editor.org/info/rfc6265'>
<front>
<title>HTTP State Management Mechanism</title>
<author initials='A.' surname='Barth' fullname='A. Barth'><organization /></author>
<date year='2011' month='April' />
<abstract><t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol.  Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet.  This document obsoletes RFC 2965.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6265'/>
<seriesInfo name='DOI' value='10.17487/RFC6265'/>
</reference>



<reference  anchor="RFC8188" target='https://www.rfc-editor.org/info/rfc8188'>
<front>
<title>Encrypted Content-Encoding for HTTP</title>
<author initials='M.' surname='Thomson' fullname='M. Thomson'><organization /></author>
<date year='2017' month='June' />
<abstract><t>This memo introduces a content coding for HTTP that allows message payloads to be encrypted.</t></abstract>
</front>
<seriesInfo name='RFC' value='8188'/>
<seriesInfo name='DOI' value='10.17487/RFC8188'/>
</reference>




    </references>


<section anchor="tls-software-stack-configuration" title="TLS Software Stack Configuration">

<t>[[ EDITOR’S NOTE: We could include details here on how TLS stack configuration items control the number of round trips between the client and server.<vspace />
And just give two examples: OpenSSL and Java SunJSSE]]</t>

</section>
<section anchor="pseudo-code" title="Pseudo Code">

<t>This appendix gives both C and Java pseudo code illustrating how to inject and extract raw TLS records from a TLS software stack. Please not that this is illustrative, non-functional pseudo code that does not compile. Functioning proof-of-concept code is available on the following public repository [[ EDITOR’S NOTE: Add the URL here ]].</t>

<section anchor="openssl" title="OpenSSL">

<t>OpenSSL provides a set of Basic Input/Output (BIO) APIs that can be used to build a custom transport layer for TLS connections. This appendix gives pseudo code on how BIO APIs could be used to build a client application that completes a TLS handshake and exchanges application data with a service.</t>

<figure><artwork><![CDATA[
char inbound[MAX];
char outbound[MAX];
int rx_bytes;
SSL_CTX *ctx = SSL_CTX_new();
SSL *ssl = SSL_new(ctx);

// Create in-memory BIOs and plug in to the SSL session
BOI* bio_in = BIO_new(BIO_s_mem());
BOI* bio_out = BIO_new(BIO_s_mem());
SSL_set_bio(ssl, bio_in, bio_out);

// We are a client
SSL_set_connect_state(ssl);

// Loop through TLS flights until we are done
do {
  // Calling SSL_do_handshake() will result in a full 
  // TLS flight being written to the BIO buffer
  SSL_do_handshake(ssl);

  // Read the client flight that the TLS session 
  // has written to memory
  BIO_read(bio_out, outbound, MAX);

  // POST the outbound bytes to the server using a suitable 
  // function. Lets assume that the server response will be
  // written to the 'inbound' buffer
  num_bytes = postTlsRecords(outbound, inbound);

  // Write the server flight to the memory BIO so the TLS session
  // can read it. The next call to SSL_do_handshake() will handle
  // this received server flight
  BIO_write(bio_in, inbound, num_bytes);

} while (!SSL_is_init_finished(ssl));

// Send a message to the server. Calling SSL_write() will run the
// plaintext through the TLS session and write the encrypted TLS
// records to the BIO buffer
SSL_write(ssl, "Hello World", strlen("Hello World"));

// Read the TLS records from the BIO buffer and
// POST them to the server
BIO_read(bio_out, outbound, MAX);
num_bytes = postTlsRecords(outbound, inbound);
]]></artwork></figure>

</section>
<section anchor="java-jsse" title="Java JSSE">

<t>The Java SSLEngine class “enables secure communications using protocols such as the Secure Sockets Layer (SSL) or IETF RFC 2246 “Transport Layer Security” (TLS) protocols, but is transport independent”. This pseudo code illustrates how a server could use the SSLEngine class to handle an inbound client TLS flight and generate an outbound server TLS flight response.</t>

<figure><artwork><![CDATA[
SSLEngine sslEngine = SSLContext.getDefault().createSSLEngine();
sslEngine.setUseClientMode(false);
sslEngine.beginHandshake();

// Lets assume 'inbound' has been populated with
// the Client 1st Flight
ByteBuffer inbound;

// 'outbound' will be populated with the
// Server 1st Flight response
ByteBuffer outbound;

// SSLEngine handles one TLS Record per call to unwrap().
// Loop until the engine is finished unwrapping.
while (sslEngine.getHandshakeStatus() ==
       HandshakeStatus.NEED_UNWRAP) {
  SSLEngineResult res = sslEngine.unwrap(inbound, outbound);

  // SSLEngine may need additional tasks run
  if (res.getHandshakeStatus() == NEED_TASK) {
    Runnable run = sslEngine.getDelegatedTask();
    run.run();
  }
}

// The SSLEngine has now finished handling all inbound TLS Records.
// Check if it wants to generate outbound TLS Records. SSLEngine
// generates one TLS Record per call to wrap().
// Loop until the engine is finished wrapping.
while (sslEngine.getHandshakeStatus() ==
       HandshakeStatus.NEED_WRAP) {
  SSLEngineResult res = sslEngine.wrap(inbound, outbound);
  
  // SSLEngine may need additional tasks run
  if (res.getHandshakeStatus() == NEED_TASK) {
    Runnable run = sslEngine.getDelegatedTask();
    run.run();
  }
}

// outbound ByteBuffer now contains a complete server flight
// containing multiple TLS Records
// Rinse and repeat!
]]></artwork></figure>

</section>
</section>
<section anchor="example-atls-handshake" title="Example ATLS Handshake">

<t>[[ EDITOR’S NOTE: For completeness, include a simple full TLS handshake showing the raw binary flights, along with the HTTP request/response/headers. And also the raw hex TLS records showing protocol bits ]]</t>

</section>


  </back>

<!-- ##markdown-source:
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
9AcznLs6CkO2373r/X/kLdvkOr0AAA==

-->

</rfc>

