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

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>Before any information can be exchanged in an end-to-end encrypted system, two
things must happen: First, participants in the system must provide the service
operator with any public keys they wish to use to receive messages. Second, the
service operator must somehow distribute these public keys amongst the
participants that wish to communicate with each other.</t>
      <t>Typically this is done by having users upload their public keys to a simple
directory where other users can download them as necessary, or by providing
public keys in-band with the communication being secured. If the service
operator is simply trusted to correctly forward public keys between users, this
means that the underlying encryption protocol can only protect users against
passive eavesdropping on their messages.</t>
      <t>However, most messaging systems are designed such that all messages are
exchanged through the service operator's servers, which makes it extremely easy
for an operator to launch an active attack. That is, the service operator can
take public keys for which it knows the corresponding private keys, and
associate those public keys with a user's account without the user's knowledge
to impersonate or eavesdrop on conversations with that user.</t>
      <t>Key Transparency (KT) solves this problem by requiring the service operator to
store user public keys in a cryptographically protected append-only log. Any
malicious entries added to such a log will generally be equally visible to both
the affected user and the user's contacts. This allows users to detect whether
they are being impersonated by viewing the public keys attached to their
account. If the service operator attempts to conceal some entries of the log
from some users but not others, this creates a "forked view" which is permanent
and easily detectable.</t>
      <t>The critical improvement of KT over related protocols like Certificate
Transparency <xref target="RFC6962"/> is that KT includes an efficient
protocol to search the log for entries related to a specific participant. This
means users don't need to download the entire log, which may be substantial, to
find all entries that are relevant to them. It also means that KT can better
preserve user privacy by only showing entries of the log to participants that
genuinely need to see them.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<dl>
        <dt><strong>End-to-End Encrypted Communication Service:</strong></dt>
        <dd>
          <t>A communication service that allows end-users to engage in text, voice,
video, or other forms of communication over the internet, and uses public key
cryptography to ensure that communications are only accessible to their
intended recipients.</t>
        </dd>
        <dt><strong>End-User Device:</strong></dt>
        <dd>
          <t>The device at the final point in a digital communication, which may either
send or receive encrypted data in an end-to-end encrypted communication
service.</t>
        </dd>
        <dt><strong>End-User Identity:</strong></dt>
        <dd>
          <t>A unique and user-visible identity associated with an account (and therefore
one or more end-user devices) in an end-to-end encrypted communication
service. In the case where an end-user explicitly requests to communicate with
(or is informed they are communicating with) an end-user uniquely identified
by the name "Alice", the end-user identity is the string "Alice".</t>
        </dd>
        <dt><strong>User / Account:</strong></dt>
        <dd>
          <t>A single end-user of an end-to-end encrypted communication service, which may
be represented by several end-user identities and end-user devices. For
example, a user may be represented simultaneously by multiple identities
(email, phone number, username) and interact with the service on multiple
devices (phone, laptop).</t>
        </dd>
        <dt><strong>Service Operator:</strong></dt>
        <dd>
          <t>The primary organization that provides the infrastructure for an end-to-end
encrypted communication service and the software to participate in it.</t>
        </dd>
        <dt><strong>Transparency Log:</strong></dt>
        <dd>
          <t>A specialized service capable of securely attesting to the information (such
as public keys) associated with a given end-user identity. A transparency
log is usually run either entirely or partially by the service operator, but
could also be operated externally.</t>
        </dd>
      </dl>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>From a networking perspective, KT follows a client-server architecture with a
central <em>transparency log</em>, acting as a server, which holds the authoritative
copy of all information and exposes endpoints that allow users to query or
modify stored data. Users coordinate with each other through the server by
uploading their own public keys and downloading the public keys of other
users. Users are expected to maintain relatively little state, limited only
to what is required to interact with the log and ensure that it is behaving
honestly.</t>
      <t>From an application perspective, KT can be thought of as a versioned key-value
database. Users insert key-value pairs into the database where, for example, the
key is their username and the value is their public key. Users can update a key
by inserting a new version with new data. They can also look up the most recent
version of a key or any previous version. From this point forward, the term
<strong>label</strong> will be used to refer to lookup keys in the key-value database that a
transparency log represents to avoid confusion with cryptographic public or
private keys.</t>
      <t>Users are considered to <strong>own</strong> a label if they are understood to either
initiate all changes to the label's value, or if they must be informed of all
changes to the label's value. The latter situation may occur if, for example, KT
is deployed in a way where the service operator makes automated modifications to
stored data. The owning user would then be informed, after the fact, of
modifications to verify that they were legal.</t>
      <t>KT does not require the use of a specific transport protocol. This is intended
to allow applications to layer KT on top of whatever transport protocol their
application already uses. In particular, this allows applications to continue
relying on their existing access control system.</t>
      <t>With some small exceptions, applications may enforce arbitrary access control
rules on top of KT. This may include requiring a user to be logged in to make KT
requests, only allowing a user to lookup the labels of another user if they're
"friends", or applying a rate limit. Applications <bcp14>SHOULD</bcp14> 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 an inclusion proof.</t>
          </li>
          <li>
            <t><strong>Update:</strong> Adds a new label-value pair to the log, for which the server
returns an inclusion proof. Note that this means that new values are added to
the log immediately and no provisional inclusion proof, such as an SCT as
defined in <xref section="3" sectionFormat="of" target="RFC6962"/>, is provided.</t>
          </li>
          <li>
            <t><strong>Monitor:</strong> While Search and Update are run by the user as necessary,
monitoring is done in the background on a recurring basis. It can both check
that the log is continuing to behave honestly (all previously returned labels
remain in the tree) and that no changes have been made to labels owned by the
user without the user's knowledge.</t>
          </li>
        </ol>
        <t>These operations are executed over an application-provided transport layer.
