<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-keytrans-architecture-04" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title>Key Transparency Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-04"/>
    <author fullname="Brendan McMillion">
      <organization/>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="07"/>
    <area>Security</area>
    <workgroup>Key Transparency</workgroup>
    <keyword>key transparency</keyword>
    <abstract>
      <?line 37?>

<t>This document defines the terminology and interaction patterns involved in the
deployment of Key Transparency in a general secure group messaging
infrastructure, and specifies the security properties that the protocol
provides. It also gives more general, non-prescriptive guidance on how to
securely apply Key Transparency to a number of common applications.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-keytrans.github.io/draft-arch/draft-ietf-keytrans-architecture.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-keytrans-architecture/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Key Transparency Working Group mailing list (<eref target="mailto:keytrans@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/keytrans/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/keytrans/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-keytrans/draft-arch"/>.</t>
    </note>
  </front>
  <middle>
    <?line 45?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Before any information can be exchanged in an end-to-end encrypted system, two
things must happen: First, participants in the system must provide the service
operator with any public keys they wish to use to receive messages. Second, the
service operator must somehow distribute these public keys amongst the
participants that wish to communicate with each other.</t>
      <t>Typically this is done by having users upload their public keys to a simple
directory where other users can download them as necessary, or by providing
public keys in-band with the communication being secured. If the service
operator is simply trusted to correctly forward public keys between users, this
means that the underlying encryption protocol can only protect users against
passive eavesdropping on their messages.</t>
      <t>However, most messaging systems are designed such that all messages are
exchanged through the service operator's servers, which makes it extremely easy
for an operator to launch an active attack. That is, the service operator can
take public keys for which it knows the corresponding private keys, and
associate those public keys with a user's account without the user's knowledge
to impersonate or eavesdrop on conversations with that user.</t>
      <t>Key Transparency (KT) solves this problem by requiring the service operator to
store user public keys in a cryptographically protected append-only log. Any
malicious entries added to such a log will generally be equally visible to both
the affected user and the user's contacts. This allows users to detect whether
they are being impersonated by viewing the public keys attached to their
account. If the service operator attempts to conceal some entries of the log
from some users but not others, this creates a "forked view" which is permanent
and easily detectable.</t>
      <t>The critical improvement of KT over related protocols like Certificate
Transparency <xref target="RFC6962"/> is that KT includes an efficient
protocol to search the log for entries related to a specific participant. This
means users don't need to download the entire log, which may be substantial, to
find all entries that are relevant to them. It also means that KT can better
preserve user privacy by only showing entries of the log to participants that
genuinely need to see them.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<dl>
        <dt><strong>End-to-End Encrypted Communication Service:</strong></dt>
        <dd>
          <t>A communication service that allows end-users to engage in text, voice,
video, or other forms of communication over the internet, and uses public key
cryptography to ensure that communications are only accessible to their
intended recipients.</t>
        </dd>
        <dt><strong>End-User Device:</strong></dt>
        <dd>
          <t>The device at the final point in a digital communication, which may either
send or receive encrypted data in an end-to-end encrypted communication
service.</t>
        </dd>
        <dt><strong>End-User Identity:</strong></dt>
        <dd>
          <t>A unique and user-visible identity associated with an account (and therefore
one or more end-user devices) in an end-to-end encrypted communication
service. In the case where an end-user explicitly requests to communicate with
(or is informed they are communicating with) an end-user uniquely identified
by the name "Alice", the end-user identity is the string "Alice".</t>
        </dd>
        <dt><strong>User / Account:</strong></dt>
        <dd>
          <t>A single end-user of an end-to-end encrypted communication service, which may
be represented by several end-user identities and end-user devices. For
example, a user may be represented simultaneously by multiple identities
(email, phone number, username) and interact with the service on multiple
devices (phone, laptop).</t>
        </dd>
        <dt><strong>Service Operator:</strong></dt>
        <dd>
          <t>The primary organization that provides the infrastructure for an end-to-end
encrypted communication service and the software to participate in it.</t>
        </dd>
        <dt><strong>Transparency Log:</strong></dt>
        <dd>
          <t>A specialized service capable of securely attesting to the information (such
as public keys) associated with a given end-user identity. A transparency
log is usually run either entirely or partially by the service operator, but
could also be operated externally.</t>
        </dd>
      </dl>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>From a networking perspective, KT follows a client-server architecture with a
central <em>transparency log</em>, acting as a server, which holds the authoritative
copy of all information and exposes endpoints that allow users to query or
modify stored data. Users coordinate with each other through the server by
uploading their own public keys and downloading the public keys of other
users. Users are expected to maintain relatively little state, limited only
to what is required to interact with the log and ensure that it is behaving
honestly.</t>
      <t>From an application perspective, KT can be thought of as a versioned key-value
database. Users insert key-value pairs into the database where, for example, the
key is their username and the value is their public key. Users can update a key
by inserting a new version with new data. They can also look up the most recent
version of a key or any previous version. From this point forward, the term
<strong>label</strong> will be used to refer to lookup keys in the key-value database that a
transparency log represents to avoid confusion with cryptographic public or
private keys.</t>
      <t>Users are considered to <strong>own</strong> a label if they are understood to either
initiate all changes to the label's value, or if they must be informed of all
changes to the label's value. The latter situation may occur if, for example, KT
is deployed in a way where the service operator makes automated modifications to
stored data. The owning user would then be informed, after the fact, of
modifications to verify that they were legal.</t>
      <t>KT does not require the use of a specific transport protocol. This is intended
to allow applications to layer KT on top of whatever transport protocol their
application already uses. In particular, this allows applications to continue
relying on their existing access control system.</t>
      <t>With some small exceptions, applications may enforce arbitrary access control
rules on top of KT. This may include requiring a user to be logged in to make KT
requests, only allowing a user to lookup the labels of another user if they're
"friends", or applying a rate limit. Applications <bcp14>SHOULD</bcp14> prevent users from
modifying labels they do not own. The exact mechanism for rejecting requests,
and possibly explaining the reason for rejection, is left to the application.</t>
      <section anchor="user-operations">
        <name>User Operations</name>
        <t>The operations that can be executed by a user are as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Search:</strong> Looks up the value of a specific label in the most recent version
of the log. Users may request either a specific version of the label or the
most recent version available. If the label-version pair exists, the server
returns the corresponding value and an inclusion proof.</t>
          </li>
          <li>
            <t><strong>Update:</strong> Adds a new label-value pair to the log, for which the server
returns an inclusion proof. Note that this means that new values are added to
the log immediately and no provisional inclusion proof, such as an SCT as
defined in <xref section="3" sectionFormat="of" target="RFC6962"/>, is provided.</t>
          </li>
          <li>
            <t><strong>Monitor:</strong> While Search and Update are run by the user as necessary,
monitoring is done in the background on a recurring basis. It can both check
that the log is continuing to behave honestly (all previously returned labels
remain in the tree) and that no changes have been made to labels owned by the
user without the user's knowledge.</t>
          </li>
        </ol>
        <t>These operations are executed over an application-provided transport layer.
The transport layer enforces access control by blocking queries which are
not allowed:</t>
        <figure anchor="request-response">
          <name>Example request and response flow. Valid requests receive a response while invalid requests are blocked by the transport layer.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="456" viewBox="0 0 456 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 24,48 L 24,320" fill="none" stroke="black"/>
                <path d="M 384,48 L 384,320" fill="none" stroke="black"/>
                <path d="M 152,96 L 368,96" fill="none" stroke="black"/>
                <path d="M 40,112 L 208,112" fill="none" stroke="black"/>
                <path d="M 136,144 L 368,144" fill="none" stroke="black"/>
                <path d="M 40,160 L 208,160" fill="none" stroke="black"/>
                <path d="M 192,192 L 368,192" fill="none" stroke="black"/>
                <path d="M 40,208 L 208,208" fill="none" stroke="black"/>
                <path d="M 144,288 L 320,288" fill="none" stroke="black"/>
                <path d="M 176,304 L 320,304" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="376,192 364,186.4 364,197.6" fill="black" transform="rotate(0,368,192)"/>
                <polygon class="arrowhead" points="376,144 364,138.4 364,149.6" fill="black" transform="rotate(0,368,144)"/>
                <polygon class="arrowhead" points="376,96 364,90.4 364,101.6" fill="black" transform="rotate(0,368,96)"/>
                <polygon class="arrowhead" points="328,304 316,298.4 316,309.6" fill="black" transform="rotate(0,320,304)"/>
                <polygon class="arrowhead" points="328,288 316,282.4 316,293.6" fill="black" transform="rotate(0,320,288)"/>
                <polygon class="arrowhead" points="48,208 36,202.4 36,213.6" fill="black" transform="rotate(180,40,208)"/>
                <polygon class="arrowhead" points="48,160 36,154.4 36,165.6" fill="black" transform="rotate(180,40,160)"/>
                <polygon class="arrowhead" points="48,112 36,106.4 36,117.6" fill="black" transform="rotate(180,40,112)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="372" y="36">Transparency</text>
                  <text x="440" y="36">Log</text>
                  <text x="116" y="68">(Valid</text>
                  <text x="152" y="68">/</text>
                  <text x="196" y="68">Accepted</text>
                  <text x="272" y="68">Requests)</text>
                  <text x="88" y="100">Search(Alice)</text>
                  <text x="296" y="116">SearchResponse(...)</text>
                  <text x="80" y="148">Search(Bob)</text>
                  <text x="296" y="164">SearchResponse(...)</text>
                  <text x="88" y="196">Update(Alice,</text>
                  <text x="164" y="196">...)</text>
                  <text x="296" y="212">UpdateResponse(...)</text>
                  <text x="120" y="260">(Rejected</text>
                  <text x="168" y="260">/</text>
                  <text x="208" y="260">Blocked</text>
                  <text x="280" y="260">Requests)</text>
                  <text x="84" y="292">Search(Fred)</text>
                  <text x="336" y="292">X</text>
                  <text x="80" y="308">Update(Bob,</text>
                  <text x="148" y="308">...)</text>
                  <text x="336" y="308">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                                   Transparency Log
  |                                            |
  |        (Valid / Accepted Requests)         |
  |                                            |
  | Search(Alice) ---------------------------> |
  | <--------------------- SearchResponse(...) |
  |                                            |
  | Search(Bob) -----------------------------> |
  | <--------------------- SearchResponse(...) |
  |                                            |
  | Update(Alice, ...) ----------------------> |
  | <--------------------- UpdateResponse(...) |
  |                                            |
  |                                            |
  |       (Rejected / Blocked Requests)        |
  |                                            |
  | Search(Fred) ----------------------> X     |
  | Update(Bob, ...) ------------------> X     |
  |                                            |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="credentials">
        <name>Credentials</name>
        <t>While users are generally understood to interact directly with the transparency
log, many end-to-end encrypted communication services require the ability to
provide <em>credentials</em> to their users. Credentials convey a binding between an
end-user identity and public keys or other information, and can be verified with
minimal network access.</t>
        <t>In particular, credentials that can be verified with minimal network access are
often desired by applications that support anonymous communication. These
applications provide end-to-end encryption with a protocol like the Messaging
Layer Security Protocol <xref target="RFC9420"/> (with the encryption of handshake messages
required) or Sealed Sender <xref target="sealed-sender"/>. When a user sends a message, these
protocols have the sender provide their own credential in an encrypted portion
of the message.</t>
        <t>Encrypting the sender's credential allows the sender to submit messages over an
anonymous channel by specifying only the recipient's identity. The service
operator can deliver the message to the intended recipient, who can decrypt it
and validate the credential inside to be assured of the sender's identity. Note
that the recipient does not need access to an anonymous channel to preserve the
sender's anonymity.</t>
        <t>At a high level, KT credentials are created by serializing one or more Search
request-response pairs. These Search operations correspond to the lookups the
recipient would do to authenticate the relationship between the presented
end-user identity and their public keys. Recipients can verify the
request-response pairs themselves without contacting the transparency log.</t>
        <t>Any future monitoring that may be required should be provided to recipients
proactively by the sender. However, if this fails, the recipient will need to
perform the monitoring themself over an anonymous channel.</t>
        <figure anchor="anonymous">
          <name>Example message flow in an anonymous deployment. Users request their own label from the transparency log and provide the serialized response, functioning as a credential, in encrypted messages to other users. Required monitoring is provided proactively.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="224" width="504" viewBox="0 0 504 224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,208" fill="none" stroke="black"/>
                <path d="M 272,48 L 272,208" fill="none" stroke="black"/>
                <path d="M 496,48 L 496,208" fill="none" stroke="black"/>
                <path d="M 24,64 L 144,64" fill="none" stroke="black"/>
                <path d="M 184,80 L 256,80" fill="none" stroke="black"/>
                <path d="M 408,128 L 480,128" fill="none" stroke="black"/>
                <path d="M 24,160 L 136,160" fill="none" stroke="black"/>
                <path d="M 192,176 L 256,176" fill="none" stroke="black"/>
                <path d="M 456,192 L 480,192" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="488,192 476,186.4 476,197.6" fill="black" transform="rotate(0,480,192)"/>
                <polygon class="arrowhead" points="488,128 476,122.4 476,133.6" fill="black" transform="rotate(0,480,128)"/>
                <polygon class="arrowhead" points="264,176 252,170.4 252,181.6" fill="black" transform="rotate(0,256,176)"/>
                <polygon class="arrowhead" points="264,80 252,74.4 252,85.6" fill="black" transform="rotate(0,256,80)"/>
                <polygon class="arrowhead" points="32,160 20,154.4 20,165.6" fill="black" transform="rotate(180,24,160)"/>
                <polygon class="arrowhead" points="32,64 20,58.4 20,69.6" fill="black" transform="rotate(180,24,64)"/>
                <g class="text">
                  <text x="52" y="36">Transparency</text>
                  <text x="120" y="36">Log</text>
                  <text x="272" y="36">Alice</text>
                  <text x="416" y="36">Anonymous</text>
                  <text x="480" y="36">Group</text>
                  <text x="208" y="68">Search(Alice)</text>
                  <text x="96" y="84">SearchResponse(...)</text>
                  <text x="332" y="84">Encrypt(Anon</text>
                  <text x="412" y="84">Group,</text>
                  <text x="372" y="100">SearchResponse</text>
                  <text x="444" y="100">||</text>
                  <text x="344" y="116">Message</text>
                  <text x="404" y="116">||</text>
                  <text x="356" y="132">Signature)</text>
                  <text x="204" y="164">Monitor(Alice)</text>
                  <text x="100" y="180">MonitorResponse(...)</text>
                  <text x="332" y="180">Encrypt(Anon</text>
                  <text x="412" y="180">Group,</text>
                  <text x="380" y="196">MonitorResponse)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Transparency Log               Alice           Anonymous Group
|                                |                           |
| <--------------- Search(Alice) |                           |
| SearchResponse(...) ---------> | Encrypt(Anon Group,       |
|                                |     SearchResponse ||     |
|                                |     Message   ||          |
|                                |     Signature) ---------> |
|                                |                           |
| <-------------- Monitor(Alice) |                           |
| MonitorResponse(...) --------> | Encrypt(Anon Group,       |
|                                |     MonitorResponse) ---> |
|                                |                           |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="detecting-forks">
        <name>Detecting Forks</name>
        <t>It is sometimes possible for a transparency log to present forked views of data
to different users. This means that, from an individual user's perspective, a
log may appear to be operating correctly in the sense that all of a user's
requests succeed and proofs verify correctly. However, the transparency log has
presented a view to the user that's not globally consistent with what it has
shown other users. As such, the log may be able to change a label's value
without the label's owner becoming aware.</t>
        <t>The protocol is designed such that users always require subsequent queries to
prove consistency with previous queries. As such, users always stay on a
linearizable view of the log. If a user is ever presented with a forked view,
they hold on to this forked view forever and reject the output of any subsequent
queries that are inconsistent with it.</t>
        <t>This provides ample opportunity for users to detect when a fork has been
presented but isn't in itself sufficient for detection. To detect forks, users
require either a <strong>trusted third party</strong>, <strong>anonymous communication</strong> with the
transparency log, or <strong>peer-to-peer communication</strong>.</t>
        <t>With a trusted third party, such as a Third-Party Auditor or Manager as
described in <xref target="third-party-auditing"/> and <xref target="third-party-management"/>, an outside
organization monitors the operation of the transparency log. This third party
verifies, among other things, that the transparency log is growing in an
append-only manner. If verification is successful, the third party and produces
a signature on the most recent tree head. The transparency log provides this
signature to users in-line with their query responses as proof that they are not
being shown a fork. This approach relies on an assumption that the third party
is trusted not to collude with the transparency log to sign a fork.</t>
        <t>With anonymous communication, a single user accesses the transparency log over
an anonymous channel and checks that the transparency log is presenting the same
tree head over the anonymous channel as it does over an authenticated channel.
The security of this approach relies on the fact that, if the transparency log
doesn't know which user is making the request, it will show the user the wrong
fork with high probability. Repeating this check over time makes it
overwhelmingly likely that any fork presented to any user will be detected.</t>
        <t>With peer-to-peer communication, two users gossip with each other to establish
that they both have the same view of the transparency log. This gossip is able
to happen over any supported out-of-band channel even if it is heavily
bandwidth-constrained, such as scanning a QR code. However, this approach is
only secure if gossip can be implemented such that gossipping users are
reasonably expected to form a connected graph of all users. If not, then the
transparency log can attempt to partition users into subsets that do not gossip
and can present each subset of users with different forks.</t>
        <t>Regardless of approach, in the event that a fork is successfully detected, the
user is able to produce non-repudiable proof of log misbehavior which can be
published.</t>
        <figure anchor="out-of-band-checking">
          <name>Users receive tree heads while making authenticated requests to a transparency log. Users ensure consistency of tree heads by either comparing amongst themselves, or by contacting the transparency log over an anonymous channel. Requests that require authentication do not need to be available over the anonymous channel.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="304" width="584" viewBox="0 0 584 304" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,288" fill="none" stroke="black"/>
                <path d="M 232,48 L 232,288" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,288" fill="none" stroke="black"/>
                <path d="M 344,96 L 560,96" fill="none" stroke="black"/>
                <path d="M 248,112 L 328,112" fill="none" stroke="black"/>
                <path d="M 24,224 L 72,224" fill="none" stroke="black"/>
                <path d="M 392,224 Q 394,220.8 396,224 Q 398,227.2 400,224 Q 402,220.8 404,224 Q 406,227.2 408,224 Q 410,220.8 412,224 Q 414,227.2 416,224 Q 418,220.8 420,224 Q 422,227.2 424,224 Q 426,220.8 428,224 Q 430,227.2 432,224 Q 434,220.8 436,224 Q 438,227.2 440,224 Q 442,220.8 444,224 Q 446,227.2 448,224 Q 450,220.8 452,224 Q 454,227.2 456,224 Q 458,220.8 460,224 Q 462,227.2 464,224 Q 466,220.8 468,224 Q 470,227.2 472,224 Q 474,220.8 476,224 Q 478,227.2 480,224 Q 482,220.8 484,224 Q 486,227.2 488,224 Q 490,220.8 492,224 Q 494,227.2 496,224 Q 498,220.8 500,224 Q 502,227.2 504,224 Q 506,220.8 508,224 Q 510,227.2 512,224 Q 514,220.8 516,224 Q 518,227.2 520,224 Q 522,220.8 524,224 Q 526,227.2 528,224 Q 530,220.8 532,224 Q 534,227.2 536,224 Q 538,220.8 540,224 Q 542,227.2 544,224 Q 546,220.8 548,224 Q 550,227.2 552,224 Q 554,220.8 556,224 Q 558,227.2 560,224 " fill="none" stroke="black"/>
                <path d="M 88,240 L 216,240" fill="none" stroke="black"/>
                <path d="M 248,240 Q 250,236.8 252,240 Q 254,243.2 256,240 Q 258,236.8 260,240 Q 262,243.2 264,240 Q 266,236.8 268,240 Q 270,243.2 272,240 Q 274,236.8 276,240 Q 278,243.2 280,240 Q 282,236.8 284,240 Q 286,243.2 288,240 Q 290,236.8 292,240 Q 294,243.2 296,240 Q 298,236.8 300,240 Q 302,243.2 304,240 Q 306,236.8 308,240 Q 310,243.2 312,240 Q 314,236.8 316,240 Q 318,243.2 320,240 Q 322,236.8 324,240 Q 326,243.2 328,240 Q 330,236.8 332,240 Q 334,243.2 336,240 Q 338,236.8 340,240 Q 342,243.2 344,240 Q 346,236.8 348,240 Q 350,243.2 352,240 Q 354,236.8 356,240 Q 358,243.2 360,240 Q 362,236.8 364,240 Q 366,243.2 368,240 Q 370,236.8 372,240 Q 374,243.2 376,240 Q 378,236.8 380,240 Q 382,243.2 384,240 Q 386,236.8 388,240 Q 390,243.2 392,240 Q 394,236.8 396,240 Q 398,243.2 400,240 Q 402,236.8 404,240 Q 406,243.2 408,240 Q 410,236.8 412,240 Q 414,243.2 416,240 Q 418,236.8 420,240 Q 422,243.2 424,240 Q 426,236.8 428,240 Q 430,243.2 432,240 Q 434,236.8 436,240 Q 438,243.2 440,240 Q 442,236.8 444,240 Q 446,243.2 448,240 Q 450,236.8 452,240 Q 454,243.2 456,240 Q 458,236.8 460,240 Q 462,243.2 464,240 Q 466,236.8 468,240 Q 470,243.2 472,240 Q 474,236.8 476,240 Q 478,243.2 480,240 Q 482,236.8 484,240 Q 486,243.2 488,240 Q 490,236.8 492,240 Q 494,243.2 496,240 " fill="none" stroke="black"/>
                <path d="M 344,272 Q 346,268.8 348,272 Q 350,275.2 352,272 Q 354,268.8 356,272 Q 358,275.2 360,272 Q 362,268.8 364,272 Q 366,275.2 368,272 Q 370,268.8 372,272 Q 374,275.2 376,272 Q 378,268.8 380,272 Q 382,275.2 384,272 Q 386,268.8 388,272 Q 390,275.2 392,272 Q 394,268.8 396,272 Q 398,275.2 400,272 Q 402,268.8 404,272 Q 406,275.2 408,272 Q 410,268.8 412,272 Q 414,275.2 416,272 Q 418,268.8 420,272 Q 422,275.2 424,272 Q 426,268.8 428,272 Q 430,275.2 432,272 Q 434,268.8 436,272 Q 438,275.2 440,272 Q 442,268.8 444,272 Q 446,275.2 448,272 Q 450,268.8 452,272 Q 454,275.2 456,272 Q 458,268.8 460,272 Q 462,275.2 464,272 Q 466,268.8 468,272 Q 470,275.2 472,272 Q 474,268.8 476,272 Q 478,275.2 480,272 Q 482,268.8 484,272 Q 486,275.2 488,272 Q 490,268.8 492,272 Q 494,275.2 496,272 " fill="none" stroke="black"/>
                <polygon class="arrowhead" points="568,224 556,218.4 556,229.6" fill="black" transform="rotate(0,560,224)"/>
                <polygon class="arrowhead" points="568,96 556,90.4 556,101.6" fill="black" transform="rotate(0,560,96)"/>
                <polygon class="arrowhead" points="504,272 492,266.4 492,277.6" fill="black" transform="rotate(0,496,272)"/>
                <polygon class="arrowhead" points="256,240 244,234.4 244,245.6" fill="black" transform="rotate(180,248,240)"/>
                <polygon class="arrowhead" points="256,112 244,106.4 244,117.6" fill="black" transform="rotate(180,248,112)"/>
                <polygon class="arrowhead" points="224,240 212,234.4 212,245.6" fill="black" transform="rotate(0,216,240)"/>
                <polygon class="arrowhead" points="32,224 20,218.4 20,229.6" fill="black" transform="rotate(180,24,224)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="232" y="36">Bob</text>
                  <text x="500" y="36">Transparency</text>
                  <text x="568" y="36">Log</text>
                  <text x="272" y="68">(Normal</text>
                  <text x="324" y="68">reqs</text>
                  <text x="364" y="68">over</text>
                  <text x="440" y="68">authenticated</text>
                  <text x="532" y="68">channel)</text>
                  <text x="288" y="100">Search(Bob)</text>
                  <text x="396" y="116">Response{Head:</text>
                  <text x="492" y="116">6c063bb,</text>
                  <text x="548" y="116">...}</text>
                  <text x="52" y="196">(OOB</text>
                  <text x="96" y="196">check</text>
                  <text x="140" y="196">with</text>
                  <text x="184" y="196">peer)</text>
                  <text x="284" y="196">(OOB</text>
                  <text x="328" y="196">check</text>
                  <text x="372" y="196">over</text>
                  <text x="432" y="196">anonymous</text>
                  <text x="508" y="196">channel)</text>
                  <text x="152" y="228">DistinguishedHead</text>
                  <text x="312" y="228">DistinguishedHead</text>
                  <text x="48" y="244">6c063bb</text>
                  <text x="536" y="244">6c063bb</text>
                  <text x="288" y="276">Search(Bob)</text>
                  <text x="512" y="276">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                      Bob                          Transparency Log
|                           |                                          |
|                           | (Normal reqs over authenticated channel) |
|                           |                                          |
|                           | Search(Bob) ---------------------------> |
|                           | <---------- Response{Head: 6c063bb, ...} |
|                           |                                          |
|                           |                                          |
|                           |                                          |
|                           |                                          |
|   (OOB check with peer)   |    (OOB check over anonymous channel)    |
|                           |                                          |
| <------ DistinguishedHead | DistinguishedHead ~~~~~~~~~~~~~~~~~~~~~> |
| 6c063bb ----------------> | <~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6c063bb |
|                           |                                          |
|                           | Search(Bob) ~~~~~~~~~~~~~~~~~~~> X       |
|                           |                                          |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="deployment-modes">
      <name>Deployment Modes</name>
      <t>In the interest of satisfying the widest range of use-cases possible, three
different modes for deploying a transparency log are supported. Each mode has
slightly different requirements and efficiency considerations for both the
transparency log and the end-user.</t>
      <t><strong>Third-Party Management</strong> and <strong>Third-Party Auditing</strong> are two deployment modes
that require the transparency log to delegate part of its operation
to a third party. Users are able to run more efficiently as
long as they can assume that the transparency log and the third party won't
collude to trick them into accepting malicious results.</t>
      <t>With both third-party modes, all requests from end-users are initially routed to
the transparency log and the log coordinates with the third party
itself. End-users never contact the third party directly, although they will
need a signature public key from the third party to verify its assertions.</t>
      <t>With Third-Party Management, the third party performs the majority of the work
of actually storing and operating the service, and the transparency log only
signs new entries as they're added. With Third-Party Auditing, the transparency
log performs the majority of the work of storing and operating the service, only
obtaining signatures from a third-party auditor at regular intervals
asserting that the tree has been constructed correctly.</t>
      <t><strong>Contact Monitoring</strong>, on the other hand, supports a single-party deployment
with no third party. The cost of this is that, when a user looks up a version of
a label that was inserted very recently, the user may need to retain some
additional state and monitor the label until it is included in a <em>distinguished
log entry</em> (as defined in <xref target="PROTO"/>). If a user
looks up many label-version pairs that were inserted very recently, monitoring
may become relatively expensive.</t>
      <t>Additionally, applications that rely on a transparency log deployed in Contact
Monitoring mode <bcp14>MUST</bcp14> regularly attempt to detect forks through anonymous
communication with the transparency log or peer-to-peer communication, as
described in <xref target="detecting-forks"/>.</t>
      <t>Applications that rely on a transparency log deployed in either of the
third-party modes <bcp14>SHOULD</bcp14> allow users to enable a "Contact Monitoring Mode". This
mode, which affects only the individual client's behavior, would cause the
client to behave as if its transparency log was deployed in Contact Monitoring
mode. As such, it would start retaining state about previously looked-up labels
and regularly engaging in out-of-band communication. Enabling this
higher-security mode allows users to double-check that the third party is not
colluding with the transparency log.</t>
      <section anchor="contact-monitoring">
        <name>Contact Monitoring</name>
        <t>With the Contact Monitoring deployment mode, the monitoring burden is split
between both the owner of a label and those that look up the label. Stated as
simply as possible, the monitoring obligations of each party are:</t>
        <ol spacing="normal" type="1"><li>
            <t>On a regular basis, the label owner verifies that the most recent version of
their label has not changed unexpectedly.</t>
          </li>
          <li>
            <t>When a user that looked up a label sees that it was inserted very recently,
they check back later to see that the label-version pair they observed was
not removed before it could be detected by the label owner.</t>
          </li>
        </ol>
        <t>This guarantees that if a malicious value for a label is added to the log, then
either it is detected by the label owner, or if it is removed/obscured from the
log before the label owner can detect it, then any users that observed it will
detect its removal.</t>
        <figure anchor="contact-monitoring-fig">
          <name>Contact Monitoring. Alice searches for Bob's label. One day later, Alice verifies the label-version pair she observed remained in transparency log. Another day later, Bob comes online and monitors his own label. Note that Alice does not need to wait on Bob to make his Monitor request before making hers.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="584" viewBox="0 0 584 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,256" fill="none" stroke="black"/>
                <path d="M 296,48 L 296,256" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,256" fill="none" stroke="black"/>
                <path d="M 120,64 L 280,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 120,80" fill="none" stroke="black"/>
                <path d="M 128,144 L 280,144" fill="none" stroke="black"/>
                <path d="M 24,160 L 112,160" fill="none" stroke="black"/>
                <path d="M 312,224 L 456,224" fill="none" stroke="black"/>
                <path d="M 480,240 L 560,240" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="568,240 556,234.4 556,245.6" fill="black" transform="rotate(0,560,240)"/>
                <polygon class="arrowhead" points="320,224 308,218.4 308,229.6" fill="black" transform="rotate(180,312,224)"/>
                <polygon class="arrowhead" points="288,144 276,138.4 276,149.6" fill="black" transform="rotate(0,280,144)"/>
                <polygon class="arrowhead" points="288,64 276,58.4 276,69.6" fill="black" transform="rotate(0,280,64)"/>
                <polygon class="arrowhead" points="32,160 20,154.4 20,165.6" fill="black" transform="rotate(180,24,160)"/>
                <polygon class="arrowhead" points="32,80 20,74.4 20,85.6" fill="black" transform="rotate(180,24,80)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="284" y="36">Transparency</text>
                  <text x="352" y="36">Log</text>
                  <text x="568" y="36">Bob</text>
                  <text x="64" y="68">Search(Bob)</text>
                  <text x="208" y="84">SearchResponse(...)</text>
                  <text x="108" y="116">(1</text>
                  <text x="136" y="116">day</text>
                  <text x="180" y="116">later)</text>
                  <text x="68" y="148">Monitor(Bob)</text>
                  <text x="204" y="164">MonitorResponse(...)</text>
                  <text x="108" y="196">(1</text>
                  <text x="136" y="196">day</text>
                  <text x="180" y="196">later)</text>
                  <text x="516" y="228">Monitor(Bob)</text>
                  <text x="388" y="244">MonitorResponse(...)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                        Transparency Log                        Bob
|                                   |                                  |
| Search(Bob) --------------------> |                                  |
| <------------ SearchResponse(...) |                                  |
|                                   |                                  |
|           (1 day later)           |                                  |
|                                   |                                  |
| Monitor(Bob) -------------------> |                                  |
| <----------- MonitorResponse(...) |                                  |
|                                   |                                  |
|           (1 day later)           |                                  |
|                                   |                                  |
|                                   | <------------------ Monitor(Bob) |
|                                   | MonitorResponse(...) ----------> |
|                                   |                                  |
]]></artwork>
          </artset>
        </figure>
        <t>Importantly, Contact Monitoring impacts how the server is able to enforce access
