<?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.36 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-key-consistency-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="Key Consistency and Discovery">Key Consistency and Discovery</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-key-consistency-01"/>
    <author initials="A." surname="Davidson" fullname="Alex Davidson">
      <organization>Brave Software</organization>
      <address>
        <email>alex.davidson92@gmail.com</email>
      </address>
    </author>
    <author initials="M." surname="Finkel" fullname="Matthew Finkel">
      <organization>The Tor Project</organization>
      <address>
        <email>sysrqb@torproject.org</email>
      </address>
    </author>
    <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>
        <postal>
          <street>101 Townsend St</street>
          <city>San Francisco</city>
          <country>United States of America</country>
        </postal>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2023" month="July" day="10"/>
    <keyword>privacy</keyword>
    <keyword>consistency</keyword>
    <keyword>correctness</keyword>
    <keyword>crypto</keyword>
    <keyword>blockchain</keyword>
    <abstract>
      <?line 58?>

<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>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://chris-wood.github.io/key-consistency/draft-ietf-privacypass-key-consistency.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-privacypass-key-consistency/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/chris-wood/key-consistency"/>.</t>
    </note>
  </front>
  <middle>
    <?line 65?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Several proposed privacy-enhancing protocols such as Privacy Pass
<xref target="PRIVACY-PASS"/>, Oblivious DoH <xref target="ODOH"/>, and Oblivious HTTP <xref target="OHTTP"/> require
clients to obtain and use a public key for execution. For example, Privacy Pass
public keys are used by clients when issuing and redeeming tokens for anonymous
authorization. Oblivious DoH and HTTP both use public keys to encrypt messages
to a particular server.</t>
      <t>Privacy in these systems depends on clients using an authenticated key that many,
if not all, other clients use. If a client were to receive a public key that was
specific to them, or restricted to a small set of clients, then use of that public
key could be used to learn targeted information about the client. Informally,
using the same key is referred to as key consistency. The degree to which clients
use consistent keys determines the extent to which use of a particular key can
compromise their individual privacy. This document provides definitions for key
consistency that captures this concept.</t>
      <t>Depending on the type of consistency, the design space for building key consistency
solutions can be large. This document surveys several common approaches to solving
this problem and describes the consistency properties they purport to provide under
various threat models.</t>
      <t>The purpose of this document is twofold: (1) provide a foundation upon which technical
solutions can be specified and evaluated, and (2) highlight challenges in building and
deploying key consistency solutions in practice.</t>
      <section anchor="requirements">
        <name>Requirements</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>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>This document defines the following terms:</t>
      <dl>
        <dt>Reliant System:</dt>
        <dd>
          <t>A system that embeds one or more key consistency systems.</t>
        </dd>
        <dt>Key:</dt>
        <dd>
          <t>A cryptographic object used by a reliant system.</t>
        </dd>
        <dt>Key Identifier (Key ID):</dt>
        <dd>
          <t>A unique identifier for a key.</t>
        </dd>
        <dt>Key Set:</dt>
        <dd>
          <t>A set of one or more keys.</t>
        </dd>
        <dt>Key Set Identifier (Set ID):</dt>
        <dd>
          <t>A unique identifier for a key set.</t>
        </dd>
        <dt>Client:</dt>
        <dd>
          <t>An entity that uses a key in a reliant system.</t>
        </dd>
        <dt>Source:</dt>
        <dd>
          <t>An entity that provides key material for use by clients.</t>
        </dd>
      </dl>
      <t>The key consistency model is dependent on the implementation and reliant system's threat model.</t>
    </section>
    <section anchor="reqs">
      <name>Consistency Requirements</name>
      <t>Privacy-focused protocols which rely on widely shared public keys typically
require keys be consistent. Informally, key consistency is the
requirement that all clients who use a source-provided key in some reliant system
share the same view of the key. Some protocols depend on large sets of clients
with consistent keys for privacy reasons. Specifically, all clients with a
consistent key represent an anonymity set wherein each client of the key in
that set is indistinguishable from the rest. An attacker that can actively
cause inconsistent views of keys can therefore compromise client privacy.</t>
      <section anchor="consistency-definitions">
        <name>Consistency Definitions</name>
        <t>Formally, consistency is a predicate defined based on key sets. Typically, clients
