<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-keytrans-architecture-11" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title>Key Transparency Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-11"/>
    <author fullname="Brendan McMillion">
      <organization>Independent</organization>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="01"/>
    <area>Security</area>
    <workgroup>Key Transparency</workgroup>
    <keyword>key transparency</keyword>
    <abstract>
      <?line 38?>

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

<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, users upload their public keys to a simple directory where other
users can download them as needed, or exchange public keys in-band with the
communication being secured. If users simply trust the service operator to
forward public keys correctly, the underlying encryption protocol can only
protect them against passive eavesdropping.</t>
      <t>However, most messaging systems are designed such that all messages are
exchanged through the service operator's servers, which makes it extremely easy
for an operator to launch an active attack. That is, the service operator can
generate a rogue public key for which it holds the corresponding private key,
and associate that rogue public key with a user's account without the user's
knowledge, allowing it to impersonate or eavesdrop on conversations with that
user.</t>
      <t>Key Transparency (KT) solves this problem by requiring the service operator to
store user public keys in a cryptographically protected append-only log. Any
malicious entries added to such a log will generally be equally visible to both
the affected user and the user's contacts. This allows users to detect whether
they are being impersonated by viewing the public keys attached to their
account. If the service operator attempts to conceal some entries of the log
from some users but not others, this creates a "forked view" which is permanent
and detectable.</t>
      <t>The term "public key" is used broadly in this document to refer to any public
cryptographic material that a user associates with their account; depending on
the application, this may be a raw public key, a certificate containing a public
key, or some other application-defined structure. KT does not depend on the
format of this data.</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="definitions">
      <name>Definitions</name>
      <dl>
        <dt><strong>End-to-End Encrypted Communication Service:</strong></dt>
        <dd>
          <t>A communication service that allows end-users to engage in text, voice,
video, or other forms of communication over the internet, and uses public key
cryptography to ensure that communications are only accessible to their
intended recipients.</t>
        </dd>
        <dt><strong>Service Operator:</strong></dt>
        <dd>
          <t>The primary organization that provides the infrastructure for an end-to-end
encrypted communication service and the software to participate in it.</t>
        </dd>
        <dt><strong>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>User / Account:</strong></dt>
        <dd>
          <t>A single end-user of an end-to-end encrypted communication service, which may
interact with the service on multiple end-user devices (phone, laptop).</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". A single
account may be represented simultaneously by multiple end-user identities
(email, phone number, username).</t>
        </dd>
        <dt><strong>Transparency Log:</strong></dt>
        <dd>
          <t>A specialized service capable of securely attesting to the information (such
as public keys) associated with a given end-user identity. A transparency
log is usually run either entirely or partially by the service operator, but
could also be operated externally.</t>
        </dd>
        <dt><strong>Transparency Log Configuration:</strong></dt>
        <dd>
          <t>The fixed, public parameters of a Transparency Log such as the log's cipher
suite and public key. Configuration is pre-distributed to users through a
trustworthy channel, typically as part of the communication service's client
software, and used for proof verification.</t>
        </dd>
        <dt><strong>Label:</strong></dt>
        <dd>
          <t>A lookup key in the key-value database that a transparency log represents,
such as an end-user identity. See <xref target="protocol-overview"/>.</t>
        </dd>
        <dt><strong>Label Owner:</strong></dt>
        <dd>
          <t>A user that either initiates all changes to a label's value, or must be
informed of all changes to it. See <xref target="protocol-overview"/>.</t>
        </dd>
        <dt><strong>Prefix Tree:</strong></dt>
        <dd>
          <t>A hash tree that commits to the set of all labels stored in a transparency
log, and every version of each label's value, at a given point in time.</t>
        </dd>
        <dt><strong>Log Tree:</strong></dt>
        <dd>
          <t>A hash tree with one leaf for each change to the transparency log. Each leaf
commits to a snapshot of the prefix tree, so the log tree as a whole commits
to the history of all label modifications.</t>
        </dd>
        <dt><strong>Tree Head:</strong></dt>
        <dd>
          <t>The root hash and size of the log tree at a given point in time, signed by
the transparency log (and possibly by a third party).</t>
        </dd>
      </dl>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>From a networking perspective, KT provides a client-server architecture with a
central <em>transparency log</em>, acting as a server, which holds the authoritative
copy of all information and exposes endpoints that allow users to query or
modify stored data. Users coordinate with each other through the server by
uploading their own public keys and downloading the public keys of other
users. Users are expected to maintain relatively little state, limited only
to what is required to interact with the log and ensure that it is behaving
honestly.</t>
      <t>From an application perspective, KT can be thought of as a versioned key-value
database. Users insert key-value pairs into the database where, for example, the
key is their username and the value is their public key. Users can update a key
by inserting a new version with new data. They can also look up the most recent
version of a key or any previous version. From this point forward, the term
<strong>label</strong> will be used to refer to lookup keys in the key-value database that a
transparency log represents to avoid confusion with cryptographic public or
private keys.</t>
      <t>Users are considered to <strong>own</strong> a label if they are understood to either
initiate all changes to the label's value, or if they must be informed of all
changes to the label's value. The latter situation may occur if, for example, KT
is deployed in a way where the service operator makes automated modifications to
stored data. The owning user would then be informed, after the fact, of
modifications to verify that they were legal.</t>
      <t>KT does not require the use of a specific transport protocol. This is intended
to allow applications to layer KT on top of whatever transport protocol their
application already uses. In particular, this allows applications to continue
relying on their existing access control system.</t>
      <t>With some small exceptions, applications may enforce arbitrary access control
rules on top of KT. This may include requiring a user to be logged in to make KT
requests, only allowing a user to look up the labels of their contacts, or
applying a rate limit. Most applications will likely need to, at minimum,
prevent users from modifying labels they do not own. The exact mechanism for
rejecting requests, and possibly explaining the reason for rejection, is left to
the application.</t>
      <t>The exceptions are the requests that users need to make to verify the
transparency log's behavior. In particular, a label's owner needs to always be
able to monitor their label for as long as they own it, and in the Contact
Monitoring deployment mode, users that have looked up a label need to be able to
complete their monitoring of it even if their access to perform other queries is
later revoked. Refusing these requests is indistinguishable from transparency
log misbehavior (see <xref target="transparency-log-misbehavior"/>).</t>
      <section anchor="user-operations">
        <name>User Operations</name>
        <t>The operations that can be executed by a user are as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Search:</strong> Looks up the value of a specific label in the most recent version
of the log. Users may request either a specific version of the label or the
most recent version available. If the label-version pair exists, the server
returns the corresponding value and a proof that the search operation was
executed correctly.</t>
          </li>
          <li>
            <t><strong>Update:</strong> Adds a new label-value pair to the log. The server returns a
proof that the label-value pair was added correctly. Note that this means
that new values are added to the log immediately and no provisional proof,
such as a Signed Certificate Timestamp (SCT) as defined in <xref section="3" sectionFormat="of" target="RFC6962"/>, is provided.</t>
          </li>
          <li>
            <t><strong>Monitor:</strong> While Search and Update are run by the user as necessary,
monitoring is done in the background on a recurring basis. It checks both
that the log is continuing to behave honestly (all previously returned labels
remain in the log) and that no changes have been made to labels owned by the
user without the user's knowledge.</t>
          </li>
        </ol>
        <t>These operations are executed over an application-provided transport layer.
