2 // DSACryptoServiceProviderTest.cs, NUnit Test Cases for DSACryptoServiceProvider
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using NUnit.Framework;
33 using System.Security.Cryptography;
35 namespace MonoTests.System.Security.Cryptography {
38 public class DSACryptoServiceProviderTest {
40 protected DSACryptoServiceProvider dsa;
41 protected DSACryptoServiceProvider disposed;
43 // static string xmlPrivate = "<DSAKeyValue><P>s/Oc0t4gj0NRqkCKi4ynJnOAEukNhjkHJPOzNsHP69kyHMUwZ3AzOkLGYOWlOo2zlYKzSbZygDDI5dCWA5gQF2ZGHEUlWJMgUyHmkybOi44cyHaX9yeGfbnoc3xF9sYgkA3vPUZaJuYMOsBp3pyPdeN8/mLU8n0ivURyP+3Ge9M=</P><Q>qkcTW+Ce0L5k8OGTUMkRoGKDc1E=</Q><G>PU/MeGp6I/FBduuwD9UPeCFzg8Ib9H5osku5nT8AhHTY8zGqetuvHhxbESt4lLz8aXzX0oIiMsusBr6E/aBdooBI36fHwW8WndCmwkB1kv7mhRIB4302UrfvC2KWQuBypfl0++a1whBMCh5VTJYH1sBkFIaVNeUbt5Q6/UdiZVY=</G><Y>shJRUdGxEYxSKM5JVol9HAdQwIK+wF9X4n9SAD++vfZOMOYi+M1yuvQAlQvnSlTTWr7CZPRVAICLgDBbqi9iN+Id60ccJ+hw3pGDfLpJ7IdFPszJEeUO+SZBwf8njGXULqSODs/NTciiX7E07rm+KflxFOg0qtWAhmYLxIkDx7s=</Y><J>AAAAAQ6LSuRiYdsocZ6rgyqIOpE1/uCO1PfEn758Lg2VW6OHJTYHNC30s0gSTG/Jt3oHYX+S8vrtNYb8kRJ/ipgcofGq2Qo/cYKP7RX2K6EJwSfWInhsNMr1JmzuK0lUKkXXXVo15fL8O2/16uEWMg==</J><Seed>uYM5b20luvbuyevi9TXHwekbr5s=</Seed><PgenCounter>4A==</PgenCounter><X>fAOytZttUZFzt/AvwRinmvYKL7E=</X></DSAKeyValue>";
44 // static string xmlPublic = "<DSAKeyValue><P>s/Oc0t4gj0NRqkCKi4ynJnOAEukNhjkHJPOzNsHP69kyHMUwZ3AzOkLGYOWlOo2zlYKzSbZygDDI5dCWA5gQF2ZGHEUlWJMgUyHmkybOi44cyHaX9yeGfbnoc3xF9sYgkA3vPUZaJuYMOsBp3pyPdeN8/mLU8n0ivURyP+3Ge9M=</P><Q>qkcTW+Ce0L5k8OGTUMkRoGKDc1E=</Q><G>PU/MeGp6I/FBduuwD9UPeCFzg8Ib9H5osku5nT8AhHTY8zGqetuvHhxbESt4lLz8aXzX0oIiMsusBr6E/aBdooBI36fHwW8WndCmwkB1kv7mhRIB4302UrfvC2KWQuBypfl0++a1whBMCh5VTJYH1sBkFIaVNeUbt5Q6/UdiZVY=</G><Y>shJRUdGxEYxSKM5JVol9HAdQwIK+wF9X4n9SAD++vfZOMOYi+M1yuvQAlQvnSlTTWr7CZPRVAICLgDBbqi9iN+Id60ccJ+hw3pGDfLpJ7IdFPszJEeUO+SZBwf8njGXULqSODs/NTciiX7E07rm+KflxFOg0qtWAhmYLxIkDx7s=</Y><J>AAAAAQ6LSuRiYdsocZ6rgyqIOpE1/uCO1PfEn758Lg2VW6OHJTYHNC30s0gSTG/Jt3oHYX+S8vrtNYb8kRJ/ipgcofGq2Qo/cYKP7RX2K6EJwSfWInhsNMr1JmzuK0lUKkXXXVo15fL8O2/16uEWMg==</J><Seed>uYM5b20luvbuyevi9TXHwekbr5s=</Seed><PgenCounter>4A==</PgenCounter></DSAKeyValue>";
46 static int minKeySize = 512;
47 private DSACryptoServiceProvider smallDsa;
49 private bool machineKeyStore;
51 public DSACryptoServiceProviderTest ()
53 disposed = new DSACryptoServiceProvider (minKeySize);
54 // FX 2.0 beta 1 bug - we must use the key before clearing it
55 // http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=dc970a7f-b82f-45e5-9d37-fb0ed72e6b41
56 int ks = disposed.KeySize;
58 // do not generate a new keypair for each test
59 smallDsa = new DSACryptoServiceProvider (minKeySize);
65 machineKeyStore = DSACryptoServiceProvider.UseMachineKeyStore;
69 public void TearDown ()
71 DSACryptoServiceProvider.UseMachineKeyStore = machineKeyStore;
74 public void AssertEquals (string msg, byte[] array1, byte[] array2)
76 AllTests.AssertEquals (msg, array1, array2);
79 // may also help for DSA descendants
80 public void AssertEquals (string message, DSAParameters expectedKey, DSAParameters actualKey, bool checkPrivateKey)
82 Assert.AreEqual (expectedKey.Counter, actualKey.Counter, message + " Counter");
83 AssertEquals (message + " G", expectedKey.G, actualKey.G);
84 AssertEquals (message + " J", expectedKey.J, actualKey.J);
85 AssertEquals (message + " P", expectedKey.P, actualKey.P);
86 AssertEquals (message + " Q", expectedKey.Q, actualKey.Q);
87 AssertEquals (message + " Seed", expectedKey.Seed, actualKey.Seed);
88 AssertEquals (message + " Y", expectedKey.Y, actualKey.Y);
90 AssertEquals (message + " X", expectedKey.X, actualKey.X);
94 public void ConstructorEmpty ()
96 // under Mono:: a new key pair isn't generated
97 dsa = new DSACryptoServiceProvider ();
98 // test default key size
99 Assert.AreEqual (1024, dsa.KeySize, "DSA ConstructorEmpty");
100 Assert.IsFalse (dsa.PersistKeyInCsp, "PersistKeyInCsp");
101 Assert.IsFalse (dsa.PublicOnly, "PublicOnly");
105 public void ConstructorKeySize ()
107 dsa = new DSACryptoServiceProvider (minKeySize);
108 // test default key size
109 Assert.AreEqual (minKeySize, dsa.KeySize, "DSA ConstructorKeySize");
110 Assert.IsFalse (dsa.PersistKeyInCsp, "PersistKeyInCsp");
111 Assert.IsFalse (dsa.PublicOnly, "PublicOnly");
115 public void ConstructorCspParameters ()
117 CspParameters csp = new CspParameters (13, null, "Mono1024");
118 // under MS a new keypair will only be generated the first time
119 dsa = new DSACryptoServiceProvider (csp);
120 // test default key size
121 Assert.AreEqual (1024, dsa.KeySize, "DSA ConstructorCspParameters");
122 Assert.IsTrue (dsa.PersistKeyInCsp, "PersistKeyInCsp");
123 Assert.IsFalse (dsa.PublicOnly, "PublicOnly");
127 public void ConstructorKeySizeCspParameters ()
129 CspParameters csp = new CspParameters (13, null, "Mono512");
130 dsa = new DSACryptoServiceProvider (minKeySize, csp);
131 Assert.AreEqual (minKeySize, dsa.KeySize, "DSA ConstructorCspParameters");
132 Assert.IsTrue (dsa.PersistKeyInCsp, "PersistKeyInCsp");
133 Assert.IsFalse (dsa.PublicOnly, "PublicOnly");
137 [Ignore ("Much too long (with MS as Mono doesn't generates the keypair unless it need it)")]
138 public void KeyGeneration ()
140 // Test every valid key size
141 KeySizes LegalKeySize = dsa.LegalKeySizes [0];
142 for (int i = LegalKeySize.MinSize; i <= LegalKeySize.MaxSize; i += LegalKeySize.SkipSize) {
143 dsa = new DSACryptoServiceProvider (i);
144 Assert.AreEqual (i, dsa.KeySize, "DSA.KeySize");
145 Assert.IsFalse (dsa.PublicOnly, "PublicOnly");
150 public void LimitedKeyGeneration ()
152 // Test smallest valid key size (performance issue)
153 using (dsa = new DSACryptoServiceProvider (minKeySize)) { // MS generates keypair here
154 Assert.AreEqual (minKeySize, dsa.KeySize, "BeforeMonoKeyGeneration.KeySize");
155 byte[] hash = new byte [20];
156 dsa.CreateSignature (hash); // mono generates keypair here
157 Assert.AreEqual (minKeySize, dsa.KeySize, "AfterMonoKeyGeneration.KeySize");
158 Assert.IsFalse (dsa.PublicOnly, "PublicOnly");
160 // here Dispose is called (with true)
164 [ExpectedException (typeof (CryptographicException))]
165 public void TooSmallKeyPair ()
167 dsa = new DSACryptoServiceProvider (384);
169 // in 2.0 MS delay the creation of the key pair until it is required
170 // (same trick that Mono almost always used ;-) but they also delay
171 // the parameter validation (what Mono didn't). So here we must "get"
172 // the key (export) to trigger the exception
173 dsa.ToXmlString (true);
177 [ExpectedException (typeof (CryptographicException))]
178 public void TooBigKeyPair ()
180 dsa = new DSACryptoServiceProvider (2048);
182 // in 2.0 MS delay the creation of the key pair until it is required
183 // (same trick that Mono almost always used ;-) but they also delay
184 // the parameter validation (what Mono didn't). So here we must "get"
185 // the key (export) to trigger the exception
186 dsa.ToXmlString (true);
190 public void Properties ()
192 dsa = new DSACryptoServiceProvider (minKeySize);
193 Assert.AreEqual (1, dsa.LegalKeySizes.Length, "LegalKeySize");
194 Assert.AreEqual (minKeySize, dsa.LegalKeySizes[0].MinSize, "LegalKeySize.MinSize");
195 Assert.AreEqual (1024, dsa.LegalKeySizes[0].MaxSize, "LegalKeySize.MaxSize");
196 Assert.AreEqual (64, dsa.LegalKeySizes[0].SkipSize, "LegalKeySize.SkipSize");
197 Assert.IsNull (dsa.KeyExchangeAlgorithm, "KeyExchangeAlgorithm");
198 Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#dsa-sha1", dsa.SignatureAlgorithm);
200 Assert.AreEqual (1, dsa.LegalKeySizes.Length, "LegalKeySize(disposed)");
201 Assert.AreEqual (minKeySize, dsa.LegalKeySizes[0].MinSize, "LegalKeySize.MinSize(disposed)");
202 Assert.AreEqual (1024, dsa.LegalKeySizes[0].MaxSize, "LegalKeySize.MaxSize(disposed)");
203 Assert.AreEqual (64, dsa.LegalKeySizes[0].SkipSize, "LegalKeySize.SkipSize(disposed)");
204 Assert.IsNull (dsa.KeyExchangeAlgorithm, "KeyExchangeAlgorithm(disposed)");
205 Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#dsa-sha1", dsa.SignatureAlgorithm);
209 [ExpectedException (typeof (ObjectDisposedException))]
210 public void CreateSignatureDisposed ()
212 byte[] hash = new byte [20];
213 disposed.CreateSignature (hash);
217 [ExpectedException (typeof (CryptographicException))]
218 public void CreateSignatureInvalidHashLength ()
220 byte[] hash = new byte [19];
221 smallDsa.CreateSignature (hash);
225 public void CreateSignature ()
227 byte[] hash = new byte [20];
228 // for Mono, no keypair has yet been generated before calling CreateSignature
229 smallDsa.CreateSignature (hash);
233 public void SignData ()
235 byte[] data = new byte [128];
236 byte[] signature = smallDsa.SignData (data);
237 Assert.IsTrue (smallDsa.VerifyData (data, signature), "SignData");
241 [ExpectedException (typeof (ObjectDisposedException))]
242 public void SignDataDisposed ()
244 byte[] data = new byte [20];
245 disposed.SignData (data);
249 [ExpectedException (typeof (ObjectDisposedException))]
250 public void SignHashDisposed ()
252 byte[] hash = new byte [20];
253 disposed.SignHash (hash, "SHA1");
257 [ExpectedException (typeof (CryptographicException))]
258 public void SignHashInvalidAlgorithm ()
260 byte[] hash = new byte [16];
261 smallDsa.SignHash (hash, "MD5");
265 [ExpectedException (typeof (ObjectDisposedException))]
266 public void VerifyDataDisposed ()
268 byte[] data = new byte [20];
269 byte[] sign = new byte [40];
270 disposed.VerifyData (data, sign);
274 [ExpectedException (typeof (CryptographicException))]
275 public void VerifyHashInvalidAlgorithm ()
277 byte[] hash = new byte [16];
278 byte[] sign = new byte [40];
279 smallDsa.VerifyHash (hash, "MD5", sign);
283 [ExpectedException (typeof (ObjectDisposedException))]
284 public void VerifyHashDisposed ()
286 byte[] hash = new byte [20];
287 byte[] sign = new byte [40];
288 disposed.VerifyHash (hash, "SHA1", sign);
292 [ExpectedException (typeof (ObjectDisposedException))]
293 public void VerifySignatureDisposed ()
295 byte[] hash = new byte [20];
296 byte[] sign = new byte [40];
297 disposed.VerifySignature (hash, sign);
301 [ExpectedException (typeof (CryptographicException))]
302 public void VerifySignatureInvalidHashLength ()
304 byte[] hash = new byte [19];
305 byte[] sign = new byte [40];
306 smallDsa.VerifySignature (hash, sign);
310 [ExpectedException (typeof (CryptographicException))]
311 public void VerifySignatureInvalidSignatureLength ()
313 byte[] hash = new byte [20];
314 byte[] sign = new byte [39];
315 smallDsa.VerifySignature (hash, sign);
319 public void VerifySignatureWithoutKey ()
321 byte[] hash = new byte [20];
322 byte[] sign = new byte [40];
323 DSACryptoServiceProvider emptyDSA = new DSACryptoServiceProvider (minKeySize);
324 // Mono hasn't generated a keypair - but it's impossible to
325 // verify a signature based on a new just generated keypair
326 Assert.IsFalse (emptyDSA.VerifySignature (hash, sign));
330 [ExpectedException (typeof (ObjectDisposedException))]
331 public void ImportDisposed ()
333 DSACryptoServiceProvider import = new DSACryptoServiceProvider (minKeySize);
335 import.ImportParameters (AllTests.GetKey (false));
339 [ExpectedException (typeof (ObjectDisposedException))]
340 public void ExportDisposed ()
342 DSAParameters param = disposed.ExportParameters (false);
346 [ExpectedException (typeof (CryptographicException))]
347 public void DSAImportMissingP ()
349 DSAParameters input = AllTests.GetKey (false);
351 dsa = new DSACryptoServiceProvider (1024);
352 dsa.ImportParameters (input);
356 [ExpectedException (typeof (CryptographicException))]
357 public void DSAImportMissingQ ()
359 DSAParameters input = AllTests.GetKey (false);
361 dsa = new DSACryptoServiceProvider (1024);
362 dsa.ImportParameters (input);
366 [ExpectedException (typeof (CryptographicException))]
367 public void DSAImportMissingG ()
369 DSAParameters input = AllTests.GetKey (false);
371 dsa = new DSACryptoServiceProvider (1024);
372 dsa.ImportParameters (input);
376 [ExpectedException (typeof (CryptographicException))]
377 public void DSAImportMissingY ()
379 DSAParameters input = AllTests.GetKey (false);
381 dsa = new DSACryptoServiceProvider (1024);
382 dsa.ImportParameters (input);
386 public void DSAImportMissingJ ()
388 DSAParameters input = AllTests.GetKey (false);
390 dsa = new DSACryptoServiceProvider (1024);
391 dsa.ImportParameters (input);
392 Assert.AreEqual (1024, dsa.KeySize, "MissingJ.KeySize");
396 public void DSAImportMissingSeed ()
398 DSAParameters input = AllTests.GetKey (false);
400 dsa = new DSACryptoServiceProvider (1024);
401 dsa.ImportParameters (input);
402 Assert.AreEqual (1024, dsa.KeySize, "MissingSeed.KeySize");
405 // all keypairs generated by CryptoAPI on Windows
406 string CapiXml512 = "<DSAKeyValue><P>tWcdz18IhYs8k1vagB94wR/sgHSANmmVlSstfMBWbIwthyT2AV64LkMLeCOdflYFEXgpmpTx5UIGGgEx8/EEuw==</P><Q>6E7WKEXRY+ASYA6nkBUP25fgz88=</Q><G>QPykdzvQ997BxXBZ+xFM10jzvZ3G73T9Aj6y2bMNdKd3/GfZwbvQui83YoRfFnYumJmV6c4cfCN1Tuf6n6jCuA==</G><Y>jrNR5BBEzW9aD9WjeJ7us0ityN8mpcqBVbHCAAWIjc0BvlY1AacPQ8xN3kKyHHKpPgMwNuFXHwks6VO68Y0etw==</Y><J>x+c7udpLkcx0I6LX2+HjLn/VHTdPr2XH9Dk4fBUnVrrjYKPVYQCIavHKFCY=</J><Seed>7qAsSVCQRpmFIfhyhYdtMybIvLI=</Seed><PgenCounter>AYU=</PgenCounter><X>DSWG2qNYTBMXD6k5j9AeCaxSVp4=</X></DSAKeyValue>";
407 string CapiXml576 = "<DSAKeyValue><P>/UpVL7nsgTsT+HzOidLQgSi9Rk8sn+jBl/RH9OzoSJhmLKM4cCl/mz3LAZNWqDS9kqDlTohYfPTVdsKA79U3uHx+xeUpk6UH</P><Q>mR7th6PKwfpwBBzp1MUGy36jxuc=</Q><G>oWjhXviie9LYZxoSCZuc45kQG+1iIJm3Omeik06b0jM9ZtVtHCXjuHRohEZfuBck8HRUxreSRT895kXzhN3/hYcqLnGMPbiZ</G><Y>kC1DnEs3hW30JtYLRQ3d46sp++6oNIjz9ncAZz6VEQg6GqjLieigAg/5ikzHjUS3Ps9xVOgGGpjSFTMSYrEl/K3obPNNFPWi</Y><J>AAAAAad4wklEWIys2shSp+zpfpu0K+/li8cJMK8K5oneqwedsMPT/ciDPVgrJYtS1WrwDoIHIAo=</J><Seed>LuRNAo/Lj+cbWgE6JB57C+8tB1I=</Seed><PgenCounter>cQ==</PgenCounter><X>h3vfdRLRPghNCXKzITtcpJo3W+U=</X></DSAKeyValue>";
408 string CapiXml640 = "<DSAKeyValue><P>1SjEwMEXKJFpmQip/SFhqQHoi3SWgXAbMA6ZMVVL/34O9CqUY2shx9E839i4mTh+euvyF9A6UhUuVRFJ8HMFpPeBqbbzrVtynU2USW74h2U=</P><Q>rYvCtKnZiH28AoErTfKCAex11YM=</Q><G>K5iAfQ50aEpTtkuHN/WQCa7bysGBT3vbPkRVUcYX0GAxZSIrXqvQJVh74FQnttk0AkSSqc1Bj3aH8DG0Ie3pqFDfyWoj4ZHh7DaqjHIUlTs=</G><Y>aqEzlNdCktrAI4PF1DNYFkPTFbjO+ittp78dThOJOaDitM0OhkdujSzwvwRQ25phVbsxlVpGesxpqI3dA6Y13v2Xbek9P+1WkS1iPZt88f8=</Y><J>AAAAATpvI+WRt+RdcSC/hd9pO+yvd8fYY+NLh+F951dEuZfulWl09ARuzwc5BHu3x2IO/NbUc3Eru82RBBmhzA==</J><Seed>QMvwX0OS+ANLT263MGWecWwQOfs=</Seed><PgenCounter>Ag==</PgenCounter><X>Gu8/RsqX34sOnfNU71OZCmL2pMw=</X></DSAKeyValue>";
409 string CapiXml704 = "<DSAKeyValue><P>v8CmmIBAKfifPNhkHtkBk9FdS5U4gq8Ex/L+0tVR1Izh7t9C2d0C1ZNbaTOTDGKV7TKOLIOXQ/sYVa3Sa033cWrfk/Z1veHd+49Xk7JjEiKnMipfXtXp8Q==</P><Q>qctfxht2I8ZbZF6f+jT4DNON00U=</Q><G>nQ4ao+mLFUD8XRr4bhVbk5siffsbCauzOQNZlWQMfHjuSTfD8+MKzhgXb/A+a0CQRBXvYu+2R8VmyRET93IlwkppXgxldSwUd3xlng/3O9ogbF06zHVjHg==</G><Y>d82MybaKc5FselhGYpGm/XROSyAsSs/blDzQAnjyPfKWdbXSaHLjyeficMmipi60/nH5ShnCnMrc22Bm9hOpMaMfhidMX6Uh5YB9EKy7Cdb6587/y6EiLA==</Y><J>AAAAASEbOtcd7wjAzuiD9qyOTA4xEKFPgOup5SuDH6FZ9FXAH+NePtGeBpXKIaLj2shrkKhsJmY5pVza/yVE9L74ajqcK2kw</J><Seed>8W3wrLCmjs81ekM3Jz3D9fxfAuw=</Seed><PgenCounter>wA==</PgenCounter><X>UWQ3ZFd/Eg2OzY9Fin/aCGLHNbQ=</X></DSAKeyValue>";
410 string CapiXml768 = "<DSAKeyValue><P>wOca55yVYJveGqx8w3acAV/LNyLmo9eAXKxnIXyEsjB+LoGjJRvJbqMy0NP9VR6qv12iZaVs/32A2y6iHMeVnQWxSnu9ieeM+Gwwh4Xg1beOeHsI4FKBH+ZTgYiNRGXT</P><Q>uPrZhRYtl7IOc38ZQnKd3StxCO8=</Q><G>S8cg4PHBvNOQ/c7zYYJTS991U5O2OibCsaOLUKFlUhkf+9DUDvJIauSzeWbQVkb6ta5oOapRbUNPfjY6OlZWHMnlBXAUpme2UBoz1IMUY2xM6Q4JKrxMv6NLCHoMhnP6</G><Y>rb/X/sFw7f0JOnSD2ygUzFFU57iIxYwRl8t8lUZ2lJ0oBdw2zy75Oud4S7vB56Xo0JJAEFSUQFobpAWpxqZ/5qLP0PzhxhjwN+Dv9S5hpcaicJrIbHKdx8A7O6P5QcR2</Y><J>AAAAAQr2+OH8gZynYhX5wG8T9iWuMu6LsLuQsbYoDcbCbMdwDRr1bNYjR1NPZNfuDtVlzXFY1nOSG67wW7HZIWYMYBBCRKbE5oK16O8VI04=</J><Seed>xjnQGEAsKqfluAuJCCs8hG3pDI8=</Seed><PgenCounter>nA==</PgenCounter><X>erfJ6egI1OnM1z1IRFhJaFN+B3w=</X></DSAKeyValue>";
411 string CapiXml832 = "<DSAKeyValue><P>pbJGnzQS8MnlCD9/odKjNmFsFxdOpsaVld2k3yNxbvJGRNPhAm3jXXL+1lAlSanpsBDRzEZfd8QQO1W5dZ3J0D9nLY15Pf49UhMvduYvEzgqofdMWxi0Wc+lfsivsa1/7tgfzVE2Jc0=</P><Q>7XixpXVHZk2vrfb8wng8Ek80sWk=</Q><G>RQKfUz7so8P76ax7pz4l8mSBwlXZbdwc0+ASgXa7lS2o1r/RsNrrrAWrLvMKQP6Nzg48uuDiI4QCoyFoi3ToiqPlV63fl4JSxQgHSCRh2VHg+iG+4fujqAPEfDWsQZGH84/jZLSpw+4=</G><Y>CakyawTgUySuImok8j6zg6y6xizp1NlPBlVmIzggP8rpaATvnapyk2T8jPsMHFsNWFiRbCQapXBvVp2Vqc2w+VOuTi2C0evjbcGT3ZdEAJoxyVkwy3I8P2hHtXtwy1c67kOADAAZZ0c=</Y><J>sp/uZOuB11am784e30URbuizTkAPUXDvQT6FyZGEIEreZGavkCOhOs8+vZ2eevYSPsr8eFC8XaMK+mOa13AQb60kYPuGPAgpw8OJnL/gwMemEbHs</J><Seed>zXDB6meB3EeaXj4xYLDxXdvJzxo=</Seed><PgenCounter>Af4=</PgenCounter><X>6APt5R3qKDQSvI04R6ibq0gRHMo=</X></DSAKeyValue>";
412 string CapiXml896 = "<DSAKeyValue><P>tdSKUdac07x6tSb7I/HuZeLTzdP5Ft0ngwcabST3LVPvC9VlczcYidHAMObeTuuL5eu+OGFr8//FmzANMkl2QlBu6L79dNraHb2TeUAApt6YYMfLJgzqXpHRzlxR33Uhox4PY3OAS1W1yNU3DvPQow==</P><Q>0eJqRrUp4/23i5geDgMmjFViKQ0=</Q><G>nWUPHcBQUpy1Wnxz4y+EI/LcfrAMP/quhxJRdcxiTpdsI/OHZXaBnieHjcrGsuOgBAfifapiEUj3mWN2wk5H3wZpxi6TDIXrweWcWIuWpB33Xr1ZHM5TYPmrFfimbav/xJh3Cd9j8wi1eackodrEQw==</G><Y>nja1XNP1H/fNsL5nKymZelvlBP7NPOTVaFp+2L3a6mVamGdl37CHMHlLzXIXYMsaAyf6pGMivwjj2caSu7wwzNdAbavWnagXSSU6pXNnAMHWS266j642xc030/pavBLU/hCV7N5VZ/EapLBUEqqpcg==</Y><J>3cghxRYCKhtnphhsgfHs90NqrPkMx4iIXMNcomAmrJdthiGPTfADM+4AykVs3KDUcEQtkU8eUiZsiDqDdKkCxFwtpdvpp7bViKPjnzl0j7yxf3Fcb2GRW033Rqo=</J><Seed>zrLLYcXgs+SWccZ5R0EeaO41l+w=</Seed><PgenCounter>Byc=</PgenCounter><X>Vbs8rxlLRHVAm5x1UdQXblNT610=</X></DSAKeyValue>";
413 string CapiXml960 = "<DSAKeyValue><P>8I6EDGOIko1Fm6r6nBWqLS7A4RhYwfdUilJINLJpsvZ7z0qa4MqqLFB57H3Iok/YLe8Z4SSqrLJDqH4Rxl28rNAOcVBuTiCHx5GNuetfeqF2knFLCg4caJIwI51AbzSJEiBp7tlGyNHdu46XOMFukdC8jkozTbzJ</P><Q>rS9PUEwcN0vYzIcmgon339LAqrE=</Q><G>X33SudRcEMlrtB5xDndktK4UNJOVPuT14ypK4JLB8DTQRqYMkHUqNnTRCYMurOJGsbNP4ebjqp4eCMyQ+zHmEKNNi6AZulFzUvzkdbfBkN8HJYJQC9tdp9U445BUF5lnIsKvv18d9gFbcUvL8aFRmNVY0M9NtSdb</G><Y>fjKb8Z7LZ1ylNo1Yzc904XRFf/AsnORT2l4+1ruPZPPlaRkGRfF8sD/B/6We+rYOJg68F8ngBmCwkzy9QfV4lkeB6n1sco03h7Zd/B6cMjC6tqAThdh70xk9CTyk46fL61qN032HfdF1ca2OqkuDdnfpbIBg0EUt</Y><J>AAAAAWOWpJWt08loRNc8cCf2Dl94/2aRbebis+SxRwqSiF77iEsMlsndA+hLX+6UOE4fFuFm7x38o6iUB1poYI0TaxQrDeaFjovIiPOovcofuP8efHiIeMR6cnugvYWXkC3ZsZASK0g=</J><Seed>iS3sRFr6k97343rVRZLsZVN0Brw=</Seed><PgenCounter>UA==</PgenCounter><X>B5SpH6Fd1S/3GuiHgkZJZLKQcFk=</X></DSAKeyValue>";
414 string CapiXml1024 = "<DSAKeyValue><P>rHUuNzvl+8HhyXeXhVePoCZPX7oBr0gIWgMBU067L+hN3AvLw2372iSgnb8cT0wbFjgcJYUfmJcsQfGJCz+ngGeVKFkqPZCrlG6VuAY3mYZ5VZY68q4EtsM4YtqjRNLDIiTdAtHYdMdWnraK58Z/Z688Drbkp0m4PgDEj+VvgcU=</P><Q>+1Qjw//auFyRrXKm3I/ehy5uph0=</Q><G>g++njdKHRxHdhIUjbd2wEsV+q0KJRiiXCbHyxBPb0L4Ahv8vG2SxQftdHwBIEuh8cOKG9/bPmvsmjPdTigbZUKhA4QmH4hhTVa0f1dtJepylCJcwvEmFDG38sw2J95XSAodPBfeuLxOBYrpLXZry5fi6P0m3BgSEqSHjCQfHQok=</G><Y>Ee57vjhzaJi+iHTfVvURccywtV7sauK997+wsk3XH6GC85htoAG42qeHKB93wtA67IuIh6gH6Mt6+RA6jQ1P+OEoCTGHUR2Fu0qhBHGU/AsNXKrrtaDc0a+abcEeZxU1ENhz7D2eOxm/ohp/If2mt2FZ/VtUOt9eOEtOCtRbyaI=</Y><J>r6nCxn/CLCgxXOgQH5c4kjyMoFg/XUB7xNFFHfI6MXI26h3astfAkHzcSJvl5lmM9iLHxgOMIviYXfWFLD++M3rglElCw7BnHccKWtQGxmg1ToFOAjC7UaCejLcDI0i7HX6WdO0YY1ZcqA2U</J><Seed>SpWGXImjbDvjqh5E64HkgSLEMtM=</Seed><PgenCounter>Bc0=</PgenCounter><X>f4PsM9PtzRlhvoLemk9NS5KZq3Q=</X></DSAKeyValue>";
416 // import/export XML keypairs
417 // so we know that Mono can use keypairs generated by CryptoAPI
419 public void CapiXmlImportExport ()
421 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider ();
423 dsa.FromXmlString (CapiXml512);
424 Assert.AreEqual (CapiXml512, dsa.ToXmlString (true), "Capi-Xml512");
426 dsa.FromXmlString (CapiXml576);
427 Assert.AreEqual (CapiXml576, dsa.ToXmlString (true), "Capi-Xml576");
429 dsa.FromXmlString (CapiXml640);
430 Assert.AreEqual (CapiXml640, dsa.ToXmlString (true), "Capi-Xml640");
432 dsa.FromXmlString (CapiXml704);
433 Assert.AreEqual (CapiXml704, dsa.ToXmlString (true), "Capi-Xml704");
435 dsa.FromXmlString (CapiXml768);
436 Assert.AreEqual (CapiXml768, dsa.ToXmlString (true), "Capi-Xml768");
438 dsa.FromXmlString (CapiXml832);
439 Assert.AreEqual (CapiXml832, dsa.ToXmlString (true), "Capi-Xml832");
441 dsa.FromXmlString (CapiXml896);
442 Assert.AreEqual (CapiXml896, dsa.ToXmlString (true), "Capi-Xml896");
444 dsa.FromXmlString (CapiXml960);
445 Assert.AreEqual (CapiXml960, dsa.ToXmlString (true), "Capi-Xml960");
447 dsa.FromXmlString (CapiXml1024);
448 Assert.AreEqual (CapiXml1024, dsa.ToXmlString (true), "Capi-Xml1024");
451 private void SignAndVerify (string msg, DSACryptoServiceProvider dsa)
453 byte[] hash = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 };
454 byte[] sign1 = dsa.CreateSignature (hash);
455 byte[] sign2 = dsa.SignData (hash, 0, hash.Length);
456 byte[] sign3 = dsa.SignData (new MemoryStream (hash));
458 // we don't need the private key to verify
459 DSAParameters param = dsa.ExportParameters (false);
460 DSACryptoServiceProvider key = (DSACryptoServiceProvider) DSA.Create ();
461 key.ImportParameters (param);
462 // the signature is never the same so the only way to know if
463 // it worked is to verify it ourselve (i.e. can't compare)
464 bool ok = key.VerifySignature (hash, sign1);
465 Assert.IsTrue (ok, msg + "-CreateSignature-VerifySignature");
467 ok = key.VerifyHash (hash, null, sign1);
468 Assert.IsTrue (ok, msg + "-CreateSignature-VerifyHash");
470 ok = key.VerifyData (hash, sign2);
471 Assert.IsTrue (ok, msg + "-SignData(byte[])-VerifyData");
473 ok = key.VerifyData (hash, sign3);
474 Assert.IsTrue (ok, msg + "-SignData(Stream)-VerifyData");
477 // Validate that we can sign with every keypair and verify the signature
478 // With Mono this means that we can use CAPI keypair to sign and verify.
479 // For Windows this doesn't mean much.
481 public void CapiSignature ()
483 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider ();
485 dsa.FromXmlString (CapiXml512);
486 SignAndVerify ("Capi-512", dsa);
488 dsa.FromXmlString (CapiXml576);
489 SignAndVerify ("Capi-576", dsa);
491 dsa.FromXmlString (CapiXml640);
492 SignAndVerify ("Capi-640", dsa);
494 dsa.FromXmlString (CapiXml704);
495 SignAndVerify ("Capi-704", dsa);
497 dsa.FromXmlString (CapiXml768);
498 SignAndVerify ("Capi-768", dsa);
500 dsa.FromXmlString (CapiXml832);
501 SignAndVerify ("Capi-832", dsa);
503 dsa.FromXmlString (CapiXml896);
504 SignAndVerify ("Capi-896", dsa);
506 dsa.FromXmlString (CapiXml960);
507 SignAndVerify ("Capi-960", dsa);
509 dsa.FromXmlString (CapiXml1024);
510 SignAndVerify ("Capi-1024", dsa);
513 // Validate that we can verify a signature made with CAPI
514 // With Mono this means that we can verify CAPI signatures.
515 // For Windows this doesn't mean much.
517 public void CapiVerify ()
519 byte[] hash = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 };
520 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider ();
522 dsa.FromXmlString (CapiXml512);
523 byte[] sign512 = { 0xCA, 0x11, 0xA4, 0xCD, 0x5B, 0xBA, 0xA1, 0xC9, 0x8C, 0xEF, 0x9A, 0xB8, 0x84, 0x09, 0x96, 0xD0, 0x1B, 0x39, 0x6D, 0x1C, 0xE1, 0xB2, 0x0E, 0xD3, 0xCE, 0xCF, 0x6A, 0x48, 0xDC, 0x22, 0x40, 0xDC, 0xCD, 0x61, 0x25, 0x7F, 0x9E, 0x1B, 0x79, 0x89 };
524 Assert.IsTrue (dsa.VerifySignature (hash, sign512), "Capi-512-Verify");
526 Assert.IsFalse (dsa.VerifySignature (hash, sign512), "Capi-512-VerBad");
528 dsa.FromXmlString (CapiXml576);
529 byte[] sign576 = { 0x10, 0x77, 0xE9, 0x4C, 0x29, 0xB0, 0xF4, 0x0E, 0x3B, 0xB7, 0x8E, 0x3A, 0x40, 0x22, 0x63, 0x70, 0xF3, 0xA5, 0xB7, 0x4A, 0x5C, 0x85, 0xB5, 0xF3, 0x4B, 0x1C, 0x4A, 0x92, 0xDD, 0x1D, 0xED, 0x63, 0x26, 0xC2, 0x42, 0x20, 0xBE, 0x33, 0x55, 0x57 };
530 Assert.IsTrue (dsa.VerifySignature (hash, sign576), "Capi-576-Verify");
532 Assert.IsFalse (dsa.VerifySignature (hash, sign576), "Capi-576-VerBad");
534 dsa.FromXmlString (CapiXml640);
535 byte[] sign640 = { 0x4C, 0x04, 0xAC, 0xE0, 0x84, 0x04, 0x5A, 0x1D, 0x9D, 0x61, 0xA1, 0x62, 0xBE, 0x11, 0xEA, 0x0D, 0x1C, 0x21, 0xC7, 0x55, 0x2C, 0x7C, 0x84, 0x4F, 0x22, 0xE9, 0xA1, 0xF1, 0x2C, 0x83, 0x13, 0x90, 0xAE, 0x36, 0xFD, 0x59, 0x32, 0x21, 0xAE, 0x0F };
536 Assert.IsTrue (dsa.VerifySignature (hash, sign640), "Capi-640-Verify");
538 Assert.IsFalse (dsa.VerifySignature (hash, sign640), "Capi-640-VerBad");
540 dsa.FromXmlString (CapiXml704);
541 byte[] sign704 = { 0xA2, 0x75, 0x32, 0xE0, 0x4B, 0xCA, 0x92, 0x51, 0x84, 0xAC, 0x7C, 0xDE, 0x97, 0xB8, 0xC3, 0x25, 0xD7, 0xF8, 0xA7, 0xE0, 0x76, 0x42, 0x7E, 0x5E, 0x5E, 0x3F, 0x82, 0xDB, 0x87, 0xBF, 0xC9, 0xCC, 0xD9, 0xA2, 0x8E, 0xA2, 0xFE, 0xD3, 0x48, 0x30 };
542 Assert.IsTrue (dsa.VerifySignature (hash, sign704), "Capi-704-Verify");
544 Assert.IsFalse (dsa.VerifySignature (hash, sign704), "Capi-704-VerBad");
546 dsa.FromXmlString (CapiXml768);
547 byte[] sign768 = { 0x92, 0x27, 0x89, 0x4B, 0xB2, 0xDF, 0xE9, 0x98, 0x5A, 0xC5, 0x78, 0x5E, 0xBD, 0x51, 0x6D, 0x10, 0x30, 0xEC, 0x14, 0x95, 0x6E, 0xEB, 0xA6, 0x5F, 0x3E, 0x47, 0x47, 0x86, 0x19, 0xD0, 0xF2, 0x9B, 0x70, 0x98, 0x97, 0x07, 0x04, 0x0C, 0x13, 0xC6 };
548 Assert.IsTrue (dsa.VerifySignature (hash, sign768), "Capi-768-Verify");
550 Assert.IsFalse (dsa.VerifySignature (hash, sign768), "Capi-768-VerBad");
552 dsa.FromXmlString (CapiXml832);
553 byte[] sign832 = { 0xC7, 0x10, 0x86, 0x86, 0x4A, 0x19, 0xBC, 0x8E, 0xC5, 0x0E, 0x53, 0xC0, 0x9E, 0x70, 0x2C, 0xFD, 0x4B, 0x9B, 0xBD, 0x79, 0x46, 0x8E, 0x9F, 0x64, 0x41, 0xF9, 0xBB, 0xDD, 0x3B, 0x93, 0x63, 0x82, 0x7B, 0x9B, 0x5B, 0x12, 0x9B, 0xAA, 0x90, 0xAD };
554 Assert.IsTrue (dsa.VerifySignature (hash, sign832), "Capi-832-Verify");
556 Assert.IsFalse (dsa.VerifySignature (hash, sign832), "Capi-832-VerBad");
558 dsa.FromXmlString (CapiXml896);
559 byte[] sign896 = { 0x7F, 0x0F, 0x5F, 0xC4, 0x44, 0x38, 0x65, 0xD7, 0x0B, 0x03, 0xD1, 0xAC, 0x77, 0xA2, 0xA2, 0x47, 0x37, 0x37, 0x42, 0xA2, 0x97, 0x23, 0xDA, 0x7F, 0xEC, 0xD5, 0x78, 0x3D, 0x5E, 0xDA, 0xA0, 0x02, 0xD6, 0x2D, 0x4B, 0xFA, 0x79, 0x7B, 0x7A, 0x87 };
560 Assert.IsTrue (dsa.VerifySignature (hash, sign896), "Capi-896-Verify");
562 Assert.IsFalse (dsa.VerifySignature (hash, sign896), "Capi-896-VerBad");
564 dsa.FromXmlString (CapiXml960);
565 byte[] sign960 = { 0x63, 0x77, 0x39, 0xE5, 0x03, 0xD2, 0x33, 0xF5, 0xFE, 0x16, 0xE4, 0x7E, 0x49, 0x4E, 0x72, 0xA0, 0x1B, 0x8D, 0x4D, 0xEC, 0x55, 0x15, 0x72, 0x1C, 0x22, 0x37, 0x4B, 0x64, 0xEB, 0x02, 0x3E, 0xC5, 0xCF, 0x32, 0x07, 0xC5, 0xD3, 0xA2, 0x02, 0x0A };
566 Assert.IsTrue (dsa.VerifySignature (hash, sign960), "Capi-960-Verify");
568 Assert.IsFalse (dsa.VerifySignature (hash, sign960), "Capi-960-VerBad");
570 dsa.FromXmlString (CapiXml1024);
571 byte[] sign1024 = { 0x1C, 0x5A, 0x9D, 0x82, 0xDD, 0xE0, 0xF5, 0x65, 0x74, 0x48, 0xFB, 0xD6, 0x27, 0x92, 0x98, 0xEA, 0xC6, 0x7F, 0x4F, 0x7C, 0x49, 0xFC, 0xCF, 0x46, 0xEB, 0x62, 0x27, 0x05, 0xFC, 0x9C, 0x40, 0x74, 0x5B, 0x13, 0x7E, 0x76, 0x9C, 0xE4, 0xF6, 0x53 };
572 Assert.IsTrue (dsa.VerifySignature (hash, sign1024), "Capi-1024-Verify");
574 Assert.IsFalse (dsa.VerifySignature (hash, sign1024), "Capi-1024-VerBad");
577 // all keypairs generated by Mono on Windows
578 string MonoXml512 = "<DSAKeyValue><P>zh9f0jwaZU7uk9A2YZkKDiAt3Rk/UFieBrs9CtvrWDNjmZyB8OZtwdt5qoZxxk/ZQdhnQPyY4Wfb2AXfcNw1oQ==</P><Q>qRl9bdSR4U2HEJ75f8v/h9ofAXs=</Q><G>aZZELrF/gAWcJnITv2pCzpwbP4d1OppRyEko5Ub6HJYL4Ez4TPTtveW+6ni90Kqq6Hbfc1x26MaU+c7s8GsTBw==</G><Y>j4sRCjiN0vdibzB0EuHFdDmB1nb8YmjEMtLzU2A7icqVbo+obwAIofNSaEW5bSc1nSGL1AFD2WIa49U6yewxXg==</Y><J>AAAAATgMk/+kNvZLy1QCT75cuivedK6Iz+bZ2g/ncnvBjjb5oM9PFxAZU+MNI57g</J><Seed>tEXsCuDb0lrfypB5kTI5iTWPqSA=</Seed><PgenCounter>xg==</PgenCounter><X>nd+0VT69+NJ0l4DuQDnOwCDR30A=</X></DSAKeyValue>";
579 string MonoXml576 = "<DSAKeyValue><P>+IVgSLz5ciuK8w5Wq56zX5ZDU/A4XrwTUngLmG4SyjtHLZUVS4npZ/gaJk02oSl4E1WUKL8yKDy1p3jewbH5bAScuprQpXr5</P><Q>01NXNM+IZtv6fl8Zr64daxJHAqk=</Q><G>ZrM3QjPyuINgj38UEqi1APX3zz7jsoCUNnslCjVgzhS0q9L44FcKPxW9WW+uh/N2PxcSqDMCd3yFvbzzgHG8+Te12UT00BHW</G><Y>CUHNKbeRzIBQncxOhaC7pKz0Gscx5zhO++BTvGRDKkOUBbvO+kf52Y+q1Hmp0OS+I3tDFU80V7Lmt5UpPw4DyzSuqukkI6Uy</Y><J>AAAAAS0PAQxeB0hDGlnmieeuKG1X8KsogV8rdq8fI9Glhu44LfGZmzBNsBCrqHSMBVVFWTerdjg=</J><Seed>eUE4tvz2nInFOGDhfMFO90p+d1o=</Seed><PgenCounter>8Q==</PgenCounter><X>iAWUFn8TSUh5GYNLB2YLyzg6KxE=</X></DSAKeyValue>";
580 string MonoXml640 = "<DSAKeyValue><P>7aE8g2fajUuMRVNVdblVtOqoFjWao0gPvS9z/rZAtfcJhZ/Q75PFUUKhBz/zMClT0O6GY695LErNUQvIH9bfgrM5Mywk5tRDV2FN61kWg00=</P><Q>ppaB4BvQvi/PtUi60y6cO55BGS8=</Q><G>g+ImQPN/hbRDu/A23Wv9MMVHRUgMGaPySPeOtdKad96iycTS0ddC/Odo7fvg11+ukiauD7Sec4UQPNGFHoT0vozAcg6SDmX4KgM4M5QDsl8=</G><Y>lsItHPOgvebvDU7o+Cns17Q1+EZ3ySG2DXQ5RyZ8zB4UmBfsC8Lnz5EliGZqej/D5OJSAjNfIx9hh+Jd6ENBNNyWDZnLIwYi5WuwhxFZ+vY=</Y><J>AAAAAW0sBVV2lXw4OIn3UIqYPzE+ith31rrZ0OnTlqYElQqSXub7Sf20ILEIYGQ3CZ2so4t1qmebmjK+cwAGdA==</J><Seed>fecSUnEdYuJJP2pIGw89Apu74Qs=</Seed><PgenCounter>Rg==</PgenCounter><X>nDBo1S2rT/XfwdHFVa7LcVoNCuE=</X></DSAKeyValue>";
581 string MonoXml704 = "<DSAKeyValue><P>lWVVsk//enAqLcmFBuw68MRuF4OBENHlnS9Fcy6idae43Di/yRkNxURLcjKAgDne6a0fPvAXMa7iyOm8r1GO6DtdR3xepApufnhQrn982lZY2D2Uzufkxw==</P><Q>3tFuyT6SXpfM746TBeufyWcVxjU=</Q><G>d5x4zOlwNSNk+nzF6rMl3iU81NHm7Org+ZjV00haTRcud1nSn9qlPMmh1Iyu2eDb/hVFYSHVriR6JL9uhnHRFgDmG0Gq3rLYjP9HwSc0bSZJhpnvMh+plg==</G><Y>gMyp9cb1b+PiJVjHm1JXyMRpPQaqXAwv9aZ/3ALUMla5xWbs8eOX0xKb03F9SiOyrrOLl7FU1NV3aPAqlxRVAEoDWfs59kwFuvtxTNCPMA9yUe9LIPmESg==</Y><J>q6TNHPV5sVaSSavn0P3kpQ/dEnw6r+Kf6vA8f1A6XwsufncwAAjLgkDD5tglPcUzuqSBNbpGnZgXHpD7mXvORGzJEm4=</J><Seed>U4J0gynSch6aQjtYthQvOrZ5FDo=</Seed><PgenCounter>2g==</PgenCounter><X>yYzu1dTYzh9veG5e+Uph0fJdOLo=</X></DSAKeyValue>";
582 string MonoXml768 = "<DSAKeyValue><P>rpEwOnT4y+tJvCg9LvuQ+PxB12r1ZghEaF7fiGh46ip2GsMfotb24tE58YpzTqiaJT3H/w5Ps7MZKE42322dX1oV9kRSmr/EYYS9GdUbnKCtfa+sA1x0FwDZgqaCZ3pV</P><Q>5eRCKf4gMUCAToisFaJsn0xQ6IM=</Q><G>bKVUkTMOgonH9RzGI1FXbLgemhVq2qSpwVce7f3qjGDPnw7uzXfLPqvMc3WYRGLB99gps+8SNdJ7pdxIprAyGG0ovl0Fq1X7Xwk9RQBqdbxnx+tLCXhkgLV/OpEnJGqs</G><Y>eX3lNXsbmfeg2Ac4dzTqQMowXV22ydnoXtOE2EggOE60WcHxiNql0yLUvFfRIdf0PnJa7/EfqzAxc1U6dHGljNWwH8mvsJXKQ/ps5fa8v5UveAzg73chUparNM9d7WAp</Y><J>wmR011Gh0XpjfIpTczt/J4pQq5L9IqrhxeQHPgRTC5/xL4Lh8cheAlVDrF8RqgnE6VgSCTOOfeq+7ySLNTdrWA3xweyS5s+lpqQEHA==</J><Seed>yWTv1DNaxQxqdKMdwPCzpP1dz6Q=</Seed><PgenCounter>PQ==</PgenCounter><X>5bS76Q72Mkw8/c9q8VZJY8XQ3vs=</X></DSAKeyValue>";
583 string MonoXml832 = "<DSAKeyValue><P>/8mh+RcX8QTo1cxuXYuSs4FihZ9IiKocX/M1gHCtsK9vWHBH+JoRPJ0huuQLp0qZzK0BncPyJdkST+HCnOuWEzBBunf2cebtAl6Bm3LYldzCdig7ptrlHsVBSOzSnBsEfl6VAGvFEw0=</P><Q>3j2ihzDNHb2OIm/Ly+928iz6r2M=</Q><G>ctmj3nFuBvbVYJo9sxmOvmnRsd+Z4bVc+ieb450uRdA+IsXSqfTN1phHUt7DQmFxBALi0ygg7PX1V+0JkZf4Ui1/lMPdznA6H+UJzV0GgJpCNwsYfrZbNFddm+wunRMuz6uTB57UKxM=</G><Y>cI8rpi0L89rBytXQCl/HFlsoTrogdzcj7/yYgzDRqnuINUA7lUJ1Vzj803p9IKQg6pNb0jRKwHcYnHAg/Lb3yWJcQHsZWvdfAG3vR/P8LM15BiXnAGuur7X8zRa1E9/vqcn77GCsuuI=</Y><J>AAAAASakjFeNPQ1kUYa8c77CkoEGZCAfG5+31W/00Tnu8QkgZMjGaUp/4vzvzgAn+KuZh0lRYbxi4IHpCEvgji7Cr+w3AFLdtRK63TwvJFkWLqx8N64MhA==</J><Seed>cblDQQ0wbr/Tpb/Pu3IcICApHx8=</Seed><PgenCounter>jQ==</PgenCounter><X>uVVaaWQdHK6O4mlrLXUouHTQQbo=</X></DSAKeyValue>";
584 string MonoXml896 = "<DSAKeyValue><P>x0mhnUZKcKqmCMpbvWfF67pBkQeJSm9I8S0BZISyeSpt9CS9qSnZlCyA+bRPA6BURXl6cPkDKMosHvkN40TWR8nj0zx5ggKmWFDZC7FaIXlvrhs4ALwNMC6Ji376r0EhZIpl+rGaOFM9uz+ya7fasQ==</P><Q>7PE0XlOwB9mi8PKk6HjW5bsU2Ds=</Q><G>r1DKk6xGIRWkE0PdC6kqsAECOZ2Q1VKZow+5xLCMAUlH+172fl4ViXw1Ihk6LTj5BYCb5NLxTO26naUoxQfY5FT/C3e9k17UWVBI7cPpNJNmIQGY2N/enI01tGWSZO5THyaXI0mvG2mI0Io8kG+E3Q==</G><Y>N+v4DSXxsSteaPQxu6eOBdhWpd2N1eV/A0RZYAcoWXb2uF8L3foq4Ake+VXgLRWDExkhBQurWBQxrD4vJbdgHeI/yKkmHL6IATDkuv0KPkZ8gMqJJPszk5UhxHxTo9+NiYKlGZO6qhJYV9MRbcpQqQ==</Y><J>11EYG/P5XTPQRJSyHboxKKol7zCm/0BnWvjsdBaPC3bHh2g6GR6uOE0uPZ+FJLVvP8iqClvWbxQF8pm/yKRaZa3SaJZjk1DNuEQZOkkxWqkti8MC2mIAXdCwlRA=</J><Seed>8nTVIayazWuhjpKfKkYnDz/Y3Yk=</Seed><PgenCounter>sAE=</PgenCounter><X>0nvKIkkjg3yHb0rw9eLM2nPExdk=</X></DSAKeyValue>";
585 string MonoXml960 = "<DSAKeyValue><P>rvLpyJmoSI71LUh2slfZmfafcV/iJj2PbR+hN80NL4YAyw22T8zG4s2q5Ez1eBN+34ob48+f2UJsvSDJrFCFWHvrifgGWkUmssDBA8iIP2oAZ8jy9YdJ0QoOa2DPi9IsK6Xo0p1IsexsPpxzHzAahs86e1tBSqob</P><Q>/lEFkFT1So7tFkYuLb03uWAlekE=</Q><G>WhRVK0LJInEG5DM42yxmrgq4J8DS4uofTyD3VEAHlKWVmE7okNDrqGI+kVvMOtePVrHsl6asIlSIk+U27QW6F8opsS2vb+ior/WcFT4HjcKgGScFk4ZTVijFFejM4pLV3FuR83nSVxn4p/HzheLX6sCISWD4Pdrp</G><Y>jHV8rnyQZLWf/6DfDUpWqRjvmU2F4EqiExYJwmfwkauwar8uzfmLCzrpMYvhF1NQ8OVyP7vYkgF2QFuMBG7X0HFNLji4mrF7DNkeUB+2LAkecpCWCgpIbPoOPXVQqe/bJgYf+8ttozbQmJTAqaGrJ2tTxweqiYCm</Y><J>sBtkEkGWVMPWdkg1WH25Q+gISLVadvRnXn4dC6n/FTqFHunYTWyh+FuLGA1l899fubwBZNrMGVhLhWdEv0wan6v0SPHQ2iz4EW5LeO/sEyXUfxhoVT7MwkMwTcMYhRmkwCFfmg==</J><Seed>aY7TaL00Rm9qsE3eU2cu3auWHVs=</Seed><PgenCounter>dw==</PgenCounter><X>kUX5eEVEaWpgm5DtHifImDLuSb8=</X></DSAKeyValue>";
586 string MonoXml1024 = "<DSAKeyValue><P>rD4HJ6rTF7dEz2RvHhnqREpu8fW0Fs8181CHqEqgUuAKG3x8euMTHlIt+kZ95RT1chLXGBRhOWT2YTgq04cTczatZhrxSWnI8hz1eHbZvRAGQ6ZP2FMvvWyJMgWnU7D5aShUM3LOqM1TgHumGwSYXhBvbj42Jjzbn80ULPkLmOU=</P><Q>pwiHLGzrt+FSJ0+IwTiS7/N3/Ls=</Q><G>OWdsYYZ0u/p6vvBrI0X+KTubx2dXG396w01dYIshLAwA4EsoDskusyr8mG4bvxFKLzGCt2ZjC7QImSKO8Y72TmNeYmmbeDc9IYENk7LuBzd8WboCRIt2gZ/KTh26TkiN8072ZVOqRZn3I35SFkUUn6PVng6EXkuhJ8EzLyvXev4=</G><Y>EcNLWKf9FJX5OUB0ON7aNASSH1SxzqvYCK8uP4H3y2LyRo7fi1JvDi/BUSyhCxfvRMG8O5QUi2yAXfNFWqEVnGUxlwNUzpx4UwKF+vYZAcnU8Wb0RJ++VT+O2NN9wou1Ys4p/gWYNsi4fk0nm8Hjx9ae5VyMXSQHEhQuUxwxWw0=</Y><J>AAAAAQf7wobrNXeeDP58+AEbzO7Gl5pTvqHfipR8ttv5yuOTahOrQFOKbH3ZpVLDF6jJsj2TMJLKsFaZsOcuEgVONT8R0nOAWbskUMxYV72492RwWylTKolkcbRyhonRbpOUFdE6xrztzijDeYRObA==</J><Seed>jiFLa4UqlTqHrUk69fHpjjc9Fe0=</Seed><PgenCounter>JQE=</PgenCounter><X>i+yoBF9nTiYNVeONGl8+/7gf1LQ=</X></DSAKeyValue>";
588 // import/export XML keypairs
589 // so we know that Windows (original MS Framework) can use keypairs generated by Mono
591 public void MonoXmlImportExport ()
593 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider ();
595 dsa.FromXmlString (MonoXml512);
596 Assert.AreEqual (MonoXml512, dsa.ToXmlString (true), "Mono-Xml512");
598 dsa.FromXmlString (MonoXml576);
599 Assert.AreEqual (MonoXml576, dsa.ToXmlString (true), "Mono-Xml576");
601 dsa.FromXmlString (MonoXml640);
602 Assert.AreEqual (MonoXml640, dsa.ToXmlString (true), "Mono-Xml640");
604 dsa.FromXmlString (MonoXml704);
605 Assert.AreEqual (MonoXml704, dsa.ToXmlString (true), "Mono-Xml704");
607 dsa.FromXmlString (MonoXml768);
608 Assert.AreEqual (MonoXml768, dsa.ToXmlString (true), "Mono-Xml768");
610 dsa.FromXmlString (MonoXml832);
611 Assert.AreEqual (MonoXml832, dsa.ToXmlString (true), "Mono-Xml832");
613 dsa.FromXmlString (MonoXml896);
614 Assert.AreEqual (MonoXml896, dsa.ToXmlString (true), "Mono-Xml896");
616 dsa.FromXmlString (MonoXml960);
617 Assert.AreEqual (MonoXml960, dsa.ToXmlString (true), "Mono-Xml960");
619 dsa.FromXmlString (MonoXml1024);
620 Assert.AreEqual (MonoXml1024, dsa.ToXmlString (true), "Mono-Xml1024");
623 // Validate that we can sign with every keypair and verify the signature
624 // With Windows this means that we can use Mono keypairs to sign and verify.
625 // For Mono this doesn't mean much.
627 public void MonoSignature ()
629 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider ();
631 dsa.FromXmlString (MonoXml512);
632 SignAndVerify ("Mono-512", dsa);
634 dsa.FromXmlString (MonoXml576);
635 SignAndVerify ("Mono-576", dsa);
637 dsa.FromXmlString (MonoXml640);
638 SignAndVerify ("Mono-640", dsa);
640 dsa.FromXmlString (MonoXml704);
641 SignAndVerify ("Mono-704", dsa);
643 dsa.FromXmlString (MonoXml768);
644 SignAndVerify ("Mono-768", dsa);
646 dsa.FromXmlString (MonoXml832);
647 SignAndVerify ("Mono-832", dsa);
649 dsa.FromXmlString (MonoXml896);
650 SignAndVerify ("Mono-896", dsa);
652 dsa.FromXmlString (MonoXml960);
653 SignAndVerify ("Mono-960", dsa);
655 dsa.FromXmlString (MonoXml1024);
656 SignAndVerify ("Mono-1024", dsa);
659 // Validate that we can verify a signature made with Mono
660 // With Windows this means that we can verify Mono signatures.
661 // For Mono this doesn't mean much.
663 public void MonoVerify ()
665 byte[] hash = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 };
666 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider ();
668 dsa.FromXmlString (MonoXml512);
669 byte[] sign512 = { 0x53, 0x44, 0x0A, 0xD7, 0x43, 0x3C, 0x1F, 0xC7, 0xCE, 0x9C, 0xAE, 0xDC, 0xFC, 0x61, 0xD5, 0xCE, 0xC9, 0x5C, 0x8D, 0x13, 0x0F, 0x66, 0x15, 0xCB, 0x9F, 0x94, 0x19, 0x18, 0x63, 0x40, 0x6D, 0x3E, 0x16, 0xA8, 0x3E, 0x9B, 0x8A, 0xC2, 0xA5, 0x38 };
670 Assert.IsTrue (dsa.VerifySignature (hash, sign512), "Mono-512-Verify");
672 Assert.IsFalse (dsa.VerifySignature (hash, sign512), "Mono-512-VerBad");
674 dsa.FromXmlString (MonoXml576);
675 byte[] sign576 = { 0xAC, 0xC8, 0xA3, 0x22, 0x3D, 0x77, 0xE1, 0x13, 0xFD, 0x65, 0x72, 0xE0, 0xA5, 0xF5, 0x94, 0xD6, 0x70, 0x70, 0x40, 0xA9, 0x10, 0x1E, 0x1D, 0xEA, 0x51, 0x68, 0x32, 0x2A, 0x24, 0x47, 0x22, 0x8D, 0xC0, 0xD0, 0x8A, 0x5A, 0x0E, 0x98, 0x5F, 0x2C };
676 Assert.IsTrue (dsa.VerifySignature (hash, sign576), "Mono-576-Verify");
678 Assert.IsFalse (dsa.VerifySignature (hash, sign576), "Mono-576-VerBad");
680 dsa.FromXmlString (MonoXml640);
681 byte[] sign640 = { 0x5E, 0x6E, 0x1F, 0x38, 0xCA, 0x0D, 0x01, 0x01, 0xBE, 0x5E, 0x8B, 0xAB, 0xCE, 0xD2, 0x42, 0x80, 0x4A, 0xBD, 0x74, 0x60, 0x56, 0x4B, 0x16, 0x4A, 0x71, 0xBC, 0xC3, 0x82, 0xE1, 0x54, 0x0D, 0xB0, 0x67, 0xB6, 0xB6, 0x71, 0x46, 0xA9, 0x01, 0x44 };
682 Assert.IsTrue (dsa.VerifySignature (hash, sign640), "Mono-640-Verify");
684 Assert.IsFalse (dsa.VerifySignature (hash, sign640), "Mono-640-VerBad");
686 dsa.FromXmlString (MonoXml704);
687 byte[] sign704 = { 0x27, 0x33, 0x45, 0xC5, 0x41, 0xC7, 0xD6, 0x5D, 0x68, 0x32, 0x50, 0x4C, 0xB3, 0x4B, 0x59, 0xCF, 0x49, 0xD1, 0x61, 0x82, 0xCF, 0x73, 0x20, 0x20, 0x3E, 0x09, 0xA3, 0x49, 0xAA, 0x22, 0x1D, 0x1D, 0x27, 0xBA, 0x9F, 0xDD, 0xE2, 0x7D, 0xCD, 0x82 };
688 Assert.IsTrue (dsa.VerifySignature (hash, sign704), "Mono-704-Verify");
690 Assert.IsFalse (dsa.VerifySignature (hash, sign704), "Mono-704-VerBad");
692 dsa.FromXmlString (MonoXml768);
693 byte[] sign768 = { 0xCA, 0x53, 0x91, 0x99, 0xAE, 0x1B, 0x97, 0xE5, 0x3B, 0x08, 0x78, 0x92, 0xD1, 0x2E, 0x0D, 0xAC, 0xB7, 0x82, 0xFB, 0xA3, 0x84, 0xEE, 0x9B, 0x5E, 0x12, 0x6C, 0x16, 0x6D, 0x97, 0xC1, 0xCF, 0x9A, 0xA9, 0xCF, 0x6A, 0x6E, 0x08, 0x45, 0xA7, 0x19 };
694 Assert.IsTrue (dsa.VerifySignature (hash, sign768), "Mono-768-Verify");
696 Assert.IsFalse (dsa.VerifySignature (hash, sign768), "Mono-768-VerBad");
698 dsa.FromXmlString (MonoXml832);
699 byte[] sign832 = { 0x7F, 0x1C, 0xC5, 0xA4, 0xDB, 0x95, 0x27, 0xD3, 0x23, 0x6E, 0xCE, 0xBC, 0xC0, 0x9D, 0x82, 0x02, 0x6E, 0xA0, 0x80, 0x5D, 0x53, 0x54, 0x3D, 0x1B, 0x1C, 0x54, 0xDD, 0x1F, 0xD5, 0x7E, 0x07, 0x60, 0xDD, 0x2A, 0xB2, 0x96, 0x3C, 0x36, 0xB3, 0x60 };
700 Assert.IsTrue (dsa.VerifySignature (hash, sign832), "Mono-832-Verify");
702 Assert.IsFalse (dsa.VerifySignature (hash, sign832), "Mono-832-VerBad");
704 dsa.FromXmlString (MonoXml896);
705 byte[] sign896 = { 0x36, 0x90, 0xA2, 0x4C, 0xDA, 0xDC, 0x6C, 0xF3, 0x83, 0xFE, 0xA8, 0x14, 0xFB, 0x01, 0x69, 0x5F, 0xFA, 0xFA, 0x71, 0xA6, 0x6F, 0xBE, 0x96, 0xB7, 0x11, 0xE7, 0xDE, 0xC7, 0x71, 0x10, 0x83, 0xEE, 0x34, 0x18, 0x4E, 0x88, 0xC1, 0xE0, 0xF9, 0x0A };
706 Assert.IsTrue (dsa.VerifySignature (hash, sign896), "Mono-896-Verify");
708 Assert.IsFalse (dsa.VerifySignature (hash, sign896), "Mono-896-VerBad");
710 dsa.FromXmlString (MonoXml960);
711 byte[] sign960 = { 0xCE, 0xE8, 0x52, 0x32, 0x9B, 0x30, 0xB5, 0x22, 0x6C, 0x21, 0x34, 0xC6, 0x09, 0xD8, 0xA8, 0x6D, 0x00, 0x87, 0x0F, 0x87, 0x21, 0x50, 0x18, 0x99, 0xED, 0x2A, 0xD3, 0xA5, 0x82, 0x8D, 0x38, 0x63, 0x21, 0xDA, 0xE1, 0x94, 0x65, 0xE1, 0x6E, 0x72 };
712 Assert.IsTrue (dsa.VerifySignature (hash, sign960), "Mono-960-Verify");
714 Assert.IsFalse (dsa.VerifySignature (hash, sign960), "Mono-960-VerBad");
716 dsa.FromXmlString (MonoXml1024);
717 byte[] sign1024 = { 0x67, 0x73, 0x4D, 0x6C, 0x0E, 0xB2, 0x85, 0xC6, 0x97, 0x5F, 0x09, 0x42, 0xEA, 0xDB, 0xC6, 0xE1, 0x6D, 0x84, 0xA0, 0x15, 0x63, 0x6C, 0xE3, 0x83, 0xA5, 0xCB, 0x58, 0xC6, 0x51, 0x3C, 0xB4, 0xD2, 0x6B, 0xA0, 0x70, 0xCE, 0xD9, 0x8D, 0x96, 0xCA };
718 Assert.IsTrue (dsa.VerifySignature (hash, sign1024), "Mono-1024-Verify");
720 Assert.IsFalse (dsa.VerifySignature (hash, sign1024), "Mono-1024-VerBad");
723 // Key Pair Persistence Tests
725 // a. .Net Framework Cryptography Frequently Asked Questions, Question 8
726 // http://www.gotdotnet.com/team/clr/cryptofaq.htm
727 // b. Generating Keys for Encryption and Decryption
728 // http://msdn.microsoft.com/library/en-us/cpguide/html/cpcongeneratingkeysforencryptiondecryption.asp
731 public void Persistence_PersistKeyInCsp_False ()
733 CspParameters csp = new CspParameters (3, null, "Persistence_PersistKeyInCsp_False");
734 // MS generates (or load) keypair here
735 // Mono load (if it exists) the keypair here
736 DSACryptoServiceProvider dsa1 = new DSACryptoServiceProvider (minKeySize, csp);
737 // Mono will generate the keypair here (if it doesn't exists)
738 string first = dsa1.ToXmlString (true);
740 // persistance is "on" by default when a CspParameters is supplied
741 Assert.IsTrue (dsa1.PersistKeyInCsp, "PersistKeyInCsp");
743 // this means nothing if we don't call Clear !!!
744 dsa1.PersistKeyInCsp = false;
745 Assert.IsFalse (dsa1.PersistKeyInCsp, "PersistKeyInCsp");
747 // reload using the same container name
748 DSACryptoServiceProvider dsa2 = new DSACryptoServiceProvider (minKeySize, csp);
749 string second = dsa2.ToXmlString (true);
751 Assert.AreEqual (first, second, "Key Pair Same Container");
755 public void Persistence_PersistKeyInCsp_True ()
757 CspParameters csp = new CspParameters (3, null, "Persistence_PersistKeyInCsp_True");
758 // MS generates (or load) keypair here
759 // Mono load (if it exists) the keypair here
760 DSACryptoServiceProvider dsa1 = new DSACryptoServiceProvider (minKeySize, csp);
761 // Mono will generate the keypair here (if it doesn't exists)
762 string first = dsa1.ToXmlString (true);
764 // persistance is "on" by default
765 Assert.IsTrue (dsa1.PersistKeyInCsp, "PersistKeyInCsp");
767 // reload using the same container name
768 DSACryptoServiceProvider dsa2 = new DSACryptoServiceProvider (minKeySize, csp);
769 string second = dsa2.ToXmlString (true);
771 Assert.AreEqual (first, second, "Key Pair Same Container");
775 public void Persistence_Delete ()
777 CspParameters csp = new CspParameters (3, null, "Persistence_Delete");
778 // MS generates (or load) keypair here
779 // Mono load (if it exists) the keypair here
780 DSACryptoServiceProvider dsa1 = new DSACryptoServiceProvider (minKeySize, csp);
781 // Mono will generate the keypair here (if it doesn't exists)
782 string original = dsa1.ToXmlString (true);
784 // note: Delete isn't well documented but can be done by
785 // flipping the PersistKeyInCsp to false and back to true.
786 dsa1.PersistKeyInCsp = false;
789 // recreate using the same container name
790 DSACryptoServiceProvider dsa2 = new DSACryptoServiceProvider (minKeySize, csp);
791 string newKeyPair = dsa2.ToXmlString (true);
793 Assert.IsTrue (original != newKeyPair, "Key Pair Deleted");
797 public void PersistKey_True ()
799 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider (minKeySize);
800 string key = dsa.ToXmlString (true);
801 dsa.PersistKeyInCsp = true;
802 Assert.AreEqual (key, dsa.ToXmlString (true), "PersistKeyInCsp-True");
806 public void PersistKey_False ()
808 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider (minKeySize);
809 string key = dsa.ToXmlString (true);
810 dsa.PersistKeyInCsp = false;
811 Assert.AreEqual (key, dsa.ToXmlString (true), "PersistKeyInCsp-False");
815 public void PersistKey_FalseTrue ()
817 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider (minKeySize);
818 string key = dsa.ToXmlString (true);
819 dsa.PersistKeyInCsp = false;
820 dsa.PersistKeyInCsp = true;
821 Assert.AreEqual (key, dsa.ToXmlString (true), "PersistKeyInCsp-FalseTrue");
825 public void UseMachineKeyStore_Default ()
827 Assert.IsFalse (DSACryptoServiceProvider.UseMachineKeyStore);
831 public void UseMachineKeyStore ()
833 // note only applicable when CspParameters isn't used - which don't
834 // help much as you can't know the generated key container name
836 DSACryptoServiceProvider.UseMachineKeyStore = true;
837 CspParameters csp = new CspParameters (13, null, "UseMachineKeyStore");
838 csp.KeyContainerName = "UseMachineKeyStore";
839 DSACryptoServiceProvider dsa = new DSACryptoServiceProvider (csp);
840 string machineKeyPair = dsa.ToXmlString (true);
843 DSACryptoServiceProvider.UseMachineKeyStore = false;
844 csp = new CspParameters (13, null, "UseMachineKeyStore");
845 csp.Flags |= CspProviderFlags.UseMachineKeyStore;
846 dsa = new DSACryptoServiceProvider (csp);
848 Assert.IsTrue (machineKeyPair != dsa.ToXmlString (true), "UseMachineKeyStore");
850 catch (CryptographicException ce) {
851 // only root can create the required directory (if inexistant)
852 // afterward anyone can use (read from) it
853 if (!(ce.InnerException is UnauthorizedAccessException))
856 catch (UnauthorizedAccessException) {
862 [Category ("NotWorking")]
863 public void CspKeyContainerInfo_NewKeypair ()
865 dsa = new DSACryptoServiceProvider (minKeySize);
866 CspKeyContainerInfo info = dsa.CspKeyContainerInfo;
867 Assert.IsTrue (info.Accessible, "Accessible");
868 // FIXME AssertNotNull ("CryptoKeySecurity", info.CryptoKeySecurity);
869 Assert.IsTrue (info.Exportable, "Exportable");
870 Assert.IsFalse (info.HardwareDevice, "HardwareDevice");
871 Assert.IsNotNull (info.KeyContainerName, "KeyContainerName");
872 Assert.AreEqual (KeyNumber.Signature, info.KeyNumber, "KeyNumber");
873 Assert.IsFalse (info.MachineKeyStore, "MachineKeyStore");
874 Assert.IsFalse (info.Protected, "Protected");
875 Assert.IsNotNull (info.ProviderName, "ProviderName");
876 Assert.AreEqual (13, info.ProviderType, "ProviderType");
877 Assert.IsTrue (info.RandomlyGenerated, "RandomlyGenerated");
878 Assert.IsFalse (info.Removable, "Removable");
879 Assert.IsNotNull (info.UniqueKeyContainerName, "UniqueKeyContainerName");
883 [Category ("NotWorking")]
884 public void CspKeyContainerInfo_ImportedKeypair ()
886 dsa = new DSACryptoServiceProvider (minKeySize);
887 DSAParameters rsap = AllTests.GetKey (true);
888 dsa.ImportParameters (rsap);
889 CspKeyContainerInfo info = dsa.CspKeyContainerInfo;
890 Assert.IsTrue (info.Accessible, "Accessible");
891 // FIXME AssertNotNull ("CryptoKeySecurity", info.CryptoKeySecurity);
892 Assert.IsTrue (info.Exportable, "Exportable");
893 Assert.IsFalse (info.HardwareDevice, "HardwareDevice");
894 Assert.IsNotNull (info.KeyContainerName, "KeyContainerName");
895 Assert.AreEqual (KeyNumber.Signature, info.KeyNumber, "KeyNumber");
896 Assert.IsFalse (info.MachineKeyStore, "MachineKeyStore");
897 Assert.IsFalse (info.Protected, "Protected");
898 Assert.IsNotNull (info.ProviderName, "ProviderName");
899 Assert.AreEqual (13, info.ProviderType, "ProviderType");
900 Assert.IsTrue (info.RandomlyGenerated, "RandomlyGenerated");
901 Assert.IsFalse (info.Removable, "Removable");
902 Assert.IsNotNull (info.UniqueKeyContainerName, "UniqueKeyContainerName");
906 [Category ("NotWorking")]
907 // This case wasn't fixed in Nov CTP
908 public void CspKeyContainerInfo_ImportedPublicKey ()
910 dsa = new DSACryptoServiceProvider (minKeySize);
911 DSAParameters rsap = AllTests.GetKey (false);
912 dsa.ImportParameters (rsap);
913 CspKeyContainerInfo info = dsa.CspKeyContainerInfo;
914 Assert.IsFalse (info.Accessible, "Accessible");
915 // info.CryptoKeySecurity throws a CryptographicException at this stage
916 // info.Exportable throws a CryptographicException at this stage
917 Assert.IsFalse (info.HardwareDevice, "HardwareDevice");
918 Assert.IsNotNull (info.KeyContainerName, "KeyContainerName");
919 Assert.AreEqual (KeyNumber.Signature, info.KeyNumber, "KeyNumber");
920 Assert.IsFalse (info.MachineKeyStore, "MachineKeyStore");
921 // info.Protected throws a CryptographicException at this stage
922 Assert.IsNotNull (info.ProviderName, "ProviderName");
923 Assert.AreEqual (13, info.ProviderType, "ProviderType");
924 Assert.IsTrue (info.RandomlyGenerated, "RandomlyGenerated");
925 Assert.IsFalse (info.Removable, "Removable");
926 // info.UniqueKeyContainerName throws a CryptographicException at this stage
931 public void ExportCspBlob_Full ()
933 dsa = new DSACryptoServiceProvider (minKeySize);
934 DSAParameters dsap = AllTests.GetKey (true);
935 dsa.ImportParameters (dsap);
937 byte[] keypair = dsa.ExportCspBlob (true);
938 Assert.AreEqual ("07-02-00-00-00-22-00-00-44-53-53-32-00-04-00-00-D3-7B-C6-ED-3F-72-44-BD-22-7D-F2-D4-62-FE-7C-E3-75-8F-9C-DE-69-C0-3A-0C-E6-26-5A-46-3D-EF-0D-90-20-C6-F6-45-7C-73-E8-B9-7D-86-27-F7-97-76-C8-1C-8E-8B-CE-26-93-E6-21-53-20-93-58-25-45-1C-46-66-17-10-98-03-96-D0-E5-C8-30-80-72-B6-49-B3-82-95-B3-8D-3A-A5-E5-60-C6-42-3A-33-70-67-30-C5-1C-32-D9-EB-CF-C1-36-B3-F3-24-07-39-86-0D-E9-12-80-73-26-A7-8C-8B-8A-40-AA-51-43-8F-20-DE-D2-9C-F3-B3-51-73-83-62-A0-11-C9-50-93-E1-F0-64-BE-D0-9E-E0-5B-13-47-AA-56-65-62-47-FD-3A-94-B7-1B-E5-35-95-86-14-64-C0-D6-07-96-4C-55-1E-0A-4C-10-C2-B5-E6-FB-74-F9-A5-72-E0-42-96-62-0B-EF-B7-52-36-7D-E3-01-12-85-E6-FE-92-75-40-C2-A6-D0-9D-16-6F-C1-C7-A7-DF-48-80-A2-5D-A0-FD-84-BE-06-AC-CB-32-22-82-D2-D7-7C-69-FC-BC-94-78-2B-11-5B-1C-1E-AF-DB-7A-AA-31-F3-D8-74-84-00-3F-9D-B9-4B-B2-68-7E-F4-1B-C2-83-73-21-78-0F-D5-0F-B0-EB-76-41-F1-23-7A-6A-78-CC-4F-3D-B1-2F-0A-F6-9A-A7-18-C1-2F-F0-B7-73-91-51-6D-9B-B5-B2-03-7C-E0-00-00-00-9B-AF-1B-E9-C1-C7-35-F5-E2-EB-C9-EE-F6-BA-25-6D-6F-39-83-B9", BitConverter.ToString (keypair));
942 public void ExportCspBlob_PublicOnly ()
944 dsa = new DSACryptoServiceProvider (minKeySize);
945 DSAParameters dsap = AllTests.GetKey (true);
946 dsa.ImportParameters (dsap);
948 byte[] pubkey = dsa.ExportCspBlob (false);
949 Assert.AreEqual ("06-02-00-00-00-22-00-00-44-53-53-31-00-04-00-00-D3-7B-C6-ED-3F-72-44-BD-22-7D-F2-D4-62-FE-7C-E3-75-8F-9C-DE-69-C0-3A-0C-E6-26-5A-46-3D-EF-0D-90-20-C6-F6-45-7C-73-E8-B9-7D-86-27-F7-97-76-C8-1C-8E-8B-CE-26-93-E6-21-53-20-93-58-25-45-1C-46-66-17-10-98-03-96-D0-E5-C8-30-80-72-B6-49-B3-82-95-B3-8D-3A-A5-E5-60-C6-42-3A-33-70-67-30-C5-1C-32-D9-EB-CF-C1-36-B3-F3-24-07-39-86-0D-E9-12-80-73-26-A7-8C-8B-8A-40-AA-51-43-8F-20-DE-D2-9C-F3-B3-51-73-83-62-A0-11-C9-50-93-E1-F0-64-BE-D0-9E-E0-5B-13-47-AA-56-65-62-47-FD-3A-94-B7-1B-E5-35-95-86-14-64-C0-D6-07-96-4C-55-1E-0A-4C-10-C2-B5-E6-FB-74-F9-A5-72-E0-42-96-62-0B-EF-B7-52-36-7D-E3-01-12-85-E6-FE-92-75-40-C2-A6-D0-9D-16-6F-C1-C7-A7-DF-48-80-A2-5D-A0-FD-84-BE-06-AC-CB-32-22-82-D2-D7-7C-69-FC-BC-94-78-2B-11-5B-1C-1E-AF-DB-7A-AA-31-F3-D8-74-84-00-3F-9D-B9-4B-B2-68-7E-F4-1B-C2-83-73-21-78-0F-D5-0F-B0-EB-76-41-F1-23-7A-6A-78-CC-4F-3D-BB-C7-03-89-C4-0B-66-86-80-D5-AA-34-E8-14-71-F9-29-BE-B9-EE-34-B1-5F-A2-C8-4D-CD-CF-0E-8E-A4-2E-D4-65-8C-27-FF-C1-41-26-F9-0E-E5-11-C9-CC-3E-45-87-EC-49-BA-7C-83-91-DE-70-E8-27-1C-47-EB-1D-E2-37-62-2F-AA-5B-30-80-8B-80-00-55-F4-64-C2-BE-5A-D3-54-4A-E7-0B-95-00-F4-BA-72-CD-F8-22-E6-30-4E-F6-BD-BE-3F-00-52-7F-E2-57-5F-C0-BE-82-C0-50-07-1C-7D-89-56-49-CE-28-52-8C-11-B1-D1-51-51-12-B2-E0-00-00-00-9B-AF-1B-E9-C1-C7-35-F5-E2-EB-C9-EE-F6-BA-25-6D-6F-39-83-B9", BitConverter.ToString (pubkey));
953 [ExpectedException (typeof (CryptographicException))]
954 public void ExportCspBlob_MissingPrivateKey ()
956 dsa = new DSACryptoServiceProvider (minKeySize);
957 DSAParameters dsap = AllTests.GetKey (false);
958 dsa.ImportParameters (dsap);
960 dsa.ExportCspBlob (true);
964 public void ExportCspBlob_MissingPrivateKey_PublicOnly ()
966 dsa = new DSACryptoServiceProvider (minKeySize);
967 DSAParameters dsap = AllTests.GetKey (false);
968 dsa.ImportParameters (dsap);
970 byte[] pubkey = dsa.ExportCspBlob (false);
971 Assert.AreEqual ("06-02-00-00-00-22-00-00-44-53-53-31-00-04-00-00-D3-7B-C6-ED-3F-72-44-BD-22-7D-F2-D4-62-FE-7C-E3-75-8F-9C-DE-69-C0-3A-0C-E6-26-5A-46-3D-EF-0D-90-20-C6-F6-45-7C-73-E8-B9-7D-86-27-F7-97-76-C8-1C-8E-8B-CE-26-93-E6-21-53-20-93-58-25-45-1C-46-66-17-10-98-03-96-D0-E5-C8-30-80-72-B6-49-B3-82-95-B3-8D-3A-A5-E5-60-C6-42-3A-33-70-67-30-C5-1C-32-D9-EB-CF-C1-36-B3-F3-24-07-39-86-0D-E9-12-80-73-26-A7-8C-8B-8A-40-AA-51-43-8F-20-DE-D2-9C-F3-B3-51-73-83-62-A0-11-C9-50-93-E1-F0-64-BE-D0-9E-E0-5B-13-47-AA-56-65-62-47-FD-3A-94-B7-1B-E5-35-95-86-14-64-C0-D6-07-96-4C-55-1E-0A-4C-10-C2-B5-E6-FB-74-F9-A5-72-E0-42-96-62-0B-EF-B7-52-36-7D-E3-01-12-85-E6-FE-92-75-40-C2-A6-D0-9D-16-6F-C1-C7-A7-DF-48-80-A2-5D-A0-FD-84-BE-06-AC-CB-32-22-82-D2-D7-7C-69-FC-BC-94-78-2B-11-5B-1C-1E-AF-DB-7A-AA-31-F3-D8-74-84-00-3F-9D-B9-4B-B2-68-7E-F4-1B-C2-83-73-21-78-0F-D5-0F-B0-EB-76-41-F1-23-7A-6A-78-CC-4F-3D-BB-C7-03-89-C4-0B-66-86-80-D5-AA-34-E8-14-71-F9-29-BE-B9-EE-34-B1-5F-A2-C8-4D-CD-CF-0E-8E-A4-2E-D4-65-8C-27-FF-C1-41-26-F9-0E-E5-11-C9-CC-3E-45-87-EC-49-BA-7C-83-91-DE-70-E8-27-1C-47-EB-1D-E2-37-62-2F-AA-5B-30-80-8B-80-00-55-F4-64-C2-BE-5A-D3-54-4A-E7-0B-95-00-F4-BA-72-CD-F8-22-E6-30-4E-F6-BD-BE-3F-00-52-7F-E2-57-5F-C0-BE-82-C0-50-07-1C-7D-89-56-49-CE-28-52-8C-11-B1-D1-51-51-12-B2-E0-00-00-00-9B-AF-1B-E9-C1-C7-35-F5-E2-EB-C9-EE-F6-BA-25-6D-6F-39-83-B9", BitConverter.ToString (pubkey));
975 public void ImportCspBlob_Keypair ()
977 byte[] blob = new byte [336] { 0x07, 0x02, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x44, 0x53, 0x53, 0x32, 0x00, 0x04, 0x00, 0x00, 0xD3,
978 0x7B, 0xC6, 0xED, 0x3F, 0x72, 0x44, 0xBD, 0x22, 0x7D, 0xF2, 0xD4, 0x62, 0xFE, 0x7C, 0xE3, 0x75, 0x8F, 0x9C, 0xDE, 0x69, 0xC0, 0x3A,
979 0x0C, 0xE6, 0x26, 0x5A, 0x46, 0x3D, 0xEF, 0x0D, 0x90, 0x20, 0xC6, 0xF6, 0x45, 0x7C, 0x73, 0xE8, 0xB9, 0x7D, 0x86, 0x27, 0xF7, 0x97,
980 0x76, 0xC8, 0x1C, 0x8E, 0x8B, 0xCE, 0x26, 0x93, 0xE6, 0x21, 0x53, 0x20, 0x93, 0x58, 0x25, 0x45, 0x1C, 0x46, 0x66, 0x17, 0x10, 0x98,
981 0x03, 0x96, 0xD0, 0xE5, 0xC8, 0x30, 0x80, 0x72, 0xB6, 0x49, 0xB3, 0x82, 0x95, 0xB3, 0x8D, 0x3A, 0xA5, 0xE5, 0x60, 0xC6, 0x42, 0x3A,
982 0x33, 0x70, 0x67, 0x30, 0xC5, 0x1C, 0x32, 0xD9, 0xEB, 0xCF, 0xC1, 0x36, 0xB3, 0xF3, 0x24, 0x07, 0x39, 0x86, 0x0D, 0xE9, 0x12, 0x80,
983 0x73, 0x26, 0xA7, 0x8C, 0x8B, 0x8A, 0x40, 0xAA, 0x51, 0x43, 0x8F, 0x20, 0xDE, 0xD2, 0x9C, 0xF3, 0xB3, 0x51, 0x73, 0x83, 0x62, 0xA0,
984 0x11, 0xC9, 0x50, 0x93, 0xE1, 0xF0, 0x64, 0xBE, 0xD0, 0x9E, 0xE0, 0x5B, 0x13, 0x47, 0xAA, 0x56, 0x65, 0x62, 0x47, 0xFD, 0x3A, 0x94,
985 0xB7, 0x1B, 0xE5, 0x35, 0x95, 0x86, 0x14, 0x64, 0xC0, 0xD6, 0x07, 0x96, 0x4C, 0x55, 0x1E, 0x0A, 0x4C, 0x10, 0xC2, 0xB5, 0xE6, 0xFB,
986 0x74, 0xF9, 0xA5, 0x72, 0xE0, 0x42, 0x96, 0x62, 0x0B, 0xEF, 0xB7, 0x52, 0x36, 0x7D, 0xE3, 0x01, 0x12, 0x85, 0xE6, 0xFE, 0x92, 0x75,
987 0x40, 0xC2, 0xA6, 0xD0, 0x9D, 0x16, 0x6F, 0xC1, 0xC7, 0xA7, 0xDF, 0x48, 0x80, 0xA2, 0x5D, 0xA0, 0xFD, 0x84, 0xBE, 0x06, 0xAC, 0xCB,
988 0x32, 0x22, 0x82, 0xD2, 0xD7, 0x7C, 0x69, 0xFC, 0xBC, 0x94, 0x78, 0x2B, 0x11, 0x5B, 0x1C, 0x1E, 0xAF, 0xDB, 0x7A, 0xAA, 0x31, 0xF3,
989 0xD8, 0x74, 0x84, 0x00, 0x3F, 0x9D, 0xB9, 0x4B, 0xB2, 0x68, 0x7E, 0xF4, 0x1B, 0xC2, 0x83, 0x73, 0x21, 0x78, 0x0F, 0xD5, 0x0F, 0xB0,
990 0xEB, 0x76, 0x41, 0xF1, 0x23, 0x7A, 0x6A, 0x78, 0xCC, 0x4F, 0x3D, 0xB1, 0x2F, 0x0A, 0xF6, 0x9A, 0xA7, 0x18, 0xC1, 0x2F, 0xF0, 0xB7,
991 0x73, 0x91, 0x51, 0x6D, 0x9B, 0xB5, 0xB2, 0x03, 0x7C, 0xE0, 0x00, 0x00, 0x00, 0x9B, 0xAF, 0x1B, 0xE9, 0xC1, 0xC7, 0x35, 0xF5, 0xE2,
992 0xEB, 0xC9, 0xEE, 0xF6, 0xBA, 0x25, 0x6D, 0x6F, 0x39, 0x83, 0xB9 };
993 dsa = new DSACryptoServiceProvider (minKeySize);
994 dsa.ImportCspBlob (blob);
996 byte[] keypair = dsa.ExportCspBlob (true);
997 for (int i = 0; i < blob.Length; i++)
998 Assert.AreEqual (blob[i], keypair[i], i.ToString ());
1002 public void ExportCspBlob_PublicKey ()
1004 byte[] blob = new byte [444] { 0x06, 0x02, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x44, 0x53, 0x53, 0x31, 0x00, 0x04, 0x00, 0x00, 0xD3,
1005 0x7B, 0xC6, 0xED, 0x3F, 0x72, 0x44, 0xBD, 0x22, 0x7D, 0xF2, 0xD4, 0x62, 0xFE, 0x7C, 0xE3, 0x75, 0x8F, 0x9C, 0xDE, 0x69, 0xC0, 0x3A,
1006 0x0C, 0xE6, 0x26, 0x5A, 0x46, 0x3D, 0xEF, 0x0D, 0x90, 0x20, 0xC6, 0xF6, 0x45, 0x7C, 0x73, 0xE8, 0xB9, 0x7D, 0x86, 0x27, 0xF7, 0x97,
1007 0x76, 0xC8, 0x1C, 0x8E, 0x8B, 0xCE, 0x26, 0x93, 0xE6, 0x21, 0x53, 0x20, 0x93, 0x58, 0x25, 0x45, 0x1C, 0x46, 0x66, 0x17, 0x10, 0x98,
1008 0x03, 0x96, 0xD0, 0xE5, 0xC8, 0x30, 0x80, 0x72, 0xB6, 0x49, 0xB3, 0x82, 0x95, 0xB3, 0x8D, 0x3A, 0xA5, 0xE5, 0x60, 0xC6, 0x42, 0x3A,
1009 0x33, 0x70, 0x67, 0x30, 0xC5, 0x1C, 0x32, 0xD9, 0xEB, 0xCF, 0xC1, 0x36, 0xB3, 0xF3, 0x24, 0x07, 0x39, 0x86, 0x0D, 0xE9, 0x12, 0x80,
1010 0x73, 0x26, 0xA7, 0x8C, 0x8B, 0x8A, 0x40, 0xAA, 0x51, 0x43, 0x8F, 0x20, 0xDE, 0xD2, 0x9C, 0xF3, 0xB3, 0x51, 0x73, 0x83, 0x62, 0xA0,
1011 0x11, 0xC9, 0x50, 0x93, 0xE1, 0xF0, 0x64, 0xBE, 0xD0, 0x9E, 0xE0, 0x5B, 0x13, 0x47, 0xAA, 0x56, 0x65, 0x62, 0x47, 0xFD, 0x3A, 0x94,
1012 0xB7, 0x1B, 0xE5, 0x35, 0x95, 0x86, 0x14, 0x64, 0xC0, 0xD6, 0x07, 0x96, 0x4C, 0x55, 0x1E, 0x0A, 0x4C, 0x10, 0xC2, 0xB5, 0xE6, 0xFB,
1013 0x74, 0xF9, 0xA5, 0x72, 0xE0, 0x42, 0x96, 0x62, 0x0B, 0xEF, 0xB7, 0x52, 0x36, 0x7D, 0xE3, 0x01, 0x12, 0x85, 0xE6, 0xFE, 0x92, 0x75,
1014 0x40, 0xC2, 0xA6, 0xD0, 0x9D, 0x16, 0x6F, 0xC1, 0xC7, 0xA7, 0xDF, 0x48, 0x80, 0xA2, 0x5D, 0xA0, 0xFD, 0x84, 0xBE, 0x06, 0xAC, 0xCB,
1015 0x32, 0x22, 0x82, 0xD2, 0xD7, 0x7C, 0x69, 0xFC, 0xBC, 0x94, 0x78, 0x2B, 0x11, 0x5B, 0x1C, 0x1E, 0xAF, 0xDB, 0x7A, 0xAA, 0x31, 0xF3,
1016 0xD8, 0x74, 0x84, 0x00, 0x3F, 0x9D, 0xB9, 0x4B, 0xB2, 0x68, 0x7E, 0xF4, 0x1B, 0xC2, 0x83, 0x73, 0x21, 0x78, 0x0F, 0xD5, 0x0F, 0xB0,
1017 0xEB, 0x76, 0x41, 0xF1, 0x23, 0x7A, 0x6A, 0x78, 0xCC, 0x4F, 0x3D, 0xBB, 0xC7, 0x03, 0x89, 0xC4, 0x0B, 0x66, 0x86, 0x80, 0xD5, 0xAA,
1018 0x34, 0xE8, 0x14, 0x71, 0xF9, 0x29, 0xBE, 0xB9, 0xEE, 0x34, 0xB1, 0x5F, 0xA2, 0xC8, 0x4D, 0xCD, 0xCF, 0x0E, 0x8E, 0xA4, 0x2E, 0xD4,
1019 0x65, 0x8C, 0x27, 0xFF, 0xC1, 0x41, 0x26, 0xF9, 0x0E, 0xE5, 0x11, 0xC9, 0xCC, 0x3E, 0x45, 0x87, 0xEC, 0x49, 0xBA, 0x7C, 0x83, 0x91,
1020 0xDE, 0x70, 0xE8, 0x27, 0x1C, 0x47, 0xEB, 0x1D, 0xE2, 0x37, 0x62, 0x2F, 0xAA, 0x5B, 0x30, 0x80, 0x8B, 0x80, 0x00, 0x55, 0xF4, 0x64,
1021 0xC2, 0xBE, 0x5A, 0xD3, 0x54, 0x4A, 0xE7, 0x0B, 0x95, 0x00, 0xF4, 0xBA, 0x72, 0xCD, 0xF8, 0x22, 0xE6, 0x30, 0x4E, 0xF6, 0xBD, 0xBE,
1022 0x3F, 0x00, 0x52, 0x7F, 0xE2, 0x57, 0x5F, 0xC0, 0xBE, 0x82, 0xC0, 0x50, 0x07, 0x1C, 0x7D, 0x89, 0x56, 0x49, 0xCE, 0x28, 0x52, 0x8C,
1023 0x11, 0xB1, 0xD1, 0x51, 0x51, 0x12, 0xB2, 0xE0, 0x00, 0x00, 0x00, 0x9B, 0xAF, 0x1B, 0xE9, 0xC1, 0xC7, 0x35, 0xF5, 0xE2, 0xEB, 0xC9,
1024 0xEE, 0xF6, 0xBA, 0x25, 0x6D, 0x6F, 0x39, 0x83, 0xB9 };
1025 dsa = new DSACryptoServiceProvider (minKeySize);
1026 dsa.ImportCspBlob (blob);
1028 byte[] pubkey = dsa.ExportCspBlob (false);
1029 for (int i = 0; i < blob.Length; i++)
1030 Assert.AreEqual (blob[i], pubkey[i], i.ToString ());
1034 [ExpectedException (typeof (ArgumentNullException))]
1035 public void ImportCspBlob_Null ()
1037 dsa = new DSACryptoServiceProvider (minKeySize);
1038 dsa.ImportCspBlob (null);
1042 [ExpectedException (typeof (CryptographicException))]
1043 public void ImportCspBlob_Bad ()
1045 byte[] blob = new byte [148]; // valid size for public key
1046 dsa = new DSACryptoServiceProvider (minKeySize);
1047 dsa.ImportCspBlob (blob);