PQ Crypta Logo

425 (Too Early) in answer to a request sent as early data

Handle being told the request arrived too early. §5.2 says a user agent "SHOULD retry automatically, but any retries MUST NOT be sent in early data" — so retrying on the 1-RTT keys and handing the 425 back to the caller are both conformant, and the report says which happened. Falling over is not one of the options. This is the only port that *accepts* early data instead of refusing it, which is what makes the 425 exchange possible at all. What it does not check is §4's rule that unsafe methods must never be sent in early data: reading the method would mean QPACK-decoding the request, which this suite deliberately never does. Reaching it needs a session ticket from an earlier connection to this same port, so a client that connects once has none.

PQ CRYPTA PLATFORM

🏠 Main

🧪 Interactive Apps

📰 News

🛡️ PQ Crypta Proxy

👤 Account

⟨ QUANTUM ERROR PORTAL ⟩

Navigate the Error Dimensions

q-zero-rtt-replay · RFC 8470 §5.2 · discretionary · layer quic · udp/4497 · SHOULD

Passing this means: The RFC permits either behaviour; the report says which was chosen.

Anomaly type: response_stream

How each client answered

ClientVersionVerdictWhat happened
curl ngtcp2/1.11.0 Inconclusive The run did not exercise this test: the client sent no early data, so it was never answered 425. 0-RTT needs a session ticket from an earlier connection to this same port, and a client that connects once has none.
quinn noq fork Inconclusive The run did not exercise this test: the client sent no early data, so it was never answered 425. 0-RTT needs a session ticket from an earlier connection to this same port, and a client that connects once has none.
aioquic 1.3.0 Inconclusive The run did not exercise this test: the client sent no early data, so it was never answered 425. 0-RTT needs a session ticket from an earlier connection to this same port, and a client that connects once has none.
chromium build 1223 Inconclusive The run did not exercise this test: the client sent no early data, so it was never answered 425. 0-RTT needs a session ticket from an earlier connection to this same port, and a client that connects once has none.
quic-go quic-go v0.61.0 Inconclusive The run did not exercise this test: the client sent no early data, so it was never answered 425. 0-RTT needs a session ticket from an earlier connection to this same port, and a client that connects once has none.
quiche 0.30.0 Inconclusive The run did not exercise this test: the client sent no early data, so it was never answered 425. 0-RTT needs a session ticket from an earlier connection to this same port, and a client that connects once has none.
neqo 0.31.1 Inconclusive The run did not exercise this test: the client sent no early data, so it was never answered 425. 0-RTT needs a session ticket from an earlier connection to this same port, and a client that connects once has none.

What the clause requires

Handle being told the request arrived too early. §5.2 says a user agent "SHOULD retry automatically, but any retries MUST NOT be sent in early data" — so retrying on the 1-RTT keys and handing the 425 back to the caller are both conformant, and the report says which happened. Falling over is not one of the options. This is the only port that *accepts* early data instead of refusing it, which is what makes the 425 exchange possible at all. What it does not check is §4's rule that unsafe methods must never be sent in early data: reading the method would mean QPACK-decoding the request, which this suite deliberately never does. Reaching it needs a session ticket from an earlier connection to this same port, so a client that connects once has none.

Judged against RFC 8470.

Run this one yourself

Every test is reachable from your own client. Nothing here needs an account.

curl -s https://conformance.pqcrypta.com/catalog.json \
  | jq '.tests[] | select(.id == "q-zero-rtt-replay")'

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