control on Monitor queries. While Search and Update queries can enforce access
control on a "point in time" basis, where a user is allowed to execute the query
at one point in time but maybe not the next, Monitor queries must have
"accretive" access control. This is because, if a user is allowed to execute a
Search or Update query for a label, the user may then need to issue at least one
Monitor query for the label some time in the future. These Monitor queries must
be permitted, regardless of whether or not the user is still permitted to
execute such Search or Update queries.</t>
      </section>
      <section anchor="third-party-auditing">
        <name>Third-Party Auditing</name>
        <t>With the Third-Party Auditing deployment mode, the transparency log obtains
signatures from a third-party auditor attesting to the fact that the tree has
been constructed correctly. These signatures are provided to users as part of
the responses for their queries.</t>
        <t>The third-party auditor is expected to run asynchronously, downloading and
authenticating a log's contents in the background, so as not to become a
bottleneck for the transparency log. As a result, signatures from the auditor
may lag behind the view presented by the transparency log. The maximum amount of
time that the auditor may lag behind the transparency log without its signature
being rejected by users is set in the transparency log's configuration.</t>
        <figure anchor="auditing-fig">
          <name>Third-Party Auditing. A recent signature from the auditor is provided to users. The auditor is updated on changes to the tree in the background.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="584" viewBox="0 0 584 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,192" fill="none" stroke="black"/>
                <path d="M 336,48 L 336,192" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,192" fill="none" stroke="black"/>
                <path d="M 176,64 L 320,64" fill="none" stroke="black"/>
                <path d="M 160,80 L 320,80" fill="none" stroke="black"/>
                <path d="M 176,96 L 320,96" fill="none" stroke="black"/>
                <path d="M 24,110 L 64,110" fill="none" stroke="black"/>
                <path d="M 24,114 L 64,114" fill="none" stroke="black"/>
                <path d="M 480,160 L 560,160" fill="none" stroke="black"/>
                <path d="M 352,176 L 432,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="568,160 556,154.4 556,165.6" fill="black" transform="rotate(0,560,160)"/>
                <polygon class="arrowhead" points="360,176 348,170.4 348,181.6" fill="black" transform="rotate(180,352,176)"/>
                <polygon class="arrowhead" points="328,96 316,90.4 316,101.6" fill="black" transform="rotate(0,320,96)"/>
                <polygon class="arrowhead" points="328,80 316,74.4 316,85.6" fill="black" transform="rotate(0,320,80)"/>
                <polygon class="arrowhead" points="328,64 316,58.4 316,69.6" fill="black" transform="rotate(0,320,64)"/>
                <polygon class="arrowhead" points="32,112 20,106.4 20,117.6" fill="black" transform="rotate(180,24,112)"/>
                <g class="text">
                  <text x="20" y="36">Many</text>
                  <text x="64" y="36">Users</text>
                  <text x="324" y="36">Transparency</text>
                  <text x="392" y="36">Log</text>
                  <text x="552" y="36">Auditor</text>
                  <text x="72" y="68">Update(Alice,</text>
                  <text x="148" y="68">...)</text>
                  <text x="64" y="84">Update(Bob,</text>
                  <text x="132" y="84">...)</text>
                  <text x="72" y="100">Update(Carol,</text>
                  <text x="148" y="100">...)</text>
                  <text x="156" y="116">Response{AuditorSig:</text>
                  <text x="264" y="116">66bf,</text>
                  <text x="308" y="116">...}</text>
                  <text x="408" y="164">[AuditorUpdate]</text>
                  <text x="504" y="180">AuditorTreeHead</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Many Users                        Transparency Log               Auditor
