wolfssljni/src/java/com/wolfssl/provider/jsse/WolfSSLContext.java

769 lines
27 KiB
Java

/* WolfSSLContext.java
*
* Copyright (C) 2006-2026 wolfSSL Inc.
*
* This file is part of wolfSSL.
*
* wolfSSL is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* wolfSSL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
*/
package com.wolfssl.provider.jsse;
import java.security.KeyManagementException;
import java.security.SecureRandom;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import javax.security.auth.x500.X500Principal;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContextSpi;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSessionContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import com.wolfssl.WolfSSL;
import com.wolfssl.WolfSSLDebug;
import com.wolfssl.WolfSSL.TLS_VERSION;
import com.wolfssl.WolfSSLException;
import com.wolfssl.WolfSSLJNIException;
/**
* wolfSSL implementation of SSLContextSpi
* @author wolfSSL
*/
public class WolfSSLContext extends SSLContextSpi {
private TLS_VERSION currentVersion = TLS_VERSION.SSLv23;
private WolfSSLAuthStore authStore = null;
private com.wolfssl.WolfSSLContext ctx = null;
private WolfSSLParameters params = null;
/* Created during construction to allow access before init() is called */
private WolfSSLSessionContext serverSessionCtx = null;
private WolfSSLSessionContext clientSessionCtx = null;
/* Default session cache size of 33 to match native wolfSSL default */
private static final int DEFAULT_CACHE_SIZE = 33;
private WolfSSLContext(TLS_VERSION version) {
this.currentVersion = version;
this.serverSessionCtx = new WolfSSLSessionContext(
DEFAULT_CACHE_SIZE, WolfSSL.WOLFSSL_SERVER_END);
this.clientSessionCtx = new WolfSSLSessionContext(
DEFAULT_CACHE_SIZE, WolfSSL.WOLFSSL_CLIENT_END);
}
private void createCtx() throws WolfSSLException {
long method;
String[] ciphersIana = null;
/* Enable native wolfSSL debug logging if 'wolfssl.debug'
* System property is set. Also attempted in WolfSSLProvider
* but System property may not have been set by user yet at that
* point. */
WolfSSLDebug.setNativeWolfSSLDebugging();
/* Get available wolfSSL cipher suites in IANA format */
ciphersIana = WolfSSL.getCiphersAvailableIana(this.currentVersion);
/* Allow ability for user to hard-code and override version, cipher
* suite, and NO_* disable options. Otherwise just sets defaults
* into ctxAttr. */
WolfSSLCustomUser ctxAttr = WolfSSLCustomUser.getCtxAttributes
(this.currentVersion, ciphersIana);
/* Explicitly set SSLContext version if overridden by
* WolfSSLCustomUser or specific SSLContext version was created
* by user. Otherwise use default of SSLv23. Starts at highest TLS
* protocol version supported by native wolfSSL then downgrades to
* minimum native downgrade version. */
if(ctxAttr.version == TLS_VERSION.TLSv1 ||
ctxAttr.version == TLS_VERSION.TLSv1_1 ||
ctxAttr.version == TLS_VERSION.TLSv1_2 ||
ctxAttr.version == TLS_VERSION.TLSv1_3 ||
ctxAttr.version == TLS_VERSION.SSLv23 ||
ctxAttr.version == TLS_VERSION.DTLSv1_3) {
this.currentVersion = ctxAttr.version;
} else {
throw new IllegalArgumentException(
"Invalid SSL/TLS protocol version");
}
/* Set SSLContext version. To be compatible with SunJSSE behavior,
* the enabled protocols are less than or equal to the version
* selected */
switch (this.currentVersion) {
case TLSv1:
method = WolfSSL.TLSv1_Method();
ctxAttr.noOptions = ctxAttr.noOptions |
WolfSSL.SSL_OP_NO_TLSv1_1 | WolfSSL.SSL_OP_NO_TLSv1_2 |
WolfSSL.SSL_OP_NO_TLSv1_3;
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating WolfSSLContext with TLSv1");
break;
case TLSv1_1:
method = WolfSSL.TLSv1_1_Method();
ctxAttr.noOptions = ctxAttr.noOptions |
WolfSSL.SSL_OP_NO_TLSv1_2 | WolfSSL.SSL_OP_NO_TLSv1_3;
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating WolfSSLContext with TLSv1_1");
break;
case TLSv1_2:
method = WolfSSL.TLSv1_2_Method();
ctxAttr.noOptions = ctxAttr.noOptions |
WolfSSL.SSL_OP_NO_TLSv1_3;
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating WolfSSLContext with TLSv1_2");
break;
case TLSv1_3:
method = WolfSSL.TLSv1_3_Method();
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating WolfSSLContext with TLSv1_3");
break;
case SSLv23:
method = WolfSSL.SSLv23_Method();
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating WolfSSLContext with SSLv23");
break;
case DTLSv1_3:
method = WolfSSL.DTLSv1_3_Method();
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating WolfSSLContext with DTLSv1_3");
break;
default:
throw new IllegalArgumentException(
"Invalid SSL/TLS protocol version");
}
if (method == WolfSSL.NOT_COMPILED_IN) {
throw new IllegalArgumentException("Protocol version not " +
"compiled into native wolfSSL library");
}
ctx = new com.wolfssl.WolfSSLContext(method);
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "created new native WOLFSSL_CTX");
if(ctxAttr.list != null && ctxAttr.list.length > 0) {
ciphersIana = ctxAttr.list;
} else {
ciphersIana = WolfSSL.getCiphersIana();
}
/* Set minimum allowed RSA/DH/ECC key sizes */
enforceKeySizeLimitations();
/* Set native wolfSSL device ID (devId) */
setGlobalCryptoCallbackDevId();
/* Auto-populate enabled ciphersuites with supported ones. If suites
* have been restricted with wolfjsse.enabledCipherSuites system
* security property, the suite list will be filtered in
* WolfSSLEngineHelper.sanitizeSuites() to adhere to any
* set restrictions */
if (WolfSSLUtil.isSecurityPropertyStringSet(
"wolfjsse.enabledCipherSuites")) {
/* User is overriding cipher suites, set CTX list */
this.setCtxCiphers(WolfSSLUtil.sanitizeSuites(ciphersIana, true));
}
params.setCipherSuites(WolfSSLUtil.sanitizeSuites(ciphersIana, true));
/* Auto-populate enabled protocols with supported ones. Protocols
* which have been disabled via system property get filtered in
* WolfSSLEngineHelper.sanitizeProtocols() */
params.setProtocols(WolfSSLUtil.sanitizeProtocols(
this.getProtocolsMask(ctxAttr.noOptions), this.currentVersion));
try {
LoadTrustedRootCerts();
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
/**
* Set native wolfSSL crypto callback device ID (devId).
* The devId used defaults to WolfSSL.INVALID_DEVID but an app may
* have set this globally via WolfSSLProvider.setDevId(). If not set
* globally, applications may also set this via
* SSLContext.setDevId() and SSLSocket.setDevId()
*
* @throws IllegalStateException if underlying WOLFSSL has been freed
* @throws WolfSSLException if native wolfSSL/JNI error occurs
*/
private void setGlobalCryptoCallbackDevId() throws WolfSSLException {
int ret = 0;
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "setting wolfSSL devId: " + WolfSSL.devId);
try {
ret = this.ctx.setDevId(WolfSSL.devId);
if (ret != WolfSSL.SSL_SUCCESS) {
throw new WolfSSLException(
"Error setting native wolfSSL device ID, ret = " + ret);
}
} catch (IllegalStateException e) {
throw new WolfSSLException(e);
}
}
/**
* Set native WOLFSSL_CTX cipher suite list.
* Converts String[] to colon-delimited cipher suite array, then
* calls native wolfSSL_CTX_set_cipher_list().
*/
private void setCtxCiphers(String[] suites)
throws IllegalArgumentException {
try {
String list;
StringBuilder sb = new StringBuilder();
if (suites == null || suites.length == 0) {
/* use default cipher suites */
return;
}
for (String s : suites) {
sb.append(s);
sb.append(":");
}
if (sb.length() > 0) {
/* remove last : */
sb.deleteCharAt(sb.length() - 1);
list = sb.toString();
if (this.ctx.setCipherList(list) != WolfSSL.SSL_SUCCESS) {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "error setting WolfSSLContext cipher list: " +
list);
}
}
} catch (IllegalStateException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Set minimum supported key sizes for RSA/DH/ECC based on values
* set by user in jdk.tls.disabledAlgorithms security property.
*
* @throws WolfSSLException Key size limitation fails to set in CTX
*/
private void enforceKeySizeLimitations() throws WolfSSLException {
int minKeySize = 0;
int ret = 0;
minKeySize = WolfSSLUtil.getDisabledAlgorithmsKeySizeLimit("RSA");
ret = this.ctx.setMinRSAKeySize(minKeySize);
if (ret != WolfSSL.SSL_SUCCESS) {
throw new WolfSSLException(
"Error setting SSLContext min RSA key size");
}
minKeySize = WolfSSLUtil.getDisabledAlgorithmsKeySizeLimit("EC");
ret = this.ctx.setMinECCKeySize(minKeySize);
if (ret != WolfSSL.SSL_SUCCESS) {
throw new WolfSSLException(
"Error setting SSLContext min ECC key size");
}
minKeySize = WolfSSLUtil.getDisabledAlgorithmsKeySizeLimit("DH");
ret = this.ctx.setMinDHKeySize(minKeySize);
if (ret != WolfSSL.SSL_SUCCESS) {
throw new WolfSSLException(
"Error setting SSLContext min DH key size");
}
}
private void LoadTrustedRootCerts() {
int ret = 0;
int loadedCACount = 0;
/* extract root certs from X509TrustManager */
X509TrustManager tm = authStore.getX509TrustManager();
if (tm == null) {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "internal TrustManager is null, no CAs to load");
return;
}
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "Using X509TrustManager: " + tm.getClass().getName());
/* We only need to load trusted CA certificates into our native
* WOLFSSL_CTX if we are doing internal verification with wolfSSL
* native verify logic. Otherwise, the registered Java TrustManager
* being used will handle verification (including CA lookup) when
* we call checkClientTrusted()/checkServerTrusted().
*
* If tm is not an instance of WolfSSLTrustX509, simply return
* here since we do not need to interface with native verification */
if (!(tm instanceof com.wolfssl.provider.jsse.WolfSSLTrustX509)) {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "Deferring verification to checkClientTrusted/ServerTrusted()");
return;
}
/* Get trusted/accepted root certificates from the X509TrustManager */
X509Certificate[] caList = tm.getAcceptedIssuers();
if (caList == null) {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "internal TrustManager has no accepted issuers to load");
return;
}
if (caList.length == 0) {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "internal TrustManager has no certs");
return;
}
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "Number of certs in X509TrustManager: " + caList.length);
/* Load accepted issuer certificates into native WOLFSSL_CTX to be
* used in native wolfSSL verify logic */
for (int i = 0; i < caList.length; i++) {
try {
byte[] derCert = caList[i].getEncoded();
ret = ctx.loadVerifyBuffer(derCert, derCert.length,
WolfSSL.SSL_FILETYPE_ASN1);
if (ret == WolfSSL.SSL_SUCCESS) {
loadedCACount++;
} else {
/* skip loading on failure, move to next */
continue;
}
} catch (CertificateEncodingException ce) {
/* skip loading if encoding error is encountered */
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "skipped loading CA, encoding error");
continue;
} catch (WolfSSLJNIException we) {
/* skip loading if wolfSSL fails to load der encoding */
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "skipped loading CA, JNI exception");
continue;
}
final String sigAltName = caList[i].getSigAlgName();
final String subjectName =
caList[i].getSubjectX500Principal().getName(
X500Principal.RFC1779);
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "loaded trusted root cert (" + sigAltName + "): " +
subjectName);
}
if (caList.length > 0 && loadedCACount == 0) {
throw new IllegalArgumentException("wolfSSL failed to load " +
"any trusted CA certificates from TrustManager");
}
}
/* Format an array of objects as "[Class1, Class2, ...]" for debug
* logging without invoking caller-supplied toString() on user-provided
* KeyManager/TrustManager objects. */
private static String classNames(Object[] arr) {
if (arr == null) {
return "null";
}
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
if (i > 0) {
sb.append(", ");
}
sb.append(arr[i] == null ? "null" : arr[i].getClass().getName());
}
sb.append("]");
return sb.toString();
}
/**
* Initializes a SSLContext.
*
* wolfJSSE currently selects the first KeyManager and TrustManager
* in the input arrays to be used during the SSL/TLS context setup
* and session. Native wolfSSL gets entropy directly based on how
* the wolfSSL library has been compiled. SecureRandom is not used
* by wolfJSSE.
*
* @param km - array of KeyManager objects
* @param tm - array of TrustManager objects
* @param sr - SecureRandom object
*
* @throws KeyManagementException if wolfJSSE fails to load and use
* input objects.
*/
@Override
protected void engineInit(KeyManager[] km, TrustManager[] tm,
SecureRandom sr) throws KeyManagementException {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "entered engineInit(km=" + classNames(km) + ", tm=" +
classNames(tm) + ", sr=" +
(sr == null ? "null" : sr.getClass().getName()) + ")");
try {
authStore = new WolfSSLAuthStore(km, tm, sr, currentVersion,
this.serverSessionCtx, this.clientSessionCtx);
params = new WolfSSLParameters();
createCtx();
/* Link authStore to session contexts for session operations */
this.serverSessionCtx.setWolfSSLAuthStore(authStore);
this.clientSessionCtx.setWolfSSLAuthStore(authStore);
} catch (IllegalArgumentException iae) {
throw new KeyManagementException(iae);
} catch (WolfSSLException we) {
throw new KeyManagementException(we);
}
}
/**
* Creates a new wolfJSSE SSLSocketFactory.
*
* @throws IllegalStateException if SSLContext has not been initialized
*/
@Override
protected SSLSocketFactory engineGetSocketFactory()
throws IllegalStateException {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "entered engineGetSocketFactory()");
if (this.ctx == null || this.authStore == null) {
throw new IllegalStateException("SSLContext must be initialized " +
"before use, please call init()");
}
return new WolfSSLSocketFactory(this.ctx, this.authStore, this.params);
}
/**
* Creates a new wolfJSSE SSLServerSocketFactory.
*
* @throws IllegalStateException if SSLContext has not been initialized
*/
@Override
protected SSLServerSocketFactory engineGetServerSocketFactory()
throws IllegalStateException {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "entered engineGetServerSocketFactory()");
if (this.ctx == null || this.authStore == null) {
throw new IllegalStateException("SSLContext must be initialized " +
"before use, please call init()");
}
return new WolfSSLServerSocketFactory(this.ctx, this.authStore,
this.params);
}
/**
* Creates a new wolfJSSE SSLEngine.
*
* @throws IllegalStateException if SSLContext has not been initialized
*/
@Override
protected SSLEngine engineCreateSSLEngine()
throws IllegalStateException {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "entered engineCreateSSLEngine()");
if (this.ctx == null || this.authStore == null) {
throw new IllegalStateException("SSLContext must be initialized " +
"before use, please call init()");
}
try {
return new WolfSSLEngine(this.ctx, this.authStore, this.params);
} catch (WolfSSLException ex) {
throw new IllegalStateException("Unable to create engine", ex);
}
}
/**
* Creates a new SSLEngine, using peer information as hints.
*
* @param host - name of the peer host
* @param port - peer port
*
* @throws IllegalStateException if SSLContext has not been initialized
*/
@Override
protected SSLEngine engineCreateSSLEngine(String host, int port)
throws IllegalStateException {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "entered engineCreateSSLEngine(String host, int port)");
if (this.ctx == null || this.authStore == null) {
throw new IllegalStateException("SSLContext must be initialized " +
"before use, please call init()");
}
try {
return new WolfSSLEngine(this.ctx, this.authStore, this.params,
host, port);
} catch (WolfSSLException ex) {
throw new IllegalStateException("Unable to create engine", ex);
}
}
/**
* Returns the SSLServerSessionContext associated with this SSLContext.
*
* Session contexts are created during SSLContext construction to allow
* access before init() is called.
*
* @return SSLSessionContext for server sessions
*/
@Override
protected SSLSessionContext engineGetServerSessionContext() {
return this.serverSessionCtx;
}
/**
* Returns the SSLClientSessionContext associated with this SSLContext.
*
* Session contexts are created during SSLContext construction to allow
* access before init() is called.
*
* @return SSLSessionContext for client sessions
*/
@Override
protected SSLSessionContext engineGetClientSessionContext() {
return this.clientSessionCtx;
}
/**
* Returns copy of SSLParameters with default settings for this SSLContext.
*/
@Override
protected SSLParameters engineGetDefaultSSLParameters() {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "entered engineGetDefaultSSLParameters()");
return WolfSSLParametersHelper.decoupleParams(this.params);
}
/**
* Returns copy of SSLParameters with max supported settings for this
* SSLContext.
*/
@Override
protected SSLParameters engineGetSupportedSSLParameters() {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "entered engineGetSupportedSSLParameters()");
return WolfSSLParametersHelper.decoupleParams(this.params);
}
/**
* Get WolfSSLAuthStore for this WolfSSLContext.
* Used internally by SSLSocketFactory()
*
* @return WolfSSLAuthStore for this WolfSSLContext object
*/
protected WolfSSLAuthStore getInternalAuthStore() {
return this.authStore;
}
/**
* Get internal SSLParameters.
* Used internally by SSLSocketFactory()
*
* @return WolfSSLParameters for this WolfSSLContext object
*/
protected WolfSSLParameters getInternalSSLParams() {
return this.params;
}
/**
* Get internal com.wolfssl.WolfSSLContext for this object.
* Used internally by SSLSocketFactory()
*
* @return com.wolfssl.WolfSSLContext for this object
*/
protected com.wolfssl.WolfSSLContext getInternalWolfSSLContext() {
return this.ctx;
}
@SuppressWarnings({"deprecation", "removal"})
@Override
protected void finalize() throws Throwable {
if (this.ctx != null) {
this.ctx = null;
}
super.finalize();
}
/**
* Sets the WolfSSLContext options using specified protocol mask.
* Also translates the protocol mask provided to an array of Strings
* for the enabled SSL/TLS protocols.
*
* @param noOpt protocol mask set into native WOLFSSL_CTX
*
* @return String array of enabled SSL/TLS protocols for this
* WolfSSLContext object
*/
private String[] getProtocolsMask(long noOpt) {
if (ctx != null) {
ctx.setOptions(noOpt);
}
return WolfSSL.getProtocolsMask(noOpt);
}
/**
* SSLContext implementation supporting TLS 1.0
*/
public static final class TLSV1_Context extends WolfSSLContext {
/**
* Create new TLSv1_Context, calls parent WolfSSLContext constructor
*/
public TLSV1_Context() {
super(TLS_VERSION.TLSv1);
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating new WolfSSLContext using TLSV1_Context");
}
}
/**
* SSLContext implementation supporting TLS 1.1
*/
public static final class TLSV11_Context extends WolfSSLContext {
/**
* Create new TLSv11_Context, calls parent WolfSSLContext constructor
*/
public TLSV11_Context() {
super(TLS_VERSION.TLSv1_1);
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating new WolfSSLContext using TLSV11_Context");
}
}
/**
* SSLContext implementation supporting TLS 1.2
*/
public static final class TLSV12_Context extends WolfSSLContext {
/**
* Create new TLSv12_Context, calls parent WolfSSLContext constructor
*/
public TLSV12_Context() {
super(TLS_VERSION.TLSv1_2);
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating new WolfSSLContext using TLSV12_Context");
}
}
/**
* SSLContext implementation supporting TLS 1.3
*/
public static final class TLSV13_Context extends WolfSSLContext {
/**
* Create new TLSv13_Context, calls parent WolfSSLContext constructor
*/
public TLSV13_Context() {
super(TLS_VERSION.TLSv1_3);
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating new WolfSSLContext using TLSV13_Context");
}
}
/**
* TLSv23 SSLContext class.
* Created using SSLv23 method, supporting highest protocol enabled
* in native wolfSSL. Downgrades to native minimum downgrade level.
*/
public static final class TLSV23_Context extends WolfSSLContext {
/**
* Create new TLSv23_Context, calls parent WolfSSLContext constructor
*/
public TLSV23_Context() {
super(TLS_VERSION.SSLv23);
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating new WolfSSLContext using TLSV23_Context");
}
}
/**
* SSLContext implementation supporting DTLS 1.3
*/
public static final class DTLSV13_Context extends WolfSSLContext {
/**
* Create new DTLSv13_Context, calls parent WolfSSLContext constructor
*/
public DTLSV13_Context() {
super(TLS_VERSION.DTLSv1_3);
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating new WolfSSLContext using DTLSV13_Context");
}
}
/**
* DEFAULT SSLContext class.
* Created using SSLv23 method, supporting highest protocol enabled
* in native wolfSSL. Downgrades to native minimum downgrade level.
*/
public static final class DEFAULT_Context extends WolfSSLContext {
/**
* Create new DEFAULT_Context, calls parent WolfSSLContext constructor
* with TLS_VERSION.SSLv23
*
* @throws IllegalStateException when engine init fails
*/
public DEFAULT_Context() {
super(TLS_VERSION.SSLv23);
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
() -> "creating new WolfSSLContext using DEFAULT_Context");
try {
this.engineInit(null, null, null);
} catch (Exception e) {
throw new IllegalStateException("wolfSSL engine init failed");
}
}
}
}