The transport layer enforces access control by blocking queries which are
not allowed:</t>
        <figure anchor="request-response">
          <name>Example Request and Response Flow</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="456" viewBox="0 0 456 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 24,48 L 24,320" fill="none" stroke="black"/>
                <path d="M 384,48 L 384,320" fill="none" stroke="black"/>
                <path d="M 152,96 L 376,96" fill="none" stroke="black"/>
                <path d="M 32,112 L 208,112" fill="none" stroke="black"/>
                <path d="M 136,144 L 376,144" fill="none" stroke="black"/>
                <path d="M 32,160 L 208,160" fill="none" stroke="black"/>
                <path d="M 192,192 L 376,192" fill="none" stroke="black"/>
                <path d="M 32,208 L 208,208" fill="none" stroke="black"/>
                <path d="M 144,288 L 320,288" fill="none" stroke="black"/>
                <path d="M 176,304 L 320,304" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,192 372,186.4 372,197.6" fill="black" transform="rotate(0,376,192)"/>
                <polygon class="arrowhead" points="384,144 372,138.4 372,149.6" fill="black" transform="rotate(0,376,144)"/>
                <polygon class="arrowhead" points="384,96 372,90.4 372,101.6" fill="black" transform="rotate(0,376,96)"/>
                <polygon class="arrowhead" points="328,304 316,298.4 316,309.6" fill="black" transform="rotate(0,320,304)"/>
                <polygon class="arrowhead" points="328,288 316,282.4 316,293.6" fill="black" transform="rotate(0,320,288)"/>
                <polygon class="arrowhead" points="40,208 28,202.4 28,213.6" fill="black" transform="rotate(180,32,208)"/>
                <polygon class="arrowhead" points="40,160 28,154.4 28,165.6" fill="black" transform="rotate(180,32,160)"/>
                <polygon class="arrowhead" points="40,112 28,106.4 28,117.6" fill="black" transform="rotate(180,32,112)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="372" y="36">Transparency</text>
                  <text x="440" y="36">Log</text>
                  <text x="116" y="68">(Valid</text>
                  <text x="152" y="68">/</text>
                  <text x="196" y="68">Accepted</text>
                  <text x="272" y="68">Requests)</text>
                  <text x="88" y="100">Search(Alice)</text>
                  <text x="296" y="116">SearchResponse(...)</text>
                  <text x="80" y="148">Search(Bob)</text>
                  <text x="296" y="164">SearchResponse(...)</text>
                  <text x="88" y="196">Update(Alice,</text>
                  <text x="164" y="196">...)</text>
                  <text x="296" y="212">UpdateResponse(...)</text>
                  <text x="120" y="260">(Rejected</text>
                  <text x="168" y="260">/</text>
                  <text x="208" y="260">Blocked</text>
                  <text x="280" y="260">Requests)</text>
                  <text x="84" y="292">Search(Fred)</text>
                  <text x="336" y="292">X</text>
                  <text x="80" y="308">Update(Bob,</text>
                  <text x="148" y="308">...)</text>
                  <text x="336" y="308">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                                   Transparency Log
  |                                            |
  |        (Valid / Accepted Requests)         |
  |                                            |
  | Search(Alice) ---------------------------->|
  |<---------------------- SearchResponse(...) |
  |                                            |
  | Search(Bob) ------------------------------>|
  |<---------------------- SearchResponse(...) |
  |                                            |
  | Update(Alice, ...) ----------------------->|
  |<---------------------- UpdateResponse(...) |
  |                                            |
  |                                            |
  |       (Rejected / Blocked Requests)        |
  |                                            |
  | Search(Fred) ----------------------> X     |
  | Update(Bob, ...) ------------------> X     |
  |                                            |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="credentials">
        <name>Credentials</name>
        <t>While users are generally understood to interact directly with the transparency
log, many end-to-end encrypted communication services require the ability to
provide <em>credentials</em> to their users. Credentials convey a binding between an
end-user identity and public keys or other information, and can be verified with
minimal network access. Traditionally, this binding is provided by a certificate
(such as an X.509 certificate) signed by a trusted authority. KT credentials are
instead constructed from the transparency log's own responses.</t>
        <t>Credentials are especially useful in applications that support anonymous
communication. These applications provide end-to-end encryption with a protocol
like the Messaging Layer Security Protocol <xref target="RFC9420"/> (with the encryption of
handshake messages required) or Sealed Sender <xref target="sealed-sender"/>. When a user
sends a message, these protocols have the sender provide their own credential in
an encrypted portion of the message.</t>
        <t>Encrypting the sender's credential allows the sender to submit messages over an
anonymous channel by specifying only the recipient's identity. The service
operator can deliver the message to the intended recipient, who can decrypt it
and validate the credential inside to be assured of the sender's identity. Note
that the recipient does not need access to an anonymous channel to preserve the
sender's anonymity.</t>
        <t>At a high level, KT credentials are created by serializing one or more Search
request-response pairs. These Search operations correspond to the lookups the
recipient would do to authenticate the relationship between the presented
end-user identity and their public keys. Recipients verify the
request-response pairs themselves, using the transparency log's configuration,
without contacting the transparency log. Because the responses are authenticated
by the transparency log (and any third-party manager or auditor, as described
in <xref target="deployment-modes"/>), a credential that has been modified will fail
verification.</t>
        <t>To prevent stale credentials from being accepted, recipients only accept
credentials that are based on a recent distinguished log entry (see
<xref target="deployment-modes"/>), where the application defines what is considered recent.
Senders therefore need to periodically refresh their credentials.</t>
        <t>Any future monitoring that may be required should be provided to recipients
proactively by the sender, as this is the most robust way to preserve the
sender's anonymity. If required future monitoring isn't provided, either
accidentally or because the system was intentionally designed that way, the
recipient will need to perform the monitoring themself over an anonymous
channel.</t>
        <t><xref target="anonymous"/> shows an 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 in the same way.</t>
        <figure anchor="anonymous">
          <name>Example Message Flow in an Anonymous Deployment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="512" viewBox="0 0 512 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,176" fill="none" stroke="black"/>
                <path d="M 272,48 L 272,176" fill="none" stroke="black"/>
                <path d="M 504,48 L 504,176" fill="none" stroke="black"/>
                <path d="M 16,64 L 144,64" fill="none" stroke="black"/>
                <path d="M 184,80 L 264,80" fill="none" stroke="black"/>
                <path d="M 456,96 L 496,96" fill="none" stroke="black"/>
                <path d="M 16,128 L 136,128" fill="none" stroke="black"/>
                <path d="M 192,144 L 264,144" fill="none" stroke="black"/>
                <path d="M 464,160 L 496,160" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="504,160 492,154.4 492,165.6" fill="black" transform="rotate(0,496,160)"/>
                <polygon class="arrowhead" points="504,96 492,90.4 492,101.6" fill="black" transform="rotate(0,496,96)"/>
                <polygon class="arrowhead" points="272,144 260,138.4 260,149.6" fill="black" transform="rotate(0,264,144)"/>
                <polygon class="arrowhead" points="272,80 260,74.4 260,85.6" fill="black" transform="rotate(0,264,80)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <polygon class="arrowhead" points="24,64 12,58.4 12,69.6" fill="black" transform="rotate(180,16,64)"/>
                <g class="text">
                  <text x="52" y="36">Transparency</text>
                  <text x="120" y="36">Log</text>
                  <text x="272" y="36">Alice</text>
                  <text x="424" y="36">Anonymous</text>
                  <text x="488" 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="384" y="100">SearchResponse)</text>
                  <text x="204" y="132">Monitor(Alice)</text>
                  <text x="100" y="148">MonitorResponse(...)</text>
                  <text x="332" y="148">Encrypt(Anon</text>
                  <text x="412" y="148">Group,</text>
                  <text x="388" y="164">MonitorResponse)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Transparency Log               Alice            Anonymous Group
|                                |                            |
|<---------------- Search(Alice) |                            |
| SearchResponse(...) ---------->| Encrypt(Anon Group,        |
|                                |      SearchResponse) ----->|
|                                |                            |
|<--------------- Monitor(Alice) |                            |
| MonitorResponse(...) --------->| Encrypt(Anon Group,        |
|                                |      MonitorResponse) ---->|
|                                |                            |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="detecting-forks">
        <name>Detecting Forks</name>
        <t>It is sometimes possible for a transparency log to present forked views of data
to different users. This means that, from an individual user's perspective, a
log may appear to be operating correctly in the sense that all of a user's
requests succeed and proofs verify correctly. However, the transparency log has
presented a view to the user that's not globally consistent with what it has
shown other users. As such, the log may be able to change a label's value
without the label's owner becoming aware.</t>
        <t>The protocol is designed such that users always require subsequent queries to
prove consistency with previous queries. As such, each user's view of the log
always forms a single, consistent history. If a user is ever presented with a
forked view, they hold on to this forked view forever and reject the output of
any subsequent queries that are inconsistent with it.</t>
        <t>This provides ample opportunity for users to detect when a fork has been
presented but isn't in itself sufficient for detection. To detect forks, users
require either a <strong>trusted third party</strong>, <strong>anonymous communication</strong> with the
transparency log, or <strong>peer-to-peer communication</strong>. Anonymous and peer-to-peer
communication are collectively referred to as <em>out-of-band (OOB)
communication</em>.</t>
        <t>With a trusted third party, such as a Third-Party Manager or Auditor as
