<?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.6.15 (Ruby 3.1.2) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ohai-ohttp-03" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.1 -->
  <front>
    <title>Oblivious HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-ohttp-03"/>
    <author initials="M." surname="Thomson" fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2022" month="August" day="08"/>
    <area>Security</area>
    <workgroup>Oblivious HTTP Application Intermediation</workgroup>
    <abstract>
      <t>This document describes a system for forwarding encrypted HTTP messages.
This 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>
    <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/oblivious-http/draft-ietf-ohai-ohttp.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-ohai-ohttp/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Oblivious HTTP Application Intermediation 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/oblivious-http"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>A HTTP request reveals information about the client's identity to the server.
Some of that information is in the request content, and therefore under the control
of the client. However, the source IP address of the underlying connection reveals
information that the client has only limited control over.</t>
      <t>Even where an IP address is not directly associated with an individual, the requests
made from it can be correlated over time to assemble a profile of client behavior. In
particular, connection reuse improves performance, but provides servers with
the ability to correlate requests that share a connection.</t>
      <t>Client-configured HTTP proxies can provide a degree of protection against IP address
tracking, and systems like virtual private networks and the Tor network
<xref target="Dingledine2004"/> provide additional options for clients.</t>
      <t>However, even when IP address tracking is mitigated using one of these techniques, each request
needs to be on a completely new TLS connection to avoid the connection itself being used
to correlate behavior. This imposes considerable performance and efficiency overheads, due
to the additional round trip to the server (at a minumum), additional data exchanged, and
additional CPU cost of cryptographic computations.</t>
      <t>This document defines two kinds of HTTP resources -- Oblivious Relay Resources
and Oblivious Gateway Resources -- that process encapsulated binary HTTP messages
<xref target="BINARY"/> using Hybrid Public Key Encryption (HPKE; <xref target="HPKE"/>). They can be composed to
protect the content of encapsulated requests and responses, thereby separating the identity of a
requester from the request.</t>
      <t>Although this scheme requires support for two new kinds of oblivious resources,
it represents a performance improvement over options
that perform just one request in each connection. With limited trust placed in the
Oblivious Relay Resource (see <xref target="security"/>), clients are assured that requests are not uniquely
attributed to them or linked to other requests.</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>A client must initially know the following:</t>
      <ul spacing="normal">
        <li>The identity of an Oblivious Gateway Resource.  This might include some
information about what Target Resources the Oblivious Gateway Resource
supports.</li>
        <li>The details of an HPKE public key that the Oblivious Gateway Resource
accepts, including an identifier for that key and the HPKE algorithms that
are used with that key.</li>
        <li>The identity of an Oblivious Relay Resource that will accept relay requests
carrying an encapsulated request as its content and forward the content in
these requests to a single Oblivious Gateway Resource. See <xref target="proxy-state"/>
for more information about the mapping between Oblivious Relay and Gateway
Resources.</li>
      </ul>
      <t>This information allows the client to make a request of a Target Resource with
that resource having only a limited ability to correlate that request with the
client IP or other requests that the client might make to that server.</t>
      <figure anchor="fig-overview">
        <name>Overview of Oblivious HTTP</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="464" width="536" viewBox="0 0 536 464" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
              <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
              <path d="M 48,80 L 48,448" fill="none" stroke="black"/>
              <path d="M 88,32 L 88,80" fill="none" stroke="black"/>
              <path d="M 152,32 L 152,80" fill="none" stroke="black"/>
              <path d="M 192,80 L 192,448" fill="none" stroke="black"/>
              <path d="M 240,32 L 240,80" fill="none" stroke="black"/>
              <path d="M 296,32 L 296,80" fill="none" stroke="black"/>
              <path d="M 360,80 L 360,448" fill="none" stroke="black"/>
              <path d="M 384,32 L 384,80" fill="none" stroke="black"/>
              <path d="M 440,32 L 440,80" fill="none" stroke="black"/>
              <path d="M 480,80 L 480,448" fill="none" stroke="black"/>
              <path d="M 528,32 L 528,80" fill="none" stroke="black"/>
              <path d="M 8,32 L 88,32" fill="none" stroke="black"/>
              <path d="M 152,32 L 240,32" fill="none" stroke="black"/>
              <path d="M 296,32 L 384,32" fill="none" stroke="black"/>
              <path d="M 440,32 L 528,32" fill="none" stroke="black"/>
              <path d="M 8,80 L 88,80" fill="none" stroke="black"/>
              <path d="M 152,80 L 240,80" fill="none" stroke="black"/>
              <path d="M 296,80 L 384,80" fill="none" stroke="black"/>
              <path d="M 440,80 L 528,80" fill="none" stroke="black"/>
              <path d="M 48,176 L 184,176" fill="none" stroke="black"/>
              <path d="M 192,240 L 352,240" fill="none" stroke="black"/>
              <path d="M 360,256 L 472,256" fill="none" stroke="black"/>
              <path d="M 368,304 L 480,304" fill="none" stroke="black"/>
              <path d="M 200,368 L 360,368" fill="none" stroke="black"/>
              <path d="M 56,432 L 192,432" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="480,256 468,250.4 468,261.6" fill="black" transform="rotate(0,472,256)"/>
              <polygon class="arrowhead" points="376,304 364,298.4 364,309.6" fill="black" transform="rotate(180,368,304)"/>
              <polygon class="arrowhead" points="360,240 348,234.4 348,245.6" fill="black" transform="rotate(0,352,240)"/>
              <polygon class="arrowhead" points="208,368 196,362.4 196,373.6" fill="black" transform="rotate(180,200,368)"/>
              <polygon class="arrowhead" points="192,176 180,170.4 180,181.6" fill="black" transform="rotate(0,184,176)"/>
              <polygon class="arrowhead" points="64,432 52,426.4 52,437.6" fill="black" transform="rotate(180,56,432)"/>
              <g class="text">
                <text x="44" y="52">Client</text>
                <text x="184" y="52">Relay</text>
                <text x="336" y="52">Gateway</text>
                <text x="476" y="52">Target</text>
                <text x="196" y="68">Resource</text>
                <text x="340" y="68">Resource</text>
                <text x="484" y="68">Resource</text>
                <text x="80" y="116">Relay</text>
                <text x="88" y="132">Request</text>
                <text x="68" y="148">[+</text>
                <text x="132" y="148">Encapsulated</text>
                <text x="112" y="164">Request</text>
                <text x="152" y="164">]</text>
                <text x="232" y="180">Gateway</text>
                <text x="232" y="196">Request</text>
                <text x="212" y="212">[+</text>
                <text x="276" y="212">Encapsulated</text>
                <text x="256" y="228">Request</text>
                <text x="296" y="228">]</text>
                <text x="400" y="244">Request</text>
                <text x="436" y="292">Response</text>
                <text x="320" y="308">Gateway</text>
                <text x="316" y="324">Response</text>
                <text x="236" y="340">[+</text>
                <text x="300" y="340">Encapsulated</text>
                <text x="300" y="356">Response</text>
                <text x="344" y="356">]</text>
                <text x="160" y="372">Relay</text>
                <text x="148" y="388">Response</text>
                <text x="68" y="404">[+</text>
                <text x="132" y="404">Encapsulated</text>
                <text x="132" y="420">Response</text>
                <text x="176" y="420">]</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+---------+       +----------+      +----------+      +----------+
| Client  |       | Relay    |      | Gateway  |      | Target   |
|         |       | Resource |      | Resource |      | Resource |
+----+----+       +----+-----+      +-------+--+      +----+-----+
     |                 |                    |              |
     | Relay           |                    |              |
     | Request         |                    |              |
     | [+ Encapsulated |                    |              |
     |    Request ]    |                    |              |
     +---------------->| Gateway            |              |
     |                 | Request            |              |
     |                 | [+ Encapsulated    |              |
     |                 |    Request ]       |              |
     |                 +------------------->| Request      |
     |                 |                    +------------->|
     |                 |                    |              |
     |                 |                    |     Response |
     |                 |            Gateway |<-------------+
     |                 |           Response |              |
     |                 |    [+ Encapsulated |              |
     |                 |         Response ] |              |
     |           Relay |<-------------------+              |
     |        Response |                    |              |
     | [+ Encapsulated |                    |              |
     |      Response ] |                    |              |
     |<----------------+                    |              |
     |                 |                    |              |
]]></artwork>
        </artset>
      </figure>
      <t>In order to make a request to a Target Resource, the following steps occur, as
shown in <xref target="fig-overview"/>:</t>
      <ol spacing="normal" type="1"><li>The client constructs an HTTP request for a Target Resource.</li>
        <li>The client encodes the HTTP request in a binary HTTP message and then
encapsulates that message using HPKE and the process from <xref target="request"/>.</li>
        <li>The client sends a POST request to the Oblivious Relay Resource with the
Encapsulated Request as the content of that message.</li>
        <li>The Oblivious Relay Resource forwards this request to the Oblivious Gateway
resource.</li>
        <li>The Oblivious Gateway Resource receives this request and removes
the HPKE protection to obtain an HTTP request.</li>
        <li>The Oblivious Gateway Resource makes an HTTP request that includes the target
URI, method, fields, and content of the request it acquires.</li>
        <li>The Target Resource answers this HTTP request with an HTTP response.</li>
        <li>The Oblivious Gateway Resource encapsulates the HTTP response following the
process in <xref target="response"/> and sends this in response to the request from the
Oblivious Relay Resource.</li>
        <li>The Oblivious Relay Resource forwards this response to the client.</li>
        <li>The client removes the encapsulation to obtain the response to the original
request.</li>
      </ol>
      <section anchor="applicability">
        <name>Applicability</name>
        <t>Oblivious HTTP has limited applicability.  Many uses of HTTP benefit
from being able to carry state between requests, such as with cookies
(<xref target="RFC6265"/>), authentication (<xref section="11" sectionFormat="of" target="HTTP"/>), or even
alternative services (<xref target="RFC7838"/>).  Oblivious HTTP removes linkage
at the transport layer, which must be used in conjunction with applications
that do not carry state between requests.</t>
        <t>Oblivious HTTP is primarily useful where privacy risks associated with possible
stateful treatment of requests are sufficiently large that the cost of
deploying this protocol can be justified.  Oblivious HTTP is simpler and less
costly than more robust systems, like Prio (<xref target="PRIO"/>) or Tor
(<xref target="Dingledine2004"/>), which can provide stronger guarantees at higher
operational costs.</t>
        <t>Oblivious HTTP is more costly than a direct connection to a server.  Some costs,
like those involved with connection setup, can be amortized, but there are
several ways in which Oblivious HTTP is more expensive than a direct request:</t>
        <ul spacing="normal">
          <li>Each request requires at least two regular HTTP requests, which adds latency.</li>
          <li>Each request is expanded in size with additional HTTP fields,
encryption-related metadata, and AEAD expansion.</li>
          <li>Deriving cryptographic keys and applying them for request and
response protection takes non-negligible computational resources.</li>
        </ul>
        <t>Examples of where preventing the linking of requests might justify these costs
include:</t>
        <ul spacing="normal">
          <li>DNS queries.  DNS queries made to a recursive resolver reveal information
about the requester, particularly if linked to other queries.</li>
          <li>Telemetry submission.  Applications that submit reports about their usage to
