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

<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 40?>

<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 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>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 <xref target="INCREMENTAL"/>
in order to signal to intermediaries (such as the relay) 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
the benefits of using Chunked OHTTP.</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. 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 (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="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 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>
      <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" 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>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>
      <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>Client implementations therefore need to be aware of the possibility that
interactively processing chunks might reveal round-trip time information that
would be kept private in a non-interactive exchange.</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 protected bytes for any given key below 2<sup>80</sup>,
divided by the total number of protected bytes for any key.
For a target advantage of 2<sup>-50</sup>,
if an attacker might interact with 2<sup>20</sup> keys,
messages can only include 2<sup>30</sup> bytes
protected with AEAD_AES_GCM_128.</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 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 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="29" month="April" 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-00"/>
        </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="8" month="April" 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-10"/>
        </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 632?>

<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 and Ben Schwartz for helping find and fix issues in the document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
ZwAA

-->

</rfc>