The transport layer enforces access control by blocking queries which are
not allowed:</t>
        <figure anchor="request-response">
          <name>Example request and response flow. Valid requests receive a response while invalid requests are blocked by the transport layer.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="456" viewBox="0 0 456 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 24,48 L 24,320" fill="none" stroke="black"/>
                <path d="M 384,48 L 384,320" fill="none" stroke="black"/>
                <path d="M 152,96 L 376,96" fill="none" stroke="black"/>
                <path d="M 32,112 L 208,112" fill="none" stroke="black"/>
                <path d="M 136,144 L 376,144" fill="none" stroke="black"/>
                <path d="M 32,160 L 208,160" fill="none" stroke="black"/>
                <path d="M 192,192 L 376,192" fill="none" stroke="black"/>
                <path d="M 32,208 L 208,208" fill="none" stroke="black"/>
                <path d="M 144,288 L 320,288" fill="none" stroke="black"/>
                <path d="M 176,304 L 320,304" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,192 372,186.4 372,197.6" fill="black" transform="rotate(0,376,192)"/>
                <polygon class="arrowhead" points="384,144 372,138.4 372,149.6" fill="black" transform="rotate(0,376,144)"/>
                <polygon class="arrowhead" points="384,96 372,90.4 372,101.6" fill="black" transform="rotate(0,376,96)"/>
                <polygon class="arrowhead" points="328,304 316,298.4 316,309.6" fill="black" transform="rotate(0,320,304)"/>
                <polygon class="arrowhead" points="328,288 316,282.4 316,293.6" fill="black" transform="rotate(0,320,288)"/>
                <polygon class="arrowhead" points="40,208 28,202.4 28,213.6" fill="black" transform="rotate(180,32,208)"/>
                <polygon class="arrowhead" points="40,160 28,154.4 28,165.6" fill="black" transform="rotate(180,32,160)"/>
                <polygon class="arrowhead" points="40,112 28,106.4 28,117.6" fill="black" transform="rotate(180,32,112)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="372" y="36">Transparency</text>
                  <text x="440" y="36">Log</text>
                  <text x="116" y="68">(Valid</text>
                  <text x="152" y="68">/</text>
                  <text x="196" y="68">Accepted</text>
                  <text x="272" y="68">Requests)</text>
                  <text x="88" y="100">Search(Alice)</text>
                  <text x="296" y="116">SearchResponse(...)</text>
                  <text x="80" y="148">Search(Bob)</text>
                  <text x="296" y="164">SearchResponse(...)</text>
                  <text x="88" y="196">Update(Alice,</text>
                  <text x="164" y="196">...)</text>
                  <text x="296" y="212">UpdateResponse(...)</text>
                  <text x="120" y="260">(Rejected</text>
                  <text x="168" y="260">/</text>
                  <text x="208" y="260">Blocked</text>
                  <text x="280" y="260">Requests)</text>
                  <text x="84" y="292">Search(Fred)</text>
                  <text x="336" y="292">X</text>
                  <text x="80" y="308">Update(Bob,</text>
                  <text x="148" y="308">...)</text>
                  <text x="336" y="308">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                                   Transparency Log
  |                                            |
  |        (Valid / Accepted Requests)         |
  |                                            |
  | Search(Alice) ---------------------------->|
  |<---------------------- SearchResponse(...) |
  |                                            |
  | Search(Bob) ------------------------------>|
  |<---------------------- SearchResponse(...) |
  |                                            |
  | Update(Alice, ...) ----------------------->|
  |<---------------------- UpdateResponse(...) |
  |                                            |
  |                                            |
  |       (Rejected / Blocked Requests)        |
  |                                            |
  | Search(Fred) ----------------------> X     |
  | Update(Bob, ...) ------------------> X     |
  |                                            |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="credentials">
        <name>Credentials</name>
        <t>While users are generally understood to interact directly with the transparency
log, many end-to-end encrypted communication services require the ability to
provide <em>credentials</em> to their users. Credentials convey a binding between an
end-user identity and public keys or other information, and can be verified with
minimal network access.</t>
        <t>In particular, credentials that can be verified with minimal network access are
often desired by applications that support anonymous communication. These
applications provide end-to-end encryption with a protocol like the Messaging
Layer Security Protocol <xref target="RFC9420"/> (with the encryption of handshake messages
required) or Sealed Sender <xref target="sealed-sender"/>. When a user sends a message, these
protocols have the sender provide their own credential in an encrypted portion
of the message.</t>
        <t>Encrypting the sender's credential allows the sender to submit messages over an
anonymous channel by specifying only the recipient's identity. The service
operator can deliver the message to the intended recipient, who can decrypt it
and validate the credential inside to be assured of the sender's identity. Note
that the recipient does not need access to an anonymous channel to preserve the
sender's anonymity.</t>
        <t>At a high level, KT credentials are created by serializing one or more Search
request-response pairs. These Search operations correspond to the lookups the
recipient would do to authenticate the relationship between the presented
end-user identity and their public keys. Recipients can verify the
request-response pairs themselves without contacting the transparency log.</t>
        <t>Any future monitoring that may be required should be provided to recipients
proactively by the sender. However, if this fails, 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="224" width="504" viewBox="0 0 504 224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,208" fill="none" stroke="black"/>
                <path d="M 272,48 L 272,208" fill="none" stroke="black"/>
                <path d="M 496,48 L 496,208" fill="none" stroke="black"/>
                <path d="M 16,64 L 144,64" fill="none" stroke="black"/>
                <path d="M 184,80 L 264,80" fill="none" stroke="black"/>
                <path d="M 408,128 L 488,128" fill="none" stroke="black"/>
                <path d="M 16,160 L 136,160" fill="none" stroke="black"/>
                <path d="M 192,176 L 264,176" fill="none" stroke="black"/>
                <path d="M 456,192 L 488,192" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="496,192 484,186.4 484,197.6" fill="black" transform="rotate(0,488,192)"/>
                <polygon class="arrowhead" points="496,128 484,122.4 484,133.6" fill="black" transform="rotate(0,488,128)"/>
                <polygon class="arrowhead" points="272,176 260,170.4 260,181.6" fill="black" transform="rotate(0,264,176)"/>
                <polygon class="arrowhead" points="272,80 260,74.4 260,85.6" fill="black" transform="rotate(0,264,80)"/>
                <polygon class="arrowhead" points="24,160 12,154.4 12,165.6" fill="black" transform="rotate(180,16,160)"/>
                <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="412" y="84">Group,</text>
                  <text x="372" y="100">SearchResponse</text>
                  <text x="444" y="100">||</text>
                  <text x="344" y="116">Message</text>
                  <text x="404" y="116">||</text>
                  <text x="356" y="132">Signature)</text>
                  <text x="204" y="164">Monitor(Alice)</text>
                  <text x="100" y="180">MonitorResponse(...)</text>
                  <text x="332" y="180">Encrypt(Anon</text>
                  <text x="412" y="180">Group,</text>
                  <text x="380" y="196">MonitorResponse)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Transparency Log               Alice           Anonymous Group
|                                |                           |
|<---------------- Search(Alice) |                           |
| SearchResponse(...) ---------->| Encrypt(Anon Group,       |
|                                |     SearchResponse ||     |
|                                |     Message   ||          |
|                                |     Signature) ---------->|
|                                |                           |
|<--------------- Monitor(Alice) |                           |
| MonitorResponse(...) --------->| Encrypt(Anon Group,       |
|                                |     MonitorResponse) ---->|
|                                |                           |
]]></artwork>
          </artset>
        </figure>
      </section>
      <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 and produces
a signature on the most recent tree head. The transparency log provides this
signature to users in-line with their query responses as proof that they are not
being shown a fork. This approach relies on an assumption that the third party
is trusted not to collude with the transparency log to sign a fork.</t>
        <t>With anonymous communication, a single user accesses the transparency log over
an anonymous channel and checks that the transparency log is presenting the same
tree head over the anonymous channel as it does over an authenticated channel.
The security of this approach relies on the fact that, if the transparency log
doesn't know which user is making the request, it will show the user the wrong
fork with high probability. Repeating this check over time makes it
overwhelmingly likely that any fork presented to any user will be detected.</t>
        <t>With peer-to-peer communication, two users gossip with each other to establish
that they both have the same view of the transparency log. This gossip is able
to happen over any supported out-of-band channel even if it is heavily
bandwidth-constrained, such as scanning a QR code. However, this approach is
only secure if gossip can be implemented such that gossipping users are
reasonably expected to form a connected graph of all users. If not, then the
transparency log can attempt to partition users into subsets that do not gossip
and can present each subset of users with different forks.</t>
        <t>Regardless of approach, in the event that a fork is successfully detected, the