their developers might use Oblivious HTTP for some types of moderately
sensitive data.</li>
        </ul>
        <t>These are examples of requests where there is information in a request that - if
it were connected to the identity of the user - might allow a server to learn
something about that user even if the identity of the user is pseudonymous.
Other examples include the submission of anonymous surveys, making search
queries, or requesting location-specific content (such as retrieving tiles of a
map display).</t>
      </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>
        <dl>
          <dt>Client:</dt>
          <dd>
            <t>This document uses its own definition of client.  When referring to the HTTP
definition of client (<xref section="3.3" sectionFormat="of" target="HTTP"/>), the term "HTTP client" is
used; see <xref target="http-usage"/>.</t>
          </dd>
          <dt>Encapsulated Request:</dt>
          <dd>
            <t>An HTTP request that is encapsulated in an HPKE-encrypted message; see
<xref target="request"/>.</t>
          </dd>
          <dt>Encapsulated Response:</dt>
          <dd>
            <t>An HTTP response that is encapsulated in an HPKE-encrypted message; see
<xref target="response"/>.</t>
          </dd>
          <dt>Oblivious Relay Resource:</dt>
          <dd>
            <t>An intermediary that forwards encapsulated requests and responses between
clients and a single Oblivious Gateway Resource.</t>
          </dd>
          <dt>Oblivious Gateway Resource:</dt>
          <dd>
            <t>A resource that can receive an encapsulated request, extract the contents of
that request, forward it to a Target Resource, receive a response,
encapsulate that response, then return that response.</t>
          </dd>
          <dt>Target Resource:</dt>
          <dd>
            <t>The resource that is the target of an encapsulated request.  This resource
logically handles only regular HTTP requests and responses and so might be
ignorant of the use of Oblivious HTTP to reach it.</t>
          </dd>
          <dt>Relay Request:</dt>
          <dd>
            <t>An HTTP request from Client to Relay that contains an encapsulated request as the content.</t>
          </dd>
          <dt>Relay Response:</dt>
          <dd>
            <t>An HTTP response from Relay to Client that contains an encapsulated response as the content.</t>
          </dd>
          <dt>Gateway Request:</dt>
          <dd>
            <t>An HTTP request from Relay to Gateway that contains an encapsulated request as the content.</t>
          </dd>
          <dt>Gateway Response:</dt>
          <dd>
            <t>An HTTP response from Gateway to Relay that contains an encapsulated response as the content.</t>
          </dd>
        </dl>
        <t>This draft includes pseudocode that uses the functions and conventions defined
in <xref target="HPKE"/>.</t>
        <t>Encoding an integer to a sequence of bytes in network byte order is described
using the function <tt>encode(n, v)</tt>, where <tt>n</tt> is the number of bytes and <tt>v</tt> is
the integer value.  ASCII <xref target="ASCII"/> encoding of a string <tt>s</tt> is
indicated using the function <tt>encode_str(s)</tt>.  The function <tt>len()</tt> returns the
length of a sequence of bytes.</t>
        <t>Formats are described using notation from <xref section="1.3" sectionFormat="of" target="QUIC"/>.</t>
      </section>
    </section>
    <section anchor="key-configuration">
      <name>Key Configuration</name>
      <t>A client needs to acquire information about the key configuration of the
Oblivious Gateway Resource in order to send encapsulated requests.
In order to ensure that clients do not encapsulate messages that other entities
can intercept, the key configuration <bcp14>MUST</bcp14> be authenticated and have integrity
protection.</t>
      <t>This document does not define how that acquisition occurs. However, in
order to help facilitate interoperability, it does specify a format
for the keys. This ensures that different
client implementations can be configured in the same way and also
enables advertising key configurations in a consistent format.  This
format might be used, for example with HTTPS, as part of a system for
configuring or discovering key configurations.  Note however that such
a system needs to consider the potential for key configuration to be
used to compromise client privacy; see <xref target="privacy"/>.</t>
      <t>A client might have multiple key configurations to select from when
encapsulating a request. Clients are responsible for selecting a preferred key
configuration from those it supports. Clients need to consider both the key
encapsulation method (KEM) and the combinations of key derivation function
(KDF) and authenticated encryption with associated data (AEAD) in this
decision.</t>
      <section anchor="key-config">
        <name>Key Configuration Encoding</name>
        <t>A single key configuration consists of a key identifier, a public key, an
identifier for the KEM that the public key uses, and a set HPKE symmetric
algorithms. Each symmetric algorithm consists of an identifier for a KDF and an
identifier for an AEAD.</t>
        <t><xref target="format-key-config"/> shows a single key configuration.</t>
        <figure anchor="format-key-config">
          <name>A Single Key Configuration</name>
          <sourcecode type="tls-syntax"><![CDATA[
HPKE Symmetric Algorithms {
  HPKE KDF ID (16),
  HPKE AEAD ID (16),
}

OHTTP Key Config {
  Key Identifier (8),
  HPKE KEM ID (16),
  HPKE Public Key (Npk * 8),
  HPKE Symmetric Algorithms Length (16),
  HPKE Symmetric Algorithms (32..262140),
}
]]></sourcecode>
        </figure>
        <t>The definitions for the identifiers used in HPKE and the semantics of the
algorithms they identify can be found in <xref target="HPKE"/>.  The <tt>Npk</tt> parameter is
determined by the choice of HPKE KEM, which can also be found in <xref target="HPKE"/>.</t>
      </section>
      <section anchor="ohttp-keys">
        <name>Key Configuration Media Type</name>
        <t>The "application/ohttp-keys" format is a media type that identifies a serialized
collection of key configurations. The content of this media type comprises one
or more key configuration encodings (see <xref target="key-config"/>) that are concatenated;
see <xref target="iana-keys"/> for a definition of the media type.</t>
        <t>Evolution of the key configuration format is supported through the definition of
new formats that are identified by new media types.</t>
      </section>
    </section>
    <section anchor="hpke-encapsulation">
      <name>HPKE Encapsulation</name>
      <t>HTTP message encapsulation uses HPKE for request and response encryption.</t>
      <t>An encapsulated HTTP request contains a binary-encoded HTTP message <xref target="BINARY"/>
and no other fields; see <xref target="fig-req-pt"/>.</t>
      <figure anchor="fig-req-pt">
        <name>Plaintext Request Content</name>
        <artwork><![CDATA[
Request {
  Binary HTTP Message (..),
}
]]></artwork>
      </figure>
      <t>An Encapsulated Request is comprised of a key identifier and a HPKE-protected
request message. HPKE protection includes an encapsulated KEM shared secret (or
<tt>enc</tt>), plus the AEAD-protected request message. An Encapsulated Request is
shown in <xref target="fig-enc-request"/>. <xref target="request"/> describes the process for constructing
and processing an Encapsulated Request.</t>
      <figure anchor="fig-enc-request">
        <name>Encapsulated Request</name>
        <artwork><![CDATA[
Encapsulated Request {
  Key Identifier (8),
  KEM Identifier (16),
  KDF Identifier (16),
  AEAD Identifier (16),
  Encapsulated KEM Shared Secret (8*Nenc),
  AEAD-Protected Request (..),
}
]]></artwork>
      </figure>
      <t>The Nenc parameter corresponding to the HpkeKdfId can be found in <xref section="7.1" sectionFormat="of" target="HPKE"/>.</t>
      <t>An encrypted HTTP response includes a binary-encoded HTTP message <xref target="BINARY"/>
and no other content; see <xref target="fig-res-pt"/>.</t>
      <figure anchor="fig-res-pt">
        <name>Plaintext Response Content</name>
        <artwork><![CDATA[
Response {
  Binary HTTP Message (..),
}
]]></artwork>
      </figure>
      <t>Responses are bound to requests and so consist only of AEAD-protected content.
<xref target="response"/> describes the process for constructing and processing an
Encapsulated Response.</t>
      <figure anchor="fig-enc-response">
        <name>Encapsulated Response</name>
        <artwork><![CDATA[
Encapsulated Response {
  Nonce (Nk),
  AEAD-Protected Response (..),
}
]]></artwork>
      </figure>
      <t>The Nenc and Nk parameters corresponding to the HpkeKdfId can be found in
<xref target="HPKE"/>.  Nenc refers to the size of the encapsulated KEM shared secret, in
bytes; Nk refers to the size of the AEAD key for the HPKE ciphersuite, in bits.</t>
      <section anchor="request">
        <name>Encapsulation of Requests</name>
        <t>Clients encapsulate a request <tt>request</tt> using values from a key configuration:</t>
        <ul spacing="normal">
          <li>the key identifier from the configuration, <tt>keyID</tt>, with the corresponding KEM
identified by <tt>kemID</tt>,</li>
          <li>the public key from the configuration, <tt>pkR</tt>, and</li>
          <li>a selected combination of KDF, identified by <tt>kdfID</tt>, and AEAD, identified by
<tt>aeadID</tt>.</li>
        </ul>
        <t>The client then constructs an Encapsulated Request, <tt>enc_request</tt>, from a binary
encoded HTTP request, <tt>request</tt>, as follows:</t>
        <ol spacing="normal" type="1"><li>Construct a message header, <tt>hdr</tt>, by concatenating the values of <tt>keyID</tt>,
<tt>kemID</tt>, <tt>kdfID</tt>, and <tt>aeadID</tt>, as one 8-bit integer and three 16-bit
integers, respectively, each in network byte order.</li>
          <li>Build <tt>info</tt> by concatenating the ASCII-encoded string "message/bhttp
request", a zero byte, and the header.</li>
          <li>Create a sending HPKE context by invoking <tt>SetupBaseS()</tt> (<xref section="5.1.1" sectionFormat="of" target="HPKE"/>) with the public key of the receiver <tt>pkR</tt> and <tt>info</tt>.  This yields
the context <tt>sctxt</tt> and an encapsulation key <tt>enc</tt>.</li>
          <li>Encrypt <tt>request</tt> by invoking the <tt>Seal()</tt> method on <tt>sctxt</tt> (<xref section="5.2" sectionFormat="of" target="HPKE"/>) with empty associated data <tt>aad</tt>, yielding ciphertext <tt>ct</tt>.</li>
          <li>Concatenate the values of <tt>hdr</tt>, <tt>enc</tt>, and <tt>ct</tt>, yielding an Encrypted
Request <tt>enc_request</tt>.</li>
        </ol>
        <t>Note that <tt>enc</tt> is of fixed-length, so there is no ambiguity in parsing this
structure.</t>
        <t>In pseudocode, this procedure is as follows:</t>
        <artwork><![CDATA[
hdr = concat(encode(1, keyID),
             encode(2, kemID),
             encode(2, kdfID),
             encode(2, aeadID))
info = concat(encode_str("message/bhttp request"),
              encode(1, 0),
              hdr)
enc, sctxt = SetupBaseS(pkR, info)
ct = sctxt.Seal([], request)
enc_request = concat(hdr, enc, ct)
]]></artwork>
        <t>Servers decrypt an Encapsulated Request by reversing this process. Given an
Encapsulated Request <tt>enc_request</tt>, a server:</t>
        <ol spacing="normal" type="1"><li>
            <t>Parses <tt>enc_request</tt> into <tt>keyID</tt>, <tt>kemID</tt>, <tt>kdfID</tt>, <tt>aeadID</tt>, <tt>enc</tt>, and
