<?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.35 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-keytrans-protocol-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title>Key Transparency Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-protocol-04"/>
    <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="April" day="17"/>
    <area>SEC</area>
    <workgroup>KEYTRANS Working Group</workgroup>
    <keyword>key transparency</keyword>
    <abstract>
      <?line 73?>

<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 83?>

<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?>

<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, cryptographic computations <bcp14>MUST</bcp14> be done
with the TLS presentation language format to ensure the protocol's security
properties are maintained.</t>
    </section>
    <section anchor="tree-construction">
      <name>Tree Construction</name>
      <t>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>
        <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 node 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,
each modification of the prefix tree results in a new root value which 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>
      </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
despite small changes in the log's size.</t>
        <t>Because we are often looking at the rightmost log entry, it is frequently useful
to refer to the <strong>frontier</strong> of the log. The frontier consists of the root log
entry, followed by the entries produced by repeatedly moving right until
reaching the rightmost log entry. 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. From
this 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>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, and there are
no unexpired distinguished log entries to the left of the identified log
entry, terminate the search with an error indicating that the target
version of the label is expired.</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.1, 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 require 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"/>, but with two optimizations:</t>
        <t>First, any lookup for a version greater than the target version is omitted. As a
result, all lookups in the binary ladder will result in an inclusion proof if
the Transparency Log is behaving honestly.</t>
        <t>Second, any lookup that would be omitted from a binary ladder for the log entry
when executing a fixed-version or greatest-version search for the label-version
pair is also omitted here. That is, when preparing a binary ladder for a log
entry, the Transparency Log considers the log entries that are in its direct
path and to its left. If, during a search for the label-version pair being
monitored, the user would receive an inclusion proof for some version from
one of these log entries, then the lookup for this version is omitted.</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>
            </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 a binary ladder from this log entry was already provided in the
same query response. If so:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>If the previously provided binary ladder had a greater target version
than the current map entry, then this version of the label no longer
needs to be monitored. Remove the position-version pair with the
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> coresponding 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. 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.</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.</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>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. 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'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.</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>Users are expected to already know the correct greatest version of the label
at each distinguished log entry, and to already have all necessary VRF outputs
and commitments. This information is conveyed through the algorithm in
<xref target="updating-a-label"/>. If no distinguished log entry exists yet, or for new
versions of a label that are to the right of the rightmost distinguished log
entry, the algorithms above do not apply and the algorithm in
<xref target="contact-algorithm"/> is used until a distinguished log entry is created.</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.</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 new greatest version of the label.</t>
          </li>
          <li>
            <t>The index of the log entry where the new versions were inserted.</t>
          </li>
          <li>
            <t>The value of each new version of the label.</t>
          </li>
          <li>
            <t>The commitment openings that were chosen for each new version of the label.</t>
          </li>
          <li>
            <t>If the Transparency Log is deployed with a Third-Party Manager, the signatures
produced by the Service Operator over each new value.</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 the VRF
outputs for these versions.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The user verifies this information as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that the new greatest version of the label is greater than the
previously known greatest version.</t>
          </li>
          <li>
            <t>Verify that the log entry where the new versions were inserted is to the
right of where the previous greatest version of the label was inserted, or
the starting position chosen in <xref target="owner-algorithm"/> if this is the first
version inserted since the user became the label owner.</t>
          </li>
          <li>
            <t>Verify that the number of label values and commitment openings provided is
equal to the number of new versions (the greatest version minus the previous
greatest version, or the new greatest version plus one if there were no
previous versions).</t>
          </li>
          <li>
            <t>If the Transparency Log is deployed with a Third-Party Manager, verify that
the number of signatures provided matches the number of new versions and that
the signatures are valid.</t>
          </li>
          <li>
            <t>Verify that the expected number of VRF proofs was provided, and that the
proofs properly evaluate into a VRF output.</t>
          </li>
        </ol>
        <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. 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>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. This may be the root itself. If there is
no non-distinguished 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 a binary ladder would have already been received from this log entry in
step 2.2 when processing a previous label update, skip this log entry.</t>
              </li>
              <li>
                <t>Obtain a search binary ladder from this log entry where the target version