|                                        |                             |
| Update(Alice, ...) ------------------> |                             |
| Update(Bob, ...) --------------------> |                             |
| Update(Carol, ...) ------------------> |                             |
| <===== Response{AuditorSig: 66bf, ...} |                             |
|                                        |                             |
|                                        |                             |
|                                        | [AuditorUpdate] ----------> |
|                                        | <---------- AuditorTreeHead |
|                                        |                             |
]]></artwork>
          </artset>
        </figure>
        <t>Given the long-lived nature of transparency logs and the potentially short-lived
nature of third-party auditing arrangements, KT allows third-party auditors to
start auditing a log at any arbitrary point. This allows a new third-party
auditor to start up without ingesting the transparency log's entire
history. The point at which an auditor started auditing is provided to users in
the transparency log's configuration. When verifying query responses, users
verify that the auditor started auditing at or before the point necessary for
the query to be secure.</t>
      </section>
      <section anchor="third-party-management">
        <name>Third-Party Management</name>
        <t>With the Third-Party Management deployment mode, a third party is responsible
for the majority of the work of storing and operating the log. The transparency
log serves mainly to enforce access control and authenticate the addition of new
entries to the log. All user queries are initially sent by users directly to the
transparency log, and the transparency log proxies them to the third-party
manager if they pass access control.</t>
        <figure anchor="manager-fig">
          <name>Third-Party Management. Valid requests are proxied by the transparency log to the manager. Invalid requests are blocked.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="520" viewBox="0 0 520 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,192" fill="none" stroke="black"/>
                <path d="M 248,48 L 248,192" fill="none" stroke="black"/>
                <path d="M 512,48 L 512,192" fill="none" stroke="black"/>
                <path d="M 136,64 L 232,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 496,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 232,80" fill="none" stroke="black"/>
                <path d="M 264,80 L 336,80" fill="none" stroke="black"/>
                <path d="M 176,112 L 232,112" fill="none" stroke="black"/>
                <path d="M 264,112 L 496,112" fill="none" stroke="black"/>
                <path d="M 24,128 L 232,128" fill="none" stroke="black"/>
                <path d="M 264,128 L 336,128" fill="none" stroke="black"/>
                <path d="M 128,160 L 208,160" fill="none" stroke="black"/>
                <path d="M 160,176 L 208,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="504,112 492,106.4 492,117.6" fill="black" transform="rotate(0,496,112)"/>
                <polygon class="arrowhead" points="504,64 492,58.4 492,69.6" fill="black" transform="rotate(0,496,64)"/>
                <polygon class="arrowhead" points="272,128 260,122.4 260,133.6" fill="black" transform="rotate(180,264,128)"/>
                <polygon class="arrowhead" points="272,80 260,74.4 260,85.6" fill="black" transform="rotate(180,264,80)"/>
                <polygon class="arrowhead" points="240,112 228,106.4 228,117.6" fill="black" transform="rotate(0,232,112)"/>
                <polygon class="arrowhead" points="240,64 228,58.4 228,69.6" fill="black" transform="rotate(0,232,64)"/>
                <polygon class="arrowhead" points="216,176 204,170.4 204,181.6" fill="black" transform="rotate(0,208,176)"/>
                <polygon class="arrowhead" points="216,160 204,154.4 204,165.6" fill="black" transform="rotate(0,208,160)"/>
                <polygon class="arrowhead" points="32,128 20,122.4 20,133.6" fill="black" transform="rotate(180,24,128)"/>
                <polygon class="arrowhead" points="32,80 20,74.4 20,85.6" fill="black" transform="rotate(180,24,80)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="236" y="36">Transparency</text>
                  <text x="304" y="36">Log</text>
                  <text x="488" y="36">Manager</text>
                  <text x="72" y="68">Search(Alice)</text>
                  <text x="424" y="84">SearchResponse(...)</text>
                  <text x="72" y="116">Update(Alice,</text>
                  <text x="148" y="116">...)</text>
                  <text x="424" y="132">UpdateResponse(...)</text>
                  <text x="68" y="164">Search(Fred)</text>
                  <text x="224" y="164">X</text>
                  <text x="64" y="180">Update(Bob,</text>
                  <text x="132" y="180">...)</text>
                  <text x="224" y="180">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                  Transparency Log                  Manager
