<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-keytrans-protocol-06" category="std" consensus="true" submissionType="IETF" tocDepth="2" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title>Key Transparency Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-protocol-06"/>
    <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="2026" month="November" day="02"/>
    <area>SEC</area>
    <workgroup>KEYTRANS Working Group</workgroup>
    <keyword>key transparency</keyword>
    <abstract>
      <?line 75?>

<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://ietf-wg-keytrans.github.io/draft-protocol/draft-ietf-keytrans-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-keytrans-protocol/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Key Transparency Working Group mailing list (<eref target="mailto:keytrans@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/keytrans/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/keytrans/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-keytrans/draft-protocol"/>.</t>
    </note>
  </front>
  <middle>
    <?line 85?>

<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="ARCH"/>.</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?>

<section anchor="presentation-language">
        <name>Presentation Language</name>
        <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 choose whichever encoding method
best suits their application. However, it is <bcp14>RECOMMENDED</bcp14> that implementations
transmit, or be able to transmit, messages in their TLS format to facilitate
interoperability. Regardless of the format that messages are transmitted
in, cryptographic computations <bcp14>MUST</bcp14> be done with the TLS presentation language
format to ensure that the protocol's security properties are maintained.</t>
        <section anchor="optional-values">
          <name>Optional Values</name>
          <t>An optional value is encoded with a presence-signaling octet, followed by the
value itself if present. When decoding, a presence octet with a value other than
0 or 1 <bcp14>MUST</bcp14> be rejected as malformed.</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
    uint8 present;
    select (present) {
        case 0: struct{};
        case 1: T value;
    };
} optional<T>;
]]></sourcecode>
        </section>
        <section anchor="variable-length-vectors">
          <name>Variable-Length Vectors</name>
          <t>Variable-length vectors are defined by specifying a subrange of legal lengths,
inclusively, using the notation &lt;floor..ceiling&gt;.  When these are encoded, the
actual length precedes the vector's contents in the byte stream.  The length
will be in the form of a number consuming as many bytes as required to hold the
vector's specified maximum length.</t>
          <t>In <xref section="3.4" sectionFormat="of" target="RFC8446"/>, the <tt>floor</tt> and <tt>ceiling</tt> in this notation
represent the minimum and maximum possible lengths of the encoded vector <em>in
bytes</em>. In this document, the <tt>floor</tt> and <tt>ceiling</tt> in this notation represent
the minimum and maximum possible number of elements in the vector. As such, the
number of bytes required to represent an encoded vector is equal to the size of
the element type multipled by the indicated length.</t>
        </section>
      </section>
    </section>
    <section anchor="tree-construction">
      <name>Tree Construction</name>
      <t>A Transparency Log is a verifiable data structure that maps a <em>label-version
pair</em> to some unstructured data such as a cryptographic public key. Labels
correspond to user identifiers, and a new version of a label is created each
time the label's associated value changes.</t>
      <t>KT uses a <em>prefix tree</em> to store a mapping from each label-version pair
to a commitment to the label's value at that version. Every time the prefix
tree changes, its new root hash and the current timestamp are stored in a <em>log
tree</em>. The benefit of the prefix tree is that it is easily searchable and the
benefit of the log tree is that it can easily be verified to be append-only. The
data structure powering KT combines a log tree and a prefix tree, and is called
the <em>combined tree</em>.</t>
      <t>This section describes the operation of prefix trees, log trees, and the
combined tree structure, at a high level. More precise algorithms for computing
the intermediate and root values of the trees are given in
<xref target="cryptographic-computations"/>.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>Trees consist of <em>nodes</em>, which have a byte string as their <em>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
particular 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>
        <t>The <em>size</em> of a tree or subtree is defined as the number of leaf nodes it
contains.</t>
      </section>
      <section anchor="log-tree">
        <name>Log Tree</name>
        <t>Log trees store 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 5 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>Leaves can have arbitrary data as their value, and are frequently referred to as
"log entries" later in the document. 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 previous version.</t>
        <t>Inclusion and consistency proofs in KT differ from similar protocols in that
proofs only ever contain the values of nodes that are the head of a balanced
subtree. Whenever the value of the head of a non-balanced subtree is needed by a
verifier, the prover breaks down the non-balanced subtree into the
smallest-possible number of balanced subtrees and provides the value of the head
of each. This allows verifiers to cache a larger number of intermediate values
than would otherwise be possible, reducing the size of subsequent responses.</t>
        <t>As a result, an inclusion proof for a leaf is given by providing the copath
values of the leaf with any non-balanced subtrees broken down as mentioned. The
proof is verified by hashing the leaf value together with the copath values,
re-computing the head values of non-balanced subtrees where needed, and checking
that the result equals the root value of the log.</t>
        <figure>
          <name>Illustration of an inclusion proof. To verify that leaf 2 is included in the tree, the prover provides the verifier with the values of leaf 2's copath. These nodes are 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 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>When requesting a consistency proof, verifiers are expected to have retained the
head values of the largest-possible balanced subtrees (these will later be
defined as the "full subtrees") of the previous version of the log. A
consistency proof then consists of the minimum set of node values that are
necessary to compute the root value of the new version of the log from the
values that the verifier retained.</t>
        <figure>
          <name>Illustration of a consistency proof between a log with 5 and with 7 leaves respectively. The verifier is expected to already have the values (X), so the prover provides the verifier with the values of the nodes marked [X]. By combining these, the verifier is able to compute the new root value of the log.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="376" viewBox="0 0 376 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 360,160 L 360,192" 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 344,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 344,128 L 360,160" fill="none" stroke="black"/>
                <path d="M 320,64 L 328,80" 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"/>
                <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="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="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>
                  <text x="360" y="244">6</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                             X
                             |
                   .---------+---------.
                  /                     \
                (X)                      X
                 |                       |
             .---+---.               .---+.
            /         \             /      \
           X           X           X        |
          / \         / \         / \       |
         /   \       /   \       /   \      |
        X     X     X     X    (X)   [X]   [X]

Index:  0     1     2     3     4     5     6
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="prefix-tree">
        <name>Prefix Tree</name>
        <t>Prefix trees store a mapping between search keys and their corresponding values,
with the ability to efficiently prove that a search key's value was looked up
correctly.</t>
        <t>Each leaf node in a prefix tree represents a specific mapping from search key to
value, while each parent node represents some prefix which all search keys in
the subtree headed by that node have in common. The subtree headed by a parent's
left child contains all search keys that share its prefix followed by an
additional 0 bit, while the subtree headed by a parent's right child contains
all search keys 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 search keys that begin with a 0 bit, while the right
child contains all search keys 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 search key 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
search key), or a parent node that lacks the desired child.</t>
        <figure>
          <name>A prefix tree containing five entries.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="296" viewBox="0 0 296 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 104,112 L 104,144" fill="none" stroke="black"/>
                <path d="M 176,48 L 176,64" fill="none" stroke="black"/>
                <path d="M 240,112 L 240,128" fill="none" stroke="black"/>
                <path d="M 272,160 L 272,192" fill="none" stroke="black"/>
                <path d="M 112,64 L 224,64" fill="none" stroke="black"/>
                <path d="M 216,128 L 256,128" fill="none" stroke="black"/>
                <path d="M 112,176 L 120,192" fill="none" stroke="black"/>
                <path d="M 208,176 L 216,192" fill="none" stroke="black"/>
                <path d="M 224,64 L 232,80" fill="none" stroke="black"/>
                <path d="M 256,128 L 272,160" fill="none" stroke="black"/>
                <path d="M 104,80 L 112,64" fill="none" stroke="black"/>
                <path d="M 88,192 L 96,176" fill="none" stroke="black"/>
                <path d="M 184,192 L 192,176" fill="none" stroke="black"/>
                <path d="M 208,144 L 216,128" fill="none" stroke="black"/>
                <g class="text">
                  <text x="176" y="36">X</text>
                  <text x="104" y="100">0</text>
                  <text x="240" y="100">1</text>
                  <text x="104" y="164">0</text>
                  <text x="200" y="164">0</text>
                  <text x="20" y="212">Key:</text>
                  <text x="80" y="212">00010</text>
                  <text x="128" y="212">00101</text>
                  <text x="176" y="212">10001</text>
                  <text x="224" y="212">10111</text>
                  <text x="272" y="212">11011</text>
                  <text x="28" y="228">Value:</text>
                  <text x="96" y="228">A</text>
                  <text x="144" y="228">B</text>
                  <text x="192" y="228">C</text>
                  <text x="240" y="228">D</text>
                  <text x="288" y="228">E</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                     X
                     |
             .-------+-----.
            /               \
            0                1
            |                |
            |             .--+-.
            |            /      \
            0           0        |
           / \         / \       |
          /   \       /   \      |
Key:   00010 00101 10001 10111 11011
Value:     A     B     C     D     E
]]></artwork>
          </artset>
        </figure>
        <t>New key-value pairs 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 search key, 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 search key and the existing
search key.</t>
        <t>An existing key-value pair may be removed from the tree by removing the
corresponding leaf node. If the removed leaf's sibling is a parent node, no
other changes are made. If the removed leaf's sibling is another leaf, the
remaining leaf replaces its parent, moving it up one level in the tree. This is
repeated until the remaining leaf either has an existing sibling or becomes the
root. This removes any intermediate parent nodes that were previously necessary
only to separate the two leaves, resulting in the same tree as if the key-value
pair had never been added. As a result, the prefix tree is <em>history
independent</em>, meaning that it depends only on the key-value pairs it currently
contains and not the history of additions and removals.</t>
        <figure>
          <name>The previous prefix tree after adding the key-value pair: 01101 -&gt; F.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="344" viewBox="0 0 344 240" 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 176,160 L 176,192" fill="none" stroke="black"/>
                <path d="M 216,48 L 216,64" fill="none" stroke="black"/>
                <path d="M 288,112 L 288,128" fill="none" stroke="black"/>
                <path d="M 320,160 L 320,192" fill="none" stroke="black"/>
                <path d="M 160,64 L 272,64" fill="none" stroke="black"/>
                <path d="M 120,128 L 160,128" fill="none" stroke="black"/>
                <path d="M 264,128 L 304,128" fill="none" stroke="black"/>
                <path d="M 112,176 L 120,192" fill="none" stroke="black"/>
                <path d="M 160,128 L 176,160" fill="none" stroke="black"/>
                <path d="M 256,176 L 264,192" fill="none" stroke="black"/>
                <path d="M 272,64 L 280,80" fill="none" stroke="black"/>
                <path d="M 304,128 L 320,160" fill="none" stroke="black"/>
                <path d="M 88,192 L 96,176" fill="none" stroke="black"/>
                <path d="M 112,144 L 120,128" fill="none" stroke="black"/>
                <path d="M 152,80 L 160,64" fill="none" stroke="black"/>
                <path d="M 232,192 L 240,176" fill="none" stroke="black"/>
                <path d="M 256,144 L 264,128" fill="none" stroke="black"/>
                <g class="text">
                  <text x="216" y="36">X</text>
                  <text x="144" y="100">0</text>
                  <text x="288" y="100">1</text>
                  <text x="104" y="164">0</text>
                  <text x="248" y="164">0</text>
                  <text x="28" y="212">Index:</text>
                  <text x="80" y="212">00010</text>
                  <text x="128" y="212">00101</text>
                  <text x="176" y="212">01101</text>
                  <text x="224" y="212">10001</text>
                  <text x="272" y="212">10111</text>
                  <text x="320" y="212">11011</text>
                  <text x="28" y="228">Value:</text>
                  <text x="96" y="228">A</text>
                  <text x="144" y="228">B</text>
                  <text x="192" y="228">F</text>
                  <text x="240" y="228">C</text>
                  <text x="288" y="228">D</text>
                  <text x="336" y="228">E</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                          X
                          |
                   .------+------.
                  /               \
                 0                 1
                 |                 |
              .--+-.            .--+-.
             /      \          /      \
            0        |        0        |
           / \       |       / \       |
          /   \      |      /   \      |
Index: 00010 00101 01101 10001 10111 11011
Value:     A     B     F     C     D     E
]]></artwork>
          </artset>
        </figure>
        <t>The value of a leaf node is the encoded key-value pair, 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>An inclusion proof is given by providing the leaf value, along with the value of
each copath node along the search path. A non-inclusion proof is given by
providing an abridged inclusion proof that follows the path for the intended
search key, but ends either at a stand-in leaf or a leaf for a different search
key. In either case, the proof is verified by hashing together the leaf with the
copath values and checking that the result equals the root 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
show 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 show 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, based on <xref target="Merkle2"/>, each label-version pair
stored by a Transparency Log corresponds to a search key in a prefix tree. This
prefix tree maps the label-version pair's search key to a commitment to the
label's value at that version. To allow users to track changes to the prefix
tree, a log tree contains a record of each version of the prefix tree along with
the timestamp of when it was published. With some caveats, this combined
structure supports both efficient consistency proofs and can be efficiently
searched.</t>
        <t>Note that, while a Transparency Log implementation would likely maintain a
single logical prefix tree, every modification to the prefix tree changes its
root value, and the updated root value is then stored in the log tree. As part
of the protocol, the Transparency Log is often required to perform lookups in
different versions of the prefix tree. Different versions of the prefix tree are
identified by the log entry where their root value was stored.</t>
        <figure>
          <name>An example evolution of the log tree in the combined tree structure. Every new log entry added contains the timestamp T_n of when it was created and the new prefix tree root hash PT_n.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="560" viewBox="0 0 560 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 72,32 L 72,48" fill="none" stroke="black"/>
                <path d="M 360,32 L 360,48" fill="none" stroke="black"/>
                <path d="M 440,48 L 440,64" fill="none" stroke="black"/>
                <path d="M 40,48 L 112,48" fill="none" stroke="black"/>
                <path d="M 280,48 L 432,48" fill="none" stroke="black"/>
                <path d="M 200,62 L 216,62" fill="none" stroke="black"/>
                <path d="M 200,66 L 216,66" fill="none" stroke="black"/>
                <path d="M 384,64 L 480,64" fill="none" stroke="black"/>
                <path d="M 32,48 L 60,104" fill="none" stroke="black"/>
                <path d="M 112,48 L 128,80" fill="none" stroke="black"/>
                <path d="M 272,48 L 300,104" fill="none" stroke="black"/>
                <path d="M 480,64 L 488,80" fill="none" stroke="black"/>
                <path d="M 4,104 L 32,48" fill="none" stroke="black"/>
                <path d="M 244,104 L 272,48" fill="none" stroke="black"/>
                <path d="M 376,80 L 384,64" fill="none" stroke="black"/>
                <path d="M 4,104 L 60,104" fill="none" stroke="black"/>
                <path d="M 244,104 L 300,104" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="224,64 212,58.4 212,69.6" fill="black" transform="rotate(0,216,64)"/>
                <circle cx="32" cy="48" r="6" class="opendot" fill="white" stroke="black"/>
                <circle cx="72" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
                <circle cx="272" cy="48" r="6" class="opendot" fill="white" stroke="black"/>
                <circle cx="360" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
                <circle cx="440" cy="48" r="6" class="opendot" fill="white" stroke="black"/>
                <g class="text">
                  <text x="104" y="100">(T_n,</text>
                  <text x="152" y="100">PT_n)</text>
                  <text x="344" y="100">(T_n,</text>
                  <text x="392" y="100">PT_n)</text>
                  <text x="464" y="100">(T_n+1,</text>
                  <text x="528" y="100">PT_n+1)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
        o                                   o
   o----+----.                   o----------+---------o
  / \         \         ==>     / \            .------+----.
 /   \         |               /   \          /             \
/_____\   (T_n, PT_n)         /_____\   (T_n, PT_n)   (T_n+1, PT_n+1)
]]></artwork>
          </artset>
        </figure>
        <t>It's also worth noting that an arbitrary number of label-version pairs can be
added or removed from the prefix tree between subsequent log entries. That is,
the Transparency Log is not constrained to making one change to the prefix tree
per log entry. This allows changes to the prefix tree to be efficiently batched,
and batching prefix tree modifications allows Transparency Logs to achieve
significantly higher throughput than they otherwise would be able to.</t>
      </section>
    </section>
    <section anchor="updating-views-of-the-tree">
      <name>Updating Views of the Tree</name>
      <t>As users interact with the Transparency Log over time, they will see many
different root hashes as the contents of the log changes. It's necessary for
users to guarantee that the root hashes they observe are consistent with respect
to two important properties:</t>
      <ul spacing="normal">
        <li>
          <t>If root hash B is shown after root hash A, then root hash B contains all the
same log entries as A with any new log entries added to the rightmost edge of
A.</t>
        </li>
        <li>
          <t>All log entries in the range starting from the rightmost log entry of A and
ending at the rightmost log entry of B, have monotonically increasing
timestamps.</t>
        </li>
      </ul>
      <t>The first property is necessary to ensure that the Transparency Log never
removes a log entry after showing it to a user, as this would allow the
Transparency Log to remove evidence of its own misbehavior. The second property
ensures that all users have a consistent view of when each portion of the tree
was created. As will be discussed in later sections, users rely on log entry
timestamps to decide whether to continue monitoring certain labels and which
portions of the tree to skip when searching. Disagreement on when portions of
the tree were created can cause users to disagree on the value of a
label-version pair, introducing the same security issues as a fork.</t>
      <t>Proving the first property, that the log tree is append-only, can be done by
providing a consistency proof from the log tree. Proving the second property,
that newly added log entries have monotonically increasing timestamps, requires
establishing some additional structure on the log's contents.</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.</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>The implicit binary search tree containing <tt>n</tt> entries can be defined
inductively. The index of the root log entry in the implicit binary search tree
is the greatest power of two, minus one, that is less than the size of the
log. That is <tt>i_root = 2^floor(log2(n)) - 1</tt>. The left
subtree is the implicit binary search tree of size <tt>i_root</tt>, i.e. the implicit
binary search tree for all elements with a smaller index than the root. The
right subtree is the implicit binary search tree of size <tt>n-i_root-1</tt>, but
offset with <tt>i_root+1</tt>. Initially, these will be all indices larger than the
root.</t>
        <t>Users ensure that log entry timestamps are monotonic by enforcing that the
structure of this search tree holds. That is, users check that any timestamp
they observe in the root's left subtree is less than or equal to the root's
timestamp, and that any timestamp they observe in the root's right subtree is
greater than or equal to the root's timestamp, and so on recursively. Following
this tree structure ensures that users can detect misbehavior quickly while
minimizing the number of log entries that need to be checked.</t>
        <t>As an example, consider a log with 50 entries. Instead of having the root be the
