<?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.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-key-consistency-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.1 -->
  <front>
    <title abbrev="Key Consistency and Discovery">Key Consistency and Discovery</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-key-consistency-00"/>
    <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="2022" month="October" day="24"/>
    <keyword>privacy</keyword>
    <keyword>consistency</keyword>
    <keyword>correctness</keyword>
    <keyword>crypto</keyword>
    <keyword>blockchain</keyword>
    <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>
    <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>
    <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 for validating privately issued tokens for
anonymous session resumption. Oblivious DoH and HTTP both use public keys to
encrypt messages to a particular server.</t>
      <t>User privacy in these systems depends on users receiving a key that many, if not
all, other users receive.  If a user were to receive a public key that was
specific to them, or restricted to a small set of users, then use of that public
key could be used to learn targeted information about the user.  Users
also need to receive the correct public key.</t>
      <t>In this document, we elaborate on these core requirements, and survey various system designs that might
be used to satisfy them. The purpose of this document is to highlight challenges in building and deploying
solutions to this problem.</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>
      </section>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>This document defines the following terms:</t>
      <dl>
        <dt>Key Consistency and Correctness System (KCCS):</dt>
        <dd>
          <t>A mechanism for providing clients with a consistent view of cryptographic key material within a period of time.</t>
        </dd>
        <dt>Reliant System:</dt>
        <dd>
          <t>A system that embeds one or more key consistency and correctness systems.</t>
        </dd>
      </dl>
      <t>The KCCS's consistency model is dependent on the implementation and reliant system's threat model.</t>
    </section>
    <section anchor="reqs">
      <name>Core Requirements</name>
      <t>Privacy-focused protocols which rely on widely shared public keys typically
require keys be consistent and correct. Informally, key consistency is the
requirement that all users who communicate with an entity share the same view
of the key associated with that entity; key correctness is that the key's
secret information is controlled by the intended entity and is not known to be
available to an external attacker.</t>
      <t>Some protocols depend on large sets of users with consistent keys for privacy
reasons. Specifically, all users with a consistent key represent an anonymity
set wherein each user of the key in that set is indistinguishable from the
rest. An attacker that can actively cause inconsistent views of keys can
therefore compromise user privacy.</t>
      <t>An attacker that can cause a user to use an incorrect key will likely compromise
the entire protocol, not just privacy.</t>
      <t>Reliant systems must also consider agility when trying to satisfy these requirements. A naive solution to
ensuring consistent and correct keys is to only use a single, fixed key pair for the entirety of
the system. Users can then embed this key into software or elsewhere as needed, without any additional
mechanics or controls to ensure that other users 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, users need some mechanism to ensure that newly rotated
keys are consistent and correct.</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 anchor="consistency-and-correctness-at-key-acquisition">
      <name>Consistency and Correctness at Key Acquisition</name>
      <t>There are a variety of ways in which reliant systems may build key consistency and correct systems (KCCS),
ranging in operational complexity to ease-of-implementation. 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>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, users would directly query servers for their corresponding public 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">
                <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 solution depend on external mechanisms in place to ensure consistency or
correctness. Absent any such mechanisms, servers can produce unique keys for users without detection.
External mechanisms to ensure consistency here might include, though are not limited to:</t>
        <ul spacing="normal">
          <li>Presenting a signed assertion from a trusted entity that the key is correct.</li>
          <li>Presenting proof that the key is present in some tamper-proof log, similar to Certificate
Transparency (<xref target="RFC6962"/>) logs.</li>
          <li>User communication or gossip ensuring that all users have a shared view of the key.</li>
        </ul>
        <t>The precise external mechanism used here depends largely on the threat model. If there is a trusted
external log for keys, this may be a viable solution.</t>
      </section>
      <section anchor="proxy-based">
        <name>Trusted Proxy Discovery</name>
        <t>In this model, there exists a trusted proxy that fetches keys from servers on behalf of multiple users, as shown
below.</t>
        <figure anchor="fig-disc-proxy">
          <name>Single Proxy 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">
                <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">Proxy</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  +-------->+  Proxy   +------>+  Server  |
|          |         |          |       |          |
+----------+         +-+--------+       +----------+
      x                ^
      x                |
+----------+           |
|          |           |
|  Client  +-----------+
|          |
+----------+
]]></artwork>
          </artset>
        </figure>
        <t>If this proxy is trusted, then all users which request a key from this server are assured they have
