Blame SOURCES/0006-Check-for-the-specific-in-use-version-of-OpenSSL-whe.patch

a359fa
From dfa0c242cd9b329554971cf80c094e8f58d756e3 Mon Sep 17 00:00:00 2001
a359fa
From: Jeremy Barton <jbarton@microsoft.com>
a359fa
Date: Wed, 26 Sep 2018 15:35:35 -0700
a359fa
Subject: [PATCH 6/7] Check for the specific in-use version of OpenSSL when
a359fa
 working with libcurl
a359fa
a359fa
Rather than check a generic 1.0/1.1, test for the specific library version that
a359fa
the crypto shim has loaded.  This makes things work when both libcurl
a359fa
and the crypto shim are using OpenSSL 1.1 and also prevents a state where two
a359fa
different copies of the library (at different patch versions) are utilized.
a359fa
---
a359fa
 .../Interop.Initialization.cs                 |  8 +--
a359fa
 .../Interop.VersionInfo.cs                    | 44 +++++++++++-
a359fa
 .../Interop.OpenSslVersion.cs                 |  2 +-
a359fa
 .../src/System.Net.Http.csproj                |  3 +
a359fa
 .../CurlHandler.SslProvider.Linux.cs          |  8 +--
a359fa
 .../FunctionalTests/HttpClientEKUTest.cs      |  2 +-
a359fa
 ...ttpClientHandlerTest.ClientCertificates.cs | 14 +---
a359fa
 ...ientHandlerTest.ServerCertificates.Unix.cs |  9 +--
a359fa
 ...HttpClientHandlerTest.SslProtocols.Unix.cs |  3 +-
a359fa
 .../System.Net.Http.Functional.Tests.csproj   |  3 +-
a359fa
 .../tests/FunctionalTests/TestHelper.cs       | 69 +++++++++++++++++++
a359fa
 11 files changed, 130 insertions(+), 35 deletions(-)
a359fa
a359fa
diff --git a/src/Common/src/Interop/Unix/System.Net.Http.Native/Interop.Initialization.cs b/src/Common/src/Interop/Unix/System.Net.Http.Native/Interop.Initialization.cs
a359fa
index eef56ec0b3..d6bcc8df02 100644
a359fa
--- a/src/Common/src/Interop/Unix/System.Net.Http.Native/Interop.Initialization.cs
a359fa
+++ b/src/Common/src/Interop/Unix/System.Net.Http.Native/Interop.Initialization.cs
a359fa
@@ -26,11 +26,11 @@ internal static partial class Interop
a359fa
 #if !SYSNETHTTP_NO_OPENSSL
a359fa
             string opensslVersion = Interop.Http.GetSslVersionDescription();
a359fa
             if (string.IsNullOrEmpty(opensslVersion) ||
a359fa
-                opensslVersion.IndexOf(Interop.Http.OpenSsl10Description, StringComparison.OrdinalIgnoreCase) != -1)
a359fa
+                opensslVersion.IndexOf(Interop.Http.OpenSslDescriptionPrefix, StringComparison.OrdinalIgnoreCase) != -1)
a359fa
             {
a359fa
-                // CURL uses OpenSSL which we must initialize first to guarantee thread-safety
a359fa
-                // Only initialize for OpenSSL/1.0, any newer versions may have mismatched
a359fa
-                // pointers, resulting in segfaults.
a359fa
+                // CURL uses OpenSSL which we must initialize first to guarantee thread-safety.
a359fa
+                // We'll wake up whatever OpenSSL we're going to run against, but might later determine that
a359fa
+                // they aren't compatible.
a359fa
                 CryptoInitializer.Initialize();
a359fa
             }
a359fa
 #endif