typical "middle" entry of <tt>50/2 = 25</tt>, the root would be entry 31. As new log
entries are added, users that interact with the Transparency Log will
consistently verify the timestamps of other log entries against that of entry 31
until the log roughly doubles in size and a new root is established at entry 63.</t>
        <t>The protocol frequently refers to the <strong>frontier</strong> of the log, which is defined
as the root log entry followed by the root's right child, the right child's
right child, and so on until the rightmost log entry is reached. Using the same
example of a log with 50 entries, the frontier would be entries: <tt>31, 47, 49</tt>.</t>
        <t>Example code for efficiently navigating the implicit binary search tree is
provided in <xref target="appendix-implicit-search-tree"/>.</t>
      </section>
      <section anchor="update-view-algorithm">
        <name>Algorithm</name>
        <t>Users retain the following information about the last tree head they've
observed:</t>
        <ol spacing="normal" type="1"><li>
            <t>The size of the log tree (that is, the number of leaves it contained).</t>
          </li>
          <li>
            <t>The head values of the log tree's <strong>full subtrees</strong>. The full subtrees are
the balanced subtrees which are as large as possible, meaning that they do
not have another balanced subtree as their parent.</t>
          </li>
          <li>
            <t>The log entries along the frontier.</t>
          </li>
        </ol>
        <t>When users make queries to the Transparency Log, they advertise the size of the
last tree head they observed. If the Transparency Log responds with an
updated tree head, it first provides a consistency proof to show that the new
tree head is an extension of the previous one. It then also provides the
following:</t>
        <ul spacing="normal">
          <li>
            <t>In the new implicit binary search tree, compute the direct path of the log
entry with index <tt>size-1</tt>, where <tt>size</tt> is the tree size advertised by the
user. Provide the timestamp of each log entry in the direct path whose index
is greater than or equal to <tt>size</tt>.</t>
          </li>
          <li>
            <t>The last of these log entries will lie on the new tree's frontier, unless
there were no such log entries, in which case the log entry with index
<tt>size-1</tt> lies on the new tree's frontier. Starting from this frontier log
entry, compute the remainder of the frontier. That is, compute the log entry's
right child, the right child's right child, and so on. Provide the timestamps
for these log entries as well.</t>
          </li>
        </ul>
        <t>Users verify that the first timestamp is greater than or equal to the timestamp
of the rightmost log entry they retained, and that each subsequent timestamp is
greater than or equal to the one prior. This only requires users to verify a
logarithmic number of the newly added log entries' timestamps and guarantees
that two users with overlapping views of the tree will detect any violations.
While retaining only the rightmost log entry's timestamp would be sufficient for
this purpose, users retain all log entries along the frontier. The additional
data is retained to make later parts of the protocol more efficient.</t>
        <t>The Transparency Log defines two durations: how far ahead and how far behind the
current time the rightmost log entry's timestamp may be. Users verify this
against their local clock at the time they receive the query response.</t>
        <t>For users that have never interacted with the Transparency Log before and don't
have a previous tree head to advertise, the Transparency Log simply provides the
log entries along the frontier. The user verifies that the timestamp of each is
greater than or equal to the one prior, and that the rightmost timestamp is
within the defined bounds of the user's local clock.</t>
      </section>
    </section>
    <section anchor="binary-ladder">
      <name>Binary Ladder</name>
      <t>A <strong>binary ladder</strong> is a series of lookups, producing a series of inclusion and
non-inclusion proofs, from a single log entry's prefix tree. The purpose of a
binary ladder varies depending on the exact context in which it is provided, but
it is generally to establish some bound on the greatest version of a label that
existed as of a particular log entry. All binary ladders are variants of the
following series of lookups that exactly determines the greatest version of a
label that exists:</t>
      <ol spacing="normal" type="1"><li>
          <t>First, version <tt>x</tt> of the label 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 non-inclusion proof is produced.</t>
        </li>
        <li>
          <t>Once the first non-inclusion proof is produced, a binary search is conducted
between the greatest 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 an inclusion or non-inclusion proof which guides the search left or
right until it terminates.</t>
        </li>
      </ol>
      <t>As an example, if the greatest version of a label that existed in a particular
log entry was version 6, that would be established by the following: inclusion
proofs for versions 0, 1, 3, a non-inclusion proof for version 7, then followed
by inclusion proofs for versions 5 and 6. This series of lookups uniquely
identifies 6 as the greatest version that exists, in the sense that the
Transparency Log would be unable to prove a different greatest version to any
user.</t>
      <t>While the description above may imply that the series of lookups is interactive,
this is not the case in practice. Users may receive one or more binary ladders,
corresponding to the same or different log entries, in a single query response.
The Transparency Log's query response always contains sufficient information to
allow users to predict the outcome of each lookup (inclusion or non-inclusion of
a particular version) in the binary ladder.</t>
      <t>The greatest possible version is <tt>2^32-1</tt>. Any lookup for a greater version is
skipped and the algorithm above continues as if the lookup resulted in a
non-inclusion proof. Example code for computing the versions of a label that go
in a binary ladder is provided in <xref target="appendix-binary-ladder"/>.</t>
    </section>
    <section anchor="greatest-version-search">
      <name>Greatest-Version Search</name>
      <t>Users often wish to search for the "most recent" version, or the greatest
version, of a label. Since label owners regularly verify that the greatest
version is correctly represented in the log, this enables a relatively simple
approach to searching.</t>
      <t>Users reuse the implicit binary search tree from <xref target="implicit-binary-search-tree"/>
to execute their search. This ensures that all users will check the same or
similar log entries when searching for a label, allowing the Transparency Log to
be monitored efficiently. This section additionally defines the concept of a
distinguished log entry, which is any log entry that label owners are required
to check for correctness. Given this, users can start their search at the
rightmost distinguished log entry and only consider new versions which have been
created since then.</t>
      <section anchor="reasonable-monitoring-window">
        <name>Reasonable Monitoring Window</name>
        <t>Transparency Logs define a duration, referred to as the <strong>Reasonable Monitoring
Window</strong> (RMW), which is the frequency with which the Transparency Log generally
expects label owners to perform monitoring.</t>
        <t><strong>Distinguished</strong> log entries are chosen according to the recursive algorithm
below, such that there is roughly one per every interval of the RMW:</t>
        <ol spacing="normal" type="1"><li>
            <t>Take as input: a log entry, the timestamp of a log entry to its left, and the
timestamp of a log entry to its right.</t>
          </li>
          <li>
            <t>If the right timestamp minus the left timestamp is less than the Reasonable
Monitoring Window, terminate the algorithm. Otherwise, declare that the given
log entry is distinguished and then:</t>
          </li>
          <li>
            <t>If the given log entry has a left child in the implicit binary search tree,
recurse to its subtree by executing this algorithm with: the given log
entry's left child, the given left timestamp, and the timestamp of the given
log entry.</t>
          </li>
          <li>
            <t>If the given log entry has a right child, recurse to its subtree by executing
this algorithm with: the given log entry's right child, the timestamp of the
given log entry, and the given right timestamp.</t>
          </li>
        </ol>
        <t>The algorithm is initialized with these parameters: the root node in the
implicit binary search tree, the timestamp 0, and the timestamp of the rightmost
log entry. Note that step 2 is specifically "less than" and not "less than or
equal to"; this ensures correct behavior when the RMW is zero.</t>
        <t>This process for choosing distinguished log entries ensures that they are
<strong>regularly spaced</strong>. Having irregularly spaced distinguished log entries risks
either overwhelming label owners with a large number of them, or delaying
consensus between users by having arbitrarily few. Distinguished log entries
must reliably occur at roughly the same interval as the Reasonable Monitoring
Window regardless of variations in how quickly new log entries are added.</t>
        <t>This process also ensures that distinguished log entries are <strong>stable</strong>. Once a
log entry is chosen to be distinguished, it will never stop being distinguished.
This ensures that, if a user looks up a label and checks consistency with some
distinguished log entry, this log entry can't later avoid inspection by the
label owner by losing its distinguished status.</t>
      </section>
      <section anchor="search-binary-ladder">
        <name>Binary Ladder</name>
        <t>To perform a search, users need to be able to inspect individual log entries and
determine the greatest version of the label that was present in the prefix tree
at that time. Specifically, they need to be able to determine if the greatest
version of the label was greater than, equal to, or less than their <strong>target
version</strong>.</t>
        <t>This is accomplished by having the Transparency Log provide a binary ladder from
the log entry. Binary ladders provided for the purpose of searching the tree are
called <strong>search binary ladders</strong> and follow the series of lookups described in
<xref target="binary-ladder"/>, but with two optimizations:</t>
        <t>First, the series of lookups ends after the first inclusion proof for a version
greater than the target version, or the first non-inclusion proof for a version
less than or equal to the target version. Providing additional lookups is
unnecessary, since the user only needs to know whether the greatest version of
the label that exists is greater than, equal to, or less than the target
version, rather than its exact value. However, note that the binary ladder
continues after receiving an inclusion proof for a version <strong>equal</strong> to the
target version, as this is often needed to determine whether or not any versions
greater than the target version exist.</t>
        <t>Second, depending on the context in which the binary ladder is provided, the
Transparency Log may omit inclusion proofs for any versions where another
inclusion proof for the same version was already provided in the same query
response for a log entry to the left. Similarly, the Transparency Log may omit
non-inclusion proofs for any versions of the label where another non-inclusion
proof for the same version was already provided in the same query response for a
log entry to the right. Whether or not these lookups are omitted is specified in
context.</t>
      </section>
      <section anchor="gv-algorithm">
        <name>Algorithm</name>
        <t>The algorithm for performing a greatest-version search is described below as a
recursive algorithm. It starts at the rightmost distinguished log entry, or the
root of the implicit binary search tree if there are no distinguished log
entries, and then recurses down the remainder of the frontier, each time
starting back at step 1:</t>
        <ol spacing="normal" type="1"><li>
            <t>Obtain a search binary ladder from the current log entry where the target
version is the claimed greatest version of the label, omitting redundant
lookups.</t>
          </li>
          <li>
            <t>Verify that the binary ladder terminates in a way that is consistent with the
claimed greatest version of the label. That is, verify that every lookup for
a version greater than the target version results in a non-inclusion proof.
If this is the rightmost log entry, additionally verify that every lookup for
a version less than or equal to the target version results in an inclusion
proof.</t>
          </li>
          <li>
            <t>If this is not the rightmost log entry, recurse to the log entry's right
child.</t>
          </li>
        </ol>
        <t>The terminal log entry of the search is defined as the leftmost log entry
inspected that contains the greatest version of the label. If the Transparency
Log is deployed in Contact Monitoring mode and the terminal log entry of the
search is to the right of the rightmost distinguished log entry, the user <bcp14>MUST</bcp14>
monitor the label as described in <xref target="monitoring-the-tree"/>.</t>
      </section>
    </section>
    <section anchor="fixed-version-search">
      <name>Fixed-Version Search</name>
      <t>When searching the combined tree structure described in <xref target="combined-tree"/> for a
specific version of a label, users essentially perform a binary search for the
first log entry where the prefix tree contained the target version of the label.
This search may terminate early if the user discovers a log entry where the
target version of the label is the greatest that exists, as this is assumed to
have been verified by the label owner (discussed in <xref target="monitoring-the-tree"/>).</t>
      <section anchor="maximum-lifetime">
        <name>Maximum Lifetime</name>
        <t>A Transparency Log operator <bcp14>MAY</bcp14> define a maximum lifetime for log entries. If
defined, it <bcp14>MUST</bcp14> be greater than zero and greater than the RMW. Whether a log
entry is expired is determined by subtracting the timestamp of the log entry in
question from the timestamp of the rightmost log entry and checking if the
result is greater than or equal to the defined duration.</t>
        <t>A user executing a search may arrive at an expired log entry by either of two
ways: The user may have inspected a log entry which is <strong>not</strong> expired and
decided to recurse to the log entry's left child, which is expired.
Alternatively, the root log entry might be expired, in which case the user
would've started their search at an expired root log entry.</t>
        <t>Regardless of how the user arrived at the expired log entry, the user's next
step is always to recurse to the log entry's right child (if one exists) without
receiving a binary ladder. This allows the Transparency Log to prune large
sections of the log tree and any versions of the prefix tree that are older
than the defined maximum lifetime. Pruning is explained in more detail in
<xref target="ARCH"/>.</t>
      </section>
      <section anchor="fv-algorithm">
        <name>Algorithm</name>
        <t>The algorithm for performing a fixed-version search is described below as a
recursive algorithm. It starts with the root log entry, as defined by the
implicit binary search tree, and then recurses to left or right children, each
time starting back at step 1.</t>
        <ol spacing="normal" type="1"><li>
            <t>If the log entry is expired, recurse to the log entry's right child. If the
log entry does not have a right child, proceed to step 6.</t>
          </li>
          <li>
            <t>Obtain a search binary ladder from the current log entry for the target
version, omitting redundant lookups as described in <xref target="search-binary-ladder"/>.
Determine whether the binary ladder indicates a greatest version of the label
that is greater than, equal to, or less than the target version.</t>
          </li>
          <li>
            <t>If the binary ladder indicates a greatest version less than the target
version (that is, if it contains a non-inclusion proof for a version less
than or equal to the target version), then recurse to the log entry's right
child. If the log entry does not have a right child, proceed to step 6.</t>
          </li>
          <li>
            <t>If the binary ladder indicates a greatest version greater than the target
version (that is, if it contains an inclusion proof for a version greater
than the target version), then recurse to the log entry's left child. If the
log entry does not have a left child, proceed to step 6.</t>
          </li>
          <li>
            <t>If the binary ladder indicates a greatest version equal to the target version
(that is, it contains inclusion proofs for all expected versions less than or
equal to the target and non-inclusion proofs for all expected versions
greater than the target), then:  </t>
            <ol spacing="normal" type="1"><li>
                <t>If there are no expired log entries in the current log entry's direct
path, then terminate the search successfully.</t>
              </li>
              <li>
                <t>Otherwise, identify whether the log entry itself is distinguished, or
whether there are any unexpired distinguished log entries in its direct
path and to its left. If yes, terminate the search successfully. If no,
terminate the search with an error indicating that the target version of
the label is expired.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If this step is reached, the search has terminated without finding an
unexpired log entry where the target version is the greatest that exists. In
this case, out of all the log entries inspected, identify the leftmost one
where the binary ladder indicated a greatest version greater than the target
version.  </t>
            <ol spacing="normal" type="1"><li>
                <t>If there is no such log entry, terminate the search with an error
indicating that the target version of the label does not exist.</t>
              </li>
              <li>
                <t>If any expired log entries were encountered in the search, identify
whether any of the log entries inspected by the search are unexpired,
distinguished, and to the left of the identified log entry. If no such log
entries exist, terminate the search with an error indicating that the
target version of the label is expired.      </t>
                <t>
Clients <bcp14>MUST NOT</bcp14> accept a proof where the identified log entry is itself
the leftmost unexpired and distinguished log entry. Since the target
version is not the greatest that exists in the log entry, it may not have
been checked for correctness by the label owner.</t>
              </li>
              <li>
                <t>Otherwise, look up the target version of the label in the log entry's
prefix tree. If the result is a non-inclusion proof, terminate the search
with an error indicating that the requested version of the label does not
exist. If the result is an inclusion proof, terminate the search
successfully.</t>
              </li>
            </ol>
          </li>
        </ol>
        <t>The terminal log entry of the search is defined as the log entry that triggered
step 5, or the log entry identified in step 6. If the Transparency Log is
deployed in Contact Monitoring mode and the terminal log entry of the search is
to the right of the rightmost distinguished log entry (defined in
<xref target="reasonable-monitoring-window"/>), the user <bcp14>MUST</bcp14> monitor the label as described
in <xref target="monitoring-the-tree"/>.</t>
      </section>
    </section>
    <section anchor="monitoring-the-tree">
      <name>Monitoring the Tree</name>
      <t>As new entries are added to the log tree, the search path that's traversed to
find a specific version of a label may change. New intermediate nodes may be
established between the search root and the terminal log entry, or a new search
root may be created. The goal of monitoring a label is to efficiently ensure
that, when these new parent nodes are created, they're created correctly such
that searches for the same versions of a label continue producing the same
results.</t>
      <t>Label owners <bcp14>MUST</bcp14> monitor their labels regularly, ensuring that past versions of
the label are still correctly represented in the log and that any new versions
of the label are permissible, alerting the user if not.</t>
      <t>If the Transparency Log is deployed in Contact Monitoring mode, then the users
that looked up a label (either through a fixed-version or greatest-version
search) are also sometimes required to monitor the label. Specifically, if a
user looks up a label and the terminal log entry of their search is to the right
of the rightmost distinguished log entry, the user <bcp14>MUST</bcp14> regularly monitor the
label-version pair until its monitoring path intersects a distinguished log
entry. That is, until a new distinguished log entry is established to its right
and the two log entries are verified to be consistent. The purpose of this
monitoring is to ensure that the label-version pair is not removed or obscured
by the Transparency Log before the label owner has had an opportunity to detect
it.</t>
      <t>If the Transparency Log is deployed with a Third-Party Auditor or Third-Party
Manager, this monitoring is unnecessary assuming that either the Service
Operator or the Third Party are honest. However, the user <bcp14>MAY</bcp14> still perform it
to detect collusion between the Service Operator and the Third Party.</t>
      <t>If a user looks up a label and the terminal log entry of their search is either
a distinguished log entry or to the left of any distinguished log entry,
monitoring is never necessary. In this case, the only state that would be
retained from the query would be the tree head, as discussed in
<xref target="updating-views-of-the-tree"/>.</t>
      <t>"Regular" monitoring <bcp14>SHOULD</bcp14> be performed roughly as frequently as the RMW and
<bcp14>MUST</bcp14>, if at all possible, happen more frequently than the log entry maximum
lifetime.</t>
      <section anchor="binary-ladder-1">
        <name>Binary Ladder</name>
        <t>Similar to the algorithm for searching the tree, the algorithms for monitoring
the tree requires a way to prove that the greatest version of a label stored in
a particular log entry's prefix tree is greater than or equal to a <strong>target
version</strong>. The target version in this case is the version of the label that the
user is monitoring. Unlike in a search though, users already know that the
target version of the label exists and only need proof that there hasn't been
an unexpected downgrade.</t>
        <t>Binary ladders provided for the purpose of monitoring are called <strong>monitoring
binary ladders</strong> and follow the series of lookups described in
<xref target="binary-ladder"/>, omitting any lookup for a version greater than the target
version. As a result, all lookups in the binary ladder will result in an
inclusion proof if the Transparency Log is behaving honestly.</t>
      </section>
      <section anchor="contact-algorithm">
        <name>Contact Algorithm</name>
        <t>To monitor a given label, users maintain a small amount of state: a map from a
