Align the Warp ZAP standard spec docs to the shipped v1.22.0 code.
The signed subject is `Message` (formerly the RLP UnsignedMessage /
draft SignedCore); the signed wire object is `Envelope` (formerly
WarpEnvelope / EnvelopeV2). Constructors/parsers: NewMessage /
ParseMessage / NewEnvelope / ParseEnvelope.
Documentation/identifier-consistency pass only:
- No .go files touched; no wire/crypto VALUES changed. Frozen
constants kept verbatim: digest tag "LUX-WARP-ZAP-CORE-v1",
per-lane DSTs BEAM/PULSE/MLDSA, kind bytes 0x01/0x02, legacy
-Keccak256 for D, "LWZP"||0x01 magic.
- SPECIFICATION.md rewritten to the ZAP model: Message + Envelope,
digest D = keccak256("LUX-WARP-ZAP-CORE-v1" || zap_c14n(Message)),
the three signature lanes, and the canonical-TLV wire format.
- README, TRANSPORT, SUBMISSION, PROOF-CLAIMS,
TRUSTED-COMPUTING-BASE, CRYPTOGRAPHER-SIGN-OFF, PATENTS, LLM
updated to the shipped names and the keccak256 digest D (the
earlier docs described a retired RLP/SHA-256/EnvelopeV2 model).
- "UnsignedMessage"/"EnvelopeV2" retained only as named legacy
artifacts (Avalanche RLP lineage), never as current types.
11 KiB
PROOF-CLAIMS — Lux Warp Envelope Soundness
What warp proves — and what it does NOT. Companion document to
SUBMISSION.md(cover sheet),TRUSTED-COMPUTING-BASE.md(TCB),SPECIFICATION.md(wire),PQ_PROFILES.md(posture taxonomy), andCRYPTOGRAPHER-SIGN-OFF.md(verdict + gates).Read this before reading the verifier code. The framing matters as much as the bytes.
§1 The narrow claim
The strongest precise statement supported by the warp implementation:
Warp envelope soundness (operational). Under the trusted- computing base in
TRUSTED-COMPUTING-BASE.mdand the residual assumptions enumerated in §3 below, every byte streambfor whichwarp.ParseEnvelope(b)returnsenv, nilANDpq.ValidateMode(mode, env, verify)returnsnilfor some non-classicalmodecarries cryptographic evidence that:
- The source-chain validator set (at the time of signing) attested to the digest
Dof the embeddedMessage, AND- The attestation binds to every
Messagefield —NetworkID,SourceChainID,SourceNebulaRoot,SourceKeyEraID,SourceGeneration,HashSuiteID,Payload— becauseDis computed over the fullMessagec14n, AND- Under
mode == strict-pq, the attestation is produced under a NIST PQ-standardized algorithm (FIPS 204 ML-DSA-65) or a Lux R-LWE threshold signature (Pulsar / Corona).
This is the operational soundness claim. It is implementation- level (in the spirit of TLS 1.3 RFC 8446 §A — operational rules) rather than reduction-level (in the spirit of Bellare-Rogaway authenticated encryption). The corresponding reduction-level claim (soundness in the random-oracle model + co-CDH assumption for BLS
- MLWE/MSIS for ML-DSA + RLWE for Pulsar) inherits FROM the primitive analyses (FIPS 204, FIPS 205, LP-073, LP-075).
§2 What is established
| Aspect | Status |
|---|---|
| Wire format byte-stability across Go / Rust / TS | ✅ KAT manifest committed; cross-language ports gated on byte-equality |
| ZAP encode / decode round-trip | ✅ TestEnvelopeRoundTrip + fuzzer (FuzzEnvelope ≥ 100k execs/run) |
| Legacy-byte rejection (no cross-version path) | ✅ TestParseEnvelopeRejectsLegacyRLP; ZAP magic refuses RLP (0xc0..0xff) and the legacy 0x02 byte |
| Domain-separation tag distinctness | ✅ LUX-WARP-ZAP-{BEAM,PULSE,MLDSA}-v1 mutually distinct (TestLaneSigningBytesDistinct); distinct from QUASAR-PULSAR-BUNDLE-v1 |
| Transcript-binding completeness | ✅ All Message fields fold into D (TestMessageTranscriptMutationsDistinct, TestPulseSigningBytesBindsAllTranscriptFields) |
| Posture gate's monotonicity | ✅ pq.ValidateMode returns the SAME error for all classical envelopes under strict-PQ (pq.ErrClassicalAuthForbidden) |
| Registry's classical opt-in gate | ✅ TestRegister_Classical_OptIn / TestNewPQNativeRegistry_RefusesClassical |
Replay protection (ID = D) |
✅ TestE2E_ID_PreservedAcrossWire, TestEnvelopeIDStable |
| Decoder panic-freedom | ✅ FuzzEnvelope + FuzzEnvelopeRaw + FuzzZapReader + FuzzSignatureSchemeLegParser + FuzzCorruptedMLDSACertSet (≥ 100k execs/run) |
| BLS12-381 aggregate verify | ✅ Inherited from luxfi/crypto/bls (audited primitive) |
| ML-DSA-65 single-party verify | ⚠ Inherited from luxfi/crypto/mldsa (Cloudflare CIRCL backend) |
| Pulsar / Corona threshold verify | ⚠ Inherited from luxfi/pulsar / luxfi/corona (Lux primitives) |
| Bridge-quorum trust inheritance | ❌ Out of scope — verifier's responsibility |
| ML-DSA aggregation primitive | ❌ NOT present in FIPS 204 — see §3.3 |
| Network-layer transport security | ❌ Out of scope — see TRANSPORT.md |
Legend: ✅ established here; ⚠ inherited from a separately-audited module; ❌ explicitly out of scope.
§3 What is NOT proved (and why)
§3.1 NOT proved: lattice-hardness of ML-DSA / R-LWE
Warp says nothing about the post-quantum hardness of ML-DSA or R-LWE. ML-DSA's security rests on Module-LWE and Module-SIS hardness assumptions (NIST FIPS 204 analysis); R-LWE threshold rests on Ring-LWE hardness (Pulsar / Corona analysis). Warp inherits these assumptions; it does not prove them.
The defensible PQ-safety claim:
Lux Warp binds NIST-standardized post-quantum signatures (FIPS 204 ML-DSA-65) and Lux R-LWE threshold signatures to the same transcript that the classical BLS aggregate signs. Under
pq.ModeStrictPQthe verifier REFUSES envelopes lacking PQ evidence, so a chain pinned strict-PQ cannot accept a classical- only message.
NOT defensible:
Warp is proved post-quantum secure.
§3.2 NOT proved: bridge-quorum trust inheritance
Warp's envelope verifier validates the source-chain's signature material under the source-chain's validator set + quorum. A compromised source-chain validator set produces valid-but-malicious envelopes that warp cannot detect. Bridge-level trust is the verifier's responsibility, not warp's.
Concretely: if 67% of the source chain's BLS / ML-DSA key material is exfiltrated, an adversary can forge a Warp envelope that verifies. The destination chain SHOULD use a trust-on-first- use (TOFU) snapshot of the source chain's validator set, validator slashing for double-signing, and / or a multi-source-chain quorum override — none of these are warp's responsibility.
§3.3 NOT proved: ML-DSA aggregation
FIPS 204 has no native aggregation primitive. Warp's MLDSACertSet
is N independent per-validator attestations; the wire-byte cost
scales linearly with N. The verification cost is reducible via
Z-Chain Groth16 rollup (LP-307) but that compresses the
classical verification cost — the resulting succinct proof is
itself a classical primitive (Groth16 over BN254 — Shor-vulnerable).
This is the disclaimer pinned in pulsar/classification.go and
pulsar/groth16_classification_test.go Gates 6A / 6B:
A Groth16 wrapping of ML-DSA cert-set verification is a CLASSICAL succinct proof of post-quantum signature verification. The aggregated verification cost is succinct; the underlying attestations are PQ; but the aggregation primitive is classical and Shor-vulnerable.
True PQ aggregation requires either a Falcon-style native aggregation or a STARK-wrapped ML-DSA — both are research directions, not production primitives.
§3.4 NOT proved: side-channel safety in this module
Warp's contribution is wire-format + posture-gate logic; the
cryptographic primitives live in luxfi/crypto/bls, luxfi/crypto/ mldsa, luxfi/pulsar, luxfi/corona. Constant-time analysis of
those primitives lives in their respective TCB documents:
- BLS12-381:
blstupstream constant-time; reviewed. - ML-DSA-65: Cloudflare CIRCL backend; reviewed.
- Pulsar threshold: jasmin-ct gated 3/3 in
~/work/lux/pulsar/ct/. - Corona threshold: dudect harness in
~/work/lux/corona/ct/.
Warp's wire-format code paths are NOT secret-dependent (the envelope contents are public-by-construction — they are cross-chain messages), so warp itself does not need constant-time analysis at the wire-format layer.
§3.5 NOT proved: network-layer integrity / liveness
Warp produces and verifies signed envelopes. Transport-layer integrity (encryption, replay window, congestion control, DDoS resistance) is the responsibility of the transporter.
In the Lux ecosystem, inter-node carriers use
github.com/luxfi/zap for transport — see TRANSPORT.md for
the integration shape. Warp envelopes are carried verbatim by
ZAP (no transformation); ZAP provides the transport-layer
properties (TLS 1.3 with hybrid X25519 + ML-KEM-768 key
exchange when configured).
§3.6 NOT proved: validator-key custody
Warp consumes per-validator BLS / ML-DSA / threshold-share key
material. Custody of that material (HSM integration, key rotation,
deletion on validator exit) is the operator's responsibility. The
signer/ and signature-aggregator/ subpackages provide the API
surface; the custody implementation lives in operator-specific
deployments (e.g. ~/work/lux/operator).
§4 The honest one-paragraph version
Lux Warp is a transport-agnostic, wire-stable, PQ-native cross-chain envelope format. Its contribution is (a) the
EnvelopeZAP canonical-TLV layout ("LWZP"‖0x01magic +0x02kind byte) over a single keccak256 digestD, (b) the canonical PQ-native registry (signature.NewPQNativeRegistry) which refuses classical primitives without an explicitLegacyClassicalEnabledopt-in, (c) the single-function posture gate (pq.ValidateMode) that dispatches the chain's mode (classical / hybrid / strict-pq) to the right verifier path, and (d) the per-lane domain-separation tagsLUX-WARP-ZAP-{BEAM,PULSE,MLDSA}-v1that prevent cross-lane signature replay. The underlying primitive hardness (BLS / ML-DSA / R-LWE) is inherited from their respective audited modules; the bridge-quorum trust model is the verifier's responsibility; the transport-layer integrity is ZAP's responsibility. Warp's narrow operational soundness claim is implementation-level wire-and-posture correctness, NOT a reduction-style cryptographic-security proof.
§5 Refinement chain (what's connected to what)
Envelope wire bytes
parses to (ZAP decoder, structural Verify)
Envelope in-memory struct
routed by pq.ValidateMode(mode, env, verify)
{ Beam ∨ Pulse ∨ MLDSACertSet } lane
verified by the lane's primitive verifier
{ BLS12-381 aggregate ∨ Pulsar R-LWE threshold ∨ ML-DSA-65 single-party }
primitive correctness inherits from
{ LP-075 ∨ LP-073 ∨ FIPS 204 }
Each arrow is a single function in a single file. Each primitive correctness claim lives in the primitive's own module — warp does NOT re-prove what it inherits.
§6 What an auditor verifying this protocol should do
- Read
SUBMISSION.mdfor context and scope. - Read
TRUSTED-COMPUTING-BASE.mdfor the TCB inventory. - Read
SPECIFICATION.mdfor the wire format byte-by-byte. - Read
PQ_PROFILES.mdfor the posture taxonomy. - Read
LEGACY-CLASSICAL.mdfor the classical-opt-in policy. - Run the test suite:
Expect: root warp package green; signature registry green.
cd ~/work/lux/warp GOWORK=off go test -count=1 -race -timeout 240s ./ ./crypto/signature/... - Run the fuzz harnesses for ≥ 60 s each:
Expect: zero panics, zero new corpus crashes.
GOWORK=off go test -fuzz=FuzzEnvelope -fuzztime=60s ./ GOWORK=off go test -fuzz=FuzzSignatureSchemeLegParser -fuzztime=60s ./ GOWORK=off go test -fuzz=FuzzCorruptedMLDSACertSet -fuzztime=60s ./ - Regenerate the KAT manifest:
Diff against committed
GOWORK=off go run ./cmd/envelope_kat_oracle/scripts/kat/envelope_kat.json— MUST be byte-identical. - Read
CRYPTOGRAPHER-SIGN-OFF.mdfor the verdict and gates.
Document metadata
- Name:
PROOF-CLAIMS.md - Version: v1.0 (Tier A)
- Date: 2026-05-18