a359fa
diff --git a/src/Common/src/Interop/Unix/System.Net.Http.Native/Interop.VersionInfo.cs b/src/Common/src/Interop/Unix/System.Net.Http.Native/Interop.VersionInfo.cs
a359fa
index 1899fd0af3..8175159b6f 100644
a359fa
--- a/src/Common/src/Interop/Unix/System.Net.Http.Native/Interop.VersionInfo.cs
a359fa
+++ b/src/Common/src/Interop/Unix/System.Net.Http.Native/Interop.VersionInfo.cs
a359fa
@@ -3,6 +3,7 @@
a359fa
 // See the LICENSE file in the project root for more information.
a359fa
 
a359fa
 using System;
a359fa
+using System.Diagnostics;
a359fa
 using System.Runtime.InteropServices;
a359fa
 
a359fa
 internal static partial class Interop
a359fa
@@ -47,8 +48,49 @@ internal static partial class Interop
a359fa
         [DllImport(Libraries.HttpNative, EntryPoint = "HttpNative_GetSslVersionDescription")]
a359fa
         internal static extern string GetSslVersionDescription();
a359fa
 
a359fa
-        internal const string OpenSsl10Description = "openssl/1.0";
a359fa
+        internal const string OpenSslDescriptionPrefix = "OpenSSL/";
a359fa
         internal const string SecureTransportDescription = "SecureTransport";
a359fa
         internal const string LibreSslDescription = "LibreSSL";
a359fa
+
a359fa
+#if !SYSNETHTTP_NO_OPENSSL
a359fa
+        private static readonly Lazy<string> s_requiredOpenSslDescription =
a359fa
+            new Lazy<string>(() => DetermineRequiredOpenSslDescription());
a359fa
+
a359fa
+        private static readonly Lazy<bool> s_hasMatchingOpenSsl =
a359fa
+            new Lazy<bool>(() => RequiredOpenSslDescription == GetSslVersionDescription());
a359fa
+
a359fa
+        internal static string RequiredOpenSslDescription => s_requiredOpenSslDescription.Value;
a359fa
+        internal static bool HasMatchingOpenSslVersion => s_hasMatchingOpenSsl.Value;
a359fa
+
a359fa
+        private static string DetermineRequiredOpenSslDescription()
a359fa
+        {
a359fa
+            string versionDescription = Interop.OpenSsl.OpenSslVersionDescription();
a359fa
+            var version = versionDescription.AsSpan();
a359fa
+
a359fa
+            // OpenSSL version description looks like this:
a359fa
+            //
a359fa
+            // OpenSSL 1.1.1 FIPS  11 Sep 2018
a359fa
+            //
a359fa
+            // libcurl's OpenSSL vtls backend ignores status in the version string.
a359fa
+            // Major, minor, and fix are encoded (by libcurl) as unpadded hex
a359fa
+            // (0 => "0", 15 => "f", 16 => "10").
a359fa
+            //
a359fa
+            // Patch is encoded as in the way OpenSSL would do it.
a359fa
+
a359fa
+            string prefix = "OpenSSL ";
a359fa
+            if (version.StartsWith(prefix))
a359fa
+            {
a359fa
+                version = version.Slice(prefix.Length).Trim();
a359fa
+            }
a359fa
+            int end = version.IndexOf(" ");
a359fa
+            if (end != -1)
a359fa
+            {
a359fa
+                version = version.Slice(0, end);
a359fa
+            }
a359fa
+            version = version.Trim();
a359fa
+
a359fa
+            return $"{OpenSslDescriptionPrefix}{version.ToString()}";
a359fa
+        }
a359fa
+#endif
a359fa
     }
a359fa
 }
a359fa
diff --git a/src/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.OpenSslVersion.cs b/src/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.OpenSslVersion.cs
a359fa
index 70805706ef..13c2339ce6 100644
a359fa
--- a/src/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.OpenSslVersion.cs
a359fa
+++ b/src/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.OpenSslVersion.cs
a359fa
@@ -12,7 +12,7 @@ internal static partial class Interop
a359fa
         private static Version s_opensslVersion;
a359fa
 
a359fa
         [DllImport(Libraries.CryptoNative, EntryPoint = "CryptoNative_SSLEayVersion")]
