Skip to content

Commit d5f6805

Browse files
[release/7.0][Android] Fix SslStream on legacy Android API levels (#79280)
* [Android] Fix SslStream on APIs 21-23 (#78918) * [Android] Remove repeated calls to beginHandshake (#78849) Cleanup Revert some changes
1 parent 4fc39fe commit d5f6805

File tree

6 files changed

+178
-28
lines changed

6 files changed

+178
-28
lines changed

src/libraries/Common/src/Interop/Android/System.Security.Cryptography.Native.Android/Interop.Ssl.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,18 @@ private static unsafe partial int SSLStreamInitializeImpl(
5555
IntPtr managedContextHandle,
5656
delegate* unmanaged<IntPtr, byte*, int*, PAL_SSLStreamStatus> streamRead,
5757
delegate* unmanaged<IntPtr, byte*, int, void> streamWrite,
58-
int appBufferSize);
58+
int appBufferSize,
59+
[MarshalAs(UnmanagedType.LPUTF8Str)] string? peerHost);
5960
internal static unsafe void SSLStreamInitialize(
6061
SafeSslHandle sslHandle,
6162
bool isServer,
6263
IntPtr managedContextHandle,
6364
delegate* unmanaged<IntPtr, byte*, int*, PAL_SSLStreamStatus> streamRead,
6465
delegate* unmanaged<IntPtr, byte*, int, void> streamWrite,
65-
int appBufferSize)
66+
int appBufferSize,
67+
string? peerHost)
6668
{
67-
int ret = SSLStreamInitializeImpl(sslHandle, isServer, managedContextHandle, streamRead, streamWrite, appBufferSize);
69+
int ret = SSLStreamInitializeImpl(sslHandle, isServer, managedContextHandle, streamRead, streamWrite, appBufferSize, peerHost);
6870
if (ret != SUCCESS)
6971
throw new SslException();
7072
}

