<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ohai-chunked-ohttp-08" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="Chunked OHTTP">Chunked Oblivious HTTP Messages</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-chunked-ohttp-08"/>
    <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="2026" month="February" day="18"/>
    <area>ART</area>
    <workgroup>OHAI Working Group</workgroup>
    <abstract>
      <?line 40?>

<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>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-ohai.github.io/draft-ohai-chunked-ohttp/draft-ietf-ohai-chunked-ohttp.html"/>.
        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>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-ohai/draft-ohai-chunked-ohttp"/>.</t>
    </note>
  </front>
  <middle>
    <?line 48?>

<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). Choices about how
the inner content is structured can be made independently of this chunked
format; that is, Binary HTTP chunks do need not to align with those
of OHTTP.</t>
        <t>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 as it enables
incremental construction of messages.  That only applies to construction; how a
message can be processed after decryption depends on how the format is
processed.  Binary HTTP messages in any format (either Known- or
Indeterminate-Length) can be incrementally processed.</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-requests-and-responses">
      <name>Chunked Requests and Responses</name>
      <t>Chunked Oblivious HTTP defines different media types 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"/>).
If a request uses the media type "message/ohttp-chunked-req",
a successful corresponding response <bcp14>MUST</bcp14> use the media type "message/ohttp-chunked-res".</t>
      <t>Chunked Oblivious HTTP requests are defined to contain Binary HTTP requests
in either Known- or Indeterminate-Length form;
responses contain Binary HTTP responses; see <xref target="BHTTP"/>.
As with non-chunked Oblivious HTTP,
the encapsulation format of chunked Oblivious HTTP can be repurposed
for other media types; see <xref section="4.6" sectionFormat="of" target="OHTTP"/>.</t>
      <t>Use cases that require the use of Chunked OHTTP <bcp14>SHOULD</bcp14> only use the chunked
media types for their requests, to indicate that Chunked OHTTP is required.
If the gateway unexpectedly does not support Chunked OHTTP, then the request
will fail as if OHTTP as a whole were not supported. If clients retry requests
with the non-chunked media type, a gateway could partition client anonymity
sets by rejecting some requests and accepting others.</t>
      <t>Chunked OHTTP requests and responses <bcp14>SHOULD</bcp14> include the
<tt>Incremental</tt> header field set to <tt>?1</tt> <xref target="INCREMENTAL"/>.
This signals to intermediaries -- the relay in particular -- that the content of
the messages are intended to be delivered incrementally. Without this signal,
intermediaries might buffer request or response body until complete,
removing some of the benefits of using Chunked OHTTP.</t>
      <t>Incremental processing of messages does not always
require incremental forwarding in the network.
An endpoint might reasonably omit the <tt>Incremental</tt> header field
if it only wants to support incremental processing of a complete message.</t>
      <t>Chunked OHTTP messages generally will not include a <tt>Content-Length</tt> header field,
since the complete length of all chunks might not be known ahead of time.</t>
      <t>For example, a Chunked OHTTP request could look like the following:</t>
      <sourcecode type="http-message"><![CDATA[
POST /request.example.net/proxy HTTP/1.1
Host: proxy.example.org
Content-Type: message/ohttp-chunked-req
Incremental: ?1
Transfer-Encoding: chunked

<content is an Encapsulated Request>
]]></sourcecode>
      <t>Implementations <bcp14>MUST</bcp14> support receiving chunks that contain 2<sup>14</sup> (16384) octets
of data prior to encapsulation. Senders of chunks <bcp14>SHOULD</bcp14> limit their chunks to
this size, unless they are aware of support for larger sizes by the receiving
party.</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.</t>
      <t>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.
