Include support for SSL/TLS right in System when building for the MONODROID profile
authorMarek Habersack <grendel@twistedcode.net>
Fri, 25 Apr 2014 13:20:38 +0000 (15:20 +0200)
committerMarek Habersack <grendel@twistedcode.net>
Fri, 25 Apr 2014 19:39:53 +0000 (21:39 +0200)
This patch builds upon commit 96a8500795960ae1d9e81e28095c3e2dda303342 which placed parts of Mono.Security
responsible for dealing with SSL/TLS certificates for the purpose of certificate verification. The code enables
validation of the certifcates even if the user does not provide their own validation callback. The changes as related to
the original commit are few, basically consisting of enabling the same code used by MonoTouch in the MonoDroid context with
the only actual code change being the certificate validation bit mentioned above.

Since the change involves adding a subset of Mono.Security files to the monodroid version of System.dll, it is
also necessary to remove Mono.Android's dependence on Mono.Security.dll. The reason is that the code in AndroidPlatform
which looks up TLS support methods in Mono.Android.dll would use a type (X509CertificateCollection) that is now part of
System.dll but is *also* in Mono.Security.dll referenced by Mono.Android.dll and therefore the lookup would fail since
we'd have two distinct types from the reflection point of view.

Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=18962

24 files changed:
mcs/class/System/Makefile
mcs/class/System/Mono.Http/NtlmClient.cs
mcs/class/System/System.Net.Mail/SmtpClient.cs
mcs/class/System/System.Net.Security/LocalCertificateSelectionCallback.cs
mcs/class/System/System.Net.Security/SslStream.cs
mcs/class/System/System.Net/EndPointListener.cs
mcs/class/System/System.Net/HttpConnection.cs
mcs/class/System/System.Net/HttpListenerRequest.cs
mcs/class/System/System.Net/ServicePointManager.cs
mcs/class/System/System.Net/WebConnection.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/OSX509Certificates.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/PublicKey.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X500DistinguishedName.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509BasicConstraintsExtension.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509Certificate2.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509Chain.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509EnhancedKeyUsageExtension.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509ExtensionCollection.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509KeyUsageExtension.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509Store.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509SubjectKeyIdentifierExtension.cs
mcs/class/System/System.Security.Cryptography/AsnEncodedData.cs
mcs/class/System/System/AndroidPlatform.cs
mcs/class/System/monodroid_System.dll.sources

index 0e34423bf6424d4e4aafe67923e067d661382b4e..bbcea7d226aa22ce71503676cdb95a0ff4a0404b 100644 (file)
@@ -27,7 +27,7 @@ ifneq (1, $(FRAMEWORK_VERSION_MAJOR))
 LIB_MCS_FLAGS = -nowarn:618 -d:CONFIGURATION_2_0 -unsafe $(RESOURCE_FILES:%=-resource:%)
 TEST_MCS_FLAGS += -r:System.Configuration
 PROFILE_ANY_MOBILE := $(filter monotouch monotouch_runtime monodroid xammac, $(PROFILE))
-NOT_SL := $(filter net_2_0 net_4_0 net_4_5 monotouch_runtime monodroid mobile xammac, $(PROFILE))
+NOT_SL := $(filter net_2_0 net_4_0 net_4_5 monotouch_runtime mobile xammac, $(PROFILE))
 endif
 ifeq (2.1, $(FRAMEWORK_VERSION))
 LIB_MCS_FLAGS += -d:INSIDE_SYSTEM
@@ -38,6 +38,9 @@ endif
 ifeq (monotouch, $(subst _runtime,,$(PROFILE)))
 LIB_MCS_FLAGS += -d:SECURITY_DEP
 endif
+ifeq (monodroid, $(PROFILE))
+LIB_MCS_FLAGS += -d:SECURITY_DEP
+endif
 
 EXTRA_DISTFILES = \
        System.Text.RegularExpressions/notes.txt        \
index 0eb2c4aea2ef2c3b12fce8fe53ae6b6405474faf..54e85db013edb1ab9dc4d3c2fa9ebb1a8b601a2c 100644 (file)
@@ -30,7 +30,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security.Protocol.Ntlm;
 #else
 extern alias MonoSecurity;
index 5b496e14ce55587de1c814557d30cfd9afce411c..75ca20f231e3fc77ca208f7aef0f1ce15a42647b 100644 (file)
@@ -30,7 +30,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using System.Security.Cryptography.X509Certificates;
 #else
 extern alias PrebuiltSystem;
