|
1046 | 1046 | <thead><tr> |
1047 | 1047 | <td class="left">Internet-Draft</td> |
1048 | 1048 | <td class="center">Merkle Tree Certificates</td> |
1049 | | -<td class="right">October 2025</td> |
| 1049 | +<td class="right">November 2025</td> |
1050 | 1050 | </tr></thead> |
1051 | 1051 | <tfoot><tr> |
1052 | 1052 | <td class="left">Benjamin, et al.</td> |
1053 | | -<td class="center">Expires 22 April 2026</td> |
| 1053 | +<td class="center">Expires 8 May 2026</td> |
1054 | 1054 | <td class="right">[Page]</td> |
1055 | 1055 | </tr></tfoot> |
1056 | 1056 | </table> |
|
1063 | 1063 | <dd class="internet-draft">draft-davidben-tls-merkle-tree-certs-latest</dd> |
1064 | 1064 | <dt class="label-published">Published:</dt> |
1065 | 1065 | <dd class="published"> |
1066 | | -<time datetime="2025-10-19" class="published">19 October 2025</time> |
| 1066 | +<time datetime="2025-11-04" class="published">4 November 2025</time> |
1067 | 1067 | </dd> |
1068 | 1068 | <dt class="label-intended-status">Intended Status:</dt> |
1069 | 1069 | <dd class="intended-status">Experimental</dd> |
1070 | 1070 | <dt class="label-expires">Expires:</dt> |
1071 | | -<dd class="expires"><time datetime="2026-04-22">22 April 2026</time></dd> |
| 1071 | +<dd class="expires"><time datetime="2026-05-08">8 May 2026</time></dd> |
1072 | 1072 | <dt class="label-authors">Authors:</dt> |
1073 | 1073 | <dd class="authors"> |
1074 | 1074 | <div class="author"> |
@@ -1128,7 +1128,7 @@ <h2 id="name-status-of-this-memo"> |
1128 | 1128 | time. It is inappropriate to use Internet-Drafts as reference |
1129 | 1129 | material or to cite them other than as "work in progress."<a href="#section-boilerplate.1-3" class="pilcrow">¶</a></p> |
1130 | 1130 | <p id="section-boilerplate.1-4"> |
1131 | | - This Internet-Draft will expire on 22 April 2026.<a href="#section-boilerplate.1-4" class="pilcrow">¶</a></p> |
| 1131 | + This Internet-Draft will expire on 8 May 2026.<a href="#section-boilerplate.1-4" class="pilcrow">¶</a></p> |
1132 | 1132 | </section> |
1133 | 1133 | </div> |
1134 | 1134 | <div id="copyright"> |
@@ -4779,26 +4779,28 @@ <h3 id="name-certificate-malleability"> |
4779 | 4779 | <p id="section-12.6-3.4.1"><code>subjectPublicKeyInfo</code> is hashed as <code>subjectPublicKeyInfoHash</code> in TBSCertificateLogEntry. Provided the underlying hash function is collision-resistant, no other values are possible for a given log entry.<a href="#section-12.6-3.4.1" class="pilcrow">¶</a></p> |
4780 | 4780 | </li> |
4781 | 4781 | </ul> |
4782 | | -<p id="section-12.6-4">Some non-conforming X.509 implementations use a BER <span>[<a href="#X.690" class="cite xref">X.690</a>]</span> parser instead of DER and then, instead of computing the canonical DER encoding per <span><a href="https://rfc-editor.org/rfc/rfc5280#section-4.1.1.3" class="relref">Section 4.1.1.3</a> of [<a href="#RFC5280" class="cite xref">RFC5280</a>]</span>, verify the signature over the particular BER encoding received. Those implementations may still assume the received BER-encoded TBSCertificate is not malleable. However, as BER encoding is not unique, this breaks the above assumptions in Merkle Tree Certificates. To preserve non-malleability, these non-conforming implementations MUST do the following when verifying a Merkle Tree Certificate:<a href="#section-12.6-4" class="pilcrow">¶</a></p> |
| 4782 | +<p id="section-12.6-4">X.509 implementations often implement <span><a href="https://rfc-editor.org/rfc/rfc5280#section-4.1.1.3" class="relref">Section 4.1.1.3</a> of [<a href="#RFC5280" class="cite xref">RFC5280</a>]</span> by equivalently retaining the original received DER encoding, rather than recomputing the canonical DER encoding TBSCertificate. This optimization is compatible with the assumptions above.<a href="#section-12.6-4" class="pilcrow">¶</a></p> |
| 4783 | +<p id="section-12.6-5">Some non-conforming X.509 implementations use a BER <span>[<a href="#X.690" class="cite xref">X.690</a>]</span> parser instead of DER, and then apply this optimization to the received BER encoding. BER encoding is not unique, so this does not produce the same result. In such implementations, the BER-encoded TBSCertificate becomes also non-malleable, and applications may rely on this. To preserve this property in Merkle Tree Certificates, such non-conforming implementations MUST do the following when implementing <a href="#verifying-certificate-signatures" class="auto internal xref">Section 7.2</a>:<a href="#section-12.6-5" class="pilcrow">¶</a></p> |
4783 | 4784 | <ul class="normal"> |
4784 | | -<li class="normal" id="section-12.6-5.1"> |
4785 | | - <p id="section-12.6-5.1.1">When parsing the outermost TBSCertificate SEQUENCE tag and length, reparse with a conforming DER parser.<a href="#section-12.6-5.1.1" class="pilcrow">¶</a></p> |
| 4785 | +<li class="normal" id="section-12.6-6.1"> |
| 4786 | + <p id="section-12.6-6.1.1">Reparse the initial identifier (the SEQUENCE tag) and length octets of the TBSCertificate structure with a conforming DER parser and fail verification if invalid.<a href="#section-12.6-6.1.1" class="pilcrow">¶</a></p> |
4786 | 4787 | </li> |
4787 | | - <li class="normal" id="section-12.6-5.2"> |
4788 | | - <p id="section-12.6-5.2.1">When copying the <code>version</code>, <code>issuer</code>, <code>validity</code>, <code>subject</code>, <code>issuerUniqueID</code>, <code>subjectUniqueID</code>, and <code>extensions</code> fields, either reparse with a conforming DER parser, or copy over the observed BER encodings.<a href="#section-12.6-5.2.1" class="pilcrow">¶</a></p> |
| 4788 | + <li class="normal" id="section-12.6-6.2"> |
| 4789 | + <p id="section-12.6-6.2.1">When copying the <code>version</code>, <code>issuer</code>, <code>validity</code>, <code>subject</code>, <code>issuerUniqueID</code>, <code>subjectUniqueID</code>, and <code>extensions</code> fields, either copy over the observed BER encodings, or reparse each field with a conforming DER parser and fail verification if invalid.<a href="#section-12.6-6.2.1" class="pilcrow">¶</a></p> |
4789 | 4790 | </li> |
4790 | | - <li class="normal" id="section-12.6-5.3"> |
4791 | | - <p id="section-12.6-5.3.1">Reparse the <code>serialNumber</code> field with a conforming DER parser.<a href="#section-12.6-5.3.1" class="pilcrow">¶</a></p> |
| 4791 | + <li class="normal" id="section-12.6-6.3"> |
| 4792 | + <p id="section-12.6-6.3.1">Reparse the <code>serialNumber</code> field with a conforming DER parser and fail verification if invalid.<a href="#section-12.6-6.3.1" class="pilcrow">¶</a></p> |
4792 | 4793 | </li> |
4793 | | - <li class="normal" id="section-12.6-5.4"> |
4794 | | - <p id="section-12.6-5.4.1">Reparse the <code>signature</code> field with a conforming DER parser. Equivalently, check for an exact match for the expected, DER-encoded value.<a href="#section-12.6-5.4.1" class="pilcrow">¶</a></p> |
| 4794 | + <li class="normal" id="section-12.6-6.4"> |
| 4795 | + <p id="section-12.6-6.4.1">Reparse the <code>signature</code> field with a conforming DER parser and fail verification if invalid. Equivalently, check for an exact equality with for the expected, DER-encoded value.<a href="#section-12.6-6.4.1" class="pilcrow">¶</a></p> |
4795 | 4796 | </li> |
4796 | | - <li class="normal" id="section-12.6-5.5"> |
4797 | | - <p id="section-12.6-5.5.1">When hashing <code>subjectPublicKeyInfo</code>, either reparse with a conforming DER parser, or hash the observed BER encoding.<a href="#section-12.6-5.5.1" class="pilcrow">¶</a></p> |
| 4797 | + <li class="normal" id="section-12.6-6.5"> |
| 4798 | + <p id="section-12.6-6.5.1">When hashing <code>subjectPublicKeyInfo</code>, either hash the observed BER encoding, or reparse the structure with a conforming DER parser and fail verification if invalid.<a href="#section-12.6-6.5.1" class="pilcrow">¶</a></p> |
4798 | 4799 | </li> |
4799 | 4800 | </ul> |
4800 | | -<p id="section-12.6-6"><a href="#log-entries" class="auto internal xref">Section 5.3</a> requires that the TBSCertificateLogEntry in a MerkleTreeCertEntry be DER-encoded, so applying a stricter parser will be compatible with conforming CAs. While these existing non-conforming implementations may be unable to switch to a DER parser due to compatibility concerns, Merkle Tree Certificates is new, so there is no existing deployment of malformed BER-encoded TBSCertificateLogEntry structures.<a href="#section-12.6-6" class="pilcrow">¶</a></p> |
4801 | | -<p id="section-12.6-7">The above only ensures the TBSCertificate portion is non-malleable. In Merkle Tree Certificates, similar to ECDSA X.509 signature, the signature value is malleable. Multiple MTCProof structures may prove a single TBSCertificate structure. Additionally, in all X.509-based protocols, a BER-based parser for the outer, unsigned Certificate structure will admit malleability in those portions of the encoding. Applications that derive a unique identifier from the Certificate MUST instead use the TBSCertificate, or some portion of it, for Merkle Tree Certificates.<a href="#section-12.6-7" class="pilcrow">¶</a></p> |
| 4801 | +<p id="section-12.6-7">These additional checks are redundant in X.509 implementations that use a conforming DER parser.<a href="#section-12.6-7" class="pilcrow">¶</a></p> |
| 4802 | +<p id="section-12.6-8"><a href="#log-entries" class="auto internal xref">Section 5.3</a> requires that the TBSCertificateLogEntry in a MerkleTreeCertEntry be DER-encoded, so applying a stricter parser will be compatible with conforming CAs. While these existing non-conforming implementations may be unable to switch to a DER parser due to compatibility concerns, Merkle Tree Certificates is new, so there is no existing deployment of malformed BER-encoded TBSCertificateLogEntry structures.<a href="#section-12.6-8" class="pilcrow">¶</a></p> |
| 4803 | +<p id="section-12.6-9">The above only ensures the TBSCertificate portion is non-malleable. In Merkle Tree Certificates, similar to ECDSA X.509 signature, the signature value is malleable. Multiple MTCProof structures may prove a single TBSCertificate structure. Additionally, in all X.509-based protocols, a BER-based parser for the outer, unsigned Certificate structure will admit malleability in those portions of the encoding. Applications that derive a unique identifier from the Certificate MUST instead use the TBSCertificate, or some portion of it, for Merkle Tree Certificates.<a href="#section-12.6-9" class="pilcrow">¶</a></p> |
4802 | 4804 | </section> |
4803 | 4805 | </div> |
4804 | 4806 | </section> |
|
0 commit comments