<tt>ct</tt> (indicated using the function <tt>parse()</tt> in pseudocode). The server is
then able to find the HPKE private key, <tt>skR</tt>, corresponding to <tt>keyID</tt>.  </t>
            <t>
a. If <tt>keyID</tt> does not identify a key matching the type of <tt>kemID</tt>, the
   server returns an error.  </t>
            <t>
b. If <tt>kdfID</tt> and <tt>aeadID</tt> identify a combination of KDF and AEAD that the
   server is unwilling to use with <tt>skR</tt>, the server returns an error.</t>
          </li>
          <li>Build <tt>info</tt> by concatenating the ASCII-encoded string "message/bhttp
request", a zero byte, <tt>keyID</tt> as an 8-bit integer, plus <tt>kemID</tt>, <tt>kdfID</tt>,
and <tt>aeadID</tt> as three 16-bit integers.</li>
          <li>Create a receiving HPKE context by invoking <tt>SetupBaseR()</tt> (<xref section="5.1.1" sectionFormat="of" target="HPKE"/>) with <tt>skR</tt>, <tt>enc</tt>, and <tt>info</tt>.  This produces a context <tt>rctxt</tt>.</li>
          <li>Decrypt <tt>ct</tt> by invoking the <tt>Open()</tt> method on <tt>rctxt</tt> (<xref section="5.2" sectionFormat="of" target="HPKE"/>), with an empty associated data <tt>aad</tt>, yielding <tt>request</tt> or an error
on failure. If decryption fails, the server returns an error.</li>
        </ol>
        <t>In pseudocode, this procedure is as follows:</t>
        <artwork><![CDATA[
keyID, kemID, kdfID, aeadID, enc, ct = parse(enc_request)
info = concat(encode_str("message/bhttp request"),
              encode(1, 0),
              encode(1, keyID),
              encode(2, kemID),
              encode(2, kdfID),
              encode(2, aeadID))
rctxt = SetupBaseR(enc, skR, info)
request, error = rctxt.Open([], ct)
]]></artwork>
      </section>
      <section anchor="response">
        <name>Encapsulation of Responses</name>
        <t>Given an HPKE context <tt>context</tt>, a request message <tt>request</tt>, and a response
<tt>response</tt>, servers generate an Encapsulated Response <tt>enc_response</tt> as
follows:</t>
        <ol spacing="normal" type="1"><li>Export a secret <tt>secret</tt> from <tt>context</tt>, using the string "message/bhttp
response" as context.  The length of this secret is <tt>max(Nn, Nk)</tt>, where <tt>Nn</tt>
and <tt>Nk</tt> are the length of AEAD key and nonce associated with <tt>context</tt>.</li>
          <li>Generate a random value of length <tt>max(Nn, Nk)</tt> bytes, called
<tt>response_nonce</tt>.</li>
          <li>Extract a pseudorandom key <tt>prk</tt> using the <tt>Extract</tt> function provided by
the KDF algorithm associated with <tt>context</tt>. The <tt>ikm</tt> input to this
function is <tt>secret</tt>; the <tt>salt</tt> input is the concatenation of <tt>enc</tt> (from
<tt>enc_request</tt>) and <tt>response_nonce</tt></li>
          <li>Use the <tt>Expand</tt> function provided by the same KDF to extract an AEAD key
<tt>key</tt>, of length <tt>Nk</tt> - the length of the keys used by the AEAD associated
with <tt>context</tt>. Generating <tt>key</tt> uses a label of "key".</li>
          <li>Use the same <tt>Expand</tt> function to extract a nonce <tt>nonce</tt> of length <tt>Nn</tt> -
the length of the nonce used by the AEAD. Generating <tt>nonce</tt> uses a label of
"nonce".</li>
          <li>Encrypt <tt>response</tt>, passing the AEAD function Seal the values of <tt>key</tt>,
<tt>nonce</tt>, empty <tt>aad</tt>, and a <tt>pt</tt> input of <tt>request</tt>, which yields <tt>ct</tt>.</li>
          <li>Concatenate <tt>response_nonce</tt> and <tt>ct</tt>, yielding an Encapsulated Response
<tt>enc_response</tt>. Note that <tt>response_nonce</tt> is of fixed-length, so there is no
ambiguity in parsing either <tt>response_nonce</tt> or <tt>ct</tt>.</li>
        </ol>
        <t>In pseudocode, this procedure is as follows:</t>
        <artwork><![CDATA[
secret = context.Export("message/bhttp response", Nk)
response_nonce = random(max(Nn, Nk))
salt = concat(enc, response_nonce)
prk = Extract(salt, secret)
aead_key = Expand(prk, "key", Nk)
aead_nonce = Expand(prk, "nonce", Nn)
ct = Seal(aead_key, aead_nonce, "", response)
enc_response = concat(response_nonce, ct)
]]></artwork>
        <t>Clients decrypt an Encapsulated Response by reversing this process. That is,
they first parse <tt>enc_response</tt> into <tt>response_nonce</tt> and <tt>ct</tt>. They then
follow the same process to derive values for <tt>aead_key</tt> and <tt>aead_nonce</tt>.</t>
        <t>The client uses these values to decrypt <tt>ct</tt> using the Open function provided by
the AEAD. Decrypting might produce an error, as follows:</t>
        <artwork><![CDATA[
reponse, error = Open(aead_key, aead_nonce, "", ct)
]]></artwork>
      </section>
      <section anchor="request-and-response-media-types">
        <name>Request and Response Media Types</name>
        <t>Media types are used to identify Encapsulated Requests and Responses; see
<xref target="iana-req"/> and <xref target="iana-res"/> for definitions of these media types.</t>
        <t>Evolution of the format of Encapsulated Requests and Responses is supported
through the definition of new formats that are identified by new media types.</t>
      </section>
    </section>
    <section anchor="http-usage">
      <name>HTTP Usage</name>
      <t>A client interacts with the Oblivious Relay Resource by constructing an