user is able to produce non-repudiable proof of log misbehavior which can be
published.</t>
        <figure anchor="out-of-band-checking">
          <name>Users receive tree heads while making authenticated requests to a transparency log. Users ensure consistency of tree heads by either comparing amongst themselves, or by contacting the transparency log over an anonymous channel. Requests that require authentication do not need to be available over the anonymous channel.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="304" width="584" viewBox="0 0 584 304" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,288" fill="none" stroke="black"/>
                <path d="M 232,48 L 232,288" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,288" fill="none" stroke="black"/>
                <path d="M 344,96 L 568,96" fill="none" stroke="black"/>
                <path d="M 240,112 L 328,112" fill="none" stroke="black"/>
                <path d="M 16,224 L 72,224" fill="none" stroke="black"/>
                <path d="M 392,224 Q 394,220.8 396,224 Q 398,227.2 400,224 Q 402,220.8 404,224 Q 406,227.2 408,224 Q 410,220.8 412,224 Q 414,227.2 416,224 Q 418,220.8 420,224 Q 422,227.2 424,224 Q 426,220.8 428,224 Q 430,227.2 432,224 Q 434,220.8 436,224 Q 438,227.2 440,224 Q 442,220.8 444,224 Q 446,227.2 448,224 Q 450,220.8 452,224 Q 454,227.2 456,224 Q 458,220.8 460,224 Q 462,227.2 464,224 Q 466,220.8 468,224 Q 470,227.2 472,224 Q 474,220.8 476,224 Q 478,227.2 480,224 Q 482,220.8 484,224 Q 486,227.2 488,224 Q 490,220.8 492,224 Q 494,227.2 496,224 Q 498,220.8 500,224 Q 502,227.2 504,224 Q 506,220.8 508,224 Q 510,227.2 512,224 Q 514,220.8 516,224 Q 518,227.2 520,224 Q 522,220.8 524,224 Q 526,227.2 528,224 Q 530,220.8 532,224 Q 534,227.2 536,224 Q 538,220.8 540,224 Q 542,227.2 544,224 Q 546,220.8 548,224 Q 550,227.2 552,224 Q 554,220.8 556,224 Q 558,227.2 560,224 " fill="none" stroke="black"/>
                <path d="M 88,240 L 224,240" fill="none" stroke="black"/>
                <path d="M 248,240 Q 250,236.8 252,240 Q 254,243.2 256,240 Q 258,236.8 260,240 Q 262,243.2 264,240 Q 266,236.8 268,240 Q 270,243.2 272,240 Q 274,236.8 276,240 Q 278,243.2 280,240 Q 282,236.8 284,240 Q 286,243.2 288,240 Q 290,236.8 292,240 Q 294,243.2 296,240 Q 298,236.8 300,240 Q 302,243.2 304,240 Q 306,236.8 308,240 Q 310,243.2 312,240 Q 314,236.8 316,240 Q 318,243.2 320,240 Q 322,236.8 324,240 Q 326,243.2 328,240 Q 330,236.8 332,240 Q 334,243.2 336,240 Q 338,236.8 340,240 Q 342,243.2 344,240 Q 346,236.8 348,240 Q 350,243.2 352,240 Q 354,236.8 356,240 Q 358,243.2 360,240 Q 362,236.8 364,240 Q 366,243.2 368,240 Q 370,236.8 372,240 Q 374,243.2 376,240 Q 378,236.8 380,240 Q 382,243.2 384,240 Q 386,236.8 388,240 Q 390,243.2 392,240 Q 394,236.8 396,240 Q 398,243.2 400,240 Q 402,236.8 404,240 Q 406,243.2 408,240 Q 410,236.8 412,240 Q 414,243.2 416,240 Q 418,236.8 420,240 Q 422,243.2 424,240 Q 426,236.8 428,240 Q 430,243.2 432,240 Q 434,236.8 436,240 Q 438,243.2 440,240 Q 442,236.8 444,240 Q 446,243.2 448,240 Q 450,236.8 452,240 Q 454,243.2 456,240 Q 458,236.8 460,240 Q 462,243.2 464,240 Q 466,236.8 468,240 Q 470,243.2 472,240 Q 474,236.8 476,240 Q 478,243.2 480,240 Q 482,236.8 484,240 Q 486,243.2 488,240 Q 490,236.8 492,240 Q 494,243.2 496,240 " fill="none" stroke="black"/>
                <path d="M 344,272 Q 346,268.8 348,272 Q 350,275.2 352,272 Q 354,268.8 356,272 Q 358,275.2 360,272 Q 362,268.8 364,272 Q 366,275.2 368,272 Q 370,268.8 372,272 Q 374,275.2 376,272 Q 378,268.8 380,272 Q 382,275.2 384,272 Q 386,268.8 388,272 Q 390,275.2 392,272 Q 394,268.8 396,272 Q 398,275.2 400,272 Q 402,268.8 404,272 Q 406,275.2 408,272 Q 410,268.8 412,272 Q 414,275.2 416,272 Q 418,268.8 420,272 Q 422,275.2 424,272 Q 426,268.8 428,272 Q 430,275.2 432,272 Q 434,268.8 436,272 Q 438,275.2 440,272 Q 442,268.8 444,272 Q 446,275.2 448,272 Q 450,268.8 452,272 Q 454,275.2 456,272 Q 458,268.8 460,272 Q 462,275.2 464,272 Q 466,268.8 468,272 Q 470,275.2 472,272 Q 474,268.8 476,272 Q 478,275.2 480,272 Q 482,268.8 484,272 Q 486,275.2 488,272 Q 490,268.8 492,272 Q 494,275.2 496,272 " fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,96 564,90.4 564,101.6" fill="black" transform="rotate(0,568,96)"/>
                <polygon class="arrowhead" points="568,224 556,218.4 556,229.6" fill="black" transform="rotate(0,560,224)"/>
                <polygon class="arrowhead" points="504,272 492,266.4 492,277.6" fill="black" transform="rotate(0,496,272)"/>
                <polygon class="arrowhead" points="256,240 244,234.4 244,245.6" fill="black" transform="rotate(180,248,240)"/>
                <polygon class="arrowhead" points="248,112 236,106.4 236,117.6" fill="black" transform="rotate(180,240,112)"/>
                <polygon class="arrowhead" points="232,240 220,234.4 220,245.6" fill="black" transform="rotate(0,224,240)"/>
                <polygon class="arrowhead" points="24,224 12,218.4 12,229.6" fill="black" transform="rotate(180,16,224)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="232" y="36">Bob</text>
                  <text x="500" y="36">Transparency</text>
                  <text x="568" y="36">Log</text>
                  <text x="272" y="68">(Normal</text>
                  <text x="324" y="68">reqs</text>
                  <text x="364" y="68">over</text>
                  <text x="440" y="68">authenticated</text>
                  <text x="532" y="68">channel)</text>
                  <text x="288" y="100">Search(Bob)</text>
                  <text x="396" y="116">Response{Head:</text>
                  <text x="492" y="116">6c063bb,</text>
                  <text x="548" y="116">...}</text>
                  <text x="52" y="196">(OOB</text>
                  <text x="96" y="196">check</text>
                  <text x="140" y="196">with</text>
                  <text x="184" y="196">peer)</text>
                  <text x="284" y="196">(OOB</text>
                  <text x="328" y="196">check</text>
                  <text x="372" y="196">over</text>
                  <text x="432" y="196">anonymous</text>
                  <text x="508" y="196">channel)</text>
                  <text x="152" y="228">DistinguishedHead</text>
                  <text x="312" y="228">DistinguishedHead</text>
                  <text x="48" y="244">6c063bb</text>
                  <text x="536" y="244">6c063bb</text>
                  <text x="288" y="276">Search(Bob)</text>
                  <text x="512" y="276">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                      Bob                          Transparency Log
