<?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.23 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-keytrans-architecture-03" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.27.0 -->
  <front>
    <title>Key Transparency Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-03"/>
    <author fullname="Brendan McMillion">
      <organization/>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="February" day="20"/>
    <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 (KT) 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 KT 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. With this approach,
the service operator needs to be trusted to provide the correct public keys,
which 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 exchanged
between users flow through the service operator's servers, so it's extremely
easy for an operator to launch an active attack. That is, the service operator
can provide fake public keys which it knows the private keys for, associate
those public keys with a user's account without the user's knowledge, and then
use them 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 key's owner and the owner's contacts,
in which case a user can detect that 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
with out-of-band communication.</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 communications service that allows end-users to engage in text, voice,
video, or other forms of communication over the Internet, that 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 and software
resources necessary to operate an end-to-end encrypted communication service.</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. The transparency
log is usually run either entirely or partially by the service operator.</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/or 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 past version. Users are considered to <strong>own</strong> a key if,
in the normal operation of the application, they should be the only one making
changes to it. 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/private keys.</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 simply applying a rate
limit. Applications <bcp14>SHOULD</bcp14> prevent users from modifying labels that they don't
own. The exact mechanism for rejecting requests, and possibly explaining the
reason for rejection, is left to the application.</t>
    </section>
    <section anchor="user-interactions">
      <name>User Interactions</name>
      <t>As discussed in <xref target="protocol-overview"/>, KT follows a client-server architecture.
This means users generally interact directly with the transparency log. The
operations that can be executed by a user are as follows:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Search:</strong> Performs a lookup on 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 of inclusion.</t>
        </li>
        <li>
          <t><strong>Update:</strong> Adds a new label-value pair to the log, for which the server
returns a proof of inclusion. 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 both checks
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,
where the transport layer enforces access control by blocking queries which are
not allowed:</t>
      <figure anchor="request-response">
        <name>Example request/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>
      <t>An important caveat to the client-server architecture is that many end-to-end
encrypted communication services require the ability to provide <em>credentials</em> to
their users. These credentials convey a binding between an end-user identity and
potentially several encryption or signature public keys, and are meant to be
verified with no/minimal network requests by the receiving users.</t>
      <t>In particular, credentials that can be verified with minimal network access are
often required by applications providing 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
receives a message, these protocols have senders provide their own credential in
an encrypted portion of the message. Encrypting the sender's credential prevents
it from being visible to the service provider, while still assuring the
recipient of the sender's identity. If users were to authenticate the sender's
public key directly with the service provider, they would leak to the service
provider who the they are communicating with.</t>
      <t>Key Transparency credentials can be created by serializing one or more Search
request-response pairs. These Search operations would correspond to the lookups
a user needs to do to prove the relationship between their end-user identity and
their cryptographic keys. Recipients can verify the request-response pairs
themselves without contacting the Transparency Log.</t>
      <t>Any future monitoring that may be required can be provided to recipients
proactively by the sender. However if this fails, the recipient can still
perform the monitoring themselves (including over an anonymous channel if
necessary).</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 anchor="out-of-band-communication">
        <name>Out-of-Band Communication</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
must either use <strong>peer-to-peer communication</strong> or <strong>anonymous communication</strong>
with the Transparency Log.</t>
        <t>With peer-to-peer communication, two users gossip with each other to establish
that they both have the same view of the log's data. This gossip is able to
happen over any supported out-of-band channel, even if it is heavily
bandwidth-limited, such as scanning a QR code or talking over the phone.</t>
        <t>With anonymous communication, a single user accesses the Transparency Log over
an anonymous channel and tries to establish that the log is presenting the same
view of data over the anonymous channel as it does over authenticated channels.</t>
        <t>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 authorization are not 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, however 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, and
obtains signatures from a lightweight 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 executing the background monitoring
protocol requires an amount of work that's proportional to the number of labels a
user has looked up in the past. As such, it's less suited to use-cases where
users look up a large number of ephemeral labels, but would work well in a
use-case where users look up a limited number of labels repeatedly (for example, the
labels of regular contacts).</t>
      <table>
        <name>Comparison of deployment modes</name>
        <thead>
          <tr>
            <th align="left">Deployment Mode</th>
            <th align="left">Supports ephemeral labels?</th>
            <th align="left">Single party?</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Contact Monitoring</td>
            <td align="left">No</td>
            <td align="left">Yes</td>
          </tr>
          <tr>
            <td align="left">Third-Party Auditing</td>
            <td align="left">Yes</td>
            <td align="left">No</td>
          </tr>
          <tr>
            <td align="left">Third-Party Management</td>
            <td align="left">Yes</td>
            <td align="left">No</td>
          </tr>
        </tbody>
      </table>
      <t>Applications that rely on a Transparency Log deployed in Contact Monitoring mode