described in <xref target="third-party-management"/> and <xref target="third-party-auditing"/>, an outside
organization monitors the operation of the transparency log. This third party
verifies, among other things, that the transparency log is growing in an
append-only manner. If verification is successful, the third party produces
a signature on the most recent tree head. The transparency log provides this
signature to users inline with their query responses as proof that they are not
being shown a fork. This approach relies on an assumption that the third party
is trusted not to collude with the transparency log to trick users into
accepting malicious results.</t>
        <t>With anonymous communication, a single user accesses the transparency log over
an anonymous channel and checks that the transparency log is presenting the same
tree head over the anonymous channel as it does over an authenticated channel.
The security of this approach relies on the idea that, if the transparency log
doesn't know which user is making the request, it will show the user the wrong
fork with high probability. Repeating this check over time makes it
overwhelmingly likely that any fork presented to any user will be detected. To
ensure this, requests over the anonymous channel must not contain any
user-specific data or state, such as cookies, authentication tokens, or the tree
size last observed by the user. They also must not be correlated in time with
the user's authenticated requests, such as by being sent immediately before or
after them.</t>
        <t>With peer-to-peer communication, two users gossip with each other to establish
that they both have the same view of the transparency log. This gossip is able
to happen over any supported out-of-band channel even if it is heavily
bandwidth-constrained, such as scanning a QR code. However, this approach is
only secure if gossip can be implemented such that gossiping users are
reasonably expected to form a connected graph of all users. If not, then the
transparency log can attempt to partition users into subsets that do not gossip
and can present each subset of users with different forks.</t>
        <t>Applications that do not provide their users with a trusted third party,
anonymous communication, or peer-to-peer communication are not secure, as the
transparency log can present forked views to different users without detection.</t>
        <t>Regardless of the approach an application chooses, 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>
        <t><xref target="out-of-band-checking"/> illustrates fork detection with anonymous and
peer-to-peer communication. Users receive tree heads while making authenticated
requests to a transparency log. Users ensure consistency of tree heads by either
comparing amongst themselves, or by contacting the transparency log over an
anonymous channel. Requests that require authentication (<tt>Search(Bob)</tt> in this
example) may be blocked over the anonymous channel. The tree heads that users
compare out-of-band (<tt>DistinguishedHead</tt> in this example) correspond to
<em>distinguished log entries</em>, which are described in <xref target="deployment-modes"/>.</t>
        <figure anchor="out-of-band-checking">
          <name>Out-of-Band Fork Detection</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="584" viewBox="0 0 584 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,320" fill="none" stroke="black"/>
                <path d="M 232,48 L 232,320" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,320" fill="none" stroke="black"/>
                <path d="M 344,96 L 568,96" fill="none" stroke="black"/>
                <path d="M 240,112 L 328,112" fill="none" stroke="black"/>
                <path d="M 16,224 L 72,224" fill="none" stroke="black"/>
                <path d="M 392,224 Q 394,220.8 396,224 Q 398,227.2 400,224 Q 402,220.8 404,224 Q 406,227.2 408,224 Q 410,220.8 412,224 Q 414,227.2 416,224 Q 418,220.8 420,224 Q 422,227.2 424,224 Q 426,220.8 428,224 Q 430,227.2 432,224 Q 434,220.8 436,224 Q 438,227.2 440,224 Q 442,220.8 444,224 Q 446,227.2 448,224 Q 450,220.8 452,224 Q 454,227.2 456,224 Q 458,220.8 460,224 Q 462,227.2 464,224 Q 466,220.8 468,224 Q 470,227.2 472,224 Q 474,220.8 476,224 Q 478,227.2 480,224 Q 482,220.8 484,224 Q 486,227.2 488,224 Q 490,220.8 492,224 Q 494,227.2 496,224 Q 498,220.8 500,224 Q 502,227.2 504,224 Q 506,220.8 508,224 Q 510,227.2 512,224 Q 514,220.8 516,224 Q 518,227.2 520,224 Q 522,220.8 524,224 Q 526,227.2 528,224 Q 530,220.8 532,224 Q 534,227.2 536,224 Q 538,220.8 540,224 Q 542,227.2 544,224 Q 546,220.8 548,224 Q 550,227.2 552,224 Q 554,220.8 556,224 Q 558,227.2 560,224 " fill="none" stroke="black"/>
                <path d="M 88,240 L 224,240" fill="none" stroke="black"/>
                <path d="M 248,240 Q 250,236.8 252,240 Q 254,243.2 256,240 Q 258,236.8 260,240 Q 262,243.2 264,240 Q 266,236.8 268,240 Q 270,243.2 272,240 Q 274,236.8 276,240 Q 278,243.2 280,240 Q 282,236.8 284,240 Q 286,243.2 288,240 Q 290,236.8 292,240 Q 294,243.2 296,240 Q 298,236.8 300,240 Q 302,243.2 304,240 Q 306,236.8 308,240 Q 310,243.2 312,240 Q 314,236.8 316,240 Q 318,243.2 320,240 Q 322,236.8 324,240 Q 326,243.2 328,240 Q 330,236.8 332,240 Q 334,243.2 336,240 Q 338,236.8 340,240 Q 342,243.2 344,240 Q 346,236.8 348,240 Q 350,243.2 352,240 Q 354,236.8 356,240 Q 358,243.2 360,240 Q 362,236.8 364,240 Q 366,243.2 368,240 Q 370,236.8 372,240 Q 374,243.2 376,240 Q 378,236.8 380,240 Q 382,243.2 384,240 Q 386,236.8 388,240 Q 390,243.2 392,240 Q 394,236.8 396,240 Q 398,243.2 400,240 Q 402,236.8 404,240 Q 406,243.2 408,240 Q 410,236.8 412,240 Q 414,243.2 416,240 Q 418,236.8 420,240 Q 422,243.2 424,240 Q 426,236.8 428,240 Q 430,243.2 432,240 Q 434,236.8 436,240 Q 438,243.2 440,240 Q 442,236.8 444,240 Q 446,243.2 448,240 Q 450,236.8 452,240 Q 454,243.2 456,240 Q 458,236.8 460,240 Q 462,243.2 464,240 Q 466,236.8 468,240 Q 470,243.2 472,240 Q 474,236.8 476,240 Q 478,243.2 480,240 Q 482,236.8 484,240 Q 486,243.2 488,240 Q 490,236.8 492,240 Q 494,243.2 496,240 " fill="none" stroke="black"/>
                <path d="M 344,304 Q 346,300.8 348,304 Q 350,307.2 352,304 Q 354,300.8 356,304 Q 358,307.2 360,304 Q 362,300.8 364,304 Q 366,307.2 368,304 Q 370,300.8 372,304 Q 374,307.2 376,304 Q 378,300.8 380,304 Q 382,307.2 384,304 Q 386,300.8 388,304 Q 390,307.2 392,304 Q 394,300.8 396,304 Q 398,307.2 400,304 Q 402,300.8 404,304 Q 406,307.2 408,304 Q 410,300.8 412,304 Q 414,307.2 416,304 Q 418,300.8 420,304 Q 422,307.2 424,304 Q 426,300.8 428,304 Q 430,307.2 432,304 Q 434,300.8 436,304 Q 438,307.2 440,304 Q 442,300.8 444,304 Q 446,307.2 448,304 Q 450,300.8 452,304 Q 454,307.2 456,304 Q 458,300.8 460,304 Q 462,307.2 464,304 Q 466,300.8 468,304 Q 470,307.2 472,304 Q 474,300.8 476,304 Q 478,307.2 480,304 Q 482,300.8 484,304 Q 486,307.2 488,304 Q 490,300.8 492,304 Q 494,307.2 496,304 " fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,96 564,90.4 564,101.6" fill="black" transform="rotate(0,568,96)"/>
                <polygon class="arrowhead" points="568,224 556,218.4 556,229.6" fill="black" transform="rotate(0,560,224)"/>
                <polygon class="arrowhead" points="504,304 492,298.4 492,309.6" fill="black" transform="rotate(0,496,304)"/>
                <polygon class="arrowhead" points="256,240 244,234.4 244,245.6" fill="black" transform="rotate(180,248,240)"/>
                <polygon class="arrowhead" points="248,112 236,106.4 236,117.6" fill="black" transform="rotate(180,240,112)"/>
                <polygon class="arrowhead" points="232,240 220,234.4 220,245.6" fill="black" transform="rotate(0,224,240)"/>
                <polygon class="arrowhead" points="24,224 12,218.4 12,229.6" fill="black" transform="rotate(180,16,224)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="232" y="36">Bob</text>
                  <text x="500" y="36">Transparency</text>
                  <text x="568" y="36">Log</text>
                  <text x="272" y="68">(Normal</text>
                  <text x="324" y="68">reqs</text>
                  <text x="364" y="68">over</text>
                  <text x="440" y="68">authenticated</text>
                  <text x="532" y="68">channel)</text>
                  <text x="288" y="100">Search(Bob)</text>
                  <text x="396" y="116">Response{Head:</text>
                  <text x="492" y="116">6c063bb,</text>
                  <text x="548" y="116">...}</text>
                  <text x="52" y="196">(OOB</text>
                  <text x="96" y="196">check</text>
                  <text x="140" y="196">with</text>
                  <text x="184" y="196">peer)</text>
                  <text x="284" y="196">(OOB</text>
                  <text x="328" y="196">check</text>
                  <text x="372" y="196">over</text>
                  <text x="432" y="196">anonymous</text>
                  <text x="508" y="196">channel)</text>
                  <text x="152" y="228">DistinguishedHead</text>
                  <text x="312" y="228">DistinguishedHead</text>
                  <text x="48" y="244">6c063bb</text>
                  <text x="536" y="244">6c063bb</text>
                  <text x="276" y="276">(Auth'ed</text>
                  <text x="332" y="276">reqs</text>
                  <text x="384" y="276">blocked</text>
                  <text x="436" y="276">over</text>
                  <text x="476" y="276">anon</text>
                  <text x="532" y="276">channel)</text>
                  <text x="288" y="308">Search(Bob)</text>
                  <text x="512" y="308">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 |
