Description
Describe the bug
When doing some interop testing with openssl, I noticed a problem on the quic-interop-runner retry test:
https://github.com/openssl/openssl/actions/runs/13733428533/job/38414155590
In attempting to track it down I gathered the following data in the attached zip file
without-retry.cap - tcpdump of connection between openssl client and msquic with retry disabled on quicinteropserver
with-retry.cap - tcpdump of connection between openssl client and msquic with retry enabled on quicinteropserver
without_retry.log - log file generated from msquic quicinteropserver with retry disabled
with_retry.log - log file generated from msquic quicinteropserver with retry enabled
without_retry_keys.log - keylog file for tcpdump with retry disabled on msquic server. Unfortunately no keylog file is generated when retry is enabled, as the handshake never progresses that far.
As the logs show, everything works normally when retry is disabled, but the handshake never completes with retry enabled.
I'm having a hard time making out the server side logs, but it appears that when retry is enabled on the server, the full client hello never gets re-assembled .
This may well be relevant here: Openssl recently enabled the use of ML-KEM keyshares, which dramatically increases the side of the client hello record (spanning 3 datagrams in the tcpdump). I think, looking at the with_retry.log file, on line 277, that msquic eventually decodes the client hello, but then discards the record on line 291.
Its worth noting, that if I set the openssl client up such that it only advertises older keyshares (like X25519), everything also works fine, even with retry enabled. Its only when the client hello spans multiple datagrams with retry enabled on the server that the problem manifests.
Affected OS
- Windows
- Linux
- macOS
- Other (specify below)
Additional OS information
ubuntu linux 22.04
MsQuic version
main
Steps taken to reproduce bug
- run the msquic quicinteropserver
./quicinteropserver -retry:1 -listen:127.0.0.1 -port:4433 -root:~/www -file:/home/nhorman/git/openssl/test/certs/servercert.pem -key:/home/nhorman/git/openssl/test/certs/serverkey.pem
- run the openssl quic-hq-interop client
LD_LIBRARY_PATH=/home/nhorman/git/openssl SSLKEYLOGFILE=./keys.log SSL_CERT_FILE=/certs/ca.pem SSL_CERT_DIR=/certs ./quic-hq-interop 127.0.0.1 4433 ./reqfile.txt
Expected behavior
The files listed in reqfile.txt should be transferred from the server to the client
Actual outcome
client hangs waiting for handshake to complete, server sends some encrypted data, but its contents are unknown as the keylog file is never produced. Connection is never established
Additional details
No response
Metadata
Metadata
Assignees
Type
Projects
Status