index 0cbf96fda2f404cfe61dfc0c125abc5dbe4077dd..53c829076ebe2c3af1ec7b3532b59b46a1ad8dc3 100644 (file)
@@ -31,8 +31,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
-#else
+#if !MONOTOUCH && !MONODROID
 extern alias PrebuiltSystem;
 using X509CertificateCollection = PrebuiltSystem::System.Security.Cryptography.X509Certificates.X509CertificateCollection;
 #endif
index 331d4cb8045f275f588859fd6cb08e9a1ad66516..0f3f7fd25463f9e8a121291899af6cdbc4bfaa70 100644 (file)
@@ -34,7 +34,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security.Protocol.Tls;
 
 using CipherAlgorithmType = System.Security.Authentication.CipherAlgorithmType;
@@ -367,12 +367,15 @@ namespace System.Net.Security
                                return null;
                        };
 
-                       if (validation_callback != null) {
-#if MONOTOUCH
-                               var helper = new ServicePointManager.ChainValidationHelper (this, targetHost);
-                               helper.ServerCertificateValidationCallback = validation_callback;
-                               s.ServerCertValidation2 += new CertificateValidationCallback2 (helper.ValidateChain);
+#if MONOTOUCH || MONODROID
+                       // Even if validation_callback is null this allows us to verify requests where the user
+                       // does not provide a verification callback but attempts to authenticate with the website
+                       // as a client (see https://bugzilla.xamarin.com/show_bug.cgi?id=18962 for an example)
+                       var helper = new ServicePointManager.ChainValidationHelper (this, targetHost);
+                       helper.ServerCertificateValidationCallback = validation_callback;
+                       s.ServerCertValidation2 += new CertificateValidationCallback2 (helper.ValidateChain);
 #else
+                       if (validation_callback != null) {
                                s.ServerCertValidationDelegate = delegate (X509Certificate cert, int [] certErrors) {
                                        X509Chain chain = new X509Chain ();
                                        X509Certificate2 x2 = (cert as X509Certificate2);
@@ -412,8 +415,8 @@ namespace System.Net.Security
 
                                        return validation_callback (this, cert, chain, errors);
                                };
-#endif
                        }
+#endif
                        if (selection_callback != null)
                                s.ClientCertSelectionDelegate = OnCertificateSelection;
 
index 909101100999098d3e2f99bff94e6306de28fcf3..9e2117625c615c066dcb14c1001652246f7eccfa 100644 (file)
@@ -29,7 +29,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security.Authenticode;
 #else
 extern alias MonoSecurity;
index 33080c2d77b9a1d463c3e3f61bbb4a0ff4eef9fd..263bfcd65f78ebb748764e7e9718ae6a2a65b7c4 100644 (file)
@@ -29,7 +29,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security.Protocol.Tls;
 #else
 extern alias MonoSecurity;
index c72d21d1d82f3c44e19c7f9d381d434336cc33aa..23a17199bf93557fdfe2bf7ff38a75476658c2f0 100644 (file)
@@ -30,7 +30,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security.Protocol.Tls;
 #else
 extern alias MonoSecurity;
index ba9e9dc8750b80604527176a694eefa4d4029585..26578856fae1beb3bc182f186d22811ce8103be5 100644 (file)
@@ -31,7 +31,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security.Protocol.Tls;
 using MSX = Mono.Security.X509;
 using Mono.Security.X509.Extensions;
index faa2edc143d123945b46c5c286323e04c3052f78..54af1f449942e2ce96a96cd846085dde9ef7dbf6 100644 (file)
@@ -30,7 +30,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security.Protocol.Tls;
 #else
 extern alias MonoSecurity;
@@ -98,7 +98,7 @@ namespace System.Net
                Exception connect_exception;
                static object classLock = new object ();
                static Type sslStream;
-#if !MONOTOUCH
+#if !MONOTOUCH && !MONODROID
                static PropertyInfo piClient;
                static PropertyInfo piServer;
                static PropertyInfo piTrustFailure;
@@ -257,7 +257,7 @@ namespace System.Net
                                        throw new NotSupportedException (msg);
                                }
 #endif
