New test.
[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 // Copyright (C) 2004-2006 Novell, Inc (http://www.novell.com)
9 //
10
11 using NUnit.Framework;
12 using System;
13 using System.Security.Cryptography;
14 using System.Text;
15
16 namespace MonoTests.System.Security.Cryptography {
17
18         [TestFixture]
19         public class RSAPKCS1SignatureDeformatterTest : Assertion {
20
21                 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 };
22                 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 };
23
24                 private static RSA rsa;
25                 private static DSA dsa;
26
27                 [SetUp]
28                 public void SetUp () 
29                 {
30                         shaSignature [0] = 0x51;
31                         md5Signature [0] = 0xB4;
32
33                         if (rsa == null)
34                                 rsa = RSA.Create ();
35                         if (dsa == null)
36                                 dsa = DSA.Create ();
37                 }
38
39                 public void AssertEquals (string msg, byte[] array1, byte[] array2) 
40                 {
41                         AllTests.AssertEquals (msg, array1, array2);
42                 }
43
44                 [Test]
45                 public void RSAConstructors () 
46                 {
47                         RSAPKCS1SignatureDeformatter fmt;
48                         fmt = new RSAPKCS1SignatureDeformatter ();
49                         AssertNotNull ("RSAPKCS1SignatureDeformatter()", fmt);
50
51                         fmt = new RSAPKCS1SignatureDeformatter (rsa);
52                         AssertNotNull ("RSAPKCS1SignatureDeformatter(rsa)", fmt);
53                 }
54
55                 [Test]
56 #if NET_2_0
57                 [ExpectedException (typeof (ArgumentNullException))]
58 #endif
59                 public void RSAConstructor_Null ()
60                 {
61                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter (null);
62                         AssertNotNull ("RSAPKCS1SignatureDeformatter(null)", fmt);
63                 }
64
65                 [Test]
66                 [ExpectedException (typeof (InvalidCastException))]
67                 public void DSAConstructor () 
68                 {
69                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter (dsa);
70                 }
71
72                 [Test]
73                 public void SetRSAKey () 
74                 {
75                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
76                         fmt.SetKey (rsa);
77                 }
78
79                 [Test]
80                 [ExpectedException (typeof (InvalidCastException))]
81                 public void SetDSAKey () 
82                 {
83                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
84                         fmt.SetKey (dsa);
85                 }
86
87                 [Test]
88 #if NET_2_0
89                 [ExpectedException (typeof (ArgumentNullException))]
90 #endif
91                 public void SetNullKey ()
92                 {
93                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
94                         fmt.SetKey (null);
95                 }
96
97                 [Test]
98                 [ExpectedException (typeof (ArgumentNullException))]
99                 public void SetNullHashAlgorithm () 
100                 {
101                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
102                         fmt.SetHashAlgorithm (null);
103                 }
104
105                 [Test]
106                 public void SetInvalidHashAlgorithm () 
107                 {
108                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
109                         fmt.SetHashAlgorithm ("MD3");
110                 }
111
112                 [Test]
113                 public void SetSHA1HashAlgorithm () 
114                 {
115                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
116                         fmt.SetHashAlgorithm ("SHA1");
117                 }
118
119                 [Test]
120                 public void SetMD5HashAlgorithm () 
121                 {
122                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
123                         fmt.SetHashAlgorithm ("MD5");
124                 }
125
126                 [Test]
127                 public void SetSHA256HashAlgorithm () 
128                 {
129                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
130                         fmt.SetHashAlgorithm ("SHA256");
131                 }
132
133                 [Test]
134                 public void SetSHA384HashAlgorithm () 
135                 {
136                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
137                         fmt.SetHashAlgorithm ("SHA384");
138                 }
139
140                 [Test]
141                 public void SetSHA512HashAlgorithm () 
142                 {
143                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
144                         fmt.SetHashAlgorithm ("SHA512");
145                 }
146
147                 [Test]
148                 [ExpectedException (typeof (ArgumentNullException))]
149                 public void VerifySignatureNullHash () 
150                 {
151                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
152                         fmt.SetHashAlgorithm ("SHA1");
153                         fmt.SetKey (rsa);
154                         byte[] hash = null;
155                         byte[] signature = new byte [128];
156                         fmt.VerifySignature (hash, signature);
157                 }
158
159                 [Test]
160                 [ExpectedException (typeof (ArgumentNullException))]
161                 public void VerifySignatureNullSignature ()
162                 {
163                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
164                         fmt.SetHashAlgorithm ("SHA1");
165                         fmt.SetKey (rsa);
166                         byte[] hash = new byte [20];
167                         fmt.VerifySignature (hash, null);
168                 }
169
170                 [Test]
171                 [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
172                 public void VerifySignatureWithBadHash () 
173                 {
174                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
175                         fmt.SetKey (rsa);
176                         // no hash algorithm
177                         byte[] hash = new byte [1];
178                         byte[] signature = new byte [1];
179                         fmt.VerifySignature (hash, signature);
180                 }
181
182                 [Test]
183 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
184 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
185                 public void VerifySHA1SignatureWithNullKey () 
186                 {
187                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
188                         fmt.SetHashAlgorithm ("SHA1");
189                         byte[] hash = new byte [20];
190                         try {
191                                 // no key
192                                 fmt.VerifySignature (hash, shaSignature);
193                                 Fail ("VerifySHA1SignatureWithNullKey - Expected CryptographicUnexpectedOperationException but none");
194                         }
195                         catch (CryptographicUnexpectedOperationException) {
196                                 // this was expected
197                         }
198                         catch (NullReferenceException) {
199                                 // this wasn't expected - but that's the result from framework 1.1
200                         }
201                         catch (Exception e) {
202                                 Fail ("VerifySHA1SignatureWithNullKey - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
203                         }
204                 }
205
206                 private RSAPKCS1SignatureDeformatter GetDefaultDeformatter (string hashName) 
207                 {
208                         // no need for the private key 
209                         RSA rsa = RSA.Create ();
210                         rsa.ImportParameters (AllTests.GetRsaKey (false));
211
212                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
213                         fmt.SetKey (rsa);
214                         fmt.SetHashAlgorithm (hashName);
215                         return fmt;
216                 }
217
218                 [Test]
219                 public void VerifySHA1SignatureWithRSAKey () 
220                 {
221                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
222                         // good SHA1
223                         byte[] hash = new byte [20];
224                         Assert ("VerifySignature(SHA1, sign)", fmt.VerifySignature (hash, shaSignature));
225                         // bad signature
226                         shaSignature [0] = (byte) ~shaSignature [0];
227                         Assert ("VerifySignature(SHA1, badSign)", !fmt.VerifySignature (hash, shaSignature));
228                 }
229
230                 [Test]
231                 [ExpectedException (typeof (CryptographicException))]
232                 public void VerifySHA1SignatureWithWrongHashLength () 
233                 {
234                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
235                         // wrong SHA1 length
236                         byte[] hash = new byte [19];
237                         fmt.VerifySignature (hash, shaSignature);
238                 }
239                         
240                 [Test]
241                 public void VerifySHA1SignatureWithWrongSignatureLength () 
242                 {
243                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
244                         // wrong signature length
245                         byte[] hash = new byte [20];
246                         byte[] badSignature = new byte [shaSignature.Length-1];
247                         Assert ("VerifySignature(SHA1, badSign)", !fmt.VerifySignature (hash, badSignature));
248                 }
249
250                 [Test]
251                 public void VerifyMD5SignatureWithRSAKey () 
252                 {
253                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
254                         // good MD5
255                         byte[] hash = new byte [16];
256                         Assert ("VerifySignature(MD5, sign)", fmt.VerifySignature (hash, md5Signature));
257                         // bad signature
258                         md5Signature [0] = (byte) ~md5Signature [0];
259                         Assert ("VerifySignature(MD5, badSign)", !fmt.VerifySignature (hash, md5Signature));
260                 }
261
262                 [Test]
263                 [ExpectedException (typeof (CryptographicException))]
264                 public void VerifyMD5SignatureWithWrongHashLength () 
265                 {
266                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
267                         // wrong MD5 length
268                         byte[] hash = new byte [17];
269                         fmt.VerifySignature (hash, md5Signature);
270                 }
271                         
272                 [Test]
273                 public void VerifyMD5SignatureWithWrongSignatureLength () 
274                 {
275                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
276                         // wrong signature length
277                         byte[] hash = new byte [16];
278                         byte[] badSignature = new byte [md5Signature.Length-1];
279                         Assert ("VerifySignature(MD5, badSign)", !fmt.VerifySignature (hash, badSignature));
280                 }
281
282                 [Test]
283                 [ExpectedException (typeof (ArgumentNullException))]
284                 public void VerifySignatureNullHashAlgorithm () 
285                 {
286                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
287                         HashAlgorithm hash = null;
288                         byte[] data = new byte [20];
289                         // no hash algorithm
290                         byte[] signature = new byte [1];
291                         fmt.VerifySignature (hash, signature);
292                 }
293
294                 [Test]
295 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
296 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
297                 public void VerifySignatureHashNoKey ()
298                 {
299                         RSAPKCS1SignatureDeformatter fmt = new RSAPKCS1SignatureDeformatter ();
300                         HashAlgorithm hash = SHA1.Create ();
301                         try {
302                                 // no key
303                                 fmt.VerifySignature (hash, shaSignature);
304                                 Fail ("VerifySignatureHashNoKey - Expected CryptographicUnexpectedOperationException but none");
305                         }
306                         catch (CryptographicUnexpectedOperationException) {
307                                 // this was expected
308                         }
309                         catch (NullReferenceException) {
310                                 // this wasn't expected - but that's the result from framework 1.1
311                         }
312                         catch (Exception e) {
313                                 Fail ("VerifySignatureHashNoKey - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
314                         }
315                 }
316
317                 [Test]
318                 public void VerifySignatureSHA1Hash () 
319                 {
320                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
321                         // good SHA1
322                         byte[] data = new byte [20];
323                         HashAlgorithm hash = SHA1.Create ();
324                         hash.ComputeHash (data);
325
326                         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 };
327                         Assert ("VerifySignature(SHA1, sign)", fmt.VerifySignature (hash, shaSignature));
328                         // bad signature
329                         shaSignature [0] = (byte) ~shaSignature [0];
330                         Assert ("VerifySignature(SHA1, badSign)", !fmt.VerifySignature (hash, shaSignature));
331                 }
332
333                 [Test]
334 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
335 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
336                 public void VerifySignatureSHA1HashBadSignatureLength () 
337                 {
338                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("SHA1");
339                         // wrong signature length
340                         byte[] badSignature = new byte [shaSignature.Length-1];
341                         HashAlgorithm hash = SHA1.Create ();
342                         try {
343                                 fmt.VerifySignature (hash, badSignature);
344                                 Fail ("VerifySignatureSHA1HashBadSignatureLength - Expected CryptographicUnexpectedOperationException but none");
345                         }
346                         catch (CryptographicUnexpectedOperationException) {
347                                 // this was expected
348                         }
349                         catch (NullReferenceException) {
350                                 // this wasn't expected - but that's the result from framework 1.1
351                         }
352                         catch (Exception e) {
353                                 Fail ("VerifySignatureSHA1HashBadSignatureLength - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
354                         }
355                 }
356
357                 [Test]
358                 public void VerifySignatureMD5Hash () 
359                 {
360                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
361                         // good MD5
362                         byte[] data = new byte [20];
363                         HashAlgorithm hash = MD5.Create ();
364                         hash.ComputeHash (data);
365                         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 };
366                         Assert ("VerifySignature(MD5, sign)", fmt.VerifySignature (hash, signature));
367                 }
368
369                 [Test]
370 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
371 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
372                 public void VerifyBadSignatureMD5Hash () 
373                 {
374                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
375                         // bad signature
376                         byte[] badSignature = new Byte [md5Signature.Length];
377                         Array.Copy (md5Signature, 0, badSignature, 0, badSignature.Length);
378                         badSignature[0] = (byte) ~md5Signature [0];
379                         HashAlgorithm hash = MD5.Create ();
380                         try {
381                                 fmt.VerifySignature (hash, md5Signature);
382                                 Fail ("VerifyBadSignatureMD5Hash - Expected CryptographicUnexpectedOperationException but none");
383                         }
384                         catch (CryptographicUnexpectedOperationException) {
385                                 // this was expected
386                         }
387                         catch (NullReferenceException) {
388                                 // this wasn't expected - but that's the result from framework 1.1
389                         }
390                         catch (Exception e) {
391                                 Fail ("VerifyBadSignatureMD5Hash - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
392                         }
393                 }
394
395                 [Test]
396 // v.1.0        [ExpectedException (typeof (CryptographicUnexpectedOperationException))]
397 // v.1.1        [ExpectedException (typeof (NullReferenceException))]
398                 public void VerifySignatureMD5HashBadSignatureLength () 
399                 {
400                         RSAPKCS1SignatureDeformatter fmt = GetDefaultDeformatter ("MD5");
401                         // wrong signature length
402                         byte[] badSignature = new byte [md5Signature.Length-1];
403                         HashAlgorithm hash = MD5.Create ();
404                         try {
405                                 fmt.VerifySignature (hash, md5Signature);
406                                 Fail ("VerifySignatureMD5HashBadSignatureLength - Expected CryptographicUnexpectedOperationException but none");
407                         }
408                         catch (CryptographicUnexpectedOperationException) {
409                                 // this was expected
410                         }
411                         catch (NullReferenceException) {
412                                 // this wasn't expected - but that's the result from framework 1.1
413                         }
414                         catch (Exception e) {
415                                 Fail ("VerifySignatureMD5HashBadSignatureLength - Expected CryptographicUnexpectedOperationException but got: " + e.ToString ());
416                         }
417                 }
418
419                 [Test]
420                 public void VerifySignatureWithoutCallingSetHashAlgorithm ()
421                 {
422                         string text = "text to sign";
423                         RSA rsa = RSA.Create ();
424                         RSAPKCS1SignatureFormatter fmt = new RSAPKCS1SignatureFormatter (rsa);
425                         SHA1 hash = SHA1.Create ();
426                         hash.ComputeHash (Encoding.UTF8.GetBytes (text));
427                         byte[] signature = fmt.CreateSignature (hash);
428
429                         RSAPKCS1SignatureDeformatter def = new RSAPKCS1SignatureDeformatter (rsa);
430                         Assert ("Signature Ok", def.VerifySignature (hash, signature));
431                 }
432         }
433 }