src/libraries/System.Net.Security/src/System/Net/Security/Pal.Android/SafeDeleteSslContext.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ private unsafe void InitializeSslContext(
221221
// Make sure the class instance is associated to the session and is provided
222222
// in the Read/Write callback connection parameter
223223
IntPtr managedContextHandle = GCHandle.ToIntPtr(GCHandle.Alloc(this, GCHandleType.Weak));
224-
Interop.AndroidCrypto.SSLStreamInitialize(handle, isServer, managedContextHandle, &ReadFromConnection, &WriteToConnection, InitialBufferSize);
224+
string? peerHost = !isServer && !string.IsNullOrEmpty(authOptions.TargetHost) ? authOptions.TargetHost : null;
225+
Interop.AndroidCrypto.SSLStreamInitialize(handle, isServer, managedContextHandle, &ReadFromConnection, &WriteToConnection, InitialBufferSize, peerHost);
225226

226227
if (authOptions.EnabledSslProtocols != SslProtocols.None)
227228
{

src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ jmethodID g_SSLParametersGetProtocols;
8383
jmethodID g_SSLParametersSetApplicationProtocols;
8484
jmethodID g_SSLParametersSetServerNames;
8585

86+
// com/android/org/conscrypt/OpenSSLEngineImpl
87+
jclass g_ConscryptOpenSSLEngineImplClass;
88+
jfieldID g_ConscryptOpenSSLEngineImplSslParametersField;
89+
90+
// com/android/org/conscrypt/SSLParametersImpl
91+
jclass g_ConscryptSSLParametersImplClass;
92+
jmethodID g_ConscryptSSLParametersImplSetUseSni;
93+
8694
// javax/net/ssl/SSLContext
8795
jclass g_sslCtxClass;
8896
jmethodID g_sslCtxGetDefaultMethod;
@@ -416,6 +424,7 @@ jmethodID g_SSLEngineBeginHandshake;
416424
jmethodID g_SSLEngineCloseOutbound;
417425
jmethodID g_SSLEngineGetApplicationProtocol;
418426
jmethodID g_SSLEngineGetHandshakeStatus;
427+
jmethodID g_SSLEngineGetHandshakeSession;
419428
jmethodID g_SSLEngineGetSession;
420429
jmethodID g_SSLEngineGetSSLParameters;
421430
jmethodID g_SSLEngineGetSupportedProtocols;
@@ -445,6 +454,7 @@ jmethodID g_SSLContextGetDefault;
445454
jmethodID g_SSLContextGetInstanceMethod;
446455
jmethodID g_SSLContextInitMethod;
447456
jmethodID g_SSLContextCreateSSLEngineMethod;
457+
jmethodID g_SSLContextCreateSSLEngineMethodWithHostAndPort;
448458

449459
// javax/net/ssl/SSLSession
450460
jclass g_SSLSession;
@@ -458,6 +468,7 @@ jmethodID g_SSLSessionGetProtocol;
458468
jclass g_SSLEngineResult;
459469
jmethodID g_SSLEngineResultGetStatus;
460470
jmethodID g_SSLEngineResultGetHandshakeStatus;
471+
bool g_SSLEngineResultStatusLegacyOrder;
461472

462473
// javax/crypto/KeyAgreement
463474
jclass g_KeyAgreementClass;
@@ -733,6 +744,15 @@ JNI_OnLoad(JavaVM *vm, void *reserved)
733744
g_SSLParametersGetProtocols = GetMethod(env, false, g_SSLParametersClass, "getProtocols", "()[Ljava/lang/String;");
734745
g_SSLParametersSetApplicationProtocols = GetOptionalMethod(env, false, g_SSLParametersClass, "setApplicationProtocols", "([Ljava/lang/String;)V");
735746

747+
g_ConscryptOpenSSLEngineImplClass = GetOptionalClassGRef(env, "com/android/org/conscrypt/OpenSSLEngineImpl");
748+
if (g_ConscryptOpenSSLEngineImplClass != NULL)
749+
{
750+
g_ConscryptOpenSSLEngineImplSslParametersField = GetField(env, false, g_ConscryptOpenSSLEngineImplClass, "sslParameters", "Lcom/android/org/conscrypt/SSLParametersImpl;");
751+
752+
g_ConscryptSSLParametersImplClass = GetClassGRef(env, "com/android/org/conscrypt/SSLParametersImpl");
753+
g_ConscryptSSLParametersImplSetUseSni = GetMethod(env, false, g_ConscryptSSLParametersImplClass, "setUseSni", "(Z)V");
754+
}
755+
736756
g_sslCtxClass = GetClassGRef(env, "javax/net/ssl/SSLContext");
737757
g_sslCtxGetDefaultMethod = GetMethod(env, true, g_sslCtxClass, "getDefault", "()Ljavax/net/ssl/SSLContext;");
738758
g_sslCtxGetDefaultSslParamsMethod = GetMethod(env, false, g_sslCtxClass, "getDefaultSSLParameters", "()Ljavax/net/ssl/SSLParameters;");
@@ -997,6 +1017,7 @@ JNI_OnLoad(JavaVM *vm, void *reserved)
9971017
g_SSLEngineGetApplicationProtocol = GetOptionalMethod(env, false, g_SSLEngine, "getApplicationProtocol", "()Ljava/lang/String;");
9981018
g_SSLEngineGetHandshakeStatus = GetMethod(env, false, g_SSLEngine, "getHandshakeStatus", "()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;");
9991019
g_SSLEngineGetSession = GetMethod(env, false, g_SSLEngine, "getSession", "()Ljavax/net/ssl/SSLSession;");
1020+
g_SSLEngineGetHandshakeSession = GetOptionalMethod(env, false, g_SSLEngine, "getHandshakeSession", "()Ljavax/net/ssl/SSLSession;");
10001021
g_SSLEngineGetSSLParameters = GetMethod(env, false, g_SSLEngine, "getSSLParameters", "()Ljavax/net/ssl/SSLParameters;");
10011022
g_SSLEngineGetSupportedProtocols = GetMethod(env, false, g_SSLEngine, "getSupportedProtocols", "()[Ljava/lang/String;");
10021023
g_SSLEngineSetEnabledProtocols = GetMethod(env, false, g_SSLEngine, "setEnabledProtocols", "([Ljava/lang/String;)V");
@@ -1023,6 +1044,7 @@ JNI_OnLoad(JavaVM *vm, void *reserved)
10231044
g_SSLContextGetInstanceMethod = GetMethod(env, true, g_SSLContext, "getInstance", "(Ljava/lang/String;)Ljavax/net/ssl/SSLContext;");
10241045
g_SSLContextInitMethod = GetMethod(env, false, g_SSLContext, "init", "([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;Ljava/security/SecureRandom;)V");
10251046
g_SSLContextCreateSSLEngineMethod = GetMethod(env, false, g_SSLContext, "createSSLEngine", "()Ljavax/net/ssl/SSLEngine;");
1047+
g_SSLContextCreateSSLEngineMethodWithHostAndPort = GetMethod(env, false, g_SSLContext, "createSSLEngine", "(Ljava/lang/String;I)Ljavax/net/ssl/SSLEngine;");
10261048

10271049
g_SSLSession = GetClassGRef(env, "javax/net/ssl/SSLSession");
10281050
g_SSLSessionGetApplicationBufferSize = GetMethod(env, false, g_SSLSession, "getApplicationBufferSize", "()I");
@@ -1034,6 +1056,7 @@ JNI_OnLoad(JavaVM *vm, void *reserved)
10341056
g_SSLEngineResult = GetClassGRef(env, "javax/net/ssl/SSLEngineResult");
10351057
g_SSLEngineResultGetStatus = GetMethod(env, false, g_SSLEngineResult, "getStatus", "()Ljavax/net/ssl/SSLEngineResult$Status;");
10361058
g_SSLEngineResultGetHandshakeStatus = GetMethod(env, false, g_SSLEngineResult, "getHandshakeStatus", "()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;");
1059+
g_SSLEngineResultStatusLegacyOrder = android_get_device_api_level() < 24;
10371060

10381061
g_KeyAgreementClass = GetClassGRef(env, "javax/crypto/KeyAgreement");
10391062
g_KeyAgreementGetInstance = GetMethod(env, true, g_KeyAgreementClass, "getInstance", "(Ljava/lang/String;)Ljavax/crypto/KeyAgreement;");

src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,14 @@ extern jmethodID g_SSLParametersGetProtocols;
9292
extern jmethodID g_SSLParametersSetApplicationProtocols;
9393
extern jmethodID g_SSLParametersSetServerNames;
9494

95+
// com/android/org/conscrypt/OpenSSLEngineImpl
96+
extern jclass g_ConscryptOpenSSLEngineImplClass;
97+
extern jfieldID g_ConscryptOpenSSLEngineImplSslParametersField;
98+
99+
// com/android/org/conscrypt/SSLParametersImpl
100+
extern jclass g_ConscryptSSLParametersImplClass;
101+
extern jmethodID g_ConscryptSSLParametersImplSetUseSni;
102+
95103
// javax/net/ssl/SSLContext
96104
extern jclass g_sslCtxClass;
97105
extern jmethodID g_sslCtxGetDefaultMethod;
@@ -430,6 +438,7 @@ extern jmethodID g_SSLEngineBeginHandshake;
430438
extern jmethodID g_SSLEngineCloseOutbound;
431439
extern jmethodID g_SSLEngineGetApplicationProtocol;
432440
extern jmethodID g_SSLEngineGetHandshakeStatus;
441+
extern jmethodID g_SSLEngineGetHandshakeSession;
433442
extern jmethodID g_SSLEngineGetSession;
434443
extern jmethodID g_SSLEngineGetSSLParameters;
435444
extern jmethodID g_SSLEngineGetSupportedProtocols;
@@ -459,7 +468,7 @@ extern jmethodID g_SSLContextGetDefault;
459468
extern jmethodID g_SSLContextGetInstanceMethod;
460469
extern jmethodID g_SSLContextInitMethod;
461470
extern jmethodID g_SSLContextCreateSSLEngineMethod;
462-
extern jmethodID g_SSLContextCreateSSLEngineWithPeer;
471+
extern jmethodID g_SSLContextCreateSSLEngineMethodWithHostAndPort;
463472

464473
// javax/net/ssl/SSLSession
465474
extern jclass g_SSLSession;
@@ -473,6 +482,7 @@ extern jmethodID g_SSLSessionGetProtocol;
473482
extern jclass g_SSLEngineResult;
474483
extern jmethodID g_SSLEngineResultGetStatus;
475484
extern jmethodID g_SSLEngineResultGetHandshakeStatus;
485+
extern bool g_SSLEngineResultStatusLegacyOrder;
476486

477487
// javax/crypto/KeyAgreement
478488
extern jclass g_KeyAgreementClass;

0 commit comments

Comments
 (0)