JNI/JSSE: wrap wolfSSL_DisableExtendedMasterSecret(), add support for System property jdk.tls.useExtendedMasterSecret

pull/254/head
Chris Conlon 2024-11-14 17:39:04 -07:00
parent 372ef97746
commit b00f14ebbb
9 changed files with 142 additions and 0 deletions

View File

@ -534,6 +534,11 @@ are enabled in different ways depending on the JDK implementation. For
Oracle/OpenJDK and variants, this System property enables session tickets and
was added in Java 13. Should be set to "true" to enable.
**jdk.tls.useExtendedMasterSecret (boolean)** - Can be used to enable or
disable the use of the Extended Master Secret (EMS) extension. This extension
is enabled by default, unless explicitly disabled by setting this property to
false.
**wolfjsse.autoSNI (boolean)** - Controls automatic Server Name Indication (SNI)
extension setting based on hostname or peer address. When set to "true", enables
legacy behavior where SNI is automatically configured from hostname/peer information

View File

@ -1995,6 +1995,19 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_isEnabledPKCallbacks
#endif
}
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_isEnabledTLSExtendedMasterSecret
(JNIEnv* jenv, jclass jcl)
{
(void)jenv;
(void)jcl;
#if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
return 1;
#else
return 0;
#endif
}
JNIEXPORT jobjectArray JNICALL Java_com_wolfssl_WolfSSL_getProtocols
(JNIEnv* jenv, jclass jcl)
{

View File

@ -1113,6 +1113,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_isEnabledAtomicUser
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_isEnabledPKCallbacks
(JNIEnv *, jclass);
/*
* Class: com_wolfssl_WolfSSL
* Method: isEnabledTLSExtendedMasterSecret
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_isEnabledTLSExtendedMasterSecret
(JNIEnv *, jclass);
/*
* Class: com_wolfssl_WolfSSL
* Method: getProtocols

View File

@ -5765,6 +5765,26 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_useSupportedCurve
#endif
}
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_disableExtendedMasterSecret
(JNIEnv* jenv, jobject jcl, jlong sslPtr)
{
#if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
int ret = 0;
WOLFSSL* ssl = (WOLFSSL*)(uintptr_t)sslPtr;
(void)jcl;
/* Checks ssl for null internally */
ret = wolfSSL_DisableExtendedMasterSecret(ssl);
return (jint)ret;
#else
(void)jenv;
(void)jcl;
(void)sslPtr;
return (jint)NOT_COMPILED_IN;
#endif
}
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_hasTicket
(JNIEnv* jenv, jobject jcl, jlong sessionPtr)
{

View File

@ -887,6 +887,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_set1SigAlgsList
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_useSupportedCurve
(JNIEnv *, jobject, jlong, jint);
/*
* Class: com_wolfssl_WolfSSLSession
* Method: disableExtendedMasterSecret
* Signature: (J)I
*/
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_disableExtendedMasterSecret
(JNIEnv *, jobject, jlong);
/*
* Class: com_wolfssl_WolfSSLSession
* Method: hasTicket

View File

@ -1662,6 +1662,14 @@ public class WolfSSL {
*/
public static native int isEnabledPKCallbacks();
/**
* Checks if TLS Extended Master Secret support has been compiled into
* native wolfSSL library.
*
* @return 1 if available, 0 if not compiled in.
*/
public static native int isEnabledTLSExtendedMasterSecret();
/**
* Checks which protocols where built into wolfSSL
*

View File

@ -418,6 +418,7 @@ public class WolfSSLSession {
private native int rehandshake(long ssl);
private native int set1SigAlgsList(long ssl, String list);
private native int useSupportedCurve(long ssl, int name);
private native int disableExtendedMasterSecret(long ssl);
private native int hasTicket(long session);
private native int interruptBlockedIO(long ssl);
private native int getThreadsBlockedInPoll(long ssl);
@ -2241,6 +2242,23 @@ public class WolfSSLSession {
return ret;
}
/**
* Disable TLS Extended Master Secret usage.
*
* @return <code>WolfSSL.SSL_SUCCESS</code> on success, otherwise
* negative on error.
* @throws IllegalStateException WolfSSLSession has been freed
*/
public int disableExtendedMasterSecret()
throws IllegalStateException {
confirmObjectIsActive();
synchronized (sslLock) {
return disableExtendedMasterSecret(this.sslPtr);
}
}
/* ---------------- Nonblocking DTLS helper functions -------------- */
/**

View File

@ -1176,6 +1176,38 @@ public class WolfSSLEngineHelper {
}
}
private void setLocalExtendedMasterSecret() {
/* Native wolfSSL enables TLS Extended Master Secret by default.
* Check the Java System property (jdk.tls.useExtendedMasterSecret)
* to see if the user has explicitly disabled it. */
int ret;
boolean useEMS = WolfSSLUtil.useExtendedMasterSecret();
if (!useEMS) {
ret = this.ssl.disableExtendedMasterSecret();
if (ret == WolfSSL.SSL_SUCCESS) {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
"TLS Extended Master Secret disabled due to " +
"jdk.tls.useExtendedMasterSecret System property");
}
else {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
"Failed to disable TLS Extended Master Secret, " +
"ret = " + ret);
}
}
else {
if (WolfSSL.isEnabledTLSExtendedMasterSecret() == 1) {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
"using TLS Extended Master Secret");
}
else {
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
"not using TLS Extended Master Secret, not compiled in");
}
}
}
private void setLocalParams(SSLSocket socket, SSLEngine engine)
throws SSLException {
@ -1192,6 +1224,7 @@ public class WolfSSLEngineHelper {
this.setLocalSigAlgorithms();
this.setLocalSupportedCurves();
this.setLocalMaximumPacketSize();
this.setLocalExtendedMasterSecret();
}
/**

View File

@ -286,6 +286,35 @@ public class WolfSSLUtil {
return false;
}
/**
* Return if TLS Extended Master Secret support has been enabled or
* disabled via the following System property:
*
* jdk.tls.useExtendedMasterSecret
*
* If property is not set (null) or an empty string, we default to
* leaving TLS Extended Master Secret enabled.
*
* @return true if enabled, otherwise false
*/
protected static boolean useExtendedMasterSecret() {
String useEMS =
System.getProperty("jdk.tls.useExtendedMasterSecret");
/* Native wolfSSL defaults to having extended master secret support
* enabled. Do the same here if property not set or empty. */
if (useEMS == null || useEMS.isEmpty()) {
return true;
}
if (useEMS.equalsIgnoreCase("false")) {
return false;
}
return true;
}
/**
* Check given KeyStore against any pre-defind requirements for
* KeyStore use, including the following.