is the previous greatest version of the label that existed. Lookups that
would be omitted in a greatest-version search for the label are also
omitted here. Note that this means that lookups that would occur in the
rightmost distinguished log entry, or in log entries that were skipped by
step 2.1, will still be omitted as if the log entries had been inspected.</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
existed.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If the log entry where the new versions were added is distinguished in the
current tree, obtain a <tt>PrefixProof</tt> from it with lookups corresponding only
to new versions of the label that would not be looked up in a search binary
ladder for the new greatest version. Verify that all lookups result in an
inclusion proof.  </t>
            <t>
If the log entry 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, additionally including all other new versions of the
label. Verify that the binary ladder lookups are consistent with the new
greatest version of the label being the greatest that exists, and that the
lookups for new but lesser versions result in an inclusion proof.</t>
          </li>
        </ol>
      </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 contactMonitoring:
    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 output value <tt>commitment</tt> may be published, while <tt>opening</tt> should only be
revealed to users that are authorized to receive the label's contents.</t>
        <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(0x01 || 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(0x02 || 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^8-1>;
  HashValue elements<0..2^16-1>;
} PrefixProof;
]]></sourcecode>
        <t>The <tt>results</tt> field contains the search result for each individual value,
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 of 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 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.</t>
        <t>The <tt>elements</tt> array consists of the fewest node values that can be hashed
together with the provided leaves to produce the root. The contents of the
<tt>elements</tt> array is kept in left-to-right order: if a node is present in the
root's left subtree, its value 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 the elements
correspond to, as they are provided in the order that the algorithm the user is
executing would request them. The elements of the <tt>prefix_roots</tt> field are, in
left-to-right order, the prefix tree root hashes for any log entries whose
timestamp was provided in <tt>timestamps</tt> but a search proof was not provided in
<tt>prefix_proofs</tt>.</t>
        <t>If a log entry's timestamp is referenced multiple times by algorithms in the
same <tt>CombinedTreeProof</tt>, it is only added to the <tt>timestamps</tt> array the first
time. Additionally, when a user advertises a previously observed tree size in
their request, log entry timestamps that the user is expected to have retained
are always omitted from <tt>timestamps</tt>. This may result in there being elements of
<tt>prefix_proofs</tt> that correspond to log entries whose timestamps are not included
in <tt>timestamps</tt>. Users <bcp14>MUST</bcp14> verify that any such proof in <tt>prefix_proof</tt> is
consistent with their retained prefix tree root hash for the log entry, due to
the fact that the log entry will not be included in <tt>inclusion</tt>.</t>
        <t>If different algorithms in the same <tt>CombinedTreeProof</tt> require a search proof
from the same log entry, the <tt>prefix_proofs</tt> array will contain multiple
<tt>PrefixProof</tt> structures for the same log entry. Users <bcp14>MUST</bcp14> verify that all
<tt>PrefixProof</tt> structures corresponding to the same log entry compute the same
prefix tree root hash.</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>Finally, 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>
        <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>
          <t>Users verify that the rightmost timestamp is within the bounds defined by
<tt>max_ahead</tt> and <tt>max_behind</tt>.</t>
        </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. Users verify the proof as described in <xref target="gv-algorithm"/>.</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 is provided.</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 is provided.</t>
            </li>
          </ul>
          <t>Users verify the output as specified in <xref target="fv-algorithm"/>.</t>
        </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:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The timestamps needed by the algorithm in <xref target="reasonable-monitoring-window"/>
to determine where the monitoring algorithm would first reach a
distinguished log entry. This may either be the log entry in the user's
monitoring map, or some other log entry from the list computed in step 2 of
<xref target="contact-algorithm"/>.</t>
                </li>
                <li>
                  <t>Where necessary for the algorithm in <xref target="contact-algorithm"/>, a <tt>PrefixProof</tt>
corresponding to a monitoring binary ladder.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>Users verify the proof as described in <xref target="contact-algorithm"/>.</t>
        </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>In reverse order (from top to bottom), the timestamp of each log entry that is
on the direct path of the user's requested starting position and to its left,
stopping just after the first unexpired log entry (if any).</t>
            </li>
            <li>
              <t>For each log entry in the list computed in step 1 of the first algorithm in
