<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mcmillion-tls-transparency-revocation-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title>Reliable Transparency and Revocation Mechanisms</title>
    <seriesInfo name="Internet-Draft" value="draft-mcmillion-tls-transparency-revocation-00"/>
    <author fullname="Brendan McMillion">
      <organization/>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <author initials="D." surname="O'Brien" fullname="Devon O'Brien">
      <organization>Google LLC</organization>
      <address>
        <email>asymmetric@google.com</email>
      </address>
    </author>
    <author fullname="Dennis Jackson">
      <organization>Mozilla</organization>
      <address>
        <email>ietf@dennis-jackson.uk</email>
      </address>
    </author>
    <date year="2025" month="June" day="29"/>
    <area>SEC</area>
    <workgroup>TLS Working Group</workgroup>
    <abstract>
      <?line 84?>

<t>This document describes reliable mechanisms for the publication and revocation
of Transport Layer Security (TLS) certificates.  This reliability takes several
forms. First, it provides browsers a strong guarantee that all certificates they
accept are truly published and unrevoked at the time they're accepted. Second,
it allows operators to monitor for mis-issuances related to their
websites in a highly efficient way without relying on third-party services.
Third, it provides a high degree of operational redundancy to minimize the risk
of cascading outages.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://Bren2010.github.io/draft-transparency-revocation/draft-mcmillion-tls-transparency-revocation.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-mcmillion-tls-transparency-revocation/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/Bren2010/draft-transparency-revocation"/>.</t>
    </note>
  </front>
  <middle>
    <?line 95?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Certificate Transparency (CT) ecosystem created by <xref target="RFC6962"/> has been
immensely valuable to security on the internet. However, shortcomings in the
design have become apparent over time:</t>
      <t>The security that CT provides to verifiers is based on an assumption of
non-collusion between multiple parties. Historically, this assumption has been
challenging to maintain, as it degrades quickly without active management. The
compromise of a single Transparency Log or the unexpected acquisition of a
single business is often sufficient to allow the possibility of undetectable
mis-issued certificates. This is compounded by the fact that multiple parties in
the CT ecosystem play multiple roles (such as Certificate Authorities that are
also Transparency Log operators), which makes
reasoning about the possibility of collusion even more tricky.</t>
      <t>It is also becoming far too expensive to both operate a CT log and to monitor
CT logs. Logs are required to serve their entire contents to anyone on the
internet, which consumes a significant amount of outbound bandwidth. Similarly,
monitoring certificate issuance in CT requires downloading the entire contents
of all logs, which is several terabytes of data at minimum. The total bandwidth
costs of the CT ecosystem scale linearly in the number of certificates issued,
the number of logs active, and the number of interested monitors.</t>
      <t>One of the primary motivations for publishing TLS certificates is to allow site
operators to identify and revoke those certificates which are mis-issued.
However, revocation systems have historically been plagued by a requirement to
"fail open". That is, revocation checks would stop being enforced in certain
(often, easily engineered) scenarios. For example, clients using OCSP must
typically fail open in the event the OCSP server is unreachable. Alternatives
like OCSP Must-Staple <xref target="RFC7633"/> were designed to close this loophole, but
have been stymied by lack of support in popular web servers.</t>
      <t>More recent alternatives like CRLSets <xref target="CRLSets"/>, CRLite <xref target="CRLite"/>, and
Clubcards <xref target="Clubcards"/> provide fail-closed revocation checks to clients, but
are unstandardized, rely on trusting the server operator (who is typically a
client software vendor, rather than a CA) and offer limited transparency properties.</t>
      <t>This motivates a need for a new system of publishing certificates that's
resistant to collusion and dramatically more efficient to operate, and a need
for a new system of revoking certificates that can be consistently enforced.</t>
      <t>Since the initial deployment of Certificate Transparency in 2013, there has been
a considerable body of research published on transparency systems. In recent
years, Key Transparency systems have been deployed by Apple <xref target="AppleKT"/>, Meta
<xref target="MetaKT"/>, and ProtonMail <xref target="ProtonKT"/>. These systems not only provide stronger
security properties, but also support transparent revocation, and also scale with
less bandwidth costs.</t>
      <t>Key Transparency is being standardized in the KeyTrans IETF WG <xref target="KeyTransWG"/>. This
document describes how a similar design as the one being considered in the
KeyTrans WG could be applied to TLS in order to provide stronger security
properties whilst also reducing the TLS handshake size.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="architecture">
      <name>Architecture</name>
      <t>The system has several roles, which we describe in more detail below. Parties
are allowed to assume multiple roles.</t>
      <dl>
        <dt><strong>Certificate Authority:</strong></dt>
        <dd>
          <t>A service that performs domain-control validation and authenticates
certificates and revocations.</t>
        </dd>
        <dt><strong>Transparency Log:</strong></dt>
        <dd>
          <t>A service that provides an append-only, publicly-auditable log of certificates
and revocations issued by a wide range of Certificate Authorities.</t>
        </dd>
        <dt><strong>Site Operator:</strong></dt>
        <dd>
          <t>The individual or organization responsible for operating and maintaining
a website, as identified by a set of domain names or IP addresses.</t>
        </dd>
        <dt><strong>User Agent:</strong></dt>
        <dd>
          <t>A software application, typically but not necessarily a web browser, that acts
on behalf of a user to access and interact with websites.</t>
        </dd>
      </dl>
      <section anchor="requirements">
        <name>Requirements</name>
        <t>The following baseline requirements for the system are as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>For a certificate to be mis-issued and not eventually published: two trusted
parties must collude to misbehave and all User Agents that observed the
certificate must be stateless.</t>
          </li>
          <li>
            <t>For a User Agent to accept a revoked certificate and this not be eventually
detected: one trusted party must misbehave and all User Agents that accepted
the certificate must be stateless.</t>
          </li>
          <li>
            <t>It must be reasonably efficient for Site Operators to audit all trusted
Certificate Authorities for mis-issuances affecting their domain names and IP
addresses.</t>
          </li>
          <li>
            <t>It must not be possible for a third-party service's outage to cause an outage
for a Site Operator, other than how it could in the web PKI as it exists
today.</t>
          </li>
          <li>
            <t>User Agents must be able to connect to a server without having immediate
connectivity to third-party services.</t>
          </li>
          <li>
            <t>The domain names and/or IP addresses of websites visited by a User Agent must not
be leaked, other than how they are in the web PKI as it exists today.</t>
          </li>
          <li>
            <t>The system must be reasonable for non-browser User Agents to deploy.</t>
          </li>
          <li>
            <t>The system must have a reasonable path to scale to an indefinite number of
Site Operators and User Agents.</t>
          </li>
        </ol>
        <t>These requirements and their main consequences are discussed in more detail in
the following subsection.</t>
      </section>
      <section anchor="discussion">
        <name>Discussion</name>
        <t><strong>Transparency must support stateful verification.</strong> The fundamental goal of any
transparency system is to ensure that data shown to one participant is equally
visible to any other participant. Transparency systems that achieve this by
relying solely on stateless verification are more accurately referred to as
"co-signing" schemes. This is because the security of these systems reduces
solely to successful verification of the co-signers' signatures on a claim that
some data is properly published, and ultimately to an assumption that the
co-signers are not colluding to suppress the data.</t>
        <t>In the web PKI, the co-signers in such a system would be a Certificate Authority
and one or more Transparency Logs. The diverse and rapidly changing nature of
the web makes collusion between participants easy to achieve and difficult to
detect. Without a technical mechanism to detect or prevent collusion, it can be
covertly achieved and maintained for very long periods of time.</t>
        <t>The typical solution to this problem is to construct the system such that a
larger number of co-signers need to collude to succeed in launching an attack.
However, requiring that a large number of signatures from different co-signers
be presented in every TLS handshake would easily bloat the handshake to an
unacceptable degree. This is especially true when the signatures are required to
come from post-quantum signature schemes, given that they're much larger than
their classical alternatives.</t>
        <t>While the system described in this document supports stateless verification,
which is secure as long as there's no collusion between trusted parties, it also
provides stateful verification. Stateful verification allows verifiers to detect
violations of the system's core security guarantees, that all certificates they
accept are published and unrevoked, regardless of any amount of collusion by
trusted parties. This obviates the need for having a large number of co-signers,
allowing TLS handshakes to remain small and providing the broader ecosystem
(including stateless verifiers) with a reliable early warning system for
misbehavior by trusted parties.</t>
        <t><strong>Servers must provide proof directly to clients that their certificate
satisfies transparency requirements and isn't revoked.</strong> If proof of
transparency and non-revocation isn't provided by the server, it must be fetched
from one or more third-party services. The primary issue with this is that it
ties the server's global availability to the global availability of these
third-party services, for which the server operator has no way to preempt or
resolve deficiencies. Proposals for transparency and revocation that rely on
connectivity to third-party services have historically been required to "fail
open", meaning that if the third-party service is inaccessible for too long,
then the client stops enforcing these security properties altogether. Failing
open is incompatible with requirements 1 and 2 because it introduces the
possibility that a client might accept an unpublished or revoked certificate
without explicit misbehavior by a trusted party.</t>
        <t>A second issue is that, since we're primarily interested in describing a system
that works equally well regardless of the client's software vendor (requirement
7), such a service would reasonably be prohibited from restricting access to
itself. It would receive regular requests from all internet-connected devices,
creating significant scaling and centralization concerns.</t>
        <t><strong>Servers must refresh their certificates regularly and automatically.</strong> This is
a direct consequence of the decision that servers must be responsible for
providing clients proof that their certificates are not revoked. If a server is
not required to refresh its certificate, it can arbitrarily delay the client
from learning about changes in the certificate's revocation status. This would
be incompatible with requirement 2, since servers are not considered trusted
parties and should not be capable of undermining revocation on their own.</t>
        <t><strong>Revocation must be provided by the transparency system.</strong> A CA can initiate
revocation either by declining to sign new statements related to a certificate
(for example, by not renewing a short-lived certificate or not creating an OCSP
staple), or by signing a new "statement of revocation" for the certificate.</t>
        <t>In the case where CAs initiate revocation by signing a new "statement of
revocation", proving that a certificate is not revoked consists of proving that
such a statement does not exist. Proving that a statement does not exist
requires exhaustive knowledge of all such statements. Any method of conveying
this exhaustive knowledge, if it is not a transparency system, admits the
possibility of split-view attacks which are not eventually detected. Split-view
attacks in this context would allow a CA to mis-issue a certificate, claim to
revoke it, and then maintain the certificate's utility by presenting different
views of its revocation status to attack victims than to other participants. The
possibility of such a split-view attack would violate requirement 2, as it would
not be after-the-fact detectable. More practically though, it would render
revocation fundamentally insufficient for correcting mis-issuance and would
create a need for a second (more effective) revocation mechanism.</t>
        <t>In the case where CAs initiate revocation by declining to sign new statements,
this makes the CA a single point-of-failure for websites relying on it. A
prolonged CA outage would have the effect of revoking all certificates and
causing a cascading outage, violating requirement 4. Proposals for revocation
that fall into this category have historically mitigated this risk by providing
very slow revocation, bounded by the longest conceivable outage that a CA may
have (typically at least one week). Additionally, it's clear that the same potential
for split-view attacks would still exist, as discussed above.</t>
        <t>When specifically considering short-lived certificates as an approach to
revocation, effectiveness depends on whether or not <strong>all</strong> certificates in the
PKI are required to be short-lived. If clients enforce that all certificates are
short-lived, and issuance is transparent, then revocation is provided by the
transparency system as claimed. If certificates may be issued with longer
lifespans, then a second revocation mechanism for these certificates is
necessary.</t>
        <t>All certificate lifetimes are already planned to fall from 398 days today to 47
