<?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.17 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ohai-chunked-ohttp-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="Chunked OHTTP">Chunked Oblivious HTTP Messages</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-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="July" day="08"/>
    <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. HPKE will produce an
error if the sequence number overflows, which puts a limit on the number
of chunks that can be sent in a request.</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. As in the non-chunked variant, the length
of the nonce is <tt>max(Nn, Nk)</tt>, where <tt>Nn</tt> and <tt>Nk</tt> are the length of
the AEAD nonce and key.</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>
        <t>If the counter reached the maximum value that can be held in an
integer with <tt>Nn</tt> bits (that maximum being <tt>2^Nn</tt>), where <tt>Nn</tt> is the
length of the AEAD nonce, the <tt>chunk_nonce</tt> would wrap and be reused.
Therefore, the response <bcp14>MUST NOT</bcp14> use <tt>2^Nn</tt> or more chunks.</t>
      </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.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <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 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 513?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledgements.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
JY0qIhijS2HKVejyInbntGyorNy5YpQCIpBTsvSkFSvbs8/F6P443NFICnWg
kykt1eYzcerJlITNcATrKIv0iT3/9eK9iY6sYQYngr4LAyvvRY1CeN6PkkTk
XA+GHr0WegQMgyAjqYKSEF3Jqj0l++uxijE8qMuD+AdfNvj/Cl6e1i++eDCM
edj53Dj29wqqz8GD4vqHjISn054lVmRqRvJYIJ6dN3NfWImjyYwKLyTnQoXi
Dts0w+3E1nzaoXsuv4LcWX58+h/4vt/DZokSql/R7XxG7PpjJMePelk2VPap
kgUDJvfu0NmCW58q7t4Z9kNPuMfhS0ahQodrSd/dQuWGS39rSddqzmZtsL9/
1N5nirUtKjuny8gkuwX00g0tV+ADaLYIYUMM7qe5Lu6e4V4V1Wt3obv0tpdm
7fpYt21AcjNY4ci4sD64R0ex+K5esMzf1bZNI6TKWXJL2OnZ5vZSSTycP+ou
SipV2kS6A8PUrmDQnrB0YZZsgzhm8li+VNX6CFkO3Xv685w0JPoumd4teNx3
0/XsMdjxlZNv1FhroFI7LtKjW1YIuslZPKTTkcFBk4oXmZknVA7sZKaTupYL
MEpS1u+oSiOcBtoBInRU9mkdN9FcU9Cp5fp2RashDXJ/gHyN6m45vhl/HXWk
gMOrTpj+WtgE6yW6uaYCzwwFJ98aUODYWyLCci8HXx1zHWOeULGAqN7VxwLF
nhTZorRF7ULDBTdqtVbaXuaThfimDkQg6tGKG0DEVSvrbqQBiHsLXF2WUuFK
0tRIkxxfUlfOUEHJ9LeWpkBKYGGJ0tS13lMgzktdz5VpOyNW0AdrI/WeSqwH
uw6GDkCzuV9Yte193k1DBfzJiNEt61dmQpawTLihkHim5uRV1/unuhzO3C2k
DNoWkXytogX8rqgkWfcpKRRZERRUS9b3zrf9qD+BrLLxkIEdhpvtj7dlfitt
sfied+2ncRHQFyuLUk2bikp0YkRhT5jdT87Lu59Hkn1xbVG6ZftdT2qj5Y07
yHydS5pfok4e6j65S2dJwVoh0M4RGSnnmsOyLXWFVwg7mWuNPEmlChl39chl
tNhfVMWkrggDvnhhKjjkcmKalUve2BsaWwjwilyeUuIquuAA0bYFNWjm6MHu
PuEAzhmaKMsJl8HEDYgP4KJd6NrO6TMfLbwQva/4J1AkNVYRG8bz4bLa6DVy
5BhLvjSpgwG7fnpDbSt+D7J6BsJ2aYmFcTNPsqTzgY+y6/qKQ4bffx1BhWUW
QM+efJhjCVWGjrRSW/fdbDFKBhfmd2Va5n4aF5KX1pmAsGwF0R7+IthxpJhw
qOwAU9CGCJPSDAFx0uYPB0+ejEi4tkAeM4XFAktgMr4HV1x95gtyvqma3GdW
5pIIhdp+VB1hbLEteMIdFXZZ60brvNGHybY/bBm7eZQyUDygnuIZGMuJOReh
rHf9tgjuQyKHx43cg5rRs4R7fJW5s64OXfOjSSJ5RetvmnujNn75kPhmangT
r8RcKRE5x/x0ZpGKdPgXtA3GAMKUQ8SNdXGv+ANuxr4tdhYAds25VK/9fRg0
tu4AFL3SWVk6dlYimBj35RVpIe6ua4LBs2wURNLGi67LWRJF6TuJxSdbhVJ6
1HMddNL51VAFxSNvaSo+hiTtjUvrXuKTrHROTE+Pzo/WktL19uBmkbVAPIia
bgZg4Brap2y1Vs/pcO8OHz+mFhb6Uc/jBHRdF7SEe8y9NCPupXkp9uPPAV2P
ze4uGeqv6TXVDH+5q6bXShOuoYPWWWpZU/G9kpJmr2+efflMLr8f6Z2ERD1H
SN1biiShfYh+G5omnESQ9oc6Ueth+DVBACO+Z5nbekveHlmMlPOTsFL8WyLr
dtfymQX+RZRSh4FhpS6bSd37ssGLUu+lizaj/BbDYKyOh54/PlLqIjSQb/t4
EhAk7RkcDxgIAwPQEB8a1kat94BSgy324PKpt+0ts3hz/lWKowNoexnmrxIP
Bed6rxGyd/SRWhdZLc9eB7ci6/e9tpPXBm5Zj6K7Dtayii6it9uKawt5/cPc
jhMf9P66Sq7Zq23XxrNLYt2F7drd66F+nuWQV5JCmS8GlBYDrwYvQfrzrH55
llzb1NeM99z+4fPHePk8y15iVfydhXHHhnovpJiYW8QEsjrXtfmzgHdNfm1z
I40XdAB8aJszIrMuHXV1UHpFYubyx645j7P8JewFput/v8A/AyTMoutDgi+K
+OCYSe2y4L6IyFSP+GeN7p/o7pvmUpOM8b9YOw1dvw25Hk+h1suLc/IwqiP5
CAAauhGiF/9jyc/Y5FVIkanCmudGZvHvP+8PNzUIf3oI/9xW/HO/hH/uc/FP
wuGvBoBqs9PJ9zD9XxDQ/YaA/xgI2P4U9jcI/A0Cf00IpN8Z0z0j5cdH6U1R
LnOTsck4TBGlmuzFYJrkznDr5cXxBc4sYSTbINLr/wUhl5OX9T8AAA==

-->

</rfc>