|                           |                                          |
|                           | (Auth'ed reqs blocked over anon channel) |
|                           |                                          |
|                           | 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
service operator and the end-user.</t>
      <t><strong>Third-Party Management</strong> and <strong>Third-Party Auditing</strong> are two deployment modes
that require the service operator to delegate part of its transparency log operations
to a third party.</t>
      <t>With both third-party modes, all requests from end-users are initially routed to
the service operator, and the operator coordinates with the third party
itself. End-users never contact the third party directly, although they will
need a signature public key from the third party to verify its assertions.</t>
      <t>With Third-Party Management, the third party performs the majority of the work
of actually storing and operating the service, and the service operator mainly enforces access control and
signs new entries as they're added. With Third-Party Auditing, the service
operator performs the majority of the work of storing and operating the service,
only obtaining signatures from a third-party auditor at regular intervals
asserting that the tree has been constructed correctly.</t>
      <t>To reduce the probability of collusion between the service operator and the
third party, a service operator can have two or more independent third parties
coordinate as one and produce threshold signatures. In this scenario, the
threshold for a valid signature needs to be at least a majority of the third
parties to prevent different subsets from authenticating forked views.</t>
      <t><strong>Contact Monitoring</strong>, on the other hand, supports a single-party deployment
with no third party. The cost of this is that, when a user looks up a version of
a label that was inserted very recently, the user may need to retain some
additional state and monitor the label until it is included in a <em>distinguished
log entry</em>. Distinguished log entries are chosen at regular intervals, roughly
one per <strong>Reasonable Monitoring Window</strong> (RMW), which is a duration configured
by the transparency log that reflects how frequently label owners are expected
to perform monitoring. Both are specified in more detail in
<xref target="PROTO"/>. If a user looks up many label-version
pairs that were inserted very recently, monitoring may become relatively
expensive.</t>
      <t>Additionally, applications that rely on a transparency log deployed in Contact
Monitoring mode need to regularly attempt to detect forks through anonymous
communication with the transparency log or peer-to-peer communication, as
described in <xref target="detecting-forks"/>.</t>
      <t>Applications that rely on a transparency log deployed in either of the
third-party modes can 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 were deployed in Contact Monitoring
mode. As such, it would start retaining state about previously looked-up labels
and regularly engaging in out-of-band communication. Enabling this
higher security mode allows users to double check that the third party is not
colluding with the transparency log.</t>
      <section anchor="contact-monitoring">
        <name>Contact Monitoring</name>
        <t>With the Contact Monitoring deployment mode, the monitoring burden is split
between both the owner of a label and those that look up the label. Stated as
simply as possible, the monitoring obligations of each user are:</t>
        <ol spacing="normal" type="1"><li>
            <t>On a regular basis, the label owner verifies that the most recent version of
their label has not changed unexpectedly.</t>
          </li>
          <li>
            <t>When a user that looked up a label sees that it was inserted very recently,
they check back later to see that the label-version pair they observed was
not removed before it could be detected by the label owner.</t>
          </li>
        </ol>
        <t>This ensures that if a malicious value for a label is added to the log, then
either it is detected by the label owner, or if it is removed/obscured from the
log before the label owner can detect it, then any users that observed it will
detect its removal. As such, the transparency log is not trusted to behave
honestly in this mode; rather, any deviation from the protocol or the addition
of malicious values for a label is detected by users through monitoring.</t>
        <t>In the example shown in <xref target="contact-monitoring-fig"/>, Alice searches for Bob's
label. One day later, Alice verifies that the label-version pair she observed
remained in the transparency log. Another day later, Bob comes online and
monitors his own label. Note that Alice does not need to wait on Bob to make his
Monitor request before making hers.</t>
        <figure anchor="contact-monitoring-fig">
          <name>Contact Monitoring</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="584" viewBox="0 0 584 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,256" fill="none" stroke="black"/>
                <path d="M 296,48 L 296,256" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,256" fill="none" stroke="black"/>
                <path d="M 120,64 L 288,64" fill="none" stroke="black"/>
                <path d="M 16,80 L 120,80" fill="none" stroke="black"/>
                <path d="M 128,144 L 288,144" fill="none" stroke="black"/>
                <path d="M 16,160 L 112,160" fill="none" stroke="black"/>
                <path d="M 304,224 L 456,224" fill="none" stroke="black"/>
                <path d="M 480,240 L 568,240" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,240 564,234.4 564,245.6" fill="black" transform="rotate(0,568,240)"/>
                <polygon class="arrowhead" points="312,224 300,218.4 300,229.6" fill="black" transform="rotate(180,304,224)"/>
                <polygon class="arrowhead" points="296,144 284,138.4 284,149.6" fill="black" transform="rotate(0,288,144)"/>
                <polygon class="arrowhead" points="296,64 284,58.4 284,69.6" fill="black" transform="rotate(0,288,64)"/>
                <polygon class="arrowhead" points="24,160 12,154.4 12,165.6" fill="black" transform="rotate(180,16,160)"/>
                <polygon class="arrowhead" points="24,80 12,74.4 12,85.6" fill="black" transform="rotate(180,16,80)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="284" y="36">Transparency</text>
                  <text x="352" y="36">Log</text>
                  <text x="568" y="36">Bob</text>
                  <text x="64" y="68">Search(Bob)</text>
                  <text x="208" y="84">SearchResponse(...)</text>
                  <text x="108" y="116">(1</text>
                  <text x="136" y="116">day</text>
                  <text x="180" y="116">later)</text>
                  <text x="68" y="148">Monitor(Bob)</text>
                  <text x="204" y="164">MonitorResponse(...)</text>
                  <text x="108" y="196">(1</text>
                  <text x="136" y="196">day</text>
                  <text x="180" y="196">later)</text>
                  <text x="516" y="228">Monitor(Bob)</text>
                  <text x="388" y="244">MonitorResponse(...)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                        Transparency Log                        Bob
|                                   |                                  |
| Search(Bob) --------------------->|                                  |
|<------------- SearchResponse(...) |                                  |
|                                   |                                  |
|           (1 day later)           |                                  |
|                                   |                                  |
| Monitor(Bob) -------------------->|                                  |
|<------------ MonitorResponse(...) |                                  |
|                                   |                                  |
|           (1 day later)           |                                  |
|                                   |                                  |
|                                   |<------------------- Monitor(Bob) |
|                                   | MonitorResponse(...) ----------->|
|                                   |                                  |
]]></artwork>
          </artset>
        </figure>
        <t>Importantly, Contact Monitoring impacts how the server is able to enforce access
control on Monitor queries. While Search and Update queries can enforce access
control on an arbitrary "point in time" basis, where a user is allowed to
execute the query at one point in time but maybe not the next, users are
sometimes required by the protocol to make Monitor queries based on the Search
and Update queries they made in the past. These Monitor queries need to
be permitted, regardless of whether or not the user is still permitted to execute
such Search or Update queries.</t>
      </section>
      <section anchor="third-party-management">
        <name>Third-Party Management</name>
        <t>With the Third-Party Management deployment mode, a third party is responsible