position in the log to a version counter. The version counter is the greatest
version of the label proven to exist at that log position. Users initially
populate this map by setting the position of the terminal log entry of their
search to map to the version of the label they searched for. A map may track
several different versions simultaneously if a user has been shown different
versions of the same label.</t>
        <t>To update this map, users receive the most recent tree head from the
Transparency Log and follow these steps for each entry in the map, from
rightmost to leftmost log entry:</t>
        <ol spacing="normal" type="1"><li>
            <t>Determine if the log entry is distinguished. If so, leave the
position-version pair in the map and move on to the next map entry.</t>
          </li>
          <li>
            <t>Compute the ordered list of log entries to inspect:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Initialize the list by setting it to be the log entry's direct path in the
implicit binary search tree based on the current tree size.</t>
              </li>
              <li>
                <t>Remove all entries that are to the left of the log entry.</t>
              </li>
              <li>
                <t>If any of the remaining log entries are distinguished, terminate the list
just after the first distinguished log entry.</t>
              </li>
              <li>
                <t>If the Contact Monitoring operation is being executed in the context of an
Owner Monitoring operation, and the log entry in the monitoring map is
equal to or to the right of the owner's advertised <tt>start</tt> position, skip
inspecting the final distinguished log entry. This log entry will be
inspected by the algorithm in <xref target="owner-algorithm"/>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>For each log entry in the computed list, from left to right:  </t>
            <ol spacing="normal" type="1"><li>
                <t>Check if this log entry had an entry in the original (unmodified)
monitoring map, or if a binary ladder from this log entry has already been
provided in the same query response. If so:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>If the original monitoring map entry had a greater associated version,
or if the previously provided binary ladder had a greater target
version, then this version of the label no longer needs to be
monitored. Remove the position-version pair with the lesser version
from the map and move on to the next map entry.</t>
                  </li>
                  <li>
                    <t>If it had a target version less than or equal to that of the current
map entry, terminate and return an error to the user.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>Obtain a monitoring binary ladder from this log entry where the target
version is the version currently in the map. Verify that all expected
lookups are present and all show inclusion.</t>
              </li>
              <li>
                <t>If the above check fails, terminate and return an error to the user.
Otherwise, remove the current position-version pair from the map and
replace it with a new one for the position of the log entry that the
binary ladder came from.</t>
              </li>
            </ol>
          </li>
        </ol>
        <t>Once the map entries are updated according to this process, the final step of
monitoring is to remove all mappings where the position corresponds to a
distinguished log entry. All remaining entries will be non-distinguished log
entries lying on the log's frontier.</t>
        <t>This algorithm works by progressively moving up the implicit binary search tree
as new intermediate or root nodes are established, and verifying that they're
constructed correctly. Once a distinguished log entry is reached and
successfully verified, monitoring is no longer necessary and the corresponding
entry is removed from the map.</t>
        <t>Users will often be able to execute the monitoring process, at least partially,
with the output of a fixed-version or greatest-version search for the label.
This may reduce the need for monitoring-specific requests. It is also worth
noting that the work required to monitor several versions of the same label
scales sublinearly because 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 label from then
on.</t>
      </section>
      <section anchor="owner-algorithm">
        <name>Owner Algorithm</name>
        <t>Label owners initialize their state by providing the Transparency Log with a
<strong>starting position</strong> corresponding to the log entry where they wish their
ownership of the label to begin. This starting position <bcp14>MUST</bcp14> correspond to an
unexpired distinguished log entry. Alternatively, label owners may omit the
starting position to indicate that they wish to own the label from the start of
the log's existence. The user then executes the following algorithm:</t>
        <ol spacing="normal" type="1"><li>
            <t>Compute the list of log entries to inspect: this list starts with the log
entry at the requested starting position, followed by the log entries that
are on the starting position's direct path and to its left, ending just
before the first expired log entry. If no starting position was provided,
this list is empty.</t>
          </li>
          <li>
            <t>Obtain the greatest version of the label that existed as of each of these log
entries. If the label did not exist, no value is provided. Verify that each
version is less than or equal to the one prior.</t>
          </li>
          <li>
            <t>Obtain VRF proofs for version zero of the label and all other versions of the
label that would appear in a search binary ladder where the target version
was any of the versions given in step 2.</t>
          </li>
          <li>
            <t>Obtain the commitment to the label's value at each version where a VRF proof
was provided in step 3 and the version is understood to exist based on the
information provided in step 2.</t>
          </li>
          <li>
            <t>Obtain a search binary ladder from each log entry in the list computed in
step 1 where the target version is the corresponding version given in step 2,
or zero if no version was given, without omitting redundant lookups. Verify
that each binary ladder terminates in a way that is consistent with the
claimed greatest version of the label. If no version was given, this means
verifying that the binary ladder consists of a single non-inclusion proof
for version zero.</t>
          </li>
        </ol>
        <t>If any new versions of the label were created after the requested starting
position, the label owner will need to process each of these individually as
described in <xref target="updating-a-label"/>.</t>
        <t>If no starting position was provided, the algorithm above inspects no log
entries and only provides the VRF proof for version zero of the label. The label
owner's state then reflects that no log entries have been verified and that no
versions of the label are known. The label owner processes every existing
version of the label, starting with the one created first, as described in
<xref target="updating-a-label"/>. This includes versions that were created in log entry 0,
which could not otherwise be verified, since any starting position would
correspond to a log entry where the label already existed.</t>
        <t>Once the label owner has fully initialized their state, through the algorithm
above and by processing any remaining new versions, they can begin regular
monitoring. The label owner advertises to the Transparency Log the greatest
version of the label that they're aware of and the rightmost distinguished log
entry that they've verified is correct. For a number of subsequent distinguished
log entries, the Transparency Log provides a binary ladder proving that no new
unexpected versions of the label exist. If the label owner hasn't verified any
distinguished log entry, the Transparency Log starts with the leftmost
distinguished log entry that exists. This is described below as a recursive
algorithm, starting with the root log entry:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the current log entry is not distinguished, stop.</t>
          </li>
          <li>
            <t>If the user advertised a log entry, and the current log entry's index is less
than or equal to that of the log entry advertised by the user:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>If the current log entry has a right child, recurse to the right child.</t>
              </li>
              <li>
                <t>Regardless of the outcome of step 1, stop.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If the current log entry has a left child, recurse to the left child.
Afterwards, proceed to step 4.</t>
          </li>
          <li>
            <t>If a stop condition has been reached, stop. From a user's perspective, the
only stop condition is having consumed all of the Transparency Log's
response. The Transparency Log may stop at this point if the greatest version
of the label present at this log entry is greater than the version advertised
by the user, or if a maximum output size has been reached.</t>
          </li>
          <li>
            <t>Obtain a search binary ladder from the current log entry where the target
version is the greatest version of the label expected to exist at this point
according to the label owner's local state, without omitting redundant
lookups. Verify that the binary ladder terminates in a way that is consistent
with the expected version being the greatest that exists. If no version of
the label is expected to exist at this point, the target version is zero and
the user verifies that the binary ladder consists of a single non-inclusion
proof for version zero.</t>
          </li>
          <li>
            <t>If the current log entry has a right child, recurse to the right child.</t>
          </li>
        </ol>
        <t>To avoid excessive load, the Transparency Log <bcp14>SHOULD</bcp14> limit the number of
distinguished log entries that it provides binary ladders for in a single
response. Users repeatedly query the Transparency Log until they detect that the
above algorithm has either hit an unresolvable error or successfully reached the
rightmost distinguished log entry.</t>
        <t>Since this algorithm checks only distinguished log entries for correctness,
label owners use it in conjunction with the algorithm in <xref target="contact-algorithm"/>
to ensure the correctness of updates that occur between distinguished log
entries.</t>
      </section>
    </section>
    <section anchor="updating-a-label">
      <name>Updating a Label</name>
      <t>As discussed in <xref target="ARCH"/>, a label owner is the authoritative source for a
label's contents and must either initiate all changes to the label's value
themself or at least be informed of changes afterwards. This section describes
the mechanism by which label owners ensure that new versions of a label are
inserted correctly into the Transparency Log. Label owners <bcp14>MUST</bcp14> follow this
process for every new version of a label that is created after their ownership
begins, processing each new version of the label in the order they were created.</t>
      <section anchor="update-algorithm">
        <name>Algorithm</name>
        <t>Whenever a log entry is added to the Transparency Log that contains some new
versions of a label, the Transparency Log informs the label owner of the
following:</t>
        <ul spacing="normal">
          <li>
            <t>The index of the log entry where the new versions were inserted.</t>
          </li>
          <li>
            <t>The commitment opening that was chosen for each new version of the label.</t>
          </li>
          <li>
            <t>If the Transparency Log is deployed with a Third-Party Manager, the signature
produced by the Service Operator over each new version.</t>
          </li>
          <li>
            <t>VRF proofs for the following versions of the label:
            </t>
            <ul spacing="normal">
              <li>
                <t>Compute the set of all versions that would be contained in a search binary
ladder for the new greatest version of the label.</t>
              </li>
              <li>
                <t>If more than one new version of the label was created, additionally include
each of these individual versions.</t>
              </li>
              <li>
                <t>Of the versions matching the two criteria above, omit any versions that
would be contained in a search binary ladder for the previous greatest
version of the label, as the label owner is expected to already know these
VRF outputs. If there was no previous greatest version of the label, omit
only the version zero.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>To ensure that the new versions of the label were inserted correctly, the label
owner considers the Transparency Log as it existed at two points in time: The
first is the <strong>previous tree</strong>, which is defined as the log tree up to but
excluding the log entry where the new versions were added.  If the new versions
of the label were added in log entry 0, the previous tree is empty. The second
is the <strong>current tree</strong>, which is defined as the log tree as it is currently
presented to the user, containing the new log entry and potentially other log
entries to its right. Given this, the user executes the following algorithm:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the previous tree is empty, skip to step 3. Otherwise, starting from the
root log entry of the previous tree, proceed down the frontier of the
previous tree and identify the first log entry that is not distinguished in
the current tree. If there is no such log entry, skip to step 3.</t>
          </li>
          <li>
            <t>Starting from the identified log entry, proceed down the remainder of the
previous tree's frontier from left to right:  </t>
            <ol spacing="normal" type="1"><li>
                <t>If the current log entry's index is less than or equal to the index of
the log entry where the previous greatest version was inserted (if any),
skip inspecting this log entry.</t>
              </li>
              <li>
                <t>Obtain a search binary ladder from the current log entry where the target
version is the previous greatest version of the label that existed, or zero
if no version of the label existed. Lookups that would be omitted in a
greatest-version search of the previous tree are also omitted here.      </t>
                <t>
Matching the ladder omission rules of a greatest-version search has two
important implementation considerations. First, it means that lookups that
would occur in log entries that were skipped by step 2.1 will still be
omitted as if the log entries had been inspected. Second, it means that
the possible expiration of any of the log entries on the previous tree's
frontier is not considered, as it would also not be considered in a
greatest-version search.</t>
              </li>
              <li>
                <t>Verify that the binary ladder terminates in a way that is consistent with
the previous greatest version of the label being the greatest that
exists. If no version of the label existed, verify that the binary ladder
consists of a single non-inclusion proof for version zero.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If the log entry where the new versions were added is distinguished in the
current tree, and if there are any new versions of the label that would not
be looked up in a search binary ladder for the new greatest version, obtain a
<tt>PrefixProof</tt> from the log entry for those versions in ascending order by
version. Verify that all lookups result in an inclusion proof.  </t>
            <t>
If all checks succeed, the label owner retains the position and new greatest
version of the label for later verification with the second algorithm of
<xref target="owner-algorithm"/>.</t>
          </li>
          <li>
            <t>If the log entry where the new versions were added is not distinguished in
the current tree, obtain a <tt>PrefixProof</tt> from it with lookups corresponding
to a search binary ladder where the target version is the new greatest
version of the label, omitting redundant lookups. Lookups that were omitted
in step 2.2, including those that would have occurred in log entries skipped
by step 2.1, are considered redundant here as well, even though they were not
provided in the same query response. Verify that all lookups terminate in a
way that is consistent with the new greatest version of the label being the
greatest that exists.  </t>
            <t>
Additionally, if there are any new versions of the label that were created in
this log entry but that weren't included in the search binary ladder, obtain
a second <tt>PrefixProof</tt> from the log entry with those lookups in ascending
order by version. Verify that all lookups result in an inclusion proof.  </t>
            <t>
If all checks succeed, the label owner retains the position and new greatest
version of the label for later verification with <xref target="owner-algorithm"/>. The
label owner additionally inserts a new entry into their contact monitoring
map, discussed in <xref target="contact-algorithm"/>, that maps the log entry to the new
greatest version of the label. Any existing entries in the map for log
entries that are in the direct path of this one, to its right, and for a
lesser or equal version, are removed.</t>
          </li>
        </ol>
        <t>In essence, this algorithm has two phases. The first phase is doing a
greatest-version search in the previous tree. This is necessary to prevent forms
of misbehavior where a Transparency Log might create a malicious version of a
label, later change the corresponding value to something non-malicious, and try
to only inform the label owner of the non-malicious value. The second phase is
verifying how the new versions of the label were created in the claimed log
entry. This depends on whether the log entry is distinguished or not to minimize
redundant lookups with the second algorithm of <xref target="owner-algorithm"/>.</t>
        <t>Note that if a Third-Party Manager is present, desynchronization between the
Service Operator and the Third-Party Manager can result in "skipped" versions
(discussed in <xref target="management"/>). Skipped versions are inserted into the prefix
tree with an all-zero commitment value. For the purpose of the algorithm
described in this section, skipped versions are handled the same as unskipped
versions.</t>
      </section>
    </section>
    <section anchor="walking-distinguished-heads">
      <name>Walking Distinguished Heads</name>
      <t>There are many cases in KT where it can be useful to allow a user to walk the
most recently issued distinguished log entries. One particular case where this
is useful is in deployments that rely on credentials, explained further in
<xref target="credentials"/>. It can also be helpful for new label owners, running the first
algorithm of <xref target="owner-algorithm"/>, in deciding what they want their "starting"
log entry to be. And perhaps most importantly, walking the recent distinguished
log entries gives users common reference points in the log tree and allows them
to verify that they aren't being shown a fork.</t>
      <section anchor="distinguished-algorithm">
        <name>Algorithm</name>
        <t>Walking the recent distinguished log entries is essentially done as a
right-to-left depth-first search in the log tree. Users and the Transparency Log
share an application-defined concept of what a "recent" distinguished log entry
is, and enumerate all of the log entries that meet this definition. Users can
optionally provide the Transparency Log with a <strong>stopping position</strong>
corresponding to a point where the enumeration can stop early if hit.</t>
        <t>This is described below as a recursive algorithm, starting with the root log
entry:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the current log entry is not distinguished, stop.</t>
          </li>
          <li>
            <t>If the current log entry has a right child, recurse to the right child.</t>
          </li>
          <li>
            <t>If a stopping position was provided and the current log entry's position is
less than or equal to the requested stopping position, stop.</t>
          </li>
          <li>
            <t>If the current log entry doesn't meet the application's definition of
"recent", stop.</t>
          </li>
          <li>
            <t>If the current log entry has a left child, recurse to the left child.</t>
          </li>
        </ol>
        <t>This algorithm works with any definition of "recent" for distinguished log
entries that is monotonic. However, the two simplest possible definitions are:
a.) a distinguished log entry is "recent" if it is one of the <tt>n</tt> rightmost, or
b.) a distinguished log entry is "recent" if subtracting its timestamp from the
timestamp of the rightmost log entry yields a value less than some threshold. It
is <bcp14>RECOMMENDED</bcp14> that applications choose one of these definitions. An
application's definition of "recent" <bcp14>SHOULD NOT</bcp14> include more than ten
distinguished log entries, and <bcp14>MUST NOT</bcp14> include any expired distinguished log
entries.</t>
      </section>
      <section anchor="detecting-forks">
        <name>Detecting Forks</name>
        <t>As discussed in <xref section="3.3" sectionFormat="of" target="ARCH"/>, two of the primary ways that a user can
detect the existence of a fork is through either an anonymous channel, or some
form of direct peer-to-peer communication. Both of these approaches rely on
exchanging root values of the log tree in a way where the Transparency Log can't
reliably partition users.</t>
        <t>To compute the log tree root values to exchange, a user follows the algorithm in
<xref target="distinguished-algorithm"/>, using data provided through the same channel that
the user typically interacts with the Transparency Log. The user then computes
the log tree root value at each point where one of the recent distinguished log
entries is the rightmost log entry. The exact number of distinguished log
entries to use, and therefore the number of root values to compute, depends on
the application. That said, using a larger number provides more resilience
against clock skew and applications generally <bcp14>SHOULD</bcp14> compute at least two root
values.</t>
        <t>Users then obtain the same information either by requesting it over their
anonymous channel, or through direct peer-to-peer communication. If bandwidth is
a concern, the information exchanged can be a <tt>DistinguishedHead</tt> structure
containing just the list of root values in left-to-right order. Alternatively, a
signed query response (a <tt>DistinguishedResponse</tt>) could be exchanged, which
would provide non-repudiable evidence of misbehavior if detected.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  HashValue heads<0..2^8-1>;
} DistinguishedHead;
]]></sourcecode>
        <t>The list of root values determined from the authenticated channel, and the list
of root values received over the partition-resistant channel, are verified by
checking that each list is either a prefix or a suffix of the other, having at
least one root value in common. Example code for this is provided below:</t>
        <sourcecode type="python"><![CDATA[
def compare_roots(roots_a, roots_b):
    if len(roots_a) != len(roots_b):
        raise Exception('lists must be the same size')

    N = len(roots_a)

    for x in range(N):
        if roots_a[:N-x] == roots_b[x:] or roots_b[:N-x] == roots_a[x:]:
            return True

    raise Exception('no valid overlap found')
]]></sourcecode>
      </section>
    </section>
    <section anchor="cryptographic-computations">
      <name>Cryptographic Computations</name>
      <section anchor="cipher-suites">
        <name>Cipher Suites</name>
        <t>Each Transparency Log uses a single fixed cipher suite, chosen when it is
initially created, that specifies the following primitives and parameters 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>
          <li>
            <t><tt>Nc</tt>: The size in bytes of commitment openings</t>
          </li>
          <li>
            <t><tt>Kc</tt>: A fixed string of bytes used in the computation of commitments</t>
          </li>
        </ul>
        <t>The hash algorithm is used to calculate 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 labels.</t>
        <t>Throughout the document, the following shorthands are used to denote different
