This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[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                 public 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                 [Ignore ("Known to fail under MS runtime - both 1.0 and 1.1")]
79                 public void PKCS1v21TestVector ()
80                 {
81                         pkcs1.HashName = "SHA1";
82                         
83                         // seed     = random string of octets (well not random in the tests ;-)
84                         byte[] seed = { 0xaa, 0xfd, 0x12, 0xf6, 0x59, 0xca, 0xe6, 0x34, 0x89, 0xb4, 0x79, 0xe5, 0x07, 0x6d, 0xde, 0xc2, 0xf0, 0x6c, 0xb5, 0x8f };
85                         int LengthDB = 107;
86
87                         // dbMask     = MGF(seed, length(DB))
88                         byte[] dbMask = pkcs1.GenerateMask (seed, LengthDB);
89                         byte[] expectedDBMask = { 0x06, 0xe1, 0xde, 0xb2, 0x36, 0x9a, 0xa5, 0xa5, 0xc7, 0x07, 0xd8, 0x2c, 0x8e, 0x4e, 0x93, 0x24, 
90                                 0x8a, 0xc7, 0x83, 0xde, 0xe0, 0xb2, 0xc0, 0x46, 0x26, 0xf5, 0xaf, 0xf9, 0x3e, 0xdc, 0xfb, 0x25,
91                                 0xc9, 0xc2, 0xb3, 0xff, 0x8a, 0xe1, 0x0e, 0x83, 0x9a, 0x2d, 0xdb, 0x4c, 0xdc, 0xfe, 0x4f, 0xf4, 
92                                 0x77, 0x28, 0xb4, 0xa1, 0xb7, 0xc1, 0x36, 0x2b, 0xaa, 0xd2, 0x9a, 0xb4, 0x8d, 0x28, 0x69, 0xd5, 
93                                 0x02, 0x41, 0x21, 0x43, 0x58, 0x11, 0x59, 0x1b, 0xe3, 0x92, 0xf9, 0x82, 0xfb, 0x3e, 0x87, 0xd0, 
94                                 0x95, 0xae, 0xb4, 0x04, 0x48, 0xdb, 0x97, 0x2f, 0x3a, 0xc1, 0x4e, 0xaf, 0xf4, 0x9c, 0x8c, 0x3b,
95                                 0x7c, 0xfc, 0x95, 0x1a, 0x51, 0xec, 0xd1, 0xdd, 0xe6, 0x12, 0x64 };
96                         AssertEquals ("PKCS1v21TestVector 1", expectedDBMask, dbMask);
97
98                         // maskedDB   = DB xor dbMask
99                         byte[] DB =  { 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90,
100                                 0xaf, 0xd8, 0x07, 0x09, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
104                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd4, 0x36, 0xe9, 0x95, 0x69,
105                                 0xfd, 0x32, 0xa7, 0xc8, 0xa0, 0x5b, 0xbc, 0x90, 0xd3, 0x2c, 0x49 };
106                         byte[] maskedDB = new byte [dbMask.Length];
107                         for (int i = 0; i < dbMask.Length; i++)
108                                 maskedDB [i] = Convert.ToByte (DB [i] ^ dbMask [i]);
109
110                         // seedMask   = MGF(maskedDB, length(seed))
111                         byte[] seedMask = pkcs1.GenerateMask (maskedDB, seed.Length);
112                         byte[] expectedSeedMask = { 0x41, 0x87, 0x0b, 0x5a, 0xb0, 0x29, 0xe6, 0x57, 0xd9, 0x57, 0x50, 0xb5, 0x4c, 0x28, 0x3c, 0x08, 0x72, 0x5d, 0xbe, 0xa9 };
113                         AssertEquals ("PKCS1v21TestVector 2", expectedSeedMask, seedMask);
114                 }
115         }
116 }