|                           |                                          |
|                           | (Normal reqs over authenticated channel) |
|                           |                                          |
|                           | Search(Bob) ---------------------------->|
|                           |<----------- Response{Head: 6c063bb, ...} |
|                           |                                          |
|                           |                                          |
|                           |                                          |
|                           |                                          |
|   (OOB check with peer)   |    (OOB check over anonymous channel)    |
|                           |                                          |
|<------- DistinguishedHead | DistinguishedHead ~~~~~~~~~~~~~~~~~~~~~> |
| 6c063bb ----------------->| <~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6c063bb |
|                           |                                          |
|                           | Search(Bob) ~~~~~~~~~~~~~~~~~~~> X       |
|                           |                                          |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="deployment-modes">
      <name>Deployment Modes</name>
      <t>In the interest of satisfying the widest range of use-cases possible, three
different modes for deploying a transparency log are supported. Each mode has
slightly different requirements and efficiency considerations for both the
transparency log and the end-user.</t>
      <t><strong>Third-Party Management</strong> and <strong>Third-Party Auditing</strong> are two deployment modes
that require the transparency log to delegate part of its operation
to a third party. Users are able to run more efficiently as
long as they can assume that the transparency log and the third party won't
collude to trick them into accepting malicious results.</t>
      <t>With both third-party modes, all requests from end-users are initially routed to
the transparency log and the log coordinates with the third party
itself. End-users never contact the third party directly, although they will
need a signature public key from the third party to verify its assertions.</t>
      <t>With Third-Party Management, the third party performs the majority of the work
of actually storing and operating the service, and the transparency log only
signs new entries as they're added. With Third-Party Auditing, the transparency
log performs the majority of the work of storing and operating the service, only
obtaining signatures from a third-party auditor at regular intervals
asserting that the tree has been constructed correctly.</t>
      <t><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> (as defined in <xref target="PROTO"/>). If a user
looks up many label-version pairs that were inserted very recently, monitoring
may become relatively expensive.</t>
      <t>Additionally, applications that rely on a transparency log deployed in Contact
Monitoring mode <bcp14>MUST</bcp14> regularly attempt to detect forks through anonymous
communication with the transparency log or peer-to-peer communication, as
described in <xref target="detecting-forks"/>.</t>
      <t>Applications that rely on a transparency log deployed in either of the
third-party modes <bcp14>SHOULD</bcp14> allow users to enable a "Contact Monitoring Mode". This
mode, which affects only the individual client's behavior, would cause the
client to behave as if its transparency log was deployed in Contact Monitoring
mode. As such, it would start retaining state about previously looked-up labels
and regularly engaging in out-of-band communication. Enabling this
higher-security mode allows users to double-check that the third party is not
colluding with the transparency log.</t>
      <section anchor="contact-monitoring">
        <name>Contact Monitoring</name>
        <t>With the Contact Monitoring deployment mode, the monitoring burden is split
between both the owner of a label and those that look up the label. Stated as
simply as possible, the monitoring obligations of each party are:</t>
        <ol spacing="normal" type="1"><li>
            <t>On a regular basis, the label owner verifies that the most recent version of
their label has not changed unexpectedly.</t>
          </li>
          <li>
            <t>When a user that looked up a label sees that it was inserted very recently,
they check back later to see that the label-version pair they observed was
not removed before it could be detected by the label owner.</t>
          </li>
        </ol>
        <t>This guarantees that if a malicious value for a label is added to the log, then
either it is detected by the label owner, or if it is removed/obscured from the
log before the label owner can detect it, then any users that observed it will
detect its removal.</t>
        <figure anchor="contact-monitoring-fig">
          <name>Contact Monitoring. Alice searches for Bob's label. One day later, Alice verifies the label-version pair she observed remained in transparency log. Another day later, Bob comes online and monitors his own label. Note that Alice does not need to wait on Bob to make his Monitor request before making hers.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="584" viewBox="0 0 584 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,256" fill="none" stroke="black"/>
                <path d="M 296,48 L 296,256" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,256" fill="none" stroke="black"/>
                <path d="M 120,64 L 288,64" fill="none" stroke="black"/>
                <path d="M 16,80 L 120,80" fill="none" stroke="black"/>
                <path d="M 128,144 L 288,144" fill="none" stroke="black"/>
                <path d="M 16,160 L 112,160" fill="none" stroke="black"/>
                <path d="M 304,224 L 456,224" fill="none" stroke="black"/>
                <path d="M 480,240 L 568,240" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,240 564,234.4 564,245.6" fill="black" transform="rotate(0,568,240)"/>
                <polygon class="arrowhead" points="312,224 300,218.4 300,229.6" fill="black" transform="rotate(180,304,224)"/>
                <polygon class="arrowhead" points="296,144 284,138.4 284,149.6" fill="black" transform="rotate(0,288,144)"/>
                <polygon class="arrowhead" points="296,64 284,58.4 284,69.6" fill="black" transform="rotate(0,288,64)"/>
                <polygon class="arrowhead" points="24,160 12,154.4 12,165.6" fill="black" transform="rotate(180,16,160)"/>
                <polygon class="arrowhead" points="24,80 12,74.4 12,85.6" fill="black" transform="rotate(180,16,80)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="284" y="36">Transparency</text>
                  <text x="352" y="36">Log</text>
                  <text x="568" y="36">Bob</text>
                  <text x="64" y="68">Search(Bob)</text>
                  <text x="208" y="84">SearchResponse(...)</text>
                  <text x="108" y="116">(1</text>
                  <text x="136" y="116">day</text>
                  <text x="180" y="116">later)</text>
                  <text x="68" y="148">Monitor(Bob)</text>
                  <text x="204" y="164">MonitorResponse(...)</text>
                  <text x="108" y="196">(1</text>
                  <text x="136" y="196">day</text>
                  <text x="180" y="196">later)</text>
                  <text x="516" y="228">Monitor(Bob)</text>
                  <text x="388" y="244">MonitorResponse(...)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                        Transparency Log                        Bob
|                                   |                                  |
| Search(Bob) --------------------->|                                  |
|<------------- SearchResponse(...) |                                  |
|                                   |                                  |
|           (1 day later)           |                                  |
|                                   |                                  |
| Monitor(Bob) -------------------->|                                  |
|<------------ MonitorResponse(...) |                                  |
|                                   |                                  |
|           (1 day later)           |                                  |
|                                   |                                  |
|                                   |<------------------- Monitor(Bob) |
|                                   | MonitorResponse(...) ----------->|
|                                   |                                  |
]]></artwork>
          </artset>
        </figure>
        <t>Importantly, Contact Monitoring impacts how the server is able to enforce access