|                             |                                |
| Search(Alice) ------------> | -----------------------------> |
| <-------------------------- | <--------- SearchResponse(...) |
|                             |                                |
| Update(Alice, ...) -------> | -----------------------------> |
| <-------------------------- | <--------- UpdateResponse(...) |
|                             |                                |
| Search(Fred) ----------> X  |                                |
| Update(Bob, ...) ------> X  |                                |
|                             |                                |
]]></artwork>
          </artset>
        </figure>
        <t>The security of the Third-Party Management deployment mode comes from an
assumption that the transparency log and the third-party manager do not collude
to behave maliciously. If the third-party manager behaves honestly, then any
improper modifications to a label's value that were requested by the
transparency log will be properly published such that the label owner will
detect them when monitoring. If the transparency log behaves honestly, the
third-party manager will be unable to add any new unauthorized versions of a
label such that a user will accept them, or remove any authorized version of a
label without the label owner detecting it.</t>
        <t>The transparency log <bcp14>MUST</bcp14> implement some mechanism to detect when forks are
presented by the third-party manager. Additionally, the transparency log <bcp14>MUST</bcp14>
implement some mechanism to prevent the same version of a label from being
submitted to the third-party manager multiple times with different associated
values.</t>
      </section>
    </section>
    <section anchor="combining-logs">
      <name>Combining Logs</name>
      <t>There are many cases where it makes sense to operate multiple cooperating
