PQ Crypta Logo

Field line indexing a static table entry that does not exist

Close the connection with QPACK_DECOMPRESSION_FAILED (0x200). The static table has 99 entries, so index 200 refers to nothing, and §3.1 is explicit: "When the decoder encounters an invalid static table index in a field line representation, it MUST treat this as a connection error of type QPACK_DECOMPRESSION_FAILED." The static table needs no permission and never changes size, so unlike the dynamic-table tests this one applies to every client.

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.

h-qpack-static-index-invalid · RFC 9204 §3.1, §4.5.2 · correctness · layer http3 · udp/4505 · MUST

Passing this means: Rejected something invalid, with the code the RFC names.

Anomaly type: response_stream

How each client answered

ClientVersionVerdictWhat happened
curl libcurl/8.23.0 ngtcp2/1.25.0 Fail Objected at the QUIC layer (rejected at the QUIC layer with INTERNAL_ERROR) instead of signalling the HTTP/3 error. The violation was detected and rejected, which is the right instinct; §8.1 requires an HTTP/3 connection error to be carried in an application close, and this test names 0x200. A transport close carries no HTTP/3 code at all, so a peer has no way to learn what was wrong.
quinn noq fork (189b0ed) Pass Rejected with the required error code 0x200.
aioquic 1.3.0 (PyPI wheel) Pass Rejected with the required error code 0x200.
chromium build 1248 Pass Rejected with the required error code 0x200.
quic-go quic-go v0.61.0 (h1:9So2anK4Tp22) Fail rejected the field section with QPACK_DECOMPRESSION_FAILED, but as a stream error: it stopped the request stream and kept the connection open. The code is right and the scope is not -- RFC 9204 makes every decompression failure a connection error.
quiche 0.30.0 (1c8e976) Pass Rejected with the required error code 0x200.
neqo 0.31.1 (cac2b74) Pass Rejected with the required error code 0x200.
picoquic 8162550 Fail Rejected, but with error 0x106 where the specification requires 0x200. The violation was detected; the code reported is wrong.
ngtcp2 3c23148 Pass Rejected with the required error code 0x200.
lsquic 4.9.4 (2b30189) Pass Rejected with the required error code 0x200.
xquic 2060a44 Fail Rejected, but with error 0x106 where the specification requires 0x200. The violation was detected; the code reported is wrong.
msquic 2.7.0 (7e6525d) Fail Rejected, but with error 0x101 where the specification requires 0x200. The violation was detected; the code reported is wrong.
quico 0.7.0 (npm) Pass Rejected with the required error code 0x200.

What the clause requires

Close the connection with QPACK_DECOMPRESSION_FAILED (0x200). The static table has 99 entries, so index 200 refers to nothing, and §3.1 is explicit: "When the decoder encounters an invalid static table index in a field line representation, it MUST treat this as a connection error of type QPACK_DECOMPRESSION_FAILED." The static table needs no permission and never changes size, so unlike the dynamic-table tests this one applies to every client.

Judged against RFC 9204.

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 == "h-qpack-static-index-invalid")'