<?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.11 (Ruby 3.2.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-keytrans-mcmillion-protocol-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title>Key Transparency Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-keytrans-mcmillion-protocol-00"/>
    <author fullname="Brendan McMillion">
      <organization/>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <author fullname="Felix Linker">
      <organization/>
      <address>
        <email>linkerfelix@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="June" day="10"/>
    <area>SEC</area>
    <workgroup>KEYTRANS Working Group</workgroup>
    <abstract>
      <?line 37?>

<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>
    <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-keytrans/draft-keytrans-mcmillion-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-keytrans-mcmillion-protocol/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/Bren2010/draft-keytrans"/>.</t>
    </note>
  </front>
  <middle>
    <?line 47?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>End-to-end encrypted communication services rely on the secure exchange of
public keys to ensure that messages remain confidential. It is typically assumed
that service providers correctly manage the public keys associated with each
user's account. However, this is not always true. A service provider that is
compromised or malicious can change the public keys associated with a user's
account without their knowledge, thereby allowing the provider to eavesdrop on
and impersonate that user.</t>
      <t>This document describes a protocol that enables a group of users to ensure that
they all have the same view of the public keys associated with each other's
accounts. Ensuring a consistent view allows users to detect when unauthorized
public keys have been associated with their account, indicating a potential
compromise.</t>
      <t>More detailed information about the protocol participants and the ways the
protocol can be deployed can be found in <xref target="I-D.ietf-keytrans-architecture"/>.</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?>

<t>This document uses the TLS presentation language <xref target="RFC8446"/> to describe the
structure of protocol messages, but does not require the use of a specific
transport protocol. As such, implementations do not necessarily need to transmit
messages according to the TLS format and can chose whichever encoding method
best suits their application. However, cryptographic computations <bcp14>MUST</bcp14> be done
with the TLS presentation language format to ensure the protocol's security
properties are maintained.</t>
    </section>
    <section anchor="tree-construction">
      <name>Tree Construction</name>
      <t>KT allows clients of a service to query the keys of other clients of the same
service. To do so, KT maintains two structures: (i) a log of each change to any
key's value, and (ii) a set containing all of the key-version pairs that have been
logged. When clients query a KT service, they
require a means to authenticate the responses of the KT service. To provide for
this, the KT service maintains a <em>combined hash tree structure</em>, which commits
to both these structures with a <em>root hash</em>.
Two clients which have the same root hash are guaranteed to have the same view
of the tree, and thus would always receive the same result for the same query.</t>
      <t>The combined hash tree structure consists of two types of trees: log trees and
prefix trees. The log tree commits to (i) and
the prefix tree commits to (ii). This section describes the operation of
both at a high level and the way that they're combined. More precise algorithms
for computing the intermediate and root values of the trees are given in
<xref target="cryptographic-computations"/>.</t>
      <t>Both types of trees consist of
<em>nodes</em> which have a byte string as their <em>hash value</em>. A node is either a
<em>leaf</em> if it has no children, or a <em>parent</em>
if it has either a <em>left child</em> or a <em>right child</em>. A node is the <em>root</em> of a
tree if it has no parents, and an <em>intermediate</em> if it has both children and
parents. Nodes are <em>siblings</em> if they share the same parent.</t>
      <t>The <em>descendants</em> of a node are that node, its children, and the descendants of
its children. A <em>subtree</em> of a tree is the tree given by the descendants of a
node, called the <em>head</em> of the subtree.</t>
      <t>The <em>direct path</em> of a root node is the empty list, and of any other node is the
concatenation of that node's parent along with the parent's direct path. The
<em>copath</em> of a node is the node's sibling concatenated with the list of siblings
of all the nodes in its direct path, excluding the root.</t>
      <section anchor="log-tree">
        <name>Log Tree</name>
        <t>Log trees are used for storing information in the chronological order that it
was added and are constructed as <em>left-balanced</em> binary trees.</t>
        <t>A binary tree is <em>balanced</em> if its size is a power of two and for any parent
node in the tree, its left and right subtrees have the same size. A binary tree
is <em>left-balanced</em> if for every parent, either the parent is balanced, or the
left subtree of that parent is the largest balanced subtree that could be
constructed from the leaves present in the parent's own subtree. Given a list of
<tt>n</tt> items, there is a unique left-balanced binary tree structure with these
elements as leaves. Note also that every parent always has both a left and right
child.</t>
        <figure>
          <name>A log tree containing five leaves.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="272" viewBox="0 0 272 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 144,112 L 144,128" fill="none" stroke="black"/>
                <path d="M 240,48 L 240,64" fill="none" stroke="black"/>
                <path d="M 264,96 L 264,192" fill="none" stroke="black"/>
                <path d="M 160,64 L 248,64" fill="none" stroke="black"/>
                <path d="M 112,128 L 176,128" fill="none" stroke="black"/>
                <path d="M 104,176 L 112,192" fill="none" stroke="black"/>
                <path d="M 176,128 L 184,144" fill="none" stroke="black"/>
                <path d="M 200,176 L 208,192" fill="none" stroke="black"/>
                <path d="M 248,64 L 264,96" fill="none" stroke="black"/>
                <path d="M 80,192 L 88,176" fill="none" stroke="black"/>
                <path d="M 104,144 L 112,128" fill="none" stroke="black"/>
                <path d="M 152,80 L 160,64" fill="none" stroke="black"/>
                <path d="M 176,192 L 184,176" fill="none" stroke="black"/>
                <g class="text">
                  <text x="240" y="36">X</text>
                  <text x="144" y="100">X</text>
                  <text x="96" y="164">X</text>
                  <text x="192" y="164">X</text>
                  <text x="72" y="212">X</text>
                  <text x="120" y="212">X</text>
                  <text x="168" y="212">X</text>
                  <text x="216" y="212">X</text>
                  <text x="264" y="212">X</text>
                  <text x="28" y="244">Index:</text>
                  <text x="72" y="244">0</text>
                  <text x="120" y="244">1</text>
                  <text x="168" y="244">2</text>
                  <text x="216" y="244">3</text>
                  <text x="264" y="244">4</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                             X
                             |
                   .---------+.
                  /            \
                 X              |
                 |              |
             .---+---.          |
            /         \         |
           X           X        |
          / \         / \       |
         /   \       /   \      |
        X     X     X     X     X

Index:  0     1     2     3     4
]]></artwork>
          </artset>
        </figure>
        <t>Log trees initially consist of a single leaf node. New leaves are
