| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Issuer and serialNumber are independently OPTIONAL in a CertTemplate,
and the library hands them to the process_rr callback separately.
The OpenSSL CMP client always sends both, so the mock server has never
been exercised with an RR that carries only one of them.
Assisted-by: Claude:claude-fable-5-1
Reviewed-by: Dmitry Belyavskiy <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Reviewed-by: Eugene Syromiatnikov <[email protected]>
Merge-date: Sat Oct 24 09:44:20 2026
Merged-from: https://github.com/openssl/openssl/pull/33071
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The issuer and the serialNumber are independently OPTIONAL
in a CertTemplate. A component absent from the request cannot confirm
a match with the reference cert, and ASN1_INTEGER_cmp() does not accept
NULL, so require each component the reference cert has to be present
in the request and to be equal.
Fixes: 66be663b64e0 "cmp_mock_srv.c: Add missing OldCertID check for 'kur' cert update requests"
References: b971d4198def "CMP mock server: add -ref_cert option and corresponding ossl_cmp_mock_srv_set1_refCert()"
Reviewed-by: Dmitry Belyavskiy <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Reviewed-by: Eugene Syromiatnikov <[email protected]>
Merge-date: Sat Oct 24 09:44:19 2026
Merged-from: https://github.com/openssl/openssl/pull/33071
|
| |
|
|
|
|
|
| |
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Bob Beck <[email protected]>
Merge-date: Fri Oct 23 20:40:17 2026
Merged-from: https://github.com/openssl/openssl/pull/33308
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Command 'openssl version -c' as well as other commands (e.g. 'openssl speed')
display the CPU information. For s390x, this includes the OPENSSL_s390xcap
settings that are currently in place.
Also display the 'cex_min_bits:<bits>' and 'nocex' settings there.
The 'cex_min_bits' setting is always displayed, showing the default value if
it was not explicitly specified via the OPENSSL_s390xcap environment variable.
The 'nocex' setting is only displayed when it was explicitly set via the
OPENSSL_s390xcap environment variable, or if offloading is disabled because
no crypto adapters are available or the file descriptor has been closed
by other means.
Signed-off-by: Ingo Franzki <[email protected]>
Reviewed-by: Dmitry Belyavskiy <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
MergeDate: Fri Oct 23 15:20:46 2026
(Merged from https://github.com/openssl/openssl/pull/31630)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add a new keyword 'cex_min_bits:<bits>' for the OPENSSL_s390xcap environment
variable to specify the minimum number of bits that the exponent must have
to offload the operation to the crypto card. Operations with smaller exponents
fall back to software calculation. Mod-expo operations with small exponents
are faster in software than via the crypto card.
The default minimum exponent size is 2048 bits, but this can be changed via
the OPENSSL_s390xcap environment variable.
For mod-expo operations the exponent is checked, and for RSA CRT operations
the modulus is checked to have the minimum bit size. RSA public key operations
usually have small exponents, so they are most likely always performed in
software.
Checking the bit size of a BIGNUM may or may not be constant-time, dependent
on the BN_FLG_CONSTTIME flag of the BIGNUM. For RSA CRT operations, the bit
size of the modulus is checked. The modulus is public information, so no
constant-time issue here. For mod-expo operations with the public exponent
it is also not a constant-time issue, because the public exponent is also
public information. For mod-expo operations with the private exponent, the
size of the private exponent is usually the same as the size of the modulus,
which is public information. For DH mod-expo operations with the private key,
the size of the private key is usually dependent on the DH group that is
used, and this is also public information. Nevertheless, private exponents
better have the BN_FLG_CONSTTIME flag set. For RSA this is the case, and for
DH it is also the case when flag DH_FLAG_CACHE_MONT_P is set, which is always
done (dh_init() sets the flag unconditionally). Furthermore, flag
BN_FLG_CONSTTIME is set for the private key in ossl_dh_generate_public_key().
Signed-off-by: Ingo Franzki <[email protected]>
Reviewed-by: Dmitry Belyavskiy <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
MergeDate: Fri Oct 23 15:20:45 2026
(Merged from https://github.com/openssl/openssl/pull/31630)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When the client received a Retry, ch_retry() marked only its first
Initial packet as pseudo-lost, assuming that the ClientHello fits in
it. Since 3.5 the default key shares (X25519MLKEM768 and X25519) put
the ClientHello into two Initial packets. The second one stayed in
flight, so the client resent only the first part of the ClientHello,
and the server could do no more than acknowledge it. The rest was sent
only once that acknowledgement had the second packet declared lost:
one more round trip for every Retry, and a congestion event that halved
the congestion window although nothing was lost.
RFC 9002 section 6.3 has a client that receives a Retry reset its loss
recovery state, as the server processed none of its Initial packets.
Mark every Initial packet still in flight as pseudo-lost instead.
ch_restart() marked only the first Initial packet after version
negotiation in the same way. It now shares the helper, so ch_retry()
no longer needs drop_later_pn to work out which packet number to mark.
A Version Negotiation packet and a Retry can be processed in the same
batch of datagrams. The first then leaves no Initial packet in flight
for the second, and their data is already queued, so that is not an
error. test_quic_retry_after_version_neg covers this order.
The SSL_trace reference recorded the extra round trip, and is updated.
The radix forbidden_frame_types script injects a frame into the
server's Initial packets. With the whole ClientHello sent at once, a
post-quantum ServerHello can fill the server's only Initial packet,
leaving no room, so the script's server now uses classical groups.
Fixes: f538b4215528 "QUIC_CHANNEL: Implementation"
Fixes #33077
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Mounir Idrassi <[email protected]>
Reviewed-by: Saša Nedvědický <[email protected]>
Merge-date: Fri Oct 23 12:53:54 2026
Merged-from: https://github.com/openssl/openssl/pull/33298
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
On a Retry, and after version negotiation, the client marks Initial
packets it has sent as pseudo-lost, so that their CRYPTO data is sent
again. The ACK manager then stops counting them as in flight, but on
purpose does not report them to the congestion controller as lost,
since the network lost nothing. The congestion controller is not told
about them at all, so NewReno kept counting their bytes as in flight
for the rest of the connection, and allowed that much less to be sent.
Release them with on_data_invalidated(), as when a packet number space
is discarded. The congestion window is left alone. This follows the
approach proposed in #33099.
Fixes: 90699176b074 "QUIC CC: Major revisions to CC abstract interface"
Fixes #33079
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Mounir Idrassi <[email protected]>
Reviewed-by: Saša Nedvědický <[email protected]>
Merge-date: Fri Oct 23 12:53:54 2026
Merged-from: https://github.com/openssl/openssl/pull/33298
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The DRBGs reseed on a change of process ID, on the request count and on
the time interval, and have no way to notice that the process or the
machine was restored from a snapshot or a checkpoint: copies restored
from one image continue from the same state until their next scheduled
reseed. Say so in RAND(7) beside the paragraph on automatic reseeding,
and tell applications in such environments to reseed after their own
restore signal, with RAND_poll(3) as the call that does it.
Measured on 3.5.9 and master: two continuations of one QEMU or
Firecracker snapshot, or of one CRIU checkpoint, print identical
RAND_bytes output block for block (32 of 32, 14 of 14) until the primary
DRBG's interval expires; plain fork, _Fork and clone are distinct through
the pid check.
Assisted-by: Claude Code:claude-fable-5-1
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Paul Dale <[email protected]>
Reviewed-by: Viktor Dukhovni <[email protected]>
Merge-date: Fri Oct 23 12:51:55 2026
Merged-from: https://github.com/openssl/openssl/pull/33285
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The last line of the script was " STDOUT or die ...", without the
"close" keyword, so the pipe to arm-xlate.pl was never closed
explicitly. Perl could then exit before arm-xlate.pl had written the
output file, and make compiled poly1305-armv9-sve2.S before it existed:
gcc: error: crypto/poly1305/poly1305-armv9-sve2.S: No such file or directory
This was seen on linux-aarch64 builds in the manylinux2014 image
(perl 5.16.3) under QEMU. Running the generator alone 5 times in that
image, the output file was missing right after perl exited 5 times out
of 5; with this change, 0 times out of 5.
The other perlasm scripts, for example poly1305-armv8.pl and
chacha-armv8-sve.pl, already end with "close STDOUT or die ...".
CLA: trivial
Assisted-by: Claude Code:claude-opus-5-5
Reviewed-by: Shane Lontis <[email protected]>
Reviewed-by: Tom Cosgrove <[email protected]>
Merge-date: Fri Oct 23 12:49:47 2026
Merged-from: https://github.com/openssl/openssl/pull/33276
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
OSSL_PARAM_merge() only considers the first 128 entries of each input
array and silently ignores the rest. Mention this in the manual page.
Signed-off-by: Martin Mirchev <[email protected]>
Assisted-by: Claude Code:claude-opus-5-5
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Paul Dale <[email protected]>
Reviewed-by: Shane Lontis <[email protected]>
Merge-date: Fri Oct 23 12:47:50 2026
Merged-from: https://github.com/openssl/openssl/pull/33244
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The EXAMPLES section of PEM_read_bio_PrivateKey still showed
EVP_des_ede3_cbc() for encrypting private keys, but 3DES is
deprecated in OpenSSL 3.x. Replace with EVP_aes_256_cbc() to
show a modern cipher, consistent with other man pages.
The DEK-Info header in the file format example is left as-is
since it documents the actual PEM file structure.
Fixes #28665
CLA: trivial
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Paul Dale <[email protected]>
Reviewed-by: Shane Lontis <[email protected]>
Merge-date: Fri Oct 23 12:44:52 2026
Merged-from: https://github.com/openssl/openssl/pull/33228
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The handshake injection helpers share radix_fault with earlier scripts
but left its selector words unchanged. script_68 leaves word0 set to 1,
which selects CertificateRequest. script_69 installs the same callback
before it sets word0 to 2 for KeyUpdate. A session ticket generated in
that interval can trigger the previous script's fault and close the
connection before the intended KeyUpdate injection.
Clear both selector words in the handshake injection setup paths, as
the plaintext injection setup already does. Request a normal session
ticket in script_69 before arming its fault, so the test exercises the
interval where an inherited selector caused the unexpected close.
Keep the expected KeyUpdate close code unchanged.
Assisted-by: Codex:gpt-6-astra
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Nikola Pajkovsky <[email protected]>
Merge-date: Fri Oct 23 12:40:35 2026
Merged-from: https://github.com/openssl/openssl/pull/33213
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
RADIX drives both endpoints and advances its simulated clock from one
interpreter. Accepted server connections inherit blocking mode from their
listeners, even though the underlying UDP sockets are nonblocking.
Extra handshake retries advance fake time and can inflate the initial
RTT estimates. In the one-way key update loops the server's estimate can
stay high while later samples reduce the client's PTO. The server can
then retain its previous receive keys for longer than the client waits
before its next update. Packets starting that update are then discarded,
as permitted by RFC 9001 section 6.5. A blocking server read prevents the
interpreter from driving client retransmission or advancing the clock,
so this recoverable discard becomes a hang. The interpreter's 60-second
deadline cannot interrupt the call, leaving the process watchdog to abort.
External UDP loss is not required to reproduce the failure.
Set clients and listeners to nonblocking mode at construction, including
listeners created from a domain and the custom listener constructors.
Accepted connections and their streams inherit this setting. The client
setting makes the construction policy consistent before OP_CONNECT_WAIT,
which also sets its mode. Retain the domain blocking capability needed
by SSL_poll and document how tests can explicitly enable blocking I/O.
Add a regression using existing opcodes to delay an ACK, increase the
server's PTO and require recovery across successive client key updates.
Cover both listener creation paths. Check listener and client modes before
connection establishment and the accepted server's mode, so a recurrence
fails promptly instead of waiting for the process watchdog.
Fixes #33206.
Assisted-by: Codex:gpt-6-astra
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Nikola Pajkovsky <[email protected]>
Merge-date: Fri Oct 23 12:40:35 2026
Merged-from: https://github.com/openssl/openssl/pull/33213
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Note that servers may reject ACKs received while waiting for the
client's handshake response.
Refs: #33242
Refs: #33267
Assisted-by: OpenAI:gpt-6-astra
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Milan Broz <[email protected]>
Merge-date: Thu Oct 22 14:58:41 2026
Merged-from: https://github.com/openssl/openssl/pull/33296
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add OpenSSL 4.1.0 release notes for permanent receive failures reported
as retries and retryable writes reported as fatal errors on connections
accepted from DTLS listeners.
Refs: #33277
Refs: #33278
Assisted-by: OpenAI:gpt-6-astra
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Milan Broz <[email protected]>
Merge-date: Thu Oct 22 14:56:47 2026
Merged-from: https://github.com/openssl/openssl/pull/33295
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Every listener tick called SSL_accept() on every pending connection,
whether or not anything had arrived for it, and each such call pumped
the demux with another recvmmsg(). SSL_poll() ticks the listener once
per item, so 256 one-byte datagrams from distinct source ports, which
fill the pending table for 30 s, made every SSL_poll() over N
connections cost (N + 1) * 256 futile SSL_accept() calls.
Record whether the last drive left a pending connection waiting for
its peer, and skip it until a datagram is queued for it or its
retransmission timer expires.
Driving one connection pumps the demux, which can queue a datagram for
a connection the tick skipped or has already driven while emptying the
socket the caller then waits on. Drive again when that happens, up to
DTLS_LISTENER_MAX_DRIVE_PASSES times, and do not let a wait on the
listener or on its connections sleep while such input remains.
Discovered by Anthropic's OSS Scanner (finding ANT-2026-EFVK6J4Z).
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Saša Nedvědický <[email protected]>
Reviewed-by: Ryan Hooper <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Thu Oct 22 14:38:07 2026
Merged-from: https://github.com/openssl/openssl/pull/33265
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
dtls_listener_conn_needs_retry() reported a DTLS 1.2 connection as
waiting for its second ClientHello whenever its handshake state was
DTLS_ST_SW_HELLO_VERIFY_REQUEST, even if the connection had since
entered the error state, e.g. on receiving a fatal alert from the peer.
The listener then kept it in its pending table, and called SSL_accept()
on it every tick, until the pending timeout expired instead of freeing
it as a failed connection.
Check ossl_statem_in_error() as the DTLS 1.3 HRR case already does.
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Saša Nedvědický <[email protected]>
Reviewed-by: Ryan Hooper <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Thu Oct 22 14:38:07 2026
Merged-from: https://github.com/openssl/openssl/pull/33265
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
bullseye, bullseye-updates and bullseye-security are now on
archive.debian.org, so the snapshot repos and the Valid-Until override
are no longer needed.
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Milan Broz <[email protected]>
Reviewed-by: Eugene Syromiatnikov <[email protected]>
Merge-date: Thu Oct 22 10:02:43 2026
Merged-from: https://github.com/openssl/openssl/pull/33314
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
The distro images have no git, so actions/checkout downloads a GitHub
archive, which leaves out .github/ because of export-ignore. The install
step then failed with ".github/retry: not found" in every linux job.
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Milan Broz <[email protected]>
Reviewed-by: Eugene Syromiatnikov <[email protected]>
Merge-date: Thu Oct 22 10:02:43 2026
Merged-from: https://github.com/openssl/openssl/pull/33314
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
After HelloRetryRequest, buffering records from a later epoch can
request a retry without reading the BIO. Supply missing read-retry
flags so SSL_get_error() reports SSL_ERROR_WANT_READ rather than
SSL_ERROR_SYSCALL. Preserve existing retry conditions and handle
listener connections without a read BIO.
Add regression tests for delayed ServerHello delivery and permanent
loss followed by timeout-driven retransmission. Check WANT_READ and
an empty error queue after every retry, then verify handshake
completion and bidirectional application data.
Fixes: #33241
Assisted-by: Claude Code:claude-sonnet-5-5
Assisted-by: OpenCode:github-copilot/gpt-6-astra
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Thu Oct 22 06:08:35 2026
Merged-from: https://github.com/openssl/openssl/pull/33268
|
| |
|
|
|
|
|
|
|
|
|
|
| |
upload-artifact v4 and v5 run on the deprecated Node.js 20 runtime,
which makes GitHub Actions print a deprecation warning. v6 runs on
Node.js 24 by default.
Signed-off-by: Nikola Pajkovsky <[email protected]>
Reviewed-by: Eugene Syromiatnikov <[email protected]>
Reviewed-by: Milan Broz <[email protected]>
Merge-date: Wed Oct 21 17:15:18 2026
Merged-from: https://github.com/openssl/openssl/pull/33247
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Wrong alignment observed on Solaris Sparc 10 (bus error).
THO_ALLOC_HDR has size 20 and memory for structures gets allocated at addresses
directly following a THO_ALLOC_HDR.
Backport needed for the 4.1 branch.
Fixes https://github.com/openssl/openssl/issues/33187
Reviewed-by: Eugene Syromiatnikov <[email protected]>
Reviewed-by: Nikola Pajkovsky <[email protected]>
Merge-date: Wed Oct 21 17:10:20 2026
Merged-from: https://github.com/openssl/openssl/pull/33204
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The VS2013 toolchain image pull, the cross-compile apt installs and the
DJGPP PPA fail transiently and turn a push red with nothing in the log
about the change. Try each up to three times, 30 seconds apart. When all
attempts fail, report it as an environment failure in an error annotation
and the job summary, so it is not mistaken for a test failure.
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Eugene Syromiatnikov <[email protected]>
Reviewed-by: Nikola Pajkovsky <[email protected]>
Merge-date: Wed Oct 21 17:07:51 2026
Merged-from: https://github.com/openssl/openssl/pull/33198
|
| |
|
|
|
|
|
|
|
|
|
|
| |
An update with no input and a nonzero length must fail, except for the
CCM message length. test_evp_aead_update_null_input checks this for
every AEAD, and that a rejected update writes no output.
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Paul Dale <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
Merge-date: Wed Oct 21 16:59:57 2026
Merged-from: https://github.com/openssl/openssl/pull/33157
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
An update with no input buffer and a nonzero length was accepted by
the GCM, CCM, SIV, GCM-SIV, ChaCha20-Poly1305 and ASCON implementations.
Reject it, except for the CCM message length, which is passed with no
input and no output.
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Paul Dale <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
Merge-date: Wed Oct 21 16:59:57 2026
Merged-from: https://github.com/openssl/openssl/pull/33157
|
| |
|
|
|
|
|
|
|
|
|
|
| |
EVP_EncryptUpdate() with a NULL input buffer and a nonzero length read
from the NULL pointer in CRYPTO_ocb128_aad(), a NULL-pointer dereference
detected by ASan. Reject the call instead.
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Paul Dale <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
Merge-date: Wed Oct 21 16:59:57 2026
Merged-from: https://github.com/openssl/openssl/pull/33157
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
These jobs build configurations that, from May to October 2026, never
failed on master when the other push jobs passed, so they cost runner
time on every push and pull request without adding signal. Run the
whole compiler-zoo workflow, and the moved ci.yml, run-checker-merge
and windows.yml jobs, once a day; the latter in a new Nightly CI
workflow. mingw64 is a primary platform, so the MSYS2 UCRT64 build stays
on every pull request. Drop the run-checker-merge options and the plain
libFuzzer leg that other jobs already cover, and the duplicate
no-shared option in run-checker-daily.
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Frederik Wedel-Heinen <[email protected]>
Reviewed-by: Bob Beck <[email protected]>
Merge-date: Wed Oct 21 16:56:52 2026
Merged-from: https://github.com/openssl/openssl/pull/33125
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
GitHub names a matrix job after all its matrix values and cuts the name
at 100 characters, so the aarch64 and riscv legs report identical names.
Nothing reading job results by name can then tell whether every leg ran
or which one failed. Name the jobs after a short per-entry label instead,
as interop-tests.yml already does.
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Bob Beck <[email protected]>
Merge-date: Wed Oct 21 16:48:12 2026
Merged-from: https://github.com/openssl/openssl/pull/33121
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The server random was only generated after all of the ClientHello extensions had
been processed. In (D)TLSv1.3 the PSK callbacks are invoked while the
pre_shared_key extension is being parsed, so a call to SSL_get_server_random()
from within them returned all zeros. The TLSv1.2 psk_server_callback runs during
ClientKeyExchange processing and so already observed the real value, making the
behaviour inconsistent between protocol versions.
Move the generation of the server random to immediately after the protocol
version has been selected and before any of the remaining ClientHello
processing. As a result the server random is also visible from the other
callbacks invoked during ClientHello processing, such as the session ticket and
servername callbacks.
Fixes #26404
Assisted-by: Claude:claude-fable-5-1
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Frederik Wedel-Heinen <[email protected]>
Merge-date: Wed Oct 21 16:45:34 2026
Merged-from: https://github.com/openssl/openssl/pull/33102
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
our TLS client path has to do an ASN1 decode on every new connection it
establishes. Other TLS stacks (notably rustls) seems to not do this
decode, opting instead to to do just enough der parsing to verify the
certificate chain.
We can't really do that, but we can maybe do some things to speed up
this path. Most notably we can cache the received certificate der
string in the SSL_CTX along with a previously decoded X509 certificate
to avoid the overhead of additional ASN1 parsings in future connections
Reviewed-by: Bob Beck <[email protected]>
Reviewed-by: Nikola Pajkovsky <[email protected]>
Merge-date: Wed Oct 21 16:44:29 2026
Merged-from: https://github.com/openssl/openssl/pull/33085
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Apply minor formatting fixes to X509_OBJECT_up_ref_count() deprecation
change log entry, to avoid naked underscores in the Markdown markup,
and add a missing comma.
Signed-off-by: Eugene Syromiatnikov <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Milan Broz <[email protected]>
Merge-date: Wed Oct 21 16:41:20 2026
Merged-from: https://github.com/openssl/openssl/pull/33052
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Fix CVE-2026-54872 title wording, fix typos in CVE-2026-35191,
CVE-2026-75804, and PR #31610[1] descriptions, mention the FIPS
indicator change in NEWS.md.
[1] https://github.com/openssl/openssl/pull/31610
Co-Authored-by: Mounir IDRASSI <[email protected]>
Signed-off-by: Eugene Syromiatnikov <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Milan Broz <[email protected]>
Merge-date: Wed Oct 21 16:41:20 2026
Merged-from: https://github.com/openssl/openssl/pull/33052
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
4.0.3 CHANGES.md includes the following:
* CVE-2026-35189, CVE-2026-35191, CVE-2026-42772, CVE-2026-54872,
CVE-2026-54873, CVE-2026-54875, CVE-2026-72897, CVE-2026-75804,
CVE-2026-75805, CVE-2026-75806, CVE-2026-77696, CVE-2026-84782,
CVE-2026-84783, CVE-2026-84784
* https://github.com/openssl/openssl/pull/31000
"Fix 4.0 regression: retain pending base64 BIO output on retry"
* https://github.com/openssl/openssl/pull/31610
"siv128.c: Assigned -1 to final_ret(ctx) variable on auth. failure."
* https://github.com/openssl/openssl/pull/32694
"http: reject HTTPS downgrades after relative redirects"
* https://github.com/openssl/openssl/pull/32872
"Remove /Gs0 windows compiler flag"
* https://github.com/openssl/openssl/pull/32941
"FIPS[4.0]: Change FIPS indicators so that all approved algorithms
have a gettable indicator"
4.0.3 NEWS.md includes the following:
* CVE-2026-35189, CVE-2026-35191, CVE-2026-42772, CVE-2026-54872,
CVE-2026-54873, CVE-2026-54875, CVE-2026-72897, CVE-2026-75804,
CVE-2026-75805, CVE-2026-75806, CVE-2026-77696, CVE-2026-84782,
CVE-2026-84783, CVE-2026-84784
* https://github.com/openssl/openssl/pull/31000
"Fix 4.0 regression: retain pending base64 BIO output on retry"
* https://github.com/openssl/openssl/pull/31610
"siv128.c: Assigned -1 to final_ret(ctx) variable on auth. failure."
Signed-off-by: Eugene Syromiatnikov <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Tomas Mraz <[email protected]>
Merge-date: Tue Sep 29 12:00:20 2026
Reviewed-by: Milan Broz <[email protected]>
Merged-from: https://github.com/openssl/openssl/pull/33052
|
| |
|
|
|
|
|
| |
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Wed Oct 21 16:38:25 2026
Merged-from: https://github.com/openssl/openssl/pull/33023
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Use AVX2 NTT-domain multiplication and accumulation for ML-KEM inner
products, matrix products, and the transposed matrix product used in
key generation.
Rename the x86_64 perlasm source to reflect its wider scope.
Assisted-by: ChatGPT:gpt-6-Sol
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Wed Oct 21 16:38:25 2026
Merged-from: https://github.com/openssl/openssl/pull/33023
|
| |
|
|
|
|
|
|
|
|
| |
Implement the FIPS 203 transforms in x86_64 perlasm with AVX2 runtime dispatch.
Assisted-by: ChatGPT:gpt-6-Sol
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Wed Oct 21 16:38:25 2026
Merged-from: https://github.com/openssl/openssl/pull/33023
|
| |
|
|
|
|
|
|
|
| |
Assisted-by: Claude Sonnet 5
Signed-off-by: rkselvam-hub <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Nikola Pajkovsky <[email protected]>
Merge-date: Wed Oct 21 16:33:06 2026
Merged-from: https://github.com/openssl/openssl/pull/32830
|
| |
|
|
|
|
|
|
|
|
|
| |
Fixes #30818
Co-authored-by: Anuj Ramesh <[email protected]>
Assisted-by: Claude:claude-fable-5
Reviewed-by: Matt Caswell <[email protected]>
Reviewed-by: Frederik Wedel-Heinen <[email protected]>
Merge-date: Wed Oct 21 16:29:21 2026
Merged-from: https://github.com/openssl/openssl/pull/32527
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
SSL_has_matching_session_id() returns 0 both when no matching session
exists and when the cache lock cannot be acquired. Its use in the
built-in generator's retry loop and the final uniqueness check can
therefore treat a lock failure as proof that no conflict exists.
Add an internal tri-state lookup. The final uniqueness check uses it as
a backstop for IDs produced by both built-in and application callbacks,
recording an internal fatal error when the cache cannot be checked. The
retry loop also uses it to prevent the built-in generator from returning
an ID after its own lookup failed, through the existing callback failure
path. Preserve the public API's boolean contract.
Correct the callback-selection cache lock failure reason from
SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED to ERR_R_INTERNAL_ERROR.
Remove a redundant caller-side SSLfatal() that appended a generic
ERR_R_INTERNAL_ERROR after the specific error already recorded. Add a
deterministic unit test for final cache lookup failure.
Fixes #32358
Assisted-by: Codex:gpt-5.6-sol
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Dmitry Belyavskiy <[email protected]>
Merge-date: Wed Oct 21 16:25:29 2026
Merged-from: https://github.com/openssl/openssl/pull/32359
|
| |
|
|
|
|
|
|
|
|
| |
suites.
Co-authored-by: Mounir Idrassi <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Reviewed-by: Dmitry Belyavskiy <[email protected]>
Merge-date: Wed Oct 21 16:22:59 2026
Merged-from: https://github.com/openssl/openssl/pull/32051
|
| |
|
|
|
|
|
|
|
| |
refactors the fetching of NULL cipher to be consistent.
Reviewed-by: Mounir Idrassi <[email protected]>
Reviewed-by: Dmitry Belyavskiy <[email protected]>
Merge-date: Wed Oct 21 16:22:59 2026
Merged-from: https://github.com/openssl/openssl/pull/32051
|
| |
|
|
|
|
|
| |
Reviewed-by: Andrew Dinh <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Wed Oct 21 16:17:44 2026
Merged-from: https://github.com/openssl/openssl/pull/31080
|
| |
|
|
|
|
|
| |
Reviewed-by: Andrew Dinh <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Wed Oct 21 16:17:44 2026
Merged-from: https://github.com/openssl/openssl/pull/31080
|
| |
|
|
|
|
|
| |
Reviewed-by: Andrew Dinh <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Wed Oct 21 16:17:44 2026
Merged-from: https://github.com/openssl/openssl/pull/31080
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
scan_ext_flags() deduplicates certificate extensions. Standard extensions have
an assigned NID and are handled by an O(1) bitset, but unknown or dynamically
registered OIDs fall back to an hash table.
Hash the OID with SipHash under a random key drawn once per scan, so the bucket
an OID lands in is unpredictable to an attacker. This mirrors the existing
defense for attacker-controlled keys in ssl/quic/quic_lcidm.c.
If the table cannot be set up or an insert fails, fail closed with
EXFLAG_INVALID, as ossl_x509v3_cache_extensions() does for any other extension
it cannot process. Leaving the loop silently would skip not only the duplicate
check but also the unsupported-critical check for this and every later
extension.
Discovered by Anthropic's OSS Scanner (finding ANT-2026-7UKRZ2MY).
Assisted-by: Claude:claude-opus-4-8
Reviewed-by: Neil Horman <[email protected]>
Reviewed-by: Matt Caswell <[email protected]>
Merge-date: Wed Oct 21 15:58:52 2026
Merged-from: https://github.com/openssl/openssl/pull/33281
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
After the hellos, rejected plaintext records mustn't advance the epoch 0
replay window. The existing check runs after record processing updates
that window, so a rejected record can affect a later plaintext alert.
Move the check ahead of replay processing, while keeping next epoch
records eligible for buffering. Extend the existing rejection test to
verify that the bitmap stays unchanged before completing the handshake.
Assisted-by: Codex:gpt-6-astra
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Matt Caswell <[email protected]>
Merge-date: Wed Oct 21 15:56:56 2026
Merged-from: https://github.com/openssl/openssl/pull/33271
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A blocking SSL_poll can register several objects on one DTLS listener.
A single thread using DTLS can trigger this when a connection translator
demultiplexes a datagram after an earlier listener item registers. Cleanup
can then wait for a notification which only a later registration in the
same call can clear. A finite poll timeout does not bound that cleanup
wait. Overlapping polls can also wait on each other's registrations
across distinct listeners.
Track one registration per DTLS listener in the poll's wait context and
separate deregistration from waiting for notification completion. Record
the notification generation during deregistration so a later signal
cannot prolong the wait for an earlier cycle. Cleanup still depends on
the other registered waiters making progress.
Extend the QUIC two-phase cleanup from PR #32137 to DTLS. Release every
DTLS and QUIC registration before waiting for any notification cycle to
finish. The QUIC translator's early deregistration remains nonblocking,
so readiness rechecks and failures obey the same ordering in mixed arrays.
The DTLS wait context records registrations as they are acquired, so
partial setup failures and translation aborts release each exactly once.
No public API changes are needed.
Add coverage for shared listeners, repeated items, forced two-listener
and mixed-protocol cleanup ordering, readiness rechecks, translation and
allocation failures, single-thread controls, and notification generations.
Use queued datagrams for the natural single-thread triggers and raise
synthetic notifications only after registration. Guard cleanup and
notification-generation regression tests with watchdogs.
Fixes #33230
Assisted-by: Codex:gpt-6-astra
Reviewed-by: Matt Caswell <[email protected]>
Reviewed-by: Ryan Hooper <[email protected]>
Merge-date: Wed Oct 21 15:51:43 2026
Merged-from: https://github.com/openssl/openssl/pull/33237
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
SSL_clear() temporarily detaches an accepted connection's listener
association while replacing its DTLS state. If initialization fails,
unregister the saved peer before releasing the receive queue and
listener reference. Otherwise, freeing the connection leaves a stale
entry in the listener's established-connection table.
Build the temporary unregister key in stack storage so removal does
not depend on a successful allocation during cleanup. Share the key
serialization with registration and lookup, preserving the existing
peer-address matching and SipHash inputs.
Add allocation-failure tests for SSL_clear() on an accepted DTLS 1.2
connection. Cover both single failures and sustained allocation failure
through reset cleanup. Check that detached connections are removed,
while connections retaining their listener association stay registered.
Fixes: #32974
Assisted-by: OpenCode:github-copilot/gpt-6-astra
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Matt Caswell <[email protected]>
Reviewed-by: Mounir Idrassi <[email protected]>
Merge-date: Wed Oct 21 15:41:49 2026
Merged-from: https://github.com/openssl/openssl/pull/33270
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
With CMS_VERIFY_PARTIAL, CMS_verify() succeeds as long as at least
one SignerInfo verifies, but CMS_get0_signers() still returned the
certificate of every SignerInfo, defeating "signed by X" or
"signed by N signers" policies. The same applied to the certificates
written by "openssl cms -verify -verify_partial -signer".
This commit fixes CMS_get0_signers() behaviour returning only
certificates of signers that passed verification.
Nothing changes if CMS_VERIFY_PARTIAL isn't set.
Reported-by: Anthropic OSS scan id ANT-2026-GF4OIPVH
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Matt Caswell <[email protected]>
Merge-date: Wed Oct 21 15:39:29 2026
Merged-from: https://github.com/openssl/openssl/pull/33279
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When CMS_VERIFY_PARTIAL was added, every "goto err" on a failed
certificate, signed attributes, CAdES or content check was replaced by
"continue", so that the remaining SignerInfos are still checked.
Without the flag one failure already makes the whole call fail, yet
CMS_verify() went on checking all the other signers and reading the
content, which only wastes time.
Goto err on the first failure unless CMS_VERIFY_PARTIAL is set again.
Fixes: 5af9dbf12832 "Implement partial verification for CMS with multiple signatures"
Reported-by: Anthropic's OSS Scanner, ANT-2026-D12JMUYJ
Assisted-by: Claude:claude-opus-5-5
Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Milan Broz <[email protected]>
Merge-date: Wed Oct 21 15:36:24 2026
Merged-from: https://github.com/openssl/openssl/pull/33283
|