<bcp14>MUST</bcp14> regularly engage in out-of-band communication
(<xref target="out-of-band-communication"/>) to ensure that they detect forks in a timely
manner.</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 to serve malicious data.</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>The label owner, on a regular basis, searches for the most recent version of
the label in the log. They verify that the label has not changed unexpectedly.</t>
          </li>
          <li>
            <t>The users that looked up a label, at some point in the future, verify that the
label-value pair they observed is still properly represented in the tree such
that other users would find it if they searched for it.</t>
          </li>
        </ol>
        <t>This guarantees that if a malicious label-value pair 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. When users make a Search request, they must check back in with the Transparency Log several times. These checks ensure that the data in the Search response wasn't later removed from the log. Overlap with the label owner's own monitoring guarantees a consistent view of data.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="432" width="584" viewBox="0 0 584 432" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,416" fill="none" stroke="black"/>
                <path d="M 296,48 L 296,416" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,416" 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,160 L 280,160" fill="none" stroke="black"/>
                <path d="M 24,176 L 112,176" fill="none" stroke="black"/>
                <path d="M 128,256 L 280,256" fill="none" stroke="black"/>
                <path d="M 24,272 L 112,272" fill="none" stroke="black"/>
                <path d="M 312,304 L 456,304" fill="none" stroke="black"/>
                <path d="M 480,320 L 560,320" fill="none" stroke="black"/>
                <path d="M 128,352 L 280,352" fill="none" stroke="black"/>
                <path d="M 24,368 L 112,368" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="568,320 556,314.4 556,325.6" fill="black" transform="rotate(0,560,320)"/>
                <polygon class="arrowhead" points="320,304 308,298.4 308,309.6" fill="black" transform="rotate(180,312,304)"/>
                <polygon class="arrowhead" points="288,352 276,346.4 276,357.6" fill="black" transform="rotate(0,280,352)"/>
                <polygon class="arrowhead" points="288,256 276,250.4 276,261.6" fill="black" transform="rotate(0,280,256)"/>
                <polygon class="arrowhead" points="288,160 276,154.4 276,165.6" fill="black" transform="rotate(0,280,160)"/>
                <polygon class="arrowhead" points="288,64 276,58.4 276,69.6" fill="black" transform="rotate(0,280,64)"/>
                <polygon class="arrowhead" points="32,368 20,362.4 20,373.6" fill="black" transform="rotate(180,24,368)"/>
                <polygon class="arrowhead" points="32,272 20,266.4 20,277.6" fill="black" transform="rotate(180,24,272)"/>
                <polygon class="arrowhead" points="32,176 20,170.4 20,181.6" fill="black" transform="rotate(180,24,176)"/>
                <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="132">(1</text>
                  <text x="136" y="132">day</text>
                  <text x="180" y="132">later)</text>
                  <text x="68" y="164">Monitor(Bob)</text>
                  <text x="204" y="180">MonitorResponse(...)</text>
                  <text x="100" y="228">(2</text>
                  <text x="132" y="228">days</text>
                  <text x="180" y="228">later)</text>
                  <text x="68" y="260">Monitor(Bob)</text>
                  <text x="204" y="276">MonitorResponse(...)</text>
                  <text x="516" y="308">Monitor(Bob)</text>
                  <text x="100" y="324">(4</text>
                  <text x="132" y="324">days</text>
                  <text x="180" y="324">later)</text>
                  <text x="388" y="324">MonitorResponse(...)</text>
                  <text x="68" y="356">Monitor(Bob)</text>
                  <text x="204" y="372">MonitorResponse(...)</text>
                  <text x="144" y="404">...</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                        Transparency Log                        Bob
|                                   |                                  |
| Search(Bob) --------------------> |                                  |
| <------------ SearchResponse(...) |                                  |
|                                   |                                  |
|                                   |                                  |
|           (1 day later)           |                                  |
|                                   |                                  |
| Monitor(Bob) -------------------> |                                  |
| <----------- MonitorResponse(...) |                                  |
|                                   |                                  |
|                                   |                                  |
|          (2 days later)           |                                  |
|                                   |                                  |
| Monitor(Bob) -------------------> |                                  |
| <----------- MonitorResponse(...) |                                  |
|                                   |                                  |
|                                   | <------------------ Monitor(Bob) |
|          (4 days later)           | MonitorResponse(...) ----------> |
|                                   |                                  |
| Monitor(Bob) -------------------> |                                  |
| <----------- MonitorResponse(...) |                                  |
|                                   |                                  |
|               ...                 |                                  |
|                                   |                                  |
]]></artwork>
          </artset>
        </figure>
        <t>Note that 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 will then need to issue Monitor
