2 // System.Security.Cryptography.DSA.cs class implementation
5 // Thomas Neidhart (tome@sbox.tugraz.at)
6 // Sebastien Pouliot (spouliot@motus.com)
8 // Portions (C) 2002 Motus Technologies Inc. (http://www.motus.com)
16 // a. FIPS PUB 186-2: Digital Signature Standard (DSS)
17 // http://csrc.nist.gov/publications/fips/fips186-2/fips186-2-change1.pdf
19 namespace System.Security.Cryptography
22 /// Abstract base class for all implementations of the DSA algorithm
24 public abstract class DSA : AsymmetricAlgorithm
28 public static new DSA Create ()
30 return Create ("System.Security.Cryptography.DSA");
33 public static new DSA Create (string algName)
35 return (DSA) CryptoConfig.CreateFromName (algName);
38 public abstract byte[] CreateSignature (byte[] rgbHash);
40 public abstract DSAParameters ExportParameters (bool includePrivateParameters);
42 protected void ZeroizePrivateKey (DSAParameters parameters)
44 if (parameters.X != null)
45 Array.Clear (parameters.X, 0, parameters.X.Length);
48 public override void FromXmlString (string xmlString)
50 if (xmlString == null)
51 throw new ArgumentNullException ();
53 DSAParameters dsaParams = new DSAParameters ();
55 XmlDocument xml = new XmlDocument ();
56 xml.LoadXml (xmlString);
57 dsaParams.P = GetElement (xml, "P");
58 dsaParams.Q = GetElement (xml, "Q");
59 dsaParams.G = GetElement (xml, "G");
60 dsaParams.Y = GetElement (xml, "Y");
61 dsaParams.J = GetElement (xml, "J");
62 dsaParams.Seed = GetElement (xml, "Seed");
63 byte[] counter = GetElement (xml, "PgenCounter");
64 // else we may have an exception
65 byte[] counter4b = new byte[4];
66 Array.Copy (counter, 0, counter4b, 0, counter.Length);
67 dsaParams.Counter = BitConverter.ToInt32 (counter4b, 0);
68 dsaParams.X = GetElement (xml, "X");
69 ImportParameters (dsaParams);
72 ZeroizePrivateKey (dsaParams);
76 ZeroizePrivateKey (dsaParams);
80 public abstract void ImportParameters (DSAParameters parameters);
82 public override string ToXmlString (bool includePrivateParameters)
84 StringBuilder sb = new StringBuilder ();
85 DSAParameters dsaParams = ExportParameters (includePrivateParameters);
87 sb.Append ("<DSAKeyValue>");
90 sb.Append (Convert.ToBase64String (dsaParams.P));
94 sb.Append (Convert.ToBase64String (dsaParams.Q));
98 sb.Append (Convert.ToBase64String (dsaParams.G));
102 sb.Append (Convert.ToBase64String( dsaParams.Y));
106 sb.Append (Convert.ToBase64String (dsaParams.J));
109 sb.Append ("<Seed>");
110 sb.Append (Convert.ToBase64String (dsaParams.Seed));
111 sb.Append ("</Seed>");
113 sb.Append ("<PgenCounter>");
114 // the number of bytes is important (no matter == 0x00)
115 byte[] inArr = BitConverter.GetBytes (dsaParams.Counter);
116 int l = inArr.Length;
117 while (inArr[l-1] == 0x00)
119 byte[] c = new byte[l];
120 Array.Copy (inArr, 0, c, 0, l);
121 sb.Append (Convert.ToBase64String (c));
122 sb.Append ("</PgenCounter>");
124 if (dsaParams.X != null) {
126 sb.Append (Convert.ToBase64String (dsaParams.X));
129 else if (includePrivateParameters)
130 throw new CryptographicException();
132 sb.Append ("</DSAKeyValue>");
135 ZeroizePrivateKey (dsaParams);
139 ZeroizePrivateKey (dsaParams);
142 return sb.ToString ();
145 public abstract bool VerifySignature (byte[] rgbHash, byte[] rgbSignature);
149 } // System.Security.Cryptography