/////////////////////////////////////////////////////////////////////////////// #include "hash/blake.hpp" #include #include using cruft::crypto::hash::blake; /////////////////////////////////////////////////////////////////////////////// static blake<256>::digest_t operator"" _digest (const char *str, size_t len) { blake<256>::digest_t res; for (size_t i = 0; i < len; i += 2) res[i/2] = util::ascii::from_hex (str[i]) << 4 | util::ascii::from_hex (str[i+1]); return res; } //----------------------------------------------------------------------------- std::vector operator"" _u8s (const char *str, size_t len) { std::vector res; res.resize (len); std::copy_n (str, len, std::begin (res)); return res; } /////////////////////////////////////////////////////////////////////////////// static const struct { std::vector data; std::vector salt; blake<256>::digest_t digest; const char *message; } TESTS[] = { { {}, {}, "716f6e863f744b9ac22c97ec7b76ea5f" "5908bc5b2f67c61510bfc4751384ea7a"_digest, "empty, default salt" }, { { 0x00 }, { }, "0ce8d4ef4dd7cd8d62dfded9d4edb0a774ae6a41929a74da23109e8f11139c87"_digest, "NIST 8 bit zeros, default salt", }, { "0123456789abcdef"_u8s, {}, "9dc03986e7cc2973fd21f0c0c804922ef160313d3b4e52c187a1661c5e89877c"_digest, "16 bytes, default salt" }, { "0123456789abcdef0123456789abcdef0123456789abcdef0123456"_u8s, {}, "f58834fc24e109248d33194551a28852cd3d2d6ed4aba9ab3562bb5a97ce76e1"_digest, "exactly pre-padding size, default salt" }, { std::vector (576/8, 0), {}, "d419bad32d504fb7d44d460c42c5593fe544fa4c135dec31e21bd9abdcc22d41"_digest, "NIST 576 bit zeros, default salt", }, { "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde"_u8s, { }, "c455dcfcf5c77950b92ff055e7e4f8139acac4cbd18dbed0b1383d95e4f1726c"_digest, "almost block size, default salt" }, { "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"_u8s, { }, "e25d021064a61d7af53cefaa0819bb6a351db1d760ed1f85fee671bc18ab7886"_digest, "exactly block size, default salt", }, }; //----------------------------------------------------------------------------- // million 'a': // 224: 738443f8093ae703ebe4fe991b4f00208701e2e7be1275fd1bd84ef1 // 256: 22be6de4aa4214c9403f10598f0a6b0e834570251a13bc27589437f7139a5d44 // 384: 22ccce05b0ac1ceda1b0b0dc0021e6a3957779260cd2fae8a21c3d5432ce204f1df2d62a00d8f505cae6e70e3be18701 // 512: e5d3ecf60cbf8ed8b44307ae6606f4c8eae0a602c2a393f529cf405a1384c791c3ce58f54838a76b89a6455e988d63f98222ea82bf26e11e970516fb7c62b41d int main () { util::TAP::logger tap; for (const auto &t: TESTS) { blake<256> h256; const auto d = h256 (t.data, t.salt); tap.expect_eq (d, t.digest, "%s", t.message); } { blake<256> h256; std::vector data (1'000'000, 'a'); tap.expect_eq ( h256 (data), "22be6de4aa4214c9403f10598f0a6b0e834570251a13bc27589437f7139a5d44"_digest, "million 'a', 256" ); } return tap.status (); }