Encapsulated Request.  This Encapsulated Request is included as the content of a
POST request to the Oblivious Relay Resource.  This request <bcp14>MUST</bcp14> only contain
those fields necessary to carry the Encapsulated Request: a method of POST, a
target URI of the Oblivious Relay Resource, a header field containing
the content type (see (<xref target="iana-req"/>), and the Encapsulated Request as the
request content. In the request to the Oblivious Relay Resource, clients <bcp14>MAY</bcp14>
include additional fields. However, those fields <bcp14>MUST</bcp14> be independent of the
Encapsulated Request and <bcp14>MUST</bcp14> be fields that the Oblivious Relay Resource will
remove before forwarding the Encapsulated Request towards the target, such as the
Connection or Proxy-Authorization header fields <xref target="SEMANTICS"/>.</t>
      <t>The client role in this protocol acts as an HTTP client both with respect to the
Oblivious Relay Resource and the Target Resource.  For the request the clients
makes to the Target Resource, this diverges from typical HTTP assumptions about
the use of a connection (see <xref section="3.3" sectionFormat="of" target="HTTP"/>) in that the request and
response are encrypted rather than sent over a connection.  The Oblivious Relay
Resource and the Oblivious Gateway Resource also act as HTTP clients toward the
Oblivious Gateway Resource and Target Resource respectively.</t>
      <t>The Oblivious Relay Resource interacts with the Oblivious Gateway Resource as an
HTTP client by constructing a request using the same restrictions as the client
request, except that the target URI is the Oblivious Gateway Resource.  The
content of this request is copied from the client.  The Oblivious Relay Resource
<bcp14>MUST NOT</bcp14> add information to the request without the client being aware of
the type of information that might be added; see
<xref target="relay-responsibilities"/> for more information on relay responsibilities.</t>
      <t>When a response is received from the Oblivious Gateway Resource, the
Oblivious Relay Resource forwards the response according to the rules of an
HTTP proxy; see <xref section="7.6" sectionFormat="of" target="HTTP"/>.</t>
      <t>An Oblivious Gateway Resource, if it receives any response from the Target
Resource, sends a single 200 response containing the encapsulated response.
Like the request from the client, this response <bcp14>MUST</bcp14> only contain those fields
necessary to carry the encapsulated response: a 200 status code, a header field
indicating the content type, and the encapsulated response as the response
content.  As with requests, additional fields <bcp14>MAY</bcp14> be used to convey information
that does not reveal information about the encapsulated response.</t>
      <t>An Oblivious Gateway Resource acts as a gateway for requests to the Target
Resource (see <xref section="7.6" sectionFormat="of" target="HTTP"/>).  The one exception is that any
information it might forward in a response <bcp14>MUST</bcp14> be encapsulated, unless it is
responding to errors it detects before removing encapsulation of the request;
see <xref target="errors"/>.</t>
      <section anchor="informational-responses">
        <name>Informational Responses</name>
        <t>This encapsulation does not permit progressive processing of responses.  Though
the binary HTTP response format does support the inclusion of informational
(1xx) status codes, the AEAD encapsulation cannot be removed until the entire
message is received.</t>
        <t>In particular, the Expect header field with 100-continue (see <xref section="10.1.1" sectionFormat="of" target="HTTP"/>) cannot be used.  Clients <bcp14>MUST NOT</bcp14>
construct a request that includes a 100-continue expectation; the Oblivious
Gateway Resource <bcp14>MUST</bcp14> generate an error if a 100-continue expectation is
received.</t>
      </section>
      <section anchor="errors">
        <name>Errors</name>
        <t>A server that receives an invalid message for any reason <bcp14>MUST</bcp14> generate an HTTP
response with a 4xx status code.</t>
        <t>Errors detected by the Oblivious Relay Resource and errors detected by the
Oblivious Gateway Resource before removing protection (including being unable to
remove encapsulation for any reason) result in the status code being sent
without protection in response to the POST request made to that resource.</t>
        <t>Errors detected by the Oblivious Gateway Resource after successfully removing
encapsulation and errors detected by the Target Resource <bcp14>MUST</bcp14> be sent in an
Encapsulated Response.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>In this design, a client wishes to make a request of a server that is
authoritative for the Target Resource. The client wishes to make this request
without linking that request with either:</t>
      <ol spacing="normal" type="1"><li>The identity at the network and transport layer of the client (that is, the
client IP address and TCP or UDP port number the client uses to create a
connection).</li>
        <li>Any other request the client might have made in the past or might make in
the future.</li>
      </ol>
      <t>In order to ensure this, the client selects a relay (that serves the
Oblivious Relay Resource) that it trusts will protect this information
by forwarding the Encapsulated Request and Response without passing it
to the server (that serves the Oblivious Gateway Resource).</t>
      <t>In this section, a deployment where there are three entities is considered:</t>
      <ul spacing="normal">
        <li>A client makes requests and receives responses</li>
        <li>A relay operates the Oblivious Relay Resource</li>
        <li>A server operates both the Oblivious Gateway Resource and the Target Resource</li>
      </ul>
      <t>To achieve the stated privacy goals, the Oblivious Relay Resource cannot be
operated by the same entity as the Oblivious Gateway Resource. However,
colocation of the Oblivious Gateway Resource and Target Resource simplifies the
interactions between those resources without affecting client privacy.</t>
      <t>As a consequence of this configuration, Oblivious HTTP prevents linkability
described above. Informally, this means:</t>
      <ol spacing="normal" type="1"><li>Requests and responses are known only to clients and targets in possession
of the corresponding response encapsulation key and HPKE keying material.
In particular, the Oblivious Relay knows the origin and destination of an
Encapsulated Request and Response, yet does not know the decrypted
contents. Likewise, targets know only the Oblivious Gateway origin, i.e.,
the relay, and the decrypted request. Only the client knows both the
plaintext request and response.</li>
        <li>Targets cannot link requests from the same client in the absence of unique
per-client keys.</li>
      </ol>
      <t>Traffic analysis that might affect these properties are outside the scope of
this document; see <xref target="ta"/>.</t>
      <t>A formal analysis of Oblivious HTTP is in <xref target="OHTTP-ANALYSIS"/>.</t>
      <section anchor="client-responsibilities">
        <name>Client Responsibilities</name>
        <t>Clients <bcp14>MUST</bcp14> ensure that the key configuration they select for generating
Encapsulated Requests is integrity protected and authenticated so that it can
be attributed to the Oblivious Gateway Resource; see <xref target="key-configuration"/>.</t>
        <t>Since clients connect directly to the relay instead of the target, application
configurations wherein clients make policy decisions about target connections,
e.g., to apply certificate pinning, are incompatible with Oblivious HTTP.  In
such cases, alternative technologies such as HTTP CONNECT
(<xref section="9.3.6" sectionFormat="of" target="HTTP"/>) can be used. Applications could implement related
policies on key configurations and relay connections, though these might not
provide the same properties as policies enforced directly on target
connections. When this difference is relevant, applications can instead connect
directly to the target at the cost of either privacy or performance.</t>
        <t>Clients <bcp14>MUST NOT</bcp14> include identifying information in the request that is
encrypted. Identifying information includes cookies <xref target="COOKIES"/>,
authentication credentials or tokens, and any information that might reveal
client-specific information such as account credentials.</t>
        <t>Clients cannot carry connection-level state between requests as they only
establish direct connections to the relay responsible for the Oblivious Relay
resource. However, clients need to ensure that they construct requests without
any information gained from previous requests. Otherwise, the server might be
able to use that information to link requests. Cookies <xref target="COOKIES"/> are
the most obvious feature that <bcp14>MUST NOT</bcp14> be used by clients. However, clients
need to include all information learned from requests, which could include the
identity of resources.</t>
        <t>Clients <bcp14>MUST</bcp14> generate a new HPKE context for every request, using a good source
of entropy (<xref target="RANDOM"/>) for generating keys. Key reuse not only risks
requests being linked, reuse could expose request and response contents to the
relay.</t>
        <t>The request the client sends to the Oblivious Relay Resource only requires
minimal information; see <xref target="http-usage"/>. The request that carries the
Encapsulated Request and is sent to the Oblivious Relay Resource <bcp14>MUST NOT</bcp14>
include identifying information unless the client ensures that this information
is removed by the relay. A client <bcp14>MAY</bcp14> include information only for the
Oblivious Relay Resource in header fields identified by the Connection header
field if it trusts the relay to remove these as required by Section 7.6.1 of
<xref target="HTTP"/>. The client needs to trust that the relay does not replicate the
source addressing information in the request it forwards.</t>
        <t>Clients rely on the Oblivious Relay Resource to forward Encapsulated Requests
and responses. However, the relay can only refuse to forward messages, it
cannot inspect or modify the contents of Encapsulated Requests or responses.</t>
      </section>
      <section anchor="relay-responsibilities">
        <name>Relay Responsibilities</name>
        <t>The relay that serves the Oblivious Relay Resource has a very simple function
to perform. For each request it receives, it makes a request of the Oblivious
Gateway Resource that includes the same content. When it receives a response,
it sends a response to the client that includes the content of the response
from the Oblivious Gateway Resource.</t>
        <t>When forwarding a request, the relay <bcp14>MUST</bcp14> follow the forwarding rules in
<xref section="7.6" sectionFormat="of" target="HTTP"/>.  A generic HTTP intermediary implementation is suitable
for the purposes of serving an Oblivious Relay Resource, but additional care is
needed to ensure that client privacy is maintained.</t>
        <t>Firstly, a generic implementation will forward unknown fields.  For Oblivious
HTTP, a Oblivious Relay Resource <bcp14>SHOULD NOT</bcp14> forward unknown fields.  Though
clients are not expected to include fields that might contain identifying
information, removing unknown fields removes this privacy risk.</t>
        <t>Secondly, generic implementations are often configured to augment requests with
information about the client, such as the Via field or the Forwarded field
<xref target="FORWARDED"/>.  A relay <bcp14>MUST NOT</bcp14> add information when forwarding
requests that might be used to identify clients, with the exception of
information that a client is aware of.</t>
        <t>Finally, a relay can also generate responses, though it assumed to not be able
to examine the content of a request (other than to observe the choice of key
identifier, KDF, and AEAD), so it is also assumed that it cannot generate an
Encapsulated Response.</t>
        <section anchor="differential-treatment">
          <name>Differential Treatment</name>
          <t>A relay <bcp14>MAY</bcp14> add information to requests if the client is aware of the nature of
the information that could be added.  The client does not need to be aware of
the exact value added for each request, but needs to know the range of possible
values the relay might use.  Importantly, information added by the relay - beyond
what is already revealed through encapsulated requests from clients - can reduce
the size of the anonymity set of clients at a gateway.</t>
          <t>Moreover, relays <bcp14>MAY</bcp14> apply differential treatment to clients that engage in abusive
behavior, e.g., by sending too many requests in comparison to other clients,
or as a response to rate limits signalled from the gateway. Any such
differential treatment can reveal information to the gateway that would not
be revealed otherwise and therefore reduce the size of the anonymity set of
clients using a gateway. For example, if a relay chooses to rate limit or
block an abusive client, this means that any client requests which are not
treated this way are known to be non-abusive by the gateway. Clients should
consider the likelihood of such differential treatment and the privacy
risks when using a relay.</t>
          <t>Some patterns of abuse cannot be detected without access to the request that
is made to the target. This means that only the gateway or target are in a
position to identify abuse. A gateway <bcp14>MAY</bcp14> send signals toward the relay to
provide feedback about specific requests. For example, a gateway could respond
differently to requests it cannot decapsulate, as mentioned in <xref target="errors"/>. A
relay that acts on this feedback could - either inadvertently or by
design - lead to client deanonymization.</t>
        </section>
        <section anchor="dos">
          <name>Denial of Service</name>
          <t>As there are privacy benefits from having a large rate of requests forwarded by
the same relay (see <xref target="ta"/>), servers that operate the Oblivious Gateway Resource
might need an arrangement with Oblivious Relay Resources. This arrangement might
be necessary to prevent having the large volume of requests being classified as
an attack by the server.</t>
          <t>If a server accepts a larger volume of requests from a relay, it needs to
trust that the relay does not allow abusive levels of request volumes from
clients. That is, if a server allows requests from the relay to be exempt from
rate limits, the server might want to ensure that the relay applies a rate
limiting policy that is acceptable to the server.</t>
          <t>Servers that enter into an agreement with a relay that enables a higher request
rate might choose to authenticate the relay to enable the higher rate.</t>
        </section>
        <section anchor="ta">
          <name>Traffic Analysis</name>
          <t>This document assumes that all communication between different Oblivious Client,
Oblivious Relay Resource, and Oblivious Gateway Resource is protected by HTTPS.  This protects information about which
resources are the subject of request and prevents a network observer from being
able to trivially correlate messages on either side of a relay.  However, it does
not mitigate traffic analysis by such network observers.</t>
          <t>The time at which Encapsulated Request or response messages are sent can
reveal information to a network observer. Though messages exchanged between the
Oblivious Relay Resource and the Oblivious Gateway Resource might be sent in a
single connection, traffic analysis could be used to match messages that are
forwarded by the relay.</t>
          <t>A relay could, as part of its function, add delays in order to increase the
anonymity set into which each message is attributed. This could latency to the
overall time clients take to receive a response, which might not be what some
clients want.</t>
          <t>A relay that forwards large volumes of exchanges can provide better privacy by
providing larger sets of messages that need to be matched.</t>
          <t>Traffic analysis is not restricted to network observers. A malicious Oblivious Relay Resource could
use traffic analysis to learn information about otherwise encrypted requests
and responses relayed between clients and gateways. An Oblivious Relay Resource terminates
TLS connections from clients, so they see message boundaries. This privileged
position allows for richer feature extraction from encrypted data, which might
improve traffic analysis.</t>
          <t>Clients can use padding to reduce the effectiveness of traffic analysis.
Padding is a capability provided by binary HTTP messages; see <xref section="3.8" sectionFormat="of" target="BINARY"/>.</t>
        </section>
      </section>
      <section anchor="server-responsibilities">
        <name>Server Responsibilities</name>
        <t>The Oblivious Gateway Resource can be operated by a different entity than the
Target Resource.  However, this means that the client needs to trust the
Oblivious Gateway Resource not to modify requests or responses.  This analysis
concerns itself with a deployment scenario where a single server provides both
the Oblivious Gateway Resource and Target Resource.</t>
        <t>A server that operates both Oblivious Gateway and Target Resources is
responsible for removing request encryption, generating a response to the
Encapsulated Request, and encrypting the response.</t>
        <t>Servers should account for traffic analysis based on response size or generation
time.  Techniques such as padding or timing delays can help protect against such
attacks; see <xref target="ta"/>.</t>
        <t>If separate entities provide the Oblivious Gateway Resource and Target Resource,
these entities might need an arrangement similar to that between server and
relay for managing denial of service; see <xref target="dos"/>. It is also necessary to
provide confidentiality protection for the unprotected requests and responses,
plus protections for traffic analysis; see <xref target="ta"/>.</t>
        <t>Nonsecure requests - such those with the "http" scheme as opposed to the "https"
scheme - <bcp14>SHOULD NOT</bcp14> be used if the Oblivious Gateway and Target Resources are
operated by different entities as that would expose both requests and response
to modification or inspection by a network attacker.</t>
      </section>
      <section anchor="key-management">
        <name>Key Management</name>
        <t>An Oblivious Gateway Resource needs to have a plan for replacing keys. This
might include regular replacement of keys, which can be assigned new key
identifiers. If an Oblivious Gateway Resource receives a request that contains a
key identifier that it does not understand or that corresponds to a key that has
been replaced, the server can respond with an HTTP 422 (Unprocessable Content)
status code.</t>
        <t>A server can also use a 422 status code if the server has a key that corresponds
to the key identifier, but the Encapsulated Request cannot be successfully
decrypted using the key.</t>
        <t>A server <bcp14>MUST</bcp14> ensure that the HPKE keys it uses are not valid for any other
protocol that uses HPKE with the "message/bhttp request" label.  Designers of
protocols that reuse this encryption format, especially new versions of this
protocol, can ensure key diversity by choosing a different label in their use of
HPKE.  The "message/bhttp response" label was chosen for symmetry only as it
provides key diversity only within the HPKE context created using the
"message/bhttp request" label; see <xref target="repurposing-the-encapsulation-format"/>.</t>
      </section>
      <section anchor="replay">
        <name>Replay Attacks</name>
        <t>A server is responsible for either rejecting replayed requests or ensuring that
the effect of replays does not adversely affect clients or resources.</t>
        <t>Encrypted requests can be copied and replayed by the Oblivious Relay
resource. The threat model for Oblivious HTTP allows the possibility that an
Oblivious Relay Resource might replay requests. Furthermore, if a client sends
an Encapsulated Request in TLS early data (see <xref section="8" sectionFormat="of" target="TLS"/> and
<xref target="RFC8470"/>), a network-based adversary might be able to cause the request to
be replayed. In both cases, the effect of a replay attack and the mitigations
that might be employed are similar to TLS early data.</t>
        <t>It is the responsibility of the application that uses Oblivious HTTP to either
reject replayed requests or to ensure that replayed requests have no adverse
affects on their operation.  This section describes some approaches that are
universally applicable and suggestions for more targeted techniques.</t>
        <t>A client or Oblivious Relay Resource <bcp14>MUST NOT</bcp14> automatically attempt to retry a
failed request unless it receives a positive signal indicating that the request
was not processed or forwarded. The HTTP/2 REFUSED_STREAM error code (Section
8.1.4 of <xref target="RFC7540"/>), the HTTP/3 H3_REQUEST_REJECTED error code (Section 8.1
of <xref target="QUIC-HTTP"/>), or a GOAWAY frame with a low enough
identifier (in either protocol version) are all sufficient signals that no
processing occurred. Connection failures or interruptions are not sufficient
signals that no processing occurred.</t>
        <t>The anti-replay mechanisms described in <xref section="8" sectionFormat="of" target="TLS"/> are generally
applicable to Oblivious HTTP requests. The encapsulated keying material (or
<tt>enc</tt>) can be used in place of a nonce to uniquely identify a request.  This
value is a high-entropy value that is freshly generated for every request, so
two valid requests will have different values with overwhelming probability.</t>
        <t>The mechanism used in TLS for managing differences in client and server clocks
cannot be used as it depends on being able to observe previous interactions.
Oblivious HTTP explicitly prevents such linkability.</t>
        <t>The considerations in <xref target="RFC8470"/> as they relate to managing the risk of
replay also apply, though there is no option to delay the processing of a
request.</t>
        <t>Limiting requests to those with safe methods might not be satisfactory for some
applications, particularly those that involve the submission of data to a
server. The use of idempotent methods might be of some use in managing replay
risk, though it is important to recognize that different idempotent requests
can be combined to be not idempotent.</t>
        <t>Even without replay prevention, the server-chosen <tt>response_nonce</tt> field
ensures that responses have unique AEAD keys and nonces even when requests are
replayed.</t>
        <section anchor="use-of-date-for-anti-replay">
          <name>Use of Date for Anti-Replay</name>
          <t>Clients <bcp14>SHOULD</bcp14> include a <tt>Date</tt> header field in Encapsulated Requests, unless
the Oblivious Gateway Resource does not use <tt>Date</tt> for anti-replay purposes.</t>
          <t>Though HTTP requests often do not include a <tt>Date</tt> header field, the value of
this field might be used by a server to limit the amount of requests it needs to
track if it needs to prevent replay attacks.</t>
          <t>An Oblivious Gateway Resource can maintain state for requests for a small window
of time over which it wishes to accept requests.  The Oblivious Gateway Resource
can store all requests it processes within this window.  Storing just the <tt>enc</tt>
field of a request, which should be unique to each request, is sufficient.  The
Oblivious Gateway Resource then rejects requests if the request is the same as
one that was previously answered within that time window, or if the <tt>Date</tt>
header field from the decrypted request is outside of the current time window.</t>
          <t>Oblivious Gateway Resources <bcp14>SHOULD</bcp14> allow for the time it takes requests to
arrive from the client, with a time window that is large enough to allow for
differences in clocks.</t>
          <t>Oblivious Gateway Resources <bcp14>MUST NOT</bcp14> treat the time window as secret
information. An attacker can actively probe with different values for the <tt>Date</tt>
field to determine the time window over which the server will accept responses.</t>
        </section>
        <section anchor="date-fix">
          <name>Correcting Clock Differences</name>
          <t>An Oblivious Gateway Resource can reject requests that contain a <tt>Date</tt> value
that is outside of its active window with a 400 series status code.  The problem
type <xref target="PROBLEM"/> of
"https://iana.org/assignments/http-problem-types#date" is defined to allow the
server to signal that the <tt>Date</tt> value in the request was unacceptable.</t>
          <t><xref target="fig-date-reject"/> shows an example response in HTTP/1.1 format.</t>
          <figure anchor="fig-date-reject">
            <name>Example Rejection of Request Date Field</name>
            <sourcecode type="http-message"><![CDATA[
HTTP/1.1 400 Bad Request
Date: Mon, 07 Feb 2022 00:28:05 GMT
Content-Type: application/problem+json
Content-Length: 128

{"type":"https://iana.org/assignments/http-problem-types#date",
"title": "date field in request outside of acceptable range"}
]]></sourcecode>
          </figure>
          <t>Disagreements about time are unlikely if both client and Oblivious Gateway
Resource have a good source of time; see <xref target="NTP"/>. However, clock
differences are known to be commonplace; see Section 7.1 of
<xref target="CLOCKSKEW"/>.</t>
          <t>Including a <tt>Date</tt> header field in the response allows the client to correct
clock errors by retrying the same request using the value of the <tt>Date</tt> field
provided by the Oblivious Gateway Resource.  The value of the <tt>Date</tt> field can
be copied if the request is fresh, with an adjustment based on the <tt>Age</tt> field
otherwise.  When retrying a request, the client <bcp14>MUST</bcp14> create a fresh encryption
of the modified request, using a new HPKE context.</t>
          <figure anchor="fig-retry-date">
            <name>Retrying with an Update Date Field</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="304" width="464" viewBox="0 0 464 304" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                  <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
                  <path d="M 48,80 L 48,288" fill="none" stroke="black"/>
                  <path d="M 88,32 L 88,80" fill="none" stroke="black"/>
                  <path d="M 152,32 L 152,80" fill="none" stroke="black"/>
                  <path d="M 192,80 L 192,128" fill="none" stroke="black"/>
                  <path d="M 192,160 L 192,192" fill="none" stroke="black"/>
                  <path d="M 192,224 L 192,256" fill="none" stroke="black"/>
                  <path d="M 288,80 L 288,288" fill="none" stroke="black"/>
                  <path d="M 312,32 L 312,80" fill="none" stroke="black"/>
                  <path d="M 368,32 L 368,80" fill="none" stroke="black"/>
                  <path d="M 408,80 L 408,288" fill="none" stroke="black"/>
                  <path d="M 456,32 L 456,80" fill="none" stroke="black"/>
                  <path d="M 8,32 L 88,32" fill="none" stroke="black"/>
                  <path d="M 152,32 L 312,32" fill="none" stroke="black"/>
                  <path d="M 368,32 L 456,32" fill="none" stroke="black"/>
                  <path d="M 8,80 L 88,80" fill="none" stroke="black"/>
                  <path d="M 152,80 L 312,80" fill="none" stroke="black"/>
                  <path d="M 368,80 L 456,80" fill="none" stroke="black"/>
                  <path d="M 48,142 L 280,142" fill="none" stroke="black"/>
                  <path d="M 48,146 L 280,146" fill="none" stroke="black"/>
                  <path d="M 288,144 L 400,144" fill="none" stroke="black"/>
                  <path d="M 56,206 L 288,206" fill="none" stroke="black"/>
                  <path d="M 56,210 L 288,210" fill="none" stroke="black"/>
                  <path d="M 296,208 L 408,208" fill="none" stroke="black"/>
                  <path d="M 48,270 L 280,270" fill="none" stroke="black"/>
                  <path d="M 48,274 L 280,274" fill="none" stroke="black"/>
                  <path d="M 288,272 L 400,272" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="408,272 396,266.4 396,277.6" fill="black" transform="rotate(0,400,272)"/>
                  <polygon class="arrowhead" points="408,144 396,138.4 396,149.6" fill="black" transform="rotate(0,400,144)"/>
                  <polygon class="arrowhead" points="304,208 292,202.4 292,213.6" fill="black" transform="rotate(180,296,208)"/>
                  <polygon class="arrowhead" points="288,272 276,266.4 276,277.6" fill="black" transform="rotate(0,280,272)"/>
                  <polygon class="arrowhead" points="288,144 276,138.4 276,149.6" fill="black" transform="rotate(0,280,144)"/>
                  <polygon class="arrowhead" points="64,208 52,202.4 52,213.6" fill="black" transform="rotate(180,56,208)"/>
                  <g class="text">
                    <text x="44" y="52">Client</text>
                    <text x="184" y="52">Relay</text>
                    <text x="224" y="52">and</text>
                    <text x="272" y="52">Gateway</text>
                    <text x="404" y="52">Target</text>
                    <text x="232" y="68">Resources</text>
                    <text x="412" y="68">Resource</text>
                    <text x="96" y="132">Request</text>
                    <text x="312" y="180">400</text>
                    <text x="364" y="180">Response</text>
                    <text x="352" y="196">+</text>
                    <text x="380" y="196">Date</text>
                    <text x="96" y="244">Request</text>
                    <text x="72" y="260">+</text>
                    <text x="112" y="260">Updated</text>
                    <text x="164" y="260">Date</text>
                    <text x="192" y="292">|</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
+---------+       +-------------------+      +----------+
| Client  |       | Relay and Gateway |      | Target   |
|         |       |     Resources     |      | Resource |
+----+----+       +----+-----------+--+      +----+-----+
     |                 |           |              |
     |                 |           |              |
     |  Request        |           |              |
     +============================>+------------->|
     |                 |           |              |
     |                 |           | 400 Response |
     |                 |           |       + Date |
     |<============================+<-------------+
     |                 |           |              |
     |  Request        |           |              |
     |  + Updated Date |           |              |
     +============================>+------------->|
     |                 |           |              |
]]></artwork>
            </artset>
          </figure>
          <t>Intermediaries can sometimes rewrite the <tt>Date</tt> field when forwarding responses.
