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
| Client | Version | Verdict | What 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")'