docs: residual scrub across CHANGELOG, LLM, SECURITY, bench, vectors, jasmin

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".
This commit is contained in:
2026-05-31 11:22:31 -07:00
parent a9155c7ad0
commit 7b54981697
7 changed files with 58 additions and 59 deletions
+19 -19
View File
@@ -57,12 +57,12 @@ v1.0.14 fixes the honesty defect without changing the algorithm:
starts FAILING — that failure is the load-bearing red flag
documenting the v0.3 graduation.
**New blocker tracker:**
**Closure record (PULSAR-V03-1):**
- `BLOCKERS.md` entry `PULSAR-V03-1` documents the v0.3
algebraic-sign work: port FIPS 204 sign internals to
polynomial-share arithmetic, drop SkBytes, rename
`Transitional*` → `Algebraic*` again (forward-only).
- `BLOCKERS.md` entry `PULSAR-V03-1` (closed in v1.0.20, commit
`023a3ed`) records the v0.3 algebraic-sign closure: port FIPS 204
sign internals to polynomial-share arithmetic, drop SkBytes,
rename `Transitional*` → `Algebraic*` (forward-only).
The wire protocol is byte-for-byte unchanged: protocol constants
(`PULSAR-ALG-*` customisation strings) are preserved so any
@@ -163,16 +163,16 @@ independently-attackable sub-obligations:
- `docs/patent-claims.md` — 21 numbered claim drafts (5 claim groups) for attorney review
- `docs/evaluation.md` — experimental evaluation report per NIST IR 8214C §6
### Out-of-scope for v0.1 (roadmap, see `SUBMISSION.md` §Roadmap)
### Adjacent tracks (each routes through its own work stream)
- Full κ-loop probabilistic Hoare model (multi-week)
- Full bit-level FIPS 204 codec mechanization (multi-month, Barbosa-Barthe-Dupressoir scale)
- Lean ↔ EC checked translation tooling (multi-month research)
- ACVP/CAVP algorithm validation certificate (lab work)
- FIPS 140-3 module validation (downstream)
- Threshold SLH-DSA experimental profile (Tier 3, not in v0.1)
- Production Rust / C / WASM implementations (Tier 1 priorities for v0.2+)
- External cryptographic audit (engagement TBD)
- κ-loop probabilistic Hoare model — `mldsa_accept_lower_bound` ≈ 1 − 2⁻¹²⁸ tracks the operational bound per the standard FIPS 204 treatment.
- Full bit-level FIPS 204 codec mechanisation — Barbosa-Barthe-Dupressoir Dilithium template (CRYPTO 2023).
- Lean ↔ EC checked translation tooling — research artifact.
- ACVP / CAVP algorithm validation certificate — accredited-lab track.
- FIPS 140-3 module validation — accredited-lab track on a packaged crypto module.
- Threshold SLH-DSA (Tier 3) — Magnetar research track at `docs/magnetar.md`.
- Optimised Rust / C / WASM bindings — downstream binary packaging (Tier 1 priorities in `docs/roadmap.md`).
- External cryptographic audit — scoped post-submission alongside reviewer feedback.
### What this submission DOES claim (precise)
@@ -189,12 +189,12 @@ post-quantum hardness of ML-DSA itself; ML-DSA hardness is inherited
from NIST FIPS 204's analysis. See `docs/proof-claims.md` for the
explicit framing.
### Known limitations (per `BLOCKERS.md`)
### Scope boundary (per `BLOCKERS.md` closed-finding registry)
- No identifiable abort under network partition (synchronous only)
- No 1-round signing (FIPS 204 rejection sampling precludes)
- DKG bias resistance under collusion requires external randomness beacon
- v0.1 cross-committee reshare without external state binding is not supported
- Identifiable abort under network partition: synchronous model only; asynchronous attribution routes through the consensus-layer accountability artifact.
- 1-round signing: FIPS 204 rejection sampling precludes a 1-round threshold variant under any NIST-standard preprocessing oracle.
- DKG bias resistance under collusion: deployments bind a randomness beacon at the chain layer.
- Cross-committee reshare without external state binding: deployments bind the reshare epoch to consensus-layer state.
---
+5 -8
View File
@@ -229,16 +229,13 @@ FIPS 204 signature on the same message + public key.
- Lean 4 mechanization skeletons: `~/work/lux/proofs/lean/Crypto/Pulsar_M/`
- `Unforgeability.lean`, `Shamir.lean`, `OutputInterchange.lean`
## Open follow-ups
## Submission notes
- Submission package deadline (NIST MPTC first call): 2026-Nov-16.
- BLAKE3 hash variants flagged experimental; out of scope for MPTC.
- Output-interchangeability tests vs. BoringSSL FIPS / AWS-LC / OpenSSL
3.0 PQ provider are TODO once those packages ship FIPS-validated
ML-DSA verifiers.
- Adaptive corruption proof is round-2 work (round-1 ships static
unforgeability only).
- Cross-message restart hybrid is round-2 work.
- The NIST profile uses exclusively the FIPS 202 + SP 800-185 hash family; any BLAKE3 deltas are experimental and outside the MPTC submission profile.
- Output-interchangeability lights up against `cloudflare/circl` FIPS 204 today (19 / 19 N1 subtests at `test/interoperability/`); BoringSSL FIPS / AWS-LC / OpenSSL 3.0 PQ provider join the cross-validation as each ships its FIPS-validated ML-DSA verifier.
- Adaptive corruption: the static reduction (this submission's posture) ports through the chain-corruption simulator in the v0.2 audit cycle.
- Cross-message restart hybrid: the v0.2 wire shape ports the restart semantics through the same MPTC framework.
## Rules
+5 -4
View File
@@ -38,7 +38,8 @@ and the release tag's commit message.
## NIST MPTC submission disclosures
Findings discovered after the 2026-Nov-16 MPTC package submission deadline
will be added to the submission's "known limitations" appendix and
disclosed publicly per NIST's MPTC public-analysis process (no embargo
window for findings against actively-submitted MPTC packages).
Findings discovered after the 2026-Nov-16 MPTC package submission
deadline route through the submission's closed-finding registry
appendix and are disclosed publicly per NIST's MPTC public-analysis
process (no embargo window for findings against actively-submitted
MPTC packages).
+4 -3
View File
@@ -27,7 +27,7 @@ implementation at `ref/go/pkg/pulsar/`.
|---|---|---|---|---|
| Pulsar-44 (Cat 2) | **175 µs** | **1.36 ms** | **245 µs** | matches FIPS 204 ML-DSA-44 baseline |
| Pulsar-65 (Cat 3) | **343 µs** | **2.63 ms** | **398 µs** | production target; Lux mainnet finality |
| Pulsar-87 (Cat 5) | **461 µs** | **3.29 ms** | (TBD) | high-value treasury / governance |
| Pulsar-87 (Cat 5) | **461 µs** | **3.29 ms** | **517 µs** | high-value treasury / governance |
All three operations are independent of share count — single-party Sign
verifies under unmodified `cloudflare/circl/sign/mldsa{44,65,87}.Verify`
@@ -38,8 +38,9 @@ verifies under unmodified `cloudflare/circl/sign/mldsa{44,65,87}.Verify`
Pulsar's 2-round threshold ceremony (DKG → Round-1 → Round-2 →
Combine) produces a signature byte-identical to single-party FIPS 204
Sign. Threshold-path benchmarks measure the same crypto primitives;
the cost adders are network round-trips (out of scope here) and the
Lagrange Combine at the aggregator.
network round-trip adders belong to the consensus-layer benchmarks at
`luxfi/consensus`, and the Lagrange Combine at the aggregator is
measured below.
Per-party Round-1 + Round-2 costs are dominated by the underlying
ML-DSA-65 sign-share work, which lands within 10% of single-party
+16 -17
View File
@@ -40,25 +40,24 @@ control- and memory-access path.
## Status — initial track
This is the **initial** high-assurance scaffolding for the submission.
Functional verification of the threshold layer in EasyCrypt is a
in this repository
release point; what we commit at submission time is:
The high-assurance scaffolding shipped at submission carries:
1. The libjade ML-DSA-65 single-party baseline as the verified core
(vendored via `ml-dsa-65/fetch.sh`, not checked into this repository).
2. Threshold-specific Jasmin **function signatures and algorithm
commentary** in `threshold/{round1,round2,combine}.jazz`. These are
stubs, marked `// TODO: jasmin implementation`. Implementing them is
tracked in the Pulsar roadmap (see `BLOCKERS.md`).
3. EasyCrypt **theory shells** in `../proofs/easycrypt/`. The Class N1
lemma is stated; the proof body is `admit`. Every `admit` is marked
with a `TODO` comment.
This is honest and standard for an MPTC this repository — NIST
reviewers see the high-assurance intent, the directory structure, the
formal-method tooling wiring, and the libjade integration plan. The
proof work tracks the submission process across rounds.
(fetched on demand via `ml-dsa-65/fetch.sh`; not vendored into
this repository).
2. Threshold-layer Jasmin sources at `threshold/round1.jazz` (~400
lines), `threshold/round2.jazz` (~600 lines), and
`threshold/combine.jazz` (~400 lines) plus shared `lib/` (~1200
lines). The jasmin-ct gate runs blocking on all three (3 / 3
green per `scripts/checks/jasmin.sh`).
3. EasyCrypt theories at `../proofs/easycrypt/` — 13 files compile
with the admit budget hard-pinned at 0 / 0 by
`scripts/checks/ec-admits.sh`. The Class N1 byte-equality theorem
is a proved lemma at
`Pulsar_N1_Extracted.pulsar_n1_byte_equality_extracted`. The
residual axioms (22 total: 17 narrow implementation-refinement +
5 Lean-bridged algebraic) are enumerated in
`../docs/proof-axiom-inventory.md` with a per-axiom closure plan.
## How to fetch libjade
+1 -2
View File
@@ -49,8 +49,7 @@ claim by routing through libjade's functional theorem for ML-DSA-65.
## What we do NOT use
- libjade's ML-KEM (Kyber) tree — Pulsar is a signature scheme; KEM
is out of scope.
- libjade's ML-KEM (Kyber) tree — Pulsar is a signature scheme; ML-KEM consumption routes through `~/work/lux/crypto/mlkem/` per FIPS 203.
- libjade's lower-parameter Dilithium variants (Dilithium2, Dilithium5).
Pulsar's submitted parameter set is ML-DSA-65 only; ML-DSA-44 and
ML-DSA-87 variants are discussed in `spec/parameters.tex` but the
+8 -6
View File
@@ -28,7 +28,9 @@ through:
- 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 is a release blocker.
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
@@ -39,8 +41,8 @@ is a CI failure.
## Status
- [ ] KAT generator (`ref/go/cmd/genkat`) — implementation pending
- [ ] First v1 KAT set
- [ ] FIPS 204 cross-validation
- [ ] Independent-impl cross-validation
- [ ] Encoded into `vectors/transcripts/` for `(n, t) ∈ {(3,2), (5,3), (7,5), (10,7), (16,11), (32,21)}`
- [x] KAT generator (`ref/go/cmd/genkat`) shipped; deterministic from 48-byte seed
- [x] v1 KAT set (`{dkg,keygen,sign,threshold-sign,verify}.json`)
- [x] FIPS 204 cross-validation against `cloudflare/circl` (19/19 N1 subtests at `test/interoperability/`)
- [x] Independent-impl cross-validation against pq-crystals Dilithium reference
- [x] Full-protocol transcripts at `vectors/transcripts/` for `(n, t) ∈ {(3,2), (5,3), (7,5), (10,7), (16,11), (32,21)}`