<?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-10" 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-10"/>
    <author fullname="Brendan McMillion">
      <organization/>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="07"/>
    <area>Security</area>
    <workgroup>Key Transparency</workgroup>
    <keyword>key transparency</keyword>
    <abstract>
      <?line 37?>

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>Before any information can be exchanged in an end-to-end encrypted system, two
things must happen: First, participants in the system must provide the service
operator with any public keys they wish to use to receive messages. Second, the
service operator must somehow distribute these public keys amongst the
participants that wish to communicate with each other.</t>
      <t>Typically, 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 easily detectable. 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="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<dl>
        <dt><strong>End-to-End Encrypted Communication Service:</strong></dt>
        <dd>
          <t>A communication service that allows end-users to engage in text, voice,
video, or other forms of communication over the internet, and uses public key
cryptography to ensure that communications are only accessible to their
intended recipients.</t>
        </dd>
        <dt><strong>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 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>
      </dl>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>From a networking perspective, KT follows a client-server architecture with a
central <em>transparency log</em>, acting as a server, which holds the authoritative
copy of all information and exposes endpoints that allow users to query or
modify stored data. Users coordinate with each other through the server by
uploading their own public keys and downloading the public keys of other
users. Users are expected to maintain relatively little state, limited only
to what is required to interact with the log and ensure that it is behaving
honestly.</t>
      <t>From an application perspective, KT can be thought of as a versioned key-value
database. Users insert key-value pairs into the database where, for example, the
key is their username and the value is their public key. Users can update a key
by inserting a new version with new data. They can also look up the most recent
version of a key or any previous version. From this point forward, the term
<strong>label</strong> will be used to refer to lookup keys in the key-value database that a
transparency log represents to avoid confusion with cryptographic public or
private keys.</t>
      <t>Users are considered to <strong>own</strong> a label if they are understood to either
initiate all changes to the label's value, or if they must be informed of all
changes to the label's value. The latter situation may occur if, for example, KT
is deployed in a way where the service operator makes automated modifications to
stored data. The owning user would then be informed, after the fact, of
modifications to verify that they were legal.</t>
      <t>KT does not require the use of a specific transport protocol. This is intended
to allow applications to layer KT on top of whatever transport protocol their
application already uses. In particular, this allows applications to continue
relying on their existing access control system.</t>
      <t>With some small exceptions, applications may enforce arbitrary access control
rules on top of KT. This may include requiring a user to be logged in to make KT
requests, only allowing a user to look up the labels of their contacts, or
applying a rate limit. Most applications will likely want to, at
minimum, prevent users from
modifying labels they do not own. The exact mechanism for rejecting requests,
and possibly explaining the reason for rejection, is left to the application.</t>
      <section anchor="user-operations">
        <name>User Operations</name>
        <t>The operations that can be executed by a user are as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Search:</strong> Looks up the value of a specific label in the most recent version
of the log. Users may request either a specific version of the label or the
most recent version available. If the label-version pair exists, the server
returns the corresponding value and a proof that the search operation was
executed correctly.</t>
          </li>
          <li>
            <t><strong>Update:</strong> Adds a new label-value pair to the log. The server returns a
proof that the label-value pair was added correctly. Note that this means
that new values are added to the log immediately and no provisional proof,
such as an Signed Certificate Timestamp (SCT) as defined in <xref section="3" sectionFormat="of" target="RFC6962"/>, is provided.</t>
          </li>
          <li>
            <t><strong>Monitor:</strong> While Search and Update are run by the user as necessary,
monitoring is done in the background on a recurring basis. It can both check
that the log is continuing to behave honestly (all previously returned labels
remain in the tree) and that no changes have been made to labels owned by the
user without the user's knowledge.</t>
          </li>
        </ol>
        <t>These operations are executed over an application-provided transport layer.
