<?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-05" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="Chunked OHTTP">Chunked Oblivious HTTP Messages</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-chunked-ohttp-05"/>
    <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="July" day="02"/>
    <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 <tt>2^14</tt> (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 (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 an incremented by 1 after encoding each chunk.</t>
        <artwork><![CDATA[
counter = 0
]]></artwork>
        <t>The AEAD nonce is XORed with the counter for encrypting (and decrypting) each
chunk.  For non-final chunks, the AAD is empty.</t>
        <artwork><![CDATA[
chunk_nonce = aead_nonce XOR encode(Nn, counter)
sealed_chunk = Seal(aead_key, chunk_nonce, "", chunk)
sealed_chunk_len = varint_encode(len(sealed_chunk))
non_final_chunk = concat(sealed_chunk_len, sealed_chunk)
counter++
]]></artwork>
        <t>The final chunk in a response uses an AAD of the string "final" 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> bits (that maximum being <tt>2^Nn</tt>), where <tt>Nn</tt> is the
length of the AEAD nonce, the <tt>chunk_nonce</tt> would wrap and be reused.
Therefore, the response <bcp14>MUST NOT</bcp14> use <tt>2^Nn</tt> or more chunks.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>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>
    <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="15" month="October" year="2024"/>
            <abstract>
              <t>   This document specifies the "Incremental" HTTP header field, which
   instructs HTTP intermediaries to forward the HTTP message
   incrementally.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the HTTP Working Group
   mailing list (ietf-http-wg@w3.org), which is archived at
   https://lists.w3.org/Archives/Public/ietf-http-wg/.

   Source for this draft and an issue tracker can be found at
   https://github.com/kazuho/draft-kazuho-httpbis-incremental-http.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-kazuho-httpbis-incremental-http-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="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 608?>

<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.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
a+2mKJij89IT/wPDck7P6WIAAA==

-->

</rfc>