This format relies on its length being indicated
by the protocol that carries the message;
for HTTP, the final chunk ends at the end of the HTTP message content.</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),
  KEM Encapsulated Key (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.</t>
      <t>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 (8 * max(Nn, 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="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 bodies 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 Additional Authenticated Data (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>
      <t>When translating from an HTTP message that is already divided into chunks --
such as the chunked transfer coding in HTTP/1.1
(<xref section="7.1" sectionFormat="of" target="RFC9112"/>)
or DATA frames in HTTP/2 or HTTP/3
(<xref section="6.1" sectionFormat="of" target="RFC9113"/> and <xref section="7.2.1" sectionFormat="of" target="RFC9114"/>) --
there is no expectation that any chunks align.
As noted in <xref target="applicability"/>,
the chunking of the encapsulated binary HTTP message
and the binary HTTP message do not need to be aligned.</t>
      <t>A non-final chunk <bcp14>MUST NOT</bcp14> contain a zero-length plaintext.
A receiver <bcp14>MUST</bcp14> treat the receipt of a chunk that contains no data
as equivalent to a decryption error,
unless that chunk is the final chunk.</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 ASCII string "final" (0x66696e616c)
and is prefixed with a zero length.</t>
        <artwork><![CDATA[
sealed_final_chunk = sctxt.Seal("final", chunk)
final_chunk = concat(varint_encode(0), 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 and 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" and is prefixed
with a zero length.</t>
        <artwork><![CDATA[
chunk_nonce = aead_nonce XOR encode(Nn, counter)
sealed_final_chunk = Seal(aead_key, chunk_nonce, "final", chunk)
final_chunk = concat(varint_encode(0), sealed_final_chunk)
]]></artwork>
        <t>If the counter reached the maximum value that can be held in an
integer with <tt>Nn</tt> bytes (that maximum being 256<sup><tt>Nn</tt></sup>), 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 256<sup><tt>Nn</tt></sup> or more chunks.
However, this limit does not consider security margins; see <xref target="sec-limits"/>.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>In general, Chunked OHTTP inherits the same security considerations as Oblivious
HTTP <xref target="OHTTP"/>. Note specifically that while Chunked OHTTP allows for incremental
delivery and processing of messages, it does not add forward secrecy between
chunks. As with the non-chunked variant, forward secrecy is only provided when
changing the key configuration. This is particularly important when chunking is
used to enable interactivity.</t>
      <t>The use of Chunked OHTTP can be considered part of the configuration a client
knows about for a particular gateway. As such, the use of Chunked OHTTP falls
under the same consistency privacy considerations as the rest of the configuration
(see <xref section="7" sectionFormat="of" target="OHTTP"/>). Specifically, clients <bcp14>SHOULD NOT</bcp14> fall back from
Chunked OHTTP to the non-chunked variant if they are configured to used chunking.
Falling back would allow clients to have inconsistent behavior that could be used to partition client anonymity sets.</t>
      <section anchor="message-truncation">
        <name>Message Truncation</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>Truncation might be the result of interference at the network layer,
or by a malicious Oblivious Relay Resource.</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"/>.
The risks from replay of incremental processing are
in addition to the risks from replaying entire messages.</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>
      <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.  However,
the use of Chunked OHTTP does not necessarily mean that exchanges will involve
interactivity.</t>
        <t>Interactivity for Chunked OHTTP can be defined as any case in which the response
can influence the timing or content of the request. To help explain this
distinction, the following scenarios can be used to understand different
modalities for requests and responses:</t>
        <ul spacing="normal">
          <li>
            <t>The request is sent as a single chunk, and the response is sent as a single
chunk. This is a non-interactive case that is identical to the non-chunked
variant.</t>
          </li>
          <li>
            <t>The request is sent as a single chunk, and the response is sent in multiple
chunks. This is a non-interactive case, because there is no possibility
that the client can influence its request based on the response content.</t>
          </li>
          <li>
            <t>The request is sent in multiple chunks, but either all chunks are sent before
a response chunk is received, or the sending of the chunks is not influenced
by the response chunks. This is a non-interactive case, since again the
client's request is not influenced by any response content.</t>
          </li>
          <li>
            <t>The request is sent in multiple chunks, at least one of which specifically
is sent after receiving -- and possibly processing -- a response chunk (or the complete response), where
the response influences the timing and/or content of the request chunk.
This is an interactive case.</t>
          </li>
        </ul>
        <t>In the interactive case, the Oblivious Gateway Resource can
observe the round trip time to the Client, which can change the privacy
assumptions of the system.</t>
        <t>Any interactivity also allows a network adversary (including the Oblivious Relay Resource)
to measure the round-trip delay from themselves to the Client.</t>
        <t>Applications that require interactivity <bcp14>SHOULD</bcp14> avoid using chunked OHTTP
and instead leverage protocols without the shortcomings of Oblivious HTTP.
One example is combining TLS <xref target="TLS"/> and the HTTP CONNECT
method <xref section="9.3.6" sectionFormat="of" target="RFC9110"/>.
Where interactivity is a desirable property,
producing an analysis that explains why
the resulting reduction in privacy is acceptable
for that specific interactive application is recommended.</t>
        <t>For cases when interactivity introduces unacceptable risks, the client can ensure that it never has an
interactive exchange, either by not sending its request in multiple chunks, or
by ensuring that the sending of request chunks cannot be influenced by the response.</t>
        <t>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
an interactive exchange.  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.</t>
        <t>Interactivity does not inherently reduce replay risk unless the server
explicitly verifies that a client is live (such as by having the client echo
content from the response in its request).  A request that is generated
interactively can be replayed by a malicious relay.</t>
      </section>
      <section anchor="sec-limits">
        <name>Message Size Limits</name>
        <t>The security margins for many ciphers degrade
as more data is protected.
The total size of messages needs to be limited
to limit the ability of an attacker to compromise cipher
confidentiality and integrity.</t>
        <t>The multi-user analysis in <xref section="7" sectionFormat="of" target="AEAD-LIMITS"/>
describes a process for estimating limits on usage
that maintain security margins.
For instance, that analysis shows that to keep the Authenticated Encryption Advantage (AEA)
for AEAD_AES_GCM_128 below 2<sup>-50</sup>,
the total number of bytes protected by a key can be kept below 2<sup>80</sup>,
divided by the total number of bytes protected by any key.
Therefore, for AEAD_AES_GCM_128 and a target advantage of 2<sup>-50</sup>,
and a limit on the number of messages of 2<sup>20</sup>,
no message can exceed 2<sup>30</sup> bytes.</t>
        <aside>
          <t>Note that for these limits for AEAD_AES_GCM_128,
reducing the chunk size can increase the number of messages or message size.
Halving the chunk size doubles
either the number of messages
or the total message size.</t>
        </aside>
        <t>The use of most AEAD ciphers is subject to a hard limit on ciphertext length.
For this format, this limit applies to each chunk
and is determined by the <tt>C_MAX</tt> parameter of the AEAD;
see <xref target="AEAD"/>.
AEAD ciphers also have a hard limit on the total number of chunks,
which is 256<sup>Nn</sup>.
These hard limits on chunk size and count
apply to both request and response.</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>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <displayreference target="RFC9113" to="HTTP/2"/>
    <displayreference target="RFC9114" to="HTTP/3"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="OHTTP">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <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="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </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="INCREMENTAL">
          <front>
            <title>Incremental Forwarding of HTTP Messages</title>
            <author fullname="Kazuho Oku" initials="K." surname="Oku">
              <organization>Fastly</organization>
            </author>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple</organization>
            </author>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <date day="12" month="November" year="2025"/>
            <abstract>
              <t>   This document specifies the "Incremental" HTTP header field, which
   instructs HTTP intermediaries to forward the HTTP message
   incrementally.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-incremental-03"/>
        </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="AEAD-LIMITS">
          <front>
            <title>Usage Limits on AEAD Algorithms</title>
            <author fullname="Felix Günther" initials="F." surname="Günther">
              <organization>IBM Research Europe - Zurich</organization>
            </author>
            <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="4" month="December" year="2025"/>
            <abstract>
              <t>   An Authenticated Encryption with Associated Data (AEAD) algorithm
   provides confidentiality and integrity.  Excessive use of the same
   key can give an attacker advantages in breaking these properties.
   This document provides simple guidance for users of common AEAD
   functions about how to limit the use of keys in order to bound the
   advantage given to an attacker.  It considers limits in both single-
   and multi-key settings.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aead-limits-11"/>
        </reference>
        <reference anchor="AEAD">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </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="RFC9112">
          <front>
            <title>HTTP/1.1</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 specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <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>
        <reference anchor="TLS">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9110">
          <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 707?>

<section anchor="example">
      <name>Example</name>
      <!-- Generated using ohttp (https://github.com/martinthomson/ohttp/tree/stream):
RUST_LOG=ohttp cargo test -\-features nss,stream,client,server,unsafe-print-secrets -\-no-default-features -p ohttp -\-lib -\- -\-nocapture split_in
Note: The "rust-hpke" crate doesn't log the client/sender keying material; this needs NSS.
-->

<t>A single request and response exchange is shown here.
This follows the same basic setup as the example in <xref section="A" sectionFormat="of" target="OHTTP"/>.</t>
      <t>The Oblivious Gateway Resource key pair is generated with a X25519 secret key of:</t>
      <artwork type="hex-dump"><![CDATA[
1c190d72acdbe4dbc69e680503bb781a932c70a12c8f3754434c67d8640d8698
]]></artwork>
      <t>The corresponding key configuration is:</t>
      <artwork type="hex-dump"><![CDATA[
010020668eb21aace159803974a4c67f08b4152d29bed10735fd08f98ccdd6fe
09570800080001000100010003
]]></artwork>
      <t>This key configuration is somehow obtained by the Client,
which constructs a binary HTTP request:</t>
      <artwork type="hex-dump"><![CDATA[
00034745540568747470730b6578616d706c652e636f6d012f
]]></artwork>
      <t>The client constructs an HPKE sending context with a secret key of:</t>
      <artwork type="hex-dump"><![CDATA[
b26d565f3f875ed480d1abced3d665159650c99174fd0b124ac4bda0c64ae324
]]></artwork>
      <t>The corresponding public key is:</t>
      <artwork type="hex-dump"><![CDATA[
8811eb457e100811c40a0aa71340a1b81d804bb986f736f2f566a7199761a032
]]></artwork>
      <t>The context is created with an <tt>info</tt> parameter of:</t>
      <artwork type="hex-dump"><![CDATA[
6d6573736167652f6268747470206368756e6b65642072657175657374000100
2000010001
]]></artwork>
      <t>This produces an encrypted
message, allowing the Client to construct the following Encapsulated Request:</t>
      <artwork type="hex-dump"><![CDATA[
01002000010001
8811eb457e100811c40a0aa71340a1b81d804bb986f736f2f566a7199761a032
1c2ad24942d4d692563012f2980c8fef437a336b9b2fc938ef77a5834f
1d2e33d8fd25577afe31bd1c79d094f76b6250ae6549b473ecd950501311
001c6c1395d0ef7c1022297966307b8a7f
]]></artwork>
      <t>This message contains a header, the encapsulated secret, and three encrypted chunks.
Line breaks are included above to show where these chunks start.</t>
      <t>The encrypted chunks are the result of invoking the HPKE <tt>ContextS.Seal()</tt> function three times:
the first with 12 bytes of the request,
the second with the remaining 13 bytes,
and the last containing no data.
This final chunk is marked by a zero length in the encoding
and an AAD of "final" to protect against undetected message truncation.
Each chunk is expanded by 16 bytes for AEAD protection.</t>
      <aside>
        <t>A BSD-like <tt>read()</tt> interface that returns 0
when it reaches the end of a stream
naturally leads to a zero-length chunk like this
if the data returned is protected immediately.</t>
      </aside>
      <t>After sending this to the Oblivious Relay Resource, the
Oblivious Gateway Resource decrypts and processes this message.
The Target Resource produces a response like:</t>
      <artwork type="hex-dump"><![CDATA[
0140c8
]]></artwork>
      <t>The response is protected by exporting a secret from the HPKE context,
using input keying material of:</t>
      <artwork type="hex-dump"><![CDATA[
1d4484834ae36102a6ac42a5523454d9
]]></artwork>
      <t>The salt is:</t>
      <artwork type="hex-dump"><![CDATA[
8811eb457e100811c40a0aa71340a1b81d804bb986f736f2f566a7199761a032
bcce7f4cb921309ba5d62edf1769ef09
]]></artwork>
      <t>From these, HKDF-SHA256 produces a pseudorandom key of:</t>
      <artwork type="hex-dump"><![CDATA[
3967884b5f7b4bce4a5320a3e3f79fdc97389f7deba1c1e11c5ea62278187786
]]></artwork>
      <t>The resulting AES-GCM key is:</t>
      <artwork type="hex-dump"><![CDATA[
8209f78f2a1610d80c7125009b00aff0
]]></artwork>
      <t>The 12-byte base nonce is:</t>
      <artwork type="hex-dump"><![CDATA[
fead854635d2d5527d64f546
]]></artwork>
      <t>The AEAD <tt>Seal()</tt> function is then used to encrypt the response in chunks
to produce the Encapsulated Response:</t>
      <artwork type="hex-dump"><![CDATA[
bcce7f4cb921309ba5d62edf1769ef09
1179bf1cc87fa0e2c02de4546945aa3d1e48
12b348b5bd4c594c16b6170b07b475845d1f32
00ed9d8a796617a5b27265f4d73247f639
]]></artwork>
      <t>This example is split onto separate lines to show the nonce and three chunks:
the first with one byte of response,
the second with the remaining two bytes,
and the final with zero bytes of data.</t>
      <t>The nonces for processing the chunks are, in order:</t>
      <artwork type="hex-dump"><![CDATA[
fead854635d2d5527d64f546
fead854635d2d5527d64f547
fead854635d2d5527d64f544
]]></artwork>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Chris Wood for helping build an initial test implementation and providing reviews.
Thanks to Jonathan Hoyland for identifying some of the privacy leaks.
Thanks to Ricardo Perez, Derrell Piper, and Ben Schwartz for helping find and fix issues in the document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
