<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.15 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wood-key-consistency-03" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.1 -->
  <front>
    <title abbrev="Key Consistency and Discovery">Key Consistency and Discovery</title>
    <seriesInfo name="Internet-Draft" value="draft-wood-key-consistency-03"/>
    <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="August" day="17"/>
    <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-wood-key-consistency.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-wood-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">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Patrick McManus">
              <organization>Fastly</organization>
            </author>
            <author fullname="Tommy Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Tanya Verma">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Christopher A. 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="Sofía Celi">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Alex Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Steven Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. 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>Privacy Pass Architectural Framework</title>
            <author fullname="Alex Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="5" month="August" year="2022"/>
            <abstract>
              <t>   This document specifies the architectural framework for constructing
   secure and anonymity-preserving instantiations of the Privacy Pass
   protocol.  It provides recommendations on how the protocol ecosystem
   should be constructed 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-06"/>
        </reference>
        <reference anchor="OHTTP">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="8" month="August" 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-03"/>
        </reference>
        <reference anchor="DOUBLECHECK">
          <front>
            <title>Key Consistency for Oblivious HTTP by Double-Checking</title>
            <author fullname="Benjamin M. Schwartz">
              <organization>Google LLC</organization>
            </author>
            <date day="1" month="July" year="2022"/>
            <abstract>
              <t>   The assurances provided by Oblivious HTTP depend on the client's
   ability to verify that it is using the same Gateway, Target, and
   KeyConfig as many other users.  This specification defines a protocol
   to enable this verification.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schwartz-ohai-consistency-doublecheck-02"/>
        </reference>
        <reference anchor="ARGON2">
          <front>
            <title>Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications</title>
            <author fullname="Alex Biryukov">
              <organization>University of Luxembourg</organization>
            </author>
            <author fullname="Daniel Dinu">
              <organization>University of Luxembourg</organization>
            </author>
            <author fullname="Dmitry Khovratovich">
              <organization>ABDK Consulting</organization>
            </author>
            <author fullname="Simon 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+BVX7EHovMOJOa3SiT2SiSHasSRx5LSSq1
