<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.9 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-trans-rfc6962-bis-29" category="exp" obsoletes="6962">

  <front>
    <title>Certificate Transparency Version 2.0</title>

    <author initials="B." surname="Laurie" fullname="Ben Laurie">
      <organization abbrev="Google">Google UK Ltd.</organization>
      <address>
        <email>benl@google.com</email>
      </address>
    </author>
    <author initials="A." surname="Langley" fullname="Adam Langley">
      <organization abbrev="Google">Google Inc.</organization>
      <address>
        <email>agl@google.com</email>
      </address>
    </author>
    <author initials="E." surname="Kasper" fullname="Emilia Kasper">
      <organization abbrev="Google">Google Switzerland GmbH</organization>
      <address>
        <email>ekasper@google.com</email>
      </address>
    </author>
    <author initials="E." surname="Messeri" fullname="Eran Messeri">
      <organization abbrev="Google">Google UK Ltd.</organization>
      <address>
        <email>eranm@google.com</email>
      </address>
    </author>
    <author initials="R." surname="Stradling" fullname="Rob Stradling">
      <organization abbrev="Comodo CA">Comodo CA Ltd.</organization>
      <address>
        <email>rob@comodoca.com</email>
      </address>
    </author>

    <date year="2018" month="October" day="22"/>

    <area>Security</area>
    <workgroup>TRANS (Public Notary Transparency)</workgroup>
    

    <abstract>


<t>This document describes version 2.0 of the Certificate Transparency (CT)
protocol for publicly logging the existence of Transport Layer Security (TLS)
server certificates as they are issued or observed, in a manner that allows
anyone to audit certification 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>

  <middle>


<section anchor="introduction" title="Introduction">

<t>Certificate Transparency aims to mitigate the problem of misissued certificates
by providing append-only logs of issued certificates. The logs do not themselves
prevent misissuance, but they ensure that interested parties (particularly those
named in certificates) can detect such misissuance. Note that this is a general
mechanism that could be used for transparently logging any form of binary data,
subject to some kind of inclusion criteria. In this document, we only describe
its use for public TLS server certificates (i.e., where the inclusion criteria
is a valid certificate issued by a public certification authority (CA)).</t>

<t>Each log contains certificate chains, which can be submitted by anyone. It is
expected that public CAs will contribute all their newly issued certificates to
one or more logs; however certificate holders can also contribute their own
certificate chains, as can third parties. In order to avoid logs being rendered
useless by the submission of large numbers of spurious certificates, it is
required that each chain ends with a trust anchor that is accepted by the log.
When a chain is accepted by a log, a signed timestamp is returned, which can
later be used to provide evidence to TLS clients that the chain has been
submitted. TLS clients can thus require that all certificates they accept as
valid are accompanied by signed timestamps.</t>

<t>Those who are concerned about misissuance can monitor the logs, asking them
regularly for all new entries, and can thus check whether domains for which they
are responsible have had certificates issued that they did not expect. What
they do with this information, particularly when they find that a misissuance
has happened, is beyond the scope of this document. However, broadly speaking,
they can invoke existing business mechanisms for dealing with misissued
certificates, such as working with the CA to get the certificate revoked, or
with maintainers of trust anchor lists to get the CA removed. Of course, anyone
who wants can monitor the logs and, if they believe a certificate is incorrectly
issued, take action as they see fit.</t>

<t>Similarly, those who have seen signed timestamps from a particular log can later
demand a proof of inclusion from that log. If the log is unable to provide this
(or, indeed, if the corresponding certificate is absent from monitors' copies of
that log), that is evidence of the incorrect operation of the log. The checking
operation is asynchronous to allow clients to proceed without delay, despite
possible issues such as network connectivity and the vagaries of firewalls.</t>

<t>The append-only property of each log is achieved using Merkle Trees, which can
be used to efficiently prove that any particular instance of the log is a
superset of any particular previous instance and to efficiently detect various
misbehaviors of the log (e.g., issuing a signed timestamp for a certificate that
is not subsequently logged).</t>

<t>It is necessary to treat each log as a trusted third party, because the log
auditing mechanisms described in this document can be circumvented by a
misbehaving log that shows different, inconsistent views of itself to different
clients. Whilst it is anticipated that additional mechanisms could be developed
to address these shortcomings and thereby avoid the need to blindly trust logs,
such mechanisms are outside the scope of this document.</t>

<section anchor="requirements-language" title="Requirements Language">

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in <xref target="RFC2119"></xref>.</t>

</section>
<section anchor="data_structures" title="Data Structures">

<t>Data structures are defined and encoded according to the conventions laid out
in Section 3 of <xref target="RFC8446"></xref>.</t>

</section>
<section anchor="major-differences-from-ct-10" title="Major Differences from CT 1.0">

<t>This document revises and obsoletes the experimental CT 1.0 <xref target="RFC6962"></xref> protocol,
drawing on insights gained from CT 1.0 deployments and on feedback from the
community. The major changes are:</t>

<t><list style="symbols">
  <t>Hash and signature algorithm agility: permitted algorithms are now specified
in IANA registries.</t>
  <t>Precertificate format: precertificates are now CMS objects rather than X.509
certificates, which avoids violating the certificate serial number uniqueness
requirement in Section 4.1.2.2 of <xref target="RFC5280"></xref>.</t>
  <t>Removed precertificate signing certificates and the precertificate poison
extension: the change of precertificate format means that these are no longer
needed.</t>
  <t>Logs IDs: each log is now identified by an OID rather than by the hash of its
public key. OID allocations are managed by an IANA registry.</t>
  <t><spanx style="verb">TransItem</spanx> structure: this new data structure is used to encapsulate most
types of CT data. A <spanx style="verb">TransItemList</spanx>, consisting of one or more <spanx style="verb">TransItem</spanx>
structures, can be used anywhere that <spanx style="verb">SignedCertificateTimestampList</spanx> was
used in <xref target="RFC6962"></xref>.</t>
  <t>Merkle tree leaves: the <spanx style="verb">MerkleTreeLeaf</spanx> structure has been replaced by the
<spanx style="verb">TransItem</spanx> structure, which eases extensibility and simplifies the leaf
structure by removing one layer of abstraction.</t>
  <t>Unified leaf format: the structure for both certificate and precertificate
entries now includes only the TBSCertificate (whereas certificate entries in
<xref target="RFC6962"></xref> included the entire certificate).</t>
  <t>Log Artifact Extensions: these are now typed and managed by an IANA registry,
and they can now appear not only in SCTs but also in STHs.</t>
  <t>API outputs: complete <spanx style="verb">TransItem</spanx> structures are returned, rather than the
constituent parts of each structure.</t>
  <t>get-all-by-hash: new client API for obtaining an inclusion proof and the
corresponding consistency proof at the same time.</t>
  <t>submit-entry: new client API, replacing add-chain and add-pre-chain.</t>
  <t>Presenting SCTs with proofs: TLS servers may present SCTs together with the
corresponding inclusion proofs using any of the mechanisms that <xref target="RFC6962"></xref>
defined for presenting SCTs only. (Presenting SCTs only is still supported).</t>
  <t>CT TLS extension: the <spanx style="verb">signed_certificate_timestamp</spanx> TLS extension has been
replaced by the <spanx style="verb">transparency_info</spanx> TLS extension.</t>
  <t>Other TLS extensions: <spanx style="verb">status_request_v2</spanx> may be used (in the same
manner as <spanx style="verb">status_request</spanx>); <spanx style="verb">cached_info</spanx> may be used to avoid sending the
same complete SCTs and inclusion proofs to the same TLS clients multiple
times.</t>
  <t>Verification algorithms: added detailed algorithms for verifying inclusion
proofs, for verifying consistency between two STHs, and for verifying a root
hash given a complete list of the relevant leaf input entries.</t>
  <t>Extensive clarifications and editorial work.</t>
</list></t>

</section>
</section>
<section anchor="cryptographic-components" title="Cryptographic Components">

<section anchor="mht" title="Merkle Hash Trees">

<section anchor="mht_definition" title="Definition of the Merkle Tree">

<t>The log uses a binary Merkle Hash Tree for efficient auditing. The hash
algorithm used is one of the log's parameters (see <xref target="log_parameters"/>).
We have established a registry of acceptable hash algorithms (see
<xref target="hash_algorithms"/>). Throughout this document, the hash algorithm in use is
referred to as HASH and the size of its output in bytes as HASH_SIZE. The input
to the Merkle Tree Hash is a list of data entries; these entries will be
hashed to form the leaves of the Merkle Hash Tree. The output is a single
HASH_SIZE Merkle Tree Hash. Given an ordered list of n inputs, D_n =
{d[0], d[1], …, d[n-1]}, the Merkle Tree Hash (MTH) is thus defined as
follows:</t>

<t>The hash of an empty list is the hash of an empty string:</t>

<figure><artwork><![CDATA[
MTH({}) = HASH().
]]></artwork></figure>

<t>The hash of a list with one entry (also known as a leaf hash) is:</t>

<figure><artwork><![CDATA[
MTH({d[0]}) = HASH(0x00 || d[0]).
]]></artwork></figure>

<t>For n &gt; 1, let k be the largest power of two smaller than n
(i.e., k &lt; n &lt;= 2k).
The Merkle Tree Hash of an n-element list D_n is then defined recursively as</t>

<figure><artwork><![CDATA[
MTH(D_n) = HASH(0x01 || MTH(D[0:k]) || MTH(D[k:n])),
]]></artwork></figure>