for the majority of the work of storing and operating the log. The service
operator focuses mainly on enforcing access control and authenticating the
creation of new versions of labels. All user queries are initially sent by users
directly to the service operator, and the service operator proxies them to the
third-party manager if they pass access control. New versions of a label, if
allowed by the service operator, are signed by the service operator before being
sent to the third-party manager to be inserted into the tree.</t>
        <t>As part of authenticating the creation of new versions of labels, the service
operator must implement some mechanism to prevent the same version of a label
from being submitted to the third-party manager multiple times with different
associated values. Additionally, the service operator must implement some
mechanism to detect when forks are presented by the third-party manager.</t>
        <figure anchor="manager-fig">
          <name>Third-Party Management</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="520" viewBox="0 0 520 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,240" fill="none" stroke="black"/>
                <path d="M 248,48 L 248,240" fill="none" stroke="black"/>
                <path d="M 512,48 L 512,240" fill="none" stroke="black"/>
                <path d="M 136,64 L 240,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 504,64" fill="none" stroke="black"/>
                <path d="M 16,80 L 232,80" fill="none" stroke="black"/>
                <path d="M 256,80 L 336,80" fill="none" stroke="black"/>
                <path d="M 120,112 L 240,112" fill="none" stroke="black"/>
                <path d="M 264,112 L 504,112" fill="none" stroke="black"/>
                <path d="M 16,128 L 232,128" fill="none" stroke="black"/>
                <path d="M 256,128 L 336,128" fill="none" stroke="black"/>
                <path d="M 176,160 L 240,160" fill="none" stroke="black"/>
                <path d="M 264,160 L 504,160" fill="none" stroke="black"/>
                <path d="M 16,176 L 232,176" fill="none" stroke="black"/>
                <path d="M 256,176 L 336,176" fill="none" stroke="black"/>
                <path d="M 128,208 L 208,208" fill="none" stroke="black"/>
                <path d="M 160,224 L 208,224" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="512,160 500,154.4 500,165.6" fill="black" transform="rotate(0,504,160)"/>
                <polygon class="arrowhead" points="512,112 500,106.4 500,117.6" fill="black" transform="rotate(0,504,112)"/>
                <polygon class="arrowhead" points="512,64 500,58.4 500,69.6" fill="black" transform="rotate(0,504,64)"/>
                <polygon class="arrowhead" points="264,176 252,170.4 252,181.6" fill="black" transform="rotate(180,256,176)"/>
                <polygon class="arrowhead" points="264,128 252,122.4 252,133.6" fill="black" transform="rotate(180,256,128)"/>
                <polygon class="arrowhead" points="264,80 252,74.4 252,85.6" fill="black" transform="rotate(180,256,80)"/>
                <polygon class="arrowhead" points="248,160 236,154.4 236,165.6" fill="black" transform="rotate(0,240,160)"/>
                <polygon class="arrowhead" points="248,112 236,106.4 236,117.6" fill="black" transform="rotate(0,240,112)"/>
                <polygon class="arrowhead" points="248,64 236,58.4 236,69.6" fill="black" transform="rotate(0,240,64)"/>
                <polygon class="arrowhead" points="216,224 204,218.4 204,229.6" fill="black" transform="rotate(0,208,224)"/>
                <polygon class="arrowhead" points="216,208 204,202.4 204,213.6" fill="black" transform="rotate(0,208,208)"/>
                <polygon class="arrowhead" points="24,176 12,170.4 12,181.6" fill="black" transform="rotate(180,16,176)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <polygon class="arrowhead" points="24,80 12,74.4 12,85.6" fill="black" transform="rotate(180,16,80)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="216" y="36">Service</text>
                  <text x="284" y="36">Operator</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="64" y="116">Search(Bob)</text>
                  <text x="424" y="132">SearchResponse(...)</text>
                  <text x="72" y="164">Update(Alice,</text>
                  <text x="148" y="164">...)</text>
                  <text x="424" y="180">UpdateResponse(...)</text>
                  <text x="68" y="212">Search(Fred)</text>
                  <text x="224" y="212">X</text>
                  <text x="64" y="228">Update(Bob,</text>
                  <text x="132" y="228">...)</text>
                  <text x="224" y="228">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                  Service Operator                  Manager
|                             |                                |
| Search(Alice) ------------->| ------------------------------>|
|<--------------------------- |<---------- SearchResponse(...) |
|                             |                                |
| Search(Bob) --------------->| ------------------------------>|
|<--------------------------- |<---------- SearchResponse(...) |
|                             |                                |
| Update(Alice, ...) -------->| ------------------------------>|
|<--------------------------- |<---------- UpdateResponse(...) |
|                             |                                |
| Search(Fred) ----------> X  |                                |
| Update(Bob, ...) ------> X  |                                |
|                             |                                |
]]></artwork>
          </artset>
        </figure>
        <t>The security of the Third-Party Management deployment mode comes from an
assumption that the service operator and the third-party manager do not collude
to behave maliciously. If the third-party manager behaves honestly, then any
improper modifications to a label's value that were requested by the
service operator will be properly published such that the label owner will
detect them when monitoring. If the service operator behaves honestly, the
third-party manager will be unable to add any new unauthorized versions of a
label such that a user will accept them, or remove any authorized version of a
label without the label owner detecting it.</t>
      </section>
      <section anchor="third-party-auditing">
        <name>Third-Party Auditing</name>
        <t>With the Third-Party Auditing deployment mode, the service operator obtains
signatures from a third-party auditor attesting to the fact that
the tree has been constructed correctly. These signatures are provided to users
as part of the responses for their queries.</t>
        <t>When running synchronously, the auditor can easily become a bottleneck for the
transparency log. It's generally expected that third-party auditors run
asynchronously, downloading and authenticating a log's contents in the
background. As a result, signatures from the auditor may lag behind the view
presented by the service operator. The maximum amount of time that the auditor
may lag behind the service operator without its signature being rejected by
users is set in the transparency log's configuration.</t>
        <t>As shown in <xref target="auditing-fig"/>, the auditor is updated on changes to the tree in
the background, and a recent signature from the auditor is provided to users.</t>
        <figure anchor="auditing-fig">
          <name>Third-Party Auditing</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="584" viewBox="0 0 584 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,192" fill="none" stroke="black"/>
                <path d="M 336,48 L 336,192" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,192" fill="none" stroke="black"/>
                <path d="M 176,64 L 328,64" fill="none" stroke="black"/>
                <path d="M 160,80 L 328,80" fill="none" stroke="black"/>
                <path d="M 176,96 L 328,96" fill="none" stroke="black"/>
                <path d="M 24,110 L 64,110" fill="none" stroke="black"/>
                <path d="M 24,114 L 64,114" fill="none" stroke="black"/>
                <path d="M 464,160 L 568,160" fill="none" stroke="black"/>
                <path d="M 344,176 L 432,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,160 564,154.4 564,165.6" fill="black" transform="rotate(0,568,160)"/>
                <polygon class="arrowhead" points="352,176 340,170.4 340,181.6" fill="black" transform="rotate(180,344,176)"/>
                <polygon class="arrowhead" points="336,96 324,90.4 324,101.6" fill="black" transform="rotate(0,328,96)"/>
                <polygon class="arrowhead" points="336,80 324,74.4 324,85.6" fill="black" transform="rotate(0,328,80)"/>
                <polygon class="arrowhead" points="336,64 324,58.4 324,69.6" fill="black" transform="rotate(0,328,64)"/>
                <polygon class="arrowhead" points="32,112 20,106.4 20,117.6" fill="black" transform="rotate(180,24,112)"/>
                <g class="text">
                  <text x="20" y="36">Many</text>
                  <text x="64" y="36">Users</text>
                  <text x="324" y="36">Transparency</text>
                  <text x="392" y="36">Log</text>
                  <text x="552" y="36">Auditor</text>
                  <text x="72" y="68">Update(Alice,</text>
                  <text x="148" y="68">...)</text>
                  <text x="64" y="84">Update(Bob,</text>
                  <text x="132" y="84">...)</text>
                  <text x="72" y="100">Update(Carol,</text>
                  <text x="148" y="100">...)</text>
                  <text x="156" y="116">Response{AuditorSig:</text>
                  <text x="264" y="116">66bf,</text>
                  <text x="308" y="116">...}</text>
                  <text x="400" y="164">AuditorUpdate</text>
                  <text x="504" y="180">AuditorTreeHead</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Many Users                        Transparency Log               Auditor
