Modify Jenkins scripts to enable babysitter script on Cygwin
[mono.git] / mcs / class / corlib / System.Security.Cryptography.X509Certificates / X509Certificate20.cs
index 21ff22e3dc48d11e7e9d1b713053ae937c473dd4..78a71adbd566033509abeaf17d98c4e6c6fa9acb 100644 (file)
@@ -6,6 +6,7 @@
 //
 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
 // Copyright (C) 2004-2006,2008 Novell, Inc (http://www.novell.com)
+// Copyright 2013 Xamarin Inc.
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -27,7 +28,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-
+using System.IO;
 using System.Runtime.InteropServices;
 using System.Security.Permissions;
 using System.Text;
@@ -41,11 +42,7 @@ namespace System.Security.Cryptography.X509Certificates {
 
        [ComVisible (true)]
        [MonoTODO ("X509ContentType.SerializedCert isn't supported (anywhere in the class)")]
-#if MOONLIGHT
-       public partial class X509Certificate {
-#else
-       public partial class X509Certificate : IDeserializationCallback, ISerializable {
-#endif
+       public partial class X509Certificate : IDeserializationCallback, ISerializable, IDisposable {
                private string issuer_name;
                private string subject_name;
 
@@ -60,26 +57,22 @@ namespace System.Security.Cryptography.X509Certificates {
                        Import (rawData, password, X509KeyStorageFlags.DefaultKeySet);
                }
 
-#if !MOONLIGHT
                [MonoTODO ("SecureString support is incomplete")]
                public X509Certificate (byte[] rawData, SecureString password)
                {
                        Import (rawData, password, X509KeyStorageFlags.DefaultKeySet);
                }
-#endif
 
                public X509Certificate (byte[] rawData, string password, X509KeyStorageFlags keyStorageFlags)
                {
                        Import (rawData, password, keyStorageFlags);
                }
 
-#if !MOONLIGHT
                [MonoTODO ("SecureString support is incomplete")]
                public X509Certificate (byte[] rawData, SecureString password, X509KeyStorageFlags keyStorageFlags)
                {
                        Import (rawData, password, keyStorageFlags);
                }
-#endif
 
                public X509Certificate (string fileName)
                {
@@ -91,26 +84,22 @@ namespace System.Security.Cryptography.X509Certificates {
                        Import (fileName, password, X509KeyStorageFlags.DefaultKeySet);
                }
 
-#if !MOONLIGHT
                [MonoTODO ("SecureString support is incomplete")]
                public X509Certificate (string fileName, SecureString password)
                {
                        Import (fileName, password, X509KeyStorageFlags.DefaultKeySet);
                }
-#endif
 
                public X509Certificate (string fileName, string password, X509KeyStorageFlags keyStorageFlags)
                {
                        Import (fileName, password, keyStorageFlags);
                }
 
-#if !MOONLIGHT
                [MonoTODO ("SecureString support is incomplete")]
                public X509Certificate (string fileName, SecureString password, X509KeyStorageFlags keyStorageFlags)
                {
                        Import (fileName, password, keyStorageFlags);
                }
-#endif
 
                public X509Certificate (SerializationInfo info, StreamingContext context)
                {
@@ -121,29 +110,31 @@ namespace System.Security.Cryptography.X509Certificates {
 
                public string Issuer {
                        get {
-                               if (x509 == null)
-                                       throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
+                               X509Helper.ThrowIfContextInvalid (impl);
 
                                if (issuer_name == null)
-                                       issuer_name = X501.ToString (x509.GetIssuerName (), true, ", ", true);
+                                       issuer_name = impl.GetIssuerName (false);
                                return issuer_name;
                        }
                }
 
                public string Subject {
                        get {
-                               if (x509 == null)
-                                       throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
+                               X509Helper.ThrowIfContextInvalid (impl);
 
                                if (subject_name == null)
-                                       subject_name = X501.ToString (x509.GetSubjectName (), true, ", ", true);
+                                       subject_name = impl.GetSubjectName (false);
                                return subject_name;
                        }
                }
 
                [ComVisible (false)]
                public IntPtr Handle {
-                       get { return IntPtr.Zero; }
+                       get {
+                               if (X509Helper.IsValid (impl))
+                                       return impl.Handle;
+                               return IntPtr.Zero;
+                       }
                }
 
 
@@ -171,38 +162,19 @@ namespace System.Security.Cryptography.X509Certificates {
                        return Export (contentType, pwd);
                }
 
-#if !MOONLIGHT
                [MonoTODO ("X509ContentType.Pfx/Pkcs12 and SerializedCert are not supported. SecureString support is incomplete.")]
                public virtual byte[] Export (X509ContentType contentType, SecureString password)
                {
                        byte[] pwd = (password == null) ? null : password.GetBuffer ();
                        return Export (contentType, pwd);
                }
-#endif
 
                internal byte[] Export (X509ContentType contentType, byte[] password)
                {
-                       if (x509 == null)
-                               throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
-
                        try {
-                               switch (contentType) {
-                               case X509ContentType.Cert:
-                                       return x509.RawData;
-#if !MOONLIGHT
-                               case X509ContentType.Pfx: // this includes Pkcs12
-                                       // TODO
-                                       throw new NotSupportedException ();
-                               case X509ContentType.SerializedCert:
-                                       // TODO
-                                       throw new NotSupportedException ();
-#endif
-                               default:
-                                       string msg = Locale.GetText ("This certificate format '{0}' cannot be exported.", contentType);
-                                       throw new CryptographicException (msg);
-                               }
-                       }
-                       finally {
+                               X509Helper.ThrowIfContextInvalid (impl);
+                               return impl.Export (contentType, password);
+                       } finally {
                                // protect password
                                if (password != null)
                                        Array.Clear (password, 0, password.Length);
@@ -220,54 +192,19 @@ namespace System.Security.Cryptography.X509Certificates {
                public virtual void Import (byte[] rawData, string password, X509KeyStorageFlags keyStorageFlags)
                {
                        Reset ();
-                       if (password == null) {
-                               try {
-                                       x509 = new Mono.Security.X509.X509Certificate (rawData);
-                               }
-                               catch (Exception e) {
-                                       try {
-                                               PKCS12 pfx = new PKCS12 (rawData);
-                                               if (pfx.Certificates.Count > 0)
-                                                       x509 = pfx.Certificates [0];
-                                               else
-                                                       x509 = null;
-                                       }
-                                       catch {
-                                               string msg = Locale.GetText ("Unable to decode certificate.");
-                                               // inner exception is the original (not second) exception
-                                               throw new CryptographicException (msg, e);
-                                       }
-                               }
-                       } else {
-                               // try PKCS#12
-                               try {
-                                       PKCS12 pfx = new PKCS12 (rawData, password);
-                                       if (pfx.Certificates.Count > 0) {
-                                               x509 = pfx.Certificates [0];
-                                       } else {
-                                               x509 = null;
-                                       }
-                               }
-                               catch {
-                                       // it's possible to supply a (unrequired/unusued) password
-                                       // fix bug #79028
-                                       x509 = new Mono.Security.X509.X509Certificate (rawData);
-                               }
-                       }
+                       impl = X509Helper.Import (rawData, password, keyStorageFlags);
                }
 
-#if !MOONLIGHT
                [MonoTODO ("SecureString support is incomplete")]
                public virtual void Import (byte[] rawData, SecureString password, X509KeyStorageFlags keyStorageFlags)
                {
                        Import (rawData, (string)null, keyStorageFlags);
                }
-#endif
 
                [ComVisible (false)]
                public virtual void Import (string fileName)
                {
-                       byte[] rawData = Load (fileName);
+                       byte[] rawData = File.ReadAllBytes (fileName);
                        Import (rawData, (string)null, X509KeyStorageFlags.DefaultKeySet);
                }
 
@@ -275,38 +212,51 @@ namespace System.Security.Cryptography.X509Certificates {
                [ComVisible (false)]
                public virtual void Import (string fileName, string password, X509KeyStorageFlags keyStorageFlags)
                {
-                       byte[] rawData = Load (fileName);
+                       byte[] rawData = File.ReadAllBytes (fileName);
                        Import (rawData, password, keyStorageFlags);
                }
 
-#if !MOONLIGHT
                [MonoTODO ("SecureString support is incomplete, missing KeyStorageFlags support")]
                public virtual void Import (string fileName, SecureString password, X509KeyStorageFlags keyStorageFlags)
                {
-                       byte[] rawData = Load (fileName);
+                       byte[] rawData = File.ReadAllBytes (fileName);
                        Import (rawData, (string)null, keyStorageFlags);
                }
-#endif
 
-#if !MOONLIGHT
                void IDeserializationCallback.OnDeserialization (object sender)
                {
                }
 
                void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context)
                {
+                       if (!X509Helper.IsValid (impl))
+                               throw new NullReferenceException ();
                        // will throw a NRE if info is null (just like MS implementation)
-                       info.AddValue ("RawData", x509.RawData);
+                       info.AddValue ("RawData", impl.GetRawCertData ());
                }
-#endif
+
+               public void Dispose ()
+               {
+                       Dispose (true);
+               }
+
+               protected virtual void Dispose (bool disposing)
+               {
+                       if (disposing)
+                               Reset ();
+               }
+
                [ComVisible (false)]
                public virtual void Reset ()
                {
-                       x509 = null;
+                       if (impl != null) {
+                               impl.Dispose ();
+                               impl = null;
+                       }
+
                        issuer_name = null;
                        subject_name = null;
                        hideDates = false;
-                       cachedCertificateHash = null;
                }
        }
 }