deep-dive · July 28, 2026
Post-quantum migration without re-issuing every certificate
By Confium Project
Post-quantum migration without re-issuing every certificate
Every signature algorithm in production today is breakable by a sufficiently large quantum computer running Shor’s algorithm. RSA, ECDSA, Ed25519 — all of them.
The new post-quantum algorithms (ML-DSA, SLH-DSA) replace them. But you can’t re-issue every certificate on a single flag day — the installed base of verifiers won’t all upgrade simultaneously, and the new algorithms are still young, less analyzed, not yet trusted to stand alone.
Composite signatures are Confium’s answer. A composite signature contains the artifacts of multiple algorithms; verification succeeds only when every component verifies. Migration becomes a software upgrade, not an HSM replacement.
What a composite signature looks like
CompositeSignature {
components: [
{ algorithm: "1.3.101.112", signature: bytes(64) /* Ed25519 */ },
{ algorithm: "1.2.840.10045.4.3.2", signature: der(...) /* ECDSA-P256 */ },
{ algorithm: "2.16.840.1.101.3.4.3.18", signature: bytes(...) /* ML-DSA-65 */ },
],
}
Three signatures, three algorithms, one composite. Verification checks all three; accept only if every one passes.
The four-phase migration
Phase 1 — Classical only (today)
Your existing baseline. Every certificate signed with Ed25519 or ECDSA-P256. Verifiers accept.
Phase 2 — Hybrid (migration begins)
New certificates signed with a composite of (classical + PQ). Verifiers split:
- Upgraded verifiers check both components. They accept the composite as valid.
- Legacy verifiers don’t understand composites; they fall back to the classical component and continue to accept.
This is the key property: adding a PQ component does not break legacy verifiers. You can start emitting composite signatures today without coordinating with every downstream consumer.
Phase 3 — PQ required
Once every verifier has been upgraded, tighten the deployment policy: composite signatures must include a PQ component. Signers stop emitting classical-only signatures.
Phase 4 — PQ only
Eventually the classical component can be removed for new signatures. It’s retained for archival verification of pre-migration signatures, but new issuances are PQ-only.
Software upgrade, not HSM replacement
The entire migration happens via:
- A
confium-compositecrate update that knows about ML-DSA-65. - A plugin that provides the ML-DSA-65 verifier (currently via caller-supplied callback; native support arrives when a suitable pure-Rust verifier crate ships).
- A deployment policy update that requires the new component.
No new HSM. No re-issuance of every certificate. No flag day.
Caller-supplied PQ verifiers
For PQ algorithms without a bundled pure-Rust verifier, Confium accepts a caller-supplied verifier callback. The deployment wires its preferred ML-DSA / SLH-DSA implementation into the composite verifier:
sig = Confium::Composite::Signature.new(components)
result = sig.verify(message, {
"ML-DSA-65" => ->(pk, msg, sig) {
my_ml_dsa_verifier.verify(pk, msg, sig)
},
})
The verifier can be a Botan plugin, an in-process Rust crate, an FFI binding to a C library, or a remote verification service. A missing verifier is a hard failure, never a silent soft-accept. This is critical: the composite layer never silently accepts on the subset of components it can verify.
The WASM equivalent
The @confium/confium-wasm package supports the same callback
pattern for browser / Node.js verifiers:
import init, { CompositeSignature } from "@confium/confium-wasm";
await init();
const sig = CompositeSignature.from_json(jsonString);
const result = sig.verify(messageBytes, {
"Ed25519": "builtin",
"ECDSA-P256": "builtin",
"ML-DSA-65": (pk, msg, sig) => myExternalVerifier(pk, msg, sig),
});
console.log(result.all_verified);
Ed25519 and ECDSA-P256 ship built-in. ML-DSA-65 is a callback — bring your own verifier (FFI to a C library, WebAssembly module, or a remote service).
Defense in depth
Even setting PQ aside, composite signatures give you defense-in-depth against algorithm breaks. An attacker who breaks Ed25519 still has to break ECDSA-P256 and ML-DSA-65 to forge a composite signature. The breakdown of one algorithm doesn’t compromise your signatures.
When to start
Start now. Even if you don’t plan to migrate to PQ-only for years, begin emitting composite signatures with a PQ component as soon as your signing infrastructure supports it. The cost is a few extra hundred bytes per signature and one extra verifier per consumer. The benefit: every signature you issue today is already PQ-migration-ready.
Read more
Tags