Adds the canonical submission-doc shape adapted from luxfi/pulsar to
warp's nature (transport-agnostic envelope + posture gate, not a
threshold-sig primitive).
New files:
- SUBMISSION.md cover sheet, scope, headline claim
- PROOF-CLAIMS.md honest scope — what warp proves AND what it
does NOT (bridge-quorum trust inheritance,
PQ hardness of primitives, ML-DSA
aggregation primitive, transport-layer
integrity, validator-key custody)
- TRUSTED-COMPUTING-BASE.md TCB inventory (cryptographic primitives,
implementation, build, operational, OOS)
- PATENTS.md royalty-free patent grant + defensive
termination mirroring Apache-2.0 §3
- CRYPTOGRAPHER-SIGN-OFF.md APPROVED WITH GATES verdict; reviews
envelope.go, security_profile.go, the new
registry, and the e2e/fuzz harnesses; pins
4 open gates (cross-language port schedule
disclosure, transport-layer integration
shape confirmation, LP-073 §11 disclaimer
addition, warpcli completeness)
- DEPLOYMENT-RUNBOOK.md operator-facing — posture decision flow,
chain config, validator key rollout, prod
checklist, common failure modes, monitoring
- CHANGELOG.md Tier A push entry; semantic-versioning at
the wire-format level
- LEGACY-CLASSICAL.md operator-facing classical-opt-in policy +
three-phase deprecation timeline
(target 2027-Q4 for full removal)
- TRANSPORT.md transport-layer notes — warp produces
transport-agnostic signed envelopes
consumed by ZAP-transport-capable
subsystems (luxfi/zap inter-node); warp
itself does NOT import luxfi/zap (keeps
dependency direction clean)
Updates to existing:
- README.md Tier A status banner, submission-doc cross-links,
related-modules grid
- PQ_PROFILES.md two-layer-gate documentation (registry +
chain-mode), pointer to LEGACY-CLASSICAL.md
- SPECIFICATION.md PQ-native default banner, MLDSACertSet context-
binding section (FIPS 204 §5.2 / FIPS 205 §10.2
context-string requirement under the canonical tag
"lux-warp-cross-chain-v1")
The four open gates in CRYPTOGRAPHER-SIGN-OFF.md are documentation /
operational items, not algorithmic defects. The construction itself
is APPROVED.
No code changes in this commit; subsequent commit adds the e2e and
fuzz test files referenced by the sign-off.
10 KiB
Warp Cross-Chain Messaging — Submission Cover Sheet
This document is the Tier A cover sheet for Lux Warp 2.0, the cross-chain messaging protocol for the Lux Network. It is written for cryptographic reviewers and auditors and points at every artifact a reviewer needs.
The warp repository is the single canonical home for the
protocol: Go reference implementation in the module root, wire-
format specification in SPECIFICATION.md, KAT oracle in
cmd/envelope_kat_oracle/, post-quantum profile registry in
PQ_PROFILES.md, deployment runbook in DEPLOYMENT-RUNBOOK.md,
patent grant in PATENTS.md. There is exactly one canonical
implementation, exactly one canonical wire format, exactly one
canonical posture registry.
The repository is active (not frozen). Reviewer feedback and post-submission patches land in this same repository so the artifact chain stays auditable.
Date stamp (this revision): 2026-05-18.
Maturity stamp: Tier A — production wire format, PQ-native posture default, BSD-3-Clause-Eco licensed. Not NIST submitted; not FIPS 140-3 validated; not ACVP-validated. Cryptographic primitives (BLS12-381, ML-DSA-65, R-LWE threshold) live in their own audited modules; warp is the wire envelope + posture gate.
At a glance
| Field | Value |
|---|---|
| Protocol name | Warp 2.0 |
| Owning organisation | Lux Industries, Inc. |
| Wire format | EnvelopeV2 — RLP-framed with leading 0x02 version byte |
| Beam lane | BLS12-381 aggregate (Warp 1.x byte-equivalent) |
| Pulse lane | Pulsar / Corona R-LWE threshold signature |
| MLDSACertSet lane | FIPS 204 ML-DSA-65 per-validator attestations |
| Default posture | PQ-native (signature.NewPQNativeRegistry) — ML-DSA-65 preferred, classical opt-in only |
| Repository | https://github.com/luxfi/warp |
| Module path | github.com/luxfi/warp |
| License | BSD-3-Clause-Eco — see LICENSE |
| Patent posture | Royalty-free grant — see PATENTS.md |
| Reference implementation | Go canonical in module root |
| Cross-language ports | Rust (lux_warp), TypeScript (@luxfi/warp) — pinned to KAT manifest |
| Spec | SPECIFICATION.md (wire format) + PQ_PROFILES.md (security profiles) |
| KAT vectors | scripts/kat/envelope_kat.json (generated by cmd/envelope_kat_oracle/) |
| Cryptographer sign-off | CRYPTOGRAPHER-SIGN-OFF.md |
Headline claim
Every Warp 2.0 envelope produced under the canonical PQ-native posture binds the source-chain's MLDSACertSet (FIPS 204 ML-DSA-65 per-validator attestations) and / or PulsarPulse (R-LWE threshold signature) to the same UnsignedMessage that the classical BLS Beam attests to. Under strict-PQ mode (
pq.ModeStrictPQ) the envelope verifier REFUSES any envelope lacking PQ evidence with the canonical sentinelpq.ErrClassicalAuthForbidden.
This is the PQ-native posture claim. A chain pinned strict-PQ cannot accept a classical-only cross-chain message even when the binary supports BLS verification — the posture gate runs BEFORE any signature verification work.
What is in scope
Warp's responsibility is the envelope wire format plus the posture gate. Specifically:
-
Envelope format stability. EnvelopeV2 is byte-stable across Go / Rust / TypeScript reference implementations. KAT vectors in
scripts/kat/envelope_kat.jsonare byte-exact and cross- language conformance is the acceptance test. -
Domain separation. The Pulse lane is signed under the context tag
"WARP-PULSAR-ENVELOPE-v1"(FIPS 204 §5.2 context-string binding); the MLDSACertSet lane is signed under"lux-warp-cross-chain-v1". Both tags are distinct from any Pulsar consensus prefix ("QUASAR-PULSAR-BUNDLE-v1") — a signature on one context cannot be replayed in the other. -
Transcript binding. Every PQ lane signs over the transcript-binding inputs:
SourceChainID(32 B) ||SourceNebulaRoot(32 B) ||SourceKeyEraID(8 B BE) ||SourceGeneration(8 B BE) ||HashSuiteID(length-prefixed) ||UnsignedMessage.Bytes()(length-prefixed). Lane verification inherits this binding viapulsar.BuildSigningBytes. -
Posture gate. The
pq.Modevalue (one ofclassical,hybrid,strict-pq) gates whether the envelope is admitted. The gate is the SINGLE functionpq.ValidateMode(mode, env, verify)— five lines, one place, one error sentinel (pq.ErrClassicalAuthForbidden). -
Replay protection.
EnvelopeV2.ID() == Message.ID()— the v1 UnsignedMessage hash is the destination-chain dedup key. The ID is stable across v1 ↔ v2 lifting.
What is OUT of scope
Warp does NOT claim:
-
PQ hardness of the underlying primitives. ML-DSA-65 rests on Module-LWE / Module-SIS (NIST FIPS 204 analysis). R-LWE threshold rests on Ring-LWE (Pulsar / Corona analysis). BLS aggregate rests on the co-CDH assumption (LP-075 analysis). Warp inherits these assumptions; it does not prove them.
-
Bridge quorum security inheritance. The destination-chain 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.
-
Network-layer integrity / liveness. Warp produces signed envelopes; transport-layer integrity (encryption, replay- window, congestion control) is the responsibility of the transporter. Inter-node carriers in the Lux ecosystem use
github.com/luxfi/zapfor transport — seeTRANSPORT.md. -
Aggregation of ML-DSA attestations. FIPS 204 has no native aggregation primitive. Warp's
MLDSACertSetis N independent per-validator attestations; future Z-Chain Groth16 rollup compresses verification cost but does NOT compress the verification work to "succinct PQ" — seepulsar/classification.goand the disclaimer inpulsar/groth16_classification_test.go.
PQ-native posture — the canonical default
The signature registry (crypto/signature.NewPQNativeRegistry) is
PQ-native by construction:
r := signature.NewPQNativeRegistry() // Config.LegacyClassicalEnabled = false
r.Register(signature.SchemeMLDSA65, ...) // OK — PQ scheme
r.Register(signature.SchemeBLS, ...) // → signature.ErrClassicalRequiresOptIn
Classical schemes (bls, ed25519, secp256k1) are admitted ONLY
when the operator explicitly opts in:
r := signature.NewRegistryFromConfig(signature.Config{
LegacyClassicalEnabled: true,
})
r.Register(signature.SchemeBLS, ...) // OK with opt-in
The opt-in flag is documented in LEGACY-CLASSICAL.md alongside
the deprecation timeline. Every chain config that wants classical
fallback MUST write this flag down in its config — no implicit
fallback exists.
The chain-level gate (pq.Mode) is independent: even with the
registry opted in to classical, a chain pinned strict-pq still
refuses classical envelopes at the verifier boundary. The two
gates are decomplected (registry posture is about which schemes
are installable; chain posture is about which schemes are
trusted) — both must agree for a classical envelope to verify.
Wire-format determinism
KAT manifest at scripts/kat/envelope_kat.json is regenerated by:
cd ~/work/lux/warp && go run ./cmd/envelope_kat_oracle/
Output is byte-identical across hosts / OSes / Go versions. The
test TestE2E_KAT_PQEnvelope_WireBytesStable (in
cross_chain_envelope_e2e_test.go) recomputes the SHA-256 over
the canonical PQ envelope's wire bytes and refuses any drift.
Cross-language ports (Rust lux_warp, TypeScript @luxfi/warp)
consume the manifest and MUST reproduce envelope_wire_hex
byte-for-byte. This is the protocol's wire-stability commitment.
Verification chain
EnvelopeV2 wire bytes
ParseEnvelope / ParseEnvelopeV2 (RLP decoder; structural verify)
↓
EnvelopeV2 struct (Message + transcript + optional PQ lanes)
pq.ValidateMode(mode, env, verify) (posture gate; one function)
↓
{ classical → BLS Beam verify } ∨
{ PQ-evidenced → ML-DSA cert-set verify } ∨
{ PQ-evidenced → Pulsar Pulse verify }
↓
nil | error
Each step is a single function in a single file:
| Step | Function | File |
|---|---|---|
| Wire decode | ParseEnvelope |
envelope.go |
| Structural verify | (*EnvelopeV2).Verify |
envelope.go |
| Posture gate | pq.ValidateMode |
github.com/luxfi/pq/gate.go |
| Lane router | LanesForMode |
security_profile.go |
| BLS Beam verify | VerifyMessage / VerifyV1 |
signature.go, envelope.go |
| ML-DSA cert-set verify | MLDSACertSetVerifier.VerifyCertSet |
caller-supplied |
| Pulsar Pulse verify | pulsar.KernelVerifier.VerifyPulse |
pulsar/pulsar.go |
How to audit this submission
- Read this cover sheet for scope.
- Read
PROOF-CLAIMS.mdfor what's claimed and what's NOT. - Read
TRUSTED-COMPUTING-BASE.mdfor the TCB inventory. - Read
SPECIFICATION.mdfor the wire format. - Read
PQ_PROFILES.mdfor the posture taxonomy. - Read
LEGACY-CLASSICAL.mdfor the classical-opt-in policy. - Run
GOWORK=off go test -count=1 -race -timeout 240s ./...from the module root (expect the root warp package + crypto/ signature package green; precompile package has a transitive geth/verkle issue out of scope here). - Regenerate the KAT manifest:
go run ./cmd/envelope_kat_oracle/. Diff against committedscripts/kat/envelope_kat.json— MUST be byte-identical. - Read
CRYPTOGRAPHER-SIGN-OFF.mdfor the verdict and gates.
References
- LP-021 — Warp 1.x classical messaging.
- LP-021v2 — Warp 2.0 hybrid envelope (this spec).
- LP-073 — Pulsar lattice threshold kernel.
- LP-075 — BLS aggregate (Beam).
- LP-105 — Lux Stack Lexicon (Beam, Pulse, Prism, Horizon).
- NIST FIPS 204 — ML-DSA Module-Lattice-Based Digital Signature Standard.
- NIST FIPS 205 — SLH-DSA Stateless Hash-Based Digital Signature Standard.
Document metadata
- Name:
SUBMISSION.md - Version: v1.0 (Tier A)
- Date: 2026-05-18