try to assess consistency of one key against one or more keys, but there are
no restrictions on whether the clients holding those keys are the same.</t>
        <t>There are two different predicates for consistency, defined below.</t>
        <ul spacing="normal">
          <li>Consistency: Two key sets with the same set ID are consistent if and only if (iff) the
sets are equal.</li>
          <li>Global consistency: A key set X is globally consistent iff, for all key sets Y with the
same set ID, the X and Y are consistent.</li>
        </ul>
        <t>Checking for consistency or global consistency of two key sets (singletons or not)
consists in applying a verification function to those sets. If the two sets are consistent
and the union of those two sets is equal to the set of all possible honestly generated values,
then the union is globally consistent.</t>
        <t>Consistency checks can happen within a reliant system, i.e., as part of the protocol in
which consistency is preferred, or out of it, i.e., a separate protocol run alongside the reliant system. We refer to these
two paths as in-band and out-of-band verification. In-band verification is a check
which is invoked as part of a reliant system. This type of verification is only achieved
by participants of the reliant system. In contrast, out-of-band verifiability is a check
that happens outside of a reliant system, i.e., by entities that may not be participants
of the reliant system. Consistency verification is typically public, meaning that any entity
with two key sets can verify (global) consistency without requiring knowledge of a
cryptographic secret.</t>
        <t>Reliant systems must also consider agility when trying to achieve consistency. A naive solution to
ensuring consistent keys is to only use a single, fixed key pair for the entirety of the system.
Clients can then embed this key into software or elsewhere as needed, without any additional
mechanics or controls to ensure that other clients have a different key. However, this solution clearly
is not viable in practice. If the corresponding key is compromised, the system fails. Rotation must
therefore be supported, and in doing so, clients need some mechanism to ensure that newly rotated
keys are consistent.</t>
        <t>Operationally, servers rotating keys may likely need to accommodate distributed system
state-synchronization issues without sacrificing availability. Some systems and protocols
may choose to prioritize strong consistency over availability, but this document assumes
that availability is preferred to total consistency.</t>
      </section>
    </section>
    <section anchor="consistency-mechanisms">
      <name>Consistency Mechanisms</name>
      <t>There are a variety of ways in which reliant systems may build key consistency solutions,
with different trade-offs for operational and implementation complexity. In this section, we survey
a number of possible solutions. The viability of each varies depending on the applicable
threat model, external dependencies, and overall reliant system's requirements.</t>
      <t>In each mechanism, the client has as input a candidate key and seeks to determine
if it has a (globally) consistent version of the key.</t>
      <t>We do not include the fixed public key model from <xref target="reqs"/>, as this is likely not a viable
solution for systems and protocols in practice. In all scenarios, the server corresponding
to the desired key is considered malicious.</t>
      <section anchor="server-based">
        <name>Direct Discovery</name>
        <t>In this model, clients would directly query servers for their corresponding key, as shown below.</t>
        <figure anchor="fig-disc-direct">
          <name>Direct Discovery Example</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="312" viewBox="0 0 312 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,96" fill="none" stroke="black"/>
                <path d="M 96,32 L 96,96" fill="none" stroke="black"/>
                <path d="M 216,32 L 216,96" fill="none" stroke="black"/>
                <path d="M 304,32 L 304,96" fill="none" stroke="black"/>
                <path d="M 8,32 L 96,32" fill="none" stroke="black"/>
                <path d="M 216,32 L 304,32" fill="none" stroke="black"/>
                <path d="M 96,64 L 208,64" fill="none" stroke="black"/>
                <path d="M 8,96 L 96,96" fill="none" stroke="black"/>
                <path d="M 216,96 L 304,96" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="216,64 204,58.4 204,69.6" fill="black" transform="rotate(0,208,64)"/>
                <g class="text">
                  <text x="52" y="68">Client</text>
                  <text x="260" y="68">Server</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+----------+              +----------+
|          |              |          |
|  Client  +------------->+  Server  |
|          |              |          |
+----------+              +----------+
]]></artwork>
          </artset>
        </figure>
        <t>The properties of this mechanism depend on external mechanisms in place to ensure consistency
and whether or not the server colludes with the key source. If the server and source collude,
both can present unique per-client keys without detection.</t>
      </section>
      <section anchor="cache-based">
        <name>Shared Cache Discovery</name>
        <t>In this model, there exists a shared cache that provides keys from servers on behalf of multiple