parameters of the current cipher suite:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Hash.Nh</tt> denotes the hash function's output length in bytes.</t>
          </li>
          <li>
            <t><tt>VRF.Nh</tt> denotes the VRF algorithm's output length in bytes.</t>
          </li>
          <li>
            <t><tt>VRF.Np</tt> denotes the VRF algorithm's proof size in bytes.</t>
          </li>
        </ul>
        <t>Cipher suites are represented with the CipherSuite type and are defined in
<xref target="kt-cipher-suites"/>.</t>
      </section>
      <section anchor="tree-head-signature">
        <name>Tree Head Signature</name>
        <t>The head of a Transparency Log, which represents its most recent state, is
encoded 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> is the number of log entries. If the Transparency Log is
deployed in Third-Party Management mode, 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 thirdPartyManagement:
      opaque leaf_public_key<0..2^16-1>;
    case thirdPartyAuditing:
      uint64 max_auditor_lag;
      uint64 auditor_start_pos;
      opaque auditor_public_key<0..2^16-1>;
  };

  uint64 max_ahead;
  uint64 max_behind;
  uint64 reasonable_monitoring_window;
  optional<uint64> maximum_lifetime;
} Configuration;

struct {
  Configuration config;
  uint64 tree_size;
  opaque root[Hash.Nh];
} TreeHeadTBS;
]]></sourcecode>
        <t>The <tt>ciphersuite</tt> field contains the cipher suite for the Transparency Log,
chosen from the registry in <xref target="kt-cipher-suites"/>. The <tt>mode</tt> field specifies
whether the Transparency Log is deployed in Contact Monitoring mode, or with a
Third-Party Manager or Auditor. The <tt>signature_public_key</tt> field contains the
public key to use for verifying signatures on the <tt>TreeHeadTBS</tt> structure. The
<tt>vrf_public_key</tt> field contains the VRF public key to use for evaluating VRF
proofs provided in the <tt>BinaryLadderStep.proof</tt> field described in <xref target="search"/>.</t>
        <t>If the deployment mode specifies a Third-Party Manager, a public key is provided
in <tt>leaf_public_key</tt>. This public key is used to verify the Service Operator's
signature on modifications to the Transparency Log, as described in
<xref target="update-format"/>.</t>
        <t>If the deployment mode specifies a Third-Party Auditor, the maximum amount of
time in milliseconds that the auditor may lag behind the most recent version of
the Transparency Log is provided in <tt>max_auditor_lag</tt>. The position of the first
log entry that the auditor started processing is provided in
<tt>auditor_start_pos</tt>. A public key for verifying the auditor's signature on views
of the Transparency Log is provided in <tt>auditor_public_key</tt>.</t>
        <t>The <tt>max_ahead</tt> and <tt>max_behind</tt> fields contain the maximum amount of time in
milliseconds that a tree head may be ahead of or behind the user's local clock
without being rejected. The <tt>reasonable_monitoring_window</tt> contains the
Reasonable Monitoring Window, defined in <xref target="reasonable-monitoring-window"/>, in
milliseconds. If the Transparency Log has chosen to define a maximum lifetime
for log entries, per <xref target="maximum-lifetime"/>, this duration in milliseconds is
stored in the <tt>maximum_lifetime</tt> field.</t>
        <t>Finally, the <tt>root</tt> field contains the root value of the log tree with
<tt>tree_size</tt> leaves.</t>
      </section>
      <section anchor="auditor-tree-head-signature">
        <name>Auditor Tree Head Signature</name>
        <t>In deployment scenarios where a Third-Party Auditor is present, the auditor's
view of the Transparency Log is presented to users with an <tt>AuditorTreeHead</tt>
structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint64 timestamp;
  uint64 tree_size;
  opaque signature<0..2^16-1>;
} AuditorTreeHead;
]]></sourcecode>
        <t>Users verify an <tt>AuditorTreeHead</tt> with the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the user advertised a previously observed tree head, verify that the
<tt>tree_size</tt> of the <tt>AuditorTreeHead</tt> structure in the previous tree head
(which may be from a different auditor) is greater than or equal to
<tt>auditor_start_pos</tt> for the current auditor.</t>
          </li>
          <li>
            <t>Verify that the timestamp of the rightmost log entry is greater than or equal
to <tt>timestamp</tt>, and that the difference between the two is less than or equal
to <tt>Configuration.max_auditor_lag</tt>.</t>
          </li>
          <li>
            <t>Verify that <tt>tree_size</tt> is less than or equal to that of the <tt>TreeHead</tt>
provided by the Transparency Log.</t>
          </li>
          <li>
            <t>Verify <tt>signature</tt> as a signature over the <tt>AuditorTreeHeadTBS</tt> structure:</t>
          </li>
        </ol>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  Configuration config;
  uint64 timestamp;
  uint64 tree_size;
  opaque root[Hash.Nh];
} AuditorTreeHeadTBS;
]]></sourcecode>
        <t>The <tt>config</tt> field contains the long-term configuration for the Transparency
Log. The <tt>timestamp</tt> and <tt>tree_size</tt> fields match that of <tt>AuditorTreeHead</tt>. The
<tt>root</tt> field contains the root value of the log tree when it had <tt>tree_size</tt>
leaves.</t>
      </section>
      <section anchor="full-tree-head-verification">
        <name>Full Tree Head Verification</name>
        <t>Tree heads are presented to users on the wire as follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  same(1),
  updated(2),
  (255)
} FullTreeHeadType;

struct {
  FullTreeHeadType head_type;
  select (FullTreeHead.head_type) {
    case updated:
      TreeHead tree_head;
      select (Configuration.mode) {
        case thirdPartyAuditing:
          AuditorTreeHead auditor_tree_head;
      };
  };
} FullTreeHead;
]]></sourcecode>
        <t>The <tt>head_type</tt> field may be set to <tt>same</tt> if the user advertised a previously
observed tree size in their request and the Transparency Log wishes to continue
using this same tree head. Otherwise, <tt>head_type</tt> is set to <tt>updated</tt> and a new,
more recent tree head is provided.</t>
        <t>Users verify a <tt>FullTreeHead</tt> with the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>If <tt>head_type</tt> is <tt>same</tt>, verify that the user advertised a previously
observed tree size and that the timestamp of the rightmost log entry of this
tree is still within the bounds set by <tt>max_ahead</tt> and <tt>max_behind</tt>.</t>
          </li>
          <li>
            <t>If <tt>head_type</tt> is <tt>updated</tt>:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>If the user advertised a previously observed tree size, verify that
<tt>TreeHead.tree_size</tt> is greater than the advertised tree size.</t>
              </li>
              <li>
                <t>Verify <tt>TreeHead.signature</tt> as a signature over the <tt>TreeHeadTBS</tt>
structure.</t>
              </li>
              <li>
                <t>If there is a Third-Party Auditor, verify <tt>auditor_tree_head</tt> as described
in <xref target="auditor-tree-head-signature"/>.</t>
              </li>
            </ol>
          </li>
        </ol>
      </section>
      <section anchor="update-format">
        <name>Update Format</name>
        <t>The leaves of the prefix tree contain commitments which open to the value of a
label-version pair, potentially with some additional information depending on
the deployment mode of the Transparency Log. The contents of these commitments
is serialized as an <tt>UpdateValue</tt> structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  select (Configuration.mode) {
    case thirdPartyManagement:
      opaque signature<0..2^16-1>;
  };
} UpdateSuffix;

struct {
  opaque value<0..2^32-1>;
  UpdateSuffix suffix;
} UpdateValue;
]]></sourcecode>
        <t>The <tt>value</tt> field contains the value associated with the label-version pair.</t>
        <t>In the event that Third-Party Management is used, the <tt>suffix</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 {
  Configuration config;
  opaque label<0..2^8-1>;
  uint32 version;
  opaque value<0..2^32-1>;
} UpdateTBS;
]]></sourcecode>
        <t>The <tt>value</tt> field contains the same contents as <tt>UpdateValue.value</tt>. Users
<bcp14>MUST</bcp14> successfully verify this signature before consuming <tt>UpdateValue.value</tt>.</t>
      </section>
      <section anchor="commitment">
        <name>Commitment</name>
        <t>Commitments are computed with HMAC <xref target="RFC2104"/> using the hash function
specified by the cipher suite. To produce a new commitment, the application
generates a random <tt>Nc</tt>-byte value called <tt>opening</tt> and computes:</t>
        <sourcecode type="pseudocode"><![CDATA[
commitment = HMAC(Kc, CommitmentValue)
]]></sourcecode>
        <t>where <tt>Kc</tt> is a string of bytes defined by the cipher suite and CommitmentValue
is specified as:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque opening[Nc];
  opaque label<0..2^8-1>;
  uint32 version;
  UpdateValue update;
} CommitmentValue;
]]></sourcecode>
        <t>The Transparency Log <bcp14>MAY</bcp14> generate <tt>opening</tt> in a non-random way, such as
deriving it from a secret key, as long as the result is indistinguishable from
random to other participants. The Transparency Log <bcp14>SHOULD</bcp14> ensure that individual
<tt>opening</tt> values can later be deleted in a way where they can not feasibly be
recovered. This preserves the Transparency Log's ability to delete certain
information in compliance with privacy laws, discussed further in <xref target="ARCH"/>.</t>
      </section>
      <section anchor="verifiable-random-function">
        <name>Verifiable Random Function</name>
        <t>Each label-version pair corresponds to a unique search key in the prefix tree.
This search key is the output of executing the VRF, with the private key
corresponding to <tt>Configuration.vrf_public_key</tt>, on the combined label and
version:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque label<0..2^8-1>;
  uint32 version;
} VrfInput;
]]></sourcecode>
      </section>
      <section anchor="log-tree-1">
        <name>Log Tree</name>
        <t>The value of a leaf node in the log tree is computed as the hash, with the
cipher suite hash function, of the following structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint64 timestamp;
  opaque prefix_tree[Hash.Nh];
} LogEntry;
]]></sourcecode>
        <t>The <tt>timestamp</tt> field contains the timestamp that the leaf was created in
milliseconds since the Unix epoch. The <tt>prefix_tree</tt> field contains the updated
root value of the prefix tree after making any desired modifications.</t>
        <t>The value of a parent node in the log tree 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 || node.value
  else if node.type == parentNode:
    return 0x01 || node.value
]]></sourcecode>
        <t>where <tt>Hash</tt> denotes the cipher suite hash function.</t>
      </section>
      <section anchor="prefix-tree-1">
        <name>Prefix Tree</name>
        <t>The value of a leaf node in the prefix tree is computed as the hash, with the
cipher suite hash function, of the following structure:</t>
        <sourcecode type="tls"><![CDATA[
leaf.value = Hash(0x02 || vrf_output || commitment)
]]></sourcecode>
        <t><tt>vrf_output</tt> contains the VRF output for the label-version pair and <tt>commitment</tt>
contains the commitment to the corresponding <tt>UpdateValue</tt> structure.</t>
        <t>The value of a parent node in the prefix tree is computed by hashing together
the values of its left and right children:</t>
        <sourcecode type="pseudocode"><![CDATA[
parent.value = Hash(0x03 || parent.leftChild.value || parent.rightChild.value)
]]></sourcecode>
        <t>If one of the children does not exist, an all-zero byte string of length
<tt>Hash.Nh</tt> is used instead.</t>
      </section>
    </section>
    <section anchor="tree-proofs">
      <name>Tree Proofs</name>
      <section anchor="log-tree-2">
        <name>Log Tree</name>
        <t>In the interest of efficiency, KT combines multiple inclusion proofs and
consistency proofs into a single batch proof. Recalling from the discussion in
<xref target="log-tree"/>,</t>
        <ul spacing="normal">
          <li>
            <t>Whenever the Transparency Log serves an inclusion proof for a leaf of the log
tree, it provides the minimum set of head values from balanced subtrees that
allows the user to compute the root value when combined with the leaf's value.</t>
          </li>
          <li>
            <t>Whenever the Transparency Log serves a consistency proof, the user is expected
to have retained the head values of the full subtrees of the previous version
of the log. The Transparency Log provides the minimum set of head values from
balanced subtrees that allows the user to compute the new root value when
combined with the retained values.</t>
          </li>
        </ul>
        <t>These two proof types are composed together as such: considering the leaf values
which will be proved included, and any node values the user is understood to
have retained, the Transparency Log provides the minimum set of head values from
balanced subtrees that allows the user to compute the root value when combined
with the leaf and retained values. This proof is encoded as follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque HashValue[Hash.Nh];

struct {
  HashValue elements<0..2^16-1>;
} InclusionProof;
]]></sourcecode>
        <t>The contents of the <tt>elements</tt> array is in left-to-right order: if a node is
present in the root's left subtree, then its value is listed before the values
of any nodes in the root's right subtree, and so on recursively.</t>
        <t>Batching together inclusion and consistency proofs creates an edge case that
requires special care: when a user has requested a consistency proof, and also
requested inclusion proofs for leaves located in one or more of the subtrees
that the user has retained the head of. When this happens, the portion of the
batch proof that shows inclusion for the leaves in these subtrees will itself be
sufficient to recompute the retained head values. This makes the retained values
redundant for the purpose of computing the new root value, which could result in
the retained values being disregarded in a naive implementation. Users <bcp14>MUST</bcp14>
verify that the computed value for the head of any such subtree matches the
retained value to avoid accepting invalid proofs.</t>
      </section>
      <section anchor="prefix-tree-2">
        <name>Prefix Tree</name>
        <t>A proof from a prefix tree authenticates that a search was done correctly for a
given search key. Such a proof is encoded as:</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  inclusion(1),
  nonInclusionLeaf(2),
  nonInclusionParent(3),
  (255)
} PrefixSearchResultType;

struct {
  opaque vrf_output[VRF.Nh];
  opaque commitment[Hash.Nh];
} PrefixLeaf;

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

struct {
  PrefixSearchResult results<0..2^32-1>;
  HashValue elements<0..2^32-1>;
} PrefixProof;
]]></sourcecode>
        <t>The <tt>results</tt> field contains the search result for each search key,
provided in the order requested. For <tt>PrefixProof</tt> structures that correspond to
a binary ladder, this means the entries of <tt>results</tt> correspond directly with
the lookups done by the binary ladder. The <tt>result_type</tt> field of each
<tt>PrefixSearchResult</tt> 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 search key.</t>
          </li>
          <li>
            <t><tt>nonInclusionLeaf</tt> for a leaf node not matching the requested search key. In
this case, the terminal node is provided since it can not be inferred.</t>
          </li>
          <li>
            <t><tt>nonInclusionParent</tt> for the stand-in leaf of 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. The root node of the prefix tree
corresponds to a depth of 0, the root's children correspond to a depth of 1, and
so on recursively. In the context of a <tt>nonInclusionParent</tt> result, the <tt>depth</tt>
field contains the depth of the missing (stand-in) leaf node, not the depth of
the parent.</t>
        <t>Each entry in the <tt>results</tt> array conveys the leaf node where a search
terminated. The <tt>elements</tt> array consists of the fewest node values that can be
hashed together with these 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 is listed before any values from nodes that are
in the root's right subtree, and so on recursively. In the event that a node
does not exist, 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 values, in the
left/right arrangement dictated by the bits of the search keys, 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>As users execute the algorithms defined in <xref target="updating-views-of-the-tree"/>,
<xref target="greatest-version-search"/>, <xref target="fixed-version-search"/>, <xref target="monitoring-the-tree"/>,
and <xref target="updating-a-label"/>, they inspect a series of log entries. For some of
these, only the timestamp of the log entry is needed. For others, both the
timestamp and a <tt>PrefixProof</tt> from the log entry's prefix tree are needed.</t>
        <t>This subsection defines a general structure, called a <tt>CombinedTreeProof</tt>, that
contains the minimum set of timestamps and <tt>PrefixProof</tt> structures that a user
needs for their execution of these algorithms. For the purposes of this
protocol, the user always executes the algorithm to update their view of the
tree as described in <xref target="updating-views-of-the-tree"/>, followed immediately by one
or more of the other algorithms.</t>
        <t>Proofs are encoded as follows:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  uint64 timestamps<0..2^8-1>;
  PrefixProof prefix_proofs<0..2^8-1>;
  HashValue prefix_roots<0..2^8-1>;

  InclusionProof inclusion;
} CombinedTreeProof;
]]></sourcecode>
        <t>The <tt>timestamps</tt> field contains the timestamps of specific log entries, and the
<tt>prefix_proofs</tt> field contains search proofs from the prefix trees of specific
log entries. There is no explicit indication as to which log entry each element
corresponds to. Instead, elements are provided in the order that the algorithm
the user is executing would request them: the association between an element and
a log entry is established only by executing the algorithm, and the structure is
not designed to be interpreted independently of doing so.</t>
        <t>Users process a <tt>CombinedTreeProof</tt> by executing the algorithms for the
operation at hand, treating the <tt>timestamps</tt> and <tt>prefix_proofs</tt> fields as
queues and maintaining a running association between log entries and the data
consumed from the queues so far:</t>
        <ul spacing="normal">
          <li>
            <t>The first time an algorithm requires the timestamp of a given log entry, the
next element of <tt>timestamps</tt> is consumed and remembered as that log entry's
timestamp. If the timestamp of the same log entry is required again, whether
by the same algorithm or a later one, the remembered value is reused and
nothing is consumed. Repeated references are common: for example, the
timestamps of frontier log entries provided while updating the user's view of
the tree are required again when identifying the rightmost distinguished log
entry at the start of a greatest-version search, and the algorithm in
<xref target="contact-algorithm"/> inspects the overlapping direct paths of several
monitored log entries.</t>
          </li>
          <li>
            <t>When the user has advertised a previously observed tree size in their
request, the timestamps of log entries that the user is expected to have
retained (those along the frontier of the previously observed tree) are never
present in <tt>timestamps</tt>; the retained values are used instead.</t>
          </li>
          <li>
            <t>Each time an algorithm requires a series of lookups (such as a binary ladder)
from a log entry's prefix tree, the next element of <tt>prefix_proofs</tt> is
consumed and evaluated, producing a candidate prefix tree root hash that is
remembered as belonging to that log entry. If multiple proofs are consumed
for the same log entry, users <bcp14>MUST</bcp14> verify that they all produce the same
root hash. If the log entry is one whose data the user retained, users <bcp14>MUST</bcp14>
verify that the produced root hash matches their retained prefix tree root
hash for that log entry, due to the fact that the log entry will not be
covered by <tt>inclusion</tt>.
            </t>
            <ul spacing="normal">
              <li>
                <t>Any time an element of <tt>prefix_proofs</tt> is consumed where the corresponding