This might cause problems if the Oblivious Gateway Resource and intermediary
clocks differ by enough to cause the retry to be rejected.  Therefore, clients
<bcp14>MUST NOT</bcp14> retry a request with an adjusted date more than once.</t>
          <t>Oblivious Gateway Resources that condition their responses on the <tt>Date</tt> header
field <bcp14>SHOULD</bcp14> either ensure that intermediaries do not cache responses (by
including a <tt>Cache-Control</tt> directive of <tt>no-store</tt>) or designate the response
as conditional on the value of the <tt>Date</tt> request header field (by including the
token "date" in a <tt>Vary</tt> header field).</t>
          <t>Clients <bcp14>MUST NOT</bcp14> use the date provided by the Oblivious Gateway Resource for any
other purpose, including future requests to any resource.  Any request that uses
information provided by the Oblivious Gateway Resource might be correlated using
that information.</t>
        </section>
      </section>
      <section anchor="forward-secrecy">
        <name>Forward Secrecy</name>
        <t>This document does not provide forward secrecy for either requests or
responses during the lifetime of the key configuration. A measure of
forward secrecy can be provided by generating a new key configuration
then deleting the old keys after a suitable period.</t>
      </section>
      <section anchor="post-compromise-security">
        <name>Post-Compromise Security</name>
        <t>This design does not provide post-compromise security for responses.</t>
        <t>A client only needs to retain keying material that might be used compromise the
