Skip to content

Commit 4f9e1c5

Browse files
author
ID Bot
committed
Script updating archive at 2025-12-04T02:08:42Z. [ci skip]
1 parent cc3ceb1 commit 4f9e1c5

1 file changed

Lines changed: 72 additions & 1 deletion

File tree

archive.json

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"magic": "E!vIA5L86J2I",
3-
"timestamp": "2025-12-02T02:08:02.645789+00:00",
3+
"timestamp": "2025-12-04T02:08:40.337962+00:00",
44
"repo": "davidben/merkle-tree-certs",
55
"labels": [
66
{
@@ -2722,6 +2722,37 @@
27222722
"updatedAt": "2025-11-20T07:23:50Z"
27232723
}
27242724
]
2725+
},
2726+
{
2727+
"number": 164,
2728+
"id": "I_kwDOJIBkVc7bvLSe",
2729+
"title": "Single-pass TBSCertificateLogEntry construction",
2730+
"url": "https://github.com/davidben/merkle-tree-certs/issues/164",
2731+
"state": "OPEN",
2732+
"author": "davidben",
2733+
"authorAssociation": "OWNER",
2734+
"assignees": [],
2735+
"labels": [],
2736+
"body": "This didn't make the cut for the first experiment, but here's a very minor optimization we can do that might benefit some very constrained implementations.\n\nAlmost everyone just keeps their certificates as buffers in memory, but if your signature algorithm has a init/update/final API, and if you have a streaming X.509 parser you, in principle, today could avoid keeping the entire certificate around in memory. I think [BearSSL](https://bearssl.org/x509.html) might do this? (Not sure.)\n\nTBSCertificateLogEntry makes this impossible because the total SEQUENCE length prefix is not know until you've _at least_ gotten to the SubjectPublicKeyInfo, so you know how much shorter it is than the total TBSCertificate. Even if you did have the whole TBSCertificate available, you have to do some annoying math if you want to stream the data into your hash context, rather than making a new allocated copy.\n\nWe could fix both of these by saying `tbs_cert_entry_data` contains just the contents octets of the TBSCertificateLogEntry. That is, you omit the leading outermost tag and length. That allows you compute `entry_hash` in a single pass over the data:\n\n```\nh := hash.New()\nh.Update(tbs.version .. tbs.subject)\nh.Update({OCTET_STRING, hash.Size()}) // subjectPublicKeyInfoHash header\nh.Update(hash(tbs.subjectPublicKeyInfo))\nh.Update(tbs.issuerUniqueID .. tbs.extensions)\nentryHash := h.Final()\n```\n\nThe downside is that if you're implementing this with a bog-standard DER encoder, you have to add a tiny bit of extra code to parse back the tag and length prefix and skip a few bytes. But this is quite easy to do:\n\n```\nfunc SkipFirstHeader(b []byte) []byte {\n // We can assume the tag is SEQUENCE and thus one byte. The\n // length starts at the second byte.\n l := b[1]\n if l < 0x80 {\n return b[2:] // Single-byte length\n }\n return b[2+l&0x7f:] // First byte tells you length of length\n}\n```",
2737+
"createdAt": "2025-12-02T16:20:24Z",
2738+
"updatedAt": "2025-12-03T16:38:07Z",
2739+
"closedAt": null,
2740+
"comments": [
2741+
{
2742+
"author": "bwesterb",
2743+
"authorAssociation": "COLLABORATOR",
2744+
"body": "Good idea, but let's hold this change until we need to make another breaking change to the verification code / CA API.",
2745+
"createdAt": "2025-12-03T11:06:48Z",
2746+
"updatedAt": "2025-12-03T11:07:30Z"
2747+
},
2748+
{
2749+
"author": "davidben",
2750+
"authorAssociation": "OWNER",
2751+
"body": "Oops, uploaded the PR before I saw your comment. Yeah, _definitely_ not proposing to change the current implementation target!",
2752+
"createdAt": "2025-12-03T16:38:07Z",
2753+
"updatedAt": "2025-12-03T16:38:07Z"
2754+
}
2755+
]
27252756
}
27262757
],
27272758
"pulls": [
@@ -10149,6 +10180,46 @@
1014910180
]
1015010181
}
1015110182
]
10183+
},
10184+
{
10185+
"number": 165,
10186+
"id": "PR_kwDOJIBkVc6234x2",
10187+
"title": "Omit the outermost SEQUENCE header in TBSCertificateLogEntry",
10188+
"url": "https://github.com/davidben/merkle-tree-certs/pull/165",
10189+
"state": "OPEN",
10190+
"author": "davidben",
10191+
"authorAssociation": "OWNER",
10192+
"assignees": [],
10193+
"labels": [],
10194+
"body": "Fixes #164. See #164 for motivation.\r\n\r\nThoughts? Worth doing?",
10195+
"createdAt": "2025-12-03T16:36:11Z",
10196+
"updatedAt": "2025-12-03T16:43:59Z",
10197+
"baseRepository": "davidben/merkle-tree-certs",
10198+
"baseRefName": "main",
10199+
"baseRefOid": "2b31f3d41162227fa1fe389b3e970cc33bf27eb6",
10200+
"headRepository": "davidben/merkle-tree-certs",
10201+
"headRefName": "single-pass",
10202+
"headRefOid": "50f7031777be2ce0f73ed4ebcb2d0e5d15ac425d",
10203+
"closedAt": null,
10204+
"mergedAt": null,
10205+
"mergedBy": null,
10206+
"mergeCommit": null,
10207+
"comments": [],
10208+
"reviews": [
10209+
{
10210+
"id": "PRR_kwDOJIBkVc7Swu-j",
10211+
"commit": {
10212+
"abbreviatedOid": "50f7031"
10213+
},
10214+
"author": "bwesterb",
10215+
"authorAssociation": "COLLABORATOR",
10216+
"state": "APPROVED",
10217+
"body": "",
10218+
"createdAt": "2025-12-03T16:43:59Z",
10219+
"updatedAt": "2025-12-03T16:43:59Z",
10220+
"comments": []
10221+
}
10222+
]
1015210223
}
1015310224
]
1015410225
}

0 commit comments

Comments
 (0)