log entry's timestamp is not known, either because it wasn't retained or
hasn't already been requested by a previous algorithm, the next element of
<tt>timestamps</tt> is consumed and remembered as belonging to that log entry. This
is the case even if the algorithm itself does not use the timestamp, because
a log entry's timestamp is needed to compute its leaf value.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The subsections below state, for each algorithm, which timestamps and which
<tt>PrefixProof</tt> structures are provided. The contents of the remaining two fields
are not specified per-algorithm because they are fully determined by the
association established above:</t>
        <ul spacing="normal">
          <li>
            <t>The elements of the <tt>prefix_roots</tt> field are, in left-to-right order, the
prefix tree root hashes of the log entries that have an associated timestamp
from <tt>timestamps</tt> but no associated prefix tree root hash from
<tt>prefix_proofs</tt>. Combined with its timestamp, this allows the user to compute
each such log entry's leaf value.</t>
          </li>
          <li>
            <t>The <tt>inclusion</tt> field contains the minimum set of node values from the log
tree that would allow a user to compute:  </t>
            <ul spacing="normal">
              <li>
                <t>The root value of the log tree, and</t>
              </li>
              <li>
                <t>If an <tt>AuditorTreeHead</tt> was provided by the Transparency Log, the root
value of the log tree when it had <tt>AuditorTreeHead.tree_size</tt> leaves,</t>
              </li>
            </ul>
            <t>
from the following:  </t>
            <ul spacing="normal">
              <li>
                <t>The values of all leaf nodes whose timestamp was provided in <tt>timestamps</tt>,
and</t>
              </li>
              <li>
                <t>If the user advertised a previously observed tree size in their request,
any intermediate node values the user is expected to have retained.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Note that this is the case even when an algorithm's subsection lists no
additional timestamps: for example, a greatest-version search performed by a
returning user typically results in a non-empty <tt>prefix_roots</tt> field (covering
frontier log entries whose timestamps were provided while updating the user's
view of the tree, but from which the search did not require a binary ladder)
and a non-empty <tt>inclusion</tt> field.</t>
        <t>Users processing a <tt>CombinedTreeProof</tt> <bcp14>MUST</bcp14> verify that the <tt>timestamps</tt>,
<tt>prefix_proofs</tt>, and <tt>prefix_roots</tt> fields contain exactly the expected number
of entries -- no more and no less. Additionally, users <bcp14>MUST</bcp14> verify that the
timestamps explicitly included in <tt>timestamps</tt>, along with any retained
timestamps, represent a monotonic series. That is, users verify that any given
timestamp is greater than or equal to all observed timestamps to its left.</t>
        <t>The Transparency Log can construct a <tt>CombinedTreeProof</tt> by executing exactly
the same algorithms as the user, appending each timestamp or search proof to
the structure the first time it would be requested, rather than consuming it.
This guarantees that the prover and the verifier agree on the contents and
order of every field. This strategy, along with a worked example showing the
exact contents of a <tt>CombinedTreeProof</tt> for a greatest-version search, is
discussed further in <xref target="appendix-combined-tree"/>.</t>
        <section anchor="updating-view">
          <name>Updating View</name>
          <t>For a user to update their view of the tree, the following is provided:</t>
          <ul spacing="normal">
            <li>
              <t>If the user has not previously observed a tree head, the timestamp of each log
entry along the frontier.</t>
            </li>
            <li>
              <t>If the user has previously observed a tree head, the timestamp of each log
entry from the list computed in <xref target="update-view-algorithm"/>.</t>
            </li>
          </ul>
        </section>
        <section anchor="greatest-version-search-1">
          <name>Greatest-Version Search</name>
          <t>For a user to search the combined tree for the greatest version of a label, the
following is provided:</t>
          <ul spacing="normal">
            <li>
              <t>From each log entry along the frontier, starting from the log entry identified
in <xref target="gv-algorithm"/>, a <tt>PrefixProof</tt> corresponding to a search binary ladder.</t>
            </li>
          </ul>
          <t>Note that the frontier log entry timestamps are either already provided as part
of updating the user's view of the tree, or are expected to have been retained
by the user, and no additional timestamps are necessary to identify the starting
log entry.</t>
        </section>
        <section anchor="fixed-version-search-1">
          <name>Fixed-Version Search</name>
          <t>For a user to search the combined tree for a specific version of a label, the
following is provided:</t>
          <ul spacing="normal">
            <li>
              <t>For each log entry touched by the algorithm in <xref target="fv-algorithm"/>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The log entry's timestamp.</t>
                </li>
                <li>
                  <t>If the log entry is not expired, then a <tt>PrefixProof</tt> corresponding to a
search binary ladder in the log entry's prefix tree.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>If step 6.3 is reached, a second <tt>PrefixProof</tt> from the identified log entry
specifically looking up the target version.</t>
            </li>
          </ul>
        </section>
        <section anchor="contact-monitoring">
          <name>Contact Monitoring</name>
          <t>For a user to monitor a label in the combined tree, the following is provided:</t>
          <ul spacing="normal">
            <li>
              <t>For each entry in the user's monitoring map, from rightmost to leftmost log
entry:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The timestamp of each log entry on the path from the root to the parent of
the log entry in the user's monitoring map, stopping if a non-distinguished
log entry is established.</t>
                </li>
                <li>
                  <t>From each log entry in the list computed in <xref target="contact-algorithm"/>, a
<tt>PrefixProof</tt> corresponding to a monitoring binary ladder.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="owner-initialization">
          <name>Owner Initialization</name>
          <t>For a label owner to initialize their state to begin monitoring a label, the
following is provided:</t>
          <ul spacing="normal">
            <li>
              <t>The timestamp of each log entry on the path from the root to the user's
requested starting position, if one was provided.</t>
            </li>
            <li>
              <t>For each log entry in the list computed in the first algorithm of
<xref target="owner-algorithm"/>, a <tt>PrefixProof</tt> corresponding to a search binary ladder.</t>
            </li>
          </ul>
          <t>The timestamps are provided to allow both the client and server to verify the
precondition that the user's requested starting position is unexpired and
distinguished. If no starting position was provided, nothing is provided beyond
the output of updating the user's view of the tree.</t>
        </section>
        <section anchor="owner-monitoring">
          <name>Owner Monitoring</name>
          <t>For a label owner to perform regular monitoring, the following is provided:</t>
          <ul spacing="normal">
            <li>
              <t>The timestamp for each log entry that causes the second algorithm of
<xref target="owner-algorithm"/> to recurse either left or right.</t>
            </li>
            <li>
              <t>For each log entry that reaches step 5 in the second algorithm of
<xref target="owner-algorithm"/>, a <tt>PrefixProof</tt> corresponding to a search binary ladder.</t>
            </li>
          </ul>
        </section>
        <section anchor="updating-a-label-1">
          <name>Updating a Label</name>
          <t>For a label owner to verify that some new versions of a label have been
correctly inserted, the following is provided:</t>
          <ul spacing="normal">
            <li>
              <t>The timestamp of each log entry on the path from the root to the parent of the
rightmost log entry of the previous tree, stopping if a non-distinguished log
entry is established.</t>
            </li>
            <li>
              <t>The timestamp of each log entry on the path from the root to the parent of the
log entry where the new versions were inserted, stopping if a
non-distinguished log entry is established.</t>
            </li>
            <li>
              <t>Any <tt>PrefixProof</tt> structures that may be required by steps 2.2, 3, or 4 of the
algorithm in <xref target="update-algorithm"/>.</t>
            </li>
          </ul>
        </section>
        <section anchor="walking-distinguished-heads-1">
          <name>Walking Distinguished Heads</name>
          <t>For a user to walk the most recent distinguished log entries, the following is
provided:</t>
          <ul spacing="normal">
            <li>
              <t>The timestamp of each log entry that reaches step 2 of the algorithm in
<xref target="distinguished-algorithm"/>.</t>
            </li>
          </ul>
        </section>
      </section>
    </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.</t>
      <t>Users <bcp14>MUST</bcp14> retain the most recent <tt>TreeHead</tt> and <tt>AuditorTreeHead</tt> they've
successfully verified as part of any query response, and populate the <tt>last</tt>
field of any subsequent query request with the <tt>tree_size</tt> of the last
<tt>TreeHead</tt>. This ensures that all operations performed by the user return
consistent results.</t>
      <t>Modifications to a user's state <bcp14>MUST</bcp14> only be persisted once the query response
has been fully verified. Queries that fail full verification <bcp14>MUST NOT</bcp14> modify the
user's protocol state in any way.</t>
      <section anchor="search">
        <name>Search</name>
        <t>Users initiate a Search operation by submitting a <tt>SearchRequest</tt> to the
Transparency Log containing the label that they wish to search for. Users can
optionally specify a version of the label that they'd like to receive, if not
the greatest one.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  optional<uint64> last;

  opaque label<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 {
  opaque proof[VRF.Np];
  optional<HashValue> commitment;
} BinaryLadderStep;

struct {
  FullTreeHead full_tree_head;

  select (SearchRequest.version) {
    case absent:
      uint32 version;
  };
  opaque opening[Nc];
  UpdateValue value;

  BinaryLadderStep binary_ladder<0..2^8-1>;
  CombinedTreeProof search;
} SearchResponse;
]]></sourcecode>
        <t>If no target version was specified in <tt>SearchRequest.version</tt> for a
fixed-version search, the greatest version of the label is provided in
<tt>SearchResponse.version</tt>.</t>
        <t>Each <tt>BinaryLadderStep</tt> structure contains information related to one version of
the label in the binary ladder for the target version, listed in the same order
that the versions are output by the algorithm in <xref target="binary-ladder"/>. The <tt>proof</tt>
field contains the VRF proof. The <tt>commitment</tt> field contains the commitment to
the label's value at that version. The <tt>commitment</tt> field is omitted only for
versions of the label that don't exist and for the target version of the label,
as the commitment to the target version is computed from <tt>opening</tt> and <tt>value</tt>.</t>
        <t>The <tt>search</tt> field contains the output of updating the user's view of the tree
to match <tt>TreeHead.tree_size</tt> followed by either a fixed-version or
greatest-version search for the requested label.</t>
        <t>Users verify a <tt>SearchResponse</tt> by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify <tt>value</tt> as described in <xref target="update-format"/>.</t>
          </li>
          <li>
            <t>Verify that the expected number of entries is present in <tt>binary_ladder</tt> and
that no commitment value is provided for the target version.</t>
          </li>
          <li>
            <t>Compute the VRF output for each version of the label from the proofs in
<tt>binary_ladder</tt>. Compute the commitment to the value of the target version
with <tt>opening</tt> and <tt>value</tt>.</t>
          </li>
          <li>
            <t>If <tt>SearchRequest.version</tt> is absent, verify the proof in <tt>search</tt> as
described in <xref target="gv-algorithm"/>. Otherwise, verify the proof in <tt>search</tt> as
described in <xref target="fv-algorithm"/>.</t>
          </li>
          <li>
            <t>Compute a candidate root value for the tree from the proof in
<tt>search.inclusion</tt> and any previously retained full subtrees of the log tree.</t>
          </li>
          <li>
            <t>With the candidate root value for the tree, verify <tt>FullTreeHead</tt> as
described in <xref target="full-tree-head-verification"/>.</t>
          </li>
        </ol>
        <t>Note that this document doesn't define a way to encode a negative result (for a
missing label or version) in a <tt>SearchResponse</tt>. This functionality was omitted
due to its low expected utility. Unless a client has adopted a documented
protocol for encoding negative search results, clients <bcp14>MUST</bcp14> consider any
<tt>SearchResponse</tt> with a negative result as invalid and having failed validation.</t>
      </section>
      <section anchor="contact-monitor">
        <name>Contact Monitor</name>
        <t>If the Transparency Log is deployed in Contact Monitoring mode, users that
looked up a label initiate a Contact Monitoring operation by submitting a
<tt>ContactMonitorRequest</tt> to the Transparency Log containing information about the
label they wish to monitor.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint64 position;
  uint32 version;
} MonitorMapEntry;

struct {
  optional<uint64> last;

  opaque label<0..2^8-1>;
  MonitorMapEntry entries<0..2^8-1>;
} ContactMonitorRequest;
]]></sourcecode>
        <t>The Transparency Log verifies that each <tt>MonitorMapEntry</tt> in <tt>entries</tt> is sorted
in ascending order by <tt>position</tt>, that no <tt>position</tt> or <tt>version</tt> is duplicate,
and that <tt>position</tt> always lies on the direct path of the first log entry to
contain the associated version of the label. In turn, the Transparency Log
responds with a <tt>ContactMonitorResponse</tt> structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  FullTreeHead full_tree_head;
  CombinedTreeProof monitor;
} ContactMonitorResponse;
]]></sourcecode>
        <t>The <tt>monitor</tt> field contains the output of updating the user's view of the tree
to match <tt>TreeHead.tree_size</tt> followed by executing the algorithm in
<xref target="contact-algorithm"/>. Users verify a <tt>ContactMonitorResponse</tt> by following
these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify the proof in <tt>monitor</tt> as described in <xref target="contact-algorithm"/>.</t>
          </li>
          <li>
            <t>Compute a candidate root value for the tree from the proof in
<tt>monitor.inclusion</tt> and any previously retained full subtrees of the log
tree.</t>
          </li>
          <li>
            <t>With the candidate root value for the tree, verify <tt>FullTreeHead</tt> as
described in <xref target="full-tree-head-verification"/>.</t>
          </li>
        </ol>
        <t>While access control decisions generally belong solely to the application, users
of a Transparency Log deployed in Contact Monitoring mode <bcp14>MUST</bcp14> be able to
monitor versions of a label they previously looked up, even if they would no
longer be allowed to make the same query. One simple way for a user to prove
that they were previously allowed to look up a particular version of a label
would be for them to provide the corresponding commitment opening.</t>
      </section>
      <section anchor="owner-initialization-1">
        <name>Owner Initialization</name>
        <t>Users that wish to initialize their owner state for a label submit an
<tt>OwnerInitRequest</tt> to the Transparency Log containing the label they wish to
take ownership of and their desired starting log entry.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  optional<uint64> last;

  opaque label<0..2^8-1>;
  optional<uint64> start;
} OwnerInitRequest;
]]></sourcecode>
        <t>If <tt>start</tt> is absent, the user wishes to own the label from the start of the
log's existence. If <tt>start</tt> is present, the Transparency Log verifies that it
identifies a log entry that is unexpired and distinguished. In turn, the
Transparency Log responds with an <tt>OwnerInitResponse</tt> structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  FullTreeHead full_tree_head;

  uint32 greatest_versions<0..2^8-1>;
  BinaryLadderStep binary_ladder<0..2^16-1>;
  CombinedTreeProof init;
} OwnerInitResponse;
]]></sourcecode>
        <t>The <tt>greatest_versions</tt> field contains the greatest version of the label that
exists in each log entry computed in step 1 of the first algorithm in
<xref target="owner-algorithm"/>, ending at the first log entry where the label doesn't
exist.</t>
        <t>The <tt>binary_ladder</tt> field contains one entry for each version computed in step 3
of the first algorithm in <xref target="owner-algorithm"/>, in ascending order by version. If
a version of the label exists as of the starting position, the commitment to the
label's value at that version is provided in the <tt>commitment</tt> field of the
<tt>BinaryLadderStep</tt>.</t>
        <t>The <tt>init</tt> field contains the output of updating the user's view of the tree to
match <tt>TreeHead.tree_size</tt> followed by executing the first algorithm in
<xref target="owner-algorithm"/>.</t>
        <t>Users verify an <tt>OwnerInitResponse</tt> by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that the number of entries in <tt>greatest_versions</tt> is less than or
equal to the number of log entries in the computed list, and that
<tt>greatest_versions</tt> is in descending order.</t>
          </li>
          <li>
            <t>Verify that the expected number of entries is present in <tt>binary_ladder</tt> and
that a commitment is provided for each version in <tt>greatest_versions</tt>. (Note
that the existence of a version does not require the existence of all lesser
versions.) Compute the VRF output for each version of the label from the
proofs in <tt>binary_ladder</tt>.</t>
          </li>
          <li>
            <t>Verify the proof in <tt>init</tt> as described in the first algorithm of
<xref target="owner-algorithm"/>.</t>
          </li>
          <li>
            <t>Compute a candidate root value for the tree from the proof in
<tt>init.inclusion</tt> and any previously retained full subtrees of the log tree.</t>
          </li>
          <li>
            <t>With the candidate root value for the tree, verify <tt>FullTreeHead</tt> as
described in <xref target="full-tree-head-verification"/>.</t>
          </li>
        </ol>
        <t>Note that if <tt>start</tt> was absent in the request, the response <tt>greatest_versions</tt>
will be empty and <tt>binary_ladder</tt> will contain only the VRF proof for version
zero (with no commitment). All versions of the label are processed by the user
through the algorithm in <xref target="updating-a-label"/>.</t>
      </section>
      <section anchor="owner-monitoring-1">
        <name>Owner Monitoring</name>
        <t>Users that wish to monitor a label they own submit an <tt>OwnerMonitorRequest</tt> to
the Transparency Log containing the label they wish to monitor and their current
monitoring state.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  optional <uint64> last;

  opaque label<0..2^8-1>;
  MonitorMapEntry entries<0..2^8-1>;
  optional<uint64> start;
  optional<uint32> greatest_version;
} OwnerMonitorRequest;
]]></sourcecode>
        <t>The <tt>entries</tt> list contains the label owner's monitoring state for versions of
the label that have not yet been proven to be included in a distinguished log entry. The
<tt>start</tt> field contains the rightmost distinguished log entry that the label
owner has verified as correct, or is absent if the label owner hasn't verified
any log entry and wishes to start monitoring from the leftmost distinguished log
entry that exists. The <tt>greatest_version</tt> field contains the greatest version of
the label that the label owner is aware of, if any.</t>
        <t>The Transparency Log verifies an <tt>OwnerMonitorRequest</tt> by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that each MonitorMapEntry in <tt>entries</tt> is sorted in ascending order by
<tt>position</tt>, that no <tt>position</tt> or <tt>version</tt> is duplicate, and that <tt>position</tt>
always lies on the direct path of the first log entry to contain the
associated version of the label.</t>
          </li>
          <li>
            <t>Verify that <tt>start</tt> is either absent, or less than the size of the tree.</t>
          </li>
          <li>
            <t>Verify that <tt>greatest_version</tt> is either absent, or less than or equal to the
greatest version of the label. Verify that, if <tt>start</tt> is present and some
version of the label existed at <tt>start</tt>, that <tt>greatest_version</tt> is present
and greater than or equal to that version.</t>
          </li>
        </ol>
        <t>In turn, the Transparency Log responds with an <tt>OwnerMonitorResponse</tt> structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  FullTreeHead full_tree_head;
  CombinedTreeProof monitor;
} OwnerMonitorResponse;
]]></sourcecode>
        <t>The <tt>monitor</tt> field contains the output of updating the user's view of the tree