control on Monitor queries. While Search and Update queries can enforce access
control on a "point in time" basis, where a user is allowed to execute the query
at one point in time but maybe not the next, Monitor queries must have
"accretive" access control. This is because, if a user is allowed to execute a
Search or Update query for a label, the user may then need to issue at least one
Monitor query for the label some time in the future. These Monitor queries must
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 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>The third-party auditor is expected to run asynchronously, downloading and
authenticating a log's contents in the background, so as not to become a
bottleneck for the transparency log. As a result, signatures from the auditor
may lag behind the view presented by the transparency log. The maximum amount of
time that the auditor may lag behind the transparency log without its signature
being rejected by users is set in the transparency log's configuration.</t>
        <figure anchor="auditing-fig">
          <name>Third-Party Auditing. A recent signature from the auditor is provided to users. The auditor is updated on changes to the tree in the background.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="584" viewBox="0 0 584 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,192" fill="none" stroke="black"/>
                <path d="M 336,48 L 336,192" fill="none" stroke="black"/>
                <path d="M 576,48 L 576,192" fill="none" stroke="black"/>
                <path d="M 176,64 L 328,64" fill="none" stroke="black"/>
                <path d="M 160,80 L 328,80" fill="none" stroke="black"/>
                <path d="M 176,96 L 328,96" fill="none" stroke="black"/>
                <path d="M 24,110 L 64,110" fill="none" stroke="black"/>
                <path d="M 24,114 L 64,114" fill="none" stroke="black"/>
                <path d="M 480,160 L 568,160" fill="none" stroke="black"/>
                <path d="M 344,176 L 432,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,160 564,154.4 564,165.6" fill="black" transform="rotate(0,568,160)"/>
                <polygon class="arrowhead" points="352,176 340,170.4 340,181.6" fill="black" transform="rotate(180,344,176)"/>
                <polygon class="arrowhead" points="336,96 324,90.4 324,101.6" fill="black" transform="rotate(0,328,96)"/>
                <polygon class="arrowhead" points="336,80 324,74.4 324,85.6" fill="black" transform="rotate(0,328,80)"/>
                <polygon class="arrowhead" points="336,64 324,58.4 324,69.6" fill="black" transform="rotate(0,328,64)"/>
                <polygon class="arrowhead" points="32,112 20,106.4 20,117.6" fill="black" transform="rotate(180,24,112)"/>
                <g class="text">
                  <text x="20" y="36">Many</text>
                  <text x="64" y="36">Users</text>
                  <text x="324" y="36">Transparency</text>
                  <text x="392" y="36">Log</text>
                  <text x="552" y="36">Auditor</text>
                  <text x="72" y="68">Update(Alice,</text>
                  <text x="148" y="68">...)</text>
                  <text x="64" y="84">Update(Bob,</text>
                  <text x="132" y="84">...)</text>
                  <text x="72" y="100">Update(Carol,</text>
                  <text x="148" y="100">...)</text>
                  <text x="156" y="116">Response{AuditorSig:</text>
                  <text x="264" y="116">66bf,</text>
                  <text x="308" y="116">...}</text>
                  <text x="408" y="164">[AuditorUpdate]</text>
                  <text x="504" y="180">AuditorTreeHead</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Many Users                        Transparency Log               Auditor
|                                        |                             |
| Update(Alice, ...) ------------------->|                             |
| Update(Bob, ...) --------------------->|                             |
| Update(Carol, ...) ------------------->|                             |
| <===== Response{AuditorSig: 66bf, ...} |                             |
|                                        |                             |
|                                        |                             |
|                                        | [AuditorUpdate] ----------->|
|                                        |<----------- AuditorTreeHead |
|                                        |                             |
]]></artwork>
          </artset>
        </figure>
        <t>Given the long-lived nature of transparency logs and the potentially short-lived
nature of third-party auditing arrangements, KT allows third-party auditors to
start auditing a log at any arbitrary point. This allows a new third-party
auditor to start up without ingesting the transparency log's entire
history. The point at which an auditor started auditing is provided to users in
the transparency log's configuration. When verifying query responses, users
verify that the auditor started auditing at or before the point necessary for
the query to be secure.</t>
      </section>
      <section anchor="third-party-management">
        <name>Third-Party Management</name>
        <t>With the Third-Party Management deployment mode, a third party is responsible
for the majority of the work of storing and operating the log. The transparency
log serves mainly to enforce access control and authenticate the addition of new
entries to the log. All user queries are initially sent by users directly to the
transparency log, and the transparency log proxies them to the third-party
manager if they pass access control.</t>
        <figure anchor="manager-fig">
          <name>Third-Party Management. Valid requests are proxied by the transparency log to the manager. Invalid requests are blocked.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="520" viewBox="0 0 520 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,192" fill="none" stroke="black"/>
                <path d="M 248,48 L 248,192" fill="none" stroke="black"/>
                <path d="M 512,48 L 512,192" fill="none" stroke="black"/>
                <path d="M 136,64 L 240,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 504,64" fill="none" stroke="black"/>
                <path d="M 16,80 L 232,80" fill="none" stroke="black"/>
                <path d="M 256,80 L 336,80" fill="none" stroke="black"/>
                <path d="M 176,112 L 240,112" fill="none" stroke="black"/>
                <path d="M 264,112 L 504,112" fill="none" stroke="black"/>
                <path d="M 16,128 L 232,128" fill="none" stroke="black"/>
                <path d="M 256,128 L 336,128" fill="none" stroke="black"/>
                <path d="M 128,160 L 208,160" fill="none" stroke="black"/>
                <path d="M 160,176 L 208,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="512,112 500,106.4 500,117.6" fill="black" transform="rotate(0,504,112)"/>
                <polygon class="arrowhead" points="512,64 500,58.4 500,69.6" fill="black" transform="rotate(0,504,64)"/>
                <polygon class="arrowhead" points="264,128 252,122.4 252,133.6" fill="black" transform="rotate(180,256,128)"/>
                <polygon class="arrowhead" points="264,80 252,74.4 252,85.6" fill="black" transform="rotate(180,256,80)"/>
                <polygon class="arrowhead" points="248,112 236,106.4 236,117.6" fill="black" transform="rotate(0,240,112)"/>
                <polygon class="arrowhead" points="248,64 236,58.4 236,69.6" fill="black" transform="rotate(0,240,64)"/>
                <polygon class="arrowhead" points="216,176 204,170.4 204,181.6" fill="black" transform="rotate(0,208,176)"/>
                <polygon class="arrowhead" points="216,160 204,154.4 204,165.6" fill="black" transform="rotate(0,208,160)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <polygon class="arrowhead" points="24,80 12,74.4 12,85.6" fill="black" transform="rotate(180,16,80)"/>
                <g class="text">
                  <text x="24" y="36">Alice</text>
                  <text x="236" y="36">Transparency</text>
                  <text x="304" y="36">Log</text>
                  <text x="488" y="36">Manager</text>
                  <text x="72" y="68">Search(Alice)</text>
                  <text x="424" y="84">SearchResponse(...)</text>
                  <text x="72" y="116">Update(Alice,</text>
                  <text x="148" y="116">...)</text>
                  <text x="424" y="132">UpdateResponse(...)</text>
                  <text x="68" y="164">Search(Fred)</text>
                  <text x="224" y="164">X</text>
                  <text x="64" y="180">Update(Bob,</text>
                  <text x="132" y="180">...)</text>
                  <text x="224" y="180">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Alice                  Transparency Log                  Manager