confidentiality and integrity of a response until that response is consumed, so
there is negligible risk associated with a client compromise.</t>
        <t>A server retains a secret key that might be used to remove protection from
messages over much longer periods. A server compromise that provided access to
the Oblivious Gateway Resource secret key could allow an attacker to recover the
plaintext of all requests sent toward affected keys and all of the responses
that were generated.</t>
        <t>Even if server keys are compromised, an adversary cannot access messages
exchanged by the client with the Oblivious Relay Resource as messages are
protected by TLS.  Use of a compromised key also requires that the Oblivious
Relay Resource cooperate with the attacker or that the attacker is able to
compromise these TLS connections.</t>
        <t>The total number of affected messages affected by server key compromise can be
limited by regular rotation of server keys.</t>
      </section>
      <section anchor="client-clock-exposure">
        <name>Client Clock Exposure</name>
        <t>Including a <tt>Date</tt> field in requests reveals some information about the client
clock.  This might be used to fingerprint clients <xref target="UWT"/> or to identify clients
that are vulnerable to attacks that depend on incorrect clocks.</t>
        <t>Clients can randomize the value that they provide for <tt>Date</tt> to obscure the true
value of their clock and reduce the chance of linking of requests over time.
However, this increases the risk that their request is rejected as outside the
acceptable window.</t>
      </section>
    </section>
    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>One goal of this design is that independent client requests are only linkable by
their content.  However, the choice of client configuration might be used to
correlate requests.  A client configuration includes the Oblivious Relay
Resource URI, the Oblivious Gateway key configuration (KeyConfig), and Oblivious Gateway
Resource URI. A configuration is active if clients can successfully use it for interacting with with a target.</t>
      <t>Oblivious Relay and Gateway Resources can identify when requests use the same
configuration by matching <tt>KeyConfig.key\_id</tt> or the Oblivious Gateway
Resource URI.  The Oblivious Gateway Resource might use the source address of
requests to correlate requests that use an Oblivious Relay Resource run by the
same operator.  If the Oblivious Gateway Resource is willing to use trial
decryption, requests can be further separated into smaller groupings based on
the keys that are used.</t>
      <t>Each active client configuration partitions the client anonymity set. In practice,
it is infeasible to reduce the number of active configurations to one. Enabling diversity in choice of
Oblivious Relay Resource naturally increases the number of active
configurations.  A small number of configurations might need to be active to
allow for key rotation and server maintenance.</t>
      <t>Client privacy depends on having each configuration used by many other clients.
It is critical prevent the use of unique client configurations, which might be
used to track of individual clients, but it is also important to avoid creating
small groupings of clients that might weaken privacy protections.</t>
      <t>A specific method for a client to acquire configurations is not included in this
specification.  Applications using this design <bcp14>MUST</bcp14> provide accommodations to
mitigate tracking using client configurations.  <xref target="CONSISTENCY"/> provides options
for ensuring that client configurations are consistent between clients.</t>
      <t>The content of requests or responses, if used in forming new requests, can be
used to correlate requests.  This includes obvious methods of linking requests,
like cookies <xref target="COOKIES"/>, but it also includes any information in either
message that might affect how subsequent requests are formulated. For example,
<xref target="FIELDING"/> describes how interactions that are individually stateless can be
used to build a stateful system when a client acts on the content of a response.</t>
    </section>
    <section anchor="deployment">
      <name>Operational and Deployment Considerations</name>
      <t>This section discusses various operational and deployment considerations.</t>
      <section anchor="performance-overhead">
        <name>Performance Overhead</name>
        <t>Using Oblivious HTTP adds both cryptographic and latency to requests relative to
a simple HTTP request-response exchange.  Deploying relay services that are on
path between clients and servers avoids adding significant additional delay due
to network topology.  A study of a similar system <xref target="ODoH"/> found that deploying
proxies close to servers was most effective in minimizing additional latency.</t>
      </section>
      <section anchor="proxy-state">
        <name>Resource Mappings</name>
        <t>This protocol assumes a fixed, one-to-one mapping between the Oblivious Relay
Resource and the Oblivious Gateway Resource. This means that any encrypted
request sent to the Oblivious Relay Resource will always be forwarded to the
Oblivious Gateway Resource. This constraint was imposed to simplify relay
configuration and mitigate against the Oblivious Relay Resource being used as
a generic relay for unknown Oblivious Gateway Resources. The relay will only
forward for Oblivious Gateway Resources that it has explicitly configured and
allowed.</t>
        <t>It is possible for a server to be configured with multiple Oblivious Relay
Resources, each for a different Oblivious Gateway Resource as needed.  If the
goal is to support a large number of Oblivious Gateway Resources, clients might
be provided with a URI template <xref target="TEMPLATE"/>, from which multiple
Oblivious Relay Resources could be constructed.</t>
      </section>
      <section anchor="network-management">
        <name>Network Management</name>
        <t>Oblivious HTTP might be incompatible with network interception regimes, such as
those that rely on configuring clients with trust anchors and intercepting TLS
connections.  While TLS might be intercepted successfully, interception
middleboxes devices might not receive updates that would allow Oblivious HTTP to
be correctly identified using the media types defined in <xref target="iana-req"/> and
<xref target="iana-res"/>.</t>
        <t>Oblivious HTTP has a simple key management design that is not trivially altered
to enable interception by intermediaries.  Clients that are configured to enable
interception might choose to disable Oblivious HTTP in order to ensure that
content is accessible to middleboxes.</t>
      </section>
    </section>
    <section anchor="repurposing-the-encapsulation-format">
      <name>Repurposing the Encapsulation Format</name>
      <t>The encrypted payload of an OHTTP request and response is a binary HTTP
message <xref target="BINARY"/>. Client and target agree on this encrypted payload type by
specifying the media type "message/bhttp" in the HPKE info string and HPKE
export context string for request and response encryption, respectively.</t>
      <t>Future specifications may repurpose the encapsulation mechanism described in
<xref target="hpke-encapsulation"/>, provided that the content type of the encrypted
payload is appropriately reflected in the HPKE info and context strings. For
example, if a future specification were to use the encryption mechanism in
this specification for DNS messages, identified by the "application/dns-message"
media type, then the HPKE info string <bcp14>SHOULD</bcp14> be "application/dns-message
request" for request encryption, and the HPKE export context string should be
"application/dns-message response" for response encryption.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>Please update the "Media Types" registry at
<eref target="https://www.iana.org/assignments/media-types">https://www.iana.org/assignments/media-types</eref> for the media types
"application/ohttp-keys" (<xref target="iana-keys"/>), "message/ohttp-req" (<xref target="iana-req"/>),
and "message/ohttp-res" (<xref target="iana-res"/>).</t>
      <section anchor="iana-keys">
        <name>message/ohttp-keys Media Type</name>
        <t>The "application/ohttp-keys" media type identifies a key configuration used by
Oblivious HTTP.</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>ohttp-keys</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>only "8bit" or "binary" is permitted</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</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl>
              <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>IESG</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-req">
        <name>message/ohttp-req Media Type</name>
        <t>The "message/ohttp-req" identifies an encrypted binary HTTP request.  This
is a binary format that is defined in <xref target="request"/>.</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>message</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>ohttp-req</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>only "8bit" or "binary" is permitted</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</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl>
              <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>IESG</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-res">
        <name>message/ohttp-res Media Type</name>
        <t>The "message/ohttp-res" identifies an encrypted binary HTTP response. This
is a binary format that is defined in <xref target="response"/>.</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>message</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>ohttp-res</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>only "8bit" or "binary" is permitted</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</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl>
              <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>IESG</t>
          </dd>
        </dl>
        <t>IANA are requested to create a new entry in the "HTTP Problem Type" registry
established by <xref target="PROBLEM"/>.</t>
        <dl>
          <dt>Type URI:</dt>
          <dd>
            <t>https://iana.org/assignments/http-problem-types#date</t>
          </dd>
          <dt>Title:</dt>
          <dd>
            <t>Date Not Acceptable</t>
          </dd>
          <dt>Recommended HTTP Status Code:</dt>
          <dd>
            <t>400</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="date-fix"/> of this document</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="BINARY">
          <front>
            <title>Binary Representation of HTTP Messages</title>
            <author fullname="Martin Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="6" month="July" year="2022"/>
            <abstract>
              <t>   This document defines a binary format for representing HTTP messages.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-binary-message-06"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes. </t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar">
              <organization/>
            </author>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <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="TLS">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes">
              <organization/>
            </author>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan">
              <organization/>
            </author>
            <author fullname="B. Lipp" initials="B." surname="Lipp">
              <organization/>
            </author>
            <author fullname="C. Wood" initials="C." surname="Wood">
              <organization/>
            </author>
            <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="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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="ASCII">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf">
              <organization/>
            </author>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="RFC8470">
          <front>
            <title>Using Early Data in HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="W. Tarreau" initials="W." surname="Tarreau">
              <organization/>
            </author>
            <date month="September" year="2018"/>
            <abstract>
              <t>Using TLS early data creates an exposure to the possibility of a replay attack.  This document defines mechanisms that allow clients to communicate with servers about HTTP requests that are sent in early data.  Techniques are described that use these mechanisms to mitigate the risk of replay.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8470"/>
          <seriesInfo name="DOI" value="10.17487/RFC8470"/>
        </reference>
        <reference anchor="RFC7540">
          <front>
            <title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
            <author fullname="M. Belshe" initials="M." surname="Belshe">
              <organization/>
            </author>
            <author fullname="R. Peon" initials="R." surname="Peon">
              <organization/>
            </author>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2).  HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection.  It also introduces unsolicited push of representations from servers to clients.</t>
              <t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax.  HTTP's existing semantics remain unchanged.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7540"/>
          <seriesInfo name="DOI" value="10.17487/RFC7540"/>
        </reference>
        <reference anchor="QUIC-HTTP">
          <front>
            <title>HTTP/3</title>
            <author fullname="Mike Bishop">
              <organization>Akamai</organization>
            </author>
            <date day="2" month="February" year="2021"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment.  This document describes a mapping of HTTP semantics over QUIC.  This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.
              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-http-34"/>
        </reference>
        <reference anchor="PROBLEM">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="Mark Nottingham">
	 </author>
            <author fullname="Erik Wilde">
	 </author>
            <author fullname="Sanjay Dalal">
	 </author>
            <date day="25" month="May" year="2022"/>
            <abstract>
              <t>   This document defines a "problem detail" to carry machine-readable
   details of errors in HTTP response content and/or fields to avoid the
   need to define new error response formats for HTTP APIs.

