This is an automated email from the ASF dual-hosted git repository.

remm pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 6b41f24e3c13d162eb27f2d84fdf72c9c60c288b
Author: remm <r...@apache.org>
AuthorDate: Mon Dec 11 15:19:29 2023 +0100

    Sync cleanups and fixes
---
 .../util/net/openssl/panama/OpenSSLContext.java    | 329 ++++++++++-----------
 .../util/net/openssl/panama/OpenSSLEngine.java     |  59 ++--
 .../util/net/openssl/panama/OpenSSLLibrary.java    |  13 +-
 .../net/openssl/panama/OpenSSLSessionContext.java  |   3 +-
 .../openssl/SSL_CTX_set_alpn_select_cb$cb.java     |  57 ++++
 .../SSL_CTX_set_cert_verify_callback$cb.java       |  54 ++++
 .../openssl/SSL_CTX_set_default_passwd_cb$cb.java  |  55 ++++
 .../openssl/SSL_CTX_set_tmp_dh_callback$dh.java    |  54 ++++
 .../util/openssl/SSL_CTX_set_verify$callback.java  |  54 ++++
 .../util/openssl/SSL_set_info_callback$cb.java     |  54 ++++
 .../util/openssl/SSL_set_verify$callback.java      |  54 ++++
 11 files changed, 560 insertions(+), 226 deletions(-)

diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLContext.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLContext.java
index 36292414c9..46c7a8ef39 100644
--- 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLContext.java
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLContext.java
@@ -21,15 +21,10 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.lang.foreign.Arena;
-import java.lang.foreign.FunctionDescriptor;
-import java.lang.foreign.Linker;
 import java.lang.foreign.MemorySegment;
 import java.lang.foreign.SegmentAllocator;
 import java.lang.foreign.SymbolLookup;
 import java.lang.foreign.ValueLayout;
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodType;
 import java.lang.ref.Cleaner;
 import java.lang.ref.Cleaner.Cleanable;
 import java.nio.charset.StandardCharsets;
@@ -70,6 +65,13 @@ import org.apache.tomcat.util.net.SSLHostConfigCertificate;
 import org.apache.tomcat.util.net.SSLHostConfigCertificate.Type;
 import org.apache.tomcat.util.net.openssl.OpenSSLConf;
 import org.apache.tomcat.util.net.openssl.OpenSSLConfCmd;
+import org.apache.tomcat.util.net.openssl.OpenSSLStatus;
+import org.apache.tomcat.util.net.openssl.OpenSSLUtil;
+import org.apache.tomcat.util.openssl.SSL_CTX_set_alpn_select_cb$cb;
+import org.apache.tomcat.util.openssl.SSL_CTX_set_cert_verify_callback$cb;
+import org.apache.tomcat.util.openssl.SSL_CTX_set_default_passwd_cb$cb;
+import org.apache.tomcat.util.openssl.SSL_CTX_set_tmp_dh_callback$dh;
+import org.apache.tomcat.util.openssl.SSL_CTX_set_verify$callback;
 import org.apache.tomcat.util.res.StringManager;
 
 public class OpenSSLContext implements org.apache.tomcat.util.net.SSLContext {
@@ -116,46 +118,6 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
         }
     }
 
-    private static final MethodHandle openSSLCallbackVerifyHandle;
-    private static final MethodHandle openSSLCallbackPasswordHandle;
-    private static final MethodHandle openSSLCallbackCertVerifyHandle;
-    private static final MethodHandle openSSLCallbackAlpnSelectProtoHandle;
-    private static final MethodHandle openSSLCallbackTmpDHHandle;
-
-    private static final FunctionDescriptor 
openSSLCallbackVerifyFunctionDescriptor =
-            FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.JAVA_INT, 
ValueLayout.ADDRESS);
-    private static final FunctionDescriptor 
openSSLCallbackPasswordFunctionDescriptor =
-            FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS, 
ValueLayout.JAVA_INT,
-            ValueLayout.JAVA_INT, ValueLayout.ADDRESS);
-    private static final FunctionDescriptor 
openSSLCallbackCertVerifyFunctionDescriptor =
-            FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS, 
ValueLayout.ADDRESS);
-    private static final FunctionDescriptor 
openSSLCallbackAlpnSelectProtoFunctionDescriptor =
-            FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS,
-            ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS,
-            ValueLayout.JAVA_INT, ValueLayout.ADDRESS);
-    private static final FunctionDescriptor 
openSSLCallbackTmpDHFunctionDescriptor =
-            FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS,
-            ValueLayout.JAVA_INT, ValueLayout.JAVA_INT);
-
-    static {
-        MethodHandles.Lookup lookup = MethodHandles.lookup();
-        try {
-            openSSLCallbackVerifyHandle = 
lookup.findStatic(OpenSSLContext.class, "openSSLCallbackVerify",
-                    MethodType.methodType(int.class, int.class, 
MemorySegment.class));
-            openSSLCallbackPasswordHandle = 
lookup.findStatic(OpenSSLContext.class, "openSSLCallbackPassword",
-                    MethodType.methodType(int.class, MemorySegment.class, 
int.class, int.class, MemorySegment.class));
-            openSSLCallbackCertVerifyHandle = 
lookup.findStatic(OpenSSLContext.class, "openSSLCallbackCertVerify",
-                    MethodType.methodType(int.class, MemorySegment.class, 
MemorySegment.class));
-            openSSLCallbackAlpnSelectProtoHandle = 
lookup.findStatic(OpenSSLContext.class, "openSSLCallbackAlpnSelectProto",
-                    MethodType.methodType(int.class, MemorySegment.class, 
MemorySegment.class,
-                            MemorySegment.class, MemorySegment.class, 
int.class, MemorySegment.class));
-            openSSLCallbackTmpDHHandle = 
lookup.findStatic(OpenSSLContext.class, "openSSLCallbackTmpDH",
-                    MethodType.methodType(MemorySegment.class, 
MemorySegment.class, int.class, int.class));
-        } catch (Exception e) {
-            throw new IllegalStateException(e);
-        }
-    }
-
     static final boolean OPENSSL_3 = (OpenSSL_version_num() >= 0x3000000fL);
 
     private final SSLHostConfig sslHostConfig;
@@ -326,18 +288,18 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
             // Probably not needed
 
             // Set int pem_password_cb(char *buf, int size, int rwflag, void 
