<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.1 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-group-privacypass-consistency-mirror-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="Checking Resource Consistency with HTTP Mirrors">Checking Resource Consistency with HTTP Mirrors</title>
    <seriesInfo name="Internet-Draft" value="draft-group-privacypass-consistency-mirror-01"/>
    <author initials="B." surname="Beurdouche" fullname="Benjamin Beurdouche">
      <organization>Inria &amp; Mozilla</organization>
      <address>
        <email>ietf@beurdouche.com</email>
      </address>
    </author>
    <author initials="M." surname="Finkel" fullname="Matthew Finkel">
      <organization>Apple Inc.</organization>
      <address>
        <email>sysrqb@apple.com</email>
      </address>
    </author>
    <author initials="S." surname="Valdez" fullname="Steven Valdez">
      <organization>Google LLC</organization>
      <address>
        <email>svaldez@chromium.org</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly">
      <organization>Apple Inc.</organization>
      <address>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <date year="2023" month="October" day="23"/>
    <area>Security</area>
    <workgroup>Privacy Pass</workgroup>
    <keyword>HTTP</keyword>
    <keyword>consistency check</keyword>
    <keyword>mirror</keyword>
    <abstract>
      <?line 61?>

<t>This document describes the mirror protocol, an HTTP-based protocol for fetching mirrored
HTTP resources. The primary use case for the mirror protocol is to support HTTP resource
consistency checks in protocols that require clients have a consistent view of some
protocol-specific resource (typically, a public key) for security or privacy reasons,
including Privacy Pass and Oblivious HTTP. To that end, this document also describes how
to use the mirror protocol to implement these consistency checks.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-group-privacypass-consistency-mirror/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Pass Working Group mailing list (<eref target="mailto:privacy-pass@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/privacy-pass/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/privacy-pass/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/chris-wood/draft-group-privacypass-K-Check"/>.</t>
    </note>
  </front>
  <middle>
    <?line 70?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Privacy-enhancing protocols such as Privacy Pass <xref target="PRIVACYPASS"/> and Oblivious HTTP <xref target="OHTTP"/>
require clients to obtain and use a public key for execution. In Privacy Pass,
public keys are used by clients when issuing and redeeming tokens for anonymous
authorization. In Oblivious HTTP (OHTTP), clients use public keys to encrypt
messages to a gateway server.</t>
      <t>Deployments of protocols such as Privacy Pass and OHTTP requires that very large sets of clients
share the same key, or even that all clients globally share the same key. This is because the privacy properties depend on the client
anonymity set size. In other words, the key that's used determines the set to which
a particular client belongs. Using a unique, client-specific key would yield an anonymity set
of size one, therefore violating the desired privacy goals of the system. Clients that
use the same key as one another are said to have a consistent view of the key.</t>
      <t><xref target="CONSISTENCY"/> describes this notion of consistency in more detail. It also outlines
several designs that can be used as the basis for consistency systems. This document is
a concrete instantiation of one of those designs, "Shared Cache Discovery". In particular,
this document describes the mirror protocol, which is a protocol for fetching a cached copy of
an HTTP resource from so-called mirrors. In this context, a mirror is an HTTP resource that
fetches and caches copies of other HTTP resources that can be returned to clients. In turn,
clients can then use these cached resource copies for consistency checks, i.e., to compare
their expected representation of the resource against that which the mirrors provide.</t>
      <t>The mirror protocol can be run one or more times by an application to achieve the desired
consistency criteria. For example, the mirror protocol can be run once with a trusted mirror,
or more than once with many, potentially less trusted mirrors, and used for determining
consistency. <xref target="integration"/> provides general guidance for using the mirror protocol for
consistency checks, along with specific profiles of the protocol for Privacy Pass and OHTTP
in <xref target="profile-privacypass"/> and <xref target="profile-ohttp"/>, respectively.</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>
      <?line -18?>

</section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The following terms are used throughout this document:</t>
      <ul spacing="normal">
        <li>
          <t>Resource: A HTTP resource identified by a URL.</t>
        </li>
        <li>
          <t>Normalized resource representation: A unique or otherwise protocol-specific representation
that is derived from an HTTP resource. The process of normalization is specific to a
protocol and the resource in question.</t>
        </li>
        <li>
          <t>Mirror: A HTTP resource that fetches and caches HTTP resources.</t>
        </li>
      </ul>
    </section>
    <section anchor="mirror-protocol">
      <name>Mirror Protocol</name>
      <t>The mirror protocol is a simple HTTP-based protocol similar to a reverse proxy. Each mirror
resource, henceforth referred to as a mirror, is identified by a Mirror URI Template <xref target="RFC6570"/>.
The scheme for the Mirror URI Template <bcp14>MUST</bcp14> be "https". The Mirror URI Template uses the Level
3 encoding defined <xref section="1.2" sectionFormat="of" target="RFC6570"/> and contains one variables: "target", which is the
percent-encoded URL of a HTTP resource to be mirrored. Example Mirror URI Templates are shown below.</t>
      <artwork><![CDATA[
https://mirror.example/mirror{?target}
https://mirror.example/{target}
]]></artwork>
      <t>The Mirror URI Template <bcp14>MUST</bcp14> contain the "target" variable exactly once. The variable
<bcp14>MUST</bcp14> be within the path or query components of the URI.</t>
      <t>In addition, each mirror is configured with a MIN_VALIDITY_WINDOW parameter, which is an integer
indicating the minimum time for resources the mirror will cache according to their "max-age"
response directive. We refer to the validity window of the mirror response as the period of
time determined by the Cache-Control headers as the response.</t>
      <t>Clients send requests to mirror resources after being configured with their corresponding
Mirror URI Template. Clients <bcp14>MUST</bcp14> ignore configurations that do not conform to this template.</t>
      <t>Upon receipt of a mirror request, mirrors validate the incoming request. If the request is invalid
or malformed, e.g., the "target" parameter is not a correctly encoded URL, the mirror aborts
and returns a a 4xx (Client Error) to the client. The mirror <bcp14>SHOULD</bcp14> check that the target resource
identified by the "target" parameter is allowed by policy, e.g., so that it is not abused to
fetch arbitrary resources. One way to implement this check is via an allowlist of target URLs.</t>
      <t>If the request is valid and allowed, the mirror checks to see if it has a cached version of the
resource identified by the target URL. Mirrors can provide a cached response to a client request
if the following criteria are met:</t>
      <ol spacing="normal" type="1"><li>
          <t>The target URL matches that of a cached response.</t>
        </li>
        <li>
          <t>The cached response is fresh according to its Cache-Control header (see <xref section="4.2" sectionFormat="of" target="CACHING"/>).</t>
        </li>
      </ol>
      <t>If both criteria are met, the mirror encodes the cached response using Binary HTTP <xref target="BHTTP"/>
and returns it to the client in a response. The mirror response includes a Cache-Control header
with "max-age" directive set to that of the cached response.</t>
      <t>Otherwise, mirrors send a GET request to the target resource URL, copying the Accept header from
the client request if present. If this request fails, the mirror returns a 4xx error to the client.
If this request suceeeds, the mirror checks it for validity. The response is considered valid and stored
in the mirror's cache if the following criteria are met:</t>
      <ol spacing="normal" type="1"><li>
          <t>The response can be cached according to the rules in <xref section="3" sectionFormat="of" target="CACHING"/>. In particular,
if the request had a Vary header, this is used in determining whether the mirror's response is valid.</t>
        </li>
        <li>
          <t>The Cache-Control header is present, has a "max-age" response directive that is
greater than or equal to MIN_VALIDITY_WINDOW, and does not have a "no-store" or "private" directive.</t>
        </li>
      </ol>
      <t>Mirrors purge this cache when the response is no longer valid according to the
Cache-Control headers.</t>
      <t>To complete the client request, the mirror then encodes the response using Binary
HTTP <xref target="BHTTP"/> and returns it to the client in a response. The mirror response incldues a
Cache-Control header with "max-age" directive set to that of the cached response.</t>
      <t>Clients recover the target's mirrored response by Binary HTTP decoding the mirror response
content.</t>
      <section anchor="mirror-request-and-response-example">
        <name>Mirror Request and Response Example</name>
        <t>The following example shows two mirror request and response examples. The first one yields a mirror
cache miss and the second one yields a mirror cache hit. The Mirror URI Template is
"https://mirror.example/mirror{?target}", and the target URL is
"https://issuer.example/.well-known/private-token-issuer-directory".</t>
        <t>The first client request to the mirror might be the following.</t>
        <artwork><![CDATA[
:method = GET
:scheme = https
:authority = mirror.example
:path = /mirror?target=https%3A%2F%2Fissuer.example%2F.well-known%2Fprivate-token-issuer-directory
accept = application/private-token-issuer-directory
]]></artwork>
        <t>Upon receipt, the mirror decodes the "target" parameter, inspects its cache for a copy of the
resource, and then constructs a HTTP request to the target URL to fetch the content. If present,
the relay copies the Accept header from the client request to the request sent to the target.
This mirror request to the target might be the following.</t>
        <artwork><![CDATA[
:method = GET
:scheme = https
:authority = target.example
:path = /.well-known/private-token-issuer-directory
accept = application/private-token-issuer-directory
]]></artwork>
        <t>The target response is then returned to the mirror, like so:</t>
        <artwork><![CDATA[
:status = 200
content-type = application/private-token-issuer-directory
content-length = ...
cache-control: max-age=3600

<Bytes containing a private token issuer directory>
]]></artwork>
        <t>The mirror caches this response content for the target URL, encodes it using Binary HTTP <xref target="BHTTP"/>,
and then returns the response to the client:</t>
        <artwork><![CDATA[
:status = 200
content-length = ...
cache-control: max-age=3600

<Bytes containing the target's BHTTP-encoded response>
]]></artwork>
        <t>When a second client asks for the same request by the mirror it can be served with the cached
copy. The second client's request might be the following:</t>
        <artwork><![CDATA[
:method = GET
:scheme = https
:authority = mirror.example
:path = /mirror?target=https%3A%2F%2Fissuer.example%2F.well-known%2Fprivate-token-issuer-directory
]]></artwork>
        <t>The mirror validates the request, locates the cached copy of the
"https://issuer.example/.well-known/private-token-issuer-directory" content, and then
returns it to the client without updating its cached copy.</t>
        <artwork><![CDATA[
:status = 200
content-length = ...
cache-control: max-age=3600

<Bytes containing the target's BHTTP-encoded response>
]]></artwork>
      </section>
    </section>
    <section anchor="integration">
      <name>Using Mirrors for Consistency Checks</name>
      <t>Clients can use mirrors to implement consistency checks for a candidate HTTP
resource. In particular, in possession of the target URL at which the resource
was obtained, as well as an authoritative representation of the resource, clients
can check to see if this resource is consistent with that of the mirror's as follows:</t>
      <ol spacing="normal" type="1"><li>
          <t>Send a mirror request to the mirror for the target URL. If the request fails, fail
this consistency check.</t>
        </li>
        <li>
          <t>Otherwise, compute the first valid representation of the resource based on the mirror's response.</t>
        </li>
        <li>
          <t>Compare the computed representation to the input resource representation. If they do not match,
fail this consistency check. Otherwise, this consistency check succeeds.</t>
        </li>
      </ol>
      <t>The benefits of using the mirror protocol to check consistency depend on a multitude of
factors, including, but not limited to, the number of clients interacting with a particular
mirror, whether or not the mirror is trustworthy, and application requirements for dealing
with consistency check failures.</t>
      <section anchor="handling-consistency-failures">
        <name>Handling Consistency Failures</name>
        <t>If a consistency check fails because the mirrored resource did not match, the client
<bcp14>MUST NOT</bcp14> use the original resource. For cases where the check failed because the
client was unable to communicate with the mirror, client policy dictates whether or
not to assume the resource is consistent. Client behavior for what to do in the case
of inconsistency can vary depending on the protocol, availability of alternative services,
and client policy.</t>
        <t>If the client has multiple options for equivalent services, it can choose to fall back
from a service that failed a consistency check to one that passed all consistency checks.
For example, if a client has the option of using one of a set of Privacy Pass token
issuers, it can choose an issuer that passes all consistency checks.</t>
        <t>If the service that failed the consistency check is an optional optimization for the client,
the client can simply choose to not use the service. For example, if a Privacy Pass token is
used to avoid showing the user a CAPTCHA, but the Privacy Pass token issuer fails the
consistency check, the client can fall back to showing the user a CAPTCHA.</t>
        <t>For cases where the client has no alternate services to use, and the service is
required in order to perform user-facing functionality, the client <bcp14>SHOULD</bcp14> report the
error in a visible way that presents the error to the user or an administrator. This
functionality can be similar to how invalid TLS certificates are reported.</t>
      </section>
      <section anchor="selecting-mirror-servers">
        <name>Selecting Mirror Servers</name>
        <t>In many of these systems where the mirror protocol might be used, including common
configurations for Privacy Pass and OHTTP, there is already a party who is necessarily
trusted to protect the user's privacy, and whose operational availability is already a
prerequisite for using the system. In OHTTP, this is the Relay; in Privacy Pass it might
be the Attester (in Split Mode) or a transport proxy.</t>
        <t>When such a party exists, it is <bcp14>RECOMMENDED</bcp14> that they operate a mirror service
for their users, and that clients do not use any other mirrors for the purposes of
consistency checks. This avoids revealing any metadata about the client's activity
to additional parties and reduces the likelihood of an outage. More information for
implementing this check in the context of Privacy Pass and OHTTP is provided in
<xref target="profile-privacypass"/> and <xref target="profile-ohttp"/>, respectively.</t>
        <t>In some cases, this trusted party can provide consistency enforcement through
a protocol-specific mechanism (e.g., <xref target="I-D.pw-privacypass-in-band-consistency"/>
for Privacy Pass in Split Mode).  Protocol-specific consistency mechanisms may
be preferable to protocol-agnostic consistency checks based on the mirror protocol,
especially if they provide equivalent consistency guarantees with better performance
or reliability.</t>
      </section>
      <section anchor="consistency-validity-period">
        <name>Consistency Validity Period</name>
        <t>Executing a consistency check provides a client with some assurance that other
clients may be using the same resource <xref target="security-considerations"/>. However,
this result only reflects a mirror's view of a resource at a particular point
in time. The client should periodically re-check consistency. The frequency of
re-checking depends on the requirements of the client <xref target="integration"/>. Clients
should re-confirm consistency of a cached resource if it is not fresh (see
<xref section="4.2" sectionFormat="of" target="CACHING"/>).</t>
        <t>Two strategies for maintaining consistency are:
1. Pre-emptively execute a consistency check for a resource that is expiring soon; and
1. Execute a consistency check of an expired resource at the time of its next use.</t>
        <t>For strategy 1, clients that execute consistency checks at the same time can
induce a thundering herd that overwhelms the mirror resource. Since coordinating
consistency checks across clients is difficult, clients can instead execute consistency
checks at random times before the resource expires. Clients that have more information
about a mirror's available capacity can choose different implementations for strategy 1.</t>
        <t>Strategy 2 might be preferrable for a service and resource that is infrequently
used. However, a consequence of this strategy is that it can reveal a client's
usage patterns to the mirror.</t>
        <t>When the origin server has multiple versions of a resource corresponding to a
URL, it should respond with the resource that is both currently valid and will
remain fresh for the longest amount of time in the future.</t>
      </section>
      <section anchor="profile-privacypass">
        <name>Privacy Pass Profile</name>
        <t>Clients are given as input an issuer token key from an origin server and want to check
whether it is consistent with the key that is given to other clients. Let the input key
be denoted token_key and its identifier be token_key_id. Clients are also given as input
the name of the issuer, from which they can construct the target URL for the issuer
directory. If clients have already checked this issuer’s token key, i.e., they’ve
previously run a consistency check, they can simply reuse the result up to its expiration.
Otherwise, clients invoke a mirror-based consistency check in parallel with the issuance
protocol.</t>
        <t>Each issuer directory can yield one or more normalized representations that clients use
in the consistency check. For example, given a mirrored token directory resource like the
following:</t>
        <artwork><![CDATA[
{
  "issuer-request-uri": "https://issuer.example.net/request",
  "token-keys": [
    {
      "token-type": 2,
      "token-key": "MI...AB",
      "not-before": 1686913811,
    },
    {
      "token-type": 2,
      "token-key": "MI...AQ",
    }
  ]
}
]]></artwork>
        <t>Clients compute the first valid representation of this directory, i.e., the first entry in
the list that the client can use, which might be the key ID of the first key in the
"token-keys" list (depending on the "not-before" value), or the key ID of the second key
in the "token-keys" list. The key ID is computed as defined in <xref section="6.5" sectionFormat="of" target="PRIVACYPASS-ISSUANCE"/>.</t>
      </section>
      <section anchor="profile-ohttp">
        <name>Oblivious HTTP Profile</name>
        <t>Clients can run consistency checks for OHTTP in several ways depending on the deployment. In practice,
common deployments are as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Clients are configured with gateway configurations; and</t>
          </li>
          <li>
            <t>Clients fetch gateway configurations before use.</t>
          </li>
        </ol>
        <t>In both cases, clients begin with a gateway configuration and want to check it for consistency.
In OHTTP, there is exactly one representation for a gateway configuration – the configuration itself.
Before using the configuration to encrypt a binary HTTP message to the gateway, clients can run
a consistency check with their configured mirror(s) to ensure that this configuration is correct
for the given gateway.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Consistency checks assume that the client-configured set of mirrors is honest. Under this assumption,
the consistency properties of consistency checks based on the mirror protocol are as follows:</t>
      <ol spacing="normal" type="1"><li>
          <t>With honest mirrors, clients that successfully check a resource are assured that they
share the same copy of the resource with the union of mirror clients for each configured mirror.</t>
        </li>
        <li>
          <t>Consistency only holds for the period of time of the minimum mirror validity window.</t>
        </li>
        <li>
          <t>With at least one dishonest mirror, the probability of discovering an inconsistency is 1 - (1 / 2^(k-1)),
where k is the number of disjoint consistency checks. This is the probability that each individual
consistency check succeeds.</t>
        </li>
      </ol>
      <t>Unless all clients share the same configured mirrors, consistency checks using the mirror protocol do
not achieve global consistency as is defined in <xref target="CONSISTENCY"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="PRIVACYPASS">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="September" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for authorization
   based on privacy-preserving authentication mechanisms.  It describes
   the conceptual model of Privacy Pass and its protocols, its security
   and privacy goals, practical deployment models, and recommendations
   for each deployment model that helps ensure the desired security and
   privacy goals are fulfilled.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-16"/>
        </reference>
        <reference anchor="PRIVACYPASS-ISSUANCE">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofia Celi" initials="S." surname="Celi">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="3" month="October" year="2023"/>
            <abstract>
              <t>   This document specifies two variants of the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable using the issuance private key, and another that
   produces tokens that are publicly verifiable using the issuance
   public key.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-16"/>
        </reference>
        <reference anchor="CONSISTENCY">
          <front>
            <title>Key Consistency and Discovery</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Matthew Finkel" initials="M." surname="Finkel">
              <organization>The Tor Project</organization>
            </author>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document describes the consistency requirements of protocols
   such as Privacy Pass, Oblivious DoH, and Oblivious HTTP for user
   privacy.  It presents definitions for consistency and then surveys
   mechanisms for providing consistency in varying threat models.  In
   concludes with discussion of open problems in this area.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-key-consistency-01"/>
        </reference>
        <reference anchor="OHTTP">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="August" year="2023"/>
            <abstract>
              <t>   This document describes Oblivious HTTP, a protocol for forwarding
   encrypted HTTP messages.  Oblivious HTTP allows a client to make
   multiple requests to an origin server without that server being able
   to link those requests to the client or to identify the requests as
   having come from the same client, while placing only limited trust in
   the nodes used to forward the messages.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-ohttp-10"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC6570">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="M. Hadley" initials="M." surname="Hadley"/>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="D. Orchard" initials="D." surname="Orchard"/>
            <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="BHTTP">
          <front>
            <title>Binary Representation of HTTP Messages</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document defines a binary format for representing HTTP messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9292"/>
          <seriesInfo name="DOI" value="10.17487/RFC9292"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="DOUBLE-CHECK">
          <front>
            <title>Key Consistency by Double-Checking via a Semi-Trusted Proxy</title>
            <author fullname="Benjamin M. Schwartz" initials="B. M." surname="Schwartz">
              <organization>Google LLC</organization>
            </author>
            <date day="19" month="October" year="2022"/>
            <abstract>
              <t>   Several recent IETF privacy protocols require clients to acquire
   bootstrap information for a service in a way that guarantees both
   authenticity and consistency, e.g., encrypting to the same key as
   many other users.  This specification defines a procedure for
   transferring arbitrary HTTP resources in a manner that provides these
   guarantees.  The procedure relies on access to a semi-trusted HTTP
   proxy, under the same security assumptions as an Oblivious HTTP
   Relay.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schwartz-ohai-consistency-doublecheck-03"/>
        </reference>
        <reference anchor="CACHING">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="I-D.pw-privacypass-in-band-consistency">
          <front>
            <title>Privacy Pass In-Band Key Consistency Checks</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document describes an in-band key consistency enforcement
   mechanism for Privacy Pass deployments wherein the Attester is split
   from the Issuer and Origin.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-pw-privacypass-in-band-consistency-00"/>
        </reference>
      </references>
    </references>
    <?line 432?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document is based on the <xref target="DOUBLE-CHECK"/> protocol from Benjamin Schwartz.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAD2UNmUAA9Vc63LcNpb+j6fAtGs29lZ3J3IymUQTTyLLcqwa38aS40pN
zabQJLobYzbZIUi1Oyql5h321/7bZ9lHmSfZcwMIsqncq7a2KuVIJAEcHJzz
nSs0m81U45rCHuvJ6dpmb1250q+sr9o6s/q0Kr3zjS2zvd65Zq2fXF6+1M9c
XVe1nyizWNT26peMzExjV1W9P9a+yZXKq6w0G6Ahr82yma3qqt3OtrW7Mtl+
a7yfZd10sw1NMvvgSPl2sXHeu6ps9lsYfX52+ViV7WZh62OVwxLHCgfa0rf+
WDd1axVQ+6EytTVA9YXN2to1+4naVfVbWhSevuRl9UtYd6Le2j28zI+VntEW
8P8JMTrDneNDpkpd2bKFZbUen05rpnTyBlZEhn2Jn+HzjXEFPJdNz3DXXzjb
LOdVvcL3K2Biu4AvsnXt/GxXVfn7t3HrLzM6kIlSpm3WVY3UwxRauxL48HCu
H9q2zqsWiKfHzPuHtvyH2bhy+BYIMKX7zjTAZ+BxWTuj/00/q75zRWHoC8vE
I7lfLOLgeVZtegs/m+vHrnxri2TRZ6Zp1naXvoD1jvXJdltYWCybpyv4va+/
XXxh8OXB9Bdz/ZUpcvtdMv1FY+FE0uc0+5dVtYLpnz497c1+RZ99ARyuNq7d
IOt7K5zO9clcvwHWJ0uc4nk01XZt695bWui0qNp8WYDApQtlZvfF2potCMDC
NX5e2qa3zuUcxKUt9skql9Vms0+e/gCTmi1+lTBJlVW9geO7IsF8+er8q5PT
r1+eXFzAac4ezfHYeuJj6mztGps1LZGdDJidX1y8Pnl+enbLyG1dNVVW4Tme
vnh+cX5xefb89OtbPgbVSvUaxrxADUu+rtbGwT9Ns1XKlct0F49evH749Gx2
+uTs9C88wmfrnamb73hUChggjovCsqYqNZvNtFn4pjZZo9Tl2nkN8NNubNno
3PqsdgvrNQilqLQOm5pqUxIGzBbG2zw+10CYXtoGmAYKzYNsrgjwasFDP9eX
MCNsf2PqvW69BSGAf3DoyFIaiGoq7dvttqob3ZtKHcCPB6mJQ5F008DX37au
hlUKBxvzem2urDYddDX6yoHaVUvtq41VYfTMb23mli6Ly+m7gFguM0WxBwbo
LbAS3sLZ3SPivWCoJuoZ6gBdPawzhTPLijZHrqQoCGzM9QuY5spVrafNAXcq
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
DMR3xOW+Nrrm8W9cXchfC5qr/wXgNSC/Ak0AAA==

-->

</rfc>
