2003-05-12 Sebastien Pouliot <spouliot@videotron.ca>
[mono.git] / mcs / class / corlib / Test / System.Security.Cryptography / PKCS1MaskGenerationMethodTest.cs
1 //
2 // PKCS1MaskGenerationMethodTest.cs - NUnit Test Cases for PKCS1MaskGenerationMethod
3 //
4 // Author:
5 //      Sebastien Pouliot (spouliot@motus.com)
6 //
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
8 //
9
10 using NUnit.Framework;
11 using System;
12 using System.Security.Cryptography;
13
14 namespace MonoTests.System.Security.Cryptography {
15
16         // References:
17         // a.   PKCS#1: RSA Cryptography Standard 
18         //      http://www.rsasecurity.com/rsalabs/pkcs/pkcs-1/index.html
19
20         [TestFixture]
21         public class PKCS1MaskGenerationMethodTest {
22
23                 protected PKCS1MaskGenerationMethod pkcs1;
24
25                 [SetUp]
26                 void SetUp () 
27                 {
28                         pkcs1 = new PKCS1MaskGenerationMethod ();
29                 }
30
31                 public void AssertEquals (string msg, byte[] array1, byte[] array2)
32                 {
33                         AllTests.AssertEquals (msg, array1, array2);
34                 }
35
36                 [Test]
37                 public void Properties () 
38                 {
39                         // default value
40                         Assertion.AssertEquals ("PKCS1MaskGenerationMethod HashName(default)", "SHA1", pkcs1.HashName);
41                         // return to default
42                         pkcs1.HashName = null;
43                         Assertion.AssertEquals ("PKCS1MaskGenerationMethod HashName(null)", "SHA1", pkcs1.HashName);
44                         // bad hash accepted
45                         pkcs1.HashName = "SHA2";
46                         Assertion.AssertEquals ("PKCS1MaskGenerationMethod HashName(bad)", "SHA2", pkcs1.HashName);
47                         // tostring
48                         Assertion.AssertEquals ("PKCS1MaskGenerationMethod ToString()", "System.Security.Cryptography.PKCS1MaskGenerationMethod", pkcs1.ToString ());
49                 }
50
51                 [Test]
52                 public void EmptyMask () 
53                 {
54                         // pretty much useless but supported
55                         byte[] random = { 0x01 };
56                         byte[] mask = pkcs1.GenerateMask (random, 0);
57                         Assertion.AssertEquals ("PKCS1MaskGenerationMethod Empty Mask", 0, mask.Length);
58                 }
59
60                 [Test]
61                 [ExpectedException (typeof (NullReferenceException))]
62                 public void NullSeed () 
63                 {
64                         byte[] mask = pkcs1.GenerateMask (null, 10);
65                 }
66
67                 [Test]
68                 [ExpectedException (typeof (OverflowException))]
69                 public void NegativeReturnRequest () 
70                 {
71                         byte[] random = { 0x01 };
72                         byte[] mask = pkcs1.GenerateMask (random, -1);
73                 }
74
75                 // This test will FAIL with MS framework 1.0 and 1.1 as their MGF1 implementation is buggy
76                 // see ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip for RSA tests vector
77                 [Test]
78                 public void PKCS1v21TestVector ()
79                 {
80                         pkcs1.HashName = "SHA1";
81                         
82                         // seed     = random string of octets (well not random in the tests ;-)
83                         byte[] seed = { 0xaa, 0xfd, 0x12, 0xf6, 0x59, 0xca, 0xe6, 0x34, 0x89, 0xb4, 0x79, 0xe5, 0x07, 0x6d, 0xde, 0xc2, 0xf0, 0x6c, 0xb5, 0x8f };
84                         int LengthDB = 107;
85
86                         // dbMask     = MGF(seed, length(DB))
87                         byte[] dbMask = pkcs1.GenerateMask (seed, LengthDB);
88                         byte[] expectedDBMask = { 0x06, 0xe1, 0xde, 0xb2, 0x36, 0x9a, 0xa5, 0xa5, 0xc7, 0x07, 0xd8, 0x2c, 0x8e, 0x4e, 0x93, 0x24, 
89                                 0x8a, 0xc7, 0x83, 0xde, 0xe0, 0xb2, 0xc0, 0x46, 0x26, 0xf5, 0xaf, 0xf9, 0x3e, 0xdc, 0xfb, 0x25,
90                                 0xc9, 0xc2, 0xb3, 0xff, 0x8a, 0xe1, 0x0e, 0x83, 0x9a, 0x2d, 0xdb, 0x4c, 0xdc, 0xfe, 0x4f, 0xf4, 
91                                 0x77, 0x28, 0xb4, 0xa1, 0xb7, 0xc1, 0x36, 0x2b, 0xaa, 0xd2, 0x9a, 0xb4, 0x8d, 0x28, 0x69, 0xd5, 
92                                 0x02, 0x41, 0x21, 0x43, 0x58, 0x11, 0x59, 0x1b, 0xe3, 0x92, 0xf9, 0x82, 0xfb, 0x3e, 0x87, 0xd0, 
93                                 0x95, 0xae, 0xb4, 0x04, 0x48, 0xdb, 0x97, 0x2f, 0x3a, 0xc1, 0x4e, 0xaf, 0xf4, 0x9c, 0x8c, 0x3b,
94                                 0x7c, 0xfc, 0x95, 0x1a, 0x51, 0xec, 0xd1, 0xdd, 0xe6, 0x12, 0x64 };
95                         AssertEquals ("PKCS1v21TestVector 1", expectedDBMask, dbMask);
96
97                         // maskedDB   = DB xor dbMask
98                         byte[] DB =  { 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90,
99                                 0xaf, 0xd8, 0x07, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
101                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
102                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
103                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd4, 0x36, 0xe9, 0x95, 0x69,
104                                 0xfd, 0x32, 0xa7, 0xc8, 0xa0, 0x5b, 0xbc, 0x90, 0xd3, 0x2c, 0x49 };
105                         byte[] maskedDB = new byte [dbMask.Length];
106                         for (int i = 0; i < dbMask.Length; i++)
107                                 maskedDB [i] = Convert.ToByte (DB [i] ^ dbMask [i]);
108
109                         // seedMask   = MGF(maskedDB, length(seed))
110                         byte[] seedMask = pkcs1.GenerateMask (maskedDB, seed.Length);
111                         byte[] expectedSeedMask = { 0x41, 0x87, 0x0b, 0x5a, 0xb0, 0x29, 0xe6, 0x57, 0xd9, 0x57, 0x50, 0xb5, 0x4c, 0x28, 0x3c, 0x08, 0x72, 0x5d, 0xbe, 0xa9 };
112                         AssertEquals ("PKCS1v21TestVector 2", expectedSeedMask, seedMask);
113                 }
114         }
115 }