<t>Where || is concatenation and D[k1:k2] = D'_(k2-k1) denotes the list
{d'[0] = d[k1], d'[1] = d[k1+1], …, d'[k2-k1-1] = d[k2-1]} of
length (k2 - k1). (Note that the hash calculations for leaves and
nodes differ; this domain separation is required to give second preimage
resistance).</t>

<t>Note that we do not require the length of the input list to be a power of two.
The resulting Merkle Tree may thus not be balanced; however, its shape is
uniquely determined by the number of leaves. (Note: This Merkle Tree is
essentially the same as the history tree <xref target="CrosbyWallach"></xref> proposal, except our
definition handles non-full trees differently).</t>

</section>
<section anchor="verify_hash" title="Verifying a Tree Head Given Entries">

<t>When a client has a complete list of n input <spanx style="verb">entries</spanx> from <spanx style="verb">0</spanx> up to
<spanx style="verb">tree_size - 1</spanx> and wishes to verify this list against a tree head <spanx style="verb">root_hash</spanx>
returned by the log for the same <spanx style="verb">tree_size</spanx>, the following algorithm may be
used:</t>

<t><list style="numbers">
  <t>Set <spanx style="verb">stack</spanx> to an empty stack.</t>
  <t>For each <spanx style="verb">i</spanx> from <spanx style="verb">0</spanx> up to <spanx style="verb">tree_size - 1</spanx>:  <list style="numbers">
      <t>Push <spanx style="verb">HASH(0x00 || entries[i])</spanx> to <spanx style="verb">stack</spanx>.</t>
      <t>Set <spanx style="verb">merge_count</spanx> to the lowest value (<spanx style="verb">0</spanx> included) such that <spanx style="verb">LSB(i &gt;&gt;
merge_count)</spanx> is not set. In other words, set <spanx style="verb">merge_count</spanx> to the number
of consecutive <spanx style="verb">1</spanx>s found starting at the least significant bit of <spanx style="verb">i</spanx>.</t>
      <t>Repeat <spanx style="verb">merge_count</spanx> times:      <list style="numbers">
          <t>Pop <spanx style="verb">right</spanx> from <spanx style="verb">stack</spanx>.</t>
          <t>Pop <spanx style="verb">left</spanx> from <spanx style="verb">stack</spanx>.</t>
          <t>Push <spanx style="verb">HASH(0x01 || left || right)</spanx> to <spanx style="verb">stack</spanx>.</t>
        </list></t>
    </list></t>
  <t>If there is more than one element in the <spanx style="verb">stack</spanx>, repeat the same merge
procedure (Step 2.3 above) until only a single element remains.</t>
  <t>The remaining element in <spanx style="verb">stack</spanx> is the Merkle Tree hash for the given
<spanx style="verb">tree_size</spanx> and should be compared by equality against the supplied
<spanx style="verb">root_hash</spanx>.</t>
</list></t>

</section>
<section anchor="merkle_inclusion_proof" title="Merkle Inclusion Proofs">

<t>A Merkle inclusion proof for a leaf in a Merkle Hash Tree is the shortest list
of additional nodes in the Merkle Tree required to compute the Merkle Tree Hash
for that tree. Each node in the tree is either a leaf node or is computed from
the two nodes immediately below it (i.e., towards the leaves). At each step up
the tree (towards the root), a node from the inclusion proof is combined with
the node computed so far. In other words, the inclusion proof consists of the
list of missing nodes required to compute the nodes leading from a leaf to the
root of the tree. If the root computed from the inclusion proof matches the true
root, then the inclusion proof proves that the leaf exists in the tree.</t>

<section anchor="generating-an-inclusion-proof" title="Generating an Inclusion Proof">

<t>Given an ordered list of n inputs to the tree, D_n = {d[0], d[1], …,
d[n-1]}, the Merkle inclusion proof PATH(m, D_n) for the (m+1)th input d[m],
0 &lt;= m &lt; n, is defined as follows:</t>

<t>The proof for the single leaf in a tree with a one-element input list D[1] =
{d[0]} is empty:</t>

<figure><artwork><![CDATA[
PATH(0, {d[0]}) = {}
]]></artwork></figure>

<t>For n &gt; 1, let k be the largest power of two smaller than n. The proof for the
(m+1)th element d[m] in a list of n &gt; m elements is then defined recursively as</t>

<figure><artwork><![CDATA[
PATH(m, D_n) = PATH(m, D[0:k]) : MTH(D[k:n]) for m < k; and

PATH(m, D_n) = PATH(m - k, D[k:n]) : MTH(D[0:k]) for m >= k,
]]></artwork></figure>

<t>The : operator and D[k1:k2] are defined the same as in <xref target="mht_definition"/>.</t>

</section>
<section anchor="verify_inclusion" title="Verifying an Inclusion Proof">

<t>When a client has received an inclusion proof (e.g., in a <spanx style="verb">TransItem</spanx> of type
<spanx style="verb">inclusion_proof_v2</spanx>) and wishes to verify inclusion of an input <spanx style="verb">hash</spanx> for a
given <spanx style="verb">tree_size</spanx> and <spanx style="verb">root_hash</spanx>, the following algorithm may be used to prove
the <spanx style="verb">hash</spanx> was included in the <spanx style="verb">root_hash</spanx>:</t>

<t><list style="numbers">
  <t>Compare <spanx style="verb">leaf_index</spanx> against <spanx style="verb">tree_size</spanx>. If <spanx style="verb">leaf_index</spanx> is greater than or
equal to <spanx style="verb">tree_size</spanx> then fail the proof verification.</t>
  <t>Set <spanx style="verb">fn</spanx> to <spanx style="verb">leaf_index</spanx> and <spanx style="verb">sn</spanx> to <spanx style="verb">tree_size - 1</spanx>.</t>
  <t>Set <spanx style="verb">r</spanx> to <spanx style="verb">hash</spanx>.</t>
  <t>For each value <spanx style="verb">p</spanx> in the <spanx style="verb">inclusion_path</spanx> array:  <vspace blankLines='1'/>
If <spanx style="verb">sn</spanx> is 0, stop the iteration and fail the proof verification.  <vspace blankLines='1'/>
If <spanx style="verb">LSB(fn)</spanx> is set, or if <spanx style="verb">fn</spanx> is equal to <spanx style="verb">sn</spanx>, then:  <list style="numbers">
      <t>Set <spanx style="verb">r</spanx> to <spanx style="verb">HASH(0x01 || p || r)</spanx></t>
      <t>If <spanx style="verb">LSB(fn)</spanx> is not set, then right-shift both <spanx style="verb">fn</spanx> and <spanx style="verb">sn</spanx> equally
until either <spanx style="verb">LSB(fn)</spanx> is set or <spanx style="verb">fn</spanx> is <spanx style="verb">0</spanx>.</t>
    </list>
Otherwise:  <list style="numbers">
      <t>Set <spanx style="verb">r</spanx> to <spanx style="verb">HASH(0x01 || r || p)</spanx></t>
    </list>
Finally, right-shift both <spanx style="verb">fn</spanx> and <spanx style="verb">sn</spanx> one time.</t>
  <t>Compare <spanx style="verb">sn</spanx> to 0. Compare <spanx style="verb">r</spanx> against the <spanx style="verb">root_hash</spanx>. If <spanx style="verb">sn</spanx> is equal to
0, and <spanx style="verb">r</spanx> and the <spanx style="verb">root_hash</spanx> are equal, then the log has proven the
inclusion of <spanx style="verb">hash</spanx>. Otherwise, fail the proof verification.</t>
</list></t>

</section>
</section>
<section anchor="consistency" title="Merkle Consistency Proofs">

<t>Merkle consistency proofs prove the append-only property of the tree. A Merkle
consistency proof for a Merkle Tree Hash MTH(D_n) and a previously advertised
hash MTH(D[0:m]) of the first m leaves, m &lt;= n, is the list of nodes in the
Merkle Tree required to verify that the first m inputs D[0:m] are equal in both
trees. Thus, a consistency proof must contain a set of intermediate nodes (i.e.,
commitments to inputs) sufficient to verify MTH(D_n), such that (a subset of)
the same nodes can be used to verify MTH(D[0:m]). We define an algorithm that
outputs the (unique) minimal consistency proof.</t>

<section anchor="generating-a-consistency-proof" title="Generating a Consistency Proof">

<t>Given an ordered list of n inputs to the tree, D_n = {d[0], d[1], …,
d[n-1]}, the Merkle consistency proof PROOF(m, D_n) for a previous Merkle Tree
Hash MTH(D[0:m]), 0 &lt; m &lt; n, is defined as:</t>

<figure><artwork><![CDATA[
PROOF(m, D_n) = SUBPROOF(m, D_n, true)
]]></artwork></figure>

<t>In SUBPROOF, the boolean value represents whether the subtree created from
D[0:m] is a complete subtree of the Merkle Tree created from D_n, and,
consequently, whether the subtree Merkle Tree Hash MTH(D[0:m]) is known. The
initial call to SUBPROOF sets this to be true, and SUBPROOF is then defined as
follows:</t>

<t>The subproof for m = n is empty if m is the value for which PROOF was originally
requested (meaning that the subtree created from D[0:m] is a complete subtree
of the Merkle Tree created from the original D_n for which PROOF was
requested, and the subtree Merkle Tree Hash MTH(D[0:m]) is known):</t>

<figure><artwork><![CDATA[
SUBPROOF(m, D[m], true) = {}
]]></artwork></figure>

<t>Otherwise, the subproof for m = n is the Merkle Tree Hash committing inputs
D[0:m]:</t>

<figure><artwork><![CDATA[
SUBPROOF(m, D[m], false) = {MTH(D[m])}
]]></artwork></figure>

<t>For m &lt; n, let k be the largest power of two smaller than n. The subproof is
then defined recursively.</t>

<t>If m &lt;= k, the right subtree entries D[k:n] only exist in the current tree.
We prove that the left subtree entries D[0:k] are consistent and add a
commitment to D[k:n]:</t>

<figure><artwork><![CDATA[
SUBPROOF(m, D_n, b) = SUBPROOF(m, D[0:k], b) : MTH(D[k:n])
]]></artwork></figure>

<t>If m &gt; k, the left subtree entries D[0:k] are identical in both trees. We prove
that the right subtree entries D[k:n] are consistent and add a commitment to
D[0:k].</t>

<figure><artwork><![CDATA[
SUBPROOF(m, D_n, b) = SUBPROOF(m - k, D[k:n], false) : MTH(D[0:k])
]]></artwork></figure>

<t>The number of nodes in the resulting proof is bounded above by ceil(log2(n)) +
1.</t>

<t>The : operator and D[k1:k2] are defined the same as in <xref target="mht_definition"/>.</t>

</section>
<section anchor="verify_consistency" title="Verifying Consistency between Two Tree Heads">

<t>When a client has a tree head <spanx style="verb">first_hash</spanx> for tree size <spanx style="verb">first</spanx>, a tree head
<spanx style="verb">second_hash</spanx> for tree size <spanx style="verb">second</spanx> where <spanx style="verb">0 &lt; first &lt; second</spanx>, and has
received a consistency proof between the two (e.g., in a <spanx style="verb">TransItem</spanx> of type
<spanx style="verb">consistency_proof_v2</spanx>), the following algorithm may be used to verify the
consistency proof:</t>

<t><list style="numbers">
  <t>If <spanx style="verb">first</spanx> is an exact power of 2, then prepend <spanx style="verb">first_hash</spanx> to the
<spanx style="verb">consistency_path</spanx> array.</t>
  <t>Set <spanx style="verb">fn</spanx> to <spanx style="verb">first - 1</spanx> and <spanx style="verb">sn</spanx> to <spanx style="verb">second - 1</spanx>.</t>
  <t>If <spanx style="verb">LSB(fn)</spanx> is set, then right-shift both <spanx style="verb">fn</spanx> and <spanx style="verb">sn</spanx> equally until
<spanx style="verb">LSB(fn)</spanx> is not set.</t>
  <t>Set both <spanx style="verb">fr</spanx> and <spanx style="verb">sr</spanx> to the first value in the <spanx style="verb">consistency_path</spanx> array.</t>
  <t>For each subsequent value <spanx style="verb">c</spanx> in the <spanx style="verb">consistency_path</spanx> array:  <vspace blankLines='1'/>
If <spanx style="verb">sn</spanx> is 0, stop the iteration and fail the proof verification.  <vspace blankLines='1'/>
If <spanx style="verb">LSB(fn)</spanx> is set, or if <spanx style="verb">fn</spanx> is equal to <spanx style="verb">sn</spanx>, then:  <list style="numbers">
      <t>Set <spanx style="verb">fr</spanx> to <spanx style="verb">HASH(0x01 || c || fr)</spanx><vspace />
Set <spanx style="verb">sr</spanx> to <spanx style="verb">HASH(0x01 || c || sr)</spanx></t>
      <t>If <spanx style="verb">LSB(fn)</spanx> is not set, then right-shift both <spanx style="verb">fn</spanx> and <spanx style="verb">sn</spanx> equally
until either <spanx style="verb">LSB(fn)</spanx> is set or <spanx style="verb">fn</spanx> is <spanx style="verb">0</spanx>.</t>
    </list>
Otherwise:  <list style="numbers">
      <t>Set <spanx style="verb">sr</spanx> to <spanx style="verb">HASH(0x01 || sr || c)</spanx></t>
    </list>
Finally, right-shift both <spanx style="verb">fn</spanx> and <spanx style="verb">sn</spanx> one time.</t>
  <t>After completing iterating through the <spanx style="verb">consistency_path</spanx> array as described
above, verify that the <spanx style="verb">fr</spanx> calculated is equal to the <spanx style="verb">first_hash</spanx> supplied,
that the <spanx style="verb">sr</spanx> calculated is equal to the <spanx style="verb">second_hash</spanx> supplied and that <spanx style="verb">sn</spanx>
is 0.</t>
</list></t>

</section>
</section>
<section anchor="example" title="Example">

<t>The binary Merkle Tree with 7 leaves:</t>

<figure><artwork><![CDATA[
            hash
           /    \
          /      \
         /        \
        /          \
       /            \
      k              l
     / \            / \
    /   \          /   \
   /     \        /     \
  g       h      i      j
 / \     / \    / \     |
 a b     c d    e f     d6
 | |     | |    | |
d0 d1   d2 d3  d4 d5
]]></artwork></figure>

<t>The inclusion proof for d0 is [b, h, l].</t>

<t>The inclusion proof for d3 is [c, g, l].</t>

<t>The inclusion proof for d4 is [f, j, k].</t>

<t>The inclusion proof for d6 is [i, k].</t>

<t>The same tree, built incrementally in four steps:</t>

<figure><artwork><![CDATA[
    hash0          hash1=k
    / \              /  \
   /   \            /    \
  /     \          /      \
  g      c         g       h
 / \     |        / \     / \
 a b     d2       a b     c d
 | |              | |     | |
d0 d1            d0 d1   d2 d3

          hash2                    hash
          /  \                    /    \
         /    \                  /      \
        /      \                /        \
       /        \              /          \
      /          \            /            \
     k            i          k              l
    / \          / \        / \            / \
   /   \         e f       /   \          /   \
  /     \        | |      /     \        /     \
 g       h      d4 d5    g       h      i      j
/ \     / \             / \     / \    / \     |
a b     c d             a b     c d    e f     d6
| |     | |             | |     | |    | |
d0 d1   d2 d3           d0 d1   d2 d3  d4 d5
]]></artwork></figure>

<t>The consistency proof between hash0 and hash is PROOF(3, D[7]) = [c, d, g, l].
c, g are used to verify hash0, and d, l are additionally used to show hash is
consistent with hash0.</t>

<t>The consistency proof between hash1 and hash is PROOF(4, D[7]) = [l]. hash can
be verified using hash1=k and l.</t>

<t>The consistency proof between hash2 and hash is PROOF(6, D[7]) = [i, j, k].
k, i are used to verify hash2, and j is additionally used to show hash is
consistent with hash2.</t>

</section>
</section>
<section anchor="signatures" title="Signatures">

<t>Various data structures <xref target="data_structures"/> are signed. A log MUST use one of
the signature algorithms defined in <xref target="signature_algorithms"/>.</t>

</section>
</section>
<section anchor="submitters" title="Submitters">

<t>Submitters submit certificates or preannouncements of certificates prior to
issuance (precertificates) to logs for public auditing, as described below. In
order to enable attribution of each logged certificate or precertificate to its
issuer, each submission MUST be accompanied by all additional certificates
required to verify the chain up to an accepted trust anchor (<xref target="get-anchors"/>).
The trust anchor (a root or intermediate CA certificate) MAY be omitted from the
submission.</t>

<t>If a log accepts a submission, it will return a Signed Certificate Timestamp
(SCT) (see <xref target="sct"/>). The submitter SHOULD validate the returned SCT as described
in <xref target="tls_clients"/> if they understand its format and they intend to use it
directly in a TLS handshake or to construct a certificate. If the submitter does
not need the SCT (for example, the certificate is being submitted simply to make
it available in the log), it MAY validate the SCT.</t>

<section anchor="certificates" title="Certificates">

<t>Any entity can submit a certificate (<xref target="submit-entry"/>) to a log. Since it is
anticipated that TLS clients will reject certificates that are not logged, it is
expected that certificate issuers and subjects will be strongly motivated to
submit them.</t>

</section>
<section anchor="precertificates" title="Precertificates">

<t>CAs may preannounce a certificate prior to issuance by submitting a
precertificate (<xref target="submit-entry"/>) that the log can use to create an entry that
will be valid against the issued certificate. The CA MAY incorporate the
returned SCT in the issued certificate. One example of where the returned SCT is
not incorporated in the issued certificate is when a CA sends the precertificate
to multiple logs, but only incorporates the SCTs that are returned first.</t>

<t>A precertificate is a CMS <xref target="RFC5652"></xref> <spanx style="verb">signed-data</spanx> object that conforms to the
following profile:</t>

<t><list style="symbols">
  <t>It MUST be DER encoded.</t>
  <t><spanx style="verb">SignedData.version</spanx> MUST be v3(3).</t>
  <t><spanx style="verb">SignedData.digestAlgorithms</spanx> MUST only include the
<spanx style="verb">SignerInfo.digestAlgorithm</spanx> OID value (see below).</t>
  <t><spanx style="verb">SignedData.encapContentInfo</spanx>:
  <list style="symbols">
      <t><spanx style="verb">eContentType</spanx> MUST be the OID 1.3.101.78.</t>
      <t><spanx style="verb">eContent</spanx> MUST contain a TBSCertificate <xref target="RFC5280"></xref> that will be identical to
the TBSCertificate in the issued certificate, except that the Transparency
Information (<xref target="x509v3_transinfo_extension"/>) extension MUST be omitted.</t>
    </list></t>
  <t><spanx style="verb">SignedData.certificates</spanx> MUST be omitted.</t>
  <t><spanx style="verb">SignedData.crls</spanx> MUST be omitted.</t>
  <t><spanx style="verb">SignedData.signerInfos</spanx> MUST contain one <spanx style="verb">SignerInfo</spanx>:
  <list style="symbols">
      <t><spanx style="verb">version</spanx> MUST be v3(3).</t>
      <t><spanx style="verb">sid</spanx> MUST use the <spanx style="verb">subjectKeyIdentifier</spanx> option.</t>
      <t><spanx style="verb">digestAlgorithm</spanx> MUST be one of the hash algorithm OIDs listed in
<xref target="hash_algorithms"/>.</t>
      <t><spanx style="verb">signedAttrs</spanx> MUST be present and MUST contain two attributes:
      <list style="symbols">
          <t>A content-type attribute whose value is the same as
<spanx style="verb">SignedData.encapContentInfo.eContentType</spanx>.</t>
          <t>A message-digest attribute whose value is the message digest of
<spanx style="verb">SignedData.encapContentInfo.eContent</spanx>.</t>
        </list></t>
      <t><spanx style="verb">signatureAlgorithm</spanx> MUST be the same OID as <spanx style="verb">TBSCertificate.signature</spanx>.</t>
      <t><spanx style="verb">signature</spanx> MUST be from the same (root or intermediate) CA that will
ultimately issue the certificate. This signature indicates the CA's intent
to issue the certificate. This intent is considered binding (i.e.,
misissuance of the precertificate is considered equivalent to misissuance of
the corresponding certificate).</t>
      <t><spanx style="verb">unsignedAttrs</spanx> MUST be omitted.</t>
    </list></t>
</list></t>

<t><spanx style="verb">SignerInfo.signedAttrs</spanx> is included in the message digest calculation process
(see Section 5.4 of <xref target="RFC5652"></xref>), which ensures that the <spanx style="verb">SignerInfo.signature</spanx>
value will not be a valid X.509v3 signature that could be used in conjunction
with the TBSCertificate (from <spanx style="verb">SignedData.encapContentInfo.eContent</spanx>) to
construct a valid certificate.</t>

</section>
</section>
<section anchor="log-format-and-operation" title="Log Format and Operation">

<t>A log is a single, append-only Merkle Tree of submitted certificate and
precertificate entries.</t>

<t>When it receives and accepts a valid submission, the log MUST return an SCT that
corresponds to the submitted certificate or precertificate. If the log has
previously seen this valid submission, it SHOULD return the same SCT as it
returned before (to reduce the ability to track clients as described in
<xref target="prevent_tracking_clients"/>). If different SCTs are produced for the same
submission, multiple log entries will have to be created, one for each SCT (as
the timestamp is a part of the leaf structure). Note that if a certificate was
previously logged as a precertificate, then the precertificate's SCT of type
<spanx style="verb">precert_sct_v2</spanx> would not be appropriate; instead, a fresh SCT of type
<spanx style="verb">x509_sct_v2</spanx> should be generated.</t>

<t>An SCT is the log's promise to append to its Merkle Tree an entry for the
accepted submission. Upon producing an SCT, the log MUST fulfil this promise by
performing the following actions within a fixed amount of time known as the
Maximum Merge Delay (MMD), which is one of the log's parameters (see
<xref target="log_parameters"/>):</t>

<t><list style="symbols">
  <t>Allocate a tree index to the entry representing the accepted submission.</t>
  <t>Calculate the root of the tree.</t>
  <t>Sign the root of the tree (see <xref target="sth"/>).</t>
</list></t>

<t>The log may append multiple entries before signing the root of the tree.</t>

<t>Log operators SHOULD NOT impose any conditions on retrieving or sharing data
from the log.</t>

<section anchor="log_parameters" title="Log Parameters">

<t>A log is defined by a collection of parameters, which are used by clients to
communicate with the log and to verify log artifacts.</t>

<t><list style="hanging">
  <t hangText='Base URL:'>
  The URL to substitute for &lt;log server&gt; in <xref target="client_messages"/>.</t>
  <t hangText='Hash Algorithm:'>
  The hash algorithm used for the Merkle Tree (see <xref target="hash_algorithms"/>).</t>
  <t hangText='Signature Algorithm:'>
  The signature algorithm used (see <xref target="signatures"/>).</t>
  <t hangText='Public Key:'>
  The public key used to verify signatures generated by the log. A log MUST NOT
use the same keypair as any other log.</t>
  <t hangText='Log ID:'>
  The OID that uniquely identifies the log.</t>
  <t hangText='Maximum Merge Delay:'>
  The MMD the log has committed to.</t>
  <t hangText='Version:'>
  The version of the protocol supported by the log (currently 1 or 2).</t>
  <t hangText='Maximum Chain Length:'>
  The longest chain submission the log is willing to accept, if the log imposes
any limit.</t>
  <t hangText='STH Frequency Count:'>
  The maximum number of STHs the log may produce in any period equal to the
<spanx style="verb">Maximum Merge Delay</spanx> (see <xref target="sth"/>).</t>
  <t hangText='Final STH:'>
  If a log has been closed down (i.e., no longer accepts new entries), existing
entries may still be valid. In this case, the client should know the final
valid STH in the log to ensure no new entries can be added without detection.
The final STH should be provided in the form of a TransItem of type
<spanx style="verb">signed_tree_head_v2</spanx>.</t>
</list></t>

<t><xref target="JSON.Metadata"></xref> is an example of a metadata format which includes the above
elements.</t>

</section>
<section anchor="accepting-submissions" title="Accepting Submissions">

<t>To ensure that logged certificates and precertificates are attributable to a
known trust anchor, and to set clear expectations for what monitors would find
in a log, and to avoid being overloaded by invalid submissions, the log MUST NOT
accept any submission until it has verified that the submitted certificate or
precertificate chains to an accepted trust anchor.</t>

