From d065b145081387316501f67c0983c89cfc0c930d Mon Sep 17 00:00:00 2001 From: Tobias Frauenschlaeger Date: Tue, 25 Aug 2026 08:04:28 +0000 Subject: [PATCH] Give the sniffer's X25519 static ephemeral key an RNG curve25519 blinding is enabled by default for the C implementation, in settings.h, and draws from the private key's own RNG on every shared secret. The sniffer built its key with wc_curve25519_init_ex() followed by wc_Curve25519PrivateKeyDecode(), and neither sets one, so the shared secret reached wc_RNG_GenerateBlock() with a NULL RNG and came back BAD_FUNC_ARG while every argument it was given was valid. SetupKeys() then reported a server and client key mismatch and no X25519 session could be read at all. The library's own static ephemeral path already calls wc_curve25519_set_rng() under the same guard, and the sniffer already calls wc_ecc_set_rng() for the ECC key a few lines above. Only X25519 was missed. Regenerate the two X25519 captures. Both were committed as a bare 24 byte pcap header with no packets in them, so those legs had never tested anything; they now hold real traffic and fail against the unfixed sniffer. Drop the has_packets guard added earlier in this branch. It existed to skip the empty captures, and with every capture holding packets it is dead code. Removing it is also the better behaviour: snifftest already fails a capture that yields no plaintext, so an empty file now fails the suite loudly instead of being skipped, which is what a missing fixture deserves. --- ChangeLog.md | 28 ++++++++++------- scripts/sniffer-testsuite.test | 38 ++++++----------------- scripts/sniffer-tls13-x25519-resume.pcap | Bin 24 -> 24838 bytes scripts/sniffer-tls13-x25519.pcap | Bin 24 -> 16169 bytes src/sniffer.c | 7 +++++ 5 files changed, 33 insertions(+), 40 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 947b8a8414..0c9f959591 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -172,18 +172,22 @@ ## Fixes -* **Fix (sniffer could not decrypt Encrypt-Then-MAC sessions)**: the sniffer - never handled the `encrypt_then_mac` extension (RFC 7366) in the ServerHello, - so for a CBC suite it passed the trailing MAC to the block decrypt along with - the ciphertext, the length was not a multiple of the block size, and every - record failed. Since wolfSSL peers negotiate it by default, this covered - most TLS 1.2 CBC captures. A build without Encrypt-Then-MAC support now - reports that, once the negotiated suite is known to be a block cipher, rather - than failing every record with a generic decrypt error. Both the - `client_key_exchange` handler and the TLS 1.3 ServerHello path also overwrote - a specific error with "Server Client Key Mismatch", which hid the reason a - session could not be decrypted; they now keep an error that has already been - described. +* **Fix (sniffer could not decrypt Encrypt-Then-MAC or X25519 sessions)**: the + sniffer never handled the `encrypt_then_mac` extension (RFC 7366) in the + ServerHello, so for a CBC suite it passed the trailing MAC to the block + decrypt along with the ciphertext, the length was not a multiple of the block + size, and every record failed. Since wolfSSL peers negotiate it by default, + this covered most TLS 1.2 CBC captures. Separately, curve25519 blinding + draws from the private key's own RNG, which the sniffer's static ephemeral + key never had, so every X25519 shared secret failed with `BAD_FUNC_ARG` and + no X25519 traffic could be read; the key now gets `wc_curve25519_set_rng()`, + as the library's own static ephemeral path already did. A build without + Encrypt-Then-MAC support now reports that, once the negotiated suite is known + to be a block cipher, rather than failing every record with a generic decrypt + error. Both the `client_key_exchange` handler and the TLS 1.3 ServerHello + path also overwrote a specific error with "Server Client Key Mismatch", which + hid the reason a session could not be decrypted; they now keep an error that + has already been described. * **Fix (sniffer reported plaintext lengths that included the MAC or AEAD tag)**: the length returned to the caller was taken from the record size diff --git a/scripts/sniffer-testsuite.test b/scripts/sniffer-testsuite.test index 8ef48e06ad..727d53e9e1 100755 --- a/scripts/sniffer-testsuite.test +++ b/scripts/sniffer-testsuite.test @@ -104,24 +104,8 @@ fi RESULT=0 -# A capture file holding only the 24 byte pcap header has no packets in it and -# cannot test anything. Report it and skip the leg rather than passing silently. -# Regenerate missing captures with scripts/sniffer-gen.sh. -has_packets() { - local pcap=$1 - if [ ! -s "$pcap" ]; then - echo -e "\nWARNING: $pcap is missing, skipping\n" - return 1 - fi - if [ "$(wc -c < "$pcap")" -le 24 ]; then - echo -e "\nWARNING: $pcap holds no packets, skipping. Regenerate it with scripts/sniffer-gen.sh\n" - return 1 - fi - return 0 -} - # TLS v1.2 Static RSA Test -if test $RESULT -eq 0 && test $has_rsa == yes && test $has_tlsv12 == yes && test $has_static_rsa == yes && has_packets ./scripts/sniffer-static-rsa.pcap +if test $RESULT -eq 0 && test $has_rsa == yes && test $has_tlsv12 == yes && test $has_static_rsa == yes then echo -e "\nStarting snifftest on sniffer-static-rsa.pcap...\n" ./sslSniffer/sslSnifferTest/snifftest -expectdata -pcap ./scripts/sniffer-static-rsa.pcap -key ./certs/server-key.pem -server 127.0.0.1 -port 11111 @@ -133,7 +117,7 @@ fi # TLS v1.2 CBC Encrypt-Then-MAC Test (RFC 7366). The decrypted lengths are # compared against known good output, since Encrypt-Then-MAC changes how much # of a record is payload and a wrong length still decrypts. -if test $RESULT -eq 0 && test $has_rsa == yes && test $has_tlsv12 == yes && test $has_static_rsa == yes && test $has_etm == yes && has_packets ./scripts/sniffer-tls12-etm.pcap +if test $RESULT -eq 0 && test $has_rsa == yes && test $has_tlsv12 == yes && test $has_static_rsa == yes && test $has_etm == yes then echo -e "\nStarting snifftest on sniffer-tls12-etm.pcap...\n" @@ -160,7 +144,7 @@ then fi # TLS v1.2 Static RSA Test (IPv6) -if test $RESULT -eq 0 && test $has_rsa == yes && test $has_tlsv12 == yes && test $has_static_rsa == yes && has_packets ./scripts/sniffer-ipv6.pcap +if test $RESULT -eq 0 && test $has_rsa == yes && test $has_tlsv12 == yes && test $has_static_rsa == yes then echo -e "\nStarting snifftest on sniffer-ipv6.pcap...\n" ./sslSniffer/sslSnifferTest/snifftest -expectdata -pcap ./scripts/sniffer-ipv6.pcap -key ./certs/server-key.pem -server ::1 -port 11111 @@ -207,8 +191,6 @@ then [[ $tlsver == "tls12" && $has_tlsv12 == "no" ]] && continue [[ $tlsver == "tls13" && $has_tlsv13 == "no" ]] && continue - has_packets ./scripts/sniffer-$tlsver-keylog.pcap || continue - echo -e "\nStarting snifftest on sniffer-$tlsver-keylog.pcap...\n" TMPFILE=$(mktemp) @@ -235,7 +217,7 @@ then fi # TLS v1.3 sniffer test ECC -if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_ecc == yes && has_packets ./scripts/sniffer-tls13-ecc.pcap +if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_ecc == yes then echo -e "\nStarting snifftest on sniffer-tls13-ecc.pcap...\n" ./sslSniffer/sslSnifferTest/snifftest -expectdata -pcap ./scripts/sniffer-tls13-ecc.pcap -key ./certs/statickeys/ecc-secp256r1.pem -server 127.0.0.1 -port 11111 @@ -245,7 +227,7 @@ then fi # TLS v1.3 sniffer test DH -if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_dh == yes && has_packets ./scripts/sniffer-tls13-dh.pcap +if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_dh == yes then echo -e "\nStarting snifftest on sniffer-tls13-dh.pcap...\n" ./sslSniffer/sslSnifferTest/snifftest -expectdata -pcap ./scripts/sniffer-tls13-dh.pcap -key ./certs/statickeys/dh-ffdhe2048.pem -server 127.0.0.1 -port 11111 @@ -255,7 +237,7 @@ then fi # TLS v1.3 sniffer test X25519 -if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_x25519 == yes && has_packets ./scripts/sniffer-tls13-x25519.pcap +if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_x25519 == yes then echo -e "\nStarting snifftest on sniffer-tls13-x25519.pcap...\n" ./sslSniffer/sslSnifferTest/snifftest -expectdata -pcap ./scripts/sniffer-tls13-x25519.pcap -key ./certs/statickeys/x25519.pem -server 127.0.0.1 -port 11111 @@ -265,7 +247,7 @@ then fi # TLS v1.3 sniffer test ECC resumption -if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_ecc == yes && test $session_ticket == yes && has_packets ./scripts/sniffer-tls13-ecc-resume.pcap +if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_ecc == yes && test $session_ticket == yes then echo -e "\nStarting snifftest on sniffer-tls13-ecc-resume.pcap...\n" ./sslSniffer/sslSnifferTest/snifftest -expectdata -pcap ./scripts/sniffer-tls13-ecc-resume.pcap -key ./certs/statickeys/ecc-secp256r1.pem -server 127.0.0.1 -port 11111 @@ -275,7 +257,7 @@ then fi # TLS v1.3 sniffer test DH -if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_dh == yes && test $session_ticket == yes && has_packets ./scripts/sniffer-tls13-dh-resume.pcap +if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_dh == yes && test $session_ticket == yes then echo -e "\nStarting snifftest on sniffer-tls13-dh-resume.pcap...\n" ./sslSniffer/sslSnifferTest/snifftest -expectdata -pcap ./scripts/sniffer-tls13-dh-resume.pcap -key ./certs/statickeys/dh-ffdhe2048.pem -server 127.0.0.1 -port 11111 @@ -285,7 +267,7 @@ then fi # TLS v1.3 sniffer test X25519 -if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_x25519 == yes && test $session_ticket == yes && has_packets ./scripts/sniffer-tls13-x25519-resume.pcap +if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_x25519 == yes && test $session_ticket == yes then echo -e "\nStarting snifftest on sniffer-tls13-x25519-resume.pcap...\n" ./sslSniffer/sslSnifferTest/snifftest -expectdata -pcap ./scripts/sniffer-tls13-x25519-resume.pcap -key ./certs/statickeys/x25519.pem -server 127.0.0.1 -port 11111 @@ -295,7 +277,7 @@ then fi # TLS v1.3 sniffer test hello_retry_request (HRR) with ECDHE -if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_ecc == yes && has_packets ./scripts/sniffer-tls13-hrr.pcap +if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_ecc == yes then echo -e "\nStarting snifftest on sniffer-tls13-hrr.pcap...\n" ./sslSniffer/sslSnifferTest/snifftest -expectdata -pcap ./scripts/sniffer-tls13-hrr.pcap -key ./certs/statickeys/ecc-secp256r1.pem -server 127.0.0.1 -port 11111 diff --git a/scripts/sniffer-tls13-x25519-resume.pcap b/scripts/sniffer-tls13-x25519-resume.pcap index 348ba487622c24dc5ef8a5804cddf48abb91f02f..bd6b135243e1c178c781e8c6f87247649dd686a1 100644 GIT binary patch literal 24838 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.x25519, + session->sslServer->rng); + } + #endif if (ret == 0) { idx = 0; ret = wc_Curve25519PrivateKeyDecode(args->keyBuf->buffer, &idx,