days in 2029 <xref target="CertLifetimes"/>, bringing a number of security and agility
benefits to the ecosystem. However, 47 days is still much longer than is
tolerable without effective revocation. Although a further reduction to 7 days
or 24 hours is possible in theory, each halving in lifetime results in doubling
the issuance load for CAs, CT logs and monitors. The net effect would be a ~56x
increase in issuance rate in order to maintain the same size PKI as we have
today.</t>
        <t><strong>Transparency Logs must implement a protocol similar to Key Transparency
<xref target="KEYTRANS"/>.</strong> As stated at
the beginning of this section, the goal of any transparency system is to ensure
that data shown to one participant is equally visible to any other participant.
In the context of the web PKI, this means that a Site Operator that contacts all
trusted Transparency Logs should come away with an exhaustive knowledge of all
certificates that a client might be presented with when connecting to their
servers.</t>
        <t>Most transparency systems require downloading the entirety of the log's contents
to ensure that all potentially relevant entries are found. This quickly becomes
prohibitively expensive for all parties, violating requirements 3 and 8.
Currently roughly 7.5 million certificates are issued per day, with an average
size of 3 kilobytes. This means that a Site Operator would need to download
almost 700 gigabytes of certificates to cover a single month of issuance.
Outbound bandwidth typically costs between 1 to 9 cents per gigabyte, which
means that providing this data to a single Site Operator would cost the
Transparency Log between $6 to $60. If even a small percentage of all Site
Operators on the internet were to do this, it would create an exceptional
financial and operational burden for the Transparency Log.</t>
        <t>In the existing Certificate Transparency ecosystem, because of this exceptional
cost, Site Operators have overwhelmingly elected not to do this work themselves
and have instead outsourced it to third-party monitors. Third-party monitors
represent a problematic break in the security guarantees of Certificate
Transparency as there are no enforceable requirements on their behavior. They
are not audited for correct behavior like Certificate Authorities are, and there
are no technical mechanisms to prevent misbehavior like a Transparency Log would
have.</t>
        <t>Key Transparency systems are generally distinguished from other transparency
systems by the fact that they augment a Transparency Log with additional
structure to allow efficient and verifiable searches for specific data. In the
context of providing transparency to the web PKI, this would allow Site
Operators to download only a small subset of the data in a Transparency Log and
still be assured to have received all certificates that are relevant to them.
Due to the significantly reduced need for outbound bandwidth, operating
such a Transparency Log would cost roughly one million times less than it would
if Site Operators were required to download the log's entire contents.</t>
        <t>Transparency Logs may still choose to allow parties to download their entire
contents. However, this is not necessary for the protocol to be secure and this
document doesn't prescribe a specific mechanism for it. Additionally, while the
protocol described in <xref target="KEYTRANS"/> could be applied directly, some optimizations
and simplifications specific to the web PKI are provided in
<xref target="transparency-log"/>.</t>
      </section>
      <section anchor="summary">
        <name>Summary</name>
        <t>In summary, the system described in this document works as follows:</t>
        <ul spacing="normal">
          <li>
            <t>Site Operators obtain a certificate from a Certificate Authority and submit it
to one of many trusted Transparency Logs to obtain an inclusion proof.</t>
          </li>
          <li>
            <t>User Agents that contact the Site Operator's server over TLS include compact
transparency-related state in their ClientHello. The server provides its
certificate and inclusion proof (potentially modified based on the client's
advertised state) in the Certificate message. The User Agent verifies that the
inclusion proof aligns with its state, is sufficiently recent, and
indicates the certificate is unrevoked.</t>
          </li>
          <li>
            <t>As time goes on, the current inclusion proof will become stale. Site
Operators refresh their inclusion proof by requesting a new one from the
Transparency Log.
            </t>
            <ul spacing="normal">
              <li>
                <t>If the first Transparency Log is offline, the Site Operator may failover to
any of several other trusted Transparency Logs.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>At any time in the background, the Site Operator may query any of the trusted
Transparency Logs and verifiably learn about all new certificates that have
been issued affecting their domain names or IP addresses. Since the Key
Transparency protocol specifies a "correct" location for a certificate to be
stored, and since User Agents enforce this when verifying inclusion proofs,
requesting all certificates for a single identifier always remains highly
efficient.</t>
          </li>
        </ul>
        <t>The remainder of this document describes these steps in more detail.</t>
      </section>
    </section>
    <section anchor="transparency-log">
      <name>Transparency Log</name>
      <t>The data structure maintained by a Transparency Log is identical to the Combined
Tree described in <xref target="KEYTRANS"/>, with two exceptions: the search keys that are
used to navigate the Prefix Tree, and the data committed to by each Prefix Tree
leaf node, are different.</t>
      <t>The search key used to navigate the Prefix Tree is a function of the
certificate's <strong>reference identifier</strong> in the TLS handshake. The reference
identifier is the domain name or IP address that the TLS client will verify the
certificate against. When the reference identifier is a domain name, the
corresponding search key is the domain name with the components in reverse order
and a trailing dot, meaning that "com.example.sub." would be the search key for
the domain name "sub.example.com". If the final component of a domain name is a
wildcard then the wildcard is stripped, such that "com.example." would be the
search key for "*.example.com". The search key corresponding to an IPv4
addresses is the address rendered in dotted-decimal notation. The search key
corresponding to an IPv6 address is the address rendered as described in option
1 of <xref section="2.2" sectionFormat="of" target="RFC4291"/>. No VRF is used, or version counter is
included, as they would be in <xref target="KEYTRANS"/>.</t>
      <t>Rather than a privacy-preserving commitment, each Prefix Tree leaf contains the
hash of a <tt>DomainCertificates</tt> structure:</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque root[Hash.Nh];
  uint32 first_valid;
  uint32 invalid_entries<0..2^8-1>;
} DomainCertificates;
]]></sourcecode>
      <t>The <tt>root</tt> field contains the root hash of a Log Tree, which will be referred to
as the <strong>Certificate Subtree</strong> to avoid confusion with the top-level Log Tree.
The Certificate Subtree contains all certificate chains that may be presented
for a particular domain name or IP address, in the order they were
logged. The leaves of the Certificate Subtree are represented as
<tt>SubtreeLogLeaf</tt> structures, used in place of <tt>LogLeaf</tt>:</t>
      <sourcecode type="tls-presentation"><![CDATA[
opaque Certificate<0..2^16-1>;

struct {
  Certificate chain<0..2^8-1>;
} SubtreeLogLeaf;
]]></sourcecode>
      <t>The <tt>first_valid</tt> field contains the index of the first entry in the Certificate
Subtree where no certificate in the chain is revoked or expired. The
<tt>invalid_entries</tt> field contains the list of indices of all entries to the right
of <tt>first_valid</tt> where one or more of the certificates in the chain have been
revoked.</t>
      <t>Transparency Logs <bcp14>SHOULD</bcp14> determine whether a certificate chain is expired by
comparing the Not After field of each certificate in the chain to the timestamp
of the Log Tree's rightmost leaf. However, Transparency Logs do not have a
proactive responsibility to keep the <tt>first_valid</tt> field updated; it is simply
provided as a mechanism to drain <tt>invalid_entries</tt>.</t>
      <t>When computing <tt>PrefixLeaf</tt>, the hash of the leaf certificate's reference
identifier is stored in the <tt>vrf_output</tt> field and the hash of
<tt>DomainCertificates</tt> is stored in the <tt>commitment</tt> field.</t>
      <section anchor="subtree-inclusion-proofs">
        <name>Subtree Inclusion Proofs</name>
        <t>It is often necessary in later parts of this document to provide proofs of
inclusion for entries in the Certificate Subtree. Such proofs are provided as
follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint32 position;
  uint32 size;
  InclusionProof inclusion;
  uint32 first_valid;
  uint32 invalid_entries<0..2^8-1>;
} SubtreeInclusionProof;
]]></sourcecode>
        <t>The <tt>position</tt> field contains the index of the leaf for which inclusion is being
proven. The <tt>size</tt> field contains the total number of leaves in the
Certificate Subtree. The proof in <tt>inclusion</tt> allows a recipient to recompute
the root hash of the Certificate Subtree, given the correct value for the leaf
at <tt>position</tt>.</t>
        <t>The <tt>first_valid</tt> and <tt>invalid_entries</tt> fields duplicate the contents of the
DomainCertificates structure. This allows recipients to verify that the leaf at
<tt>position</tt> is not revoked, and also allows them to recompute the hash of the
DomainCertificates structure stored at a given leaf of the Prefix Tree.</t>
        <t>Note that this document follows the pattern established in <xref target="KEYTRANS"/> of
requiring each element of an InclusionProof to be a balanced subtree. An
InclusionProof may also function as a "consistency proof" if the recipient is
known to have observed a previous version of the tree.</t>
      </section>
      <section anchor="tree-heads">
        <name>Tree Heads</name>
        <t>Transparency Logs are generally expected to add only a small number of new
entries to their Log Tree per day. This keeps proof sizes small and also ensures
that, when User Agents advertise having observed a particular tree head, there
are a large number of potential hosts that could've conveyed the tree head. To
support providing inclusion proofs for new submissions quickly, Transparency
Logs issue <strong>provisional</strong> tree heads. A provisional head is, in essence, a
work-in-progress log entry that will be added to the rightmost edge of the Log
Tree within a bounded amount of time.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint64 tree_size;
  uint32 counter;
  opaque signature<0..2^16-1>;
} ProvisionalTreeHead;
]]></sourcecode>
        <t>The <tt>tree_size</tt> field is equal to the <tt>tree_size</tt> field of the last
(non-provisional) TreeHead that was published.  The <tt>counter</tt> field
starts at zero and is incremented by 1 for each subsequent ProvisionalTreeHead
that's published without the creation of a new TreeHead.</t>
        <t>The <tt>signature</tt> field of both TreeHead and ProvisionalTreeHead structures is
computed over a serialized TreeHeadTBS structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  CipherSuite ciphersuite;
  opaque signature_public_key<0..2^16-1>;

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

enum {
  reserved(0),
  standard(1),
  provisional(2),
  (255)
} TreeHeadType;

struct {
  Configuration config;

  TreeHeadType tree_head_type;
  select (TreeHeadTBS.tree_head_type) {
    case standard:
      uint64 tree_size;
    case provisional:
      uint64 tree_size;
      uint32 counter;
      opaque prefix_root[Hash.Nh];
  };
  opaque root[Hash.Nh];
} TreeHeadTBS;
]]></sourcecode>
        <t>The <tt>max_ahead</tt> and <tt>max_behind</tt> fields contain the maximum amount of time in
milliseconds that a tree head may be ahead of or behind the user's local clock
without being rejected. If the Transparency Log has chosen to define a maximum
lifetime for log entries, per <xref section="5.2" sectionFormat="of" target="KEYTRANS"/>, this duration in
milliseconds is stored in the <tt>maximum_lifetime</tt> field.</t>
        <t>When the TreeHeadTBS structure is for a <tt>provisional</tt> tree head type,
<tt>prefix_root</tt> contains the work-in-progress root hash of the Prefix Tree. This
value may change further before it is added as a new rightmost log entry.
However, stateful clients will enforce that none of the certificates they
observe are removed or un-revoked.</t>
      </section>
    </section>
    <section anchor="tls-extension">
      <name>TLS Extension</name>
      <t>The following three subsections define the ClientHello, ServerHello, and
Certificate message portions of a TLS 1.3 extension. This extension allows the
host server to provide an inclusion proof for its certificate chain from a
Transparency Log that the client supports.</t>
      <section anchor="clienthello">
        <name>ClientHello</name>
        <t>Clients include the extension in their ClientHello to communicate which