clients, as shown below.</t>
        <figure anchor="fig-disc-proxy">
          <name>Shared Cache Discovery Example</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="424" viewBox="0 0 424 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,96" fill="none" stroke="black"/>
                <path d="M 8,128 L 8,192" fill="none" stroke="black"/>
                <path d="M 8,240 L 8,304" fill="none" stroke="black"/>
                <path d="M 96,32 L 96,96" fill="none" stroke="black"/>
                <path d="M 96,128 L 96,192" fill="none" stroke="black"/>
                <path d="M 96,240 L 96,304" fill="none" stroke="black"/>
                <path d="M 176,128 L 176,192" fill="none" stroke="black"/>
                <path d="M 192,64 L 192,120" fill="none" stroke="black"/>
                <path d="M 192,200 L 192,272" fill="none" stroke="black"/>
                <path d="M 264,128 L 264,192" fill="none" stroke="black"/>
                <path d="M 328,128 L 328,192" fill="none" stroke="black"/>
                <path d="M 416,128 L 416,192" fill="none" stroke="black"/>
                <path d="M 8,32 L 96,32" fill="none" stroke="black"/>
                <path d="M 96,64 L 192,64" fill="none" stroke="black"/>
                <path d="M 8,96 L 96,96" fill="none" stroke="black"/>
                <path d="M 8,128 L 96,128" fill="none" stroke="black"/>
                <path d="M 176,128 L 264,128" fill="none" stroke="black"/>
                <path d="M 328,128 L 416,128" fill="none" stroke="black"/>
                <path d="M 96,160 L 168,160" fill="none" stroke="black"/>
                <path d="M 264,160 L 320,160" fill="none" stroke="black"/>
                <path d="M 8,192 L 96,192" fill="none" stroke="black"/>
                <path d="M 176,192 L 264,192" fill="none" stroke="black"/>
                <path d="M 328,192 L 416,192" fill="none" stroke="black"/>
                <path d="M 8,240 L 96,240" fill="none" stroke="black"/>
                <path d="M 96,272 L 192,272" fill="none" stroke="black"/>
                <path d="M 8,304 L 96,304" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="328,160 316,154.4 316,165.6" fill="black" transform="rotate(0,320,160)"/>
                <polygon class="arrowhead" points="200,200 188,194.4 188,205.6" fill="black" transform="rotate(270,192,200)"/>
                <polygon class="arrowhead" points="200,120 188,114.4 188,125.6" fill="black" transform="rotate(90,192,120)"/>
                <polygon class="arrowhead" points="176,160 164,154.4 164,165.6" fill="black" transform="rotate(0,168,160)"/>
                <g class="text">
                  <text x="52" y="68">Client</text>
                  <text x="52" y="164">Client</text>
                  <text x="216" y="164">Cache</text>
                  <text x="372" y="164">Server</text>
                  <text x="56" y="212">x</text>
                  <text x="56" y="228">x</text>
                  <text x="52" y="276">Client</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+----------+
|          |
|  Client  +-----------+
|          |           |
+----------+           |
                       v
+----------+         +----------+       +----------+
|          |         |          |       |          |
|  Client  +-------->+  Cache   +------>+  Server  |
|          |         |          |       |          |
+----------+         +-+--------+       +----------+
      x                ^
      x                |
+----------+           |
|          |           |
|  Client  +-----------+
|          |
+----------+
]]></artwork>
          </artset>
        </figure>
        <t>The validity window of the cache's response can impact the overall consistency guarantees.
In particular, a system needs to ensure that a server cannot rotate its keys too often in order
to divide clients into smaller groups based on when keys are acquired. Such considerations are
already highlighted within the Privacy Pass ecosystem, more discussion can be found in <xref target="PRIVACY-PASS-ARCH"/>.
Setting a minimum validity period limits the ability of a server to rotate keys, but also
limits the rate of key rotation.</t>
        <t>Querying a cache for its stored copy of a key leaks information to that cache.
There are several mitigations for this leak. For example, clients could obtain the
contents of a cache and query it locally. Alternatively, clients could remotely query
the cache using privacy-preserving queries (e.g., a private information retrieval (PIR)
protocol). In the case where the cache is downloaded locally, it should be considered
stale and re-fetched periodically. The frequency of such updates can likely be infrequent
in practice, as frequent key updates or rotations may affect privacy. Downloading the
entire cache works best if there are a small number of entries, as it does not otherwise
impose bandwidth costs on each client that may be impractical.</t>
        <t>If this cache is trusted, then all clients which request a key from this server are
