You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
Copy file name to clipboardExpand all lines: draft-davidben-tls-merkle-tree-certs.md
+12-10Lines changed: 12 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -932,6 +932,8 @@ When `type` is `tbs_cert_entry`, `N` is the number of bytes needed to consume th
932
932
933
933
`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}}.
934
934
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
+
935
937
~~~asn.1
936
938
TBSCertificateLogEntry ::= SEQUENCE {
937
939
version [0] EXPLICIT Version DEFAULT v1,
@@ -952,7 +954,7 @@ MerkleTreeCertEntry is an extensible structure. Future documents may define new
952
954
953
955
## Cosigners
954
956
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.
956
958
957
959
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.
958
960
@@ -962,7 +964,7 @@ A single cosigner, with a single cosigner ID and public key, MAY generate cosign
962
964
963
965
### Signature Format
964
966
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}}):
966
968
967
969
~~~tls-presentation
968
970
opaque HashValue[HASH_SIZE];
@@ -988,7 +990,7 @@ struct {
988
990
989
991
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*.
990
992
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.
992
994
993
995
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.
994
996
@@ -1030,19 +1032,19 @@ If the CA operator additionally operates a traditional X.509 CA, that CA key MUS
1030
1032
1031
1033
*[[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.*
1032
1034
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.*
1034
1036
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.]]*
1036
1038
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.
1038
1040
1039
1041
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}}.
1040
1042
1041
1043
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}}.
1042
1044
1043
1045
### Log Pruning
1044
1046
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.
1046
1048
1047
1049
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.
1048
1050
@@ -1236,7 +1238,7 @@ Given a TBSCertificateLogEntry in the issuance log and a landmark sequence, a si
1236
1238
2. Determine the landmark's subtrees and select the one that contains the entry.
1237
1239
3. Construct a certificate ({{certificate-format}}) using the selected subtree and no signatures.
1238
1240
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}}.
1240
1242
1241
1243
## Size Estimates
1242
1244
@@ -1248,13 +1250,13 @@ Some organizations have published statistics which can be used to estimate this
1248
1250
* {{MerkleTown}} reported around 2,100,000,000 unexpired certificates in CT logs, across all CAs
1249
1251
* {{MerkleTown}} reported an issuance rate of around 444,000 certificates per hour, across all CAs
1250
1252
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.
1252
1254
1253
1255
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.
1254
1256
1255
1257
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.
1256
1258
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.
0 commit comments