Transparency Logs they support and whether or not they have previously observed
a provisional inclusion proof from the server.</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque BearerToken<0..2^8-1>;

struct {
  uint16 transparency_log_id;
  TreeHeadType tree_head_type;
  select (SupportedTransparencyLog.tree_head_type) {
    case standard:
      uint64 tree_size;
  };
} SupportedTransparencyLog;

struct {
  SupportedTransparencyLog supported<0..2^8-1>;
  select (any supported[i].tree_head_type is provisional) {
    case true:
      BearerToken bearer_token;
  }
} TransparencyRequest;
]]></sourcecode>
        <t>The extension has type "transparency_revocation" and consists of a serialized
<tt>TransparencyRequest</tt> structure in the <tt>extension_data</tt> field.</t>
        <t>Clients include an entry in the <tt>supported</tt> array for each Transparency Log
that they support receiving inclusion proofs from, containing the Transparency
Log's assigned unique identifier in <tt>transparency_log_id</tt>. The <tt>supported</tt> array
<bcp14>MUST</bcp14> be sorted in ascending order by <tt>transparency_log_id</tt>, and each
<tt>transparency_log_id</tt> <bcp14>MUST</bcp14> only be advertised once.</t>
        <t>If a client was shown a provisional inclusion proof from a Transparency Log in a
previous connection to the server, the client sets <tt>tree_head_type</tt> to be
<tt>provisional</tt> for that Transparency Log's entry in <tt>supported</tt> until one of the
following conditions is met:</t>
        <ol spacing="normal" type="1"><li>
            <t>The client receives proof that the provisional proof was integrated into the
subsequent log entry, or:</t>
          </li>
          <li>
            <t>The timestamp of the rightmost log entry that existed in the provisional
inclusion proof is more than <tt>10*max_behind</tt> milliseconds in the past.</t>
          </li>
        </ol>
        <t>For Transparency Logs where the client does not need to resolve a provisional
inclusion proof, <tt>tree_head_type</tt> is set to <tt>standard</tt>. The <tt>tree_size</tt> field is
set as follows:</t>
        <ul spacing="normal">
          <li>
            <t>If the client is aware of two consecutive log entries where the timestamp
of the left log entry is greater than <tt>max_behind</tt> milliseconds in the past
and the timestamp of the right log entry is less than or equal to <tt>max_behind</tt>
milliseconds in the past, then the <tt>tree_size</tt> field is set so as to make the
right log entry the rightmost log entry.</t>
          </li>
          <li>
            <t>If the client isn't aware of two log entries that meet the above criteria,
but is aware of a log entry whose timestamp is greater than <tt>max_behind</tt>
milliseconds in the past and less than <tt>10*max_behind</tt> milliseconds in the
past, then the <tt>tree_size</tt> field is set so as to make the rightmost such log
entry the rightmost log entry.</t>
          </li>
          <li>
            <t>Otherwise, the <tt>tree_size</tt> field is set to 0.</t>
          </li>
        </ul>
        <t>With the first criteria, the client is aiming to advertise the
oldest <tt>tree_size</tt> that a server could provide an inclusion proof against
without it being expired. If the client is unable to do this, the second
criteria aims to advertise a <tt>tree_size</tt> that's old enough that it would not be
de-anonymizing, but not so old that servers are unaware of it.</t>
        <t>If the <tt>tree_head_type</tt> of any SupportedTransparencyLog structure is set to
<tt>provisional</tt>, then a bearer token is provided in <tt>bearer_token</tt>. The bearer
token to use is provided by the server in a previous connection. The same bearer
token <bcp14>MAY</bcp14> be advertised in multiple ClientHello messages but clients <bcp14>SHOULD</bcp14> take
care to minimize the likelihood of this.</t>
      </section>
      <section anchor="serverhello">
        <name>ServerHello</name>
        <t>Servers that receive a TLS 1.3 ClientHello with an extension of type
"transparency_revocation", where the <tt>extension_data</tt> field is properly formed,
have the option of providing an inclusion proof for their certificate chain. The
proof provided by the server <bcp14>MUST</bcp14> come from one of the Transparency Logs
advertised in the client's ClientHello. If the server is not able to provide a
proof from one of the client's supported Transparency Logs, it <bcp14>MUST</bcp14> respond as
if the ClientHello extension was not advertised at all. Servers <bcp14>SHOULD</bcp14>
preferentially respond with an inclusion proof from one of the Transparency Logs
that the client advertised a <tt>provisional</tt> tree head type for, provided that an
acceptable proof is readily available.</t>
        <t>If and only if the server intends to provide an inclusion proof (provisional or
not) from a Transparency Log where the client has advertised a <tt>provisional</tt>
tree head type, it includes an extension of type "transparency_revocation" in
its ServerHello. The <tt>extension_data</tt> is the unique identifier of the
Transparency Log:</t>
        <sourcecode type="tls-presentation"><![CDATA[
uint16 transparency_log_id;
]]></sourcecode>
        <!-- TODO: More information on client PSK -->

</section>
      <section anchor="certificate">
        <name>Certificate</name>
        <t>The server provides an inclusion proof for its certificate chain by adding
an extension of type "transparency_revocation" to the first CertificateEntry
structure in <tt>certificate_list</tt>. The <tt>extension_data</tt> field is a serialized
TransparencyProof structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  standard(1),
  provisional(2),
  same_head(3),
  (255)
} TransparencyProofType;

struct {
  uint32 size
  uint32 first_valid;
  uint32 invalid_entries<0..2^8-1>;
} SequencingProof;

struct {
  TreeHead tree_head;
  CombinedTreeProof combined;
  select (condition) {
    case true:
      SequencingProof sequencing<1..2^8-1>;
  }
  SubtreeInclusionProof subtree<1..2^8-1>;
} StandardProof;

struct {
  ProvisionalTreeHead tree_head;
  CombinedTreeProof combined;
  select (condition) {
    case true:
      SequencingProof sequencing<1..2^8-1>;
  }

  PrefixProof prefix;
  SubtreeInclusionProof subtree<1..2^8-1>;
} ProvisionalProof;

struct {
  PrefixProof prefix;
  SubtreeInclusionProof subtree<1..2^8-1>;
} SameHeadProof;

struct {
  uint16 transparency_log_id;
  uint8 reference_ids<1..2^8-1>;

  TransparencyProofType proof_type;
  select(TransparencyProof.proof_type) {
    case standard:
      StandardProof proof;
    case provisional:
      ProvisionalProof proof;
    case same_head:
      SameHeadProof proof;
  };

  select (condition) {
    case true:
      BearerToken bearer_token;
      opaque pre_shared_key<Npsk>;
  }
} TransparencyProof;
]]></sourcecode>
        <t>The <tt>transparency_log_id</tt> field specifies the Transparency Log that the proof
comes from. The <tt>reference_ids</tt> field specifies the set of reference identifiers
that the proof will cover, specified as a zero-indexed offset into the leaf
certificate's subjectAltName extension. The <tt>proof_type</tt> field specifies the
type of proof that follows.</t>
        <t>If any of the following conditions are true, then the <tt>bearer_token</tt> and
<tt>pre_shared_key</tt> fields are present:</t>
        <ol spacing="normal" type="1"><li>
            <t><tt>proof_type</tt> is set to <tt>provisional</tt>,</t>
          </li>
          <li>
            <t>A provisional tree head type was advertised in the ClientHello for any
Transparency Log other than that identified by <tt>transparency_log_id</tt>,</t>
          </li>
          <li>
            <t>A provisional tree head type was advertised in the ClientHello for the
Transparency Log identified by <tt>transparency_log_id</tt> and <tt>proof_type</tt> is set
to <tt>same_head</tt>.</t>
          </li>
        </ol>
        <!-- TODO: I would like to specify that the Certificate Authority and the
     Transparency Log must be operated by different organizations, but this
     doesn't seem possible in a straightforward way because of cross-signs. -->

<t>Clients verify that the <tt>reference_ids</tt> field is sorted in ascending order,
contains at least one entry, contains no duplicates, and that each index
corresponds to a domain name or IP address in the leaf certificate's
subjectAltName extension. Clients <bcp14>MUST NOT</bcp14> trust a connection for any name other
than those in <tt>reference_ids</tt>.</t>
        <t>Clients prepare a list, referred to as the <strong>Current Authenticated Search
Keys</strong>, that contains the corresponding Prefix Tree search key for each
reference identifier in <tt>reference_ids</tt>. This list is de-duplicated and stored
in ascending lexicographic order. If the client advertised a provisional tree
head type for the chosen Transparency Log, the client additionally prepares a
list referred to as the <strong>Past Authenticated Search Keys</strong>. This list contains
the union of every Current Authenticated Search Keys list from past connections
where a provisional proof from the same Transparency Log was presented and the
provisional proof has not yet been proven consistent with the <strong>subsequent log
entry</strong> (defined as the first log entry sequenced after the provisional tree
head was created). This list is also de-duplicated and stored in ascending
lexicographic order.</t>
        <t>Verification proceeds as follows, based on <tt>proof_type</tt>:</t>
        <t>When <tt>proof_type</tt> is set to <tt>standard</tt>, this indicates that the inclusion proof
is against a log entry that is currently published by the Transparency Log but
more recent than the client may be aware of. These proofs are verified as
follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the client advertised a <tt>standard</tt> tree head type, verify that
<tt>tree_head.size</tt> is greater than the size advertised by the client. If the
client advertised a <tt>provisional</tt> tree head type, verify that
<tt>tree_head.size</tt> is greater than the size of the associated provisional tree
head.</t>
          </li>
          <li>
            <t>Verify <tt>combined</tt> as executing the following proofs in this order:  </t>
            <ol spacing="normal" type="1"><li>
                <t>Updating the view of the tree (<xref section="10.3.1" sectionFormat="of" target="KEYTRANS"/>). This also
verifies that the rightmost log entry's timestamp is within the bounds set
by <tt>max_ahead</tt> and <tt>max_behind</tt>.</t>
              </li>
              <li>
                <t>The client requires a <tt>PrefixProof</tt> from the rightmost log entry for the
Current Authenticated Search Keys. If the client advertised a provisional
tree head type for the chosen Transparency Log, the client additionally
requires a <tt>PrefixProof</tt> from the subsequent log entry for the Past
Authenticated Search Keys.      </t>
                <t>
If the rightmost log entry and the subsequent log entry are the same, then
only one <tt>PrefixProof</tt> for the union of the two lists is provided in
<tt>combined</tt>. Otherwise, if needed, the subsequent log entry's timestamp and
a <tt>PrefixProof</tt> from the subsequent log entry for the Past Authenticated
Search Keys is provided. This is followed by a second <tt>PrefixProof</tt> from
the rightmost log entry for the Current Authenticated Search keys.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If the client advertised a provisional tree head type for the chosen
Transparency Log, and the subsequent log entry is not the rightmost log
entry, the client prepares a list referred to as the <strong>Sequenced Search
Keys</strong>. This list is the intersection the Past Authenticated Search Keys and
the Current Authenticated Search Keys lists, stored in lexicographic order.  </t>
            <t>
If this list is not empty, the <tt>sequencing</tt> field is expected to be present.
Each entry in the <tt>sequencing</tt> field corresponds to each entry in the
Sequenced Search Keys list. Each SequencingProof structure contains size of
the Certificate Subtree for the given search key, and the <tt>first_valid</tt> and
<tt>invalid_entries</tt> fields of its <tt>DomainCertificates</tt> structure, as it exists
in the subsequent log entry. Clients:
1. Verify that <tt>SequencingProof.size</tt> is greater than or equal to the
   retained size of the Certificate Subtree.
