### wolfSSL JNI Release 1.18.0 (08/10/2026) Release 1.18.0 of wolfSSL JNI and JSSE changes the open source license from GPLv2 to GPLv3 to match native wolfSSL, and has bug fixes and new features including: **New JSSE Functionality:** * Add ML-KEM (FIPS 203) TLS 1.3 named groups, including IETF hybrids and CNSA 2.0 `SECP384R1MLKEM1024` (PR 361) * Add experimental OQS-assigned ML-KEM hybrid named groups (PR 361) * Add ML-DSA (FIPS 204) X.509 certificate support (PR 361) * Add `SSLParameters.setNamedGroups()` support on JDK 20+ for restricting TLS named groups (PR 361) * Pre-generate the TLS 1.3 client key share for the first configured group, avoiding a HelloRetryRequest (PR 361) * Return the full peer certificate chain from `SSLSession.getPeerCertificates()` (PR 390) **New JNI Functionality:** * Add `WolfSSLSession.getPeerCertificateChainDER()` and `getPeerCertificateDER()` (PR 390) * Add `WolfSSL.sessionCertsEnabled()` to detect native `SESSION_CERTS` support (PR 390) * Add `WolfSSLCertRequest.addAltName()` for non-hostname SAN types in CSRs (PR 373) * Add `WolfSSLX509Name` constructors taking a DN `String` or `X500Principal` (PR 366) * Add `WolfSSL.isECCNamedGroup()` for checking if a named group is an ECC curve (PR 376) **New Property Support:** * Add `jdk.tls.namedGroups` System property support for restricting TLS named groups (PR 361) * Add `wolfjsse.enabledSupportedCurves` Security property for named groups on JDK 8+ (PR 361) **JNI and JSSE Changes:** * Fix `SSLEngine` hang and silently discarded application data on `unwrap()` after `closeOutbound()` (PR 379) * Fix `SSLEngine.unwrap()` copy bounds and reported byte count when a destination offset was used (PR 365) * Fix `SSLEngine` `wrap()`/`unwrap()` ByteBuffer array bounds checks when offset was non-zero (PR 360) * Fix `SSLEngine` reads and writes on sliced ByteBuffers by honoring `arrayOffset()` (PR 360) * Fix `SSLEngine.closeOutbound()` leaving inbound open when called before the handshake (PR 360) * Fix stale data being resent from the `SSLEngine` internal send buffer on partial drain (PR 359) * Fix `SSLSocket` stream `read()`/`write()` dispatching native I/O during an in-progress handshake (PR 389) * Fix `SSLSocket.close()` during a concurrent `read()`/`write()` freeing the session too early (PR 383) * Fix `SSLSocket.startHandshake()` after `close()` seeing an inconsistent closed state (PR 389) * Fix `SSLSocket.close()` not interrupting a blocked write under `WOLFJNI_USE_IO_SELECT` (PR 386) * Fix hostname verification and SNI when connecting via `connect(InetSocketAddress)` (PR 374) * Fix client session cache collisions between hosts by keying the cache on host and port (PR 382) * Fix duplicate `SSLSession` IDs for TLS 1.3 and session tickets, now from `SecureRandom` (PR 383) * Fix IP address peer verification to match `iPAddress` SAN entries only, per RFC 6125 (PR 382) * Fix `wantClientAuth(true)` accepting a presented client certificate that failed validation (PR 381) * Fix peer certificate chain ordering in `WolfSSLTrustX509` so the leaf stays at index 0 (PR 380) * Fix `NullPointerException` from `SSLSession.getValue()` when passed a null name (PR 371) * Fix double free of the PK callback context when a context was set more than once (PR 377) * Fix verify callbacks firing across contexts, now routed per `WolfSSLContext` (PR 369) * Fix crash from verify and CRL callback references freed by a concurrent `setVerify()` (PR 369, 382) * Fix `setCRLCb(null)` leaving the native missing-CRL callback registered (PR 369) * Fix TLS 1.2 handshake failure with RSA and ECC keys when named groups exclude ECC curves (PR 376) * Fix `NOT_COMPILED_IN` errors from the min key size setters against `NO_DH` builds (PR 385) * Fix crash in `WolfSSLCertRequest.setSubjectName()` when the name was freed concurrently (PR 389) * Fix out of bounds read in the `WolfSSLSession` certificate and private key buffer loaders (PR 388) * Fix races on the global logging and FIPS error callbacks when set from multiple threads (PR 388) * Fix `getPeerCertificateChain()` returning null instead of `SSLPeerUnverifiedException` (PR 363) * Fix `SSLSession` value bindings for concurrent access and reject null in `putValue()` (PR 363) * Fix `getRequestedServerNames()` and `getSNIServerNames()` returning mutable internal lists (PR 359, 363) * Fix missing shutdown alert when the handshake is rejected with session creation disabled (PR 363) * Fix `SSLSocket` memory leak of the ALPN peer protocol buffer on allocation failure (PR 382) * Fix `SNIServerName.equals()`/`hashCode()` comparing by identity instead of encoded value (PR 359) * Fix RSA verify PK callback returning an undefined result when the Java callback throws (PR 381) * Fix I/O callbacks reporting a graceful close instead of an error on internal failure (PR 365) * Fix null dereferences in native `useSNI()` and other JNI byte array and string releases (PR 359) * Zero plaintext application data buffers after send and on `SSLEngine` cleanup (PR 363) * Zero private key bytes on release in X509, CSR, and CRL signing operations (PR 365) **Debugging Changes:** * Replace `printStackTrace()` with debug logging in `beginHandshake()` and `getId()` (PR 363) * Skip the "loaded trusted root cert" debug log when CA loading failed (PR 363) * Log KeyManager and TrustManager class names instead of caller-supplied `toString()` output (PR 363) **Example Changes:** * Add ML-DSA certificates, keystores, and a generation script for post-quantum examples (PR 361) * Add PQC options to the `Client`/`Server` and `ClientJSSE`/`ServerJSSE` examples (PR 361) * Verify the peer hostname for non-loopback hosts in the `Client` example (PR 389) * Enable hostname verification in the `ClientSSLSocket` example (PR 388) * Enable client authentication in the `MultiThreadedSSLServer` example (PR 388) * Add IP and email SANs to the `X509CertRequest` example (PR 373) * Update Android `CMakeLists.txt` to exclude newly split wolfSSL source files (PR 361, 373, 378, 387) **Testing Changes:** * GitHub workflow performance and stability improvements (PR 386) * Replace JUnit passed/failed/skipped output with per-method timing via `TimedTestWatcher` (PR 358) * Split umbrella JUnit tests into per-unit tests and report skips with `Assume` (PR 358) * Add PQC key exchange, authentication, and named group JUnit tests (PR 361) The wolfSSL JNI/JSSE Manual is available at: https://www.wolfssl.com/documentation/manuals/wolfssljni/. For build instructions and more details, please check the manual. ### wolfSSL JNI Release 1.17.0 (04/20/2026) Release 1.17.0 has bug fixes and new features including: **New JSSE Functionality:** * Add JSSE-level Pre-Shared Key (PSK) support via `WolfSSLParameters` for `SSLSocket`/`SSLEngine` (PR 340) * Add Java 9+ module support (JPMS) with conditional `module-info.java` compilation for `jlink` compatibility (PR 324) * Add `CertPathTrustManagerParameters` and `KeyStoreBuilderParameters` support in `WolfSSLTrustManager` (PR 310) **New JNI Functionality:** * Add `WolfSSL.getSNIFromBuffer()` wrapping `wolfSSL_SNI_GetFromBuffer()` for SNI extraction from raw ClientHello (PR 339) * Add RSA-PSS sign/verify and RSA sign check PK callback support (PR 338) * Add `pathLen` parameter to `WolfSSLCertificate/WolfSSLCertRequest.addExtension()` for Basic Constraints (PR 341) * Add CRL generation wrappers in `WolfSSLCRL` (PR 315) * Add CRL decode wrappers in `WolfSSLCRL` for parsing and inspecting existing CRL data (PR 333) * Add SKID, AKID, CRL Dist Points, and Netscape Cert Type extension support in `WolfSSLCertificate` (PR 317) * Add X.509 Name Constraints extension support with `WolfSSLNameConstraints`/`WolfSSLGeneralName` (PR 316) * Add extended AIA interface to retrieve OCSP and CA Issuer URLs separately from certs (PR 323) * Add `WolfSSLAltName` class for extended SAN parsing including `otherName` (MS AD UPN), `iPAddress`, and `directoryName` GeneralName types (PR 313) **New Property Support:** * Add `wolfjsse.skipFIPSCAST` Security property to skip automatic FIPS CAST execution during wolfJSSE init (PR 342) * Add `wolfssl.skipLibraryLoad` System property to skip automatic `System.loadLibrary()` calls (PR 325) **JNI and JSSE Changes:** * Limit `SSLSocket` write chunk size to 16384 (2^14) bytes (PR 308) * Fix `SSLEngine` `BUFFER_UNDERFLOW` handling for partial TLS records where only header was available (PR 334) * Fix `SSLEngine` `BUFFER_OVERFLOW` handling to stash decrypted application data and retry instead of losing data (PR 334) * Fix `SSLEngine` close/shutdown state transitions and `close_notify` handshake status reporting (PR 334, 354) * Fix `SSLSocket.close()` throwing duplicate exception when the initial connection had already failed (PR 330, 354) * Fix `SSLEngine.unwrap()` incorrectly returning `BUFFER_UNDERFLOW` when all bytes were consumed but more ciphertext needed (PR 351) * Throw `SSLHandshakeException` instead of `SSLException` on handshake errors for Spring Boot compatibility (PR 310) * Throw `SSLPeerUnverifiedException` from `getPeerCertificates()` on server side when no client auth requested (PR 310) * Improve `SSLEngine` SNI handling: prefer configured SNI for hostname verification, enforce server-side `SNIMatcher` after handshake, enable auto-SNI for `SSLEngine(host, port)`, fix stale SNI cache on session resumption (PR 334, 349) * Support `SSLEngine(host, -1)` unknown-port hints for Netty compatibility (PR 334) * Fix session timeout boundary behavior and filter invalid/expired sessions from `SSLSessionContext` enumeration (PR 334) * Return `X500Principal` from `getPeerPrincipal()` and `getLocalPrincipal()` for proper Java X.509 principal compatibility (PR 334) * Add `equals()` and `hashCode()` to `WolfSSLX509` for comparison compatibility with frameworks that check cert equality (PR 334) * Return non-null signature algorithm arrays from `ExtendedSSLSession` methods (PR 334) * Fix `WolfSSLTrustX509.getAcceptedIssuers()` operator precedence returning incorrect trusted issuers (PR 334) * Fix OCSP chain issuer handling to correctly use provided certificate chain entries (PR 334) * Skip certificate-only trust entries without private keys in `chooseClientAlias()` key selection (PR 310) * Filter anon suites from default enabled cipher suite list, matching `jdk.tls.disabledAlgorithms` behavior (PR 343) * Filter available cipher suites based on configured TLS version in `getAvailableCipherSuitesIana()` (PR 318) * Fix `WolfSSLSession.read()` ByteBuffer reading more bytes than requested (PR 353) * Fix PSK client identity copy / key length validation against max buffer sizes (PR 346) * Fix `x509_getDer()` potential crash due to missing `jbyteArray` allocation before `SetByteArrayRegion` (PR 347) * Fix possible null dereference in `WolfSSLSession.setServerID()` before `id.length` access (PR 344) * Fix possible null crash in `CertManagerLoadCA()` when null certFile or certPath passed from Java (PR 345) * Fix possible null dereference in `WolfSSLTrustManager.LoadAndroidSystemCertsManually()` on Android (PR 344) - Fix SHA-224 signature type string typo where `SHA244` was used instead of `SHA224` (PR 345) - Fix `FD_SETSIZE` bounds check in `socketSelect()` before `FD_SET` calls to prevent undefined behavior with high file descriptors (PR 345) - Fix potential I/O stall from stale `pollRx`/`pollTx` flags not being reset between I/O loop iterations (PR 345) - Fix JVM thread leaks from missing `DetachCurrentThread` in ALPN, verify, and CRL native callbacks (PR 346, 347, 353) - Fix memory leak of `internCtx` on `NewGlobalRef` failure in PK callback setup functions (PR 356) - Fix thread-safety issue in native PK callbacks when multiple SSL sessions active (PR 345) - Deregister native FIPS error callback on library cleanup to prevent callbacks into garbage-collected Java objects (PR 337) **Example Changes:** - Add PSK example applications for `SSLSocket` and `SSLEngine` client/server (PR 340) - Add `DualProviderFIPSTest` example for wolfJSSE and wolfJCE dual provider FIPS usage (PR 342) - Update Android example app to perform TLS connection using wolfJSSE `SSLSocket`, add FIPS error callback for hash development workflow (PR 355) **Testing Changes:** - Add SpotBugs static analysis build target, exclusion filter, and GitHub Actions workflow (PR 344) - Add GitHub Actions workflow for Android FIPS Ready testing with automated hash capture via emulator (PR 355) - Add GitHub Actions workflow for FIPS Ready dual provider testing with wolfJSSE and wolfJCE (PR 342) - Add GitHub Actions workflow for UndefinedBehaviorSanitizer (UBSan) testing (PR 321) - Add GitHub Actions workflow for Linux 32-bit testing with Java 17 (PR 320) - Add GitHub Actions workflow for Java Module (JPMS) testing (PR 324) - Add GitHub Actions workflow for checking source file list consistency (PR 331) - Add `make` target and GitHub Actions workflow for building with all wolfSSL patches enabled (PR 322, 326) - Add Java 24 and 25 to GitHub Actions test matrix (PR 319) - Update line length check script for correct line numbers and local use (PR 328) - Guard JaCoCo `taskdef` behind availability check to prevent build failures when JAR is absent (PR 353) **Misc Changes:** - Update `Makefile` to generate dependency files, support verbose mode, and enable `-Wextra`/`-Werror` compiler flags (PR 332) - Add Gradle distribution SHA-256 hash verification in Android build (PR 350) - Replace deprecated `jcenter()` with `mavenCentral()` in Android Gradle build (PR 350) - Update Android `CMakeLists.txt` to exclude newly-added wolfSSL source files fixing build failures (PR 326, 346) The wolfSSL JNI/JSSE Manual is available at: https://www.wolfssl.com/documentation/manuals/wolfssljni/. For build instructions and more details, please check the manual. ### wolfSSL JNI Release 1.16.0 (12/31/2025) Release 1.16.0 has bug fixes and new features including: **JSSE System/Security Property Support:** * Add `wolfjsse.autoSNI` System property support to control auto setting SNI (PR 249) * Add partial support for `jdk.tls.client.SignatureSchemes` and `jdk.tls.server.SignatureSchemes` (PR 299) **JSSE Changes:** * Automatically set SNI for HttpsURLConnection connections (PR 249) * Add support for DTLS 1.3 (`DTLSv1.3`) in `SSLContext` / `SSLEngine` (PR 254) * Fix SNI storing/restoring at wolfJSSE level on session resumption (PR 255) * Improve `SSLEngine` send/received performance 20-30% (PR 257) * Implement SNI matcher logic for server-side `WolfSSLSocket` use (PR 259) * Cache system and security properties on `WolfSSLEngineHelper` creation vs each handshake (PR 273) * Reduce synchronization scope in `WolfSSLAuthStore` for lower contention (PR 274) * Cache KeyStore entries in `X509ExtendedKeyManager` to reduce contention for heavy concurrent use (PR 272) * Fix potential use-after-free issues with `WolfSSLSocket` (PR 275) * Fix NullPointerException on double `close()` in `WolfSSLSocket` (PR 277) * Implement `toString()` inside `WolfSSLPrincipal` (PR 281) * Fix certificate chain order returned from `WolfSSLX509StoreCtx.getCerts()` to match JSSE expectations (PR 282, 289) * Protect native sessions from being freed while I/O operations are in progress (PR 278) * Add support for honoring client cipher suite preference ordering (PR 287) * Fix potential memory leak in `SSLEngine` during JNI callback cleanup (PR 289) * Implement `X509Certificate.getExtendedKeyUsage()` in `WolfSSLX509Certificate` (PR 289) * Fix cert chain validation to handle cross-signed certs and chain paths (PR 292, 294) * Add Java ServiceLoader support for wolfJSSE provider for Java Module System (JPMS) compatibility (PR 296) * Implement `X509Certificate` `getSubjectX500Principal()` and `getIssuerX500Principal()` (PR 298) * Fall back to `java.home` property use when `JAVA_HOME` env var not set (PR 302) * Add `hashCode()` implementation to `SSLSession` (PR 303) * Allow `SSLSessionContext` access before `SSLContext` init (PR 304) * Add Android non-standard `checkServerTrusted()` in `X509TrustManager` (PR 288) * Fix ALPN to support non-ASCII protocol names (PR 305) **JNI Changes:** * Rename wolfCrypt JNI helper classes to avoid namespace conflicts with wolfcrypt-jni (PR 252) * Wrap Atomic Record VerifyDecrypt callback (PR 252) * Ensure peer ALPN protocol list is null terminated (PR 258) * Enhance error handling and return code checks in `WolfSSLSession.read()` (PR 260) * Improve ByteBuffer handling in `WolfSSLSession.read()` (PR 262) * Dynamically get algorithm and key ASN NID enum values from wolfSSL (PR 263) * Add pool of ByteBuffers to `WolfSSLSession`, improves performance and avoids unaligned memory access (PR 268) * Add `getSessionTicket()` and `setSessionTicket()` to `WolfSSLSession` (PR 270) * Correct call to `CallObjectMethod()` in `WolfSSLSession` ByteBuffer read (PR 286) * Wrap `wolfSSL_i2d_SSL_SESSION()` and `wolfSSL_d2i_SSL_SESSION()` allowing for session persistence (PR 290) * Add DTLS Connection ID (CID) support, wrapping native wolfSSL APIs (PR 297) **Debugging Changes:** * Switch to use Java logging (`java.util.logging`) framework for debug logs (PR 261) * Switch logging callback for wolfSSL debug messages to use stderr (PR 269) * Switch debug log timestamp to use Java `Instant.ofEpochMilli()`, remove dependency on `java.sql.Timestamp` (PR 301) **Example Changes:** * Add DTLS 1.3 example client and server applications (PR 264) **Testing Changes:** * Add GitHub Actions PRB test with `ubuntu-24.04-arm` runner for testing `--enable-armasm` builds (PR 267) * Add GitHub Actions PRB test for AddressSanitizer (`-fsanitize=address`) builds (PR 276) * Add GitHub Actions PRB tests for coding style (line length, comment style) (PR 285) * Add GitHub Actions PRB test for Clang scan-build static analysis (PR 285) * Add GitHub Actions PRB test for Visual Studio builds on Windows (PR 295) * Add GitHub Actions PRB test to build against last 5 stable wolfSSL releases (PR 306) * Add GitHub Actions PRB test to run unit tests on Android emulator (PR 307) * Use local server threads in some `WolfSSLSession` tests to avoid network access (PR 300) **Misc Changes:** * Clean up IDE warnings in Cursor and VSCode (PR 266) * Add `CLAUDE.md` for consumption by Claude Code (PR 265) * Add `-fPIC` to CFLAGS in `java.sh` for Aarch64 hosts (PR 267) * Modify `java.sh` to allow passing install directory (`./java.sh `) (PR 285) The wolfSSL JNI Manual is available at: https://www.wolfssl.com/documentation/manuals/wolfssljni. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.15.0 (01/24/2025) Release 1.15.0 has bug fixes and new features including: **JSSE System/Security Property Support:** * Addition of JNI-level debug system property (`wolfssljni.debug=true`) (PR 235) **JSSE Changes:** * Fix to close Socket when SSLSocket startHandshake() fails (PR 234) * Fixes for potential NullPointerException in SSLSocket Input/OutputStream (PR 233) * Add ability for `SSLSession.getRequestedServerNames()` to return SNI request on server side (PR 240) * Add check for legacy DHE keys, for cipher suites using keys less than 1024 bits (PR 243) * Optimize `byte[]` creation in `SSLEngine` when receiving app data (PR 244, 250) * Add ability for `SSLSocket.close()` to interrupt `read()/write()` operations waiting in `select()/poll()` (PR 246) **JNI Changes:** * Always call `wolfSSL_get1_session()` inside `WolfSSLSession.getSession()` (PR 236) * Call `wc_RunAllCast_fips()` with wolfCrypt FIPS builds if available (PR 247) * Add ability to pass `CFLAGS` to `java.sh` (ie: `CFLAGS="-DTEST_DEFINE" ./java.sh`) (PR 248) * Remove incorrect `ATOMIC_USER` preprocessor gate around native `wolfSSL_GetSide()` (PR 246) **Example Changes:** * Updated Android Studio example project, define `WOLFSSL_CERT_REQ` (PR 234) * Update Android Studio CMakeLists.txt with `WOLFSSL_CUSTOM_CONFIG` definition (PR 239) **Testing Changes:** * Add GitHub Actions PRB test for Maven (Linux, macOS) builds (PR 232) * Add tests of `SSLSession` state at various points throughout the handshake (PR 233) * Add GitHub Actions PRB test for `--enable-jni CFLAGS="-DNO_SESSION_CACHE_REF"` build (PR 236) * Add GitHub Actions PRB test for `-DWOLFJNI_USE_IO_SELECT` (PR 246) The wolfSSL JNI Manual is available at: https://www.wolfssl.com/documentation/manuals/wolfssljni. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.14.0 (11/7/2024) Release 1.14.0 has bug fixes and new features including: **New JSSE Functionality:** * Add wolfJCE WKS KeyStore type support (PR 178) * Add support for native `poll()` and set as default over `select()` (PR 201) * Add `getSSLParameters()` to SSLServerSocket implementation (PR 214) * Add `rsa_pss` support and tests to wolfJSSE (PR 218) * Add LDAPS endpoint identification to X509ExtendedTrustManager (PR 227) **JSSE System/Security Property Support:** * Add option to print debug logs in JSON format (`wolfjsse.debugFormat=JSON`) (PR 187) * Add Security property to disable Java client session cache (`wolfjsse.clientSessionCache.disabled=true`) (PR 225) **JSSE Changes:** * Fix for native memory leak when calling `wolfSSL_get_peer_certificate()` (PR 188) * Optimization to allow for easier garbage collection (PR 189) * Fix for SSLEngine session storage and unwrap() FINISHED state (PR 193) * Fix to not close SSLSocket when SSLServerSocket is closed (PR 194) * Fix for getting end of stream when calling InputStream.read() (PR 195) * Fix for throwing exceptions on KeyManagerFactory/TrustManagerFactory use before init (PR 196) * Fix for SSLEngine HandshakeStatus when receiving TLS 1.3 session tickets after handshake (PR 197) * Throw SSLException to indicate lack of renegotiation support in `SSLEngine.beginHandshake()` (PR 197) * Fix to mark inbound and outbound closed in SSLEngine when fatal alerts are received (PR 197) * Return `X509Certificate[]` from `SSLSession.getPeerCertificates()` (PR 199) * Remove unneeded `SSLServerSocket.close()` method (PR 200) * Fix `SSLSession.getLocalPrincipal()` to assume user cert is first in chain (PR 204) * Ensure that socket is closed if implicit handshake in `SSLSocket.getSession()` fails (PR 205) * If SSLSocket handshake is unsuccessful, close Socket before throwing an exception (PR 205) * Close SSLEngine inbound on ALPN protocol name error (PR 208) * Adjust client-side session resumption to check cipher suite and protocol (PR 209) * Pass lower level exception messages up during X509TrustManager verification (PR 211) * Refactor code calls not available in Android API 24 (PR 216) * Fix to return end of stream in `InputStream.read()` on socket error (PR 217) * Fix to update the TLS protocol in SSLSession after handshake completes (PR 219) * Fix potential deadlock on close() between SSLSocket and Input/OutputStream (PR 220) * Fixes for issues found with SpotBugs (PR 221) * Clean up ant build warnings on Corretto 20.0.1 (PR 223) * Error out on invalid port during creation of SSLEngine (PR 224) * Correct SSLSocket exception types and fix setting of native file descriptor (PR 228) * Fix deadlock issues between `SSLSocket close()` and `OutputStream.write()` (PR 230) **New JNI Wrapped APIs and Functionality:** * `wolfSSL_SessionIsSetup()` (PR 191) * `wolfSSL_SESSION_dup()` (PR 206) **JNI Changes:** * Fix for JNI example use of TLS 1.3 secret callback strings (PR 192) **Example Changes:** * Add Host into HTTP GET in example ClientJSSE when used with `-g` (PR 213) * Add example JNI-only threaded client/server applications (PR 212) * Add basic RMI example client and server (PR 226) **Debugging Changes:** * Fix typo in SSLEngine debug logs (PR 203) **Testing Changes:** * Run Facebook Infer on all PRs with GitHub Actions (PR 190) * Run TLS 1.0 and 1.1 tests if enabled in native wolfSSL even if disabled in `java.security` (PR 198) * Add GitHub Actions PRB test for Android gradle build (PR 222) The wolfSSL JNI Manual is available at: https://www.wolfssl.com/documentation/manuals/wolfssljni. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.13.0 (4/9/2024) Release 1.13.0 has bug fixes and new features including: **New JSSE Functionality:** * Add `SSLSocket.getApplicationProtocol()`, returns negotiated ALPN protocol (PR 150) * Add native `WOLFSSL_TRUST_PEER_CERT` support in `WolfSSLTrustX509` (PR 154) * Add implementation of `javax.net.ssl.X509ExtendedTrustManager` (PR 159) * Add `getSSLParameters()` to `SSLEngine` and `SSLSocket` (PR 159) * Add `getHandshakeSession()` to `SSLSocket` (PR 159) * Convert `SSLSession` to `ExtendedSSLSession`, add `getRequestedServerNames()` (PR 159) * Add ALPN API support to `SSLSocket` and `SSLEngine` with tests (PR 163) * Add implementation of `X509ExtendedKeyManager` (PR 167) **JSSE System/Security Property Support:** * Add partial support for `jdk.tls.disabledAlgorithms` Security property (PR 136) * Add support for `wolfjsse.enabledCipherSuites` Security property (PR 136) * Add support for `wolfjsse.enabledSignatureAlgorithms` Security property (PR 136) * Add support for `wolfjsse.enabledSupportedCurves` Security property (PR 143) **JSSE Changes:** * Get updated status before returning from SSLEngine.getHandshakeStatus() (PR 122) * Add synchronization to SSLEngine read/write buffers (PR 124) * Return null array from X509TrustManager.getAcceptedIssuers() if not yet initialized (PR 128) * Improve `SSLEngine.unwrap()` for better efficiency (PR 137) * Add native wolfSSL crypto callback (CryptoCb) support with WolfSSLProvider (PR 138) * Add synchronization around `WolfSSLAuthStore` lock (PR 139) * Fixes and improvements to `SSLSocket`/`SSLEngine` session resumption (PR 139, 144) * Fix for `X509TrustManager` to not add root CA twice in returned chains (PR 140) * Add synchronization around native pointer use and active states (PR 142) * Fix for `SSLSocket` to fall back to I/O callbacks if setting internal fd fails (PR 145) * Fix `SSLSocket` TLS 1.3 session cache and threading issues (PR 149) * Throw `SocketException` if native socket `select()` fails (PR 151) * Only call `InetAddress.getHostName()` when `jdk.tls.trustNameService` is true (PR 134) * Fix for `SSLSession.getPeerCertificate()` and cached certs during resumption (PR 162) * Save session at correct time for resumption in SSLEngine (PR 165) * Check TLS 1.3 session for ticket before saving to Java client cache (PR 175) * Fixes for `SSLEngine.setWantClientAuth()` (PR 172) * Release native verify callback when `SSLEngine` is closed (PR 180) * Avoid extra Java array allocation in `SSLSocket` InputStream/OutputStream (PR 183) **New JNI Wrapped APIs and Functionality:** * `wolfSSL_CTX_SetTmpDH()` and `wolfSSL_CTX_SetTmpDH_file()` (PR 136) * `wolfSSL_CTX_SetMinDh/Rsa/EccKey_Sz()` (PR 136) * `wolfSSL_set1_sigalgs_list()` (PR 136) * `wolfSSL_CTX_UseSupportedCurve()` (PR 158) * `wolfSSL_X509_check_host()` and `wolfSSL_SNI_GetRequest()` (PR 159) * `wolfSSL_CTX_set_groups()` and `wolfTLSv1_3_client/server_method()` (PR 164) * `SSL_CTX_set1_sigalgs_list()` (PR 169) * `wolfSSL_set_tls13_secret_cb()`, add ability to set Java callback (PR 181) * Add X.509v3 certificate generation support in `WolfSSLCertificate` and examples (PR 141) * Add Certificate Signing Request (CSR) support and examples (PR 146) **JNI Changes:** * Call `wolfSSL_get1_session()` when saving session for resumption (PR 139) * Call `select()` again on error with `EINTR` (PR 171) **New Platform Support:** * Add Windows support with Visual Studio, see IDE/WIN/README.md (PR 125) **Build System Changes:** * Add `JAVA_HOME` support in `java.sh` for use with custom Java install (PR 121) * New argument to `java.sh` for custom wolfSSL library name to be used (PR 126) * Add lib64 directory to library search path in `java.sh` (PR 130) * Standardize JNI library name on OSX to .dylib (PR 152) * Add Maven build support (PR 153) * Update Android Studio example project (PR 185) **Example Changes:** * Update instructions for running examples (PR 133) * Fix example JSSE client `-d` option, add `-g` to send HTTP GET (PR 155) * Fix example JSSE client for resumption when sending HTTP GET (PR 157) * Add TLS 1.3 version support to example `Client.java` and `Server.java` (PR 169) * Expand JNI `Client.java` with support for doing session resumption with tickets (PR 169) **Debugging Changes:** * Add WolfSSLDebug.logHex() for printing byte arrays as hex (PR 129) * Add synchronization and Thread ID to debug log messages (PR 129) * Add new debug System property `wolfsslengine.io.debug` for I/O debug logs (PR 137) * Add timestamp to debug logs (PR 148) * Fix for enabling JSSE debug logs after WolfSSLProvider has been registered (PR 166) * Make native wolfSSL debug log format consistent with wolfJSSE logs (PR 166) **Testing Changes:** * Add Facebook Infer test script, make fixes (PR 127, 182) * Add extended threading test of `SSLEngine` (PR 124) * Testing with and fixes from SonarQube static analyzer (PR 131) * Add extended threading test of `SSLSocket` (PR 149) * Testing with and fixes for running SunJSSE tests on wolfJSSE (PR 170, 174) * Add GitHub Actions tests for Oracle/Zulu/Coretto/Temurin/Microsoft JDKs on Linux and OS X (PR 176) **Documentation Changes:** * Clean up Javadoc warnings with Java 17 (PR 147) The wolfSSL JNI Manual is available at: https://www.wolfssl.com/documentation/manuals/wolfssljni. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.12.0 (03/31/2023) Release 1.12.0 has bug fixes and new features including: **JNI and JSSE Changes:** * Additional synchronization support in WolfSSLCertificate (PR 118) * Prevent WolfSSLCertificate from freeing `WOLFSSL_X509` if not owned (PR 118) * Fix `X509KeyManager.getCertificateChain()` to return `null` when alias is `null` (PR 119) **Documentation Changes:** * Add Android Studio instructions for how to update source symlinks on Windows (PR 117) The wolfSSL JNI Manual is available at: https://www.wolfssl.com/documentation/manuals/wolfssljni. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.11.0 (12/2/2022) Release 1.11.0 has bug fixes and new features including: **JNI and JSSE Changes:** * Add support for system properties: keyStore, keyStoreType, keyStorePassword (PR 74) * Add support for secure renegotiation if available in native wolfSSL (PR 75) * Fix compilation against newer wolfSSL versions that have dtls.c (PR 107) * Fixes and cleanup to SSLEngine implementation (PR 108) * Fixes for SSLEngine synchronization issues (PR 108) * Add non-standard X509TrustManager.checkServerTrusted() for use on Android (PR 109) * Add RPM packaging support (PR 110) * Fix SSLSocketFactory.createSocket() to allow for null host (PR 111) * Remove @Override on SSLEngine.getHandshakeSession() for older Java versions (PR 114) The wolfSSL JNI Manual is available at: https://www.wolfssl.com/documentation/manuals/wolfssljni. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.10.0 (8/11/2022) Release 1.10.0 has bug fixes and new features including: **JNI and JSSE Changes:** * Add SSLEngine.getApplicationProtocol(), fixes Undertow compatibility (PR 84) * Wrap wolfSSL\_UseALPN() at JNI level (PR 84) * Fix compile error for wolfSSL < 4.2.0 and wolfSSL\_set\_alpn\_protos() (PR 84) * Fix NullPointerException when no selected ALPN is available (PR 84) * Fix JNI build when wolfSSL compiled with --disable-filesystem (PR 104) * Fix SSLEngine compatibility with data larger than TLS record size (PR 105) * Refactor SSLEngine handshake status to be more inline with SunJSSE (PR 105) * Add verbose SSLEngine logging with "wolfsslengine.debug" property (PR 105) **Documentation Changes** * Fix missing Javadoc warnings in ALPN code **Example Changes:** * Update Android Studio IDE project to use Android 11 (SDK 30) The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.9.0 (5/5/2022) Release 1.9.0 has bug fixes and new features including: **JNI and JSSE Changes:** * Add synchronization to class cleanup/free routines (PR 78) * Fix JNI native casting to use utintptr\_t instead of intptr\_t (PR 79) * Add support for newer Java versions (ex: Java 17) (PR 90) * Remove HC-128 support (PR 94). Native wolfSSL removed with [PR #4767](https://github.com/wolfSSL/wolfssl/pull/4767) * Remove RABBIT support (PR 96). Native wolfSSL removed with [PR #4774](https://github.com/wolfSSL/wolfssl/pull/4767) * Remove IDEA support (PR 97). Native wolfSSL removed in [PR #4806](https://github.com/wolfSSL/wolfssl/pull/4806). * Fix typecasting issues and cleanup for native argument checking (PR 98, 99) * Add Socket timeout support for native SSL\_connect/write() (PR 95) * SSLSocket.getSession() now tries to do TLS handshake if not completed (PR 76) * Fix shutdown/close\_notify alert handling in WolfSSLEngine (PR 83) * Fix WolfSSLSocket to test if close() called before object init (PR 88) * Add support for loading default system CA certs on Java 9+ (PR 89) * Fix timeout behavior with WolfSSLSession.connect() (PR 100) **Example Changes:** * Print wolfJSSE provider info in JSSE ProviderTest (PR 77) * Add option to ClientJSSE to do one session resumption (PR 80) * Update example certificates and keys (PR 81) **Documentation Changes:** * Add missing Javadocs, fix warnings on newer Java versions (PR 92) **Testing Changes:** * Update junit dependency to 4.13.2 (PR 91) The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.8.0 (11/12/2021) Release 1.8.0 has bug fixes and new features including: * wolfCrypt FIPS 140-3 and FIPS Ready compatibility * Add Socket method wrappers, fixes behavior when inner Socket used with JSSE * Add wrappers to get FIPS verifyCore hash (FIPS error cb or directly) * Fix potential NullPointerException with several clone() methods * Refactor of SSLSessionContext implementation * Fix behavior of WolfSSLSocket.getSoTimeout() when external Socket is wrapped * Fix timeout used in socketSelect to correctly handle fractional sec timeouts * Fix memory leak when custom X509TrustManager is used with wolfJSSE * Add support for multiple X509TrustManager objects across multiple sessions * Call WolfSSL.cleanup() in finalizer to release library resources earlier * Release native WOLFSSL memory sooner, when WolfSSLSocket is closed * Better management and freeing of native WolfSSLCertificate memory * Release native logging callback when library is freed * Release native wolfCrypt FIPS callback when library is freed * Release CTX-level Java verify callback when CTX is freed * Release CTX-level Java CRL callback when CTX is freed * Better global reference cleanup in error conditions * Fix unused variable warnings in non-FIPS builds * Use one static WolfSSL object across all WolfSSLProvider objects * Release local JNI array inside WolfSSLSession.read() on function exit * Add multi-threaded JSSE provider client and server examples * Update Android AOSP install script to create missing blank files if needed * Update Android AOSP build fies to define `SIZEOF_LONG` and `SIZEOF_LONG_LONG` * Update IDE/Android example Android Studio project * Fix default cipher suite list order used in JSSE WolfSSLContext objects * Fix FIPS Ready compatibility with `WC_RNG_SEED_CB` * Update Android AOSP Android.mk to compile wolfCrypt kdf.c The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.7.0 (01/15/2021) Release 1.7.0 has bug fixes and new features including: * Fixes for Infer analysis warnings * Throw exception in DEFAULT\_Context creation if engineInit() fails * Defer creating DEFAULT WolfSSLContext until first use * Check if Socket is open before doing TLS shutdown in WolfSSLSocket.close() * Only load X509TrustStore issuers when needed by native wolfSSL verification * Fix compiler warnings when used with older versions of native wolfSSL * Verify and load intermediate CA certs in WolfSSLTrustX509.certManagerVerify() * Add support for setSoTimeout() in WolfSSLSocket * Fix suites length check in WolfSSLEngineHelper.setLocalCiphers() * Check for connection closed before completing handshake in SSLSocket.read/write The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.6.0 (08/26/2020) Release 1.6.0 has bug fixes and new features including: * Support for custom TrustManager checkClientTrusted(), checkServerTrusted() * wolfJSSE TrustManager registered as PKIX provider * Improved support for auto-loading system CA certificates * Improved Android TrustManager support * Use AndroidCAStore KeyStore when available on Android * Support for X509Certificate.getSubjectAlternativeNames() * Fix for native memory leak in JSSE WolfSSLTrustX509 * Optimization of WolfSSLTrustX509 to hold less memory at idle * Addition of missing finalize() methods in some JSSE classes * Casts to uintptr\_t instead of intptr\_t at native JNI level * Conversion to use GetByteArrayElements for potential memory use savings * Consistently use wolfCrypt XMALLOC/XFREE for native memory allocation * Use javah in build.xml for older ant/Java versions without nativeheaderdir * Add JSSE debug logging for native wolfSSL with wolfssl.debug system parameter * Add more JSSE-level debug messages for easier troubleshooting * Add internal implementation of SSLParameters, WolfSSLParameters * Add client-side SNI support * Fix warnings when DH is disabled (--disable-dh) * Add Java thread ID to JSSE debug log messages for easier multithreaded debug * Improve handshake synchronization in WolfSSLSocket for multi-threaded apps * Add support for jsse.enableSNIExtension system property * Add client-side session ticket support * Add support for jdk.tls.client.enableSessionTicketExtension system property * Enable session ticket and session cert support by default on Android AOSP * Fixes compatibility with OkHttp on Android * Add support for non-blocking socket operations in WolfSSLSession/Socket * Moves I/O mutex locking to native level for more efficient locking The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.5.0 (01/17/2020) Release 1.5.0 has bug fixes and new features including: * New JSSE provider (wolfJSSE) including TLS 1.3 support! * Add JSSE debug logging with wolfjsse.debug system parameter * Add JSSE install script and helper files for Android AOSP * Add JSSE example apps (examples/provider) * Add JNI wrappers to detect if native features/protocols are compiled in * Add JNI wrapper for PKCS#8 offset getter * Add JNI wrapper for wolfSSL\_get\_ciphers\_iana() * Update build.xml to use nativeheaderdir instead of javah target * Update tests to use junit-4.13 / hamcrest-all-1.3 * Update to build, now ant build does not build and run tests / examples The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.4.0 (11/16/2018) Release 1.4.0 has bug fixes and new features including: * Better support for conditional native wolfSSL feature dependencies * Adds methods for checking if native features are enabled * Optional method for loading native JNI library from a specific path * TLS 1.0 functions are compiled out unless WOLFSSL\_ALLOW\_TLSV10 is defined * Wrapper for native wolfCrypt ECC shared secret public key callback * Allow other HmacSHA hash types to be used in Atomic User callback examples * Error string buffer size set to use WOLFSSL\_MAX\_ERROR\_SZ * Fix for RSA doSign() output length * Fix for I/O, Atomic User, and Public Key callback registration in examples * Updated example key and certificate files The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.3.0 (12/04/2015) Release 1.3.0 has bug fixes and new features including: * Updated support to wolfSSL 3.7.0 * Added finalizers for WolfSSLContext and WolfSSLSession classes * Fix for SSLv3 now disabled by default in wolfSSL proper * SSLv3 now marked as @Deprecated * PSK (pre-shared key) support for client and server * Better error checking and exception handling * New WolfSSLJNIException class * WolfSSLSession now cached in native WOLFSSL struct for callbacks * Easier inclusion of junit4 in build.xml The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.2.0 (06/02/2015) Release 1.2.0 has bug fixes and new features including: * Updated support for wolfSSL 3.4.6 and CyaSSL to wolfSSL name change * Benchmark functionality in example client * Updated example certificates * Better detection of Java home on Mac and Linux The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.1.0 (10/25/2013) Release 1.1.0 has bug fixes and new features including: * Updated support for CyaSSL 2.9.4 * Updated example certificates and CRLs * Now expects user to have JUnit JARs pre-installed on dev platform * Updated unit tests, JUnit4 style * Android support * CRL monitor now optional in server mode The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual. ### wolfSSL JNI Release 1.0.0 (10/25/2013) Release 1.0.0 is the first public release of wolfSSL JNI, the Java wrapper for the CyaSSL embedded SSL library. The wolfSSL JNI Manual is available at: http://www.wolfssl.com/documentation/wolfSSL-JNI-Manual.pdf. For build instructions and more detailed comments, please check the manual.