jwp-receipts: typed claims, key discovery, and a second binding class #84
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/receipt-classes-and-key-discovery"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Three holes in the receipt layer, all surfaced by the #80 survey and verified against this file.
1. The receipt answers one question (§2.4.3).
groupandobjectsay what was delivered, by whom, at what energy cost. Three other bodies now issue per-object signed artifacts answering different questions over the same objects — a lawful-basis declaration bound to a media service (ABNT NBR 25608 §8.8), a transparency-log inclusion proof (RFC 9942 COSE Receipts), and a recovered-binding assertion (C2PA soft binding). Rather than grow a field set per question,kind: "claim"carries a class discriminator and a class-scoped body on the same chain.The rules are about refusal: a verifier MUST reject a class it does not know rather than ignore it; the class MUST NOT be inferred from the body's shape; where a claim and a delivery receipt disagree the verifier MUST reject rather than choose; and a claim carries the authority of its signer and no more —
classsays what is asserted, never that it is true.2. Every signature presumed the verifier already held the key (§7).
signer_pubkeyrides in the receipt, which makes a signature checkable but not trustworthy — a forger supplies a key as easily as a signature. For a party who was never on the delivery path that presumption fails, and every guarantee in §6 fails with it.Adds a REQUIRED
signer_locator(cert-uri / trust-record / did), borrowing the design ITU-T H.274'sdsciSEI already uses rather than inventing a third shape. A verifier that cannot resolve it MUST report "signature-valid, identity-unconfirmed" — a materially weaker statement that MUST NOT be reported as verification. The locator MUST be inside the signed payload: one a relay can rewrite is one an attacker can rewrite.3. A receipt did not survive normal distribution (§8). The hard binding is BLAKE3 over envelope bytes, destroyed by any transcode, remux or platform re-encode. Those are not attacks — they are what distribution does. With one binding class, a re-encode left no recovery path at all.
Adds an explicitly weaker second class (soft binding + resolution endpoint), with the ancestor rule at its centre: a recovered receipt attests the ancestor the object was derived from, not the object in hand. An implementation that cannot express that distinction MUST NOT implement soft binding — a recovery presented as a hard binding is worse than no recovery, because it launders a transformation nobody attested.
No new cryptography, no new transport.
🤖 Generated with Claude Code
46d7518fa70058478ad0