Skip to content

Interop issue between msquic and openssl-3.5-dev #4905

Open
@nhorman

Description

@nhorman

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

retrydata.zip

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

  1. 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
  2. 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

No one assigned

    Labels

    Type

    Projects

    Status

    Planned

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions