Skip to content

Commit bd01f48

Browse files
authored
Refine language and clarity in TLS Merkle Tree Certs
Clarified descriptions of `tbs_cert_entry_data`, cosigner roles, and subtree signing rules. Improved consistency and readability throughout the document. Changes up to # Relying Parties
1 parent f9601ab commit bd01f48

1 file changed

Lines changed: 12 additions & 10 deletions

File tree

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,8 @@ When `type` is `tbs_cert_entry`, `N` is the number of bytes needed to consume th
932932

933933
`tbs_cert_entry_data` contains the contents octets (i.e. excluding the initial identifier and length octets) of the DER {{X.690}} encoding of a TBSCertificateLogEntry, defined below. Equivalently, `tbs_cert_entry_data` contains the DER encodings of each field of the TBSCertificateLogEntry, concatenated. This construction allows a single-pass implementation in {{verifying-certificate-signatures}}.
934934

935+
The `tbs_cert_entry_data` field contains the Value portion of the DER-encoded TBSCertificateLogEntry. It omits the initial Identifier (Tag) and Length octets that usually wrap a DER sequence. It is created by concatenating the individual DER encodings of every field within the TBSCertificateLogEntry in order. This construction allows {{verifying-certificate-signatures}} in a single pass, increasing efficiency.
936+
935937
~~~asn.1
936938
TBSCertificateLogEntry ::= SEQUENCE {
937939
version [0] EXPLICIT Version DEFAULT v1,
@@ -952,7 +954,7 @@ MerkleTreeCertEntry is an extensible structure. Future documents may define new
952954

953955
## Cosigners
954956

955-
This section defines a log *cosigner*. A cosigner follows some append-only view of the log and signs subtrees ({{subtrees}}) consistent with that view. The signatures generated by a cosigner are known as *cosignatures*. 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.
957+
This section defines a log *cosigner*. A cosigner follows an append-only view of the log and signs subtrees ({{subtrees}}) consistent with that view. The signatures generated by a cosigner are known as *cosignatures*. 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.
956958

957959
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 ({{certification-authority-cosigners}}), 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, {{TLOG-WITNESS}} defines a cosigner that only checks the log is append-only, and {{TLOG-MIRROR}} defines a cosigner that mirrors a log.
958960

@@ -962,7 +964,7 @@ A single cosigner, with a single cosigner ID and public key, MAY generate cosign
962964

963965
### Signature Format
964966

965-
A cosigner computes a cosignature for a subtree in some log by signing a MTCSubtreeSignatureInput, defined below using the TLS presentation language ({{Section 3 of !RFC8446}}):
967+
A cosigner computes a cosignature for a subtree in a log by signing a MTCSubtreeSignatureInput, defined below using the TLS presentation language ({{Section 3 of !RFC8446}}):
966968

967969
~~~tls-presentation
968970
opaque HashValue[HASH_SIZE];
@@ -988,7 +990,7 @@ struct {
988990

989991
The resulting signature is known as a *subtree signature*. When `start` is zero, the resulting signature describes the checkpoint with tree size `end` and is also known as a *checkpoint signature*.
990992

991-
For each supported log, a cosigner retains its checkpoint signature with the largest `end`. This is known as the cosigner's *current* checkpoint. If the cosigner's current checkpoint has tree size `tree_size`, it MUST NOT generate a signature for a subtree `[start, end)` if `start > 0` and `end > tree_size`. 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 ({{subtree-consistency-proofs}}). 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.
993+
A cosigner always tracks the checkpoint with the largest end index, designating it as their current checkpoint. This represents the maximum extent of the log the cosigner has verified. To ensure consistency, a cosigner is restricted in what subtrees they can sign. A cosigner MUST NOT sign any subtree [start, end) if its end point exceeds the tree_size of their current checkpoint (unless start is 0). A cosigner may only sign a "middle" or "end" portion of a tree if that portion is already contained within the current verified checkpoint. Every signature a cosigner produces must be provably consistent with their current checkpoint via a subtree consistency proof. By signing a subtree, the cosigner becomes responsible for all entries in the tree up to that end point—even if the full checkpoint is missing or unavailable.
992994

993995
Before signing a subtree, the cosigner MUST ensure that `hash` 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 ({{subtree-consistency-proofs}}) from its current checkpoint. When a cosigner signs a subtree, it is held responsible *both* for the subtree being consistent with its other signatures, *and* for the cosigner-specific additional statements.
994996

@@ -1030,19 +1032,19 @@ If the CA operator additionally operates a traditional X.509 CA, that CA key MUS
10301032

10311033
*[[NOTE: This section is written to avoid depending on a specific serving protocol. The current expectation is that a Web PKI deployment would derive from {{TLOG-TILES}}, to match the direction of Certificate Transparency and pick up improvements made there.*
10321034

1033-
*For now, we avoid a normative reference on {{TLOG-TILES}} and also capture the fact that the certificate construction is independent of the choice of protocol. Similar to how the CT ecosystem is migrating to a tiled interface, were someone to improve on {{TLOG-TILES}}, a PKI could migrate to that new protocol without impacting certificate verification.*
1035+
*For now, we avoid a normative reference to {{TLOG-TILES}} and also capture the fact that the certificate construction is independent of the choice of protocol. Similar to how the CT ecosystem is migrating to a tiled interface, were someone to improve on {{TLOG-TILES}}, a PKI could migrate to that new protocol without impacting certificate verification.*
10341036

1035-
*That said, this is purely a starting point for describing the design. We expect the scope of this document, and other related documents to adapt as the work evolves across the IETF, C2SP, Certificate Transparency, and other communities.]]*
1037+
*This is purely a starting point for describing the design. We expect the scope of this document, and other related documents to adapt as the work evolves across the IETF, C2SP, Certificate Transparency, and other communities.]]*
10361038