2. Verify that <tt>SequencingProof.{first_valid, invalid_entries}</tt> would not
   unrevoke any previously revoked certificates.</t>
          </li>
          <li>
            <t>Each entry in the <tt>subtree</tt> field corresponds to the union of the Current
Authenticated Search Keys and Past Authenticated Search Keys lists, in
lexicographic order. Entries corresponding to search keys that are in the
Current Authenticated Search Keys list contain the search key's state in the
rightmost log entry. Entries corresponding to search keys that are <strong>only</strong>
in the Past Authenticated Search Keys list contain the search key's state in
the subsequent log entry. For each entry in the <tt>subtree</tt> field:  </t>
            <ol spacing="normal" type="1"><li>
                <t>If the corresponding search key is in the Sequenced Search Keys list,
this means that there is an entry corresponding to the search key in
<tt>sequencing</tt>. Compared to the fields of that <tt>SequencingProof</tt> structure:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Verify that <tt>SubtreeInclusionProof.size</tt> is greater than or equal.</t>
                  </li>
                  <li>
                    <t>Verify that <tt>SubtreeInclusionProof.{first_valid, invalid_entries}</tt>
would not unrevoke any previously revoked certificates.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>If the corresponding search key is in the Past Authenticated Search Keys
list but not in the Current Authenticated Search Keys list:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Verify that <tt>SubtreeInclusionProof.size</tt> is greater than or equal to
the retained size of the Certificate Subtree.</t>
                  </li>
                  <li>
                    <t>Verify that <tt>SubtreeInclusionProof.{first_valid, invalid_entries}</tt>
would not unrevoke any previously revoked certificates.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>If the corresponding search key is in the Current Authenticated Search
Keys list, verify that <tt>SubtreeInclusionProof.{first_valid,
invalid_entries}</tt> do not exclude <tt>SubtreeInclusionProof.position</tt>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Compute the root hash of the Log Tree and verify the signature in
<tt>tree_head.signature</tt>:  </t>
            <ol spacing="normal" type="1"><li>
                <t>For each entry in <tt>subtree</tt>, compute the root hash of the Certificate
Subtree. This is done by interpreting <tt>SubtreeInclusionProof.inclusion</tt> as
an inclusion proof in the Certificate Subtree for
<tt>SubtreeInclusionProof.position</tt>. If the client advertised a provisional
tree head and the corresponding search key is in the Past Authenticated
Search Keys list, the proof will also function as a consistency proof as
described in <xref section="3.2" sectionFormat="of" target="KEYTRANS"/>.</t>
              </li>
              <li>
                <t>For each entry in <tt>sequencing</tt>, compute the root hash of the Certificate
Subtree. The inclusion proof in the <tt>subtree</tt> entry for the same search
key will additionally contain the minimum set of node hashes necessary to
compute the root of the Certificate Subtree at size
<tt>SequencingProof.size</tt>.</t>
              </li>
              <li>
                <t>With the root hashes of the Certificate Subtrees and the other fields in
<tt>subtree</tt> and <tt>sequencing</tt>, compute the Prefix Tree leaf hash for each
lookup that was done. As mentioned earlier, each search key in the Current
Authenticated Search Keys list is looked up in the rightmost log entry and
each search key in the Past Authenticated Search Keys list is looked up in
the subsequent log entry, deduplicating if these log entries are the same.</t>
              </li>
              <li>
                <t>With the Prefix Tree leaf hashes, compute the root hash of the Log Tree
with <tt>combined</tt>. If the client advertised a provisional tree head, the
inclusion proof in <tt>combined</tt> will also function as a consistency proof as
described in <xref section="3.2" sectionFormat="of" target="KEYTRANS"/>.</t>
              </li>
            </ol>
          </li>
        </ol>
        <t>When <tt>proof_type</tt> is set to <tt>provisional</tt>, this indicates that the inclusion
proof is against a log entry that is not yet published by the Transparency Log.
These proofs are verified as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the client advertised a <tt>standard</tt> tree head type, verify that
<tt>tree_head.size</tt> is greater than or equal to the size advertised by the
client. If the client advertised a <tt>provisional</tt> tree head type, verify that
<tt>tree_head.size</tt> is greater than that of the advertised tree head, or that
<tt>tree_head.size</tt> is equal and <tt>tree_head.counter</tt> is greater than that of the
advertised tree head.</t>
          </li>
          <li>
            <t>Verify <tt>combined</tt> as executing the following proofs in this order:  </t>
            <ol spacing="normal" type="1"><li>
                <t>Updating the view of the tree (<xref section="10.3.1" sectionFormat="of" target="KEYTRANS"/>). This also
verifies that the rightmost log entry's timestamp is within the bounds set
by <tt>max_ahead</tt> and <tt>max_behind</tt>.</t>
              </li>
              <li>
                <t>If the client advertised a provisional tree head type for the chosen
Transparency Log and the subsequent log entry exists, then the subsequent
log entry's timestamp and a <tt>PrefixProof</tt> from it for the Past
Authenticated Search Keys is added to <tt>combined</tt>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If the client advertised a provisional tree head type for the chosen
Transparency Log, and the subsequent log entry exists, the client prepares a
list referred to as the <strong>Sequenced Search Keys</strong>. This list is the
intersection the Past Authenticated Search Keys and the Current Authenticated
Search Keys lists, stored in lexicographic order.  </t>
            <t>
If this list is not empty, the <tt>sequencing</tt> field is expected to be present.
Each entry in the <tt>sequencing</tt> field corresponds to each entry in the
Sequenced Search Keys list. Each SequencingProof structure contains size of
the Certificate Subtree for the given search key, and the <tt>first_valid</tt> and
<tt>invalid_entries</tt> fields of its <tt>DomainCertificates</tt> structure, as it exists
in the subsequent log entry. Clients:
1. Verify that <tt>SequencingProof.size</tt> is greater than or equal to the
   retained size of the Certificate Subtree.
2. Verify that <tt>SequencingProof.{first_valid, invalid_entries}</tt> would not
   unrevoke any previously revoked certificates.</t>
          </li>
          <li>
            <t>Each entry in the <tt>subtree</tt> field corresponds to the union of the Current
Authenticated Search Keys list and, if the client advertised a provisional
tree head and the subsequent log entry exists, the Past Authenticated Search
Keys list. Entries corresponding to search keys that are in the Current
Authenticated Search Keys list contain the search key's state in the
provisional Prefix Tree. Entries corresponding to search keys that are
<strong>only</strong> in the Past Authenticated Search Keys list contain the search key's
state in the subsequent log entry. For each entry in the <tt>subtree</tt> field:  </t>
            <ol spacing="normal" type="1"><li>
                <t>If the corresponding search key is in the Sequenced Search Keys list,
this means that there is an entry corresponding to the search key in
<tt>sequencing</tt>. Compared to the fields of that <tt>SequencingProof</tt> structure:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Verify that <tt>SubtreeInclusionProof.size</tt> is greater than or equal.</t>
                  </li>
                  <li>
                    <t>Verify that <tt>SubtreeInclusionProof.{first_valid, invalid_entries}</tt>
would not unrevoke any previously revoked certificates.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>If the corresponding search key is in the Past Authenticated Search Keys
list but not in the Current Authenticated Search Keys list:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Verify that <tt>SubtreeInclusionProof.size</tt> is greater than or equal to
the retained size of the Certificate Subtree.</t>
                  </li>
                  <li>
                    <t>Verify that <tt>SubtreeInclusionProof.{first_valid, invalid_entries}</tt>
would not unrevoke any previously revoked certificates.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>If the corresponding search key is in the Current Authenticated Search
Keys list, verify that <tt>SubtreeInclusionProof.{first_valid,
invalid_entries}</tt> do not exclude <tt>SubtreeInclusionProof.position</tt>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Compute the root hash of the Log Tree, the root hash of the provisional
Prefix Tree, and verify the signature in <tt>tree_head.signature</tt>:  </t>
            <ol spacing="normal" type="1"><li>
                <t>For each entry in <tt>subtree</tt>, compute the root hash of the Certificate
Subtree. This is done by interpreting <tt>SubtreeInclusionProof.inclusion</tt> as
an inclusion proof in the Certificate Subtree for
<tt>SubtreeInclusionProof.position</tt>. If the client advertised a provisional
tree head and the corresponding search key is in the Past Authenticated
Search Keys list, the proof will also function as a consistency proof as
described in <xref section="3.2" sectionFormat="of" target="KEYTRANS"/>.</t>
              </li>
              <li>
                <t>For each entry in <tt>sequencing</tt>, compute the root hash of the Certificate
   Subtree. The inclusion proof in the <tt>subtree</tt> entry for the same search
   key will additionally contain the minimum set of node hashes necessary to
   compute the root of the Certificate Subtree at size
   <tt>SequencingProof.size</tt>.</t>
              </li>
              <li>
                <t>With the root hashes of the Certificate Subtrees and the other fields in
   <tt>subtree</tt> and <tt>sequencing</tt>, compute the Prefix Tree leaf hash for each
   lookup that was done. As mentioned earlier, each search key in the Current
   Authenticated Search Keys list is looked up in the provisional Prefix Tree
   and each search key in the Past Authenticated Search Keys list is looked
   up in the subsequent log entry if and only if it exists.</t>
              </li>
              <li>
                <t>With the Prefix Tree leaf hashes, compute the root hash of the Log Tree
   with <tt>combined</tt>, and compute the root hash of the provisional Prefix Tree
   with the proof in <tt>prefix</tt>. If the client advertised a provisional tree
   head, the inclusion proof in <tt>combined</tt> will also function as a
   consistency proof as described in <xref section="3.2" sectionFormat="of" target="KEYTRANS"/>.</t>
              </li>
            </ol>
          </li>
        </ol>
        <t>When <tt>proof_type</tt> is set to <tt>same_head</tt>, this indicates that the inclusion
proof is against the same tree head that was specified in the
<tt>SupportedTransparencyLog</tt> structure for the chosen Transparency Log. These
proofs are verified as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>For the advertised tree head, verify that the rightmost log entry's timestamp
is within the bounds set by <tt>max_ahead</tt> and <tt>max_behind</tt>.</t>
          </li>
          <li>
            <t>Each entry in the <tt>subtree</tt> field corresponds to each entry of the Current
Authenticated Search Keys list. If the client advertised a standard tree head
type, each entry contains the corresponding search key's state as it exists
in the rightmost log entry. If the client advertised a provisional tree head
type, each entry contains the corresponding search key's state as it exists
in the provisional Prefix Tree.  </t>
            <t>
For each entry in the <tt>subtree</tt> field, verify that
<tt>SubtreeInclusionProof.{first_valid, invalid_entries}</tt> do not exclude
<tt>SubtreeInclusionProof.position</tt>.</t>
          </li>
          <li>
            <t>Compute the root hash of the Prefix Tree and verify that it matches the
retained value:  </t>
            <ol spacing="normal" type="1"><li>
                <t>For each entry in <tt>subtree</tt>, compute the root hash of the Certificate
Subtree. This is done by interpreting <tt>SubtreeInclusionProof.inclusion</tt> as
an inclusion proof in the Certificate Subtree for
<tt>SubtreeInclusionProof.position</tt>. If the client advertised a provisional
tree head and the corresponding search key is in the Past Authenticated
Search Keys list, the proof will also function as a consistency proof as
described in <xref section="3.2" sectionFormat="of" target="KEYTRANS"/>.</t>
              </li>
              <li>
                <t>With the root hashes of the Certificate Subtrees and the other fields in
   <tt>subtree</tt>, compute the Prefix Tree leaf hash for each
   lookup that was done.</t>
              </li>
              <li>
                <t>With the Prefix Tree leaf hashes, compute the root hash of the Prefix