<xref target="owner-algorithm"/>, a <tt>PrefixProof</tt> corresponding to a search binary ladder.</t>
            </li>
          </ul>
          <t>Users verify the proof as described in the first algorithm of
<xref target="owner-algorithm"/>.</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 is on the direct path of the root of the
previous tree, for the purpose of determining if the root log entry is
distinguished.</t>
            </li>
            <li>
              <t>The timestamp for each log entry that causes the second algorithm in
<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 in
<xref target="owner-algorithm"/>, a <tt>PrefixProof</tt> corresponding to a binary ladder.</t>
            </li>
          </ul>
          <t>Users verify the proof as described in the second algorithm of
<xref target="owner-algorithm"/>.</t>
        </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 timestamps necessary to identify the first non-distinguished log entry on
the previous tree's frontier, as described in the algorithm in
<xref target="update-algorithm"/>. This search proceeds in a depth-first manner from the
root log entry of the previous tree. When the search recurses from a log entry
that is on the frontier to the right, the timestamp of the log entry is
provided. When the search recurses to the left, from a log entry that is to
the right of the rightmost log entry in the previous tree, only the timestamp
of the leftmost log entry inspected before returning to the previous tree's
frontier is provided.</t>
            </li>
            <li>
              <t>For each log entry that reaches step 2.2 of the algorithm in
<xref target="update-algorithm"/>, a <tt>PrefixProof</tt> corresponding to a binary ladder.</t>
            </li>
            <li>
              <t>For the log entry where the new versions were added, a <tt>PrefixProof</tt>
containing the lookups specified in step 3 of the algorithm in
<xref target="update-algorithm"/>.</t>
            </li>
          </ul>
          <t>Users verify the proof as described in <xref target="update-algorithm"/>.</t>
        </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> they've successfully verified as
part of any query response and populate the <tt>last</tt> field of any query request
with the <tt>tree_size</tt> from this <tt>TreeHead</tt>. This ensures that all operations
performed by the user return consistent results.</t>
      <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 SearchRequest 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
compute the VRF output for each version of the label from the provided
proofs.</t>
          </li>
          <li>
            <t>Verify the proof in <tt>search</tt> as described in <xref target="proof-combined-tree"/>.</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>
      </section>
      <section anchor="update">
        <name>Update</name>
        <t>Users initiate an Update operation by submitting an UpdateRequest 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>;
  LabelValue values<0..2^8-1>;
} UpdateRequest;
]]></sourcecode>
        <t>If the request passes application-layer policy checks, the Transparency Log adds
the new values for the label to the next log entry, assigning version counters
in the same order that the values are given in <tt>values</tt>. The Transparency Log
then returns an UpdateResponse structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque opening[Nc];
  UpdateSuffix suffix;
} UpdateInfo;

struct {
  FullTreeHead full_tree_head;

  uint32 version;
  uint64 position;
  UpdateInfo info<0..2^8-1>;

  BinaryLadderStep binary_ladder<0..2^8-1>;
  CombinedTreeProof search;
} UpdateResponse;
]]></sourcecode>
        <t>The <tt>opening</tt> field of an <tt>UpdateInfo</tt> structure contains the commitment opening
that was chosen for a specific new 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>version</tt> field of <tt>UpdateResponse</tt> contains the new greatest version of the
label. The <tt>position</tt> field contains the index of the log entry that where the
new versions of the label were inserted. The <tt>info</tt> field contains an
<tt>UpdateInfo</tt> for each new version of the label, in the same order as they were
given in <tt>UpdateRequest.values</tt>.</t>
        <t>The <tt>binary_ladder</tt> field contains VRF proofs and commitments as described</t>
        <t>Users verify an <tt>UpdateResponse</tt> by following these steps:</t>
        <t>Users verify the UpdateResponse as if it were a SearchResponse for the greatest
version of <tt>label</tt>. To aid verification, the update response provides the
<tt>UpdateSuffix</tt> structure necessary to reconstruct the <tt>UpdateValue</tt>.</t>
        <!-- TODO: This could probably be a lot more efficient -->

</section>
      <section anchor="monitor">
        <name>Monitor</name>
        <!-- TODO: Update to cover different deployment modes -->