transparency log instances, for example:</t>
      <ul spacing="normal">
        <li>
          <t>A service provider may wish to gradually migrate to a transparency log that
uses different cryptographic keys, a different cipher suite, or different
deployment mode.</t>
        </li>
        <li>
          <t>A service provider may operate multiple logs to improve their ability to scale
or provide higher availability.</t>
        </li>
        <li>
          <t>A federated system may allow each participant in the federation to operate
their own transparency log for their own users.</t>
        </li>
      </ul>
      <t>Client implementations should generally be prepared to interact with multiple
independent transparency logs. When multiple transparency logs are used as part
of one application, all users <bcp14>MUST</bcp14> have a consistent policy for executing
Search, Update, and Monitor queries against the logs in a way that maintains the
high-level security guarantees of KT:</t>
      <ul spacing="normal">
        <li>
          <t>If all transparency logs behave honestly, then users observe a globally
consistent view of the data associated with each label.</t>
        </li>
        <li>
          <t>If any transparency log behaves dishonestly such that the prior guarantee is
not met, this will be detected in a timely manner by background monitoring or
out-of-band communication.</t>
        </li>
      </ul>
      <section anchor="gradual-migration">
        <name>Gradual Migration</name>
        <t>In the case of gradually migrating from an old transparency log to a new one,