assured they have a consistent view of the server key compared to all other clients of
the cache. A malicious cache can introduce the following threats:</t>
        <ul spacing="normal">
          <li>The cache can collude with the server to give per-client keys to clients.</li>
          <li>The cache can give all clients a key owned by the cache, and either collude with the server to use this
key or retroactively use this key to compromise client privacy when clients later make use of the key.</li>
        </ul>
        <t>Potential mitigations for untrusted caches are described in the following sections.</t>
        <section anchor="redundancy">
          <name>Cache Redundancy</name>
          <t>There are several ways the risk of untrusted caches may be mitigated. The first of which is
via the use of multiple, non-colluding caches, as shown below.</t>
          <figure anchor="fig-disc-multi-proxy">
            <name>Multi-Cache Discovery Example</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="424" viewBox="0 0 424 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,128 L 8,192" fill="none" stroke="black"/>
                  <path d="M 56,64 L 56,128" fill="none" stroke="black"/>
                  <path d="M 56,192 L 56,272" fill="none" stroke="black"/>
                  <path d="M 96,128 L 96,192" fill="none" stroke="black"/>
                  <path d="M 176,32 L 176,96" fill="none" stroke="black"/>
                  <path d="M 176,128 L 176,192" fill="none" stroke="black"/>
                  <path d="M 176,240 L 176,304" fill="none" stroke="black"/>
                  <path d="M 264,32 L 264,96" fill="none" stroke="black"/>
                  <path d="M 264,128 L 264,192" fill="none" stroke="black"/>
                  <path d="M 264,240 L 264,304" fill="none" stroke="black"/>
                  <path d="M 328,128 L 328,192" fill="none" stroke="black"/>
                  <path d="M 368,64 L 368,120" fill="none" stroke="black"/>
                  <path d="M 368,200 L 368,272" fill="none" stroke="black"/>
                  <path d="M 416,128 L 416,192" fill="none" stroke="black"/>
                  <path d="M 176,32 L 264,32" fill="none" stroke="black"/>
                  <path d="M 56,64 L 168,64" fill="none" stroke="black"/>
                  <path d="M 264,64 L 368,64" fill="none" stroke="black"/>
                  <path d="M 176,96 L 264,96" fill="none" stroke="black"/>
                  <path d="M 8,128 L 96,128" fill="none" stroke="black"/>
                  <path d="M 176,128 L 264,128" fill="none" stroke="black"/>
                  <path d="M 328,128 L 416,128" fill="none" stroke="black"/>
                  <path d="M 96,160 L 168,160" fill="none" stroke="black"/>
                  <path d="M 264,160 L 320,160" fill="none" stroke="black"/>
                  <path d="M 8,192 L 96,192" fill="none" stroke="black"/>
                  <path d="M 176,192 L 264,192" fill="none" stroke="black"/>
                  <path d="M 328,192 L 416,192" fill="none" stroke="black"/>
                  <path d="M 176,240 L 264,240" fill="none" stroke="black"/>
                  <path d="M 56,272 L 168,272" fill="none" stroke="black"/>
                  <path d="M 264,272 L 368,272" fill="none" stroke="black"/>
                  <path d="M 176,304 L 264,304" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="376,200 364,194.4 364,205.6" fill="black" transform="rotate(270,368,200)"/>
                  <polygon class="arrowhead" points="376,120 364,114.4 364,125.6" fill="black" transform="rotate(90,368,120)"/>
                  <polygon class="arrowhead" points="328,160 316,154.4 316,165.6" fill="black" transform="rotate(0,320,160)"/>
                  <polygon class="arrowhead" points="176,272 164,266.4 164,277.6" fill="black" transform="rotate(0,168,272)"/>
                  <polygon class="arrowhead" points="176,160 164,154.4 164,165.6" fill="black" transform="rotate(0,168,160)"/>
                  <polygon class="arrowhead" points="176,64 164,58.4 164,69.6" fill="black" transform="rotate(0,168,64)"/>
                  <g class="text">
                    <text x="216" y="68">Cache</text>
                    <text x="52" y="164">Client</text>
                    <text x="216" y="164">Cache</text>
                    <text x="372" y="164">Server</text>
                    <text x="224" y="212">x</text>
                    <text x="224" y="228">x</text>
                    <text x="216" y="276">Cache</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
                     +----------+
                     |          |
      +------------->+  Cache   +------------+
      |              |          |            |
      |              +----------+            |
      |                                      v