<t>Users initiate a Monitor operation by submitting a MonitorRequest to the
Transparency Log containing information about the labels they wish to monitor.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint64 position;
  uint32 version;
} MonitorMapEntry;

struct {
  opaque label<0..2^8-1>;
  MonitorMapEntry entries<0..2^8-1>;
  optional<uint64> rightmost;
} MonitorLabel;

struct {
  optional<uint64> last;
  MonitorLabel labels<0..2^8-1>;
} MonitorRequest;
]]></sourcecode>
        <t>Each MonitorLabel structure in <tt>labels</tt> contains the label to monitor in
<tt>label</tt>, and a list in the <tt>entries</tt> field corresponding to the map described in
<xref target="contact-algorithm"/>. If the user owns the label, they additionally indicate in
<tt>rightmost</tt> the position of the rightmost distinguished log entry where they
have verified that the greatest version of the label is correctly represented.</t>
        <t>The Transparency Log verifies the MonitorRequest by following these steps, for
each <tt>MonitorLabel</tt> structure:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that the <tt>label</tt> field of every MonitorLabel is unique. For all
MonitorLabel structures with <tt>rightmost</tt> provided, verify that the user owns
the label (according to application-layer policy). For all other MonitorLabel
structures, verify that the user is currently, or was previously, allowed to
lookup all versions of the label contained in a MonitorMapEntry.</t>
          </li>
          <li>
            <t>Verify that each MonitorMapEntry in the same MonitorLabel structure is sorted
in ascending order by <tt>position</tt>. Additionally, verify that each <tt>version</tt>
field is unique and that <tt>position</tt> lies on the direct path of the first log
entry to contain version <tt>version</tt> of the label.</t>
          </li>
          <li>
            <t>Verify that <tt>rightmost</tt> is a distinguished log entry to the right of
the first version of the label, or that it was the rightmost distinguished
log entry immediately after the label was first inserted.</t>
          </li>
        </ol>
        <t>While access control decisions generally belong solely to the application, users
must 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 lookup a particular version
of a label would be for them to provide the commitment opening for the version.
However, there is no provision for this in the protocol; it would need to be
done in the application layer.</t>
        <t>If the request is valid and passes access control, the Transparency Log responds
with a MonitorResponse structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint32 versions<0..2^8-1>;
} MonitorLabelVersions;

struct {
  FullTreeHead full_tree_head;
  MonitorLabelVersions label_versions<0..2^8-1>;
  CombinedTreeProof monitor;
} MonitorResponse;
]]></sourcecode>
        <t>The <tt>monitor</tt> field contains the output of updating the user's view of the tree
to match <tt>FullTreeHead.tree_head.size</tt> followed by monitoring each label in
<tt>labels</tt>, in the order provided. Each MonitorLabel structure where <tt>rightmost</tt>
was present has a corresponding entry in <tt>label_versions</tt> containing the
greatest version of the label present in a number of subsequent distinguished
log entries.</t>
        <t>Users verify a MonitorResponse by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that the number of entries in <tt>label_versions</tt> is equal to the number
of MonitorLabel structures in <tt>labels</tt> with <tt>rightmost</tt> present. If a
MonitorLabel has a <tt>rightmost</tt> field that is not the rightmost distinguished
log entry, verify that the corresponding MonitorLabelVersion's <tt>versions</tt>
field is not empty.</t>
          </li>
          <li>
            <t>Verify the proof in <tt>monitor</tt> as described in <xref target="proof-combined-tree"/>.</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>.</t>
          </li>
        </ol>
        <t>Some information is omitted from MonitorResponse in the interest of efficiency,
because the user would have already seen and verified it as part of
conducting other queries. In particular, VRF proofs for different versions of
each label are not provided, given that these can be cached from the
original Search or Update query.</t>
      </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 {
  CredentialType credential_type;

  uint32 version;
  opaque opening[Nc];
  UpdateValue value;

  BinaryLadderStep binary_ladder<0..2^8-1>;
  select (Credential.credential_type) {
    case standard:
      uint64 tree_size;
      PrefixProof distinguished;
    case provisional:
      FullTreeHead full_tree_head;
      CombinedTreeProof search;
  };
} Credential;
]]></sourcecode>
        <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 a
