Skip to content

Commit 065f08e

Browse files
author
ID Bot
committed
Script updating gh-pages from 4bac203. [ci skip]
1 parent 98f61c5 commit 065f08e

3 files changed

Lines changed: 60 additions & 61 deletions

File tree

draft-davidben-tls-merkle-tree-certs.html

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,7 +1051,7 @@
10511051
</tr></thead>
10521052
<tfoot><tr>
10531053
<td class="left">Benjamin, et al.</td>
1054-
<td class="center">Expires 9 January 2026</td>
1054+
<td class="center">Expires 10 January 2026</td>
10551055
<td class="right">[Page]</td>
10561056
</tr></tfoot>
10571057
</table>
@@ -1064,12 +1064,12 @@
10641064
<dd class="internet-draft">draft-davidben-tls-merkle-tree-certs-latest</dd>
10651065
<dt class="label-published">Published:</dt>
10661066
<dd class="published">
1067-
<time datetime="2025-07-08" class="published">8 July 2025</time>
1067+
<time datetime="2025-07-09" class="published">9 July 2025</time>
10681068
</dd>
10691069
<dt class="label-intended-status">Intended Status:</dt>
10701070
<dd class="intended-status">Experimental</dd>
10711071
<dt class="label-expires">Expires:</dt>
1072-
<dd class="expires"><time datetime="2026-01-09">9 January 2026</time></dd>
1072+
<dd class="expires"><time datetime="2026-01-10">10 January 2026</time></dd>
10731073
<dt class="label-authors">Authors:</dt>
10741074
<dd class="authors">
10751075
<div class="author">
@@ -1130,7 +1130,7 @@ <h2 id="name-status-of-this-memo">
11301130
time. It is inappropriate to use Internet-Drafts as reference
11311131
material or to cite them other than as "work in progress."<a href="#section-boilerplate.1-3" class="pilcrow"></a></p>
11321132
<p id="section-boilerplate.1-4">
1133-
This Internet-Draft will expire on 9 January 2026.<a href="#section-boilerplate.1-4" class="pilcrow"></a></p>
1133+
This Internet-Draft will expire on 10 January 2026.<a href="#section-boilerplate.1-4" class="pilcrow"></a></p>
11341134
</section>
11351135
</div>
11361136
<div id="copyright">
@@ -2177,7 +2177,7 @@ <h2 id="name-issuance-logs">
21772177
</h2>
21782178
<p id="section-5-1">This section defines the structure of an <em>issuance log</em>.<a href="#section-5-1" class="pilcrow"></a></p>
21792179
<p id="section-5-2">An issuance log describes an append-only sequence of <em>entries</em> (<a href="#log-entries" class="auto internal xref">Section 5.3</a>), identified consecutively by an index value, starting from zero. Each entry is an assertion that the CA has certified. The entries in the issuance log are represented as a Merkle Tree, described in <span><a href="https://rfc-editor.org/rfc/rfc9162#section-2.1" class="relref">Section 2.1</a> of [<a href="#RFC9162" class="cite xref">RFC9162</a>]</span>.<a href="#section-5-2" class="pilcrow"></a></p>
2180-
<p id="section-5-3">Issuance logs have an interface for the log operator, i.e. the CA, to add entries. Unlike <span>[<a href="#RFC6962" class="cite xref">RFC6962</a>]</span> and <span>[<a href="#RFC9162" class="cite xref">RFC9162</a>]</span>, this interface is not publicly accessible. The log only contains entries which the log operator themselves has chosen to add. As entries are added, the Merkle Tree is updated to be computed over the new sequence.<a href="#section-5-3" class="pilcrow"></a></p>
2180+
<p id="section-5-3">Unlike <span>[<a href="#RFC6962" class="cite xref">RFC6962</a>]</span> and <span>[<a href="#RFC9162" class="cite xref">RFC9162</a>]</span>, an issuance log does not have a public submission interface. The log only contains entries which the log operator, i.e. the CA, chose to add. As entries are added, the Merkle Tree is updated to be computed over the new sequence.<a href="#section-5-3" class="pilcrow"></a></p>
21812181
<p id="section-5-4">A snapshot of the log is known as a <em>checkpoint</em>. A checkpoint is identified by its <em>tree size</em>, that is the number of elements comitted to the log at the time. Its contents can be described by the Merkle Tree Hash (<span><a href="https://rfc-editor.org/rfc/rfc9162#section-2.1.1" class="relref">Section 2.1.1</a> of [<a href="#RFC9162" class="cite xref">RFC9162</a>]</span>) of entries zero through <code>tree_size - 1</code>.<a href="#section-5-4" class="pilcrow"></a></p>
21822182
<p id="section-5-5">Cosigners (<a href="#cosigners" class="auto internal xref">Section 5.4</a>) sign assertions about the state of the issuance log. A Merkle Tree CA operates a combination of an issuance log and one or more CA cosigners (<a href="#certification-authority-cosigners" class="auto internal xref">Section 5.5</a>) that authenticate the log state and certifies the contents. External cosigners may also be deployed to assert correct log operation or provide other services to relying parties (<a href="#trusted-cosigners" class="auto internal xref">Section 7.3</a>).<a href="#section-5-5" class="pilcrow"></a></p>
21832183
<div id="log-parameters">
@@ -2273,10 +2273,10 @@ <h3 id="name-log-entries">
22732273
<h3 id="name-cosigners">
22742274
<a href="#section-5.4" class="section-number selfRef">5.4. </a><a href="#name-cosigners" class="section-name selfRef">Cosigners</a>
22752275
</h3>
2276-
<p id="section-5.4-1">This section defines a log <em>cosigner</em>. A cosigner is a class of role that follows some append-only view of the log and signs subtrees (<a href="#subtrees" class="auto internal xref">Section 4</a>) consistent with that view. The signatures generated by a cosigner are known as <em>cosignatures</em>. The cosigner is responsible for ensuring that all subtrees it signs are consistent with each other. The cosigner may be external to the log, in which case it might ensure consistency by checking consistency proofs as it updates its internal state. The cosigner may be operated together with the log, in which case it can trust its log state.<a href="#section-5.4-1" class="pilcrow"></a></p>
2277-
<p id="section-5.4-2">Different cosigners may perform different roles. When a cosigner signs a subtree, it can additionally make cosigner-specific assertions about the log state described by the subtree. This document defines one concrete cosigner role, a CA cosigner (<a href="#certification-authority-cosigners" class="auto internal xref">Section 5.5</a>), to authenticate the log and certify entries. Other documents and specific deployments may define other cosigner roles, to perform different functions in a PKI. For example, <span>[<a href="#TLOG-WITNESS" class="cite xref">TLOG-WITNESS</a>]</span> defines a cosigner that only checks the log is append-only, and <span>[<a href="#TLOG-MIRROR" class="cite xref">TLOG-MIRROR</a>]</span> defines a cosigner that mirrors a log.<a href="#section-5.4-2" class="pilcrow"></a></p>
2278-
<p id="section-5.4-3">Each cosigner has a public key and a <em>cosigner ID</em>, which uniquely identifies the cosigner. The cosigner ID is a trust anchor ID <span>[<a href="#I-D.ietf-tls-trust-anchor-ids" class="cite xref">I-D.ietf-tls-trust-anchor-ids</a>]</span>. By identifying the cosigner, the cosigner ID specifies both the public key and the role-specific assertions made by the cosigner's signatures. If a single operator performs multiple cosigner roles in an ecosystem, each role MUST use a distinct cosigner ID and SHOULD use a distinct key.<a href="#section-5.4-3" class="pilcrow"></a></p>
2279-
<p id="section-5.4-4">A single cosigner, with a single cosigner name and public key, MAY generate cosignatures for multiple logs. In this case, signed subtrees only need to be consistent with others for the same log.<a href="#section-5.4-4" class="pilcrow"></a></p>
2276+
<p id="section-5.4-1">This section defines a log <em>cosigner</em>. A cosigner follows some append-only view of the log and signs subtrees (<a href="#subtrees" class="auto internal xref">Section 4</a>) consistent with that view. The signatures generated by a cosigner are known as <em>cosignatures</em>. All subtrees signed by a cosigner MUST be consistent with each other. The cosigner may be external to the log, in which case it might ensure consistency by checking consistency proofs. The cosigner may be operated together with the log, in which case it can trust its log state.<a href="#section-5.4-1" class="pilcrow"></a></p>
2277+
<p id="section-5.4-2">A cosignature MAY implicitly make additional statements about a subtree, determined by the cosigner's role. This document defines one concrete cosigner role, a CA cosigner (<a href="#certification-authority-cosigners" class="auto internal xref">Section 5.5</a>), to authenticate the log and certify entries. Other documents and specific deployments may define other cosigner roles, to perform different functions in a PKI. For example, <span>[<a href="#TLOG-WITNESS" class="cite xref">TLOG-WITNESS</a>]</span> defines a cosigner that only checks the log is append-only, and <span>[<a href="#TLOG-MIRROR" class="cite xref">TLOG-MIRROR</a>]</span> defines a cosigner that mirrors a log.<a href="#section-5.4-2" class="pilcrow"></a></p>
2278+
<p id="section-5.4-3">Each cosigner has a public key and a <em>cosigner ID</em>, which uniquely identifies the cosigner. The cosigner ID is a trust anchor ID <span>[<a href="#I-D.ietf-tls-trust-anchor-ids" class="cite xref">I-D.ietf-tls-trust-anchor-ids</a>]</span>. By identifying the cosigner, the cosigner ID specifies both the public key and the additional statements made by the cosigner's signatures. If a single operator performs multiple cosigner roles in an ecosystem, each role MUST use a distinct cosigner ID and SHOULD use a distinct key.<a href="#section-5.4-3" class="pilcrow"></a></p>
2279+
<p id="section-5.4-4">A single cosigner, with a single cosigner ID and public key, MAY generate cosignatures for multiple logs. In this case, signed subtrees only need to be consistent with others for the same log.<a href="#section-5.4-4" class="pilcrow"></a></p>
22802280
<div id="signature-format">
22812281
<section id="section-5.4.1">
22822282
<h4 id="name-signature-format">
@@ -2307,7 +2307,7 @@ <h4 id="name-signature-format">
23072307
<p id="section-5.4.1-3"><code>log_id</code> MUST be the issuance log's ID (<a href="#log-ids" class="auto internal xref">Section 5.2</a>), in its binary representation (<span><a href="https://datatracker.ietf.org/doc/html/draft-ietf-tls-trust-anchor-ids-01#section-3" class="relref">Section 3</a> of [<a href="#I-D.ietf-tls-trust-anchor-ids" class="cite xref">I-D.ietf-tls-trust-anchor-ids</a>]</span>). <code>start</code> and <code>end</code> MUST define a valid subtree of the log, and <code>hash</code> MUST be the subtree's hash value in the cosigner's view of the log. The <code>label</code> is a fixed prefix for domain separation. Its value MUST be the string <code>mtc-subtree/v1</code>, followed by a newline (U+000A), followed by a zero byte (U+0000). <code>cosigner_id</code> MUST be the cosigner ID, in its binary representation.<a href="#section-5.4.1-3" class="pilcrow"></a></p>
23082308
<p id="section-5.4.1-4">The resulting signature is known as a <em>subtree signature</em>. When <code>start</code> is zero, the resulting signature describes the checkpoint with tree size <code>end</code> and is also known as a <em>checkpoint signature</em>.<a href="#section-5.4.1-4" class="pilcrow"></a></p>
23092309
<p id="section-5.4.1-5">For each supported log, a cosigner retains its checkpoint signature with the largest <code>end</code>. This is known as the cosigner's <em>current</em> checkpoint. If the cosigner's current checkpoint has tree size <code>tree_size</code>, it MUST NOT generate a signature for a subtree <code>[start, end)</code> if <code>start &gt; 0</code> and <code>end &gt; tree_size</code>. That is, a cosigner can only sign a non-checkpoint subtree if it is contained in its current checkpoint. In a correctly-operated cosigner, every signature made by the cosigner can be proven consistent with its current checkpoint with a subtree consistency proof (<a href="#subtree-consistency-proofs" class="auto internal xref">Section 4.3</a>). As a consequence, a cosigner that signs a subtree is held responsible for all the entries in the tree of size matching the subtree end, even if the corresponding checkpoint is erroneously unavailable.<a href="#section-5.4.1-5" class="pilcrow"></a></p>
2310-
<p id="section-5.4.1-6">Before signing a subtree, the cosigner MUST ensure that <code>hash</code> is consistent with its log state. Different cosigner roles may obtain this assurance differently. For example, a cosigner may compute the hash from its saved log state (e.g. if it is the log operator or maintains a copy of the log) or by verifying a subtree consistency proof (<a href="#subtree-consistency-proofs" class="auto internal xref">Section 4.3</a>) from its current checkpoint. When a cosigner signs a subtree, it is held responsible <em>both</em> for the subtree being consistent with its other signatures, <em>and</em> for any cosigner-specific assertions made on the subtree being signed.<a href="#section-5.4.1-6" class="pilcrow"></a></p>
2310+
<p id="section-5.4.1-6">Before signing a subtree, the cosigner MUST ensure that <code>hash</code> is consistent with its log state. Different cosigner roles may obtain this assurance differently. For example, a cosigner may compute the hash from its saved log state (e.g. if it is the log operator or maintains a copy of the log) or by verifying a subtree consistency proof (<a href="#subtree-consistency-proofs" class="auto internal xref">Section 4.3</a>) from its current checkpoint. When a cosigner signs a subtree, it is held responsible <em>both</em> for the subtree being consistent with its other signatures, <em>and</em> for the cosigner-specific additional statements.<a href="#section-5.4.1-6" class="pilcrow"></a></p>
23112311
<p id="section-5.4.1-7">Cosigners SHOULD publish their current checkpoint, along with the checkpoint signature.<a href="#section-5.4.1-7" class="pilcrow"></a></p>
23122312
<p id="section-5.4.1-8">[[TODO: CT and tlog put timestamps in checkpoint signatures. Do we want them here? In CT and tlog, the timestamps are monotonically increasing as the log progresses, but we also sign subtrees. We can separate subtree and checkpoint signatures, with timestamps only in the latter, but it's unclear if there is any benefit to this.]]<a href="#section-5.4.1-8" class="pilcrow"></a></p>
23132313
</section>
@@ -2349,8 +2349,8 @@ <h3 id="name-certification-authority-cos">
23492349
<a href="#section-5.5" class="section-number selfRef">5.5. </a><a href="#name-certification-authority-cos" class="section-name selfRef">Certification Authority Cosigners</a>
23502350
</h3>
23512351
<p id="section-5.5-1">A <em>CA cosigner</em> is a cosigner (<a href="#cosigners" class="auto internal xref">Section 5.4</a>) that certifies the contents of a log.<a href="#section-5.5-1" class="pilcrow"></a></p>
2352-
<p id="section-5.5-2">When a CA cosigner signs a subtree, it provides the additional guarantee that it has certified the contents of each entry in the subtree. For example, a domain-validating CA would be held responsible for having performed domain validation for all such entries, at some time consistent with the validity dates in each entry.<a href="#section-5.5-2" class="pilcrow"></a></p>
2353-
<p id="section-5.5-3">Entries are extensible, so each entry type determines the semantics of what the CA is certifying:<a href="#section-5.5-3" class="pilcrow"></a></p>
2352+
<p id="section-5.5-2">When a CA cosigner signs a subtree, it makes the additional statement that it has certified each entry in the subtree. For example, a domain-validating CA states that it has performed domain validation for each entry, at some time consistent with the entry's validity dates. CAs are held responsible for every entry in every subtree they sign. Proving an entry is included (<a href="#subtree-inclusion-proofs" class="auto internal xref">Section 4.2</a>) in a CA-signed subtree is sufficient to prove the CA certified it.<a href="#section-5.5-2" class="pilcrow"></a></p>
2353+
<p id="section-5.5-3">What it means to certify an entry depends on the entry type:<a href="#section-5.5-3" class="pilcrow"></a></p>
23542354
<ul class="normal">
23552355
<li class="normal" id="section-5.5-4.1">
23562356
<p id="section-5.5-4.1.1">To certify an entry of type <code>null_entry</code> is a no-op. A CA MAY freely certify <code>null_entry</code> without being held responsible for any validation.<a href="#section-5.5-4.1.1" class="pilcrow"></a></p>
@@ -2359,8 +2359,8 @@ <h3 id="name-certification-authority-cos">
23592359
<p id="section-5.5-4.2.1">To certify an entry of type <code>tbs_cert_entry</code> is to certify the TBSCertificateLogEntry, as defined in <a href="#log-entries" class="auto internal xref">Section 5.3</a>.<a href="#section-5.5-4.2.1" class="pilcrow"></a></p>
23602360
</li>
23612361
</ul>
2362-
<p id="section-5.5-5">Future documents MAY define <code>type</code> values and what it means to certify them. A CA MUST NOT sign a subtree if it contains an entry with <code>type</code> that it does not recognize. Doing so would certify that the CA has validated the information in some not-yet-defined entry format. <a href="#new-log-entry-types" class="auto internal xref">Section 12.5</a> further discusses security implications of new formats.<a href="#section-5.5-5" class="pilcrow"></a></p>
2363-
<p id="section-5.5-6">A CA operator MAY operate multiple CA cosigners that all certify the same log in parallel. This may be useful when, e.g., rotating CA keys. In this case, each CA instance MUST have a distinct name. The CA operator's ACME server can return all CA cosignatures together in a single certificate, with TLS negotiation sending the right ones to each client.<a href="#section-5.5-6" class="pilcrow"></a></p>
2362+
<p id="section-5.5-5">Entries are extensible. Future documents MAY define <code>type</code> values and what it means to certify them. A CA MUST NOT sign a subtree if it contains an entry with <code>type</code> that it does not recognize. Doing so would certify that the CA has validated the information in some not-yet-defined entry format. <a href="#new-log-entry-types" class="auto internal xref">Section 12.5</a> further discusses security implications of new formats.<a href="#section-5.5-5" class="pilcrow"></a></p>
2363+
<p id="section-5.5-6">A CA operator MAY operate multiple CA cosigners that all certify the same log in parallel. This may be useful when, e.g., rotating CA keys. In this case, each CA instance MUST have a distinct name. The CA operator's ACME server can return all CA cosignatures together in a single certificate, with the application protocol selecting the cosignatures to use. <a href="#use-in-tls" class="auto internal xref">Section 8</a> describes how this is done in TLS <span>[<a href="#RFC8446" class="cite xref">RFC8446</a>]</span>.<a href="#section-5.5-6" class="pilcrow"></a></p>
23642364
<p id="section-5.5-7">If the CA operator additionally operates a traditional X.509 CA, that CA key MUST be distinct from any Merkle Tree CA cosigner keys.<a href="#section-5.5-7" class="pilcrow"></a></p>
23652365
</section>
23662366
</div>

0 commit comments

Comments
 (0)