Author: spouliot
Date: 2005-04-26 14:56:10 -0400 (Tue, 26 Apr 2005)
New Revision: 43617

Modified:
   
trunk/mcs/class/System.Security/System.Security.Cryptography.X509Certificates/ChangeLog
   
trunk/mcs/class/System.Security/System.Security.Cryptography.X509Certificates/X509CertificateEx.cs
Log:
2005-04-26  Sebastien Pouliot  <[EMAIL PROTECTED]>

        * X509CertificateEx.cs: Used new features from Mono.Security.dll to 
        load certificates and private keys from PKCS#12.



Modified: 
trunk/mcs/class/System.Security/System.Security.Cryptography.X509Certificates/ChangeLog
===================================================================
--- 
trunk/mcs/class/System.Security/System.Security.Cryptography.X509Certificates/ChangeLog
     2005-04-26 18:54:47 UTC (rev 43616)
+++ 
trunk/mcs/class/System.Security/System.Security.Cryptography.X509Certificates/ChangeLog
     2005-04-26 18:56:10 UTC (rev 43617)
@@ -1,3 +1,8 @@
+2005-04-26  Sebastien Pouliot  <[EMAIL PROTECTED]>
+
+       * X509CertificateEx.cs: Used new features from Mono.Security.dll to 
+       load certificates and private keys from PKCS#12.
+
 2005-04-24  Sebastien Pouliot  <[EMAIL PROTECTED]>
 
        * X509CertificateEx.cs: Added new constructors and Import methods that

Modified: 
trunk/mcs/class/System.Security/System.Security.Cryptography.X509Certificates/X509CertificateEx.cs
===================================================================
--- 
trunk/mcs/class/System.Security/System.Security.Cryptography.X509Certificates/X509CertificateEx.cs
  2005-04-26 18:54:47 UTC (rev 43616)
+++ 
trunk/mcs/class/System.Security/System.Security.Cryptography.X509Certificates/X509CertificateEx.cs
  2005-04-26 18:56:10 UTC (rev 43617)
@@ -30,6 +30,7 @@
 #if NET_2_0
 
 using System;
+using System.IO;
 using System.Text;
 
 using MX = Mono.Security.X509;
@@ -152,11 +153,21 @@
                }
 
                public AsymmetricAlgorithm PrivateKey {
-                       get { 
-                               return _cert.RSA; 
+                       get {
+                               if (_cert.RSA != null)
+                                       return _cert.RSA; 
+                               else if (_cert.DSA != null)
+                                       return _cert.DSA;
+                               return null;
                        }
-                       [MonoTODO]
-                       set { throw new NotImplementedException (); }
+                       set {
+                               if (value is RSA)
+                                       _cert.RSA = (RSA) value;
+                               else if (value is DSA)
+                                       _cert.DSA = (DSA) value;
+                               else
+                                       throw new NotSupportedException ();
+                       }
                } 
 
                public PublicKey PublicKey {
@@ -222,34 +233,68 @@
 
                public override void Import (byte[] rawData) 
                {
-                       base.Import (rawData);
+                       Import (rawData, (string)null, 
X509KeyStorageFlags.DefaultKeySet);
                }
 
+               [MonoTODO ("missing KeyStorageFlags support")]
                public override void Import (byte[] rawData, string password, 
X509KeyStorageFlags keyStorageFlags)
                {
                        base.Import (rawData, password, keyStorageFlags);
+                       if (password == null) {
+                               _cert = new Mono.Security.X509.X509Certificate 
(rawData);
+                               // TODO - PKCS12 without password
+                       } else {
+                               // try PKCS#12
+                               MX.PKCS12 pfx = new MX.PKCS12 (rawData, 
password);
+                               if (pfx.Certificates.Count > 0) {
+                                       _cert = pfx.Certificates [0];
+                               } else {
+                                       _cert = null;
+                               }
+                               if (pfx.Keys.Count > 0) {
+                                       _cert.RSA = (pfx.Keys [0] as RSA);
+                                       _cert.DSA = (pfx.Keys [0] as DSA);
+                               }
+                       }
                }
 
+               [MonoTODO ("SecureString is incomplete")]
                public override void Import (byte[] rawData, SecureString 
password, X509KeyStorageFlags keyStorageFlags)
                {
-                       base.Import (rawData, password, keyStorageFlags);
+                       Import (rawData, (string) null, keyStorageFlags);
                }
 
                public override void Import (string fileName) 
                {
-                       base.Import (fileName);
+                       byte[] rawData = Load (fileName);
+                       Import (rawData, (string)null, 
X509KeyStorageFlags.DefaultKeySet);
                }
 
+               [MonoTODO ("missing KeyStorageFlags support")]
                public override void Import (string fileName, string password, 
X509KeyStorageFlags keyStorageFlags) 
                {
-                       base.Import (fileName, password, keyStorageFlags);
+                       byte[] rawData = Load (fileName);
+                       Import (rawData, password, keyStorageFlags);
                }
 
+               [MonoTODO ("SecureString is incomplete")]
                public override void Import (string fileName, SecureString 
password, X509KeyStorageFlags keyStorageFlags) 
                {
-                       base.Import (fileName, password, keyStorageFlags);
+                       byte[] rawData = Load (fileName);
+                       Import (rawData, (string)null, keyStorageFlags);
                }
 
+               private byte[] Load (string fileName)
+               {
+                       byte[] data = null;
+                       using (FileStream fs = new FileStream (fileName, 
FileMode.Open)) {
+                               data = new byte [fs.Length];
+                               fs.Read (data, 0, data.Length);
+                               fs.Close ();
+                       }
+                       return data;
+               }
+
                public override void Reset () 
                {
                        _serial = null;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to