distinguished log entry, or is of the <tt>provisional</tt> type, meaning that it is
not. All of the fields <tt>version</tt> through <tt>binary_ladder</tt> are the same as they
would be in a <tt>SearchResponse</tt> for a greatest-version search, as described in
<xref target="search"/>.</t>
        <t>If the credential is standard, the <tt>tree_size</tt> and <tt>distinguished</tt> fields are
present. The <tt>tree_size</tt> field contains the minimum tree size that the verifier
should be aware of. The <tt>distinguished</tt> field contains lookups corresponding to
a search binary ladder for the target version of the label in a recently issued
distinguished log entry. Applications define their own policy for what
constitutes a "recently issued" distinguished log entry. Users learn of and
retain all of the recently issued distinguished log entries by monitoring their
own labels, or by monitoring a neutral label provided for this purpose, using
the algorithm in <xref target="owner-algorithm"/>. Once a distinguished log entry is no
longer considered "recent", users may delete their knowledge of it as the
associated credentials are considered expired.</t>
        <t>Users follow these steps to verify a standard credential:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that they have executed the algorithm in <xref target="owner-algorithm"/> such that
it reached the rightmost distinguished log entry when the tree size was
greater than or equal to <tt>tree_size</tt>.</t>
          </li>
          <li>
            <t>Verify that the binary ladder lookups in <tt>distinguished</tt> terminate 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 the prefix tree root value of one of the recently issued
distinguished log entries.</t>
          </li>
        </ol>
        <t>If the credential is provisional, the <tt>full_tree_head</tt> and <tt>search</tt> fields are
present. These fields correspond to the same values as they would in a
<tt>SearchResponse</tt> for a greatest-version search for the label where
<tt>SearchRequest.last</tt> was not present. Users verify the <tt>Credential</tt> as they
would a greatest-version search, and additionally verify that the terminal node
of the search is to the right of the rightmost distinguished log entry.</t>
        <t>Verifying a credential <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>A provisional credential is considered expired once the timestamp of the
rightmost log entry exceeds the bound defined by <tt>max_behind</tt>. Before a
provisional credential expires, the user that provided it <bcp14>MUST</bcp14> provide a
<tt>CredentialUpdate</tt> structure. This converts the provisional credential into a
standard credential:</t>
        <t>TODO</t>
      </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 attached:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  UpdateRequest request;
  opaque signature<0..2^16-1>;
} ManagerUpdateRequest;
]]></sourcecode>
        <t>The signature is computed as described in <xref target="update-format"/>.</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^16-1>;
  PrefixLeaf removed<0..2^16-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.</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> or <tt>removed</tt>. The
<tt>proof.results</tt> field contains the result of the search for each element of
<tt>added</tt> in the order provided, followed by the result of the search for each
element of <tt>removed</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 <tt>PrefixSearchResult</tt> provided in <tt>proof</tt> for each element of
<tt>added</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> 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>, 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> and <tt>removed</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 registries:</t>
      <ul spacing="normal">
        <li>
          <t>KT Cipher Suites (<xref target="kt-cipher-suites"/>)</t>
        </li>
      </ul>
      <t>All of these registries should be under a heading of "Key Transparency",
and assignments are made via the Specification Required policy <xref target="RFC8126"/>. See
<xref target="de"/> for additional information about the KT Designated Experts (DEs).</t>
      <t>RFC EDITOR: Please replace XXXX throughout with the RFC number assigned to
this document</t>
      <section anchor="kt-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>
        </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>
          </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>
          </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">
         </author>
            <date day="12" month="April" year="2026"/>
            <abstract>
              <t>   This document defines the terminology and interaction patterns
   involved in the deployment of Key Transparency in a general secure
   group messaging infrastructure, and specifies the security properties
   that the protocol provides.  It also gives more general, non-
   prescriptive guidance on how to securely apply Key Transparency to a
   number of common applications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-08"/>
        </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 2322?>

<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 x. Equivalent to:
#   int(math.floor(math.log(x, 2)))
def log2(x):
    if x == 0:
        return 0
    k = 0
    while (x >> k) > 0:
        k += 1
    return k-1

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

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

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