1037-
Issuance logs are intended to be publicly accessible in some form, to allow monitors to detect misissued certificates.
1039+
Issuance logs are intended to be publicly accessible to allow monitors to detect misissued certificates.
10381040

10391041
The access method does not affect certificate interoperability, so this document does not prescribe a specific protocol. An individual issuance log MAY be published in any form, provided other parties in the PKI are able to consume it. Relying parties SHOULD define log serving requirements, including the allowed protocols and expected availability, as part of their policies on which CAs to support. See also {{log-availability}}.
10401042

10411043
For example, a log ecosystem could use {{TLOG-TILES}} to serve logs. {{TLOG-TILES}} improves on {{?RFC6962}} and {{?RFC9162}} by exposing the log as a collection of cacheable, immutable "tiles". This works well with a variety of common HTTP {{?RFC9110}} serving architectures. It also allows log clients to request arbitrary tree nodes, so log clients can fetch the structures described in {{subtrees}}.
10421044

10431045
### Log Pruning
10441046

1045-
Over time, an issuance log's entries will expire and likely be replaced with certificate renewals. As this happens, the total size of the log grows, even if the unexpired subset remains fixed. To mitigate this, issuance logs MAY be *pruned*, as described in this section.
1047+
Over time, an issuance log's entries will expire and likely be replaced as certificates are renewed. As this happens, the total size of the log grows, even if the unexpired subset remains fixed. To mitigate this, issuance logs MAY be *pruned*, as described in this section.
10461048

10471049
Pruning makes some prefix of the log unavailable, without changing the tree structure. It may be used to reduce the serving cost of long-lived logs, where any entries have long expired. {{log-availability}} discusses policies on when pruning may be permitted. This section discusses how it is done and the impact on log structure.
10481050

@@ -1236,7 +1238,7 @@ Given a TBSCertificateLogEntry in the issuance log and a landmark sequence, a si
12361238
2. Determine the landmark's subtrees and select the one that contains the entry.
12371239
3. Construct a certificate ({{certificate-format}}) using the selected subtree and no signatures.
12381240

1239-
Before sending this certificate, the authenticating party SHOULD obtain some application-protocol-specific signal that implies the relying party has been configured with the corresponding landmark. ({{trusted-subtrees}} defines how relying parties are configured.) The trust anchor ID of the landmark may be used as an efficient identifier in the application protocol. {{use-in-tls}} discusses how to do this in TLS {{!RFC8446}}.
1241+
Before sending this certificate, the authenticating party SHOULD obtain an application-protocol-specific signal that implies the relying party has been configured with the corresponding landmark. ({{trusted-subtrees}} defines how relying parties are configured.) The trust anchor ID of the landmark may be used as an efficient identifier in the application protocol. {{use-in-tls}} discusses how to do this in TLS {{!RFC8446}}.
12401242

12411243
## Size Estimates
12421244

@@ -1248,13 +1250,13 @@ Some organizations have published statistics which can be used to estimate this
12481250
* {{MerkleTown}} reported around 2,100,000,000 unexpired certificates in CT logs, across all CAs
12491251
* {{MerkleTown}} reported an issuance rate of around 444,000 certificates per hour, across all CAs
12501252

1251-
The current issuance rate across the Web PKI may not necessarily be representative of the Web PKI after a transition to short-lived certificates. Assuming a certificate lifetime of 7 days, and that subscribers will update their certificates 75% of the way through their lifetime (see {{certificate-renewal}}), every certificate will be reissued every 126 hours. This gives issuance rate estimates of around 4,400,000 certificates per hour and 17,000,000 certificates per hour, for the first two values above. Note the larger estimate is across all CAs, while subtrees would only span one CA.
1253+
The current issuance rate across the Web PKI may not necessarily be representative of the Web PKI after a transition to short-lived certificates. Assuming a certificate lifetime of 7 days, and that subscribers will update their certificates 75% of the way through their lifetime (see {{certificate-renewal}}), every certificate will be reissued every 126 hours. This yields an issuance rate 17,000,000 certificates per hour across all CAs, with larger CAs issuing millions of certificates per hour. Note the 17M certificate estimate is across all CAs, while subtrees would only span one CA.
12521254

12531255
Using the per-CA short lifetime estimate, if the CA mints a checkpoint every 2 seconds, full certificate subtrees will span around 2,500 certificates, leading to 12 hashes in the inclusion proof, or 384 bytes. Full certificates additionally must carry a sufficient set of signatures to meet relying party requirements.
12541256

12551257
If a new landmark is allocated every hour, signatureless certificate subtrees will span around 4,400,000 certificates, leading to 23 hashes in the inclusion proof, giving an inclusion proof size of 736 bytes, with no signatures. This is significantly smaller than a single ML-DSA-44 signature, 2,420 bytes, and almost ten times smaller than the three ML-DSA-44 signatures necessary to include post-quantum SCTs.
12561258

1257-
The proof sizes grow logarithmically, so 32 hashes, or 1024 bytes, is sufficient for subtrees of up to 2<sup>32</sup> (4,294,967,296) certificates.
1259+
Proof sizes grow logarithmically, so 32 hashes, or 1024 bytes, is sufficient for subtrees of up to 2<sup>32</sup> (4,294,967,296) certificates.
12581260

12591261
# Relying Parties
12601262

0 commit comments

Comments
 (0)