imported everything from my branch (which is slightly harmless).
[mono.git] / mcs / class / corlib / Test / System.Security.Cryptography / DSATest.cs
1 //
2 // DSATest.cs - NUnit Test Cases for DSA
3 //
4 // Author:\r
5 //      Sebastien Pouliot  <sebastien@ximian.com>\r
6 //
7 // (C) 2002 Motus Technologies Inc. (http://www.motus.com)\r
8 // Copyright (C) 2005 Novell Inc. (http://www.novell.com)\r
9 //\r
10 // Permission is hereby granted, free of charge, to any person obtaining\r
11 // a copy of this software and associated documentation files (the\r
12 // "Software"), to deal in the Software without restriction, including\r
13 // without limitation the rights to use, copy, modify, merge, publish,\r
14 // distribute, sublicense, and/or sell copies of the Software, and to\r
15 // permit persons to whom the Software is furnished to do so, subject to\r
16 // the following conditions:\r
17 // \r
18 // The above copyright notice and this permission notice shall be\r
19 // included in all copies or substantial portions of the Software.\r
20 // \r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
28 //\r
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;\r
72                 dsa.Q = parameters.Q;\r
73                 dsa.G = parameters.G;\r
74                 dsa.J = parameters.J;\r
75                 dsa.Y = parameters.Y;\r
76                 if (parameters.X != null) {\r
77                         // watch out for private key zeroification\r
78                         dsa.X = (byte[])parameters.X.Clone ();\r
79                 }\r
80                 dsa.Seed = parameters.Seed;\r
81                 dsa.Counter = parameters.Counter;\r
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 : Assertion {
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                 AllTests.AssertEquals (msg, array1, array2);
116         }
117
118         // may also help for DSA descendants
119         public void AssertEquals (string message, DSAParameters expectedKey, DSAParameters actualKey, bool checkPrivateKey) 
120         {
121                 AssertEquals( message + " Counter", expectedKey.Counter, actualKey.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                 AssertEquals ("DSA Import Private Export Private (xml)", xmlPrivate, xmlDSA);
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                 AssertEquals ("DSA Import Private Export Public (xml)", xmlPublic, xmlDSA);
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\r
162         [ExpectedException (typeof (ArgumentNullException))]\r
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                 AssertEquals ("DSA Import Public Export Public (xml)", xmlPublic, xmlDSA);
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         }\r
200 \r
201         [Test]\r
202         public void ToXmlStringWithZeroCounter ()\r
203         {\r
204                 DSA d = DSA.Create ();\r
205                 // <PgenCounter>AA==</PgenCounter> == 0\r
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>");\r
207                 d.ToXmlString (false);\r
208         }\r
209 }
210
211 }