PQ Crypta Logo

aioquic — Hybrid key share whose length does not match the group named with it

This client was not driven through this test.

PQ CRYPTA PLATFORM

🏠 Main

🧪 Interactive Apps

📰 News

🛡️ PQ Crypta Proxy

👤 Account

⟨ QUANTUM ERROR PORTAL ⟩

Navigate the Error Dimensions

Not run

Not attempted.

This client was not driven through this test.

On the TLS tier this usually means more than it says. Each of these ports will negotiate exactly one key exchange group, so a client that cannot negotiate that group never completes a handshake, never establishes a connection, and leaves the server nothing to judge. For a hybrid-only port that reads as no post-quantum key exchange offered — which is a finding about the client rather than a gap in the run.

What was measured

Client
aioquic — aioquic, 1.3.0
Test
Hybrid key share whose length does not match the group named with itt-hybrid-share-length
Clause
draft-kwiatkowski-tls-ecdhe-mlkem §3.1.2, RFC 8446 §6.2, RFC 9001 §4.8 (MUST)
Class
correctness — Rejected something invalid, with the code the RFC names.
Required behaviour
Abort rather than proceed. §3.1.2 is explicit: "For all groups, the client MUST check if the ciphertext length matches the selected group, and abort with an illegal_parameter alert if it fails." The port sends 1,088 bytes where X25519MLKEM768 fixes the server share at 1,120 — the ML-KEM ciphertext whole and the 32-byte X25519 tail removed. It parses cleanly as an opaque vector, so the only thing wrong with it is its length for the group it is named with. Neither outcome lets a client derive our keys, because the shared secret needs both halves. What separates them is where it notices: a client that checks the length rejects this at the ServerHello, while one that does not carries a truncated share into decapsulation and fails later and less clearly. What is judged is the abort, not the alert value. RFC 9001 §4.8 lets a QUIC endpoint replace any alert with a generic one, so the code a client chooses is reported and not scored — and a handshake that ends with no CONNECTION_CLOSE at all is inconclusive rather than a failure, because a close that was never sent cannot be told from one that was lost.
Measured
2026-09-18

Reproduce it

The suite is the judge, so the reproduction is to point the same client at the same test and let the server report what it saw.

SESSION=$(curl -sX POST https://conformance.pqcrypta.com/session | jq -r .id)
# then drive aioquic at the test URL and read the verdict:
curl -s https://conformance.pqcrypta.com/report/$SESSION.json | jq '.results["t-hybrid-share-length"]'

What this suite is · The full grid · All clients · All tests · Findings