+-----+----+         +----------+       +----+-----+
|          |         |          |       |          |
|  Client  +-------->+  Cache   +------>+  Server  |
|          |         |          |       |          |
+-----+----+         +----------+       +----+-----+
      |                    x                 ^
      |                    x                 |
      |              +----------+            |
      |              |          |            |
      +------------->+  Cache   +------------+
                     |          |
                     +----------+
]]></artwork>
            </artset>
          </figure>
          <t>This mechanism provides consistency across all clients that share the same set of caches.</t>
        </section>
        <section anchor="confirmation">
          <name>Cache Confirmation</name>
          <t>If no other caches are available, clients may attempt to confirm the key provided by the
cache directly with the server, as shown in the figure below.</t>
          <figure anchor="fig-disc-shared-proxy">
            <name>Shared Proxy with Confirmation Discovery Example</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="432" viewBox="0 0 432 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,32 L 8,96" fill="none" stroke="black"/>
                  <path d="M 8,128 L 8,288" fill="none" stroke="black"/>
                  <path d="M 8,336 L 8,400" fill="none" stroke="black"/>
                  <path d="M 96,32 L 96,96" fill="none" stroke="black"/>
                  <path d="M 96,128 L 96,288" fill="none" stroke="black"/>
                  <path d="M 96,336 L 96,400" fill="none" stroke="black"/>
                  <path d="M 176,128 L 176,192" fill="none" stroke="black"/>
                  <path d="M 176,224 L 176,240" fill="none" stroke="black"/>
                  <path d="M 176,272 L 176,288" fill="none" stroke="black"/>
                  <path d="M 192,64 L 192,120" fill="none" stroke="black"/>
                  <path d="M 192,296 L 192,368" fill="none" stroke="black"/>
                  <path d="M 272,128 L 272,192" fill="none" stroke="black"/>
                  <path d="M 272,224 L 272,240" fill="none" stroke="black"/>
                  <path d="M 272,272 L 272,288" fill="none" stroke="black"/>
                  <path d="M 336,128 L 336,288" fill="none" stroke="black"/>
                  <path d="M 424,128 L 424,288" fill="none" stroke="black"/>
                  <path d="M 8,32 L 96,32" fill="none" stroke="black"/>
                  <path d="M 96,64 L 192,64" fill="none" stroke="black"/>
                  <path d="M 8,96 L 96,96" fill="none" stroke="black"/>
                  <path d="M 8,128 L 96,128" fill="none" stroke="black"/>
                  <path d="M 176,128 L 272,128" fill="none" stroke="black"/>
                  <path d="M 336,128 L 424,128" fill="none" stroke="black"/>
                  <path d="M 96,160 L 168,160" fill="none" stroke="black"/>
                  <path d="M 272,160 L 328,160" fill="none" stroke="black"/>
                  <path d="M 176,192 L 272,192" fill="none" stroke="black"/>
                  <path d="M 176,224 L 272,224" fill="none" stroke="black"/>
                  <path d="M 96,254 L 192,254" fill="none" stroke="black"/>
                  <path d="M 96,258 L 192,258" fill="none" stroke="black"/>
                  <path d="M 264,254 L 328,254" fill="none" stroke="black"/>
                  <path d="M 264,258 L 328,258" fill="none" stroke="black"/>
                  <path d="M 8,288 L 96,288" fill="none" stroke="black"/>
                  <path d="M 176,288 L 272,288" fill="none" stroke="black"/>
                  <path d="M 336,288 L 424,288" fill="none" stroke="black"/>
                  <path d="M 8,336 L 96,336" fill="none" stroke="black"/>
                  <path d="M 96,368 L 192,368" fill="none" stroke="black"/>
                  <path d="M 8,400 L 96,400" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="336,256 324,250.4 324,261.6" fill="black" transform="rotate(0,328,256)"/>
                  <polygon class="arrowhead" points="336,160 324,154.4 324,165.6" fill="black" transform="rotate(0,328,160)"/>
                  <polygon class="arrowhead" points="200,296 188,290.4 188,301.6" fill="black" transform="rotate(270,192,296)"/>
                  <polygon class="arrowhead" points="200,120 188,114.4 188,125.6" fill="black" transform="rotate(90,192,120)"/>
                  <polygon class="arrowhead" points="176,160 164,154.4 164,165.6" fill="black" transform="rotate(0,168,160)"/>
                  <g class="text">
                    <text x="52" y="68">Client</text>
                    <text x="52" y="164">Client</text>
                    <text x="224" y="164">Cache</text>
                    <text x="380" y="164">Server</text>
                    <text x="224" y="260">Proxy</text>
                    <text x="56" y="308">x</text>
                    <text x="56" y="324">x</text>
                    <text x="52" y="372">Client</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
