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

<t>This document defines the terminology and interaction patterns involved in the
deployment of Key Transparency (KT) in a general secure group messaging
infrastructure, and specifies the security properties that the protocol
provides. It also gives more general, non-prescriptive guidance on how to
securely apply KT to a number of common applications.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://bren2010.github.io/draft-kt-arch/draft-mcmillion-keytrans-architecture.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-mcmillion-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/Bren2010/draft-kt-arch"/>.</t>
    </note>
  </front>
  <middle>
    <?line 42?>

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

<dl>
        <dt><strong>End-to-end Encrypted Communication Service:</strong></dt>
        <dd>
          <t>A communications service that allows end-users to engage in text, voice,
video, or other forms of communication over the Internet, that uses public key
cryptography to ensure that communications are only accessible to their
intended recipients.</t>
        </dd>
        <dt><strong>End-user Device:</strong></dt>
        <dd>
          <t>The device at the final point in a digital communication, which may either
send or receive encrypted data in an end-to-end encrypted communication
service.</t>
        </dd>
        <dt><strong>End-user Identity:</strong></dt>
        <dd>
          <t>A unique and user-visible identity associated with an account (and therefore
one or more end-user devices) in an end-to-end encrypted communication
service. In the case where an end-user explicitly requests to communicate with
(or is informed they are communicating with) an end-user uniquely identified
by the name "Alice", the end-user identity is the string "Alice".</t>
        </dd>
        <dt><strong>User / Account:</strong></dt>
        <dd>
          <t>A single end-user of an end-to-end encrypted communication service, which may
be represented by several end-user identities and end-user devices. For
example, a user may be represented simultaneously by multiple identities
(email, phone number, username) and interact with the service on multiple
devices (phone, laptop).</t>
        </dd>
        <dt><strong>Service Operator:</strong></dt>
        <dd>
          <t>The primary organization that provides the infrastructure and software
resources necessary to operate an end-to-end encrypted communication service.</t>
        </dd>
        <dt><strong>Transparency Log:</strong></dt>
        <dd>
          <t>A specialized service capable of securely attesting to the information (such
as public keys) associated with a given end-user identity. The transparency
log is run either entirely or partially by the service operator.</t>
        </dd>
      </dl>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>From a networking perspective, KT follows a client-server architecture with a
central <em>Transparency Log</em>, acting as a server, which holds the authoritative
copy of all information and exposes endpoints that allow users to query or
modify stored data. Users coordinate with each other through the server by
uploading their own public keys and/or downloading the public keys of other
users. Users are expected to maintain relatively little state, limited only
to what is required to interact with the log and ensure that it is behaving
honestly.</t>
      <t>From an application perspective, KT works as a versioned key-value database.
Users insert key-value pairs into the database where, for example, the key is
their username and the value is their public key. Users can update a key by
inserting a new version with new data. They can also look up the most recent
version of a key or any past version. Users are considered to <strong>own</strong> a key if,
in the normal operation of the application, they should be the only one making
changes to it. From this point forward, "key" will refer to a lookup key in a
key-value database and "public key" or "private key" will be specified if
otherwise.</t>
      <t>KT does not require the use of a specific transport protocol. This is intended
to allow applications to layer KT on top of whatever transport protocol their
application already uses. In particular, this allows applications to continue
relying on their existing access control system.</t>
      <t>Applications may enforce arbitrary access control rules on top of KT such as
requiring a user to be logged in to make KT requests, only allowing a user to
lookup the keys of another user if they're "friends", or simply applying a rate
limit. Applications <bcp14>SHOULD</bcp14> prevent users from modifying keys that they don't
own. The exact mechanism for rejecting requests, and possibly explaining the
reason for rejection, is left to the application.</t>
    </section>
    <section anchor="user-interactions">
      <name>User Interactions</name>
      <t>As discussed in <xref target="protocol-overview"/>, KT follows a client-server architecture.
This means that all user interaction is directly with the service operator. The
operations that can be executed by a user are as follows:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Search:</strong> Performs a lookup on a specific key in the most recent version of
the log. Users may request either a specific version of the key, or the
most recent version available. If the key-version pair exists, the server
returns the corresponding value and a proof of inclusion.</t>
        </li>
        <li>
          <t><strong>Update:</strong> Adds a new key-value pair to the log, for which the server
returns a proof of inclusion. Note that this means that new values are added
to the log immediately and are not queued for later insertion with a batch of
other values.</t>
        </li>
        <li>
          <t><strong>Monitor:</strong> While Search and Update are run by the user as necessary,
monitoring is done in the background on a recurring basis. It both checks
that the log is continuing to behave honestly (all previously returned keys
remain in the tree) and that no changes have been made to keys owned by the
user without the user's knowledge.</t>
        </li>
      </ol>
      <t>These operations are executed over an application-provided transport layer,
where the transport layer enforces access control by blocking queries which are
not allowed:</t>
      <t>TODO diagram showing a search request over an application-provided transport
layer getting accepted / rejected</t>
      <section anchor="out-of-band-communication">
        <name>Out-of-Band Communication</name>
        <t>It is sometimes possible for a Transparency Log to present forked views of data
