proof-aware-crypto-tooling-.../src/pacta
mrwulf a03662438a slhdsa: the post-quantum signing path (deterministic, parameter-locked, additive)
Phase 2b+3 of the step-3 rehearsal, under the four operator decisions of
2026-08-06: deterministic signing, separate slh_dsa block, additive posture,
keygen executed same day (key in provider state, 0600, git-ignored — verified
before generation, not after).

src/pacta/slhdsa.py — the module that did not exist (register:
pq-slot-names-unproven-algorithm). Parameter set LOCKED to SLH-DSA-SHA2-128s:
every entry point asserts the key's reported algorithm and refuses anything
else, because any other set sits outside all eleven certificates while looking
like dogfood. Deterministic via -pkeyopt deterministic:1, so the byte-level
reproducibility check that caught a real defect on the Ed25519 side survives
here. Verification runs two ways: OpenSSL, and pacta-verify-slhdsa built from
the pinned proven source — the one signature check in the estate performed by
code whose verify path the certificates cover. The proven-verifier path is
package-anchored, not cwd-relative: the lesson of signer-backend-depends-on-cwd
applied on day one, not retrofitted.

make_signed_tree_head grows optional slhdsa key parameters. With them, the head
carries a signed slh_dsa block; without, an honest not-configured slot exactly
as ml_dsa always has. ml_dsa itself is untouched. Signatures stay outside the
signed payload for both algorithms — tested by asserting the payload is
byte-identical with and without the slh_dsa key.

Honesty carried in the artifact: signing_backend says "openssl" because no
proven signer exists for any algorithm; the module docstring states that
nothing here is Lean-proven and that the certificates cover the verify path of
the extracted model only.

Tests: 7 new, suite 152 passed, 0 failed, 0 skipped — including determinism
(two signings, identical bytes), the foreign-key refusal (Ed25519 key raises),
corruption rejected by both verifiers, and the proven/OpenSSL agreement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-06 22:03:39 +02:00
..
profiles Estate sync: boundary-axiom vocabulary + the four-tier apex reality (R4) 2026-07-06 10:04:43 +02:00
__init__.py initial proof-aware tooling prototype 2026-07-03 10:51:03 +02:00
__main__.py initial proof-aware tooling prototype 2026-07-03 10:51:03 +02:00
agent.py add policy-gated agent consequences 2026-07-03 11:05:06 +02:00
artifact.py add transparency log trust provider 2026-07-03 14:09:34 +02:00
attestation.py audit v3: paper-reality congruence + external-pointer integrity (Fable-5 Socratic pass) 2026-07-09 21:33:28 +02:00
audit.py initial proof-aware tooling prototype 2026-07-03 10:51:03 +02:00
claims.py Estate sync: boundary-axiom vocabulary + the four-tier apex reality (R4) 2026-07-06 10:04:43 +02:00
cli.py cockpit: the lab manual — a study-club course in six chairs (/manual) 2026-07-21 17:26:09 +02:00
config.py Machine protection: route all pacta Lean compiles through lean-guard 2026-07-06 10:42:59 +02:00
custodycard.py warden agent-native surfaces: MCP server, self-proving custody card, proof-of-posture 2026-07-06 23:35:47 +02:00
deck.py cockpit: the lab manual — a study-club course in six chairs (/manual) 2026-07-21 17:26:09 +02:00
dogfood.py dogfood: anchor the signer path to the package, not the working directory 2026-08-04 18:10:59 +02:00
estateview.py cockpit: the estate page now MEASURES instead of asserting 2026-07-30 18:24:31 +02:00
lean.py cleanup: remove dead _mentions_no_axioms (round-6 drill) 2026-07-16 15:54:26 +02:00
liveness.py estate: the SLH-DSA (FIPS 205) campaign enters the map — two new entities 2026-07-22 22:02:39 +02:00
logclient.py The log goes public: git-published mirror, online service, witnesses 2026-07-06 16:05:20 +02:00
manifest.py initial proof-aware tooling prototype 2026-07-03 10:51:03 +02:00
mdlite.py cockpit: the lab manual — a study-club course in six chairs (/manual) 2026-07-21 17:26:09 +02:00
postquantum.py add transparency log trust provider 2026-07-03 14:09:34 +02:00
quorum.py warden re-audit (Fable 5): fix ledger race, quorum perf, small-order honesty 2026-07-07 08:24:51 +02:00
repo.py Machine protection: route all pacta Lean compiles through lean-guard 2026-07-06 10:42:59 +02:00
report.py add verifier bootstrap and attestation lane 2026-07-03 11:24:13 +02:00
risk.py Estate sync: boundary-axiom vocabulary + the four-tier apex reality (R4) 2026-07-06 10:04:43 +02:00
signing.py dogfood: anchor the signer path to the package, not the working directory 2026-08-04 18:10:59 +02:00
slhdsa.py slhdsa: the post-quantum signing path (deterministic, parameter-locked, additive) 2026-08-06 22:03:39 +02:00
stations.py cockpit: the bridge — six role stations, the crew law, live liveness 2026-07-21 16:47:43 +02:00
sthstore.py sthstore: equivocation poisons the pin + retains transferable evidence 2026-07-09 17:53:13 +02:00
transparency.py slhdsa: the post-quantum signing path (deterministic, parameter-locked, additive) 2026-08-06 22:03:39 +02:00
treasury.py warden hardening round: policy engine, ledger rotation, MCP UX, treasury LIVE, ops docs 2026-07-07 13:38:42 +02:00
uikit.py cockpit: the lab manual — a study-club course in six chairs (/manual) 2026-07-21 17:26:09 +02:00
wallet.py warden hardening round: policy engine, ledger rotation, MCP UX, treasury LIVE, ops docs 2026-07-07 13:38:42 +02:00
walletmcp.py warden hardening round: policy engine, ledger rotation, MCP UX, treasury LIVE, ops docs 2026-07-07 13:38:42 +02:00
walletui.py cockpit: the estate page now MEASURES instead of asserting 2026-07-30 18:24:31 +02:00
witness.py The log goes public: git-published mirror, online service, witnesses 2026-07-06 16:05:20 +02:00
yamlio.py initial proof-aware tooling prototype 2026-07-03 10:51:03 +02:00