+----------+
|          |
|  Client  +-----------+
|          |           |
+----------+           |
                       v
+----------+         +-----------+       +----------+
|          |         |           |       |          |
|  Client  +-------->+   Cache   +------>+  Server  |
|          |         |           |       |          |
|          |         +-----------+       |          |
|          |                             |          |
|          |         +-----------+       |          |
|          |         |           |       |          |
|          +============ Proxy  ========>+          |
|          |         |           |       |          |
+----------+         +-+---------+       +----------+
      x                ^
      x                |
+----------+           |
|          |           |
|  Client  +-----------+
|          |
+----------+
]]></artwork>
            </artset>
          </figure>
          <t>Ideally, clients confirm with the server via some anonymizing proxy. Examples of proxies
include anonymous systems such as Tor. Tor proxies are general purpose and operate
at a lower layer, on arbitrary communication flows, and therefore they are oblivious
to clients fetching keys. Untrusted proxies that are aware of key fetch
requests (<xref target="cache-based"/>) may be used in a similar way. Depending on how clients
fetch such keys from servers, it may become more difficult for servers to uniquely
target individual clients with unique keys without detection. This is especially true
as the number of clients of these anonymity networks increases. However, beyond
Tor, there does not exist a special-purpose anonymity network for this purpose.</t>
        </section>
        <section anchor="transparency">
          <name>Cache Transparency</name>
          <t>If redundancy is not viable or feasible for a particular deployment, consistency
guarantees may also be improved through transparency systems, i.e., those based
on tamper-proof, publicly verifiable data structures. Examples of this type of
system are below.</t>
          <ul spacing="normal">
            <li>An append-only, audited log similar to that of Certificate Transparency <xref target="RFC6962"/>. The log is operated
and audited in such a way that the contents of the log are consistent for all clients. Any reliant system
which depends on this type of KCCS requires the log be audited or clients have some other mechanism for
checking their view of the log state (gossiping). However, this type of system does not ensure proactive
security against malicious servers unless log participants actively check log proofs. This requirement
may impede deployment in practice. Experience with Certificate Transparency shows
that most implementations have chosen not to check SignedCertificateTimestamps before
using (that is, accepting as valid) a corresponding TLS certificate.</li>
            <li>A consensus-based log whose assertions are created by a coalition of entities that periodically agree on
the correct binding of server names and key material. In this model the agreement is achieved via a consensus
protocol, but the specific consensus protocol is dependent on the implementation.</li>
          </ul>
        </section>
      </section>
      <section anchor="key-limits">
        <name>Key Limits</name>
        <t>Consistency may also be improved by forcibly limiting the number of keys that an attacker can feasibly
use for targeting particular clients. One way to implement this limit is via key-based encryption,
which is a procedure where a client encrypt the information that it sends to a server, such as a token
or signed object generated with the server keys. This encryption uses a key derived from the key
configuration, specifically not including any form of key identifier along with the encrypted
information. If key derivation for the encryption uses a pre-image resistant function (like HKDF),
the server can only decrypt the information only if it either knows the key configuration or can guess it. As there is no
information the server can use to identify which key was used, it is forced to perform trial
decryption if it wants to use multiple keys.</t>
        <t>These costs are only linear in terms of the number of active keys. This doesn't prevent the use of
multiple keys; it only makes their use incrementally more expensive. Adding a nonce with sufficient
entropy might be used to force key derivation for every message. Using a time- or memory-hard key
derivation function such as <xref target="ARGON2"/> can then be used to increase the cost
of trial decryption.</t>
        <t>Encrypting this way could provide better latency properties than a separate check.</t>
      </section>
    </section>
    <section anchor="future-work">
      <name>Future Work</name>
      <t>The model in <xref target="redundancy"/> seems to be the most lightweight and easy-to-deploy mechanism for
