2 // PKCS1MaskGenerationMethodTest.cs - NUnit Test Cases for PKCS1MaskGenerationMethod
5 // Sebastien Pouliot (spouliot@motus.com)
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
10 using NUnit.Framework;
12 using System.Security.Cryptography;
14 namespace MonoTests.System.Security.Cryptography {
17 // a. PKCS#1: RSA Cryptography Standard
18 // http://www.rsasecurity.com/rsalabs/pkcs/pkcs-1/index.html
21 public class PKCS1MaskGenerationMethodTest {
23 protected PKCS1MaskGenerationMethod pkcs1;
28 pkcs1 = new PKCS1MaskGenerationMethod ();
31 public void AssertEquals (string msg, byte[] array1, byte[] array2)
33 AllTests.AssertEquals (msg, array1, array2);
37 public void Properties ()
40 Assertion.AssertEquals ("PKCS1MaskGenerationMethod HashName(default)", "SHA1", pkcs1.HashName);
42 pkcs1.HashName = null;
43 Assertion.AssertEquals ("PKCS1MaskGenerationMethod HashName(null)", "SHA1", pkcs1.HashName);
45 pkcs1.HashName = "SHA2";
46 Assertion.AssertEquals ("PKCS1MaskGenerationMethod HashName(bad)", "SHA2", pkcs1.HashName);
48 Assertion.AssertEquals ("PKCS1MaskGenerationMethod ToString()", "System.Security.Cryptography.PKCS1MaskGenerationMethod", pkcs1.ToString ());
52 public void EmptyMask ()
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);
61 [ExpectedException (typeof (NullReferenceException))]
62 public void NullSeed ()
64 byte[] mask = pkcs1.GenerateMask (null, 10);
68 [ExpectedException (typeof (OverflowException))]
69 public void NegativeReturnRequest ()
71 byte[] random = { 0x01 };
72 byte[] mask = pkcs1.GenerateMask (random, -1);
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
78 [Ignore ("Known to fail under MS runtime - both 1.0 and 1.1")]
79 public void PKCS1v21TestVector ()
81 pkcs1.HashName = "SHA1";
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 };
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);
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]);
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);