added to the right-most edge of the tree along with a single parent node, to
construct the left-balanced binary tree with <tt>n+1</tt> leaves.</t>
        <figure>
          <name>Example of inserting a new leaf with index 10 into the previously depicted log tree. Observe that only the nodes on the path from the new root to the new leaf change.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="320" viewBox="0 0 320 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 144,112 L 144,128" fill="none" stroke="black"/>
                <path d="M 240,48 L 240,64" fill="none" stroke="black"/>
                <path d="M 288,96 L 288,144" fill="none" stroke="black"/>
                <path d="M 160,64 L 272,64" fill="none" stroke="black"/>
                <path d="M 112,128 L 176,128" fill="none" stroke="black"/>
                <path d="M 104,176 L 112,192" fill="none" stroke="black"/>
                <path d="M 176,128 L 184,144" fill="none" stroke="black"/>
                <path d="M 200,176 L 208,192" fill="none" stroke="black"/>
                <path d="M 296,176 L 304,192" fill="none" stroke="black"/>
                <path d="M 272,64 L 288,96" fill="none" stroke="black"/>
                <path d="M 80,192 L 88,176" fill="none" stroke="black"/>
                <path d="M 104,144 L 112,128" fill="none" stroke="black"/>
                <path d="M 152,80 L 160,64" fill="none" stroke="black"/>
                <path d="M 176,192 L 184,176" fill="none" stroke="black"/>
                <path d="M 272,192 L 280,176" fill="none" stroke="black"/>
                <g class="text">
                  <text x="240" y="36">X</text>
                  <text x="144" y="100">X</text>
                  <text x="96" y="164">X</text>
                  <text x="192" y="164">X</text>
                  <text x="288" y="164">X</text>
                  <text x="72" y="212">X</text>
                  <text x="120" y="212">X</text>
                  <text x="168" y="212">X</text>
                  <text x="216" y="212">X</text>
                  <text x="264" y="212">X</text>
                  <text x="312" y="212">X</text>
                  <text x="28" y="244">Index:</text>
                  <text x="72" y="244">0</text>
                  <text x="120" y="244">1</text>
                  <text x="168" y="244">2</text>
                  <text x="216" y="244">3</text>
                  <text x="264" y="244">4</text>
                  <text x="312" y="244">5</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                             X
                             |
                   .---------+---.
                  /               \
                 X                 |
                 |                 |
             .---+---.             |
            /         \            |
           X           X           X
          / \         / \         / \
         /   \       /   \       /   \
        X     X     X     X     X     X

Index:  0     1     2     3     4     5
]]></artwork>
          </artset>
        </figure>
        <t>While leaves contain arbitrary data, the value of a parent node is always the
hash of the combined values of its left and right children.</t>
        <t>Log trees are powerful in that they can provide both <em>inclusion proofs</em>, which
demonstrate that a leaf is included in a log, and <em>consistency proofs</em>, which
demonstrate that a new version of a log is an extension of a past version of the
log.</t>
        <t>An inclusion proof is given by providing the copath values of a leaf. The proof
is verified by hashing together the leaf with the copath values and checking
that the result equals the root hash value of the log. Consistency proofs are a
more general version of the same idea. With a consistency proof, the prover
provides the minimum set of intermediate node values from the current tree that
allows the verifier to compute both the old root value and the current root
value. An algorithm for this is given in section 2.1.2 of <xref target="RFC6962"/>.</t>
        <figure>
          <name>Illustration of a proof of inclusion. To verify that leaf 4 is included in the tree, the server provides the client with the hashes of the nodes on its copath, i.e., all hashes that are required for the client to compute the root hash itself. In the figure, the copath consists of the nodes marked by (X).</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="320" viewBox="0 0 320 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 144,112 L 144,128" fill="none" stroke="black"/>
                <path d="M 240,48 L 240,64" fill="none" stroke="black"/>
                <path d="M 288,96 L 288,144" fill="none" stroke="black"/>
                <path d="M 160,64 L 272,64" fill="none" stroke="black"/>
                <path d="M 112,128 L 176,128" fill="none" stroke="black"/>
                <path d="M 104,176 L 112,192" fill="none" stroke="black"/>
                <path d="M 176,128 L 184,144" fill="none" stroke="black"/>
                <path d="M 200,176 L 212,200" fill="none" stroke="black"/>
                <path d="M 296,176 L 304,192" fill="none" stroke="black"/>
                <path d="M 272,64 L 288,96" fill="none" stroke="black"/>
                <path d="M 80,192 L 88,176" fill="none" stroke="black"/>
                <path d="M 104,144 L 112,128" fill="none" stroke="black"/>
                <path d="M 152,80 L 160,64" fill="none" stroke="black"/>
                <path d="M 176,192 L 184,176" fill="none" stroke="black"/>
                <path d="M 272,192 L 280,176" fill="none" stroke="black"/>
                <g class="text">
                  <text x="240" y="36">X</text>
                  <text x="144" y="100">X</text>
                  <text x="96" y="164">(X)</text>
                  <text x="200" y="164">X</text>
                  <text x="288" y="164">(X)</text>
                  <text x="72" y="212">X</text>
                  <text x="120" y="212">X</text>
                  <text x="168" y="212">X</text>
                  <text x="208" y="212">(X)</text>
                  <text x="256" y="212">X</text>
                  <text x="304" y="212">X</text>
                  <text x="28" y="244">Index:</text>
                  <text x="72" y="244">0</text>
                  <text x="120" y="244">1</text>
                  <text x="168" y="244">2</text>
                  <text x="216" y="244">3</text>
                  <text x="264" y="244">4</text>
                  <text x="312" y="244">5</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                             X
                             |
                   .---------+---.
                  /               \
                 X                 |
                 |                 |
             .---+---.             |
            /         \            |
          (X)           X         (X)
          / \         / \         / \
         /   \       /   \       /   \
        X     X     X   (X)    X     X

Index:  0     1     2     3     4     5
]]></artwork>
          </artset>
        </figure>
        <figure>
          <name>Illustration of a consistency proof. The server proves to the client that it correctly extended the tree by giving it the hashes of marked nodes ([X] / (X)). The client can verify that it can construct the old root hash form the hashes of nodes marked by (X), and that it can construct the new root hash when also considering the hash of the node [X].</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="328" viewBox="0 0 328 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 144,112 L 144,128" fill="none" stroke="black"/>
                <path d="M 240,48 L 240,64" fill="none" stroke="black"/>
                <path d="M 288,112 L 288,144" fill="none" stroke="black"/>
                <path d="M 160,64 L 280,64" fill="none" stroke="black"/>
                <path d="M 112,128 L 176,128" fill="none" stroke="black"/>
                <path d="M 104,176 L 112,192" fill="none" stroke="black"/>
                <path d="M 176,128 L 184,144" fill="none" stroke="black"/>
                <path d="M 200,176 L 208,192" fill="none" stroke="black"/>
                <path d="M 296,176 L 304,192" fill="none" stroke="black"/>
                <path d="M 280,64 L 296,96" fill="none" stroke="black"/>
                <path d="M 80,192 L 88,176" fill="none" stroke="black"/>
                <path d="M 104,144 L 112,128" fill="none" stroke="black"/>
                <path d="M 152,80 L 160,64" fill="none" stroke="black"/>
                <path d="M 176,192 L 184,176" fill="none" stroke="black"/>
                <path d="M 272,192 L 280,176" fill="none" stroke="black"/>
                <g class="text">
                  <text x="240" y="36">X</text>
                  <text x="144" y="100">(X)</text>
                  <text x="96" y="164">X</text>
                  <text x="192" y="164">X</text>
                  <text x="288" y="164">X</text>
                  <text x="72" y="212">X</text>
                  <text x="120" y="212">X</text>
                  <text x="168" y="212">X</text>
                  <text x="216" y="212">X</text>
                  <text x="264" y="212">(X)</text>
                  <text x="312" y="212">[X]</text>
                  <text x="28" y="244">Index:</text>
                  <text x="72" y="244">0</text>
                  <text x="120" y="244">1</text>
                  <text x="168" y="244">2</text>
                  <text x="216" y="244">3</text>
                  <text x="264" y="244">4</text>
                  <text x="312" y="244">5</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                             X
                             |
                   .---------+----.
                  /                \
                (X)                 |
                 |                 |
             .---+---.             |
            /         \            |
           X           X           X
          / \         / \         / \
         /   \       /   \       /   \
        X     X     X     X    (X)   [X]