# The right child of an intermediate node.
def right(x, n):
    k = level(x)
    if k == 0:
        raise Exception('leaf node has no children')
    x = x ^ (0x03 << (k - 1))
    while x >= n:
        x = left(x)
    return x
]]></sourcecode>
    </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:
            lower_bound = value
        else:
            upper_bound = value

    return out

# Returns the set of versions that would be looked up in a binary ladder for a
# fixed-version search 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 fixed_version_binary_ladder(
    t, n,
    left_inclusion = [], right_non_inclusion = []
):
    def would_end(v):
        # (Proof of inclusion for a version greater than or equal to 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 binary ladder for a
# monitoring query where the monitored version of the label is t.
def monitor_binary_ladder(t, left_inclusion = []):
    out = base_binary_ladder(t)
    filtered_out = [v for v in out if v <= t and v not in left_inclusion]

    return filtered_out

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

    def would_be_duplicate(v):
        if distinguished:
            return v in same_entry
        else:
            return (v in left_inclusion) or (v in right_non_inclusion)

    out = base_binary_ladder(t)
    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
]]></sourcecode>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963bcxpUw+r+eAiOvdUwy3W1R8i1y7G9oXWKNJcufKNvJ
ymREsBskEXYDPQCaFCMrz/I9y3mys69VuwpAsyVnctZZ63AmMtkN1GXXrn2/
TKdT15XdsniQ3fm+uMleNXnVrvOmqOY32Y9N3dXzennHzfOuOK+bmwdZ2y2c
W9TzKl/BO4smP+umZdGdTS+Lmw5fnq7lrendT127OV2VbVvWVXezhuefPn71
xF09yO47mCJ/kB0/fuiu6+byvKk36wfZ94///Orl0Q/H2S/wWVmdZ3/Ezx0M
DQ8tHrgsm2bwR9aZVbqrotoU+J0M0tvHHfiOp78TjYufr/JyCZ/r4v8dtzKr
m3P8Lm/mF/DdRdet2weffIKP4kflVTHTxz7BDz45berrtvhEB/kEXz4vu4vN
KbxOwLk+9/D5hGG29rDNsiVAt+3MVOk7Mx5tVtbJ259sO4DZRbeC8V2+6S7q
BiA0hbmy7GyzXPLp3fkW4LPIq+z5/Hm5XMIp3aEnCoHKKX+9mq/4238/xy9m
83p1Z2CwJ8WyfJM9K6vLoonHWdJnZ/i9HcJVdbPKO4DnA+fK6iz8lWUPX/zw
9PvjBzRMlzfnBYBHoVOsm7LqZmU+b+gM7t09/PSTw7uAbvS0YLOMkH0LD5/j
mffQu6uzx9Ui+6ktmpYXvICDeJDheIC803tf0IcefPQzzXi7z+Hki2WeHc+y
5/DfJk++P8qbusq+XebVZdsVZZV8/R91W6wvsm/rqiryTfLl48V13iyyX2YZ
wLQr0nefl/OLvFhm/wHfN0WxWOX4xPHjx8+fFW27M8y+/OTzu19EIMMhljhE
dlzMN02B4Jl29RSh9LiaNzfrrljAdts2J4heA1Zm+AJcyE3bJTD8cnr38+nh
l9tgCBgBY2UPL/K2SOG3ruvmKs+zR0V7sc6rRfrA4/Yiz/54UbcXyRff5c3f
8nZZFIDX+fIqL+H7Fz++eg90unf/k8PPDj+LYCMjZEdV9mLdlavy7wCKHkod
38Bhr2JA3Ls/Pbw7FewcBsR/bJZlnj3rn/QWAI3u//tylT3Lyyp94WW+gP+2
2cNm8/fseQ0LruGJ50VzuSzu7Qyaw08+/ex+BBke4b/uAWyyZ/X19BnsG2ER
AeZZfT4MnEO8aXe3YcmfN9W8Bmz7Lr0m35dAur6rAQJwAxZ9LCgv8+z7fFku
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
ifAjnqqTZsVYyVAqxkBtdADz1vqA+akBAA==

-->

</rfc>
