Repository navigation
Description
Gap found during #1075 validation (Phase 0 walk, P0.11)
Plan step P0.11 (doc/2026-10-11T11-08-42Z_design_remaining_work/plan-phases.md §5) requires: "verify_strict regressions: a non-canonical signature and a small-order key are rejected at every call site" — test column: regression per call site; property over signature mutations.
Verified on main 0c37bb150aae3f3266b9492010161ad053cb2c4a (2026-10-27):
Covered sites — the shared fixtures in pkgs/id/src/test_forgeries.rs (IDENTITY_KEY small-order key, identity_forgery(), with_non_canonical_s()) are used by per-site regressions at 5 of the 7 direct verify_strict call sites in pkgs/id/src: artifact.rs:306, directory.rs:396, directory_auth.rs:349, directory_log.rs:100, web/identity.rs:373.
Uncovered sites — no small-order / non-canonical-S regression at:
pkgs/id/src/invites/event.rs:126—InviteEvent::verify_signature. Existing coverage is generic only:pkgs/id/tests/invites.rsa_bad_event_signature_refuses_the_accept_with_no_send(bit flip) andchanging_the_role_or_the_expiry_breaks_the_signature(tamper). Neither pins the strict-only rejections (an identity-key forgery that plainverifywould accept, or an S+L non-canonical signature).pkgs/id/src/seitan/accept.rs:142—accept::verifyfor seitan proofs.pkgs/id/src/seitan/tests.rscovers wrong key, tampered message bytes, a forged key, and a zero signature, but not the small-order identity forgery or non-canonical S via the shared fixtures.
The indirect 8th site (event headers via p2panda-core AnyHeader::decode, used at pkgs/id/src/chain.rs:323) is upstream code; its mutation resistance is covered locally by pkgs/id/tests/chain_properties.rs (test_a_single_changed_byte_is_always_refused) — no action needed there unless the audit decides otherwise.
Acceptance criteria
- A regression at the invites site proving
verify_signaturerejects (a) an invite event signed under the small-order identity key with theidentity_forgery()signature, and (b) a valid signature mutated withwith_non_canonical_s(). - A regression at the seitan site proving
accept::verifyrejects both fixture classes the same way. - Tests use the shared
crate::test_forgeriesfixtures (no new fixture copies) and pass in the normal Rust unit layer.
Filed from #1075 per its rule: every gap gets its own issue, linked from the worked issue. Path to Phase 12 step 4 follow-up (#1235 tier 1).
Activity
developing-today commentedon Oct 27, 2026
CODE-480
dezren39 commentedon Nov 2, 2026
🤖 Agent note · picked up
dezren39 commentedon Nov 2, 2026
🤖 Agent note · triaged — confirmed, follow-up routed
0e26fa4b3, 2026-11-02). Both named sites still enforceverify_strictwith no strict-only forgery regression:pkgs/id/src/invites/event.rs:126(InviteEvent::verify_signature) — file has zero test occurrences and notest_forgeriesuse; integration coverage inpkgs/id/tests/invites.rsis bit-flip/tamper only.pkgs/id/src/seitan/accept.rs:142(accept::verify) —seitan/tests.rscovers wrong key / tampered message bytes only; no small-order-identity or non-canonical-S case.IDENTITY_KEY,identity_forgery(),with_non_canonical_s()) are used at 5 sites only (artifact, directory, directory_auth, directory_log, web/identity) — neither of the two sites above.small_fixfollow-up as queue task 6583 (repo-health:v1:fix:developing-today/code:issue:1386) — one shared-fixture regression per site, no production-code change expected. No competing PR references id: verify_strict forgery regressions missing at invites and seitan call sites (P0.11) #1386; no held/Drew-owned restriction. Issue stays open for the fix task.Merge pull request #4676 from developing-today/queue/6583-1386-verify…
dezren39 commentedon Nov 3, 2026
🤖 Agent note · done
Done: PR #4676 MERGED (merge commit 6f54447); issue #1386 closed by the merge. The PR adds four tests, no production-code change:
InviteEvent::verify_signature(pkgs/id/src/invites/event.rs) and seitanaccept::verify(pkgs/id/src/seitan/tests.rs) each reject (a) the small-order identity-key forgery and (b) a genuine signature mutated withwith_non_canonical_s, with passing controls. Verified on the laptop at head 5cae4f9:cargo test --lib --no-default-features --features worldin pkgs/id — invites + seitan filters pass (35 seitan tests incl. the 2 new), the four new tests pass by name. Codex review completed on 5cae4f9 with no findings.fix(id): verify_strict in PresenceHeartbeat::verify (#5226) (#5308)