a consistent view of the server key. However, if this proxy is not trusted, operational risks may arise:</t>
        <ul spacing="normal">
          <li>The proxy can collude with the server to give per-user keys to clients.</li>
          <li>The proxy can give all users a key owned by the proxy, and either collude with the server to use this
key or retroactively use this key to compromise user privacy when users later make use of the key.</li>
        </ul>
        <t>Mitigating these risks can be done in a variety of ways. For example, clients may demand tamper-proof
proof evidence that the key is consistent and correct for the server, using techniques described in <xref target="server-based"/>.
Clients may gossip amongst themselves to determine if they are being served different keys.
Alternatively, the clients may attempt to confirm the key provided by the proxy, as described in <xref target="shared-proxy-with-confirmation"/>.</t>
      </section>
      <section anchor="shared-proxy-with-confirmation">
        <name>Shared Proxy with Key Confirmation</name>
        <t>Clients that retrieve keys through a single proxy can directly confirm the correctness of this key
provided by the proxy by "checking" with the server. One variant of this checking mechanism is
described in <xref target="DOUBLECHECK"/>. Briefly, clients connect directly to the server through some proxy
(so as to hide their identity) and ask for the key. If this key does not match that provided by the
shared proxy, the clients conclude that the key is malicious. This is shown in <xref target="fig-disc-shared-proxy"/>.</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="352" width="432" viewBox="0 0 432 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 8,32 L 8,96" fill="none" stroke="black"/>
                <path d="M 8,128 L 8,224" fill="none" stroke="black"/>
                <path d="M 8,272 L 8,336" fill="none" stroke="black"/>
                <path d="M 96,32 L 96,96" fill="none" stroke="black"/>
                <path d="M 96,128 L 96,224" fill="none" stroke="black"/>
                <path d="M 96,272 L 96,336" fill="none" stroke="black"/>
                <path d="M 176,128 L 176,176" fill="none" stroke="black"/>
                <path d="M 176,208 L 176,224" fill="none" stroke="black"/>
                <path d="M 192,64 L 192,120" fill="none" stroke="black"/>
                <path d="M 192,232 L 192,304" fill="none" stroke="black"/>
                <path d="M 272,128 L 272,176" fill="none" stroke="black"/>
                <path d="M 272,208 L 272,224" fill="none" stroke="black"/>
                <path d="M 336,128 L 336,224" fill="none" stroke="black"/>
                <path d="M 424,128 L 424,224" 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 96,190 L 328,190" fill="none" stroke="black"/>
                <path d="M 96,194 L 328,194" fill="none" stroke="black"/>
                <path d="M 8,224 L 96,224" fill="none" stroke="black"/>
                <path d="M 176,224 L 272,224" fill="none" stroke="black"/>
                <path d="M 336,224 L 424,224" fill="none" stroke="black"/>
                <path d="M 8,272 L 96,272" fill="none" stroke="black"/>
                <path d="M 96,304 L 192,304" fill="none" stroke="black"/>
                <path d="M 8,336 L 96,336" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="336,192 324,186.4 324,197.6" fill="black" transform="rotate(0,328,192)"/>
                <polygon class="arrowhead" points="336,160 324,154.4 324,165.6" fill="black" transform="rotate(0,328,160)"/>
                <polygon class="arrowhead" points="200,232 188,226.4 188,237.6" fill="black" transform="rotate(270,192,232)"/>
                <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="220" y="148">Shared</text>
                  <text x="52" y="164">Client</text>
                  <text x="224" y="164">Proxy</text>
                  <text x="380" y="164">Server</text>
                  <text x="56" y="244">x</text>
                  <text x="56" y="260">x</text>
                  <text x="52" y="308">Client</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+----------+
|          |
|  Client  +-----------+
|          |           |
+----------+           |
                       v
+----------+         +-----------+       +----------+
|          |         |  Shared   |       |          |
|  Client  +-------->+   Proxy   +------>+  Server  |
|          |         |           |       |          |
|          +============================>+          |
|          |         |           |       |          |
+----------+         +-+---------+       +----------+
      x                ^
      x                |