this policy may look like:</t>
        <ol spacing="normal" type="1"><li>
            <t>Search queries should be executed against the old transparency log first, and
then against the new transparency log only if the most recent version of a
label in the old transparency log is a special application-defined
'tombstone' entry.</t>
          </li>
          <li>
            <t>Update queries should only be executed against the new transparency log,
adding a tombstone entry to the old transparency log if one hasn't been
created already.</t>
          </li>
          <li>
            <t>Both transparency logs should be monitored as they would be if they were run
individually. Once the migration has completed and the old transparency log
has stopped accepting modifications, the old transparency log <bcp14>MUST</bcp14> stay
operational long enough for all users to complete their monitoring of it
(keeping in mind that some users may be offline for a significant amount of
time).</t>
          </li>
        </ol>
        <t>Placing a tombstone entry for each label in the old transparency log gives users
a clear indication as to which transparency log contains the most recent version
of a label. Importantly, it prevents users from incorrectly accepting a stale
version of a label if the new transparency log is unreachable.</t>
      </section>
      <section anchor="immediate-migration">
        <name>Immediate Migration</name>
        <t>In some situations, the service provider may instead choose to stop adding new
entries to a transparency log immediately and provide a new transparency log
that is pre-populated with the most recent versions of all labels. In this case,
the policy may look like:</t>
        <ol spacing="normal" type="1"><li>
            <t>Search queries must be executed against the new transparency log.</t>
          </li>
          <li>
            <t>Update queries must be executed against the new transparency log.</t>
          </li>
          <li>
            <t>The final tree size and root hash of the old transparency log is provided to
users over a trustworthy channel. Label owners issue final Monitor queries to
complete monitoring up to this point. Label owners initiate monitoring state
for the new transparency log by processing an Update for the migrated
versions of their labels and verifying that the migration was done correctly.
From then on, users will monitor only the new transparency log.</t>
          </li>
        </ol>
        <t>The final tree size and root hash of the prior transparency log need to be
distributed to users in a way that guarantees all users have a globally
consistent view. This can be done either by storing them in a well-known label
of the new transparency log or with the application's code distribution
mechanism.</t>
      </section>
      <section anchor="federation">
        <name>Federation</name>
        <t>In a federated application, many servers that are owned and operated by
different entities will cooperate to provide a single end-to-end encrypted
communication service. Each entity in a federated system provides its own
infrastructure (in particular, a transparency log) to serve the users that rely
on it. Given this, there must be a consistent policy for directing KT requests
to the correct transparency log. Typically in such a system, the end-user
identity directly specifies which entity requests should be directed to. For
example, with an email end-user identity like <tt>alice@example.com</tt>, the
controlling entity is <tt>example.com</tt>.</t>
        <t>A controlling entity like <tt>example.com</tt> <bcp14>MAY</bcp14> act as an anonymizing proxy for its
users when they query transparency logs run by other entities (in the manner of
<xref target="RFC9458"/>), but <bcp14>SHOULD NOT</bcp14> attempt to 'mirror' or combine other transparency
logs with its own.</t>
      </section>
    </section>
    <section anchor="pruning">
      <name>Pruning</name>
      <t>As part of the core infrastructure of an end-to-end encrypted communication
service, transparency logs are required to operate seamlessly for several years.
This presents a problem for general append-only logs, as even moderate usage can
cause the log to grow to an unmanageable size. This issue is further compounded
by the fact that a substantial portion of the entries added to a log may be
fake, having been added solely for the purpose of obscuring short-term update
rates (as discussed in <xref target="privacy-guarantees"/>). Given this, transparency logs
need to be able manage their footprint by pruning data which is no longer
required by the communication service.</t>
      <t>Broadly speaking, a transparency log's database will contain two types of data:</t>
      <ol spacing="normal" type="1"><li>
          <t>Serialized user data (the values corresponding to labels in the log), and</t>
        </li>
        <li>
          <t>Cryptographic data, such as pre-computed portions of hash trees or commitment
openings.</t>
        </li>
      </ol>
      <t>The first type, serialized user data, can be pruned by removing any entries that
the service operator's access control policy would never permit access to. For
example, a service operator may only permit clients to search for the most
recent version (or <tt>n</tt> versions) of a label. Any entries that don't meet this
criteria can be deleted without consideration to the rest of the protocol.</t>
      <t>The second type, cryptographic data, can also be pruned, but only after
considering which parts are no longer required by the protocol for producing
proofs. For example, even though the label-value pair inserted at a particular
entry in the append-only log may have been deleted, parts of the log entry may
still be needed to produce proofs for Search / Update / Monitor queries on other
labels. The exact mechanism for determining which data is safe to delete will
depend on the protocol and implementation.</t>
      <t>The distinction between user data and cryptographic data provides a valuable
separation of concerns, given that the protocol document does not provide a
mechanism for a service operator to convey its access control policy to a
transparency log. That is: pruning user data can be done entirely by
application-defined code, while pruning cryptographic data can be done entirely
by KT-specific code as a subsequent operation.</t>
    </section>
    <section anchor="security-guarantees">
      <name>Security Guarantees</name>
      <t>A user that correctly verifies a proof from the transparency log (and does any
required monitoring afterwards) receives a guarantee that the transparency log
operator executed the label-value lookup correctly, and in a way that's globally
consistent with what it has shown all other users. That is, when a user searches
for a label, they're guaranteed that the result they receive represents the same
result that any other user searching for the same label would've seen. When a user
modifies a label, they're guaranteed that other users will see the modification
the next time they search for the label.</t>
      <t>If the transparency log does not execute a label-value lookup correctly, then
either:</t>
      <ol spacing="normal" type="1"><li>
          <t>The user will detect the error immediately and reject the proof, or</t>
        </li>
        <li>
          <t>The user will permanently enter an invalid state.</t>
        </li>
      </ol>
      <t>Depending on the exact reason that the user enters an invalid state, it will
either be detected by background monitoring or by the mechanisms described in
<xref target="detecting-forks"/>. Importantly, this means that users must stay online for
some bounded amount of time after entering an invalid state for it to be
successfully detected.</t>
      <t>Alternatively, instead of executing a lookup incorrectly, the transparency log
can attempt to prevent a user from learning about more recent states of the log.
This would allow the log to continue executing queries correctly, but on
outdated versions of data. To prevent this, applications configure an upper
bound on how stale a query response can be without being rejected.</t>
      <t>The exact caveats of the above guarantees depend naturally on the security of
underlying cryptographic primitives and also the deployment mode that the
transparency log relies on:</t>
      <ul spacing="normal">
        <li>
          <t>Third-Party Management and Third-Party Auditing require an assumption that the
transparency log and the third-party manager or auditor do not collude
to trick users into accepting malicious results.</t>
        </li>
        <li>
          <t>Contact Monitoring requires an assumption that the user that owns a label and
all users that look up the label do the necessary monitoring afterwards.</t>
        </li>
      </ul>
      <t>In short, assuming that the underlying cryptographic primitives used are secure,
any deployment-specific assumptions hold (such as non-collusion), and that user
devices don't go permanently offline, then malicious behavior by the
transparency log is always detected within a bounded amount of time. The
parameters that determine the maximum amount of time before malicious behavior
is detected are as follows:</t>
      <ul spacing="normal">
        <li>
          <t>The configured maximum amount of time by which a query response can be stale.</t>
        </li>
        <li>
          <t>The configured Reasonable Monitoring Window (described in
<xref section="7.1" sectionFormat="of" target="PROTO"/>), weighed against how frequently users execute
background monitoring in practice.</t>
        </li>
        <li>
          <t>For logs that use the Contact Monitoring deployment mode: how frequently users
engage in anonymous communication with the transparency log, or peer-to-peer
communication with other users.</t>
        </li>
        <li>
          <t>For logs that use the Third-Party Auditing deployment mode: the configured
maximum acceptable lag for an auditor.</t>
        </li>
      </ul>
      <section anchor="privacy-guarantees">
        <name>Privacy Guarantees</name>
        <t>For applications deploying KT, service operators expect to be able to control
when sensitive information is revealed. In particular, a service operator can
often only reveal that a user is a member of their service, and information
about that user's account, to that user's friends or contacts.</t>
        <t>KT only allows users to learn whether or not a label exists in the