to match <tt>TreeHead.tree_size</tt>, followed by executing the algorithm in
<xref target="contact-algorithm"/>, followed by executing the second algorithm in
<xref target="owner-algorithm"/>. Users verify an <tt>OwnerMonitorResponse</tt> by following these
steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify the proof in <tt>monitor</tt> as described in <xref target="contact-algorithm"/> and the
second algorithm of <xref target="owner-algorithm"/>.</t>
          </li>
          <li>
            <t>Compute a candidate root value for the tree from the proof in
<tt>monitor.inclusion</tt> and any previously retained full subtrees of the log
tree.</t>
          </li>
          <li>
            <t>With the candidate root value for the tree, verify <tt>FullTreeHead</tt> as
described in <xref target="full-tree-head-verification"/>.</t>
          </li>
        </ol>
      </section>
      <section anchor="updating-a-label-2">
        <name>Updating a Label</name>
        <t>Users that wish to create one or more new versions of a label they own submit an
<tt>UpdateRequest</tt> to the Transparency Log containing the label and the new values
to store.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque value<0..2^32-1>;
} LabelValue;

struct {
  optional<uint64> last;

  opaque label<0..2^8-1>;
  optional<uint32> greatest_version;
  LabelValue values<0..2^8-1>;
} UpdateRequest;
]]></sourcecode>
        <t>The <tt>greatest_version</tt> field contains the greatest version of the label that the
user is aware of, if any. The <tt>values</tt> field contains the values for the new
versions of the label that the user would like to create. The <tt>values</tt> field <bcp14>MAY</bcp14>
be empty to indicate that the user only wishes to be informed of
already-existing versions of the label greater than <tt>greatest_version</tt>, rather
than create any new ones.</t>
        <t>If <tt>greatest_version</tt> is less than the current greatest version of the label,
<tt>values</tt> is disregarded and the Transparency Log responds with an
<tt>UpdateResponse</tt> structure for the already-existing version <tt>greatest_version+1</tt>
and any subsequent versions that were created in the same log entry.</t>
        <t>If <tt>greatest_version</tt> matches the current greatest version of the label and
<tt>values</tt> is non-empty, the Transparency Log inserts the new versions of the
label into the prefix tree, sequences a new log entry, and responds with an
<tt>UpdateResponse</tt> structure. Version counters are assigned sequentially and in
the same order as given in <tt>values</tt>.</t>
        <t>If <tt>greatest_version</tt> matches the current greatest version of the label and
<tt>values</tt> is empty, or if <tt>greatest_version</tt> is greater than the current greatest
version of the label, the Transparency Log rejects the request.</t>
        <t>The <tt>UpdateResponse</tt> structure is defined as:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque opening[Nc];
  UpdateSuffix suffix;
} UpdateInfo;

struct {
  FullTreeHead full_tree_head;

  uint64 position;
  select (Configuration.mode) {
    case thirdPartyManagement:
      uint32 skipped_versions;
  };
  LabelValue values<0..2^8-1>;
  UpdateInfo info<0..2^8-1>;

  BinaryLadderStep binary_ladder<0..2^8-1>;
  CombinedTreeProof update;
} UpdateResponse;
]]></sourcecode>
        <t>The <tt>position</tt> field contains the index of the log entry where the new versions
of the label were inserted. This may or may not be the rightmost log entry.</t>
        <t>If a Third-Party Manager is present, the <tt>skipped_versions</tt> field contains the
number of version counters that were skipped due to desynchronization between
the Service Operator and the Third-Party Manager (discussed in <xref target="management"/>).
Skipped versions are added to the prefix tree with an all-zero commitment value,
and are given lower version counters than any unskipped versions created in the
same log entry.</t>
        <t>If <tt>greatest_version</tt> was less than the current greatest version of the label,
<tt>UpdateResponse.values</tt> contains the values of all of the subsequent versions of
the label that were created in the log entry <tt>position</tt>, in ascending order by
version, not including skipped versions. If <tt>UpdateResponse.values</tt> is
non-empty, this indicates that <tt>UpdateRequest.values</tt> was disregarded by the
Transparency Log. Inversely, if <tt>UpdateResponse.values</tt> is empty, this indicates
that all of the new versions of the label in <tt>UpdateRequest.values</tt> were
successfully created and no versions of the label other than the indicated
number of skipped versions, followed by those in <tt>UpdateRequest.values</tt>, were
created in the log entry <tt>position</tt>.</t>
        <t>The <tt>info</tt> field contains an <tt>UpdateInfo</tt> for each new and unskipped version of
the label created in the log entry <tt>position</tt>. The entries of <tt>info</tt> correspond
to the entries of <tt>UpdateResponse.values</tt> if it is non-empty, and to the entries
of <tt>UpdateRequest.values</tt> otherwise.</t>
        <t>The <tt>opening</tt> field of an <tt>UpdateInfo</tt> structure contains the commitment opening
that was chosen for the version of the label and, if in Third-Party Management
mode, the <tt>suffix</tt> field contains the Service Operator's signature over the new
value.</t>
        <t>The <tt>binary_ladder</tt> field contains VRF proofs for the versions specified in
<xref target="update-algorithm"/> in ascending order by version. If a version of a label
exists and is less than the user's advertised <tt>greatest_version</tt>, the commitment
to the label's value at that version is provided in the <tt>commitment</tt> field of
the BinaryLadderStep.</t>
        <t>The <tt>update</tt> field contains the output of updating the user's view of the tree
to match <tt>TreeHead.tree_size</tt>, followed by executing the algorithm in
<xref target="update-algorithm"/>. Users verify an <tt>UpdateResponse</tt> by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that <tt>position</tt> is to the right of where the previous greatest version
of the label was inserted. If this is the first version inserted since the
user became the label owner, verify that <tt>position</tt> is to the right of the
starting position chosen in <xref target="owner-algorithm"/>.</t>
          </li>
          <li>
            <t>If <tt>UpdateResponse.values</tt> is non-empty, verify that the length of <tt>info</tt> is
equal to that of <tt>UpdateResponse.values</tt>. Otherwise, verify that the length
of <tt>info</tt> is equal to that of <tt>UpdateRequest.values</tt>. Regardless, verify that
<tt>info</tt> is non-empty.</t>
          </li>
          <li>
            <t>If a Third-Party Manager is present, verify that the signatures provided in
each element of <tt>info</tt> are valid.</t>
          </li>
          <li>
            <t>Verify that the expected number of entries is present in <tt>binary_ladder</tt>,
that all of the proofs properly evaluate into a VRF output, and that no
commitment is provided for any version greater than <tt>greatest_version</tt>.</t>
          </li>
          <li>
            <t>Verify the proof in <tt>update</tt> as described in <xref target="update-algorithm"/>.</t>
          </li>
          <li>
            <t>Compute a candidate root value for the tree from the proof in
<tt>update.inclusion</tt> and any previously retained full subtrees of the log tree.</t>
          </li>
          <li>
            <t>With the candidate root value for the tree, verify <tt>FullTreeHead</tt> as
described in <xref target="full-tree-head-verification"/>.</t>
          </li>
        </ol>
        <t>The Transparency Log <bcp14>MAY</bcp14> provide multiple <tt>UpdateResponse</tt> structures in
response to a single <tt>UpdateRequest</tt>, each corresponding to a subsequent
<tt>position</tt> where more new versions of the label were inserted. These
<tt>UpdateResponse</tt> structures are processed by clients serially as if an
<tt>UpdateRequest</tt> with the following parameters had been sent:</t>
        <ul spacing="normal">
          <li>
            <t><tt>last</tt> set to the tree size of the previously processed <tt>UpdateResponse</tt></t>
          </li>
          <li>
            <t><tt>label</tt> set to the same value as the previous <tt>UpdateRequest</tt></t>
          </li>
          <li>
            <t><tt>greatest_version</tt> incremented to cover the versions created (including those
skipped) by the previously processed <tt>UpdateResponse</tt></t>
          </li>
          <li>
            <t><tt>values</tt> remains unchanged until the first <tt>UpdateResponse</tt> with an empty
<tt>values</tt> field is received, and is empty from then on.</t>
          </li>
        </ul>
      </section>
      <section anchor="walking-distinguished-heads-2">
        <name>Walking Distinguished Heads</name>
        <t>Users that wish to walk the recently issued distinguished log entries submit a
<tt>DistinguishedRequest</tt> to the Transparency Log, optionally containing their
requested stopping position.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  optional<uint64> last;
  optional<uint64> stop;
} DistinguishedRequest;
]]></sourcecode>
        <t>In turn, the Transparency Log responds with a <tt>DistinguishedResponse</tt> structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  FullTreeHead full_tree_head;
  CombinedTreeProof distinguished;
} DistinguishedResponse;
]]></sourcecode>
        <t>Users verify a <tt>DistinguishedResponse</tt> by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify the proof in <tt>distinguished</tt> as described in
<xref target="distinguished-algorithm"/>.</t>
          </li>
          <li>
            <t>Compute a candidate root value for the tree from the proof in
<tt>distinguished.inclusion</tt> and any previously retained full subtrees of the
log tree.</t>
          </li>
          <li>
            <t>With the candidate root value for the tree, verify <tt>FullTreeHead</tt> as
described in <xref target="full-tree-head-verification"/>.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="credentials">
      <name>Credentials</name>
      <t><strong>Credentials</strong> are proofs that are designed to be sent directly between users
and verified without direct interaction with the Transparency Log. They are
frequently useful in applications where anonymity is important, as they
generally prevent users from needing to make direct requests to the Transparency
Log regarding their contacts.</t>
      <t>Credentials are encoded as follows:</t>
      <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  standard(1),
  provisional(2),
  (255)
} CredentialType;

struct {
  opaque label<0..2^8-1>;

  uint32 version;
  opaque opening[Nc];
  UpdateValue value;
  BinaryLadderStep binary_ladder<0..2^8-1>;

  uint64 position;
  CredentialType credential_type;
  select (Credential.credential_type) {
    case standard:
      PrefixProof distinguished;
    case provisional:
      TreeHead tree_head;
      CombinedTreeProof search;
  };
} Credential;
]]></sourcecode>
      <t>In essence, credentials in KT are implemented as a greatest-version search for a
user's <tt>label</tt>. As such, the fields <tt>version</tt>, <tt>opening</tt>, <tt>value</tt>, and
<tt>binary_ladder</tt> are the same as they would be in a <tt>SearchResponse</tt> for a
greatest-version search, described in <xref target="search"/>.</t>
      <t>The <tt>position</tt> field contains the position of a recently issued distinguished
log entry, and this log entry will be the basis for verifying the credential.
Applications define their own policy for what constitutes a "recently issued"
distinguished log entry. Users can learn of and retain all of the recently
issued distinguished log entries by making a <tt>DistinguishedRequest</tt> or through
the process of monitoring labels they own. Once a distinguished log entry no
longer meets the application's definition of "recent", any credentials relying
on the log entry are considered expired.</t>
      <t>A user that supports receiving and verifying credentials <bcp14>SHOULD</bcp14> refresh its view
of the recently issued distinguished log entries roughly as frequently as the
RMW and <bcp14>MUST</bcp14>, if at all possible, refresh its view frequently enough to prevent
gaps in its knowledge. Gaps in a user's knowledge of the recently issued
distinguished log entries primarily occur when a distinguished log entry is able
to be issued and then fall out of the application's definition of "recent"
before the user is able to make a <tt>DistinguishedRequest</tt>.</t>
      <t>The <tt>credential_type</tt> field specifies whether the credential is of the
<tt>standard</tt> type, meaning that the target label-version pair is included in the
chosen distinguished log entry, or is of the <tt>provisional</tt> type, meaning that
the label-version pair is not included in the chosen distinguished log entry.</t>
      <t>Regardless of credential type, users start verification of a credential by
following these steps:</t>
      <ol spacing="normal" type="1"><li>
          <t>Verify that the user is aware of a recently issued distinguished log entry at
<tt>position</tt>. To preserve the efficiency of the protocol and (potentially) the
sender's anonymity, implementations <bcp14>MUST NOT</bcp14> use a verification failure at
this point as a prompt to request updates from the Transparency Log.</t>
        </li>
        <li>
          <t>Verify <tt>value</tt> as described in <xref target="update-format"/>.</t>
        </li>
        <li>
          <t>Verify that the expected number of entries is present in <tt>binary_ladder</tt> and
that no commitment value is provided for the target version.</t>
        </li>
        <li>
          <t>Compute the VRF output for each version of the label from the proofs in
<tt>binary_ladder</tt>. Compute the commitment to the value of the target version
with <tt>opening</tt> and <tt>value</tt>.</t>
        </li>
      </ol>
      <t>Additional verification based on credential type is described in the following
two subsections.</t>
      <section anchor="standard">
        <name>Standard</name>
        <t>If the credential type is standard, the <tt>distinguished</tt> field is present and
contains lookups corresponding to a search binary ladder for the target version
of the label in the indicated log entry.</t>
        <t>Users follow these steps to verify a standard credential:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that the binary ladder in <tt>distinguished</tt> terminates in a way
that is consistent with <tt>version</tt> being the greatest version of the label
that exists.</t>
          </li>
          <li>
            <t>Verify that the prefix tree root value produced by evaluating <tt>distinguished</tt>
matches that of the recently issued distinguished log entry at <tt>position</tt>.</t>
          </li>
        </ol>
      </section>
      <section anchor="provisional">
        <name>Provisional</name>
        <t>If the credential type is provisional, the <tt>tree_head</tt> and <tt>search</tt> fields are
present. The <tt>tree_head</tt> field contains a signature from the Transparency Log
over a view of the tree that includes <tt>position</tt> and additional log entries to
its right. The <tt>search</tt> field contains the output of updating the user's view of
the tree from a tree size of <tt>position+1</tt> to <tt>TreeHead.tree_size</tt>, followed by a
greatest-version search for <tt>label</tt>.</t>
        <t>Users follow these steps to <em>initially verify</em> a provisional credential:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that <tt>TreeHead.tree_size</tt> is greater than <tt>position</tt>.</t>
          </li>
          <li>
            <t>Verify the proof in <tt>search</tt> as described in <xref target="gv-algorithm"/>. Verify that
the terminal log entry of the search is to the right of <tt>position</tt>.</t>
          </li>
          <li>
            <t>Compute a candidate root value for the tree from the proof in
<tt>search.inclusion</tt> and the retained full subtrees of the log tree.</t>
          </li>
          <li>
            <t>With the candidate root value for the tree, verify <tt>TreeHead.signature</tt> as
described in <xref target="tree-head-signature"/>.</t>
          </li>
        </ol>
        <t>Once initially verified, the contents of a credential can be consumed by the
application. The initial verification process explicitly rejects a provisional
credential if a standard credential could have been produced from the same log
entry <tt>position</tt>. However, when generating a credential, users <bcp14>MAY</bcp14> choose to
output a provisional credential from an older distinguished log entry rather
than a standard credential from a newer distinguished log entry. This can allow
users to accommodate reasonable delays in the distribution of newly issued
distinguished log entries.</t>
        <t>Provisional credentials that pass initial verification are retained by the
receiving user until the credential passes <em>final verification</em>. Final
verification occurs through one of two ways:</t>
        <t>First, if the terminal log entry of the search in <tt>Credential.search</tt> is later
determined to be distinguished, then the receiving user finally verifies the
credential by:</t>
        <ol spacing="normal" type="1"><li>
            <t>From the proof in <tt>Credential.search</tt>, compute the prefix tree root value of
the terminal log entry. Verify that this matches the user's retained state
(learned from making a <tt>DistinguishedRequest</tt> or through owner monitoring)
for the distinguished log entry at that position.</t>
          </li>
        </ol>
        <t>Alternatively, the terminal log entry may never become distinguished. In this
case, the position of the first distinguished log entry issued to the right of
the terminal log entry is denoted <tt>distinguished</tt>. Once this distinguished log
entry is established, the sender of the credential provides a <tt>CredentialUpdate</tt>
structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  CombinedTreeProof monitor;
} CredentialUpdate;
]]></sourcecode>
        <t>The proof in <tt>monitor</tt> contains the result of updating the user's view of the
tree from a size of <tt>Credential.tree_head.tree_size</tt> to a size of
<tt>distinguished+1</tt>. If the Transparency Log is deployed in Contact Monitoring
mode, the proof in <tt>monitor</tt> then contains the output of executing the algorithm
in <xref target="contact-algorithm"/>, which will follow the monitoring path from the
terminal log entry to the log entry at <tt>distinguished</tt>.</t>
        <t>Users follow these steps to verify a <tt>CredentialUpdate</tt>, which finally verifies
the provisional credential if successful:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that the user is aware of a recently issued distinguished log entry
with an index greater than or equal to that of the provisional credential's
terminal log entry. Again, a verification failure at this point <bcp14>MUST NOT</bcp14>
prompt a request for an updated tree head from the Transparency Log.</t>
          </li>
          <li>
            <t>Verify the proof in <tt>monitor</tt> as described in <xref target="update-view-algorithm"/> and,
if the Transparency Log is deployed in Contact Monitoring mode, as described
in <xref target="contact-algorithm"/>.</t>
          </li>
          <li>
            <t>Compute a candidate root value for the log tree with the proof in
<tt>monitor.inclusion</tt> and the full subtrees of the tree at size <tt>tree_size</tt> (as
computed from the proof in <tt>Credential.search</tt>). Verify that this matches the
user's retained state for the distinguished log entry at <tt>distinguished</tt>.</t>
          </li>
        </ol>
        <t>Verifying a provisional credential or its associated <tt>CredentialUpdate</tt> <bcp14>MUST NOT</bcp14>
have any effect on the state used for the user's direct interactions with the
Transparency Log, or on the verification of other credentials (even for the same
label). In particular, the view of the tree presented in a provisional
credential <bcp14>MUST NOT</bcp14> cause a user to change its view of the tree for any other
purpose.</t>
        <t>To minimize the potential for issues caused by clock skew, users <bcp14>SHOULD</bcp14> support
receiving a <tt>CredentialUpdate</tt> before they're capable of verifying it (due to
not knowing the necessary distinguished log entry yet) by queueing it for later
verification. If a user initially verifies a provisional credential and is
unable to finally verify it before the credential expires, the user <bcp14>MUST</bcp14> attempt
to obtain and verify a <tt>CredentialUpdate</tt> from the Transparency Log directly.
The user <bcp14>SHOULD</bcp14> attempt to fetch the <tt>CredentialUpdate</tt> over an anonymous
channel, to preserve the anonymity of the sending user as much as possible. If
the user is still unable to obtain or verify a <tt>CredentialUpdate</tt> structure for
a provisional credential, the credential <bcp14>SHOULD</bcp14> be reported to the user as
evidence of potential misbehavior by the Transparency Log.</t>
        <section anchor="detecting-forks-1">
          <name>Detecting Forks</name>
          <t>In a user's typical interactions with a Transparency Log, every response is
