<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.5 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ohai-chunked-ohttp-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.1 -->
  <front>
    <title abbrev="Chunked OHTTP">Chunked Oblivious HTTP Messages</title>
    <seriesInfo name="Internet-Draft" value="draft-ohai-chunked-ohttp-01"/>
    <author fullname="Tommy Pauly">
      <organization>Apple</organization>
      <address>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <date year="2024" month="January" day="22"/>
    <area>ART</area>
    <workgroup>OHAI Working Group</workgroup>
    <abstract>
      <?line 29?>

<t>This document defines a variant of the Oblivious HTTP message format that allows
chunks of requests and responses to be encrypted and decrypted before the entire
request or response is processed. This allows incremental processing of Oblivious
HTTP messages, which is particularly useful for handling large messages or systems
that process messages slowly.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ohai-chunked-ohttp/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        OHAI Working Group mailing list (<eref target="mailto:ohai@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ohai/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ohai/"/>.
      </t>
    </note>
  </front>
  <middle>
    <?line 37?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Oblivious HTTP <xref target="OHTTP"/> defines a system for sending HTTP requests
and responses as encrypted messages. Clients send requests via a relay to a gateway, which
is able to decrypt and forward the request to a target server. Responses are encrypted
with an ephemeral symmetric key by the gateway and sent back to the client via the relay.
The messages are protected with Hybrid Public Key Encryption (HPKE; <xref target="HPKE"/>),
and are intended to prevent the gateway from linking any two independent requests to the
same client.</t>
      <t>The definition of Oblivious HTTP in <xref target="OHTTP"/> encrypts messages such that entire request
and response bodies need to be received before any of the content can be decrypted. This
is well-suited for many of the use cases of Oblivious HTTP, such as DNS queries or metrics
reporting.</t>
      <t>However, some applications of Oblivious HTTP can benefit from being able to encrypt and
decrypt parts of the messages in chunks. If a request or response can be processed by a
receiver in separate parts, and is particularly large or will be generated slowly, then
sending a series of encrypted chunks can improve the performance of applications.</t>
      <t>Incremental delivery of responses allows an Oblivious Gateway Resource to provide
Informational (1xx) responses (<xref section="15.2" sectionFormat="of" target="HTTP"/>).</t>
      <t>This document defines an optional message format for Oblivious HTTP that supports the
progressive creation and processing of both requests and responses. New media types are
defined for this purpose.</t>
      <section anchor="applicability">
        <name>Applicability</name>
        <t>Like the non-chunked variant, chunked Oblivious HTTP has limited applicability
as described in <xref section="2.1" sectionFormat="of" target="OHTTP"/>, and requires the use of a willing
Oblivious Relay Resource and Oblivious Gateway Resource.</t>
        <t>Chunked Oblivious HTTP is intended to be used in cases for where the privacy
properties of Oblivious HTTP are needed — specifically, removing linkage
at the transport layer between separate HTTP requests — but incremental
processing is also needed for performance or functionality.</t>
        <t>One specific functional capability that requires chunked Oblivious HTTP
is support for Informational (1xx) responses
(<xref section="15.2" sectionFormat="of" target="HTTP"/>).</t>
        <t>In order to be useful, the content of chunked Oblivious HTTP needs to be
possible to process incrementally. Since incremental processing means that the
message might end up being truncated, for example in the case of an error on the
underlying transport, applications also need to be prepared to safely handle incomplete
messages (see <xref target="security"/> for more discussion). Applications that use the Indeterminate
format of Binary HTTP (<xref section="3.2" sectionFormat="of" target="BHTTP"/>) are well-suited
to using chunked Oblivious HTTP.</t>
        <t>Chunked Oblivious HTTP is not intended to be used for long-lived sessions
between clients and servers that might build up state, or as a replacement
for a proxied TLS session.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>Notational conventions from <xref target="OHTTP"/> are used in this document.</t>
    </section>
    <section anchor="chunked-request-and-response-media-types">
      <name>Chunked Request and Response Media Types</name>
      <t>Chunked Oblivious HTTP defines different media than the non-chunked variant. These
media types are "message/ohttp-chunked-req" (defined in <xref target="iana-req"/>) and
"message/ohttp-chunked-res" (defined in <xref target="iana-res"/>).</t>
    </section>
    <section anchor="request">
      <name>Request Format</name>
      <t>Chunked OHTTP requests start with the same header as used for the non-chunked variant,
which consists of a key ID, algorithm IDs, and the KEM shared secret. This header is
followed by chunks of data protected with HPKE, each of which is preceded by a
variable-length integer (as defined in <xref section="16" sectionFormat="of" target="QUIC"/>)
that indicates the length of the chunk. The final chunk is preceded by a length
field with the value 0, which means the chunk extends to the end of the outer stream.</t>
      <figure anchor="fig-enc-request">
        <name>Chunked Encapsulated Request Format</name>
        <artwork><![CDATA[
Chunked Encapsulated Request {
  Chunked Request Header (56 + 8 * Nenc),
  Chunked Request Chunks (..),
}

Chunked Request Header {
  Key Identifier (8),
  HPKE KEM ID (16),
  HPKE KDF ID (16),
  HPKE AEAD ID (16),
  Encapsulated KEM Shared Secret (8 * Nenc),
}

Chunked Request Chunks {
  Non-Final Request Chunk (..),
  Final Request Chunk Indicator (i) = 0,
  HPKE-Protected Final Chunk (..),
}

Non-Final Request Chunk {
  Length (i) = 1..,
  HPKE-Protected Chunk (..),
}
]]></artwork>
      </figure>
      <t>The content of the HPKE-protected chunks is defined in <xref target="request-encap"/>.</t>
    </section>
    <section anchor="response">
      <name>Response Format</name>
      <t>Chunked OHTTP responses start with a nonce, followed by chunks of data protected with
an AEAD. Each chunk is preceded by a variable-length integer that indicates the length
of the chunk. The final chunk is preceded by a length field with the value 0, which means
the chunk extends to the end of the outer stream.</t>
      <figure anchor="fig-enc-response">
        <name>Chunked Encapsulated Response Format</name>
        <artwork><![CDATA[
Chunked Encapsulated Response {
  Response Nonce (Nk),
  Chunked Response Chunks (..),
}

Chunked Response Chunks {
  Non-Final Response Chunk (..),
  Final Response Chunk Indicator (i) = 0,
  AEAD-Protected Final Response Chunk (..),
}

Non-Final Response Chunk {
  Length (i) = 1..,
  AEAD-Protected Chunk (..),
}
]]></artwork>
      </figure>
    </section>
    <section anchor="encapsulation-of-chunks">
      <name>Encapsulation of Chunks</name>
      <t>The encapsulation of chunked Oblivious HTTP requests and responses uses
the same approach as the non-chunked variant, with the difference that
the body of requests and responses are sealed and opened in chunks, instead
of as a whole.</t>
      <t>The AEAD that protects both requests and responses protects individual chunks from
modification or truncation. Additionally, chunk authentication protects two other
pieces of information:</t>
      <ol spacing="normal" type="1"><li>
          <t>the order of the chunks (the sequence number of each chunk), which is
included in the nonce of each chunk.</t>
        </li>
        <li>
          <t>which chunk is the final chunk, which is indicated by a sentinel in the AAD
of the final chunk.</t>
        </li>
      </ol>
      <t>The format of the outer packaging that carries the chunks (the length prefix for each
chunk specifically) is not explicitly authenticated. This allows the chunks to be
transported by alternative means, and still be valid as long as the order and
finality are preserved.  In particular, the variable-length encoding used for lengths
allows for different expressions of the same value, where the choice between
equivalent encodings is not authenticated.</t>
      <section anchor="request-encap">
        <name>Request Encapsulation</name>
        <t>For requests, the setup of the HPKE context and the encrypted request header
is the same as the non-chunked variant. This is the Chunked Request Header
defined in <xref target="request"/>.</t>
        <artwork><![CDATA[
hdr = concat(encode(1, key_id),
             encode(2, kem_id),
             encode(2, kdf_id),
             encode(2, aead_id))
info = concat(encode_str("message/bhttp chunked request"),
              encode(1, 0),
              hdr)
enc, sctxt = SetupBaseS(pkR, info)
enc_request_hdr = concat(hdr, enc)
]]></artwork>
        <t>Each chunk is sealed using the HPKE context. For non-final chunks, the AAD
is empty.</t>
        <artwork><![CDATA[
sealed_chunk = sctxt.Seal("", chunk)
sealed_chunk_len = varint_encode(len(sealed_chunk))
non_final_chunk = concat(sealed_chunk_len, sealed_chunk)
]]></artwork>
        <t>The final chunk in a request uses an AAD of the string "final".</t>
        <artwork><![CDATA[
sealed_final_chunk = sctxt.Seal("final", chunk)
sealed_final_chunk_len = varint_encode(len(sealed_final_chunk))
final_chunk = concat(sealed_final_chunk_len, sealed_final_chunk)
]]></artwork>
        <t>HPKE already maintains a sequence number for sealing operations as part of
the context, so the order of chunks is protected.</t>
      </section>
      <section anchor="response-encap">
        <name>Response Encapsulation</name>
        <t>For responses, the first piece of data sent back is the response nonce,
as in the non-chunked variant.</t>
        <artwork><![CDATA[
entropy_len = max(Nn, Nk)
response_nonce = random(entropy_len)
]]></artwork>
        <t>Each chunk is sealed using the same AEAD key and AEAD nonce that are
derived for the non-chunked variant, which are calculated as follows:</t>
        <artwork><![CDATA[
secret = context.Export("message/bhttp chunked response", entropy_len)
salt = concat(enc, response_nonce)
prk = Extract(salt, secret)
aead_key = Expand(prk, "key", Nk)
aead_nonce = Expand(prk, "nonce", Nn)
]]></artwork>
        <t>The sender also maintains a counter of chunks, which is set to 0 for the first
chunk an incremented by 1 after encoding each chunk.</t>
        <artwork><![CDATA[
counter = 0
]]></artwork>
        <t>The AEAD nonce is XORed with the counter for encrypting (and decrypting) each
chunk.  For non-final chunks, the AAD is empty.</t>
        <artwork><![CDATA[
chunk_nonce = aead_nonce XOR encode(Nn, counter)
sealed_chunk = Seal(aead_key, chunk_nonce, "", chunk)
sealed_chunk_len = varint_encode(len(sealed_chunk))
non_final_chunk = concat(sealed_chunk_len, sealed_chunk)
counter++
]]></artwork>
        <t>The final chunk in a response uses an AAD of the string "final".</t>
        <artwork><![CDATA[
chunk_nonce = aead_nonce XOR encode(Nn, counter)
sealed_final_chunk = Seal(aead_key, chunk_nonce, "final", chunk)
sealed_final_chunk_len = varint_encode(len(sealed_final_chunk))
final_chunk = concat(sealed_final_chunk_len, sealed_final_chunk)
]]></artwork>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>The primary advantage of a chunked encoding is that chunked requests or responses can
be generated or processed incrementally.  However, for a recipient in particular,
processing an incomplete message can have security consequences.</t>
      <t>The potential for message truncation is not a new concern for HTTP.  All versions of
HTTP provide incremental delivery of messages.  For this use of Oblivious HTTP,
incremental processing that might result in side-effects demands particular attention
as Oblivious HTTP does not provide strong protection against replay attacks; see
<xref section="6.5" sectionFormat="of" target="OHTTP"/>.  Truncation might be the result of interference at the
network layer, or by a malicious Oblivious Relay Resource.</t>
      <t>Endpoints that receive chunked messages can perform early processing if the risks are
understood and accepted. Conversely, endpoints that depend on having a complete
message <bcp14>MUST</bcp14> ensure that they do not consider a message complete until having
received a chunk with a 0-valued length prefix, which was successfully decrypted
using the expected sentinel value, "final", in the AAD.</t>
      <section anchor="interactivity-and-privacy">
        <name>Interactivity and Privacy</name>
        <t>Without chunking, Oblivious HTTP involves a single request and response, with no
further interactivity.  Using a chunked variant at both Client and Oblivious
Gateway Resource creates the possibility that an exchange could lead to multiple
rounds of interaction.  Information from early chunks from a peer could
influence how an endpoint constructs later chunks of their message.</t>
        <t>An Oblivious Gateway Resource could be able to observe the round trip time to
the Client if the Client conditions the timing or content of chunks on what it
receives in a response.</t>
        <t>Client implementations therefore need to be aware of the possibility that
processing chunks might result in observable interactivity that could reduces
the privacy protection that the protocol could otherwise provide.  Interactivity
that is deliberate might be acceptable. For instance, the 100-continue feature
in HTTP, which has the client withhold the body of a request until it receives a
100 Informational response, is not possible without chunked encoding.  This
highlights the risks involved in the use of this chunked encoding to adapt an
existing HTTP-based interaction to use Oblivious HTTP as such an adaptation
might not achieve expected privacy outcomes.
In order to prevent the Oblivious Gateway Resource from observing the round trip time
to the client, client implementations can choose to not base the sending of request chunks based
on received response chunks. These interactions can still benefit from chunked processing,
without incurring additional observability risks.
# IANA Considerations</t>
        <t>This document updates the "Media Types" registry at
<eref target="https://iana.org/assignments/media-types">https://iana.org/assignments/media-types</eref> to add the media types
"message/ohttp-chunked-req" (<xref target="iana-req"/>), and
"message/ohttp-chunked-res" (<xref target="iana-res"/>), following the procedures of
<xref target="RFC6838"/>.</t>
      </section>
      <section anchor="iana-req">
        <name>message/ohttp-chunked-req Media Type</name>
        <t>The "message/ohttp-chunked-req" identifies an encrypted binary HTTP request
that is transmitted or processed in chunks. This is a binary format that is
defined in <xref target="request"/>.</t>
        <dl spacing="compact">
          <dt>Type name:</dt>
          <dd>
            <t>message</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>ohttp-chunked-req</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>"binary"</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>see <xref target="security"/></t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>this specification</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Oblivious HTTP and applications that use Oblivious HTTP use this media type to
identify encapsulated binary HTTP requests that are incrementally generated or processed.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl spacing="compact">
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>N/A</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>see Authors' Addresses section</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>see Authors' Addresses section</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-res">
        <name>message/ohttp-chunked-res Media Type</name>
        <t>The "message/ohttp-chunked-res" identifies an encrypted binary HTTP response
that is transmitted or processed in chunks. This is a binary format that
is defined in <xref target="response"/>.</t>
        <dl spacing="compact">
          <dt>Type name:</dt>
          <dd>
            <t>message</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>ohttp-chunked-res</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>"binary"</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>see <xref target="security"/></t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>this specification</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Oblivious HTTP and applications that use Oblivious HTTP use this media type to
identify encapsulated binary HTTP responses that are incrementally generated or processed.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl spacing="compact">
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>N/A</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>see Authors' Addresses section</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>see Authors' Addresses section</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="OHTTP">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="August" year="2023"/>
            <abstract>
              <t>   This document describes Oblivious HTTP, a protocol for forwarding
   encrypted HTTP messages.  Oblivious HTTP allows a client to make
   multiple requests to an origin server without that server being able
   to link those requests to the client or to identify the requests as
   having come from the same client, while placing only limited trust in
   the nodes used to forward the messages.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-ohttp-10"/>
        </reference>
        <reference anchor="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="BHTTP">
          <front>
            <title>Binary Representation of HTTP Messages</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document defines a binary format for representing HTTP messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9292"/>
          <seriesInfo name="DOI" value="10.17487/RFC9292"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
      </references>
    </references>
    <?line 503?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledgements.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
wltusTs/PseRJY5kG0R2/Xf9GKSC2D0AAA==

-->

</rfc>
