Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package libtcnative-2-0 for openSUSE:Factory
checked in at 2026-10-29 16:11:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libtcnative-2-0 (Old)
and /work/SRC/openSUSE:Factory/.libtcnative-2-0.new.1255 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libtcnative-2-0"
Thu Oct 29 16:11:29 2026 rev:5 rq:1393634 version:2.0.17
Changes:
--------
--- /work/SRC/openSUSE:Factory/libtcnative-2-0/libtcnative-2-0.changes
2026-09-28 10:43:25.072324324 +0200
+++
/work/SRC/openSUSE:Factory/.libtcnative-2-0.new.1255/libtcnative-2-0.changes
2026-10-29 16:13:06.374086157 +0100
@@ -1,0 +2,20 @@
+Thu Oct 29 13:31:34 UTC 2026 - Fridrich Strba <[email protected]>
+
+- Upgrade to version 2.0.17
+ * Changes
+ + Add: Add support for configuring server-side TLSv1.2 and
+ TLSv1.3 pre-shared key callbacks.
+ + Fix: Align the OCSP checking performed by ssl_verify_OCSP()
+ with the behaviour of Tomcat's JSSE based SSLEngine
+ implementation so that a certificate that is itself a trust
+ anchor (whether a self-signed root or a certificate trusted
+ directly via the configured trust store) is not subject to
+ OCSP checking.
+ + Fix: Limit read and write access to a newly created
+ SSLKEYLOGFILE (if any) to the user under which Tomcat Native
+ is running.
+ + Update: Update the recommended minimum version of OpenSSL to
+ 3.5.9.
+ + Fix: Generate the HTML changelog as UTF-8.
+
+-------------------------------------------------------------------
Old:
----
tomcat-native-2.0.16-src.tar.gz
tomcat-native-2.0.16-src.tar.gz.asc
New:
----
tomcat-native-2.0.17-src.tar.gz
tomcat-native-2.0.17-src.tar.gz.asc
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ libtcnative-2-0.spec ++++++
--- /var/tmp/diff_new_pack.wEPYpo/_old 2026-10-29 16:13:07.148118618 +0100
+++ /var/tmp/diff_new_pack.wEPYpo/_new 2026-10-29 16:13:07.150118702 +0100
@@ -18,7 +18,7 @@
%{!?make_build:%global make_build make %{?_smp_mflags}}
Name: libtcnative-2-0
-Version: 2.0.16
+Version: 2.0.17
Release: 0
Summary: Tomcat resources for performance, compatibility, etc
License: Apache-2.0
++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.wEPYpo/_old 2026-10-29 16:13:07.184120127 +0100
+++ /var/tmp/diff_new_pack.wEPYpo/_new 2026-10-29 16:13:07.187120253 +0100
@@ -1,6 +1,6 @@
-mtime: 1790314819
-commit: fc0eb220e2d5e00e3562e54cea619df33e00a924c2a0e211563b2a330e679f78
+mtime: 1793281035
+commit: 096921866fe455d6b1d82aea96214d75ebfc56695294906dfbbb15139901296b
url: https://src.opensuse.org/java-packages/libtcnative-2-0
-revision: fc0eb220e2d5e00e3562e54cea619df33e00a924c2a0e211563b2a330e679f78
+revision: 096921866fe455d6b1d82aea96214d75ebfc56695294906dfbbb15139901296b
projectscmsync: https://src.opensuse.org/java-packages/_ObsPrj
++++++ build.specials.obscpio ++++++
++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore 1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore 2026-10-29 14:37:15.000000000 +0100
@@ -0,0 +1 @@
+.osc
++++++ tomcat-native-2.0.16-src.tar.gz -> tomcat-native-2.0.17-src.tar.gz ++++++
++++ 9588 lines of diff (skipped)
++++ retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/CHANGELOG.txt
new/tomcat-native-2.0.17-src/CHANGELOG.txt
--- old/tomcat-native-2.0.16-src/CHANGELOG.txt 2026-09-02 14:58:40.000000000
+0200
+++ new/tomcat-native-2.0.17-src/CHANGELOG.txt 2026-10-22 13:47:42.000000000
+0200
@@ -3,7 +3,24 @@
This is the Changelog for Apache Tomcat Native 2.0.x. The Tomcat Native
2.0.x branch started from the 1.2.33 tag.
- 2.0.16
+ 2.0.17
+
+ * Add: Add support for configuring server-side TLSv1.2 and TLSv1.3
+ pre-shared key callbacks. (markt)
+ * Add: Add support for configuring client-side TLSv1.2 and TLSv1.3
+ pre-shared key callbacks. (markt)
+ * Fix: Align the OCSP checking performed by ssl_verify_OCSP() with the
+ behaviour of Tomcat's JSSE based SSLEngine implementation so that a
+ certificate that is itself a trust anchor (whether a self-signed root
+ or a certificate trusted directly via the configured trust store) is
+ not subject to OCSP checking. (markt)
+ * Fix: Limit read and write access to a newly created SSLKEYLOGFILE (if
+ any) to the user under which Tomcat Native is running. (markt)
+ * Update: Update the recommended minimum version of OpenSSL to 3.5.9.
+ (markt)
+ * Fix: Generate the HTML changelog as UTF-8. (markt)
+
+ 2026-09-07 2.0.16
* Code: Remove call to ERR_remove_thread_state() from Windows specific
code to allow building with OpenSSL 4.0.x. ERR_remove_thread_state()
@@ -247,4 +264,4 @@
Please see the 1.1.x changelog.
- Copyright � 2008-2026, The Apache Software Foundation
+ Copyright © 2008-2026, The Apache Software Foundation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/HOWTO-RELEASE.txt
new/tomcat-native-2.0.17-src/HOWTO-RELEASE.txt
--- old/tomcat-native-2.0.16-src/HOWTO-RELEASE.txt 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/HOWTO-RELEASE.txt 2026-10-22
13:45:19.000000000 +0200
@@ -32,6 +32,8 @@
Review the open issues in Bugzilla.
Review open PRs in GitHub.
+Check the versions in native/srclib/VERSIONS
+
If you haven't already, add your public PGP key to KEYS.
Ensure dates and/or version numbers are up to date:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/build.properties.default
new/tomcat-native-2.0.17-src/build.properties.default
--- old/tomcat-native-2.0.16-src/build.properties.default 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/build.properties.default 2026-10-22
13:45:19.000000000 +0200
@@ -18,7 +18,7 @@
# ----- Version Control Flags -----
version.major=2
version.minor=0
-version.build=16
+version.build=17
version.patch=0
version.suffix=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/docs/index.html
new/tomcat-native-2.0.17-src/docs/index.html
--- old/tomcat-native-2.0.16-src/docs/index.html 2026-09-02
14:58:40.000000000 +0200
+++ new/tomcat-native-2.0.17-src/docs/index.html 2026-10-22
13:47:42.000000000 +0200
@@ -10,10 +10,10 @@
</div><h3 id="Headlines">Headlines</h3><div class="text">
<ul>
-<li><a href="news/2026.html#20260615">15 June 2026 - <b>Tomcat-Native-2.0.15
+<li><a href="news/2026.html#20260907">7 September June 2026 -
<b>Tomcat-Native-2.0.16
released</b></a>
<p>The Apache Tomcat team is proud to announce the immediate availability of
-Tomcat Native 2.0.15 Stable.</p>
+Tomcat Native 2.0.16 Stable.</p>
<p>
The sources and the binaries for selected platforms are available from the
<a href="../download-native.cgi">Download page</a>.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/docs/miscellaneous/changelog.html
new/tomcat-native-2.0.17-src/docs/miscellaneous/changelog.html
--- old/tomcat-native-2.0.16-src/docs/miscellaneous/changelog.html
2026-09-02 14:58:40.000000000 +0200
+++ new/tomcat-native-2.0.17-src/docs/miscellaneous/changelog.html
2026-10-22 13:47:42.000000000 +0200
@@ -4,7 +4,35 @@
This is the Changelog for Apache Tomcat Native 2.0.x. The Tomcat Native 2.0.x
branch started from the 1.2.33 tag.
</p>
-</div><h3 id="2.0.16"><span style="float: right;"></span> 2.0.16</h3><div
class="text">
+</div><h3 id="2.0.17"><span style="float: right;"></span> 2.0.17</h3><div
class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="../images/add.gif">
+ Add support for configuring server-side TLSv1.2 and TLSv1.3 pre-shared
+ key callbacks. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="../images/add.gif">
+ Add support for configuring client-side TLSv1.2 and TLSv1.3 pre-shared
+ key callbacks. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="../images/fix.gif">
+ Align the OCSP checking performed by <code>ssl_verify_OCSP()</code> with
+ the behaviour of Tomcat's JSSE based <code>SSLEngine</code>
+ implementation so that a certificate that is itself a trust anchor
+ (whether a self-signed root or a certificate trusted directly via the
+ configured trust store) is not subject to OCSP checking. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="../images/fix.gif">
+ Limit read and write access to a newly created <code>SSLKEYLOGFILE</code>
+ (if any) to the user under which Tomcat Native is running. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="../images/update.gif">
+ Update the recommended minimum version of OpenSSL to 3.5.9. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="../images/fix.gif">
+ Generate the HTML changelog as UTF-8. (markt)
+ </li>
+ </ul>
+</div><h3 id="2.0.16"><span style="float: right;">2026-09-07</span>
2.0.16</h3><div class="text">
<ul class="changelog">
<li><img alt="Code: " class="icon" src="../images/code.gif">
Remove call to ERR_remove_thread_state() from Windows specific code to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/docs/news/2026.html
new/tomcat-native-2.0.17-src/docs/news/2026.html
--- old/tomcat-native-2.0.16-src/docs/news/2026.html 2026-09-02
14:58:40.000000000 +0200
+++ new/tomcat-native-2.0.17-src/docs/news/2026.html 2026-10-22
13:47:42.000000000 +0200
@@ -1,6 +1,11 @@
<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="en"><head><META http-equiv="Content-Type" content="text/html;
charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet"
type="text/css"><link href="../images/style.css" rel="stylesheet"
type="text/css"><title>The Apache Tomcat Native Library 2.0 - News - 2026 News
and Status</title></head><body><div id="wrapper"><header><div
id="header"><div><div><div class="logo noPrint"><a
href="https://tomcat.apache.org/"><img alt="Tomcat Home"
src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div
class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img
src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width:
266px; height: 83px;"></a></div><h1>The Apache Tomcat Native Library 2.0 -
News</h1><div style="height: 1px;"></div><div style="clear:
left;"></div></div></div></div></header><div id="middle"><div><div
id="mainLeft"
class="noprint"><div><nav><div><h2><strong>Links</strong></h2><ul><li><a
href="../ind
ex.html">Docs Home</a></li></ul></div><div><h2><strong>Miscellaneous
Documentation</strong></h2><ul><li><a
href="../miscellaneous/changelog.html">Changelog</a></li><li><a
href="../miscellaneous/tls-renegotiation.html">TLS
renegotiation</a></li></ul></div><div><h2><strong>News</strong></h2><ul><li><a
href="../news/2026.html">2026</a></li><li><a
href="../news/2025.html">2025</a></li><li><a
href="../news/2024.html">2024</a></li><li><a
href="../news/2023.html">2023</a></li><li><a
href="../news/2022.html">2022</a></li></ul></div></nav></div></div><div
id="mainRight"><div id="content"><h2>2026 News and Status</h2><h3
id="2026_News_&_Status">2026 News & Status</h3><div class="text">
+ <div class="subsection"><h4 id="20260907">7 September 2026 -
Tomcat-Native-2.0.16 released</h4><div class="text">
+ <p>The Apache Tomcat team is proud to announce the immediate
+ availability of Tomcat Native 2.0.16.</p>
+ </div></div>
+
<div class="subsection"><h4 id="20260615">15 June 2026 -
Tomcat-Native-2.0.15 released</h4><div class="text">
<p>The Apache Tomcat team is proud to announce the immediate
availability of Tomcat Native 2.0.15.</p>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/java/org/apache/tomcat/jni/PreSharedKeySelector.java
new/tomcat-native-2.0.17-src/java/org/apache/tomcat/jni/PreSharedKeySelector.java
---
old/tomcat-native-2.0.16-src/java/org/apache/tomcat/jni/PreSharedKeySelector.java
1970-01-01 01:00:00.000000000 +0100
+++
new/tomcat-native-2.0.17-src/java/org/apache/tomcat/jni/PreSharedKeySelector.java
2026-10-22 13:45:19.000000000 +0200
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.jni;
+
+/**
+ * The interface for the Tomcat code that responds to the callback from the
OpenSSL layer in Tomcat Native to allow
+ * Tomcat to select a pre-shared key. It supports server-side TLSv1.2 {@code
SSL_CTX_set_psk_server_callback},
+ * server-side TLSv1.3 {@code SSL_CTX_set_psk_find_session_callback},
client-side TLSv1.2
+ * {@code SSL_CTX_set_psk_client_callback} and client-side
+ * TLSv1.3 {@code SSL_CTX_set_psk_use_session_callback} call-backs.
+ */
+public interface PreSharedKeySelector {
+
+ /**
+ * Selects the TLSv1.2 pre-shared key on the server side given the
provided client identity.
+ *
+ * @param ssl the SSL instance
+ * @param identity the PSK identity provided by the client
+ *
+ * @return the pre-shared key, or {@code null} if the identity is not
recognized. OpenSSL limits the key to between
+ * 1 and 512 bytes long (inclusive). If the byte sequence is
truly random then 16 bytes are recommended
+ * for 128-bit ciphers and 32 bytes for 256-bit ciphers.
+ */
+ byte[] select(long ssl, String identity);
+
+ /**
+ * Selects the TLSv1.3 pre-shared key and digest on the server side given
the provided client identity.
+ * <p>
+ * The callback is a little more complex for TLSv1.3. The return value is
still the pre-shared key but OpenSSL also
+ * needs to know which digest to use. Because the OpenSSL API only exposes
a cipher for this, that is what Tomcat
+ * populates the {@code cipherSuite} array with but only the digest is
relevant.
+ *
+ * @param ssl the SSL instance
+ * @param identity the PSK identity provided by the client
+ * @param cipherSuite a single-element array that must be populated with a
IANA TLSv1.3 cipher suite identifier
+ *
+ * @return the pre-shared key (strictly the input to the KDF), or {@code
null} if the identity is not recognized.
+ * OpenSSL limits the key to between 1 and 48 bytes long
(inclusive). If the byte sequence is truly
+ * random then 16 bytes are recommended for 128-bit ciphers
and 32 bytes for 256-bit ciphers.
+ */
+ byte[] select(long ssl, byte[] identity, int[] cipherSuite);
+
+
+ /**
+ * Selects the TLSv1.2 identity and pre-shared key that the client will
present to a server.
+ *
+ * @param ssl the SSL instance
+ * @param identity a single-element array that must be populated with the
PSK identity
+ *
+ * @return the pre-shared key, or {@code null} if no key is available
+ */
+ byte[] selectClient(long ssl, String[] identity);
+
+ /**
+ * Selects the TLSv1.3 identity, pre-shared key and digest that the client
will present to a server.
+ *
+ * @param ssl the SSL instance
+ * @param identity a single-element array that must be populated with
the PSK identity
+ * @param cipherSuite a single-element array that must be populated with a
IANA TLSv1.3 cipher suite identifier
+ *
+ * @return the pre-shared key (strictly the input to the KDF), or {@code
null} if no key is available
+ */
+ byte[] selectClient(long ssl, String[] identity, int[] cipherSuite);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/java/org/apache/tomcat/jni/SSL.java
new/tomcat-native-2.0.17-src/java/org/apache/tomcat/jni/SSL.java
--- old/tomcat-native-2.0.16-src/java/org/apache/tomcat/jni/SSL.java
2026-09-02 14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/java/org/apache/tomcat/jni/SSL.java
2026-10-22 13:45:19.000000000 +0200
@@ -219,12 +219,34 @@
* Enable support for Kernel TLS.
*/
public static final long SSL_OP_ENABLE_KTLS = 0x8L;
+ /**
+ * Obsolete option retained for compatibility. This option has no effect
from OpenSSL 4.1 onwards.
+ */
public static final long SSL_OP_TLSEXT_PADDING = 0x10L;
// Unused = 0x20L
+ /**
+ * Don't prefer ECDHE-ECDSA ciphers when the client appears to be Safari
on OS X. OS X 10.8..10.8.3 has broken
+ * support for ECDHE-ECDSA ciphers.
+ */
public static final long SSL_OP_SAFARI_ECDHE_ECDSA_BUG = 0x40L;
+ /**
+ * Treat a closed connection as if the close_notify alert was received, so
the peer does not need to send it. This
+ * is only safe to use when the application protocol independently detects
truncation attacks.
+ */
public static final long SSL_OP_IGNORE_UNEXPECTED_EOF = 0x80L;
+ /**
+ * Enable client-initiated renegotiation, which is disabled by default.
+ */
public static final long SSL_OP_ALLOW_CLIENT_RENEGOTIATION = 0x100L;
+ /**
+ * Disable TLS Extension CA Names. You may want to disable it for security
reasons or for compatibility with some
+ * Windows TLS implementations crashing when this extension is larger than
1024 bytes.
+ */
public static final long SSL_OP_DISABLE_TLSEXT_CA_NAMES = 0x200L;
+ /**
+ * In TLSv1.3 allow a non-(ec)dhe based key exchange mode on resumption.
This means that there will be no forward
+ * secrecy for the resumed session.
+ */
public static final long SSL_OP_ALLOW_NO_DHE_KEX = 0x400L;
/**
@@ -309,9 +331,21 @@
* Disable TLSv1.1 protocol.
*/
public static final long SSL_OP_NO_TLSv1_1 = 0x10000000L;
+ /**
+ * Disable TLSv1.3 protocol.
+ */
public static final long SSL_OP_NO_TLSv1_3 = 0x20000000L;
+ /**
+ * Disable DTLSv1.0 protocol.
+ */
public static final long SSL_OP_NO_DTLSv1 = SSL_OP_NO_TLSv1;
+ /**
+ * Disable DTLSv1.2 protocol.
+ */
public static final long SSL_OP_NO_DTLSv1_2 = SSL_OP_NO_TLSv1_2;
+ /**
+ * Disable DTLSv1.3 protocol.
+ */
public static final long SSL_OP_NO_DTLSv1_3 = SSL_OP_NO_TLSv1_3;
/**
* Disallow all renegotiation.
@@ -336,7 +370,16 @@
* Enable KTLS TX zerocopy on Linux.
*/
public static final long SSL_OP_ENABLE_KTLS_TX_ZEROCOPY_SENDFILE =
0x400000000L;
+ /**
+ * In TLSv1.3, on resumption let the server prefer a non-(ec)dhe based key
exchange mode over an (ec)dhe based one.
+ * Ignored without SSL_OP_ALLOW_NO_DHE_KEX being set as well. Always
ignored on the client.
+ */
public static final long SSL_OP_PREFER_NO_DHE_KEX = 0x800000000L;
+ /**
+ * Enable use of the legacy point formats for elliptic curves. This option
enables support for the deprecated ANSI
+ * X9.62 prime and char2 compressed point formats, in addition to the
uncompressed format that is enabled by
+ * default.
+ */
public static final long SSL_OP_LEGACY_EC_POINT_FORMATS = 0x1000000000L;
/**
@@ -365,10 +408,16 @@
/*
* Option "collections."
*/
+ /**
+ * Mask of options that disable all SSL/TLS protocol versions.
+ */
public static final long SSL_OP_NO_SSL_MASK =
SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 |
SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3;
- public static final long SSL_OP_NO_DTLS_MASK = SSL_OP_NO_DTLSv1 |
SSL_OP_NO_DTLSv1_2;
+ /**
+ * Mask of options that disable all DTLS protocol versions.
+ */
+ public static final long SSL_OP_NO_DTLS_MASK = SSL_OP_NO_DTLSv1 |
SSL_OP_NO_DTLSv1_2 | SSL_OP_NO_DTLSv1_3;
/**
* Various bug workarounds that should be rather harmless.
@@ -380,34 +429,79 @@
/*
* OBSOLETE OPTIONS retained for compatibility.
*/
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_MICROSOFT_SESS_ID_BUG = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_NETSCAPE_CHALLENGE_BUG = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_MSIE_SSLV2_RSA_PADDING = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_SSLEAY_080_CLIENT_DH_BUG = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_TLS_D5_BUG = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_TLS_BLOCK_PADDING_BUG = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_SINGLE_ECDH_USE = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_SINGLE_DH_USE = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_EPHEMERAL_RSA = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_NO_SSLv2 = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_NETSCAPE_CA_DN_BUG = 0x0;
+ /**
+ * Obsolete option retained for compatibility. This option no longer has
any effect.
+ */
@Deprecated
public static final long SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG = 0x0;
@@ -913,8 +1007,8 @@
* <br>
* The depth actually is the maximum number of intermediate certificate
issuers, i.e. the number of CA certificates
* which are max allowed to be followed while verifying the client
certificate. A depth of 0 means that self-signed
- * client certificates are accepted only, the default depth of 1 means the
client certificate can be self-signed or
- * has to be signed by a CA which is directly known to the server (i.e.
the CA's certificate is under
+ * client certificates are accepted only. A depth of 1 means the client
certificate can be self-signed or has to be
+ * signed by a CA which is directly known to the server (i.e. the CA's
certificate is under
* {@code setCACertificatePath}, etc).
*
* @param ssl the SSL instance (SSL *)
@@ -973,7 +1067,7 @@
public static native String[] getCiphers(long ssl);
/**
- * Set the TLSv1.2 and below ciphers available for negotiation the in TLS
handshake.
+ * Set the TLSv1.2 and below ciphers available for negotiation in the TLS
handshake.
* <p>
* This complex directive uses a colon-separated cipher-spec string
consisting of OpenSSL cipher specifications to
* configure the ciphers the client is permitted to negotiate in the TLS
handshake phase.
@@ -988,7 +1082,7 @@
public static native boolean setCipherSuites(long ssl, String cipherList)
throws Exception;
/**
- * Set the TLSv1.3 cipher suites available for negotiation the in TLS
handshake.
+ * Set the TLSv1.3 cipher suites available for negotiation in the TLS
handshake.
* <p>
* This uses a colon-separated list of TLSv1.3 cipher suite names in
preference order.
*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/java/org/apache/tomcat/jni/SSLConf.java
new/tomcat-native-2.0.17-src/java/org/apache/tomcat/jni/SSLConf.java
--- old/tomcat-native-2.0.16-src/java/org/apache/tomcat/jni/SSLConf.java
2026-09-02 14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/java/org/apache/tomcat/jni/SSLConf.java
2026-10-22 13:45:19.000000000 +0200
@@ -124,7 +124,7 @@
*
* @return The result of the native {@code SSL_CONF_CTX_finish} call
*
- * @see <a
href="https://www.openssl.org/docs/man1.0.2/ssl/SSL_CONF_CTX_set_flags.html">OpenSSL
+ * @see <a
href="https://www.openssl.org/docs/man1.0.2/ssl/SSL_CONF_CTX_finish.html">OpenSSL
* SSL_CONF_CTX_finish</a>
*/
public static native int finish(long cctx);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/java/org/apache/tomcat/jni/SSLContext.java
new/tomcat-native-2.0.17-src/java/org/apache/tomcat/jni/SSLContext.java
--- old/tomcat-native-2.0.16-src/java/org/apache/tomcat/jni/SSLContext.java
2026-09-02 14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/java/org/apache/tomcat/jni/SSLContext.java
2026-10-22 13:45:19.000000000 +0200
@@ -472,6 +472,42 @@
public static native void setCertVerifyCallback(long ctx,
CertificateVerifier verifier);
/**
+ * Sets the TLSv1.2 server-side pre-shared key callback to a {@link
PreSharedKeySelector} instance. This will call
+ * {@code SSL_CTX_set_psk_server_callback}.
+ *
+ * @param ctx Server context to use.
+ * @param selector the selector to call during handshake, or {@code null}
to remove the current selector
+ */
+ public static native void setPskServerCallback(long ctx,
PreSharedKeySelector selector);
+
+ /**
+ * Sets the TLSv1.3 server-side pre-shared key callback to a {@link
PreSharedKeySelector} instance. This will call
+ * {@code SSL_CTX_set_psk_find_session_callback}.
+ *
+ * @param ctx Server context to use.
+ * @param selector the selector to call during handshake, or {@code null}
to remove the current selector
+ */
+ public static native void setPskFindSessionCallback(long ctx,
PreSharedKeySelector selector);
+
+ /**
+ * Sets the TLSv1.2 client-side pre-shared key callback to a {@link
PreSharedKeySelector} instance. This will call
+ * {@code SSL_CTX_set_psk_client_callback}.
+ *
+ * @param ctx Client context to use
+ * @param selector pre-shared key selector
+ */
+ public static native void setPskClientCallback(long ctx,
PreSharedKeySelector selector);
+
+ /**
+ * Sets the TLSv1.3 client-side pre-shared key callback to a {@link
PreSharedKeySelector} instance. This will call
+ * {@code SSL_CTX_set_psk_use_session_callback}.
+ *
+ * @param ctx Client context to use
+ * @param selector pre-shared key selector
+ */
+ public static native void setPskUseSessionCallback(long ctx,
PreSharedKeySelector selector);
+
+ /**
* Set application layer protocol for application layer protocol
negotiation extension
*
* @param ctx Server context to use.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/jnirelease.sh
new/tomcat-native-2.0.17-src/jnirelease.sh
--- old/tomcat-native-2.0.16-src/jnirelease.sh 2026-09-02 14:56:15.000000000
+0200
+++ new/tomcat-native-2.0.17-src/jnirelease.sh 2026-10-22 13:45:19.000000000
+0200
@@ -91,9 +91,9 @@
fi
# Check for links, elinks or w3m
-w3m_opts="-dump -cols 80 -t 4 -S -O iso-8859-1 -T text/html"
-elinks_opts="-dump -dump-width 80 -dump-charset iso-8859-1 -no-numbering
-no-references -no-home"
-links_opts="-dump -width 80 -codepage iso-8859-1 -no-g -html-numbered-links 0"
+w3m_opts="-dump -cols 80 -t 4 -S -O utf-8 -T text/html"
+elinks_opts="-dump -dump-width 80 -dump-charset utf-8 -no-numbering
-no-references -no-home"
+links_opts="-dump -width 80 -codepage utf-8 -no-g -html-numbered-links 0"
EXPTOOL=""
EXPOPTS=""
for i in w3m elinks links
@@ -244,7 +244,7 @@
fi
# Remove page navigation data from converted file.
cp -p ../CHANGELOG.txt ../CHANGELOG.txt.tmp
-awk '/Preface/ {o=1} o>0' ../CHANGELOG.txt.tmp > ../CHANGELOG.txt
+LC_ALL=C.UTF-8 awk '/Preface/ {o=1} o>0' ../CHANGELOG.txt.tmp >
../CHANGELOG.txt
rm ../CHANGELOG.txt.tmp
cd "$top"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/native/BUILDING
new/tomcat-native-2.0.17-src/native/BUILDING
--- old/tomcat-native-2.0.16-src/native/BUILDING 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/native/BUILDING 2026-10-22
13:45:19.000000000 +0200
@@ -36,10 +36,10 @@
3. Build
- > configure --with-apr=apr_install_location
--with-ssl=openssl_install_location
+ > ./configure --with-apr=apr_install_location
--with-ssl=openssl_install_location --with-java-home=java_home
> make
- This should produce a file named libtcnative-2.so
+ This should produce files in .libs/ named libtcnative-2.so or
libtcnative-2.dylib, etc.
Linux / Unix / OSX (static linking)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/native/include/ssl_private.h
new/tomcat-native-2.0.17-src/native/include/ssl_private.h
--- old/tomcat-native-2.0.16-src/native/include/ssl_private.h 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/native/include/ssl_private.h 2026-10-22
13:45:19.000000000 +0200
@@ -17,6 +17,9 @@
#ifndef SSL_PRIVATE_H
#define SSL_PRIVATE_H
+#include "apr_hash.h"
+#include "apr_thread_mutex.h"
+
/* Exclude unused OpenSSL features
* even if the OpenSSL supports them
*/
@@ -195,6 +198,24 @@
jobject verifier;
jmethodID verifier_method;
+ /* TLSv1.2 server-side pre-shared key selector */
+ jobject psk_selector;
+ jmethodID psk_selector_method;
+
+ /* TLSv1.3 server-side pre-shared key selector */
+ jobject psk_find_session_selector;
+ jmethodID psk_find_session_selector_method;
+
+ /* TLSv1.2 client-side pre-shared key selector */
+ jobject psk_client_selector;
+ jmethodID psk_client_selector_method;
+
+ /* TLSv1.3 client-side pre-shared key selector */
+ jobject psk_use_session_selector;
+ jmethodID psk_use_session_selector_method;
+ apr_hash_t *psk_use_session_identities;
+ apr_thread_mutex_t *psk_use_session_identities_lock;
+
/* Holds the alpn protocols, each of them prefixed with the len of the
protocol */
unsigned char *alpn_proto_data;
unsigned int alpn_proto_len;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/native/include/tcn_version.h
new/tomcat-native-2.0.17-src/native/include/tcn_version.h
--- old/tomcat-native-2.0.16-src/native/include/tcn_version.h 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/native/include/tcn_version.h 2026-10-22
13:45:19.000000000 +0200
@@ -63,7 +63,7 @@
#define TCN_MINOR_VERSION 0
/** patch level */
-#define TCN_PATCH_VERSION 16
+#define TCN_PATCH_VERSION 17
/**
* This symbol is defined for internal, "development" copies of TCN. This
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/native/os/win32/libtcnative.rc
new/tomcat-native-2.0.17-src/native/os/win32/libtcnative.rc
--- old/tomcat-native-2.0.16-src/native/os/win32/libtcnative.rc 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/native/os/win32/libtcnative.rc 2026-10-22
13:45:19.000000000 +0200
@@ -19,7 +19,7 @@
"See the License for the specific language governing " \
"permissions and limitations under the License."
-#define TCN_VERSION "2.0.16"
+#define TCN_VERSION "2.0.17"
1000 ICON "apache.ico"
1001 DIALOGEX 0, 0, 252, 51
@@ -35,8 +35,8 @@
END
1 VERSIONINFO
- FILEVERSION 2,0,16,0
- PRODUCTVERSION 2,0,16,0
+ FILEVERSION 2,0,17,0
+ PRODUCTVERSION 2,0,17,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/native/src/ssl.c
new/tomcat-native-2.0.17-src/native/src/ssl.c
--- old/tomcat-native-2.0.16-src/native/src/ssl.c 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/native/src/ssl.c 2026-10-22
13:45:19.000000000 +0200
@@ -28,13 +28,13 @@
tcn_pass_cb_t tcn_password_callback;
-static BIO *key_log_file = NULL;
+static apr_file_t *key_log_file = NULL;
static void ssl_keylog_callback(const SSL *ssl, const char *line)
{
if (key_log_file && line && *line) {
- BIO_puts(key_log_file, line);
- BIO_puts(key_log_file, "\n");
+ apr_file_puts(line, key_log_file);
+ apr_file_puts("\n", key_log_file);
}
}
@@ -75,7 +75,7 @@
/* Openssl v1.1+ handles all termination automatically. */
if (key_log_file) {
- BIO_free(key_log_file);
+ apr_file_close(key_log_file);
key_log_file = NULL;
}
@@ -195,13 +195,6 @@
/* For SSL_get_app_data2(), SSL_get_app_data3() and SSL_get_app_data4() at
request time */
SSL_init_app_data_idx();
- /*
- * Let us cleanup the ssl library when the library is unloaded
- */
- apr_pool_cleanup_register(tcn_global_pool, NULL,
- ssl_init_cleanup,
- apr_pool_cleanup_null);
-
/* Cache the byte[].class for performance reasons */
clazz = (*e)->FindClass(e, "[B");
byteArrayClass = (jclass) (*e)->NewGlobalRef(e, clazz);
@@ -213,17 +206,23 @@
if (!key_log_file) {
char *key_log_file_name = getenv("SSLKEYLOGFILE");
if (key_log_file_name) {
- FILE *file = fopen(key_log_file_name, "a");
- if (file) {
- if (setvbuf(file, NULL, _IONBF, 0)) {
- fclose(file);
- } else {
- key_log_file = BIO_new_fp(file, BIO_CLOSE);
- }
+ /* Create the unbuffered log with owner-only read/write
permissions. */
+ if (apr_file_open(&key_log_file, key_log_file_name,
+ APR_FOPEN_WRITE | APR_FOPEN_CREATE |
APR_FOPEN_APPEND,
+ APR_FPROT_UREAD | APR_FPROT_UWRITE,
tcn_global_pool) != APR_SUCCESS) {
+ key_log_file = NULL;
}
}
}
+ /*
+ * Register after opening the log so ssl_init_cleanup() closes it before
+ * the file's pool cleanup runs when the library is unloaded.
+ */
+ apr_pool_cleanup_register(tcn_global_pool, NULL,
+ ssl_init_cleanup,
+ apr_pool_cleanup_null);
+
return (jint)APR_SUCCESS;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/native/src/sslcontext.c
new/tomcat-native-2.0.17-src/native/src/sslcontext.c
--- old/tomcat-native-2.0.16-src/native/src/sslcontext.c 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/native/src/sslcontext.c 2026-10-22
13:45:19.000000000 +0200
@@ -21,6 +21,7 @@
#include "apr_file_io.h"
#include "apr_thread_mutex.h"
+#include "apr_hash.h"
#include "apr_poll.h"
#include "apr_pools.h"
@@ -61,6 +62,38 @@
}
c->verifier_method = NULL;
+ if (c->psk_selector) {
+ JNIEnv *e;
+ tcn_get_java_env(&e);
+ (*e)->DeleteGlobalRef(e, c->psk_selector);
+ c->psk_selector = NULL;
+ }
+ c->psk_selector_method = NULL;
+
+ if (c->psk_client_selector) {
+ JNIEnv *e;
+ tcn_get_java_env(&e);
+ (*e)->DeleteGlobalRef(e, c->psk_client_selector);
+ c->psk_client_selector = NULL;
+ }
+ c->psk_client_selector_method = NULL;
+
+ if (c->psk_use_session_selector) {
+ JNIEnv *e;
+ tcn_get_java_env(&e);
+ (*e)->DeleteGlobalRef(e, c->psk_use_session_selector);
+ c->psk_use_session_selector = NULL;
+ }
+ c->psk_use_session_selector_method = NULL;
+
+ if (c->psk_find_session_selector) {
+ JNIEnv *e;
+ tcn_get_java_env(&e);
+ (*e)->DeleteGlobalRef(e, c->psk_find_session_selector);
+ c->psk_find_session_selector = NULL;
+ }
+ c->psk_find_session_selector_method = NULL;
+
if (c->alpn_proto_data) {
free(c->alpn_proto_data);
c->alpn_proto_data = NULL;
@@ -1482,6 +1515,536 @@
}
}
+#ifndef OPENSSL_NO_PSK
+static unsigned int SSL_psk_server(SSL *ssl, const char *identity, unsigned
char *psk, unsigned int max_psk_len)
+{
+ tcn_ssl_ctxt_t *c = SSL_get_app_data2(ssl);
+ JNIEnv *e;
+ jstring identity_string = NULL;
+ jbyteArray key = NULL;
+ jsize key_len;
+ unsigned int result = 0;
+
+ if (c == NULL || c->psk_selector == NULL || c->psk_selector_method == NULL
|| identity == NULL ||
+ tcn_get_java_env(&e) != JNI_OK) {
+ return 0;
+ }
+
+ identity_string = (*e)->NewStringUTF(e, identity);
+ if (identity_string == NULL) {
+ goto cleanup;
+ }
+
+ key = (*e)->CallObjectMethod(e, c->psk_selector, c->psk_selector_method,
P2J(ssl), identity_string);
+ if ((*e)->ExceptionCheck(e) || key == NULL) {
+ goto cleanup;
+ }
+
+ key_len = (*e)->GetArrayLength(e, key);
+ if (key_len <= 0 || (unsigned int) key_len > max_psk_len) {
+ goto cleanup;
+ }
+
+ (*e)->GetByteArrayRegion(e, key, 0, key_len, (jbyte *)psk);
+ if ((*e)->ExceptionCheck(e)) {
+ goto cleanup;
+ }
+ result = (unsigned int) key_len;
+
+cleanup:
+ if ((*e)->ExceptionCheck(e)) {
+ (*e)->ExceptionClear(e);
+ }
+ if (key != NULL) {
+ (*e)->DeleteLocalRef(e, key);
+ }
+ if (identity_string != NULL) {
+ (*e)->DeleteLocalRef(e, identity_string);
+ }
+ return result;
+}
+#endif
+
+#ifndef OPENSSL_NO_PSK
+static unsigned int SSL_psk_client(SSL *ssl, const char *hint, char *identity,
unsigned int max_identity_len,
+ unsigned char *psk, unsigned int
max_psk_len)
+{
+ tcn_ssl_ctxt_t *c = SSL_get_app_data2(ssl);
+ JNIEnv *e;
+ jobjectArray identity_array = NULL;
+ jstring identity_string = NULL;
+ jbyteArray key = NULL;
+ const char *identity_utf = NULL;
+ jsize key_len;
+ size_t identity_len;
+ unsigned int result = 0;
+
+ UNREFERENCED(hint);
+ if (c == NULL || c->psk_client_selector == NULL ||
c->psk_client_selector_method == NULL ||
+ tcn_get_java_env(&e) != JNI_OK) {
+ return 0;
+ }
+
+ identity_array = (*e)->NewObjectArray(e, 1, (*e)->FindClass(e,
"java/lang/String"), NULL);
+ if (identity_array == NULL) {
+ goto cleanup;
+ }
+ key = (*e)->CallObjectMethod(e, c->psk_client_selector,
c->psk_client_selector_method, P2J(ssl), identity_array);
+ if ((*e)->ExceptionCheck(e) || key == NULL) {
+ goto cleanup;
+ }
+ identity_string = (*e)->GetObjectArrayElement(e, identity_array, 0);
+ if (identity_string == NULL) {
+ goto cleanup;
+ }
+ identity_utf = (*e)->GetStringUTFChars(e, identity_string, NULL);
+ if (identity_utf == NULL) {
+ goto cleanup;
+ }
+ identity_len = strlen(identity_utf);
+ key_len = (*e)->GetArrayLength(e, key);
+ if (identity_len + 1 > max_identity_len || key_len <= 0 || (unsigned int)
key_len > max_psk_len) {
+ goto cleanup;
+ }
+ memcpy(identity, identity_utf, identity_len + 1);
+ (*e)->GetByteArrayRegion(e, key, 0, key_len, (jbyte *)psk);
+ if (!(*e)->ExceptionCheck(e)) {
+ result = (unsigned int) key_len;
+ }
+
+cleanup:
+ if (identity_utf != NULL) {
+ (*e)->ReleaseStringUTFChars(e, identity_string, identity_utf);
+ }
+ if ((*e)->ExceptionCheck(e)) {
+ (*e)->ExceptionClear(e);
+ }
+ if (key != NULL) {
+ (*e)->DeleteLocalRef(e, key);
+ }
+ if (identity_string != NULL) {
+ (*e)->DeleteLocalRef(e, identity_string);
+ }
+ if (identity_array != NULL) {
+ (*e)->DeleteLocalRef(e, identity_array);
+ }
+ return result;
+}
+#endif
+
+TCN_IMPLEMENT_CALL(void, SSLContext, setPskClientCallback)(TCN_STDARGS, jlong
ctx, jobject selector)
+{
+#ifdef OPENSSL_NO_PSK
+ UNREFERENCED(o);
+ UNREFERENCED(ctx);
+ UNREFERENCED(selector);
+ tcn_Throw(e, "OpenSSL does not support PSK");
+#else
+ tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
+ jobject new_selector = NULL;
+ jmethodID new_method = NULL;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(ctx != 0);
+
+ if (selector != NULL) {
+ jclass selector_class = (*e)->GetObjectClass(e, selector);
+ new_method = (*e)->GetMethodID(e, selector_class, "selectClient",
"(J[Ljava/lang/String;)[B");
+ (*e)->DeleteLocalRef(e, selector_class);
+ if (new_method == NULL) {
+ return;
+ }
+ new_selector = (*e)->NewGlobalRef(e, selector);
+ if (new_selector == NULL) {
+ return;
+ }
+ }
+ SSL_CTX_set_psk_client_callback(c->ctx, selector == NULL ? NULL :
SSL_psk_client);
+ if (c->psk_client_selector != NULL) {
+ (*e)->DeleteGlobalRef(e, c->psk_client_selector);
+ }
+ c->psk_client_selector = new_selector;
+ c->psk_client_selector_method = new_method;
+#endif
+}
+
+#if defined(HAVE_TLSV1_3) && !defined(LIBRESSL_VERSION_NUMBER)
+/*
+ * Tomcat always configures SSL_CTX_set_session_id_context() with this value
(see
+ * org.apache.tomcat.jni.SSLContext.DEFAULT_SESSION_ID_CONTEXT). A synthetic
SSL_SESSION built by the TLSv1.3 PSK
+ * callbacks must carry a matching id context, otherwise OpenSSL rejects it
internally with
+ * SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT ("attempt to reuse
session in different context").
+ */
+static const unsigned char TCN_PSK_SESSION_ID_CONTEXT[] = { 'd', 'e', 'f',
'a', 'u', 'l', 't' };
+
+static int SSL_psk_use_session(SSL *ssl, const EVP_MD *md, const unsigned char
**identity, size_t *identity_len,
+ SSL_SESSION **sess)
+{
+ tcn_ssl_ctxt_t *c = SSL_get_app_data2(ssl);
+ JNIEnv *e;
+ jobjectArray identity_array = NULL;
+ jstring identity_string = NULL;
+ const char *identity_utf = NULL;
+ jintArray cipher_suite_array = NULL;
+ jbyteArray key = NULL;
+ jint cipher_suite;
+ jsize key_len = 0;
+ unsigned char cipher_id[2];
+ unsigned char *key_data = NULL;
+ const unsigned char *cached_identity = NULL;
+ const SSL_CIPHER *cipher;
+ const EVP_MD *cipher_md;
+ SSL_SESSION *session = NULL;
+ int result = 0;
+
+ *identity = NULL;
+ *identity_len = 0;
+ *sess = NULL;
+ if (c == NULL || c->psk_use_session_selector == NULL ||
c->psk_use_session_selector_method == NULL ||
+ tcn_get_java_env(&e) != JNI_OK) {
+ return 0;
+ }
+
+ identity_array = (*e)->NewObjectArray(e, 1, stringClass, NULL);
+ cipher_suite_array = (*e)->NewIntArray(e, 1);
+ if (identity_array == NULL || cipher_suite_array == NULL) {
+ goto cleanup;
+ }
+
+ key = (*e)->CallObjectMethod(e, c->psk_use_session_selector,
c->psk_use_session_selector_method, P2J(ssl),
+ identity_array, cipher_suite_array);
+ if ((*e)->ExceptionCheck(e)) {
+ goto cleanup;
+ }
+ if (key == NULL) {
+ result = 1;
+ goto cleanup;
+ }
+
+ identity_string = (*e)->GetObjectArrayElement(e, identity_array, 0);
+ if (identity_string == NULL) {
+ goto cleanup;
+ }
+ identity_utf = (*e)->GetStringUTFChars(e, identity_string, NULL);
+ if (identity_utf == NULL) {
+ goto cleanup;
+ }
+ *identity_len = strlen(identity_utf);
+
+ (*e)->GetIntArrayRegion(e, cipher_suite_array, 0, 1, &cipher_suite);
+ if ((*e)->ExceptionCheck(e) || cipher_suite <= 0 || cipher_suite > 0xffff)
{
+ goto cleanup;
+ }
+ cipher_id[0] = (unsigned char)(cipher_suite >> 8);
+ cipher_id[1] = (unsigned char)cipher_suite;
+ cipher = SSL_CIPHER_find(ssl, cipher_id);
+ if (cipher == NULL || strcmp(SSL_CIPHER_get_version(cipher), "TLSv1.3") !=
0) {
+ goto cleanup;
+ }
+ cipher_md = SSL_CIPHER_get_handshake_digest(cipher);
+ if (md != NULL && (cipher_md == NULL || EVP_MD_type(md) !=
EVP_MD_type(cipher_md))) {
+ goto cleanup;
+ }
+
+ key_len = (*e)->GetArrayLength(e, key);
+ if (key_len <= 0) {
+ goto cleanup;
+ }
+ key_data = OPENSSL_malloc((size_t)key_len);
+ if (key_data == NULL) {
+ goto cleanup;
+ }
+ (*e)->GetByteArrayRegion(e, key, 0, key_len, (jbyte *)key_data);
+ if ((*e)->ExceptionCheck(e)) {
+ goto cleanup;
+ }
+
+ session = SSL_SESSION_new();
+ if (session == NULL || !SSL_SESSION_set1_master_key(session, key_data,
(size_t)key_len) ||
+ !SSL_SESSION_set_cipher(session, cipher) ||
+ !SSL_SESSION_set_protocol_version(session, TLS1_3_VERSION) ||
+ !SSL_SESSION_set1_id_context(session, TCN_PSK_SESSION_ID_CONTEXT,
+ (unsigned int)sizeof(TCN_PSK_SESSION_ID_CONTEXT))) {
+ goto cleanup;
+ }
+
+ if (apr_thread_mutex_lock(c->psk_use_session_identities_lock) !=
APR_SUCCESS) {
+ goto cleanup;
+ }
+ cached_identity = apr_hash_get(c->psk_use_session_identities,
identity_utf, (apr_ssize_t)*identity_len);
+ if (cached_identity == NULL) {
+ cached_identity = (const unsigned char *)apr_pstrmemdup(c->pool,
identity_utf, *identity_len);
+ if (cached_identity != NULL) {
+ apr_hash_set(c->psk_use_session_identities, cached_identity,
(apr_ssize_t)*identity_len, cached_identity);
+ }
+ }
+ apr_thread_mutex_unlock(c->psk_use_session_identities_lock);
+ if (cached_identity == NULL) {
+ goto cleanup;
+ }
+
+ *identity = cached_identity;
+ *sess = session;
+ session = NULL;
+ result = 1;
+
+cleanup:
+ if ((*e)->ExceptionCheck(e)) {
+ (*e)->ExceptionClear(e);
+ }
+ SSL_SESSION_free(session);
+ if (key_data != NULL) {
+ OPENSSL_clear_free(key_data, (size_t)key_len);
+ }
+ if (key != NULL) {
+ (*e)->DeleteLocalRef(e, key);
+ }
+ if (cipher_suite_array != NULL) {
+ (*e)->DeleteLocalRef(e, cipher_suite_array);
+ }
+ if (identity_utf != NULL) {
+ (*e)->ReleaseStringUTFChars(e, identity_string, identity_utf);
+ }
+ if (identity_string != NULL) {
+ (*e)->DeleteLocalRef(e, identity_string);
+ }
+ if (identity_array != NULL) {
+ (*e)->DeleteLocalRef(e, identity_array);
+ }
+ return result;
+}
+#endif
+
+TCN_IMPLEMENT_CALL(void, SSLContext, setPskUseSessionCallback)(TCN_STDARGS,
jlong ctx, jobject selector)
+{
+#if defined(HAVE_TLSV1_3) && !defined(LIBRESSL_VERSION_NUMBER)
+ tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
+ jobject new_selector = NULL;
+ jmethodID new_method = NULL;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(ctx != 0);
+
+ if (selector != NULL) {
+ jclass selector_class = (*e)->GetObjectClass(e, selector);
+ new_method = (*e)->GetMethodID(e, selector_class, "selectClient",
"(J[Ljava/lang/String;[I)[B");
+ (*e)->DeleteLocalRef(e, selector_class);
+ if (new_method == NULL) {
+ return;
+ }
+ new_selector = (*e)->NewGlobalRef(e, selector);
+ if (new_selector == NULL) {
+ return;
+ }
+ if (c->psk_use_session_identities == NULL) {
+ c->psk_use_session_identities = apr_hash_make(c->pool);
+ if (c->psk_use_session_identities == NULL ||
+
apr_thread_mutex_create(&c->psk_use_session_identities_lock,
APR_THREAD_MUTEX_DEFAULT,
+ c->pool) != APR_SUCCESS) {
+ (*e)->DeleteGlobalRef(e, new_selector);
+ tcn_ThrowException(e, "Unable to initialize TLSv1.3 PSK
identity cache");
+ return;
+ }
+ }
+ }
+
+ SSL_CTX_set_psk_use_session_callback(c->ctx, selector == NULL ? NULL :
SSL_psk_use_session);
+
+ if (c->psk_use_session_selector != NULL) {
+ (*e)->DeleteGlobalRef(e, c->psk_use_session_selector);
+ }
+ c->psk_use_session_selector = new_selector;
+ c->psk_use_session_selector_method = new_method;
+#else
+ UNREFERENCED(o);
+ UNREFERENCED(ctx);
+ UNREFERENCED(selector);
+ tcn_Throw(e, "OpenSSL does not support TLSv1.3 PSK");
+#endif
+}
+
+TCN_IMPLEMENT_CALL(void, SSLContext, setPskServerCallback)(TCN_STDARGS, jlong
ctx, jobject selector)
+{
+#ifdef OPENSSL_NO_PSK
+ UNREFERENCED(o);
+ UNREFERENCED(ctx);
+ UNREFERENCED(selector);
+ tcn_Throw(e, "OpenSSL does not support PSK");
+#else
+ tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
+ jobject new_selector = NULL;
+ jmethodID new_method = NULL;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(ctx != 0);
+
+ if (selector != NULL) {
+ jclass selector_class = (*e)->GetObjectClass(e, selector);
+ new_method = (*e)->GetMethodID(e, selector_class, "select",
"(JLjava/lang/String;)[B");
+ (*e)->DeleteLocalRef(e, selector_class);
+ if (new_method == NULL) {
+ return;
+ }
+
+ new_selector = (*e)->NewGlobalRef(e, selector);
+ if (new_selector == NULL) {
+ return;
+ }
+ }
+
+ SSL_CTX_set_psk_server_callback(c->ctx, selector == NULL ? NULL :
SSL_psk_server);
+
+ if (c->psk_selector != NULL) {
+ (*e)->DeleteGlobalRef(e, c->psk_selector);
+ }
+ c->psk_selector = new_selector;
+ c->psk_selector_method = new_method;
+#endif
+}
+
+#if defined(HAVE_TLSV1_3) && !defined(LIBRESSL_VERSION_NUMBER)
+static int SSL_psk_find_session(SSL *ssl, const unsigned char *identity,
size_t identity_len, SSL_SESSION **sess)
+{
+ tcn_ssl_ctxt_t *c = SSL_get_app_data2(ssl);
+ JNIEnv *e;
+ jbyteArray identity_array = NULL;
+ jintArray cipher_suite_array = NULL;
+ jbyteArray key = NULL;
+ jint cipher_suite;
+ jsize key_len = 0;
+ unsigned char cipher_id[2];
+ unsigned char *key_data = NULL;
+ const SSL_CIPHER *cipher;
+ SSL_SESSION *session = NULL;
+ int result = 0;
+
+ *sess = NULL;
+ if (c == NULL || c->psk_find_session_selector == NULL ||
c->psk_find_session_selector_method == NULL ||
+ identity == NULL || tcn_get_java_env(&e) != JNI_OK) {
+ return 0;
+ }
+
+ identity_array = (*e)->NewByteArray(e, (jsize)identity_len);
+ if (identity_array == NULL) {
+ goto cleanup;
+ }
+ (*e)->SetByteArrayRegion(e, identity_array, 0, (jsize)identity_len, (const
jbyte *)identity);
+ if ((*e)->ExceptionCheck(e)) {
+ goto cleanup;
+ }
+
+ cipher_suite_array = (*e)->NewIntArray(e, 1);
+ if (cipher_suite_array == NULL) {
+ goto cleanup;
+ }
+
+ key = (*e)->CallObjectMethod(e, c->psk_find_session_selector,
c->psk_find_session_selector_method, P2J(ssl),
+ identity_array, cipher_suite_array);
+ if ((*e)->ExceptionCheck(e)) {
+ goto cleanup;
+ }
+ if (key == NULL) {
+ result = 1;
+ goto cleanup;
+ }
+
+ (*e)->GetIntArrayRegion(e, cipher_suite_array, 0, 1, &cipher_suite);
+ if ((*e)->ExceptionCheck(e) || cipher_suite <= 0 || cipher_suite > 0xffff)
{
+ goto cleanup;
+ }
+ cipher_id[0] = (unsigned char)(cipher_suite >> 8);
+ cipher_id[1] = (unsigned char)cipher_suite;
+ cipher = SSL_CIPHER_find(ssl, cipher_id);
+ if (cipher == NULL || strcmp(SSL_CIPHER_get_version(cipher), "TLSv1.3") !=
0) {
+ goto cleanup;
+ }
+
+ key_len = (*e)->GetArrayLength(e, key);
+ if (key_len <= 0) {
+ goto cleanup;
+ }
+ key_data = OPENSSL_malloc((size_t)key_len);
+ if (key_data == NULL) {
+ goto cleanup;
+ }
+ (*e)->GetByteArrayRegion(e, key, 0, key_len, (jbyte *)key_data);
+ if ((*e)->ExceptionCheck(e)) {
+ goto cleanup;
+ }
+
+ session = SSL_SESSION_new();
+ if (session == NULL || !SSL_SESSION_set1_master_key(session, key_data,
(size_t)key_len) ||
+ !SSL_SESSION_set_cipher(session, cipher) ||
+ !SSL_SESSION_set_protocol_version(session, TLS1_3_VERSION) ||
+ !SSL_SESSION_set1_id_context(session, TCN_PSK_SESSION_ID_CONTEXT,
+ (unsigned int)sizeof(TCN_PSK_SESSION_ID_CONTEXT))) {
+ goto cleanup;
+ }
+
+ *sess = session;
+ session = NULL;
+ result = 1;
+
+cleanup:
+ if ((*e)->ExceptionCheck(e)) {
+ (*e)->ExceptionClear(e);
+ }
+ SSL_SESSION_free(session);
+ if (key_data != NULL) {
+ OPENSSL_clear_free(key_data, (size_t)key_len);
+ }
+ if (key != NULL) {
+ (*e)->DeleteLocalRef(e, key);
+ }
+ if (cipher_suite_array != NULL) {
+ (*e)->DeleteLocalRef(e, cipher_suite_array);
+ }
+ if (identity_array != NULL) {
+ (*e)->DeleteLocalRef(e, identity_array);
+ }
+ return result;
+}
+#endif
+
+TCN_IMPLEMENT_CALL(void, SSLContext, setPskFindSessionCallback)(TCN_STDARGS,
jlong ctx, jobject selector)
+{
+#if defined(HAVE_TLSV1_3) && !defined(LIBRESSL_VERSION_NUMBER)
+ tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
+ jobject new_selector = NULL;
+ jmethodID new_method = NULL;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(ctx != 0);
+
+ if (selector != NULL) {
+ jclass selector_class = (*e)->GetObjectClass(e, selector);
+ new_method = (*e)->GetMethodID(e, selector_class, "select",
"(J[B[I)[B");
+ (*e)->DeleteLocalRef(e, selector_class);
+ if (new_method == NULL) {
+ return;
+ }
+
+ new_selector = (*e)->NewGlobalRef(e, selector);
+ if (new_selector == NULL) {
+ return;
+ }
+ }
+
+ SSL_CTX_set_psk_find_session_callback(c->ctx, selector == NULL ? NULL :
SSL_psk_find_session);
+
+ if (c->psk_find_session_selector != NULL) {
+ (*e)->DeleteGlobalRef(e, c->psk_find_session_selector);
+ }
+ c->psk_find_session_selector = new_selector;
+ c->psk_find_session_selector_method = new_method;
+#else
+ UNREFERENCED(o);
+ UNREFERENCED(ctx);
+ UNREFERENCED(selector);
+ tcn_Throw(e, "OpenSSL does not support TLSv1.3 PSK");
+#endif
+}
+
TCN_IMPLEMENT_CALL(jboolean, SSLContext, setSessionIdContext)(TCN_STDARGS,
jlong ctx, jbyteArray sidCtx)
{
tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/native/src/sslutils.c
new/tomcat-native-2.0.17-src/native/src/sslutils.c
--- old/tomcat-native-2.0.16-src/native/src/sslutils.c 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/native/src/sslutils.c 2026-10-22
13:45:19.000000000 +0200
@@ -476,8 +476,14 @@
* is called if OpenSSL already successfully verified the certificate
* (parameter "ok" in SSL_callback_SSL_verify() must be true).
*/
- else if (X509_check_issued(cert,cert) == X509_V_OK) {
- /* don't do OCSP checking for valid self-issued certs */
+ else if (X509_check_issued(cert,cert) == X509_V_OK
+ || X509_STORE_CTX_get_error_depth(ctx) >=
X509_STORE_CTX_get_num_untrusted(ctx)) {
+ /* Don't do OCSP checking for valid self-issued certs, nor for a
certificate that is itself
+ * a trust anchor (present directly in the configured trust store
rather than supplied by the
+ * peer). A trust anchor is trusted unconditionally, so its own
revocation status is not
+ * checked. This aligns with JSSE's PKIXRevocationChecker, which
excludes the trust anchor
+ * of the certification path from revocation checking regardless of
whether it is self-signed.
+ */
X509_STORE_CTX_set_error(ctx, X509_V_OK);
return OCSP_STATUS_UNKNOWN;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/native/srclib/VERSIONS
new/tomcat-native-2.0.17-src/native/srclib/VERSIONS
--- old/tomcat-native-2.0.16-src/native/srclib/VERSIONS 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/native/srclib/VERSIONS 2026-10-22
13:45:19.000000000 +0200
@@ -5,7 +5,7 @@
The following version of the libraries are recommended:
- APR 1.7.6 or later, http://apr.apache.org
-- OpenSSL 3.5.8 or later, http://www.openssl.org
+- OpenSSL 3.5.9 or later, http://www.openssl.org
Older versions should also work but are not as thoroughly tested by the Tomcat
Native team
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/native/tcnative.spec
new/tomcat-native-2.0.17-src/native/tcnative.spec
--- old/tomcat-native-2.0.16-src/native/tcnative.spec 2026-09-02
14:58:43.000000000 +0200
+++ new/tomcat-native-2.0.17-src/native/tcnative.spec 2026-10-22
13:47:45.000000000 +0200
@@ -21,7 +21,7 @@
Summary: Tomcat Native Java library
Name: tcnative
-Version: 2.0.16
+Version: 2.0.17
Release: 1
License: Apache Software License
Group: System Environment/Libraries
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/xdocs/index.xml
new/tomcat-native-2.0.17-src/xdocs/index.xml
--- old/tomcat-native-2.0.16-src/xdocs/index.xml 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/xdocs/index.xml 2026-10-22
13:45:19.000000000 +0200
@@ -42,10 +42,10 @@
<section name="Headlines">
<ul>
-<li><a href="news/2026.html#20260615">15 June 2026 - <b>Tomcat-Native-2.0.15
+<li><a href="news/2026.html#20260907">7 September June 2026 -
<b>Tomcat-Native-2.0.16
released</b></a>
<p>The Apache Tomcat team is proud to announce the immediate availability of
-Tomcat Native 2.0.15 Stable.</p>
+Tomcat Native 2.0.16 Stable.</p>
<p>
The sources and the binaries for selected platforms are available from the
<a href="../download-native.cgi">Download page</a>.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/xdocs/miscellaneous/changelog.xml
new/tomcat-native-2.0.17-src/xdocs/miscellaneous/changelog.xml
--- old/tomcat-native-2.0.16-src/xdocs/miscellaneous/changelog.xml
2026-09-02 14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/xdocs/miscellaneous/changelog.xml
2026-10-22 13:45:19.000000000 +0200
@@ -31,7 +31,36 @@
branch started from the 1.2.33 tag.
</p>
</section>
-<section name="2.0.16" rtext="">
+<section name="2.0.17" rtext="">
+ <changelog>
+ <add>
+ Add support for configuring server-side TLSv1.2 and TLSv1.3 pre-shared
+ key callbacks. (markt)
+ </add>
+ <add>
+ Add support for configuring client-side TLSv1.2 and TLSv1.3 pre-shared
+ key callbacks. (markt)
+ </add>
+ <fix>
+ Align the OCSP checking performed by <code>ssl_verify_OCSP()</code> with
+ the behaviour of Tomcat's JSSE based <code>SSLEngine</code>
+ implementation so that a certificate that is itself a trust anchor
+ (whether a self-signed root or a certificate trusted directly via the
+ configured trust store) is not subject to OCSP checking. (markt)
+ </fix>
+ <fix>
+ Limit read and write access to a newly created <code>SSLKEYLOGFILE</code>
+ (if any) to the user under which Tomcat Native is running. (markt)
+ </fix>
+ <update>
+ Update the recommended minimum version of OpenSSL to 3.5.9. (markt)
+ </update>
+ <fix>
+ Generate the HTML changelog as UTF-8. (markt)
+ </fix>
+ </changelog>
+</section>
+<section name="2.0.16" rtext="2026-09-07">
<changelog>
<scode>
Remove call to ERR_remove_thread_state() from Windows specific code to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/tomcat-native-2.0.16-src/xdocs/news/2026.xml
new/tomcat-native-2.0.17-src/xdocs/news/2026.xml
--- old/tomcat-native-2.0.16-src/xdocs/news/2026.xml 2026-09-02
14:56:15.000000000 +0200
+++ new/tomcat-native-2.0.17-src/xdocs/news/2026.xml 2026-10-22
13:45:19.000000000 +0200
@@ -30,6 +30,11 @@
<section name="2026 News & Status">
+ <subsection anchor="20260907" name="7 September 2026 -
Tomcat-Native-2.0.16 released">
+ <p>The Apache Tomcat team is proud to announce the immediate
+ availability of Tomcat Native 2.0.16.</p>
+ </subsection>
+
<subsection anchor="20260615" name="15 June 2026 - Tomcat-Native-2.0.15
released">
<p>The Apache Tomcat team is proud to announce the immediate
availability of Tomcat Native 2.0.15.</p>