+----------+           |
|          |           |
|  Client  +-----------+
|          |
+----------+
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="anon-discovery">
        <name>Multi-Proxy Discovery</name>
        <t>In this model, users leverage multiple, non-colluding proxies to fetch keys from servers, as shown below.</t>
        <figure anchor="fig-disc-multi-proxy">
          <name>Multi-Proxy 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">
                <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">Proxy</text>
                  <text x="52" y="164">Client</text>
                  <text x="216" y="164">Proxy</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">Proxy</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                     +----------+
                     |          |
      +------------->+  Proxy   +------------+
      |              |          |            |
      |              +----------+            |
      |                                      v
+-----+----+         +----------+       +----+-----+
|          |         |          |       |          |
|  Client  +-------->+  Proxy   +------>+  Server  |
|          |         |          |       |          |
+-----+----+         +----------+       +----+-----+
      |                    x                 ^
      |                    x                 |
      |              +----------+            |
      |              |          |            |
      +------------->+  Proxy   +------------+
                     |          |
                     +----------+
]]></artwork>
          </artset>
        </figure>
        <t>These proxies are ideally spread across multiple vantage points. 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. A large set of untrusted
proxies that are aware of key fetch requests (<xref target="proxy-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 users with unique keys without detection.
This is especially true as the number of users of these anonymity networks increases. However, beyond
Tor, there does not exist a special-purpose anonymity network for this purpose.</t>
        <t>Note that connecting to Tor proxies may not be a viable option (indeed, could even be dangerous) for
clients operating in managed networks which scrutinize and/or ban Tor traffic.</t>
      </section>
      <section anchor="external-db-based">
        <name>Database Discovery</name>
        <t>In this model, servers publish keys in an external database and clients fetch keys from the database, as shown below.</t>
        <figure anchor="fig-disc-database">
          <name>Database 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">
                <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 272,160 L 328,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="280,160 268,154.4 268,165.6" fill="black" transform="rotate(180,272,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="220" y="164">Database</text>
                  <text x="372" y="164">Server</text>
                  <text x="48" y="212">x</text>
                  <text x="48" y="228">x</text>
                  <text x="52" y="276">Client</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+----------+
|          |
|  Client  +-----------+
|          |           |
+----------+           |
                       v
+----------+         +-+--------+       +----------+
|          |         |          |       |          |
|  Client  +-------->+ Database +<------+  Server  |
|          |         |          |       |          |
+----------+         +-+--------+       +----------+
     x                 ^
     x                 |
+----------+           |
|          |           |
|  Client  +-----------+
|          |
+----------+
]]></artwork>
          </artset>
        </figure>
        <t>The database is expected to have a table that asserts mappings between server names and keys. Examples
of such databases are as follows:</t>
        <ul spacing="normal">
          <li>An append-only, audited table 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 users. Any reliant system
which depends on this type of KCCS requires the log be audited or users 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 table 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>
        <t>For privacy, users should either download the entire database and query it locally, or remotely query the database
using privacy-preserving queries (e.g., a private information retrieval (PIR) protocol). In the case where the
database 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; see <xref target="validity-periods"/> for details.
Downloading the entire database 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>
      </section>
    </section>
    <section anchor="validity-periods">
      <name>Minimum Validity Periods</name>
      <t>In addition to ensuring that there is one key at any time, or a limited number keys, any 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 at <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>
    </section>
    <section anchor="separate-consistency-verification">
      <name>Separate Consistency Verification</name>
      <t>The other schemes described here all attempt to directly limit the number of keys that a client
might accept.  However, by changing how keys are used, clients can impose costs on servers that
might discourage key diversity.</t>
      <t>Protocols that have distinctly separate processes for acquiring and using keys might benefit from
moving consistency checks to the usage part of the protocol.  Correctness might be guaranteed
through a relatively simple process, such obtaining keys directly from a server.  A separate
correctness check is then applied before keys are used.</t>
      <section anchor="civ">
        <name>Independent Verification</name>
        <t>Anonymous queries to verify key consistency can be used prior to use of keys.  A request for the
current key (or limited set of keys) will reveal if the key that was acquired is different than the
original.  If the key that was originally obtained is not included, the client can abort any use of
the key.</t>
        <t>It is important that any validation process not carry any information that might tie it to the