Discussion Venues

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

   Source for this draft and an issue tracker can be found at
   https://github.com/ietf-wg-httpapi/rfc7807bis.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpapi-rfc7807bis-03"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="CONSISTENCY">
          <front>
            <title>Key Consistency and Discovery</title>
            <author fullname="Alex Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Matthew Finkel">
              <organization>The Tor Project</organization>
            </author>
            <author fullname="Martin Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="4" month="March" year="2022"/>
            <abstract>
              <t>   This document describes the key consistency and correctness
   requirements of protocols such as Privacy Pass, Oblivious DoH, and
   Oblivious HTTP for user privacy.  It discusses several mechanisms and
   proposals for enabling user privacy in varying threat models.  In
   concludes with discussion of open problems in this area.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-wood-key-consistency-02"/>
        </reference>
        <reference anchor="Dingledine2004" target="https://svn.torproject.org/svn/projects/design-paper/tor-design.html">
          <front>
            <title>Tor: The Second-Generation Onion Router</title>
            <author initials="R." surname="Dingledine">
              <organization/>
            </author>
            <author initials="N." surname="Mathewson">
              <organization/>
            </author>
            <author initials="P." surname="Syverson">
              <organization/>
            </author>
            <date year="2004" month="August"/>
          </front>
        </reference>
        <reference anchor="PRIO" target="https://crypto.stanford.edu/prio/paper.pdf">
          <front>
            <title>Prio: Private, Robust, and Scalable Computation of Aggregate Statistics</title>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <date year="2017" month="March" day="14"/>
          </front>
        </reference>
        <reference anchor="ODoH" target="https://www.petsymposium.org/2021/files/papers/issue4/popets-2021-0085.pdf">
          <front>
            <title>Oblivious DNS over HTTPS (ODoH): A Practical Privacy Enhancement to DNS</title>
            <author fullname="Sudheesh Singanamalla">
              <organization/>
            </author>
            <author fullname="Suphanat Chunhapanya">
              <organization/>
            </author>
            <author fullname="Marek Vavrusa">
              <organization/>
            </author>
            <author fullname="Tanya Verma">
              <organization/>
            </author>
            <author fullname="Peter Wu">
              <organization/>
            </author>
            <author fullname="Marwan Fayed">
              <organization/>
            </author>
            <author fullname="Kurtis Heimerl">
              <organization/>
            </author>
            <author fullname="Nick Sullivan">
              <organization/>
            </author>
            <author fullname="Christopher A. Wood">
              <organization/>
            </author>
            <date year="2021" month="January" day="07"/>
          </front>
        </reference>
        <reference anchor="OHTTP-ANALYSIS" target="https://github.com/cloudflare/ohttp-analysis">
          <front>
            <title>Tamarin Model of Oblivious HTTP</title>
            <author fullname="Jonathan Hoyland">
              <organization/>
            </author>
            <date year="2021" month="August" day="23"/>
          </front>
        </reference>
        <reference anchor="UWT" target="https://www.w3.org/2001/tag/doc/unsanctioned-tracking/">
          <front>
            <title>Unsanctioned Web Tracking</title>
            <author fullname="Mark Nottingham">
              <organization/>
            </author>
            <date year="2015" month="July" day="17"/>
          </front>
        </reference>
        <reference anchor="FIELDING" target="https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf">
          <front>
            <title>Architectural Styles and the Design of Network-based Software Architectures</title>
            <author fullname="Roy Thomas Fielding">
              <organization/>
            </author>
            <date year="2000"/>
          </front>
        </reference>
        <reference anchor="RFC6265">
          <front>
            <title>HTTP State Management Mechanism</title>
            <author fullname="A. Barth" initials="A." surname="Barth">
              <organization/>
            </author>
            <date month="April" year="2011"/>
            <abstract>
              <t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol.  Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet.  This document obsoletes RFC 2965.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6265"/>
          <seriesInfo name="DOI" value="10.17487/RFC6265"/>
        </reference>
        <reference anchor="RFC7838">
          <front>
            <title>HTTP Alternative Services</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="P. McManus" initials="P." surname="McManus">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." surname="Reschke">
              <organization/>
            </author>
            <date month="April" year="2016"/>
            <abstract>
              <t>This document specifies "Alternative Services" for HTTP, which allow an origin's resources to be authoritatively available at a separate network location, possibly accessed with a different protocol configuration.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7838"/>
          <seriesInfo name="DOI" value="10.17487/RFC7838"/>
        </reference>
        <reference anchor="SEMANTICS">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes. </t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="COOKIES">
          <front>
            <title>HTTP State Management Mechanism</title>
            <author fullname="A. Barth" initials="A." surname="Barth">
              <organization/>
            </author>
            <date month="April" year="2011"/>
            <abstract>
              <t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol.  Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet.  This document obsoletes RFC 2965.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6265"/>
          <seriesInfo name="DOI" value="10.17487/RFC6265"/>
        </reference>
        <reference anchor="RANDOM">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd">
              <organization/>
            </author>
            <author fullname="J. Schiller" initials="J." surname="Schiller">
              <organization/>
            </author>
            <author fullname="S. Crocker" initials="S." surname="Crocker">
              <organization/>
            </author>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts.  However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities.  The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult.  This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities.  It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications.  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="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="FORWARDED">
          <front>
            <title>Forwarded HTTP Extension</title>
            <author fullname="A. Petersson" initials="A." surname="Petersson">
              <organization/>
            </author>
            <author fullname="M. Nilsson" initials="M." surname="Nilsson">
              <organization/>
            </author>
            <date month="June" year="2014"/>
            <abstract>
              <t>This document defines an HTTP extension header field that allows proxy components to disclose information lost in the proxying process, for example, the originating IP address of a request or IP address of the proxy on the user-agent-facing interface.  In a path of proxying components, this makes it possible to arrange it so that each subsequent component will have access to, for example, all IP addresses used in the chain of proxied HTTP requests.</t>
              <t>This document also specifies guidelines for a proxy administrator to anonymize the origin of a request.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7239"/>
          <seriesInfo name="DOI" value="10.17487/RFC7239"/>
        </reference>
        <reference anchor="NTP">
          <front>
            <title>Network Time Protocol Version 4: Protocol and Algorithms Specification</title>
            <author fullname="D. Mills" initials="D." surname="Mills">
              <organization/>
            </author>
            <author fullname="J. Martin" initials="J." role="editor" surname="Martin">
              <organization/>
            </author>
            <author fullname="J. Burbank" initials="J." surname="Burbank">
              <organization/>
            </author>
            <author fullname="W. Kasch" initials="W." surname="Kasch">
              <organization/>
            </author>
            <date month="June" year="2010"/>
            <abstract>
              <t>The Network Time Protocol (NTP) is widely used to synchronize computer clocks in the Internet.  This document describes NTP version 4 (NTPv4), which is backwards compatible with NTP version 3 (NTPv3), described in RFC 1305, as well as previous versions of the protocol. NTPv4 includes a modified protocol header to accommodate the Internet Protocol version 6 address family.  NTPv4 includes fundamental improvements in the mitigation and discipline algorithms that extend the potential accuracy to the tens of microseconds with modern workstations and fast LANs.  It includes a dynamic server discovery scheme, so that in many cases, specific server configuration is not required.  It corrects certain errors in the NTPv3 design and implementation and includes an optional extension mechanism.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5905"/>
          <seriesInfo name="DOI" value="10.17487/RFC5905"/>
        </reference>
        <reference anchor="CLOCKSKEW">
          <front>
            <title>Where the Wild Warnings Are: Root Causes of Chrome HTTPS Certificate Errors</title>
            <author fullname="Mustafa Emre Acer" initials="M." surname="Acer">
              <organization>Google Inc., Mountain View, CA, USA</organization>
            </author>
            <author fullname="Emily Stark" initials="E." surname="Stark">
              <organization>Google Inc., Mountain View, CA, USA</organization>
            </author>
            <author fullname="Adrienne Porter Felt" initials="A." surname="Felt">
              <organization>Google Inc., Mountain View, CA, USA</organization>
            </author>
            <author fullname="Sascha Fahl" initials="S." surname="Fahl">
              <organization>Leibniz University Hannover, Hannover, Germany</organization>
            </author>
            <author fullname="Radhika Bhargava" initials="R." surname="Bhargava">
              <organization>Purdue University, West Lafayette, IN, USA</organization>
            </author>
            <author fullname="Bhanu Dev" initials="B." surname="Dev">
              <organization>International Institute of Information Technology, Hyderabad, Hyderabad, India</organization>
            </author>
            <author fullname="Matt Braithwaite" initials="M." surname="Braithwaite">
              <organization>Google Inc., Mountain View, CA, USA</organization>
            </author>
            <author fullname="Ryan Sleevi" initials="R." surname="Sleevi">
              <organization>Google Inc., Mountain View, CA, USA</organization>
            </author>
            <author fullname="Parisa Tabriz" initials="P." surname="Tabriz">
              <organization>Google Inc., Mountain View, CA, USA</organization>
            </author>
            <date month="October" year="2017"/>
          </front>
          <seriesInfo name="Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications" value="Security"/>
          <seriesInfo name="DOI" value="10.1145/3133956.3134007"/>
        </reference>
        <reference anchor="TEMPLATE">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Hadley" initials="M." surname="Hadley">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="D. Orchard" initials="D." surname="Orchard">
              <organization/>
            </author>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </reference>
        <reference anchor="X25519">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley">
              <organization/>
            </author>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg">
              <organization/>
            </author>
            <author fullname="S. Turner" initials="S." surname="Turner">
              <organization/>
            </author>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS).  These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="ODOH">
          <front>
            <title>Oblivious DNS over HTTPS</title>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear">
              <organization/>
            </author>
            <author fullname="P. McManus" initials="P." surname="McManus">
              <organization/>
            </author>
            <author fullname="T. Pauly" initials="T." surname="Pauly">
              <organization/>
            </author>
            <author fullname="T. Verma" initials="T." surname="Verma">
              <organization/>
            </author>
            <author fullname="C.A. Wood" initials="C.A." surname="Wood">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>This document describes a protocol that allows clients to hide their IP addresses from DNS resolvers via proxying encrypted DNS over HTTPS (DoH) messages. This improves privacy of DNS operations by not allowing any one server entity to be aware of both the client IP address and the content of DNS queries and answers.</t>
              <t>This experimental protocol has been developed outside the IETF and is published here to guide implementation, ensure interoperability among implementations, and enable wide-scale experimentation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9230"/>
          <seriesInfo name="DOI" value="10.17487/RFC9230"/>
        </reference>
      </references>
    </references>
    <section anchor="complete-example-of-a-request-and-response">
      <name>Complete Example of a Request and Response</name>
      <!-- Generated using ohttp (https://github.com/martinthomson/ohttp):
RUST_LOG=ohttp cargo test -\-features nss,client,server -\-no-default-features -p ohttp -\-lib -\- -\-nocapture request_response
Note: "rust-hpke" doesn't log the client/sender keying material.
-->

<t>A single request and response exchange is shown here. Binary values (key
configuration, secret keys, the content of messages, and intermediate values)
are shown in hexadecimal. The request and response here are minimal; the purpose
of this example is to show the cryptographic operations.  In this example, the
client is configured with the Oblivious Relay Resource URI of
<tt>https://proxy.example.org/request.example.net/proxy</tt>, and the proxy is
configured to map requests to this URI to the Oblivious Gateway URI
<tt>https://example.com/oblivious/request</tt>. The Target Resource URI, i.e., the
resource the client ultimately wishes to query, is <tt>https://example.com</tt>.</t>
      <t>To begin the process, the Oblivious Gateway Resource generates a key pair.
In this example the server chooses DHKEM(X25519, HKDF-SHA256) and generates
an X25519 key pair <xref target="X25519"/>. The X25519 secret key is:</t>
      <artwork type="hex-dump"><![CDATA[
3c168975674b2fa8e465970b79c8dcf09f1c741626480bd4c6162fc5b6a98e1a
]]></artwork>
      <t>The Oblivious Gateway Resource constructs a key configuration that includes the
corresponding public key as follows:</t>
      <artwork type="hex-dump"><![CDATA[
01002031e1f05a740102115220e9af918f738674aec95f54db6e04eb705aae8e
79815500080001000100010003
]]></artwork>
      <t>This key configuration is somehow obtained by the client. Then when a client
wishes to send an HTTP request of a GET request to the target <tt>https://example.com</tt>,
it constructs the following binary HTTP message:</t>
      <artwork type="hex-dump"><![CDATA[
00034745540568747470730b6578616d706c652e636f6d012f
]]></artwork>
      <t>The client then reads the Oblivious Gateway Resource key configuration and
selects a mutually supported KDF and AEAD. In this example, the client selects
HKDF-SHA256 and AES-128-GCM. The client then generates an HPKE sending context
that uses the server public key. This context is constructed from the following
ephemeral secret key:</t>
      <artwork type="hex-dump"><![CDATA[
bc51d5e930bda26589890ac7032f70ad12e4ecb37abb1b65b1256c9c48999c73
]]></artwork>
      <t>The corresponding public key is:</t>
      <artwork type="hex-dump"><![CDATA[
4b28f881333e7c164ffc499ad9796f877f4e1051ee6d31bad19dec96c208b472
]]></artwork>
      <t>And an <tt>info</tt> parameter of:</t>
      <artwork type="hex-dump"><![CDATA[
6d6573736167652f626874747020726571756573740001002000010001
]]></artwork>
      <t>Applying the Seal operation from the HPKE context produces an encrypted
message, allowing the client to construct the following Encapsulated Request:</t>
      <artwork type="hex-dump"><![CDATA[
010020000100014b28f881333e7c164ffc499ad9796f877f4e1051ee6d31bad1
9dec96c208b4726374e469135906992e1268c594d2a10c695d858c40a026e796
5e7d86b83dd440b2c0185204b4d63525
]]></artwork>
      <t>The client then sends this to the Oblivious Relay Resource in a POST request,
which might look like the following HTTP/1.1 request:</t>
      <sourcecode type="http-message"><![CDATA[
POST /request.example.net/proxy HTTP/1.1
Host: proxy.example.org
Content-Type: message/ohttp-req
Content-Length: 78

<content is the Encapsulated Request above>
]]></sourcecode>
      <t>The Oblivious Relay Resource receives this request and forwards it to the
Oblivious Gateway Resource, which might look like:</t>
      <sourcecode type="http-message"><![CDATA[
POST /oblivious/request HTTP/1.1
Host: example.com
Content-Type: message/ohttp-req
Content-Length: 78

<content is the Encapsulated Request above>
]]></sourcecode>
      <t>The Oblivous Gateway Resource receives this request, selects the key it
generated previously using the key identifier from the message, and decrypts the
message. As this request is directed to the same server, the Oblivious Gateway
Resource does not need to initiate an HTTP request to the Target Resource. The
request can be served directly by the Target Resource, which generates a minimal
response (consisting of just a 200 status code) as follows:</t>
      <artwork type="hex-dump"><![CDATA[
0140c8
]]></artwork>
      <t>The response is constructed by extracting a secret from the HPKE context:</t>
      <!-- ikm for HKDF extract -->
<artwork type="hex-dump"><![CDATA[
62d87a6ba569ee81014c2641f52bea36
]]></artwork>
      <t>The key derivation for the Encapsulated Response uses both the encapsulated KEM
key from the request and a randomly selected nonce. This produces a salt of:</t>
      <artwork type="hex-dump"><![CDATA[
4b28f881333e7c164ffc499ad9796f877f4e1051ee6d31bad19dec96c208b472
c789e7151fcba46158ca84b04464910d
]]></artwork>
      <t>The salt and secret are both passed to the Extract function of the selected KDF
(HKDF-SHA256) to produce a pseudorandom key of:</t>
      <artwork type="hex-dump"><![CDATA[
979aaeae066cf211ab407b31ae49767f344e1501e475c84e8aff547cc5a683db
]]></artwork>
      <t>The pseudorandom key is used with the Expand function of the KDF and an info
field of "key" to produce a 16-byte key for the selected AEAD (AES-128-GCM):</t>
      <artwork type="hex-dump"><![CDATA[
5d0172a080e428b16d298c4ea0db620d
]]></artwork>
      <t>With the same KDF and pseudorandom key, an info field of "nonce" is used to
generate a 12-byte nonce:</t>
      <artwork type="hex-dump"><![CDATA[
f6bf1aeb88d6df87007fa263
]]></artwork>
      <t>The AEAD <tt>Seal()</tt> function is then used to encrypt the response, which is added
to the randomized nonce value to produce the Encapsulated Response:</t>
      <artwork type="hex-dump"><![CDATA[
c789e7151fcba46158ca84b04464910d86f9013e404feea014e7be4a441f234f
857fbd
]]></artwork>
      <t>The Oblivious Gateway Resource constructs a response with the same content:</t>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 OK
Date: Wed, 27 Jan 2021 04:45:07 GMT
Cache-Control: private, no-store
Content-Type: message/ohttp-res
Content-Length: 38

<content is the Encapsulated Response>
]]></sourcecode>
      <t>The same response might then be generated by the Oblivious Relay Resource which
