PQ Crypta Logo

lsquic — HTTP/3 Conformance Results

LiteSpeed lsquic + BoringSSL, 4.9.4. How it answers when the server deliberately breaks the protocol.

PQ CRYPTA PLATFORM

🏠 Main

🧪 Interactive Apps

📰 News

🛡️ PQ Crypta Proxy

👤 Account

⟨ QUANTUM ERROR PORTAL ⟩

Navigate the Error Dimensions

40Pass
4Fail
15Inconclusive
91%of 44 conclusive

Stack: LiteSpeed lsquic + BoringSSL · Language: C · Version: 4.9.4 · Measured 2026-09-18

Badge for a README: https://pqcrypta.com/conformance/badge/lsquic.svg lsquic conformance badge

By class

Rolled up by what the clause requires rather than into one number. A client that ignores unknown extensions correctly but never emits the right error codes has a specific, nameable problem, and an average is exactly what hides it.

ClassPassing meansPassFailInconclusive
correctness Rejected something invalid, with the code the RFC names. 14 2 9
discretionary The RFC permits either behaviour; the report says which was chosen. 11 0 2
extensibility Ignored something unknown and carried on. 4 1 0
interoperability Correctly decoded something valid but demanding. 5 1 2
resilience Recovered rather than giving up. 6 0 2

Every result

