<?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.35 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-keytrans-architecture-08" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title>Key Transparency Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-08"/>
    <author fullname="Brendan McMillion">
      <organization/>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="April" day="12"/>
    <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>
        <dt><strong>Transparency Log Configuration:</strong></dt>
        <dd>
          <t>The fixed, public parameters of a Transparency Log such as the log's cipher
suite and public key. Configuration is pre-distributed to users through a
trustworthy channel and used for proof verification.</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. Most applications will likely want to, at
minimum, 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 a proof that the search operation was
executed correctly.</t>
          </li>
          <li>
            <t><strong>Update:</strong> Adds a new label-value pair to the log. The server returns a
proof that the label-value pair was added correctly. Note that this means
that new values are added to the log immediately and no provisional proof,
such as an Signed Certificate Timestamp (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 376,96" fill="none" stroke="black"/>
                <path d="M 32,112 L 208,112" fill="none" stroke="black"/>
                <path d="M 136,144 L 376,144" fill="none" stroke="black"/>
                <path d="M 32,160 L 208,160" fill="none" stroke="black"/>
                <path d="M 192,192 L 376,192" fill="none" stroke="black"/>
                <path d="M 32,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="384,192 372,186.4 372,197.6" fill="black" transform="rotate(0,376,192)"/>
                <polygon class="arrowhead" points="384,144 372,138.4 372,149.6" fill="black" transform="rotate(0,376,144)"/>
                <polygon class="arrowhead" points="384,96 372,90.4 372,101.6" fill="black" transform="rotate(0,376,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="40,208 28,202.4 28,213.6" fill="black" transform="rotate(180,32,208)"/>
                <polygon class="arrowhead" points="40,160 28,154.4 28,165.6" fill="black" transform="rotate(180,32,160)"/>
                <polygon class="arrowhead" points="40,112 28,106.4 28,117.6" fill="black" transform="rotate(180,32,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 <bcp14>SHOULD</bcp14> be provided to recipients
proactively by the sender, as this is the most robust way to preserve the
sender's anonymity. If required future monitoring isn't provided, either
accidentally or because the system was intentionally designed that way, 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="192" width="504" viewBox="0 0 504 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,176" fill="none" stroke="black"/>
                <path d="M 272,48 L 272,176" fill="none" stroke="black"/>
                <path d="M 432,80 L 432,88" fill="none" stroke="black"/>
                <path d="M 496,48 L 496,176" fill="none" stroke="black"/>
                <path d="M 16,64 L 144,64" fill="none" stroke="black"/>
                <path d="M 184,80 L 264,80" fill="none" stroke="black"/>
                <path d="M 448,96 L 488,96" fill="none" stroke="black"/>
                <path d="M 16,128 L 136,128" fill="none" stroke="black"/>
                <path d="M 192,144 L 264,144" fill="none" stroke="black"/>
                <path d="M 456,160 L 488,160" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="496,160 484,154.4 484,165.6" fill="black" transform="rotate(0,488,160)"/>
                <polygon class="arrowhead" points="496,96 484,90.4 484,101.6" fill="black" transform="rotate(0,488,96)"/>
                <polygon class="arrowhead" points="272,144 260,138.4 260,149.6" fill="black" transform="rotate(0,264,144)"/>
                <polygon class="arrowhead" points="272,80 260,74.4 260,85.6" fill="black" transform="rotate(0,264,80)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <polygon class="arrowhead" points="24,64 12,58.4 12,69.6" fill="black" transform="rotate(180,16,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="408" y="84">Group</text>
                  <text x="376" y="100">SearchResponse)</text>
                  <text x="204" y="132">Monitor(Alice)</text>
                  <text x="100" y="148">MonitorResponse(...)</text>
                  <text x="332" y="148">Encrypt(Anon</text>
                  <text x="412" y="148">Group,</text>
                  <text x="380" y="164">MonitorResponse)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Transparency Log               Alice           Anonymous Group
|                                |                           |
|<---------------- Search(Alice) |                           |
| SearchResponse(...) ---------->| Encrypt(Anon Group,       |
|                                |     SearchResponse) ----->|
|                                |                           |
|<--------------- 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 produces
a signature on the most recent tree head. The transparency log provides this
signature to users inline 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 568,96" fill="none" stroke="black"/>
                <path d="M 240,112 L 328,112" fill="none" stroke="black"/>
                <path d="M 16,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 224,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="576,96 564,90.4 564,101.6" fill="black" transform="rotate(0,568,96)"/>
                <polygon class="arrowhead" points="568,224 556,218.4 556,229.6" fill="black" transform="rotate(0,560,224)"/>
                <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="248,112 236,106.4 236,117.6" fill="black" transform="rotate(180,240,112)"/>
                <polygon class="arrowhead" points="232,240 220,234.4 220,245.6" fill="black" transform="rotate(0,224,240)"/>
                <polygon class="arrowhead" points="24,224 12,218.4 12,229.6" fill="black" transform="rotate(180,16,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>To reduce the probability of collusion between the transparency log and the
third party, a transparency log can have two or more independent third parties
coordinate as one and produce threshold signatures. In this scenario, the
threshold for a valid signature <bcp14>MUST</bcp14> be at least a majority of the third
parties, to prevent different subsets from authenticating forked views.</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> (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>MAY</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 288,64" fill="none" stroke="black"/>
                <path d="M 16,80 L 120,80" fill="none" stroke="black"/>
                <path d="M 128,144 L 288,144" fill="none" stroke="black"/>
                <path d="M 16,160 L 112,160" fill="none" stroke="black"/>
                <path d="M 304,224 L 456,224" fill="none" stroke="black"/>
                <path d="M 480,240 L 568,240" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,240 564,234.4 564,245.6" fill="black" transform="rotate(0,568,240)"/>
                <polygon class="arrowhead" points="312,224 300,218.4 300,229.6" fill="black" transform="rotate(180,304,224)"/>
                <polygon class="arrowhead" points="296,144 284,138.4 284,149.6" fill="black" transform="rotate(0,288,144)"/>
                <polygon class="arrowhead" points="296,64 284,58.4 284,69.6" fill="black" transform="rotate(0,288,64)"/>
                <polygon class="arrowhead" points="24,160 12,154.4 12,165.6" fill="black" transform="rotate(180,16,160)"/>
                <polygon class="arrowhead" points="24,80 12,74.4 12,85.6" fill="black" transform="rotate(180,16,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 an arbitrary "point in time" basis, where a user is allowed to
execute the query at one point in time but maybe not the next, users are
sometimes required by the protocol to make Monitor queries based on the Search
and Update queries they made in the past. These Monitor queries <bcp14>MUST</bcp14> 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 (at minimum) 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>When running synchronously, the auditor can easily become a bottleneck for the
transparency log. It's generally expected that third-party auditors run
asynchronously, downloading and authenticating a log's contents in the
background. 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 328,64" fill="none" stroke="black"/>
                <path d="M 160,80 L 328,80" fill="none" stroke="black"/>
                <path d="M 176,96 L 328,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 568,160" fill="none" stroke="black"/>
                <path d="M 344,176 L 432,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,160 564,154.4 564,165.6" fill="black" transform="rotate(0,568,160)"/>
                <polygon class="arrowhead" points="352,176 340,170.4 340,181.6" fill="black" transform="rotate(180,344,176)"/>
                <polygon class="arrowhead" points="336,96 324,90.4 324,101.6" fill="black" transform="rotate(0,328,96)"/>
                <polygon class="arrowhead" points="336,80 324,74.4 324,85.6" fill="black" transform="rotate(0,328,80)"/>
                <polygon class="arrowhead" points="336,64 324,58.4 324,69.6" fill="black" transform="rotate(0,328,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 240,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 504,64" fill="none" stroke="black"/>
                <path d="M 16,80 L 232,80" fill="none" stroke="black"/>
                <path d="M 256,80 L 336,80" fill="none" stroke="black"/>
                <path d="M 176,112 L 240,112" fill="none" stroke="black"/>
                <path d="M 264,112 L 504,112" fill="none" stroke="black"/>
                <path d="M 16,128 L 232,128" fill="none" stroke="black"/>
                <path d="M 256,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="512,112 500,106.4 500,117.6" fill="black" transform="rotate(0,504,112)"/>
                <polygon class="arrowhead" points="512,64 500,58.4 500,69.6" fill="black" transform="rotate(0,504,64)"/>
                <polygon class="arrowhead" points="264,128 252,122.4 252,133.6" fill="black" transform="rotate(180,256,128)"/>
                <polygon class="arrowhead" points="264,80 252,74.4 252,85.6" fill="black" transform="rotate(180,256,80)"/>
                <polygon class="arrowhead" points="248,112 236,106.4 236,117.6" fill="black" transform="rotate(0,240,112)"/>
                <polygon class="arrowhead" points="248,64 236,58.4 236,69.6" fill="black" transform="rotate(0,240,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="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <polygon class="arrowhead" points="24,80 12,74.4 12,85.6" fill="black" transform="rotate(180,16,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 <bcp14>SHOULD</bcp14> generally be prepared to interact with multiple
independent transparency logs, as quickly migrating to a new transparency log is
the  generally recommended way to recover from log failure. 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, 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 are 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 are only executed against the new transparency log, with
the exception of adding a tombstone entry for the label to the old
transparency log if one hasn't been added already.</t>
          </li>
          <li>
            <t>Both transparency logs are 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. If the old transparency log is shut down before a user is able to
complete their monitoring of it, that user will be unable to detect some
forms of misbehavior by the old transparency log.</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. Users issue their 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 by storing them in a well-known label of the
new transparency log. Users <bcp14>MUST</bcp14> process this well-known label as if they own
it, so that they continue to monitor it for unexpected changes for the duration
of the migration period. Alternatively, the final tree size and root hash may be
distributed 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 <bcp14>MUST</bcp14> 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. This ensures that all transparency logs can consistently
enforce their access control policies as intended, manage compliance with
privacy laws, and modify label values quickly and without interference from
third-party caches.</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 in that time frame. 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 (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
have either expired, or to which the service operator's access control policy
would never permit access. A version of a label expires when it is no longer
possible to produce a valid search proof for the label-version pair, which
happens when all of the necessary log entries have passed their <strong>maximum
lifetime</strong> (as defined in <xref target="PROTO"/>).</t>
      <t>Notably, the greatest version of a label is the only version that never expires
through the maximum lifetime mechanism. However, service operators may define
arbitrary access control policies that permanently block access to the greatest
(or any other versions) of a label. The values corresponding to these
label-version pairs may also be deleted without consideration to the rest of the
protocol.</t>
      <t>The second type of data, 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 a particular version of a label may have been
deleted, the corresponding VRF output and commitment may still need to exist in
the latest version of the transparency log's prefix tree to produce valid search
proofs for other versions of the label. 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 since <xref target="PROTO"/> does not provide a way for a service
operator to convey its access control policy to a transparency log. That is, it
allows the pruning of user data to be done entirely by application-defined code,
while the pruning of 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 operation 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 at roughly the same time
would've seen. When a user modifies a label, they're guaranteed that other users
will see the modification within a bounded amount of time, or will
themselves permanently enter an invalid state as discussed below.</t>
      <t>If the transparency log does not execute an operation 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
a 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
stale 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
the 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>
        <li>
          <t>For logs that use the Third-Party Management deployment mode: the amount of
lag, or potential inefficacy, of the service operator's approach to detecting
forks.</t>
        </li>
      </ul>
      <section anchor="state-loss">
        <name>State Loss</name>
        <t>The security of KT often depends on the ability of users to maintain robust
local state. Users that lose their state in a Contact Monitoring or Third-Party
Auditing deployment will have a correspondingly reduced ability to detect if
they were shown a fork, or if the transparency log later obscured data that they
consumed.</t>
        <t>In a Contact Monitoring deployment mode, this can happen when a user loses their
state after consuming a version of a label that was created either within the
Reasonable Monitoring Window, or within a portion of the log that was
insufficiently gossipped. In a Third-Party Auditing deployment mode, this can
happen when a user loses their state after consuming a version of a label that
was created within the auditor's maximum acceptable lag.</t>
        <t>Applications should consider the nature of possible state loss in their clients
when configuring a transparency log and <bcp14>MUST</bcp14> ensure that the relevant protocol
parameters are set in a way that appropriately mitigates this risk.
For example, in a Contact Monitoring deployment, the Reasonable Monitoring
Window and the duration between out-of-band communication attempts <bcp14>SHOULD</bcp14> be
much less than the typical time between state loss events. Similarly, in a
Third-Party Auditing deployment, the maximum acceptable lag for an auditor
<bcp14>SHOULD</bcp14> be much less than the typical time between state loss events. This
minimizes the likelihood that a state loss event could be useful to a
misbehaving transparency log.</t>
        <t>In applications where client state is typically ephemeral (like a web page), or
where state loss could possibly be triggered adversarially, a Third-Party
Management deployment mode is <bcp14>RECOMMENDED</bcp14>. Alternatively, applications could
also consider implementing a policy of not consuming label-version pairs that
were inserted too recently. Once a label-version pair is outside of the
Reasonable Monitoring Window in a Contact Monitoring deployment, or beyond the
maximum acceptable auditor lag in a Third-Party Auditing deployment, the risks
associated with state loss are often already sufficiently mitigated.</t>
      </section>
      <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 that exact version of the label.</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 <em>right to erasure</em>. 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. The
important caveat here is that user data is not directly stored in the
append-only log. Instead, it primarily contains privacy-preserving VRF outputs
and cryptographic commitments.</t>
      <t>The value corresponding to a label is typically some serialized user account
data, like a public key or internal identifier. KT uses cryptographic
commitments to ensure that users interacting with a transparency log are unable
to learn anything about a label's value until the transparency log explicitly
provides the commitment's opening. A transparency log responding to an erasure
request can delete the commitment opening and the associated data. This can be
done immediately and permanently prevents recovery of the associated value.</t>
      <t>Labels themselves are typically serialized end-user identifiers, like a username
or email address. All labels are processed through a Verifiable Random Function,
or VRF <xref target="RFC9381"/>, which uses a private key to deterministically map each label to a fixed-length
pseudorandom value. The set of all labels stored in a transparency log is
committed to by a prefix tree, and each version of the prefix tree is committed
to by a log tree.</t>
      <t>While all the VRF outputs corresponding to labels affected by an erasure request
can be deleted from the most recent version of the prefix tree immediately,
previous versions of the prefix tree will still contain the VRF outputs and will
still be needed by the protocol for a bounded amount of time. This bound is
defined by the log entry maximum lifetime discussed in <xref target="PROTO"/>. As such, the
VRF outputs can only be fully purged from the transparency log once all log
entries that contain them have passed their maximum lifetime. After this point,
they are no longer necessary for the protocol to operate.</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.) An example of this type of identifier would
be an email address on an email service. A primary end-user identity <bcp14>SHOULD</bcp14>
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 username,
since users can often change their username without disrupting existing
communications. A secondary end-user identity <bcp14>SHOULD</bcp14> 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 labels and values 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="19" month="October" 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-03"/>
        </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>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1965LcxrHm/3oKnNEPDie6R5bk1ZEZtmyKpGyGSFGHHNnH
ceJEGN1Ad8NEA21cZtim6WfZZ9kn2/zyUlW49MzoEt7diGU4LHIGKFRlZeX1
y6zlcum6oivzR8nZN/kxuWrSqj2kTV6tj8njZr0runzd9U1+5tZpl2/r5vgo
KapN7VxWr6t0Ty9mTbrplkXebZZv82OHEZZp9OryF1+4tl/ti7Yt6qo7Huid
58+uvnZVv1/lzSOX0ciP3Lqu2rxq+/ZR0jV97q4fJZ85mklKU3uTr/um6I5n
7qZu3m6buj/MTPjM0ffpgeyRS5YJ/T3pot+667zq6TtJcvr9JJHpnf2JPlNU
2+T3eBQ/36dFST+3Bf4Oy72smy1+h8XS73Zdd2gfffwxHuX1X+eX9tjH+MHH
q6a+afOPbZCP8fK26Hb9il5nAt5sPQ0/FrriRTxXEpHaLvrM+PlLGemyqKM3
P75rcy533b48cy7tu13dgHD0rSTZ9GUpu/sVkSZLq+Tl+mVRlrSB/Ptc6LGS
X+7Xe/nd77b4+eW63jtX1c0+7YgIj5wDx/h/JUmbp2WeLWm7M+w/BuzSZpvT
8mx1bbGt0pJJtyrr7ceDVz6WV5Rvr/L1rqrpoWNyaPLrIr95lLzhxxN5PKGP
J294wDN+kxku+fQXn3yx/OQXy09/5ZxbLpdJumqJQOvOuatd0SbE4P0+r7ok
yzdFlbdJt8uTLm/2hX4trTI6C/QTeocWnxzSjv5RtfTD67q8zvFbvOSy/FDW
Rx6r3iSTc0ZPpck2r2igkqZMrJ4Ljyb7vG3TLTEiKNikNL2ed23B324P+brY
FDqzVs8IEaE+5E0nP087/iX9rKvXdenoL9dFlreXyfMuScu2Jga8pif3NT4q
c1gkVV0tiZbtuikO2LRk2xe0z+s8oWXu6pukq51MtCQyHA70/5NVdTWtSo44
Vk08saeX8XBBooTo1V4K2fdFlpW5cx8lz6uuqbOeqencV/kGk0qrY+L5h0ZY
EzOu8iR/t96l1VaITD+inV529ZL+Q39dN8dDh/0/tl2+XyTdTe26HdGRFtq3
XbKjaeTVo+Tromm7BW0ckWtdHNKqa3XP9FV5XImmZG6ui3XuQOO0I8a6oWPH
kzz0K1oa5A5vyJF+0+5Ahr7N8Z8mX+egpWwqtoDEWl1lC+YRHTfx4/KX23qf
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
9Sp2HfROTXkyXWtW538D/IMp4bjIAAA=

-->

</rfc>
