{
internal static partial class AndroidCrypto
{
+ private const int UNSUPPORTED_API_LEVEL = 2;
+
internal unsafe delegate PAL_SSLStreamStatus SSLReadCallback(byte* data, int* length);
internal unsafe delegate void SSLWriteCallback(byte* data, int length);
string targetHost)
{
int ret = SSLStreamSetTargetHostImpl(sslHandle, targetHost);
- if (ret != SUCCESS)
+ if (ret == UNSUPPORTED_API_LEVEL)
+ throw new PlatformNotSupportedException(SR.net_android_ssl_api_level_unsupported);
+ else if (ret != SUCCESS)
throw new SslException();
}
g_SSLParametersClass = GetClassGRef(env, "javax/net/ssl/SSLParameters");
g_SSLParametersGetProtocols = GetMethod(env, false, g_SSLParametersClass, "getProtocols", "()[Ljava/lang/String;");
g_SSLParametersSetApplicationProtocols = GetOptionalMethod(env, false, g_SSLParametersClass, "setApplicationProtocols", "([Ljava/lang/String;)V");
- g_SSLParametersSetServerNames = GetMethod(env, false, g_SSLParametersClass, "setServerNames", "(Ljava/util/List;)V");
g_sslCtxClass = GetClassGRef(env, "javax/net/ssl/SSLContext");
g_sslCtxGetDefaultMethod = GetMethod(env, true, g_sslCtxClass, "getDefault", "()Ljavax/net/ssl/SSLContext;");
g_KeyManagerFactoryInit = GetMethod(env, false, g_KeyManagerFactory, "init", "(Ljava/security/KeyStore;[C)V");
g_KeyManagerFactoryGetKeyManagers = GetMethod(env, false, g_KeyManagerFactory, "getKeyManagers", "()[Ljavax/net/ssl/KeyManager;");
- g_SNIHostName = GetClassGRef(env, "javax/net/ssl/SNIHostName");
- g_SNIHostNameCtor = GetMethod(env, false, g_SNIHostName, "<init>", "(Ljava/lang/String;)V");
+ // Supported on API Level 24 and above
+ g_SNIHostName = GetOptionalClassGRef(env, "javax/net/ssl/SNIHostName");
+ if (g_SNIHostName != NULL)
+ {
+ g_SNIHostNameCtor = GetMethod(env, false, g_SNIHostName, "<init>", "(Ljava/lang/String;)V");
+ g_SSLParametersSetServerNames = GetOptionalMethod(env, false, g_SSLParametersClass, "setServerNames", "(Ljava/util/List;)V");
+ }
g_SSLEngine = GetClassGRef(env, "javax/net/ssl/SSLEngine");
g_SSLEngineBeginHandshake = GetMethod(env, false, g_SSLEngine, "beginHandshake", "()V");