<?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-ietf-ohai-chunked-ohttp-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.2 -->
  <front>
    <title abbrev="Chunked OHTTP">Chunked Oblivious HTTP Messages</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-chunked-ohttp-00"/>
    <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="February" day="10"/>
    <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-ietf-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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
mcJbbrE7Pz7HkSWOZBtEdv13pNXjMN09AAA=

-->

</rfc>