Index:  0     1     2     3     4     5
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="prefix-tree">
        <name>Prefix Tree</name>
        <t>Prefix trees are used for storing a set of values while preserving the ability
to efficiently produce proofs of membership and non-membership in the set.</t>
        <t>Each leaf node in a prefix tree represents a specific value, while each parent
node represents some prefix which all values in the subtree headed by that node
have in common. The subtree headed by a parent's left child contains all values
that share its prefix followed by an additional 0 bit, while the subtree headed
by a parent's right child contains all values that share its prefix followed by
an additional 1 bit.</t>
        <t>The root node, in particular, represents the empty string as a prefix. The
root's left child contains all values that begin with a 0 bit, while the right
child contains all values that begin with a 1 bit.</t>
        <t>A prefix tree can be searched by starting at the root node, and moving to the
left child if the first bit of a value is 0, or the right child if the first bit
is 1. This is then repeated for the second bit, third bit, and so on until the
search either terminates at a leaf node (which may or may not be for the desired
value), or a parent node that lacks the desired child.</t>
        <!-- TODO diagram -->

<t>New values are added to the tree by searching it according to the same process.
If the search terminates at a parent without a left or right child, a new leaf
is simply added as the parent's missing child. If the search terminates at a
leaf for the wrong value, one or more intermediate nodes are added until the new
leaf and the existing leaf would no longer reside in the same place. That is,
until we reach the first bit that differs between the new value and the existing
value.</t>
        <!-- TODO diagram of adding new value -->

<t>The value of a leaf node is the encoded set member, while the value of a
parent node is the hash of the combined values of its left and right children
(or a stand-in value when one of the children doesn't exist).</t>
        <t>A proof of membership is given by providing the leaf hash value, along with the
hash value of each copath entry along the search path. A proof of non-membership
is given by providing an abridged proof of membership that follows the search
path for the intended value, but ends either at a stand-in value or a leaf for a
different value. In either case, the proof is verified by hashing together the
leaf with the copath hash values and checking that the result equals the root
hash value of the tree.</t>
      </section>
      <section anchor="combined-tree">
        <name>Combined Tree</name>
        <t>Log trees are desirable because they can provide efficient consistency proofs to
assure verifiers that nothing has been removed from a log that was present in a
previous version. However, log trees can't be efficiently searched without
downloading the entire log. Prefix trees are efficient to search and can provide
inclusion proofs to convince verifiers that the returned search results are
correct. However, it's not possible to efficiently prove that a new version of a
prefix tree contains the same data as a previous version with only new values
added.</t>
        <t>In the combined tree structure, which is based on <xref target="Merkle2"/>, a log tree
maintains a record of each time any key's value is updated, while a prefix tree
maintains the set of index-version pairs. Importantly, the root hash value of the
prefix tree after adding a new index-version pair is stored in a leaf of the log
tree alongside a privacy-preserving commitment to the update. With some caveats,
this combined structure supports both efficient consistency proofs and can be
efficiently searched.</t>
        <t>Note that, although the Transparency Log maintains a single logical prefix tree,
each modification of this tree results in a new root hash, which is then stored
in the log tree. Therefore, when instructions refer to "looking up a key in the
prefix tree at a given log entry," this actually means searching in the specific
version of the prefix tree that corresponds to the root hash stored at that log
entry.</t>
      </section>
    </section>
    <section anchor="searching-the-tree">
      <name>Searching the Tree</name>
      <t>To search the combined tree structure described in <xref target="combined-tree"/>, users do a
binary search for the first log entry where the prefix tree at that entry
contains the desired key-version pair. As such, the entry that a user arrives at
through binary search contains the update that they're looking for, even though
the log itself is not sorted.</t>
      <t>Following a binary search also ensures that all users will check the same or
similar entries when searching for the same key, which is necessary for the
efficient auditing of a Transparency Log. To maximize this effect, users rely on
an implicit binary tree structure constructed over the leaves of the log tree
(distinct from the structure of the log tree itself).</t>
      <section anchor="implicit-binary-search-tree">
        <name>Implicit Binary Search Tree</name>
        <t>Intuitively, the leaves of the log tree can be considered a flat array
representation of a binary tree. This structure is similar to the log tree, but
distinguished by the fact that not all parent nodes have two children. In this
representation, "leaf" nodes are stored in even-numbered indices, while
"intermediate" nodes are stored in odd-numbered indices:</t>
        <figure>
          <name>A binary tree constructed from 14 entries in a log</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="392" viewBox="0 0 392 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 144,112 L 144,128" fill="none" stroke="black"/>
                <path d="M 240,48 L 240,64" fill="none" stroke="black"/>
                <path d="M 336,112 L 336,128" fill="none" stroke="black"/>
                <path d="M 160,64 L 320,64" fill="none" stroke="black"/>
                <path d="M 112,128 L 176,128" fill="none" stroke="black"/>
                <path d="M 304,128 L 368,128" fill="none" stroke="black"/>
                <path d="M 104,176 L 112,192" fill="none" stroke="black"/>
                <path d="M 176,128 L 184,144" fill="none" stroke="black"/>
                <path d="M 200,176 L 208,192" fill="none" stroke="black"/>
                <path d="M 296,176 L 304,192" fill="none" stroke="black"/>
                <path d="M 320,64 L 328,80" fill="none" stroke="black"/>
                <path d="M 368,128 L 376,144" fill="none" stroke="black"/>
                <path d="M 80,192 L 88,176" fill="none" stroke="black"/>
                <path d="M 104,144 L 112,128" fill="none" stroke="black"/>
                <path d="M 152,80 L 160,64" fill="none" stroke="black"/>
                <path d="M 176,192 L 184,176" fill="none" stroke="black"/>
                <path d="M 272,192 L 280,176" fill="none" stroke="black"/>
                <path d="M 296,144 L 304,128" fill="none" stroke="black"/>
                <path d="M 368,192 L 376,176" fill="none" stroke="black"/>
                <g class="text">
                  <text x="240" y="36">X</text>
                  <text x="144" y="100">X</text>
                  <text x="336" y="100">X</text>
                  <text x="96" y="164">X</text>
                  <text x="192" y="164">X</text>
                  <text x="288" y="164">X</text>
                  <text x="384" y="164">X</text>
                  <text x="72" y="212">X</text>
                  <text x="120" y="212">X</text>
                  <text x="168" y="212">X</text>
                  <text x="216" y="212">X</text>
                  <text x="264" y="212">X</text>
                  <text x="312" y="212">X</text>
                  <text x="360" y="212">X</text>
                  <text x="28" y="244">Index:</text>
                  <text x="72" y="244">0</text>
                  <text x="96" y="244">1</text>
                  <text x="120" y="244">2</text>
                  <text x="144" y="244">3</text>
                  <text x="168" y="244">4</text>
                  <text x="192" y="244">5</text>
                  <text x="216" y="244">6</text>
                  <text x="240" y="244">7</text>
                  <text x="264" y="244">8</text>
                  <text x="288" y="244">9</text>
                  <text x="308" y="244">10</text>
                  <text x="332" y="244">11</text>
                  <text x="356" y="244">12</text>
                  <text x="380" y="244">13</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                             X
                             |
                   .---------+---------.
                  /                     \
                 X                       X
                 |                       |
             .---+---.               .---+---.
            /         \             /         \
           X           X           X           X
          / \         / \         / \         /
         /   \       /   \       /   \       /
        X     X     X     X     X     X     X

Index:  0  1  2  3  4  5  6  7  8  9 10 11 12 13
]]></artwork>
          </artset>
        </figure>
        <t>Following the structure of this binary tree when executing searches makes