*u) callback
-            openSSLCallbackPassword =
-                    
Linker.nativeLinker().upcallStub(openSSLCallbackPasswordHandle,
-                    openSSLCallbackPasswordFunctionDescriptor, contextArena);
+            openSSLCallbackPassword = 
SSL_CTX_set_default_passwd_cb$cb.allocate(new PasswordCallback(), contextArena);
             SSL_CTX_set_default_passwd_cb(sslCtx, openSSLCallbackPassword);
 
-            alpn = (negotiableProtocols != null && negotiableProtocols.size() 
> 0);
-            if (alpn) {
+            if (negotiableProtocols != null && negotiableProtocols.size() > 0) 
{
+                alpn = true;
                 negotiableProtocolsBytes = new 
ArrayList<>(negotiableProtocols.size() + 1);
                 for (String negotiableProtocol : negotiableProtocols) {
                     
negotiableProtocolsBytes.add(negotiableProtocol.getBytes(StandardCharsets.ISO_8859_1));
                 }
                 negotiableProtocolsBytes.add(HTTP_11_PROTOCOL);
+            } else {
+                alpn = false;
             }
 
             success = true;
@@ -477,7 +439,7 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
             try (var localArena = Arena.ofConfined()) {
                 // rc = SSLConf.apply(confCtx, name, value);
                 if (name.equals("NO_OCSP_CHECK")) {
-                    noOcspCheck = Boolean.valueOf(value);
+                    noOcspCheck = Boolean.parseBoolean(value);
                     rc = 1;
                 } else {
                     rc = SSL_CONF_cmd(state.confCtx, 
localArena.allocateFrom(name),
@@ -602,20 +564,16 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
             }
 
             // Set int verify_callback(int preverify_ok, X509_STORE_CTX 
*x509_ctx) callback
-            var openSSLCallbackVerify =
-                    
Linker.nativeLinker().upcallStub(openSSLCallbackVerifyHandle,
-                    openSSLCallbackVerifyFunctionDescriptor, contextArena);
             // Leave this just in case but in Tomcat this is always set again 
by the engine
-            SSL_CTX_set_verify(state.sslCtx, value, openSSLCallbackVerify);
+            SSL_CTX_set_verify(state.sslCtx, value,
+                    SSL_CTX_set_verify$callback.allocate(new VerifyCallback(), 
contextArena));
 
             // Trust and certificate verification
             if (tms != null) {
                 // Client certificate verification based on custom trust 
managers
                 state.x509TrustManager = chooseTrustManager(tms);
-                var openSSLCallbackCertVerify =
-                        
Linker.nativeLinker().upcallStub(openSSLCallbackCertVerifyHandle,
-                                openSSLCallbackCertVerifyFunctionDescriptor, 
contextArena);
-                SSL_CTX_set_cert_verify_callback(state.sslCtx, 
openSSLCallbackCertVerify, state.sslCtx);
+                SSL_CTX_set_cert_verify_callback(state.sslCtx,
+                        SSL_CTX_set_cert_verify_callback$cb.allocate(new 
CertVerifyCallback(), contextArena), state.sslCtx);
 
                 // Pass along the DER encoded certificates of the accepted 
client
                 // certificate issuers, so that their subjects can be presented
@@ -670,10 +628,8 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
             if (state.negotiableProtocols != null && 
state.negotiableProtocols.size() > 0) {
                 // int openSSLCallbackAlpnSelectProto(MemoryAddress ssl, 
MemoryAddress out, MemoryAddress outlen,
                 //        MemoryAddress in, int inlen, MemoryAddress arg
-                var openSSLCallbackAlpnSelectProto =
-                        
Linker.nativeLinker().upcallStub(openSSLCallbackAlpnSelectProtoHandle,
-                        openSSLCallbackAlpnSelectProtoFunctionDescriptor, 
contextArena);
-                SSL_CTX_set_alpn_select_cb(state.sslCtx, 
openSSLCallbackAlpnSelectProto, state.sslCtx);
+                SSL_CTX_set_alpn_select_cb(state.sslCtx,
+                        SSL_CTX_set_alpn_select_cb$cb.allocate(new 
ALPNSelectCallback(), contextArena), state.sslCtx);
             }
 
             // Apply OpenSSLConfCmd if used
@@ -735,7 +691,7 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
             // this is set so always set it in case an app is configured to
             // require it
             sessionContext.setSessionIdContext(DEFAULT_SESSION_ID_CONTEXT);
-            sslHostConfig.setOpenSslContext(state.sslCtx.address());
+            
sslHostConfig.setOpenSslContext(Long.valueOf(state.sslCtx.address()));
             initialized = true;
         } catch (Exception e) {
             log.warn(sm.getString("openssl.errorSSLCtxInit"), e);
@@ -752,116 +708,129 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
     }
 
     // DH *(*tmp_dh_callback)(SSL *ssl, int is_export, int keylength)
-    public static MemorySegment openSSLCallbackTmpDH(MemorySegment ssl, int 
isExport, int keylength) {
-        var pkey = SSL_get_privatekey(ssl);
-        int type = (MemorySegment.NULL.equals(pkey)) ? EVP_PKEY_NONE()
-                : (OPENSSL_3 ? EVP_PKEY_get_base_id(pkey) : 
EVP_PKEY_base_id(pkey));
-        /*
-         * OpenSSL will call us with either keylen == 512 or keylen == 1024
-         * (see the definition of SSL_EXPORT_PKEYLENGTH in ssl_locl.h).
-         * Adjust the DH parameter length according to the size of the
-         * RSA/DSA private key used for the current connection, and always
-         * use at least 1024-bit parameters.
-         * Note: This may cause interoperability issues with implementations
-         * which limit their DH support to 1024 bit - e.g. Java 7 and earlier.
-         * In this case, SSLCertificateFile can be used to specify fixed
-         * 1024-bit DH parameters (with the effect that OpenSSL skips this
-         * callback).
-         */
-        int keylen = 0;
-        if (type == EVP_PKEY_RSA() || type == EVP_PKEY_DSA()) {
-            keylen = (OPENSSL_3 ? EVP_PKEY_get_bits(pkey) : 
EVP_PKEY_bits(pkey));
-        }
-        for (int i = 0; i < OpenSSLLibrary.dhParameters.length; i++) {
-            if (keylen >= OpenSSLLibrary.dhParameters[i].min) {
-                return OpenSSLLibrary.dhParameters[i].dh;
+    private static class TmpDHCallback implements 
SSL_CTX_set_tmp_dh_callback$dh {
+        @Override
+        public MemorySegment apply(MemorySegment ssl, 
@SuppressWarnings("unused") int isExport,
+                @SuppressWarnings("unused") int keylength) {
+            var pkey = SSL_get_privatekey(ssl);
+            int type = (MemorySegment.NULL.equals(pkey)) ? EVP_PKEY_NONE() : 
EVP_PKEY_base_id(pkey);
+            /*
+             * OpenSSL will call us with either keylen == 512 or keylen == 1024
+             * (see the definition of SSL_EXPORT_PKEYLENGTH in ssl_locl.h).
+             * Adjust the DH parameter length according to the size of the
+             * RSA/DSA private key used for the current connection, and always
+             * use at least 1024-bit parameters.
+             * Note: This may cause interoperability issues with 
implementations
+             * which limit their DH support to 1024 bit - e.g. Java 7 and 
earlier.
+             * In this case, SSLCertificateFile can be used to specify fixed
+             * 1024-bit DH parameters (with the effect that OpenSSL skips this
+             * callback).
+             */
+            int keylen = 0;
+            if (type == EVP_PKEY_RSA() || type == EVP_PKEY_DSA()) {
+                keylen = EVP_PKEY_bits(pkey);
+            }
+            for (int i = 0; i < OpenSSLLibrary.dhParameters.length; i++) {
+                if (keylen >= OpenSSLLibrary.dhParameters[i].min) {
+                    return OpenSSLLibrary.dhParameters[i].dh;
+                }
             }
+            return MemorySegment.NULL;
         }
-        return MemorySegment.NULL;
     }
 
     // int SSL_callback_alpn_select_proto(SSL* ssl, const unsigned char **out, 
unsigned char *outlen,
     //        const unsigned char *in, unsigned int inlen, void *arg)
-    public static int openSSLCallbackAlpnSelectProto(MemorySegment ssl, 
MemorySegment out, MemorySegment outlen,
-            MemorySegment in, int inlen, MemorySegment arg) {
-        ContextState state = getState(arg);
-        if (state == null) {
-            log.warn(sm.getString("context.noSSL", 
Long.valueOf(arg.address())));
-            return SSL_TLSEXT_ERR_NOACK();
-        }
-        try (var localArena = Arena.ofConfined()) {
-            MemorySegment inSeg = in.reinterpret(inlen, localArena, null);
-            byte[] advertisedBytes = inSeg.toArray(ValueLayout.JAVA_BYTE);
-            for (byte[] negotiableProtocolBytes : state.negotiableProtocols) {
-                for (int i = 0; i <= advertisedBytes.length - 
negotiableProtocolBytes.length; i++) {
-                    if (advertisedBytes[i] == negotiableProtocolBytes[0]) {
-                        for (int j = 0; j < negotiableProtocolBytes.length; 
j++) {
-                            if (advertisedBytes[i + j] == 
negotiableProtocolBytes[j]) {
-                                if (j == negotiableProtocolBytes.length - 1) {
-                                    // Match
-                                    MemorySegment outSeg = 
out.reinterpret(ValueLayout.ADDRESS.byteSize(), localArena, null);
-                                    outSeg.set(ValueLayout.ADDRESS, 0, 
inSeg.asSlice(i));
-                                    MemorySegment outlenSeg = 
outlen.reinterpret(ValueLayout.JAVA_BYTE.byteSize(), localArena, null);
-                                    outlenSeg.set(ValueLayout.JAVA_BYTE, 0, 
(byte) negotiableProtocolBytes.length);
-                                    return SSL_TLSEXT_ERR_OK();
+    private static class ALPNSelectCallback implements 
SSL_CTX_set_alpn_select_cb$cb {
+        @Override
+        public int apply(@SuppressWarnings("unused") MemorySegment ssl, 
MemorySegment out,
+                MemorySegment outlen, MemorySegment in, int inlen, 
MemorySegment arg) {
+            ContextState state = getState(arg);
+            if (state == null) {
+                log.warn(sm.getString("context.noSSL", 
Long.valueOf(arg.address())));
+                return SSL_TLSEXT_ERR_NOACK();
+            }
+            try (var localArena = Arena.ofConfined()) {
+                MemorySegment inSeg = in.reinterpret(inlen, localArena, null);
+                byte[] advertisedBytes = inSeg.toArray(ValueLayout.JAVA_BYTE);
+                for (byte[] negotiableProtocolBytes : 
state.negotiableProtocols) {
+                    for (int i = 0; i <= advertisedBytes.length - 
negotiableProtocolBytes.length; i++) {
+                        if (advertisedBytes[i] == negotiableProtocolBytes[0]) {
+                            for (int j = 0; j < 
negotiableProtocolBytes.length; j++) {
+                                if (advertisedBytes[i + j] == 
negotiableProtocolBytes[j]) {
+                                    if (j == negotiableProtocolBytes.length - 
1) {
+                                        // Match
+                                        MemorySegment outSeg = 
out.reinterpret(ValueLayout.ADDRESS.byteSize(), localArena, null);
+                                        outSeg.set(ValueLayout.ADDRESS, 0, 
inSeg.asSlice(i));
+                                        MemorySegment outlenSeg = 
outlen.reinterpret(ValueLayout.JAVA_BYTE.byteSize(), localArena, null);
+                                        outlenSeg.set(ValueLayout.JAVA_BYTE, 
0, (byte) negotiableProtocolBytes.length);
+                                        return SSL_TLSEXT_ERR_OK();
+                                    }
+                                } else {
+                                    break;
                                 }
-                            } else {
-                                break;
                             }
                         }
                     }
                 }
             }
+            return SSL_TLSEXT_ERR_NOACK();
         }
-        return SSL_TLSEXT_ERR_NOACK();
     }
 
-    public static int openSSLCallbackVerify(int preverify_ok, MemorySegment 
/*X509_STORE_CTX*/ x509ctx) {
-        return OpenSSLEngine.openSSLCallbackVerify(preverify_ok, x509ctx);
+
+    private static class VerifyCallback implements SSL_CTX_set_verify$callback 
{
+        @Override
+        public int apply(int preverify_ok, MemorySegment /*X509_STORE_CTX*/ 
x509ctx) {
+            return OpenSSLEngine.openSSLCallbackVerify(preverify_ok, x509ctx);
+        }
     }
 
 
-    public static int openSSLCallbackCertVerify(MemorySegment 
/*X509_STORE_CTX*/ x509_ctx, MemorySegment param) {
-        if (log.isDebugEnabled()) {
-            log.debug("Certificate verification");
-        }
-        if (MemorySegment.NULL.equals(param)) {
-            return 0;
-        }
-        ContextState state = getState(param);
-        if (state == null) {
-            log.warn(sm.getString("context.noSSL", 
Long.valueOf(param.address())));
-            return 0;
-        }
-        MemorySegment ssl = X509_STORE_CTX_get_ex_data(x509_ctx, 
SSL_get_ex_data_X509_STORE_CTX_idx());
-        MemorySegment /*STACK_OF(X509)*/ sk = 
X509_STORE_CTX_get0_untrusted(x509_ctx);
-        int len = OPENSSL_sk_num(sk);
-        byte[][] certificateChain = new byte[len][];
-        try (var localArena = Arena.ofConfined()) {
-            for (int i = 0; i < len; i++) {
-                MemorySegment/*(X509*)*/ x509 = OPENSSL_sk_value(sk, i);
-                MemorySegment bufPointer = 
localArena.allocateFrom(ValueLayout.ADDRESS, MemorySegment.NULL);
-                int length = i2d_X509(x509, bufPointer);
-                if (length < 0) {
-                    certificateChain[i] = new byte[0];
-                    continue;
-                }
-                MemorySegment buf = bufPointer.get(ValueLayout.ADDRESS, 0);
-                certificateChain[i] = buf.reinterpret(length, localArena, 
null).toArray(ValueLayout.JAVA_BYTE);
-                CRYPTO_free(buf, MemorySegment.NULL, 0); // OPENSSL_free macro
+    private static class CertVerifyCallback implements 
SSL_CTX_set_cert_verify_callback$cb {
+        @Override
+        public int apply(MemorySegment /*X509_STORE_CTX*/ x509_ctx, 
MemorySegment param) {
+            if (log.isDebugEnabled()) {
+                log.debug("Certificate verification");
             }
-            MemorySegment cipher = SSL_get_current_cipher(ssl);
-            String authMethod = (MemorySegment.NULL.equals(cipher)) ? "UNKNOWN"
-                    : 
getCipherAuthenticationMethod(SSL_CIPHER_get_auth_nid(cipher), 
SSL_CIPHER_get_kx_nid(cipher));
-            X509Certificate[] peerCerts = certificates(certificateChain);
-            try {
-                state.x509TrustManager.checkClientTrusted(peerCerts, 
authMethod);
-                return 1;
-            } catch (Exception e) {
-                
log.debug(sm.getString("openssl.certificateVerificationFailed"), e);
+            if (MemorySegment.NULL.equals(param)) {
+                return 0;
+            }
+            ContextState state = getState(param);
+            if (state == null) {
+                log.warn(sm.getString("context.noSSL", 
Long.valueOf(param.address())));
+                return 0;
+            }
+            MemorySegment ssl = X509_STORE_CTX_get_ex_data(x509_ctx, 
SSL_get_ex_data_X509_STORE_CTX_idx());
+            MemorySegment /*STACK_OF(X509)*/ sk = 
X509_STORE_CTX_get0_untrusted(x509_ctx);
+            int len = OPENSSL_sk_num(sk);
+            byte[][] certificateChain = new byte[len][];
+            try (var localArena = Arena.ofConfined()) {
+                for (int i = 0; i < len; i++) {
+                    MemorySegment/*(X509*)*/ x509 = OPENSSL_sk_value(sk, i);
+                    MemorySegment bufPointer = 
localArena.allocateFrom(ValueLayout.ADDRESS, MemorySegment.NULL);
+                    int length = i2d_X509(x509, bufPointer);
+                    if (length < 0) {
+                        certificateChain[i] = new byte[0];
+                        continue;
+                    }
+                    MemorySegment buf = bufPointer.get(ValueLayout.ADDRESS, 0);
+                    certificateChain[i] = buf.reinterpret(length, localArena, 
null).toArray(ValueLayout.JAVA_BYTE);
+                    OPENSSL_free(buf);
+                }
+                MemorySegment cipher = SSL_get_current_cipher(ssl);
+                String authMethod = (MemorySegment.NULL.equals(cipher)) ? 
"UNKNOWN"
+                        : 
getCipherAuthenticationMethod(SSL_CIPHER_get_auth_nid(cipher), 
SSL_CIPHER_get_kx_nid(cipher));
+                X509Certificate[] peerCerts = certificates(certificateChain);
+                try {
+                    state.x509TrustManager.checkClientTrusted(peerCerts, 
authMethod);
+                    return 1;
+                } catch (Exception e) {
+                    
log.debug(sm.getString("openssl.certificateVerificationFailed"), e);
+                }
             }
+            return 0;
         }
-        return 0;
     }
 
     private static final int NID_kx_rsa = 1037/*NID_kx_rsa()*/;
@@ -949,28 +918,33 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
 
     private static ThreadLocal<String> callbackPasswordTheadLocal = new 
ThreadLocal<>();
 
-    public static int openSSLCallbackPassword(MemorySegment /*char **/ buf, 
int bufsiz, int verify, MemorySegment /*void **/ cb) {
-        if (log.isDebugEnabled()) {
-            log.debug("Return password for certificate");
-        }
-        String callbackPassword = callbackPasswordTheadLocal.get();
-        if (callbackPassword != null && callbackPassword.length() > 0) {
-            try (var localArena = Arena.ofConfined()) {
-                MemorySegment callbackPasswordNative = 
localArena.allocateFrom(callbackPassword);
-                if (callbackPasswordNative.byteSize() > bufsiz) {
-                    // The password is too long
-                    log.error(sm.getString("openssl.passwordTooLong"));
-                } else {
-                    MemorySegment bufSegment = buf.reinterpret(bufsiz, 
localArena, null);
-                    bufSegment.copyFrom(callbackPasswordNative);
-                    return (int) callbackPasswordNative.byteSize();
+    private static class PasswordCallback implements 
SSL_CTX_set_default_passwd_cb$cb {
+        @Override
+        public int apply(MemorySegment /*char **/ buf, int bufsiz,
+                @SuppressWarnings("unused") int verify, 
@SuppressWarnings("unused") MemorySegment /*void **/ cb) {
+            if (log.isDebugEnabled()) {
+                log.debug("Return password for certificate");
+            }
+            String callbackPassword = callbackPasswordTheadLocal.get();
+            if (callbackPassword != null && callbackPassword.length() > 0) {
+                try (var localArena = Arena.ofConfined()) {
+                    MemorySegment callbackPasswordNative = 
localArena.allocateFrom(callbackPassword);
+                    if (callbackPasswordNative.byteSize() > bufsiz) {
+                        // The password is too long
+                        log.error(sm.getString("openssl.passwordTooLong"));
+                    } else {
+                        MemorySegment bufSegment = buf.reinterpret(bufsiz, 
localArena, null);
+                        bufSegment.copyFrom(callbackPasswordNative);
+                        return (int) callbackPasswordNative.byteSize();
+                    }
                 }
             }
+            return 0;
         }
-        return 0;
     }
 
 
+    @SuppressWarnings("deprecation")
     private boolean addCertificate(SSLHostConfigCertificate certificate, Arena 
localArena) throws Exception {
         int index = getCertificateIndex(certificate);
         // Load Server key and certificate
@@ -1151,7 +1125,7 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
                             if (SSL_CTX_set0_tmp_dh_pkey(state.sslCtx, pkey) 
<= 0) {
                                 EVP_PKEY_free(pkey);
                             } else {
-                                
log.debug(sm.getString("openssl.setCustomDHParameters", numBits, 
certificate.getCertificateFile()));
+                                
log.debug(sm.getString("openssl.setCustomDHParameters", 
Integer.valueOf(numBits), certificate.getCertificateFile()));
                             }
                         } else {
                             SSL_CTX_ctrl(state.sslCtx, SSL_CTRL_SET_DH_AUTO(), 
1, MemorySegment.NULL);
@@ -1170,9 +1144,7 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
                         EC_GROUP_free(ecparams);
                     }
                     // Set callback for DH parameters
-                    var openSSLCallbackTmpDH = 
Linker.nativeLinker().upcallStub(openSSLCallbackTmpDHHandle,
-                            openSSLCallbackTmpDHFunctionDescriptor, 
contextArena);
-                    SSL_CTX_set_tmp_dh_callback(state.sslCtx, 
openSSLCallbackTmpDH);
+                    SSL_CTX_set_tmp_dh_callback(state.sslCtx, 
SSL_CTX_set_tmp_dh_callback$dh.allocate(new TmpDHCallback(), contextArena));
                 } else {
                     var d2i_ECPKParameters = 
SymbolLookup.loaderLookup().find("d2i_ECPKParameters").get();
                     var ecparams = PEM_ASN1_read_bio(d2i_ECPKParameters,
@@ -1184,7 +1156,8 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
                             curveNid = 0;
                         }
                         if (log.isDebugEnabled()) {
-                            log.debug(sm.getString("openssl.setECDHCurve", 
curveNid, certificate.getCertificateFile()));
+                            log.debug(sm.getString("openssl.setECDHCurve", 
Integer.valueOf(curveNid),
+                                    certificate.getCertificateFile()));
                         }
                         EC_GROUP_free(ecparams);
                     }
@@ -1302,9 +1275,8 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
                 }
                 if (!OPENSSL_3) {
                     // Set callback for DH parameters
-                    var openSSLCallbackTmpDH = 
Linker.nativeLinker().upcallStub(openSSLCallbackTmpDHHandle,
-                            openSSLCallbackTmpDHFunctionDescriptor, 
contextArena);
-                    SSL_CTX_set_tmp_dh_callback(state.sslCtx, 
openSSLCallbackTmpDH);
+                    SSL_CTX_set_tmp_dh_callback(state.sslCtx,
+                            SSL_CTX_set_tmp_dh_callback$dh.allocate(new 
TmpDHCallback(), contextArena));
                 } else {
                     BIO_reset(keyBIO);
                     var pkey = PEM_read_bio_Parameters(keyBIO, 
MemorySegment.NULL);
@@ -1313,7 +1285,8 @@ public class OpenSSLContext implements 
org.apache.tomcat.util.net.SSLContext {
                         if (SSL_CTX_set0_tmp_dh_pkey(state.sslCtx, pkey) <= 0) 
{
                             EVP_PKEY_free(pkey);
                         } else {
-                            
log.debug(sm.getString("openssl.setCustomDHParameters", numBits, 
certificate.getCertificateFile()));
+                            
log.debug(sm.getString("openssl.setCustomDHParameters", 
Integer.valueOf(numBits),
+                                    certificate.getCertificateFile()));
                         }
                     } else {
                         SSL_CTX_ctrl(state.sslCtx, SSL_CTRL_SET_DH_AUTO(), 1, 
MemorySegment.NULL);
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
index bd23503956..9bbd9881e9 100644
--- 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
@@ -19,13 +19,8 @@ package org.apache.tomcat.util.net.openssl.panama;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.lang.foreign.Arena;
-import java.lang.foreign.FunctionDescriptor;
-import java.lang.foreign.Linker;
 import java.lang.foreign.MemorySegment;
 import java.lang.foreign.ValueLayout;
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodType;
 import java.lang.ref.Cleaner;
 import java.lang.ref.Cleaner.Cleanable;
 import java.net.HttpURLConnection;
@@ -67,6 +62,8 @@ import org.apache.tomcat.util.buf.Asn1Parser;
 import org.apache.tomcat.util.net.Constants;
 import org.apache.tomcat.util.net.SSLUtil;
 import 
org.apache.tomcat.util.net.openssl.ciphers.OpenSSLCipherConfigurationParser;
+import org.apache.tomcat.util.openssl.SSL_set_info_callback$cb;
+import org.apache.tomcat.util.openssl.SSL_set_verify$callback;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -85,29 +82,10 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
 
     public static final Set<String> IMPLEMENTED_PROTOCOLS_SET;
 
-    private static final MethodHandle openSSLCallbackInfoHandle;
-    private static final MethodHandle openSSLCallbackVerifyHandle;
-
-    private static final FunctionDescriptor 
openSSLCallbackInfoFunctionDescriptor =
-            FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, 
ValueLayout.JAVA_INT, ValueLayout.JAVA_INT);
-    private static final FunctionDescriptor 
openSSLCallbackVerifyFunctionDescriptor =
-            FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.JAVA_INT, 
ValueLayout.ADDRESS);
-
     static {
-        MethodHandles.Lookup lookup = MethodHandles.lookup();
-        try {
-            openSSLCallbackInfoHandle = lookup.findStatic(OpenSSLEngine.class, 
"openSSLCallbackInfo",
-                    MethodType.methodType(void.class, MemorySegment.class, 
int.class, int.class));
-            openSSLCallbackVerifyHandle = 
lookup.findStatic(OpenSSLEngine.class, "openSSLCallbackVerify",
-                    MethodType.methodType(int.class, int.class, 
MemorySegment.class));
-        } catch (Exception e) {
-            throw new IllegalStateException(e);
-        }
-
         final Set<String> availableCipherSuites = new LinkedHashSet<>(128);
         availableCipherSuites.addAll(OpenSSLLibrary.findCiphers("ALL"));
         AVAILABLE_CIPHER_SUITES = 
Collections.unmodifiableSet(availableCipherSuites);
-
         HashSet<String> protocols = new HashSet<>();
         protocols.add(Constants.SSL_PROTO_SSLv2Hello);
         protocols.add(Constants.SSL_PROTO_SSLv2);
@@ -212,9 +190,7 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
         session = new OpenSSLSession();
         var ssl = SSL_new(sslCtx);
         // Set ssl_info_callback
-        var openSSLCallbackInfo = 
Linker.nativeLinker().upcallStub(openSSLCallbackInfoHandle,
-                openSSLCallbackInfoFunctionDescriptor, engineArena);
-        SSL_set_info_callback(ssl, openSSLCallbackInfo);
+        SSL_set_info_callback(ssl, SSL_set_info_callback$cb.allocate(new 
InfoCallback(), engineArena));
         if (clientMode) {
             SSL_set_connect_state(ssl);
         } else {
@@ -1159,27 +1135,34 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
             };
             // SSL.setVerify(state.ssl, value, certificateVerificationDepth);
             // Set int verify_callback(int preverify_ok, X509_STORE_CTX 
*x509_ctx) callback
-            var openSSLCallbackVerify =
-                    
Linker.nativeLinker().upcallStub(openSSLCallbackVerifyHandle,
-                    openSSLCallbackVerifyFunctionDescriptor, engineArena);
             int value = switch (mode) {
                 case NONE -> SSL_VERIFY_NONE();
                 case REQUIRE -> SSL_VERIFY_PEER() | 
SSL_VERIFY_FAIL_IF_NO_PEER_CERT();
                 case OPTIONAL -> SSL_VERIFY_PEER();
             };
-            SSL_set_verify(state.ssl, value, openSSLCallbackVerify);
+            SSL_set_verify(state.ssl, value, 
SSL_set_verify$callback.allocate(new VerifyCallback(), engineArena));
             clientAuth = mode;
         }
     }
 
-    public static void openSSLCallbackInfo(MemorySegment ssl, int where, int 
ret) {
-        EngineState state = getState(ssl);
-        if (state == null) {
-            log.warn(sm.getString("engine.noSSL", 
Long.valueOf(ssl.address())));
-            return;
+    private static class InfoCallback implements SSL_set_info_callback$cb {
+        @Override
+        public void apply(MemorySegment ssl, int where, 
@SuppressWarnings("unused") int ret) {
+            EngineState state = getState(ssl);
+            if (state == null) {
+                log.warn(sm.getString("engine.noSSL", 
Long.valueOf(ssl.address())));
+                return;
+            }
+            if (0 != (where & SSL_CB_HANDSHAKE_DONE())) {
+                state.handshakeCount++;
+            }
         }
-        if (0 != (where & SSL_CB_HANDSHAKE_DONE())) {
-            state.handshakeCount++;
+    }
+
+    private static class VerifyCallback implements SSL_set_verify$callback {
+        @Override
+        public int apply(int preverify_ok, MemorySegment /*X509_STORE_CTX*/ 
x509ctx) {
+            return openSSLCallbackVerify(preverify_ok, x509ctx);
         }
     }
 
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLLibrary.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLLibrary.java
index 5759abc01b..45e3178fc7 100644
--- 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLLibrary.java
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLLibrary.java
@@ -28,6 +28,7 @@ import static org.apache.tomcat.util.openssl.openssl_h.*;
 import static org.apache.tomcat.util.openssl.openssl_h_Compatibility.*;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.net.openssl.OpenSSLStatus;
 import 
org.apache.tomcat.util.net.openssl.ciphers.OpenSSLCipherConfigurationParser;
 import org.apache.tomcat.util.res.StringManager;
 
@@ -73,10 +74,6 @@ public class OpenSSLLibrary {
 
     protected static final Object lock = new Object();
 
-    public OpenSSLLibrary() {
-        OpenSSLStatus.setInstanceCreated(true);
-    }
-
     static MemorySegment enginePointer = MemorySegment.NULL;
 
     static void initLibrary() {
@@ -98,7 +95,6 @@ public class OpenSSLLibrary {
     { BN_get_rfc3526_prime_2048, NULL, 1025 },
     { BN_get_rfc2409_prime_1024, NULL, 0 }
      */
-    @Deprecated
     static final class DHParam {
         final MemorySegment dh;
         final int min;
@@ -109,7 +105,6 @@ public class OpenSSLLibrary {
     }
     static final DHParam[] dhParameters = new DHParam[6];
 
-    @Deprecated
     private static void initDHParameters() {
         var dh = DH_new();
         var p = BN_get_rfc3526_prime_8192(MemorySegment.NULL);
@@ -149,7 +144,6 @@ public class OpenSSLLibrary {
         dhParameters[5] = new DHParam(dh, 0);
     }
 
-    @Deprecated
     private static void freeDHParameters() {
         for (int i = 0; i < dhParameters.length; i++) {
             if (dhParameters[i] != null) {
@@ -162,7 +156,7 @@ public class OpenSSLLibrary {
         }
     }
 
-    static void init() {
+    public static void init() {
         synchronized (lock) {
 
             if (OpenSSLStatus.isInitialized()) {
@@ -330,7 +324,8 @@ public class OpenSSLLibrary {
         }
     }
 
-    static void destroy() {
+
+    public static void destroy() {
         synchronized (lock) {
             if (!OpenSSLStatus.isInitialized()) {
                 return;
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLSessionContext.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLSessionContext.java
index b14eb60d44..82ece562b0 100644
--- 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLSessionContext.java
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLSessionContext.java
@@ -65,7 +65,8 @@ public class OpenSSLSessionContext implements 
SSLSessionContext {
             throw new 
IllegalArgumentException(sm.getString("sessionContext.nullTicketKeys"));
         }
         if (keys.length != TICKET_KEYS_SIZE) {
-            throw new 
IllegalArgumentException(sm.getString("sessionContext.invalidTicketKeysLength", 
keys.length));
+            throw new 
IllegalArgumentException(sm.getString("sessionContext.invalidTicketKeysLength",
+                    Integer.valueOf(keys.length)));
         }
         try (var memorySession = Arena.ofConfined()) {
             var array = memorySession.allocateFrom(ValueLayout.JAVA_BYTE, 
keys);
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_alpn_select_cb$cb.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_alpn_select_cb$cb.java
new file mode 100644
index 0000000000..1ace09bee7
--- /dev/null
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_alpn_select_cb$cb.java
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+// Generated by jextract
+
+package org.apache.tomcat.util.openssl;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.foreign.*;
+import static java.lang.foreign.ValueLayout.*;
+
+/**
+ * {@snippet lang = c
+ * : * int (*SSL_CTX_set_alpn_select_cb$cb)(struct ssl_st*,unsigned 
char**,unsigned char*,unsigned char*,unsigned int,void*);
+ * }
+ */
+public interface SSL_CTX_set_alpn_select_cb$cb {
+
+    FunctionDescriptor $DESC = FunctionDescriptor.of(JAVA_INT, 
openssl_h.C_POINTER, openssl_h.C_POINTER,
+            openssl_h.C_POINTER, openssl_h.C_POINTER, JAVA_INT, 
openssl_h.C_POINTER);
+
+    int apply(MemorySegment _x0, MemorySegment _x1, MemorySegment _x2, 
MemorySegment _x3, int _x4, MemorySegment _x5);
+
+    MethodHandle UP$MH = 
openssl_h.upcallHandle(SSL_CTX_set_alpn_select_cb$cb.class, "apply", $DESC);
+
+    static MemorySegment allocate(SSL_CTX_set_alpn_select_cb$cb fi, Arena 
scope) {
+        return Linker.nativeLinker().upcallStub(UP$MH.bindTo(fi), $DESC, 
scope);
+    }
+
+    MethodHandle DOWN$MH = Linker.nativeLinker().downcallHandle($DESC);
+
+    static SSL_CTX_set_alpn_select_cb$cb ofAddress(MemorySegment addr, Arena 
arena) {
+        MemorySegment symbol = addr.reinterpret(arena, null);
+        return (MemorySegment __x0, MemorySegment __x1, MemorySegment __x2, 
MemorySegment __x3, int __x4,
+                MemorySegment __x5) -> {
+            try {
+                return (int) DOWN$MH.invokeExact(symbol, __x0, __x1, __x2, 
__x3, __x4, __x5);
+            } catch (Throwable ex$) {
+                throw new AssertionError("should not reach here", ex$);
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_cert_verify_callback$cb.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_cert_verify_callback$cb.java
new file mode 100644
index 0000000000..40f20e3c34
--- /dev/null
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_cert_verify_callback$cb.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+// Generated by jextract
+
+package org.apache.tomcat.util.openssl;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.foreign.*;
+import static java.lang.foreign.ValueLayout.*;
+
+/**
+ * {@snippet lang = c : * int (*SSL_CTX_set_cert_verify_callback$cb)(struct 
x509_store_ctx_st*,void*);
+ * }
+ */
+public interface SSL_CTX_set_cert_verify_callback$cb {
+
+    FunctionDescriptor $DESC = FunctionDescriptor.of(JAVA_INT, 
openssl_h.C_POINTER, openssl_h.C_POINTER);
+
+    int apply(MemorySegment _x0, MemorySegment _x1);
+
+    MethodHandle UP$MH = 
openssl_h.upcallHandle(SSL_CTX_set_cert_verify_callback$cb.class, "apply", 
$DESC);
+
+    static MemorySegment allocate(SSL_CTX_set_cert_verify_callback$cb fi, 
Arena scope) {
+        return Linker.nativeLinker().upcallStub(UP$MH.bindTo(fi), $DESC, 
scope);
+    }
+
+    MethodHandle DOWN$MH = Linker.nativeLinker().downcallHandle($DESC);
+
+    static SSL_CTX_set_cert_verify_callback$cb ofAddress(MemorySegment addr, 
Arena arena) {
+        MemorySegment symbol = addr.reinterpret(arena, null);
+        return (MemorySegment __x0, MemorySegment __x1) -> {
+            try {
+                return (int) DOWN$MH.invokeExact(symbol, __x0, __x1);
+            } catch (Throwable ex$) {
+                throw new AssertionError("should not reach here", ex$);
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_default_passwd_cb$cb.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_default_passwd_cb$cb.java
new file mode 100644
index 0000000000..2d12398c98
--- /dev/null
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_default_passwd_cb$cb.java
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+
+// Generated by jextract
+
+package org.apache.tomcat.util.openssl;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.foreign.*;
+import static java.lang.foreign.ValueLayout.*;
+
+/**
+ * {@snippet lang = c : * int 
(*SSL_CTX_set_default_passwd_cb$cb)(char*,int,int,void*);
+ * }
+ */
+public interface SSL_CTX_set_default_passwd_cb$cb {
+
+    FunctionDescriptor $DESC = FunctionDescriptor.of(JAVA_INT, 
openssl_h.C_POINTER, JAVA_INT, JAVA_INT,
+            openssl_h.C_POINTER);
+
+    int apply(MemorySegment _x0, int _x1, int _x2, MemorySegment _x3);
+
+    MethodHandle UP$MH = 
openssl_h.upcallHandle(SSL_CTX_set_default_passwd_cb$cb.class, "apply", $DESC);
+
+    static MemorySegment allocate(SSL_CTX_set_default_passwd_cb$cb fi, Arena 
scope) {
+        return Linker.nativeLinker().upcallStub(UP$MH.bindTo(fi), $DESC, 
scope);
+    }
+
+    MethodHandle DOWN$MH = Linker.nativeLinker().downcallHandle($DESC);
+
+    static SSL_CTX_set_default_passwd_cb$cb ofAddress(MemorySegment addr, 
Arena arena) {
+        MemorySegment symbol = addr.reinterpret(arena, null);
+        return (MemorySegment __x0, int __x1, int __x2, MemorySegment __x3) -> 
{
+            try {
+                return (int) DOWN$MH.invokeExact(symbol, __x0, __x1, __x2, 
__x3);
+            } catch (Throwable ex$) {
+                throw new AssertionError("should not reach here", ex$);
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_tmp_dh_callback$dh.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_tmp_dh_callback$dh.java
new file mode 100644
index 0000000000..3062227589
--- /dev/null
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_tmp_dh_callback$dh.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+// Generated by jextract
+
+package org.apache.tomcat.util.openssl;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.foreign.*;
+import static java.lang.foreign.ValueLayout.*;
+
+/**
+ * {@snippet lang = c : * struct dh_st* 
(*SSL_CTX_set_tmp_dh_callback$dh)(struct ssl_st*,int,int);
+ * }
+ */
+public interface SSL_CTX_set_tmp_dh_callback$dh {
+
+    FunctionDescriptor $DESC = FunctionDescriptor.of(openssl_h.C_POINTER, 
openssl_h.C_POINTER, JAVA_INT, JAVA_INT);
+
+    MemorySegment apply(MemorySegment _x0, int _x1, int _x2);
+
+    MethodHandle UP$MH = 
openssl_h.upcallHandle(SSL_CTX_set_tmp_dh_callback$dh.class, "apply", $DESC);
+
+    static MemorySegment allocate(SSL_CTX_set_tmp_dh_callback$dh fi, Arena 
scope) {
+        return Linker.nativeLinker().upcallStub(UP$MH.bindTo(fi), $DESC, 
scope);
+    }
+
+    MethodHandle DOWN$MH = Linker.nativeLinker().downcallHandle($DESC);
+
+    static SSL_CTX_set_tmp_dh_callback$dh ofAddress(MemorySegment addr, Arena 
arena) {
+        MemorySegment symbol = addr.reinterpret(arena, null);
+        return (MemorySegment __x0, int __x1, int __x2) -> {
+            try {
+                return (MemorySegment) DOWN$MH.invokeExact(symbol, __x0, __x1, 
__x2);
+            } catch (Throwable ex$) {
+                throw new AssertionError("should not reach here", ex$);
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_verify$callback.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_verify$callback.java
new file mode 100644
index 0000000000..cffcc12233
--- /dev/null
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_CTX_set_verify$callback.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+// Generated by jextract
+
+package org.apache.tomcat.util.openssl;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.foreign.*;
+import static java.lang.foreign.ValueLayout.*;
+
+/**
+ * {@snippet lang = c : * int (*SSL_CTX_set_verify$callback)(int,struct 
x509_store_ctx_st*);
+ * }
+ */
+public interface SSL_CTX_set_verify$callback {
+
+    FunctionDescriptor $DESC = FunctionDescriptor.of(JAVA_INT, JAVA_INT, 
openssl_h.C_POINTER);
+
+    int apply(int _x0, MemorySegment _x1);
+
+    MethodHandle UP$MH = 
openssl_h.upcallHandle(SSL_CTX_set_verify$callback.class, "apply", $DESC);
+
+    static MemorySegment allocate(SSL_CTX_set_verify$callback fi, Arena scope) 
{
+        return Linker.nativeLinker().upcallStub(UP$MH.bindTo(fi), $DESC, 
scope);
+    }
+
+    MethodHandle DOWN$MH = Linker.nativeLinker().downcallHandle($DESC);
+
+    static SSL_CTX_set_verify$callback ofAddress(MemorySegment addr, Arena 
arena) {
+        MemorySegment symbol = addr.reinterpret(arena, null);
+        return (int __x0, MemorySegment __x1) -> {
+            try {
+                return (int) DOWN$MH.invokeExact(symbol, __x0, __x1);
+            } catch (Throwable ex$) {
+                throw new AssertionError("should not reach here", ex$);
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_set_info_callback$cb.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_set_info_callback$cb.java
new file mode 100644
index 0000000000..d746b82e5c
--- /dev/null
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_set_info_callback$cb.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+// Generated by jextract
+
+package org.apache.tomcat.util.openssl;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.foreign.*;
+import static java.lang.foreign.ValueLayout.*;
+
+/**
+ * {@snippet lang = c : * void (*SSL_set_info_callback$cb)(struct 
ssl_st*,int,int);
+ * }
+ */
+public interface SSL_set_info_callback$cb {
+
+    FunctionDescriptor $DESC = FunctionDescriptor.ofVoid(openssl_h.C_POINTER, 
JAVA_INT, JAVA_INT);
+
+    void apply(MemorySegment _x0, int _x1, int _x2);
+
+    MethodHandle UP$MH = 
openssl_h.upcallHandle(SSL_set_info_callback$cb.class, "apply", $DESC);
+
+    static MemorySegment allocate(SSL_set_info_callback$cb fi, Arena scope) {
+        return Linker.nativeLinker().upcallStub(UP$MH.bindTo(fi), $DESC, 
scope);
+    }
+
+    MethodHandle DOWN$MH = Linker.nativeLinker().downcallHandle($DESC);
+
+    static SSL_set_info_callback$cb ofAddress(MemorySegment addr, Arena arena) 
{
+        MemorySegment symbol = addr.reinterpret(arena, null);
+        return (MemorySegment __x0, int __x1, int __x2) -> {
+            try {
+                DOWN$MH.invokeExact(symbol, __x0, __x1, __x2);
+            } catch (Throwable ex$) {
+                throw new AssertionError("should not reach here", ex$);
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_set_verify$callback.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_set_verify$callback.java
new file mode 100644
index 0000000000..a5bd44c14a
--- /dev/null
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/openssl/SSL_set_verify$callback.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+// Generated by jextract
+
+package org.apache.tomcat.util.openssl;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.foreign.*;
+import static java.lang.foreign.ValueLayout.*;
+
+/**
+ * {@snippet lang = c : * int (*SSL_set_verify$callback)(int,struct 
x509_store_ctx_st*);
+ * }
+ */
+public interface SSL_set_verify$callback {
+
+    FunctionDescriptor $DESC = FunctionDescriptor.of(JAVA_INT, JAVA_INT, 
openssl_h.C_POINTER);
+
+    int apply(int _x0, MemorySegment _x1);
+
+    MethodHandle UP$MH = openssl_h.upcallHandle(SSL_set_verify$callback.class, 
"apply", $DESC);
+
+    static MemorySegment allocate(SSL_set_verify$callback fi, Arena scope) {
+        return Linker.nativeLinker().upcallStub(UP$MH.bindTo(fi), $DESC, 
scope);
+    }
+
+    MethodHandle DOWN$MH = Linker.nativeLinker().downcallHandle($DESC);
+
+    static SSL_set_verify$callback ofAddress(MemorySegment addr, Arena arena) {
+        MemorySegment symbol = addr.reinterpret(arena, null);
+        return (int __x0, MemorySegment __x1) -> {
+            try {
+                return (int) DOWN$MH.invokeExact(symbol, __x0, __x1);
+            } catch (Throwable ex$) {
+                throw new AssertionError("should not reach here", ex$);
+            }
+        };
+    }
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to