Merge pull request #323 from crazyjncsu/master
[mono.git] / mcs / class / corlib / Test / System.Security.Cryptography / DSATest.cs
1 //
2 // DSATest.cs - NUnit Test Cases for DSA
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // (C) 2002 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2005, 2008 Novell Inc. (http://www.novell.com)
9 //
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:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
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.
28 //
29
30 using NUnit.Framework;
31 using System;
32 using System.Security.Cryptography;
33
34 namespace MonoTests.System.Security.Cryptography {
35
36 #if NET_2_0
37
38         public class NonAbstractDSAForUnitTests : DSA {
39                 protected DSAParameters dsa;
40
41                 // not tested here - but we must implemented all abstract properties
42                 public override string KeyExchangeAlgorithm
43                 {
44                         get { return null; }
45                 }
46
47                 // not tested here - but we must implemented all abstract properties
48                 public override string SignatureAlgorithm
49                 {
50                         get { return null; }
51                 }
52
53                 // not tested here - but we must implemented all abstract methods
54                 public override byte [] CreateSignature (byte [] rgbHash)
55                 {
56                         return null;
57                 }
58
59                 // basic implementation for tests
60                 public override DSAParameters ExportParameters (bool includePrivateParameters)
61                 {
62                         DSAParameters dsaParams = dsa;
63                         if (!includePrivateParameters)
64                                 dsaParams.X = null;
65                         return dsaParams;
66                 }
67
68                 // basic implementation for tests
69                 public override void ImportParameters (DSAParameters parameters)
70                 {
71                         dsa.P = parameters.P;
72                         dsa.Q = parameters.Q;
73                         dsa.G = parameters.G;
74                         dsa.J = parameters.J;
75                         dsa.Y = parameters.Y;
76                         if (parameters.X != null) {
77                                 // watch out for private key zeroification
78                                 dsa.X = (byte []) parameters.X.Clone ();
79                         }
80                         dsa.Seed = parameters.Seed;
81                         dsa.Counter = parameters.Counter;
82                 }
83
84                 // not tested here - but we must implemented all abstract methods
85                 public override bool VerifySignature (byte [] rgbHash, byte [] rgbSignature)
86                 {
87                         return false;
88                 }
89
90                 protected override void Dispose (bool disposing) { }
91         }
92 #endif
93
94         [TestFixture]
95         public class DSATest {
96
97                 protected DSA dsa;
98
99                 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>";
100
101                 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>";
102
103                 [SetUp]
104                 public void SetUp ()
105                 {
106 #if NET_2_0
107                         dsa = new NonAbstractDSAForUnitTests ();
108 #else
109                         dsa = new DSACryptoServiceProvider ();
110 #endif
111                 }
112
113                 public void AssertEquals (string msg, byte [] array1, byte [] array2)
114                 {
115                         Assert.AreEqual (array1, array2, msg);
116                 }
117
118                 // may also help for DSA descendants
119                 public void AssertEquals (string message, DSAParameters expectedKey, DSAParameters actualKey, bool checkPrivateKey)
120                 {
121                         Assert.AreEqual (expectedKey.Counter, actualKey.Counter, message + " Counter");
122                         AssertEquals (message + " G", expectedKey.G, actualKey.G);
123                         AssertEquals (message + " J", expectedKey.J, actualKey.J);
124                         AssertEquals (message + " P", expectedKey.P, actualKey.P);
125                         AssertEquals (message + " Q", expectedKey.Q, actualKey.Q);
126                         AssertEquals (message + " Seed", expectedKey.Seed, actualKey.Seed);
127                         AssertEquals (message + " Y", expectedKey.Y, actualKey.Y);
128                         if (checkPrivateKey)
129                                 AssertEquals (message + " X", expectedKey.X, actualKey.X);
130                 }
131
132                 // LAMESPEC: ImportParameters inverse the byte arrays inside DSAParameters !!!
133                 // importing and exporting a DSA key (including private key)
134                 [Test]
135                 public void DSAImportPrivateExportPrivate ()
136                 {
137                         DSAParameters input = AllTests.GetKey (true);
138                         dsa.ImportParameters (input);
139                         string xmlDSA = dsa.ToXmlString (true);
140                         dsa.FromXmlString (xmlDSA);
141                         Assert.AreEqual (xmlPrivate, xmlDSA, "DSA Import Private Export Private (xml)");
142                         DSAParameters output = dsa.ExportParameters (true);
143                         AssertEquals ("DSA Import Private Export Private (binary)", AllTests.GetKey (true), output, true);
144                 }
145
146                 // importing and exporting a DSA key (without private key)
147                 [Test]
148                 public void DSAImportPrivateExportPublic ()
149                 {
150                         DSAParameters input = AllTests.GetKey (true);
151                         dsa.ImportParameters (input);
152                         string xmlDSA = dsa.ToXmlString (false);
153                         dsa.FromXmlString (xmlDSA);
154                         Assert.AreEqual (xmlPublic, xmlDSA, "DSA Import Private Export Public (xml)");
155                         DSAParameters output = dsa.ExportParameters (false);
156                         AssertEquals ("DSA Import Private Export Public (binary)", AllTests.GetKey (true), output, false);
157                 }
158
159                 // importing and exporting a DSA key (including private key)
160                 [Test]
161 #if NET_2_0
162                 [ExpectedException (typeof (ArgumentNullException))]
163 #else
164                 [ExpectedException (typeof (CryptographicException))]
165 #endif
166                 public void DSAImportPublicExportPrivate ()
167                 {
168                         DSAParameters input = AllTests.GetKey (false);
169                         dsa.ImportParameters (input);
170                         string xmlDSA = dsa.ToXmlString (true);
171                 }
172
173                 // importing and exporting a DSA key (without private key)
174                 [Test]
175                 public void DSAImportPublicExportPublic ()
176                 {
177                         DSAParameters input = AllTests.GetKey (false);
178                         dsa.ImportParameters (input);
179                         string xmlDSA = dsa.ToXmlString (false);
180                         dsa.FromXmlString (xmlDSA);
181                         Assert.AreEqual (xmlPublic, xmlDSA, "DSA Import Public Export Public (xml)");
182                         DSAParameters output = dsa.ExportParameters (false);
183                         AssertEquals ("DSA Import Public Export Public (binary)", AllTests.GetKey (false), output, true);
184                 }
185
186                 [Test]
187                 [ExpectedException (typeof (ArgumentNullException))]
188                 public void FromXmlStringNull ()
189                 {
190                         dsa.FromXmlString (null);
191                 }
192
193                 [Test]
194                 public void ToXmlStringWithoutSeed ()
195                 {
196                         DSA d = DSA.Create ();
197                         d.FromXmlString ("<DSAKeyValue><P>vb95327o8+f5lbrS9qSXxLQYTkcP/WTlJnI0fuw/vFaf7DFQe/ORdTqpa0I3okDOcRiUihzr0y58aQarlNf58MMhMcx/XqRzB2UOVZ/bt2EpfAC3CISwXHlHFoW6+dCHpc72aJOXpreWV6k0oZUg71tKMsPVUP1I8xgELArxAUE=</P><Q>5ul/yRjQ8hFv4w94ZHsP337ebjk=</Q><G>NunCU4DkWaq6IKKhRPCMBBmMgILU8Zqd3aHe0UyKZLYFSOjcKkOIPJ9iWtfDtErHcxb3yjHRV6/EndR+wX8rNsTjYDeUGg5vC6IV4Es+rRCmhVXQ7Y2N+bAH71VxPRbNC90NjgYqKwXZHf2l6c+W4XRvRvNiM5puwz+ubWcm5AA=</G><Y>hQinH+upZPNtTS2o7bi03EOybn9eHC8U61/Rax+oe00YPG+0Md7Okup6CMxZmww0n2F8W7YRZeI7Pltm8TlpmUdMmGSAiILUX585vFM19GR4XeSecqpj1BFO/x4T9tGeakoWxquEjFl4JqEuvDQwnvM76jWDmkUTI4U8kJPnHcw=</Y><J>0l0NjQKpwTJt+h8qmlXhbt4jL+OnaSZkM1zdyIPmOpNavJz7slGtoDAneoQ8STNiT+RrNqGdPbs5glAP8sXS0mdKJ6dGQuySGwGZTP9cWCq81YjRJJ74QuPJUYUruuhN0RTkiukqGzkJYQtA</J></DSAKeyValue>");
198                         d.ToXmlString (false);
199                 }
200
201                 [Test]
202                 public void ToXmlStringWithZeroCounter ()
203                 {
204                         DSA d = DSA.Create ();
205                         // <PgenCounter>AA==</PgenCounter> == 0
206                         d.FromXmlString ("<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>AA==</PgenCounter><X>fAOytZttUZFzt/AvwRinmvYKL7E=</X></DSAKeyValue>");
207                         d.ToXmlString (false);
208                 }
209
210                 [Test]
211                 public void FromXmlString_InvalidTop ()
212                 {
213                         string xml = "<a><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></a>";
214                         dsa.FromXmlString (xml);
215                         Assert.AreEqual (xmlPublic, dsa.ToXmlString (false), "InvalidTop");
216                 }
217
218                 [Test]
219                 public void FromXmlString_Embedded ()
220                 {
221                         // from bug #355464
222                         string xml = "<SigningKey version=\"1.0\">" + xmlPublic + "</SigningKey>";
223                         dsa.FromXmlString (xml);
224                         Assert.AreEqual (xmlPublic, dsa.ToXmlString (false), "Embedded");
225                 }
226
227                 [Test]
228                 public void FromXmlString_EmbeddedTwoLevelWithExtraElement ()
229                 {
230                         string xml = "<b><u>" + xmlPublic + "</u></b><i>why not ?</i>";
231                         dsa.FromXmlString (xml);
232                         Assert.AreEqual (xmlPublic, dsa.ToXmlString (false), "Deep");
233                 }
234
235                 [Test]
236                 public void FromXmlString_TwoKeys ()
237                 {
238                         DSA second = DSA.Create ();
239                         string xml = "<two>" + xmlPublic + second.ToXmlString (false) + "</two>";
240                         dsa.FromXmlString (xml);
241                         Assert.AreEqual (xmlPublic, dsa.ToXmlString (false), "TwoKeys");
242                 }
243
244                 [Test]
245                 public void FromXmlString_InvalidXml ()
246                 {
247                         string xml = "<open>" + xmlPublic + "</close>";
248                         dsa.FromXmlString (xml);
249                         Assert.AreEqual (xmlPublic, dsa.ToXmlString (false), "Embedded");
250                 }
251
252                 [Test]
253                 public void ImportExportWithoutJ ()
254                 {
255                         DSA d = DSA.Create ();
256                         DSAParameters input = AllTests.GetKey (false);
257                         input.J = null;
258                         // J is calculated (usually pre-calculated)
259                         d.ImportParameters (input);
260                         input = d.ExportParameters (false);
261                         // if J isn't imported, then it's not exportable and not part of the xml
262                         Assert.IsNull (input.J, "exported-J");
263                         Assert.AreEqual ("<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><Seed>uYM5b20luvbuyevi9TXHwekbr5s=</Seed><PgenCounter>4A==</PgenCounter></DSAKeyValue>", d.ToXmlString (false), "xml");
264                 }
265
266                 [Test]
267                 public void ImportExportWithoutY ()
268                 {
269                         DSA d = DSA.Create ();
270                         DSAParameters input = AllTests.GetKey (true);
271                         input.Y = null;
272                         // Y is calculated from X
273                         d.ImportParameters (input);
274                         Assert.AreEqual (xmlPrivate, d.ToXmlString (true), "xmlPrivate");
275                         Assert.AreEqual (xmlPublic, d.ToXmlString (false), "xmlPublic");
276                 }
277         }
278 }