TestClauseVerdictWhat happened
Version Negotiation offering a reserved version alongside v1 RFC 9000 §6 Pass Responded correctly: sent Version Negotiation for 2 datagram(s); the client did not persist with an unsupported version.
Retry packet for source-address validation RFC 9000 §8.1.2 Pass Responded correctly: echoed the Retry token and completed the handshake.
Reserved transport parameter (31·N+27) RFC 9000 §18.1 Pass Ignored the unrecognised element and carried on: completed a handshake carrying a reserved transport parameter.
Unknown frame type in a 1-RTT packet RFC 9000 §12.4 Pass Responded correctly: closed with FRAME_ENCODING_ERROR, which is the code §12.4 requires for a frame of unknown type.
NEW_CONNECTION_ID followed by RETIRE_CONNECTION_ID RFC 9000 §5.1 Inconclusive The run did not exercise this test: the connection was too short-lived to require a rotation.
Stateless reset RFC 9000 §10.3 Fail kept sending after the Stateless Reset: 11 more datagram(s) arrived in the following 3 seconds. RFC 9000 §10.3.1 requires a client that recognises the token to enter the draining period and send nothing further, so this connection is wedged against an endpoint that has forgotten it.
Deliberately tight MAX_DATA and MAX_STREAM_DATA RFC 9000 §4 Inconclusive The run did not exercise this test: the connection failed during the handshake (timed out), so the client never reached the anomaly.
ACK Frequency extension offered draft-ietf-quic-ack-frequency Pass Handled it: ignored the extension, which the specification permits.
Packets marked ECT(0) RFC 9000 §13.4 Inconclusive The run did not exercise this test: ECN validation failed: packets sent marked ECT(0) came back acknowledged without ECN counts, so the marking was disabled. Whether the peer declined to report or the path rewrote the codepoint cannot be told apart from this end.
Path MTU black hole above a threshold RFC 9000 §14, RFC 8899 Pass Recovered: detected the black hole 1 time(s) and settled on a 1293-byte path MTU (374 datagram(s) swallowed).
Server-initiated PATH_CHALLENGE RFC 9000 §8.2 Pass Responded correctly: answered with 1 PATH_RESPONSE.
0-RTT rejected after the client sends early data RFC 9001 §4.6.2 Inconclusive The run did not exercise this test: the client sent no early data, so nothing was rejected. 0-RTT needs a session ticket from an earlier connection to this same port, and a client that connects once has none.
A second path offered mid-connection draft-ietf-quic-multipath Pass Handled it: declined the multipath offer and stayed on one path, which is conformant.
Spontaneous 1-RTT key update RFC 9001 §6.2 Pass Decoded it and completed the request.
Stream limits set to the minimum a request needs RFC 9000 §4.6 Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
One datagram in twelve dropped once the path is established RFC 9000 §2.2, §13.3 Pass Recovered and completed the follow-up request.
Datagrams arriving from a second server address RFC 9000 §9.6 Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
Transport parameter carrying a value the specification forbids RFC 9000 §7.4, §18.2 Inconclusive The run did not exercise this test: the client abandoned the handshake (timed out) without a CONNECTION_CLOSE this endpoint could read. It certainly saw the parameter — that travels in the handshake — but §7.4 asks for a rejection carrying TRANSPORT_PARAMETER_ERROR, and none was observed. A close that was sent and lost cannot be told apart from one that was never sent.
425 (Too Early) in answer to a request sent as early data RFC 8470 §5.2 Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
Path marking packets CE, not just ECT(0) RFC 9000 §13.4 Inconclusive The run did not exercise this test: no ECN counts came back at all. §13.4.1 requires reporting only where the ECN field is accessible, and a path that stripped the codepoint cannot be told apart from a client that does not report.
A second key update after the first is acknowledged RFC 9001 §6.1, §6.5 Pass Decoded it and completed the request.
No stream credit at first, then MAX_STREAMS mid-connection RFC 9000 §4.6 Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
Reserved SETTINGS identifier (0x1f·N+0x21) RFC 9114 §7.2.4.1 Pass Ignored the unrecognised element and completed the follow-up request.
Reserved frame type on the response stream RFC 9114 §7.2.8 Pass Ignored the unrecognised element and completed the follow-up request.
Unidirectional stream with a reserved stream type RFC 9114 §6.2.3 Fail Stopped responding after the element was sent. The follow-up request never arrived, so the client did not survive it.
SETTINGS containing the same identifier twice RFC 9114 §7.2.4 Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
A DATA frame on the control stream RFC 9114 §7.2.1 Pass Rejected with the required error code 0x105.
Control stream whose first frame is not SETTINGS RFC 9114 §6.2.1 Pass Rejected with the required error code 0x10a.
A second control stream opened by the server RFC 9114 §6.2.1 Inconclusive Nothing further arrived, and the anomaly was on the control stream, so there is no way to tell whether the client read it.
Field lines referencing dynamic table insertions RFC 9204 §4.3.3, §4.5.2 Inconclusive The run did not exercise this test: the client advertised SETTINGS_QPACK_MAX_TABLE_CAPACITY of 0 and SETTINGS_QPACK_BLOCKED_STREAMS of 0, which forbid the server's encoder from using the dynamic table at all.
Huffman-coded field lines with maximal padding RFC 9204 §4.1.2, RFC 7541 §5.2 Pass Decoded it and completed the request.
Field section larger than the client's advertised maximum RFC 9114 §4.2.2 Pass Decoded it and completed the request.
Trailing field section after the body RFC 9114 §4.1 Fail Rejected the response with error 0x10e. Nothing here violates the specification — this is valid HTTP/3 that a client is required to be able to process.
103 Early Hints before the final response RFC 9110 §15.2, RFC 8297 Pass Recovered and completed the follow-up request.
GOAWAY sent mid-connection RFC 9114 §5.2 Pass Recovered and completed the follow-up request.
MAX_PUSH_ID sent by the server RFC 9114 §7.2.7 Pass Rejected with the required error code 0x105.
SETTINGS frame on a request stream RFC 9114 §7.2.4 Pass Rejected with the required error code 0x105.
DATA frame before any HEADERS on the response stream RFC 9114 §4.1 Pass Rejected with the required error code 0x105.
CANCEL_PUSH for a push ID that was never promised RFC 9114 §7.2.3 Pass Rejected with the required error code 0x108.
Field section that blocks until the encoder stream catches up RFC 9204 §2.1.2, §2.2.1 Inconclusive The run did not exercise this test: the client advertised SETTINGS_QPACK_MAX_TABLE_CAPACITY of 0 and SETTINGS_QPACK_BLOCKED_STREAMS of 0, which forbid the server's encoder from using the dynamic table at all.
Response stream reset mid-body with H3_REQUEST_CANCELLED RFC 9114 §8, §4.1 Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
PRIORITY_UPDATE sent by the server RFC 9218 §7.2 Pass Rejected with error 0x105. The specification permits this but does not require it; a client that ignored it would also be conformant.
SETTINGS_ENABLE_CONNECT_PROTOCOL with a value outside 0 and 1 RFC 9220 §3, RFC 8441 §3 Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
PUSH_PROMISE for a push the client never allowed RFC 9114 §7.2.5, §4.6 Fail Rejected, but with error 0x105 where the specification requires 0x108. The violation was detected; the code reported is wrong.
SETTINGS_H3_DATAGRAM with a value that is neither 0 nor 1 RFC 9297 §2.1.1 Inconclusive The client completed its request and closed without objecting, but the anomaly was written to the control stream — a unidirectional stream nothing obliges it to read on any schedule. A one-shot request can finish before that stream is picked up, so this is equally consistent with accepting the violation and with never having seen it, and neither can be told from here.
Encoder stream setting a dynamic table capacity above the client's limit RFC 9204 §4.3.1, §6 Inconclusive The client completed its request and closed without objecting, but the anomaly was written to the control stream — a unidirectional stream nothing obliges it to read on any schedule. A one-shot request can finish before that stream is picked up, so this is equally consistent with accepting the violation and with never having seen it, and neither can be told from here.
A second GOAWAY naming a larger identifier than the first RFC 9114 §5.2 Pass Rejected with the required error code 0x108.
Push stream opened for a push nobody allowed RFC 9114 §6.2.2 Inconclusive Nothing further arrived, and the anomaly was on the control stream, so there is no way to tell whether the client read it.
Field line indexing a static table entry that does not exist RFC 9204 §3.1, §4.5.2 Pass Rejected with the required error code 0x200.
Datagrams delivered out of order RFC 9000 §2.2 Pass Recovered and completed the follow-up request.
Encoder instruction naming a static index that does not exist RFC 9204 §3.1, §4.3.2 Pass Rejected with the required error code 0x201.
Server negotiates only the post-quantum hybrid X25519MLKEM768 RFC 8446 §4.1.4, draft-ietf-tls-hybrid-design Pass Decoded it and completed the request.
Server negotiates only classical X25519 against a hybrid offer RFC 8446 §4.1.1, draft-ietf-tls-hybrid-design §5 Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
Hybrid key share large enough to split the Initial across packets RFC 9000 §8.1, §14.1, RFC 9001 §4.4 Pass Recovered and completed the follow-up request.
Server selects a key exchange group the client never offered RFC 8446 §4.1.3, §4.2.8, RFC 9001 §4.8 Inconclusive The handshake did not complete, so the group was not accepted, but nothing arrived to say the client rejected it deliberately. RFC 9001 §4.8 carries a TLS alert in a CONNECTION_CLOSE and none was seen; a close that was never sent and one that was lost look the same from here.
Hybrid key share with an intact X25519 half and a corrupt ML-KEM half draft-ietf-tls-hybrid-design §3.2, RFC 8446 §4.1.3 Pass Responded correctly: did not complete the handshake (timed out). The shared secret is both halves through the key schedule, so a corrupt ML-KEM half must break it -- and this client did not fall back to the intact X25519 half.
Hybrid key share whose length does not match the group named with it draft-kwiatkowski-tls-ecdhe-mlkem §3.1.2, RFC 8446 §6.2, RFC 9001 §4.8 Inconclusive The handshake did not complete, which it could not have done with half the shared secret missing, but nothing arrived to say the client rejected the length deliberately. A close that was never sent and one that was lost look the same from here.
Post-quantum certificate chain, compressed per RFC 8879 RFC 8879 §4, RFC 8446 §4.4.2 Inconclusive The run did not exercise this test: the client's signature_algorithms named nothing that can verify an ML-DSA-87 chain, so this endpoint refused before sending one. Post-quantum certificates are not reachable for this client at all, which is a fact about it rather than a gap in the run.
GREASE named group a client must tolerate RFC 8701 §4, RFC 8446 §4.2.7 Pass Ignored the unrecognised element and completed the follow-up request.

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