The transport layer enforces access control by blocking queries which are
not allowed:</t>
        <figure anchor="request-response">
          <name>Example request and response flow. Valid requests receive a response while invalid requests are blocked by the transport layer.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="456" viewBox="0 0 456 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 24,48 L 24,320" fill="none" stroke="black"/>
                <path d="M 384,48 L 384,320" fill="none" stroke="black"/>
                <path d="M 152,96 L 376,96" fill="none" stroke="black"/>
                <path d="M 32,112 L 208,112" fill="none" stroke="black"/>
                <path d="M 136,144 L 376,144" fill="none" stroke="black"/>
                <path d="M 32,160 L 208,160" fill="none" stroke="black"/>
                <path d="M 192,192 L 376,192" fill="none" stroke="black"/>
                <path d="M 32,208 L 208,208" fill="none" stroke="black"/>
                <path d="M 144,288 L 320,288" fill="none" stroke="black"/>
                <path d="M 176,304 L 320,304" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,192 372,186.4 372,197.6" fill="black" transform="rotate(0,376,192)"/>
                <polygon class="arrowhead" points="384,144 372,138.4 372,149.6" fill="black" transform="rotate(0,376,144)"/>
                <polygon class="arrowhead" points="384,96 372,90.4 372,101.6" fill="black" transform="rotate(0,376,96)"/>
                <polygon class="arrowhead" points="328,304 316,298.4 316,309.6" fill="black" transform="rotate(0,320,304)"/>
                <polygon class="arrowhead" points="328,288 316,282.4 316,293.6" fill="black" transform="rotate(0,320,288)"/>
                <polygon class="arrowhead" points="40,208 28,202.4 28,213.6" fill="black" transform="rotate(180,32,208)"/>
                <polygon class="arrowhead" points="40,160 28,154.4 28,165.6" fill="black" transform="rotate(180,32,160)"/>
                <polygon class="arrowhead" points="40,112 28,106.4 28,117.6" fill="black" transform="rotate(180,32,112)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="372" y="36">Transparency</text>
                  <text x="440" y="36">Log</text>
                  <text x="116" y="68">(Valid</text>
                  <text x="152" y="68">/</text>
                  <text x="196" y="68">Accepted</text>
                  <text x="272" y="68">Requests)</text>
                  <text x="88" y="100">Search(Alice)</text>
                  <text x="296" y="116">SearchResponse(...)</text>
                  <text x="80" y="148">Search(Bob)</text>
                  <text x="296" y="164">SearchResponse(...)</text>
                  <text x="88" y="196">Update(Alice,</text>
                  <text x="164" y="196">...)</text>
                  <text x="296" y="212">UpdateResponse(...)</text>
                  <text x="120" y="260">(Rejected</text>
                  <text x="168" y="260">/</text>
                  <text x="208" y="260">Blocked</text>
                  <text x="280" y="260">Requests)</text>
                  <text x="84" y="292">Search(Fred)</text>
                  <text x="336" y="292">X</text>
                  <text x="80" y="308">Update(Bob,</text>
                  <text x="148" y="308">...)</text>
                  <text x="336" y="308">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                                   Transparency Log
  |                                            |
  |        (Valid / Accepted Requests)         |
  |                                            |
  | Search(Alice) ---------------------------->|
  |<---------------------- SearchResponse(...) |
  |                                            |
  | Search(Bob) ------------------------------>|
  |<---------------------- SearchResponse(...) |
  |                                            |
  | Update(Alice, ...) ----------------------->|
  |<---------------------- UpdateResponse(...) |
  |                                            |
  |                                            |
  |       (Rejected / Blocked Requests)        |
  |                                            |
  | Search(Fred) ----------------------> X     |
  | Update(Bob, ...) ------------------> X     |
  |                                            |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="credentials">
        <name>Credentials</name>
        <t>While users are generally understood to interact directly with the transparency
log, many end-to-end encrypted communication services require the ability to
provide <em>credentials</em> to their users. Credentials convey a binding between an
end-user identity and public keys or other information, and can be verified with
minimal network access. 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 auditor or manager), a credential
that has been modified will fail verification.</t>
        <t>Any future monitoring that may be required <bcp14>SHOULD</bcp14> be provided to recipients