tVsFdoMkRs0G0+iWxCjKs+yz7JPtd84B0GiSkp3aqcqOKhepiQZwDs7lOxdw
MpkUne1qc6S+Nht14hpvfWeacqN0U6lT60t3bdpNoWez1ly/a1TlykavMFnV
6nk3uXGumlyZzaQc3pj88U9FpTtzVJT478K1myNlm7krCsz+p+IDpVujj9SF
KfvWdhs8uHHt1aJ1/fpI/fBVcW2aHi9/oNTwDH90mzWW/QFDbbNQX9FH9Hil
bU1DvjC3erWuzbR0K3qu23J5pJZdt/ZHH32UffgRpsPUtlv2syN1UC5b65mO
j7boOMCwGhT4DsPiRMPwqUwxtW77xY8e5s102a3qgwJPQXN1VKiJWrf2Wpcb
+jUbKH+2rSm7xnjPf7abdefot1ntyqtyqW1TFLrvlq6lmbBdBUb7I3U8Vaf6
2lbeNfxQTuy4Nrfj565dHKkvW31t1IWbdzc4GH5uhKkaL0yr8MKnH3+xoMfM
33yx11P10jZXps6Weq27bmlu8g94rculUZeuVW9a93dQli/mN779afZF59q1
fDjFG9sLXS7dakzUa912thl9wCu9dj/butb5Cqvui9rdmKZr3XozbUw3mv1k
Smz7AWeWzX5Cp9259dK0o095iZPa9dW8jkzzXWsMROX5H5+DxpvGGyjOhdBY
Qs4h8bpRL1vdlKRN8tz12A4++q6xnaHhJG/KzdXxyrS2HO2/1DdfLI1eQ/xn
tvNMQdG4dqU7ew2FIR1Lfyh1fnr+6kidTU6na93Xm0lFgmYmblbba+t6P6nc
EsPevD37/vjkx8mb44sLGW5NN58EqVxr7/G761zp6q3Rk+O3J68eeIW0DxSV
Xc/cOX91efkmG+ogu/gPdAofnp5/9+U3L05evTj5Wob4cglR7H6WYbllqVw/
q025NOVVUUwmE6VnYLuGJBWXS+sVrFO/wgmryviytTPwEnKooG65brFJy5RL
tean3raG3mTmR4K98n25VNoXb4Q29QbEHarzyEN16l4d8nTDIyJV4SRU7yE1
gSlTdYZN4dx777Epb2BMda1WoEU31q98QZNg3bXzGuvS+6bRmBS2Lp8Iwqqu
dbuh590ShrRTK1eZ2mOFhogs6x7EqxsYp7ighWKAKrc2DS0BDq48zdMRy8gY
T4WZK1tVtSlgPc9ISaq+7OjV4iLsVrZnqriXiWmWJM3Yyg7HVM6x4u4uF5z7
+y0Wqrs7klZ6voeX+JD+f38fz6koa8tH1TnlZh3MIL8GNimt1pAQW/KRMxNv
4WaIDFgp/pP9wOF4e8M7zA+aqVIzyExYhya61rWFVxNi8W5nahyG9z2Gdu7K
NDwMx+iazYr2jnMmzmPTvl+tZQtjqmnTTOHM4bBo+/lGYOohrGTzISbe64Vh
gkEhmbyyh+HBGi2OBsf33ZaIQOoxHWxqR2ddGRx9BdFuWJZI4EuDjYAWzZzq
liRHutkcKjtXjesKXdeHCtsy7egVM1XqbI63WCZvDJiFPYXPxtznOW+gO35t
SjvHU4zEhCvM2xJXOhi4jrmHF/0KK4KejvSPVzykwbxhesSzyeyFqHNf44zC
WWGK2ugWdOt2YWjSZAxBs565vmNDQBODAuIWNK72TjVGXo8k0KhgGjJiwOGz
oC/RxByCemVqzN1CFoi1wnO8bEYGRWTa9zipDakuH7+cDJkpu2h84L9dLLsi
I8lj+36+YaZN2Xeu+5Y0UBiS2zvLsrHEDDXNomBW6to0JDOQhllv64pPGzuB
MNSO7EfhXc2q4eVkMEewDiD3gw/U24wIsq9iRwm3eHXw+ruLy4ND+b/69px/
f/vib9+dvX1xSr9fvDr+5pv0SxFGXLw6/+6b0+G34c2T89evX3x7Ki/jqRo9
Kg5eH/94IJw8OH9zeXb+7fE3B8mGJTZokUfw0DadAZJgWYAMRn9AgqG+PHnz
P//9/BMYln95+/Lk4+fPP4VtkT/+7fm/foI/biB5spproObyJ44BKHm9hqDR
LCSvJbxxBzk6JIvnl/D6ChpjwL8//Adx5j+P1F9m5fr5J38ND4jg0cPIs9FD
5tnuk52XhYl7Hu1ZJnFz9HyL0+P9Hv84+jvyPXtIvuLStCvbuNotNrteeG6b
4IPnrgb6YreFF/xRUewLNE4yr3whOvLk65OTi6dHBQDs4C/ZJENagU1pymio
2evpwdd36toChkJdBDwvWr1eBvsE4wCIBbdGL9F5qjX+dhUrl13RIb41tdWY
RHYiWwiayxprVpAoMquGTNqKNP9dUCOY5KkoFJH2oR+9wN6c9FmMNtEgtkVZ
8lzE12DVMHMbNiizfuhHkIC0mBhqRpqs7j6AdfL3RcQ0kzmOS7x69OE34NGS
Jt/Q2je2ot/8EtpVjV3UZg2MWtebIhg8eTwz+QlkHCCMwmYZrxzusMqyoBSZ
7RQuk6KJD7pZOryxWvWNpdAyHHcDpIQIN+yQWeWB3vnoC7aUcizw9K60miwC
vyhHyK9+FjYznJMNRjm8/CHcmClhTkaOxfLRASrB1jJg4GOC5cG5VXFXRD8G
wqmqq4YsBBuoQl8D1APgscEiGm4hjg3EEaGTLq/Yq184kDEci0gEHUlNbo68
pU/uUmjK+M5HIWoiASYkAyESgOJFcMhyDBl7d7SHuNIamFEvJ6kE3lDUTq76
howdVMfocimIIGM3G2dwkAZackNAowSfeotzIrrnrVuFE/cQjeMmkS4vlrRe
SeEMpK/UBARss6XaTD9TitEFwRUzJ4mHlIBvK+vNGIYXxd5lZPaAanAe/FfD
ywkUYM+HgFLV9oq3k+anRfmo2+GoDvm0/977Llv47UhXvVrRx4xBmKYKK+uF
rUlkyN+oLoD8EQ7wY2wBriFSJdwSfbnARqANNot7tVD4JYiB3ZvQ7vEGIeO5
vYXwEsFrbVuWoIFEbM7NmWQhYypYipnIcI1NonhlEQLaf8gtkJFEpGJYbMhj
Evgy1SELHkE0AFClq8oSIbougrUvPb0YFI13zQQaOb4coy41g9DKzudYQeR3
ql4h6AdKPpRdJUaVhBhhuoJuXlsWSkshEkldCah7Nh/woF+7hn0Nk+UzCagO
1cAQNYda41zeumCm6ZgzwYRt9P167dqO3mPb0MBh0sTeHQY6GJR6Uv7B4W2R
3ZgbnFxLq5iqSJHLA3a3KM7h3LTwlZReAgcvEwSqIJJ6EwU84mJdksF1lM8r
SIEBonqyoIFaT+tP/KYpl61r7M/RLiIs8ulYvQb2gr1hBCpmj+UclohojAoR
ImAxdgXtpVw6QrvYBtTItZCLnw3lWVwu2/AclJoczXwIyNttY0NsamWCWc8H
Fwx8DUSmFZo7MKXOFwie9GGoghkJzRyXUE1vJWq+FCmnfxn2i+4gItowJk8+
dmwUQDWj9ceARBot0OiwaHWzIOZiWjecM4tobW7JopD0aG8mbj4ZwwhOG4hi
GA73Oa4J0YpWTQ99JrNeIO7wljQkRQ0SkpDeiNUCcewImNjorWhbAb8AOgM5
iMvLYMphcn1FhDwl3g/wmzMP9S7QGVnBovjB4KBZj61kQARzsinLYlIBV+R4
irs7hkH3DN2ZAfgnCj/m0dEiJINBlnCvrG4ZDQkNfGkaCvb8oZhLVrgtUyIB
MUeBbbC51id3gCdASlAbBIwSkZ1aPv6UjQeWk3knMxxudT9EqYGzwa9zrFzx
y6Dup55ejRYg2He7vbeBa1lwMzPA8NjLr7/+qrT214vi2ST9PFOjn/yT4pfh
+S/jYfknNOyEofzodfz8FZNfCAtl2PvM9p57AzHF3ZH6YG4XE8qYTYRTiqsm
nx/sMP2F5JAO7gXDU1bMtJ2VvO3YxwyILcG7IeXHYlPr0mS2fWTV2iJDpHD1
s4DCNpJkG2Ya7Dn54TWn7gB8GoujHnDgAPLIKFemE4WfFi/27G3/ltikcZ4i
6hn5PtcvlmzoSG9qu7KS1UGIN1FvBDtKqomSHRyPe2IYqRRBQA2oAyc5IOYc
eItCBC82mg5kxrxQNjZiVfCWHWiHs4J+yGDEqGAVNki5M1B4QtuYcyxRKHUJ
M+rXoIMofSL5gD9/+ueP7++f0pue1uc82xCCEA3g7IJs41ol3LUVtgRYEgKo
GJGGTU+jFAGTw9ftyomkg5jzMY/H8F+CM5plFPQF0ILRlNyNrC3SvKCEpYHE
IkAidjpm1+KJ0bkMh/Omdbebke1Z05OHTI/sAd7Hd9k+FL8jDJqbrgSiDQJK
khCl2JGlWep6Tnxa9XVnoW8xKxiNUfG4MSrex7A8aJgeNB6/FGr/z/X+N/Y8
fLdh3PPwndSQhZQjSg/fw2i+a6UHaHr2KE3y6HabQ//10AePMPvB43mvAy0e
t/NBFsXMX3D4syPlmbE/m6ck6a1kK0SmQ6I6T1MItIP1pRBPahES7DLO4hNh
YOjJwlacWWQrUezNXWX4YRzQ2O0dkQFOu8qhYGv9lSg6MIk3bJqD87rdSAjs
asZNITWSVoSZXFCASVaUw+NQnIg5t+nOTDx84IbQD4UdUiQ8VgCesRy/PbI6
RadEJaSHJ6LaAUKAlBmIn0vRwT0U+ktQLVuiqn4LblyZobwQjfFrwPeFxEQh
3mbWEWEzApkNx4g7kH6rvBQTksTxyqyI0twTFeKPzLUltGv2eLy9gXuMxYU5
BO8kn1ou2dV7NUpz392NwOH9tDjJdhV8ll4hmPK8+Mqb+lqKTAQOKKtrRMQo
FODYlcNUmrQaB9mQguOaHYwcikTEORN0B9y87uSAmrltV4leSePuSscuOexA
RW0nJCmTMBVLORFI/upC3KwoMstTSDSnkQSbH5+qSKzikyGBs1C5IPsIdRnx
hJRJJvoJY+c05mnFiBAxUbGXbvrjgAvcmPtgWx+m6hxnQqJHwVCcLA7PMIPd
Knnc3WVVdnBKfQmC5nRQ8ZCw44ZkLJEQgpOoiIFoH1KSt5viiXccO1HdSQIu
BBEk0ATinrLgan+VhJZN19lAP3TJiMUC08uQjt3iSRGTziISuVDFUveO7gwx
k7oMYZ0EL8yGZPxzCWDR+WeBEb8NRwRt+I1A4v+GJB5cK1Hz+SM/f332wFu/
Ya13wZZ/btySi26CLztWb2Tx9gIaGMvXBK4nu9Ce8vy8GD94KLFQc2PIwiSM
TonvZiLOPMRot1ZcCqP9Xaz/aHJhm+EPHdn2ueSs3Hlpshcrjyd8JKswFoC9
wx/KOzww/KGfaAqePWgKRlL87B2WYPvX3zWi+I007cwz/OxoZdLX9xz+jznE
d4nIbxTA7T3uTrj187jFYP0cG4z9mj/ObXmTNJjwHxwzVQ+UX7dGw7mXLTDk
EJ9fA5OQMVg7y6WpMFfsqONpYnY2tUkVMaMa+8YuHVDOpVT308oL00gHWuh/
4dQwhzeGcu9aUWNnC1y/IVhMxfF2ZrtWt5tinKyZY2BILQ81mQRwU29kFt+I
4YolEiq4peIr116bmGFJto6TPxTdSc1rLvEfm78QE3pKL+XZk/unMQnDyR4O
MGKeCtHFVJ3GZHoBImAtx7sT5u2xrbYL84ILpuAGBcLt1D0m0UTMuFCcxTEE
AT/uoeKCLbBYr0fl4TypuCeVGBGX4aYvlhbwx0iO3QzlhDClRF7eDHVl1ZiO
2sFZVKhibXwW8M7MxjVVAfGICaYEIjnTRGyThSeDqGzNHAAphc0yBC7nW9cF
IBlgcMjO53JIjKSF8kyZ474+9QS8MhRyS1ca9irBom4WBrDZP+XWwHhkIS6X
eg1CQ+hMNZAtyQNA9x5DqN4FWf0I25ghvKDtQKrpAKeFVAR0p0mERs475vom
1eyh7Fw8d87y+yA73Ec5ZCCrODeHoCN5G0SN6xdh4HsXCv7fgOrH81j/SE+a
DurZX9KKv1tu7kGfuc87/j4YNwlfrMLsCvpWHSa9QebnFlYg9JaG7HsXCo+6
C/UH0ug1NdNTw1J3Y6CzIdal3n8p8YnJj46MmonY0salfMjiheY2z2k1ajBZ
k7WeUHMFdAJQmLciufWh+iDtC/O8CjGuQeQlCCm2UvLeRgtClZSG7iPEFajm
wV6UfMYQF1PnROxs78IkW70CZBJTxo5acTZbFVesIoYpayVme0K3cmhiqkTH
oqxPy5CtDJtzoyYNTiNI68aopw/rpGyGJBTyJChNyR0H6omkrzDs6XaDR9xR
bLFNDkLKWeuYOsRSPlxBUnqhbeO7IXeQDGTf1JS3oZWl79quNfFyaEyi7crn
lNOLWYesPl0o9h12tTaVCe23q1CjGsrGL26p/ZCzgRK+PSQVZGApGSo9ww67
Hlf0A4fLJVxbIxlhF3Z5wfW3bOZLC0mnxCTpAGEhzCtJxSc8vSWsVJZmLQU8
L13wT7lJLC8WX35zocph2inrAQsYcd2LFwoacLNktxxrgKFvhSpYkvahubGK
1NbmUhNMuEpaNKV1DafWGuq8ZmYMbdszG9oO5nsVOjV+Dq0P0hbAPQo0Zeyo
1sB95ppLdjr0xTE5WG/o9JqF1vLU5Z6GpUHv0c0Jjr0cWvVifI2jZjwhOfIK
jrV2usrascY+Wgr7wHy1C719nCxfOb6rIJ/m/rqQo463Obh02vKtABpLPH9i
povpIbXGypWHUfdjyIoCKTx5c/b2aSL3aWAsToR2Jt1elMzLLXQkBtxNu7Vd
ESiOHaTSBQEJrU3od51I1bAaSYIYxzmja66cBzvdryu+T0Wp2dDawa3hYWRX
ZBrI4CV+wHIS3yYmuqhbnMuez/l6gPDtM0iZga1m1YAxmcjO/P09m1WAY+4I
K04DxcG07ZygwL8ZlYxsLOFK95DcjRiwM11hkw4ZT6edLBzb0xvqSYRwkZIB
M1Y3tuK+UIo6XGjVFDAXLIjEHXhDGKGlb/g1wOeqX6nvA1XqjVAFeLlDKKPL
2LeXOgdSITxVo6l2wo240sRATdYsojo1DQQapTbNjQ7ifagbbafzT6emGt0Q
+dIMB474WKNy4Bb8G/dFtZWUkzioGdLI1KBYMIPxMd83xRmwtaLOZyoZpd46
XbJJr6bqgoQrCqgerJiuKTDeDPcwQquxXMgZXSJTCMmEuEMV4rJ4VyvWmuau
pxR6p8a3p/jaHQGCC9OFvopVOKx4MkXoZGe2ijfOmrR0VlwLPBOGkynjhtTs
PbncIjFs1AIWkAsDh0Qf5n1x35tWXEDsgAs+3kNlV6P6lIh3XeeFoVR64PW3
AsZQeuFzl8MrpBFF/NNUZVEieeXQEkex8uheV1bxoA5fUZSkHikexkJhfs6C
9pzm5KqFpQHUvUgd9LEDjDfGfle6nJkMH1kEy1gavvjHQIvlKF7HERss7Ze8
3sw0Zg7yuUtt5a7tVrMju3IfyzO955QLoEkESdEMgyN5i2KcXC16bAqI0FTF
UMkC2gulO0Ko6zrt+VAsqVyzSztNJxUaeGJ1iu5HBKLz3qUAP6TBv5FGQHL2
kn4ZHY/U8M6awV/mMgXrU9rre+rijtfsoqsCP65p5GanczKoU7jjYF2qKgep
4m3Han2oVhUAhrG4qZ7gWbRQIe1D7z2VjvAWQgcfaIfO93jzLVkMdnipXoqP
xR641kJGCYjETuPR2/FjavRh9pt0kSCk0aq8JCb98jPXinUVAouhsH0mbfgr
6j3W6W5Fs0k3G10TD53XKHXbbnhA7vSHm2qw32RsgyAmYoKSxCAtzujaISAJ
yHy4vnOdHzGOKqTU+GAkafkEPrbYzZlFmfY95URsDGWGmVP2J/WpsbFt3Yy7
79NtBlIayWF5Xgs2d6sEguUkuxNKlKEPmbxGVCiSpL8RyhKrnDx72PxuWiaR
EOe0mdyPmGJDp1uaMwh1bKsSmB9LyiDM30QzJrbQDF4tiEus1IrGfW02ky95
xAu5dCradjUz93xTK0B4M3y4JAGPk8WbqnIBZktcLF0CaapwfTU2L8SEr5br
swVlI6U/0M3o/n9I+mbXdfIuGOI1B1rZjnqOyEUADV12r4YcFRXcuSi/6MVj
HybEzho2aJWIDd8eXkXPJ7yaW+rbqan7PO0oLA9jmpEtCp32oVP7cPZGtmEA
74ldkR0HAofVIu2c900puUUCrurV16cvn447iSEAfHujMvtZD5GxcuVodAl+
4ACplx/QWeOK8cmNluqlDz8wYhOyAXwtBmcojtWyhcEUpWRegEKYiR1FW0XY
57C1Gx3ucNPcqYog3SSh+iB+mdPoDeOCJly+5DuE0eMNIEGi8pF8EDpuPiQV
o7RsugZMtnG05me0JV6F+oJ8yD6ES0cSyLOgsP2g/BIcDF+HPq5EZKj0GYP3
wR4V4fsmBlsVb/cyn/YJiWHDGe58821lmZ/w8oQvGiKkazeTpW45oC3y96PY
RO26u/v347dfnX/78ef85QttN5+U83Yx0e3CNR8jRkk3d7KtxdR7CKt9x9fo
+LLkcIo4pGgqGOmD15R2GhvJGTAqF2bEFWe90uwF9YCRGCIwsnzZ07dG8De9
CIYMVyKbPUaZYi/pVp7Jbjkhwtj7xgg8pCYz7TeTzk0k97KVcUrByjuubuZ9
d9QStKKUkQK/a5bJGLKFjlfhf1Pslh/SpTNfarn9R/umS5axrlaFsgIJNAe9
D307BZmGx7+aAtIy/jaFqTqu5aIR93JJujBujVw+V+looRtCw3zy0gFHohmh
85Pd5qwddwkD61IbdsnZUtsNajAKOF/cyt1Ajs01PGvP3xwy+CzucaM7xrQ9
togP5sewTWr4yp/xZSKiMKVrxOQFkMfmf6fGGO9zSc0lm5++SUOnIhiBQwly
wv0WafyHn34a4qSQYzwZx4t0daO837kxvfsVIfztHiI16ZYQMzGa5JhIyi+6
pIMoYKhro95fyM+6vDHryrAvbKmAiDWqsHkuHUJ2irC7UN7j5IVoa5YnFuTL
Gbm8IzWXaqnH5t9mIt9IMtPlVfG/iLuMPcJKAAA=

-->

</rfc>