auditing the Transparency Log much more efficient because users can easily
reason about which nodes will be accessed when conducting a search. As such,
only nodes along a specific search path need to be checked for correctness.</t>
        <t>The following Python code demonstrates the computations used for following this
tree structure:</t>
        <sourcecode type="python"><![CDATA[
# The exponent of the largest power of 2 less than x. Equivalent to:
#   int(math.floor(math.log(x, 2)))
def log2(x):
    if x == 0:
        return 0
    k = 0
    while (x >> k) > 0:
        k += 1
    return k-1

# The level of a node in the tree. Leaves are level 0, their parents
# are level 1, etc. If a node's children are at different levels,
# then its level is the max level of its children plus one.
def level(x):
    if x & 0x01 == 0:
        return 0
    k = 0
    while ((x >> k) & 0x01) == 1:
        k += 1
    return k

# The root index of a search if the log has `n` entries.
def root(n):
    return (1 << log2(n)) - 1

# The left child of an intermediate node.
def left(x):
    k = level(x)
    if k == 0:
        raise Exception('leaf node has no children')
    return x ^ (0x01 << (k - 1))

# The right child of an intermediate node.
def right(x, n):
    k = level(x)
    if k == 0:
        raise Exception('leaf node has no children')
    x = x ^ (0x03 << (k - 1))
    while x >= n:
        x = left(x)
    return x
]]></sourcecode>
        <t>The <tt>root</tt> function returns the index in the log at which a search should
start. The <tt>left</tt> and <tt>right</tt> functions determine the subsequent index to be
accessed, depending on whether the search moves left or right.</t>
        <t>For example, in a search where the log has 50 entries, instead of starting the
search at the typical "middle" entry of <tt>50/2 = 25</tt>, users would start at entry
<tt>root(50) = 31</tt>. If the next step in the search is to move right, the next index
to access would be <tt>right(31, 50) = 47</tt>. As more entries are added to the log,
users will consistently revisit entries 31 and 47, while they may never revisit
entry 25 after even a single new entry is added to the log.</t>
      </section>
      <section anchor="binary-ladder">
        <name>Binary Ladder</name>
        <t>When executing searches on a Transparency Log, the implicit tree described in
<xref target="implicit-binary-search-tree"/> is navigated according to a binary search. At
each individual log entry, the binary search needs to determine whether it
should move left or right. That is, it needs to determine, out of the set of
key-version pairs stored in the prefix tree, whether the highest version present
at a given log entry is greater than, equal to, or less than a target version.</t>
        <t>A <strong>binary ladder</strong> is a series of lookups in a single log entry's prefix tree,
which is used to establish whether the target version of a key is present or
not. It consists of the following lookups, stopping after the first lookup that
produces a proof of non-inclusion:</t>
        <ol spacing="normal" type="1"><li>
            <t>First, version <tt>x</tt> of the key is looked up, where <tt>x</tt> is consecutively higher
powers of two minus one (0, 1, 3, 7, ...). This is repeated until <tt>x</tt> is the
largest such value less than or equal to the target version.</t>
          </li>
          <li>
            <t>Second, the largest <tt>x</tt> that was looked up is retained, and consecutively
smaller powers of two are added to it until it equals the target version.
Each time a power of two is added, this version of the key is looked up.</t>
          </li>
        </ol>
        <t>As an example, if the target version of a key to lookup is 20, a binary ladder
would consist of the following versions: 0, 1, 3, 7, 15, 19, 20. If all of the
lookups succeed (i.e., result in proofs of inclusion), this indicates that the
target version of the key exists in the log. If the ladder stops early because a
proof of non-inclusion was produced, this indicates that the target version of
the key did not exist, as of the given log entry.</t>
        <t>When executing a search in a Transparency Log for a specific version of a key, a
binary ladder is provided for each node on the search path, verifiably guiding
the search toward the log entry where the desired key-version pair was first
inserted (and therefore, the log entry with the desired update).</t>
        <t>Requiring proof that this series of versions are present in the prefix tree,
instead of requesting proof of just version 20, ensures that all users are able
to agree on which version of the key is <em>most recent</em>, which is discussed
further in the next section.</t>
      </section>
      <section anchor="most-recent-version">
        <name>Most Recent Version</name>
        <t>Often, users wish to search for the "most recent" version of a key. That is, the
key with the highest counter possible.</t>
        <t>To determine this, users request a <strong>full binary ladder</strong> for each
node on the <strong>frontier</strong> of the log. The frontier consists of the root node of a
search, followed by the entries produced by repeatedly calling <tt>right</tt> until
reaching the last entry of the log. Using the same example of a search where the
log has 50 entries, the frontier would be entries: 31, 47, 49.</t>
        <t>A full binary ladder is similar to the binary ladder discussed in the previous
section, except that it identifies the exact highest version of a key that
exists, as of a particular log entry, rather than stopping at a target version.
It consists of the following lookups:</t>
        <ol spacing="normal" type="1"><li>
            <t>First, version <tt>x</tt> of the key is looked up, where <tt>x</tt> is a consecutively
higher power of two minus one (0, 1, 3, 7, ...). This is repeated until the
first proof of non-inclusion is produced.</t>
          </li>
          <li>
            <t>Once the first proof of non-inclusion is produced, a binary search is
conducted between the highest version that was proved to be included, and the
version that was proved to not be included. Each step of the binary search
produces either a proof of inclusion or non-inclusion, which guides the
search left or right, until it terminates.</t>
          </li>
        </ol>
        <t>For the purpose of finding the highest version possible, requesting a full
binary ladder for each entry along the frontier is functionally the same as
doing so for only the last log entry. However, inspecting the entire frontier
allows the user to verify that the search path leading to the last log entry
represents a monotonic series of version increases, which minimizes
opportunities for log misbehavior.</t>
        <t>Once the user has verified that the frontier lookups are monotonic and
determined the highest version, the user then continues a binary search for this
specific version.</t>
      </section>
      <section anchor="monitoring">
        <name>Monitoring</name>
        <t>As new entries are added to the log tree, the search path that's traversed to
find a specific version of a key may change. New intermediate nodes may become
established in between the search root and the leaf, or a new search root may be
created. The goal of monitoring a key is to efficiently ensure that, when these
new parent nodes are created, they're created correctly so that searches for the
same versions continue converging to the same entries in the log.</t>
        <t>To monitor a given search key, users maintain a small amount of state: a map
from a position in the log to a version counter. The version counter is the
highest version of the search key that's been proven to exist at that log
position. Users initially populate this map by setting the position of an entry
they've looked up, to map to the version of the key stored in that entry. A map
may track several different versions of a search key simultaneously, if a user
has been shown different versions of the same search key.</t>
        <t>To update this map, users receive the most recent tree head from the server and
follow these steps, for each entry in the map:</t>
        <ol spacing="normal" type="1"><li>
            <t>Compute the entry's direct path (in terms of the Implicit Binary Search Tree)
based on the current tree size.</t>
          </li>
          <li>
            <t>If there are no entries in the direct path that are to the right of the
current entry, then skip updating this entry (there's no new information to
update it with).</t>
          </li>
          <li>
            <t>For each entry in the direct path that's to the right of the current entry,
from low to high:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Receive and verify a binary ladder from that log entry, for the version
currently in the map. This proves that, at the indicated log entry, the
highest version present is greater than or equal to the
previously-observed version.</t>
              </li>
              <li>
                <t>If the above check was successful, remove the current position-version