proactively by the sender, as this is the most robust way to preserve the
sender's anonymity. If required future monitoring isn't provided, either
accidentally or because the system was intentionally designed that way, the
recipient will need to perform the monitoring themself over an anonymous
channel.</t>
        <figure anchor="anonymous">
          <name>Example message flow in an anonymous deployment. Users request their own label from the transparency log and provide the serialized response, functioning as a credential, in encrypted messages to other users. Required monitoring is provided proactively.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="504" viewBox="0 0 504 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,176" fill="none" stroke="black"/>
                <path d="M 272,48 L 272,176" fill="none" stroke="black"/>
                <path d="M 432,80 L 432,88" fill="none" stroke="black"/>
                <path d="M 496,48 L 496,176" fill="none" stroke="black"/>
                <path d="M 16,64 L 144,64" fill="none" stroke="black"/>
                <path d="M 184,80 L 264,80" fill="none" stroke="black"/>
                <path d="M 448,96 L 488,96" fill="none" stroke="black"/>
                <path d="M 16,128 L 136,128" fill="none" stroke="black"/>
                <path d="M 192,144 L 264,144" fill="none" stroke="black"/>
                <path d="M 456,160 L 488,160" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="496,160 484,154.4 484,165.6" fill="black" transform="rotate(0,488,160)"/>
                <polygon class="arrowhead" points="496,96 484,90.4 484,101.6" fill="black" transform="rotate(0,488,96)"/>
                <polygon class="arrowhead" points="272,144 260,138.4 260,149.6" fill="black" transform="rotate(0,264,144)"/>
                <polygon class="arrowhead" points="272,80 260,74.4 260,85.6" fill="black" transform="rotate(0,264,80)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <polygon class="arrowhead" points="24,64 12,58.4 12,69.6" fill="black" transform="rotate(180,16,64)"/>
                <g class="text">
                  <text x="52" y="36">Transparency</text>
                  <text x="120" y="36">Log</text>
                  <text x="272" y="36">Alice</text>
                  <text x="416" y="36">Anonymous</text>
                  <text x="480" y="36">Group</text>
                  <text x="208" y="68">Search(Alice)</text>
                  <text x="96" y="84">SearchResponse(...)</text>
                  <text x="332" y="84">Encrypt(Anon</text>
                  <text x="408" y="84">Group</text>
                  <text x="376" y="100">SearchResponse)</text>
                  <text x="204" y="132">Monitor(Alice)</text>
                  <text x="100" y="148">MonitorResponse(...)</text>
                  <text x="332" y="148">Encrypt(Anon</text>
                  <text x="412" y="148">Group,</text>
                  <text x="380" y="164">MonitorResponse)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Transparency Log               Alice           Anonymous Group
|                                |                           |
|<---------------- Search(Alice) |                           |
| SearchResponse(...) ---------->| Encrypt(Anon Group,       |
|                                |     SearchResponse) ----->|
|                                |                           |
|<--------------- Monitor(Alice) |                           |
| MonitorResponse(...) --------->| Encrypt(Anon Group,       |
|                                |     MonitorResponse) ---->|
|                                |                           |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="detecting-forks">
        <name>Detecting Forks</name>
        <t>It is sometimes possible for a transparency log to present forked views of data
to different users. This means that, from an individual user's perspective, a
log may appear to be operating correctly in the sense that all of a user's
requests succeed and proofs verify correctly. However, the transparency log has
presented a view to the user that's not globally consistent with what it has
shown other users. As such, the log may be able to change a label's value
without the label's owner becoming aware.</t>
        <t>The protocol is designed such that users always require subsequent queries to
prove consistency with previous queries. As such, users always stay on a
linearizable view of the log. If a user is ever presented with a forked view,
they hold on to this forked view forever and reject the output of any subsequent
queries that are inconsistent with it.</t>
        <t>This provides ample opportunity for users to detect when a fork has been
presented but isn't in itself sufficient for detection. To detect forks, users
require either a <strong>trusted third party</strong>, <strong>anonymous communication</strong> with the
transparency log, or <strong>peer-to-peer communication</strong>.</t>
        <t>With a trusted third party, such as a Third-Party Auditor or Manager as
described in <xref target="third-party-auditing"/> and <xref target="third-party-management"/>, an outside
organization monitors the operation of the transparency log. This third party
verifies, among other things, that the transparency log is growing in an
append-only manner. If verification is successful, the third party produces
a signature on the most recent tree head. The transparency log provides this
signature to users inline with their query responses as proof that they are not
being shown a fork. This approach relies on an assumption that the third party
is trusted not to collude with the transparency log to sign a fork.</t>
        <t>With anonymous communication, a single user accesses the transparency log over
an anonymous channel and checks that the transparency log is presenting the same
tree head over the anonymous channel as it does over an authenticated channel.
The security of this approach relies on the fact that, if the transparency log
doesn't know which user is making the request, it will show the user the wrong
fork with high probability. Repeating this check over time makes it
overwhelmingly likely that any fork presented to any user will be detected.</t>
        <t>With peer-to-peer communication, two users gossip with each other to establish