|                                        |                             |
| Update(Alice, ...) ------------------->|                             |
| Update(Bob, ...) --------------------->|                             |
| Update(Carol, ...) ------------------->|                             |
| <===== Response{AuditorSig: 66bf, ...} |                             |
|                                        |                             |
|                                        |                             |
|                                        | AuditorUpdate ------------->|
|                                        |<----------- AuditorTreeHead |
|                                        |                             |
]]></artwork>
          </artset>
        </figure>
        <t>Given the long-lived nature of transparency logs and the potentially short-lived
nature of third-party auditing arrangements, KT allows third-party auditors to
start auditing a log at any arbitrary point. This allows a new third-party
auditor to start up without ingesting the transparency log's entire
history. The point at which an auditor started auditing is provided to users in
the transparency log's configuration. When verifying query responses, users
verify that the auditor started auditing at or before the point necessary for
the query to be secure.</t>
      </section>
    </section>
    <section anchor="combining-logs">
      <name>Combining Logs</name>
      <t>There are many cases where it makes sense to operate multiple cooperating
transparency log instances, for example:</t>
      <ul spacing="normal">
        <li>
          <t>A service operator may wish to gradually migrate to a transparency log that
uses different cryptographic keys, a different cipher suite, or a
different deployment mode.</t>
        </li>
        <li>
          <t>A service operator may need to immediately migrate to a new transparency log
to recover from log failure, such as the compromise of the log's private keys
or the loss of its data.</t>
        </li>
        <li>
          <t>A service operator may operate multiple logs to handle the total load of a
high-traffic application.</t>
        </li>
        <li>
          <t>A federated system may allow each participant in the federation to operate
their own transparency log for their own users.</t>
        </li>
      </ul>
      <t>Client implementations should generally be prepared to interact with multiple
independent transparency logs to support these use-cases, particularly recovery
from log failure. When multiple transparency logs are used as part of one
application, all users need to have a consistent policy for executing Search,
Update, and Monitor queries against the logs in a way that maintains the
high-level security model of KT:</t>
      <ul spacing="normal">
        <li>
          <t>If all transparency logs behave honestly, then users observe a globally
consistent view of the data associated with each label.</t>
        </li>
        <li>
          <t>If any transparency log behaves dishonestly, this will be detected in a timely
manner by background monitoring or out-of-band communication.</t>
        </li>
      </ul>
      <section anchor="gradual-migration">
        <name>Gradual Migration</name>
        <t>In the case of gradually migrating from an old transparency log to a new one,
this policy may look like:</t>
        <ol spacing="normal" type="1"><li>
            <t>Search queries are executed against the old transparency log first, and
then against the new transparency log only if the most recent version of a
label in the old transparency log is a special application-defined
'tombstone' entry.</t>
          </li>
          <li>
            <t>Update queries are only executed against the new transparency log, with
the exception of adding a tombstone entry for the label to the old
transparency log if one hasn't been added already.</t>
          </li>
          <li>
            <t>Both transparency logs are monitored as they would be if they were run
individually. Once the migration has completed and the old transparency log
has stopped accepting modifications, the old transparency log needs to
stay operational long enough for all users to complete their monitoring of it,
keeping in mind that some users may be offline for a significant amount of
time. If the old transparency log is shut down before a user is able to
complete their monitoring of it, that user will be unable to detect some
forms of misbehavior by the old transparency log.</t>
          </li>
        </ol>
        <t>Placing a tombstone entry for each label in the old transparency log gives users
a clear indication as to which transparency log contains the most recent version
of a label. Importantly, it prevents users from incorrectly accepting a stale
version of a label.</t>
      </section>
      <section anchor="immediate-migration">
        <name>Immediate Migration</name>
        <t>In some situations, the service operator may instead choose to stop adding new
entries to a transparency log immediately and provide a new transparency log
that is pre-populated with the most recent versions of all labels. In this case,
the policy may look like:</t>
        <ol spacing="normal" type="1"><li>
            <t>Search queries must be executed against the new transparency log.</t>
          </li>
          <li>
            <t>Update queries must be executed against the new transparency log.</t>
          </li>
          <li>
            <t>The final tree head of the old transparency log is provided to
users over a trustworthy channel. Users issue their final Monitor queries to
complete monitoring up to this point. Label owners initiate monitoring state
for the new transparency log by processing an Update for the migrated
versions of their labels and verifying that the migration was done correctly.
From then on, users will monitor only the new transparency log.</t>
          </li>
        </ol>
        <t>The final tree head of the prior transparency log needs to be
distributed to users in a way that ensures that all users have a globally
consistent view. This can be done by storing them in a well-known label of the
new transparency log. Users need to process this well-known label as if they own
it, so that they continue to monitor it for unexpected changes for the duration
of the migration period. Alternatively, the final tree head may be
distributed with the application's code distribution mechanism. Regardless, if a
migration is the result of one or more private key compromises, the final tree
head must not be authenticated by a compromised private key.</t>
      </section>
      <section anchor="partitioning">
        <name>Partitioning</name>
        <t>Some applications partition labels across multiple transparency logs, where each
transparency log is responsible for a disjoint subset of labels. In such
applications, there needs to be a consistent policy for directing KT requests to the
correct transparency log. The two primary cases where partitioning is necessary
are high-traffic applications that require horizontal scaling, and federated
applications.</t>
        <t>In a high-traffic application, many servers that are owned and operated by a
single entity may need to cooperate to handle the total load of the
application. In this case, requests would typically be routed to a
transparency log based on a consistent hash of the label. Changing the set of
transparency logs may change which transparency log is responsible for a given
label; any such labels need to be moved between transparency logs as described in
<xref target="gradual-migration"/> or <xref target="immediate-migration"/>.</t>
        <t>In a federated application, many servers that are owned and operated by
different entities cooperate to provide a single end-to-end encrypted
communication service. Each entity provides its own infrastructure (in
particular, a transparency log) to serve the users that rely on it. Typically,
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>, indicating that
requests related to this user should be directed to the servers of
<tt>example.com</tt>.</t>
        <t>In a federated application, a controlling entity like <tt>example.com</tt> can act as
an anonymizing proxy for its users when they query transparency logs run by
other entities (in the manner of <xref target="RFC9458"/>), but should typically not attempt to
'mirror' or combine other transparency logs with its own. Doing so may prevent
the other transparency logs from consistently enforcing their access control
policies as intended, managing compliance with privacy laws, or modifying label
values quickly and without interference from third-party caches. An entity that
mirrors or combines another transparency log needs to ensure that these problems
are either resolved, for example by coordinating with the other transparency
log's operator, or acceptable for the application.</t>
      </section>
    </section>
    <section anchor="pruning">
      <name>Pruning</name>
      <t>As part of the core infrastructure of an end-to-end encrypted communication
service, transparency logs are required to operate seamlessly for several years.
This presents a problem for general append-only logs, as even moderate usage can
cause the log to grow to an unmanageable size in that time frame. This issue is
further compounded by the fact that a substantial portion of the entries added
to a log may be fake, having been added solely for the purpose of obscuring
short-term update rates (discussed in <xref target="privacy-considerations"/>). Given this,
transparency logs need to be able to 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 (values are stored in the log as cryptographic commitments).</t>
        </li>
      </ol>
      <t>The first type, serialized user data, can be pruned by removing data that has
either expired or has become permanently inaccessible due to the service
operator's access control policy. A transparency log may be configured with a
<strong>maximum lifetime</strong> for log entries. Once a log entry is older than the maximum
lifetime, it is considered expired and users no longer require proofs involving
it. A version of a label expires when it is no longer possible to produce a
valid search proof for the label-version pair, which happens when all of the
necessary log entries have expired. This is specified in more detail in
<xref target="PROTO"/>.</t>
      <t>Notably, the most recent version of a label is the only version that never
expires through the maximum lifetime mechanism. However, service operators may
define arbitrary access control policies that permanently block access to the
most recent version (or any other version) of a label. The values corresponding
to these label-version pairs may be deleted without consideration for the
rest of the protocol.</t>
      <t>The second type of data, cryptographic data, can also be pruned, but only after
