Test Keccak
1 import dcrypt.encoders.hex; 2 3 string msg1600 = x"8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77"; 4 5 immutable string[] plaintexts = [x"",x"",x"",x"", 6 // https://cloud.github.com/downloads/johanns/sha3/KeccakTestVectors.zip 7 x"CC", 8 msg1600, 9 x"CC", 10 msg1600, 11 x"CC", 12 msg1600, 13 x"CC", 14 msg1600 15 ]; 16 17 immutable string[] hexHashes = [ 18 x"f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd", 19 x"c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", 20 x"2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff", 21 x"0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e", 22 // https://cloud.github.com/downloads/johanns/sha3/KeccakTestVectors.zip 23 x"A9CAB59EB40A10B246290F2D6086E32E3689FAF1D26B470C899F2802", 24 x"1029CA117957D80F3C859E8394DD34969331CA3BCEDC436B1EAB0849", 25 x"EEAD6DBFC7340A56CAEDC044696A168870549A6A7F6F56961E84A54BD9970B8A", 26 x"E83EA21F5BC0976953AF86069A10EB6024A1AC59D609688E4A9759BB8B6C9441", 27 x"1B84E62A46E5A201861754AF5DC95C4A1A69CAF4A796AE405680161E29572641F5FA1E8641D7958336EE7B11C58F73E9", 28 x"B5A7160112E0825A7C03643BEB98B1FC2549B81F01C3C4271DFF99BE57D472A7FAD133808D7D2D414D6011E9A2E8DFEC", 29 x"8630C13CBD066EA74BBE7FE468FEC1DEE10EDC1254FB4C1B7C5FD69B646E44160B8CE01D05A0908CA790DFB080F4B513BC3B6225ECE7A810371441A5AC666EB9", 30 x"2A11CB6921EA662A39DDEE7982E3CF5B317195661D5505AD04D11EE23E178ED65F3E06A7F096F4EAF1FF6A09239CF5A0A39DC9F4C92AF63FDF7211E1CF467653", 31 32 ]; 33 34 35 for(size_t i = 0; i < plaintexts.length; ++i) { 36 const (ubyte)[] plain = cast(const ubyte[]) plaintexts[i]; 37 const ubyte[] expectedHash = cast(const ubyte[]) hexHashes[i]; 38 ubyte[] actualHash; 39 40 switch(expectedHash.length*8) { 41 case 224: 42 Keccak224 k; 43 k.put(plain); 44 actualHash = k.finish!224(); 45 break; 46 case 256: 47 Keccak256 k; 48 k.put(plain); 49 actualHash = k.finish!256(); 50 break; 51 case 384: 52 Keccak384 k; 53 k.put(plain); 54 actualHash = k.finish!384(); 55 break; 56 case 512: 57 Keccak512 k; 58 k.put(plain); 59 actualHash = k.finish!512(); 60 break; 61 default: assert(0); 62 } 63 64 assert(expectedHash == actualHash, "produced wrong hash: " ~ toHexStr(actualHash) 65 ~ " instead of " ~ toHexStr(expectedHash)); 66 }