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

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>End-to-end encrypted communication services rely on the secure exchange of
public keys to ensure that messages remain confidential. It is typically assumed
that service providers correctly manage the public keys associated with each
user's account. However, this is not always true. A service provider that is
compromised or malicious can change the public keys associated with a user's
account without their knowledge, thereby allowing the provider to eavesdrop on
and impersonate that user.</t>
      <t>This document describes a protocol that enables a group of users to ensure that
they all have the same view of the public keys associated with each other's
accounts. Ensuring a consistent view allows users to detect when unauthorized
public keys have been associated with their account, indicating a potential
compromise.</t>
      <t>More detailed information about the protocol participants and the ways the
protocol can be deployed can be found in <xref target="I-D.ietf-keytrans-architecture"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document uses the TLS presentation language <xref target="RFC8446"/> to describe the
structure of protocol messages, but does not require the use of a specific
transport protocol. As such, implementations do not necessarily need to transmit
messages according to the TLS format and can chose whichever encoding method
best suits their application. However, cryptographic computations <bcp14>MUST</bcp14> be done
with the TLS presentation language format to ensure the protocol's security
properties are maintained.</t>
    </section>
    <section anchor="tree-construction">
      <name>Tree Construction</name>
      <t>A Transparency Log is a verifiable data structure that maps <em>label-version
pairs</em> to cryptographic keys or other structured data. Labels correspond to user
identifiers, and a new version of a label is created each time the label's
associated value changes. Transparency Logs have an <em>epoch</em> counter which is
incremented every time a new set of label-version pairs are added.</t>
      <figure>
        <name>An example log history. At epoch n the user with label X submits their first key k. As it is their first key, it is associated with version 0. At epoch n+1, user Y updates their key to l.</name>
        <artwork><![CDATA[
  Epoch   Update      Set of logged Label-Version Pairs
* n       X:0 -> k    { ..., X:0 }
* n+1     Y:3 -> l    { ..., X:0, Y:3 }
* n+2     Z:2 -> m    { ..., X:0, Y:3, Z:2 }
* n+3     X:1 -> n    { ..., X:0, Y:3, Z:2, X:1 }
]]></artwork>
      </figure>
      <t>KT uses a <em>prefix tree</em> to commit to a mapping between each label-version pair
and a commitment to the label's value at that version. Every time the prefix
tree changes, its new root hash is 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
structure</em>.</t>
      <t>This section describes the operation of
both prefix and log trees at a high level and the way that they're combined. More precise algorithms
for computing the intermediate and root values of the trees are given in
<xref target="cryptographic-computations"/>.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>Trees consist of
<em>nodes</em> which have a byte string as their <em>hash value</em>. A node is either a
<em>leaf</em> if it has no children, or a <em>parent</em>
if it has either a <em>left child</em> or a <em>right child</em>. A node is the <em>root</em> of a
tree if it has no parents, and an <em>intermediate</em> if it has both children and
parents. Nodes are <em>siblings</em> if they share the same parent.</t>
        <t>The <em>descendants</em> of a node are that node, its children, and the descendants of
its children. A <em>subtree</em> of a tree is the tree given by the descendants of a
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>
      </section>
      <section anchor="log-tree">
        <name>Log Tree</name>
        <t>Log trees are used for storing information in the chronological order that it
was added and are constructed as <em>left-balanced</em> binary trees.</t>
        <t>A binary tree is <em>balanced</em> if its size is a power of two and for any parent
