Copied remotely
[mono.git] / mcs / class / corlib / Test / System.Security.Cryptography / RSAPKCS1SignatureDeformatterTest.cs
1 //
2 // RSAPKCS1SignatureDeformatterTest.cs - NUnit tests for PKCS#1 v.1.5 signature.
3 //
4 // Author:
5 //      Sebastien Pouliot (sebastien@ximian.com)
6 //
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
8 // (C) 2004 Novell (http://www.novell.com)
9 //
10
11 using NUnit.Framework;
12 using System;
13 using System.Security.Cryptography;
14
15 namespace MonoTests.System.Security.Cryptography {
16
17         [TestFixture]
18         public class RSAPKCS1SignatureDeformatterTest : Assertion {
19
20                 private static byte[] shaSignature = { 0x51, 0xE1, 0x69, 0xC4, 0x84, 0x0C, 0x33, 0xD9, 0x80, 0xC0, 0xBD, 0x85, 0x87, 0x6E, 0x85, 0x91, 0xB9, 0xD5, 0xB6, 0xE1, 0xAB, 0xD3, 0x06, 0x83, 0xCF, 0x33, 0x56, 0xB9, 0xE6, 0x2C, 0x37, 0xC0, 0x08, 0xFC, 0x81, 0x15, 0xAB, 0x57, 0x80, 0xE4, 0xB9, 0x95, 0x4B, 0xFA, 0x63, 0x13, 0x5E, 0xA9, 0x6E, 0xAB, 0xB0, 0x89, 0xF3, 0xD0, 0xE9, 0xC7, 0xE7, 0xA0, 0xE2, 0xB6, 0x0A, 0xFF, 0x46, 0x2B, 0x8B, 0xC1, 0x4C, 0xEA, 0xDB, 0xEA, 0xD6, 0xF5, 0xA5, 0x2C, 0x8C, 0x1D, 0x57, 0xDF, 0x2D, 0xF0, 0x6B, 0x1D, 0xA9, 0xAE, 0x7F, 0x10, 0x02, 0xE2, 0x05, 0x7E, 0xD2, 0x80, 0xFC, 0x0E, 0x5A, 0xFD, 0xE9, 0xDB, 0x1B, 0xBA, 0xB4, 0xF7, 0x50, 0x88, 0x73, 0x95, 0xBD, 0x3C, 0xCB, 0x33, 0x02, 0xF5, 0x55, 0x10, 0xA6, 0x1B, 0xFD, 0x1D, 0xB1, 0x0E, 0xE3, 0xD0, 0xB7, 0x14, 0x8D, 0x45, 0xC4, 0xF3 };
21                 private static byte[] md5Signature = { 0xB4, 0xA9, 0xE9, 0x76, 0x04, 0x0E, 0x0E, 0x04, 0xA3, 0x68, 0x9E, 0x50, 0xD1, 0x29, 0x07, 0x22, 0x45, 0x41, 0x72, 0x1F, 0xBE, 0x74, 0x78, 0xDA, 0x5F, 0x22, 0x4B, 0x45, 0xA8, 0x5F, 0x2D, 0xA5, 0x5F, 0x01, 0x84, 0xA7, 0xF3, 0x6E, 0xB8, 0x8B, 0xF3, 0x29, 0xB2, 0x82, 0xE6, 0x5D, 0x1A, 0x98, 0xAE, 0x9C, 0x2E, 0xB0, 0xDD, 0x3F, 0x8D, 0xF9, 0x1C, 0x9E, 0x40, 0x25, 0x01, 0x9F, 0x92, 0x4E, 0xBE, 0x11, 0xE5, 0xE8, 0xE0, 0xF6, 0x3E, 0xDF, 0x8D, 0x1A, 0xC7, 0x26, 0x37, 0xF7, 0x01, 0x95, 0x48, 0xD8, 0x07, 0x4D, 0x0E, 0xDE, 0xB2, 0x76, 0xD1, 0x23, 0xBD, 0x74, 0xE9, 0xC3, 0x63, 0xB3, 0xE7, 0xCE, 0xA2, 0xEA, 0x20, 0x19, 0x1C, 0x4D, 0x8D, 0xBB, 0xAB, 0x6E, 0xB0, 0xD0, 0x08, 0xC2, 0x2B, 0x69, 0xA4, 0xF3, 0xE9, 0x23, 0xAC, 0x93, 0xB2, 0x0F, 0x90, 0x95, 0x6A, 0x66, 0xDC, 0x44 };
22
23                 private static RSA rsa;
24                 private static DSA dsa;
25
26                 [SetUp]
27                 public void SetUp () 
28                 {
29                         shaSignature [0] = 0x51;
30                         md5Signature [0] = 0xB4;
31
32                         if (rsa == null)
33                                 rsa = RSA.Create ();
34                         if (dsa == null)
35                                 dsa = DSA.Create ();
36                 }
37
38                 public void AssertEquals (string msg, byte[] array1, byte[] array2) 
39                 {
40                         AllTests.AssertEquals (msg, array1, array2);
41                 }
42
43                 [Test]
44                 public void RSAConstructors () 
45                 {
46                         RSAPKCS1SignatureDeformatter fmt;
47                         fmt = new RSAPKCS1SignatureDeformatter ();
48                         AssertNotNull ("RSAPKCS1SignatureDeformatter()", fmt);
49
50                         fmt = new RSAPKCS1SignatureDeformatter (rsa);
51                         AssertNotNull ("RSAPKCS1SignatureDeformatter(rsa)", fmt);
52                 }
53
54                 [Test]
55 #if NET_2_0
56                 [ExpectedException (typeof (ArgumentNullException))]
57 #endif
58                 public void RSAConstructor_Null ()
59                 {
60                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter (null);
61                         AssertNotNull ("RSAPKCS1SignatureDeformatter(null)", fmt);
62                 }
63
64                 [Test]
65                 [ExpectedException (typeof (InvalidCastException))]
66                 public void DSAConstructor () 
67                 {
68                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter (dsa);
69                 }
70
71                 [Test]
72                 public void SetRSAKey () 
73                 {
74                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
75                         fmt.SetKey (rsa);
76                 }
77
78                 [Test]
79                 [ExpectedException (typeof (InvalidCastException))]
80                 public void SetDSAKey () 
81                 {
82                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
83                         fmt.SetKey (dsa);
84                 }
85
86                 [Test]
87 #if NET_2_0
88                 [ExpectedException (typeof (ArgumentNullException))]
89 #endif
90                 public void SetNullKey ()
91                 {
92                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
93                         fmt.SetKey (null);
94                 }
95
96                 [Test]
97                 [ExpectedException (typeof (ArgumentNullException))]
98                 public void SetNullHashAlgorithm () 
99                 {
100                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
101                         fmt.SetHashAlgorithm (null);
102                 }
103
104                 [Test]
105                 public void SetInvalidHashAlgorithm () 
106                 {
107                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
108                         fmt.SetHashAlgorithm ("MD3");
109                 }
110
111                 [Test]
112                 public void SetSHA1HashAlgorithm () 
113                 {
114                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
115                         fmt.SetHashAlgorithm ("SHA1");
116                 }
117
118                 [Test]
119                 public void SetMD5HashAlgorithm () 
120                 {
121                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
122                         fmt.SetHashAlgorithm ("MD5");
123                 }
124
125                 [Test]
126                 public void SetSHA256HashAlgorithm () 
127                 {
128                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
129                         fmt.SetHashAlgorithm ("SHA256");
130                 }
131
132                 [Test]
133                 public void SetSHA384HashAlgorithm () 
134                 {
135                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
136                         fmt.SetHashAlgorithm ("SHA384");
137                 }
138
139                 [Test]
140                 public void SetSHA512HashAlgorithm () 
141                 {
142                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
143                         fmt.SetHashAlgorithm ("SHA512");
144                 }
145
146                 [Test]
147                 [ExpectedException (typeof (ArgumentNullException))]
148                 public void VerifySignatureNullHash () 
149                 {
150                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
151                         fmt.SetHashAlgorithm ("SHA1");
152                         fmt.SetKey (rsa);
153                         byte[] hash = null;
154                         byte[] signature = new byte [128];
155                         fmt.VerifySignature (hash, signature);
156                 }
157
158                 [Test]
159                 [ExpectedException (typeof (ArgumentNullException))]
160                 public void VerifySignatureNullSignature ()
161                 {
162                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
163                         fmt.SetHashAlgorithm ("SHA1");
164                         fmt.SetKey (rsa);
165                         byte[] hash = new byte [20];
166                         fmt.VerifySignature (hash, null);
167                 }
168
169                 [Test]
170                 [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
171                 public void VerifySignatureWithBadHash () 
172                 {
173                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
174                         fmt.SetKey (rsa);
175                         // no hash algorithm
176                         byte[] hash = new byte [1];
177                         byte[] signature = new byte [1];
178                         fmt.VerifySignature (hash, signature);
179                 }
180
181                 [Test]
182 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
183 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
184                 public void VerifySHA1SignatureWithNullKey () 
185                 {
186                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
187                         fmt.SetHashAlgorithm ("SHA1");
188                         byte[] hash = new byte [20];
189                         try {
190                                 // no key
191                                 fmt.VerifySignature (hash, shaSignature);
192                                 Fail ("VerifySHA1SignatureWithNullKey - Expected CryptographicUnexpectedOperationException but none");
193                         }
194                         catch (CryptographicUnexpectedOperationException) {
195                                 // this was expected
196                         }
197                         catch (NullReferenceException) {
198                                 // this wasn't expected - but that's the result from framework 1.1
199                         }
200                         catch (Exception e) {
201                                 Fail ("VerifySHA1SignatureWithNullKey - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
202                         }
203                 }
204
205                 private RSAPKCS1SignatureDeformatter GetDefaultDeformatter (string hashName) 
206                 {
207                         // no need for the private key 
208                         RSA rsa = RSA.Create ();
209                         rsa.ImportParameters (AllTests.GetRsaKey (false));
210
211                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
212                         fmt.SetKey (rsa);
213                         fmt.SetHashAlgorithm (hashName);
214                         return fmt;
215                 }
216
217                 [Test]
218                 public void VerifySHA1SignatureWithRSAKey () 
219                 {
220                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
221                         // good SHA1
222                         byte[] hash = new byte [20];
223                         Assert ("VerifySignature(SHA1, sign)", fmt.VerifySignature (hash, shaSignature));
224                         // bad signature
225                         shaSignature [0] = (byte) ~shaSignature [0];
226                         Assert ("VerifySignature(SHA1, badSign)", !fmt.VerifySignature (hash, shaSignature));
227                 }
228
229                 [Test]
230                 [ExpectedException (typeof (CryptographicException))]
231                 public void VerifySHA1SignatureWithWrongHashLength () 
232                 {
233                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
234                         // wrong SHA1 length
235                         byte[] hash = new byte [19];
236                         fmt.VerifySignature (hash, shaSignature);
237                 }
238                         
239                 [Test]
240                 public void VerifySHA1SignatureWithWrongSignatureLength () 
241                 {
242                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
243                         // wrong signature length
244                         byte[] hash = new byte [20];
245                         byte[] badSignature = new byte [shaSignature.Length-1];
246                         Assert ("VerifySignature(SHA1, badSign)", !fmt.VerifySignature (hash, badSignature));
247                 }
248
249                 [Test]
250                 public void VerifyMD5SignatureWithRSAKey () 
251                 {
252                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
253                         // good MD5
254                         byte[] hash = new byte [16];
255                         Assert ("VerifySignature(MD5, sign)", fmt.VerifySignature (hash, md5Signature));
256                         // bad signature
257                         md5Signature [0] = (byte) ~md5Signature [0];
258                         Assert ("VerifySignature(MD5, badSign)", !fmt.VerifySignature (hash, md5Signature));
259                 }
260
261                 [Test]
262                 [ExpectedException (typeof (CryptographicException))]
263                 public void VerifyMD5SignatureWithWrongHashLength () 
264                 {
265                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
266                         // wrong MD5 length
267                         byte[] hash = new byte [17];
268                         fmt.VerifySignature (hash, md5Signature);
269                 }
270                         
271                 [Test]
272                 public void VerifyMD5SignatureWithWrongSignatureLength () 
273                 {
274                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
275                         // wrong signature length
276                         byte[] hash = new byte [16];
277                         byte[] badSignature = new byte [md5Signature.Length-1];
278                         Assert ("VerifySignature(MD5, badSign)", !fmt.VerifySignature (hash, badSignature));
279                 }
280
281                 [Test]
282                 [ExpectedException (typeof (ArgumentNullException))]
283                 public void VerifySignatureNullHashAlgorithm () 
284                 {
285                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
286                         HashAlgorithm hash = null;
287                         byte[] data = new byte [20];
288                         // no hash algorithm
289                         byte[] signature = new byte [1];
290                         fmt.VerifySignature (hash, signature);
291                 }
292
293                 [Test]
294 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
295 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
296                 public void VerifySignatureHashNoKey ()
297                 {
298                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
299                         HashAlgorithm hash = hash = SHA1.Create ();
300                         try {
301                                 // no key
302                                 fmt.VerifySignature (hash, shaSignature);
303                                 Fail ("VerifySignatureHashNoKey - Expected CryptographicUnexpectedOperationException but none");
304                         }
305                         catch (CryptographicUnexpectedOperationException) {
306                                 // this was expected
307                         }
308                         catch (NullReferenceException) {
309                                 // this wasn't expected - but that's the result from framework 1.1
310                         }
311                         catch (Exception e) {
312                                 Fail ("VerifySignatureHashNoKey - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
313                         }
314                 }
315
316                 [Test]
317                 public void VerifySignatureSHA1Hash () 
318                 {
319                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
320                         // good SHA1
321                         byte[] data = new byte [20];
322                         HashAlgorithm hash = SHA1.Create ();
323                         hash.ComputeHash (data);
324
325                         byte[] shaSignature = { 0x7C, 0xA0, 0x13, 0xFB, 0xCB, 0x4D, 0x08, 0x02, 0x3C, 0x6B, 0x88, 0xA6, 0x25, 0x43, 0x17, 0x51, 0xA6, 0xA8, 0x8F, 0x5B, 0xAE, 0xC3, 0x57, 0x75, 0x2A, 0x8B, 0xD8, 0xBA, 0xCF, 0x9B, 0xBB, 0x5A, 0xD5, 0xB0, 0x11, 0xF2, 0xA9, 0xCC, 0xB5, 0x22, 0x59, 0xEE, 0x85, 0x49, 0x11, 0xB6, 0x9C, 0x50, 0x61, 0x4A, 0xEC, 0xA3, 0x50, 0x96, 0xE3, 0x2F, 0x1A, 0x6D, 0x9B, 0x6B, 0x6E, 0xC4, 0x50, 0x50, 0x84, 0x29, 0x92, 0x93, 0xE0, 0x0F, 0xCB, 0xBB, 0x61, 0x5D, 0x36, 0x51, 0x1A, 0xBB, 0x73, 0x75, 0x83, 0xEF, 0xDB, 0x4B, 0x2A, 0x38, 0x2C, 0x37, 0x0A, 0x1F, 0x84, 0xE0, 0x9B, 0x24, 0xDF, 0x69, 0x0E, 0x5C, 0xD9, 0xAF, 0x89, 0x72, 0x45, 0x30, 0xA1, 0xDB, 0xA8, 0x22, 0x40, 0x42, 0x07, 0xCC, 0x2A, 0x0E, 0x90, 0x9A, 0x4D, 0xE5, 0x2B, 0x48, 0x86, 0x4D, 0x01, 0x25, 0x23, 0x95, 0xB5, 0xBD };
326                         Assert ("VerifySignature(SHA1, sign)", fmt.VerifySignature (hash, shaSignature));
327                         // bad signature
328                         shaSignature [0] = (byte) ~shaSignature [0];
329                         Assert ("VerifySignature(SHA1, badSign)", !fmt.VerifySignature (hash, shaSignature));
330                 }
331
332                 [Test]
333 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
334 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
335                 public void VerifySignatureSHA1HashBadSignatureLength () 
336                 {
337                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
338                         // wrong signature length
339                         byte[] badSignature = new byte [shaSignature.Length-1];
340                         HashAlgorithm hash = SHA1.Create ();
341                         try {
342                                 fmt.VerifySignature (hash, badSignature);
343                                 Fail ("VerifySignatureSHA1HashBadSignatureLength - Expected CryptographicUnexpectedOperationException but none");
344                         }
345                         catch (CryptographicUnexpectedOperationException) {
346                                 // this was expected
347                         }
348                         catch (NullReferenceException) {
349                                 // this wasn't expected - but that's the result from framework 1.1
350                         }
351                         catch (Exception e) {
352                                 Fail ("VerifySignatureSHA1HashBadSignatureLength - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
353                         }
354                 }
355
356                 [Test]
357                 public void VerifySignatureMD5Hash () 
358                 {
359                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
360                         // good MD5
361                         byte[] data = new byte [20];
362                         HashAlgorithm hash = MD5.Create ();
363                         hash.ComputeHash (data);
364                         byte[] signature = { 0x0F, 0xD6, 0x16, 0x2C, 0x31, 0xD6, 0xD7, 0xA0, 0xE8, 0xA0, 0x89, 0x53, 0x7B, 0x36, 0x8F, 0x25, 0xA5, 0xF6, 0x4A, 0x0B, 0xD3, 0xB9, 0x9B, 0xC4, 0xAE, 0xDC, 0xD4, 0x58, 0x5C, 0xD9, 0x58, 0x61, 0xE3, 0x66, 0x89, 0xB1, 0x1E, 0x33, 0x88, 0xDF, 0x58, 0xC4, 0x2E, 0xAE, 0xE7, 0x7B, 0x96, 0x61, 0x77, 0x91, 0xBD, 0xBD, 0x99, 0x9E, 0x1C, 0x3E, 0x0A, 0x5C, 0x15, 0x69, 0x00, 0xFA, 0xEE, 0xD7, 0xDC, 0xD2, 0x62, 0xA3, 0x31, 0x6A, 0x33, 0x75, 0xC8, 0x8E, 0x47, 0x5C, 0x1E, 0xD8, 0x91, 0x36, 0x65, 0xF3, 0x67, 0x63, 0xFC, 0x2B, 0x37, 0x7D, 0xE6, 0x2C, 0x2C, 0x09, 0x45, 0xE1, 0x8D, 0x8C, 0x8F, 0xFC, 0x6A, 0x4A, 0xD1, 0x4D, 0x06, 0xF3, 0x79, 0x9F, 0xDB, 0x0F, 0x4B, 0xD1, 0x94, 0x6F, 0xC7, 0xE7, 0x4E, 0x06, 0xDA, 0xDB, 0x2A, 0x51, 0x62, 0xCA, 0x1A, 0x31, 0x51, 0x2B, 0x83, 0xDD };
365                         Assert ("VerifySignature(MD5, sign)", fmt.VerifySignature (hash, signature));
366                 }
367
368                 [Test]
369 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
370 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
371                 public void VerifyBadSignatureMD5Hash () 
372                 {
373                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
374                         // bad signature
375                         byte[] badSignature = new Byte [md5Signature.Length];
376                         Array.Copy (md5Signature, 0, badSignature, 0, badSignature.Length);
377                         badSignature[0] = (byte) ~md5Signature [0];
378                         HashAlgorithm hash = MD5.Create ();
379                         try {
380                                 fmt.VerifySignature (hash, md5Signature);
381                                 Fail ("VerifyBadSignatureMD5Hash - Expected CryptographicUnexpectedOperationException but none");
382                         }
383                         catch (CryptographicUnexpectedOperationException) {
384                                 // this was expected
385                         }
386                         catch (NullReferenceException) {
387                                 // this wasn't expected - but that's the result from framework 1.1
388                         }
389                         catch (Exception e) {
390                                 Fail ("VerifyBadSignatureMD5Hash - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
391                         }
392                 }
393
394                 [Test]
395 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
396 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
397                 public void VerifySignatureMD5HashBadSignatureLength () 
398                 {
399                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
400                         // wrong signature length
401                         byte[] badSignature = new byte [md5Signature.Length-1];
402                         HashAlgorithm hash = MD5.Create ();
403                         try {
404                                 fmt.VerifySignature (hash, md5Signature);
405                                 Fail ("VerifySignatureMD5HashBadSignatureLength - Expected CryptographicUnexpectedOperationException but none");
406                         }
407                         catch (CryptographicUnexpectedOperationException) {
408                                 // this was expected
409                         }
410                         catch (NullReferenceException) {
411                                 // this wasn't expected - but that's the result from framework 1.1
412                         }
413                         catch (Exception e) {
414                                 Fail ("VerifySignatureMD5HashBadSignatureLength - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
415                         }
416                 }
417         }
418 }