<t>The log MUST NOT use other sources of intermediate CA certificates to attempt
certification path construction; instead, it MUST only use the intermediate CA
certificates provided in the submission, in the order provided.</t>

<t>Logs SHOULD accept certificates and precertificates that are fully valid
according to RFC 5280 <xref target="RFC5280"></xref> verification rules and are submitted with such
a chain. (A log may decide, for example, to temporarily reject valid submissions
to protect itself against denial-of-service attacks).</t>

<t>Logs MAY accept certificates and precertificates that have expired, are not yet
valid, have been revoked, or are otherwise not fully valid according to RFC
5280 verification rules in order to accommodate quirks of CA
certificate-issuing software.
However, logs MUST reject submissions without a valid signature chain to an
accepted trust anchor. Logs MUST also reject precertificates that do not conform
to the requirements in <xref target="precertificates"/>.</t>

<t>Logs SHOULD limit the length of chain they will accept. The maximum chain length
is one of the log's parameters (see <xref target="log_parameters"/>).</t>

<t>The log SHALL allow retrieval of its list of accepted trust anchors (see
<xref target="get-anchors"/>), each of which is a root or intermediate CA certificate. This
list might usefully be the union of root certificates trusted by major browser
vendors.</t>

</section>
<section anchor="log_entries" title="Log Entries">

<t>If a submission is accepted and an SCT issued, the accepting log MUST store the
entire chain used for verification. This chain MUST include the certificate or
precertificate itself, the zero or more intermediate CA certificates provided by
the submitter, and the trust anchor used to verify the chain (even if it was
omitted from the submission). The log MUST present this chain for auditing upon
request (see <xref target="get-entries"/>). This prevents the CA from avoiding blame by
logging a partial or empty chain.
Each log entry is a <spanx style="verb">TransItem</spanx> structure of type <spanx style="verb">x509_entry_v2</spanx> or
<spanx style="verb">precert_entry_v2</spanx>. However, a log may store its entries in any format. If a
log does not store this <spanx style="verb">TransItem</spanx> in full, it must store the <spanx style="verb">timestamp</spanx>
and <spanx style="verb">sct_extensions</spanx> of the corresponding <spanx style="verb">TimestampedCertificateEntryDataV2</spanx>
structure. The <spanx style="verb">TransItem</spanx> can be reconstructed from these fields and the entire
chain that the log used to verify the submission.</t>

</section>
<section anchor="log_id" title="Log ID">

<t>Each log is identified by an OID, which is one of the log's parameters (see
<xref target="log_parameters"/>) and which MUST NOT be used to identify any other log. A
log's operator MUST either allocate the OID themselves or request an OID from
the Log ID Registry (see <xref target="log_id_registry"/>). Various data structures include
the DER encoding of this OID, excluding the ASN.1 tag and length bytes, in an
opaque vector:</t>

<figure><artwork><![CDATA[
    opaque LogID<2..127>;
]]></artwork></figure>

<t>Note that the ASN.1 length and the opaque vector length are identical in size (1
byte) and value, so the DER encoding of the OID can be reproduced simply by
prepending an OBJECT IDENTIFIER tag (0x06) to the opaque vector length and
contents.</t>

<t>OIDs used to identify logs are limited such that the DER encoding of their value
is less than or equal to 127 octets.</t>

</section>
<section anchor="transitem-structure" title="TransItem Structure">

<t>Various data structures are encapsulated in the <spanx style="verb">TransItem</spanx> structure to ensure
that the type and version of each one is identified in a common fashion:</t>

<figure><artwork><![CDATA[
    enum {
        reserved(0),
        x509_entry_v2(1), precert_entry_v2(2),
        x509_sct_v2(3), precert_sct_v2(4),
        signed_tree_head_v2(5), consistency_proof_v2(6),
        inclusion_proof_v2(7),
        (65535)
    } VersionedTransType;

    struct {
        VersionedTransType versioned_type;
        select (versioned_type) {
            case x509_entry_v2: TimestampedCertificateEntryDataV2;
            case precert_entry_v2: TimestampedCertificateEntryDataV2;
            case x509_sct_v2: SignedCertificateTimestampDataV2;
            case precert_sct_v2: SignedCertificateTimestampDataV2;
            case signed_tree_head_v2: SignedTreeHeadDataV2;
            case consistency_proof_v2: ConsistencyProofDataV2;
            case inclusion_proof_v2: InclusionProofDataV2;
        } data;
    } TransItem;
]]></artwork></figure>

<t><spanx style="verb">versioned_type</spanx> is a value from the IANA registry in <xref target="versioned_trans_types"/>
that identifies the type of the encapsulated data structure and the earliest
version of this protocol to which it conforms. This document is v2.</t>

<t><spanx style="verb">data</spanx> is the encapsulated data structure. The various structures named with the
<spanx style="verb">DataV2</spanx> suffix are defined in later sections of this document.</t>

<t>Note that <spanx style="verb">VersionedTransType</spanx> combines the v1 <xref target="RFC6962"></xref> type enumerations
<spanx style="verb">Version</spanx>, <spanx style="verb">LogEntryType</spanx>, <spanx style="verb">SignatureType</spanx> and <spanx style="verb">MerkleLeafType</spanx>. Note also that
v1 did not define <spanx style="verb">TransItem</spanx>, but this document provides guidelines (see
<xref target="v1_coexistence"/>) on how v2 implementations can co-exist with v1
implementations.</t>

<t>Future versions of this protocol may reuse <spanx style="verb">VersionedTransType</spanx> values defined
in this document as long as the corresponding data structures are not modified,
and may add new <spanx style="verb">VersionedTransType</spanx> values for new or modified data structures.</t>

</section>
<section anchor="log-artifact-extensions" title="Log Artifact Extensions">

<figure><artwork><![CDATA[
    enum {
        reserved(65535)
    } ExtensionType;

    struct {
        ExtensionType extension_type;
        opaque extension_data<0..2^16-1>;
    } Extension;
]]></artwork></figure>

<t>The <spanx style="verb">Extension</spanx> structure provides a generic extensibility for log artifacts,
including Signed Certificate Timestamps (<xref target="sct"/>) and Signed Tree Heads
(<xref target="sth"/>). The interpretation of the <spanx style="verb">extension_data</spanx> field is determined solely
by the value of the <spanx style="verb">extension_type</spanx> field.</t>

<t>This document does not define any extensions, but it does establish a registry
for future <spanx style="verb">ExtensionType</spanx> values (see <xref target="log_artifact_extension_registry"/>).
Each document that registers a new <spanx style="verb">ExtensionType</spanx> must specify the context in
which it may be used (e.g., SCT, STH, or both) and describe how to interpret the
corresponding <spanx style="verb">extension_data</spanx>.</t>

</section>
<section anchor="tree_leaves" title="Merkle Tree Leaves">

<t>The leaves of a log's Merkle Tree correspond to the log's entries (see
<xref target="log_entries"/>). Each leaf is the leaf hash (<xref target="mht"/>) of a <spanx style="verb">TransItem</spanx>
structure of type <spanx style="verb">x509_entry_v2</spanx> or <spanx style="verb">precert_entry_v2</spanx>, which encapsulates a
<spanx style="verb">TimestampedCertificateEntryDataV2</spanx> structure. Note that leaf hashes are
calculated as HASH(0x00 || TransItem), where the hash algorithm is one of the
log's parameters.</t>

<figure><artwork><![CDATA[
    opaque TBSCertificate<1..2^24-1>;

    struct {
        uint64 timestamp;
        opaque issuer_key_hash<32..2^8-1>;
        TBSCertificate tbs_certificate;
        Extension sct_extensions<0..2^16-1>;
    } TimestampedCertificateEntryDataV2;
]]></artwork></figure>

<t><spanx style="verb">timestamp</spanx> is the date and time at which the certificate or precertificate was
accepted by the log, in the form of a 64-bit unsigned number of milliseconds
elapsed since the Unix Epoch (1 January 1970 00:00:00 UTC - see <xref target="UNIXTIME"></xref>),
ignoring leap seconds, in network byte order. Note that the leaves of a log's
Merkle Tree are not required to be in strict chronological order.</t>

<t><spanx style="verb">issuer_key_hash</spanx> is the HASH of the public key of the CA that issued the
certificate or precertificate, calculated over the DER encoding of the key
represented as SubjectPublicKeyInfo <xref target="RFC5280"></xref>. This is needed to bind the CA to
the certificate or precertificate, making it impossible for the corresponding
SCT to be valid for any other certificate or precertificate whose TBSCertificate
matches <spanx style="verb">tbs_certificate</spanx>. The length of the <spanx style="verb">issuer_key_hash</spanx> MUST match
HASH_SIZE.</t>

<t><spanx style="verb">tbs_certificate</spanx> is the DER encoded TBSCertificate from the submission. (Note
that a precertificate's TBSCertificate can be reconstructed from the
corresponding certificate as described in <xref target="reconstructing_tbscertificate"/>).</t>

<t><spanx style="verb">sct_extensions</spanx> matches the SCT extensions of the corresponding SCT.</t>

<t>The type of the <spanx style="verb">TransItem</spanx> corresponds to the value of the <spanx style="verb">type</spanx> parameter
supplied in the <xref target="submit-entry"/> call.</t>

</section>
<section anchor="sct" title="Signed Certificate Timestamp (SCT)">

<t>An SCT is a <spanx style="verb">TransItem</spanx> structure of type <spanx style="verb">x509_sct_v2</spanx> or <spanx style="verb">precert_sct_v2</spanx>,
which encapsulates a <spanx style="verb">SignedCertificateTimestampDataV2</spanx> structure:</t>

<figure><artwork><![CDATA[
    struct {
        LogID log_id;
        uint64 timestamp;
        Extension sct_extensions<0..2^16-1>;
        opaque signature<0..2^16-1>;
    } SignedCertificateTimestampDataV2;
]]></artwork></figure>

<t><spanx style="verb">log_id</spanx> is this log's unique ID, encoded in an opaque vector as described in
<xref target="log_id"/>.</t>

<t><spanx style="verb">timestamp</spanx> is equal to the timestamp from the corresponding
<spanx style="verb">TimestampedCertificateEntryDataV2</spanx> structure.</t>

<t><spanx style="verb">sct_extensions</spanx> is a vector of 0 or more SCT extensions. This vector MUST NOT
include more than one extension with the same <spanx style="verb">extension_type</spanx>. The
extensions in the vector MUST be ordered by the value of the
<spanx style="verb">extension_type</spanx> field, smallest value first. If an implementation sees an
extension that it does not understand, it SHOULD ignore that extension.
Furthermore, an implementation MAY choose to ignore any extension(s) that it
does understand.</t>

<t><spanx style="verb">signature</spanx> is computed over a <spanx style="verb">TransItem</spanx> structure of type <spanx style="verb">x509_entry_v2</spanx>
or <spanx style="verb">precert_entry_v2</spanx> (see <xref target="tree_leaves"/>) using the signature algorithm
declared in the log's parameters (see <xref target="log_parameters"/>).</t>

</section>
<section anchor="tree_head" title="Merkle Tree Head">

<t>The log stores information about its Merkle Tree in a <spanx style="verb">TreeHeadDataV2</spanx>:</t>

<figure><artwork><![CDATA[
    opaque NodeHash<32..2^8-1>;

    struct {
        uint64 timestamp;
        uint64 tree_size;
        NodeHash root_hash;
        Extension sth_extensions<0..2^16-1>;
    } TreeHeadDataV2;
]]></artwork></figure>

<t>The length of NodeHash MUST match HASH_SIZE of the log.</t>

<t><spanx style="verb">timestamp</spanx> is the current date and time, in the form of a 64-bit unsigned
number of milliseconds elapsed since the Unix Epoch (1 January 1970
00:00:00 UTC - see <xref target="UNIXTIME"></xref>), ignoring leap seconds, in network byte order.</t>

<t><spanx style="verb">tree_size</spanx> is the number of entries currently in the log's Merkle Tree.</t>

<t><spanx style="verb">root_hash</spanx> is the root of the Merkle Hash Tree.</t>

<t><spanx style="verb">sth_extensions</spanx> is a vector of 0 or more STH extensions. This vector MUST NOT
include more than one extension with the same <spanx style="verb">extension_type</spanx>. The
extensions in the vector MUST be ordered by the value of the
<spanx style="verb">extension_type</spanx> field, smallest value first. If an implementation sees an
extension that it does not understand, it SHOULD ignore that extension.
Furthermore, an implementation MAY choose to ignore any extension(s) that it
does understand.</t>

</section>
<section anchor="sth" title="Signed Tree Head (STH)">

<t>Periodically each log SHOULD sign its current tree head information (see
<xref target="tree_head"/>) to produce an STH. When a client requests a log's latest STH (see
<xref target="get-sth"/>), the log MUST return an STH that is no older than the log's MMD.
However, since STHs could be used to mark individual clients (by producing a new
STH for each query), a log MUST NOT produce STHs more frequently than its
parameters declare (see <xref target="log_parameters"/>). In general, there is no need to
produce a new STH unless there are new entries in the log; however, in the event
that a log does not accept any submissions during an MMD period, the log MUST
sign the same Merkle Tree Hash with a fresh timestamp.</t>

<t>An STH is a <spanx style="verb">TransItem</spanx> structure of type <spanx style="verb">signed_tree_head_v2</spanx>, which
encapsulates a <spanx style="verb">SignedTreeHeadDataV2</spanx> structure:</t>

<figure><artwork><![CDATA[
    struct {
        LogID log_id;
        TreeHeadDataV2 tree_head;
        opaque signature<0..2^16-1>;
    } SignedTreeHeadDataV2;
]]></artwork></figure>

<t><spanx style="verb">log_id</spanx> is this log's unique ID, encoded in an opaque vector as described in
<xref target="log_id"/>.</t>

<t>The <spanx style="verb">timestamp</spanx> in <spanx style="verb">tree_head</spanx> MUST be at least as recent as the most recent SCT
timestamp in the tree. Each subsequent timestamp MUST be more recent than the
timestamp of the previous update.</t>

<t><spanx style="verb">tree_head</spanx> contains the latest tree head information (see <xref target="tree_head"/>).</t>

<t><spanx style="verb">signature</spanx> is computed over the <spanx style="verb">tree_head</spanx> field using the signature algorithm
declared in the log's parameters (see <xref target="log_parameters"/>).</t>

</section>
<section anchor="merkle-consistency-proofs" title="Merkle Consistency Proofs">

<t>To prepare a Merkle Consistency Proof for distribution to clients, the log
produces a <spanx style="verb">TransItem</spanx> structure of type <spanx style="verb">consistency_proof_v2</spanx>, which
encapsulates a <spanx style="verb">ConsistencyProofDataV2</spanx> structure:</t>

<figure><artwork><![CDATA[
    struct {
        LogID log_id;
        uint64 tree_size_1;
        uint64 tree_size_2;
        NodeHash consistency_path<1..2^16-1>;
    } ConsistencyProofDataV2;
]]></artwork></figure>

<t><spanx style="verb">log_id</spanx> is this log's unique ID, encoded in an opaque vector as described in
<xref target="log_id"/>.</t>

<t><spanx style="verb">tree_size_1</spanx> is the size of the older tree.</t>

<t><spanx style="verb">tree_size_2</spanx> is the size of the newer tree.</t>

<t><spanx style="verb">consistency_path</spanx> is a vector of Merkle Tree nodes proving the consistency of
two STHs.</t>

</section>
<section anchor="merkle-inclusion-proofs" title="Merkle Inclusion Proofs">

<t>To prepare a Merkle Inclusion Proof for distribution to clients, the log
produces a <spanx style="verb">TransItem</spanx> structure of type <spanx style="verb">inclusion_proof_v2</spanx>, which
encapsulates an <spanx style="verb">InclusionProofDataV2</spanx> structure:</t>

<figure><artwork><![CDATA[
    struct {
        LogID log_id;
        uint64 tree_size;
        uint64 leaf_index;
        NodeHash inclusion_path<1..2^16-1>;
    } InclusionProofDataV2;
]]></artwork></figure>

<t><spanx style="verb">log_id</spanx> is this log's unique ID, encoded in an opaque vector as described in
<xref target="log_id"/>.</t>

<t><spanx style="verb">tree_size</spanx> is the size of the tree on which this inclusion proof is based.</t>

<t><spanx style="verb">leaf_index</spanx> is the 0-based index of the log entry corresponding to this
inclusion proof.</t>

<t><spanx style="verb">inclusion_path</spanx> is a vector of Merkle Tree nodes proving the inclusion of the
chosen certificate or precertificate.</t>

</section>
<section anchor="log_shutdown" title="Shutting down a log">

<t>Log operators may decide to shut down a log for various reasons, such as
deprecation of the signature algorithm. If there are entries in the log for
certificates that have not yet expired, simply making TLS clients stop
recognizing that log will have the effect of invalidating SCTs from that log.
To avoid that, the following actions are suggested:</t>

