<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-keytrans-protocol-03" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title>Key Transparency Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-protocol-03"/>
    <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="2025" month="October" day="19"/>
    <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 4 and with 6 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
value), 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 entry 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
convince verifiers that nothing has been removed from a log that was present in a
previous version. However, log trees can't be efficiently searched without
downloading the entire log. Prefix trees are efficient to search and can provide
inclusion proofs to convince verifiers that the returned search results are
correct. However, it's not possible to efficiently prove that a new version of a
prefix tree contains the same data as a previous version with only new values
added.</t>
        <t>In the combined tree structure, 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, although the Transparency Log maintains 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
implicit binary search tree. 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 to the tree's right edge, all users that interact with the
Transparency Log will require log entries to the right of entry 31 to have
timestamps that are greater than or equal to that of entry 31, regardless of how
much or how little the tree grows.</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 which 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 determine 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="fixed-version-search">
      <name>Fixed-Version Search</name>
      <t>When searching the combined tree structure described in <xref target="combined-tree"/>, 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>
      <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.</t>
      <section anchor="search-binary-ladder">
        <name>Binary Ladder</name>
        <t>To perform a binary search, users need to be able to inspect individual log
entries and determine whether their search should continue to the left of the
current log entry or the right. Specifically, they need to be able to determine
if the greatest version of the label that's present in a given version of the
prefix tree is 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
each log entry in the user's search path. 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="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 milliseconds. 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 may be expired, in which case the user
would've started their search at an expired root log entry.</t>
        <t>When a user's search proceeds from a log entry which is not expired to a log
entry which is expired, the user is provided with a binary ladder from the
expired log entry as usual. If the user's search would recurse further into the
expired portion of the tree (to the log entry's left child), the search is
aborted. If the user's search would recurse away from the expired portion of the
tree (to the log entry's right child), the user continues as normal.</t>
        <t>When the root and potentially multiple frontier log entries are expired, the
user skips to the furthest-right expired frontier log entry without receiving
binary ladders from any of its parents. Similar to the previous case,
the user is provided with a binary ladder from this log entry. If the user
determines that its search would recurse to the left (further into the expired
portion of the tree), it aborts; to the right (into the unexpired portion of the
tree), it continues.</t>
        <t>This allows the Transparency Log to prune data which is sufficiently old, as
only a small amount of the log tree and prefix tree outside of the maximum
lifetime need to be retained. Users will need to inspect at most a logarithmic
number of expired log entries, meaning the rest can be discarded. 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, is on the frontier, and its right child is also
expired, recurse to the right child. Note that a right child always exists,
as the rightmost log entry can not exceed its maximum lifetime by definition.</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:  </t>
            <ol spacing="normal" type="1"><li>
                <t>If the log entry does not have a right child, proceed to step 6.</t>
              </li>
              <li>
                <t>Otherwise, recurse to the log entry's right child.</t>
              </li>
            </ol>
          </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 the log entry is not expired, terminate the search successfully.</t>
              </li>
              <li>
                <t>If the log entry does not have a right child, proceed to step 6.</t>
              </li>
              <li>
                <t>Otherwise, recurse to the log entry's right child.</t>
              </li>
            </ol>
          </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:  </t>
            <ol spacing="normal" type="1"><li>
                <t>If the log entry does not have a left child, proceed to step 6.</t>
              </li>
              <li>
                <t>If the log entry is expired, terminate the search with an error indicating
that the requested version of the label has expired.</t>
              </li>
              <li>
                <t>Otherwise, recurse to the log entry's left child.</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 or equal to
the target version.  </t>
            <ol spacing="normal" type="1"><li>
                <t>If there is no such log entry or this log entry is expired, terminate the
search with an error indicating that the requested version of the label is
unavailable.</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 is
unavailable. If the result is an inclusion proof, terminate the search
successfully.</t>
              </li>
            </ol>
          </li>
        </ol>
        <t>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"/>. The terminal log entry of the search is
defined as the log entry that triggered step 4.1, or the log entry identified in
step 6.</t>
      </section>
    </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. Unlike searches for a specific version, label owners
regularly verify that the greatest version is correctly represented in the log.
This enables a simpler, more efficient approach to searching.</t>
      <t>This section 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. The rightmost
distinguished log entry will always be on the frontier of the log and will never
be past its maximum lifetime.</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. The log entry maximum lifetime, if
defined, <bcp14>MUST</bcp14> be greater than the RMW.</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.</t>
          </li>
          <li>
            <t>If the given log entry has a left child in the implicit binary search tree,
then 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, then 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="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>If this is the rightmost log entry, verify that the binary ladder terminates
in a way that is consistent with the claimed greatest version of the label.
That is, verify that 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.</t>
          </li>
          <li>
            <t>If this is not the rightmost log entry, recurse to the log entry's right
child.</t>
          </li>
        </ol>
        <t>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"/>.
The terminal log entry of the search is defined as the leftmost log entry
inspected that contains the greatest version of the label.</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 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 converging to the same log entries.</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 at least 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 has not 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 that's been proved 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 of a label 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>If the computed list is empty, leave the position-version pair in the map
and move on to the next map entry.</t>
          </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 for 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 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 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 relevant 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 a
distinguished log entry that is not expired. 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 after 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>Once the label owner has initialized their state, 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. For a user executing this
algorithm, the only stop condition is having consumed all of the Transparency
Log's response. The Transparency Log executing this algorithm 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 that is expected to exist at
this point based on 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 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 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 commitment openings provided is equal to the new
greatest version minus the previous greatest version, or is equal to 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 commitments 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 newly added 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 all
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>;
  };
} UpdatePrefix;

