Merge pull request #409 from Alkarex/patch-1
[mono.git] / mcs / class / corlib / System.Security.Cryptography / DSACryptoServiceProvider.cs
index 7e000fbdfcef3041192da69e35298b139885f963..6c4f84ea3b795ec521ae5decd8106005f137ba53 100644 (file)
@@ -31,6 +31,8 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+#if !MOONLIGHT
+
 using System.IO;
 using System.Globalization;
 using System.Runtime.InteropServices;
@@ -39,14 +41,8 @@ using Mono.Security.Cryptography;
 
 namespace System.Security.Cryptography {
 
-#if NET_2_0
        [ComVisible (true)]
        public sealed class DSACryptoServiceProvider : DSA, ICspAsymmetricAlgorithm {
-#elif NET_1_1
-       public sealed class DSACryptoServiceProvider : DSA {
-#else
-       public class DSACryptoServiceProvider : DSA {
-#endif
                private const int PROV_DSS_DH = 13;             // from WinCrypt.h
 
                private KeyPairPersistence store;
@@ -96,10 +92,8 @@ namespace System.Security.Cryptography {
                        persistKey = (parameters != null);
                        if (parameters == null) {
                                parameters = new CspParameters (PROV_DSS_DH);
-#if NET_1_1
                                if (useMachineKeyStore)
                                        parameters.Flags |= CspProviderFlags.UseMachineKeyStore;
-#endif
                                store = new KeyPairPersistence (parameters);
                                // no need to load - it cannot exists
                        }
@@ -127,24 +121,13 @@ namespace System.Security.Cryptography {
                        get { return dsa.KeySize; }
                }
 
-#if !NET_2_0
-               public override KeySizes[] LegalKeySizes {
-                       get { return LegalKeySizesValue; }
-               }
-#endif
-
                public bool PersistKeyInCsp {
                        get { return persistKey; }
                        set { persistKey = value; }
                }
 
-#if NET_2_0
                [ComVisible (false)]
-               public 
-#else
-               internal
-#endif
-               bool PublicOnly {
+               public bool PublicOnly {
                        get { return dsa.PublicOnly; }
                }
 
@@ -152,14 +135,12 @@ namespace System.Security.Cryptography {
                        get { return "http://www.w3.org/2000/09/xmldsig#dsa-sha1"; }
                }
 
-#if NET_1_1
-               private static bool useMachineKeyStore = false;
+               private static bool useMachineKeyStore;
 
                public static bool UseMachineKeyStore {
                        get { return useMachineKeyStore; }
                        set { useMachineKeyStore = value; }
                }
-#endif
 
                public override DSAParameters ExportParameters (bool includePrivateParameters) 
                {
@@ -181,19 +162,19 @@ namespace System.Security.Cryptography {
                        return dsa.CreateSignature (rgbHash);
                }
 
-               public byte[] SignData (byte[] data)
+               public byte[] SignData (byte[] buffer)
                {
                        // right now only SHA1 is supported by FIPS186-2
                        HashAlgorithm hash = SHA1.Create ();
-                       byte[] toBeSigned = hash.ComputeHash (data);
+                       byte[] toBeSigned = hash.ComputeHash (buffer);
                        return dsa.CreateSignature (toBeSigned);
                }
 
-               public byte[] SignData (byte[] data, int offset, int count)
+               public byte[] SignData (byte[] buffer, int offset, int count)
                {
                        // right now only SHA1 is supported by FIPS186-2
                        HashAlgorithm hash = SHA1.Create ();
-                       byte[] toBeSigned = hash.ComputeHash (data, offset, count);
+                       byte[] toBeSigned = hash.ComputeHash (buffer, offset, count);
                        return dsa.CreateSignature (toBeSigned);
                }
 
@@ -268,7 +249,6 @@ namespace System.Security.Cryptography {
                                persisted = true;
                        }
                }
-#if NET_2_0
                // ICspAsymmetricAlgorithm
 
                [MonoTODO ("call into KeyPairPersistence to get details")]
@@ -277,21 +257,42 @@ namespace System.Security.Cryptography {
                        get { return null; }
                }
 
-               [MonoTODO ("call into CryptoConvert (doesn't currently support DSA)")]
                [ComVisible (false)]
                public byte[] ExportCspBlob (bool includePrivateParameters)
                {
-                       throw new NotImplementedException ("CryptoConvert doesn't currently support DSA");
+                       byte[] blob = null;
+                       if (includePrivateParameters)
+                               blob = CryptoConvert.ToCapiPrivateKeyBlob (this);
+                       else
+                               blob = CryptoConvert.ToCapiPublicKeyBlob (this);
+                       return blob;
                }
 
-               [MonoTODO ("call into CryptoConvert (doesn't currently support DSA)")]
                [ComVisible (false)]
-               public void ImportCspBlob (byte[] rawData)
+               public void ImportCspBlob (byte[] keyBlob)
                {
-                       if (rawData == null)
-                               throw new ArgumentNullException ("rawData");
-                       throw new NotImplementedException ("CryptoConvert doesn't currently support DSA");
+                       if (keyBlob == null)
+                               throw new ArgumentNullException ("keyBlob");
+                       DSA dsa = CryptoConvert.FromCapiKeyBlobDSA (keyBlob);
+                       if (dsa is DSACryptoServiceProvider) {
+                               DSAParameters dsap = dsa.ExportParameters (!(dsa as DSACryptoServiceProvider).PublicOnly);
+                               ImportParameters (dsap);
+                       } else {
+                               // we can't know from DSA if the private key is available
+                               try {
+                                       // so we try it...
+                                       DSAParameters dsap = dsa.ExportParameters (true);
+                                       ImportParameters (dsap);
+                               }
+                               catch {
+                                       // and fall back
+                                       DSAParameters dsap = dsa.ExportParameters (false);
+                                       ImportParameters (dsap);
+                               }
+                       }
                }
-#endif
        }
 }
+
+#endif
+