<t><list style="symbols">
  <t>Make it known to clients and monitors that the log will be frozen.</t>
  <t>Stop accepting new submissions (the error code "shutdown" should be returned
for such requests).</t>
  <t>Once MMD from the last accepted submission has passed and all pending
submissions are incorporated, issue a final STH and publish it as one of the
log's parameters. Having an STH with a timestamp that is after the MMD has
passed from the last SCT issuance allows clients to audit this log regularly
without special handling for the final STH. At this point the log's private
key is no longer needed and can be destroyed.</t>
  <t>Keep the log running until the certificates in all of its entries have expired
or exist in other logs (this can be determined by scanning other logs or
connecting to domains mentioned in the certificates and inspecting the SCTs
served).</t>
</list></t>

</section>
</section>
<section anchor="client_messages" title="Log Client Messages">

<t>Messages are sent as HTTPS GET or POST requests. Parameters for POSTs and all
responses are encoded as JavaScript Object Notation (JSON) objects <xref target="RFC7159"></xref>.
Parameters for GETs are encoded as order-independent key/value URL parameters,
using the "application/x-www-form-urlencoded" format described in the "HTML 4.01
Specification" <xref target="HTML401"></xref>. Binary data is base64 encoded <xref target="RFC4648"></xref> as specified
in the individual messages.</t>

<t>Clients are configured with a base URL for a log and construct URLs for requests
by appending suffixes to this base URL. This structure places some degree of
restriction on how log operators can deploy these services, as noted in
<xref target="RFC7320"></xref>. However, operational experience with version 1 of this protocol has
not indicated that these restrictions are a problem in practice.</t>

<t>Note that JSON objects and URL parameters may contain fields not specified here.
These extra fields SHOULD be ignored.</t>

<t>The &lt;log server&gt; prefix, which is one of the log's parameters, MAY include a
path as well as a server name and a port.</t>

<t>In practice, log servers may include multiple front-end machines. Since it is
impractical to keep these machines in perfect sync, errors may occur that are
caused by skew between the machines. Where such errors are possible, the
front-end will return additional information (as specified below) making it
possible for clients to make progress, if progress is possible. Front-ends MUST
only serve data that is free of gaps (that is, for example, no front-end will
respond with an STH unless it is also able to prove consistency from all log
entries logged within that STH).</t>

<t>For example, when a consistency proof between two STHs is requested, the
front-end reached may not yet be aware of one or both STHs. In the case where it
is unaware of both, it will return the latest STH it is aware of. Where it is
aware of the first but not the second, it will return the latest STH it is aware
of and a consistency proof from the first STH to the returned STH. The case
where it knows the second but not the first should not arise (see the "no gaps"
requirement above).</t>

<t>If the log is unable to process a client's request, it MUST return an HTTP
response code of 4xx/5xx (see <xref target="RFC7231"></xref>), and, in place of the responses
outlined in the subsections below, the body SHOULD be a JSON Problem Details
Object (see <xref target="RFC7807"></xref> Section 3), containing:</t>

<t><list style="hanging">
  <t hangText='type:'>
  A URN reference identifying the problem. To facilitate automated response
to errors, this document defines a set of standard tokens for use in the
<spanx style="verb">type</spanx> field, within the URN namespace of: "urn:ietf:params:trans:error:".</t>
  <t hangText='detail:'>
  A human-readable string describing the error that prevented the log from
processing the request, ideally with sufficient detail to enable the error to
be rectified.</t>
</list></t>

<t>e.g., In response to a request of <spanx style="verb">/ct/v2/get-entries?start=100&amp;end=99</spanx>, the log
would return a <spanx style="verb">400 Bad Request</spanx> response code with a body similar to the
following:</t>

<figure><artwork><![CDATA[
    {
        "type": "urn:ietf:params:trans:error:endBeforeStart",
        "detail": "'start' cannot be greater than 'end'"
    }
]]></artwork></figure>

<t>Most error types are specific to the type of request and are defined in the
respective subsections below. The one exception is the "malformed" error type,
which indicates that the log server could not parse the client's request because
it did not comply with this document:</t>

<texttable>
      <ttcol align='left'>type</ttcol>
      <ttcol align='left'>detail</ttcol>
      <c>malformed</c>
      <c>The request could not be parsed.</c>
</texttable>

<t>Clients SHOULD treat <spanx style="verb">500 Internal Server Error</spanx> and <spanx style="verb">503 Service Unavailable</spanx>
responses as transient failures and MAY retry the same request without
modification at a later date. Note that as per <xref target="RFC7231"></xref>, in the case of a 503
response the log MAY include a <spanx style="verb">Retry-After:</spanx> header in order to request a
minimum time for the client to wait before retrying the request.</t>

<section anchor="submit-entry" title="Submit Entry to Log">

<t>POST https://&lt;log server&gt;/ct/v2/submit-entry</t>

<t><list style="hanging">
  <t hangText='Inputs:'>
        <list style="hanging">
        <t hangText='submission:'>
        The base64 encoded certificate or precertificate.</t>
        <t hangText='type:'>
        The <spanx style="verb">VersionedTransType</spanx> integer value that indicates the type of the
<spanx style="verb">submission</spanx>: 1 for <spanx style="verb">x509_entry_v2</spanx>, or 2 for <spanx style="verb">precert_entry_v2</spanx>.</t>
        <t hangText='chain:'>
        An array of zero or more base64 encoded CA certificates. The first element
is the certifier of the <spanx style="verb">submission</spanx>; the second certifies the first; etc.
The last element of <spanx style="verb">chain</spanx> (or, if <spanx style="verb">chain</spanx> is an empty array, the
<spanx style="verb">submission</spanx>) is certified by an accepted trust anchor.</t>
      </list>
  </t>
  <t hangText='Outputs:'>
        <list style="hanging">
        <t hangText='sct:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">x509_sct_v2</spanx> or <spanx style="verb">precert_sct_v2</spanx>,
signed by this log, that corresponds to the <spanx style="verb">submission</spanx>.</t>
      </list>

If the submitted entry is immediately appended to (or already exists in) this
log's tree, then the log SHOULD also output:
      <list style="hanging">
        <t hangText='sth:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">signed_tree_head_v2</spanx>, signed by this
log.</t>
        <t hangText='inclusion:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">inclusion_proof_v2</spanx> whose
<spanx style="verb">inclusion_path</spanx> array of Merkle Tree nodes proves the inclusion of the
<spanx style="verb">submission</spanx> in the returned <spanx style="verb">sth</spanx>.</t>
      </list>
  </t>
</list></t>

<t>Error codes:</t>

<texttable>
      <ttcol align='left'>type</ttcol>
      <ttcol align='left'>detail</ttcol>
      <c>badSubmission</c>
      <c><spanx style="verb">submission</spanx> is neither a valid certificate nor a valid precertificate.</c>
      <c>badType</c>
      <c><spanx style="verb">type</spanx> is neither 1 nor 2.</c>
      <c>badChain</c>
      <c>The first element of <spanx style="verb">chain</spanx> is not the certifier of the <spanx style="verb">submission</spanx>, or the second element does not certify the first, etc.</c>
      <c>badCertificate</c>
      <c>One or more certificates in the <spanx style="verb">chain</spanx> are not valid (e.g., not properly encoded).</c>
      <c>unknownAnchor</c>
      <c>The last element of <spanx style="verb">chain</spanx> (or, if <spanx style="verb">chain</spanx> is an empty array, the <spanx style="verb">submission</spanx>) both is not, and is not certified by, an accepted trust anchor.</c>
      <c>shutdown</c>
      <c>The log is no longer accepting submissions.</c>
</texttable>

<t>If the version of <spanx style="verb">sct</spanx> is not v2, then a v2 client may be unable to verify the
signature. It MUST NOT construe this as an error. This is to avoid forcing an
upgrade of compliant v2 clients that do not use the returned SCTs.</t>

<t>If a log detects bad encoding in a chain that otherwise verifies correctly then
the log MUST either log the certificate or return the "bad certificate" error.
If the certificate is logged, an SCT MUST be issued. Logging the certificate is
useful, because monitors (<xref target="monitor"/>) can then detect these encoding errors,
which may be accepted by some TLS clients.</t>

<t>If <spanx style="verb">submission</spanx> is an accepted trust anchor whose certifier is neither an
accepted trust anchor nor the first element of <spanx style="verb">chain</spanx>, then the log MUST return
the "unknown anchor" error. A log cannot generate an SCT for a submission if it
does not have access to the issuer's public key.</t>

<t>If the returned <spanx style="verb">sct</spanx> is intended to be provided to TLS clients, then <spanx style="verb">sth</spanx> and
<spanx style="verb">inclusion</spanx> (if returned) SHOULD also be provided to TLS clients (e.g., if
<spanx style="verb">type</spanx> was 2 (for <spanx style="verb">precert_sct_v2</spanx>) then all three <spanx style="verb">TransItem</spanx>s could be
embedded in the certificate).</t>

</section>
<section anchor="get-sth" title="Retrieve Latest Signed Tree Head">

<t>GET https://&lt;log server&gt;/ct/v2/get-sth</t>

<t>No inputs.</t>

<t><list style="hanging">
  <t hangText='Outputs:'>
        <list style="hanging">
        <t hangText='sth:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">signed_tree_head_v2</spanx>, signed by this
log, that is no older than the log's MMD.</t>
      </list>
  </t>
</list></t>

</section>
<section anchor="get-sth-consistency" title="Retrieve Merkle Consistency Proof between Two Signed Tree Heads">

<t>GET https://&lt;log server&gt;/ct/v2/get-sth-consistency</t>

<t><list style="hanging">
  <t hangText='Inputs:'>
        <list style="hanging">
        <t hangText='first:'>
        The tree_size of the older tree, in decimal.</t>
        <t hangText='second:'>
        The tree_size of the newer tree, in decimal (optional).</t>
      </list>
  </t>
</list></t>

<t><list style='empty'>
  <t>Both tree sizes must be from existing v2 STHs. However, because of skew, the
receiving front-end may not know one or both of the existing STHs. If both are
known, then only the <spanx style="verb">consistency</spanx> output is returned. If the first is known
but the second is not (or has been omitted), then the latest known STH is
returned, along with a consistency proof between the first STH and the latest.
If neither are known, then the latest known STH is returned without a
consistency proof.</t>
</list></t>

<t><list style="hanging">
  <t hangText='Outputs:'>
        <list style="hanging">
        <t hangText='consistency:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">consistency_proof_v2</spanx>, whose
<spanx style="verb">tree_size_1</spanx> MUST match the <spanx style="verb">first</spanx> input. If the <spanx style="verb">sth</spanx> output is omitted,
then <spanx style="verb">tree_size_2</spanx> MUST match the <spanx style="verb">second</spanx> input.
If <spanx style="verb">first</spanx> and <spanx style="verb">second</spanx> are equal and correspond to a known STH, the
returned consistency proof MUST be empty (a <spanx style="verb">consistency_path</spanx> array with
zero elements).</t>
        <t hangText='sth:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">signed_tree_head_v2</spanx>, signed by this
log.</t>
      </list>
  </t>
</list></t>

<t><list style='empty'>
  <t>Note that no signature is required for the <spanx style="verb">consistency</spanx> output as it is used
to verify the consistency between two STHs, which are signed.</t>
</list></t>

<t>Error codes:</t>

<texttable>
      <ttcol align='left'>type</ttcol>
      <ttcol align='left'>detail</ttcol>
      <c>firstUnknown</c>
      <c><spanx style="verb">first</spanx> is before the latest known STH but is not from an existing STH.</c>
      <c>secondUnknown</c>
      <c><spanx style="verb">second</spanx> is before the latest known STH but is not from an existing STH.</c>
      <c>secondBeforeFirst</c>
      <c><spanx style="verb">second</spanx> is smaller than <spanx style="verb">first</spanx>.</c>
</texttable>

<t>See <xref target="verify_consistency"/> for an outline of how to use the <spanx style="verb">consistency</spanx>
output.</t>

</section>
<section anchor="get-proof-by-hash" title="Retrieve Merkle Inclusion Proof from Log by Leaf Hash">

<t>GET https://&lt;log server&gt;/ct/v2/get-proof-by-hash</t>

<t><list style="hanging">
  <t hangText='Inputs:'>
        <list style="hanging">
        <t hangText='hash:'>
        A base64 encoded v2 leaf hash.</t>
        <t hangText='tree_size:'>
        The tree_size of the tree on which to base the proof, in decimal.</t>
      </list>
  </t>
</list></t>

<t><list style='empty'>
  <t>The <spanx style="verb">hash</spanx> must be calculated as defined in <xref target="tree_leaves"/>. The <spanx style="verb">tree_size</spanx>
must designate an existing v2 STH. Because of skew, the front-end may not know
the requested STH. In that case, it will return the latest STH it knows, along
with an inclusion proof to that STH. If the front-end knows the requested STH
then only <spanx style="verb">inclusion</spanx> is returned.</t>
</list></t>

<t><list style="hanging">
  <t hangText='Outputs:'>
        <list style="hanging">
        <t hangText='inclusion:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">inclusion_proof_v2</spanx> whose
<spanx style="verb">inclusion_path</spanx> array of Merkle Tree nodes proves the inclusion of the
chosen certificate in the selected STH.</t>
        <t hangText='sth:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">signed_tree_head_v2</spanx>, signed by this
log.</t>
      </list>
  </t>
</list></t>

<t><list style='empty'>
  <t>Note that no signature is required for the <spanx style="verb">inclusion</spanx> output as it is used to
verify inclusion in the selected STH, which is signed.</t>
</list></t>

<t>Error codes:</t>

<texttable>
      <ttcol align='left'>type</ttcol>
      <ttcol align='left'>detail</ttcol>
      <c>hashUnknown</c>
      <c><spanx style="verb">hash</spanx> is not the hash of a known leaf (may be caused by skew or by a known certificate not yet merged).</c>
      <c>treeSizeUnknown</c>
      <c><spanx style="verb">hash</spanx> is before the latest known STH but is not from an existing STH.</c>
</texttable>

<t>See <xref target="verify_inclusion"/> for an outline of how to use the <spanx style="verb">inclusion</spanx> output.</t>

</section>
<section anchor="get-all-by-hash" title="Retrieve Merkle Inclusion Proof, Signed Tree Head and Consistency Proof by Leaf Hash">

<t>GET https://&lt;log server&gt;/ct/v2/get-all-by-hash</t>

<t><list style="hanging">
  <t hangText='Inputs:'>
        <list style="hanging">
        <t hangText='hash:'>
        A base64 encoded v2 leaf hash.</t>
        <t hangText='tree_size:'>
        The tree_size of the tree on which to base the proofs, in decimal.</t>
      </list>
  </t>
</list></t>

<t><list style='empty'>
  <t>The <spanx style="verb">hash</spanx> must be calculated as defined in <xref target="tree_leaves"/>. The <spanx style="verb">tree_size</spanx>
must designate an existing v2 STH.</t>
</list></t>

<t>Because of skew, the front-end may not know the requested STH or the requested
hash, which leads to a number of cases:</t>

<texttable>
      <ttcol align='left'>Case</ttcol>
      <ttcol align='left'>Response</ttcol>
      <c>latest STH &lt; requested STH</c>
      <c>Return latest STH</c>
      <c>latest STH &gt; requested STH</c>
      <c>Return latest STH and a consistency proof between it and the requested STH (see <xref target="get-sth-consistency"/>)</c>
      <c>index of requested hash &lt; latest STH</c>
      <c>Return <spanx style="verb">inclusion</spanx></c>
</texttable>

<t>Note that more than one case can be true, in which case the returned data is
their union. It is also possible for none to be true, in which case the
front-end MUST return an empty response.</t>

<t><list style="hanging">
  <t hangText='Outputs:'>
        <list style="hanging">
        <t hangText='inclusion:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">inclusion_proof_v2</spanx> whose
<spanx style="verb">inclusion_path</spanx> array of Merkle Tree nodes proves the inclusion of the
chosen certificate in the returned STH.</t>
        <t hangText='sth:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">signed_tree_head_v2</spanx>, signed by this
log.</t>
        <t hangText='consistency:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">consistency_proof_v2</spanx> that proves the
consistency of the requested STH and the returned STH.</t>
      </list>
  </t>
</list></t>

<t><list style='empty'>
  <t>Note that no signature is required for the <spanx style="verb">inclusion</spanx> or <spanx style="verb">consistency</spanx>
outputs as they are used to verify inclusion in and consistency of STHs, which
are signed.</t>
</list></t>

<t>Errors are the same as in <xref target="get-proof-by-hash"/>.</t>

<t>See <xref target="verify_inclusion"/> for an outline of how to use the <spanx style="verb">inclusion</spanx> output,
and see <xref target="verify_consistency"/> for an outline of how to use the <spanx style="verb">consistency</spanx>
output.</t>

</section>
<section anchor="get-entries" title="Retrieve Entries and STH from Log">