ensuring key consistency and correctness. However, it remains unclear if there exists such an
anonymity network that can scale to the widespread adoption of and requirements of protocols like
Privacy Pass, Oblivious DoH, or Oblivious HTTP. Also, using such a network carries its own set
of risks for clients (as described in <xref target="redundancy"/>), so in some cases it might be impractical.
Existing infrastructure based on technologies like Certificate Transparency or Key Transparency
may work, but there is currently no general purpose system for transparency of opaque keys (or
other application data).</t>
    </section>
    <section anchor="sec">
      <name>Security Considerations</name>
      <t>This document discusses several models that systems might use to implement public key discovery
while ensuring key consistency and correctness. It does not make any recommendations for such
models as the best model depends on differing operational requirements and threat models.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <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="RFC6962">
          <front>
            <title>Certificate Transparency</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Kasper" initials="E." surname="Kasper"/>
            <date month="June" year="2013"/>
            <abstract>
              <t>This document describes an experimental protocol for publicly logging the existence of Transport Layer Security (TLS) certificates as they are issued or observed, in a manner that allows anyone to audit certificate authority (CA) activity and notice the issuance of suspect certificates as well as to audit the certificate logs themselves. The intent is that eventually clients would refuse to honor certificates that do not appear in a log, effectively forcing CAs to add all issued certificates to the logs.</t>
              <t>Logs are network services that implement the protocol operations for submissions and queries that are defined in this document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6962"/>
          <seriesInfo name="DOI" value="10.17487/RFC6962"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="ODOH">
          <front>
            <title>Oblivious DNS over HTTPS</title>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear"/>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="T. Verma" initials="T." surname="Verma"/>
            <author fullname="C.A. Wood" initials="C.A." surname="Wood"/>
            <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>
        <reference anchor="PRIVACY-PASS">
          <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="26" month="June" 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-11"/>
        </reference>
        <reference anchor="PRIVACY-PASS-ARCH">
          <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="15" month="June" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for constructing
   privacy-preserving authentication mechanisms.  It provides
   recommendations on how the architecture should be deployed to ensure
   the privacy of clients and the security of all participating
   entities.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-13"/>
        </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="15" month="March" year="2023"/>
            <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>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-ohttp-08"/>
        </reference>
        <reference anchor="DOUBLECHECK">
          <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="ARGON2">
          <front>
            <title>Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications</title>
            <author fullname="Alex Biryukov" initials="A." surname="Biryukov">
              <organization>University of Luxembourg</organization>
            </author>
            <author fullname="Daniel Dinu" initials="D." surname="Dinu">
              <organization>University of Luxembourg</organization>
            </author>
            <author fullname="Dmitry Khovratovich" initials="D." surname="Khovratovich">
              <organization>ABDK Consulting</organization>
            </author>
            <author fullname="Simon Josefsson" initials="S." surname="Josefsson">
              <organization>SJD AB</organization>
            </author>
            <date day="11" month="March" year="2021"/>
            <abstract>
              <t>This document describes the Argon2 memory-hard function for password hashing and proof-of-work applications.  We provide an implementer-oriented description with test vectors.  The purpose is to simplify adoption of Argon2 for Internet protocols.  This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.
              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-argon2-13"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9Vc63IbN5b+30+BtX+MtBaVsSc1O9FOLopkx6rYkcdSNpPa