that they both have the same view of the transparency log. This gossip is able
to happen over any supported out-of-band channel even if it is heavily
bandwidth-constrained, such as scanning a QR code. However, this approach is
only secure if gossip can be implemented such that gossipping users are
reasonably expected to form a connected graph of all users. If not, then the
transparency log can attempt to partition users into subsets that do not gossip
and can present each subset of users with different forks.</t>
        <t>Regardless of approach, in the event that a fork is successfully detected, the
user is able to produce non-repudiable proof of log misbehavior which can be
published.</t>
        <figure anchor="out-of-band-checking">
          <name>Users receive tree heads while making authenticated requests to a transparency log. Users ensure consistency of tree heads by either comparing amongst themselves, or by contacting the transparency log over an anonymous channel. Requests that require authentication (`Search(Bob)` in this example) may be blocked over the anonymous channel.</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
transparency log and the end-user.</t>
      <t><strong>Third-Party Management</strong> and <strong>Third-Party Auditing</strong> are two deployment modes
that require the transparency log to delegate part of its operation
to a third party.</t>
      <t>With both third-party modes, all requests from end-users are initially routed to
the transparency log and the log coordinates with the third party
itself. End-users never contact the third party directly, although they will
need a signature public key from the third party to verify its assertions.</t>
      <t>With Third-Party Management, the third party performs the majority of the work
of actually storing and operating the service, and the transparency log only
signs new entries as they're added. With Third-Party Auditing, the transparency
log performs the majority of the work of storing and operating the service, only
obtaining signatures from a third-party auditor at regular intervals
asserting that the tree has been constructed correctly.</t>
      <t>To reduce the probability of collusion between the transparency log and the
third party, a transparency log can have two or more independent third parties
coordinate as one and produce threshold signatures. In this scenario, the
threshold for a valid signature <bcp14>MUST</bcp14> be at least a majority of the third
parties, to prevent different subsets from authenticating forked views.</t>
      <t><strong>Contact Monitoring</strong>, on the other hand, supports a single-party deployment
with no third party. The cost of this is that, when a user looks up a version of
a label that was inserted very recently, the user may need to retain some
additional state and monitor the label until it is included in a <em>distinguished
log entry</em>. 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 <bcp14>MUST</bcp14> regularly attempt to detect forks through anonymous
communication with the transparency log or peer-to-peer communication, as
described in <xref target="detecting-forks"/>.</t>
      <t>Applications that rely on a transparency log deployed in either of the
third-party modes <bcp14>MAY</bcp14> allow users to enable a "Contact Monitoring Mode". This
mode, which affects only the individual client's behavior, would cause the
client to behave as if its transparency log was deployed in Contact Monitoring
mode. As such, it would start retaining state about previously looked-up labels
and regularly engaging in out-of-band communication. Enabling this
higher security mode allows users to double check that the third party is not
colluding with the transparency log.</t>
      <section anchor="contact-monitoring">
        <name>Contact Monitoring</name>
        <t>With the Contact Monitoring deployment mode, the monitoring burden is split
between both the owner of a label and those that look up the label. Stated as
simply as possible, the monitoring obligations of each 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.</t>
        <t>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 the monitoring described above. As in all