to different users. This means that, from an individual user's perspective, a
log may appear to be operating correctly in the sense that all of a user's
requests succeed and proofs verify correctly. However, the Transparency Log has
presented a view to the user that's not globally consistent with what it has
shown other users. As such, the log may be able to associate data with keys
without the key owner's awareness.</t>
        <t>The protocol is designed such that users always require subsequent queries to
prove consistency with previous queries. As such, users always stay on a
linearizable view of the log. If a user is ever presented with a forked view,
they hold on to this forked view forever and reject the output of any subsequent
queries that are inconsistent with it.</t>
        <t>This provides ample opportunity for users to detect when a fork has been
presented, but isn't in itself sufficient for detection. To detect forks, users
must either use <strong>out-of-band communication</strong> with other users or <strong>anonymous
communication</strong> with the Transparency Log.</t>
        <t>With out-of-band communication, two users gossip with each other to establish
that they both have the same view of the log's data. This gossip is able to
happen over any supported out-of-band channel, even if it is heavily
bandwidth-limited, such as scanning a QR code or talking over the phone.</t>
        <t>With anonymous communication, a single user accesses the Transparency Log over
an anonymous channel and tries to establish that the log is presenting the same
view of data over the anonymous channel as it does over authenticated channels.</t>
        <t>In the event that a fork is successfully detected, the user is able to produce
non-repudiable proof of log misbehavior which can be published.</t>
        <t>TODO diagram showing a user talking to a log over an authenticated &amp; anonymous
channel, gossipping with other users</t>
      </section>
    </section>
    <section anchor="deployment-modes">
      <name>Deployment Modes</name>
      <t>In the interest of satisfying the widest range of use-cases possible, three
different modes for deploying a Transparency Log are supported. Each mode has
slightly different requirements and efficiency considerations for both the
service operator and the end-user.</t>
      <t><strong>Third-Party Management</strong> and <strong>Third-Party Auditing</strong> are two deployment modes
that require the service operator to delegate part of the operation of the
Transparency Log to a third party. Users are able to run more efficiently as
long as they can assume that the service operator 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 service operator and the service operator coordinates with the third party
themself. End-users never contact the third party directly, however they will
need a signature public key from the third party to verify its assertions.</t>
      <t>With Third-Party Management, the third party performs the majority of the work
of actually storing and operating the log, and the service operator only needs
to sign new entries as they're added. With Third-Party Auditing, the service
operator performs the majority of the work of storing and operating the log, and
obtains signatures from a lightweight third-party auditor at regular intervals
asserting that the service operator has been constructing the tree correctly.</t>
      <t><strong>Contact Monitoring</strong>, on the other hand, supports a single-party deployment
with no third party. The tradeoff is that executing the background monitoring
protocol requires an amount of work that's proportional to the number of keys a
user has looked up in the past. As such, it's less suited to use-cases where
users look up a large number of ephemeral keys, but would work ideally in a
use-case where users look up a small number of keys repeatedly (for example, the
keys of regular contacts).</t>
      <table>
        <name>Comparison of deployment modes</name>
        <thead>
          <tr>
            <th align="left">Deployment Mode</th>
            <th align="left">Supports ephemeral keys?</th>
            <th align="left">Single party?</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Contact Monitoring</td>
            <td align="left">No</td>
            <td align="left">Yes</td>
          </tr>
          <tr>
            <td align="left">Third-Party Auditing</td>
            <td align="left">Yes</td>
            <td align="left">No</td>
          </tr>
          <tr>
            <td align="left">Third-Party Management</td>
            <td align="left">Yes</td>
            <td align="left">No</td>
          </tr>
        </tbody>
      </table>
      <section anchor="contact-monitoring">
        <name>Contact Monitoring</name>
        <t>TODO diagram showing user request going to service operator, followed by
monitoring queries later.</t>
      </section>
      <section anchor="third-party-auditing">
        <name>Third-Party Auditing</name>
        <t>With the Third-Party Auditing deployment mode, the service operator obtains
signatures from a lightweight third-party auditor attesting to the fact that the
service operator is constructing the tree correctly. These signatures are
provided to users along with the responses for their queries.</t>
        <t>The third-party auditor is expected to run asynchronously, downloading and
authenticating a log's contents in the background, so as not to become a
bottleneck for the service operator.</t>
        <t>TODO diagram showing a user request going to a service operator and a response
with an auditor signature coming back. Batched changes going to auditor in
background.</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, while the service
operator 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 service operator, and the service operator proxies them to the
third-party manager if they pass access control.</t>
        <t>TODO diagram showing user request going to service operator, immediately being
proxied to manager with operator signature.</t>
      </section>
    </section>
    <section anchor="security-guarantees">
      <name>Security Guarantees</name>
      <t>A user that correctly verifies a proof from the Transparency Log (and does any
required monitoring afterwards) receives a guarantee that the Transparency Log
operator executed the key-value lookup correctly, and in a way that's globally
consistent with what it has shown all other users. That is, when a user searches
for a key, they're guaranteed that the result they receive represents the same
result that any other user searching for the same key would've seen. When a user
modifies a key, they're guaranteed that other users will see the modification
the next time they search for the key.</t>
      <t>If the Transparency Log operator does not execute a key-value lookup correctly,
