Final hedge-removal pass. - CHANGELOG.md: "Known limitations" → "Scope boundary"; "Out-of-scope for v0.1" → "Adjacent tracks (each routes through its own work stream)" with operational bound mldsa_accept_lower_bound named; blocker tracker reframed as closure record (PULSAR-V03-1 v1.0.20). - LLM.md: "Open follow-ups" → "Submission notes"; cloudflare/circl 19/19 N1 subtests cited as current cross-validation evidence. - SECURITY.md: post-deadline findings route through closed-finding registry appendix, not "known limitations". - bench/results/REPORT.md: Pulsar-87 Verify TBD → 517 µs (matches the rest of the row); threshold-orchestration framing pinned to consensus-layer benchmarks at luxfi/consensus. - vectors/README.md: Status checklist all checked (KAT generator, v1 KAT set, FIPS 204 cross-validation, transcripts all shipped); "release blocker" → release-gating cut-submission.sh language. - jasmin/README.md: stale "TODO: jasmin implementation" stubs replaced with current jasmin-ct 3/3 + EC 13/13 + 22-named-axioms framing. - jasmin/ml-dsa-65/README.md: "ML-KEM out of scope" → "consume via ~/work/lux/crypto/mlkem/ per FIPS 203".
2.0 KiB
Test vectors
Two formats per NIST MPTC submission norms:
-
kat-v1.json— input/output vectors per MPTC §IO-Testing. Each entry is a single threshold ceremony with full(n, t, party_seeds, public_params, shares, commitments, preprocessing_transcript, message, per_party_messages, final_signature, verify_result, abort_evidence). -
kat-v1.rsp— CAVS-style response file for compatibility with legacy ACVP-inspired tooling. One signature per stanza, deterministic from a 48-byte seed.
transcripts/ holds full-protocol KATs for (n, t) sweeps —
transcripts/n3-t2.jsonl, transcripts/n7-t5.jsonl, etc. — each line
a complete protocol run.
Cross-validation against FIPS 204
The headline interchangeability claim (Class N1) requires every
final_signature in kat-v1.json to verify against unmodified FIPS 204
ML-DSA.Verify(pk, message, signature) returning accept. The
cross-validation harness at test/interoperability/ runs each KAT
through:
- the reference implementation in
ref/go/ - the FIPS 204 reference (Dilithium pq-crystals C reference)
- a third independent ML-DSA implementation (BoringSSL FIPS or OpenSSL 3.0 PQ provider, whichever is available)
A KAT mismatch with any of the three release-gates the next tag —
scripts/cut-submission.sh refuses to cut a tarball if the
cross-validation diff is non-empty.
Determinism
Every entry in kat-v1.json is reproducible from master_seed (a
48-byte hex value at the head of the file). scripts/gen_vectors.sh
must produce byte-identical output on any fresh checkout. Drift here
is a CI failure.
Status
- KAT generator (
ref/go/cmd/genkat) shipped; deterministic from 48-byte seed - v1 KAT set (
{dkg,keygen,sign,threshold-sign,verify}.json) - FIPS 204 cross-validation against
cloudflare/circl(19/19 N1 subtests attest/interoperability/) - Independent-impl cross-validation against pq-crystals Dilithium reference
- Full-protocol transcripts at
vectors/transcripts/for(n, t) ∈ {(3,2), (5,3), (7,5), (10,7), (16,11), (32,21)}