considering which parts are no longer required by the protocol for producing
proofs. For example, even though a particular version of a label may have been
deleted, data corresponding to it may still need to exist in the latest version
of the transparency log's prefix tree to produce valid search proofs for other
versions of the label. The exact mechanism for determining which data is safe to
delete will depend on the protocol and implementation.</t>
      <t>The distinction between user data and cryptographic data provides a valuable
separation of concerns since KT does not provide a way for a service operator
to convey its access control policy to a transparency log. That is, it
allows the pruning of user data to be done entirely by application-defined code,
while the pruning of cryptographic data can be done entirely by KT-specific code
as a subsequent operation.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>A user that correctly verifies a proof from the transparency log and does any
required monitoring afterwards receives a guarantee that the transparency log
operator executed the operation correctly, and in a way that's globally
consistent with what it has shown all other users. That is, when a user searches
for a label, they're guaranteed that the result they receive represents the same
result that any other user searching for the same label at roughly the same time
would have seen. When a user modifies a label, they're guaranteed that other users
will see the modification within a bounded amount of time.</t>
      <t>Note that KT does not itself determine whether a new version of a label was
authorized by the label's owner. Instead, it guarantees that any version shown
to other users is also visible to the label's owner, who decides whether the
change is authorized when monitoring their label. As a result, detecting
unauthorized changes depends on the label owner performing regular monitoring.
If the owner is offline for an extended period, such as because their account is
dormant or abandoned, or if they lose their local state (see <xref target="state-loss"/>), an
unauthorized change may not be detected until the owner returns, or may not be
detected at all. In particular, if the owner is offline for longer than the
maximum lifetime of log entries, an unauthorized version that was inserted and
then replaced while the owner was offline may expire before the owner is able to
see it.</t>
      <section anchor="transparency-log-misbehavior">
        <name>Transparency Log Misbehavior</name>
        <t>If the transparency log does not execute an operation correctly, then one of the
following occurs:</t>
        <ol spacing="normal" type="1"><li>
            <t>The user detects the error immediately and rejects the proof.</t>
          </li>
          <li>
            <t>The user permanently enters an invalid state. That is, the user accepts a
result that is inconsistent with what the transparency log has shown other
users, such as a forked view of the log or a version of a label that the
transparency log later attempts to remove. Since users require all
subsequent queries to prove consistency with previous ones, the transparency
log is unable to reconcile the user's view with that of other users. This is
intentional, as it ensures the misbehavior is eventually detected, either by
background monitoring or by the mechanisms described in <xref target="detecting-forks"/>.
Importantly, this means that users must stay online for a bounded amount of
time after entering an invalid state for it to be successfully detected.</t>
          </li>
          <li>
            <t>Instead of executing a query incorrectly, the transparency log can attempt to
prevent the user from learning about more recent states of the log. This
would allow the log to continue executing queries correctly, but on stale
versions of data. To prevent this, applications configure an upper bound on
how stale a query response can be without being rejected.</t>
          </li>
        </ol>
        <t>The security of a transparency log depends naturally on the security of the
cryptographic primitives that it's configured to use, as well as 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
service operator and the third-party manager or auditor do not collude to
trick users into accepting malicious results.</t>
          </li>
          <li>
            <t>Contact Monitoring requires an assumption that all users that look up a label
complete any 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 a
label owner's devices don't go offline for longer than the maximum lifetime of
log entries, then any attempt by the transparency log to present inconsistent
views of a label to different users is always detected within a bounded amount
of time. The parameters that determine the maximum amount of time before such
misbehavior is detected are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The configured maximum amount of time by which a query response can be stale.</t>
          </li>
          <li>
            <t>The configured Reasonable Monitoring Window (see <xref target="deployment-modes"/>),
weighed against how frequently users execute background monitoring in
practice.</t>
          </li>
          <li>
            <t>For logs that use the Contact Monitoring deployment mode: how frequently users
engage in out-of-band communication.</t>
          </li>
          <li>
            <t>For logs that use the Third-Party Auditing deployment mode: the configured
maximum acceptable lag for an auditor.</t>
          </li>
          <li>
            <t>For logs that use the Third-Party Management deployment mode: the amount of
lag, or potential inefficacy, of the service operator's approach to detecting
forks.</t>
          </li>
        </ul>
        <t>Ultimately, a transparency log can always refuse to answer requests that would
reveal its own misbehavior. This includes refusing direct requests, requests
made over an anonymous channel, and requests for the specific tree heads users
need to efficiently gossip peer-to-peer. Similarly, a transparency log can
refuse to apply updates to a user's own label, such as replacing a compromised
public key. A user's persistent inability to perform monitoring, engage in out-of-band
communication, or update their own label is indistinguishable from transparency
log misbehavior and should be reported to the user as such.</t>
      </section>
      <section anchor="state-loss">
        <name>State Loss</name>
        <t>The security of KT often depends on the ability of users to maintain robust
local state. Users that lose their state in a Contact Monitoring or Third-Party
Auditing deployment will have a correspondingly reduced ability to detect if
they were shown a fork, or if the transparency log later obscured data that they
consumed. State loss can occur, for example, when a user's device is lost,
replaced, or reset, when the application is reinstalled or its data is cleared,
or when the user begins using a new device without transferring state from an
old one.</t>
        <t>In a Contact Monitoring deployment mode, state loss reduces a user's ability to
detect misbehavior if it occurs after the user consumes a version of a label
that was created either within the Reasonable Monitoring Window, or within a
portion of the log that was insufficiently gossiped. In a Third-Party Auditing
deployment mode, the same is true for a version of a label that was created
within the auditor's maximum acceptable lag.</t>
        <t>Applications should consider the nature of possible state loss in their clients
when configuring a transparency log and ensure that the relevant
protocol parameters are set in a way that appropriately mitigates this risk.
For example, in a Contact Monitoring deployment, the Reasonable Monitoring
Window and the duration between out-of-band communication attempts should be
much less than the typical time between state loss events. Similarly, in a
Third-Party Auditing deployment, the maximum acceptable lag for an auditor
should be much less than the typical time between state loss events. This
minimizes the likelihood that a state loss event could be useful to a
misbehaving transparency log.</t>
        <t>In applications where client state is typically ephemeral (like a web page), or
where state loss could possibly be triggered adversarially (for example, by the
service operator forcing a user to log out and re-register), a Third-Party
Management deployment mode is recommended. Alternatively, applications could
also consider implementing a policy of not consuming label-version pairs that
were inserted too recently. Once a label-version pair is outside of the
Reasonable Monitoring Window in a Contact Monitoring deployment, or beyond the
maximum acceptable auditor lag in a Third-Party Auditing deployment, the risks
associated with state loss are often already sufficiently mitigated.</t>
      </section>
      <section anchor="client-integrity">
        <name>Client Integrity</name>
        <t>The security of KT depends on several assumptions about the clients that users
run:</t>
        <ol spacing="normal" type="1"><li>
            <t>Clients are able to execute code securely. That is, the device and operating
system that a client runs on do not allow an attacker to tamper with the
client's execution or local state.</t>
          </li>
          <li>
            <t>Clients are executing a secure implementation of the protocol.</t>
          </li>
          <li>
            <t>Clients have an authentic copy of the transparency log's configuration.</t>
          </li>
          <li>
            <t>Clients have accurate local clocks.</t>
          </li>
        </ol>
        <t>The first assumption is common to all end-to-end encrypted systems, as a
compromised device can generally access a user’s private keys and plaintext
directly. To mitigate the risk of compromised devices, applications can rely on
platform security features such as verified boot, application sandboxing, and
hardware-backed key storage. Since KT requires clients to retain local state,
applications should also consider protecting this state against modification and
against being rolled back to an previous version.</t>
        <t>The second and third assumption are particularly important to address, since
client software and the transparency log's configuration are usually distributed
by the service operator, which is the same party that KT is intended to protect
against. A service operator that is able to distribute modified client software
or configuration to a user can defeat KT entirely for that user. For example, it
could disable proof verification or monitoring, or replace the public key of the
transparency log or a third party with one that it controls.</t>
        <t>To address this, applications can rely on a mechanism such as Binary
Transparency. Binary Transparency systems require each released version of a
piece of software to be published in a public, append-only log before clients
will install it. This ensures that a modified version of the software cannot be
distributed to specific users without also being visible to everyone else.
Making client software open source and reproducibly built additionally allows
outside parties to inspect each published version and verify that it implements
the protocol correctly and contains the correct configuration.</t>
        <t>Finally, a client with an inaccurate clock may accept a stale view of the log
