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 {
// 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;
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);
}
}
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).
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;
}
}
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)]
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 ();
// 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;
// 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 ();
{
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
{
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 ?
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();
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."));
throw new CryptographicException (Locale.GetText ("Parameters not part of the certificate"));
return kap;
-#else
- return x509.KeyAlgorithmParameters;
-#endif
}
public virtual string GetKeyAlgorithmParametersString ()
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;
}
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);
}
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
}
}