pair from the map and replace it with a position-version pair
corresponding to the entry in the log that was just checked.</t>
              </li>
            </ol>
          </li>
        </ol>
        <t>This algorithm progressively moves up the tree as new intermediate/root nodes
are established and verifies that they're constructed correctly. Note that users
can often execute this process with the output of Search or Update operations
for a key, without waiting to make explicit Monitor queries.</t>
        <t>It is also worth noting that the work required to monitor several versions of
the same key scales sublinearly, due to the fact that the direct paths of the
different versions will often intersect. Intersections reduce the total number
of entries in the map and therefore the amount of work that will be needed to
monitor the key from then on.</t>
      </section>
    </section>
    <section anchor="ciphersuites">
      <name>Ciphersuites</name>
      <t>Each Transparency Log uses a single fixed ciphersuite, chosen when the log is
initially created, that specifies the following primitives to be used for
cryptographic computations:</t>
      <ul spacing="normal">
        <li>
          <t>A hash algorithm</t>
        </li>
        <li>
          <t>A signature algorithm</t>
        </li>
        <li>
          <t>A Verifiable Random Function (VRF) algorithm</t>
        </li>
      </ul>
      <t>The hash algorithm is used for computing the intermediate and root values of
hash trees. The signature algorithm is used for signatures from both the service
operator and the third party, if one is present. The VRF is used for preserving
the privacy of lookup keys. One of the VRF algorithms from <xref target="RFC9381"/> must be
used.</t>
      <t>Ciphersuites are represented with the CipherSuite type. The ciphersuites are
defined in <xref target="kt-ciphersuites"/>.</t>
    </section>
    <section anchor="cryptographic-computations">
      <name>Cryptographic Computations</name>
      <section anchor="verifiable-random-function">
        <name>Verifiable Random Function</name>
        <t>Each version of a search key that's inserted in a log will have a unique
representation in the prefix tree. This is computed by providing the combined
search key and version as inputs to the VRF:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque search_key<0..2^8-1>;
  uint32 version;
} VrfInput;
]]></sourcecode>
      </section>
      <section anchor="commitment">
        <name>Commitment</name>
        <t>As discussed in <xref target="combined-tree"/>, commitments are stored in the leaves of the
log tree and correspond to updates of a key's value. Commitments are computed
with HMAC <xref target="RFC2104"/>, using the hash function specified by the ciphersuite. To
produce a new commitment, the application generates a random 16 byte value
called <tt>opening</tt> and computes:
<!-- TODO Opening size should be determined by ciphersuite -->
        </t>
        <sourcecode type="pseudocode"><![CDATA[
commitment = HMAC(fixedKey, CommitmentValue)
]]></sourcecode>
        <t>where <tt>fixedKey</tt> is the 16 byte hex-decoded value:</t>
        <artwork><![CDATA[
d821f8790d97709796b4d7903357c3f5
]]></artwork>
        <!-- TODO This is weird but nobody has ever said anything. Keep it? Do better? -->

<t>and CommitmentValue is specified as:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque opening<16>;
  opaque search_key<0..2^8-1>;
  UpdateValue update;
} CommitmentValue;
]]></sourcecode>
        <t>This fixed key allows the HMAC function, and thereby the commitment scheme, to
be modeled as a random oracle. The <tt>search_key</tt> field of CommitmentValue
contains the search key being updated (the search key provided by the user, not
the VRF output) and the <tt>update</tt> field contains the value of the update.</t>
        <t>The output value <tt>commitment</tt> may be published, while <tt>opening</tt> should be kept
private until the commitment is meant to be revealed.</t>
      </section>
      <section anchor="prefix-tree-1">
        <name>Prefix Tree</name>
        <t>The leaf nodes of a prefix tree are serialized as:</t>
        <sourcecode type="tls"><![CDATA[
struct {
    opaque key_version<VRF.Nh>;
} PrefixLeaf;
]]></sourcecode>
        <t>where <tt>key_version</tt> is the VRF output for the key-version pair, and <tt>VRF.Nh</tt> is
the output size of the ciphersuite VRF in bytes.</t>
        <t>The parent nodes of a prefix tree are serialized as:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque value<Hash.Nh>;
} PrefixParent;
]]></sourcecode>
        <t>where <tt>Hash.Nh</tt> is the output length of the ciphersuite hash function. The value
of a parent node is computed by hashing together the values of its left and
right children:</t>
        <sourcecode type="pseudocode"><![CDATA[
parent.value = Hash(0x01 ||
                   nodeValue(parent.leftChild) ||
                   nodeValue(parent.rightChild))

nodeValue(node):
  if node.type == emptyNode:
    return make([]byte, Hash.Nh)
  else if node.type == leafNode:
    return Hash(0x00 || node.key_version)
  else if node.type == parentNode:
    return node.value
]]></sourcecode>
        <t>where <tt>Hash</tt> denotes the ciphersuite hash function.</t>
      </section>
      <section anchor="crypto-log-tree">
        <name>Log Tree</name>
        <t>The leaf and parent nodes of a log tree are serialized as:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque commitment<Hash.Nh>;
  opaque prefix_tree<Hash.Nh>;
} LogLeaf;

struct {
  opaque value<Hash.Nh>;
} LogParent;
]]></sourcecode>
        <t>The value of a parent node is computed by hashing together the values of its
left and right children:</t>
        <sourcecode type="pseudocode"><![CDATA[
parent.value = Hash(hashContent(parent.leftChild) ||
                    hashContent(parent.rightChild))

hashContent(node):
  if node.type == leafNode:
    return 0x00 || nodeValue(node)
  else if node.type == parentNode:
    return 0x01 || nodeValue(node)

nodeValue(node):
  if node.type == leafNode:
    return Hash(node.commitment || node.prefix_tree)
  else if node.type == parentNode:
    return node.value
]]></sourcecode>
      </section>
      <section anchor="tree-head-signature">
        <name>Tree Head Signature</name>
        <t>The head of a Transparency Log, which represents the log's most recent state, is
represented as:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint64 tree_size;
  opaque signature<0..2^16-1>;
} TreeHead;
]]></sourcecode>
        <t>where <tt>tree_size</tt> counts the number of entries in the log tree. If the
Transparency Log is deployed with Third-party Management then the public key
used to verify the signature belongs to the third-party manager; otherwise the
public key used belongs to the service operator.</t>
        <t>The signature itself is computed over a <tt>TreeHeadTBS</tt> structure, which
incorporates the log's current state as well as long-term log configuration:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  contactMonitoring(1),
  thirdPartyManagement(2),
  thirdPartyAuditing(3),
  (255)
} DeploymentMode;

struct {
  CipherSuite ciphersuite;
  DeploymentMode mode;
  opaque signature_public_key<0..2^16-1>;
  opaque vrf_public_key<0..2^16-1>;

  select (Configuration.mode) {
    case contactMonitoring:
    case thirdPartyManagement:
      opaque leaf_public_key<0..2^16-1>;
    case thirdPartyAuditing:
      opaque auditor_public_key<0..2^16-1>;
  };
} Configuration;

struct {
  Configuration config;
  uint64 tree_size;
  opaque root_value<Hash.Nh>;
} TreeHeadTBS;
]]></sourcecode>
      </section>
    </section>
    <section anchor="tree-proofs">
      <name>Tree Proofs</name>
      <section anchor="log-tree-1">
        <name>Log Tree</name>
        <t>An inclusion proof for a single leaf in a log tree is given by providing the