|                             |                                |
| Search(Alice) ------------->| ------------------------------>|
|<--------------------------- |<---------- SearchResponse(...) |
|                             |                                |
| Update(Alice, ...) -------->| ------------------------------>|
|<--------------------------- |<---------- UpdateResponse(...) |
|                             |                                |
| Search(Fred) ----------> X  |                                |
| Update(Bob, ...) ------> X  |                                |
|                             |                                |
]]></artwork>
          </artset>
        </figure>
        <t>The security of the Third-Party Management deployment mode comes from an
assumption that the transparency log and the third-party manager do not collude
to behave maliciously. If the third-party manager behaves honestly, then any
improper modifications to a label's value that were requested by the
transparency log will be properly published such that the label owner will
detect them when monitoring. If the transparency log behaves honestly, the
third-party manager will be unable to add any new unauthorized versions of a
label such that a user will accept them, or remove any authorized version of a
label without the label owner detecting it.</t>
        <t>The transparency log <bcp14>MUST</bcp14> implement some mechanism to detect when forks are
presented by the third-party manager. Additionally, the transparency log <bcp14>MUST</bcp14>
implement some mechanism to prevent the same version of a label from being
submitted to the third-party manager multiple times with different associated
values.</t>
      </section>
    </section>
    <section anchor="combining-logs">
      <name>Combining Logs</name>
      <t>There are many cases where it makes sense to operate multiple cooperating
transparency log instances, for example:</t>
      <ul spacing="normal">
        <li>
          <t>A service provider may wish to gradually migrate to a transparency log that
uses different cryptographic keys, a different cipher suite, or different
deployment mode.</t>
        </li>
        <li>
          <t>A service provider may operate multiple logs to improve their ability to scale
or provide higher availability.</t>
        </li>
        <li>
          <t>A federated system may allow each participant in the federation to operate
their own transparency log for their own users.</t>
        </li>
      </ul>
      <t>Client implementations should generally be prepared to interact with multiple
independent transparency logs. When multiple transparency logs are used as part
of one application, all users <bcp14>MUST</bcp14> have a consistent policy for executing
Search, Update, and Monitor queries against the logs in a way that maintains the
high-level security guarantees of KT:</t>
      <ul spacing="normal">
        <li>
          <t>If all transparency logs behave honestly, then users observe a globally
consistent view of the data associated with each label.</t>
        </li>
        <li>
          <t>If any transparency log behaves dishonestly such that the prior guarantee is
not met, 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 should be 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 should only be executed against the new transparency log,
adding a tombstone entry to the old transparency log if one hasn't been
created already.</t>
          </li>
          <li>
            <t>Both transparency logs should be 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).</t>
          </li>
        </ol>
        <t>Placing a tombstone entry for each label in the old transparency log gives users
a clear indication as to which transparency log contains the most recent version
of a label. Importantly, it prevents users from incorrectly accepting a stale
version of a label if the new transparency log is unreachable.</t>
      </section>
      <section anchor="immediate-migration">
        <name>Immediate Migration</name>
        <t>In some situations, the service provider may instead choose to stop adding new
entries to a transparency log immediately and provide a new transparency log
that is pre-populated with the most recent versions of all labels. In this case,
the policy may look like:</t>
        <ol spacing="normal" type="1"><li>
            <t>Search queries must be executed against the new transparency log.</t>
          </li>
          <li>
            <t>Update queries must be executed against the new transparency log.</t>
          </li>
          <li>
            <t>The final tree size and root hash of the old transparency log is provided to
users over a trustworthy channel. Label owners issue final Monitor queries to
complete monitoring up to this point. Label owners initiate monitoring state
for the new transparency log by processing an Update for the migrated
versions of their labels and verifying that the migration was done correctly.
From then on, users will monitor only the new transparency log.</t>
          </li>
        </ol>
        <t>The final tree size and root hash of the prior transparency log need to be
distributed to users in a way that guarantees all users have a globally
consistent view. This can be done either by storing them in a well-known label
of the new transparency log or with the application's code distribution
mechanism.</t>
      </section>
      <section anchor="federation">
        <name>Federation</name>
        <t>In a federated application, many servers that are owned and operated by
different entities will cooperate to provide a single end-to-end encrypted
communication service. Each entity in a federated system provides its own
infrastructure (in particular, a transparency log) to serve the users that rely
on it. Given this, there must be a consistent policy for directing KT requests
to the correct transparency log. Typically in such a system, the end-user
identity directly specifies which entity requests should be directed to. For
example, with an email end-user identity like <tt>alice@example.com</tt>, the
controlling entity is <tt>example.com</tt>.</t>
        <t>A controlling entity like <tt>example.com</tt> <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.</t>
      </section>
    </section>
    <section anchor="pruning">
      <name>Pruning</name>
      <t>As part of the core infrastructure of an end-to-end encrypted communication
service, transparency logs are required to operate seamlessly for several years.
This presents a problem for general append-only logs, as even moderate usage can
cause the log to grow to an unmanageable size. This issue is further compounded
by the fact that a substantial portion of the entries added to a log may be
fake, having been added solely for the purpose of obscuring short-term update
rates (as discussed in <xref target="privacy-guarantees"/>). Given this, transparency logs
need to be able manage their footprint by pruning data which is no longer
required by the communication service.</t>
      <t>Broadly speaking, a transparency log's database will contain two types of data:</t>
      <ol spacing="normal" type="1"><li>
          <t>Serialized user data (the values corresponding to labels in the log), and</t>
        </li>
        <li>
          <t>Cryptographic data, such as pre-computed portions of hash trees or commitment
openings.</t>
        </li>
      </ol>
      <t>The first type, serialized user data, can be pruned by removing any entries that
the service operator's access control policy would never permit access to. For
example, a service operator may only permit clients to search for the most
recent version (or <tt>n</tt> versions) of a label. Any entries that don't meet this
criteria can be deleted without consideration to the rest of the protocol.</t>
      <t>The second type, cryptographic data, can also be pruned, but only after
considering which parts are no longer required by the protocol for producing
proofs. For example, even though the label-value pair inserted at a particular
entry in the append-only log may have been deleted, parts of the log entry may
still be needed to produce proofs for Search / Update / Monitor queries on other
labels. The exact mechanism for determining which data is safe to delete will
depend on the protocol and implementation.</t>
      <t>The distinction between user data and cryptographic data provides a valuable
separation of concerns, given that the protocol document does not provide a
mechanism for a service operator to convey its access control policy to a
transparency log. That is: pruning user data can be done entirely by
application-defined code, while pruning cryptographic data can be done entirely
by KT-specific code as a subsequent operation.</t>
    </section>
    <section anchor="security-guarantees">
      <name>Security Guarantees</name>
      <t>A user that correctly verifies a proof from the transparency log (and does any
required monitoring afterwards) receives a guarantee that the transparency log
operator executed the label-value lookup correctly, and in a way that's globally
consistent with what it has shown all other users. That is, when a user searches
for a label, they're guaranteed that the result they receive represents the same
result that any other user searching for the same label would've seen. When a user
modifies a label, they're guaranteed that other users will see the modification
the next time they search for the label.</t>
      <t>If the transparency log does not execute a label-value lookup correctly, then
either:</t>
      <ol spacing="normal" type="1"><li>
          <t>The user will detect the error immediately and reject the proof, or</t>
        </li>
        <li>
          <t>The user will permanently enter an invalid state.</t>
        </li>
      </ol>
      <t>Depending on the exact reason that the user enters an invalid state, it will