<t>GET https://&lt;log server&gt;/ct/v2/get-entries</t>

<t><list style="hanging">
  <t hangText='Inputs:'>
        <list style="hanging">
        <t hangText='start:'>
        0-based index of first entry to retrieve, in decimal.</t>
        <t hangText='end:'>
        0-based index of last entry to retrieve, in decimal.</t>
      </list>
  </t>
  <t hangText='Outputs:'>
        <list style="hanging">
        <t hangText='entries:'>
        An array of objects, each consisting of

            <list style="hanging">
              <t hangText='log_entry:'>
              The base64 encoded <spanx style="verb">TransItem</spanx> structure of type <spanx style="verb">x509_entry_v2</spanx> or
<spanx style="verb">precert_entry_v2</spanx> (see <xref target="log_entries"/>).</t>
              <t hangText='submitted_entry:'>
              JSON object representing the inputs that were submitted to
<spanx style="verb">submit-entry</spanx>, with the addition of the trust anchor to the <spanx style="verb">chain</spanx>
field if the submission did not include it.</t>
              <t hangText='sct:'>
              The base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">x509_sct_v2</spanx> or <spanx style="verb">precert_sct_v2</spanx>
corresponding to this log entry.</t>
            </list>
        </t>
        <t hangText='sth:'>
        A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx style="verb">signed_tree_head_v2</spanx>, signed by this
log.</t>
      </list>
  </t>
</list></t>

<t>Note that this message is not signed -- the <spanx style="verb">entries</spanx> data can be verified by
constructing the Merkle Tree Hash corresponding to a retrieved STH. All leaves
MUST be v2. However, a compliant v2 client MUST NOT construe an unrecognized
TransItem type as an error. This means it may be unable to parse some entries,
but note that each client can inspect the entries it does recognize as well as
verify the integrity of the data by treating unrecognized leaves as opaque input
to the tree.</t>

<t>The <spanx style="verb">start</spanx> and <spanx style="verb">end</spanx> parameters SHOULD be within the range 0 &lt;= x &lt; <spanx style="verb">tree_size</spanx>
as returned by <spanx style="verb">get-sth</spanx> in <xref target="get-sth"/>.</t>

<t>The <spanx style="verb">start</spanx> parameter MUST be less than or equal to the <spanx style="verb">end</spanx> parameter.</t>

<t>Each <spanx style="verb">submitted_entry</spanx> output parameter MUST include the trust anchor that the
log used to verify the <spanx style="verb">submission</spanx>, even if that trust anchor was not provided
to <spanx style="verb">submit-entry</spanx> (see <xref target="submit-entry"/>). If the <spanx style="verb">submission</spanx> does not certify
itself, then the first element of <spanx style="verb">chain</spanx> MUST be present and MUST certify the
<spanx style="verb">submission</spanx>.</t>

<t>Log servers MUST honor requests where 0 &lt;= <spanx style="verb">start</spanx> &lt; <spanx style="verb">tree_size</spanx> and <spanx style="verb">end</spanx> &gt;=
<spanx style="verb">tree_size</spanx> by returning a partial response covering only the valid entries in
the specified range. <spanx style="verb">end</spanx> &gt;= <spanx style="verb">tree_size</spanx> could be caused by skew. Note that the
following restriction may also apply:</t>

<t>Logs MAY restrict the number of entries that can be retrieved per <spanx style="verb">get-entries</spanx>
request. If a client requests more than the permitted number of entries, the log
SHALL return the maximum number of entries permissible. These entries SHALL be
sequential beginning with the entry specified by <spanx style="verb">start</spanx>.</t>

<t>Because of skew, it is possible the log server will not have any entries between
<spanx style="verb">start</spanx> and <spanx style="verb">end</spanx>. In this case it MUST return an empty <spanx style="verb">entries</spanx> array.</t>

<t>In any case, the log server MUST return the latest STH it knows about.</t>

<t>See <xref target="verify_hash"/> for an outline of how to use a complete list of <spanx style="verb">log_entry</spanx>
entries to verify the <spanx style="verb">root_hash</spanx>.</t>

<t>Error codes:</t>

<texttable>
      <ttcol align='left'>type</ttcol>
      <ttcol align='left'>detail</ttcol>
      <c>startUnknown</c>
      <c><spanx style="verb">start</spanx> is greater than the number of entries in the Merkle tree.</c>
      <c>endBeforeStart</c>
      <c><spanx style="verb">start</spanx> cannot be greater than <spanx style="verb">end</spanx>.</c>
</texttable>

</section>
<section anchor="get-anchors" title="Retrieve Accepted Trust Anchors">

<t>GET https://&lt;log server&gt;/ct/v2/get-anchors</t>

<t>No inputs.</t>

<t><list style="hanging">
  <t hangText='Outputs:'>
        <list style="hanging">
        <t hangText='certificates:'>
        An array of base64 encoded trust anchors that are acceptable to the log.</t>
        <t hangText='max_chain_length:'>
        If the server has chosen to limit the length of chains it accepts, this is
the maximum number of certificates in the chain, in decimal. If there is no
limit, this is omitted.</t>
      </list>
  </t>
</list></t>

</section>
</section>
<section anchor="tls_servers" title="TLS Servers">

<t>CT-using TLS servers MUST use at least one of the three mechanisms listed below
to present one or more SCTs from one or more logs to each TLS client during full
TLS handshakes, where each SCT corresponds to the server certificate. They
SHOULD also present corresponding inclusion proofs and STHs.</t>

<t>Three mechanisms are provided because they have different tradeoffs.</t>

<t><list style="symbols">
  <t>A TLS extension (Section 4.2 of <xref target="RFC8446"></xref>) with type <spanx style="verb">transparency_info</spanx>
(see <xref target="tls_transinfo_extension"/>). This mechanism allows TLS servers to
participate in CT without the cooperation of CAs, unlike the other two
mechanisms. It also allows SCTs and inclusion proofs to be updated on the fly.</t>
  <t>An Online Certificate Status Protocol (OCSP) <xref target="RFC6960"></xref> response extension (see
<xref target="ocsp_transinfo_extension"/>), where the OCSP response is provided in the
<spanx style="verb">CertificateStatus</spanx> message, provided that the TLS client included the
<spanx style="verb">status_request</spanx> extension in the (extended) <spanx style="verb">ClientHello</spanx> (Section 8 of
<xref target="RFC6066"></xref>). This mechanism, popularly known as OCSP stapling, is already
widely (but not universally) implemented. It also allows SCTs and inclusion
proofs to be updated on the fly.</t>
  <t>An X509v3 certificate extension (see <xref target="cert_transinfo_extension"/>). This
mechanism allows the use of unmodified TLS servers, but the SCTs and inclusion
proofs cannot be updated on the fly. Since the logs from which the SCTs and
inclusion proofs originated won't necessarily be accepted by TLS clients for
the full lifetime of the certificate, there is a risk that TLS clients will
subsequently consider the certificate to be non-compliant and in need of
re-issuance.</t>
</list></t>

<t>Additionally, a TLS server which supports presenting SCTs using an OCSP response
MAY provide it when the TLS client included the <spanx style="verb">status_request_v2</spanx> extension
(<xref target="RFC6961"></xref>) in the (extended) <spanx style="verb">ClientHello</spanx>, but only in addition to at least
one of the three mechanisms listed above.</t>

<section anchor="multiple-scts" title="Multiple SCTs">

<t>CT-using TLS servers SHOULD send SCTs from multiple logs, because:</t>

<t><list style="symbols">
  <t>One or more logs may not have become acceptable to all CT-using TLS clients.</t>
  <t>If a CA and a log collude, it is possible to temporarily hide misissuance from
clients. When a TLS client requires SCTs from multiple logs to be provided, it
is more difficult to mount this attack.</t>
  <t>If a log misbehaves or suffers a key compromise, a consequence may be that
clients cease to trust it. Since the time an SCT may be in use can be
considerable (several years is common in current practice when embedded in a
certificate), including SCTs from multiple logs reduces the probability of the
certificate being rejected by TLS clients.</t>
  <t>TLS clients may have policies related to the above risks requiring TLS servers
to present multiple SCTs. For example, at the time of writing, Chromium
<xref target="Chromium.Log.Policy"></xref> requires multiple SCTs to be presented with EV
certificates in order for the EV indicator to be shown.</t>
</list></t>

<t>To select the logs from which to obtain SCTs, a TLS server can, for example,
examine the set of logs popular TLS clients accept and recognize.</t>

</section>
<section anchor="transitemlist-structure" title="TransItemList Structure">

<t>Multiple SCTs, inclusion proofs, and indeed <spanx style="verb">TransItem</spanx> structures of any type,
are combined into a list as follows:</t>

<figure><artwork><![CDATA[
      opaque SerializedTransItem<1..2^16-1>;

      struct {
          SerializedTransItem trans_item_list<1..2^16-1>;
      } TransItemList;
]]></artwork></figure>

