2006-07-15 Jonathan Chambers <joncham@gmail.com>
[mono.git] / mcs / class / corlib / System.Security.Cryptography / DSA.cs
old mode 100755 (executable)
new mode 100644 (file)
index a1d0b42..b15603f
@@ -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 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,15 +41,23 @@ using Mono.Security;
 
 namespace System.Security.Cryptography {
 
+#if NET_2_0
+       [ComVisible (true)]
+#endif
        public abstract class DSA : AsymmetricAlgorithm {
 
+#if NET_2_0
+               // Constructor visibility fixed in Fx 2.0
+               protected DSA ()
+#else
                // 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 ()
+#endif
                {
                }
-       
+
                public static new DSA Create ()
                {
                        return Create ("System.Security.Cryptography.DSA");
@@ -144,9 +148,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 +163,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 +182,12 @@ namespace System.Security.Cryptography {
                                        sb.Append ("</X>");
                                }
                                else if (includePrivateParameters) {
+#if NET_2_0
+                                       throw new ArgumentNullException ("X");
+#else
                                        throw new CryptographicException (
                                                Locale.GetText ("Missing private key informations"));
+#endif
                                }
 
                                sb.Append ("</DSAKeyValue>");