[System*] Throw a PlatformNotSupported exception when using the managed networking...
[mono.git] / mcs / class / System / System.Security.Cryptography.X509Certificates / X509Helper2.cs
index 25d9fdf0d4a955eb917cc7a5c73c25555163c0e6..337dcaf9ed2dfa175757a106f15ec849a087f06e 100644 (file)
 #if MONO_SECURITY_ALIAS
 extern alias MonoSecurity;
 #endif
-#if MONO_X509_ALIAS
-extern alias PrebuiltSystem;
-#endif
 
 #if MONO_SECURITY_ALIAS
 using MonoSecurity::Mono.Security.Interface;
 #else
+#if !FEATURE_NO_BSD_SOCKETS
 using Mono.Security.Interface;
 #endif
+#endif
+
+#if !FEATURE_NO_BSD_SOCKETS
+using Mono.Btls;
+#endif
+#endif
+
+using System.IO;
+using System.Text;
 
 namespace System.Security.Cryptography.X509Certificates
 {
        internal static class X509Helper2
        {
+               internal static long GetSubjectNameHash (X509Certificate certificate)
+               {
+                       return GetSubjectNameHash (certificate.Impl);
+               }
+
+               internal static long GetSubjectNameHash (X509CertificateImpl impl)
+               {
+#if SECURITY_DEP
+                       using (var x509 = GetNativeInstance (impl))
+                               return GetSubjectNameHash (x509);
+#else
+                       throw new NotSupportedException ();
+#endif
+               }
+
+               internal static void ExportAsPEM (X509Certificate certificate, Stream stream, bool includeHumanReadableForm)
+               {
+                       ExportAsPEM (certificate.Impl, stream, includeHumanReadableForm);
+               }
+
+               internal static void ExportAsPEM (X509CertificateImpl impl, Stream stream, bool includeHumanReadableForm)
+               {
+#if SECURITY_DEP
+                       using (var x509 = GetNativeInstance (impl))
+                               ExportAsPEM (x509, stream, includeHumanReadableForm);
+#else
+                       throw new NotSupportedException ();
+#endif
+               }
+
+#if SECURITY_DEP
+               internal static void Initialize ()
+               {
+                       X509Helper.InstallNativeHelper (new MyNativeHelper ());
+               }
+
                internal static void ThrowIfContextInvalid (X509CertificateImpl impl)
                {
                        X509Helper.ThrowIfContextInvalid (impl);
                }
 
+#if FEATURE_NO_BSD_SOCKETS
+               static X509Certificate GetNativeInstance (X509CertificateImpl impl)
+               {
+                       throw new PlatformNotSupportedException ();
+               }
+#else
+               static MonoBtlsX509 GetNativeInstance (X509CertificateImpl impl)
+               {
+                       ThrowIfContextInvalid (impl);
+                       var btlsImpl = impl as X509CertificateImplBtls;
+                       if (btlsImpl != null)
+                               return btlsImpl.X509.Copy ();
+                       else
+                               return MonoBtlsX509.LoadFromData (impl.GetRawCertData (), MonoBtlsX509Format.DER);
+               }
+
+               internal static long GetSubjectNameHash (MonoBtlsX509 x509)
+               {
+                       using (var subject = x509.GetSubjectName ())
+                               return subject.GetHash ();
+               }
+
+               internal static void ExportAsPEM (MonoBtlsX509 x509, Stream stream, bool includeHumanReadableForm)
+               {
+                       using (var bio = MonoBtlsBio.CreateMonoStream (stream)) {
+                               x509.ExportAsPEM (bio, includeHumanReadableForm);
+                       }
+               }
+#endif // !FEATURE_NO_BSD_SOCKETS
+
                internal static X509Certificate2Impl Import (byte[] rawData, string password, X509KeyStorageFlags keyStorageFlags)
                {
+#if !FEATURE_NO_BSD_SOCKETS
                        var provider = MonoTlsProviderFactory.GetProvider ();
                        if (provider.HasNativeCertificates) {
                                var impl = provider.GetNativeCertificate (rawData, password, keyStorageFlags);
-                               return (X509Certificate2Impl)(object)impl;
-                       } else {
-                               var impl = new X509Certificate2ImplMono ();
-                               impl.Import (rawData, password, keyStorageFlags);
                                return impl;
                        }
+#endif // FEATURE_NO_BSD_SOCKETS
+                       var impl2 = new X509Certificate2ImplMono ();
+                       impl2.Import (rawData, password, keyStorageFlags);
+                       return impl2;
                }
 
                internal static X509Certificate2Impl Import (X509Certificate cert)
                {
+#if !FEATURE_NO_BSD_SOCKETS
                        var provider = MonoTlsProviderFactory.GetProvider ();
                        if (provider.HasNativeCertificates) {
                                var impl = provider.GetNativeCertificate (cert);
-                               return (X509Certificate2Impl)(object)impl;
+                               return impl;
                        }
+#endif // FEATURE_NO_BSD_SOCKETS
                        var impl2 = cert.Impl as X509Certificate2Impl;
                        if (impl2 != null)
                                return (X509Certificate2Impl)impl2.Clone ();
@@ -95,6 +171,20 @@ namespace System.Security.Cryptography.X509Certificates
                {
                        return new CryptographicException (Locale.GetText ("Chain instance is empty."));
                }
+
+               class MyNativeHelper : INativeCertificateHelper
+               {
+                       public X509CertificateImpl Import (
+                               byte[] data, string password, X509KeyStorageFlags flags)
+                       {
+                               return X509Helper2.Import (data, password, flags);
+                       }
+
+                       public X509CertificateImpl Import (X509Certificate cert)
+                       {
+                               return X509Helper2.Import (cert);
+                       }
+               }
+#endif
        }
 }
-#endif