Tree with the proof in <tt>prefix</tt>.</t>
              </li>
            </ol>
          </li>
        </ol>
        <t>As was mentioned in <xref target="transparency-log"/>, the entire certificate chain that will
be presented by the server is stored in the leaf of the Certificate Subtree. If
the server presents a different certificate chain to the client than was logged
in the Transparency Log (for example, by including or omitting intermediates),
the client will be unable to compute the correct Certificate Subtree root hash
and proof verification will fail. Authenticating the entire certificate chain,
instead of just the leaf, prevents the possibility of unlogged intermediate
certificates. That is, it prevents the possibility of a leaf certificate being
logged with a chain to a testing (or otherwise untrusted) trust anchor, and then
being presented in TLS connections with additional intermediates that connect it
to a different trust anchor.</t>
      </section>
    </section>
    <section anchor="transparency-log-endpoints">
      <name>Transparency Log Endpoints</name>
      <t>Transparency Logs are online services that maintain a tree data structure and
provide access to it through the endpoints described below. Generally, only Site
Operators contact Transparency Logs. Site Operators regularly issue requests to
the Transparency Log's endpoints to either obtain fresh inclusion proofs for
their certificates or to monitor for mis-issuances affecting their properties.</t>
      <t>Endpoints are accessible over HTTP or HTTPS. Which endpoint is being accessed is
determined by the request's method and path. Request and response bodies are
specific structures, which are encoded according to TLS format and then base64
encoded.</t>
      <section anchor="get-tree">
        <name>Get Tree</name>
        <t>Site Operators access this endpoint to initialize or update their view
of the tree.</t>
        <t>GET /get-tree{?tree_size=X}</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  TreeHead tree_head;
  CombinedTreeProof combined;
} GetTreeResponse;
]]></sourcecode>
        <t>The request optionally contains a <tt>tree_size</tt> query parameter containing the
size of the most recent tree head that has been observed by the client. If
present, <tt>tree_size</tt> <bcp14>MUST</bcp14> be the size of a tree head that was published less
than or equal to <tt>max_behind</tt> milliseconds in the past.</t>
        <t>If the <tt>tree_size</tt> query parameter was provided but a more recent tree head
than <tt>tree_size</tt> has not been issued, the Transparency Log <bcp14>MAY</bcp14> respond with a
204 No Content status code and an empty response body. Otherwise, the response
body is GetTreeResponse. The <tt>tree_head</tt> field contains the most recent tree
head published by the Transparency Log. The <tt>combined</tt> field contains the
following:</t>
        <ul spacing="normal">
          <li>
            <t>The output of updating the view of the tree (from <tt>tree_size</tt>, if provided) to
<tt>tree_head.tree_size</tt> (<xref section="10.3.1" sectionFormat="of" target="KEYTRANS"/>).</t>
          </li>
          <li>
            <t>The timestamps of all log entries that have timestamps less than or equal to
<tt>10*max_behind</tt>, excluding those contained in <tt>tree_size</tt>. These timestamps
are provided in left-to-right order. Note that some of them may be omitted if
they are duplicates with the previous bullet, as explained in <xref section="10.3" sectionFormat="of" target="KEYTRANS"/>.</t>
          </li>
        </ul>
        <t>If <tt>tree_size</tt> is provided, the proof in <tt>combined.inclusion</tt> is additionally a
consistency proof.</t>
      </section>
      <section anchor="add-chain">
        <name>Add Chain</name>
        <t>Site Operators access this endpoint to produce an inclusion proof for their
certificate chain. Transparency Logs <bcp14>SHOULD</bcp14> accept certificates issued by a
broad set of the current widely-trusted Certificate Authorities. This ensures
that, if one Transparency Log has an outage, there are several other
Transparency Logs that Site Operators can failover to and fetch fresh inclusion
proofs from.</t>
        <t>POST /add-chain</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint64 tree_size;
  uint32 subtree_sizes<1..2^8-1>;

  uint8 reference_ids<1..2^8-1>;
  Certificate chain<1..2^8-1>;
  opaque signature<0..2^16-1>;
} AddChainRequest;

struct {
  TreeHeadType tree_head_type;
  select (AddChainResponse.tree_head_type) {
    case provisional:
      ProvisionalTreeHead tree_head;
      CombinedTreeProof combined;
      PrefixProof prefix;
      SubtreeInclusionProof subtree<1..2^8-1>;
  }
  BearerToken bearer_token;
} AddChainResponse;
]]></sourcecode>
        <t>The request body is AddChainRequest. The <tt>tree_size</tt> field contains the size of
the most recent tree head observed by the client. The <tt>subtree_sizes</tt> field
contains the greatest size of the Certificate Subtree observed by the client for
each reference identifier, in the order the reference identifiers are provided
in <tt>reference_ids</tt>. The <tt>reference_ids</tt> field contains the reference identifiers
that the certificate chain will be validated against, identified by their
zero-indexed offset into the leaf certificate's subjectAltName extension. The
<tt>chain</tt> field contains the certificate chain itself. The first entry in <tt>chain</tt>
is assumed to be the leaf certificate and each subsequent certificate is assumed
to authenticate the one prior, ending at a certificate which is authenticated by
a trust anchor. The <tt>signature</tt> field contains a signature from the public key
in the leaf certificate over the following:</t>
        <t>TODO Specify signature challenge</t>
        <t>The Transparency Log verifies that:</t>
        <ol spacing="normal" type="1"><li>
            <t>The <tt>tree_size</tt> field corresponds to a tree head that was issued less than
or equal to <tt>max_behind</tt> milliseconds in the past.</t>
          </li>
          <li>
            <t>The <tt>subtree_sizes</tt> field has the same length as the <tt>reference_ids</tt> field
and each entry is less than or equal to the most recent size of the
corresponding Certificate Subtree.</t>
          </li>
          <li>
            <t>The <tt>reference_ids</tt> field is in ascending order, each entry corresponds to a
domain name or IP address in the leaf certificate's subjectAltName extension,
and each entry corresponds to a unique Prefix Tree search key.</t>
          </li>
          <li>
            <t>The certificate chain in <tt>chain</tt> is valid. <!-- TODO: RFC reference? -->
            </t>
          </li>
          <li>
            <t>The signature in <tt>signature</tt> is valid.</t>
          </li>
        </ol>
        <t>The response body is AddChainResponse. If <tt>tree_head_type</tt> is set to <tt>standard</tt>,
this indicates that the exact certificate chain is already present in the
Certificate Subtrees for all of the reference identifiers and published in the
rightmost log entry. If <tt>tree_head_type</tt> is set to <tt>provisional</tt>, this indicates
that a provisional tree head has been issued for the chain. The provisional tree
head is given in <tt>tree_head</tt> and an inclusion proof in the provisional Prefix
Tree for all requested reference identifiers is given in <tt>prefix</tt>. The
<tt>combined</tt> field contains the same contents as the Get Tree endpoint would. The
<tt>subtree</tt> field contains an inclusion proof in the Certificate Subtree for each
reference identifier, in the order the reference identifiers are provided in
<tt>reference_ids</tt>. If an entry of <tt>AddChainRequest.subtree_sizes</tt> is greater than
zero, then the corresponding <tt>AddChainResponse.subtree[i].inclusion</tt> is
additionally a consistency proof.</t>
        <t>The <tt>bearer_token</tt> field of an AddChainResponse is arbitrarily set by the
Transparency Log and used to authenticate requests to the Refresh Proof
endpoint. The bearer token will stop working once the associated certificate
chain has expired, regardless of revocation status.</t>
      </section>
      <section anchor="refresh-proof">
        <name>Refresh Proof</name>
        <t>Site Operators access this endpoint to refresh an inclusion proof for
their certificate chain, making it acceptable to clients for a longer period of
time.</t>
        <t>GET /refresh-proof?bearer_token=X&amp;position=Y</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  PrefixProof prefix;
  SubtreeInclusionProof subtree<1..2^8-1>;
} RefreshProofResponse;
]]></sourcecode>
        <t>The request contains a bearer token obtained from the Add Chain endpoint in the
<tt>bearer_token</tt> query parameter, and the position of a log entry in the
<tt>position</tt> query parameter. The bearer token is encoded with URL-safe base64,
described in <xref section="5" sectionFormat="of" target="RFC4648"/>. The <tt>position</tt> query parameter <bcp14>MUST</bcp14>
either be the subsequent log entry issued after the provisional tree head (if
any) associated with <tt>bearer_token</tt>, or be a log entry issued less than or equal
to <tt>max_behind</tt> milliseconds in the past.</t>
        <t>The response body is RefreshProofResponse. The <tt>prefix</tt> field contains an
inclusion proof from the Prefix Tree stored at the requested log entry,
specifically for the reference identifiers associated with <tt>bearer_token</tt>. The
<tt>subtree</tt> field contains inclusion proofs for the certificate chain in the
Certificate Subtree of each reference identifier associated with <tt>bearer_token</tt>,
in the order the reference identifiers were provided.</t>
      </section>
      <section anchor="issue-token">
        <name>Issue Token</name>
        <t>Site Operators access this endpoint to obtain a bearer token to use when
accessing the Transparency Log endpoints described in subsequent sections.</t>
        <t>POST /issue-token</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  Certificate chain<1..2^8-1>;
  opaque signature<0..2^16-1>;
} IssueTokenRequest;

struct {
  BearerToken bearer_token;
} IssueTokenResponse;
]]></sourcecode>
        <t>The request body is IssueTokenRequest. The <tt>chain</tt> field contains a certificate
chain possessed by the client. The first entry in <tt>chain</tt> is assumed to be the
leaf certificate and each subsequent certificate is assumed to authenticate the
one prior, ending at a certificate which is authenticated by a trust anchor. The
<tt>signature</tt> field contains a signature from the public key in the leaf
certificate over the challenge specified in <xref target="add-chain"/>.</t>
        <t>The Transparency Log verifies the certificate chain and the signature challenge.
If verification is successful, the response body is IssueTokenResponse. The
<tt>bearer_token</tt> field is used to authenticate requests to the Transparency Log
endpoints described below. The bearer token will stop working once the
associated certificate chain has expired, regardless of revocation status.</t>
      </section>
      <section anchor="get-certificates">
        <name>Get Certificates</name>
        <t>Site Operators access this endpoint for the purpose of auditing
certificates that have been issued for their domain names or IP addresses.</t>
        <t>GET /get-certificates?bearer_token=X&amp;reference_id=Y{&amp;start=Z}</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  select (start query parameter not present) {
    case true:
      uint32 first_valid;
      NodeValue full_subtrees<0..2^8-1>;
  }
  SubtreeLogLeaf leaves<0..2^8-1>;
} GetCertificatesResponse;
]]></sourcecode>
        <t>The <tt>bearer_token</tt> query parameter contains a bearer token obtained from the
Issue Token endpoint encoded in URL-safe base64. The <tt>reference_id</tt> query
parameter may contain any domain name or IP address authenticated by the leaf
certificate associated with the provided bearer token, or any domain name that
is suffixed by any authenticated domain name. The optional <tt>start</tt> query
parameter contains the requested start position in the Certificate Subtree.</t>
        <t>Note that <tt>reference_id</tt> may be a domain name that is not authenticated by the
certificate. For example, a certificate that only authenticates <tt>example.com</tt>
would not be accepted by TLS clients for <tt>sub.example.com</tt>. However,
<tt>sub.example.com</tt> would still be an acceptable input to this endpoint since it
has the suffix <tt>.example.com</tt>.</t>
        <t>The response body is GetCertificatesResponse. If the <tt>start</tt> query parameter is