deployment modes, the application determines what values may be stored in a
label (see <xref target="protocol-overview"/>).</t>
        <figure anchor="contact-monitoring-fig">
          <name>Contact Monitoring. Alice searches for Bob's label. One day later, Alice verifies the label-version pair she observed remained in transparency log. Another day later, Bob comes online and monitors his own label. Note that Alice does not need to wait on Bob to make his Monitor request before making hers.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="584" viewBox="0 0 584 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,256" fill="none" stroke="black"/>
                <path d="M 296,48 L 296,256" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,256" fill="none" stroke="black"/>
                <path d="M 120,64 L 288,64" fill="none" stroke="black"/>
                <path d="M 16,80 L 120,80" fill="none" stroke="black"/>
                <path d="M 128,144 L 288,144" fill="none" stroke="black"/>
                <path d="M 16,160 L 112,160" fill="none" stroke="black"/>
                <path d="M 304,224 L 456,224" fill="none" stroke="black"/>
                <path d="M 480,240 L 568,240" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,240 564,234.4 564,245.6" fill="black" transform="rotate(0,568,240)"/>
                <polygon class="arrowhead" points="312,224 300,218.4 300,229.6" fill="black" transform="rotate(180,304,224)"/>
                <polygon class="arrowhead" points="296,144 284,138.4 284,149.6" fill="black" transform="rotate(0,288,144)"/>
                <polygon class="arrowhead" points="296,64 284,58.4 284,69.6" fill="black" transform="rotate(0,288,64)"/>
                <polygon class="arrowhead" points="24,160 12,154.4 12,165.6" fill="black" transform="rotate(180,16,160)"/>
                <polygon class="arrowhead" points="24,80 12,74.4 12,85.6" fill="black" transform="rotate(180,16,80)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="284" y="36">Transparency</text>
                  <text x="352" y="36">Log</text>
                  <text x="568" y="36">Bob</text>
                  <text x="64" y="68">Search(Bob)</text>
                  <text x="208" y="84">SearchResponse(...)</text>
                  <text x="108" y="116">(1</text>
                  <text x="136" y="116">day</text>
                  <text x="180" y="116">later)</text>
                  <text x="68" y="148">Monitor(Bob)</text>
                  <text x="204" y="164">MonitorResponse(...)</text>
                  <text x="108" y="196">(1</text>
                  <text x="136" y="196">day</text>
                  <text x="180" y="196">later)</text>
                  <text x="516" y="228">Monitor(Bob)</text>
                  <text x="388" y="244">MonitorResponse(...)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                        Transparency Log                        Bob
|                                   |                                  |
| Search(Bob) --------------------->|                                  |
|<------------- SearchResponse(...) |                                  |
|                                   |                                  |
|           (1 day later)           |                                  |
|                                   |                                  |
| Monitor(Bob) -------------------->|                                  |
|<------------ MonitorResponse(...) |                                  |
|                                   |                                  |
|           (1 day later)           |                                  |
|                                   |                                  |
|                                   |<------------------- Monitor(Bob) |
|                                   | MonitorResponse(...) ----------->|
|                                   |                                  |
]]></artwork>
          </artset>
        </figure>
        <t>Importantly, Contact Monitoring impacts how the server is able to enforce access
control on Monitor queries. While Search and Update queries can enforce access
control on an arbitrary "point in time" basis, where a user is allowed to
execute the query at one point in time but maybe not the next, users are
sometimes required by the protocol to make Monitor queries based on the Search
and Update queries they made in the past. These Monitor queries <bcp14>MUST</bcp14> be
permitted, regardless of whether or not the user is still permitted to execute
such Search or Update queries.</t>
      </section>
      <section anchor="third-party-auditing">
        <name>Third-Party Auditing</name>
        <t>With the Third-Party Auditing deployment mode, the transparency log obtains
signatures from a third-party auditor attesting (at minimum) to the fact that
the tree has been constructed correctly. These signatures are provided to users
as part of the responses for their queries.</t>
        <t>When running synchronously, the auditor can easily become a bottleneck for the
transparency log. It's generally expected that third-party auditors run
asynchronously, downloading and authenticating a log's contents in the
background. As a result, signatures from the auditor may lag behind the view
presented by the transparency log. The maximum amount of time that the auditor
may lag behind the transparency log without its signature being rejected by
users is set in the transparency log's configuration.</t>
        <figure anchor="auditing-fig">
          <name>Third-Party Auditing. A recent signature from the auditor is provided to users. The auditor is updated on changes to the tree in the background.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="584" viewBox="0 0 584 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,192" fill="none" stroke="black"/>
                <path d="M 336,48 L 336,192" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,192" fill="none" stroke="black"/>
                <path d="M 176,64 L 328,64" fill="none" stroke="black"/>
                <path d="M 160,80 L 328,80" fill="none" stroke="black"/>
                <path d="M 176,96 L 328,96" fill="none" stroke="black"/>
                <path d="M 24,110 L 64,110" fill="none" stroke="black"/>
                <path d="M 24,114 L 64,114" fill="none" stroke="black"/>
                <path d="M 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 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.</t>
        <figure anchor="manager-fig">
          <name>Third-Party Management. Valid requests are proxied by the service operator to the manager. Invalid requests are blocked.</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>
        <t>The service operator <bcp14>MUST</bcp14> implement some mechanism to detect when forks are
