1 // 2 // RIPEMD160Test.cs - NUnit Test Cases for RIPEMD160 3 // http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html 4 // 5 // Author: 6 // Sebastien Pouliot (sebastien@ximian.com) 7 // 8 // (C) 2003 Motus Technologies Inc. (http://www.motus.com) 9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com) 10 // 11 // Permission is hereby granted, free of charge, to any person obtaining 12 // a copy of this software and associated documentation files (the 13 // "Software"), to deal in the Software without restriction, including 14 // without limitation the rights to use, copy, modify, merge, publish, 15 // distribute, sublicense, and/or sell copies of the Software, and to 16 // permit persons to whom the Software is furnished to do so, subject to 17 // the following conditions: 18 // 19 // The above copyright notice and this permission notice shall be 20 // included in all copies or substantial portions of the Software. 21 // 22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 29 // 30 31 32 using NUnit.Framework; 33 using System; 34 using System.IO; 35 using System.Security.Cryptography; 36 using System.Text; 37 38 namespace MonoTests.System.Security.Cryptography { 39 40 // RIPEMD160 is a abstract class - so ALL of the test included here wont be tested 41 // on the abstract class but should be tested in ALL its descendants. 42 public abstract class RIPEMD160Test { 43 44 protected RIPEMD160 hash; 45 46 // because most crypto stuff works with byte[] buffers AssertEquals(string msg, byte[] array1, byte[] array2)47 static public void AssertEquals (string msg, byte[] array1, byte[] array2) 48 { 49 if ((array1 == null) && (array2 == null)) 50 return; 51 if (array1 == null) 52 Assert.Fail (msg + " -> First array is NULL"); 53 if (array2 == null) 54 Assert.Fail (msg + " -> Second array is NULL"); 55 56 bool a = (array1.Length == array2.Length); 57 if (a) { 58 for (int i = 0; i < array1.Length; i++) { 59 if (array1 [i] != array2 [i]) { 60 a = false; 61 break; 62 } 63 } 64 } 65 if (array1.Length > 0) { 66 msg += " -> Expected " + BitConverter.ToString (array1, 0); 67 msg += " is different than " + BitConverter.ToString (array2, 0); 68 } 69 Assert.IsTrue (a, msg); 70 } 71 72 // RIPEMD160 ("") = 9c1185a5c5e9fc54612808977ee8f548b2258d31 73 [Test] RIPEMD160_Test1()74 public void RIPEMD160_Test1 () 75 { 76 string className = hash.ToString (); 77 byte[] result = { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28, 0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 }; 78 byte[] input = new byte [0]; 79 80 string testName = className + " 1"; 81 RIPEMD160_a (testName, hash, input, result); 82 RIPEMD160_b (testName, hash, input, result); 83 RIPEMD160_c (testName, hash, input, result); 84 RIPEMD160_d (testName, hash, input, result); 85 // N/A RIPEMD160_e (testName, hash, input, result); 86 } 87 88 // RIPEMD160 ("a") = 0bdc9d2d256b3ee9daae347be6f4dc835a467ffe 89 [Test] RIPEMD160_Test2()90 public void RIPEMD160_Test2 () 91 { 92 string className = hash.ToString (); 93 byte[] result = { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae, 0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe }; 94 byte[] input = Encoding.Default.GetBytes ("a"); 95 96 string testName = className + " 2"; 97 RIPEMD160_a (testName, hash, input, result); 98 RIPEMD160_b (testName, hash, input, result); 99 RIPEMD160_c (testName, hash, input, result); 100 RIPEMD160_d (testName, hash, input, result); 101 RIPEMD160_e (testName, hash, input, result); 102 } 103 104 // RIPEMD160 ("abc") = 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc 105 [Test] RIPEMD160_Test3()106 public void RIPEMD160_Test3 () 107 { 108 string className = hash.ToString (); 109 byte[] result = { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04, 0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc }; 110 byte[] input = Encoding.Default.GetBytes ("abc"); 111 112 string testName = className + " 3"; 113 RIPEMD160_a (testName, hash, input, result); 114 RIPEMD160_b (testName, hash, input, result); 115 RIPEMD160_c (testName, hash, input, result); 116 RIPEMD160_d (testName, hash, input, result); 117 RIPEMD160_e (testName, hash, input, result); 118 } 119 120 // RIPEMD160 ("message digest") = 5d0689ef49d2fae572b881b123a85ffa21595f36 121 [Test] RIPEMD160_Test4()122 public void RIPEMD160_Test4 () 123 { 124 string className = hash.ToString (); 125 byte[] result = { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8, 0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 }; 126 byte[] input = Encoding.Default.GetBytes ("message digest"); 127 128 string testName = className + " 4"; 129 RIPEMD160_a (testName, hash, input, result); 130 RIPEMD160_b (testName, hash, input, result); 131 RIPEMD160_c (testName, hash, input, result); 132 RIPEMD160_d (testName, hash, input, result); 133 RIPEMD160_e (testName, hash, input, result); 134 } 135 136 // RIPEMD160 ("abcdefghijklmnopqrstuvwxyz") = f71c27109c692c1b56bbdceb5b9d2865b3708dbc 137 [Test] RIPEMD160_Test5()138 public void RIPEMD160_Test5 () 139 { 140 string className = hash.ToString (); 141 byte[] result = { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb, 0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc }; 142 byte[] input = Encoding.Default.GetBytes ("abcdefghijklmnopqrstuvwxyz"); 143 144 string testName = className + " 5"; 145 RIPEMD160_a (testName, hash, input, result); 146 RIPEMD160_b (testName, hash, input, result); 147 RIPEMD160_c (testName, hash, input, result); 148 RIPEMD160_d (testName, hash, input, result); 149 RIPEMD160_e (testName, hash, input, result); 150 } 151 152 // RIPEMD160 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 153 // 12a053384a9c0c88e405a06c27dcf49ada62eb2b 154 [Test] RIPEMD160_Test6()155 public void RIPEMD160_Test6 () 156 { 157 string className = hash.ToString (); 158 byte[] result = { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05, 0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b }; 159 byte[] input = Encoding.Default.GetBytes ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"); 160 161 string testName = className + " 6"; 162 RIPEMD160_a (testName, hash, input, result); 163 RIPEMD160_b (testName, hash, input, result); 164 RIPEMD160_c (testName, hash, input, result); 165 RIPEMD160_d (testName, hash, input, result); 166 RIPEMD160_e (testName, hash, input, result); 167 } 168 169 // RIPEMD160 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 170 // b0e20b6e3116640286ed3a87a5713079b21f5189 171 [Test] RIPEMD160_Test7()172 public void RIPEMD160_Test7 () 173 { 174 string className = hash.ToString (); 175 byte[] result = { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed, 0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 }; 176 byte[] input = Encoding.Default.GetBytes ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); 177 178 string testName = className + " 6"; 179 RIPEMD160_a (testName, hash, input, result); 180 RIPEMD160_b (testName, hash, input, result); 181 RIPEMD160_c (testName, hash, input, result); 182 RIPEMD160_d (testName, hash, input, result); 183 RIPEMD160_e (testName, hash, input, result); 184 } 185 186 // RIPEMD160 ("123456789012345678901234567890123456789012345678901234567890123456 187 // 78901234567890") = 9b752e45573d4b39f4dbd3323cab82bf63326bfb 188 [Test] RIPEMD160_Test8()189 public void RIPEMD160_Test8 () 190 { 191 string className = hash.ToString (); 192 byte[] result = { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb, 0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb }; 193 byte[] input = Encoding.Default.GetBytes ("12345678901234567890123456789012345678901234567890123456789012345678901234567890"); 194 195 string testName = className + " 7"; 196 RIPEMD160_a (testName, hash, input, result); 197 RIPEMD160_b (testName, hash, input, result); 198 RIPEMD160_c (testName, hash, input, result); 199 RIPEMD160_d (testName, hash, input, result); 200 RIPEMD160_e (testName, hash, input, result); 201 } 202 203 // RIPEMD160 (1000000 x 'a') = 52783243c1697bdbe16d37f97f68f08325dc1528 204 [Test] RIPEMD160_Test9()205 public void RIPEMD160_Test9 () 206 { 207 string className = hash.ToString (); 208 byte[] result = { 0x52, 0x78, 0x32, 0x43, 0xc1, 0x69, 0x7b, 0xdb, 0xe1, 0x6d, 0x37, 0xf9, 0x7f, 0x68, 0xf0, 0x83, 0x25, 0xdc, 0x15, 0x28 }; 209 byte[] input = new byte [1000000]; 210 for (int i = 0; i < 1000000; i++) 211 input[i] = 0x61; // a 212 213 string testName = className + " 7"; 214 RIPEMD160_a (testName, hash, input, result); 215 RIPEMD160_b (testName, hash, input, result); 216 RIPEMD160_c (testName, hash, input, result); 217 RIPEMD160_d (testName, hash, input, result); 218 RIPEMD160_e (testName, hash, input, result); 219 } 220 RIPEMD160_a(string testName, RIPEMD160 hash, byte[] input, byte[] result)221 public void RIPEMD160_a (string testName, RIPEMD160 hash, byte[] input, byte[] result) 222 { 223 byte[] output = hash.ComputeHash (input); 224 AssertEquals (testName + ".a.1", result, output); 225 AssertEquals (testName + ".a.2", result, hash.Hash); 226 // required or next operation will still return old hash 227 hash.Initialize (); 228 } 229 RIPEMD160_b(string testName, RIPEMD160 hash, byte[] input, byte[] result)230 public void RIPEMD160_b (string testName, RIPEMD160 hash, byte[] input, byte[] result) 231 { 232 byte[] output = hash.ComputeHash (input, 0, input.Length); 233 AssertEquals (testName + ".b.1", result, output); 234 AssertEquals (testName + ".b.2", result, hash.Hash); 235 // required or next operation will still return old hash 236 hash.Initialize (); 237 } 238 RIPEMD160_c(string testName, RIPEMD160 hash, byte[] input, byte[] result)239 public void RIPEMD160_c (string testName, RIPEMD160 hash, byte[] input, byte[] result) 240 { 241 MemoryStream ms = new MemoryStream (input); 242 byte[] output = hash.ComputeHash (ms); 243 AssertEquals (testName + ".c.1", result, output); 244 AssertEquals (testName + ".c.2", result, hash.Hash); 245 // required or next operation will still return old hash 246 hash.Initialize (); 247 } 248 RIPEMD160_d(string testName, RIPEMD160 hash, byte[] input, byte[] result)249 public void RIPEMD160_d (string testName, RIPEMD160 hash, byte[] input, byte[] result) 250 { 251 hash.TransformFinalBlock (input, 0, input.Length); 252 AssertEquals (testName + ".d", result, hash.Hash); 253 // required or next operation will still return old hash 254 hash.Initialize (); 255 } 256 RIPEMD160_e(string testName, RIPEMD160 hash, byte[] input, byte[] result)257 public void RIPEMD160_e (string testName, RIPEMD160 hash, byte[] input, byte[] result) 258 { 259 byte[] copy = new byte [input.Length]; 260 for (int i=0; i < input.Length - 1; i++) 261 hash.TransformBlock (input, i, 1, copy, i); 262 hash.TransformFinalBlock (input, input.Length - 1, 1); 263 AssertEquals (testName + ".e", result, hash.Hash); 264 // required or next operation will still return old hash 265 hash.Initialize (); 266 } 267 268 // none of those values changes for any implementation of RIPEMD160 269 [Test] StaticInfo()270 public virtual void StaticInfo () 271 { 272 string className = hash.ToString (); 273 Assert.AreEqual (160, hash.HashSize, className + ".HashSize"); 274 Assert.AreEqual (1, hash.InputBlockSize, className + ".InputBlockSize"); 275 Assert.AreEqual (1, hash.OutputBlockSize, className + ".OutputBlockSize"); 276 } 277 } 278 } 279 280