not present, the <tt>first_valid</tt> field contains the lowest value for <tt>first_valid</tt>
in any DomainCertificates structure for the reference identifier that is
currently published (meaning, excluding DomainCertificates structures in log
entries that are past their maximum lifetime). The <tt>full_subtrees</tt> field
contains the full subtrees of the Certificate Subtree, in left-to-right order,
up to but excluding the <tt>first_valid</tt> entry.</t>
        <t>The <tt>leaves</tt> field contains SubtreeLogLeaf structures in the same order that
they were sequenced in the Certificate Subtree for the requested reference
identifier, starting at position <tt>start</tt> or starting at position <tt>first_valid</tt>
is <tt>start</tt> is not present. If the <tt>start</tt> query parameter is present, it <bcp14>MUST</bcp14> be
greater than <tt>first_valid</tt>.</t>
      </section>
      <section anchor="get-subdomains">
        <name>Get Subdomains</name>
        <t>Site Operators access this endpoint to learn about subdomains of domains they
control that have logged certificates.</t>
        <t>GET /get-subdomains?bearer_token=W&amp;reference_id=X&amp;position=Y&amp;start=Z</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque search_key<0..2^8-1>;
  uint32 size;
  uint32 first_valid;
  uint32 invalid_entries<0..2^8-1>;
} Subdomain;

struct {
  PrefixProof prefix;
  Subdomain subdomains<0..2^8-1>;
} GetSubdomainsResponse;
]]></sourcecode>
        <t>The <tt>bearer_token</tt> query parameter contains a bearer token obtained from the
Issue Token endpoint. The <tt>reference_id</tt> query parameter may contain the
zero-indexed offset of any domain name in the subjectAltName extension of the
leaf certificate associated with the provided bearer token. The <tt>position</tt> query
parameter is the position of a log entry that has not passed its maximum
lifetime. The <tt>start</tt> query parameter contains the number of subdomains to skip
in the endpoint's output.</t>
        <t>The response body is GetSubdomainsResponse. Each entry of <tt>subdomains</tt>
corresponds to a search key stored in the Prefix Tree that is prefixed with the
search key corresponding to <tt>reference_id</tt> plus an additional dot. The
<tt>subdomains</tt> array is sorted by lexicographic order of the corresponding Prefix
Tree search keys. In each entry, the <tt>search_key</tt> field contains the Prefix Tree
search key while the <tt>size</tt>, <tt>first_valid</tt>, and <tt>invalid_entries</tt> fields match
the corresponding DomainCertificates structure for the search key as it exists
in the log entry at <tt>position</tt>.</t>
        <t>If any search keys with the required prefix exist in the Prefix Tree in the log
entry at <tt>position</tt>, the <tt>prefix</tt> field contains an inclusion proof for all the
search keys returned in <tt>subdomains</tt>. If no search keys with the required prefix
exist, the <tt>prefix</tt> field contains a non-inclusion proof for the prefix.</t>
        <t>Clients rely on the structure of the Prefix Tree to authenticate whether or not
all subdomains have been provided yet by the Transparency Log. Clients may need
to make multiple requests to this endpoint, each time increasing the <tt>start</tt>
query parameter to reflect subdomains already consumed, if the total number of
subdomains exceeds a per-response limit.</t>
      </section>
      <section anchor="add-revocation">
        <name>Add Revocation</name>
        <t>Site Operators or Certificate Authorities access this endpoint for the
purpose of distributing revocations for their certificates.</t>
        <t>POST /add-revocation</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  Revocation revocation;
} AddRevocationRequest;
]]></sourcecode>
        <t>The request body is AddRevocationRequest. There is no response body; an HTTP
response status code of 204 indicates success, and a response status code in the
400-599 range indicates failure of the submission. The Transparency Log applies
the revocation by updating any DomainCertificates structures to exclude chains
that are affected by the revocation. The revocation <bcp14>SHOULD</bcp14> be applied to all
DomainCertificates structures within <tt>max_behind</tt> milliseconds.</t>
        <t>TODO define Revocation type</t>
      </section>
      <section anchor="get-revocations">
        <name>Get Revocations</name>
        <t>Site Operators access this endpoint to audit revocations affecting
their certificate chains.</t>
        <t>GET /get-revocations?bearer_token=X&amp;reference_id=Y{&amp;page=Z}</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  Revocation revocations<0..2^8-1>;
  optional<uint32> next;
} GetRevocationsResponse;
]]></sourcecode>
        <t>The <tt>bearer_token</tt> query parameter contains a bearer token obtained from the
Issue Token endpoint. The <tt>reference_id</tt> query parameter may contain the
zero-indexed offset of any domain name or IP address in the subjectAltName
extension of the leaf certificate associated with the provided bearer token. An
optional page number may be provided in the <tt>page</tt> query parameter. The <tt>page</tt>
parameter <bcp14>MUST</bcp14> be a value observed in the <tt>next</tt> field of a prior
GetRevocationsResponse.</t>
        <t>The response body is GetRevocationsResponse. The <tt>revocations</tt> field of the
response contains Revocation structures corresponding one-to-one with the
<tt>invalid_entries</tt> field of the most recent DomainCertificates structure in the
Certificate Subtree for the requested reference identifier. Note that the most
recent DomainCertificates structure may only have been published in a
provisional tree head at the time of the request. If the last entry of
<tt>revocations</tt> does not correspond to the last entry of <tt>invalid_entries</tt>, a page
number in <tt>next</tt> is provided to allow the client to make a follow-up request for
the next subset of revocations. The Transparency Log <bcp14>MUST</bcp14> set <tt>next</tt> such that,
if the <tt>invalid_entries</tt> field is modified while a client is requesting a series
of pages, the client will not miss any revocations that existed as of the first
request (with no <tt>page</tt> parameter) as a result.</t>
      </section>
    </section>
    <section anchor="extended-resolution-mechanisms">
      <name>Extended Resolution Mechanisms</name>
      <t>When clients observe a provisional inclusion proof, they retain condensed state
about the proof until they observe that the associated certificate chain was
properly included in the subsequent log entry. The primary mechanism by which
clients are expected to observe this is through future connections to the same
server. However, this may fail to happen for various reasons: the client may not
wish to contact the server again within the allotted time, the server may go
offline, or the server may simply decline to respond with a proof from the same
Transparency Log. As such, additional mechanisms are described to enable the
client to reach resolution on all provisional inclusion proofs it observes.</t>
      <section anchor="background-requests">
        <name>Background Requests</name>
        <t>When a client has an unresolved provisional inclusion proof, where the rightmost
log entry's timestamp is between <tt>5*max_behind</tt> and <tt>10*max_behind</tt> milliseconds
in the past, the client <bcp14>SHOULD</bcp14> attempt a single background request to the server
that provided the proof. A <strong>background request</strong> is a connection attempt that
is not initiated by a user and will not carry user request data. The client
advertises in its ClientHello only <tt>provisional</tt> tree head types where the
rightmost log entry has a timestamp more than <tt>max_behind</tt> milliseconds in the
past. If the connection succeeds, any certificate the server responds with will
necessarily provide the information the client needs to purge a previously
observed provisional inclusion proof from its state. Any additional provisional
inclusion proof provided by the server in such a connection <bcp14>SHOULD</bcp14> be
disregarded.</t>
      </section>
      <section anchor="oblivious-third-party">
        <name>Oblivious Third Party</name>
        <t>If provided, clients may attempt to contact a third-party service, potentially
operated by their software vendor, to request proof that a subsequent log entry
is constructed correctly. Such an endpoint could be contacted over Oblivious
HTTP <xref target="RFC9458"/> to preserve the client's privacy.</t>
        <!-- TODO Write more -->

</section>
      <section anchor="final-reporting">
        <name>Final Reporting</name>
        <t>If a client has been unable to resolve a provisional inclusion proof on its own,
and the rightmost log entry's timestamp is more than <tt>10*max_behind</tt>
milliseconds in the past, the client <bcp14>MUST</bcp14> report the provisional inclusion proof
to a party distinct from the issuing Certificate Authority and the operator of
the Transparency Log. After this, the client <bcp14>MAY</bcp14> delete the associated state.</t>
        <t>The purpose of reporting provisional inclusion proofs that are unable to be
resolved is to ensure that there is broader ecosystem awareness of a potential
issue with the Transparency Log. The extent to which there was any malicious
behavior or operational errors, and any corrective action to be taken,
would need to be decided out-of-band.</t>
      </section>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <section anchor="client-state">
        <name>Client State</name>
        <t>Clients retain the following state:</t>
        <ul spacing="normal">
          <li>
            <t>For each fork of each trusted Transparency Log:
            </t>
            <ul spacing="normal">
              <li>
                <t>The timestamp and Prefix Tree root hash for any observed log entries that
may be useful to advertise in the client's ClientHello:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>All observed log entries with a timestamp less than or equal to
<tt>max_behind</tt> milliseconds in the past.</t>
                  </li>
                  <li>
                    <t>The rightmost observed log entry with a timestamp more than <tt>max_behind</tt>
milliseconds in the past.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Any intermediate Log Tree nodes that are necessary to compute the most
recent Log Tree root hash from the retained log entries.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>For each provisional inclusion proof observed that has not been replaced with
a superseding provisional inclusion proof, or been shown to be included in the
subsequent log entry:
            </t>
            <ul spacing="normal">
              <li>
                <t>The domain or IP address of the host that presented the provisional proof.</t>
              </li>
              <li>
                <t>The ProvisionalTreeHead structure.</t>
              </li>
              <li>
                <t>The full subtrees of the Log Tree, as presented in the provisional proof.</t>
              </li>
              <li>
                <t>The authenticated reference identifiers</t>
              </li>
              <li>
                <t>The <tt>size</tt>, <tt>first_valid</tt>, and <tt>invalid_entries</tt> fields of each
<tt>SubtreeInclusionProof</tt> structure.</t>
              </li>
              <li>
                <t>The full subtrees of each Certificate Subtree.</t>
              </li>
              <li>
                <t>The bearer token and pre-shared key associated with the provisional
inclusion proof.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Clients <bcp14>MUST</bcp14> only update their stored state once a proof has been fully and
successfully verified. In addition, clients <bcp14>MUST</bcp14> be able to handle being shown
forked views of a Transparency Log.</t>
        <t>When a client advertises a provisional tree head to the server and the server
responds with a standard proof type, the server's response will necessarily
include proof that the certificate in the provisional tree head was correctly
included in the subsequent log entry. As such, the information retained about
the provisional inclusion proof is deleted. Similarly, when a client advertises
a provisional tree head to the server and the server responds with a provisional
proof type, the server's response will contain proof that the new provisional
inclusion proof supersedes (i.e., contains all the same certificates as) the
previous one. As such, state for the previous provisional inclusion proof is
deleted and replaced with state for the new one.</t>
        <t>Regardless of whether the server responds with a standard or provisional proof
type, if the server presents a new view of the Log Tree that the client was
previously unaware of, the client retains this new view for later use. If
possible, the client stores the new view as an extension of a
previously-observed view of the Transparency Log. However, if the view is
inconsistent with what the client has previously observed, then it is stored as
a new independent fork.</t>
      </section>
      <section anchor="server-behavior">
        <name>Server Behavior</name>
        <t>To prevent connection failure, it's critical that servers that implement the TLS
extension in <xref target="tls-extension"/> always have satisfactory proof to offer to
clients. Servers <bcp14>MUST</bcp14> implement the automatic refreshing of proofs and <bcp14>MUST</bcp14>
implement automatic failover between multiple trusted Transparency Logs in the
event that one is temporarily unavailable.</t>
        <t>Along this same line, it's also possible for a Transparency Log to sequence
