Files
threshold/protocols/mldsa/README.md
T
Hanzo AI 9bce6722b4 threshold: Pulsar/Lens kernel adapters + corona KAT + Pulsar-SHA3 wiring
Squashed batch covering:

- protocols/pulsar/: lattice threshold lane (round-based wrapper for
  github.com/luxfi/pulsar kernel); doc.go documents Photon/Lumen/Beam/
  Pulsar/Pulse/Prism/Horizon/Quasar vocabulary stack from LP-105
- protocols/lens/: planned curve threshold sister kernel (design
  intent only; mirrors Pulsar shape; replaces stub LSS-FROST)

- protocols/lss/lss_pulsar.go + tests: LSS-Pulsar adapter
  (DynamicResharePulsar + PulsarSnapshotManager + BuildActivationTranscript).
  Now SHA3-suite-aware: PulsarConfig carries NebulaRoot, HashSuiteID,
  ImplementationVersion as optional transcript-binding fields that
  flow through to the activation message.

  10/10 acceptance tests pass:
    1. GroupKey preservation
    2. KeyEraID preservation
    3. Generation +1
    4. RollbackFrom=0 on forward
    5. t_old != t_new
    6. Disjoint set rotation
    7. Valid signature under unchanged GroupKey
    8. Pairwise material regenerated
    9. Rollback semantics
   10. Error surface
  Plus 1 new test for BuildActivationTranscript Nebula+suite fields.

- protocols/lss/lss_frost.go: marked DEPRECATED (placeholder Sign()/
  Refresh(), single-process simulation, hardcoded ChainKey/RID); will
  be replaced by lss_lens.go.

- corona KAT cross-oracle vs Go reference (N=16 deterministic seeds)
- corona+protocol+harness hardening against parallel-run flakes
- lss/adapters: drop NewXRPL/NewCardano panic; ship real XRPL address
  derivation
- corona SignWithConfig API expansion + test fixes
- v1.6.5 changelog
- go.sum h1 hashes for luxfi/log and 4 deps

Architecture (LP-105 / pulsar/DESIGN.md):
  LSS owns lifecycle (Generation, Rollback, snapshots, dealer/
  coordinator role separation). Pulsar owns lattice math (R_q shares,
  lattice Pedersen commits, Sign1/Sign2/Combine, Pulsar-SHA3 hash
  profile). The lss_pulsar adapter wires them. lss_lens (planned) does
  the same for curve math.

go.mod adds local replace github.com/luxfi/pulsar => ../pulsar.
2026-03-03 12:00:00 -08:00

1.8 KiB
Raw Blame History

Threshold ML-DSA

First practical threshold signature scheme fully compatible with NIST FIPS 204 ML-DSA. Outputs standard ML-DSA signatures (drop-in verification).

Paper: Celi, del Pino, Espitau, Niot, Prest — Efficient Threshold ML-DSA, USENIX Security 2026. See ../../papers/threshold-mldsa.tex.

Configurations

  • Security levels: ML-DSA-44 / 65 / 87 (NIST I / III / V)
  • Threshold range: 2 ≤ T ≤ N ≤ 6 (hard upper bound in this release)
  • Typical: 2-of-3, 3-of-5
  • Security model: static dishonest majority in the ROM

Rounds

3 rounds per signing attempt, K parallel instances (see params.go):

  1. Commit — each party publishes H(vk, i, wᵢ) with wᵢ = A·rᵢ
  2. Reveal — open wᵢ, derive challenge c
  3. Respond — each party publishes zᵢ after local hyperball rejection

Combiner verifies the aggregated z meets ML-DSA bounds and emits a standard signature.

Bandwidth (per party, per successful attempt, ML-DSA-44)

N\T 2 3 4 5 6
2 10.5 kB
3 15.8 kB 21.0 kB
4 15.8 kB 36.8 kB 42.0 kB
5 15.8 kB 73.5 kB 157.4 kB 84.0 kB
6 21.0 kB 99.8 kB 388.4 kB 524.8 kB 194.2 kB

Files

  • doc.go — package doc
  • params.go — all (T,N) × level parameter sets (Tables 3, 10, 11)
  • rss.go — replicated secret sharing, hardcoded optimal partitions (Appendix B, Algorithm 6)
  • hrej.go — imbalanced hyperball rejection (Figure 4)
  • TODO: keygen.go, sign.go, combine.go, a_posteriori.go — stubs pending integration with cloudflare/circl/sign/mldsa and luxfi/lattice.

Status

Skeleton + parameter tables + RSS partition logic shipped. Ring operations, CIRCL integration, and full protocol wiring land incrementally.