<t>Here, <spanx style="verb">SerializedTransItem</spanx> is an opaque byte string that contains the
serialized <spanx style="verb">TransItem</spanx> structure. This encoding ensures that TLS clients can
decode each <spanx style="verb">TransItem</spanx> individually (so, for example, if there is a version
upgrade, out-of-date clients can still parse old <spanx style="verb">TransItem</spanx> structures while
skipping over new <spanx style="verb">TransItem</spanx> structures whose versions they don't understand).</t>

</section>
<section anchor="presenting_transitems" title="Presenting SCTs, inclusions proofs and STHs">

<t>In each <spanx style="verb">TransItemList</spanx> that is sent to a client during a TLS handshake, the TLS
server MUST include a <spanx style="verb">TransItem</spanx> structure of type <spanx style="verb">x509_sct_v2</spanx> or
<spanx style="verb">precert_sct_v2</spanx> (except as described in <xref target="cached_info"/>).</t>

<t>Presenting inclusion proofs and STHs in the TLS handshake helps to protect the
client's privacy (see <xref target="fetching_inclusion_proofs"/>) and reduces load on log
servers. Therefore, if the TLS server can obtain them, it SHOULD also include
<spanx style="verb">TransItem</spanx>s of type <spanx style="verb">inclusion_proof_v2</spanx> and <spanx style="verb">signed_tree_head_v2</spanx> in the
<spanx style="verb">TransItemList</spanx>.</t>

</section>
<section anchor="tls_transinfo_extension" title="transparency_info TLS Extension">

<t>Provided that a TLS client includes the <spanx style="verb">transparency_info</spanx> extension type in
the ClientHello and the TLS server supports the <spanx style="verb">transparency_info</spanx> extension:</t>

<t><list style="symbols">
  <t>The TLS server MUST verify that the received <spanx style="verb">extension_data</spanx> is empty.</t>
  <t>The TLS server MUST construct a <spanx style="verb">TransItemList</spanx> of relevant <spanx style="verb">TransItem</spanx>s (see
<xref target="presenting_transitems"/>), which SHOULD omit any <spanx style="verb">TransItem</spanx>s that are
already embedded in the server certificate or the stapled OCSP response (see
<xref target="x509v3_transinfo_extension"/>). If the constructed <spanx style="verb">TransItemList</spanx> is not
empty, then the TLS server MUST include the <spanx style="verb">transparency_info</spanx> extension with
the <spanx style="verb">extension_data</spanx> set to this <spanx style="verb">TransItemList</spanx>.</t>
</list></t>

<t>TLS servers MUST only include this extension in the following messages:</t>

<t><list style="symbols">
  <t>the ServerHello message (for TLS 1.2 or earlier).</t>
  <t>the Certificate or CertificateRequest message (for TLS 1.3).</t>
</list></t>

<t>TLS servers MUST NOT process or include this extension when a TLS session is
resumed, since session resumption uses the original session information.</t>

</section>
<section anchor="cached_info" title="cached_info TLS Extension">

<t>When a TLS server includes the <spanx style="verb">transparency_info</spanx> extension, it SHOULD NOT
include any <spanx style="verb">TransItem</spanx> structures of type <spanx style="verb">x509_sct_v2</spanx> or <spanx style="verb">precert_sct_v2</spanx> in
the <spanx style="verb">TransItemList</spanx> if all of the following conditions are met:</t>

<t><list style="symbols">
  <t>The TLS client includes the <spanx style="verb">cached_info</spanx> (<xref target="RFC7924"></xref>) extension type in the
ClientHello, with a <spanx style="verb">CachedObject</spanx> of type <spanx style="verb">ct_compliant</spanx> (see
<xref target="tls_cachedinfo_extension"/>) and at least one <spanx style="verb">CachedObject</spanx> of type <spanx style="verb">cert</spanx>.</t>
  <t>The TLS server sends a modified Certificate message (as described in section
4.1 of <xref target="RFC7924"></xref>).</t>
</list></t>

<t>If the <spanx style="verb">hash_value</spanx> of any <spanx style="verb">CachedObject</spanx> of type <spanx style="verb">ct_compliant</spanx> sent by a TLS
client is not 1 byte long with the value 0, the CT-using TLS server MUST abort
the handshake.</t>

</section>
</section>
<section anchor="certification-authorities" title="Certification Authorities">

<section anchor="x509v3_transinfo_extension" title="Transparency Information X.509v3 Extension">

<t>The Transparency Information X.509v3 extension, which has OID 1.3.101.75 and
SHOULD be non-critical, contains one or more <spanx style="verb">TransItem</spanx> structures in a
<spanx style="verb">TransItemList</spanx>. This extension MAY be included in OCSP responses (see
<xref target="ocsp_transinfo_extension"/>) and certificates (see
<xref target="cert_transinfo_extension"/>). Since RFC5280 requires the <spanx style="verb">extnValue</spanx> field (an
OCTET STRING) of each X.509v3 extension to include the DER encoding of an ASN.1
value, a <spanx style="verb">TransItemList</spanx> MUST NOT be included directly. Instead, it MUST be
wrapped inside an additional OCTET STRING, which is then put into the
<spanx style="verb">extnValue</spanx> field:</t>

<figure><artwork><![CDATA[
    TransparencyInformationSyntax ::= OCTET STRING
]]></artwork></figure>

<t><spanx style="verb">TransparencyInformationSyntax</spanx> contains a <spanx style="verb">TransItemList</spanx>.</t>

<section anchor="ocsp_transinfo_extension" title="OCSP Response Extension">

<t>A certification authority MAY include a Transparency Information X.509v3
extension in the <spanx style="verb">singleExtensions</spanx> of a <spanx style="verb">SingleResponse</spanx> in an OCSP response.
All included SCTs and inclusion proofs MUST be for the certificate identified by
the <spanx style="verb">certID</spanx> of that <spanx style="verb">SingleResponse</spanx>, or for a precertificate that corresponds
to that certificate.</t>

</section>
<section anchor="cert_transinfo_extension" title="Certificate Extension">

<t>A certification authority MAY include a Transparency Information X.509v3
extension in a certificate. All included SCTs and inclusion proofs MUST be for a
precertificate that corresponds to this certificate.</t>

</section>
</section>
<section anchor="tls-feature-x509v3-extension" title="TLS Feature X.509v3 Extension">

<t>A certification authority SHOULD NOT issue any certificate that identifies the
<spanx style="verb">transparency_info</spanx> TLS extension in a TLS feature extension <xref target="RFC7633"></xref>, because
TLS servers are not required to support the <spanx style="verb">transparency_info</spanx> TLS extension in
order to participate in CT (see <xref target="tls_servers"/>).</t>

</section>
</section>
<section anchor="clients" title="Clients">

<t>There are various different functions clients of logs might perform. We describe
here some typical clients and how they should function. Any inconsistency may be
used as evidence that a log has not behaved correctly, and the signatures on the
data structures prevent the log from denying that misbehavior.</t>

<t>All clients need various parameters in order to communicate with logs and verify
their responses. These parameters are described in <xref target="log_parameters"/>, but note
that this document does not describe how the parameters are obtained, which is
implementation-dependent (see, for example, <xref target="Chromium.Policy"></xref>).</t>

<section anchor="tls_clients" title="TLS Client">

<section anchor="receiving_transitems" title="Receiving SCTs and inclusion proofs">

<t>TLS clients receive SCTs and inclusion proofs alongside or in certificates.
CT-using TLS clients MUST implement all of the three mechanisms by which TLS
servers may present SCTs (see <xref target="tls_servers"/>) and MAY also accept SCTs via the
<spanx style="verb">status_request_v2</spanx> extension (<xref target="RFC6961"></xref>).</t>

<t>TLS clients that support the <spanx style="verb">transparency_info</spanx> TLS extension
(see <xref target="tls_transinfo_extension"/>) SHOULD include it in ClientHello messages,
with empty <spanx style="verb">extension_data</spanx>. If a TLS server includes the <spanx style="verb">transparency_info</spanx>
TLS extension when resuming a TLS session, the TLS client MUST abort the
handshake.</t>

</section>
<section anchor="reconstructing_tbscertificate" title="Reconstructing the TBSCertificate">

<t>Validation of an SCT for a certificate (where the <spanx style="verb">type</spanx> of the <spanx style="verb">TransItem</spanx> is
<spanx style="verb">x509_sct_v2</spanx>) uses the unmodified TBSCertificate component of the certificate.</t>

<t>Before an SCT for a precertificate (where the <spanx style="verb">type</spanx> of the <spanx style="verb">TransItem</spanx> is
<spanx style="verb">precert_sct_v2</spanx>) can be validated, the TBSCertificate component of the
precertificate needs to be reconstructed from the TBSCertificate component of
the certificate as follows:</t>

<t><list style="symbols">
  <t>Remove the Transparency Information extension
(see <xref target="x509v3_transinfo_extension"/>).</t>
  <t>Remove embedded v1 SCTs, identified by OID 1.3.6.1.4.1.11129.2.4.2 (see
section 3.3 of <xref target="RFC6962"></xref>). This allows embedded v1 and v2 SCTs to co-exist in
a certificate (see <xref target="v1_coexistence"/>).</t>
</list></t>

</section>
<section anchor="validating-scts" title="Validating SCTs">

<t>In addition to normal validation of the server certificate and its chain,
CT-using TLS clients MUST validate each received SCT for which they have the
corresponding log's parameters. To validate an SCT, a TLS client computes the
signature input by constructing a <spanx style="verb">TransItem</spanx> of type <spanx style="verb">x509_entry_v2</spanx> or
<spanx style="verb">precert_entry_v2</spanx>, depending on the SCT's <spanx style="verb">TransItem</spanx> type. The
<spanx style="verb">TimestampedCertificateEntryDataV2</spanx> structure is constructed in the following
manner:</t>

<t><list style="symbols">
  <t><spanx style="verb">timestamp</spanx> is copied from the SCT.</t>
  <t><spanx style="verb">tbs_certificate</spanx> is the reconstructed TBSCertificate portion of the server
 certificate, as described in <xref target="reconstructing_tbscertificate"/>.</t>
  <t><spanx style="verb">issuer_key_hash</spanx> is computed as described in <xref target="tree_leaves"/>.</t>
  <t><spanx style="verb">sct_extensions</spanx> is copied from the SCT.</t>
</list></t>

<t>The SCT's <spanx style="verb">signature</spanx> is then verified using the public key of the corresponding
log, which is identified by the <spanx style="verb">log_id</spanx>. The required signature algorithm is
one of the log's parameters.</t>

</section>
<section anchor="fetching_inclusion_proofs" title="Fetching inclusion proofs">

<t>When a TLS client has validated a received SCT but does not yet possess
a corresponding inclusion proof, the TLS client MAY request the inclusion
proof directly from a log using <spanx style="verb">get-proof-by-hash</spanx> (<xref target="get-proof-by-hash"/>) or
<spanx style="verb">get-all-by-hash</spanx> (<xref target="get-all-by-hash"/>).</t>

<t>Note that fetching inclusion proofs directly from a log will disclose to the
log which TLS server the client has been communicating with. This may be
regarded as a significant privacy concern, and so it is preferable for the TLS
server to send the inclusion proofs (see <xref target="presenting_transitems"/>).</t>

</section>
<section anchor="validating_inclusion_proofs" title="Validating inclusion proofs">

<t>When a TLS client has received, or fetched, an inclusion proof (and an STH),
it SHOULD proceed to verifying the inclusion proof to the provided STH.
The TLS client SHOULD also verify consistency between the provided STH
and an STH it knows about.</t>

<t>If the TLS client holds an STH that predates the SCT, it MAY, in the process of
auditing, request a new STH from the log (<xref target="get-sth"/>), then verify it by
requesting a consistency proof (<xref target="get-sth-consistency"/>). Note that if the TLS
client uses <spanx style="verb">get-all-by-hash</spanx>, then it will already have the new STH.</t>

</section>
<section anchor="evaluating-compliance" title="Evaluating compliance">

<t>It is up to a client's local policy to specify the quantity and form of
evidence (SCTs, inclusion proofs or a combination) needed to achieve
compliance and how to handle non-compliance.</t>

<t>A TLS client can only evaluate compliance if it has given the TLS server the
opportunity to send SCTs and inclusion proofs by any of the three mechanisms
that are mandatory to implement for CT-using TLS clients (see
<xref target="receiving_transitems"/>). Therefore, a TLS client MUST NOT evaluate compliance
if it did not include both the <spanx style="verb">transparency_info</spanx> and <spanx style="verb">status_request</spanx> TLS
extensions in the ClientHello.</t>

</section>
<section anchor="tls_cachedinfo_extension" title="cached_info TLS Extension">

<t>If a TLS client uses the <spanx style="verb">cached_info</spanx> TLS extension (<xref target="RFC7924"></xref>) to indicate 1
or more cached certificates, all of which it already considers to be CT
compliant, the TLS client MAY also include a <spanx style="verb">CachedObject</spanx> of type
<spanx style="verb">ct_compliant</spanx> in the <spanx style="verb">cached_info</spanx> extension. Its <spanx style="verb">hash_value</spanx> field MUST have
the value 0 and be 1 byte long (the minimum length permitted by <xref target="RFC7924"></xref>).</t>

</section>
</section>
<section anchor="monitor" title="Monitor">

<t>Monitors watch logs to check that they behave correctly, for certificates of
interest, or both. For example, a monitor may be configured to report on all
certificates that apply to a specific domain name when fetching new entries for
consistency validation.</t>

<t>A monitor MUST at least inspect every new entry in every log it watches, and it
MAY also choose to keep copies of entire logs.</t>

<t>To inspect all of the existing entries, the monitor SHOULD follow these steps
once for each log:</t>

<t><list style="numbers">
  <t>Fetch the current STH (<xref target="get-sth"/>).</t>
  <t>Verify the STH signature.</t>
  <t>Fetch all the entries in the tree corresponding to the STH (<xref target="get-entries"/>).</t>
  <t>If applicable, check each entry to see if it's a certificate of interest.</t>
  <t>Confirm that the tree made from the fetched entries produces the same hash as
that in the STH.</t>
</list></t>

<t>To inspect new entries, the monitor SHOULD follow these steps repeatedly for
each log:</t>

<t><list style="numbers">
  <t>Fetch the current STH (<xref target="get-sth"/>). Repeat until the STH changes.</t>
  <t>Verify the STH signature.</t>
  <t>Fetch all the new entries in the tree corresponding to the STH
(<xref target="get-entries"/>). If they remain unavailable for an extended period, then
this should be viewed as misbehavior on the part of the log.</t>
  <t>If applicable, check each entry to see if it's a certificate of interest.</t>
  <t>Either:  <list style="numbers">
      <t>Verify that the updated list of all entries generates a tree with the
same hash as the new STH.</t>
    </list>
Or, if it is not keeping all log entries:  <list style="numbers">
      <t>Fetch a consistency proof for the new STH with the previous STH
(<xref target="get-sth-consistency"/>).</t>
      <t>Verify the consistency proof.</t>
      <t>Verify that the new entries generate the corresponding elements in the
consistency proof.</t>
    </list></t>
  <t>Repeat from step 1.</t>
</list></t>

</section>
<section anchor="auditing" title="Auditing">

<t>Auditing ensures that the current published state of a log is reachable from
previously published states that are known to be good, and that the promises
made by the log in the form of SCTs have been kept. Audits are performed by
monitors or TLS clients.</t>

<t>In particular, there are four log behavior properties that should be checked:</t>

<t><list style="symbols">
  <t>The Maximum Merge Delay (MMD).</t>
  <t>The STH Frequency Count.</t>
  <t>The append-only property.</t>
  <t>The consistency of the log view presented to all query sources.</t>
</list></t>

<t>A benign, conformant log publishes a series of STHs over time, each derived from
the previous STH and the submitted entries incorporated into the log since
publication of the previous STH. This can be proven through auditing of STHs.
SCTs returned to TLS clients can be audited by verifying against the
accompanying certificate, and using Merkle Inclusion Proofs, against the log's
Merkle tree.</t>

<t>The action taken by the auditor if an audit fails is not specified, but note
that in general if audit fails, the auditor is in possession of signed proof of
the log's misbehavior.</t>

<t>A monitor (<xref target="monitor"/>) can audit by verifying the consistency of STHs it
receives, ensure that each entry can be fetched and that the STH is indeed the
result of making a tree from all fetched entries.</t>

<t>A TLS client (<xref target="tls_clients"/>) can audit by verifying an SCT against any STH
dated after the SCT timestamp + the Maximum Merge Delay by requesting a Merkle
inclusion proof (<xref target="get-proof-by-hash"/>). It can also verify that the SCT
corresponds to the server certificate it arrived with (i.e., the log entry is
that certificate, or is a precertificate corresponding to that certificate).</t>

<t>Checking of the consistency of the log view presented to all entities is more
difficult to perform because it requires a way to share log responses among a
set of CT-using entities, and is discussed in <xref target="misbehaving_logs"/>.</t>

</section>
</section>
<section anchor="algorithm-agility" title="Algorithm Agility">

<t>It is not possible for a log to change any of its algorithms part way through
its lifetime:</t>

<t><list style="hanging">
  <t hangText='Signature algorithm:'>
  SCT signatures must remain valid so signature algorithms can only be added,
not removed.</t>
  <t hangText='Hash algorithm:'>
  A log would have to support the old and new hash algorithms to allow
backwards-compatibility with clients that are not aware of a hash algorithm
change.</t>
</list></t>

<t>Allowing multiple signature or hash algorithms for a log would require that all
data structures support it and would significantly complicate client
implementation, which is why it is not supported by this document.</t>

<t>If it should become necessary to deprecate an algorithm used by a live log, then
the log MUST be frozen as specified in <xref target="log_shutdown"/> and a new log SHOULD be
started. Certificates in the frozen log that have not yet expired and require
new SCTs SHOULD be submitted to the new log and the SCTs from that log used
instead.</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>The assignment policy criteria mentioned in this section refer to the policies
outlined in <xref target="RFC5226"></xref>.</t>

<section anchor="new-entry-to-the-tls-extensiontype-registry" title="New Entry to the TLS ExtensionType Registry">

<t>IANA is asked to add an entry for <spanx style="verb">transparency_info(TBD)</spanx> to the "TLS
ExtensionType Values" registry defined in <xref target="RFC8446"></xref>, setting the "Recommended"
value to "Y", setting the "TLS 1.3" value to "CH, CR, CT", and citing this
document as the "Reference".</t>

</section>
<section anchor="new-entry-to-the-tls-cachedinformationtype-registry" title="New Entry to the TLS CachedInformationType registry">

<t>IANA is asked to add an entry for <spanx style="verb">ct_compliant(TBD)</spanx> to the "TLS
CachedInformationType Values" registry defined in <xref target="RFC7924"></xref>, citing this
document as the "Reference".</t>

</section>
<section anchor="hash_algorithms" title="Hash Algorithms">

<t>IANA is asked to establish a registry of hash algorithm values, named
"CT Hash Algorithms", that initially consists of:</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Hash Algorithm</ttcol>
      <ttcol align='left'>OID</ttcol>
      <ttcol align='left'>Reference / Assignment Policy</ttcol>
      <c>0x00</c>
      <c>SHA-256</c>
      <c>2.16.840.1.101.3.4.2.1</c>
      <c><xref target="RFC6234"></xref></c>
      <c>0x01 - 0xDF</c>
      <c>Unassigned</c>
      <c>&#160;</c>
      <c>Specification Required and Expert Review</c>
      <c>0xE0 - 0xEF</c>
      <c>Reserved</c>
      <c>&#160;</c>
      <c>Experimental Use</c>
      <c>0xF0 - 0xFF</c>
      <c>Reserved</c>
      <c>&#160;</c>
      <c>Private Use</c>
</texttable>

<section anchor="expert-review-guidelines" title="Expert Review guidelines">

<t>The appointed Expert should ensure that the proposed algorithm has a public
specification and is suitable for use as a cryptographic hash algorithm with no
known preimage or collision attacks. These attacks can damage the integrity of
the log.</t>

</section>
</section>
<section anchor="signature_algorithms" title="Signature Algorithms">

<t>IANA is asked to establish a registry of signature algorithm values, named
"CT Signature Algorithms", that initially consists of:</t>

<texttable>
      <ttcol align='left'>SignatureScheme Value</ttcol>
      <ttcol align='left'>Signature Algorithm</ttcol>
      <ttcol align='left'>Reference / Assignment Policy</ttcol>
      <c>ecdsa_secp256r1_sha256(0x0403)</c>
      <c>ECDSA (NIST P-256) with SHA-256</c>
      <c><xref target="FIPS186-4"></xref></c>
      <c>ecdsa_secp256r1_sha256(0x0403)</c>
      <c>Deterministic ECDSA (NIST P-256) with HMAC-SHA256</c>
      <c><xref target="RFC6979"></xref></c>
      <c>ed25519(0x0807)</c>
      <c>Ed25519 (PureEdDSA with the edwards25519 curve)</c>
      <c><xref target="RFC8032"></xref></c>
      <c>private_use(0xFE00..0xFFFF)</c>
      <c>Reserved</c>
      <c>Private Use</c>
</texttable>

<section anchor="expert-review-guidelines-1" title="Expert Review guidelines">

<t>The appointed Expert should ensure that the proposed algorithm has a public
specification, has a value assigned to it in the TLS SignatureScheme Registry
(that IANA is asked to establish in <xref target="RFC8446"></xref>) and is suitable for use as a
cryptographic signature algorithm.</t>

</section>
</section>
<section anchor="versioned_trans_types" title="VersionedTransTypes">

<t>IANA is asked to establish a registry of <spanx style="verb">VersionedTransType</spanx> values, named
"CT VersionedTransTypes", that initially consists of:</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Type and Version</ttcol>
      <ttcol align='left'>Reference / Assignment Policy</ttcol>
      <c>0x0000</c>
      <c>Reserved</c>
      <c><xref target="RFC6962"></xref> (*)</c>
      <c>0x0001</c>
      <c>x509_entry_v2</c>
      <c>RFCXXXX</c>
      <c>0x0002</c>
      <c>precert_entry_v2</c>
      <c>RFCXXXX</c>
      <c>0x0003</c>
      <c>x509_sct_v2</c>
      <c>RFCXXXX</c>
      <c>0x0004</c>
      <c>precert_sct_v2</c>
      <c>RFCXXXX</c>
      <c>0x0005</c>
      <c>signed_tree_head_v2</c>
      <c>RFCXXXX</c>
      <c>0x0006</c>
      <c>consistency_proof_v2</c>
      <c>RFCXXXX</c>
      <c>0x0007</c>
      <c>inclusion_proof_v2</c>
      <c>RFCXXXX</c>
      <c>0x0008 - 0xDFFF</c>
      <c>Unassigned</c>
      <c>Specification Required and Expert Review</c>
      <c>0xE000 - 0xEFFF</c>
      <c>Reserved</c>
      <c>Experimental Use</c>
      <c>0xF000 - 0xFFFF</c>
      <c>Reserved</c>
      <c>Private Use</c>
</texttable>

<t>(*) The 0x0000 value is reserved so that v1 SCTs are distinguishable from v2
SCTs and other <spanx style="verb">TransItem</spanx> structures.</t>

<t>[RFC Editor: please update 'RFCXXXX' to refer to this document, once its RFC number is known.]</t>

<section anchor="expert-review-guidelines-2" title="Expert Review guidelines">

<t>The appointed Expert should review the public specification to ensure that it is
detailed enough to ensure implementation interoperability.</t>

</section>
</section>
<section anchor="log_artifact_extension_registry" title="Log Artifact Extension Registry">

<t>IANA is asked to establish a registry of <spanx style="verb">ExtensionType</spanx> values, named "CT Log
Artifact Extensions", that initially consists of:</t>

<texttable>
      <ttcol align='left'>ExtensionType</ttcol>
      <ttcol align='left'>Status</ttcol>
      <ttcol align='left'>Use</ttcol>
      <ttcol align='left'>Reference / Assignment Policy</ttcol>
      <c>0x0000 - 0xDFFF</c>
      <c>Unassigned</c>
      <c>n/a</c>
      <c>Specification Required and Expert Review</c>
      <c>0xE000 - 0xEFFF</c>
      <c>Reserved</c>
      <c>n/a</c>
      <c>Experimental Use</c>
      <c>0xF000 - 0xFFFF</c>
      <c>Reserved</c>
      <c>n/a</c>
      <c>Private Use</c>
</texttable>

<t>The "Use" column should contain one or both of the following values:</t>

<t><list style="symbols">
  <t>"SCT", for extensions specified for use in Signed Certificate Timestamps.</t>
  <t>"STH", for extensions specified for use in Signed Tree Heads.</t>
</list></t>

<section anchor="expert-review-guidelines-3" title="Expert Review guidelines">

<t>The appointed Expert should review the public specification to ensure that it is
detailed enough to ensure implementation interoperability. The Expert should
also verify that the extension is appropriate to the contexts in which it is
specified to be used (SCT, STH, or both).</t>

</section>
</section>
<section anchor="object-identifiers" title="Object Identifiers">

<t>This document uses object identifiers (OIDs) to identify Log IDs (see
<xref target="log_id"/>), the precertificate CMS <spanx style="verb">eContentType</spanx> (see <xref target="precertificates"/>),
and X.509v3 extensions in certificates (see <xref target="cert_transinfo_extension"/>) and
OCSP responses (see <xref target="ocsp_transinfo_extension"/>). The OIDs are defined in an
arc that was selected due to its short encoding.</t>

<section anchor="log_id_registry" title="Log ID Registry">

<t>IANA is asked to establish a registry of Log IDs, named "CT Log ID Registry",
that initially consists of:</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Log</ttcol>
      <ttcol align='left'>Reference / Assignment Policy</ttcol>
      <c>1.3.101.8192 - 1.3.101.16383</c>
      <c>Unassigned</c>
      <c>Parameters Required and First Come First Served</c>
      <c>1.3.101.80.0 - 1.3.101.80.*</c>
      <c>Unassigned</c>
      <c>Parameters Required and First Come First Served</c>
</texttable>

<t>All OIDs in the range from 1.3.101.8192 to 1.3.101.16383 have been reserved.
This is a limited resource of 8,192 OIDs, each of which has an encoded length of
4 octets.</t>

<t>The 1.3.101.80 arc has been delegated. This is an unlimited resource, but only
the 128 OIDs from 1.3.101.80.0 to 1.3.101.80.127 have an encoded length of only
4 octets.</t>

<t>Each application for the allocation of a Log ID should be accompanied by all of
the required parameters (except for the Log ID) listed in <xref target="log_parameters"/>.</t>

</section>
</section>
</section>
<section anchor="security-considerations" title="Security Considerations">

<t>With CAs, logs, and servers performing the actions described here, TLS clients
can use logs and signed timestamps to reduce the likelihood that they will
accept misissued certificates. If a server presents a valid signed timestamp for
a certificate, then the client knows that a log has committed to publishing the
certificate. From this, the client knows that monitors acting for the subject of
the certificate have had some time to notice the misissuance and take some
action, such as asking a CA to revoke a misissued certificate. A signed
timestamp does not guarantee this though, since appropriate monitors might not
have checked the logs or the CA might have refused to revoke the certificate.</t>

<t>In addition, if TLS clients will not accept unlogged certificates, then site
owners will have a greater incentive to submit certificates to logs, possibly
with the assistance of their CA, increasing the overall transparency of the
system.</t>

<t><xref target="I-D.ietf-trans-threat-analysis"></xref> provides a more detailed threat analysis of the
Certificate Transparency architecture.</t>

<section anchor="misissued-certificates" title="Misissued Certificates">

<t>Misissued certificates that have not been publicly logged, and thus do not have
a valid SCT, are not considered compliant. Misissued certificates that do have
an SCT from a log will appear in that public log within the Maximum Merge Delay,
assuming the log is operating correctly. Since a log is allowed to serve an STH
of any age up to the MMD, the maximum period of time during which a misissued
certificate can be used without being available for audit is twice the MMD.</t>

</section>
<section anchor="detection-of-misissue" title="Detection of Misissue">

<t>The logs do not themselves detect misissued certificates; they rely instead on
interested parties, such as domain owners, to monitor them and take corrective
action when a misissue is detected.</t>

</section>
<section anchor="misbehaving_logs" title="Misbehaving Logs">

<t>A log can misbehave in several ways. Examples include: failing to incorporate a
certificate with an SCT in the Merkle Tree within the MMD; presenting different,
conflicting views of the Merkle Tree at different times and/or to different
parties; issuing STHs too frequently; mutating the signature of a logged
certificate; and failing to present a chain containing the certifier of a logged
certificate. Such misbehavior is detectable and <xref target="I-D.ietf-trans-threat-analysis"></xref>
provides more details on how this can be done.</t>

<t>Violation of the MMD contract is detected by log clients requesting a Merkle
inclusion proof (<xref target="get-proof-by-hash"/>) for each observed SCT. These checks can
be asynchronous and need only be done once per certificate. However, note that
there may be privacy concerns (see <xref target="fetching_inclusion_proofs"/>).</t>

<t>Violation of the append-only property or the STH issuance rate limit can be
detected by clients comparing their instances of the Signed Tree Heads. There
are various ways this could be done, for example via gossip (see
<xref target="I-D.ietf-trans-gossip"></xref>) or peer-to-peer communications or by sending STHs to
monitors (who could then directly check against their own copy of the relevant
log). Proof of misbehavior in such cases would be: a series of STHs that were
issued too closely together, proving violation of the STH issuance rate limit;
or an STH with a root hash that does not match the one calculated from a copy of
the log, proving violation of the append-only property.</t>

</section>
<section anchor="prevent_tracking_clients" title="Preventing Tracking Clients">

<t>Clients that gossip STHs or report back SCTs can be tracked or traced if a log
produces multiple STHs or SCTs with the same timestamp and data but different
signatures. Logs SHOULD mitigate this risk by either:</t>

<t><list style="symbols">
  <t>Using deterministic signature schemes, or</t>
  <t>Producing no more than one SCT for each distinct submission and no more than one
STH for each distinct tree_size. Each of these SCTs and STHs can be stored by
the log and served to other clients that submit the same certificate or request
the same STH.</t>
</list></t>

</section>
<section anchor="requiring_multiple_scts" title="Multiple SCTs">

<t>By requiring TLS servers to offer multiple SCTs, each from a different log, TLS
clients reduce the effectiveness of an attack where a CA and a log collude
(see <xref target="multiple-scts"/>).</t>

</section>
</section>
<section anchor="acknowledgements" title="Acknowledgements">

<t>The authors would like to thank Erwann Abelea, Robin Alden, Andrew Ayer, Richard
Barnes, Al Cutter, David Drysdale, Francis Dupont, Adam Eijdenberg, Stephen
Farrell, Daniel Kahn Gillmor, Paul Hadfield, Brad Hill, Jeff Hodges, Paul
Hoffman, Jeffrey Hutzelman, Kat Joyce, Stephen Kent, SM, Alexey Melnikov, Linus
Nordberg, Chris Palmer, Trevor Perrin, Pierre Phaneuf, Eric Rescorla, Melinda
Shore, Ryan Sleevi, Martin Smith, Carl Wallace and Paul Wouters for their
valuable contributions.</t>

<t>A big thank you to Symantec for kindly donating the OIDs from the 1.3.101 arc
that are used in this document.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<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="RFC4648" target='https://www.rfc-editor.org/info/rfc4648'>
<front>
<title>The Base16, Base32, and Base64 Data Encodings</title>
<author initials='S.' surname='Josefsson' fullname='S. Josefsson'><organization /></author>
<date year='2006' month='October' />
<abstract><t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4648'/>
<seriesInfo name='DOI' value='10.17487/RFC4648'/>
</reference>



<reference  anchor="RFC5280" target='https://www.rfc-editor.org/info/rfc5280'>
<front>
<title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
<author initials='D.' surname='Cooper' fullname='D. Cooper'><organization /></author>
<author initials='S.' surname='Santesson' fullname='S. Santesson'><organization /></author>
<author initials='S.' surname='Farrell' fullname='S. Farrell'><organization /></author>
<author initials='S.' surname='Boeyen' fullname='S. Boeyen'><organization /></author>
<author initials='R.' surname='Housley' fullname='R. Housley'><organization /></author>
<author initials='W.' surname='Polk' fullname='W. Polk'><organization /></author>
<date year='2008' month='May' />
<abstract><t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet.  An overview of this approach and model is provided as an introduction.  The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms.  Standard certificate extensions are described and two Internet-specific extensions are defined.  A set of required certificate extensions is specified.  The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions.  An algorithm for X.509 certification path validation is described.  An ASN.1 module and examples are provided in the appendices.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='5280'/>
<seriesInfo name='DOI' value='10.17487/RFC5280'/>
</reference>



<reference  anchor="RFC5652" target='https://www.rfc-editor.org/info/rfc5652'>
<front>
<title>Cryptographic Message Syntax (CMS)</title>
<author initials='R.' surname='Housley' fullname='R. Housley'><organization /></author>
<date year='2009' month='September' />
<abstract><t>This document describes the Cryptographic Message Syntax (CMS).  This syntax is used to digitally sign, digest, authenticate, or encrypt arbitrary message content.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='70'/>
<seriesInfo name='RFC' value='5652'/>
<seriesInfo name='DOI' value='10.17487/RFC5652'/>
</reference>



<reference  anchor="RFC6066" target='https://www.rfc-editor.org/info/rfc6066'>
<front>
<title>Transport Layer Security (TLS) Extensions: Extension Definitions</title>
<author initials='D.' surname='Eastlake 3rd' fullname='D. Eastlake 3rd'><organization /></author>
<date year='2011' month='January' />
<abstract><t>This document provides specifications for existing TLS extensions.  It is a companion document for RFC 5246, &quot;The Transport Layer Security (TLS) Protocol Version 1.2&quot;.  The extensions specified are server_name, max_fragment_length, client_certificate_url, trusted_ca_keys, truncated_hmac, and status_request.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6066'/>
<seriesInfo name='DOI' value='10.17487/RFC6066'/>
</reference>



<reference  anchor="RFC6960" target='https://www.rfc-editor.org/info/rfc6960'>
<front>
<title>X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP</title>
<author initials='S.' surname='Santesson' fullname='S. Santesson'><organization /></author>
<author initials='M.' surname='Myers' fullname='M. Myers'><organization /></author>
<author initials='R.' surname='Ankney' fullname='R. Ankney'><organization /></author>
<author initials='A.' surname='Malpani' fullname='A. Malpani'><organization /></author>
<author initials='S.' surname='Galperin' fullname='S. Galperin'><organization /></author>
<author initials='C.' surname='Adams' fullname='C. Adams'><organization /></author>
<date year='2013' month='June' />
<abstract><t>This document specifies a protocol useful in determining the current status of a digital certificate without requiring Certificate Revocation Lists (CRLs). Additional mechanisms addressing PKIX operational requirements are specified in separate documents.  This document obsoletes RFCs 2560 and 6277.  It also updates RFC 5912.</t></abstract>
</front>
<seriesInfo name='RFC' value='6960'/>
<seriesInfo name='DOI' value='10.17487/RFC6960'/>
</reference>



<reference  anchor="RFC6961" target='https://www.rfc-editor.org/info/rfc6961'>
<front>
<title>The Transport Layer Security (TLS) Multiple Certificate Status Request Extension</title>
<author initials='Y.' surname='Pettersen' fullname='Y. Pettersen'><organization /></author>
<date year='2013' month='June' />
<abstract><t>This document defines the Transport Layer Security (TLS) Certificate Status Version 2 Extension to allow clients to specify and support several certificate status methods.  (The use of the Certificate Status extension is commonly referred to as &quot;OCSP stapling&quot;.)  Also defined is a new method based on the Online Certificate Status Protocol (OCSP) that servers can use to provide status information about not only the server's own certificate but also the status of intermediate certificates in the chain.</t></abstract>
</front>
<seriesInfo name='RFC' value='6961'/>
<seriesInfo name='DOI' value='10.17487/RFC6961'/>
</reference>



<reference  anchor="RFC7159" target='https://www.rfc-editor.org/info/rfc7159'>
<front>
<title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
<author initials='T.' surname='Bray' fullname='T. Bray' role='editor'><organization /></author>
<date year='2014' month='March' />
<abstract><t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format.  It was derived from the ECMAScript Programming Language Standard.  JSON defines a small set of formatting rules for the portable representation of structured data.</t><t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t></abstract>
</front>
<seriesInfo name='RFC' value='7159'/>
<seriesInfo name='DOI' value='10.17487/RFC7159'/>
</reference>



<reference  anchor="RFC7231" target='https://www.rfc-editor.org/info/rfc7231'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.</t></abstract>
</front>
<seriesInfo name='RFC' value='7231'/>
<seriesInfo name='DOI' value='10.17487/RFC7231'/>
</reference>



<reference  anchor="RFC7633" target='https://www.rfc-editor.org/info/rfc7633'>
<front>
<title>X.509v3 Transport Layer Security (TLS) Feature Extension</title>
<author initials='P.' surname='Hallam-Baker' fullname='P. Hallam-Baker'><organization /></author>
<date year='2015' month='October' />
<abstract><t>The purpose of the TLS feature extension is to prevent downgrade attacks that are not otherwise prevented by the TLS protocol.  In particular, the TLS feature extension may be used to mandate support for revocation checking features in the TLS protocol such as Online Certificate Status Protocol (OCSP) stapling.  Informing clients that an OCSP status response will always be stapled permits an immediate failure in the case that the response is not stapled.  This in turn prevents a denial-of-service attack that might otherwise be possible.</t></abstract>
</front>
<seriesInfo name='RFC' value='7633'/>
<seriesInfo name='DOI' value='10.17487/RFC7633'/>
</reference>



<reference  anchor="RFC7807" target='https://www.rfc-editor.org/info/rfc7807'>
<front>
<title>Problem Details for HTTP APIs</title>
<author initials='M.' surname='Nottingham' fullname='M. Nottingham'><organization /></author>
<author initials='E.' surname='Wilde' fullname='E. Wilde'><organization /></author>
<date year='2016' month='March' />
<abstract><t>This document defines a &quot;problem detail&quot; as a way to carry machine- readable details of errors in a HTTP response to avoid the need to define new error response formats for HTTP APIs.</t></abstract>
</front>
<seriesInfo name='RFC' value='7807'/>
<seriesInfo name='DOI' value='10.17487/RFC7807'/>
</reference>



<reference  anchor="RFC7924" target='https://www.rfc-editor.org/info/rfc7924'>
<front>
<title>Transport Layer Security (TLS) Cached Information Extension</title>
<author initials='S.' surname='Santesson' fullname='S. Santesson'><organization /></author>
<author initials='H.' surname='Tschofenig' fullname='H. Tschofenig'><organization /></author>
<date year='2016' month='July' />
<abstract><t>Transport Layer Security (TLS) handshakes often include fairly static information, such as the server certificate and a list of trusted certification authorities (CAs).  This information can be of considerable size, particularly if the server certificate is bundled with a complete certificate chain (i.e., the certificates of intermediate CAs up to the root CA).</t><t>This document defines an extension that allows a TLS client to inform a server of cached information, thereby enabling the server to omit already available information.</t></abstract>
</front>
<seriesInfo name='RFC' value='7924'/>
<seriesInfo name='DOI' value='10.17487/RFC7924'/>
</reference>



<reference  anchor="RFC8032" target='https://www.rfc-editor.org/info/rfc8032'>
<front>
<title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
<author initials='S.' surname='Josefsson' fullname='S. Josefsson'><organization /></author>
<author initials='I.' surname='Liusvaara' fullname='I. Liusvaara'><organization /></author>
<date year='2017' month='January' />
<abstract><t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA).  The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves.  An example implementation and test vectors are provided.</t></abstract>
</front>
<seriesInfo name='RFC' value='8032'/>
<seriesInfo name='DOI' value='10.17487/RFC8032'/>
</reference>