incorrect information and no longer be able to provide acceptable proofs. This
can happen, for example, if a Transparency Log issues a provisional inclusion
proof for a certificate and then neglects to include the certificate in the
subsequent log entry. This is functionally equivalent to a prolonged outage, as
the server is unable to obtain an acceptable inclusion proof for its
certificate. As such, servers <bcp14>MUST</bcp14> verify proofs in the same manner as clients
and avoid serving proofs that fail verification, failing over to another
Transparency Log if necessary to get an acceptable proof.</t>
        <t>Given the substantial load that may be placed on Transparency Logs, especially
in scenarios where one log's traffic is failing over to others, servers have a
responsibility to minimize their individual impact on logs. Servers <bcp14>SHOULD NOT</bcp14>
attempt to refresh an inclusion proof from a Transparency Log until the
rightmost log entry's timestamp in the current inclusion proof is more than
<tt>max_behind*3/4</tt> milliseconds in the past. Servers <bcp14>SHOULD NOT</bcp14> contact a
Transparency Log about the same inclusion proof more than 3 times within
<tt>max_behind</tt> milliseconds.</t>
        <t>Finally, servers <bcp14>MUST</bcp14> generate the bearer tokens that are provided to clients in
a way that, when the bearer token is advertised back to the server, does not
degrade the client's privacy. One suggested way to do this would be to make the
bearer token a symmetric encryption of an identifier for the associated
provisional certificate along with a 12- or 16-byte random value. The random
value would then be used to compute the pre-shared key to give the client. When
the client later advertises the bearer token back, it can be decrypted by the
server to identify the provisional certificate to respond with and to re-compute
the pre-shared key for the connection. This minimizes the server operational burden
and also effectively preserves client privacy.</t>
      </section>
      <section anchor="handling-forks">
        <name>Handling Forks</name>
        <t>There are several long-term expectations placed on Transparency Logs that, in
practice, will almost certainly fail to be upheld. In particular, Transparency
Logs are generally expected to be append-only, meaning that log entries are never
removed once they've been added. However, enforcing this strictly is
incompatible with many of the standard best-practices for operating reliable
software systems. For example, if this property needed to be enforced strictly,
it would be pointless to back up such a Transparency Log. Restoring from backup
would imply some degree of rollback and this would be unacceptable. As such, it
is necessary for the protocol to handle reasonable violations of these
expectations gracefully, and in a way that preserves overall security.</t>
        <t>As discussed in <xref target="client-state"/>, clients <bcp14>MUST</bcp14> be able to handle forked views of
a Transparency Log gracefully. When a client becomes aware of a fork, it <bcp14>MUST</bcp14>
report the fork to a party distinct from the issuing Certificate Authority and
the operator of the Transparency Log. Going forward, as long as the client is
aware of multiple forks where the timestamps of the rightmost log entries differ
by less than <tt>max_behind</tt> milliseconds, the client <bcp14>MUST NOT</bcp14> advertise in its
ClientHello a <tt>standard</tt> tree head type with a tree size past where any such
fork occurs. This minimizes the risk of connection failure when connecting to
servers that have inclusion proofs from different forks.</t>
        <t>If a client advertised a non-zero <tt>standard</tt> tree head type and proof
verification failed only at the final signature verification step (or at direct
comparison of the Prefix Tree root hash, in the case of <tt>SameHeadProof</tt>), this
may indicate that there is a fork the client is unaware of. The client <bcp14>MAY</bcp14>
attempt to reconnect to the server while advertising a zero <tt>standard</tt> tree head
type. This will prompt the server to provide additional intermediate nodes,
allowing the client to compute the correct Log Tree root hash for signature
verification to succeed.</t>
        <t>Excluding the production of forks, the other ways that a Transparency Log can
fail are much simpler to handle because we know that the client and server agree
on the state of the log. These cases are handled by the provisions of
<xref target="server-behavior"/>.</t>
      </section>
    </section>
    <section anchor="certificate-authority">
      <name>Certificate Authority</name>
      <section anchor="poison-extension">
        <name>Poison Extension</name>
        <t>A trivial downgrade attack is possible where a host refuses to acknowledge the
presence of the "transparency_revocation" TLS extension in an attempt to circumvent
the stronger transparency or non-revocation requirements. Customers of a
Certificate Authority can mitigate such an attack by including a special
non-critical poison extension (OID TODO, whose extnValue OCTET STRING contains
ASN.1 NULL data (0x05 0x00)) in all certificates they issue.</t>
        <t>Clients that advertise the "transparency_revocation" extension in their
ClientHello <bcp14>MUST</bcp14> reject a certificate that contains the extension if it is not
provided with an appropriate inclusion proof.</t>
        <!-- ## Configuration Distribution

TODO ACME extension where CA provides information about which Transparency Logs
will accept a certificate? To avoid server implementation lock-in of logs. -->

</section>
    </section>
    <section anchor="performance-considerations">
      <name>Performance Considerations</name>
      <t>This section contains brief a analysis of the performance impacts of the system.</t>
      <section anchor="transparency-log-1">
        <name>Transparency Log</name>
        <t><strong>Storage.</strong> The storage of a Transparency Log is long-term bounded (i.e.,
Transparency Logs will not grow infinitely) and is dominated by the cost of
storing <em>unexpired</em> certificate chains. Certificate chains can be purged once
they have expired and are at the leftmost edge of the Certificate Subtree. Any
associated revocations can be purged once the associated certificate chains have
been. Subtrees of the Log Tree and Prefix Tree may be purged once they are no
longer necessary to the protocol. For specific leaves of the Log Tree, this
occurs once they are older than <tt>maximum_lifetime</tt> milliseconds. For subtrees of
the Prefix Tree, this occurs once all certificate chains stored in the subtree
have expired.</t>
        <t><strong>Bandwidth.</strong> A TLS server maintaining a valid inclusion proof for a single
certificate chain is expected to make the following requests to a Transparency
Log:</t>
        <ol spacing="normal" type="1"><li>
            <t>When a new certificate chain is first issued, the server will initialize its
state (a Get Tree request) and submit the chain to receive a provisional
inclusion proof (an Add Chain request).</t>
          </li>
          <li>
            <t>From then on, the server will regularly obtain the most recent tree head (a
Get Tree request with the <tt>tree_size</tt> parameter provided) and refresh its
inclusion proof (a Refresh Proof request).</t>
          </li>
        </ol>
        <t>The table below provides formulas for the size in bytes of the Transparency
Log's response to each query. Each variable in the formulas is also given a
"typical" value which is used to estimate the total bandwidth commitment of a
Transparency Log.</t>
        <dl>
          <dt><strong>S</strong></dt>
          <dd>
            <t>The size of one cryptographic signature in bytes. For the purpose of computing
an estimate, S is assumed to be 64 bytes as this is the size of a typical
elliptic curve signature.</t>
          </dd>
          <dt><strong>N</strong></dt>
          <dd>
            <t>The height of the Log Tree. Based on a Transparency Log that sequences two new
log entries per day, and that has been operating for 365 days, N is estimated
to be 11.</t>
          </dd>
          <dt><strong>P</strong></dt>
          <dd>
            <t>The average height of the Prefix Tree. Based on a Transparency Log that stores
300 million unique identifiers, P is estimated to be 30.</t>
          </dd>
          <dt><strong>M</strong></dt>
          <dd>
            <t>The average height of a Certificate Subtree. Based on an assumption that a
typical Site Operator will issue several hundred certificates, M is estimated
to be 10.</t>
          </dd>
        </dl>
        <table>
          <thead>
            <tr>
              <th align="left">Response Type</th>
              <th align="left">Formula</th>
              <th align="left">Estimated Size</th>
              <th align="left">Count</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">GetTreeResponse (full)</td>
              <td align="left">694 + S + 52*N</td>
              <td align="left">1330</td>
              <td align="left">1</td>
            </tr>
            <tr>
              <td align="left">GetTreeResponse (abridged)</td>
              <td align="left">54 + S</td>
              <td align="left">118</td>
              <td align="left">179</td>
            </tr>
            <tr>
              <td align="left">AddChainResponse</td>
              <td align="left">51 + S + 32<em>P + 32</em>M</td>
              <td align="left">1395</td>
              <td align="left">1</td>
            </tr>
            <tr>
              <td align="left">RefreshProofResponse</td>
              <td align="left">15 + 32*P</td>
              <td align="left">975</td>
              <td align="left">179</td>
            </tr>
          </tbody>
        </table>
        <t>The "Count" column of the table contains the number of times each response will
be served to a client, assuming a certificate lifetime of 3 months and that the
server refreshes its proof twice every day and a half. As such, it's estimated
that supporting a single Site Operator requires an outbound bandwidth commitment
from a Transparency Log of approximately 0.2 bits per second.</t>
      </section>
      <section anchor="tls-server">
        <name>TLS Server</name>
        <t>One particularly salient concern about the future of the <xref target="RFC6962"/> ecosystem
is that it requires a multitude of signatures from different co-signers and this
may not translate well to a world where those signatures are required to come
from post-quantum signature schemes. Post-quantum signature schemes produce
signatures that are substantially larger than classical ones, and transmitting a
significant number of them in the TLS handshake will degrade performance.</t>
        <t>The appeal of the system described in this document is that it replaces up to
three signatures (two from distinct Certificate Transparency logs and one from
an OCSP staple) with either one or zero signatures.</t>
        <t>In the TLS extension described in <xref target="tls-extension"/>, the most common response
one would expect in the TLS server's Certificate message is a
<tt>SameHeadProof</tt>. This is because clients make an effort to advertise the
specific version of the Transparency Log that the server can provide a proof for
without also transmitting a signature.</t>
        <t>Using the variables from the previous subsection, the size in bytes of a
<tt>SameHeadProof</tt> is <tt>15 + 32*P + 32*M</tt>, which would then be estimated at 1295
bytes in a typical deployment. Compared to transmitting three ML-DSA-44
signatures, which would add to 7680 bytes, this is an 83% reduction.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="clienthello-extension">
        <name>ClientHello Extension</name>
        <t>Given that ClientHello extensions are sent unencrypted, this portion of the
extension was designed to avoid unnecessary privacy leaks. In particular, care
was taken to avoid leaking what certificate(s) the client may have been
shown in previous connections and what other hosts the client may have
contacted recently.</t>
        <t>Clients advertise a recently observed tree size for each Transparency Log
that they support receiving inclusion proofs from. Since clients will
generally only "observe" various tree sizes of a Transparency Log by
communicating with hosts that provide proofs from that Transparency Log, and
since different hosts will update their proofs at different times, this may
cause a privacy leak. Specifically, it could happen that a client
communicates with a host that uses proofs from a very recently-created tree
size. If the client advertised this very recently-created tree size to other
hosts, it would reveal who they previously communicated with.</t>
        <t>To mitigate this, clients only advertise tree sizes where the timestamp of
the rightmost log entry is sufficiently old. This time delay ensures that
the inclusion proof provided by almost any host could've conveyed the same
tree size, creating a large anonymity set.</t>
        <t>When a client observes a provisional inclusion proof from a host, they
retain condensed information about it to allow them to later verify that the
information it contained was properly integrated into the Transparency Log. The
primary avenue for obtaining this verification is advertising knowledge of the
provisional proof back to the host that it came from, hoping to get the
necessary information in-band.</t>
        <t>Since provisional inclusion proofs must be issued quickly, they don't have time
