PQ Crypta Logo

0-RTT rejected after the client sends early data

Reset the state of every stream, including application state bound to them. Section 4.6.2 requires the reset because a rejected 0-RTT means every assumed connection characteristic may have been wrong. It does not require retransmission, which is the application concern, not QUIC's. This port issues tickets that advertise early data and then declines every offer, so a resuming client sends 0-RTT and always has it refused. The handshake itself completes normally.

PQ CRYPTA PLATFORM

🏠 Main

📰 News

👤 Account

⟨ QUANTUM ERROR PORTAL ⟩

Navigate the Error Dimensions

Jump to an anomaly59

Every one of these is a page: what the server emits, the clause it is judged against, and how each client answered. The full list carries the verdict tallies too.

q-zero-rtt-reject · RFC 9001 §4.6.2 · resilience · layer quic · udp/4471 · MUST

Passing this means: Recovered rather than giving up.

Anomaly type: transport

How each client answered

ClientVersionVerdictWhat happened
curl libcurl/8.23.0 ngtcp2/1.25.0 Pass Recovered and completed the follow-up request.
quinn noq fork (189b0ed) Pass Recovered, then closed the connection without an error code, which §8.1 makes a graceful shutdown rather than an objection.
aioquic 1.3.0 (PyPI wheel) Pass Recovered and completed the follow-up request.
chromium build 1248 Pass Recovered and completed the follow-up request.
quic-go quic-go v0.61.0 (h1:9So2anK4Tp22) Fail Stalled instead of recovering.
quiche 0.30.0 (1c8e976) Unsupported does not deliver early data to an endpoint that negotiates versions, so nothing was rejected. It offered a GREASE QUIC version first, which this endpoint answered with Version Negotiation (RFC 8999 §6), and it did not re-offer early data on the v1 retry -- so the 0-RTT it intended never reached the wire. Both sides are conformant; the early data is lost between them.
neqo 0.31.1 (cac2b74) Pass Recovered and completed the follow-up request.
picoquic 8162550 Pass Recovered and completed the follow-up request.
ngtcp2 3c23148 Fail Gave up (rejected at the QUIC layer with INTERNAL_ERROR) instead of recovering.
lsquic 4.9.4 (2b30189) Pass Recovered and completed the follow-up request.
xquic 2060a44 Pass Recovered and completed the follow-up request.
msquic 2.7.0 (7e6525d) Unsupported does not resume sessions, so nothing was rejected. An earlier connection to this port in the same session completed its exchange, and with it received session tickets that permit 0-RTT; this connection, opened afterwards, ran a full handshake instead of resuming, and a client that does not resume cannot offer early data.
quico 0.7.0 (npm) Pass Recovered and completed the follow-up request.

What the clause requires

Reset the state of every stream, including application state bound to them. Section 4.6.2 requires the reset because a rejected 0-RTT means every assumed connection characteristic may have been wrong. It does not require retransmission, which is the application concern, not QUIC's. This port issues tickets that advertise early data and then declines every offer, so a resuming client sends 0-RTT and always has it refused. The handshake itself completes normally.

Judged against RFC 9001.

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-reject")'