-#if !MONOTOUCH
+#if !MONOTOUCH && !MONODROID
                                piClient = sslStream.GetProperty ("SelectedClientCertificate");
                                piServer = sslStream.GetProperty ("ServerCertificate");
                                piTrustFailure = sslStream.GetProperty ("TrustFailure");
@@ -441,7 +441,7 @@ namespace System.Net
                                                                return false;
                                                }
 #if SECURITY_DEP
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
                                                nstream = new HttpsClientStream (serverStream, request.ClientCertificates, request, buffer);
 #else
                                                object[] args = new object [4] { serverStream,
@@ -622,7 +622,7 @@ namespace System.Net
                internal void GetCertificates (Stream stream) 
                {
                        // here the SSL negotiation have been done
-#if SECURITY_DEP && MONOTOUCH
+#if SECURITY_DEP && (MONOTOUCH || MONODROID)
                        HttpsClientStream s = (stream as HttpsClientStream);
                        X509Certificate client = s.SelectedClientCertificate;
                        X509Certificate server = s.ServerCertificate;
@@ -1148,7 +1148,7 @@ namespace System.Net
 
                                // if SSL is in use then check for TrustFailure
                                if (ssl) {
-#if SECURITY_DEP && MONOTOUCH
+#if SECURITY_DEP && (MONOTOUCH || MONODROID)
                                        HttpsClientStream https = (s as HttpsClientStream);
                                        if (https.TrustFailure) {
 #else
index 33e27cf23720653e89388e8602fb563941a08821..efd394ef5e851dffbc0c05d85b6b7228d954e750 100644 (file)
@@ -22,7 +22,7 @@
 //
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using MSX = Mono.Security.X509;
 #else
 extern alias MonoSecurity;
index 3122a108d4aac9a2028cc2075cc37d384b4def12..007db0a6ac36549733e45e401bec113df4c39428 100644 (file)
@@ -31,7 +31,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security;
 using Mono.Security.Cryptography;
 using MSX = Mono.Security.X509;
index db0377e12a871846e3c79d62c57f16590494a6ec..f072f7759a4d66ed9b9f22f7fdf8282685a68c8c 100644 (file)
@@ -28,7 +28,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security;
 using MX = Mono.Security.X509;
 #else
index f3ffaaa47f117cb81dd9b0bd4c4e72d37812a61d..1b9c70a588fb86fc4f86d703fe95a2067f4474d2 100644 (file)
@@ -31,7 +31,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security;
 #else
 extern alias MonoSecurity;
index 4559687a7f5fa5591f6d812263e6f69a7d27f83a..701b4c534d015d7d1b9d3d543a73ecbaeda61b6b 100644 (file)
@@ -29,7 +29,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security;
 using Mono.Security.Cryptography;
 using MX = Mono.Security.X509;
index 7550c0608cb753a93971d423c516427e5e8588f7..7dfb699ef349b78611b90500d79cd840b8d7f1ab 100644 (file)
@@ -30,7 +30,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using MX = Mono.Security.X509;
 #else
 extern alias MonoSecurity;
index 19ddcb8bd92286d3b12646286dce209af902ef22..1312a99d86b2bf35da4f818366fbd4f0226879ed 100644 (file)
@@ -28,7 +28,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security;
 #else
 extern alias MonoSecurity;
index bceabd05723e60fa11021e7495c16a26f9751b6d..e7f098dbdf130f845a81f094042d3315b061bb23 100644 (file)
@@ -31,7 +31,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security;
 using MX = Mono.Security.X509;
 #else
index 69f56faece63dbe338571f442ab2d699588fd65c..a4b2af18ee00a444946b9fc3d56ad49dc23f4782 100644 (file)
@@ -30,7 +30,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security;
 #else
 extern alias MonoSecurity;
index 58966329d043f789d62fe93a419bb519562e0896..02de8cec747d0d2504d317ab2e3cc705f10eb9cd 100644 (file)
@@ -29,7 +29,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using MX = Mono.Security.X509;
 #else
 extern alias MonoSecurity;
index fe2114afe1782ed9fd8fa799f5b89faa20580b99..b5a4c23e55587576ddc527f6bea8695fdc2fe30c 100644 (file)
@@ -30,7 +30,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security;
 using Mono.Security.Cryptography;
 #else
index 995f1b220c2d68b4ce5b1d04a970fe9be9c3e21f..5d0cb71100851b74b1e330fcbb451cd935b5460c 100644 (file)
@@ -29,7 +29,7 @@
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
+#if MONOTOUCH || MONODROID
 using Mono.Security;
 using Mono.Security.Cryptography;
 #else
index 338a92b63966011d11d3b3c7f13b2c6e0d533aa1..45adf27af71cab8fbdc631893eac34ae7266b84a 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-#if SECURITY_DEP
-extern alias MonoSecurity;
-#endif
-
 #if MONODROID
 using System;
+using System.Collections.Generic;
 using System.Net;
 using System.Net.Security;
 using System.Security.Cryptography.X509Certificates;
 #if SECURITY_DEP
-using MSX = MonoSecurity::Mono.Security.X509;
+using MSX = Mono.Security.X509;
 #endif
 
 namespace System {
@@ -43,8 +40,7 @@ namespace System {
        internal static class AndroidPlatform {
 
 #if SECURITY_DEP
-               static readonly Converter<MSX.X509CertificateCollection, bool> trustEvaluateSsl;
-               static readonly Func<MSX.X509CertificateCollection, object, X509Certificate2, X509Chain, SslPolicyErrors, bool> trustEvaluateSsl2;
+               static readonly Converter<List <byte[]>, bool> trustEvaluateSsl;
 #endif  // SECURITY_DEP
                static readonly Func<IWebProxy> getDefaultProxy;
 
@@ -53,16 +49,8 @@ namespace System {
                {
                        var t = Type.GetType ("Android.Runtime.AndroidEnvironment, Mono.Android", throwOnError:true);
 #if SECURITY_DEP
-                       trustEvaluateSsl2 = (Func<MSX.X509CertificateCollection, object, X509Certificate2, X509Chain, SslPolicyErrors, bool>)
-                               Delegate.CreateDelegate (
-                                               typeof (Func<MSX.X509CertificateCollection, object, X509Certificate2, X509Chain, SslPolicyErrors, bool>),
-                                               t,
-                                               "TrustEvaluateSsl2",
-                                               ignoreCase:false,
-                                               throwOnBindFailure:false);
-                       if (trustEvaluateSsl2 == null)
-                               trustEvaluateSsl = (Converter<MSX.X509CertificateCollection, bool>)
-                                       Delegate.CreateDelegate (typeof (Converter<MSX.X509CertificateCollection, bool>),
+                       trustEvaluateSsl = (Converter<List<byte[]>, bool>)
+                               Delegate.CreateDelegate (typeof (Converter<List<byte[]>, bool>),
                                                        t,
                                                        "TrustEvaluateSsl",
                                                        ignoreCase:false,
@@ -77,9 +65,10 @@ namespace System {
 #if SECURITY_DEP
                internal static bool TrustEvaluateSsl (MSX.X509CertificateCollection collection, object sender, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors errors)
                {
-                       if (trustEvaluateSsl2 != null)
-                               return trustEvaluateSsl2 (collection, sender, certificate, chain, errors);
-                       return trustEvaluateSsl (collection);
+                       var certsRawData = new List <byte[]> (collection.Count);
+                       foreach (MSX.X509Certificate cert in collection)
+                               certsRawData.Add (cert.RawData);
+                       return trustEvaluateSsl (certsRawData);
                }
 #endif  // SECURITY_DEP
 
index af382cd209be213569fa918d7af0421909169402..9895ed2ed6e116ecab5dba42e85dac0af3dcabaa 100644 (file)
@@ -1,2 +1,80 @@
 #include mobile_System.dll.sources
 System/AndroidPlatform.cs
+
+../Mono.Security/Mono.Security.Authenticode/PrivateKey.cs
+../Mono.Security/Mono.Security.Cryptography/MD5SHA1.cs
+../Mono.Security/Mono.Security.Cryptography/TlsHMAC.cs
+../Mono.Security/Mono.Security.Protocol.Ntlm/ChallengeResponse.cs
+../Mono.Security/Mono.Security.Protocol.Ntlm/ChallengeResponse2.cs
+../Mono.Security/Mono.Security.Protocol.Ntlm/MessageBase.cs
+../Mono.Security/Mono.Security.Protocol.Ntlm/NtlmAuthLevel.cs
+../Mono.Security/Mono.Security.Protocol.Ntlm/NtlmFlags.cs
+../Mono.Security/Mono.Security.Protocol.Ntlm/NtlmSettings.cs
+../Mono.Security/Mono.Security.Protocol.Ntlm/Type1Message.cs
+../Mono.Security/Mono.Security.Protocol.Ntlm/Type2Message.cs
+../Mono.Security/Mono.Security.Protocol.Ntlm/Type3Message.cs
+../Mono.Security/Mono.Security.Protocol.Tls/Alert.cs
+../Mono.Security/Mono.Security.Protocol.Tls/CipherAlgorithmType.cs
+../Mono.Security/Mono.Security.Protocol.Tls/CipherSuite.cs
+../Mono.Security/Mono.Security.Protocol.Tls/CipherSuiteCollection.cs
+../Mono.Security/Mono.Security.Protocol.Tls/CipherSuiteFactory.cs
+../Mono.Security/Mono.Security.Protocol.Tls/ClientContext.cs
+../Mono.Security/Mono.Security.Protocol.Tls/ClientRecordProtocol.cs
+../Mono.Security/Mono.Security.Protocol.Tls/ClientSessionCache.cs
+../Mono.Security/Mono.Security.Protocol.Tls/ContentType.cs
+../Mono.Security/Mono.Security.Protocol.Tls/Context.cs
+../Mono.Security/Mono.Security.Protocol.Tls/DebugHelper.cs
+../Mono.Security/Mono.Security.Protocol.Tls/ExchangeAlgorithmType.cs
+../Mono.Security/Mono.Security.Protocol.Tls/HandshakeState.cs
+../Mono.Security/Mono.Security.Protocol.Tls/HashAlgorithmType.cs
+../Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs
+../Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs
+../Mono.Security/Mono.Security.Protocol.Tls/RSASslSignatureDeformatter.cs
+../Mono.Security/Mono.Security.Protocol.Tls/RSASslSignatureFormatter.cs
+../Mono.Security/Mono.Security.Protocol.Tls/SecurityCompressionType.cs
+../Mono.Security/Mono.Security.Protocol.Tls/SecurityParameters.cs
+../Mono.Security/Mono.Security.Protocol.Tls/SecurityProtocolType.cs
+../Mono.Security/Mono.Security.Protocol.Tls/ServerContext.cs
+../Mono.Security/Mono.Security.Protocol.Tls/ServerRecordProtocol.cs
+../Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs
+../Mono.Security/Mono.Security.Protocol.Tls/SslCipherSuite.cs
+../Mono.Security/Mono.Security.Protocol.Tls/SslHandshakeHash.cs
+../Mono.Security/Mono.Security.Protocol.Tls/SslServerStream.cs
+../Mono.Security/Mono.Security.Protocol.Tls/SslStreamBase.cs
+../Mono.Security/Mono.Security.Protocol.Tls/TlsCipherSuite.cs
+../Mono.Security/Mono.Security.Protocol.Tls/TlsClientSettings.cs
+../Mono.Security/Mono.Security.Protocol.Tls/TlsException.cs
+../Mono.Security/Mono.Security.Protocol.Tls/TlsServerSettings.cs
+../Mono.Security/Mono.Security.Protocol.Tls/TlsStream.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake/ClientCertificateType.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake/HandshakeMessage.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake/HandshakeType.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsClientCertificate.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsClientCertificateVerify.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsClientFinished.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsClientHello.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsClientKeyExchange.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsServerCertificate.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsServerCertificateRequest.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsServerFinished.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsServerHello.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsServerHelloDone.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsServerKeyExchange.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsClientCertificate.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsClientCertificateVerify.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsClientFinished.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsClientHello.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsClientKeyExchange.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsServerCertificate.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsServerCertificateRequest.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsServerFinished.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsServerHello.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsServerHelloDone.cs
+../Mono.Security/Mono.Security.Protocol.Tls.Handshake.Server/TlsServerKeyExchange.cs
+../Mono.Security/Mono.Security.X509.Extensions/AuthorityKeyIdentifierExtension.cs
+../Mono.Security/Mono.Security.X509.Extensions/ExtendedKeyUsageExtension.cs
+../Mono.Security/Mono.Security.X509.Extensions/GeneralNames.cs
+../Mono.Security/Mono.Security.X509.Extensions/NetscapeCertTypeExtension.cs
+../Mono.Security/Mono.Security.X509.Extensions/SubjectAltNameExtension.cs
+
+