a359fa
-        private static extern string OpenSslVersionDescription();
a359fa
+        internal static extern string OpenSslVersionDescription();
a359fa
 
a359fa
         internal static Version OpenSslVersion
a359fa
         {
a359fa
diff --git a/src/System.Net.Http/src/System.Net.Http.csproj b/src/System.Net.Http/src/System.Net.Http.csproj
a359fa
index 66e5b8d5f8..34b4d22e15 100644
a359fa
--- a/src/System.Net.Http/src/System.Net.Http.csproj
a359fa
+++ b/src/System.Net.Http/src/System.Net.Http.csproj
a359fa
@@ -500,6 +500,9 @@
a359fa
     <Compile Include="$(CommonPath)\Interop\Unix\System.Security.Cryptography.Native\Interop.Crypto.cs">
a359fa
       <Link>Common\Interop\Unix\System.Security.Cryptography.Native\Interop.Crypto.cs</Link>
a359fa
     </Compile>
a359fa
+    <Compile Include="$(CommonPath)\Interop\Unix\System.Security.Cryptography.Native\Interop.OpenSslVersion.cs">
a359fa
+      <Link>Common\Interop\Unix\System.Security.Cryptography.Native\Interop.OpenSslVersion.cs</Link>
a359fa
+    </Compile>
a359fa
     <Compile Include="$(CommonPath)\Interop\Unix\System.Security.Cryptography.Native\Interop.Ssl.cs">
a359fa
       <Link>Common\Interop\Unix\System.Security.Cryptography.Native\Interop.Ssl.cs</Link>
a359fa
     </Compile>
a359fa
diff --git a/src/System.Net.Http/src/System/Net/Http/CurlHandler/CurlHandler.SslProvider.Linux.cs b/src/System.Net.Http/src/System/Net/Http/CurlHandler/CurlHandler.SslProvider.Linux.cs
a359fa
index 55e583e137..2fdcde686d 100644
a359fa
--- a/src/System.Net.Http/src/System/Net/Http/CurlHandler/CurlHandler.SslProvider.Linux.cs
a359fa
+++ b/src/System.Net.Http/src/System/Net/Http/CurlHandler/CurlHandler.SslProvider.Linux.cs
a359fa
@@ -55,7 +55,7 @@ namespace System.Net.Http
a359fa
 
a359fa
                 // Configure the options.  Our best support is when targeting OpenSSL/1.0.  For other backends,
a359fa
                 // we fall back to a minimal amount of support, and may throw a PNSE based on the options requested.
a359fa
-                if (CurlSslVersionDescription.IndexOf(Interop.Http.OpenSsl10Description, StringComparison.OrdinalIgnoreCase) != -1)
a359fa
+                if (Interop.Http.HasMatchingOpenSslVersion)
a359fa
                 {
a359fa
                     // Register the callback with libcurl.  We need to register even if there's no user-provided
a359fa
                     // server callback and even if there are no client certificates, because we support verifying
a359fa
@@ -169,12 +169,12 @@ namespace System.Net.Http
a359fa
             {
a359fa
                 if (certProvider != null)
a359fa
                 {
a359fa
-                    throw new PlatformNotSupportedException(SR.Format(SR.net_http_libcurl_clientcerts_notsupported_sslbackend, CurlVersionDescription, CurlSslVersionDescription, Interop.Http.OpenSsl10Description));
a359fa
+                    throw new PlatformNotSupportedException(SR.Format(SR.net_http_libcurl_clientcerts_notsupported_sslbackend, CurlVersionDescription, CurlSslVersionDescription, Interop.Http.RequiredOpenSslDescription));
a359fa
                 }
a359fa
 
a359fa
                 if (easy._handler.CheckCertificateRevocationList)
a359fa
                 {
a359fa
-                    throw new PlatformNotSupportedException(SR.Format(SR.net_http_libcurl_revocation_notsupported_sslbackend, CurlVersionDescription, CurlSslVersionDescription, Interop.Http.OpenSsl10Description));
a359fa
+                    throw new PlatformNotSupportedException(SR.Format(SR.net_http_libcurl_revocation_notsupported_sslbackend, CurlVersionDescription, CurlSslVersionDescription, Interop.Http.RequiredOpenSslDescription));
a359fa
                 }
a359fa
 
a359fa
                 if (easy._handler.ServerCertificateCustomValidationCallback != null)
a359fa
@@ -187,7 +187,7 @@ namespace System.Net.Http
a359fa
                     }
a359fa
                     else
a359fa
                     {
a359fa
-                        throw new PlatformNotSupportedException(SR.Format(SR.net_http_libcurl_callback_notsupported_sslbackend, CurlVersionDescription, CurlSslVersionDescription, Interop.Http.OpenSsl10Description));
a359fa
+                        throw new PlatformNotSupportedException(SR.Format(SR.net_http_libcurl_callback_notsupported_sslbackend, CurlVersionDescription, CurlSslVersionDescription, Interop.Http.RequiredOpenSslDescription));
a359fa
                     }
a359fa
                 }
a359fa
                 else
a359fa
diff --git a/src/System.Net.Http/tests/FunctionalTests/HttpClientEKUTest.cs b/src/System.Net.Http/tests/FunctionalTests/HttpClientEKUTest.cs
a359fa
index c6badc770e..9ac90390e3 100644
a359fa
--- a/src/System.Net.Http/tests/FunctionalTests/HttpClientEKUTest.cs
a359fa
+++ b/src/System.Net.Http/tests/FunctionalTests/HttpClientEKUTest.cs
a359fa
@@ -22,7 +22,7 @@ namespace System.Net.Http.Functional.Tests
a359fa
 #if TargetsWindows
a359fa
             true;
a359fa
 #else
a359fa
-            Interop.Http.GetSslVersionDescription()?.StartsWith(Interop.Http.OpenSsl10Description, StringComparison.OrdinalIgnoreCase) ?? false;
a359fa
+            TestHelper.NativeHandlerSupportsSslConfiguration();
a359fa
 #endif
a359fa
 
a359fa
         private static bool CanTestCertificates =>
a359fa
diff --git a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ClientCertificates.cs b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ClientCertificates.cs
a359fa
index 78d0fdb09f..217726db64 100644
a359fa
--- a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ClientCertificates.cs
a359fa
+++ b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ClientCertificates.cs
a359fa
@@ -319,19 +319,7 @@ namespace System.Net.Http.Functional.Tests
a359fa
 #if TargetsWindows
a359fa
                 return true;
a359fa
 #else
a359fa
-                if (UseSocketsHttpHandler)
a359fa
-                {
a359fa
-                    return true;
a359fa
-                }
a359fa
-
a359fa
-                if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
a359fa
-                {
a359fa
-                    return false;
a359fa
-                }
a359fa
-
a359fa
-                // For other Unix-based systems it's true if (and only if) the openssl backend
a359fa
-                // is used with libcurl.
a359fa
-                return (Interop.Http.GetSslVersionDescription()?.StartsWith(Interop.Http.OpenSsl10Description, StringComparison.OrdinalIgnoreCase) ?? false);
a359fa
+                return TestHelper.NativeHandlerSupportsSslConfiguration();
a359fa
 #endif
a359fa
             }