struct {
  UpdatePrefix prefix;
  opaque value<0..2^32-1>;
} 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>prefix</tt> field contains a
signature from the Service Operator, using the public key from
<tt>Configuration.leaf_public_key</tt>, over the following structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque 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>;
  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> struct indicates what the terminal node of the search for
that value was:</t>
        <ul spacing="normal">
          <li>
            <t><tt>inclusion</tt> for a leaf node matching the requested value.</t>
          </li>
          <li>
            <t><tt>nonInclusionLeaf</tt> for a leaf node not matching the requested value. In this
case, the terminal node's value is provided 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 elements, 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="fixed-version-search"/>, <xref target="greatest-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 intermediate 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 timestamps 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="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 expired and is on the frontier, the right child's
timestamp.</t>
                </li>
                <li>
                  <t>If it is not the case that the log entry is expired, is on the frontier, and
its right child is also 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.2 is reached, provide a second <tt>PrefixProof</tt> from the identified log
entry specifically looking up the target version.</t>
            </li>
          </ul>
          <t>Users verify the output as specified in <xref target="fv-algorithm"/>.</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="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];
  UpdatePrefix prefix;
} 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>prefix</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>UpdatePrefix</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="6" month="July" year="2025"/>
            <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-04"/>
        </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 2334?>

<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+eAiOvdSQx3W1Rsh1Hjv0NLcmxxpLtT5Lt
ZGUyItgNkgibQA+AJsXImmf5nuU82dnXql2FQpOSM7POWetwJjLZDdRl1659
v8znczfUw7p6WNz6rroqXnVl02/KrmqWV8WPXTu0y3Z9yy3LoTppu6uHRT+s
nFu1y6Y8h3dWXXk8zOtqOJ6fVVcDvjzfyFvzew9cvz06r/u+bpvhagPPP33y
6ht38bB44GCK8mHx8skjd9l2Zyddu908LL578pdXLw6+f1n8Ap/VzUnxJ/zc
wdDw0OqhK4p5AX8Ug1mlu6iabYXfySCjfdyC73j6W9G4+Pl5Wa/hc138v+JW
Fm13gt+V3fIUvjsdhk3/8OOP8VH8qL6oFvrYx/jBx0dde9lXH+sgH+PLJ/Vw
uj2C1wk4lycePh8zzDYetkWxBuj2g5kqfWfBoy3qNnn7410HsDgdzmF8V26H
07YDCM1hrqI43q7XfHq3vgb4rMqmeL58Xq/XcEq36IlKoHLEX58vz/nbfz3B
LxbL9vxWZrBvqnX9pnhWN2dVF4+zps+O8Xs7hGva7rwcAJ4Pnaub4/BXUTz6
4fun3718SMMMZXdSAXgUOtWmq5thUZfLjs7g/r39Tz7ev3fvE35asFlGKL6G
h0/wzEfoPbTFk2ZV/NRXXc8LXsFBPCxwvPm9T+b3f08fevDRz7zg7T6Hk6/W
ZfFyUTyH/3Zl8v1B2bVN8fW6bM76oaqb5Ot/a/tqc1p83TZNVW6TL5+sLstu
VfyyKACmQ5W++7xenpbVuvg3+L6rqtV5iU+8fPLk+bOq728Ms88//uze7yOQ
4RBrHKJ4WS23XYXgmQ/tHKH0pFl2V5uhWsF2+74kiF4CVhb4AlzIbT8kMPx8
fu+z+f7nu2AIGAFjFY9Oy75K4bdp2+6iLIvHVX+6KZtV+sCT/rQs/nTa9qfJ
F9+W3d/Lfl1VgNfl+qKs4fsffnz1Huh0/8HH+5/ufxrBRkYoDprih81Qn9f/
AFCMUOrlFRz2eQyI+w/m+/fmgp15QPzbdl2XxbPxSe8A0OT+v6vPi2dl3aQv
vChX8N++eNRt/1E8b2HBLTzxvOrO1tX9G4Nm/+NPPn0QQYZH+I/7AJviWXs5
fwb7RlhEgHnWnuSBs4837d4uLPnLtlm2gG3fptfkuxpI17ctQABuwGqMBfVZ
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

-->

</rfc>
