Merge pull request #487 from mayerwin/patch-1
[mono.git] / mcs / class / corlib / System.Security.Cryptography / DSA.cs
old mode 100755 (executable)
new mode 100644 (file)
index a1d0b42..73abc4d
@@ -6,11 +6,7 @@
 //     Sebastien Pouliot (sebastien@ximian.com)
 //
 // Portions (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
-// (C) 2004 Novell (http://www.novell.com)
-//
-
-//
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004-2005, 2008 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -32,8 +28,8 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using System;
 using System.Globalization;
+using System.Runtime.InteropServices;
 using System.Text;
 
 using Mono.Xml;
@@ -45,18 +41,21 @@ using Mono.Security;
 
 namespace System.Security.Cryptography {
 
-       public abstract class DSA : AsymmetricAlgorithm {
+       [ComVisible (true)]
+       public abstract class DSA : AsymmetricAlgorithm {
 
-               // LAMESPEC: It says to derive new DSA implemenation from DSA class.
-               // Well it's aint gonna be easy this way.
-               // RSA constructor is public
-               internal DSA ()
+               // Constructor visibility fixed in Fx 2.0
+               protected DSA ()
                {
                }
-       
+
                public static new DSA Create ()
                {
+#if FULL_AOT_RUNTIME
+                       return new System.Security.Cryptography.DSACryptoServiceProvider ();
+#else
                        return Create ("System.Security.Cryptography.DSA");
+#endif
                }
 
                public static new DSA Create (string algName) 
@@ -74,14 +73,6 @@ namespace System.Security.Cryptography {
                                Array.Clear (parameters.X, 0, parameters.X.Length);
                }
 
-               private byte[] GetNamedParam (SecurityElement se, string param) 
-               {
-                       SecurityElement sep = se.SearchForChildByTag (param);
-                       if (sep == null)
-                               return null;
-                       return Convert.FromBase64String (sep.Text);
-               }
-
                public override void FromXmlString (string xmlString) 
                {
                        if (xmlString == null)
@@ -89,19 +80,14 @@ namespace System.Security.Cryptography {
                        
                        DSAParameters dsaParams = new DSAParameters ();
                        try {
-                               SecurityParser sp = new SecurityParser ();
-                               sp.LoadXml (xmlString);
-                               SecurityElement se = sp.ToXml ();
-                               if (se.Tag != "DSAKeyValue")
-                                       throw new Exception ();
-                               dsaParams.P = GetNamedParam (se, "P");
-                               dsaParams.Q = GetNamedParam (se, "Q");
-                               dsaParams.G = GetNamedParam (se, "G");
-                               dsaParams.J = GetNamedParam (se, "J");
-                               dsaParams.Y = GetNamedParam (se, "Y");
-                               dsaParams.X = GetNamedParam (se, "X");
-                               dsaParams.Seed = GetNamedParam (se, "Seed");
-                               byte[] counter = GetNamedParam (se, "PgenCounter");
+                               dsaParams.P = GetNamedParam (xmlString, "P");
+                               dsaParams.Q = GetNamedParam (xmlString, "Q");
+                               dsaParams.G = GetNamedParam (xmlString, "G");
+                               dsaParams.J = GetNamedParam (xmlString, "J");
+                               dsaParams.Y = GetNamedParam (xmlString, "Y");
+                               dsaParams.X = GetNamedParam (xmlString, "X");
+                               dsaParams.Seed = GetNamedParam (xmlString, "Seed");
+                               byte[] counter = GetNamedParam (xmlString, "PgenCounter");
                                if (counter != null) {
                                        byte[] counter4b = new byte [4]; // always 4 bytes
                                        Buffer.BlockCopy (counter, 0, counter4b, 0, counter.Length);
@@ -144,9 +130,13 @@ namespace System.Security.Cryptography {
                                sb.Append (Convert.ToBase64String (dsaParams.Y));
                                sb.Append( "</Y>");
 
-                               sb.Append ("<J>");
-                               sb.Append (Convert.ToBase64String (dsaParams.J));
-                               sb.Append ("</J>");
+                               if (dsaParams.J != null) {
+                                       // if J wasn't imported then it's not exported and neither 
+                                       // is part of the XML output
+                                       sb.Append ("<J>");
+                                       sb.Append (Convert.ToBase64String (dsaParams.J));
+                                       sb.Append ("</J>");
+                               }
 
                                if (dsaParams.Seed != null) {
                                        sb.Append ("<Seed>");
@@ -155,13 +145,16 @@ namespace System.Security.Cryptography {
 
                                        sb.Append ("<PgenCounter>");
                                        // the number of bytes is important (no matter == 0x00)
-                                       byte[] inArr = BitConverterLE.GetBytes (dsaParams.Counter);
-                                       int l = inArr.Length;
-                                       while (inArr[l-1] == 0x00)
-                                               l--;
-                                       byte[] c = new byte [l];
-                                       Buffer.BlockCopy (inArr, 0, c, 0, l);
-                                       sb.Append (Convert.ToBase64String (c));
+                                       if (dsaParams.Counter != 0) {
+                                               byte[] inArr = BitConverterLE.GetBytes (dsaParams.Counter);
+                                               int l = inArr.Length;
+                                               while (inArr[l-1] == 0x00)
+                                                       l--;
+
+                                               sb.Append (Convert.ToBase64String (inArr, 0, l));
+                                       } else {
+                                               sb.Append ("AA==");     // base64 encoded 0
+                                       }
                                        sb.Append ("</PgenCounter>");
                                }
 
@@ -171,8 +164,7 @@ namespace System.Security.Cryptography {
                                        sb.Append ("</X>");
                                }
                                else if (includePrivateParameters) {
-                                       throw new CryptographicException (
-                                               Locale.GetText ("Missing private key informations"));
+                                       throw new ArgumentNullException ("X");
                                }
 
                                sb.Append ("</DSAKeyValue>");