node in the tree, its left and right subtrees have the same size. A binary tree
is <em>left-balanced</em> if for every parent, either the parent is balanced, or the
left subtree of that parent is the largest balanced subtree that could be
constructed from the leaves present in the parent's own subtree. Given a list of
<tt>n</tt> items, there is a unique left-balanced binary tree structure with these
elements as leaves. Note also that every parent always has both a left and right
child.</t>
        <figure>
          <name>A log tree containing five leaves.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="272" viewBox="0 0 272 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 144,112 L 144,128" fill="none" stroke="black"/>
                <path d="M 240,48 L 240,64" fill="none" stroke="black"/>
                <path d="M 264,96 L 264,192" fill="none" stroke="black"/>
                <path d="M 160,64 L 248,64" fill="none" stroke="black"/>
                <path d="M 112,128 L 176,128" fill="none" stroke="black"/>
                <path d="M 104,176 L 112,192" fill="none" stroke="black"/>
                <path d="M 176,128 L 184,144" fill="none" stroke="black"/>
                <path d="M 200,176 L 208,192" fill="none" stroke="black"/>
                <path d="M 248,64 L 264,96" fill="none" stroke="black"/>
                <path d="M 80,192 L 88,176" fill="none" stroke="black"/>
                <path d="M 104,144 L 112,128" fill="none" stroke="black"/>
                <path d="M 152,80 L 160,64" fill="none" stroke="black"/>
                <path d="M 176,192 L 184,176" fill="none" stroke="black"/>
                <g class="text">
                  <text x="240" y="36">X</text>
                  <text x="144" y="100">X</text>
                  <text x="96" y="164">X</text>
                  <text x="192" y="164">X</text>
                  <text x="72" y="212">X</text>
                  <text x="120" y="212">X</text>
                  <text x="168" y="212">X</text>
                  <text x="216" y="212">X</text>
                  <text x="264" y="212">X</text>
                  <text x="28" y="244">Index:</text>
                  <text x="72" y="244">0</text>
                  <text x="120" y="244">1</text>
                  <text x="168" y="244">2</text>
                  <text x="216" y="244">3</text>
                  <text x="264" y="244">4</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                             X
                             |
                   .---------+.
                  /            \
                 X              |
                 |              |
             .---+---.          |
            /         \         |
           X           X        |
          / \         / \       |
         /   \       /   \      |
        X     X     X     X     X

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

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

Index:  0     1     2     3     4     5
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="prefix-tree">
        <name>Prefix Tree</name>
        <t>Prefix trees are used for storing key-value pairs, in a way that provides 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 key-value pair, 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>A proof of membership is given by providing the leaf hash value, along with the
hash value of each copath entry along the search path. A proof of non-membership
is given by providing an abridged proof of membership that follows the
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 hash values and checking that the result equals the root
hash value of the tree.</t>
      </section>
      <section anchor="combined-tree">
        <name>Combined Tree</name>
        <t>Log trees are desirable because they can provide efficient consistency proofs to
assure verifiers that nothing has been removed from a log that was present in a
previous version. However, log trees can't be efficiently searched without
downloading the entire log. Prefix trees are efficient to search and can provide
inclusion proofs to convince verifiers that the returned search results are
correct. However, it's not possible to efficiently prove that a new version of a
prefix tree contains the same data as a previous version with only new values
added.</t>
        <t>In the combined tree structure, which is based on <xref target="Merkle2"/>, a prefix tree
contains a mapping where each label-version pair is a search key, and its
associated value is a cryptographic commitment to the label's new contents. A
log tree contains a record of each version of the prefix tree that's created.
With some caveats, this combined structure supports both efficient consistency
proofs and can be efficiently searched.</t>
        <t>Note that, although the Transparency Log maintains a single logical prefix tree,
