Test BLAKE round function.
t { alias uint Word; Word[16] msg; fromBigEndian!Word(cast(const ubyte[]) x" 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 00000008", msg ); Word[16] v0; fromBigEndian!Word(cast(const ubyte[]) x" 6A09E667 BB67AE85 3C6EF372 A54FF53A 510E527F 9B05688C 1F83D9AB 5BE0CD19 243F6A88 85A308D3 13198A2E 03707344 A409382A 299F31D8 082EFA98 EC4E6C89", v0 ); Word[16] expected1; fromBigEndian!Word(cast(const ubyte[]) x" E78B8DFE 150054E7 CABC8992 D15E8984 0669DF2A 084E66E3 A516C4B3 339DED5B 26051FB7 09D18B27 3A2E8FA8 488C6059 13E513E6 B37ED53E 16CAC7B9 75AF6DF6", expected1 ); Word[16] expected2; fromBigEndian!Word(cast(const ubyte[]) x" 9DE875FD 8286272E ADD20174 F1B0F1B7 37A1A6D3 CF90583A B67E00D2 943A1F4F E5294126 43BD06BF B81ECBA2 6AF5CEAF 4FEB3A1F 0D6CA73C 5EE50B3E DC88DF91", expected2 ); Word[16] v = v0; Blake!256.round(0, msg, v); assert(v== expected1, "BLAKE round failed!"); Blake!256.round(1, msg, v); assert(v== expected2, "BLAKE round failed!"); Word[4] salt; Word[2] counter = [0x00000008, 0x00000000]; Word[8] h = Blake!256.iv; Blake!256.compress(h, msg, salt, counter); Word[8] expectedH; fromBigEndian!Word(cast(const ubyte[]) x" 0CE8D4EF 4DD7CD8D 62DFDED9 D4EDB0A7 74AE6A41 929A74DA 23109E8F 11139C87", expectedH ); assert(h == expectedH, "BLAKE round failed!"
Test vectors generated with reference implementation.
Generate the reference hash: ./blake512 <(perl -e 'print "\x00"x127')
Generate the input data as hex: perl -e 'print "\x00"x127' | xxd -ps -c 32
t { immutable string[] plaintexts = [ x"", x"00", "The quick brown fox jumps over the lazy dog", // 127 zeros x"0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000", // 128 zeros x"0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000", // 129 zeros x"0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00" ]; immutable string[] hashes = [ x"a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8", x"97961587f6d970faba6d2478045de6d1fabd09b61ae50932054d52bc29d31be4ff9102b9f69e2bbdb83be13d4b9c06091e5fa0b48bd081b634058be0ec49beb3", x"1f7e26f63b6ad25a0896fd978fd050a1766391d2fd0471a77afb975e5034b7ad2d9ccf8dfb47abbbe656e1b82fbc634ba42ce186e8dc5e1ce09a885d41f43451", x"d6bd99cb8f201c5e777f25859cca7b21b4659fce0e19d04de85be6566cae87b9b15e4b82f9e80eea894aaaea15e26f08ce6cd2af9f0fef1a15486cdf9c8ca8df", x"0f6f3a3a91f752d37e3d37141d5459aca9a88ed2d5b88f71120fbe39387b635ecf6402a5bcb7b18f216ea9a8137d28954098e586014c4d435c979d8860d3a977", x"c75df1083f0cff9a4b423b0f5cdcee6526133513198f897c89901d0ab80995bf9cefe01c992563b5dd4a8f76f22f16859615c30b309efe329f7462eb280df34c" ]; testDigest(new Blake512Digest, plaintexts, hashes