Aere Network public source. Everything here can be checked against the live chain (chain id 2800, https://rpc.aere.network). Scope note, stated up front rather than buried: consensus on chain 2800 is classical secp256k1 ECDSA QBFT. The post-quantum work in this repository is at the signature, precompile, account and transport layers. Nothing here makes the consensus post-quantum, and no document in it should be read as claiming so.
26 KiB
Aere Network Quantum-Safe Networking (Transport Layer)
Spec #30, Wave 1. Design document. Status: NOT LIVE.
This document specifies making Aere's network transport post-quantum. It is a design and rollout spec, not a change log. Nothing described here is live on Aere mainnet at time of writing. The two parts have very different costs, and this document is explicit about that: the RPC part is close to a configuration and build change, the node-to-node part is real protocol engineering. Both are marked with their honest status inline.
Scope in one line: this is transport confidentiality work (protection against harvest-now-decrypt-later on the wire). It does not touch consensus, and it is not end-to-end application messaging. See Section 6 for the hard scope boundaries.
1. The gap: layer 12
Aere's quantum-resistance story is organized as a stack of layers. Most of that stack
is already covered or on a defined roadmap. Reading the current layer map
(aerenew/build-tracker/control.json, quantumLayers):
| Layer | What it is | State today |
|---|---|---|
| 1. Signatures / accounts | PQC signature verification, PQC accounts | have (live on mainnet since the AerePQC fork, block 9,189,161) |
| 4. Encryption (ML-KEM) | ML-KEM precompile | have (precompile present; mainnet activation gated) |
| 3. Verification (zk proofs) | PQ STARK verify, off BN254 | building (#2), scope-corrected (see note) |
| 2. Consensus (validator signatures) | PQC validator seals | next (built and tested, founder + audit + N>=9 gated) |
| 5..10 | finality/light-client, bridges, agent mandates, threshold, compliance, oracles | next (roadmap) |
| 11. Migration (old accounts + network keys) | move legacy ECDSA funds to PQ, rotate network keys | gap (#14) |
| 12. Transport / networking | how nodes and clients actually connect | gap (this document, #30) |
Note on layer 3 (scope caveat, 2026-07-19 finding): the PQ STARK verifier skeleton (#2, 0x0AE8) built so far is a BabyBear + FRI STARK verifier, conformance-confirmed against Plonky3 and targeting Aere's OWN circuits. It does NOT yet verify SP1 6.1.0 proofs (SP1 6.1.0 is Hypercube / KoalaBear multilinear, a different stack), so "off BN254" for the SP1 zk-verifier path is a separate ~22 to 32 person-week retarget, not imminent. On-chain zk verifiers remain classical BN254 today. See
AERE-STARK-SP1-RECURSION-AIR-PORT-SPEC-SUMMARY.md.
Layers 1 through 11 are about what the chain signs and verifies. Layer 12 is about the pipes: the encrypted channels over which a wallet talks to an RPC endpoint, and over which one node talks to another. Today those pipes negotiate their session keys with classical elliptic-curve cryptography (X25519, secp256k1). Both key exchanges are broken by a sufficiently large quantum computer running Shor's algorithm. That is the gap this document closes on paper and stages for rollout.
Important framing, stated up front so it is not lost: the symmetric ciphers on these channels (AES-256-GCM on TLS, AES-256 on the node-to-node transport) are not the problem. Grover's algorithm only halves their effective strength, which leaves AES-256 at a 128-bit security floor, still sound. The Shor-vulnerable part of both channels is exclusively the key agreement (how the two sides derive a shared secret). So the whole of layer 12 reduces to one move, applied in two places: replace or augment the classical key agreement with a hybrid post-quantum key-encapsulation mechanism (KEM).
2. Threat model: harvest-now-decrypt-later
The concrete threat this work addresses is harvest-now-decrypt-later (HNDL): an adversary records encrypted traffic today, stores it, and decrypts it years later once a cryptographically relevant quantum computer exists. Anything whose confidentiality must outlive the arrival of that machine is at risk the moment it crosses a classically-keyed channel.
Two properties of this threat shape the whole design:
-
It is a passive, present-day attack. The adversary does not need a quantum computer now. It needs a tap and a disk now, and the quantum computer later. This is why the fix is worth doing before quantum computers exist, and why "we will upgrade when we have to" is the wrong posture: traffic recorded today is already committed.
-
It targets confidentiality, via the key exchange. HNDL breaks the recorded session by recovering the session key from the recorded handshake. It does not require breaking authentication in real time. This is exactly why hybridizing the KEM (not necessarily the certificate or the signature) is the effective and sufficient first move, and why this is a transport-confidentiality document, not a transport-authentication one. PQ authentication of the channel (PQ certificates, PQ handshake signatures) defends a different threat, an active quantum MITM at connection time, and is a later, separate concern noted in Section 6.
What is genuinely sensitive on each Aere transport surface, and therefore worth HNDL protection, differs between the two surfaces, and the document is honest about that in each part (Section 4.6 for RPC, Section 5.4 for devp2p).
3. Where transport crypto lives in Aere today
There are exactly two transport surfaces on the network, and they use different cryptographic machinery. This is the single most important fact for understanding why the effort splits so unevenly.
Surface A: public JSON-RPC over TLS. A wallet, dapp, indexer, or ethers.js
client connects to rpc.aere.network or rpc2.aere.network over HTTPS. TLS is
terminated at nginx on the box, which reverse-proxies cleartext to the local Besu
node on 127.0.0.1:8545 (Besu's RPC port is not publicly bound). This is confirmed by
the live setup for the second public RPC (aerenew/docs/RPC2-NODE-2026-07-17.md,
Section 3 and Section 5): nginx owns ports 80/443, terminates Let's Encrypt TLS, and is
the sole public path to the node. The same shape holds for the primary infra RPC. The
key exchange here is ordinary TLS 1.3, today negotiating classical groups (X25519
and the NIST P-curves).
Surface B: node-to-node over devp2p / RLPx. Validators and full nodes connect to
each other over Ethereum's devp2p protocol on TCP/UDP port 30303 (the rpc2 firewall
opens exactly this: 30303 tcp for RLPx and 30303 udp for discovery). The encrypted
transport under devp2p is RLPx, and RLPx does not use TLS. It has its own
handshake: an ECIES scheme (Elliptic Curve Integrated Encryption Scheme) over the
secp256k1 curve, deriving AES and MAC keys for the framed session. This is a
completely separate piece of cryptography from TLS, living inside the Ethereum client's
networking stack.
The consequence: making Surface A post-quantum is a change to a well-known, widely supported, standards-track TLS knob at a standard TLS terminator (nginx + OpenSSL). Making Surface B post-quantum is a change to a bespoke handshake implemented in the guts of Besu and Nethermind, with no standards-track PQ variant to simply switch on. That asymmetry is the whole story of this document.
4. Part A: post-quantum TLS on the public RPC (the near-config part)
Effort: low. This is largely a build and configuration change, not a protocol change. Status: not live; straightforward enablement.
4.1 The hybrid group: X25519MLKEM768
The mechanism is a hybrid TLS 1.3 key-exchange group, X25519MLKEM768. "Hybrid"
means the handshake runs two key exchanges concurrently and combines their outputs
into the session secret:
- X25519, the classical elliptic-curve Diffie-Hellman already in use, and
- ML-KEM-768 (the NIST FIPS 203 standardized module-lattice KEM, formerly Kyber).
Because the shared secret mixes both, the session is secure as long as either primitive holds. A quantum adversary who breaks X25519 still faces ML-KEM-768; a lattice cryptanalysis result that dents ML-KEM still leaves X25519. Hybrid is therefore strictly no weaker than the classical group it replaces, which is exactly why it is safe to deploy now rather than betting the channel on a young post-quantum primitive alone.
Real-world status of this specific group, which is what makes Part A cheap:
- It is the IETF standards-track hybrid (the
X25519MLKEM768named group, IANA TLS Supported Groups code point0x11EC), the successor to the earlier experimentalX25519Kyber768Draft00. - OpenSSL 3.5 (released April 2025, an LTS release) supports
X25519MLKEM768natively, with no external provider required. It also ships the relatedSecP256r1MLKEM768andX448MLKEM1024groups and native ML-KEM / ML-DSA / SLH-DSA. - Chrome / BoringSSL ship
X25519MLKEM768and negotiate it by default, so a large fraction of real clients already offer the group. Firefox has shipped it as well. - For OpenSSL 3.x builds older than 3.5, the reference way to add the group is oqs-provider loaded through the OpenSSL provider interface, backed by the liboqs library (the Open Quantum Safe project). This is the fallback path if a box cannot yet run OpenSSL 3.5.
4.2 Build prerequisite (the one real cost of Part A)
The only non-trivial step is that the TLS terminator must be linked against a crypto library that knows the group. Concretely, one of:
- Path 1 (preferred): OpenSSL 3.5+. Build or install nginx linked against OpenSSL 3.5 or newer. The group is then built in. This is the clean long-term path.
- Path 2 (bridge): OpenSSL 3.x + oqs-provider. Keep the existing OpenSSL, add the
oqsprovidermodule viaopenssl.cnf, which registersX25519MLKEM768as an available group. This avoids rebuilding the base TLS stack but adds an out-of-tree provider dependency.
The Aere RPC boxes run Ubuntu 24.04, whose default OpenSSL is in the 3.0.x series and
therefore does not know X25519MLKEM768 out of the box. So Part A is honestly "a
build/packaging step, then configuration," not "one line and reload." The exact OpenSSL
version currently linked into nginx on the infra box and on rpc2 is [VERIFY] (run
nginx -V and openssl version on each), which decides Path 1 vs Path 2.
Once the terminator understands the group, everything after is configuration.
4.3 nginx configuration
nginx exposes the TLS 1.3 key-exchange group list through the ssl_ecdh_curve
directive (which maps to OpenSSL's group-list API). The change is to prepend the hybrid
group ahead of the classical ones, so it is preferred when the client offers it and the
classical groups remain as fallback:
server {
listen 443 ssl;
http2 on;
server_name rpc.aere.network;
# Post-quantum hybrid first, classical groups retained as fallback.
ssl_ecdh_curve X25519MLKEM768:X25519:secp256r1;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/rpc.aere.network/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/rpc.aere.network/privkey.pem;
# ... existing reverse-proxy to 127.0.0.1:8545, CORS handling,
# rate limiting, HSTS, host allowlist as already deployed ...
}
Notes that keep this honest and safe:
- The hybrid group applies to TLS 1.3 key exchange. TLS 1.2 remains classical; that is acceptable because modern RPC clients negotiate TLS 1.3, and TLS 1.2 stays only as a compatibility floor.
- Ordering the list with the hybrid first means a capable client (Chrome/BoringSSL,
OpenSSL 3.5 clients, recent
ethers/viemruntimes on a modern Node/OpenSSL) gets the PQ group, and an old client that does not offer it falls back to X25519 with no handshake failure. There is no flag day for clients. - The server certificate is unchanged and still classical (the existing Let's Encrypt RSA/ECDSA cert). This is deliberate and correct for the HNDL threat (Section 2): the KEM protects session confidentiality; PQ certificate authentication is a separate, later concern (Section 6).
- Whether the specific nginx build in production honors
X25519MLKEM768viassl_ecdh_curve(versus needing a newer nginx that passes the group list straight through to OpenSSL 3.5) is [VERIFY] against the actualnginx -Von the boxes.
4.4 How a client verifies the negotiated group
The point of the change is only real if a client can confirm the PQ group was actually used. With OpenSSL 3.5:
openssl s_client -connect rpc.aere.network:443 -groups X25519MLKEM768 </dev/null 2>/dev/null \
| grep -i "Negotiated TLS1.3 group"
# expected: Negotiated TLS1.3 group: X25519MLKEM768
Other independent checks:
- Chrome DevTools, Security panel, shows the key-exchange group for the connection.
- A negative control:
openssl s_client ... -groups X25519should still connect (classical fallback works), proving the change is additive and not breaking.
A published verification snippet like the above belongs on the "verify yourself" page
(quantum.html) so that the claim "Aere RPC negotiates post-quantum TLS" is
independently checkable rather than asserted.
4.5 Backward compatibility and failure modes
- Old clients: unaffected. They never offer the hybrid group and negotiate X25519 as today.
- New clients: get the hybrid group automatically.
- Handshake size: ML-KEM-768 key shares are larger than an X25519 share (roughly a kilobyte-scale ClientHello key share versus 32 bytes). This is well within TLS limits and is the same overhead Chrome already ships to the whole web; it is a non-issue for RPC. Worth a one-time latency spot check after enablement, marked [MEASURE].
- Rollback: revert one directive (
ssl_ecdh_curve) and reload nginx. There is no chain state involved, no consensus impact, and no persistent change. This is as low a blast radius as an infra change gets.
4.6 What Part A does and does not protect
- Protects: the confidentiality of RPC session traffic against HNDL. This is the
genuinely valuable case, because RPC sessions can carry things whose confidentiality
matters, for example the linkage between a client IP and the set of addresses it
queries (
eth_getBalance,eth_calltargets), pending transactions submitted viaeth_sendRawTransactionbefore they are public, and query patterns that deanonymize a user. Recorded today, those are exactly the sessions an HNDL adversary would want to decrypt later. - Does not protect: on-chain data itself (it is public by design), nor the integrity or authenticity of the RPC response (that is TLS authentication plus, for the truly careful, client-side verification against block hashes). It also does not defend an active quantum MITM at connection time (PQ authentication, out of scope, Section 6).
4.7 Status
Not live. This is a straightforward enablement gated only on the build prerequisite (Section 4.2) and a founder go for touching the public RPC terminators. It carries no consensus risk and is fully reversible. It is the right first move (Section 7).
5. Part B: post-quantum devp2p / RLPx between nodes (the real-engineering part)
Effort: high. This is protocol engineering inside the client networking stack, not configuration. Status: roadmap. Implementation and interop are [MEASURE].
5.1 What RLPx does today
Node-to-node links use RLPx, the encrypted transport beneath devp2p. Its handshake is not TLS and shares none of TLS's tooling. In outline, as implemented in the Ethereum clients Aere runs (Besu on the validators and infra, Nethermind as the second client):
- The initiator sends an auth message; the recipient replies with an ack.
- Both are encrypted with ECIES over secp256k1 (the same curve Ethereum uses for account keys). Each side contributes an ephemeral secp256k1 key; an ECDH between the ephemeral keys, mixed with the static node keys and nonces, derives the session secrets.
- From that shared secret the session derives AES-256 frame-encryption keys and MAC keys, and all subsequent devp2p frames (block and transaction gossip, discovery, sub-protocol messages) ride that symmetric session.
As with TLS, the symmetric layer (AES-256) is quantum-fine. The Shor-vulnerable part is the secp256k1 ECDH key agreement inside the ECIES handshake. That is the single thing that has to change.
5.2 What making it post-quantum requires
The move is conceptually the same as Part A, hybridize the key agreement, but there is no switch to flip. It requires patching the client's RLPx handshake to run a hybrid KEM (for example X25519 or secp256k1 ephemeral ECDH plus ML-KEM-768) and to feed the combined secret into the existing key-derivation step. Concretely that means, in each client:
- Extending the auth/ack handshake messages to carry an ML-KEM encapsulation alongside the existing ephemeral public key, without breaking the RLP encoding that stock peers expect.
- Mixing the ML-KEM shared secret into the KDF that currently derives the AES/MAC keys from the ECDH secret alone.
- A capability negotiation so a hybrid-capable node and a stock node can still connect: the patched node must detect whether the peer understands the extended handshake and cleanly fall back to classical RLPx if not. Without this, turning on PQ RLPx would partition the node from every peer that has not upgraded, which on a live validator set is a liveness hazard, not just an inconvenience.
This lives in the networking internals of two independent codebases, Besu (Java, the
p2p.rlpx handshake path) and Nethermind (.NET, its RLPx handshake service). The exact
class and method surfaces to modify in each are [VERIFY] against the pinned client
versions Aere builds, and are deliberately not asserted here to avoid inventing detail.
5.3 Why this is real engineering, not config
- No standards-track PQ RLPx exists. Unlike
X25519MLKEM768for TLS, there is no ratified "PQ RLPx" named suite shipping in the upstream clients. Whatever Aere builds is either a bespoke extension or a proposal that has to be driven upstream (a natural candidate for the open AIP/EIP process rather than a private, proprietary variant). - It is a two-client, coordinated change. Because Aere deliberately runs client diversity (Besu plus Nethermind), a hybrid RLPx must be implemented compatibly in both, or the two clients stop peering, which would break the very diversity property it is meant to strengthen. That is a cross-codebase protocol-compatibility problem, the hardest kind.
- It touches the live peer graph. Rolling it across a running validator set has to be done behind negotiation and fallback (Section 5.2) and soaked on a testnet first, exactly the caution the fault-injection and cross-client-determinism work exists to provide. This is roadmap-grade change management, not a config reload.
5.4 An honest note on how much this buys today
The confidentiality value of PQ RLPx is smaller today than PQ RPC-TLS, and this document says so plainly. Most of what crosses devp2p on a public blockchain is public data: blocks and transactions that are, by design, broadcast to everyone and land on-chain in cleartext seconds later. Recording that traffic under HNDL yields information the adversary can already read from the chain.
The parts of devp2p traffic that are genuinely confidential are narrower: the peer topology and timing (who connects to whom, useful for eclipse/deanonymization work), and crucially any future private payload that rides the p2p layer. That second category is where the value grows sharply: if Aere ships a threshold-encrypted mempool (roadmap item, anti-MEV), then pre-ordering transaction contents would flow encrypted over devp2p, and HNDL protection on that channel becomes materially important. So the honest sequencing is: PQ RLPx is the correct long-term completion of layer 12, but its urgency is lower than PQ RPC-TLS now and rises with encrypted-mempool / private-flow features later. It should be built deliberately, not rushed ahead of the RPC win.
5.5 Status
Roadmap. Design as above; implementation, cross-client interop, negotiation/fallback behavior, and testnet soak results are all [MEASURE] (none performed yet). This is real client-networking engineering and should be scoped and gated as such (founder go, plus the same testnet-soak discipline used for other consensus-adjacent changes).
6. Scope boundaries (stated plainly)
These boundaries are load-bearing. Read them literally.
-
Transport confidentiality only. This entire document is about protecting the confidentiality of data in transit against harvest-now-decrypt-later. It is not about authentication, not about integrity beyond what the existing channels already provide, and not about anything on-chain.
-
Consensus is untouched and stays classical. Aere consensus remains classical ECDSA QBFT. Nothing in this document changes how blocks are proposed, sealed, or finalized. PQ transport and PQ consensus are different layers (12 versus 2); the consensus flip is a separate, higher-risk, founder-and-audit-gated item and is not in scope here.
-
The PQC signature/account layer is separate and already live. Aere's live post-quantum signature verification and PQC accounts (layer 1, the AerePQC fork) are a different mechanism from transport key exchange. This document neither depends on nor modifies them. A wallet can use a PQC account over classical TLS today, and will be able to use an ECDSA account over PQ TLS after Part A; the two are orthogonal.
-
Post-quantum secure messaging is UMBRA's domain, not Aere's transport work. End-to-end encrypted application messaging (a user messaging another user with metadata privacy and PQ E2EE) is the province of UMBRA, a separate project with its own PQXDH-based message path. It is explicitly not part of Aere's transport layer and must not be conflated with it. Aere layer 12 secures the pipes between nodes and between clients and RPC endpoints; UMBRA secures messages between people. They are different systems solving different problems. Do not merge the narratives.
-
PQ authentication of the channel is a later, separate concern. Hybridizing the KEM defends confidentiality (the HNDL threat). Post-quantum authentication of the channel (PQ TLS certificates, PQ handshake signatures, PQ node identities on RLPx) defends against an active quantum adversary impersonating an endpoint at connection time. That is a distinct threat on a longer horizon and is out of scope for this document, which is deliberately about confidentiality first.
-
Nothing here is live. RPC PQ-TLS is a straightforward enablement pending a build step (Section 4.2). devp2p PQ is real engineering on the roadmap. Neither is deployed.
7. Rollout plan
Two phases, sequenced by the effort/value split this document has argued for.
Phase 1: PQ TLS on the public RPC (do first).
Low effort, immediate and real HNDL protection for the largest and most sensitive
transport surface (wallets and clients talking to rpc.aere.network and
rpc2.aere.network). Steps:
- [VERIFY] the OpenSSL version linked into nginx on infra and on
rpc2(nginx -V,openssl version); choose Path 1 (OpenSSL 3.5+) or Path 2 (oqs-provider). - Stage the build on one endpoint first.
rpc2is the natural canary: it is the newer, independent, non-validator box, so a mistake there cannot affect validators and the primary RPC stays up. - Add
ssl_ecdh_curve X25519MLKEM768:X25519:secp256r1;,nginx -t, reload. - Confirm negotiation with the client check in Section 4.4; confirm classical fallback still works (negative control).
- [MEASURE] a one-time handshake-latency delta.
- Publish the verification snippet on
quantum.htmlso the claim is independently checkable. - Roll the same change to the primary RPC. Rollback is one directive.
Phase 2: PQ devp2p / RLPx (roadmap, after Phase 1). High effort, real cross-client protocol engineering, lower present-day urgency (Section 5.4). Steps, all gated and none started:
- Design the hybrid-KEM RLPx handshake extension with explicit capability negotiation and classical fallback; take it through the open AIP/EIP process rather than shipping a proprietary variant.
- Implement compatibly in both Besu and Nethermind; verify hybrid-capable and stock peers interoperate.
- Soak on an isolated testnet under the existing fault-injection and cross-client determinism harnesses.
- Roll across the validator set behind negotiation/fallback, founder-gated, with the same change-management discipline as other consensus-adjacent work.
- Reassess priority upward if/when a threshold-encrypted mempool or other private p2p payload lands, at which point PQ RLPx stops being topology-only protection and starts guarding genuinely confidential flow.
Completing both phases closes layer 12 of the quantum stack.
8. Open flags register
| Flag | Item |
|---|---|
| [VERIFY] | Exact OpenSSL version currently linked into nginx on the infra RPC box and on rpc2 (decides OpenSSL-3.5 path vs oqs-provider path). |
| [VERIFY] | Whether the production nginx build honors X25519MLKEM768 through ssl_ecdh_curve, or requires a newer nginx passing the group list to OpenSSL 3.5. |
| [VERIFY] | Exact RLPx handshake class/method surfaces to modify in Besu (Java p2p.rlpx) and Nethermind (.NET RLPx handshake) against the pinned client versions Aere builds. |
| [MEASURE] | One-time TLS handshake-latency delta on the RPC endpoints after enabling the hybrid group. |
| [MEASURE] | devp2p PQ: implementation, Besu/Nethermind interop, negotiation/fallback behavior, and testnet soak results (none performed yet). |
Aere Network. Spec #30, Wave 1. Transport-confidentiality design. Consensus stays classical ECDSA QBFT; PQ signatures/accounts are a separate, live layer; application messaging is UMBRA's separate domain. Nothing in this document is live.