might change as little as the Date header. The client is then able to use the
HPKE context it created and the nonce from the Encapsulated Response to
construct the AEAD key and nonce and decrypt the response.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This design is based on a design for Oblivious DoH, described in
<xref target="ODOH"/>. David Benjamin, Mark Nottingham, and Eric Rescorla made
technical contributions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
ZAXA6WH/4UVsiZN8S2ildI+tUgG7/M///M8ojquHO/NNX//5hlW1yD3RR88/
Mb9HLGVF0e8yxO8C5sg++t2erHsiAIM/Gv0wHEKg9vuXPOGNfNPayDddy/4m
fCLvmGAB7p/2k/bD3/Vju/E/9jGf9x/6+N+/QXbt7uhXfRxFdvK/fuXMHi7w
P997h/1FMzcmaULhqz5uQuGrPo4aUPiKj1tQYEAEe3l+5udH/P7rPv6qPXc/
vBJh7As/1iP//dtg3V90q9xUX7PsFxD+C5Zt5/3rF3zMN7uxvZB0rvh41faa
ywk//nvv83Pbe/bj1g6/6fj2/weGeR8DQzJPr6NXoKX3CxEm2Tj53ZoKlx0G
4M/GnKMZjSw3LbZMIkaDLfdCITQC7WEOot0YZGZQ9SpT3RePaC4BmcNfy+fP
IK5ukaqj/BWVVJDPx6S7hLYslE5aMwPb3Q4GAImKjGgk6fmfZ6hvd6hsKheS
dd2Tx4T361uizJHsKIKkKoWkJj09yUSfP8OadoI1gXKToHLz/vL6xodjKOA2
BEkrnsCyApS9cmJiQwf0FwyL2OVFrJxBhMqKdbmV63IinZW5YPC95uBNIRNe
HqfZQ9oYnjXSGZqqcEQrkHvGIVSHRqAd5E0UgGn3X5wW0bWNPGLBJOWG4cbG
cFzDh6vzHoANFNukF5GZu2IjVABaT8GEXYxZ44UVHfCKmoJqnFePaGyjzQdL
Ueuh2imImsBAhy9urYGdaTiEd/8EbRRB6eLpa58/s4GNcLJmwdyNIadv75xY
AHC0VXgESz/6SkwLJxNTMJCCYXBtBE3oHbf1EEN4seF47ACI2Z3mUMe8eqXB
G6wbGNMI7UBbsdUf/DdBR34X50vUD52JaZTm6SSr2eTvXAqkcaCKF5FiZbUl
VSl6oAuP7/H2EiKMi+JjBndh/enpz1dvTva39/fIxoCuHtQ4JdIEfr6W67G1
pUugF4EqorXSxNM6LXOKESCVJEO9XEY9ONw5JKNSg9RbEKMhAgMTRNmpS0Bf
suTAMaI99PE+gzWT9WEkajIAH+7Hbwt2iAlWu9gYsdIkBdlBngPIoHUOgCPz
MkMv5ZRgPllMxUQ/F+d0mVVo/m2Y5OdFVWXo1aGJ8Ku6TON6Jnc4sM5UC7F4
om1/ipfX0/XYEmmSdD4tlnyhaE1FXYyLqVrl0PKEdoakDVe0jWVo2i3psk3R
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
YQFTnMewiq5kXC3xQTSsiiSzDokAkYs8KHLHMXPJgpKbNHmpLuZYpnrJTKVe
JGKo0OBtOfOnp8vT4ifqJLfIE6to8NJREf1EVuWpFHHQdaHHmkra2jRZCmDD
oqfZ30jNcssTmNp0Bo1qjudMiFE+x4aXhI6KGK5hpRR2iLkDdg9Zc78u+hjp
MuMh/Mz+v6cHY7vaDt50m2Vs+5t+UeVVjreYYkY1CUw2qb9uNtZcsQwud4wc
m6CNrE3ur/SR4NjLZUOqxW1aRqCJls+uVFoYVVKHxdbxc1mOWg7wGfO5FrLF
T2jrVDRazYxhysYK23tG+WF+iKpXLxDzJUjA4dZcxPK1SJoGktnYi1Hqf0o6
BRDYOsOLuwo/gL2QvMNjddUJ6eqCyXUlrZhtSLfkdH3tZKYFf5xI9wwkXBls
W2XHmtlEN8IumBj4T4wPuNXN2bv3b49vzqjo9B7G5vY4MkrkKdn4SmnVq0xh
K2zbHl8XQk38vMcGObVabLuwvtIiYlZaB7FM79A3ZWs5Gi/GVsvc6uk56UX7
klK+OVD5e4wbsO4mGhvevXl7HRaoj365z6Zsp/LWKV9guwRPMe0F6wRpKkmm
6aj4hJb2lGm3CybWmhYL8skFOagsh7dSWoy6DqjavVfO2AU4eA2zbXgRxV2H
ncGN3xl80DoQzmYUPoWqwMwengqSGndFmfm2Tgz1OcDG37YkT3Bw5BPy/Vle
4zrL1MISnzyMCYZp1gUC1k9zNTtxdDWEimvb2FUqGlVWwfPOiyWTK5dlR9A9
C1rIvCHxjUVTV0hiHi+nBbetQH3b5/JhCXHKRPCKO1jR7+nJ1nFQY6Rre8Pl
lGylsva8FL82WopisGwjRiPRcS3y0xJRKI2wEAlVyeX2OAZTosvapizKz14g
brgxvxpBGTYQfsMOt0Bpwap1yIjEP0drCXv1uMwIPxkFcPh+/rGR+oiky5I7
V3PCb04uRn3HlBVyeCCYpgWaG4q9VMF6ytbDFohwwyE8uICdCeseTjr2y/4D
2xzAh5e3U2r1juJt8CnC/PTi2q+k3SpqvuZH1iV5pcF7a8bhQI9DgzuPXXzR
o9UjqRizFuCAf+wqKdHg3ehjg53Nqmm8FFzfPedNxLf0/PjiuKEpGPN+SoWK
mLgyXN7R9jH6sFojHlJRBEBtvtWgwsfHx0FnYCFBjiMKv7fxtB6tDfdQUBwi
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

-->

</rfc>
