Skip to content

Commit 5984965

Browse files
author
ID Bot
committed
Script updating archive at 2026-06-28T04:42:42Z. [ci skip]
1 parent 5a9a0c5 commit 5984965

1 file changed

Lines changed: 149 additions & 1 deletion

File tree

archive.json

Lines changed: 149 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"magic": "E!vIA5L86J2I",
3-
"timestamp": "2026-06-25T04:16:34.415588+00:00",
3+
"timestamp": "2026-06-28T04:42:39.684853+00:00",
44
"repo": "ietf-plants-wg/merkle-tree-certs",
55
"labels": [
66
{
@@ -3713,6 +3713,30 @@
37133713
"updatedAt": "2026-06-24T19:53:17Z",
37143714
"closedAt": null,
37153715
"comments": []
3716+
},
3717+
{
3718+
"number": 260,
3719+
"id": "I_kwDOJIBkVc8AAAABGvv-1w",
3720+
"title": "No explicit bound on issuance log size (index/tree_size)",
3721+
"url": "https://github.com/ietf-plants-wg/merkle-tree-certs/issues/260",
3722+
"state": "OPEN",
3723+
"author": "Vaisman",
3724+
"authorAssociation": "NONE",
3725+
"assignees": [],
3726+
"labels": [],
3727+
"body": "\nSection \"Issuance Logs\" describes an issuance log as an append-only sequence of entries identified by an index starting from zero, \nwith no stated upper bound. The only explicitly bounded quantity in this area is the log number itself:\n\n> \"Log numbers are numbered consecutively from 1 to at most 65535 (2^16-1).\"\n\nHowever, the certificate format depends on the log entry index and subtree boundaries fitting in 48 bits.\nSection \"Certificate Format\" defines:\n\n> \"The `serialNumber` MUST be equal to `(log_number << 48) | index`.\"\n\nand `MTCProof`'s `start` and `end` fields are typed as `uint48`. Verification reconstructs the split the same way:\n\n> \"Let `index` be the least significant 48 bits of `serial` and let `log_number` be `serial >> 48`.\"\n\nNone of this is tied to a normative bound on `index` or the log's `tree_size`. \nThere does not appear to be a statement requiring an issuance log to remain small enough for all certificate-relevant values (`index`, `start`, and `end`) to fit in `uint48`.\n\nIf a log grew beyond the range representable by the certificate fields, the certificate format would no longer have a well-defined way to represent later entry indexes in `serialNumber` or subtree boundaries in `MTCProof.start` / `MTCProof.end`. \nThis is the same kind of asymmetry that is already handled for log numbers, which are explicitly bounded at 65535; `index` / `tree_size` do not seem to have the corresponding statement.\n\n**Suggested fix:** Add an explicit requirement defining the maximum allowed issuance log tree size, chosen so that all certificate-relevant indexes and subtree boundaries fit in `uint48`.\n",
3728+
"createdAt": "2026-06-25T22:00:24Z",
3729+
"updatedAt": "2026-06-25T22:18:43Z",
3730+
"closedAt": null,
3731+
"comments": [
3732+
{
3733+
"author": "davidben",
3734+
"authorAssociation": "COLLABORATOR",
3735+
"body": "Coincidentally did this in https://github.com/ietf-plants-wg/merkle-tree-certs/pull/261 before I saw this bug.\n\n(This is, of course, not *really* a concern. Even if you issued 1,000 certificates a second, it would still take you almost 9,000 years to reach 2^48.)",
3736+
"createdAt": "2026-06-25T22:18:43Z",
3737+
"updatedAt": "2026-06-25T22:18:43Z"
3738+
}
3739+
]
37163740
}
37173741
],
37183742
"pulls": [
@@ -18380,6 +18404,130 @@
1838018404
"comments": []
1838118405
}
1838218406
]
18407+
},
18408+
{
18409+
"number": 261,
18410+
"id": "PR_kwDOJIBkVc7qwsMI",
18411+
"title": "Add a maxSerial field to the CA format",
18412+
"url": "https://github.com/ietf-plants-wg/merkle-tree-certs/pull/261",
18413+
"state": "OPEN",
18414+
"author": "davidben",
18415+
"authorAssociation": "COLLABORATOR",
18416+
"assignees": [],
18417+
"labels": [],
18418+
"body": "I suspect the discussion around revoking, log numbers, min/max indices, the CA format, etc., can be refactored given how scattered it has become. Ah well.\r\n\r\n(Also closes #260)",
18419+
"createdAt": "2026-06-25T22:14:26Z",
18420+
"updatedAt": "2026-06-26T01:22:07Z",
18421+
"baseRepository": "ietf-plants-wg/merkle-tree-certs",
18422+
"baseRefName": "main",
18423+
"baseRefOid": "6795e4f7ead20f0adaccabfad793bd5258f4a610",
18424+
"headRepository": "ietf-plants-wg/merkle-tree-certs",
18425+
"headRefName": "max-serial",
18426+
"headRefOid": "1548df01c5a7a00253c896d94355a27d4e8f1453",
18427+
"closedAt": null,
18428+
"mergedAt": null,
18429+
"mergedBy": null,
18430+
"mergeCommit": null,
18431+
"comments": [],
18432+
"reviews": [
18433+
{
18434+
"id": "PRR_kwDOJIBkVc8AAAABEL7jCw",
18435+
"commit": {
18436+
"abbreviatedOid": "c4790c3"
18437+
},
18438+
"author": "lukevalenta",
18439+
"authorAssociation": "COLLABORATOR",
18440+
"state": "APPROVED",
18441+
"body": "",
18442+
"createdAt": "2026-06-26T00:15:40Z",
18443+
"updatedAt": "2026-06-26T00:30:59Z",
18444+
"comments": [
18445+
{
18446+
"originalPosition": 5,
18447+
"body": "This reads slightly better to me, but either is fine\n```suggestion\nEach issuance log describes an append-only sequence of *entries* ({{log-entries}}). Each entry is identified by an integer *index*, assigned consecutively starting from zero. Indices are at most 2<sup>48</sup>-1. Each entry is an assertion that the CA has certified. The entries in the issuance log are represented as a Merkle Tree, described in {{Section 2.1 of !RFC9162}}.\n```",
18448+
"createdAt": "2026-06-26T00:15:40Z",
18449+
"updatedAt": "2026-06-26T00:30:59Z"
18450+
}
18451+
]
18452+
}
18453+
]
18454+
},
18455+
{
18456+
"number": 262,
18457+
"id": "PR_kwDOJIBkVc7rXkgq",
18458+
"title": "demo: fix UnusedBit panic on signing error",
18459+
"url": "https://github.com/ietf-plants-wg/merkle-tree-certs/pull/262",
18460+
"state": "OPEN",
18461+
"author": "Vaisman",
18462+
"authorAssociation": "NONE",
18463+
"assignees": [],
18464+
"labels": [],
18465+
"body": "Fixes a panic in `CreateCertificate` when `CertificateConfig.UnusedBit` is set and a cosigner fails to sign.\r\n\r\nThe existing condition had an operator-precedence bug:\r\n\r\n```go\r\nif sig, err := certSig.Bytes(); err == nil && len(sig) == 0 || sig[len(sig)-1]&1 != 0 {\r\n```\r\n\r\nSince `&&` binds tighter than `||`, the final `sig[len(sig)-1]` expression could still be evaluated when `certSig.Bytes()` returned an error. In that case, `sig` may be nil or empty, causing a panic instead of allowing the existing builder error to propagate through the normal `Bytes()` path.\r\n\r\nThis change only inspects the signature bytes when `certSig.Bytes()` succeeds.\r\n\r\nA regression test covers the case with `UnusedBit: true` and a `crypto.Signer` whose `Sign` method always returns an error.\r\n\r\nTested:\r\n\r\n```text\r\ngo test -run TestCreateCertificateUnusedBitCosignerError -v\r\ngo test ./... -v\r\n```\r\n",
18466+
"createdAt": "2026-06-27T20:18:28Z",
18467+
"updatedAt": "2026-06-27T23:32:00Z",
18468+
"baseRepository": "ietf-plants-wg/merkle-tree-certs",
18469+
"baseRefName": "main",
18470+
"baseRefOid": "6795e4f7ead20f0adaccabfad793bd5258f4a610",
18471+
"headRepository": "Vaisman/merkle-tree-certs",
18472+
"headRefName": "fix-unusedbit-panic",
18473+
"headRefOid": "87afb57edc9f9b654baa955ad4125c88667cf9be",
18474+
"closedAt": null,
18475+
"mergedAt": null,
18476+
"mergedBy": null,
18477+
"mergeCommit": null,
18478+
"comments": [],
18479+
"reviews": [
18480+
{
18481+
"id": "PRR_kwDOJIBkVc8AAAABEWBFog",
18482+
"commit": {
18483+
"abbreviatedOid": "87afb57"
18484+
},
18485+
"author": "davidben",
18486+
"authorAssociation": "COLLABORATOR",
18487+
"state": "COMMENTED",
18488+
"body": "",
18489+
"createdAt": "2026-06-27T23:12:39Z",
18490+
"updatedAt": "2026-06-27T23:31:59Z",
18491+
"comments": [
18492+
{
18493+
"originalPosition": 7,
18494+
"body": "Any reason this changed the structure to pull the assignment out of the `if`?",
18495+
"createdAt": "2026-06-27T23:12:39Z",
18496+
"updatedAt": "2026-06-27T23:31:59Z"
18497+
},
18498+
{
18499+
"originalPosition": 80,
18500+
"body": "What's this for? Go's test framework will already catch panics.",
18501+
"createdAt": "2026-06-27T23:13:03Z",
18502+
"updatedAt": "2026-06-27T23:31:59Z"
18503+
},
18504+
{
18505+
"originalPosition": 1,
18506+
"body": "TBH I'm not sure how much it's worth bothering with a test here. It seems mostly scar tissue. At the least, let's put this in encode_test.go.",
18507+
"createdAt": "2026-06-27T23:22:59Z",
18508+
"updatedAt": "2026-06-27T23:31:59Z"
18509+
},
18510+
{
18511+
"originalPosition": 27,
18512+
"body": "Same ID as the issuer is fine. We expect to have at least one cosigner that's the same name as the issuer anyway.",
18513+
"createdAt": "2026-06-27T23:26:16Z",
18514+
"updatedAt": "2026-06-27T23:31:59Z"
18515+
},
18516+
{
18517+
"originalPosition": 40,
18518+
"body": "I suspect this test does not *actually* need you to put anything here, but if you put this in encode_test.go, it can at least share a constant.",
18519+
"createdAt": "2026-06-27T23:26:45Z",
18520+
"updatedAt": "2026-06-27T23:31:59Z"
18521+
},
18522+
{
18523+
"originalPosition": 69,
18524+
"body": "Hmm, I am not thrilled about breaking the `Cosigner` abstraction here. It's something we'll have to remember to update every time we update that struct.\n\nInstead of all this, I think you could get the same coverage by just passing an invalid subtree to CreateCertificate.",
18525+
"createdAt": "2026-06-27T23:31:36Z",
18526+
"updatedAt": "2026-06-27T23:31:59Z"
18527+
}
18528+
]
18529+
}
18530+
]
1838318531
}
1838418532
]
1838518533
}

0 commit comments

Comments
 (0)