Files
proofs/pulsar/output-interchangeability.tex
zeekay 4a522e0cfc rename Pulsar_M → Pulsar (drop the -M qualifier)
Pulsar is the Module-LWE threshold ML-DSA scheme; the -M qualifier
distinguished it from an older R-LWE Pulsar (now Corona) and is now
redundant. Strip it from the formal-verification tree:

  lean/Crypto/Pulsar_M/          → lean/Crypto/Pulsar/
  namespace Crypto.PulsarM       → namespace Crypto.Pulsar
  pulsar-m/ (paper directory)    → pulsar/
  Pulsar-M / PulsarM / pulsar-m  → Pulsar / pulsar in all prose

Two duplicate papers (reshare-preservation.tex + unforgeability.tex)
had a generic top-level stub AND a substantive Pulsar-M subdirectory
version. The substantive ones (the actual mechanised reductions)
replace the stubs.

PULSAR-M-SIGN-PRNG-V1 domain-separation tag → PULSAR-SIGN-PRNG-V1.
2026-05-15 15:01:22 -07:00

71 lines
3.4 KiB
TeX

%% ============================================================
%% pulsar/output-interchangeability.tex
%% ============================================================
%%
%% The Class N1 manifesto in proof form.
%% ============================================================
\subsection*{Pulsar output interchangeability with FIPS~204}
\begin{theorem}[Pulsar signatures verify under unmodified FIPS~204]
\label{thm:pulsar-output-interchange}
Let $\sigma = (\tilde c, \mathbf{z}, \mathbf{h})$ be the output of a
Pulsar $\Sign$ ceremony over a quorum $T$ with $|T| = t$, against a
public key $\mathit{pk}$ produced by Pulsar $\DKG$ (or by a
posteriori key sharing of an existing FIPS~204 key), on a message
$\mu$. Then
\[
\mathtt{ML\text{-}DSA.Verify}(\mathit{pk}, \mu, \sigma) \;=\; \mathit{accept}
\]
under the FIPS~204~\cite{nist-fips204} \S6.3 verifier, with no
threshold-specific extension fields and no Pulsar envelope.
\end{theorem}
\begin{proof}
By \Cref{thm:sign-correct} (\texttt{pulsar/spec/pulsar.tex}
\S "Threshold signing"), the aggregated $\sigma$ is byte-identical
to what a single-party FIPS~204 signer would output on the
reconstructed seed. The reconstruction step is exact over GF($q$)
(\Cref{prop:pulsar-correct-at-N-star}), and the byte-encoding step
follows FIPS~204 \S7.2 \texttt{sigEncode} verbatim. Therefore
$\mathtt{ML\text{-}DSA.Verify}$ accepts $\sigma$ for the same reason
it accepts any honestly-generated FIPS~204 signature. \qed
\end{proof}
\paragraph{Implementation requirement.}
\Cref{thm:pulsar-output-interchange} states a cryptographic
equivalence; for byte-equality of any concrete signature, the
Pulsar implementation MUST emit exactly the FIPS~204 byte
encoding of $(\tilde c, \mathbf{z}, \mathbf{h})$ with the same
canonicalisation (coefficient lifting, sign convention, packing).
The reference implementation
(\texttt{ref/go/pkg/pulsar/threshold.go:Combine}) routes through
\texttt{cloudflare/circl/sign/mldsa\{44,65,87\}.SignTo} on the
reconstructed seed, which produces the FIPS~204 byte string verbatim.
\paragraph{Cross-implementation conformance.}
The KAT replay test
(\texttt{ref/go/pkg/pulsar/kat\_test.go:TestKAT\_ThresholdSign\_Replay})
threshold-signs every KAT entry and re-verifies the output under
\texttt{cloudflare/circl/sign/mldsa\{44,65,87\}.Verify}. A
cross-implementation conformance gate against any other
FIPS-validated ML-DSA verifier (BoringSSL FIPS, AWS-LC, OpenSSL~3,
liboqs) is on the round-2 roadmap and uses the same KAT vectors.
The theorem above is what guarantees these cross-implementation
verifications succeed without any code change in the relying
party's verifier.
\paragraph{Why this is load-bearing for Pulsar.}
Class~N1 in NIST IR~8214C \S4.5 distinguishes \emph{output-
interchangeable} threshold implementations of a specified primitive
from \emph{special} threshold-friendly primitives that produce a
non-NIST-standard signature. \Cref{thm:pulsar-output-interchange}
is the load-bearing property of the entire Pulsar family: anything
that changes \texttt{Verify} -- a Pulsar-specific envelope, an
extension field, a re-canonicalisation of the byte layout -- breaks
Class~N1 and demotes the submission to Class~S1. The reference
implementation enforces this discipline structurally: every export
of the package routes signature verification through
\texttt{pulsar.Verify}, which is itself a thin dispatch over the
FIPS~204 verifier in \texttt{cloudflare/circl}.