a359fa
         }
a359fa
diff --git a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ServerCertificates.Unix.cs b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ServerCertificates.Unix.cs
a359fa
index d19a63f598..eb38f93615 100644
a359fa
--- a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ServerCertificates.Unix.cs
a359fa
+++ b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ServerCertificates.Unix.cs
a359fa
@@ -58,14 +58,7 @@ namespace System.Net.Http.Functional.Tests
a359fa
                     return true;
a359fa
                 }
a359fa
 
a359fa
-                if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
a359fa
-                {
a359fa
-                    return false;
a359fa
-                }
a359fa
-
a359fa
-                // For other Unix-based systems it's true if (and only if) the openssl backend
a359fa
-                // is used with libcurl.
a359fa
-                return (Interop.Http.GetSslVersionDescription()?.StartsWith(Interop.Http.OpenSsl10Description, StringComparison.OrdinalIgnoreCase) ?? false);
a359fa
+                return TestHelper.NativeHandlerSupportsSslConfiguration();
a359fa
             }
a359fa
         }
a359fa
 
a359fa
diff --git a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.SslProtocols.Unix.cs b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.SslProtocols.Unix.cs
a359fa
index 615f2cb4fa..e7631e3940 100644
a359fa
--- a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.SslProtocols.Unix.cs
a359fa
+++ b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.SslProtocols.Unix.cs
a359fa
@@ -17,7 +17,6 @@ namespace System.Net.Http.Functional.Tests
a359fa
     public abstract partial class HttpClientHandler_SslProtocols_Test
