<?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-rfc2629 version 1.6.5 (Ruby 3.0.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-schwartz-ohai-consistency-doublecheck-00" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.3 -->
  <front>
    <title abbrev="Key Consistency Double Check">Key Consistency for Oblivious HTTP by Double-Checking</title>
    <seriesInfo name="Internet-Draft" value="draft-schwartz-ohai-consistency-doublecheck-00"/>
    <author fullname="Benjamin M. Schwartz">
      <organization>Google LLC</organization>
      <address>
        <email>bemasc@google.com</email>
      </address>
    </author>
    <date year="2022" month="April" day="07"/>
    <area>sec</area>
    <workgroup>ohai</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The assurances provided by Oblivious HTTP depend on the client's ability to verify that it is using the same Request Resource and KeyConfig as many other users.  This specification defines a protocol to enable this verification.</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-schwartz-ohai-consistency-doublecheck/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/bemasc/access-services"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Oblivious HTTP <xref target="I-D.ietf-ohai-ohttp"/> presumes at least three parties to each exchange: the client, the proxy, and the target (formally, the Oblivious Request Resource).  When used properly, Oblivious HTTP enables the client to send requests to the target in such a way that the target cannot tell whether two requests came from the same client and the proxy cannot see the contents of the requests.</t>
      <t>Oblivious HTTP's threat model assumes that at least one of the proxy and the target is acting properly, i.e. complying with the protocol and keeping certain information confidential.  If either proxy or target misbehaves, the only effect must be a denial of service.</t>
      <t>In order for these security guarantees to hold, several preconditions must be met:</t>
      <ol spacing="normal" type="1"><li>The client must be one of many users who might be using the proxy.  Otherwise, use of the proxy reveals the user's identity to the target.</li>
        <li>The client must hold an authentic KeyConfig for the target.  Otherwise, they could be speaking to the proxy, impersonating the target.</li>
        <li>All users of this proxy must be equally likely to use this URI and KeyConfig for this target, regardless of their prior activity.  Otherwise, the encrypted request identifies the user to the target.</li>
        <li>(optional) The target must not learn the IP addresses of the clients, collectively.  Otherwise, the target might be able to deanonymize requests by correlating them with external information about the clients.</li>
      </ol>
      <t>This specification defines behaviors for the client, proxy, and target that achieve preconditions 2-4.  (This specification does not address precondition 1.)</t>
      <t>This draft is an instantiation of the "Single Proxy Discovery" architecture for key consistency, defined in <xref section="4.2" sectionFormat="of" target="I-D.wood-key-consistency"/>.</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>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>In the Key Consistency Double-Check procedure, the Client emits two requests: one to the Proxy, and one through the Proxy to the Target.  The Proxy will forward the first request to the Target if the response is not in cache.</t>
      <figure>
        <name>Overview of Key-Consistency Double-Check</name>
        <artwork><![CDATA[
                +--------+       +-------+      +--------+
                |        |<=====>|       |<---->|        |
                | Client |       | Proxy |      | Target |
                |        |<====================>|        |
                +--------+       +-------+      +--------+
]]></artwork>
      </figure>
      <t>The proxy caches the response, ensuring that all clients share it during its freshness lifetime.  The client checks this against the authenticated response from the Target, preventing forgeries.</t>
    </section>
    <section anchor="requirements">
      <name>Requirements</name>
      <section anchor="oblivious-request-resource">
        <name>Oblivious Request Resource</name>
        <t>The Oblivious Request Resource <bcp14>MUST</bcp14> publish an Access Description <xref target="I-D.schwartz-masque-access-descriptions"/> over HTTP/3 containing the <tt>ohttp.request</tt> key, e.g.:</t>
        <sourcecode type="JSON"><![CDATA[
{
  "ohttp": {
    "request": {
      "uri": "https://example.com/ohttp/",
      "key": "(KeyConfig in Base64)"
    }
  }
}
]]></sourcecode>
        <t>The Oblivious Request Resource <bcp14>MUST</bcp14> include a "strong validator" ETag (<xref section="2" sectionFormat="of" target="RFC7232"/>) in any response to a GET request for this access description, and <bcp14>MUST</bcp14> support the "If-Match" HTTP request header (<xref section="3" sectionFormat="of" target="RFC7232"/>).  The response <bcp14>MUST</bcp14> indicate "Cache-Control: public, no-transform, s-maxage=(...), immutable" <xref target="I-D.ietf-httpbis-cache"/><xref target="RFC8246"/>.  For efficiency reasons, the max age <bcp14>SHOULD</bcp14> be at least 60 seconds, and preferably much longer.</t>
        <t>If this Access Description changes, and the resource receives a request whose "If-Match" header identifies a previously served version that has not yet expired, it <bcp14>MUST</bcp14> return a success response containing the previous version.  This response <bcp14>MAY</bcp14> indicate "Cache-Control: private".</t>
      </section>
      <section anchor="proxy">
        <name>Oblivious Proxy</name>
        <t>The Oblivious Proxy <bcp14>MUST</bcp14> publish an Access Description that includes the <tt>ohttp.proxy</tt> and <tt>udp</tt> keys, indicating support for CONNECT-UDP <xref target="I-D.ietf-masque-connect-udp"/>.  It <bcp14>SHOULD</bcp14> also contain the <tt>dns</tt> key, indicating support for DNS over HTTPS <xref target="RFC8484"/>, to enable the use of HTTPS records with CONNECT-UDP.</t>
        <figure>
          <name>Example Proxy Access Description</name>
          <sourcecode type="JSON"><![CDATA[
{
  "dns": {
    "template": "https://doh.example.com/dns-query{?dns}",
  },
  "udp": {
    "template":
        "https://proxy.example.org/masque{?target_host,target_port}"
  },
  "ohttp": {
    "proxy": {
      "template": "https://proxy.example.org/ohttp{?request_uri}"
    }
  }
}
]]></sourcecode>
        </figure>
        <t>The Oblivious Proxy Resources <bcp14>MUST</bcp14> allow use of the GET method to retrieve small JSON responses, and <bcp14>SHOULD</bcp14> make ample cache space available in order to cache Access Descriptions.  Each proxy instance (as defined by its external-facing network interface) <bcp14>MUST</bcp14> share cache state among all clients to ensure that they use the same Access Descriptions for each Oblivious Request Resource.</t>
        <t>Oblivious Proxies <bcp14>MUST</bcp14> preserve the ETag response header on cached responses, and <bcp14>MUST</bcp14> add an Age header (<xref section="5.1" sectionFormat="comma" target="I-D.ietf-httpbis-cache-19"/>) to all proxied responses.  Oblivious Proxies <bcp14>MUST</bcp14> respect the "Cache-Control: immutable" directive, never revalidating these cached entries, and <bcp14>MUST NOT</bcp14> accept PUSH_PROMISE frames from the target.</t>
        <t>Proxies <bcp14>SHOULD</bcp14> employ defenses against malicious attempts to fill the cache.  Some possible defenses include:</t>
        <ul spacing="normal">
          <li>Rate-limiting each client's use of GET requests.</li>
          <li>Prioritizing preservation of cache entries that have been served to many clients, if eviction is required.</li>
        </ul>
        <t>Oblivious Proxies that are not intended for general-purpose proxy usage <bcp14>MAY</bcp14> impose strict transfer limits or rate limits on HTTP CONNECT and CONNECT-UDP usage.</t>
      </section>
      <section anchor="client">
        <name>Client</name>
        <t>The Client is assumed to know an "https" URI of an Oblivious Request Resource's Access Description.  To use that Request Resource, it <bcp14>MUST</bcp14> perform the following "double-check" procedure:</t>
        <ol spacing="normal" type="1"><li>Send a GET request to the Oblivious Proxy's template with <tt>request_uri</tt> set to the Access Description URI.</li>
          <li>Record the response (A).</li>
          <li>Check that response A's "Cache-Control" values indicates "public" and "immutable".</li>
          <li>Fetch the Access Description URI from its origin via CONNECT-UDP, with "If-Match" set to response A's ETag.</li>
          <li>Record the response (B).</li>
          <li>Check that responses A and B were successful and the contents are identical, otherwise fail.</li>
        </ol>
        <t>This procedure ensures that the Access Description is authentic and will be shared by all users of this proxy.  Once response A or B expires, the client <bcp14>MUST</bcp14> refresh it before continuing to use this Access Description, and <bcp14>MUST</bcp14> repeat the "double-check" process if either response changes.</t>
      </section>
    </section>
    <section anchor="example-oblivious-doh">
      <name>Example: Oblivious DoH</name>
      <t>In this example, the client has been configured with an Oblivious DoH server and an Oblivious Proxy.  The Oblivious DoH server is identified by an Access Description at "https://doh.example.com/config.json" with the following contents:</t>
      <sourcecode type="JSON"><![CDATA[
{
  "dns": {
    "template": "https://doh.example.com/dns-query{?dns}",
  },
  "ohttp": {
    "request": {
      "uri": "https://example.com/ohttp/",
      "key": "(KeyConfig in Base64)"
    }
  }
}
]]></sourcecode>
      <t>The Oblivious Proxy is identified as "proxy.example.org", which implies an Access Description at "https://proxy.example.org/.well-known/access-services".  This resource's contents are:</t>
      <sourcecode type="JSON"><![CDATA[
{
  "dns": {
    "template": "https://proxy.example.org/dns-query{?dns}",
  },
  "udp": {
    "template":
        "https://proxy.example.org/masque{?target_host,target_port}"
  },
  "ohttp": {
    "proxy": {
      "template": "https://proxy.example.org/ohttp{?request_uri}"
    }
  }
}
]]></sourcecode>
      <t>The following exchanges then occur between the client and the proxy:</t>
      <artwork><![CDATA[
HEADERS
:method = GET
:scheme = https
:authority = proxy.example.org
:path = /ohttp?request_uri=https%3A%2F%2Fdoh.example.com%2Fconfig.json
accept: application/json

                              HEADERS
                              :status = 200
                              cache-control: public, immutable, \
                                  no-transform, s-maxage=86400
                              age: 80000
                              etag: ABCD1234
                              content-type: application/json
                              [Access Description contents here]

HEADERS
:method = CONNECT
:protocol = connect-udp
:scheme = https
:authority = proxy.example.org
:path = /masque?target_host=doh.example.com,target_port=443
capsule-protocol = ?1

                              HEADERS
                              :status = 200
                              capsule-protocol = ?1
]]></artwork>
      <t>The client now has a CONNECT-UDP tunnel to <tt>doh.example.com</tt>, over which it performs the following request using HTTP/3:</t>
      <artwork><![CDATA[
HEADERS
:method = GET
:scheme = https
:authority = doh.example.com
:path = /config.json
if-match = ABCD1234

                              HEADERS
                              :status = 200
                              cache-control: public, immutable, \
                                  no-transform, s-maxage=86400
                              etag: ABCD1234
                              content-type: application/json
                              [Access Description contents here]
]]></artwork>
      <t>Having successfully fetched the Access Description from both locations, the client confirms that:</t>
      <ul spacing="normal">
        <li>The responses are identical.</li>
        <li>The cache-control response from the proxy contained the "public" and "immutable" directives.</li>
      </ul>
      <t>The client can now use the KeyConfig in this Access Description to reach the Oblivious DoH server, by forming Binary HTTP requests for "https://doh.example.com/dns-query" and delivering the encapsulated requests to "https://example.com/ohttp/" via the proxy.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="in-scope">
        <name>In scope</name>
        <t>A malicious proxy could attempt to learn the contents of the oblivious request by forging an Access Description containing its own KeyConfig.  This is prevented by the client's requirement that the KeyConfig be served to it by the configured origin over HTTPS (<xref target="client"/>).</t>
        <t>A malicious target could attempt to link multiple requests together by issuing each user a unique, persistent KeyConfig.  This attack is prevented by the client's requirement that the KeyConfig be fresh according to the proxy's cache (<xref target="client"/>).</t>
        <t>A malicious target could attempt to rotate its entry in the proxy's cache in several ways:</t>
        <ul spacing="normal">
          <li>Using HTTP PUSH_PROMISE frames.  This attack is prevented by disabling PUSH_PROMISE at the proxy (<xref target="proxy"/>).</li>
          <li>
            <t>By also acting as a client and sending requests designed to replace the Access Description in the cache before it expires:
            </t>
            <ul spacing="normal">
              <li>By sending requests with a "Cache-Control: no-cache" or similar directive.  This is prevented by the response's "Cache-Control: public, immutable" directives, which are verified by the client (<xref target="client"/>).</li>
              <li>By filling the cache with new entries, causing its previous Access Description to be evicted.  <xref target="proxy"/> describes some possible mitigations.</li>
            </ul>
          </li>
        </ul>
        <t>A malicious client could use the proxy to send abusive traffic to any destination on the internet.  Abuse concerns can be mitigated by imposing a rate limit at the proxy (<xref target="proxy"/>).</t>
      </section>
      <section anchor="out-of-scope">
        <name>Out of scope</name>
        <t>This specification assumes that the client starts with identities of the proxy and target that are authentic and widely shared.  If these identities are inauthentic, or are unique to the user, then the security goals of this specification are not achieved.</t>
        <t>This specification assumes that at most a small fraction of clients are acting on behalf of a malicious target.  If a large fraction of the clients are malicious, they could conspire to flood the proxy cache with entries that seem popular, leading to rapid eviction of the malicious target's Access Descriptions.  Similar concerns apply if a malicious target can compel naive clients to fetch a very large number of Access Descriptions.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>IANA is requested to open a Specification Required registry entitled "HTTP Access Service Descriptors", with the following initial contents:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Key</th>
            <th align="left">Specification</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">dns</td>
            <td align="left">(This document)</td>
          </tr>
          <tr>
            <td align="left">udp</td>
            <td align="left">(This document)</td>
          </tr>
          <tr>
            <td align="left">ip</td>
            <td align="left">(This document)</td>
          </tr>
          <tr>
            <td align="left">ohttp</td>
            <td align="left">(This document)</td>
          </tr>
        </tbody>
      </table>
      <t>IANA is requested to add the following entry to the "Well-Known URIs" registry</t>
      <table>
        <thead>
          <tr>
            <th align="left">URI Suffix</th>
            <th align="left">Change Controller</th>
            <th align="left">Reference</th>
            <th align="left">Status</th>
            <th align="left">Related Information</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">access-services</td>
            <td align="left">IETF</td>
            <td align="left">(This document)</td>
            <td align="left">permanent</td>
            <td align="left">Sub-registry at (link)</td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="I-D.ietf-ohai-ohttp">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="15" month="February" year="2022"/>
            <abstract>
              <t>   This document describes a system for the forwarding of encrypted HTTP
   messages.  This allows a client to make multiple requests of a server
   without the server being able to link those requests to the client or
   to identify the requests as having come from the same client.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-ohttp-01"/>
        </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="I-D.schwartz-masque-access-descriptions">
          <front>
            <title>HTTP Access Service Description Objects</title>
            <author fullname="Benjamin M. Schwartz">
              <organization>Google LLC</organization>
            </author>
            <date day="7" month="April" year="2022"/>
            <abstract>
              <t>   HTTP proxies can operate several different kinds of access services.
   This specification provides a format for identifying a collection of
   such services.

About This Document

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

   Status information for this document may be found at
   https://datatracker.ietf.org/doc/draft-schwartz-masque-access-
   descriptions/.

   Source for this draft and an issue tracker can be found at
   https://github.com/bemasc/access-services.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schwartz-masque-access-descriptions-00"/>
        </reference>
        <reference anchor="RFC7232">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypertext information systems.  This document defines HTTP/1.1 conditional requests, including metadata header fields for indicating state changes, request header fields for making preconditions on such state, and rules for constructing the responses to a conditional request when one or more preconditions evaluate to false.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7232"/>
          <seriesInfo name="DOI" value="10.17487/RFC7232"/>
        </reference>
        <reference anchor="I-D.ietf-httpbis-cache">
          <front>
            <title>HTTP Caching</title>
            <author fullname="Roy T. Fielding">
              <organization>Adobe</organization>
            </author>
            <author fullname="Mark Nottingham">
              <organization>Fastly</organization>
            </author>
            <author fullname="Julian Reschke">
              <organization>greenbytes GmbH</organization>
            </author>
            <date day="12" month="September" year="2021"/>
            <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.

   This document obsoletes RFC 7234.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-cache-19"/>
        </reference>
        <reference anchor="RFC8246">
          <front>
            <title>HTTP Immutable Responses</title>
            <author fullname="P. McManus" initials="P." surname="McManus">
              <organization/>
            </author>
            <date month="September" year="2017"/>
            <abstract>
              <t>The immutable HTTP response Cache-Control extension allows servers to identify resources that will not be updated during their freshness lifetime.  This ensures that a client never needs to revalidate a cached fresh resource to be certain it has not been modified.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8246"/>
          <seriesInfo name="DOI" value="10.17487/RFC8246"/>
        </reference>
        <reference anchor="I-D.ietf-masque-connect-udp">
          <front>
            <title>UDP Proxying Support for HTTP</title>
            <author fullname="David Schinazi">
              <organization>Google LLC</organization>
            </author>
            <date day="21" month="March" year="2022"/>
            <abstract>
              <t>   This document describes how to proxy UDP over HTTP.  Similar to how
   the CONNECT method allows proxying TCP over HTTP, this document
   defines a new mechanism to proxy UDP.  It is built using HTTP
   Extended CONNECT.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-udp-08"/>
        </reference>
        <reference anchor="RFC8484">
          <front>
            <title>DNS Queries over HTTPS (DoH)</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <author fullname="P. McManus" initials="P." surname="McManus">
              <organization/>
            </author>
            <date month="October" year="2018"/>
            <abstract>
              <t>This document defines a protocol for sending DNS queries and getting DNS responses over HTTPS.  Each DNS query-response pair is mapped into an HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8484"/>
          <seriesInfo name="DOI" value="10.17487/RFC8484"/>
        </reference>
        <reference anchor="I-D.ietf-httpbis-cache-19">
          <front>
            <title>HTTP Caching</title>
            <author fullname="Roy T. Fielding" initials="R. T." surname="Fielding">
              <organization>Adobe</organization>
            </author>
            <author fullname="Mark Nottingham" initials="M." surname="Nottingham">
              <organization>Fastly</organization>
            </author>
            <author fullname="Julian Reschke" initials="J." surname="Reschke">
              <organization>greenbytes GmbH</organization>
            </author>
            <date day="12" month="September" year="2021"/>
            <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.

   This document obsoletes RFC 7234.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-cache-19"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.wood-key-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>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
QFgYaSbR3wC7rTfodzUAAA==

-->

</rfc>
