The Signature Scheme section of docs/FORMAT.md now describes what signatureString builds and how fingerprint and verifySignature treat it, following sneak's ruling that the code is the format (#82 (comment)). The UUID part is lower-case hex with no hyphens, the hash part is the lower-case hex of the sha256 multihash and starts 1220, signer is upper-case hex, and a signature lives only in the manifest's signature field. The mf.proto comments on fields 201 to 203 say the same, mf.pb.go is regenerated with make generate, and TestSignatureString pins the documented example, which was copied from that test's output.
Worth knowing:
The example sha256 is the SHA-256 of no bytes. It only shows how the string is built.
A blank line now sits before the 2xx note in mf.proto; without it protoc attaches the note to innerMessage in mf.pb.go.
Judgement call: the document also states three things the code already does that the issue did not list. A verifier compares signer without regard to case, the signature covers innerMessage only through sha256, and the reference implementation signs only with version 4 keys and writes armored output.
The term stays "canonical string", the name the document already used.
Model: opus-5-5
Implements https://git.eeqj.de/sneak/mfer/issues/187.
The Signature Scheme section of `docs/FORMAT.md` now describes what `signatureString` builds and how `fingerprint` and `verifySignature` treat it, following sneak's ruling that the code is the format (https://git.eeqj.de/sneak/mfer/issues/82#issuecomment-132656). The UUID part is lower-case hex with no hyphens, the hash part is the lower-case hex of the `sha256` multihash and starts `1220`, `signer` is upper-case hex, and a signature lives only in the manifest's `signature` field. The `mf.proto` comments on fields 201 to 203 say the same, `mf.pb.go` is regenerated with `make generate`, and `TestSignatureString` pins the documented example, which was copied from that test's output.
Worth knowing:
- The example `sha256` is the SHA-256 of no bytes. It only shows how the string is built.
- A blank line now sits before the `2xx` note in `mf.proto`; without it protoc attaches the note to `innerMessage` in `mf.pb.go`.
- Judgement call: the document also states three things the code already does that the issue did not list. A verifier compares `signer` without regard to case, the signature covers `innerMessage` only through `sha256`, and the reference implementation signs only with version 4 keys and writes armored output.
- The term stays "canonical string", the name the document already used.
Model: opus-5-5
mfer/mf.proto, the comment on signature (field 201), and the same comment in mfer/mf.pb.go. Its short form of the canonical string can be read as a string the code does not build. The part multihash of sha256 reads as a multihash computed over the sha256 field, which would hash it again; signatureString encodes the sha256 value itself as a multihash. "the uuid ... in lower-case hex" also allows the usual hyphenated UUID form. These are the two points #187 set out to settle. Acceptable is wording with only the code's reading, for example sha256 as a multihash and the uuid as 32 lower-case hex digits with no hyphens, or no inline string at all and only the pointer to the Signature Scheme section of docs/FORMAT.md, then make generate.
Model: opus-5-5
Review failed.
- `mfer/mf.proto`, the comment on `signature` (field 201), and the same comment in `mfer/mf.pb.go`. Its short form of the canonical string can be read as a string the code does not build. The part `multihash of sha256` reads as a multihash computed over the `sha256` field, which would hash it again; `signatureString` encodes the `sha256` value itself as a multihash. "the uuid ... in lower-case hex" also allows the usual hyphenated UUID form. These are the two points https://git.eeqj.de/sneak/mfer/issues/187 set out to settle. Acceptable is wording with only the code's reading, for example `sha256 as a multihash` and the uuid as 32 lower-case hex digits with no hyphens, or no inline string at all and only the pointer to the Signature Scheme section of `docs/FORMAT.md`, then `make generate`.
Model: opus-5-5
The Signature Scheme section now states what signatureString builds: the
magic, the outer uuid as lower-case hex with no hyphens, and the outer
sha256 as the lower-case hex of its multihash, which starts 1220, with an
example string taken from a run of the code. It says signer is the
upper-case hex fingerprint of the signing primary key and that a signature
is stored only in the manifest. The mf.proto comments on fields 201 to 203
say the same, and mf.pb.go is regenerated. A new test pins the example
string. Nothing about what is signed or how changes.
Model: opus-5-5
Rework for #188 (comment): the signature comment in mf.proto now gives the canonical string as ZNAVSRFG-<uuid>-<sha256 as a multihash>, with the uuid as 32 lower-case hex digits and no hyphens, and the multihash in lower-case hex. mf.pb.go and mf.proto.sha256 are regenerated with make generate. The branch is rebased onto current next.
Model: opus-5-5
Rework for https://git.eeqj.de/sneak/mfer/pulls/188#issuecomment-136631: the `signature` comment in `mf.proto` now gives the canonical string as `ZNAVSRFG-<uuid>-<sha256 as a multihash>`, with the uuid as 32 lower-case hex digits and no hyphens, and the multihash in lower-case hex. `mf.pb.go` and `mf.proto.sha256` are regenerated with `make generate`. The branch is rebased onto current `next`.
Model: opus-5-5
Judgement call: the three statements the document adds beyond the list in #187 (signer compared without regard to case, innerMessage covered only through sha256, signing only with version 4 keys and armored output) describe what the code already does, so they are taken as in scope.
Model: opus-5-5
Review passed.
- Judgement call: the three statements the document adds beyond the list in https://git.eeqj.de/sneak/mfer/issues/187 (`signer` compared without regard to case, `innerMessage` covered only through `sha256`, signing only with version 4 keys and armored output) describe what the code already does, so they are taken as in scope.
Model: opus-5-5
clawbot
merged commit c36f27068f into next2026-10-13 15:55:47 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements #187.
The Signature Scheme section of
docs/FORMAT.mdnow describes whatsignatureStringbuilds and howfingerprintandverifySignaturetreat it, following sneak's ruling that the code is the format (#82 (comment)). The UUID part is lower-case hex with no hyphens, the hash part is the lower-case hex of thesha256multihash and starts1220,signeris upper-case hex, and a signature lives only in the manifest'ssignaturefield. Themf.protocomments on fields 201 to 203 say the same,mf.pb.gois regenerated withmake generate, andTestSignatureStringpins the documented example, which was copied from that test's output.Worth knowing:
sha256is the SHA-256 of no bytes. It only shows how the string is built.2xxnote inmf.proto; without it protoc attaches the note toinnerMessageinmf.pb.go.signerwithout regard to case, the signature coversinnerMessageonly throughsha256, and the reference implementation signs only with version 4 keys and writes armored output.Model: opus-5-5
Review failed.
mfer/mf.proto, the comment onsignature(field 201), and the same comment inmfer/mf.pb.go. Its short form of the canonical string can be read as a string the code does not build. The partmultihash of sha256reads as a multihash computed over thesha256field, which would hash it again;signatureStringencodes thesha256value itself as a multihash. "the uuid ... in lower-case hex" also allows the usual hyphenated UUID form. These are the two points #187 set out to settle. Acceptable is wording with only the code's reading, for examplesha256 as a multihashand the uuid as 32 lower-case hex digits with no hyphens, or no inline string at all and only the pointer to the Signature Scheme section ofdocs/FORMAT.md, thenmake generate.Model: opus-5-5
d08867ae56toe08bcdf933Rework for #188 (comment): the
signaturecomment inmf.protonow gives the canonical string asZNAVSRFG-<uuid>-<sha256 as a multihash>, with the uuid as 32 lower-case hex digits and no hyphens, and the multihash in lower-case hex.mf.pb.goandmf.proto.sha256are regenerated withmake generate. The branch is rebased onto currentnext.Model: opus-5-5
Review passed.
signercompared without regard to case,innerMessagecovered only throughsha256, signing only with version 4 keys and armored output) describe what the code already does, so they are taken as in scope.Model: opus-5-5