<reference  anchor="RFC8446" target='https://www.rfc-editor.org/info/rfc8446'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<date year='2018' month='August' />
<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="HTML401" target="http://www.w3.org/TR/1999/REC-html401-19991224">
  <front>
    <title>HTML 4.01 Specification</title>
    <author initials="D." surname="Raggett" fullname="David Raggett">
      <organization></organization>
    </author>
    <author initials="A." surname="Le Hors" fullname="Arnaud Le Hors">
      <organization></organization>
    </author>
    <author initials="I." surname="Jacobs" fullname="Ian Jacobs">
      <organization></organization>
    </author>
    <date year="1999" month="December" day="24"/>
  </front>
  <seriesInfo name="World Wide Web Consortium Recommendation" value="REC-html401-19991224"/>
</reference>
<reference anchor="FIPS186-4" target="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf">
  <front>
    <title>FIPS PUB 186-4</title>
    <author >
      <organization>NIST</organization>
    </author>
    <date year="2013" month="July" day="01"/>
  </front>
</reference>
<reference anchor="UNIXTIME" target="http://pubs.opengroup.org/onlinepubs/9699919799.2016edition/basedefs/V1_chap04.html#tag_04_16">
  <front>
    <title>The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008, 2016 Edition</title>
    <author >
      <organization>IEEE</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

    <references title='Informative References'>





<reference  anchor="RFC6234" target='https://www.rfc-editor.org/info/rfc6234'>
<front>
<title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
<author initials='D.' surname='Eastlake 3rd' fullname='D. Eastlake 3rd'><organization /></author>
<author initials='T.' surname='Hansen' fullname='T. Hansen'><organization /></author>
<date year='2011' month='May' />
<abstract><t>Federal Information Processing Standard, FIPS</t></abstract>
</front>
<seriesInfo name='RFC' value='6234'/>
<seriesInfo name='DOI' value='10.17487/RFC6234'/>
</reference>