either be detected by background monitoring or by the mechanisms described in
<xref target="detecting-forks"/>. Importantly, this means that users must stay online for
some bounded amount of time after entering an invalid state for it to be
successfully detected.</t>
      <t>Alternatively, instead of executing a lookup incorrectly, the transparency log
can attempt to prevent a user from learning about more recent states of the log.
This would allow the log to continue executing queries correctly, but on
outdated versions of data. To prevent this, applications configure an upper
bound on how stale a query response can be without being rejected.</t>
      <t>The exact caveats of the above guarantees depend naturally on the security of
underlying cryptographic primitives and also the deployment mode that the
transparency log relies on:</t>
      <ul spacing="normal">
        <li>
          <t>Third-Party Management and Third-Party Auditing require an assumption that the
transparency log and the third-party manager or auditor do not collude
to trick users into accepting malicious results.</t>
        </li>
        <li>
          <t>Contact Monitoring requires an assumption that the user that owns a label and
all users that look up the label do the necessary monitoring afterwards.</t>
        </li>
      </ul>
      <t>In short, assuming that the underlying cryptographic primitives used are secure,
any deployment-specific assumptions hold (such as non-collusion), and that user
devices don't go permanently offline, then malicious behavior by the
transparency log is always detected within a bounded amount of time. The
parameters that determine the maximum amount of time before malicious behavior
is detected are as follows:</t>
      <ul spacing="normal">
        <li>
          <t>The configured maximum amount of time by which a query response can be stale.</t>
        </li>
        <li>
          <t>The configured Reasonable Monitoring Window (described in
<xref section="7.1" sectionFormat="of" target="PROTO"/>), weighed against how frequently users execute
background monitoring in practice.</t>
        </li>
        <li>
          <t>For logs that use the Contact Monitoring deployment mode: how frequently users
engage in anonymous communication with the transparency log, or peer-to-peer
communication with other users.</t>
        </li>
        <li>
          <t>For logs that use the Third-Party Auditing deployment mode: the configured
maximum acceptable lag for an auditor.</t>
        </li>
      </ul>
      <section anchor="privacy-guarantees">
        <name>Privacy Guarantees</name>
        <t>For applications deploying KT, service operators expect to be able to control
when sensitive information is revealed. In particular, a service operator can
often only reveal that a user is a member of their service, and information
about that user's account, to that user's friends or contacts.</t>
        <t>KT only allows users to learn whether or not a label exists in the
transparency log if the user obtains a valid search proof for that label.
Similarly, KT only allows users to learn about the value of a label if
the user obtains a valid search proof for the exact label and version.</t>
        <t>When a user was previously allowed to lookup or change a label's value but no
longer is, KT prevents the user from learning whether or not the label's value
has changed since the user's access was revoked. This is true even in Contact
Monitoring mode, where users are still permitted to perform monitoring after
their access to perform other queries has been revoked.</t>
        <t>Applications determine the privacy of data in KT by
relying on these properties when they enforce access control policies on the
queries issued by users, as discussed in <xref target="protocol-overview"/>. For example if
two users aren't friends, an application can block these users from searching
for each other's labels. This prevents both users from learning about
each other's existence. If the users were previously friends but no longer are,
the application can prevent the users from searching for each other's labels and
learning the contents of any subsequent account updates.</t>
        <t>Service operators also expect to be able to control sensitive population-level
metrics about their users. These metrics include the size of their user base, the
frequency with which new users join, and the frequency with which existing users
update their labels.</t>
        <t>KT allows a service operator to obscure the size of its user base by batch
inserting a large number of fake label-version pairs when a transparency log is
first initialized. Similarly, KT also allows a service operator to obscure the
rate at which "real" changes are made to the transparency log by padding "real"
changes with the insertion of other fake label-version pairs such that it
creates the outside appearance of a constant baseline rate of insertions.</t>
        <section anchor="leakage-to-third-party">
          <name>Leakage to Third-Party</name>
          <t>In the event that a third-party auditor or manager is used, there's additional
information leaked to the third-party that's not visible to outsiders.</t>
          <t>In the case of a third-party auditor, the auditor is able to learn the total
number of distinct changes to the log. It is also able to learn the order and
approximate timing with which each change was made. However, auditors are not
able to learn the plaintext of any labels or values. This is because labels
are masked with a VRF, and values are only provided to auditors as commitments.
They are also not able to distinguish between whether a change represents a label
being created for the first time or being updated, or whether a change
represents a "real" change from an end-user or a "fake" padding change.</t>
          <t>In the case of a third-party manager, the manager generally learns everything
that the service operator would know. This includes the total set of plaintext
labels and values and their modification history. It also includes traffic
patterns, such as how often a specific label is looked up.</t>
        </section>
      </section>
    </section>
    <section anchor="privacy-law-considerations">
      <name>Privacy Law Considerations</name>
      <t>Consumer privacy laws often provide a 'right to erasure'. This means that when a
consumer requests that a service provider delete their personal information, the
service provider is legally obligated to do so. This may seem to be incompatible
with the description of KT in <xref target="introduction"/> as an 'append-only log'. Once an
entry is added to a transparency log, it indeed can not be removed.</t>
      <t>The important caveat here is that user data is not directly stored in the
append-only log. Instead, the log consists of privacy-preserving cryptographic
commitments. By logging commitments instead of plaintext user data, users
interacting with the log are unable to infer anything about an entry's contents
until the service provider explicitly provides the commitment's opening. A
service provider responding to an erasure request can delete the commitment
opening and the associated data, effectively anonymizing the entry.</t>
      <t>Other than the log, the second place where user information is stored is in the
<em>prefix tree</em>. This is a cryptographic index provided to users to enable them to
efficiently query the log, which contains information about which labels
exist and where. These labels are usually serialized end-user identifiers,
although it varies by application. To minimize leakage, all labels are
processed through a Verifiable Random Function, or VRF <xref target="RFC9381"/>.</t>
      <t>A VRF deterministically maps each label to the fixed-length pseudorandom
value. Only the service operator, who holds a private key, can execute the VRF.
Critically though, VRFs can provide proof that an input-output pair is
valid, which users verify with a public key. When a user tries to search for or
update a label, the service operator first executes its VRF on the input label
to obtain the index that will actually be looked up or stored in the
prefix tree. The service operator then provides the VRF output, along with a
proof that the output is correct, in its response to the user.</t>
      <t>The pseudorandom property of VRFs means that even if a user indirectly observes
that a specific VRF output exists in the prefix tree, they can't learn which
user it identifies. The inability of users to execute the VRF
themselves also prevents offline "password cracking" approaches, where an
attacker tries all possibilities in a low entropy space (like the set of phone
numbers) to find the input that produces a given output.</t>
      <t>A service provider responding to an erasure request can 'trim' the prefix tree,
by no longer storing the full VRF output for any labels corresponding to an
end-user's identifiers. With only a small amount of the VRF output left in
storage, even if the transparency log is later compromised, it would be unable
to recover deleted identifiers. If the same labels were reinserted into the
log at a later time, it would appear as if they were being inserted for the
first time.</t>
      <t>As an example, consider the information stored in a transparency log after