then either:</t>
      <ol spacing="normal" type="1"><li>
          <t>The user will detect the error immediately and reject the proof, or</t>
        </li>
        <li>
          <t>The user will permanently enter an invalid state.</t>
        </li>
      </ol>
      <t>Depending on the exact reason that the user enters an invalid state, it will
either be detected by background monitoring or the next time that out-of-band
communication is available. Importantly, this means that users must stay
online for some fixed amount of time after entering an invalid state for it to
be successfully detected.</t>
      <t>The exact caveats of the above guarantee depend naturally on the security of
underlying cryptographic primitives, but 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
service operator and the third-party manager/auditor do not collude
to trick users into accepting malicious results.</t>
        </li>
        <li>
          <t>Contact Monitoring requires an assumption that the user that owns a key and
all users that look up the key do the necessary monitoring afterwards.</t>
        </li>
      </ul>
      <section anchor="privacy-guarantees">
        <name>Privacy Guarantees</name>
        <t>For applications deploying KT, service operators expect to be able to control
when sensitive information is revealed. In particular, an operator can often
only reveal that a user is a member of their service, and information about that
user's account, to that user's friends or contacts.</t>
        <t>KT only allows users to learn whether or not a lookup key exists in the
Transparency Log if the user obtains a valid search proof for that key.
Similarly, KT only allows users to learn about the contents of a log entry if
the user obtains a valid search proof for the exact key and version stored at
that log entry.</t>
        <t>Applications are primarily able to manage the privacy of their data in KT by
relying on these properties when they enforce access control policies on the
queries issued by users, as discussed in <xref target="protocol-overview"/>. For example if
two users aren't friends, an application can block these users from searching
for each other's lookup keys. This prevents the two users from learning about
each other's existence. If the users were previously friends but no longer are,
the application can prevent the users from searching for each other's keys and
learning the contents of any subsequent account updates.</t>
        <t>TODO specify the rest of the privacy guarantees of the finished protocol</t>
        <!-- Operators may also wish to conceal when individual users perform a given task
like rotate their public key or add a new device to their account, or even
conceal the exact number of users their application has overall. -->

</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. Using this guarantee,
that all users agree on a set of keys and values, to authenticate the
relationship between end-user identities and the end-users of a communication
service takes special care. Critically, in order to authenticate an end-user
identity, it must be both <em>unique</em> and <em>user-visible</em>. However, what exactly
constitutes a unique and user-visible identifier varies greatly from application
to application.</t>
      <t>Consider, for example, a communication service where users are uniquely
identified by a fixed username, but KT has been deployed using an internal UUID
as the lookup key. While the UUID might be unique, it is not user-visible. When
a user attempts to lookup a contact by username, the service operator must
translate the username into its UUID. Since this mapping (from username to UUID)
is unauthenticated, the service operator can manipulate it to eavesdrop on
conversations by returning the UUID for an account that it controls. From a
security perspective, this is equivalent to not using KT at all. An example of
this kind of application would be email.</t>
      <t>However in other applications, the use of internal UUIDs in KT may be
appropriate. For example, many applications don't have this type of fixed
username and instead use their UI (underpinned internally by a UUID) to indicate
to users whether a conversation is with a new person or someone they've
previously contacted. The fact that the UI behaves in this way makes the UUID a
user-visible identifer, even if a user may not be able to actually see it
written out. An example of this kind of application would be Slack.</t>
      <t>A <strong>primary end-user identity</strong> is one that is unique, user-visible, and unable
to change. (Or equivalently, if it changes, it appears in the application UI as
a new conversation with a new user.) A primary end-user identity should always
be a lookup key in KT, with the end-user's public keys as the associated value.</t>
      <t>A <strong>secondary end-user identity</strong> is one that is unique, user-visible, and able
to change without being interpreted as a different account due to its
association with a primary identity. Examples of this type of identity include
phone numbers, or most usernames. These identities are used solely for initial
user discovery, in which they're converted to a primary identity that's used by
the application from then on. A secondary end-user identity should be a lookup
key in KT, for the purpose of authenticating user discovery, with the primary
end-user identity as the associated value.</t>
      <t>While likely helpful to most common applications, the distinction between
handling primary and secondary identities is not a hard-and-fast rule.
Applications must be careful to ensure they fully capture the semantics of
identity in their application with the key-value structure they put in KT.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC6962">
        <front>
          <title>Certificate Transparency</title>
          <author fullname="B. Laurie" initials="B." surname="Laurie">
            <organization/>
          </author>
          <author fullname="A. Langley" initials="A." surname="Langley">
            <organization/>
          </author>
          <author fullname="E. Kasper" initials="E." surname="Kasper">
            <organization/>
          </author>
          <date month="June" year="2013"/>
        </front>
        <seriesInfo name="DOI" value="10.17487/rfc6962"/>
        <refcontent>RFC Editor</refcontent>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 426?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
AA==

-->

</rfc>