to build up a large anonymity set with other hosts. Instead of having clients
advertise knowledge of a specific provisional proof in their ClientHello, they
instead use a bearer token that was provided by the host. These bearer tokens
are provided in the encrypted Certificate message whenever a provisional proof
is shown by the host. Similarly, when the bearer token is redeemed (i.e., when
the host shows that the provisional proof was correctly integrated into the
Transparency Log), this information is provided in the encrypted Certificate
message. As such, if the host generates the bearer token in a secure way, a
passive network observer never sees anything that would identify the certificate
shown to the client.</t>
        <t>Each bearer token is additionally associated with a pre-shared key which is
provided to the TLS key schedule. This prevents an active attacker from
establishing a TLS connection to the host, advertising an observed bearer token,
and learning which certificate is provided.</t>
        <t>Finally, note that it is not a goal to prevent an attacker from learning whether
a client has previously contacted a host <em>at all</em> before. The protocol
explicitly relies on the client's stored state to remain secure while sending
minimal data over the wire. A passive observer of network traffic could
trivially determine from the size of the encrypted portion of the handshake
messages whether such state was present or not, and therefore whether the host
had been contacted before. Similarly, it is not a goal to prevent a host from
identifying the same client over many connections.</t>
      </section>
      <section anchor="downgrade-prevention">
        <name>Downgrade Prevention</name>
        <t>The stronger transparency and non-revocation guarantees this protocol provides
would be irrelevant if a malicious actor could cause the TLS client to disable
them at-will. An attacker may have, for example, a revoked certificate to which
they know the private key. This would allow them to fully intercept a client's
connection to a host and attempt to impersonate the host. In a
downgraded version of TLS, the client may not enforce revocation at all and
therefore the attacker's interception would succeed.</t>
        <t>Site Operators that have deployed this protocol and wish to prevent capable TLS
clients from being downgraded can include a poison extension in their TLS
certificates, as described in <xref target="poison-extension"/>. The poison extension will be
silently ignored by TLS clients that genuinely do not support it, but will cause
updated clients to abort the protocol in downgrade scenarios.</t>
        <t>Site Operators can monitor the existing <xref target="RFC6962"/> ecosystem to detect
any certificates that have been issued without the poison extension,
potentially permitting downgrades. However, the creation of such a certificate
without the Site Operator's consent would imply mis-issuance by a Certificate
Authority rather than abuse of a compromised/revoked certificate.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <ul spacing="normal">
        <li>
          <t>Codepoint for TLS extension "transparency_revocation"</t>
        </li>
        <li>
          <t>Registry for transparency_log_id(?)</t>
        </li>
        <li>
          <t>OID for poison extension</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="KEYTRANS">
          <front>
            <title>Key Transparency Protocol</title>
            <author fullname="Brendan McMillion" initials="B." surname="McMillion">
         </author>
            <author fullname="Felix Linker" initials="F." surname="Linker">
         </author>
            <date day="4" month="June" year="2025"/>
            <abstract>
              <t>   While there are several established protocols for end-to-end
   encryption, relatively little attention has been given to securely
   distributing the end-user public keys for such encryption.  As a
   result, these protocols are often still vulnerable to eavesdropping
   by active attackers.  Key Transparency is a protocol for distributing
   sensitive cryptographic information, such as public keys, in a way
   that reliably either prevents interference or detects that it
   occurred in a timely manner.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-protocol-01"/>
        </reference>
        <reference anchor="RFC4291">
          <front>
            <title>IP Version 6 Addressing Architecture</title>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <date month="February" year="2006"/>
            <abstract>
              <t>This specification defines the addressing architecture of the IP Version 6 (IPv6) protocol. The document includes the IPv6 addressing model, text representations of IPv6 addresses, definition of IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6 node's required addresses.</t>
              <t>This document obsoletes RFC 3513, "IP Version 6 Addressing Architecture". [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4291"/>
          <seriesInfo name="DOI" value="10.17487/RFC4291"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CRLSets" target="https://www.chromium.org/Home/chromium-security/crlsets/">
          <front>
            <title>Chromium Security &gt; CRLSets</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CRLite" target="https://blog.mozilla.org/security/2020/01/09/crlite-part-1-all-web-pki-revocations-compressed/">
          <front>
            <title>Introducing CRLite: All of the Web PKI’s revocations, compressed</title>
            <author initials="J.C." surname="Jones" fullname="J.C. Jones">
              <organization/>
            </author>
            <author>
              <organization>Mozilla</organization>
            </author>
            <date year="2020" month="January" day="09"/>
          </front>
        </reference>
        <reference anchor="Clubcards" target="https://research.mozilla.org/files/2025/04/clubcards_for_the_webpki.pdf">
          <front>
            <title>Clubcards for the WebPKI: smaller certificate revocation tests in theory and practice</title>
            <author initials="J. M." surname="Schanck" fullname="John M. Schanck">
              <organization/>
            </author>
            <author>
              <organization>Mozilla</organization>
            </author>
            <date year="2025" month="April" day="01"/>
          </front>
        </reference>
        <reference anchor="ProtonKT" target="https://proton.me/support/key-transparency">
          <front>
            <title>What is Key Transparency?</title>
            <author>
              <organization>Proton</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="AppleKT" target="https://security.apple.com/blog/imessage-contact-key-verification/">
          <front>
            <title>Advancing iMessage security: iMessage Contact Key Verification</title>
            <author>
              <organization>Apple</organization>
            </author>
            <date year="2023" month="October" day="27"/>
          </front>
        </reference>
        <reference anchor="MetaKT" target="https://engineering.fb.com/2023/04/13/security/whatsapp-key-transparency/">
          <front>
            <title>Deploying key transparency at WhatsApp</title>
            <author>
              <organization>Meta</organization>
            </author>
            <date year="2023" month="April" day="13"/>
          </front>
        </reference>
        <reference anchor="KeyTransWG" target="https://datatracker.ietf.org/wg/keytrans/about/">
          <front>
            <title>Key Transparency (keytrans) Working Group</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CertLifetimes" target="https://groups.google.com/a/groups.cabforum.org/g/servercert-wg/c/bvWh5RN6tYI">
          <front>
            <title>SC-081v3: Introduce Schedule of Reducing Validity and Data Reuse Periods</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC6962">
          <front>
            <title>Certificate Transparency</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Kasper" initials="E." surname="Kasper"/>
            <date month="June" year="2013"/>
            <abstract>
              <t>This document describes an experimental protocol for publicly logging the existence of Transport Layer Security (TLS) certificates as they are issued or observed, in a manner that allows anyone to audit certificate authority (CA) activity and notice the issuance of suspect certificates as well as to audit the certificate logs themselves. The intent is that eventually clients would refuse to honor certificates that do not appear in a log, effectively forcing CAs to add all issued certificates to the logs.</t>
              <t>Logs are network services that implement the protocol operations for submissions and queries that are defined in this document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6962"/>
          <seriesInfo name="DOI" value="10.17487/RFC6962"/>
        </reference>
        <reference anchor="RFC7633">
          <front>
            <title>X.509v3 Transport Layer Security (TLS) Feature Extension</title>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker"/>
            <date month="October" year="2015"/>
            <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="RFC9458">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <abstract>
              <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </reference>
      </references>
    </references>
    <?line 1756?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+296ZYbSZYm9t+ewjtqNCRjAJDBLTNZSzaTubGLmaRIVuWU
+rQYDsABeIfDHQ13RCSKxT56Df3Ts+hR9CS6q9k1dwMiyKxWz9FkHWk6iQBs
uXbtLt9dbDweu67squJJdvK6qMp8WhXZ221et5t8W9SzfZbX8+x1cdnM8q5s
6uyHYrbK67JdtycOPiqWzXb/JCvrRePcvJnV+RqGmm/zRTdez9ZlVcGPxl3V
jjsz6HjrBxzfu+fa3XRdti38q9tv4OfPv3n7rat362mxfeLmMMkTN2vqtqjb
Xfsk67a7wl0+yR44GCx/kr355pm7arYXy22z2zzJ3r54k/0E/yzrZfYdfuQu
ij38ff7EXRb1DsbKsmXZrXZT2PJXsJz7987u3eUVH1jjCfykgmW0Hfxk1XWb
9sndu/rTCQ82KZvjg9z9CKJMVt26OnEu33WrBmiQjWEFWbbYVRUTmBY+z+E4
Zj/wcCf0jWKdlxX8ecp/9pP94xL/MJk16xMdrKyBlidfT7KXt77aloUMYKb4
GpZTx39ttks4+7/SGuEb3zXNEtjlxYtn0ex5u1+vi25bzv5xSd/AeRN7+Lqo
gZGyf8pnF22TnuGH5q+wgTwaviy6xT/O6bfjf+XfTnYXztXNdg2/u4QTdsiP
4V9Z9uz1izdF1z6hcYTfn622zbrcrbM3xWy3Lbt99gf9Hn8t3y4LOHE98Kur
q8lMfjOBdd79vlkXd/WTcSuj3J1tqxbGuCvzll0RTXvyvO62zXw3QwaVv2dP
qyprFlm3KrKfimn26o/P/5//4/9ss8AR7SgDIm62RdsW85Pk+qZVs5ysmWC0
Pr+i+/fu37t77+zuvS9wcTDhGFiuG5+N86oaXxXT8eaiNNzXjsNUd2kquoMZ
DjO+dza+9wV96JmT/jfO+FT/afJskv1TUxet/wOs5UkmJ0lEqXbTWb6dx8dx
4j/O4OyUFECJJ1m7hoUW22xWbLtyUaLYMaTJ8GK2wM/4G5BGJLE223zWlbMi
TSrYW5FvZ6uIXIuyKlqk1aO79x7enelq3sFq3sHI74BQQKfJZr6IafJofO8h
kOUYTZoV3NRJ9gZF5+ziIGFebZuuqf/4NqbLT6u8y+Ce/LHYR5L5y/TeNjTI
BFiz3W02zba7C/IvEjTJldJaeAG4lKebTVX0V/J0fgnrR74tfwDuyJdFpjz2
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
Z2Lf0w03Jjbkg8uu16f1BViUW8DbuQolqtK107+jtSVqRVVbSE63yueMUgdC
K2GN6Dl6tnwuxJR6r9Q15Fo2UfscXKP6em/sM5r0tc8RecWDclz+YIIG17ZE
GRrLXQ7f6IpCQgU+DVLDNM4nVJYg6qriEjESKmnxDQIyqjoSY5UtW72hIaVo
XraUbErWRd6N0W7GcG9gcPVPeuUzOQWBL3rhXW1awLFnyfMp2J6GP+M7oZIi
xf5nZNlwvSvlQ2m2gbC5i2WBnBGBjSEZplxjMWJTa2yINQ4WzTqftTO3wAJQ
IsoYVGRNcmdtl0q+pZopKdxHYW4h0602LJwcVH6Bweda9XpLhvw+9ufVnPfn
zM17uNmUL17LN4QHYwmafxuCEnKp2NdscqY1H4yG9HNvvE1BI0UhiLztY0j8
awsjiZDqjypvSoPbUrEBD945Cafecxa0d1CMO5AbKEMaIro6pSVccnyMgMtS
kWsdu3HzMECD5nHoU8IUg8WG5CxfoTMkPWUyNXXZSTSPOrkh/ZL4Ld0RkHKz
zvVaDB16h0cRpy5Bo5Ez3XIQoVTAxq+8jZqVFeKMML9qwx+j4O1k0T5vceec
ovY2AuVpr8t2jOukjBlqFWVtmZDuBWOsFKjNpzt5jYjCncBw6H7eTVx/Tqx7
/vTHpwOAaAyfAKv7lsAxbHkwBQt+97pYYn6TpITb74Hr+K6c3/7yDnwLs8nw
C32Kw8zjMTkbuLSnPhGPct/c+ycMKxfz358s8qotTj5IApVJ2Zu4/xdtiH4d
+00BAA==

-->

</rfc>