a359fa
     {
a359fa
         private bool BackendSupportsSslConfiguration =>
a359fa
-            UseSocketsHttpHandler ||
a359fa
-            (Interop.Http.GetSslVersionDescription()?.StartsWith(Interop.Http.OpenSsl10Description, StringComparison.OrdinalIgnoreCase) ?? false);
a359fa
+            UseSocketsHttpHandler || TestHelper.NativeHandlerSupportsSslConfiguration();
a359fa
     }
a359fa
 }
a359fa
diff --git a/src/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj b/src/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj
a359fa
index 68c87c2b6e..b3b9d2437d 100644
a359fa
--- a/src/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj
a359fa
+++ b/src/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj
a359fa
@@ -5,6 +5,7 @@
a359fa
     <ProjectGuid>{C85CF035-7804-41FF-9557-48B7C948B58D}</ProjectGuid>
a359fa
     <DefineConstants Condition="'$(TargetGroup)'=='netcoreapp'">$(DefineConstants);netcoreapp</DefineConstants>
a359fa
     <DefineConstants Condition="'$(TargetsWindows)'=='true'">$(DefineConstants);TargetsWindows</DefineConstants>
a359fa
+    <DefineConstants>$(DefineConstants);SYSNETHTTP_NO_OPENSSL</DefineConstants>
a359fa
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
a359fa
   </PropertyGroup>
a359fa
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Unix-Debug|AnyCPU'" />
a359fa
@@ -169,4 +170,4 @@
a359fa
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
a359fa
   </ItemGroup>
a359fa
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
a359fa
-</Project>
a359fa
\ No newline at end of file
a359fa
+</Project>
a359fa
diff --git a/src/System.Net.Http/tests/FunctionalTests/TestHelper.cs b/src/System.Net.Http/tests/FunctionalTests/TestHelper.cs
a359fa
index 9bf6f216d1..2e29128a92 100644
a359fa
--- a/src/System.Net.Http/tests/FunctionalTests/TestHelper.cs
a359fa
+++ b/src/System.Net.Http/tests/FunctionalTests/TestHelper.cs
a359fa
@@ -6,6 +6,8 @@ using System.Collections.Generic;
a359fa
 using System.Linq;
a359fa
 using System.Net.NetworkInformation;
a359fa
 using System.Net.Security;
a359fa
+using System.Reflection;
a359fa
+using System.Runtime.InteropServices;
a359fa
 using System.Security.Cryptography;
a359fa
 using System.Security.Cryptography.X509Certificates;
a359fa
 using System.Text;
a359fa
@@ -107,5 +109,72 @@ namespace System.Net.Http.Functional.Tests
a359fa
                 .Select(a => a.Address)
a359fa
                 .Where(a => a.IsIPv6LinkLocal)
a359fa
                 .FirstOrDefault();
