Skip to content

Commit 5ae17d8

Browse files
author
Lakshmi Priya Sekar
committed
Add logic to skip alpn tests where unsupported.
1 parent eb0d438 commit 5ae17d8

File tree

4 files changed

+85
-10
lines changed

4 files changed

+85
-10
lines changed

src/Native/Unix/System.Security.Cryptography.Native/openssl.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,3 +1389,18 @@ extern "C" int32_t CryptoNative_EnsureOpenSslInitialized()
13891389
pthread_mutex_unlock(&g_initLock);
13901390
return ret;
13911391
}
1392+
1393+
/*
1394+
Function:
1395+
SSLEayVersion
1396+
1397+
Gets the version of openssl library.
1398+
1399+
Return values:
1400+
Textual description of the version on success.
1401+
"not available" string on failure.
1402+
*/
1403+
extern "C" char* CryptoNative_SSLEayVersion()
1404+
{
1405+
return strdup(SSLeay_version(SSLEAY_VERSION));
1406+
}

src/Native/Unix/System.Security.Cryptography.Native/opensslshim.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <openssl/asn1.h>
1515
#include <openssl/bio.h>
1616
#include <openssl/bn.h>
17+
#include <openssl/crypto.h>
1718
#include <openssl/dsa.h>
1819
#include <openssl/ecdsa.h>
1920
#include <openssl/ec.h>
@@ -297,6 +298,7 @@ void SSL_get0_alpn_selected(const SSL* ssl, const unsigned char** protocol, unsi
297298
PER_FUNCTION_BLOCK(SSL_set_connect_state, true) \
298299
PER_FUNCTION_BLOCK(SSL_shutdown, true) \
299300
PER_FUNCTION_BLOCK(SSL_state, true) \
301+
PER_FUNCTION_BLOCK(SSLeay_version, true) \
300302
PER_FUNCTION_BLOCK(SSLv23_method, true) \
301303
PER_FUNCTION_BLOCK(SSL_write, true) \
302304
PER_FUNCTION_BLOCK(TLSv1_1_method, true) \
@@ -590,6 +592,7 @@ FOR_ALL_OPENSSL_FUNCTIONS
590592
#define SSL_set_connect_state SSL_set_connect_state_ptr
591593
#define SSL_shutdown SSL_shutdown_ptr
592594
#define SSL_state SSL_state_ptr
595+
#define SSLeay_version SSLeay_version_ptr
593596
#define SSLv23_method SSLv23_method_ptr
594597
#define SSL_write SSL_write_ptr
595598
#define TLSv1_1_method TLSv1_1_method_ptr

src/System.Net.Security/tests/FunctionalTests/SslStreamAlpnTests.cs

Lines changed: 64 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,68 @@ namespace System.Net.Security.Tests
2020
{
2121
using Configuration = System.Net.Test.Common.Configuration;
2222

23+
#if TargetsLinux
24+
internal static class OpenSslVersionProvider
25+
{
26+
private static string s_opensslVersion;
27+
28+
[DllImport("System.Security.Cryptography.Native.OpenSsl", EntryPoint = "CryptoNative_SSLEayVersion")]
29+
private static extern string OpenSslVersionDescription();
30+
31+
private static string OpenSslVersionNumber
32+
{
33+
get
34+
{
35+
if (s_opensslVersion == null)
36+
{
37+
const string OpenSSL = "OpenSSL ";
38+
39+
// Skip OpenSSL part, and get the version string of format x.y.z
40+
s_opensslVersion = OpenSslVersionDescription().Substring(OpenSSL.Length, 5);
41+
}
42+
43+
return s_opensslVersion;
44+
}
45+
}
46+
47+
internal static int MajorVersion
48+
{
49+
get
50+
{
51+
int digit = OpenSslVersionNumber[0] - '0';
52+
return (digit >= 0 && digit <= 9) ? digit : -1;
53+
}
54+
}
55+
56+
internal static int MinorVersion
57+
{
58+
get
59+
{
60+
int digit = OpenSslVersionNumber[2] - '0';
61+
return (digit >= 0 && digit <= 9) ? digit : -1;
62+
}
63+
}
64+
65+
internal static int BuildVersion
66+
{
67+
get
68+
{
69+
int digit = OpenSslVersionNumber[4] - '0';
70+
return (digit >= 0 && digit <= 9) ? digit : -1;
71+
}
72+
}
73+
}
74+
#endif
75+
2376
public class SslStreamAlpnTests
2477
{
78+
private static bool BackendSupportsAlpn =>
79+
#if TargetsLinux
80+
OpenSslVersionProvider.MajorVersion >= 1 && (OpenSslVersionProvider.MinorVersion >= 1 || OpenSslVersionProvider.BuildVersion >= 2);
81+
#else
82+
PlatformDetection.IsWindows && !PlatformDetection.IsWindows7;
83+
#endif
84+
2585
private async Task DoHandshakeWithOptions(SslStream clientSslStream, SslStream serverSslStream, SslClientAuthenticationOptions clientOptions, SslServerAuthenticationOptions serverOptions)
2686
{
2787
using (X509Certificate2 certificate = Configuration.Certificates.GetServerCertificate())
@@ -147,8 +207,7 @@ public async Task SslStream_StreamToStream_Alpn_NonMatchingProtocols_Fail()
147207
};
148208

149209
// Test alpn failure only on platforms that supports ALPN.
150-
if ((RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && !(PlatformDetection.IsUbuntu1404 || PlatformDetection.IsDebian8 || PlatformDetection.IsCentos6)) ||
151-
(PlatformDetection.IsWindows && !PlatformDetection.IsWindows7))
210+
if (BackendSupportsAlpn)
152211
{
153212
Task t1 = Assert.ThrowsAsync<IOException>(() => clientStream.AuthenticateAsClientAsync(clientOptions, CancellationToken.None));
154213
try
@@ -193,14 +252,9 @@ internal static IEnumerable<object[]> Alpn_TestData()
193252
}
194253
else
195254
{
196-
// Works on linux distros with openssl 1.0.2, CI machines Ubuntu14.04 and Debian 87 don't have openssl 1.0.2
197-
// Works on Windows OSes > 7.0
198-
bool featureWorks = (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && !(PlatformDetection.IsUbuntu1404 || PlatformDetection.IsDebian8 || PlatformDetection.IsCentos6)) ||
199-
(PlatformDetection.IsWindows && !PlatformDetection.IsWindows7);
200-
201-
yield return new object[] { new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, new List<SslApplicationProtocol> { SslApplicationProtocol.Http2 }, featureWorks ? SslApplicationProtocol.Http2 : default };
202-
yield return new object[] { new List<SslApplicationProtocol> { SslApplicationProtocol.Http11 }, new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, featureWorks ? SslApplicationProtocol.Http11 : default };
203-
yield return new object[] { new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, featureWorks ? SslApplicationProtocol.Http11 : default };
255+
yield return new object[] { new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, new List<SslApplicationProtocol> { SslApplicationProtocol.Http2 }, BackendSupportsAlpn ? SslApplicationProtocol.Http2 : default };
256+
yield return new object[] { new List<SslApplicationProtocol> { SslApplicationProtocol.Http11 }, new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, BackendSupportsAlpn ? SslApplicationProtocol.Http11 : default };
257+
yield return new object[] { new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, BackendSupportsAlpn ? SslApplicationProtocol.Http11 : default };
204258
yield return new object[] { null, new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, default(SslApplicationProtocol) };
205259
yield return new object[] { new List<SslApplicationProtocol> { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, null, default(SslApplicationProtocol) };
206260
yield return new object[] { null, null, default(SslApplicationProtocol) };

src/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
<PropertyGroup Condition=" '$(TargetsUnix)' == 'true' ">
88
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
99
</PropertyGroup>
10+
<PropertyGroup Condition=" '$(TargetsLinux)' == 'true'">
11+
<DefineConstants>TargetsLinux</DefineConstants>
12+
</PropertyGroup>
1013
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='netstandard-Unix-Debug|AnyCPU'" />
1114
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='netstandard-Unix-Release|AnyCPU'" />
1215
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='netstandard-Windows_NT-Debug|AnyCPU'" />

0 commit comments

Comments
 (0)