original key discovery process or that the system providing verification be trusted.  A proxy (see
<xref target="proxy-based"/>) might be sufficient for providing anonymity, though more robust anonymity
protections (see <xref target="anon-discovery"/>) could provide stronger guarantees.  Querying a database (see
<xref target="external-db-based"/>) might provide independent verification if that database can be trusted not to
provide answers that change based on client identity.</t>
      </section>
      <section anchor="kbe">
        <name>Key-Based Encryption</name>
        <t>Key-based encryption has 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 if it knows the key configuration.  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="anon-discovery"/> 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="anon-discovery"/>), 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">
              <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="RFC6962">
          <front>
            <title>Certificate Transparency</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie">
              <organization/>
            </author>
            <author fullname="A. Langley" initials="A." surname="Langley">
              <organization/>
            </author>
            <author fullname="E. Kasper" initials="E." surname="Kasper">
              <organization/>
            </author>
            <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="Eric Kinnear" initials="E." surname="Kinnear">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Patrick McManus" initials="P." surname="McManus">
              <organization>Fastly</organization>
            </author>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Tanya Verma" initials="T." surname="Verma">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="17" month="February" 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.

 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="Internet-Draft" value="draft-pauly-dprive-oblivious-doh-11"/>
        </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="Armando Faz-Hernández" initials="A." surname="Faz-Hernández">
              <organization>Cloudflare</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="6" month="July" year="2022"/>
            <abstract>
              <t>   This document specifies two variants of the the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable, and another that produces tokens that are
   publicly verifiable.  The privately verifiable issuance protocol
   optionally supports public metadata during the issuance flow.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-06"/>
        </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="17" month="October" year="2022"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for constructing
   anonymous-credential 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-08"/>
        </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="26" month="September" year="2022"/>
            <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-05"/>
        </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:
H4sIAAAAAAAAA9Vc63IjN3b+30+ByD88kxHpHce1ieW1Y1ma8ajssWZHsl2u
VFIFdoMkVs0G3eiWRMvys+RZ8mT5zjkAGk1SmnFlq5xV+SI10QDOwbl85wJO
JpOis11tjtQ3ZqNOXOOt70xTbpRuKnVqfemuTbsp9GzWmut3japc2egVJqta
Pe8m1nTzybq117rcrLX3kyuzmZTD25M//amodGeOihL/Xbh2c6RsM3dFgZX+
pfhA6dboI3Vhyr613QYPblx7tWhdvz5SP35dXJumx8sfKDU8wx/dZo0t/Iih
tlmor+kjerzStqYhX5pbvVrXZlq6FT3Xbbk8UsuuW/ujjz7KPvwI02Fq2y37
2ZE6KJet9ZMb56qPtug4wLAaFPgOw+JEw/CpTDG1bvvFj96PT9Nlt6oPCjwF
/dVRoSYqjKZfs4HyZ9uasmuM9/xnu1l3jn6b1a68KpfaNkWh+27pWpoJW1dg
uj9Sx1N1qq9t5V3DD+Ukj2tzO37u2sWR+qrV10ZduHl3g0Pi50YYrPHCtAov
fPrxlwt6zLzOF3s9VS9tc2XqbKnXuuuW5ib/gNe6XBp16Vr1pnV/A2X5Yn7j
259nX3auXcuHU7yxvdDl0q3GRL3WbWeb0Qe80mv3i61rna+w6r6s3Y1putat
N9PGdKPZT6bEth9xyNnsJ3TynVsvTTv6lJc4qV1fzevINN+1xkBsnv/pOWi8
abyBQl0IjSVkHtKvG/Wy1U1JWibPXY/t4KPvG9sZGk6yp9xcHa9Ma8vR/kt9
8+XS6DVUYWY7zxQUjWtXurPXUB7St/SHUuen56+O1NnkdLrWfb2ZVCRoZuJm
tb22rveTyi0x7M3bsx+OT36avDm+uJDhOzKMA+lc6eqt0ZPjtyevHniFNBEU
lV3P3Dl/dXn5JhvqILv4D/QLH56ef//Vty9OXr04+UaG+HIJUex+kWG5lalc
P6tNuTTlVVFMJhOlZ2C7hiQVl0vrFaxWv8IJq8r4srUz8BJyqKBuuW6xqcuU
S7Xm5962ht5k5keCvfJ9uVTaF2+ENvUGxB2q88hDdepeHfJ0wyMiVeEkVO8h
NYEpU3WGTeHce++xKW9gZHWtVqBFN9avfEGTYN218xrr0vum0ZgUdi+fCMKq
rnW7oefdEka1UytXmdpjhYaILOsexKsbGKq4oIVigCq3Ng0tAQ6uPM3TEcvI
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

-->

</rfc>