required to prove that it comes from the same view of the log tree as every
prior response. However, this model doesn't work for credential verification.
Since credentials are provided in a non-interactive and peer-to-peer manner,
when a user is creating a credential they have no way to know what other
credentials (and therefore which tree heads) the receiving user(s) may want to
check consistency with.</t>
          <t>KT addresses this by using the recently issued distinguished log entries as
common reference points for the state of the log tree. Users compute and retain
the full subtrees of the log tree at each point where a recently issued
distinguished log entry is the log's rightmost log entry. This retained state is
then used either implicitly or explicitly in credential verification.</t>
          <t>In particular, when a provisional credential is received, the proof in
<tt>Credential.search</tt> is constructed as if the user advertised a previously
observed tree size of <tt>Credential.position+1</tt>. As a result, computing the
candidate root value for the log tree requires incorporating the user's retained
full subtrees for the log tree up to this point. This prevents the user from
accepting a view of the log that forked at any point prior to the log entry at
<tt>Credential.position</tt>.</t>
          <t>When a <tt>CredentialUpdate</tt> is received, the proof it contains extends the view of
the tree presented in the credential to a size of <tt>distinguished+1</tt>. Users are
able to compare this with their locally retained view of the tree at that size,
ensuring that neither this view nor the one presented in the credential are
inconsistent with the other views received from the Transparency Log directly.</t>
        </section>
      </section>
    </section>
    <section anchor="third-parties">
      <name>Third Parties</name>
      <t>Third-Party Management and Third-Party Auditing are two deployment modes that
require the Transparency Log to delegate part of its operation to a third party.
Users are able to run more efficiently as long as they can assume that the
Transparency Log and the Third Party won't collude to trick them into accepting
malicious results.</t>
      <section anchor="management">
        <name>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 Transparency Log. The
Service Operator serves only to enforce access control, authorize the addition
of new versions of labels, and prevent the creation of forks by the Third-Party
Manager. Critically, the Service Operator is trusted to ensure that only one
value for each version of a label is authorized.</t>
        <t>All user queries specified in <xref target="user-operations"/> are initially sent by users
directly to the Service Operator and are forwarded to the Third-Party Manager if
they pass access control. While other operations are forwarded by the Service
Operator unchanged, <tt>UpdateRequest</tt> structures are forwarded to the Third-Party
Manager with the Service Operator's signature over each new value:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  optional<uint64> last;

  opaque label<0..2^8-1>;
  optional<uint32> greatest_version;
  UpdateValue values<0..2^8-1>;

  uint32 signed_version;
} ManagerUpdateRequest;
]]></sourcecode>
        <t>This structure is the same as <tt>UpdateRequest</tt>, except that the <tt>values</tt> field is
an array of <tt>UpdateValue</tt> structures with the Service Operator's signature over
each value, computed as described in <xref target="update-format"/>.</t>
        <t>This structure also contains a <tt>signed_version</tt> field. If <tt>values</tt> is empty, the
<tt>signed_version</tt> field is always zero. If <tt>values</tt> is non-empty, the
<tt>signed_version</tt> field contains the version that was used in the computation of
the Service Operator's signature over the first element of <tt>values</tt>.</t>
        <t>If <tt>values</tt> is non-empty and <tt>signed_version</tt> is greater than the next greatest
version of the label to be created, the Manager <bcp14>MUST</bcp14> insert a sufficient number
of "dummy" entries into the Transparency Log's prefix tree such that the next
greatest version of the label to be created is <tt>signed_version</tt>, before
inserting the versions requested in the <tt>ManagerUpdateRequest</tt>. These dummy
entries, which map the VRF output for each label-version pair to an all-zero
commitment, serve the function of skipping the corresponding version counters.</t>
        <t>If <tt>signed_version</tt> is less than the next greatest version of the label to be
created, this strongly indicates a serious bug in the Service Operator and the
request <bcp14>MUST</bcp14> be rejected by the Manager.</t>
      </section>
      <section anchor="auditing">
        <name>Auditing</name>
        <t>With the Third-party Auditing deployment mode, the Service Operator obtains
signatures from a Third-Party Auditor attesting to the fact that the
Service Operator is constructing the tree correctly. These signatures are
provided to users along with the responses to their queries.</t>
        <t>For each new log entry that the Service Operator adds to the log, it produces a
corresponding <tt>AuditorUpdate</tt> structure and sends this to the Third-Party
Auditor. The auditor <bcp14>MUST</bcp14> receive and successfully verify an <tt>AuditorUpdate</tt>
structure for a log entry before providing the Service Operator with an
<tt>AuditorTreeHead</tt> structure whose <tt>tree_size</tt> field would include that log
entry.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint64 timestamp;

  PrefixLeaf added<0..2^32-1>;
  PrefixLeaf removed<0..2^32-1>;
  PrefixLeaf leaves<0..2^32-1>;

  PrefixProof proof;
} AuditorUpdate;
]]></sourcecode>
        <t>The <tt>timestamp</tt> field contains the timestamp of the corresponding log entry. The
<tt>added</tt> field contains the list of <tt>PrefixLeaf</tt> structures that were added to
the prefix tree in the corresponding log entry. The <tt>removed</tt> field contains the
list of <tt>PrefixLeaf</tt> structures that were removed from the prefix tree. The
<tt>leaves</tt> field contains the list of <tt>PrefixLeaf</tt> structures that were moved to a
higher level (closer to the root) because their sibling became empty.</t>
        <t>The <tt>leaves</tt> field is necessary because without it only the hash of these leaf
nodes would be present in the proof, and the auditor wouldn't know that their
position in the tree should be changed (as discussed in <xref target="prefix-tree"/>). This
would result in the auditor and the Service Operator computing different root
values for the prefix tree.</t>
        <t>The <tt>proof</tt> field contains a batch lookup proof in the previous log entry's
prefix tree for all search keys referenced by <tt>added</tt>, <tt>removed</tt>, or <tt>leaves</tt>.
The <tt>proof.results</tt> field contains the search result for each element of <tt>added</tt>
in the order provided, followed by the search result for each element of
<tt>removed</tt> in the order provided, and finally the search result for each element
of <tt>leaves</tt> in the order provided.</t>
        <t>An auditor processes a single <tt>AuditorUpdate</tt> by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that <tt>timestamp</tt> is greater than or equal to the timestamp of the
previous log entry.</t>
          </li>
          <li>
            <t>Verify that the elements of <tt>added</tt> are sorted in ascending order by
<tt>vrf_output</tt> and that the same <tt>vrf_output</tt> is not present twice. Verify the
same in <tt>removed</tt>. Note that a VRF output in <tt>added</tt> is also allowed to be in
<tt>removed</tt>. Verify that the elements of <tt>leaves</tt> are sorted in ascending order
by <tt>vrf_output</tt>, that the same <tt>vrf_output</tt> is not present twice, and that no
<tt>vrf_output</tt> in <tt>leaves</tt> is also in <tt>added</tt> or <tt>removed</tt>.</t>
          </li>
          <li>
            <t>For each element of <tt>added</tt> where the same VRF output is not in <tt>removed</tt>,
verify that the <tt>PrefixSearchResult</tt> provided in <tt>proof</tt> has a <tt>result_type</tt>
of <tt>nonInclusionParent</tt> or <tt>nonInclusionLeaf</tt></t>
          </li>
          <li>
            <t>Verify that the <tt>PrefixSearchResult</tt> provided in <tt>proof</tt> for each element of
<tt>removed</tt> and <tt>leaves</tt> has a <tt>result_type</tt> of <tt>inclusion</tt>.</t>
          </li>
          <li>
            <t>For each element of <tt>removed</tt>, verify that, with the addition of the new log
entry, the prefix tree leaf was published in at least one
distinguished log entry before removal.</t>
          </li>
          <li>
            <t>With <tt>proof</tt> and the <tt>PrefixLeaf</tt> structures in <tt>removed</tt> and <tt>leaves</tt>,
compute the root value of the previous log entry's prefix tree. Verify that
this matches the auditor's state.</t>
          </li>
          <li>
            <t>With <tt>proof</tt> and the <tt>PrefixLeaf</tt> structures in <tt>added</tt>, <tt>removed</tt>, and
<tt>leaves</tt>, compute the new root value of the prefix tree. Compute the new root
value of the log tree after adding a leaf with the specified <tt>timestamp</tt> and
prefix tree root value.</t>
          </li>
          <li>
            <t>Optionally, provide an <tt>AuditorTreeHead</tt> to the Service Operator where
<tt>AuditorTreeHead.timestamp</tt> is set to <tt>timestamp</tt> and
<tt>AuditorTreeHead.tree_size</tt> is set to the new size of the log tree after the
addition of the new leaf. The signature is computed with the log tree root
value computed in the previous step.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security properties provided by this protocol are discussed in detail in
<xref target="ARCH"/>. Generally speaking, the Key Transparency protocol ensures that all
users of a Transparency Log have a consistent view of the data stored in the
log. Service Operators may still be able to make malicious modifications to
stored data, such as by attaching new public keys to a user's account and
encouraging other users to encrypt to these public keys when messaging the user.
However, since the existence of these new public keys is equally visible to the
user whose account they affect, the user can promptly act to have them removed
from their account or inform contacts out-of-band that their communication may
be compromised.</t>
      <t>Key Transparency relies on users coming online regularly to monitor for
unexpected or malicious modifications to their account. Users that go offline
for longer than the log entry maximum lifetime may not detect if the
Transparency Log made malicious modifications to their labels.</t>
      <t>Similarly, Key Transparency relies on the ability of users to retain long-term
state regarding their account and past views of the Transparency Log. Users
which are unable to maintain long-term state, or may lose their state, have a
correspondingly limited ability to detect misbehavior by the Service Operator.
In particular, users which are completely stateless will generally gain nothing
by participating in this protocol over simply verifying a signature from the
Service Operator and, if there is one, the Third-Party Auditor or Manager.</t>
      <t>Ultimately, ensuring that all users have a consistent view of the Transparency
Log requires that the Service Operator is not able to create and maintain
long-term network partitions between users. As such, users need access to at
least one communication channel (even a very low-bandwidth one) that is
resistant to partitions. The protocol directly provides for a Third-Party
Auditor or Manager, which is trusted to prevent such partitions. Other options
include allowing users to gossip with each other, or allowing users to contact
the Transparency Log over an anonymous channel.</t>
      <t>Key Transparency provides users with a limited assurance that query responses
are authentic: a network attacker will not be able to forge false responses to
queries, but may provide responses which are up to <tt>max_behind</tt> milliseconds
stale. Key Transparency provides no privacy from network observers and does not
have the ability to authenticate specific users to the Transparency Log. To
mitigate these limitations, users <bcp14>SHOULD</bcp14> contact the Transparency Log over a
protocol that provides transport-layer encryption and an appropriate level of
authentication for both parties.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests the creation of the following new IANA registry:</t>
      <ul spacing="normal">
        <li>
          <t>KT Cipher Suites (<xref target="kt-cipher-suites"/>)</t>
        </li>
      </ul>
      <t>This registry 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-cipher-suites">
        <name>KT Cipher Suites</name>
        <t>A cipher suite is a specific combination of cryptographic primitives and
parameters to be used in an instantiation of the protocol. Cipher suite names
follow the naming convention:</t>
        <sourcecode type="tls-presentation"><![CDATA[
uint16 CipherSuite;
CipherSuite KT_LVL_HASH_SIG = VALUE;
]]></sourcecode>
        <t>The columns in the registry are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>Value: The numeric value of the cipher suite.</t>
          </li>
          <li>
            <t>Name: The name of the cipher suite.</t>
          </li>
          <li>
            <t>Recommended: Whether support for this cipher suite is <bcp14>RECOMMENDED</bcp14>.
Valid values are "Y", "N", and "D", as described below. The default value of
the "Recommended" column is "N". Setting the Recommended item to "Y" or "D",
or changing an item whose current value is "Y" or "D", requires Standards
Action <xref target="RFC8126"/>.
            </t>
            <ul spacing="normal">
              <li>
                <t>Y: Indicates that the item is <bcp14>RECOMMENDED</bcp14>. This only means that the
associated mechanism is fit for the purpose for which it was defined.
Careful reading of the documentation for the mechanism is necessary to
understand the applicability of that mechanism. A cipher suite may, for
example, be recommended that is only suitable for use in applications where
the Transparency Log's contents are public. Mechanisms with limited
applicability may be recommended, but in such cases applicability statements
that describe any limitations of the mechanism or necessary constraints will
be provided.</t>
              </li>
              <li>
                <t>N: Indicates that the item's associated mechanism has not been evaluated and
is not <bcp14>RECOMMENDED</bcp14> (as opposed to being <bcp14>NOT RECOMMENDED</bcp14>). This does not
mean that the mechanism is flawed.</t>
              </li>
              <li>
                <t>D: Indicates that the item is discouraged and <bcp14>SHOULD NOT</bcp14> be
used. This marking could be used to identify mechanisms that might result in
problems if they are used, such as a weak cryptographic algorithm or a
mechanism that might cause interoperability problems in deployment.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Reference: The document where this cipher suite is defined.</t>
          </li>
        </ul>
        <t>Initial contents:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">R</th>
              <th align="left">Ref</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0000</td>
              <td align="left">RESERVED</td>
              <td align="left">-</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0001</td>
              <td align="left">KT_128_SHA256_P256</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0002</td>
              <td align="left">KT_128_SHA256_Ed25519</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0xF000 - 0xFFFF</td>
              <td align="left">Reserved for Private Use</td>
              <td align="left">-</td>
              <td align="left">RFC XXXX</td>
            </tr>
          </tbody>
        </table>
        <t>Both cipher suites currently specified share the following primitives and
parameters:</t>
        <ul spacing="normal">
          <li>
            <t>The hash algorithm is SHA-256, as defined in <xref target="SHS"/>.</t>
          </li>
          <li>
            <t><tt>Nc</tt>: 16</t>
          </li>
          <li>
            <t><tt>Kc</tt>: The byte sequence equal to the hex-encoded string <tt>d821f8790d97709796b4d7903357c3f5</tt></t>
          </li>
          <li>
            <t><tt>Hash.Nh</tt>: 32</t>
          </li>
          <li>
            <t><tt>VRF.Nh</tt>: 32</t>
          </li>
        </ul>
        <t>The KT_128_SHA256_P256 cipher suite is as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The signature algorithm is ECDSA over the NIST curve P-256. Messages are
hashed with SHA-256 before being signed. Public keys are encoded as an
uncompressed point as defined in SEC 1, Version 2.0, Section 2.3.3. Signatures
are encoded as the concatenation of two 256-bit big endian integers r and s.</t>
          </li>
          <li>
            <t>The VRF algorithm is ECVRF-P256-SHA256-TAI as defined in <xref target="RFC9381"/>. Public
keys are encoded as a compressed point as defined in SEC 1, Version 2.0,
Section 2.3.3.
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>VRF.Np</tt> is 81.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The KT_128_SHA256_Ed25519 cipher suite is as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The signature algorithm is Ed25519 as defined in <xref target="RFC8032"/>. Public key and
signature encodings are as defined in <xref target="RFC8032"/>.</t>
          </li>
          <li>
            <t>The VRF algorithm is ECVRF-EDWARDS25519-SHA512-TAI as defined in <xref target="RFC9381"/>
with the output truncated to 32 bytes.
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>VRF.Np</tt> is 80.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="de">
        <name>KT Designated Expert Pool</name>
        <t>Specification Required <xref target="RFC8126"/> registry requests are registered after a
three-week review period on the KT Designated Expert (DE) mailing list
<eref target="mailto:kt-reg-review@ietf.org">kt-reg-review@ietf.org</eref> on the advice of one or more of the KT DEs. However, to
allow for the allocation of values prior to publication, the KT DEs may approve
registration once they are satisfied that such a specification will be
published.</t>
        <t>Registration requests sent to the KT DEs' mailing list for review <bcp14>SHOULD</bcp14> use an
appropriate subject (e.g., "Request to register value in KT registry").</t>
        <t>Within the review period, the KT DEs will either approve or deny the
registration request, communicating this decision to the KT DEs' mailing list
and IANA. Denials <bcp14>SHOULD</bcp14> include an explanation and, if applicable, suggestions
as to how to make the request successful. Registration requests that are
undetermined for a period longer than 21 days can be brought to the IESG's
attention for resolution using the <eref target="mailto:iesg@ietf.org">iesg@ietf.org</eref> mailing list.</t>
        <t>Criteria that <bcp14>SHOULD</bcp14> be applied by the KT DEs includes determining whether the
proposed registration duplicates existing functionality, whether it is likely to
be of general applicability or useful only for a single application, and whether
the registration description is clear.</t>
        <t>IANA <bcp14>MUST</bcp14> only accept registry updates from the KT DEs and <bcp14>SHOULD</bcp14> direct all
requests for registration to the KT DEs' mailing list.</t>
        <t>It is suggested that multiple KT DEs who are able to represent the perspectives
