Merge pull request #900 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mcs / class / corlib / System.Security.Cryptography.X509Certificates / X509Certificate.cs
index da5d157f25129f3ac38596a30f6eb1fd4867ee03..8ca0307c4dcf3f245f61d41c4fecc2354afb541e 100644 (file)
@@ -33,12 +33,10 @@ using System.Security.Permissions;
 using System.Text;
 
 using Mono.Security;
-using Mono.Security.Authenticode;
 using Mono.Security.X509;
 
-#if NET_2_0
 using System.Runtime.Serialization;
-#endif
+using Mono.Security.Authenticode;
 
 namespace System.Security.Cryptography.X509Certificates {
 
@@ -50,10 +48,10 @@ namespace System.Security.Cryptography.X509Certificates {
        // and/or Authenticode certs. However this class works with older
        // X509v1 certificates and non-authenticode (code signing) certs.
        [Serializable]
-#if NET_2_0
-       public partial class X509Certificate : IDeserializationCallback, ISerializable {
+#if NET_2_1
+       public partial class X509Certificate {
 #else
-       public class X509Certificate {
+       public partial class X509Certificate : IDeserializationCallback, ISerializable {
 #endif
                // typedef struct _CERT_CONTEXT {
                 //     DWORD                   dwCertEncodingType;
@@ -96,25 +94,16 @@ namespace System.Security.Cryptography.X509Certificates {
        
                public static X509Certificate CreateFromCertFile (string filename) 
                {
-                       byte[] data = Load (filename);
+                       byte[] data = File.ReadAllBytes (filename);
                        return new X509Certificate (data);
                }
-       
+
                [MonoTODO ("Incomplete - minimal validation in this version")]
                public static X509Certificate CreateFromSignedFile (string filename)
                {
                        try {
                                AuthenticodeDeformatter a = new AuthenticodeDeformatter (filename);
                                if (a.SigningCertificate != null) {
-#if !NET_2_0
-                                       // before 2.0 the signing certificate is returned only if the signature is valid
-                                       if (a.Reason != 0) {
-                                               string msg = String.Format (Locale.GetText (
-                                                       "Invalid digital signature on {0}, reason #{1}."),
-                                                       filename, a.Reason);
-                                               throw new COMException (msg);
-                                       }
-#endif
                                        return new X509Certificate (a.SigningCertificate.RawData);
                                }
                        }
@@ -126,15 +115,9 @@ namespace System.Security.Cryptography.X509Certificates {
                                string msg = Locale.GetText ("Couldn't extract digital signature from {0}.", filename);
                                throw new COMException (msg, e);
                        }
-#if NET_2_0
                        throw new CryptographicException (Locale.GetText ("{0} isn't signed.", filename));
-#else
-                       // if no signature is present return an empty certificate
-                       byte[] cert = null; // must not confuse compiler about null ;)
-                       return new X509Certificate (cert);
-#endif
                }
-       
+
                // constructors
        
                // special constructor for Publisher (and related classes).
@@ -142,11 +125,7 @@ namespace System.Security.Cryptography.X509Certificates {
                internal X509Certificate (byte[] data, bool dates) 
                {
                        if (data != null) {
-#if NET_2_0
                                Import (data, (string)null, X509KeyStorageFlags.DefaultKeySet);
-#else
-                               x509 = new Mono.Security.X509.X509Certificate (data);
-#endif
                                hideDates = !dates;
                        }
                }
@@ -157,11 +136,15 @@ namespace System.Security.Cryptography.X509Certificates {
        
                public X509Certificate (IntPtr handle) 
                {
-#if NET_2_0
                        if (handle == IntPtr.Zero)
                                throw new ArgumentException ("Invalid handle.");
-#endif
+#if NET_2_1
+                       // this works on Windows-only so it's of no use for Moonlight
+                       // even more since this ctor is [SecurityCritical]
+                       throw new NotSupportedException ();
+#else
                        InitFromHandle (handle);
+#endif
                }
 
                [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
@@ -179,10 +162,8 @@ namespace System.Security.Cryptography.X509Certificates {
        
                public X509Certificate (System.Security.Cryptography.X509Certificates.X509Certificate cert) 
                {
-#if NET_2_0
                        if (cert == null)
                                throw new ArgumentNullException ("cert");
-#endif
 
                        if (cert != null) {
                                byte[] data = cert.GetRawCertData ();
@@ -195,22 +176,18 @@ namespace System.Security.Cryptography.X509Certificates {
 
                // public methods
        
-               public virtual bool Equals (System.Security.Cryptography.X509Certificates.X509Certificate cert)
+               public virtual bool Equals (System.Security.Cryptography.X509Certificates.X509Certificate other)
                {
-                       if (cert == null) {
+                       if (other == null) {
                                return false;
                        } else {
-                               if (cert.x509 == null) {
-#if NET_2_0
+                               if (other.x509 == null) {
                                        if (x509 == null)
                                                return true;
                                        throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
-#else
-                                       return (x509 == null);
-#endif
                                }
 
-                               byte[] raw = cert.x509.RawData;
+                               byte[] raw = other.x509.RawData;
                                if (raw != null) {
                                        if (x509 == null)
                                                return false;
@@ -237,10 +214,8 @@ namespace System.Security.Cryptography.X509Certificates {
                // algorithm used to sign the certificate).
                public virtual byte[] GetCertHash () 
                {
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
-#endif
                        // we'll hash the cert only once and only if required
                        if ((cachedCertificateHash == null) && (x509 != null)) {
                                SHA1 sha = SHA1.Create ();
@@ -260,16 +235,10 @@ namespace System.Security.Cryptography.X509Certificates {
                {
                        if (hideDates)
                                return null;
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
 
-                       return x509.ValidFrom.ToString ();
-#else
-                       // LAMESPEC: Microsoft returns the local time from Pacific Time (GMT-8)
-                       // BUG: This will not be corrected in Framework 1.1 and also affect WSE 1.0
-                       return x509.ValidFrom.ToUniversalTime ().AddHours (-8).ToString ();
-#endif
+                       return x509.ValidFrom.ToLocalTime ().ToString ();
                }
        
                // strangly there are no DateTime returning function
@@ -277,16 +246,10 @@ namespace System.Security.Cryptography.X509Certificates {
                {
                        if (hideDates)
                                return null;
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
 
-                       return x509.ValidUntil.ToString ();
-#else
-                       // LAMESPEC: Microsoft returns the local time from Pacific Time (GMT-8)
-                       // BUG: This will not be corrected in Framework 1.1 and also affect WSE 1.0
-                       return x509.ValidUntil.ToUniversalTime ().AddHours (-8).ToString ();
-#endif
+                       return x509.ValidUntil.ToLocalTime ().ToString ();
                }
        
                // well maybe someday there'll be support for PGP or SPKI ?
@@ -297,10 +260,8 @@ namespace System.Security.Cryptography.X509Certificates {
        
                public override int GetHashCode ()
                {
-#if NET_2_0
                        if (x509 == null)
                                return 0;
-#endif
                        // the cert hash may not be (yet) calculated
                        if (cachedCertificateHash == null)
                                GetCertHash();
@@ -313,30 +274,23 @@ namespace System.Security.Cryptography.X509Certificates {
                                return 0;
                }
 
-#if NET_2_0
                [Obsolete ("Use the Issuer property.")]
-#endif
                public virtual string GetIssuerName () 
                {
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
-#endif
                        return x509.IssuerName;
                }
        
                public virtual string GetKeyAlgorithm () 
                {
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
-#endif
                        return x509.KeyAlgorithm;
                }
        
                public virtual byte[] GetKeyAlgorithmParameters () 
                {
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
 
@@ -345,9 +299,6 @@ namespace System.Security.Cryptography.X509Certificates {
                                throw new CryptographicException (Locale.GetText ("Parameters not part of the certificate"));
 
                        return kap;
-#else
-                       return x509.KeyAlgorithmParameters;
-#endif
                }
        
                public virtual string GetKeyAlgorithmParametersString () 
@@ -355,24 +306,18 @@ namespace System.Security.Cryptography.X509Certificates {
                        return tostr (GetKeyAlgorithmParameters ());
                }
        
-#if NET_2_0
                [Obsolete ("Use the Subject property.")]
-#endif
                public virtual string GetName ()
                {
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
-#endif
                        return x509.SubjectName;
                }
        
                public virtual byte[] GetPublicKey () 
                {
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
-#endif
                        return x509.PublicKey;
                }
        
@@ -383,41 +328,29 @@ namespace System.Security.Cryptography.X509Certificates {
        
                public virtual byte[] GetRawCertData () 
                {
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
                        return x509.RawData;
-#else
-                       return ((x509 != null) ? x509.RawData : null);
-#endif
                }
        
                public virtual string GetRawCertDataString () 
                {
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
                        return tostr (x509.RawData);
-#else
-                       return ((x509 != null) ? tostr (x509.RawData) : null);
-#endif
                }
        
                public virtual byte[] GetSerialNumber () 
                {
-#if NET_2_0
                        if (x509 == null)
                                throw new CryptographicException (Locale.GetText ("Certificate instance is empty."));
-#endif
                        return x509.SerialNumber;
                }
        
                public virtual string GetSerialNumberString () 
                {
                        byte[] sn = GetSerialNumber ();
-#if NET_2_0
                        Array.Reverse (sn);
-#endif
                        return tostr (sn);
                }
        
@@ -427,72 +360,27 @@ namespace System.Security.Cryptography.X509Certificates {
                        return base.ToString ();
                }
        
-               public virtual string ToString (bool details
+               public virtual string ToString (bool fVerbose
                {
-                       if (!details || (x509 == null))
+                       if (!fVerbose || (x509 == null))
                                return base.ToString ();
 
                        string nl = Environment.NewLine;
                        StringBuilder sb = new StringBuilder ();
-#if NET_2_0
                        sb.AppendFormat ("[Subject]{0}  {1}{0}{0}", nl, Subject);
                        sb.AppendFormat ("[Issuer]{0}  {1}{0}{0}", nl, Issuer);
                        sb.AppendFormat ("[Not Before]{0}  {1}{0}{0}", nl, GetEffectiveDateString ());
                        sb.AppendFormat ("[Not After]{0}  {1}{0}{0}", nl, GetExpirationDateString ());
                        sb.AppendFormat ("[Thumbprint]{0}  {1}{0}", nl, GetCertHashString ());
-#else
-                       sb.Append ("CERTIFICATE:");
-                       sb.Append (nl);
-                       sb.Append ("\tFormat:  ");
-                       sb.Append (GetFormat ());
-                       if (x509.SubjectName != null) {
-                               sb.Append (nl);
-                               sb.Append ("\tName:  ");
-                               sb.Append (GetName ());
-                       }
-                       if (x509.IssuerName != null) {
-                               sb.Append (nl);
-                               sb.Append ("\tIssuing CA:  ");
-                               sb.Append (GetIssuerName ());
-                       }
-                       if (x509.SignatureAlgorithm != null) {
-                               sb.Append (nl);
-                               sb.Append ("\tKey Algorithm:  ");
-                               sb.Append (GetKeyAlgorithm ());
-                       }
-                       if (x509.SerialNumber != null) {
-                               sb.Append (nl);
-                               sb.Append ("\tSerial Number:  ");
-                               sb.Append (GetSerialNumberString ());
-                       }
-                       // Note: Algorithm is not spelled right as the actual 
-                       // MS implementation (we do exactly the same for the
-                       // comparison in the unit tests)
-                       if (x509.KeyAlgorithmParameters != null) {
-                               sb.Append (nl);
-                               sb.Append ("\tKey Alogrithm Parameters:  ");
-                               sb.Append (GetKeyAlgorithmParametersString ());
-                       }
-                       if (x509.PublicKey != null) {
-                               sb.Append (nl);
-                               sb.Append ("\tPublic Key:  ");
-                               sb.Append (GetPublicKeyString ());
-                       }
-                       sb.Append (nl);
-#endif
                        sb.Append (nl);
                        return sb.ToString ();
                }
 
-               private static byte[] Load (string fileName)
+#if NET_4_0
+               protected static string FormatDate (DateTime date)
                {
-                       byte[] data = null;
-                       using (FileStream fs = File.OpenRead (fileName)) {
-                               data = new byte [fs.Length];
-                               fs.Read (data, 0, data.Length);
-                               fs.Close ();
-                       }
-                       return data;
+                       throw new NotImplementedException ();
                }
+#endif
        }
 }