that would otherwise be rejected. Applications can ensure that clients have an
accurate clock with a protocol like Roughtime <xref target="I-D.ietf-ntp-roughtime"/>, which
provides authenticated time from multiple independent servers and allows clients
to detect servers that provide incorrect time.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <section anchor="access-control">
        <name>Access Control</name>
        <t>For applications deploying KT, service operators expect to be able to control
when sensitive information is revealed. In particular, a service operator may
need to restrict who is able to learn that a user is a member of their service,
or information about that user's account.</t>
        <t>KT only allows a user 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 a user to learn about the value of a label if
the user obtains a valid search proof for that exact version of the label.</t>
        <t>When an application's access control policy previously permitted a user to look
up or change a label's value but no longer does, KT prevents the user from
learning whether or not the label's value has changed since the user's access
was revoked. This is true even in Contact Monitoring mode, where users are still
permitted to perform monitoring after their access to perform other queries has
been revoked.</t>
        <t>Applications determine the privacy of data in KT by relying on these properties
when they enforce access control policies on the queries issued by users, as
discussed in <xref target="protocol-overview"/>. For example, an application's access control
policy may only allow users to search for the labels of their contacts, or of
users they are actively starting a conversation with. This prevents users that
are not contacts or actively communicating from learning about each other's
existence. If two users were previously contacts but no longer are, the
application can prevent the users from searching for each other's labels and
learning whether there have been any subsequent account updates.</t>
      </section>
      <section anchor="population-level-metrics">
        <name>Population-Level Metrics</name>
        <t>Service operators also expect to be able to control sensitive population-level
metrics about their users. These metrics include the size of their user base, the
frequency with which new users join, and the frequency with which existing users
update their labels.</t>
        <t>KT allows a service operator to obscure the size of its user base by batch
inserting a large number of fake label-version pairs when a transparency log is
first initialized. Similarly, KT also allows a service operator to obscure the
rate at which "real" changes are made to the transparency log by padding "real"
changes with the insertion of other fake label-version pairs, such that it
creates the outside appearance of a constant baseline rate of insertions.</t>
      </section>
      <section anchor="leakage-to-third-parties">
        <name>Leakage to Third Parties</name>
        <t>In the event that a third-party manager or auditor 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 Verifiable Random Function (VRF) <xref target="RFC9381"/>, and values are
only provided to auditors as commitments.
They are also not able to distinguish 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 anchor="right-to-erasure">
        <name>Right to Erasure</name>
        <t>Consumer privacy laws often provide a <em>right to erasure</em>. This means that when a
consumer requests that a service operator delete their personal information, the
service operator 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 cannot be removed. The
important caveat here is that user data is not directly stored in the
append-only log. Instead, it primarily contains privacy-preserving VRF outputs
and cryptographic commitments.</t>
        <t>The value corresponding to a label is typically some serialized user account
data, like a public key or internal identifier. KT uses cryptographic
commitments to ensure that users interacting with a transparency log are unable
to learn anything about a label's value until the transparency log explicitly
provides the commitment's opening. A transparency log responding to an erasure
request can delete the commitment opening and the associated data. This can be
done immediately and permanently prevents recovery of the associated value.</t>
        <t>Labels themselves are typically serialized end-user identifiers, like a username
or email address. All labels are processed through a VRF, which uses a private
key to deterministically map each label to a fixed-length pseudorandom value.
The set of all labels stored in a transparency log is committed to by a prefix
tree, and each version of the prefix tree is committed to by a log tree.</t>
        <t>While all the VRF outputs corresponding to labels affected by an erasure request
can be deleted from the most recent version of the prefix tree immediately,
previous versions of the prefix tree will still contain the VRF outputs and will
still be needed by the protocol for a bounded amount of time. This bound is
determined by the maximum lifetime of log entries (see <xref target="pruning"/>). As such,
the VRF outputs can only be fully purged from the transparency log once all log
entries that contain them have passed their maximum lifetime.</t>
      </section>
    </section>
    <section anchor="implementation-guidance">
      <name>Implementation Guidance</name>
      <t>Fundamentally, KT can be thought of as guaranteeing that all the users of a
service agree on the contents of a key-value database (noting that this document
refers to these keys as "labels"). It takes special care to turn the guarantee
that all users agree on a set of labels and values into a guarantee that the
mapping between end-users and their public keys is authentic. Critically, to
authenticate an end-user identity, it must be both <em>unique</em> and <em>user-visible</em>.
However, what exactly constitutes a unique and user-visible identifier varies
greatly from application to application.</t>
      <t>Consider, for example, a communication service where users are uniquely
identified by a fixed username, but KT has been deployed using each user's
internal ID as their label. While the ID might be unique, it is not
necessarily user-visible if, when a user attempts to look up a contact by username,
the service operator translates the username into a user ID under the hood. If
this mapping (from username to ID) is unauthenticated, the service operator
can manipulate it to eavesdrop on conversations by returning the ID for an
account that it controls. From a security perspective, this would be equivalent
to not using KT at all.</t>
      <t>However, that's not to say that the use of internal IDs in KT is never
appropriate. Many applications don't have a concept of a fixed explicit
identifier, like a username, and instead rely on their UI (underpinned
internally by a user's ID) to indicate to users whether a conversation is with a
new person or someone they've previously contacted. The fact that the UI behaves
this way makes the user's ID a user-visible identifier even if a user may not be
able to actually see it written out. An example of an application with these
identifier semantics, although not one that provides end-to-end encryption,
would be Slack.</t>
      <t>A <strong>primary end-user identity</strong> is one that is unique, user-visible, and unable
to change. (Or equivalently, if it changes, it appears in the application UI as
a new conversation with a new user.) An example of this type of identity would
be an email address on an email service. A primary end-user identity should
always be a label in KT, with the end-user's public keys and other account
information as the associated value.</t>
      <t>A <strong>secondary end-user identity</strong> is one that is unique and user-visible, and
that can change without being interpreted as a different account because it is
associated with a primary end-user identity. Secondary end-user identities are
used solely for initial user discovery, during which they're converted into a
primary end-user identity that the application uses to identify the end-user
from then on. For example, an application may allow users to change their
username without disrupting existing conversations because each username is
associated with an internal user ID. The username is a secondary end-user
identity, and the internal user ID is the primary end-user identity. The
internal user ID is user-visible by virtue of the fact that existing
conversations with the user continue uninterrupted when their username changes.
A secondary end-user identity should be a label in KT with the primary end-user
identity as its associated value, so that the user discovery process is
authenticated.</t>
      <t>While likely helpful to most common applications, the distinction between
handling primary and secondary end-user identities is not a guaranteed rule.
Applications must be careful to ensure they fully capture the semantics of
identity in their application with the labels and values they store in KT.</t>
      <t>Relatedly, while KT authenticates the mapping from a label to its value, it does
not help users distinguish between labels that appear similar. For example, two
usernames that differ only in visually similar characters are distinct labels to
KT, but may not be distinct to a user. Applications should take care to prevent
confusable identifiers from being registered.</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="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 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="PROTO">
          <front>
            <title>Key Transparency Protocol</title>
            <author fullname="Brendan McMillion" initials="B." surname="McMillion">
         </author>
            <author fullname="Felix Linker" initials="F." surname="Linker">
         </author>
            <date day="5" month="July" year="2026"/>
            <abstract>
              <t>   While there are several established protocols for end-to-end
   encryption, relatively little attention has been given to securely
   distributing the end-user public keys for such encryption.  As a
   result, these protocols are often still vulnerable to eavesdropping
   by active attackers.  Key Transparency is a protocol for distributing
   sensitive cryptographic information, such as public keys, in a way
   that reliably either prevents interference or detects that it
   occurred in a timely manner.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-protocol-05"/>
        </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="I-D.ietf-ntp-roughtime">
          <front>
            <title>Roughtime</title>
            <author fullname="Watson Ladd" initials="W." surname="Ladd">
              <organization>Akamai Technologies</organization>
            </author>
            <author fullname="Marcus Dansarie" initials="M." surname="Dansarie">
              <organization>Netnod</organization>
            </author>
            <date day="17" month="March" year="2026"/>
            <abstract>
              <t>   This document describes Roughtime, an experimental protocol that aims
   to achieve two things: secure rough time synchronization even for
   clients without any idea of what time it is, and give clients a
   format for reporting any inconsistencies they observe between
   timeservers.  This document specifies the on-wire protocol required
   for these goals, and discusses aspects of the ecosystem needed for it
   to work.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ntp-roughtime-19"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