of different applications using this specification be appointed, in order to
enable a broadly informed review of registration decisions. In cases where a
registration decision could be perceived as creating a conflict of interest for
a particular KT DE, that KT DE <bcp14>SHOULD</bcp14> defer to the judgment of the other KT DEs.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="ARCH">
          <front>
            <title>Key Transparency Architecture</title>
            <author fullname="Brendan McMillion" initials="B." surname="McMillion">
              <organization>Independent</organization>
            </author>
            <date day="1" month="November" year="2026"/>
            <abstract>
              <t>   This document defines the terminology and interaction patterns
   involved in the deployment of Key Transparency in end-to-end
   encrypted communication services, and specifies the security
   properties that the protocol provides.  It also gives more general,
   non-prescriptive guidance on how to securely apply Key Transparency
   to a number of common applications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-11"/>
        </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="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>
        <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="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CONIKS" target="https://eprint.iacr.org/2014/1004">
          <front>
            <title>CONIKS: Bringing Key Transparency to End Users</title>
            <author initials="M. S." surname="Melara" fullname="Marcela S. Melara">
              <organization/>
            </author>
            <author initials="A." surname="Blankstein" fullname="Aaron Blankstein">
              <organization/>
            </author>
            <author initials="J." surname="Bonneau" fullname="Joseph Bonneau">
              <organization/>
            </author>
            <author initials="E. W." surname="Felten" fullname="Edward W. Felten">
              <organization/>
            </author>
            <author initials="M. J." surname="Freedman" fullname="Michael J. Freedman">
              <organization/>
            </author>
            <date year="2014" month="April" day="27"/>
          </front>
        </reference>
        <reference anchor="SEEMLess" target="https://eprint.iacr.org/2018/607">
          <front>
            <title>SEEMless: Secure End-to-End Encrypted Messaging with less trust</title>
            <author initials="M." surname="Chase" fullname="Melissa Chase">
              <organization/>
            </author>
            <author initials="A." surname="Deshpande" fullname="Apoorvaa Deshpande">
              <organization/>
            </author>
            <author initials="E." surname="Ghosh" fullname="Esha Ghosh">
              <organization/>
            </author>
            <author initials="H." surname="Malvai" fullname="Harjasleen Malvai">
              <organization/>
            </author>
            <date year="2018" month="June" day="18"/>
          </front>
        </reference>
        <reference anchor="OPTIKS" target="https://eprint.iacr.org/2023/1515">
          <front>
            <title>OPTIKS: An Optimized Key Transparency System</title>
            <author initials="J." surname="Len" fullname="Julia Len">
              <organization/>
            </author>
            <author initials="M." surname="Chase" fullname="Melissa Chase">
              <organization/>
            </author>
            <author initials="E." surname="Ghosh" fullname="Esha Ghosh">
              <organization/>
            </author>
            <author initials="K." surname="Laine" fullname="Kim Laine">
              <organization/>
            </author>
            <author initials="R. C." surname="Moreno" fullname="Radames Cruz Moreno">
              <organization/>
            </author>
            <date year="2023" month="October" day="04"/>
          </front>
        </reference>
        <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>
        <reference anchor="SHS">
          <front>
            <title>Secure hash standard</title>
            <author>
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
      </references>
    </references>
    <?line 2924?>

<section anchor="appendix-implicit-search-tree">
      <name>Implicit Binary Search Tree</name>
      <t>The following Python code demonstrates efficient algorithms for navigating the
implicit binary search tree:</t>
      <sourcecode type="python"><![CDATA[
# The exponent of the largest power of 2 less than or equal to 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('node has no left child')
    return x ^ (0x01 << (k - 1))

# The right child of an intermediate node.
def right(x, n):
    k = level(x)
    if k == 0 or x == n-1:
        raise Exception('node has no right child')
    x = x ^ (0x03 << (k - 1))
    while x >= n:
        x = left(x)
    return x
]]></sourcecode>
    </section>
    <section anchor="appendix-binary-ladder">
      <name>Binary Ladder</name>
      <t>The following Python code demonstrates efficient algorithms for computing the
versions of a label to include in a binary ladder:</t>
      <sourcecode type="python"><![CDATA[
# Returns the set of versions that would be looked up to establish that n was
# the greatest version of a label that existed.
def base_binary_ladder(n):
    out = []

    # Output powers of two minus one until reaching a value greater than n.
    while True:
        value = (1 << len(out)) - 1
        out.append(value)
        if value > n:
            break

    # Binary search between the established lower and upper bounds.
    lower_bound = out[-2]
    upper_bound = out[-1]

    while lower_bound+1 < upper_bound:
        value = (lower_bound + upper_bound) // 2
        out.append(value)
        if value <= n and value < (1 << 32):
            lower_bound = value
        else:
            upper_bound = value

    return [v for v in out if v < (1 << 32)]

# Returns the set of versions that would be looked up in a search binary ladder
# where the target version is t and the greatest version of the label that
# exists in a given version of the prefix tree is n.
def search_binary_ladder(
    t, n,
    left_inclusion = [], right_non_inclusion = []
):
    def would_end(v):
        # (Proof of inclusion for a version greater than t) OR
        # (Proof of non-inclusion for a version less than or equal to t)
        return (v <= n and v > t) or (v > n and v <= t)

    def would_be_duplicate(v):
        return (v in left_inclusion) or (v in right_non_inclusion)

    out = base_binary_ladder(n)
    end = next((i+1 for i,v in enumerate(out) if would_end(v)), len(out))
    filtered_out = [v for v in out[:end] if not would_be_duplicate(v)]

    return filtered_out

# Returns the set of versions that would be looked up in a monitoring binary
# ladder where the monitored version of the label is t.
def monitoring_binary_ladder(t):
    out = base_binary_ladder(t)
    filtered_out = [v for v in out if v <= t]

    return filtered_out
]]></sourcecode>
    </section>
    <section anchor="appendix-combined-tree">
      <name>CombinedTreeProof Implementation</name>
      <t>The <tt>CombinedTreeProof</tt> structure is designed to provide all of the information
a user needs to evaluate the algorithms defined in this document with as little
overhead as possible. The main strategy used to reduce overhead is
deduplication, such that the same timestamp or prefix tree root value is never
provided twice. Another strategy used is providing data in the specific order
that it's required by the algorithm being executed, rather than explicitly
indicating which timestamp or proof belongs to which log entry.</t>
      <t>As such, the generally simplest way to process a <tt>CombinedTreeProof</tt> is for an
implementation to execute the algorithms specified in this document, and have
the algorithm implementations call functions like <tt>get_timestamp(x)</tt> or
<tt>get_search_ladder(x, target_ver)</tt> where <tt>x</tt> is the log entry's position. These
functions can then pop the first timestamp or <tt>PrefixProof</tt> from the
corresponding field as a queue, and associate this value with the log entry <tt>x</tt>
for the purpose of deduplication and, eventually, evaluating the associated
inclusion proof. These functions can also evenly enforce the invariants that all
timestamps are monotonic, and that if there are multiple <tt>PrefixProof</tt>
structures from the same log entry, that they all compute the same prefix tree
root value.</t>
      <t>A Transparency Log can construct a <tt>CombinedTreeProof</tt> with the same strategy
in reverse: it executes the same algorithms against its own data, and the first
time a timestamp or search proof would be requested for a log entry, it appends
the value to the corresponding field instead of popping it. Implementing the
prover and the verifier over a single shared implementation of the algorithms,
parameterized only by whether data is being recorded or consumed, guarantees
that both sides agree on the contents and order of every field.</t>
      <section anchor="worked-example">
        <name>Worked Example</name>
        <t>Consider a Transparency Log with 13 log entries, numbered 0 through 12, with
timestamps <tt>T_0</tt> through <tt>T_12</tt>. In the implicit binary search tree over these
entries, the root is entry 7, the right child of entry 7 is entry 11, and the
right child of entry 11 is entry 12, making entries 7, 11, and 12 the frontier.
Suppose that:</t>
        <ul spacing="normal">
          <li>
            <t>A user previously observed the tree when it had 4 entries. From that time,
the user retained the head value of the log tree's single full subtree (the
balanced subtree with leaves 0 through 3) and the contents of log entry 3
(the previous tree's only frontier entry): its timestamp <tt>T_3</tt> and its prefix
tree root hash.</t>
          </li>
          <li>
            <t>The user now performs a greatest-version search for a label whose greatest
version is 2. The versions looked up by a search binary ladder for target
version 2 are, in order: 0, 1, 3, 2. VRF proofs for exactly these versions
are provided in <tt>SearchResponse.binary_ladder</tt>.</t>
          </li>
          <li>
            <t><tt>T_12 - T_7</tt> is greater than or equal to the Reasonable Monitoring Window
while <tt>T_12 - T_11</tt> is less than it, so that entry 11 is the rightmost
distinguished log entry. (Entry 7 is also distinguished: the bounding
timestamps used to evaluate it are 0 and <tt>T_12</tt>.)</t>
          </li>
        </ul>
        <t>The user first updates their view of the tree, as described in
<xref target="update-view-algorithm"/>. The direct path of entry 3 in the new tree consists
only of entry 7, so the timestamps provided are that of entry 7, followed by
the timestamps of the remainder of the frontier:
<tt>timestamps = [T_7, T_11, T_12]</tt>.</t>
        <t>The user then executes the greatest-version search described in
<xref target="gv-algorithm"/>. Identifying the rightmost distinguished log entry requires
the timestamps of entries 7, 11, and 12; all three are already associated, so
nothing further is provided in <tt>timestamps</tt>. The search then starts at entry
11:</t>
        <ul spacing="normal">
          <li>
            <t>From entry 11, a search binary ladder for target version 2 performs the
lookups 0, 1, 3, and 2. No lookup can be omitted, so the first <tt>PrefixProof</tt>
contains four results, in lookup order: inclusion of version 0, inclusion of
version 1, non-inclusion of version 3, and inclusion of version 2.</t>
          </li>
          <li>
            <t>From entry 12, the lookups for versions 0, 1, and 2 are omitted, as inclusion
proofs for these versions were already provided for entry 11, which is to the
left of entry 12. The lookup for version 3 is not omitted: a non-inclusion
proof for version 3 was provided only for a log entry to the left, while
omission would require one from a log entry to the right. The second
<tt>PrefixProof</tt> therefore contains a single result: non-inclusion of version 3.</t>
          </li>
        </ul>
        <t>Both binary ladders terminate in a way that is consistent with version 2 being
the greatest that exists, and evaluating the two proofs produces candidate
prefix tree root hashes for entries 11 and 12.</t>
        <t>At this point, entries 7, 11, and 12 have associated timestamps, but only
entries 11 and 12 have associated prefix tree root hashes. The <tt>prefix_roots</tt>
field therefore contains exactly one element: the prefix tree root hash of
entry 7. The user is now able to compute the leaf values of log entries 7, 11,
and 12.</t>
        <t>Finally, the <tt>inclusion</tt> field allows the user to compute the root value of the
13-entry log tree from the three computed leaf values and the retained head of
the subtree with leaves 0 through 3. It contains, in left-to-right order: the
head value of the subtree with leaves 4 and 5, the value of leaf 6, the head
value of the subtree with leaves 8 and 9, and the value of leaf 10. In the
course of computing the root value, the user also computes the head values of
the full subtrees of the new tree (leaves 0 through 7, leaves 8 through 11, and
leaf 12), which it retains along with the log entries on the new frontier for
use in future queries.</t>
      </section>
    </section>
    <section anchor="log-entry-maximum-lifetime-and-the-reasonable-monitoring-window">
      <name>Log Entry Maximum Lifetime and the Reasonable Monitoring Window</name>
      <t>The log entry maximum lifetime is an optional configuration parameter that a
Transparency Log can define to allow pruning. Transparency Logs are only
required to retain a logarithmic number of log entries that have passed their
maximum lifetime, and aren't required to retain any versions of the prefix tree
that have passed their maximum lifetime. This prevents the amount of storage
that the Transparency Log needs from growing infinitely over time, which
naturally allows the Transparency Log to remain operational much longer that it
otherwise would be able to.</t>
      <t>The Reasonable Monitoring Window (RMW) is a similar but mandatory parameter
defined by the Transparency Log, and represents the general frequency with which
users are expected to monitor labels they own. The protocol creates roughly one
distinguished log entry per every interval of the RMW, and these distinguished
log entries act as common reference points for all users in their monitoring of
the Transparency Log.</t>
      <t>Similar to how the log entry maximum lifetime bounds the amount of state that
the Transparency Log needs to maintain, the Reasonable Monitoring Window bounds
how log users need to retain certain monitoring-related state. Importantly, the
log entry maximum lifetime, if defined, will always be greater than the RMW.
This ensures that users are able to take advantage of the common reference
points provided by distinguished log entries prior to the Transparency Log
permanently deleting them.</t>
      <t>The log entry maximum lifetime and the RMW can interact in somewhat subtle ways,
and this section hopes to clarify those interactions.</t>
      <t><strong>The rightmost distinguished log entry is always on the frontier.</strong> The
algorithm for computing distinguished log entries is structured such that if a
given log entry is distinguished, then its parent will always be distinguished
as well. Every log entry in the implicit binary search tree is either on the
frontier itself, or in the left subtree of a log entry that is on the frontier.
Given these two points, if a log entry is distinguished and not on the frontier,
then it has in its direct path a frontier log entry that is also distinguished
and to its right.</t>
      <t><strong>The rightmost distinguished log entry is never expired.</strong> This is obviously
true in the case where the rightmost distinguished log entry is the rightmost
log entry, since the rightmost log entry is never expired by definition.</t>
      <t>If the rightmost distinguished log entry is not the rightmost log entry, then it
has a right child. Say that <tt>T_i</tt> is the timestamp of the rightmost
distinguished log entry and that <tt>T_rightmost</tt> is the timestamp of the rightmost
log entry. The right child of the rightmost distinguished log entry obviously
can not itself be distinguished. Through the algorithm in
<xref target="reasonable-monitoring-window"/>, this corresponds to the statement that
<tt>T_rightmost - T_i &lt; RMW</tt>. Since we know by definition that the RMW is less than
the log entry maximum lifetime, or that <tt>RMW &lt; ML</tt>, this directly implies that
<tt>T_rightmost - T_i &lt; RMW &lt; ML</tt>, or that the rightmost distinguished log entry is
not expired.</t>
      <t>This property is particularly important for the algorithms in KT since it means
that, once a distinguished log entry is created in a Transparency Log, there
will always be at least one unexpired distinguished log entry that users can
inspect and use as a common reference point for monitoring.</t>
      <t><strong>The Contact Monitoring algorithm will always intersect the first distinguished
log entry established to its right.</strong> The Contact Monitoring algorithm takes as
input a log entry that is, or was previously, to the right of the rightmost
distinguished log entry. It computes the direct path of this log entry and
checks that the (newly created) log entries on the right side of this path are
constructed correctly, stopping once it reaches the first distinguished log
entry. The claim here is that, assuming the monitored log entry doesn't itself
become distinguished, this algorithm always intersects the first distinguished
log entry established to the right of the monitored log entry. Equivalently, the
claim is that the algorithm terminates within a bounded amount of time, being
roughly the RMW.</t>
      <t>Assume we know the position of the first distinguished log entry established to
the right of the monitored log entry. Then one of the following cases apply:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Case 1:</strong> The monitored log entry is in the left subtree of the
distinguished log entry. In this case, the claim of this section is
true by definition.</t>
        </li>
        <li>
          <t><strong>Case 2:</strong> The distinguished log entry is in the right subtree of the
monitored log entry. Recalling that if a log entry is distinguished then it's
parent is also always distinguished, then in this case the monitored log entry
is now itself distinguished. In this case, the Contact Monitoring algorithm
removes the version of the label from monitoring without further inspection.</t>
        </li>
        <li>
          <t><strong>Case 3:</strong> Neither of the above cases apply. In this case, there is a
"middle" log entry where the monitored log entry is in its left subtree and
the distinguished log entry is in its right subtree. Because the middle log
entry is a parent of the distinguished log entry, it must be distinguished as
well. This is a contradiction, since the distinguished log entry can not be
the "first" distinguished log entry if the middle log entry is distinguished
and to its left.</t>
        </li>
      </ul>
      <t><strong>Assuming no clock skew and no Transparency Log outages, a user that performs
Contact Monitoring every interval of the RMW will never hit an expired log
entry.</strong> Each Contact Monitoring request follows a path from a monitored log
entry to a frontier log entry. The frontier log entry, if it is not
distinguished, becomes the monitored log entry in the user's subsequent Contact
Monitoring request.</t>
      <t>As a result of this structure, each Contact Monitoring request only inspects log
entries that were created since the prior Contact Monitoring request. If the
rightmost log entry's timestamp during the first request was <tt>T_rightmost</tt>, then
the rightmost log entry's timestamp during the subsequent request will be
approximately <tt>T_rightmost + RMW</tt>, and all inspected log entries will have a
timestamp in this range. Since the RMW is less than the log entry maximum
lifetime, no log entry in this range can be expired.</t>
      <t>However, clock skew is permitted by the protocol, configurable by the
<tt>max_ahead</tt> and <tt>max_behind</tt> parameters, and some degree of service outages
are generally unavoidable. The maximum lifetime parameter needs to be set with
sufficient allowance for both of these eventualities.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963obx5Uo+r+eorfyQxIDwqIkOxk5yd60LMUaW7a3JNvJ
l2SMJtAgOwK6MegGKcZRnuU8y3mys65Vq6qrQUhWMrPPt/UlNAl012XVqnW/
HB8fu77uV9Wj4taX1XXxals23abcVs38uvh22/btvF3dcvOyr87b7fWjousX
blM/ckUBX31ebfqLR8V95xbtvCnXMMpiWy7747rql8evq+sehzveyDjH9z5x
3e5sXXdd3Tb99Qaef/bk1VN3+ah44GDS8lHx8sljd9VuX59v293mUfHlkz++
enH69cviB/isbs6L3+PnDoaGhxa4jOMC/ih6s253WTW7Cr+TQQY7u4XLp+lv
RePi5+uyXsHnuvj/hVuZtttz/K7czmG7ty76ftM9+ugjfBQ/qi+rqT72EX7w
0dm2veqqj3SQj/Dl87q/2J3B6wScq3MPn48YZhsP7aJYAby73kyVvjPl0aZ1
m7z90b4DmF70axjflbv+ot0ChI5hrqJY7lYrPr1bnwF8FmVTPJ8/r1crOKVb
9EQlUDnjr9fzNX/7v87xi+m8Xd/KDPa0WtVviq/q5nW1jcdZ0WdL/N4O4Zp2
uy57gOcj5+pmGf4qisfffP3sy5ePaJi+3J5XAB6FTrXZ1k0/rcv5ls7g/r2T
hx+d3Lv3kJ8W/JYRis/g4XM88wHC923xpFkU33XVtuMFL+AgAMFhvON7D4/v
/4o+9OCjf8cFb/c5nHy1KouX0+I5/HdbJt+fltu2KT5blc3rrq/qJvn639uu
2lwUn7VNU5W75Msni6tyuyh+mBYA075K331ezy/KalX8O3y/rarFusQnXj55
8vyrqusOhtmvP/rk3q8ikOEQKxyieFnNd9sKwXPct8cIpSfNfHu96asFbLfr
SoLoFWBlgS/Ahdx1fQLDXwMBOD759T4YAkbAWMXji7KrUvht2nZ7WZbF51V3
sSmbRfrAk+6iLH5/0XYXyRdflNu/lt2qqgCvy9VlWcP333z76h3Q6f6Dj04+
Pvk4go2MUJw2xTebvl7XfwNQDFDq5TUc9joGxP0Hxyf3jgU784D4992qLouv
hie9B0Cj+/+yXhdflXWTvvCiXMB/u+Lxdve34nkLC27hiefV9vWqun8waE4+
evjxgwgyPMJ/3AfYFF+1V8dfwb4RFhFgvmrP88A5wZt2bx+W/HHXzFvAti/S
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
IHEGnHDN8K0ZmPN/AYTcOTRbUwIA

-->

</rfc>