a359fa
+
a359fa
+        public static void EnsureHttp2Feature(HttpClientHandler handler)
a359fa
+        {
a359fa
+            // All .NET Core implementations of HttpClientHandler have HTTP/2 enabled by default except when using
a359fa
+            // SocketsHttpHandler. Right now, the HTTP/2 feature is disabled on SocketsHttpHandler unless certain
a359fa
+            // AppContext switches or environment variables are set. To help with testing, we can enable the HTTP/2
a359fa
+            // feature for a specific handler instance by using reflection.
a359fa
+            FieldInfo field_socketsHttpHandler = typeof(HttpClientHandler).GetField(
a359fa
+                "_socketsHttpHandler",
a359fa
+                BindingFlags.NonPublic | BindingFlags.Instance);
a359fa
+            if (field_socketsHttpHandler == null)
a359fa
+            {
a359fa
+                // Not using .NET Core implementation, i.e. could be .NET Framework or UAP.
a359fa
+                return;
a359fa
+            }
a359fa
+
a359fa
+            object _socketsHttpHandler = field_socketsHttpHandler.GetValue(handler);
a359fa
+            if (_socketsHttpHandler == null)
a359fa
+            {
a359fa
+                // Not using SocketsHttpHandler, i.e. using WinHttpHandler or CurlHandler.
a359fa
+                return;
a359fa
+            }
a359fa
+
a359fa
+            // Get HttpConnectionSettings object from SocketsHttpHandler.
a359fa
+            Type type_SocketsHttpHandler = typeof(HttpClientHandler).Assembly.GetType("System.Net.Http.SocketsHttpHandler");
a359fa
+            FieldInfo field_settings = type_SocketsHttpHandler.GetField(
a359fa
+                "_settings",
a359fa
+                BindingFlags.NonPublic | BindingFlags.Instance);
a359fa
+            Assert.NotNull(field_settings);
a359fa
+            object _settings = field_settings.GetValue(_socketsHttpHandler);
a359fa
+            Assert.NotNull(_settings);
a359fa
+
a359fa
+            // Set _maxHttpVersion field to HTTP/2.0.
a359fa
+            Type type_HttpConnectionSettings = typeof(HttpClientHandler).Assembly.GetType("System.Net.Http.HttpConnectionSettings");
a359fa
+            FieldInfo field_maxHttpVersion = type_HttpConnectionSettings.GetField(
a359fa
+                "_maxHttpVersion",
a359fa
+                BindingFlags.NonPublic | BindingFlags.Instance);
a359fa
+            field_maxHttpVersion.SetValue(_settings, new Version(2, 0));
a359fa
+        }
a359fa
+
a359fa
+        public static bool NativeHandlerSupportsSslConfiguration()
a359fa
+        {
a359fa
+#if TargetsWindows
a359fa
+            return true;
a359fa
+#else
a359fa
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
a359fa
+            {
a359fa
+                return false;
a359fa
+            }
a359fa
+
a359fa
+            // For other Unix-based systems it's true if (and only if) the currect openssl backend
a359fa
+            // is used with libcurl.
a359fa
+            bool hasAnyOpenSsl =
a359fa
+                Interop.Http.GetSslVersionDescription()?.StartsWith(Interop.Http.OpenSslDescriptionPrefix, StringComparison.OrdinalIgnoreCase) ?? false;
a359fa
+
a359fa
+            if (!hasAnyOpenSsl)
a359fa
+            {
a359fa
+                return false;
a359fa
+            }
a359fa
+
a359fa
+            // We're on an OpenSSL-based system, with an OpenSSL backend.
a359fa
+            // Ask the product how it feels about this.
a359fa
+            Type interopHttp = typeof(HttpClient).Assembly.GetType("Interop+Http");
a359fa
+            PropertyInfo hasMatchingOpenSslVersion = interopHttp.GetProperty("HasMatchingOpenSslVersion", BindingFlags.Static | BindingFlags.NonPublic);
a359fa
+            return (bool)hasMatchingOpenSslVersion.GetValue(null);
a359fa
+#endif
a359fa
+        }
a359fa
     }
a359fa
 }
a359fa
-- 
a359fa
2.20.1
a359fa