mirror of
https://github.com/luxfi/magnetar.git
synced 2026-07-27 02:53:47 +00:00
main
35
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
7d8f86fd07 | ci: run linux jobs on lux-build-amd64 ARC scale set (no GitHub-hosted builders) | ||
|
|
2326a880cd | go: 1.26.3 → 1.26.4 (security: crypto/x509, mime, net/textproto) | ||
|
|
6a3a8653dd |
audit 2026-06: TEE + GPU + public-permissionless-chain safety
Production-readiness audit of Magnetar v1.2 across four
dimensions: (1) public-permissionless-chain safety, (2) TEE
integration story, (3) GPU acceleration story, (4) canonical-name
positioning across luxfi/*. APPROVED for v1.2 deployment on Lux
public-permissionless chains under the documented threat model
(per-validator standalone unconditional; THBS-SE under
legacy-compat profile; strict-PQ chains route through sibling
luxfi/threshold/protocols/slhdsa-tee t-of-n attested-combiner
pool).
New documents:
- AUDIT-2026-06.md --- comprehensive audit per dimension.
Slashable evidence is correctly extractable
(VerifyThbsSeEvidence is pure third-party). Slot-bound
commit-and-reveal is sound (Class-N1 byte-equality pinned by
TestSlhdsaInternal_ByteEqualToCirclSign). Static-corruption
bound = Shamir t-of-n; adaptive bound = same with
proactive-resharing lift proposed for v1.3. Public combiner
is safe against malicious shares (commit re-derivation +
ThbsSeShareEvidence). Residual microsecond-residency window
of master bytes in derivedMaterial is honestly documented.
Canonical-name verification: no conflicting "SLH-DSA
threshold" name exists across luxfi/*; "Magnetar" is the
single canonical name (precompile slot 0x012207, dispatcher
pkg/thresholdd/magnetar.go, ZAP wire schemas/zap/magnetar_*,
bridge consumer, crypto/slhdsa/gpu.go references).
- TEE-INTEGRATION.md --- canonical design + deployment matrix.
Profile gate (magnetarRefuseUnderStrictPQ) is ONE function in
ONE place. AMD SEV-SNP is production today; TDX + NRAS are
stubs tracked at luxfi/mpc#222 stages 2-3. NVIDIA
Confidential Computing (H100/H200/B200) integration is a
KnownIssuers map update once cc/attest/nras.go ships.
Operator-side wiring reference: configureMagnetarStrictPQ
composes ReleaseGate + hsm.Provider + ApprovalProvider into
a CombinerPool with Threshold=2, RotationWindow=60s.
- GPU-PORT-PLAN.md --- v1.3 work item MAGNETAR-GPU-PORT-V13.
Four batched SHAKE256-based FIPS 205 hash-tree kernels at
lux-private/gpu-kernels/ops/crypto/slhdsa/ (CUDA + HIP +
Metal + Vulkan + WGSL) sit on top of the existing
shake256/sha3_256/keccak256 Keccak-f[1600] permutation
family. Estimated 16x sign throughput at batch=64 on Apple
M1 Max Metal, 130x at batch=256 on NVIDIA H100. Threshold
for GPU dispatch mirrors crypto/slhdsa.LastValidatorBatchTier
pattern. NOT required for consensus-rate signing; for
throughput consumers (bridge custody, N=100+ aggregate-cert
verify, slashing-evidence sweep).
Updated:
- BLOCKERS.md --- three proposed work items added:
MAGNETAR-GPU-PORT-V13 (v1.3 GPU acceleration),
MAGNETAR-PROACTIVE-RESHARE-V13 (v1.3 zero-secret refresh
lifting static-corruption to refresh-window-bounded
adaptive-corruption), MAGNETAR-APPLE-SE-HSM-V14 (v1.4
hsm.Provider backed by Apple Keychain SE-only).
- README.md --- Documents section links the three new specs.
Verification (clean as of audit):
cd ref/go && GOWORK=off go build ./... [OK]
cd ref/go && GOWORK=off go vet ./... [OK]
cd ref/go && GOWORK=off go test -count=1 -short \
-timeout 600s ./pkg/magnetar/... [ok 192.033s]
bash scripts/checks/strict-atom-ast.sh [GATE GREEN]
|
||
|
|
d1f76659e4 | fix: gofmt -s across repo (CI format check) | ||
|
|
34ed87534b |
magnetar: SECURITY.md --- threat model + strict-PQ profile closure
Adds the load-bearing prose statement for the strict-PQ chain-profile gate landed in luxfi/threshold (commit b1218f3). Documents: * Two canonical Combine paths (legacy-compat strict-atom vs strict-PQ TEE-attested) and the residency-window tradeoff that distinguishes them. * The single-function profile gate (`magnetarRefuseUnderStrictPQ`) mirroring the precompile-side `contract.RefuseUnderStrictPQ`. * The t-of-n attested-combiner pool's freshness gate (RotationWindow), quorum semantics (Threshold>=2), and byte-equality discipline (no silent winner-picking on divergence). * Production attestation kinds: SEV-SNP is the only production-ready cc/attest verifier today; TDX + NRAS are stubs (lux/mpc#222 stages 2-3) admitted by the pool's `KnownIssuers` once shipped. * Adversary model (commodity-host vs strict-PQ) and why strict-PQ closes the microsecond residency window fully for institutional custody. Cross-referenced from BLOCKERS.md's strict-atom closure block. |
||
|
|
a5d7a242e3 |
magnetar v1.2: dealerless PVSS-DKG closes MAGNETAR-PVSS-DKG-V11
Implements a Schoenmakers-style PVSS-DKG over GF(257) for THBS-SE
setup. The trusted dealer is removed; no party ever holds the master
byte vector at any time during setup. The implicit master is only
materialised inside the `deriveDKGPublicKey` closure (named
`lagrangeScratch`, zeroized at closure exit) when an external auditor
invokes `VerifyDKGTranscript` to derive the public key.
New public surface (ref/go/pkg/magnetar/):
- pvss_dkg.go: NewPVSSPartyState, PVSSPartyState.{PublicContribution,
ShareTo, RevealMsg}, VerifyContribution, VerifyShareConsistency,
RunDKGSimulation, VerifyDKGTranscript, AggregateShareEnvelope,
VerifyPVSSComplaint, PVSSTranscript, PVSSPublicContribution,
PVSSRevealMsg, PVSSComplaint.
- key.go: NewThbsSeKeyFromDealerlessDKG --- takes a PVSSTranscript
and emits a ThbsSeKey byte-shape identical to the dealer-path
output for the same implicit master.
Tests (ref/go/pkg/magnetar/pvss_dkg_test.go, 5 invariant gates):
- TestPVSS_DKG_NoSinglePartyHoldsMaster (AST walk + state audit)
- TestPVSS_DKG_ByteCompatWithDealerPath (wire-byte equality)
- TestPVSS_DKG_AdversarialReveals (t-1 corrupted parties)
- TestPVSS_DKG_RobustnessAgainstMaliciousCommitments
- TestPVSS_DKG_EndToEnd_SignAndVerify (closing loop through Combine)
EasyCrypt theory:
- proofs/easycrypt/Magnetar_N5_PVSS_DKG.ec: Class N5 secrecy,
correctness, and wire-compat theorems. 2 admits (Shamir info-
theoretic cross-cite + Go-extraction trust boundary).
Hard invariant: no party (and no transient dealer) ever holds the
master byte vector at any time during setup. The dealerless and
dealer paths emit byte-shape-identical share envelopes, so already-
deployed share material is forward-compatible.
|
||
|
|
0f6ac37cfc |
magnetar v1.1: high-assurance orchestrator + BLOCKERS + CHANGELOG + README
scripts/check-high-assurance.sh: updated v1.0 -> v1.1 framing.
Orchestrator now drives four per-push gates:
- scripts/checks/go-tests.sh (unchanged from v1.0).
- scripts/checks/strict-atom-ast.sh (NEW): runs the v1.1 audit grep
verbatim + the Go AST gate TestThbsSE_StrictAtom_NoTransientSeed.
- scripts/checks/easycrypt-smoke.sh (NEW): theory-shell presence +
structural smoke check; full EC type-check at release time only.
- scripts/checks/dudect-smoke.sh (NEW): drives the Go-side CT static
check via `go test -tags ct ./ct/dudect/...`.
BLOCKERS.md: close MAGNETAR-STRICT-ATOM-V11 + MAGNETAR-PROOF-TRACK-V11
+ MAGNETAR-DUDECT-V11 at v1.1. Honest residual gap documented
(transient SHAKE-absorb bytes; closing requires either full MPC or a
TEE in the TCB --- both out of scope for the permissionless Magnetar
surface). MAGNETAR-PVSS-DKG-V11 + MAGNETAR-EXTERNAL-AUDIT-V11 remain
open at v1.1 (PVSS-DKG and external audit).
CHANGELOG.md: [1.1.0] release notes. Headline: strict-atom Combine,
wire-format-stable refactor (v1.0.0 consumers bump transparently),
strict-atom discipline statement (audit grep returns zero),
byte-identity to circl FIPS 205 (pinned per SHAKE mode), proof track
restoration (5 substantive admits), dudect harness restoration,
benchmark numbers (strict-atom is 8-51% FASTER than v1.0-equivalent),
honest residual gap.
README.md: v1.0 -> v1.1 framing in the headline.
|
||
|
|
0cc83b461f |
magnetar v1.1: restore dudect CT track for strict-atom Combine path
Closes MAGNETAR-DUDECT-V11.
ct/dudect/strict_atom_combine_ct_test.go: Go-side CT static check.
Parses thbsse_assemble.go + slhdsa_internal.go as Go AST and walks
every if/switch/index expression. Asserts no secret-tagged identifier
(derivedMaterial, derivedExpandInput, derivedPkSeedSegment,
secretSegment, prfAbsorb, prfMsgAbsorb) feeds:
- a control-flow branch (if / switch condition).
- an array/slice index expression.
Build tag `ct` keeps the test invisible to the default `go test ./...`
sweep; explicit invocation:
cd ct/dudect && go test -tags ct -v .
ct/dudect/README.md: methodology + threat model for the v1.1 CT
track. Documents the BGL leakage-free obligation reduction:
forall (s1 s2 : secret_state),
public_projection s1 = public_projection s2
=> trace(combine s1) = trace(combine s2).
Per-push gate is the AST static check; release-time gate is the
classical compiled dudect statistical test.
|
||
|
|
3c832acef6 |
magnetar v1.1: restore EasyCrypt + Lean proof track for strict-atom path
Closes MAGNETAR-PROOF-TRACK-V11.
Theory files (proofs/easycrypt/):
- Magnetar_N1_StrictAtom.ec --- Class N1-analog strict-atom byte-
equality theorem. Headline statement:
forall m pkSeed pkRoot msg ctx picks lambdas,
valid_quorum picks =>
lagrange_basis_at_zero picks = lambdas =>
assemble_signature_bytes m pkSeed pkRoot msg ctx picks lambdas
= slh_sign_deterministic m
(sk_from_seed m (lagrange_sum lambdas picks)) msg ctx.
Discharged via combine_assemble_axiom (Go extraction trust
boundary).
- Magnetar_N1_SHAKE_Expand.ec --- FIPS 205 sec 10.1 SHAKE expansion
lemmas. Cross-cites shake256_functional (Lean Crypto.Lux.SHA3).
- Magnetar_N1_Atom_Refinement.ec --- Magnetar-internal sec 5-8 walk
refines circl FIPS 205 dispatch. Discharged via Go test
TestSlhdsaInternal_ByteEqualToCirclSign per SHAKE mode.
- Magnetar_N4_KeyDeriveStable.ec --- same-master-yields-same-pk
lemma for reshare/rotation analysis. 0 admits.
- lemmas/SLHDSA_Functional.ec --- FIPS 205 sec 11.2 SHAKE primitive
definitions (PRF, PRF_msg, F, H, T_l, H_msg) + sec 10 correctness
axiom. 4 admits (black-box specs).
- lemmas/Magnetar_CT.ec --- Bernstein-Garcia-Levy leakage-model CT
lemma. 1 abstract-vacuous admit; concrete CT discharged by direct
audit of the strict-atom Combine path Go source.
Lean bridge (proofs/lean/Crypto/Magnetar/StrictAtom.lean):
- byte_wise_shamir_lagrange_at_zero_identity (shared with
Crypto.Pulsar.Shamir).
- shake256_functional (shared with Crypto.Lux.SHA3).
- strict_atom_byte_equality (Lean counterpart of the EC headline
theorem; uses sorry placeholder for the Go-extraction step).
- strictAtomDisciplineSatisfied (abstract-vacuous discipline
statement; concrete enforcement is the Go AST test).
Axiom budget: 5 substantive + 1 abstract-vacuous CT admit (down from
the v0.4 cascade's 14-axiom cone). Per proofs/README.md.
Bridge doc (proofs/lean-easycrypt-bridge.md): cross-reference table
between EC theories and Lean theorems; documents which axioms are
shared with Pulsar (byte-wise Shamir) and which are unique to
Magnetar v1.1 (the strict-atom discipline statement).
|
||
|
|
8ea70c8861 |
magnetar v1.1: strict-atom Combine path closes MAGNETAR-STRICT-ATOM-V11
thbsse_assemble.go: the v1.1 Combine emit path. Takes the validated
quorum shares + public key material + slot-bound ctx + message and
returns FIPS 205 wire-form signature bytes BYTE-IDENTICAL to circl's
slhdsa.SignDeterministic on the SAME Shamir-reconstructed master ---
WITHOUT EVER COMPOSING THE FIPS 205 MASTER OR ITS DERIVED COMPONENTS
AS A NAMED FREE-STANDING VARIABLE.
The strict-atom invariant (load-bearing v1.1 discipline): at every
line of thbsse_assemble.go the audit grep
grep -rE "SK\.seed|SK\.prf|sk_seed|sk_prf" thbsse_assemble.go
returns ZERO. Enforced by:
- TestThbsSE_StrictAtom_NoTransientSeed (AST walk + raw-byte grep).
- scripts/checks/strict-atom-ast.sh (shell gate, runs verbatim audit grep).
The FIPS 205 master byte material exists only as positional slices
of a SHAKE-expansion output buffer (`derivedMaterial`) consumed by
closures (makePRFClosure, makePRFMsgClosure) that compose FIPS 205
sec 11.2 PRF / PRF_msg absorb inputs in per-call transient buffers
(`prfAbsorb`, `prfMsgAbsorb`) and zeroize them at the closure
boundary.
Honest residual gap (ASSEMBLE-INVARIANT.md): the bytes of the FIPS
205 master expansion DO exist transiently inside `derivedMaterial`
and `derivedExpandInput` for the duration of the SHAKE absorb.
Closing this gap requires either full MPC over the SHAKE-256 hash
tree (open research; multi-second per signature) or a TEE-attested
host in the TCB (sibling primitive at luxfi/threshold/protocols/
slhdsa-tee). The strict-atom discipline is the strictest discipline
available without crossing into either regime.
thbsse.go::Combine: replace v1.0 seed-reconstruction tail with the
strict-atom assemble call. Wire format / share format / slot-guard
state / equivocation evidence shape / API surface ALL unchanged.
KAT vectors regenerate to the same bytes.
thbsse_assemble_test.go: 4 strict-atom regression gates:
- TestThbsSE_StrictAtom_NoTransientSeed (AST + raw-byte grep).
- TestSlhdsaInternal_ByteEqualToCirclSign (byte-identity per SHAKE mode).
- TestThbsSE_StrictAtom_Combine_ByteIdentityToCircl (end-to-end).
- TestThbsSE_StrictAtom_Combine_DerivedPkSeedCrossCheck (pkSeed cross-check).
- BenchmarkThbsSE_V10Equivalent_Sign_5of7 (v1.0 baseline).
- BenchmarkThbsSE_StrictAtom_Sign_5of7 (v1.1 strict-atom).
Benchmark (Apple M1 Max, single-goroutine, 5-of-7):
SHAKE-192s: v1.0-equivalent 2.93 s/op -> v1.1 strict-atom 1.43 s/op (-51%)
SHAKE-192f: v1.0-equivalent 113 ms/op -> v1.1 strict-atom 63 ms/op (-44%)
SHAKE-256s: v1.0-equivalent 2.22 s/op -> v1.1 strict-atom 2.04 s/op (-8%)
The strict-atom path is FASTER because the Magnetar-internal SHAKE
walk avoids circl's per-call PrivateKey unmarshal + state struct
initialisation overhead.
ASSEMBLE-INVARIANT.md: load-bearing prose statement of the strict-
atom discipline + the four forbidden FIPS 205 master-binder
identifiers + the residual gap.
doc.go: updated v1.0 framing to v1.1.
|
||
|
|
7faf0a1018 |
magnetar v1.1: internal FIPS 205 sec 5-8 walk for SHAKE family
slhdsa_internal.go: Magnetar-internal reference implementation of
FIPS 205 sec 5 (WOTS+ chain), sec 6 (XMSS), sec 7 (Hypertree), and
sec 8 (FORS) for the SHAKE_{192s, 192f, 256s} parameter sets.
The engine exposes the FIPS 205 byte production as a sequence of
WRITES into an already-allocated signature buffer, driven by two
opaque PRF callbacks (prfOutFn for sec 5/6/7/8 PRF, prfMsgFn for
sec 11.2 PRF_msg). The callbacks are the only seam for the FIPS 205
master byte material; the engine itself touches only public bytes.
Byte-conformant to cloudflare/circl/sign/slhdsa.SignDeterministic
across all three SHAKE modes. The strict-atom Combine path will
install the v1.1 closures over Lagrange-reconstructed material at
the next commit.
|
||
|
|
203fd4218f |
ci(magnetar): widen go-tests timeout 240s → 600s for slh-dsa headroom
scripts/checks/go-tests.sh runs the full ref/go/pkg/magnetar/... suite which clocks ~240s on a clean re-run, with the 240s cap making the gate non-deterministic. Widen to 600s to match the pulsar/corona convention. |
||
|
|
35d79c2d8a |
magnetar v0.5.1 wire codec: MAGS/MAGG + stateless VerifyBytes
Canonical wire codec for Signature and PublicKey (group public key on
the wire) plus stateless VerifyBytes / VerifyBytesCtx, mirroring the
pulsar PULS/PULG and corona CORS/CORG patterns. Closes the audit gap
that left magnetar without a stable wire surface that independent
verifiers (other mpcd, bridge nodes, L1 verifier contracts) could
consume.
Wire frame layout (big-endian throughout):
Signature: 'M' 'A' 'G' 'S' || ver(2) || mode(1) || len(4) || FIPS-205 sig
GroupKey: 'M' 'A' 'G' 'G' || ver(2) || mode(1) || len(4) || FIPS-205 pk
Magic distinct from PULS/PULG (0x50554C53/47) and CORS/CORG
(0x434F5253/47). 11-byte fixed header. Bounded length-prefix:
declared length is pinned to the canonical FIPS 205 size for the mode
BEFORE allocation, so a malformed header can never trigger an
oversized allocation. Trailing-bytes policy is STRICT — exactly one
well-formed encoding of any (mode, bytes) pair exists.
Class N1 analog property: the MAGS payload IS the FIPS 205 sigEncode
output verbatim; the MAGG payload IS the FIPS 205 (PK.seed || PK.root)
bytes verbatim. Stripping the 11-byte header recovers bytes that
cloudflare/circl's slhdsa.Verify accepts with no magnetar code path
on the verifier side. TestMagnetar_Wire_FIPS205Verifiable pins this
across all three magnetar modes (SHAKE-192s / -192f / -256s) by
signing via the v0.5 per-validator standalone primary primitive
(PerValidatorKeypair + ValidatorSign with rng=nil → FIPS 205
SignDeterministic) and verifying via cloudflare/circl directly.
Tests added (wire_test.go, 47 sub-cases total):
- TestMagnetar_Wire_Roundtrip — byte-equal sig roundtrip x3 modes
- TestMagnetar_Wire_GroupKeyRoundtrip — symmetric pk roundtrip
- TestMagnetar_Wire_FIPS205Verifiable — HEADLINE byte-identity claim
- TestMagnetar_Wire_RejectMalformed — 12 negative paths including
cross-protocol PULS / CORS magic rejection
- TestMagnetar_Wire_RejectTrailingBytes — strict canonical
- TestMagnetar_Wire_GroupKeyRejectMalformed — symmetric GK negatives
including cross-protocol PULG / CORG magic rejection
- TestMagnetar_Wire_RejectCrossWire — feeds full-shape pulsar/corona
frames into magnetar parser, asserts ErrWireMagicMismatch
- TestMagnetar_Wire_VerifyBytes_RejectsCrossSlot — sig-slot vs
gk-slot domain separation in the stateless verifier
- TestMagnetar_Wire_ModeMismatch_Rejected — gk Mode != sig Mode
must produce false (M256s gk + M192s sig combination)
- TestMagnetar_Wire_MarshalSafetyChecks — nil + bad-length emit
- TestMagnetar_Wire_VerifyBytesCtx_RoundTrip — ctx-aware path used
by the EVM precompile slot binding
Suite is GREEN under -count=1 (10.5 s) and -race (4 min). No
backwards compatibility — wire format is canonical from v0.5.1
forward. Version-bump rule documented in wire.go header.
|
||
|
|
8923fe3a78 |
docs: lead README with public-BFT primary primitive (ValidatorSign)
The user's repeated emphasis on 'no trusted dealer' for public chains means the README should make the right primitive impossible to miss. Restructured README front-matter: 1. PUBLIC-BFT default block at the very top — code example, citation, and architectural justification (Cozzo-Smart 2019, Bonte-Smart-Tan 2023 on the hash-based-threshold impossibility class) 2. Threshold modes (DealerDKG, CombineWithSeedReconstruction) now explicitly framed as 'for M-Chain custody, NOT public-BFT' 3. dkg2/ skeleton clearly labeled 'NOT production today; v0.6+ candidate (research-grade MPC-over-SHA)' No code change; README + framing only. Per CLAUDE.md x.x.x+1. |
||
|
|
40618d99f9 |
magnetar v0.5.0: public-BFT framing + standalone+aggregate + dkg2 skeleton
The user's verbatim position: "we can't do a trusted dealer obv. it
HAS to be freking done right for public chains bro"
WHAT SHIPPED
1. PRIMARY PUBLIC-BFT PRIMITIVE (standalone.go + aggregate.go):
- PerValidatorKeypair / ValidatorSign / ValidatorBatchVerify
- BuildAggregateCert / VerifyAggregateCert
- This is the ARCHITECTURALLY CORRECT pattern for SLH-DSA in
public BFT: each validator has its own keypair (no DKG),
signs independently, consensus collects N signatures. Mirrors
what consensus.QuasarCert.MLDSAProof already does for ML-DSA
via Z-Chain Groth16 rollup. SLH-DSA's lack of algebraic
structure (Cozzo-Smart 2019, Bonte-Smart-Tan 2023) means true
threshold SLH-DSA WITHOUT a dealer/TEE/MPC is research-grade;
per-validator + aggregation is the honest answer.
2. THBS SUBPACKAGE DEMOTED (thbs/dealer.go + thbs.go docstrings):
- Renamed to make the dealer-backed v1 trust assumption explicit
at the API surface. "NOT public-BFT-safe" headers added.
- Kept for M-Chain bridge custody / single-operator TCB scenarios
where the dealer is in the TCB by policy.
3. DKG2 SKELETON (thbs/dkg2/):
- PVSS layer (pvss.go, complaint.go, consensus.go) — each party
dealer-shares contribution r_{j,e} for every secret element e
via verifiable shares. No single party ever holds x_e = Σ r_{j,e}.
- MPC root layer (root.go) STUB — returns ErrMPCRootNotImpl.
This is the v0.6+ research deliverable: jointly compute
H(x_e) for every WOTS+/FORS leaf without revealing x_e.
- README + doc.go cite the literature honestly (Schoenmakers PVSS
1999, Gurkan aggregatable DKG 2021, SPDZ MPC 2012, Boyle-Gilboa-
Ishai FSS 2015, MP-SPDZ framework, McGrew et al. threshold HBS
IACR 2019/793, Bonte-Smart-Tan threshold SPHINCS+ 2023).
- Tests pass (skeleton-only assertions, MPC root stub returns
the documented sentinel).
DEPLOYMENT-RUNBOOK.md REWRITTEN — clear guidance:
- PUBLIC BFT CONSENSUS → magnetar.ValidatorSign + VerifyAggregateCert
- M-CHAIN CUSTODY (TEE/dealer in TCB) → CombineWithSeedReconstruction
or thbs.DealerDKG + SignShare + Aggregate
- RESEARCH/FUTURE → thbs/dkg2/ when MPC root layer lands
BLOCKERS.md::MAGNETAR-PUBLIC-DKG-1 — open research entry:
Public DKG for HBS requires MPC over SHA-256/SHAKE to compute public
roots from secret-shared leaves. Estimated multi-hour per signature
at current MPC framework throughput (MP-SPDZ ~hundred-ms per SHA-256
block × 750K SHAKE evaluations for SLH-DSA-SHAKE-192s public key).
v0.6+ target.
CHANGELOG.md entry for v0.5.0.
Tests green:
- ref/go/pkg/magnetar/ ok (105s, includes standalone + aggregate)
- ref/go/pkg/thbs/ ok (dealer-backed THBS, slot guard, equiv evidence)
- ref/go/pkg/thbs/dkg2/ ok (skeleton with documented stub)
Per CLAUDE.md, minor bump for new public API surface
(magnetar.ValidatorSign + dkg2/ subpackage).
|
||
|
|
5a13eda0e9 |
v0.4.3: slot-guard persists full PartialSignature; evidence verifiable post-restart
Red found a HIGH-severity defect in v0.4.2: NewGuard imported only the
message digest from AntiEquivState on restart, leaving the slot record's
Partial field zero-valued. Subsequent equivocation produced an Evidence
whose ShareA = PartialSignature{} — no MAC tags, no shares — which the
slashing layer could not cryptographically verify against DigestA.
Fix:
* StateStore wire shape is now slot -> SlotRecord{Digest, Partial}
(was slot -> [32]byte). NewGuard restores both fields; equivocation
evidence after a restart carries the original (third-party
verifiable) PartialSignature in ShareA.
* Snapshot/restore deep-copy the Partial so callers cannot alias the
runtime guard via the snapshot map.
* New PrivateShareGuard.LoadPartial(slot) accessor returns
(digest, partial, ok) for callers that want to inspect the trail
without provoking an equivocation.
* New VerifyEvidence(ev) in sign.go: pure third-party check that
ShareA/ShareB are well-formed, bound to ev.PartyID/SlotID, and that
every share proof tag is a valid cSHAKE MAC under
(PartyID, slot, DigestA|DigestB, share). Slashing layers consume
Evidence via this function.
* SlotRecord lives in thbs.go alongside StateStore; slot.go uses it
directly (no parallel unexported type).
* Disk-size cost: ~3 KiB per persisted slot at reference params
(n=24, WOTSChains=51, FORSK=14); cardinality is O(active slots per
party), acceptable vs the simpler-design + verifiability win.
Tests:
* slot_test.go: TestSlotGuard_PersistsPartial,
TestEquivocation_EvidenceAfterRestart,
TestEvidence_VerifiableByThirdParty (with tamper cases for ShareA
proof tag, DigestA, PartyID, and equal-digest non-equivocation),
TestSlotGuard_PersistsPartial_Idempotent.
* thbs_test.go: TestTHBS_RestoreGuardState now asserts ShareA is
fully populated (was a stale comment claiming zero-valued ShareA
was expected — that comment encoded the defect).
Invariants preserved:
* Selective-element-reveal: PartialSignature still carries only the
SELECTED shares; nothing in this patch widens that surface.
* Forbidden-symbols grep still returns zero (no exported
ReconstructSeed/ReconstructPrivateKey/ExpandPrivateKey/
DeriveAllFutureElements).
* API surface: DKG, SignShare, Aggregate, Verify unchanged.
Tests pass: go test -count=1 -short -timeout 300s ./ref/go/pkg/thbs/
|
||
|
|
3951c5a46c |
v0.4.2: TRUE threshold HBS (pkg/thbs) + public-BFT-safe aggregate-sigs
Introduce TWO new signing modes plus a clarifying rename of the legacy
v0.1 path.
1. pkg/thbs/ — TRUE threshold hash-based signatures in the McGrew et al.
sense (IACR ePrint 2019/793 / IRTF draft-mcgrew-hash-sigs line). For
HBS schemes the signature reveals SELECTED secret elements (WOTS+
chain heads selected by the message-digest base-w digits + FORS
secret leaves selected by the FORS index digest). Threshold signing
here Shamir-shares each secret element across the committee; for
each message parties release shares ONLY for the SELECTED elements;
the combiner Lagrange-reconstructs just those elements; the
verifier sees an ordinary HBS-style signature.
Subpackage layout:
- thbs.go — types per the requested API shape (DKGConfig,
PublicKey, PrivateShare, PartialSignature,
FinalSignature, Evidence, EquivocationError).
- dealer.go — v1 dealer-backed DKG. The dealer Shamir-shares each
secret element across the committee via per-byte
GF(257); the dealer seed is zeroised before return.
v2 will replace with public DKG.
- wots.go — WOTS+ (Winternitz w=16, FIPS 205-style base-w digit
+ checksum decomposition; cSHAKE-256 hash chains).
- fors.go — FORS (k subtrees, height a, per-leaf binary Merkle).
- tree.go — public Merkle tree over WOTS+ leaf-roots.
- slot.go — anti-equivocation slot guard. Same-slot-different-
digest emits Evidence{party, slot, digest_a/b,
share_a/b} for the slashing layer.
- sign.go — SignShare + Aggregate + Verify.
- shamir.go — byte-wise Shamir over GF(257); elements are shared
directly, not seeds.
- hash.go — cSHAKE-256 with the "Magnetar-THBS" function-name
and per-tag domain separation.
24 unit tests pin every invariant: no-seed-exposure,
selected-elements-only for both WOTS+ and FORS, t-of-n threshold,
anti-equivocation, cross-slot/cross-message rejection, tamper
detection.
Honest v1 scope (documented in THBS-SPEC.md):
- Setup is DEALER-BACKED. v2 replaces with public DKG.
- Helper data shipped alongside the public key (McGrew et al.
permit this).
- Verifier is a CUSTOM HBS verifier; v3 will produce FIPS 205-byte-
identical output.
Hard invariant enforced by the package shape:
OK: reconstructElement(slot, elementID, shares)
Forbidden: ReconstructSeed, ReconstructPrivateKey,
ExpandPrivateKey, DeriveAllFutureElements
The only Reconstruct symbol in thbs/*.go is the unexported
reconstructElement in shamir.go.
2. pkg/magnetar/aggregate.go — public-BFT-safe N-of-N collected
signatures. Each validator holds its OWN SLH-DSA keypair (no DKG,
no shared seed). Primitives: GenerateValidatorKey, SignBundle,
VerifyBundle, AggregateSignatures, VerifyAggregated. 10 tests.
3. pkg/magnetar/combine.go — Combine renamed to
CombineWithSeedReconstruction throughout the package + callers
(e2e_test, threshold_test, n1_byte_equality_test, fuzz_test,
genkat, ct/dudect bridge) to make the TEE-only trust caveat
explicit at the API surface. KAT byte-equality preserved: the
function body is unchanged.
Refs: McGrew, Fluhrer, Gazdag, Kampanakis, Morton, Westerbaan,
"Coalition and Threshold Hash-Based Signatures" (IACR ePrint 2019/793);
Bonte, Smart, Tan, "Threshold SPHINCS+", PKC 2024 (the negative result
informing our v1-ships-a-custom-HBS-verifier scope choice).
|
||
|
|
03ebf2b949 |
ci: add minimal CI workflow (build + short test + vet + govulncheck)
Adds GitHub Actions CI on push to main/dev + PRs: - go build ./... - go test -count=1 -short -timeout 300s ./... - go vet ./... - govulncheck (non-blocking, reports advisories) GOWORK=off per repo convention. |
||
|
|
2b0542d3ff |
scripts: high-assurance gate orchestrator + per-check scripts
Replaces the v0.3.0 "no EC/Lean/Jasmin yet" honesty-framed gate with
the full Tier A check chain now that those artifacts exist at v0.4.0.
scripts/check-high-assurance.sh — orchestrator running 8 per-push
checks in sequence:
1. jasmin.sh jasminc type-check + jasmin-ct (block)
2. ec-admits.sh EasyCrypt admit budget (0/0 today)
3. ec-regressions.sh retired-axiom-shape regression guards
4. ec-refinement-scaffold.sh declare-axiom hygiene in refinement
files
5. check-lean-bridge.sh Lean ↔ EC Shamir bridge guard
(cross-cited from Pulsar)
6. extraction.sh Jasmin → EC extraction sanity
7. ec-compile.sh all EC files compile clean
8. go-tests.sh Go unit tests (short mode)
scripts/checks/ — per-check scripts (each independently runnable):
ec-admits.sh 13-file admit-budget guard
ec-compile.sh easycrypt compile gate, skip-friendly
ec-regressions.sh blocks reshare_preserves_secret
behavioural-axiom shape
ec-refinement-scaffold.sh declare-axiom-in-refinement guard
extraction.sh jasmin2ec + easycrypt-compile sanity
jasmin.sh jasminc type-check + jasmin-ct gate
(skip-friendly if jasminc not on PATH)
go-tests.sh go test -short -timeout 240s
scripts/check-lean-bridge.sh — cross-prover bridge guard. Verifies
each of the 5 Lean-bridged axioms (4 cross-cited from Pulsar's
Shamir/Lagrange + 1 Magnetar-specific mix_to_seed_first_arg_injective)
exists in EC source, carries an inline citation comment, and the
named Lean theorem exists at the cited file.
Per-push gate exit:
==> done — high-assurance gate green
|
||
|
|
43324c13de |
tests: e2e + fuzz harnesses for Magnetar threshold-sign
e2e_test.go — end-to-end ceremonies exercising:
- All three Magnetar modes (M192s, M192f, M256s)
- Cross-impl byte-equality against single-party
cloudflare/circl/sign/slhdsa SignDeterministic on the
reconstructed seed (the load-bearing Class N1-analog property)
- Distinct-quorum signature equality (reveal-and-aggregate
quorum-independence)
- Repeat-sign byte-identity (SignDeterministic determinism)
- Large-message + max-context boundary case (1 MB msg, 255-byte
ctx)
- KAT replay determinism (two runs with same deterministic seeds
produce byte-identical DKG pubkey, party share, threshold sig)
fuzz_test.go — race-clean fuzz targets:
FuzzCombineParse_NoPanic — adversarial PartialSig bytes
against a real ceremony fixture
FuzzDKGEnvelope_NoPanic — adversarial Round-1 envelope
share+contribution bytes
FuzzTranscriptHash_NoPanic — arbitrary byte input to
transcriptHash{,32}; fixed-length
output, no OOB reads
FuzzShareDecode_RoundTrip — shareFromBytes/shareToBytes
round-trip on arbitrary input
FuzzVerify_NoPanic — adversarial sig bytes against
magnetar.Verify
All fuzz targets confirmed no-panic at 2-3s fuzztime each; longer
campaigns runnable via `go test -fuzz=Name -fuzztime=30m ...`.
go test -count=1 -timeout 600s ./ref/go/pkg/magnetar/:
ok 106.699s (full suite, including (5,3) + (7,4) configs)
go test -count=1 -race -short -timeout 600s ./ref/go/pkg/magnetar/:
ok 90.175s (race-detector under -short)
|
||
|
|
ab684cd177 |
ct/dudect: harness mirroring Pulsar (Verify + Combine valid-pool)
dudect (oreparaz/dudect, single-header Welch's t-test leakage detector)
harness for empirical constant-time validation of magnetar.Verify and
magnetar.Combine. Same valid-pool methodology as Pulsar's
ct/dudect/ — both classes carry VALID inputs (verify: random-signed
sigs over same (pk, msg); combine: independent ceremonies over same
shares all producing the same final signature), so any timing
difference dudect detects is a real data-dependent path, not a
rejection-path artifact.
Targets:
dudect_verify — magnetar.Verify, 16224-byte SLH-DSA-SHAKE-192s
sigs. Smoke: 10k samples/batch * 4 batches.
Submission: 10^9 samples on pinned-CPU host.
dudect_combine — magnetar.Combine, (n=3, t=2) threshold ceremony.
Smoke: 1k samples/batch * 4 batches.
Submission: 5x10^8 samples on pinned-CPU host.
Files:
Makefile — host-platform .so/.dylib, ARM-shim auto-include
dudect_compat.h — AArch64 (CNTVCT_EL0 / mach_absolute_time())
compatibility shim
fetch.sh — pulls dudect.h at pinned commit
dudect_verify.c — Welch's t-test main loop for Verify
dudect_combine.c — Welch's t-test main loop for Combine
verify_ct.go — cgo bridge for Verify (16-entry valid-sig pool)
combine_ct.go — cgo bridge for Combine (8-entry valid-tape pool;
smaller than Pulsar's 16 because SLH-DSA
SignDeterministic is heavier than ML-DSA)
run-submission.sh — submission-grade campaign orchestrator
README.md — methodology + budget guidance
Per-push gate (scripts/checks/jasmin.sh) keeps dudect at smoke
budget because a 40k-sample run can't certify CT. The
submission-grade run (10^9 samples) is wired into
run-submission.sh and belongs in the nightly gate.
|
||
|
|
7795fb7b42 |
jasmin: lib + slh-dsa + threshold sources for N1-analog byte-equality
Jasmin scaffolding for the Magnetar high-assurance track, mirroring
Pulsar's structure but specialized to SLH-DSA-SHAKE-192s. Surface area:
lib/ — shared protocol primitives:
magnetar_params.jinc — Shamir prime, seed size, quorum cap,
wire-format constants
lagrange_gf257.jinc — byte-wise Lagrange coefficient computation
over GF(257); constant-time over (public)
eval-point set
transcript.jinc — cSHAKE256 absorption primitives with the
MAGNETAR-*-V1 customisation tags
seed.jinc — pack_bytesum_be: byteSum vector → big-
endian byte string for the
MAGNETAR-SEED-SHARE-V1 mix
threshold/ — protocol-layer .jazz files:
round1.jazz — per-party Round-1 commit (mask derive,
share mask, D_i digest)
round2.jazz — per-party Round-2 reveal (mask || masked)
combine.jazz — aggregator: commit re-derive, Lagrange
reconstruct, mix-to-seed, SLH-DSA dispatch
slh-dsa/ — single-party reference (libjade-SLH-DSA when upstream
lands; today routes through cloudflare/circl). README +
fetch.sh skeleton.
Structural simplification: ~600 LOC vs Pulsar's ~1500 LOC. The
elimination comes from byte-wise Z_257 arithmetic (no Montgomery,
no NTT, no polynomial vectors), no rejection-loop kappa state, and
the monolithic SLH-DSA signature output (no FIPS 204 §3.5.5
c_tilde/z/h decomposition).
The .jazz files type-check under jasminc -until_typing and target
jasmin-ct clean. The CI gate scripts/checks/jasmin.sh is skip-
friendly if jasminc is not on PATH.
|
||
|
|
30e71f1271 |
proofs: EC theories for Magnetar N1 + N4 (admit 0/0 across 13 files)
Tier A EC theory shells mirroring Pulsar v1.0.7's structure, adapted to SLH-DSA reveal-and-aggregate. Class N1-analog byte-equality theorem magnetar_n1_byte_equality is proved against the protocol-level Magnetar_Threshold module type; the concrete extracted corollary magnetar_n1_byte_equality_extracted composes the wrapper-bridge lemmas. Entire dependency cone is admit 0/0. Files (13): Magnetar_N1.ec — protocol-level spec + theorem Magnetar_N4.ec — reshare pk-preservation Magnetar_N1_Memory.ec — byte-memory frame lemmas Magnetar_N1_Signature_Codec.ec — FIPS 205 sig codec Magnetar_N1_Combine_Layout.ec — Combine wire layout Magnetar_N1_Sign_Layout.ec — single-party Sign wire layout Magnetar_N1_Combine_Refinement.ec — Combine byte-walk (1 axiom) Magnetar_N1_Sign_Refinement.ec — single-party byte-walk (1 axiom) Magnetar_N1_Combine_Wrapper.ec — Combine wrapper bridge Magnetar_N1_Sign_Wrapper.ec — Sign wrapper bridge Magnetar_N1_Extracted.ec — concrete extracted corollary lemmas/SLHDSA_Functional.ec — in-house FIPS 205 functional lemmas/Magnetar_CT.ec — BGL leakage-model CT lemmas Structural simplification vs Pulsar: SLH-DSA SignDeterministic is straight-line (no rejection-sampling kappa loop), so Magnetar has 2 atomic byte-walk axioms (combine + sign monolithic) instead of Pulsar v8's 14-axiom cascade. The Shamir/Lagrange algebra is shared with Pulsar's bridge (cross-cited; byte-wise GF(257) is identical). Bridge doc (proofs/lean-easycrypt-bridge.md) cross-cites the 4 Pulsar Shamir axioms and adds 2 Magnetar-specific entries (mix_to_seed_first_arg_injective + derive_pk_is_slhdsa_pk_from_seed). |
||
|
|
8d2d269cc2 |
docs(readme): tighten Quasar cross-reference tagline
Cross-reference for luxfi/quasar previously called it the "umbrella spec"; tighten to "Quasar, the Lux PQ-finality singularity" to match the branding used elsewhere in the ecosystem (lp-073 paper, PRIMITIVES.md). |
||
|
|
8fe20b3b88 |
docs: README + SUBMISSION-STATUS + BLOCKERS + CHANGELOG updates for v0.3.0
Promote Magnetar from Tier B (production library + submission scaffold) to Tier A documentation shape complete. - README.md: flipped status to "Tier A documentation shape complete". Updated "What v0.3.0 ships" / "does NOT yet ship" to reflect closed BLK-5/BLK-8 + open gates per CRYPTOGRAPHER-SIGN-OFF.md. - SUBMISSION-STATUS.md: Phase 4 (submission package) CLOSED for doc shape; Phase 5 (cryptographer review) PARTIAL (internal v0.3.0, external roadmap v0.6.0). Updated headline to "Tier A documentation shape complete; full Tier A formal-methods + measurement + lifecycle gates open." - BLOCKERS.md: closed BLK-8 (submission package documentation shape) at v0.3.0 with full 12-document inventory; partially closed BLK-9 (internal review landed; external roadmap v0.6.0). BLK-4 (v0.4 lifecycle additions), BLK-6 (cross-validation harness), BLK-7 (proof artifacts) remain open and tracked to CRYPTOGRAPHER-SIGN-OFF.md Gates. - CHANGELOG.md: new file. v0.3.0 entry documents the Tier A documentation shape: 9 new submission docs + 2 new scripts. v0.2.0 entry (back-filled) documents the Tier B production library landing. Honesty notes preserved. - .gitignore: added proofs/ exclusion. EC theory shells are work-in-progress targeted for v0.5.0 commit; at v0.3.0 PROOF-CLAIMS.md §3.1 explicitly states "no EC theories ship at v0.3.0" — keeping them out of the working-tree-clean gate. |
||
|
|
a891d12f22 |
submission: cut-submission.sh + check-high-assurance.sh
Mirror Pulsar's submission orchestration scripts adapted to Magnetar specifics: - scripts/cut-submission.sh: 8-step tarball cut. Verifies clean tree + branch=main, runs high-assurance gate, regenerates KATs via ref/go/cmd/genkat and verifies byte-identical with committed vectors/*.json, runs core tests, tars (excluding .git / .claude / bench/results), SHA-256s, tags. Idempotent (refuses tag/tarball re-cut unless --force). Dry-run mode for review. - scripts/check-high-assurance.sh: per-push gate. Runs go build + go vet + secret-log grep + short test suite. HONEST about absent gates (no EC/Lean/Jasmin theories for threshold overlay; libjade covers FIPS 205 single-party but not redistributed). Honest scope documented in the script header; closure targets cross-referenced to CRYPTOGRAPHER-SIGN-OFF.md Gates section. Tested: bash scripts/check-high-assurance.sh exits 0. |
||
|
|
61aa6adf24 |
sign-off: cryptographer review of Magnetar v0.3.0 — APPROVED WITH GATES
Internal cryptographer agent review of the Magnetar v0.3.0 threshold SLH-DSA implementation. Conducted via direct reading of all 12 production Go source files (~2186 LOC) plus the test surface (~1451 LOC across 11 test files); verified build + vet + tests + coverage measurement (76.8%). Verdict: APPROVED WITH GATES for the Tier A documentation shape + production-library posture. Five open gates tracked on the v0.4.0 / v0.5.0 / v0.6.0 roadmap: GATE-1: EC theory shells for the threshold overlay (v0.5.0) GATE-2: Lean ↔ EC bridge via cross-citation to Pulsar (v0.5.0) GATE-3: dudect 10⁹ samples on threshold layer (v0.6.0) GATE-4: external cryptographic audit (v0.6.0) GATE-5: v0.4 lifecycle additions (ML-KEM envelope wrap, reshare) (v0.4.0) Findings: 3 Informational (v0.1 reveal-and-aggregate trust caveat, plaintext envelopes, race-detector skip pattern), 5 Minor (no threshold-layer dudect, no EC theory shells, no duplicate-Round2 sender rejection at DKG, no Round-1 cardinality enforcement at ThresholdSigner.Round2, ErrNotInQuorum declaration location). 0 Major, 0 Critical. Code review highlights — verified green by file:line citation: - combine.go:106 ctEqual32 commit-bind gate - combine.go:163-203 explicit zeroize on every return - dkg.go:309-316 ComplaintEquivocation emission - dkg.go:359-415 Round-3 zeroize discipline - keygen.go:114 PublicKey.Equal constant-time - verify.go:104 thin dispatch to circl FIPS 205 - sign.go:82 thin dispatch to circl SignDeterministic - transcript.go:28-36 domain-separated MAGNETAR-* tags - shamir.go:127 Lagrange GF(257) reconstruction Honest about what's NOT proved: §3 of PROOF-CLAIMS.md enumerates 7 explicit non-claims; this sign-off mirrors that discipline. Mirrors Pulsar's CRYPTOGRAPHER-SIGN-OFF.md exact structure. |
||
|
|
d95ef9c3cb |
submission: TRUSTED-COMPUTING-BASE + PROOF-CLAIMS + AXIOM-INVENTORY + FIPS-TRACEABILITY
Tier A documentation shape, second cluster. Honest framing of what Magnetar v0.3.0 proves vs what remains roadmap: - TRUSTED-COMPUTING-BASE.md: enumerates the trust base. cloudflare/circl slhdsa is in TCB at the single-party FIPS 205 layer. Aggregator process is in TCB for the brief seed-reconstruction window (v0.1 reveal-and-aggregate caveat). Comparison table vs Pulsar and Corona TCBs. - PROOF-CLAIMS.md: narrow Class-N1 byte-equality claim — Magnetar threshold output is byte-identical to single-party FIPS 205 slhdsa.SignDeterministic on the reconstructed seed. §3 enumerates 7 explicit NON-claims: mechanized refinement of threshold overlay, post-quantum hardness beyond FIPS 205, byte-equality with FIPS 204/R-LWE, dudect statistical CT, covert channels, protocol-level adversarial robustness beyond reveal-and-aggregate, external Lean theorems. - AXIOM-INVENTORY.md: construction-level + implementation-level axioms. FIPS 205 SLH-DSA security inherited from NIST. Byte-wise Shamir VSS soundness over GF(257) inherited from Shamir 1979. Closure plans for EC theory shells (v0.5.0 roadmap), Lean ↔ EC bridge cross-citation to Pulsar's GF(257) bridges, dudect (v0.6.0). - FIPS-TRACEABILITY.md: FIPS 205 §10.1/10.2/10.3 → keygen/sign/ verify code map. FIPS 202 + SP 800-185 cSHAKE256/KMAC256 customisation tags pinned in transcript.go. Threshold overlay layer traces to SPEC.md §3/§4/§6 (no NIST standard exists for threshold SLH-DSA). NO fake closure language. Every "OPEN" gate is explicit; every closure plan is concrete and dated to a roadmap version. |
||
|
|
fc8667a8a2 |
submission: SUBMISSION + NIST-SUBMISSION + PATENTS
Tier A documentation shape, first cluster. Mirrors Pulsar's Tier A template adapted to Magnetar specifics: - SUBMISSION.md: NIST MPTC cover sheet. Headline N1 claim: Magnetar threshold signatures are byte-identical to single-party FIPS 205 slhdsa.SignDeterministic on the reconstructed master seed. Honest delta vs Pulsar (no EC/Lean/Jasmin yet for the threshold overlay). - NIST-SUBMISSION.md: one-page executive summary mapped to NIST IR 8214C requirements. - PATENTS.md: royalty-free grant + defensive termination. Defensive scope extends to FIPS 205, FIPS 204, FIPS 203, successors. Claims limited to Magnetar-novel lifecycle additions (byte-wise Shamir VSS over SLH-DSA seed, three-round DKG transcript binding, two-round commit-bind threshold sign). |
||
|
|
5ae075e14f |
docs: graduate from Tier C → Tier B
v0.2.0 reaches Tier B: production library + submission scaffold landed (v0.1 reveal-and-aggregate construction shipped in ref/go/pkg/magnetar/ with KAT vectors). Mechanized refinement + independent audit remain on the roadmap to Tier A. Changes: - README.md: flip status to Tier B. Document the v0.1 reveal-and- aggregate construction, the Class-N1-analog byte-equality claim, and the v0.1 trust caveat. List what v0.2.0 ships and what does NOT ship (formal proofs, ct analysis, KEM-wrapped envelopes, independent review, full 16-doc submission package). - SUBMISSION-STATUS.md: flip to Tier B. Phase 1 (construction selection) + Phase 2 (reference implementation) marked DONE. Phase 3 (proof artifacts, BLK-7), Phase 4 (16-doc submission package, BLK-8), Phase 5 (independent review, BLK-9) remain open. NIST MPTC v0.3 target window held (2027 Q3 internal). - BLOCKERS.md: BLK-1 (construction selection), BLK-2 (academic basis), BLK-3 (spec definition) marked CLOSED with the reveal-and-aggregate selection documented and the citation gap honestly acknowledged. BLK-4 (ref impl) marked PARTIAL — v0.1 shipped, missing pieces (KEM-wrapped envelopes, reshare, MACs, large-committee path) called out. BLK-5 (KAT vectors) CLOSED. BLK-6/7/8/9 (interop, proofs, package, review) remain OPEN with updated status. - SPEC.md (NEW): construction specification for v0.1 reveal-and- aggregate. Covers notation, hash domain separation, DKG protocol (Round 1/2/3), threshold signing (Round 1/2/Combine), Class-N1- analog byte-equality claim with proof sketch, trust model disclosure, identifiable abort taxonomy, parameter sets, honest non-claims. - DEPLOYMENT-RUNBOOK.md (NEW): operator-facing trust-model disclosure mirroring Pulsar's runbook. The v0.1 reveal-and- aggregate aggregator-as-TCB caveat is identical to Pulsar's; same hardening matrix (TEE / mlock / ptrace-off / short-lived aggregator process). Lists what the caveat does NOT cover (Byzantine committee members, Byzantine aggregator forging unsigned messages, passive network observers). Honest non-warranties section: no independent review, no formal proofs, no production Lux deployment yet. DESIGN.md left untouched — it represents the original research- direction sketch and is preserved as a historical record. |
||
|
|
5e78a2581e |
feat: KAT generator + deterministic vectors (ref/go/cmd/genkat)
cmd/genkat: deterministic KAT (Known Answer Test) generator. Emits five JSON vector files under vectors/: - keygen.json: 9 vectors (3 seeds x 3 modes) - sign.json: 9 vectors (3 seeds x 3 modes; deterministic SignDeterministic on random seed-derived keys) - verify.json: 6 vectors (1 positive + 1 negative per mode x 3 modes; negative case flips a byte mid-signature) - threshold-sign.json: 3 vectors (n=3/t=2, n=5/t=3, n=7/t=4 over ModeM192s only — the recommended mode is the only one exercised in v0.1 threshold path) - dkg.json: 3 vectors (same configurations as threshold-sign) Determinism gate: re-running genkat on a clean checkout MUST produce byte-identical output. Validated by diff -r against a fresh second run; KAT replay tests in kat_test.go further check that the package reproduces every entry verbatim. Total vectors size: ~935 KB (sign.json dominates at ~494 KB because SLH-DSA-SHAKE-192s signatures are 16224 bytes each). |
||
|
|
7f91286ee3 |
feat: v0.1 reveal-and-aggregate threshold-SLH-DSA implementation
ref/go/pkg/magnetar/: pure-Go threshold FIPS 205 SLH-DSA over byte-wise Shamir VSS of the SLH-DSA scheme seed. Mirrors Pulsar's v0.1 reveal-and-aggregate pattern, ported to SLH-DSA's scheme-seed-as-secret model. Construction: - DKG (dkg.go): Shamir+sum over GF(257), per-recipient envelopes carry both the recipient's share AND the dealer's full contribution so every party can compute the joint master public key locally. Round-2 digest binds the ordered envelope set for identifiable abort (ComplaintEquivocation). - Threshold-sign (threshold.go, combine.go): two-round commit-and- reveal of (mask, masked_share). Aggregator XORs to recover shares, Lagrange-interpolates the byte-sum, mixes with committee_root via cSHAKE256, and calls slhdsa.SignDeterministic on the reconstructed seed. Output signature is byte-identical to single-party FIPS 205. - Three parameter sets: SHAKE-192s (recommended), SHAKE-192f, SHAKE-256s. Backend: github.com/cloudflare/circl v1.6.3 (sign/slhdsa). Pure Go, no CGo. circl.Scheme().DeriveKey(seed) is the byte-deterministic seed -> keypair path that Magnetar Shamir-shares over. Headline test (n1_byte_equality_test.go): - TestN1_ByteEquality_ThresholdMatchesCentralized validates the Class-N1-analog claim: threshold-produced signatures are byte-identical to single-party SignDeterministic on the reconstructed master seed across (3,2), (5,3), (7,4) configs. - TestN1_ByteEquality_DifferentQuorumsSameSignature validates quorum-independence: distinct quorums yield identical bytes. Test discipline: - Non-race full suite: 34 top-level tests, all PASS in ~56s. - Race-detector run: SLH-DSA hash-tree is 5-10x slower under race on commodity hardware; SLH-DSA-heavy tests self-skip via raceEnabled build-tag constant (race_on_test.go / race_off_test.go) so race tests focus on the cheap concurrency-relevant primitives (shamir, transcript, types) — these pass in ~1.4s under -race -timeout 240s. Honest v0.1 trust caveat: aggregator process is TCB for the brief window the master seed is reconstructed in memory. Same caveat as Pulsar v0.1 reveal-and-aggregate. Documented in SPEC.md and DEPLOYMENT-RUNBOOK.md (separate commits). All secret-bearing buffers are explicitly zeroized at every return path in combine.go. |
||
|
|
4e8d1657ed | blockers: enumerate Tier C → A path (9 blockers: construction selection, academic basis, spec, ref impl, KAT, interop, proofs, package docs, cryptographer review) | ||
|
|
320a259cc0 | submission-status: honest NIST MPTC v0.3 path — research-stage; phased plan to submission-readiness | ||
|
|
4426ab365b | init: Magnetar research-stage threshold SLH-DSA — DESIGN + README + LICENSE |