inserting a label <tt>L</tt> with value <tt>V</tt>. The index inserted into the prefix tree would
roughly correspond to <tt>VRF(label L) = pseudorandom bytes</tt>, and the value stored in
the append-only log would roughly correspond to:</t>
      <artwork><![CDATA[
Commit(nonce: random bytes, body: version N of label L is V)
]]></artwork>
      <t>After receiving an erasure request, the transparency log deletes the label, value,
and random commitment nonce. It also trims the VRF output to the minimum size
necessary. The commitment scheme guarantees that, without the high-entropy
random nonce, the remaining commitment reveals nothing about the label or value.</t>
      <t>Assuming that the prefix tree is well-balanced (which is extremely likely due to
VRFs being pseudorandom), the number of VRF output bits retained is
approximately equal to the logarithm of the total number of labels stored. This
means that while the VRF's full output may be 256 bits, in a log with one
million labels, only 20 output bits would need to be retained. This would be
insufficient for recovering even a very low-entropy identifier like a phone
number.</t>
    </section>
    <section anchor="implementation-guidance">
      <name>Implementation Guidance</name>
      <t>Fundamentally, KT can be thought of as guaranteeing that all the users of a
service agree on the contents of a key-value database (noting that this document
refers to these keys as "labels"). It takes special care to turn the guarantee
that all users agree on a set of labels and values into a guarantee that the
mapping between end-users and their public keys is authentic. Critically, 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.) A primary end-user identity should always
be a label in KT, with the end-user's public keys and other account information
as the associated value.</t>
      <t>A <strong>secondary end-user identity</strong> is one that is unique, 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 phone
number, since users can often change the phone number they use with a service
without disrupting existing communications. A secondary end-user identity should
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 label-value pairs they store in KT.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <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="6" month="July" year="2025"/>
            <abstract>
              <t>   While there are several established protocols for end-to-end
   encryption, relatively little attention has been given to securely
   distributing the end-user public keys for such encryption.  As a
   result, these protocols are often still vulnerable to eavesdropping
   by active attackers.  Key Transparency is a protocol for distributing
   sensitive cryptographic information, such as public keys, in a way
   that reliably either prevents interference or detects that it
   occurred in a timely manner.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-protocol-02"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="sealed-sender" target="https://signal.org/blog/sealed-sender/">
          <front>
            <title>Technology preview: Sealed sender for Signal</title>
            <author>
              <organization/>
            </author>
            <date year="2018" month="October" day="29"/>
          </front>
        </reference>
        <reference anchor="RFC6962">
          <front>
            <title>Certificate Transparency</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Kasper" initials="E." surname="Kasper"/>
            <date month="June" year="2013"/>
            <abstract>
              <t>This document describes an experimental protocol for publicly logging the existence of Transport Layer Security (TLS) certificates as they are issued or observed, in a manner that allows anyone to audit certificate authority (CA) activity and notice the issuance of suspect certificates as well as to audit the certificate logs themselves. The intent is that eventually clients would refuse to honor certificates that do not appear in a log, effectively forcing CAs to add all issued certificates to the logs.</t>
              <t>Logs are network services that implement the protocol operations for submissions and queries that are defined in this document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6962"/>
          <seriesInfo name="DOI" value="10.17487/RFC6962"/>
        </reference>
        <reference anchor="RFC9420">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="R. Robert" initials="R." surname="Robert"/>
            <author fullname="J. Millican" initials="J." surname="Millican"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9420"/>
          <seriesInfo name="DOI" value="10.17487/RFC9420"/>
        </reference>
        <reference anchor="RFC9458">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <abstract>
              <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </reference>
        <reference anchor="RFC9381">
          <front>
            <title>Verifiable Random Functions (VRFs)</title>
            <author fullname="S. Goldberg" initials="S." surname="Goldberg"/>
            <author fullname="L. Reyzin" initials="L." surname="Reyzin"/>
            <author fullname="D. Papadopoulos" initials="D." surname="Papadopoulos"/>
            <author fullname="J. Včelák" initials="J." surname="Včelák"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>A Verifiable Random Function (VRF) is the public key version of a keyed cryptographic hash. Only the holder of the secret key can compute the hash, but anyone with the public key can verify the correctness of the hash. VRFs are useful for preventing enumeration of hash-based data structures. This document specifies VRF constructions based on RSA and elliptic curves that are secure in the cryptographic random oracle model.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9381"/>
          <seriesInfo name="DOI" value="10.17487/RFC9381"/>
        </reference>
      </references>
    </references>
    <?line 909?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1963Ibx7Xu/36K2fQPkSyAiuzEO2ElTmjZTlSWLG+JTnZq
167yAGgQEw1mkJkBaURWnmU/y3mys7516e65gKIvlXNO1WG5LBKY6cvq1et+
mc/nriu60l9mJ1/6Q3bd5FW7yxtfLQ/ZVbPcFJ1fdvvGn7hl3vmbujlcZkW1
rp1b1csq39KLqyZfd/PCd+v5G3/oMMI8T16d/+JXrt0vtkXbFnXVHXb0zrPP
r79w1X678M2lW9HIl25ZV62v2n17mXXN3rvby+wjRyvJaWmv/XLfFN3hxN3V
zZubpt7vJhZ84mh+emB16bJ5Rr9nXfKtu/XVnubJsuPvZ5ks7+QvNE1R3WR/
xKP4fJsXJX1uG/wDtntRNzf4Dpul7zZdt2svHz/Go7z/W39hjz3GB48XTX3X
+sc2yGO8fFN0m/2CXmcA3t0EGD4WuOJFPFcSkNoumWb4/IWMdFHUyZuP33c4
F5tuW544l++7Td0AcDRXlq33ZSmn+ymBZpVX2Yvli6Is6QD5ey/wWMiX2+VW
vvvDDT6/WNZb56q62eYdAeHSOWBM+CvLWp+XfjWn417h/DFglzc3nrZnu2uL
myovGXSLsr553HvlsbyieHvtl5uqpocO2a7xt4W/u8xe8+OZPJ7R5NlrHvCE
32SEyz78xZNfz5/8Yv7hb5xz8/k8yxctAWjZOXe9KdqMEHy/9VWXrfy6qHyb
dRufdb7ZFjpbXq3oLtAn9A5tPtvlHf1RtfThbV3eenyLl9zK78r6wGPV62x0
z+ipPLvxFQ1U0pIJ1b3gaLb1bZvfECICgk1Oy9vzqc147nbnl8W60JW1ekcI
CPXON518nnf8JX3W1cu6dPTLbbHy7UX2rMvysq0JAW/pyW2NSWUNs6yqqznB
sl02xQ6Hlt3sCzrnpc9om5v6LutqJwstCQy7Hf1/tKuupl3JFceuCSe29DIe
LoiUELzaCwH7tlitSu/cB9mzqmvq1Z6h6dynfo1F5dUhC/hDIywJGRc+898t
N3l1I0Cmj+ik5109p3/o12Vz2HU4/0Pb+e0s6+5q120IjrTRfdtlG1qGry6z
L4qm7WZ0cASuZbHLq67VM9NX5XEFmoK5uS2W3gHGeUeIdUfXjhe52y9oa6A7
fCAH+qbdAAz71uOfxi89YCmHiiMgslZXqxnjiI6bhXF55rbeesB7VdDZF4t9
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

-->

</rfc>