<reference  anchor="RFC5226" target='https://www.rfc-editor.org/info/rfc5226'>
<front>
<title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
<author initials='T.' surname='Narten' fullname='T. Narten'><organization /></author>
<author initials='H.' surname='Alvestrand' fullname='H. Alvestrand'><organization /></author>
<date year='2008' month='May' />
<abstract><t>Many protocols make use of identifiers consisting of constants and other well-known values.  Even after a protocol has been defined and deployment has begun, new values may need to be assigned (e.g., for a new option type in DHCP, or a new encryption or authentication transform for IPsec).  To ensure that such quantities have consistent values and interpretations across all implementations, their assignment must be administered by a central authority.  For IETF protocols, that role is provided by the Internet Assigned Numbers Authority (IANA).</t><t>In order for IANA to manage a given namespace prudently, it needs guidelines describing the conditions under which new values can be assigned or when modifications to existing values can be made.  If IANA is expected to play a role in the management of a namespace, IANA must be given clear and concise instructions describing that role.  This document discusses issues that should be considered in formulating a policy for assigning values to a namespace and provides guidelines for authors on the specific text that must be included in documents that place demands on IANA.</t><t>This document obsoletes RFC 2434.  This document specifies an Internet Best  Current Practices for the Internet Community, and requests discussion and  suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='RFC' value='5226'/>
<seriesInfo name='DOI' value='10.17487/RFC5226'/>
</reference>



<reference  anchor="RFC6962" target='https://www.rfc-editor.org/info/rfc6962'>
<front>
<title>Certificate Transparency</title>
<author initials='B.' surname='Laurie' fullname='B. Laurie'><organization /></author>
<author initials='A.' surname='Langley' fullname='A. Langley'><organization /></author>
<author initials='E.' surname='Kasper' fullname='E. Kasper'><organization /></author>
<date year='2013' month='June' />
<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="RFC6979" target='https://www.rfc-editor.org/info/rfc6979'>
<front>
<title>Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA)</title>
<author initials='T.' surname='Pornin' fullname='T. Pornin'><organization /></author>
<date year='2013' month='August' />
<abstract><t>This document defines a deterministic digital signature generation procedure.  Such signatures are compatible with standard Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA) digital signatures and can be processed with unmodified verifiers, which need not be aware of the procedure described therein.  Deterministic signatures retain the cryptographic security features associated with digital signatures but can be more easily implemented in various environments, since they do not need access to a source of high-quality randomness.</t></abstract>
</front>
<seriesInfo name='RFC' value='6979'/>
<seriesInfo name='DOI' value='10.17487/RFC6979'/>
</reference>



<reference  anchor="RFC7320" target='https://www.rfc-editor.org/info/rfc7320'>
<front>
<title>URI Design and Ownership</title>
<author initials='M.' surname='Nottingham' fullname='M. Nottingham'><organization /></author>
<date year='2014' month='July' />
<abstract><t>Section 1.1.1 of RFC 3986 defines URI syntax as &quot;a federated and extensible naming system wherein each scheme's specification may further restrict the syntax and semantics of identifiers using that scheme.&quot;  In other words, the structure of a URI is defined by its scheme.  While it is common for schemes to further delegate their substructure to the URI's owner, publishing independent standards that mandate particular forms of URI substructure is inappropriate, because that essentially usurps ownership.  This document further describes this problematic practice and provides some acceptable alternatives for use in standards.</t></abstract>
</front>
<seriesInfo name='BCP' value='190'/>
<seriesInfo name='RFC' value='7320'/>
<seriesInfo name='DOI' value='10.17487/RFC7320'/>
</reference>



<reference anchor="I-D.ietf-trans-gossip">
<front>
<title>Gossiping in CT</title>

<author initials='L' surname='Nordberg' fullname='Linus Nordberg'>
    <organization />
</author>

<author initials='D' surname='Gillmor' fullname='Daniel Gillmor'>
    <organization />
</author>

<author initials='T' surname='Ritter' fullname='Tom Ritter'>
    <organization />
</author>

<date month='January' day='14' year='2018' />

<abstract><t>The logs in Certificate Transparency are untrusted in the sense that the users of the system don't have to trust that they behave correctly since the behavior of a log can be verified to be correct.  This document tries to solve the problem with logs presenting a "split view" of their operations or failing to incorporate a submission within MMD.  It describes three gossiping mechanisms for Certificate Transparency: SCT Feedback, STH Pollination and Trusted Auditor Relationship.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-trans-gossip-05' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-trans-gossip-05.txt' />
</reference>


<reference anchor="CrosbyWallach" target="http://static.usenix.org/event/sec09/tech/full_papers/crosby.pdf">
  <front>
    <title>Efficient Data Structures for Tamper-Evident Logging</title>
    <author initials="S." surname="Crosby" fullname="Scott A. Crosby">
      <organization></organization>
    </author>
    <author initials="D." surname="Wallach" fullname="Dan S. Wallach">
      <organization></organization>
    </author>
    <date year="2009" month="August"/>
  </front>
  <seriesInfo name="Proceedings of the 18th USENIX Security Symposium," value="Montreal"/>
</reference>
<reference anchor="Chromium.Policy" target="http://www.chromium.org/Home/chromium-security/certificate-transparency">
  <front>
    <title>Chromium Certificate Transparency</title>
    <author >
      <organization>The Chromium Projects</organization>
    </author>
    <date year="2014"/>
  </front>
</reference>
<reference anchor="JSON.Metadata" target="https://www.gstatic.com/ct/log_list/log_list_schema.json">
  <front>
    <title>Chromium Log Metadata JSON Schema</title>
    <author >
      <organization>The Chromium Projects</organization>
    </author>
    <date year="2014"/>
  </front>
</reference>
<reference anchor="Chromium.Log.Policy" target="http://www.chromium.org/Home/chromium-security/certificate-transparency/log-policy">
  <front>
    <title>Chromium Certificate Transparency Log Policy</title>
    <author >
      <organization>The Chromium Projects</organization>
    </author>
    <date year="2014"/>
  </front>
</reference>




<reference anchor="I-D.ietf-trans-threat-analysis">
<front>
<title>Attack and Threat Model for Certificate Transparency</title>

<author initials='S' surname='Kent' fullname='Stephen Kent'>
    <organization />
</author>

<date month='October' day='5' year='2018' />

<abstract><t>This document defines an attack model and discusses threats based on the system design presented in [I-D.ietf-trans-rfc6962-bis].  It analyzes potential vulnerabilities associated with that design, and considers compromises of system elements and malicious behavior by such elements.  It does not consider implementation vulnerabilities, including ones that might enable denial of service attacks against these elements.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-trans-threat-analysis-16' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-trans-threat-analysis-16.txt' />
</reference>




    </references>


<section anchor="v1_coexistence" title="Supporting v1 and v2 simultaneously">

<t>Certificate Transparency logs have to be either v1 (conforming to <xref target="RFC6962"></xref>) or
v2 (conforming to this document), as the data structures are incompatible and so
a v2 log could not issue a valid v1 SCT.</t>

<t>CT clients, however, can support v1 and v2 SCTs, for the same certificate,
simultaneously, as v1 SCTs are delivered in different TLS, X.509 and OCSP
extensions than v2 SCTs.</t>

<t>v1 and v2 SCTs for X.509 certificates can be validated independently. For
precertificates, v2 SCTs should be embedded in the TBSCertificate before
submission of the TBSCertificate (inside a v1 precertificate, as described in
Section 3.1. of <xref target="RFC6962"></xref>) to a v1 log so that TLS clients conforming to
<xref target="RFC6962"></xref> but not this document are oblivious to the embedded v2 SCTs. An issuer
can follow these steps to produce an X.509 certificate with embedded v1 and v2
SCTs:</t>

<t><list style="symbols">
  <t>Create a CMS precertificate as described in <xref target="precertificates"/> and submit it
to v2 logs.</t>
  <t>Embed the obtained v2 SCTs in the TBSCertificate, as described in
<xref target="cert_transinfo_extension"/>.</t>
  <t>Use that TBSCertificate to create a v1 precertificate, as described in
Section 3.1. of <xref target="RFC6962"></xref> and submit it to v1 logs.</t>
  <t>Embed the v1 SCTs in the TBSCertificate, as described in Section 3.3 of
<xref target="RFC6962"></xref>.</t>
  <t>Sign that TBSCertificate (which now contains v1 and v2 SCTs) to issue the
final X.509 certificate.</t>
</list></t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAOpzVsAA+29aXfbVrY2+B2/4ix5rQ5VRdKiZDu2nKRfRZbLqvLUlpzU
7cQtgiQoIiIBXgCUzHL8/vbe4xkAUIMzVN1erVs3lkjgzGfP+9m9Xi+q0mqe
7Jutw6So0mk6jqvEnBZxVi7jIsnGa/NDUpRpnpnd/s5WNMnHWbyA5ydFPK16
aVJNexU+3Sum40dPHu32RmnZ230S5aMynydVUu4b/DjCds/zYr1vko/LKEqX
BfRZFauy2t3ZebKzuxVBd/G+OUnGqyKt1tHV+b45fXfw+sR03q5G83RsXudV
XKyDwW1HUVnF2eQsnucZjGqdlFG5iIvq7L9XOXWeT6fRMt03P1X5uGvKvKiK
ZFrCb+sF/vIhiuJVNcuL/cj0IgM/PL3vk8y8jGEkCX2YFzCav+X5+Twx7/9h
XlaTPn0ej0ZFcqlf0UfJIk7n+2aUZPP/dU4f98f5Imz9YBIvoPkMvlw32j/O
xjc1Hp9vbvtokc7T2PwjLpdJ0Wj85Cqt/pUUc1gz87fF6MUNHSUX1MzmzmAv
zKukLJMi/cKFSqCJxcYO3uUjcwIHbDJPs3PXw2G+yCe5OTxo9mC/8jsp8tH/
GtMX45g6ibK8WMRVepnAxpt3zw93B4Mn8uuDRw8ey68Pdx/v6K+PHu7Kr492
Hj3SX5882nG/DuTXrwcPtbGvd/fsp4/29vTXxztf669Pdh/Ir4939rSLxw8e
UBcvTl+9fLBDLRgDx/88qfbNrKqW+/fvX11d9a/2+rAg90/f3R88efLk/ruj
w96sWszhlR5+MNjdfcCv8i3H5syD/s7AnCyTMV93uNu8gHoP6Kcn/xqTZnCN
nvXNu/gceq/s57xBz+LLdFL7rvbuQd+8TMyLvChr7x4UWbya1L6svXzcN3+P
x0BNau8ew8HzvpgAedk3OOXeYLcnk8ZTmZRpNs11Vls/5sV8Yn5MJ4n5MRnB
YcmQJKSrhXmXwLlYJNmEVmQLjl77Wj4/fnsyePyo96B1T7LL+XI1KvtZWlb9
8/zyPv6Cn9zH9+6/Pj457eNvfWqiv5xM/e3Bb8zb998b+rZlV+jwYyPepHd3
Bnu9na97OwP48P3r43+eHr86ah0cjSxfJtl5ka+WdHDyDC5WQgN88ggn+eTr
J0/60OSjZJLiQtwfxWUyAUp5/4fB2XgWL3ce9HFV7lXx+dnOg7PBI38Cp7PE
vIEOzN+wB/M9vBuetNIcl+UqMV+b46OjI7jaEzPY2dnrD3rABh53cTKPzBF3
vWn++CZwENjW8Ao/2t17YO/trndD7b2Fyemt29ule3vce9b3mNh5XpbpEr84
LPJytP4xns/j8ax1NYHxVOm4vyqTLP1Ii5lcJll1v0zGO0/uV8l4dn+6ms/P
ljFQ0PL+mBqs7/jRFFYmhdfgIlUxkrrVuFoVSWlgduY0XsC7vSO4YvjIy/z8
XMngtbf1pC/jr12ak3FeVXgfg2+bV12m3bjqGbbsf6kncOdJb+fxpjv3tsjH
CRyn7LwEdmwqOCODx9XMvD85gtNqOb45WS+WeQl3sQu371WeAaeO57gVsyJf
wMf9tzmIAeuNtHCsz+FevMgXyX39pFdKH/fHTsrhLRdBwt8T7c9sEok2HUw8
/fZlmPUvybgqw5uKl/rvJ29e918lVQyfxs3ZlDKdczlgQJbuj6v78/z8bA7E
xP5yVo5nwN76v5RyVerDh+NitBvqFPYf3/iNw7fbAe3/kVuCE+0tqf077Q7N
+61778tnWiMO1QwOZNWLs3i+LtNyP4p6vR7IHSV8Pa6i6HSWlgYkjNUCL+sk
KcdFOoKbfOkEaD3/G8feOTzdjpZFDtJqPicasCThd742c7799H7yEQ4AvJBg
g9wAsDEQKddJ4S5U5/TlyXYENxJGYLxlLk1cYjNrA72aFAnyBBbGADPFZydd
IAQmNos4y+DFahZXBu58flVGcbYGOdtUOawqEGmvUZwgrzT1fHiwbWBR0kv8
C4XNLIeznNDgscOYxx6VK5Avx1VjdFfJfE6j1J7wRe8hXA2aw6JM5pdJ2cc9
BZ5Q4dKnJQ+a6PEKhr424zkSWWg3XwH/B8kfyDY2PstBEAx7p1dBgoQRR/Fy
mcQFLwf02DXJdJrgtBJoE3ZnjBtyeMDjnExwmXQ9wzZzHGuEg+5H0UscOy59
llRXeXGBRPMSVkf6ThfLeUJnCCdtDwMw7kJ4KJ6LcjVaQFf4d4QL/N8roryy
XdA4MG1g7RMcfOWfzD6f20U6mYAkHt0DhaMq8gnwHeS50cajGacLmsgCmPM5
fiujG8Fg8RjCaFqmHo3W+BBwMFwqXM9s0gOpY807CO+1vES7yQ/wRng7DbeD
9lX7w5PUNaNVxSc6yUpgn7KQcByAlVbQOkyiwtXp0C/j1TwuYAhwXMskQu5G
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
BTo/XvF2tnuNfvT5p3zWjdq453VVERvMs8Vc1eBNZAc1bLZ9eguOdWv24rE3
6wJt4UE3m0BCFsQjlUuCRkZi2xxtZcheLFcmZZjHwPbZDAAWy/3nfoO7BWgp
XhVovXohsbmbUNNyJdjmwcOEM7JjPWnh/RAqKg/aiBD12NUqL9i9snGEXASk
JvozWqJ3CeVO+L2MEguZ2aJNRO3aRFdA8CzyEue8kXcpqyngyITRL+PGIazL
00FcqqwfKE7MWhiwVzXv+apASo9L0m3pDuMXxrM850hiaSPQbjrltg4hoiG4
7mkHXc6KX7qAuOYdPXdRq/ysipGvG4B4zkgCVXvAZDRJsLSco2t38cXXlBMq
giOqCZoavSJx5OTDc+Ky1uJRTqpgrb6PwKH5lsnhZq/Ma7i6L+oS8F2Fav1G
IbfdN9q8sUjJrYStmt0gN9cMrQ2TghMFbI+O+7t6cJ7/r0l/iMYIjmMgZd8s
IkftIrK5i4gc3SAimzuJyJFX6MjOzo3Shi3a+NTg9HoHClvyYK5TV8RjY7k7
vKrBjl5HbE9f/P/E9j+Q2DopzFGmzglWDQTJq8JyXG8pChh1JgRDVTe8DBqv
BZEmHxiVwSV9EiZGE0fwGE9A441jKh3cNyFapTjIS2umIUmtoqPkBSaxQW9z
xhU8LZoaxvLm84lXXVivwatnXhAaX2IKjg4z3wiFAa4fpiFephOUYjS7oDPS
6GkORcmSK4rFtvlHMJViva2RIjbGQFeAeqNjPy0UpplHicgjHpMRLrSZ2WAA
NAfiM0I9F46iKGbGRLCLTkY9HOQqE4cyPkxqtBfw7OiFX66OP6T4HFWMgpiW
1kBaGP2qEPc6BuNzfHm4c1GpaS50xxsoxFLahZOeLF2XhCaM4b6FgtAWWi0m
tahdKaix2d9DEQibNHYwXyDjX8s1/0C5/jQMRaIiYHYeLi2WDYwlOWBQEmNX
DG7xIi8r/Qik8chLzPNqG7Ft1QMLdY9pF3RzpCFbOdw95jKDGRx+tZxwTqk/
XMk5F+stk5rN1MyE1OwmsZU1ZdcZuxT+DIGzWTyCYvox2IVi9Dc+x8CD6CFQ
0CREJ2F6Z++sUpNb3LpWlN5N167ddf67auAqNZ0Nrvlut0XErUOQsp06uJeb
PP9/nsbtZmdlOS2mTJFLzAZFivPm2/o08APv6SYEa03q84k2Y2uTz0+Ouo/K
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

-->

</rfc>

