2 // SHA256Test.cs - NUnit Test Cases for SHA256
5 // Sebastien Pouliot (spouliot@motus.com)
7 // (C) 2002 Motus Technologies Inc. (http://www.motus.com)
10 using NUnit.Framework;
13 using System.Security.Cryptography;
16 namespace MonoTests.System.Security.Cryptography {
19 // a. FIPS PUB 180-2: Secure Hash Standard
20 // http://csrc.nist.gov/publications/fips/fips180-2/fip180-2.txt
22 // SHA256 is a abstract class - so most of the test included here wont be tested
23 // on the abstract class but should be tested in ALL its descendants.
24 public class SHA256Test : HashAlgorithmTest {
26 protected override void SetUp ()
28 hash = SHA256.Create ();
31 protected override void TearDown () {}
33 // test vectors from NIST FIPS 186-2
35 private string input1 = "abc";
36 private string input2 = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
38 public void FIPS186_Test1 (SHA256 hash)
40 string className = hash.ToString ();
41 byte[] result = { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
42 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
43 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
44 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad };
45 byte[] input = Encoding.Default.GetBytes (input1);
47 string testName = className + " 1";
48 FIPS186_a (testName, hash, input, result);
49 FIPS186_b (testName, hash, input, result);
50 FIPS186_c (testName, hash, input, result);
51 FIPS186_d (testName, hash, input, result);
52 FIPS186_e (testName, hash, input, result);
55 public void FIPS186_Test2 (SHA256 hash)
57 string className = hash.ToString ();
58 byte[] result = { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
59 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
60 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
61 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 };
62 byte[] input = Encoding.Default.GetBytes (input2);
64 string testName = className + " 2";
65 FIPS186_a (testName, hash, input, result);
66 FIPS186_b (testName, hash, input, result);
67 FIPS186_c (testName, hash, input, result);
68 FIPS186_d (testName, hash, input, result);
69 FIPS186_e (testName, hash, input, result);
72 public void FIPS186_Test3 (SHA256 hash)
74 string className = hash.ToString ();
75 byte[] result = { 0xcd, 0xc7, 0x6e, 0x5c, 0x99, 0x14, 0xfb, 0x92,
76 0x81, 0xa1, 0xc7, 0xe2, 0x84, 0xd7, 0x3e, 0x67,
77 0xf1, 0x80, 0x9a, 0x48, 0xa4, 0x97, 0x20, 0x0e,
78 0x04, 0x6d, 0x39, 0xcc, 0xc7, 0x11, 0x2c, 0xd0 };
79 byte[] input = new byte [1000000];
80 for (int i = 0; i < 1000000; i++)
83 string testName = className + " 3";
84 FIPS186_a (testName, hash, input, result);
85 FIPS186_b (testName, hash, input, result);
86 FIPS186_c (testName, hash, input, result);
87 FIPS186_d (testName, hash, input, result);
88 FIPS186_e (testName, hash, input, result);
91 public void FIPS186_a (string testName, SHA256 hash, byte[] input, byte[] result)
93 byte[] output = hash.ComputeHash (input);
94 AssertEquals (testName + ".a.1", result, output);
95 AssertEquals (testName + ".a.2", result, hash.Hash);
96 // required or next operation will still return old hash
100 public void FIPS186_b (string testName, SHA256 hash, byte[] input, byte[] result)
102 byte[] output = hash.ComputeHash (input, 0, input.Length);
103 AssertEquals (testName + ".b.1", result, output);
104 AssertEquals (testName + ".b.2", result, hash.Hash);
105 // required or next operation will still return old hash
109 public void FIPS186_c (string testName, SHA256 hash, byte[] input, byte[] result)
111 MemoryStream ms = new MemoryStream (input);
112 byte[] output = hash.ComputeHash (ms);
113 AssertEquals (testName + ".c.1", result, output);
114 AssertEquals (testName + ".c.2", result, hash.Hash);
115 // required or next operation will still return old hash
119 public void FIPS186_d (string testName, SHA256 hash, byte[] input, byte[] result)
121 byte[] output = hash.TransformFinalBlock (input, 0, input.Length);
122 // LAMESPEC or FIXME: TransformFinalBlock doesn't return HashValue !
123 // AssertEquals( testName + ".d.1", result, output );
124 AssertEquals (testName + ".d", result, hash.Hash);
125 // required or next operation will still return old hash
129 public void FIPS186_e (string testName, SHA256 hash, byte[] input, byte[] result)
131 byte[] copy = new byte [input.Length];
132 for (int i=0; i < input.Length - 1; i++)
133 hash.TransformBlock (input, i, 1, copy, i);
134 byte[] output = hash.TransformFinalBlock (input, input.Length - 1, 1);
135 // LAMESPEC or FIXME: TransformFinalBlock doesn't return HashValue !
136 // AssertEquals (testName + ".e.1", result, output);
137 AssertEquals (testName + ".e", result, hash.Hash);
138 // required or next operation will still return old hash
142 public override void TestCreate ()
144 // Note: These tests will only be valid without a "machine.config" file
145 // or a "machine.config" file that do not modify the default algorithm
147 const string defaultSHA256 = "System.Security.Cryptography.SHA256Managed";
149 // try to build the default implementation
150 SHA256 hash = SHA256.Create ();
151 AssertEquals ("SHA256.Create()", hash.ToString (), defaultSHA256);
153 // try to build, in every way, a SHA256 implementation
154 hash = SHA256.Create ("SHA256");
155 AssertEquals ("SHA256.Create('SHA256')", hash.ToString (), defaultSHA256);
156 hash = SHA256.Create ("SHA-256");
157 AssertEquals ("SHA256.Create('SHA-256')", hash.ToString (), defaultSHA256);
159 // try to build an incorrect hash algorithms
161 hash = SHA256.Create ("MD5");
162 Fail ("SHA256.Create('MD5') should throw InvalidCastException");
164 catch (InvalidCastException) {
165 // do nothing, this is what we expect
167 catch (Exception e) {
168 Fail ("SHA256.Create('MD5') should throw InvalidCastException not " + e.ToString ());
171 // try to build invalid implementation
172 hash = SHA256.Create ("InvalidHash");
173 AssertNull ("SHA256.Create('InvalidHash')", hash);
175 // try to build null implementation
177 hash = SHA256.Create (null);
178 Fail ("SHA256.Create(null) should throw ArgumentNullException");
180 catch (ArgumentNullException) {
181 // do nothing, this is what we expect
183 catch (Exception e) {
184 Fail ("SHA256.Create(null) should throw ArgumentNullException not " + e.ToString ());
188 // none of those values changes for any implementation of defaultSHA256
189 public virtual void TestStaticInfo () {
190 string className = hash.ToString ();
191 AssertEquals (className + ".HashSize", 256, hash.HashSize);
192 AssertEquals (className + ".InputBlockSize", 1, hash.InputBlockSize);
193 AssertEquals (className + ".OutputBlockSize", 1, hash.OutputBlockSize);