queries for the label for some time into the future to maintain security. These
Monitor queries must be permitted, regardless of whether or not the user could
still execute the same Search or Update query now.</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 lightweight third-party auditor attesting to the fact that the
tree has been constructed correctly. These signatures are
provided to users along with 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.</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 448,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="392" y="164">BatchUpdate</text>
                  <text x="472" y="180">NewSig:</text>
                  <text x="536" y="180">53c1035</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Many Users                        Transparency Log               Auditor
|                                        |                             |
| Update(Alice, ...) ------------------> |                             |
| Update(Bob, ...) --------------------> |                             |
| Update(Carol, ...) ------------------> |                             |
| <===== Response{AuditorSig: 66bf, ...} |                             |
|                                        |                             |
|                                        |                             |
|                                        | BatchUpdate --------------> |
|                                        | <---------- NewSig: 53c1035 |
|                                        |                             |
]]></artwork>
          </artset>
        </figure>
      </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, while 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 log operator 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. Rejected 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>
      </section>
    </section>
    <section anchor="combining-logs">
      <name>Combining Logs</name>
      <t>There are many cases where it makes sense to operate multiple cooperating log
instances, for example:</t>
      <ul spacing="normal">
        <li>
          <t>A service provider may decide that it's prudent to rotate its cryptographic
keys, or migrate to a new deployment mode. They can do this by creating a new
log instance with new cryptographic keys, operating under a new
deployment mode if desired, and migrating their data from the old log to the
new log while users are able to query both.</t>
        </li>
        <li>
          <t>A service provider may choose to 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 log for their own users.</t>
        </li>
      </ul>
      <t>Client implementations should generally be prepared to interact with multiple
logs simultaneously. In particular, clients <bcp14>SHOULD</bcp14> namespace any configuration
or state related to a particular log, such that information related to different
logs do not conflict.</t>
      <t>When multiple logs are used, all users in the system <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 logs behave honestly, then users observe a globally-consistent view of
the data associated with each label.</t>
        </li>
        <li>
          <t>If any log behaves dishonestly such that the prior guarantee is not met (some
users observe data associated with a label that others do not), this will be
detected either immediately or in a timely manner by background monitoring.</t>
        </li>
      </ul>
      <section anchor="gradual-migration">
        <name>Gradual Migration</name>
        <t>In the case of gradually migrating from an old 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 log first, and then against
the new log only if the most recent version of a label in the old log is a
special application-defined 'tombstone' entry.</t>
          </li>
          <li>
            <t>Update queries should only be executed against the new log, adding a
tombstone entry to the old log if one hasn't been already created.</t>
          </li>
          <li>
            <t>Both logs should be monitored as they would be if they were run individually.
Once the migration has completed and the old log has stopped accepting
changes, the old 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 log gives users a clear
indication as to which log contains the most recent version of a label and
prevents them from incorrectly accepting a stale version if the new log rejects
a search query.</t>
      </section>
      <section anchor="immediate-migration">
        <name>Immediate Migration</name>
        <t>In the event of a key compromise, the service provider may instead choose to
stop adding new entries to a log immediately and provide a new 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 log.</t>
          </li>
          <li>
            <t>Update queries must be executed against the new log.</t>
          </li>
          <li>
            <t>The final tree size and root hash of the old log should be provided to users
over a trustworthy channel. Users will use this to do any final monitoring of
the old log, and then ensure that the most recent versions of the labels they
own are properly represented in the new log. From then on, users will monitor
only the new log.</t>
          </li>
        </ol>
        <t>The final tree size and root hash of the prior log must 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 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> may act as an anonymizing proxy for its
users when querying transparency logs run by other entities (in the manner of
<xref target="RFC9458"/>), but should not 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 operator 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 the next time that out-of-band
communication is available. 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/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>How stale an application allows query responses to be (ie, how long an
application is willing to go without seeing updates to the tree).</t>
        </li>
        <li>
          <t>How frequently users execute background monitoring.</t>
        </li>
        <li>
          <t>How frequently users exercise out-of-band communication.</t>
        </li>
        <li>
          <t>For third-party auditing: the maximum amount of lag that an auditor is allowed
