// 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
+#if MONO_SECURITY_ALIAS
+extern alias MonoSecurity;
+#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)
{
- var impl = new X509Certificate2ImplMono ();
- impl.Import (rawData, password, keyStorageFlags);
- return impl;
+#if !FEATURE_NO_BSD_SOCKETS
+ var provider = MonoTlsProviderFactory.GetProvider ();
+ if (provider.HasNativeCertificates) {
+ var impl = provider.GetNativeCertificate (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 impl;
+ }
+#endif // FEATURE_NO_BSD_SOCKETS
var impl2 = cert.Impl as X509Certificate2Impl;
if (impl2 != null)
return (X509Certificate2Impl)impl2.Clone ();
{
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