copath values of a leaf. Similarly, a bulk inclusion proof for any number of
leaves is given by providing the fewest node values that can be hashed together
with the specified leaves to produce the root value. Such a proof is encoded as:</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque NodeValue<Hash.Nh>;

struct {
  NodeValue elements<0..2^16-1>;
} InclusionProof;
]]></sourcecode>
        <t>Each <tt>NodeValue</tt> is a uniform size, computed by passing the relevant <tt>LogLeaf</tt>
or <tt>LogParent</tt> structures through the <tt>nodeValue</tt> function in
<xref target="crypto-log-tree"/>. The contents of the <tt>elements</tt> array is kept in
left-to-right order: if a node is present in the root's left subtree, its value
must be listed before any values provided from nodes that are in the root's
right subtree, and so on recursively.</t>
        <t>Consistency proofs are encoded similarly:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  NodeValue elements<0..2^8-1>;
} ConsistencyProof;
]]></sourcecode>
        <t>Again, each <tt>NodeValue</tt> is computed by passing the relevant <tt>LogLeaf</tt> or
<tt>LogParent</tt> structure through the <tt>nodeValue</tt> function. The nodes chosen
correspond to those output by the algorithm in Section 2.1.2 of <xref target="RFC6962"/>.</t>
      </section>
      <section anchor="prefix-tree-2">
        <name>Prefix Tree</name>
        <t>A proof from a prefix tree authenticates that a set of values are either members
of, or are not members of, the total set of values represented by the prefix
tree. Such a proof is encoded as:</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  inclusion(1),
  nonInclusionLeaf(2),
  nonInclusionParent(3),
} PrefixSearchResultType;

struct {
  PrefixSearchResultType result_type;
  select (PrefixSearchResult.result_type) {
    case nonInclusionLeaf:
      PrefixLeaf leaf;
  };
  uint8 depth;
} PrefixSearchResult;

struct {
  PrefixSearchResult results<0..2^8-1>;
  NodeValue elements<0..2^16-1>;
} PrefixProof;
]]></sourcecode>
        <t>The <tt>results</tt> field contains the search result for each individual value. It is
sorted lexicographically by corresponding value. The <tt>result_type</tt> field of each
<tt>PrefixSearchResult</tt> struct indicates what the terminal node of the search for
that value was:</t>
        <ul spacing="normal">
          <li>
            <t><tt>inclusion</tt> for a leaf node matching the requested value.</t>
          </li>
          <li>
            <t><tt>nonInclusionLeaf</tt> for a leaf node not matching the requested value. In this
case, the terminal node's value is provided given that it can not be inferred.</t>
          </li>
          <li>
            <t><tt>nonInclusionParent</tt> for a parent node that lacks the desired child.</t>
          </li>
        </ul>
        <t>The <tt>depth</tt> field indicates the depth of the terminal node of the search, and is
provided to assist proof verification.</t>
        <t>The <tt>elements</tt> array consists of the fewest node values that can be hashed
together with the provided leaves to produce the root. The contents of the
<tt>elements</tt> array is kept in left-to-right order: if a node is present in the
root's left subtree, its value must be listed before any values provided from
nodes that are in the root's right subtree, and so on recursively. In the event
that a node is not present, an all-zero byte string of length <tt>Hash.Nh</tt> is
listed instead.</t>
        <t>The proof is verified by hashing together the provided elements, in the
left/right arrangement dictated by the tree structure, and checking that the
result equals the root value of the prefix tree.</t>
      </section>
      <section anchor="proof-combined-tree">
        <name>Combined Tree</name>
        <t>A proof from a combined log and prefix tree follows the execution of a binary
search through the leaves of the log tree, as described in <xref target="combined-tree"/>. It
is serialized as follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque proof<VRF.Np>;
} VRFProof;

struct {
  PrefixProof prefix_proof;
  opaque commitment<Hash.Nh>;
} ProofStep;

struct {
  optional<uint32> version;
  VRFProof vrf_proofs<0..2^8-1>;
  ProofStep steps<0..2^8-1>;
  InclusionProof inclusion;
} SearchProof;
]]></sourcecode>
        <t>If searching for the most recent version of a key, the most recent version is
provided in <tt>version</tt>. If searching for a specific version, this field is
omitted.</t>
        <t>Each element of <tt>vrf_proofs</tt> contains the output of evaluating the VRF on a
different version of the search key. The versions chosen correspond either to
the binary ladder described in <xref target="binary-ladder"/> (when searching for a specific
version of a key), or to the full binary ladder described in
<xref target="most-recent-version"/> (when searching for the most recent version of a key).
The proofs are sorted from lowest version to highest version.</t>
        <t>Each <tt>ProofStep</tt> structure in <tt>steps</tt> is one log entry that was inspected as
part of the binary search. The first step corresponds to the "middle" leaf of
the log tree (calculated with the <tt>root</tt> function in
<xref target="implicit-binary-search-tree"/>). From there, each subsequent step moves left or
right in the tree, according to the procedure discussed in <xref target="binary-ladder"/> and
<xref target="most-recent-version"/>.</t>
        <t>The <tt>prefix_proof</tt> field of a <tt>ProofStep</tt> is the output of executing a binary
ladder, excluding any ladder steps for which a proof of inclusion is expected,
and a proof of inclusion was already provided in a previous <tt>ProofStep</tt> for a
log entry to the left of the current one.</t>
        <t>The <tt>commitment</tt> field of a <tt>ProofStep</tt> contains the commitment to the update at
that leaf. The <tt>inclusion</tt> field of <tt>SearchProof</tt> contains a batch inclusion
proof for all of the leaves accessed by the binary search.</t>
        <t>The proof can be verified by checking that:</t>
        <ol spacing="normal" type="1"><li>
            <t>The elements of <tt>steps</tt> represent a monotonic series over the leaves of the
log, and</t>
          </li>
          <li>
            <t>The <tt>steps</tt> array has the expected number of entries (no more or less than
are necessary to execute the binary search).
<!-- TODO Specify this verification in MUCH more detail -->
            </t>
          </li>
        </ol>
        <t>Once the validity of the search steps has been established, the verifier can
compute the root of each prefix tree represented by a <tt>prefix_proof</tt> and combine
it with the corresponding <tt>commitment</tt> to obtain the value of each leaf. These
leaf values can then be combined with the proof in <tt>inclusion</tt> to check that the
output matches the root of the log tree.</t>
      </section>
    </section>
    <section anchor="update-format">
      <name>Update Format</name>
      <t>The updates committed to by a combined tree structure contain the new value of a
search key, along with additional information depending on the deployment mode
of the Transparency Log. They are serialized as follows:</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
  select (Configuration.mode) {
    case thirdPartyManagement:
      opaque signature<0..2^16-1>;
  };
} UpdatePrefix;

struct {
  UpdatePrefix prefix;
  opaque value<0..2^32-1>;
} UpdateValue;
]]></sourcecode>
      <t>The <tt>value</tt> field contains the new value of the search key.</t>
      <t>In the event that third-party management is used, the <tt>prefix</tt> field contains a