each modification of this tree results in a new root hash, which is then stored
in the log tree. Therefore, when instructions refer to "looking up a label-version pair in the
prefix tree at a given log entry," this actually means searching in the specific
version of the prefix tree that corresponds to the root hash stored at that log
entry (where a "log entry" refers to a leaf of the log tree).</t>
        <figure>
          <name>An example evolution of the combined tree structure, following the example from the beginning of the section. At every epoch, a new leaf is added to a log tree, containing a change to a label's value and the updated prefix tree (PT).</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="176" width="624" viewBox="0 0 624 176" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 208,64 L 208,96" fill="none" stroke="black"/>
                <path d="M 232,96 L 232,144" fill="none" stroke="black"/>
                <path d="M 408,64 L 408,96" fill="none" stroke="black"/>
                <path d="M 464,96 L 464,128" fill="none" stroke="black"/>
                <path d="M 136,64 L 192,64" fill="none" stroke="black"/>
                <path d="M 224,64 L 392,64" fill="none" stroke="black"/>
                <path d="M 184,96 L 232,96" fill="none" stroke="black"/>
                <path d="M 352,96 L 464,96" fill="none" stroke="black"/>
                <path d="M 400,128 L 528,128" fill="none" stroke="black"/>
                <path d="M 120,64 L 140,104" fill="none" stroke="black"/>
                <path d="M 184,96 L 204,136" fill="none" stroke="black"/>
                <path d="M 352,96 L 372,136" fill="none" stroke="black"/>
                <path d="M 528,128 L 536,144" fill="none" stroke="black"/>
                <path d="M 100,104 L 120,64" fill="none" stroke="black"/>
                <path d="M 164,136 L 184,96" fill="none" stroke="black"/>
                <path d="M 332,136 L 352,96" fill="none" stroke="black"/>
                <path d="M 392,144 L 400,128" fill="none" stroke="black"/>
                <path d="M 100,104 L 140,104" fill="none" stroke="black"/>
                <path d="M 164,136 L 204,136" fill="none" stroke="black"/>
                <path d="M 332,136 L 372,136" fill="none" stroke="black"/>
                <circle cx="120" cy="64" r="6" class="opendot" fill="white" stroke="black"/>
                <circle cx="208" cy="64" r="6" class="opendot" fill="white" stroke="black"/>
                <circle cx="408" cy="64" r="6" class="opendot" fill="white" stroke="black"/>
                <g class="text">
                  <text x="24" y="36">Epoch</text>
                  <text x="120" y="36">n-1</text>
                  <text x="208" y="36">n</text>
                  <text x="408" y="36">n+1</text>
                  <text x="20" y="68">Root</text>
                  <text x="60" y="68">hash</text>
                  <text x="196" y="164">[X:0-&gt;k;</text>
                  <text x="268" y="164">h(PT_n)]</text>
                  <text x="348" y="164">[X:0-&gt;k;</text>
                  <text x="420" y="164">h(PT_n)]</text>
                  <text x="500" y="164">[Y:3-&gt;l;</text>
                  <text x="580" y="164">h(PT_n+1)]</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Epoch        n-1         n                       n+1

Root hash     o -------- o ---------------------- o
             / \         |                        |
            /___\     .--+--.              .------+------.
                     / \    |             / \            |
                    /___\   |            /___\   .-------+-------.
                            |                   /                 \
                    [X:0->k; h(PT_n)]  [X:0->k; h(PT_n)]  [Y:3->l; h(PT_n+1)]
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="searching-the-tree">
      <name>Searching the Tree</name>
      <t>When searching the combined tree structure described in <xref target="combined-tree"/>, the
proof provided by the Transparency Log may either be <strong>full</strong> or <strong>abridged</strong>. A
full proof must be provided if the deployment mode of the Transparency Log is
Contact Monitoring, or if the user has specifically requested it. Otherwise,
proofs are provided abridged.</t>
      <t>A full proof follows the path of a binary search for the first log entry where
the prefix tree contains the desired label-version pair.
This ensures that all users will check the same or
similar entries when searching for the same label, allowing for
efficient client-side auditing of the Transparency Log. The binary search uses
an <em>implicit binary search tree</em> constructed over the leaves of the log tree
(distinct from the structure of the log tree itself), which allows the search to
have a complexity logarithmic in the number of the log's leaves.</t>
      <t>An abridged proof skips this binary search, and simply looks at the most recent
version of the prefix tree to determine the commitment to
the update that the user is looking for. Abridged proofs rely on a third-party
auditor or manager that can be trusted not to collude with the Transparency Log,
and who checks that every version of the prefix tree is constructed correctly.
This is described in more detail in <xref target="putting-it-together"/>.</t>
      <section anchor="implicit-binary-search-tree">
        <name>Implicit Binary Search Tree</name>
        <t>Intuitively, the leaves of the log tree can be considered a flat array