transparency log if the user obtains a valid search proof for that label.
Similarly, KT only allows users to learn about the value of a label if
the user obtains a valid search proof for the exact label and version.</t>
        <t>When a user was previously allowed to lookup or change a label's value but no
longer is, KT prevents the user from learning whether or not the label's value
has changed since the user's access was revoked. This is true even in Contact
Monitoring mode, where users are still permitted to perform monitoring after
their access to perform other queries has been revoked.</t>
        <t>Applications determine the privacy of data in KT by
relying on these properties when they enforce access control policies on the
queries issued by users, as discussed in <xref target="protocol-overview"/>. For example if
two users aren't friends, an application can block these users from searching
for each other's labels. This prevents both users from learning about
each other's existence. If the users were previously friends but no longer are,
the application can prevent the users from searching for each other's labels and
learning the contents of any subsequent account updates.</t>
        <t>Service operators also expect to be able to control sensitive population-level
metrics about their users. These metrics include the size of their user base, the
frequency with which new users join, and the frequency with which existing users
update their labels.</t>
        <t>KT allows a service operator to obscure the size of its user base by batch
inserting a large number of fake label-version pairs when a transparency log is
first initialized. Similarly, KT also allows a service operator to obscure the
rate at which "real" changes are made to the transparency log by padding "real"
changes with the insertion of other fake label-version pairs such that it
creates the outside appearance of a constant baseline rate of insertions.</t>
        <section anchor="leakage-to-third-party">
          <name>Leakage to Third-Party</name>
          <t>In the event that a third-party auditor or manager is used, there's additional
information leaked to the third-party that's not visible to outsiders.</t>
          <t>In the case of a third-party auditor, the auditor is able to learn the total
number of distinct changes to the log. It is also able to learn the order and
approximate timing with which each change was made. However, auditors are not
able to learn the plaintext of any labels or values. This is because labels
are masked with a VRF, and values are only provided to auditors as commitments.
They are also not able to distinguish between whether a change represents a label
being created for the first time or being updated, or whether a change
represents a "real" change from an end-user or a "fake" padding change.</t>
          <t>In the case of a third-party manager, the manager generally learns everything
that the service operator would know. This includes the total set of plaintext
labels and values and their modification history. It also includes traffic
patterns, such as how often a specific label is looked up.</t>
        </section>
      </section>
    </section>
    <section anchor="privacy-law-considerations">
      <name>Privacy Law Considerations</name>
      <t>Consumer privacy laws often provide a 'right to erasure'. This means that when a
consumer requests that a service provider delete their personal information, the
service provider is legally obligated to do so. This may seem to be incompatible
with the description of KT in <xref target="introduction"/> as an 'append-only log'. Once an
entry is added to a transparency log, it indeed can not be removed.</t>
      <t>The important caveat here is that user data is not directly stored in the
append-only log. Instead, the log consists of privacy-preserving cryptographic
commitments. By logging commitments instead of plaintext user data, users
interacting with the log are unable to infer anything about an entry's contents
until the service provider explicitly provides the commitment's opening. A
service provider responding to an erasure request can delete the commitment
opening and the associated data, effectively anonymizing the entry.</t>
      <t>Other than the log, the second place where user information is stored is in the
<em>prefix tree</em>. This is a cryptographic index provided to users to enable them to
efficiently query the log, which contains information about which labels
exist and where. These labels are usually serialized end-user identifiers,
although it varies by application. To minimize leakage, all labels are
processed through a Verifiable Random Function, or VRF <xref target="RFC9381"/>.</t>
      <t>A VRF deterministically maps each label to the fixed-length pseudorandom
value. Only the service operator, who holds a private key, can execute the VRF.
Critically though, VRFs can provide proof that an input-output pair is
valid, which users verify with a public key. When a user tries to search for or
update a label, the service operator first executes its VRF on the input label
to obtain the index that will actually be looked up or stored in the
prefix tree. The service operator then provides the VRF output, along with a
proof that the output is correct, in its response to the user.</t>
      <t>The pseudorandom property of VRFs means that even if a user indirectly observes
that a specific VRF output exists in the prefix tree, they can't learn which
user it identifies. The inability of users to execute the VRF
themselves also prevents offline "password cracking" approaches, where an
attacker tries all possibilities in a low entropy space (like the set of phone
numbers) to find the input that produces a given output.</t>
      <t>A service provider responding to an erasure request can 'trim' the prefix tree,
by no longer storing the full VRF output for any labels corresponding to an
end-user's identifiers. With only a small amount of the VRF output left in
storage, even if the transparency log is later compromised, it would be unable
to recover deleted identifiers. If the same labels were reinserted into the
log at a later time, it would appear as if they were being inserted for the
first time.</t>
      <t>As an example, consider the information stored in a transparency log after
inserting a label <tt>L</tt> with value <tt>V</tt>. The index inserted into the prefix tree would
roughly correspond to <tt>VRF(label L) = pseudorandom bytes</tt>, and the value stored in
the append-only log would roughly correspond to:</t>
      <artwork><![CDATA[
Commit(nonce: random bytes, body: version N of label L is V)
]]></artwork>
      <t>After receiving an erasure request, the transparency log deletes the label, value,
and random commitment nonce. It also trims the VRF output to the minimum size
necessary. The commitment scheme guarantees that, without the high-entropy
random nonce, the remaining commitment reveals nothing about the label or value.</t>
      <t>Assuming that the prefix tree is well-balanced (which is extremely likely due to
VRFs being pseudorandom), the number of VRF output bits retained is
approximately equal to the logarithm of the total number of labels stored. This
means that while the VRF's full output may be 256 bits, in a log with one
million labels, only 20 output bits would need to be retained. This would be
insufficient for recovering even a very low-entropy identifier like a phone
number.</t>
    </section>
    <section anchor="implementation-guidance">
      <name>Implementation Guidance</name>
      <t>Fundamentally, KT can be thought of as guaranteeing that all the users of a
service agree on the contents of a key-value database (noting that this document
refers to these keys as "labels"). It takes special care to turn the guarantee
that all users agree on a set of labels and values into a guarantee that the
mapping between end-users and their public keys is authentic. Critically, to
authenticate an end-user identity, it must be both <em>unique</em> and <em>user-visible</em>.
However, what exactly constitutes a unique and user-visible identifier varies
greatly from application to application.</t>
      <t>Consider, for example, a communication service where users are uniquely
identified by a fixed username, but KT has been deployed using each user's
internal UUID as their label. While the UUID might be unique, it is not
necessarily user-visible. When a user attempts to lookup a contact by username,
the service operator translates the username into a user UUID under the hood. If
this mapping (from username to UUID) is unauthenticated, the service operator
could manipulate it to eavesdrop on conversations by returning the UUID for an
account that it controls. From a security perspective, this would be equivalent
to not using KT at all.</t>
      <t>However, that's not to say that the use of internal UUIDs in KT is never
