<?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.18 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-keytrans-architecture-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title>Key Transparency Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-02"/>
    <author fullname="Brendan McMillion">
      <organization/>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="August" day="26"/>
    <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 works 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, "key" will refer to a lookup key in a
key-value database and "public key" or "private key" will be specified if
otherwise.</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>Applications may enforce arbitrary access control rules on top of KT such as
requiring a user to be logged in to make KT requests, only allowing a user to
lookup the keys of another user if they're "friends", or simply applying a rate
limit. Applications <bcp14>SHOULD</bcp14> prevent users from modifying keys 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 key in the most recent version of
the log. Users may request either a specific version of the key, or the
most recent version available. If the key-version pair exists, the server
returns the corresponding value and a proof of inclusion.</t>
        </li>
        <li>
          <t><strong>Update:</strong> Adds a new key-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 keys
remain in the tree) and that no changes have been made to keys 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 provide 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 key 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 associate data with keys
without the key owner's awareness.</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 keys 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 keys, but would work ideally in a
use-case where users look up a limited number of keys repeatedly (for example, the
keys of regular contacts).</t>
      <table>
        <name>Comparison of deployment modes</name>
        <thead>
          <tr>
            <th align="left">Deployment Mode</th>
            <th align="left">Supports ephemeral keys?</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 keys
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 key and those that look up the key. Stated as simply
as possible, the monitoring obligations of each party are:</t>
        <ol spacing="normal" type="1"><li>
            <t>The key owner, on a regular basis, searches for the most recent version of
the key in the log. They verify that the key has not changed unexpectedly.</t>
          </li>
          <li>
            <t>The users that looked up a key, at some point in the future, verify that the
key-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 key-value pair is added to the log, then
either it is detected by the key owner, or if it is removed/obscured from the
log before the key 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 key 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>
      </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 key.</t>
        </li>
        <li>
          <t>If any log behaves dishonestly such that the prior guarantee is not met (some
users observe data associated with a key 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 key 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 key in the old log gives users a clear
indication as to which log contains the most recent version of a key 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 keys. 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 keys 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 key 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 keys 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 key. 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 key-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
keys. The exact mechanism for determining which data is safe to delete will
depend on the 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 key-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 key, they're guaranteed that the result they receive represents the same
result that any other user searching for the same key would've seen. When a user
modifies a key, they're guaranteed that other users will see the modification
the next time they search for the key.</t>
      <t>If the Transparency Log operator does not execute a key-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 key and
all users that look up the key 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, with respect 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 lookup key exists in the
Transparency Log if the user obtains a valid search proof for that key.
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 key and version stored at
that log entry.</t>
        <t>Applications are primarily able to manage the privacy of their 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 lookup keys. 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 keys 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 keys.</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>
        <!--
Unresolved privacy aspects to consider:
- Whether hiding that a key has previously existed in the log or not, from new
  owners of that key.
-->

<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 keys or values. This is because keys
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 key
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
keys and values and their modification history. It also includes traffic
patterns, such as how often a specific key 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 lookup keys
exist and where. These lookup keys are usually serialized end-user identifiers,
although it varies by application. To minimize leakage, all lookup keys are
processed through a Verifiable Random Function, or VRF <xref target="RFC9381"/>.</t>
      <t>A VRF deterministically maps each lookup key 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 key, the service operator first executes its VRF on the input lookup
key to obtain the output key that will actually be looked up or stored in the
prefix tree. The service operator then provides the output key, along with a
proof that the output key is correct, in its response to the user.</t>
      <t>The pseudorandom output of VRFs means that even if a user indirectly observes
that a search key exists in the prefix tree, they can't immediately learn which
user the search key 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 search key.</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 lookup keys 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 lookup keys 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 key <tt>K</tt> with value <tt>V</tt>. The value stored in the prefix tree would
roughly correspond to <tt>VRF(key K) = 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 key K is V)
]]></artwork>
      <t>After receiving an erasure request, the transparency log deletes the key, 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 key 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 keys logged. This
means that while the VRF's full output may be 256 bits, in a log with one
million keys, 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. Using this guarantee,
that all users agree on a set of keys and values, to authenticate the
relationship between end-user identities and the end-users of a communication
service takes special care. 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 lookup key. 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 kind of application 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 use 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 lookup key 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 lookup
key 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 key-value structure they put 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 854?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+196ZIbx7Xm/3yKuq0fvQQAipStsTvkhaQkmyFR1BVJ+zom
JkIFVAEos1AFVxW6CVP0s9xnmSeb850lM2vphTLDd27M9A+yG6jK5eTJsy/z
+dx1RVfml8nJN/kxedWkVbtPm7xaHZPHzWpbdPmqOzT5iVulXb6pm+NlUlTr
2rmsXlXpjl7MmnTdzYu8W8/f5McOI8zT6NX5p49ce1juirYt6qo77umdZ1+9
+tpVh90yby5dRiNfulVdtXnVHtrLpGsOubu6TD5ztJKUlvYyXx2aojueuOu6
ebNp6sN+YsEnjuanB7JLl8wT+j3pom/dVV4daJ4kufn9JJHlnfyZpimqTfIH
PIrPd2lR0ue2wd9ju4u62eA7bJa+23bdvr188ACP8v6v8oU99gAfPFg29XWb
P7BBHuDlTdFtD0t6nQF4vfEwfCBwxYt4riQgtV00zfD5hYy0KOrozQd3Hc5i
2+3KE+fSQ7etGwCO5kqS9aEs5XSfEGiytEqer54XZUkHyN/nAo+lfLlb7eS7
32/w+WJV75yr6maXdgSES+eAMf6vJGnztMyzOR13hvPHgF3abHLanu2uLTZV
WjLolmW9edB75YG8onj7Kl9tq5oeOib7Jr8q8uvL5CU/nsjjCU2evOQBT/hN
Rrjk0acPfzV/+On80a+dc/P5PEmXLQFo1Tn3alu0CSH4YZdXXZLl66LK26Tb
5kmXN7tCZ0urjO4CfULv0OaTfdrRH1VLH17V5VWOb/GSy/J9WR95rHqdjO7Z
2TevzvFommzyikYrad2E77kgarLL2zbdEDYCjE1Kazzw0c14Ae0+XxXrQpfX
6kUhSNT7vOnk87TjL+mzrl7VpaNfroosbxfJsy5Jy7YmLLyiJ3c1JpU1zJKq
ruYE0HbVFHucXLI5FHTYqzyhvW7r66SrnSy0JFjs9/TvN6/oQ9qH3GxsllBh
R4/j64IoCIGpXQi0d0WWlblznyTPqq6pswMD0bkn+RrLSKtj4tGGRlgRDi7z
JH+72qbVRmBLH9EBz7t6Tv/Rr6vmuO9w7Me2y3ezpLuuXbclyNHWDm2XbGkZ
ebVIvi6atpvReRGAVsU+rbpWj0pflccVTArY5qpY5Q5QTTvCp2u6bbzI/WFJ
WwO54SM40jftFmA4tDn+a/JVDujJMQLoRM3qKpsxaui4iR+XZ27rXQ4IZwWd
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
Elj+D0MImZF0sAAA

-->

</rfc>
