Files
threshold/papers/threshold-mldsa.tex
zeekay 2cc00df154 threshold: Pulsar/Lens kernel adapters + ringtail 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.

- ringtail KAT cross-oracle vs Go reference (N=16 deterministic seeds)
- ringtail+protocol+harness hardening against parallel-run flakes
- lss/adapters: drop NewXRPL/NewCardano panic; ship real XRPL address
  derivation
- ringtail 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

128 lines
5.4 KiB
TeX
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath, amssymb, amsthm}
\usepackage{hyperref}
\usepackage{booktabs}
\usepackage{graphicx}
\title{Efficient Threshold ML-DSA\\ (Integration Notes for luxfi/threshold)}
\author{Sof\'ia Celi \and Rafael del Pino \and Thomas Espitau \and Guilhem Niot \and Thomas Prest}
\date{USENIX Security 2026 — integrated into luxfi/threshold as \texttt{protocols/mldsa}}
\begin{document}
\maketitle
\begin{abstract}
This document records the reference for the Threshold ML-DSA paper
(Celi, del Pino, Espitau, Niot, Prest, USENIX Security 2026) as integrated
into \texttt{github.com/luxfi/threshold}. The implementation lives in
\texttt{protocols/mldsa/} and provides the first practical threshold
signature scheme fully compatible with NIST FIPS 204 (ML-DSA).
Output signatures are byte-compatible with standard ML-DSA, enabling drop-in
replacement of classical threshold ECDSA/Schnorr wallets with a post-quantum
scheme that keeps the standardized verification path.
\end{abstract}
\section{Summary of Construction}
The scheme tailors the template of Finally! (del Pino \& Niot, PKC 2025) to
ML-DSA's specific constraints:
\begin{itemize}
\item \textbf{Short Replicated Secret Sharing (RSS).} For $(T,N)$, sample
$\binom{N}{N-T+1}$ ML-DSA secrets $s_I \leftarrow \chi_s$ and distribute
each $s_I$ to every party in $I$. The final public key is
$\mathrm{vk} = \lfloor A\sum_I s_I \rceil$, matching the ML-DSA public
key shape.
\item \textbf{Unbalanced hyperball rejection.} Replace ML-DSA's uniform
rejection with per-party hyperball rejection. The first $\ell$
coordinates (no hint check) accept a wider ball than the last $k$
coordinates (hint check), parameterized by $\nu > 1$.
\item \textbf{Per-party + combination rejection.} Two rejection stages:
(i) each party checks its local partial response has bounded norm;
(ii) the combiner checks the aggregated $z^{(1)}$ satisfies
$\|z^{(1)}\|_\infty < \gamma_1 - \beta$ and the hint is within the
ML-DSA bound.
\item \textbf{$K$ parallel instances.} To mitigate the probabilistic abort
at $T$ parties, the protocol runs $K$ parallel sessions and outputs
the first successful one. This amortizes the cost at the expense of
bandwidth.
\item \textbf{Optimized share reconstruction.} The RSS partition minimizes
$\max_i |m_i|$ (number of secrets per party per session) via a
max-flow on the bipartite \texttt{users × secrets} graph.
For $N \leq 6$ the optimal partitions are hardcoded.
\end{itemize}
\section{Rounds and Communication}
Per-attempt signing requires three rounds (plus a one-shot commit phase):
\begin{enumerate}
\item Each party samples $r_i \leftarrow \chi_r$, computes
$w_i = A \cdot r_i$, publishes $\mathrm{cmt}_i = H_\mathrm{cmt}(\mathrm{vk}, i, w_i)$.
\item Reveal $w_i$. All parties derive
$\tilde c = H(\mu \| \mathrm{HighBits}(w, 2\gamma_2))$,
$c = \mathrm{SampleInBall}(\tilde c)$.
\item Compute local response $z_i = c \cdot s^{\mathrm{part}}_i + r_i$,
apply hyperball rejection, publish $z_i^{(1)}$.
\end{enumerate}
Per-party communication at security level ML-DSA-44 (Table~3 of the paper):
\begin{center}
\begin{tabular}{rrrrrr}
\toprule
$N \setminus T$ & 2 & 3 & 4 & 5 & 6 \\
\midrule
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 \\
\bottomrule
\end{tabular}
\end{center}
\section{Security}
Unforgeability reduces tightly to (i) the unforgeability of standard ML-DSA
and (ii) $\mathrm{MLWE}_{q,k,\ell,\chi}$ for
$\chi \in \{\chi_s, \chi_r, \chi_z\}$ (Theorem~3.2 of the paper). Static
dishonest-majority security is proven in the ROM; for $N \leq 6$ adaptive
security follows via complexity leveraging with at most 5 bits of loss.
\section{Integration Scope}
The luxfi/threshold package \texttt{protocols/mldsa} implements the scheme
on top of \texttt{cloudflare/circl/sign/mldsa} and reuses
\texttt{luxfi/lattice} primitives already present in this tree:
\begin{itemize}
\item \texttt{protocols/mldsa/params.go} — parameter sets for
ML-DSA-44/65/87, ports Tables 3, 10, 11.
\item \texttt{protocols/mldsa/rss.go} — replicated secret sharing,
with hardcoded optimal partitions for $N \leq 6$ per Appendix~B.
\item \texttt{protocols/mldsa/hrej.go} — imbalanced hyperball rejection
(Fig.~4 of the paper).
\item \texttt{protocols/mldsa/keygen.go} — centralized keygen (Fig.~5)
and DKG (Appendix~D).
\item \texttt{protocols/mldsa/sign.go} — three-round signing protocol
(Fig.~6).
\item \texttt{protocols/mldsa/combine.go} — combine + verify (Fig.~7),
producing standard ML-DSA signatures.
\item \texttt{protocols/mldsa/a\_posteriori.go} — a~posteriori key
sharing (\S3.3, Appendix~E) for migrating an existing ML-DSA key.
\end{itemize}
\section{References}
Celi, S., del Pino, R., Espitau, T., Niot, G., Prest, T.
\emph{Efficient Threshold ML-DSA}. USENIX Security Symposium, 2026.
Artifact: \texttt{doi.org/10.5281/zenodo.17963721}.
Reference implementation builds on CIRCL
(\texttt{github.com/cloudflare/circl}) and Lattigo
(\texttt{github.com/tuneinsight/lattigo}, mirrored as \texttt{github.com/luxfi/lattice}).
\end{document}