2q0Cu0ESq2aDaXSLYhzlWfZZ9sn2O+cAaDRJ2c5efkQ144ggrgfn8p0LNJlM
is52tTlR35qNOnONt74zTblRuqnUufWluzXtptDTaWtuP9SrcmWjl5isavWs
m1jTzSar1t7qcrPS3k9uzGZSDqMnf3xaVLozJ0WJf+eu3Zwo28xcUWClPxWP
lW6NPlFXpuxb223QsHbtzbx1/epE/fBNcWuaHoMfKzW04UO3WWELP6Crbebq
G/qKmpfa1tTlK3Onl6vaHJduSe26LRcnatF1K3/yySfZl59gOkxtu0U/PVGP
ykVr/WTtXPXJ1jkeoVuNE/gO3eJEQ/djmeLYuu2Bn3wcnY4X3bJ+VKAV569O
CjVRoTf9mnWUj21ryq4x3vPHdrPqHP02rV15Uy60bYpC993CtTQTtq5AdH+i
To/Vub61lXcNN8pNntbmbtzu2vmJ+rrVt0ZduVm3xiVxuxECaww4rsKAz559
NadmpnW+2Otj9cI2N6bOlnqtu25h1vkXvNb1wqhr16o3rfsPnCxfzG98+9P0
q861K/nyGCO2F7peuOX4UK9129lm9AWv9Nr9bOta5yssu69qtzZN17rV5rgx
3Wj2s2Mi2w+45Gz2M7r5zq0Wph19y0uc1a6vZnUkmu9aY8A2T//4FGdcN95A
oK7kjCV4HtyvG/Wi1U1JUibtrsd28NX3je0MdSfeU26mTpemteVo/6Vef7Uw
egVRmNrO8wmKxrVL3dlbCA/JW/qg1OX55csT9fbF2WfP/vRHfH7z9uJfTs9+
nLw5vbo6UReT8+MdZgXlO1e6eqv35PTt2csHhpDIYetl1zMZLl9eX7/Jujow
Kf6BIOHL88vvv371/Ozl87NvpYsvF+C57mfplquTyvXT2pQLU94UxWQyUXoK
+mqwTHG9sF5BPfVLXKWqjC9bOwXRwHC5AKnW/NTb1lAvpmg8nFe+LxdK++KN
nEO9wUGO1OW0trfW9V6du5dHrA6HJjqWAnlV78EKgQDH6qLD78bTEkVlZha3
aLEF7llu6Vbsr8HS7a3ZeLXE2XRj/VL6Ym+QMtJxuQoAX9/qdkPN3QL6s1NL
V5naY92GOpZ1j+OrNXSSqsBTvfdYnc7qVlgLk4KGWAHzdEQ00sHHQs6lrara
FFCaFyQPVV/SxoviykD765rGrpwHR4ajTkyzIMbFVnboqHI6Fu/e5axzf79F
WPXuHTEmte+hML6k/97fx9srytryBXZOuWkHjcfDcAtKqxV4xJYKypSJaO5g
XegYUEj8kdX/0Xh7wximB81UqelGxXXWdEvW+56OSku1pjJmyXfgbky4W924
ZrPEtoP6tT9rWXh8VhrP55o6XBFtOl8eR8I1k1IHO3iv58YXaMO5SKeVPTSL
ArfhQnBp8RB8l+A40pcdXW5lcNcVOLxJZ+i9bF7R5tBiySZXTKduQVykm81R
YWeqcR2UfH2ksD2w9TDegMVm2Im0qLUBpbA1WCMD7TImPU+5hjj5lSntDK3o
ifmWmLbFEMitLWl9PptfYkEcqyM2DQseiWwQfdDI88n8ZCdJR9a4onBVmKQ2
ugUVdDs3NG1Se6CAnrq+E03AU5Ok8Ld1jRMLXehbD+3Om4dUtGZmYGdlf17J
koPBZptVmTmUO/VYLyyYPmy8oC2nzp1ca4VdtWCYoJLMHX+VhoZTjm6Z19RN
AdMK6VpadMFQ2+JsFdip6lkig84Z6z/RHIaWHasfzFnkKojJWuoVKWov+oBU
iFl14K5zZiKijmP+YuDFNzTMwLdE+tbOocdWujS8zrS3NY/cIlzhXd3LdnA0
ur+abmx7/1Eh+qB4QIIlXeQKB9PQ/ywmmOoWSxS866DWWLge1v6kwAwILF/h
c9+uXMv3EEim+qYybQENy/I61rBkZowMilyZ7xq/d2s3c3V1og6eHqYpNUiC
aYUZ+xX+kUuHgVw0EMN6lypBasB/dCBzq+uepFXU48GzQ7Ww80WN/+P2FuBj
00BPkBpIhEdHGJ9V7TZ7rkENC1oyCTChtjQ43+PH6m1mIeXANJiAqVePXn9/
df3oSP6rvrvk398+/9v3F2+fn9PvVy9PX71KvxShx9XLy+9fnQ+/DSPPLl+/
fv7duQxGqxo1FY9en/74SA796PLN9cXld6evHiXLlQivRRGBbraBmMH4kgrQ
ZH2FE0gfqK/P3vzXfz79FObkH4B/nj19+hksinz4y9N/+hQfSM3Laq6pN+Ej
MUoBzoN+oVlIUUFgbKdrqCioBr8ArFPQlES/f/xXosy/nai/TsvV00+/CA10
4FFjpNmokWm227IzWIi4p2nPMomao/YtSo/3e/rj6HOke9b41y9raDI1efqX
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
o/fpRwAA

-->

</rfc>
