Files
consensus/protocol
deb599d614 quasar: add the Pulsar threshold ML-DSA certificate profile (#12)
Add protocol/quasar/pulsar -- the consensus-side adapter that wires
luxfi/pulsar's threshold ML-DSA RoundSigner into Quasar as a certificate
profile. Consensus consumes Pulsar; Pulsar never consumes consensus.

Decomplected ownership (the load-bearing boundary):

  Consensus owns ORCHESTRATION: validator-set membership, committee
  sampling, session binding, canonical nonce selection, QC aggregation,
  signer bitmap, ConsensusCert assembly, retries, fallback, slashing.

  Pulsar owns CRYPTO: the two-round shape (Round1 binds the nonce,
  Round2 emits a proof-carrying z partial), z aggregation mod q, public
  hint recovery (FindHint over w' = A*z - c*t1*2^d), and the FIPS 204
  ML-DSA signature.

PulsarRoundSigner implements pulsar.RoundSigner (Round1/Round2/Finalize).
The secret-bearing FIPS 204 assembly stays package-private to luxfi/pulsar
and is injected as a pluggable core; until a reviewed Boundary-Cleared /
Carry-Elimination signer ships (pulsar.ProductionBCCSigningReady), Finalize
fails closed -- it returns a structurally-complete ConsensusCert with an
EMPTY signature and ErrProfileNotReady, and the orchestrator falls back to
Corona. No secret residual is ever opened on this path.

This forward-ports the profile onto the v1.35 release line. It consumes the
pulsar v1.9.0 pkg/pulsar package already pinned on this line -- no go.mod /
go.sum change, no dependency bump, and the new import adds zero transitive
sums. Purely additive: six new files, no existing file touched, so no
existing exported consensus symbol changes and no other consumer is affected.
The strict-PQ triple gate (engine.go generateCert: BLS + Corona + ML-DSA) is
untouched and still refuses to finalize without all three legs.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-07 17:43:43 -07:00
..