signature from the service operator, using the public key from
<tt>Configuration.leaf_public_key</tt>, over the following structure:</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque search_key<0..2^8-1>;
  uint32 version;
  opaque value<0..2^32-1>;
} UpdateTBS;
]]></sourcecode>
      <t>The <tt>search_key</tt> field contains the search key being updated (the search key
provided by the user, not the VRF output), <tt>version</tt> contains the new key
version, and <tt>value</tt> contains the same contents as <tt>UpdateValue.value</tt>. Clients
<bcp14>MUST</bcp14> successfully verify this signature before consuming <tt>UpdateValue.value</tt>.</t>
    </section>
    <section anchor="user-operations">
      <name>User Operations</name>
      <t>The basic user operations are organized as a request-response protocol between a
user and the Transparency Log operator.</t>
      <t>Generally, users <bcp14>MUST</bcp14> retain the most recent <tt>TreeHead</tt> they've successfully
verified as part of any query response, and populate the <tt>last</tt> field of any
query request with the <tt>tree_size</tt> from this <tt>TreeHead</tt>. This ensures that all
operations performed by the user return consistent results.</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
  TreeHead tree_head;
  optional<ConsistencyProof> consistency;
  select (Configuration.mode) {
    case thirdPartyAuditing:
      AuditorTreeHead auditor_tree_head;
  };
} FullTreeHead;
]]></sourcecode>
      <t>If <tt>last</tt> is present, then the Transparency Log <bcp14>MUST</bcp14> provide a consistency proof
between the current tree and the tree when it was this size, in the
<tt>consistency</tt> field of <tt>FullTreeHead</tt>.</t>
      <section anchor="search">
        <name>Search</name>
        <t>Users initiate a Search operation by submitting a SearchRequest to the
Transparency Log containing the key that they're interested in. Users can
optionally specify a version of the key that they'd like to receive, if not the
most recent one.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  optional<uint32> last;

  opaque search_key<0..2^8-1>;
  optional<uint32> version;
} SearchRequest;
]]></sourcecode>
        <t>In turn, the Transparency Log responds with a SearchResponse structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  FullTreeHead full_tree_head;

  SearchProof search;
  opaque opening<16>;
  UpdateValue value;
} SearchResponse;
]]></sourcecode>
        <t>Users verify a search response by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Evaluate the search proof in <tt>search</tt> according to the steps in
<xref target="proof-combined-tree"/>. This will produce a verdict as to whether the search
was executed correctly and also a candidate root value for the tree. If it's
determined that the search was executed incorrectly, abort with an error.</t>
          </li>
          <li>
            <t>With the candidate root value for the tree, verify the given <tt>FullTreeHead</tt>.</t>
          </li>
          <li>
            <t>Verify that the commitment in the terminal search step opens to
<tt>SearchResponse.value</tt> with opening <tt>SearchResponse.opening</tt>.</t>
          </li>
        </ol>
        <t>Depending on the deployment mode of the Transparency Log, the <tt>value</tt> field may
or may not require additional verification, specified in <xref target="update-format"/>,
before its contents may be consumed.</t>
      </section>
      <section anchor="update">
        <name>Update</name>
        <t>Users initiate an Update operation by submitting an UpdateRequest to the
Transparency Log containing the new key and value to store.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  optional<uint32> last;

  opaque search_key<0..2^8-1>;
  opaque value<0..2^32-1>;
} UpdateRequest;
]]></sourcecode>
        <t>If the request passes application-layer policy checks, the Transparency Log adds
the new key-value pair to the log and returns an UpdateResponse structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  FullTreeHead full_tree_head;

  SearchProof search;
  opaque opening<16>;
  UpdatePrefix prefix;
} UpdateResponse;
]]></sourcecode>
        <t>Users verify the UpdateResponse as if it were a SearchResponse for the most
recent version of <tt>search_key</tt>. To aid verification, the update response
provides the <tt>UpdatePrefix</tt> structure necessary to reconstruct the
<tt>UpdateValue</tt>.</t>
      </section>
      <section anchor="monitor">
        <name>Monitor</name>
        <t>Users initiate a Monitor operation by submitting a MonitorRequest to the
Transparency Log containing information about the keys they wish to monitor.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque search_key<0..2^8-1>;
  uint32 highest_version;
  uint64 entries<0..2^8-1>;
} MonitorKey;

struct {
  optional<uint32> last;

  MonitorKey owned_keys<0..2^8-1>;
  MonitorKey contact_keys<0..2^8-1>;
} MonitorRequest;
]]></sourcecode>
        <t>Users include each of the keys that they own in <tt>owned_keys</tt>. If the
Transparency Log is deployed with Contact Monitoring (or simply if the user
wants a higher degree of confidence in the log), they also include any keys
they've looked up in <tt>contact_keys</tt>.</t>
        <t>Each <tt>MonitorKey</tt> structure contains the key being monitored in <tt>search_key</tt>,
the highest version of the key that the user has observed in <tt>highest_version</tt>,
and a list of <tt>entries</tt> in the log tree corresponding to the keys of the map
described in <xref target="monitoring"/>.</t>
        <t>The Transparency Log verifies the MonitorRequest by following these steps, for
each <tt>MonitorKey</tt> structure:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that the requested keys in <tt>owned_keys</tt> and <tt>contact_keys</tt> are all
distinct.</t>
          </li>
          <li>
            <t>Verify that the user owns every key in <tt>owned_keys</tt>, and is allowed (or was
previously allowed) to lookup every key in <tt>contact_keys</tt>, based on the
application's policy.</t>
          </li>
          <li>
            <t>Verify that the <tt>highest_version</tt> for each key is less than or equal to the
most recent version of each key.</t>
          </li>
          <li>
            <t>Verify that each <tt>entries</tt> array is sorted in ascending order, and that all
entries are within the bounds of the log.</t>
          </li>
          <li>
            <t>Verify each entry lies on the direct path of different versions of the key.</t>
          </li>
        </ol>
        <t>If the request is valid, the Transparency Log responds with a MonitorResponse
structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint32 version;
  VRFProof vrf_proofs<0..2^8-1>;
  ProofStep steps<0..2^8-1>;
} MonitorProof;

struct {
  FullTreeHead full_tree_head;
  MonitorProof owned_proofs<0..2^8-1>;
  MonitorProof contact_proofs<0..2^8-1>;
  InclusionProof inclusion;
} MonitorResponse;
]]></sourcecode>
        <t>The elements of <tt>owned_proofs</tt> and <tt>contact_proofs</tt> correspond one-to-one with
the elements of <tt>owned_keys</tt> and <tt>contact_keys</tt>. Each <tt>MonitorProof</tt> in
<tt>contact_proofs</tt> is meant to convince the user that the key they looked up is
still properly included in the log and has not been surreptitiously concealed.
Each <tt>MonitorProof</tt> in <tt>owned_proofs</tt> conveys the same guarantee that no past
lookups have been concealed, and also proves that <tt>MonitorProof.version</tt> is the
most recent version of the key.</t>
        <t>The <tt>version</tt> field of a <tt>MonitorProof</tt> contains the version that was used for
computing the binary ladder, and therefore the highest version of the key that
will be proven to exist. The <tt>vrf_proofs</tt> field contains VRF proofs for
different versions of the search key, starting at the first version that's
different between the binary ladders for <tt>MonitorKey.highest_version</tt> and
<tt>MonitorProof.version</tt>.</t>
        <t>The <tt>steps</tt> field of a <tt>MonitorProof</tt> contains the proofs required to update the
user's monitoring data following the algorithm in <xref target="monitoring"/>. That is, each
<tt>ProofStep</tt> of a <tt>MonitorProof</tt> contains a binary ladder for the version
<tt>MonitorProof.version</tt>. The steps are provided in the order that they're
consumed by the monitoring algorithm. If same proof is consumed by the
monitoring algorithm multiple times, it is provided in the <tt>MonitorProof</tt>
structure only the first time.</t>
        <t>For <tt>MonitorProof</tt> structures in <tt>owned_keys</tt>, it is also important to prove
