<?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.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ohai-chunked-ohttp-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="Chunked OHTTP">Chunked Oblivious HTTP Messages</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-chunked-ohttp-04"/>
    <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="April" day="25"/>
    <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

<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. Client implementations therefore need to be aware
of the possibility that interactively processing chunks might reveal information to the
Oblivious Gateway Resource that is otherwise kept private.</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 602?>

<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.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
JMwksORhAAA=

-->

</rfc>