presented by the third-party manager. Additionally, the service operator <bcp14>MUST</bcp14>
implement some mechanism to prevent the same version of a label from being
submitted to the third-party manager multiple times with different associated
values.</t>
      </section>
    </section>
    <section anchor="combining-logs">
      <name>Combining Logs</name>
      <t>There are many cases where it makes sense to operate multiple cooperating
transparency log instances, for example:</t>
      <ul spacing="normal">
        <li>
          <t>A service operator may wish to gradually migrate to a transparency log that
uses different cryptographic keys, a different cipher suite, or different
deployment mode.</t>
        </li>
        <li>
          <t>A service 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 <bcp14>SHOULD</bcp14> 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 <bcp14>MUST</bcp14> have a consistent policy for executing Search,
Update, and Monitor queries against the logs in a way that maintains the
high-level security 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 <bcp14>MUST</bcp14> stay
operational long enough for all users to complete their monitoring of it,
keeping in mind that some users may be offline for a significant amount of
time. If the old transparency log is shut down before a user is able to
complete their monitoring of it, that user will be unable to detect some
forms of misbehavior by the old transparency log.</t>
          </li>
        </ol>
        <t>Placing a tombstone entry for each label in the old transparency log gives users
a clear indication as to which transparency log contains the most recent version
of a label. Importantly, it prevents users from incorrectly accepting a stale
version of a label if the new transparency log is unreachable.</t>
      </section>
      <section anchor="immediate-migration">
        <name>Immediate Migration</name>
        <t>In some situations, the service 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 size and root hash of the old transparency log is provided to
users over a trustworthy channel. Users issue their final Monitor queries to
complete monitoring up to this point. Label owners initiate monitoring state
for the new transparency log by processing an Update for the migrated
versions of their labels and verifying that the migration was done correctly.
From then on, users will monitor only the new transparency log.</t>
          </li>
        </ol>
        <t>The final tree size and root hash of the prior transparency log need to be
distributed to users in a way that 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 <bcp14>MUST</bcp14> process this well-known label as if they own
it, so that they continue to monitor it for unexpected changes for the duration
of the migration period. Alternatively, the final tree size and root hash may be
distributed with the application's code distribution mechanism.</t>
      </section>
      <section anchor="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 <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> 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 will 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> <bcp14>MAY</bcp14> act as
an anonymizing proxy for its users when they query transparency logs run by
other entities (in the manner of <xref target="RFC9458"/>), but <bcp14>SHOULD NOT</bcp14> attempt to
'mirror' or combine other transparency logs with its own. 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 manage their footprint by pruning data which
is no longer required by the communication service.</t>
      <t>Broadly speaking, a transparency log's database will contain two types of data:</t>
      <ol spacing="normal" type="1"><li>
          <t>Serialized user data (the values corresponding to labels in the log), and</t>
        </li>
        <li>
          <t>Cryptographic data, such as pre-computed portions of hash trees or commitment
openings.</t>
        </li>
      </ol>
      <t>The first type, serialized user data, can be pruned by removing entries that
have either expired or have 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. This is specified in more detail in <xref target="PROTO"/>. 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.</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 also be deleted without consideration to the rest of the
protocol.</t>
      <t>The second type of data, cryptographic data, can also be pruned, but only after
considering which parts are no longer required by the protocol for producing
proofs. For example, even though a particular version of a label may have been
deleted, the corresponding Verifiable Random Function (VRF) <xref target="RFC9381"/> output
and commitment may still need to exist in the latest version of the transparency
log's prefix tree to produce valid search proofs for other versions of the
label. The exact mechanism for determining
which data is safe to delete will depend on the protocol and implementation.</t>
      <t>The distinction between user data and cryptographic data provides a valuable
separation of concerns since 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've seen. When a user modifies a label, they're guaranteed that other users
will see the modification within a bounded amount of time.</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 attempts 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
transparency log and the third-party manager or auditor do not collude
to trick users into accepting malicious results.</t>
          </li>
          <li>
            <t>Contact Monitoring requires an assumption that the user that owns a label and
all users that look up the label do the necessary monitoring afterwards.</t>
          </li>
        </ul>
        <t>In short, assuming that the underlying cryptographic primitives used are secure,