that <tt>MonitorProof.version</tt> is the highest version of the key available. This
means that such a <tt>MonitorProof</tt> must contains full binary ladders for
<tt>MonitorProof.version</tt> along the frontier of the log. As such, any <tt>ProofStep</tt>
under the <tt>owned_keys</tt> field that's along the frontier of the log includes a
full binary ladder for <tt>MonitorProof.version</tt> instead of a regular binary
ladder. For additional entries on the frontier of the log that are to the right
of the leftmost frontier entry already provided, an additional <tt>ProofStep</tt> is
added to <tt>MonitorProof</tt>. This additional <tt>ProofStep</tt> contains only the proofs of
non-inclusion from a full binary ladder.</t>
        <t>Users verify a MonitorResponse by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that the lengths of <tt>owned_proofs</tt> and <tt>contact_proofs</tt> are the same
as the lengths of <tt>owned_keys</tt> and <tt>contact_keys</tt>.</t>
          </li>
          <li>
            <t>For each <tt>MonitorProof</tt> structure, verify that <tt>MonitorProof.version</tt> is
greater than or equal to the highest version of the key that's been
previously observed.</t>
          </li>
          <li>
            <t>For each <tt>MonitorProof</tt> structure, evalute the monitoring algorithm in
<xref target="monitoring"/>. Abort with an error if the monitoring algorithm detects that
the tree is constructed incorrectly, or if there are fewer or more steps
provided than would be expected (keeping in mind that extra steps may be
provided along the frontier of the log, if a <tt>MonitorProof</tt> is a member of
<tt>owned_keys</tt>).</t>
          </li>
          <li>
            <t>Construct a candidate root value for the tree by combining the
<tt>PrefixProof</tt> and commitment of <tt>ProofStep</tt>, with the provided inclusion
proof.</t>
          </li>
          <li>
            <t>With the candidate root value, verify the provided <tt>FullTreeHead</tt>.</t>
          </li>
        </ol>
        <t>Some information is omitted from MonitorResponse in the interest of efficiency,
due to the fact that the user would have already seen and verified it as part of
conducting other queries. In particular, VRF proofs for different versions of
each search key are not provided, given that these can be cached from the
original Search or Update query.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <!-- TODO Security -->
<!-- TODO Say that transport layer should be encrypted, provide auth -->

</section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests the creation of the following new IANA registries:</t>
      <ul spacing="normal">
        <li>
          <t>KT Ciphersuites (<xref target="kt-ciphersuites"/>)</t>
        </li>
      </ul>
      <t>All of these registries should be under a heading of "Key Transparency",
and assignments are made via the Specification Required policy <xref target="RFC8126"/>. See
<xref target="de"/> for additional information about the KT Designated Experts (DEs).</t>
      <t>RFC EDITOR: Please replace XXXX throughout with the RFC number assigned to
this document</t>
      <section anchor="kt-ciphersuites">
        <name>KT Ciphersuites</name>
        <sourcecode type="tls-presentation"><![CDATA[
uint16 CipherSuite;
]]></sourcecode>
        <!-- TODO -->

</section>
      <section anchor="de">
        <name>KT Designated Expert Pool</name>
        <!-- TODO -->

</section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-keytrans-architecture">
          <front>
            <title>Key Transparency Architecture</title>
            <author fullname="Brendan McMillion" initials="B." surname="McMillion">
         </author>
            <date day="4" month="March" year="2024"/>
            <abstract>
              <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>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-01"/>
        </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>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </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="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>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key. The cryptographic strength of HMAC depends on the properties of the underlying hash function. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="Merkle2" target="https://eprint.iacr.org/2021/453">
          <front>
            <title>Merkle^2: A Low-Latency Transparency Log System</title>
            <author initials="Y." surname="Hu" fullname="Yuncong Hu">
              <organization/>
            </author>
            <author initials="K." surname="Hooshmand" fullname="Kian Hooshmand">
              <organization/>
            </author>
            <author initials="H." surname="Kalidhindi" fullname="Harika Kalidhindi">
              <organization/>
            </author>
            <author initials="S. J." surname="Yang" fullname="Seung Jin Yang">
              <organization/>
            </author>
            <author initials="R. A." surname="Popa" fullname="Raluca Ada Popa">
              <organization/>
            </author>
            <date year="2021" month="April" day="08"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 1198?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <!-- TODO acknowledge. -->

</section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19aXMbyZXg9/wVOeyIFUkDaJKS+mAfHllSu7UttbSS2m6H
x24UgQJZS6AKrirwsEz/lv0t+8v2nZkvqwokZc84NmK3Y0YGgao8Xr77yvF4
7NqiXebHfueH/Nq/r7OyWWd1Xs6u/Zu6aqtZtdxxs6zNT6v6+tgX5aJybl7N
ymwFL83rbNGOz/PrFl8cr2arYrksqnK8lnfHBweu2ZysiqaBr9vrNbz04vn7
79zFsX/oYKLs2L97/tRdVvX5aV1t1sf+h+d/eP/2yY/v/O/hu6I89b/F791F
Xm7yY+f9adGebU5gwb+BZR4dHB58mq5iB55ZwoKbFp45a9t1c/zpp/rshN+e
FFXnrU/v3MrkrF0BLFy2ac+qGlYyhom8X2yWSwYGLWielf7V7BW/u0NP5Kus
WMLPJ/xzGPnfT/GHyaxa7QwM9l2+LK78y6I8z+t0nCV9t8Df7RCurOpV1hYX
ACWH5xT+8v5VXp8v86NjGqfN6tMcgKOwydd1UbaTIpvVk6o+/fTo4Ojw00eP
H/LDgh08wp+Pjv0T/7K6HL8ECCOSJBjzsjr1766bNl/xiufw0LHH8cYHj8YH
X9CXAX7039jzfv+wKWcVHPb3m84PPxQA0e+rqjlbZeW88+P3WV2cZ/6HbFnM
z4pyXnR+f5dvYMz/XpT+D1l52vnxbbbczDL/ZJ75N9U6c86Nx2OfnTSAAbPW
ud+fFcvct2d5nXvYoG/yi7zOlh4wKztZFs1ZPveKHI0HeHs433FbjeF/4OOs
vl63cMwjV+dLOonltV8WLcDTZy1AD3/0Z1njT/K8BLQGDPdtBdPMNjU+Oy9g
JcXJpkUigGXQ8Jsmr916A/PPPCArz9tsZmdmxol/0vjM13mzWbYjfLXJzUpx
L9UCFuCbFjDRXWyWJWzsBDdb+Ty7yJt5Xa3XOO3JtQdYwNJwydkM8K6Z+B6n
KHA6ncDhipK1N3nZFDQIrbA6rbP1Gaw/ICkAifcAwDB7G8ETPnOX2TXsIWth
Q8sClnnt8wJPBWaEEynbBh5rkSBwMbA1mD1v8xl8T28Vra9mANIajovGa4sV
ghfQCbY94VNfFfP5MgcU+MS/KNu6mm9muCznnveOFIYBelttymJGS4ft1RfF
LG88nRp8gWfFp+jzq9kZYB4CPDk1BHTZ4BO0xlXeNNkpDQEEXcIE5aKYI4pk
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

-->

</rfc>