representation of a binary tree. This structure is similar to the log tree, but
distinguished by the fact that not all parent nodes have two children. In this
representation, "leaf" nodes are stored in even-numbered indices, while
"intermediate" nodes are stored in odd-numbered indices:</t>
        <figure>
          <name>A binary tree constructed from 14 entries in a log</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="392" viewBox="0 0 392 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 144,112 L 144,128" fill="none" stroke="black"/>
                <path d="M 240,48 L 240,64" fill="none" stroke="black"/>
                <path d="M 336,112 L 336,128" fill="none" stroke="black"/>
                <path d="M 160,64 L 320,64" fill="none" stroke="black"/>
                <path d="M 112,128 L 176,128" fill="none" stroke="black"/>
                <path d="M 304,128 L 368,128" fill="none" stroke="black"/>
                <path d="M 104,176 L 112,192" fill="none" stroke="black"/>
                <path d="M 176,128 L 184,144" fill="none" stroke="black"/>
                <path d="M 200,176 L 208,192" fill="none" stroke="black"/>
                <path d="M 296,176 L 304,192" fill="none" stroke="black"/>
                <path d="M 320,64 L 328,80" fill="none" stroke="black"/>
                <path d="M 368,128 L 376,144" fill="none" stroke="black"/>
                <path d="M 80,192 L 88,176" fill="none" stroke="black"/>
                <path d="M 104,144 L 112,128" fill="none" stroke="black"/>
                <path d="M 152,80 L 160,64" fill="none" stroke="black"/>
                <path d="M 176,192 L 184,176" fill="none" stroke="black"/>
                <path d="M 272,192 L 280,176" fill="none" stroke="black"/>
                <path d="M 296,144 L 304,128" fill="none" stroke="black"/>
                <path d="M 368,192 L 376,176" fill="none" stroke="black"/>
                <g class="text">
                  <text x="240" y="36">X</text>
                  <text x="144" y="100">X</text>
                  <text x="336" y="100">X</text>
                  <text x="96" y="164">X</text>
                  <text x="192" y="164">X</text>
                  <text x="288" y="164">X</text>
                  <text x="384" y="164">X</text>
                  <text x="72" y="212">X</text>
                  <text x="120" y="212">X</text>
                  <text x="168" y="212">X</text>
                  <text x="216" y="212">X</text>
                  <text x="264" y="212">X</text>
                  <text x="312" y="212">X</text>
                  <text x="360" y="212">X</text>
                  <text x="28" y="244">Index:</text>
                  <text x="72" y="244">0</text>
                  <text x="96" y="244">1</text>
                  <text x="120" y="244">2</text>
                  <text x="144" y="244">3</text>
                  <text x="168" y="244">4</text>
                  <text x="192" y="244">5</text>
                  <text x="216" y="244">6</text>
                  <text x="240" y="244">7</text>
                  <text x="264" y="244">8</text>
                  <text x="288" y="244">9</text>
                  <text x="308" y="244">10</text>
                  <text x="332" y="244">11</text>
                  <text x="356" y="244">12</text>
                  <text x="380" y="244">13</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                             X
                             |
                   .---------+---------.
                  /                     \
                 X                       X
                 |                       |
             .---+---.               .---+---.
            /         \             /         \
           X           X           X           X
          / \         / \         / \         /
         /   \       /   \       /   \       /
        X     X     X     X     X     X     X

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

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

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

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

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

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

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

struct {
  opaque value<Hash.Nh>;
} LogParent;
]]></sourcecode>
        <t>The <tt>commitment</tt> field contains the output of evaluating HMAC on
<tt>CommitmentValue</tt>, as described in <xref target="commitment"/>. The <tt>prefix_tree</tt> field
contains the root hash of the prefix tree, after inserting a new label-version
pair for the <tt>label</tt> in <tt>CommitmentValue</tt>.</t>
        <t>The value of a parent node is computed by hashing together the values of its
left and right children:</t>
        <sourcecode type="pseudocode"><![CDATA[
parent.value = Hash(hashContent(parent.leftChild) ||
                    hashContent(parent.rightChild))

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

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

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

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

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

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

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

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

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

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

struct {
  UpdatePrefix prefix;
  opaque value<0..2^32-1>;
} UpdateValue;
]]></sourcecode>
      <t>The <tt>value</tt> field contains the new value associated with the label.</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>label</tt> field contains the label being updated, <tt>version</tt> contains the new