any deployment-specific assumptions hold (such as non-collusion), and that user
devices don't go permanently offline, then malicious behavior by the
transparency log is always detected within a bounded amount of time. The
parameters that determine the maximum amount of time before malicious behavior
is detected are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The configured maximum amount of time by which a query response can be stale.</t>
          </li>
          <li>
            <t>The configured Reasonable Monitoring Window (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 anonymous communication with the transparency log, or peer-to-peer
communication with other users.</t>
          </li>
          <li>
            <t>For logs that use the Third-Party Auditing deployment mode: the configured
maximum acceptable lag for an auditor.</t>
          </li>
          <li>
            <t>For logs that use the Third-Party Management deployment mode: the amount of
lag, or potential inefficacy, of the service operator's approach to detecting
forks.</t>
          </li>
        </ul>
      </section>
      <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 gossipped. 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 <bcp14>MUST</bcp14> ensure that the relevant protocol
parameters are set in a way that appropriately mitigates this risk.
For example, in a Contact Monitoring deployment, the Reasonable Monitoring
Window and the duration between out-of-band communication attempts <bcp14>SHOULD</bcp14> be
much less than the typical time between state loss events. Similarly, in a
Third-Party Auditing deployment, the maximum acceptable lag for an auditor
<bcp14>SHOULD</bcp14> be much less than the typical time between state loss events. This
minimizes the likelihood that a state loss event could be useful to a
misbehaving transparency log.</t>
        <t>In applications where client state is typically ephemeral (like a web page), or
where state loss could possibly be triggered adversarially (for example, by the
service operator forcing a user to log out and re-register), a Third-Party
Management deployment mode is <bcp14>RECOMMENDED</bcp14>. Alternatively, applications could
also consider implementing a policy of not consuming label-version pairs that
were inserted too recently. Once a label-version pair is outside of the
Reasonable Monitoring Window in a Contact Monitoring deployment, or beyond the
maximum acceptable auditor lag in a Third-Party Auditing deployment, the risks
associated with state loss are often already sufficiently mitigated.</t>
      </section>
    </section>
    <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
wish 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 users to learn whether or not a label exists in the
transparency log if the user obtains a valid search proof for that label.
Similarly, KT only allows users to learn about the value of a label if
the user obtains a valid search proof for that exact version of the label.</t>
        <t>When 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 auditor or manager is used, there's additional
information leaked to the third-party that's not visible to outsiders.</t>
        <t>In the case of a third-party auditor, the auditor is able to learn the total
number of distinct changes to the log. It is also able to learn the order and
approximate timing with which each change was made. However, auditors are not
able to learn the plaintext of any labels or values. This is because labels
are masked with a VRF, and values are only provided to auditors as commitments.
They are also not able to distinguish between whether a change represents a label
being created for the first time or being updated, or whether a change
represents a "real" change from an end-user or a "fake" padding change.</t>
        <t>In the case of a third-party manager, the manager generally learns everything
that the service operator would know. This includes the total set of plaintext
labels and values and their modification history. It also includes traffic
patterns, such as how often a specific label is looked up.</t>
      </section>
      <section 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 can not be removed. The
important caveat here is that user data is not directly stored in the
append-only log. Instead, it primarily contains privacy-preserving VRF outputs
and cryptographic commitments.</t>
        <t>The value corresponding to a label is typically some serialized user account
data, like a public key or internal identifier. KT uses cryptographic
commitments to ensure that users interacting with a transparency log are unable
to learn anything about a label's value until the transparency log explicitly
provides the commitment's opening. A transparency log responding to an erasure
request can delete the commitment opening and the associated data. This can be
done immediately and permanently prevents recovery of the associated value.</t>
        <t>Labels themselves are typically serialized end-user identifiers, like a username
or email address. All labels are processed through a 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. After this point,
they are no longer necessary for the protocol to operate.</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 UUID as their label. While the UUID might be unique, it is not
necessarily user-visible. When a user attempts to lookup a contact by username,
the service operator translates the username into a user UUID under the hood. If
this mapping (from username to UUID) is unauthenticated, the service operator
could manipulate it to eavesdrop on conversations by returning the UUID for an
account that it controls. From a security perspective, this would be equivalent
to not using KT at all.</t>
      <t>However, that's not to say that the use of internal UUIDs in KT is never
appropriate. Many applications don't have a concept of a fixed explicit
identifier, like a username, and instead rely on their UI (underpinned
internally by a user's ID) to indicate to users whether a conversation is with a
new person or someone they've previously contacted. The fact that the UI behaves
this way makes the user's ID a user-visible identifier even if a user may not be
able to actually see it written out. An example of this kind of application
would be Slack.</t>
      <t>A <strong>primary end-user identity</strong> is one that is unique, user-visible, and unable
to change. (Or equivalently, if it changes, it appears in the application UI as
a new conversation with a new user.) An example of this type of identifier would
be an email address on an email service. A primary end-user identity <bcp14>SHOULD</bcp14>
always be a label in KT, with the end-user's public keys and other account
information as the associated value.</t>
      <t>A <strong>secondary end-user identity</strong> is one that is unique, user-visible, and able
to change without being interpreted as a different account due to its
association with a primary end-user identity. These identities are used solely
for initial user discovery, during which they're converted into a primary
end-user identity (like a UUID) that's used by the application to identify the
end-user from then on. An example of this type of identity would be a username,
since users can often change their username without disrupting existing
communications. A secondary end-user identity <bcp14>SHOULD</bcp14> be a label in KT with the
primary end-user identity as the associated value, such that it can be used to
authenticate the user discovery process.</t>
      <t>While likely helpful to most common applications, the distinction between
handling primary and secondary end-user identities is not a guaranteed rule.
Applications must be careful to ensure they fully capture the semantics of
identity in their application with the labels and values they store in KT.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="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>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1963Icx5Xm/3yKGvgHAUSjZckej83xyAORlM2QKGpIyJ6J
jY1wdVc1UMPqqp7KaoBtmn6WfZZ9sj3fuWRmXRqALuHdiVjFxFhCV2Xl5eS5
fueci4sL11d9XT7NTr4qD9lVlzd+l3dlsz5kl936purLdb/vyhO3zvvyuu0O
T7Oq2bTOFe26ybf0YtHlm/6iKvvNxbvy0GOEizx59eLTnzu/X20r76u26Q87
eufli6svXbPfrsruqSto5Kdu3Ta+bPzeP836bl+626fZLxzNJKepvS3X+67q
Dyfuru3eXXftfjcz4RNH36cHiqcuu8jo37M++dXdls2evpNlx9/PMpneyZ/o
M1Vznf0ej+Lv27yq6e+2wH/Fcpdtd43fsFj67abvd/7pJ5/gUV7/bbm0xz7B
Hz5Zde2dLz+xQT7By9dVf7Nf0eu8gXfXYQ8/kX3Fi3iupk3yffKZ8fNLGWlZ
tcmbnzx0OMubflufOJfv+5u2w8bRt7Jss69rOd0vaGuKvMlerV9VdU0HyL+X
sh8r+XG73spv/3qNvy/X7da5pu22eU+b8NQ5UEz4ryzzZV6XxQUdd4Hzx4B9
3l2XtDxbna+um7zmrVvV7fUng1c+kVeUbq/K9U3T0kOHbNeVt1V59zR7y49n
8nhGH8/e8oAn/CYTXPbZzz/9NdHmxWe/cc5dXFxk+crTBq17565uKp8Rge+3
ZdNnRbmpmtJn/U2Z9WW3rfRreVPQXaC/0Du0+GyX9/Qfjac/3rb1bYlf8ZIr
yl3dHnisdpNN7hk9lWfXZUMD1TRlIvVSaDTblt7n10SI2MEup+nt+dQW/G2/
K9fVptKZeb0jtAntrux6+Xve84/0t75dt7Wjf7mtitIvs5d9lte+JQK8pSe3
LT4qc1hkTdtc0F76dVftcGjZ9b6ic16XGS3zpr3L+tbJRGvaht2O/v9kVX1L
q5IrjlUTTWzpZTxcESuh/fJL2fZtVRR16dzPspdN37XFnnfTuS/KDSaVN4cs
0A+NsCZiXJVZ+X59kzfXssn0Jzrpi769oP+hf113h12P8z/4vtwusv6udf0N
7SMtdO/77IamUTZPsy+rzvcLOjjarnW1y5ve65npq/K4bppuc3dbrUuHPc57
Iqw7unY8yd1+RUsD3+EDOdAv/gbbsPcl/qcr1yX2Ug4VR0BsrW2KBdOIjpuF
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
Lr+5nKBgrlLTQXvRy5P5WmM0/wes0LNsUdgAAA==

-->

</rfc>