to have relative to the most recent tree head.</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, an 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 contents of a log entry if
the user obtains a valid search proof for the exact label and version stored at
that log entry.</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. Note however that in Contact
Monitoring mode, users <bcp14>SHOULD</bcp14> be permitted to perform monitoring to
guarantee honest operation of the Transparency Log.</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 the two 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 userbase, 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 userbase by padding the
tree with fake entries. Similarly, it also allows a service operator to obscure
the rate at which changes are made by padding real changes with fake ones,
causing outsiders to observe a baseline constant rate of changes.</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', meaning 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 allow 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. The VRF can only be executed by the service operator, who holds a private
key. But critically, VRFs can still provide a 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, in order 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 an internal UUID
as the label. While the UUID might be unique, it is not user-visible. When a
user attempts to lookup a contact by username, the service operator must
translate the username into its UUID. Since this mapping (from username to UUID)
is unauthenticated, the service operator can manipulate it to eavesdrop on
conversations by returning the UUID for an account that it controls. From a
security perspective, this is equivalent to not using KT at all. An example of
this type of application, where the unique and user-visible identifier is a
fixed string, would be email.</t>
      <t>However in other applications, the use of internal UUIDs in KT may be
appropriate. For example, many applications don't have this type of fixed
username and instead rely on their UI (underpinned internally by a UUID) to indicate
to users whether a conversation is with a new person or someone they've
previously contacted. The fact that the UI behaves in this way makes the UUID a
user-visible identifer, 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 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 identity. Examples of this type of identity include
phone numbers, or most usernames. These identities are used solely for initial
user discovery, in which they're converted to a primary identity that's used by
the application from then on. A secondary end-user identity should be a label
in KT, for the purpose of authenticating user discovery, with the primary
end-user identity as the associated value.</t>
      <t>While likely helpful to most common applications, the distinction between
handling primary and secondary identities is not a hard-and-fast 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>
      </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 866?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+196ZIbx7Xm/3yKmtaPXgIARcrW2B1eLklJNkOiqCtS9nVM
TIQKqAJQZqEKrip0C6boZ5lnmSeb850lM2tBd0tm+M6Nmf5BdgNVuZw8efZl
Pp+7rujK/Do5+zI/Jm+atGr3aZNXq2PytFltiy5fdYcmP3OrtMs3dXO8Topq
XTuX1asq3dGLWZOuu3mRd+v52/zYYYR5Gr06//gT1x6Wu6Jti7rqjnt658Xn
b75w1WG3zJtrl9HI125VV21etYf2OumaQ+5urpNPHK0kpaW9zleHpuiOZ+62
bt5umvqwn1jwmaP56YHs2iXzhH5Puuhbd5NXB5onSU6/nySyvLM/0zRFtUn+
gEfx+S4tSvrcNvhv2O6ibjb4Dpul77Zdt2+vHz3Co7z/m3xhjz3CB4+WTX3b
5o9skEd4eVN028OSXmcA3m48DB8JXPEinisJSG0XTTN8fiEjLYo6evPRfYez
2Ha78sy59NBt6waAo7mSZH0oSzndZwSaLK2Sl6uXRVnSAfL3ucBjKV/uVjv5
7t82+HyxqnfOVXWzSzsCwrVzwBj/V5K0eVrm2ZyOO8P5Y8AubTY5bc921xab
Ki0ZdMuy3jzqvfJIXlG8fZOvtlVNDx2TfZPfFPntdfKaH0/k8YQmT17zgGf8
JiNc8uTjx7+aP/54/uTXzrn5fJ6ky5YAtOqce7Mt2oQQ/LDLqy7J8nVR5W3S
bfOky5tdobOlVUZ3gT6hd2jzyT7t6I+qpQ9v6vImx7d4yWX5vqyPPFa9Tkb3
7OLLN5d4NE02eUWjlbRuwvdcEDXZ5W2bbggbAcYmpTUe+OhmvIB2n6+KdaHL
a/WiECTqfd508nna8Zf0WVev6tLRLzdFlreL5EWXpGVbExbe0JO7GpPKGmZJ
VVdzAmi7aoo9Ti7ZHAo67FWe0F639W3S1U4WWhIs9nv698s39CHtQ242Nkuo
sKPH8XVBFITA1C4E2rsiy8rcuY+SF1XX1NmBgejcs3yNZaTVMfFoQyOsCAeX
eZL/sNqm1UZgSx/RAc+7ek7/0a+r5rjvcOzHtst3s6S7rV23JcjR1g5tl2xp
GXm1SL4omrab0XkRgFbFPq26Vo9KX5XHFUwK2OamWOUOUE07wqdbum28yP1h
SVsDueEjONI37RZgOLQ5/mvyVQ7oyTEC6ETN6iqbMWrouIkfl2du610OCGcF
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

-->

</rfc>