version, and <tt>value</tt> contains the same contents as <tt>UpdateValue.value</tt>. Clients
<bcp14>MUST</bcp14> successfully verify this signature before consuming <tt>UpdateValue.value</tt>.</t>
    </section>
    <section anchor="user-operations">
      <name>User Operations</name>
      <t>The basic user operations are organized as a request-response protocol between a
user and the Transparency Log operator.</t>
      <t>Users <bcp14>MUST</bcp14> retain the most recent <tt>TreeHead</tt> they've successfully
verified as part of any query response, and populate the <tt>last</tt> field of any
query request with the <tt>tree_size</tt> from this <tt>TreeHead</tt>. This ensures that all
operations performed by the user return consistent results.</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
  TreeHead tree_head;
  optional<ConsistencyProof> consistency;
  select (Configuration.mode) {
    case thirdPartyAuditing:
      AuditorTreeHead auditor_tree_head;
  };
} FullTreeHead;
]]></sourcecode>
      <t>If <tt>last</tt> is present, then the Transparency Log <bcp14>MUST</bcp14> provide a consistency proof
between the current tree and the tree when it was this size, in the
<tt>consistency</tt> field of <tt>FullTreeHead</tt>.</t>
      <section anchor="search">
        <name>Search</name>
        <!-- TODO: Update to cover different deployment modes -->

<t>Users initiate a Search operation by submitting a SearchRequest to the
Transparency Log containing the label that they're interested in. Users can
optionally specify a version of the label that they'd like to receive, if not the
most recent one.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  optional<uint32> 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 {
  FullTreeHead full_tree_head;

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

  opaque label<0..2^8-1>;
  opaque value<0..2^32-1>;
} UpdateRequest;
]]></sourcecode>
        <t>If the request passes application-layer policy checks, the Transparency Log adds
a new label-version pair to the prefix tree, followed by adding a new entry to
the log tree with the associated value and updated prefix tree root. It returns
an UpdateResponse structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  FullTreeHead full_tree_head;

  SearchProof search;
  opaque opening<16>;
  UpdatePrefix prefix;
} UpdateResponse;
]]></sourcecode>
        <t>Users verify the UpdateResponse as if it were a SearchResponse for the most
recent version of <tt>label</tt>. To aid verification, the update response
provides the <tt>UpdatePrefix</tt> structure necessary to reconstruct the
<tt>UpdateValue</tt>.</t>
      </section>
      <section anchor="monitor">
        <name>Monitor</name>
        <!-- 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 {
  opaque label<0..2^8-1>;
  uint32 highest_version;
  uint64 entries<0..2^8-1>;
} MonitorLabel;