appropriate. Many applications don't have a concept of a fixed explicit
identifier, like a username, and instead rely on their UI (underpinned
internally by a user's ID) to indicate to users whether a conversation is with a
new person or someone they've previously contacted. The fact that the UI behaves
this way makes the user's ID a user-visible identifier even if a user may not be
able to actually see it written out. An example of this kind of application
would be Slack.</t>
      <t>A <strong>primary end-user identity</strong> is one that is unique, user-visible, and unable
to change. (Or equivalently, if it changes, it appears in the application UI as
a new conversation with a new user.) A primary end-user identity should always
be a label in KT, with the end-user's public keys and other account information
as the associated value.</t>
      <t>A <strong>secondary end-user identity</strong> is one that is unique, user-visible, and able
to change without being interpreted as a different account due to its
association with a primary end-user identity. These identities are used solely
for initial user discovery, during which they're converted into a primary
end-user identity (like a UUID) that's used by the application to identify the
end-user from then on. An example of this type of identity would be a phone
number, since users can often change the phone number they use with a service
without disrupting existing communications. A secondary end-user identity should
be a label in KT with the primary end-user identity as the associated value,
such that it can be used to authenticate the user discovery process.</t>
      <t>While likely helpful to most common applications, the distinction between
handling primary and secondary end-user identities is not a guaranteed rule.
Applications must be careful to ensure they fully capture the semantics of
identity in their application with the label-value pairs they store in KT.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="PROTO">
          <front>
            <title>Key Transparency Protocol</title>
            <author fullname="Brendan McMillion" initials="B." surname="McMillion">
         </author>
            <author fullname="Felix Linker" initials="F." surname="Linker">
         </author>
            <date day="4" month="June" year="2025"/>
            <abstract>
              <t>   While there are several established protocols for end-to-end
   encryption, relatively little attention has been given to securely
   distributing the end-user public keys for such encryption.  As a
   result, these protocols are often still vulnerable to eavesdropping
   by active attackers.  Key Transparency is a protocol for distributing
   sensitive cryptographic information, such as public keys, in a way
   that reliably either prevents interference or detects that it
   occurred in a timely manner.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-protocol-01"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="sealed-sender" target="https://signal.org/blog/sealed-sender/">
          <front>
            <title>Technology preview: Sealed sender for Signal</title>
            <author>
              <organization/>
            </author>
            <date year="2018" month="October" day="29"/>
          </front>
        </reference>
        <reference anchor="RFC6962">
          <front>
            <title>Certificate Transparency</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Kasper" initials="E." surname="Kasper"/>
            <date month="June" year="2013"/>
            <abstract>
              <t>This document describes an experimental protocol for publicly logging the existence of Transport Layer Security (TLS) certificates as they are issued or observed, in a manner that allows anyone to audit certificate authority (CA) activity and notice the issuance of suspect certificates as well as to audit the certificate logs themselves. The intent is that eventually clients would refuse to honor certificates that do not appear in a log, effectively forcing CAs to add all issued certificates to the logs.</t>
              <t>Logs are network services that implement the protocol operations for submissions and queries that are defined in this document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6962"/>
          <seriesInfo name="DOI" value="10.17487/RFC6962"/>
        </reference>
        <reference anchor="RFC9420">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="R. Robert" initials="R." surname="Robert"/>
            <author fullname="J. Millican" initials="J." surname="Millican"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9420"/>
          <seriesInfo name="DOI" value="10.17487/RFC9420"/>
        </reference>
        <reference anchor="RFC9458">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <abstract>
              <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </reference>
        <reference anchor="RFC9381">
          <front>
            <title>Verifiable Random Functions (VRFs)</title>
            <author fullname="S. Goldberg" initials="S." surname="Goldberg"/>
            <author fullname="L. Reyzin" initials="L." surname="Reyzin"/>
            <author fullname="D. Papadopoulos" initials="D." surname="Papadopoulos"/>
            <author fullname="J. Včelák" initials="J." surname="Včelák"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>A Verifiable Random Function (VRF) is the public key version of a keyed cryptographic hash. Only the holder of the secret key can compute the hash, but anyone with the public key can verify the correctness of the hash. VRFs are useful for preventing enumeration of hash-based data structures. This document specifies VRF constructions based on RSA and elliptic curves that are secure in the cryptographic random oracle model.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9381"/>
          <seriesInfo name="DOI" value="10.17487/RFC9381"/>
        </reference>
      </references>
    </references>
    <?line 909?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19e3Mbx5Xv//0pZuk/RLIAKrKz3oSVx9KSnagsWV6JTja1
tVUeAA1iosEMMjMghSjKZ9nPcj/ZPb/z6O55gKIdV+69VZflskhgph+nT5/3
Yz6fu67oSn+ZnXztD9l1k1ftLm98tTxkV81yU3R+2e0bf+KWeedv6uZwmRXV
unZuVS+rfEsvrpp83c0L363nb/2hwwjzPHl1/rOfu3a/2BZtW9RVd9jRO8+/
vP7KVfvtwjeXbkUjX7plXbW+avftZdY1e+9uL7PPHK0kp6W98ct9U3SHE3dX
N29vmnq/m1jwiaP56YHVpcvmGf2edcm37tZXe5ony46/n2WyvJM/0jRFdZP9
Do/i821elPS5bfDfsd2LurnBd9gsfbfpul17+fgxHuX93/oLe+wxPni8aOq7
1j+2QR7j5Zui2+wX9DoD8O4mwPCxwBUv4rmSgNR2yTTD5y9kpIuiTt58/LHD
udh02/LEuXzfbeoGgKO5smy9L0s53S8INKu8yl4uXxZlSQfI33uBx0K+3C63
8t2/3+Dzi2W9da6qm23eERAunQPGhL+yrPV56VdzOu4Vzh8Ddnlz42l7tru2
uKnykkG3KOubx71XHssrirfXfrmpanrokO0af1v4u8vsDT+eyeMZTZ694QFP
+E1GuOzTnz35xfzJz+af/tI5N5/Ps3zREoCWnXPXm6LNCMH3W1912cqvi8q3
WbfxWeebbaGz5dWK7gJ9Qu/Q5rNd3tEfVUsf3tblrce3eMmt/K6sDzxWvc5G
94yeyrMbX9FAJS2ZUN0LjmZb37b5DSEiINjktLw9n9qM5253flmsC11Zq3eE
gFDvfNPJ53nHX9JnXb2sS0e/3BYr315kz7ssL9uaEPCWntzWmFTWMMuqupoT
LNtlU+xwaNnNvqBzXvqMtrmp77KudrLQksCw29H/R7vqatqVXHHsmnBiSy/j
4YJICcGrvRCwb4vVqvTOfZI9r7qmXu0Zms594ddYVF4dsoA/NMKSkHHhM/9u
ucmrGwEyfUQnPe/qOf1Dvy6bw67D+R/azm9nWXdXu25DcKSN7tsu29AyfHWZ
fVU0bTejgyNwLYtdXnWtnpm+Ko8r0BTMzW2x9A4wzjtCrDu6drzI3X5BWwPd
4QM50DftBmDYtx7/NH7pAUs5VBwBkbW6Ws0YR3TcLIzLM7f11gPeq4LOvljs
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
IUOMSxLzZC7QIIy16gIVIcf1CUyazzK2tFgclUZAp4o1mD/N4GSGhWUWQeag
AZgFx2x/NYpb1vw9NnFn0um0XTl4woXrmB6Z7AmMURkgzNhOnSwWt3WPZKr2
qexZLILxkgSIlt2T5vlpYIZDOgTN1IqPiUVCaCK0HjaHCFedI5ko2rLAAQGv
yGS3GFwVZswoYsvYksfWDpWULrIvwb7xqthsSpI9YXuKwypMtuy24PB1Vc6X
hxBirA4XzM3C3aTcYaHh5i6R7JFEHX4ZFFjEKdPT/a+vVPnFl9DL7urEsim7
d71TPKYErTyCbzvPog+gW9DOgirsBHOjrpWmCZikgcAvSRczSwWi1FrCNjF9
diFEHXpcCII7YlgdqrV3yA12ptDBwNMURIaB+CKe5RwVhAOO+euESfuS0/1Y
cNdzCOYBAdCMRcVwSdlmGXMexfJTaN5LU+9F8HT3LpxFypDI0Sb6Z6qusmGH
sC3MVbGBSm/uCAIW5ID1SnaDgBRqihP3ZKLtRydbYsFORotB2DhpOhLfWB0W
htU0Eo7NDeq/Eh14m/+5jpqkR7LyWzioaTuSWNSq+ZpTe4N516InOa4oHP5I
n0ZiCTbYcqhkqE0gmPXIQiYvstH67ZaMrbxMCj+6BSZGH185L7BedBoIHM5C
cSrvoV6udi6+mzeIyRDad4sIGD0Oc1FaGGKwFWaimO2XEr5i1mwQj6eKPS+D
rwAmPtXgRQVFkMPM6F0bbBq6sEg/nOSY1P2Lf82xtUKhrTyMGAXuktiH0oKN
8yQE2FmihdSiyS3jBiZaMRotmWrMoi0AxnDLlm88ZyDBh+HoqFlBQ0WGjkNP
q+AfiTbxbE8Mq1T1VqPZNTXifJUKT4wHwKjDeXaat/0Y2X/59vWr61e/fj5/
dtGvnWVG9Q8fzhKDtQt755CjcfCy1eLxTFqmARBdPU78AUtE/CfJV1CCK9SJ
gXc7AIOpwygOR/L3qinOl+aLKOq4iDrCBDlxXpFUkxNVT07tzpmlpwWm7/qB
VceNcEgtvMemMrb/rsy7NeepP3wAEH7stlWokvvuRuzBEgoGqXy+Yr6XZyfj
G8cyzYkVuKDfLbNQqqC0MWQmcYxJNuMjS3xDMqUEYSxzrhlFa5NHkqhm3CBh
1aMd3uXt1OEmq+SVJW6awqI+6EI1nd42JmRywRZwNyWR00BzT6xrZ6HT4lkx
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

-->

</rfc>