struct {
  optional<uint32> last;

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

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

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

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

</section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-keytrans-architecture">
          <front>
            <title>Key Transparency Architecture</title>
            <author fullname="Brendan McMillion" initials="B." surname="McMillion">
         </author>
            <date day="26" month="August" year="2024"/>
            <abstract>
              <t>   This document defines the terminology and interaction patterns
   involved in the deployment of Key Transparency (KT) in a general
   secure group messaging infrastructure, and specifies the security
   properties that the protocol provides.  It also gives more general,
   non-prescriptive guidance on how to securely apply KT to a number of
   common applications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-02"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC6962">
          <front>
            <title>Certificate Transparency</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Kasper" initials="E." surname="Kasper"/>
            <date month="June" year="2013"/>
            <abstract>
              <t>This document describes an experimental protocol for publicly logging the existence of Transport Layer Security (TLS) certificates as they are issued or observed, in a manner that allows anyone to audit certificate authority (CA) activity and notice the issuance of suspect certificates as well as to audit the certificate logs themselves. The intent is that eventually clients would refuse to honor certificates that do not appear in a log, effectively forcing CAs to add all issued certificates to the logs.</t>
              <t>Logs are network services that implement the protocol operations for submissions and queries that are defined in this document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6962"/>
          <seriesInfo name="DOI" value="10.17487/RFC6962"/>
        </reference>
        <reference anchor="RFC9381">
          <front>
            <title>Verifiable Random Functions (VRFs)</title>
            <author fullname="S. Goldberg" initials="S." surname="Goldberg"/>
            <author fullname="L. Reyzin" initials="L." surname="Reyzin"/>
            <author fullname="D. Papadopoulos" initials="D." surname="Papadopoulos"/>
            <author fullname="J. Včelák" initials="J." surname="Včelák"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>A Verifiable Random Function (VRF) is the public key version of a keyed cryptographic hash. Only the holder of the secret key can compute the hash, but anyone with the public key can verify the correctness of the hash. VRFs are useful for preventing enumeration of hash-based data structures. This document specifies VRF constructions based on RSA and elliptic curves that are secure in the cryptographic random oracle model.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9381"/>
          <seriesInfo name="DOI" value="10.17487/RFC9381"/>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key. The cryptographic strength of HMAC depends on the properties of the underlying hash function. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="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>
      </references>
    </references>
    <?line 1389?>

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

</section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19a3cbx5Xg9/oVNfI5K5IBIJJ62KZtZWQ9xoolSyvJib0z
idEEGmQPgW6ku0GKkZXfMr9lf9neZ9Wt7gZJJZmcPWdXx5ZIoLset+77VePx
2LVFu8yP/K3v80v/rs7KZp3VeTm79K/rqq1m1fKWm2VtflLVl0e+aefOzatZ
ma3gnXmdLdpxkbeL8Vl+2eLL47W8Nd7fd83meFU0TVGV7eUann/+9N0zd37k
7zqYIjvyb58+dhdVfXZSV5v1kf/+6c/v3jz64a3/A3xWlCf+3/BzB0PDQ/Mj
5/3Ywy++Nat053m5yfE7GaS3j1vwHU9/KxkXP19lxRI+18X/K25lUtUn+F1W
z07hu9O2XTdHd+7go/hRcZ5P9LE7+MGd47q6aPI7OsgdfPmkaE83x/A6Aefi
JMDnDsNsHWDr/RKg27Rmqu47Ex5tUlSdt+9cdQCT03YF47ts055WNUBoDHN5
v9gsl3x6t74F+Myz0r+cvSyWSzilW/RELlA55q9XsxV/+68n+MVkVq1uDQz2
LF8W7/2LojzL63ScJX22wO/tEK6s6lXWAjyPnCvKRfzN+8evfnj+/dsjGqbN
6pMcwKPQydd1UbaTIpvVdAaH+wf37hzs79/jpwWbZQT/LTx8gmfeQ++28k/L
uf+xyeuGFzyHgzjyON54/9748HP6MICP/ow9b/clnHy+zPzbiX8J/9ZZ5/tH
WV2V/ttlVp41bV6Una9/VzX5+tR/W5Vlnm06Xz6dX2T13P9h4gGmbd5992Ux
O83ypf8dfF/n+XyV4RNvnz59+SJvmhvD7Is7D/Y/T0CGQyxxCP82n23qHMEz
bqsxQulpOasv120+h+02TUYQvQCs9PgCEOSmaTsw/GK8/2B88MVVMASMgLH8
49OsybvwW1dVfZ5l/knenK6zct594Glzmvl/O62a084X32X1f2bNMs8Br7Pl
eVbA969ev/sEdDq8e+fg/sH9BDYygn9U+lfrtlgVfwFQ9FDq7SUc9ioFxOHd
8cH+WLBzGBC/2yyLzL/on/QVANq6/++LlX+RFWX3hTfZHP5t/ON68xf/soIF
V/DEy7w+W+aHNwbNwZ179+8mkOER/nQIsPEvqovxC9g3wiIBzIvqZBg4B0hp
+1dhyc+bclYBtn3XJZPvC2Bd31UAAaCAeR8LirPMf58ti/lpUc6Lzvdv8w2M
+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

-->

</rfc>
