Add WHIRLPOOL hashing to stdlib (#2273)

* add WHIRLPOOL hashing to stdlib
This commit is contained in:
Zack Puhl
2025-07-10 10:39:42 -04:00
committed by GitHub
parent 2dfbdea889
commit 70159c00cc
3 changed files with 1004 additions and 0 deletions

View File

@@ -0,0 +1,280 @@
// Copyright (c) 2025 Zack Puhl <github@xmit.xyz>. All rights reserved.
// Use of this source code is governed by the MIT license
// a copy of which can be found in the LICENSE_STDLIB file.
//
// Dedicated from repo: https://github.com/NotsoanoNimus/whirlpool.c3l
module std::hash::whirlpool_test @test;
import std::hash::whirlpool;
fn void test_whirlpool_empty()
{
char[*] result = whirlpool::hash("");
assert(result == x'19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3');
}
fn void test_whirlpool_test_vector()
{
Whirlpool w;
w.update("The quick br");
w.update("own fox jumps over the lazy dog");
assert(w.final() == x'B97DE512E91E3828B40D2B0FDCE9CEB3C4A71F9BEA8D88E75C4FA854DF36725FD2B52EB6544EDCACD6F8BEDDFEA403CB55AE31F03AD62A5EF54E42EE82C3FB35');
}
fn void test_whirlpool_gigahash_zeroes()
{
char[] c = calloc(257 * (1024*1024))[:(257*1024*1024)]; // 257 MiB
defer free(c);
assert(whirlpool::hash(c) == x'1476b930d51cb9a7649a46f723f999896ce37c41186ceeafe1290151bf2dfb4a14e4a3f9fed16fcaea31f874108d51284f07883652cda30c9a3427041fc35dff');
}
fn void test_whirlpool_hmac()
{
char[] key = x'00010203040506070809';
char[] input = "test";
assert(whirlpool::hmac(key, input) == x'670f6920cfd6da970b7b1c6d883d622198c46b214f10d6ced4d6a03538a3e1e006b3717c4fe5e5b17d5fdfb70d698610b59ef554b0168583d2ec21578859c3b3');
}
fn void test_whirlpool_pbkdf2()
{
char[] pw = "password";
char[] s = "salt";
char[whirlpool::HASH_SIZE] out;
whirlpool::pbkdf2(pw, s, 1, &out);
assert(out == x'7e25009bf8afade8ab33911d331b5b3e987fc7c3e2d5fdb3f33c183e837c357850a75eb8baad2c05b1e3bc7068c2a2d5c0f3e586f401610ad02f525c8fcf2cbd');
whirlpool::pbkdf2(pw, s, 2, &out);
assert(out == x'110b2e4266f03c334f6085bf421a68d6976a2f767e0bb6041a9c9315ec0d249fc8cb5fac1f9f3b87dbb98e9b4b220dfe0d6b55f88109dd558c30f0a0356f7d9f');
whirlpool::pbkdf2(pw, s, 4096, &out);
assert(out == x'4f4c0307915b7e3f948daaf41ee7805cd2967513a3be6975a7cce782402598e6bd950c5051ea0c8185beba487b13eb93f5a93b8e2e1e7535643f00dd7c39cad1');
}
fn void test_whirlpool_pbkdf2_2()
{
char[] pw = "passwordPASSWORDpassword";
char[] s = "saltSALTsaltSALTsaltSALTsaltSALTsalt";
char[whirlpool::HASH_SIZE] out;
whirlpool::pbkdf2(pw, s, 4096, &out);
assert(out == x'b704488bcc9371a5fa3a7eb6e7555549a96eae3d572c0d505e1970f8460425d0ccc4cdb091f23082da6f94d3e594012075443491b608d81af37952c205403ad3');
}
fn void test_whirlpool_pbkdf2_3()
{
char[] pw = "pass\0word";
char[] salt = "sa\0lt";
char[whirlpool::HASH_SIZE] out;
whirlpool::pbkdf2(pw, salt, 4096, &out);
assert(out == x'a5a8f2abe3b0cd5a4084987de2f6ef48ed6c4c399dacd00bedef0769c6d24c825398edeb3076fa799a1468cc74df5a15b30f935942472268de82a5929b56413d');
}
fn void test_whirlpool_pbkdf2_4()
{
char[] pw = "i have a secret that i truly truly truly don't want you to be able to find out - it's a really long key and it's used to keep all my cat pictures safe and undisturbed. thank you very much for understanding, and have a great evening";
char[] salt = "cumin_turmeric_curry";
char[whirlpool::HASH_SIZE] out;
whirlpool::pbkdf2(pw, salt, 250_000, &out);
assert(out == x'14a4a663e373a705ff36c8184b8384b0ef1a80501533d5b23be6bdff14f6cc0c900cf5d8c39d9f9a44d7091f96c818adee3c8618455c530f9352c66a7806b8b6');
}
struct TestVector @local
{
char[whirlpool::HASH_SIZE] expected;
char[] input;
}
const TestVector[] TEST_VECTORS @local = {
{
// See: https://en.wikipedia.org/wiki/Whirlpool_(hash_function)#Whirlpool_hashes
x'B97DE512E91E3828 B40D2B0FDCE9CEB3 C4A71F9BEA8D88E7 5C4FA854DF36725F D2B52EB6544EDCAC D6F8BEDDFEA403CB 55AE31F03AD62A5E F54E42EE82C3FB35',
"The quick brown fox jumps over the lazy dog"
},
{
x'4E2448A4C6F486BB 16B6562C73B4020B F3043E3A731BCE72 1AE1B303D97E6D4C 7181EEBDB6C57E27 7D0E34957114CBD6 C797FC9D95D8B582 D225292076D4EEF5',
"abc"
},
{
x'2A987EA40F917061 F5D6F0A0E4644F48 8A7A5A52DEEE6562 07C562F988E95C69 16BDC8031BC5BE1B 7B947639FE050B56 939BAAA0ADFF9AE6 745B7B181C3BE3FD',
"abcdbcdecdefdefgefghfghighijhijk"
},
{
x'B913D5BBB8E461C2 C5961CBE0EDCDADF D29F068225CEB37D A6DEFCF89849368F 8C6C2EB6A4C4AC75 775D032A0ECFDFE8 550573062B653FE9 2FC7B8FB3B7BE8D6',
"test"
}
};
fn void test_whirlpool_expected_outputs()
{
foreach (vector : TEST_VECTORS)
{
char[*] result = whirlpool::hash(vector.input);
assert(result == vector.expected);
}
}
// BASH COMMAND: for x in {1..130}; do eval "for a in {1..$x}; do printf \"A\"; done" | whirlpool-hash - | cut -d' ' -f1; done
//
// ^ This gives a list of WHIRLPOOL hashes for strings of sequential 'A' characters, from 1 of them, to 130 of them in a row.
//
const char[][] SEQUENTIAL_HASHES @local = {
x'3acb384b67995724469edc254c71f4ffcb699424606bf018254fad2e42ed613bd4a350453498a354a60dd8bd7c2ad141fb4611a7460a8f50841e569749dc32ca',
x'd7d1b73088b9f09280655abd32509ab2afd2e7786144ade740f5458a192875ae64ce0e08bfa693287822a7cdf5057a7f53c3acd27471749299d4f8e728462711',
x'a4dea38c743f318db7169e28ac27aff173942b67b56f9881da464bdac48f47cc481ee29746557cf013d1c54c7a76912c1380b168251df7118293511fd89a9a64',
x'78541cfb65b3f1a3959bcc844273862857f76bd32765400070d1cc0c9956af63c12a26a96aa0f4f7e62eb9e7f0f187f5a46b8f92e14f96f41b10168222be8b2f',
x'59279a13ac102afbe0a49671f20c6654a988086108a0c5f836e6e296042e145cef8e61cd67491f33383be83a95918dc25f66844d232a6dd654b7152e56bf535f',
x'021598499ce84491829a7df348f2cf430688164a5d8d5622e343b865e62b6a76ea7aca866699990346e2c9791d19b1d1fc10a1a28c9fada7f340acd5250a8b7f',
x'0cd588c8c05319264e4203546459f4d26bda0b1667c844f7a92053badef5de95d0c4323212d16c36bf353b1a1a1336e3e5a550ae1c4963c5552b991f0d7fafd9',
x'c6a317cef0529868ddd43c8f088a3dd3ad9b82b95aa36ee367235fa857ae25685f86fd96754951fcc4075ebe2b7b1044adbcace437ea56efedb9f000194f789a',
x'dada139fdc6971767a1278f66ff30ab3b9a0be7776f472f935d110c4d495acbbeed4defc1e30912e9c709d632e6abc30dd1ec7dec8f5891a1e56d7c25e98c9a3',
x'50af819b58a91a812ef4890242d5487f5eec13465f11227f0b9404ed6bd809c2c17ca7aeed9d8a423af6f938eba9eb70530f0c928b5d8004b66e56daba69cc7d',
x'f3455ba81b4d9afc9e52c6a81b8478cf46c3f40925704223913b1e51c9eaff57da7da0e37010323ddbe21f0d905b4fe79ae0c04c31ede7cfc1c6d089d457a32f',
x'953d026954386754e5ab48e4f74bd3ca95dcc6fa8bfe33f09411fbfa7d21a065d70d0e952f30dc676728eb6d0f5b437f4a33c5d64c61031000f6b28239c326ae',
x'62c6b176ca503c9cba810b4495a57db2a3127f806c4e6982c1e80f25a7997cb2bc086c31c6999b0434e72b0bdc663c57378568d04fef9880e81d1116a11de908',
x'd2b291574a7727461ab9ee497296dfc73070839e7354ffcb3330f03348b160b3c7d1a34285261ae9bd9e2002a9c57f9125f30d5eac33bc9017617cffd2867df2',
x'f6b93435bfa71cc08822965335bdbd101df5fc170cc439f75cc3d51c2e5faddbce9e162f60415954dcc233e372dd817b62cd78465bd51c5b46ba79eb2de7853d',
x'8cc35675bd9cb9ba21548656eeb347d24355381886caad96470b30a6b091724b7cb227c20f87bd1b7dd9c6228cb0703990c7fa05516d99797a1e8b266257513d',
x'c0da6ea26eff361469762b9b5ccc3e9bf11d06af205534a2bec297fb1ebc3e2558327a6bcfb250e57d32e93145313738beb8b94a09772857300573bba9b5cb32',
x'f8e0176554deaba616f867bffd95bd3b7b2f653feaa2abf5f90d0fa960c9d2cd25b0ed6a41b87cb7f2bf30653f3d7cd11adf7bb56ec32440a1d6c18180bbaa90',
x'bb15fad310e16e3074f4f67414d2852ceec3068ccf08e01a1f8f7d3eaad8cdc0bedc12f45642f90d5ae354d7dc8559223618e4d4e3e725c8dff20c62bd646fea',
x'e06b7d84b5ad5cd872cae0260d6b3e0cbd7e2d11ef3527a5cf18dba8d352ddf2c301ed38c589535e9b6c42bc18ea310f3bf3be929bc92a1ca8bc8ffdb15a1627',
x'f6c11c80cc3d7306d977167e02a98f1d0c56f7a46d714f7845d93fde2aad1ae30b9129cc982caa7173a6d1e8bc1add9e50b8ccfcfd618d50b6e2efaad94157fd',
x'd27f4870c5022e3eef0420e9da08feb90c22fd18229acd47be76520b9948a7e6bbd20713b8c8df364e6c366055ceb74d70f132b2ca48efeb913c236b01c7b3f6',
x'1ba9abd19ffb14fb13e1af3991f798cdb4bb6349cfdef32fda18d9339d27f29303808a1e320fc2037d69aff215e94740bb38587a7d0a6c54ed2ce0c0d93afdbe',
x'901ceb161201c9bca20f190f2b0bec6dd14dc12f83653815b2f06e4590f8f7f3fd431393ab681695e7d696372756d821306244ed3c4f81c997f598d8924f1544',
x'49c06859db51b37179b769b121f66c9c0d0172f305303e83db5a3abc013e955d91000da0a6b841eed1f51f822ca7ae8883586138f111990d1c9d4124f1dd607e',
x'04cc838aa35b358024222a767bd48cd25afafc0922bd8edcc008aa7972e5e8561cfa44b95f6fbbbb7c056afd2079d7f20f5832fcbd737bba0bcb6be8b3ab5c63',
x'ae7b07d2ea937af5b30f9ed539ea0d3f1e95346b1c62ef1a7066796ac61cbdd9029cf55e27115a9575d8bcd8ff5f0f7a3fb8a4014ad801691d39a4765e103ff2',
x'5778eb0a8dc3c15158fed73ef3e48246ee9a0c107c8573ed4cf9da07b40d6525fb53ce904949c0ff6c701f1a3fb9025381ce4d60f2d9508fa2febd6a6ad83ada',
x'575105680dffc51612e67acadf10a2cee78fa6ef8ac15290c2c8af21ec55edcb5152902fdef97d2696161f5350bbe55db67f155553eb68a4d35fa9d7392e7054',
x'fb7c9ff86ece68669a32d176c6d86080edeaf8617aff25e9baf3e610ed76d4473ebd5e93887fe9ea7c92b085180843e45f271db52fd7c98927798b8d3ba3270e',
x'e2777d6c403c0dfc15eec7d73d359c93ccb20eb445d525d7f07453b9a84911e2d7c911ff265a21af776db7f84a486e72882dc1dcd8793ec30800113409d085ad',
x'3556a798a7e2e42eba339c05069b95909d6e1bb2b7fdd0751b39e53ed5c43ca5d56fa4471c71d55c7ce097561a80c0fdf0d50b1199bd11331b3bfb9fd2791b9b',
x'f50e5786e8a91218629381d7ed9c6de5aeff10757450caf76de3f20757a8dbb0e29f351625a3ac2816bd4f76463f75f7e28a9926c8d4d49615e3eefebc1a7cf2',
x'a6f5b54ebfc65b1fb2e6e5fb829953afbd98b8a032f39d6e4725063d783216fce5561af665696941ac6af76afe9fb0fc0db56c733d8ea53ef1b99d4197b84f4f',
x'eebebd2513ec09aa38e3d9e1c3ff6ea90cec13cb4bc78b9706de677b07750fdc3a94f2d4e3de30480d9ad716eed948196a7398e9ff1ca22d0fe0435740a782a6',
x'85fcc9e4a803be394732dfabbcc0b59f3449e38ce696d1a1e44405ce2905316961c7369030990d9ab51d6e7fec858623dfca92bf62f99b7cd830a82aea7fa8e4',
x'9f482e3803796ecc1c4786233c416ed855df1ab7fa682a55fe1aa203a00c444342120c40de6584e799fd9bb24db01b2f0749eb2679c4731e1255a7967751f40b',
x'76317c1fcc547c1768c6ea845a1e770ee2a58d409e59016924d8422c180fd47ae6e5dfb11041df8e4c44cfe6a42c11e0c6faa1d5186f1f9bc3cafe2770244ef3',
x'3608f1c18d204bd14fedb636571751e55eb8a0d6d9ae3688d2a2901590344173c6b7eb2d3efb573e271fef469b15cba459b8b17550ca6d2fd18a2f877cf5a1e4',
x'3e0be2ce181e174559cfc24803df334fcfb8fbbe77f5514ae5fff9a9e389d5ebcbc7675d90c4c15f448c1690acb8ce632fa0ac38b17517570a97fd0bf0ec1bea',
x'86d6e15b2341837fae68466c2abd832cab4c511bd519fe4270e09c8f918417e23452975182b22ac2a66364f7b2aa874437098a402566cb66266d63c33f8fac38',
x'9da2bc26c58e62d6ff84a48fdfbfc7315440053f71ce7e12dd853c63e3b3eeed312de22736e4d4ec3c156cc2229686ef41ff7f2240ce500c418d9a75a1f1bb53',
x'3c7a93c0702f77a58ca8c39b850114be17bfe9b85eaf384077f773275fa94cbfcc99e6b983e2edbfe4eb47acdde1809a12ed941df56789cfcee654330481f621',
x'ea7f0ecf0b0440c305ed616429a4fd3e2293c1c39b26751a1904d53332c2154daf5ae7285f503a42b591b1c7cfe16e9926421818aac62c6e83088181c4c9a28f',
x'3636fa31856e73cb69410dbd28fbab2393e2f1d233858aff6f10c642967b0b1a58a9963828d3d17a805ea36e537b20c9efc43c7045652e23e7c3a4811012867c',
x'6a33bec3bf70221b50384089589ac1c66855c850570c9d3f03edcd5f1c96c6ea47c7ab424eabe27a11e3e513b6e7abf2071f6632593b44e963821ce1ea920d2a',
x'3674c66aa10891b3acde899300019f825ada4c44881f3b2818e91cc7d927d31e13363f1b11b781bbfe6b3b962c17402bf0d0199a6a3fa77e77d3626e31f4579c',
x'803f637e0e0fb5541da0325a6fa6e216d06e938e354b9439d0d1ffac4665bc7d29a148aa7806bb0287780b38f5a7c07f7c52af4209f45746921789d3d6660575',
x'629d2d1bd7439c0856026d8a99c409e6bd7b78cb8daba091ebf37e7d27dc8a63b48ea2c347afefb35a581737e17ad516f2486f8acb45d14714f04a3a6b1769f7',
x'90b28fd1d2f59664bd4c8d1207d6595d0c3bff20da0456578f757409af3d9c5b799d4c3f94307c8a8943000c7eb269befd0c8c44347146465ecb6d508e61a89a',
x'9901ffcd3d7c49cc3d4376bc012ae4987ec0e4857dbdc42436991f1fbb5d16ed1873f035f6bdf2888a828cb594d98f127dd5e6defc4307b753aad05fabd2cecd',
x'ee9ece38ce8063435705849a8e6dc10c659b997adb350ca4638919fc887ca22274b67667222ae3f4116e5d80d70b18083baffd213cc47a913b8a84101f11850c',
x'ea96dff8bc81f1cf944d0bec250b682fb90722395624f6642ae4254bb574eda1bef5115d348f9e9c47320cc48ad395ee617c0d54839cd125bc93d9287d0a28df',
x'542104a25890b2266fe2947f483e60ba85b7b4b9ad8a6b80830e7e8045db41630dc61e338e621ec03bf55c659dce8e5966ca11a3fe166c8a3d100a98a8b67ba3',
x'dd59e0e33540b7cb94b49064076965371eebde218003d8e1181eb90e158d7e8c32c6d75596402b2c58f24244b6332b0cb24fd29941ece00de40db0a4cb75261e',
x'ee562eacc620f4fcce6c9a0fee0509dfbe56ac9f39fccb01638b4c79a50597d894ad03dceaecdb7bea754e75a9d81bd1b2ae741632c2ddd753c287d8cc1dc7f6',
x'66596bcdace8b1a0937214f1e783e593c246fa62f12e6d540bee62b984e6a0fba93c3154c0c6d249f498a897c59e67e396531985656d8afddb5debf83159a5a3',
x'bdc83773b5c975d45200edc3f591a9a21e047a0bce277b2370aff5cf3baed0b9c57cd87653cbea7d25f9266f80a6274eb3414e253fc4926163d2f2b95f8e4241',
x'221882950b795e568fa97b50efbd2dea89ceefd745501e9e84bf3369c2acd417880a0ec55058a7c0d2445293104afe2637e52a6ed1d05324c993d7cfcdc81625',
x'cbb49309888970534f5e5611948d6b22db1116abe1c6691e57e934f75f2c453236a478f75fd008d629ca3c875f589f2cc9ec4cf38310191c17935b25f5801e97',
x'429d9f116a25d577d9d7ce1d63dca913e371d57f46bf42e850ec7383866ad3b1370aac31cd3a8827b5ce07a3d5cc8d642a4f94436662d59e4293f77b0d2ef121',
x'c44b180072a4d55b86010706e129d37c7310f97ac0b1e321d81d7e797e66520d0cf960a6416ddb375ffad89a0538cf4dd7a933f395bd8137fa72e7d1024eb693',
x'cce42d1b386c16fb96dd52550f11868e24f99e661cc112479f4415447c40da6b6b034e4ce725ae6d1711027f4372eba1fedce17b3c0a9d95b4bcbe98d924c220',
x'51a8d1c06922909f8cf04bf73b7ad23823177135137ea1432e081754ca3718e4ce14e636133221ce2d508113420ac08188dfbe3f97c24cb7e7f7a161ebc93da4',
x'0642e8fcbefd1e003df1fdc9b6ced5d2a11843fb5f84eb849baf9ba55bd01e091ae317836b57b541ca8f53c4b151d526167a1d4d7c528c3885021bd311bac1dc',
x'b6c45ec78071665b1b07ce9d12945d0d2d30708b17cb45f55e26ecd9193ccef57e315efa67fc5617459dfa77c4a7631d2da43ccd602fc27d45a745f5445adb67',
x'34ad02fa40ceda893bc1a488f4a73db681ab3c7ad57b7f480e4e1ae65d94bf9b9bea49465114516ef8990c03678ce405b19ac1d14c9477283ecf008025121856',
x'ce2dbf9b330234c4880dc1faa8d67f7beb4c87484c0bf9c1a67ee4a40cfee245c78c8235eee4f4123839855ce8013825c0608dba96d6eedca6f1a4cd741bb472',
x'749e939d297e3635781ea8f79b0eaa842b0cb80f839b14e8b7019bc8ab627bfe932a34287fd23040e42f785b6c1f05e33e6784d1634c20d22050c9086e35a427',
x'816963764cabfc6632c9bec0e7f6f77189b17e574a252b069d09d093a02684a65b7ff7dba341da0a46171f2ae960c7eb016ac805edd7669014d5fca6a5226a4e',
x'9972be07ab8ba4af921b3f25a1886c655074cacc6d017350cb34a4910ea554a8e315217342477484852d509bbc53ce846507127d17151d471ac67a7c3149b2d2',
x'329a12c7ec20c97b6ced7ba2fbb71db118a5c9d0b8541d117603d389a180130418292470c510d68f78d4ba46db5a84039c275de3c6faa6e528a430e435afc862',
x'c358b21afbb422bac5c83c890ea190b5c01a059d73d3005da23e9ba548621aca74ee30babeb9ff6aba5906f48971728d674257d946532b8abbfdc7c0bda7ff91',
x'5e3f96abb5a4d8cf168e5e31b6347d7cdc7e2ba9f4a5ec9df1fa313d7e4d9d2d8cf6619766372fb4844e89e2d2d649267b55899e2178b9d5ee5fb2341db8dd99',
x'a9fcc45de78024d3b13550bdf45feff865b4890cf9f5f2ba9bc1a615fd774d416dddad3b03314a5313c77f6d50d13ced94cb3ff7eafd6ab7520569631a72343f',
x'628a0ee7fd4654576e2a4fb95324d218e0b8b1f485cf9d615b0d011c59e52ddea9a86e55b6ccf65a695e8b7c15645e312b050b06fcf906fc737c260353080697',
x'14e800398fe684c112883489df15a16c414268470ebd001151159905f3e4e2c267eebeb43ee79a030b9b54a95badb0c798d35ffc67cd93fdbb2e2b5e3b136c06',
x'30e979f24b98feadd4c4d72f956dae1137891a86b0cc1e603926ef145c508a1f448810e66302ef56a2c3a782ca42ee3d38a1a3758424efcefb3de54da0f08a58',
x'49d408b4742a3f7e2cdeb9bccd95761afc1716717f9b72b657c9218f208a182bbffea8922e2bd0713bed04c9099be86daf5a81556bce6733122974487ec0324d',
x'c9553759ac5b3a30407b4e9536ddb29932463438b61854729aa55a6138c87ed0e69cf231c53d33b74d9195a8406513ca6920435d7a070f2a7ee45c3f0e96d822',
x'55786648c85f52a1c2e0f9fa1a8f4f1bdbe818d1da902e08e45140c3cabdd02498d5ebf5bfc8b89c90234810d5a0ff20bd6ccb6fb1b0752ad4d390bdf147d459',
x'c3330de9e01d60e9ff99eaf658373f21b0eba864facc782bbdb1dc2160fdf2224d5048a85fdf25340bd268606022390c4d1fed632bdbfd0a68a358251f7c985c',
x'1bfc48f014c0ade31901c276bcdea7cfd6cd125d5bd26941be0deb9ec72a3946053e14f315d12414912082a3cea35dcb89549d64754a12f8e62d633383195906',
x'119925fd6494ac479e6c093e0030752ca0c30a04f20737dbc5c908179d0ff99dc939cdb84dd5ea9f8351e7169473edf5bb46fba0f0e7f96ac4dba5e7530a354e',
x'fcafe2b24004444580fb571bbb855dc119ca411a264ae92e7010c093916c2044ddf425cbb31472714fde5be58637693539c806c8e0fc5050e9ce2070c7812539',
x'fd8c32df329180aafb72248a0efb899f8e49096825ce582912146a72bc7f07ad8fe9aabb4d1e95bd52a3b1d4c99faf74b819542380b0e2d03abfbf7c0a6bd4ae',
x'94aa4628511e9bf0a3998dc3c51d3ceed297b1292d902f68bce5b605636b228875a4e37465c61a2328ce3d4fb50d13334a5074e2e80fb049e4bdbd5ec1f87993',
x'1e9b4f071f739fe20aa2a5da5781e13b5d7ed373d4c30f4aebf31436383c8a26af89666790f3d6f025d3385804e43a4d6e609be474ab04a8493254647dcfeaff',
x'fae5d1a75387ef176aa8355711ecab267007dc38b856117c74ac96d7d5fcbcf6c6a55d4d7235e134e6e3f508dbb0e4341a011d62a36659b9c01712fa53b690fe',
x'6a0e32afa69e253a74a95b8dcf178875c095e49be833e359048e1e94e03a0515799add79161300caaa292bfc18047f6179aa848dfb6da78d88590c4efc17b2a9',
x'd1b6ac3523570b367181e3a342a9be5d54842c55718e00a61b617828216ae196723fe24f89475e97fc70d0bc1ee356f2c0001070bd699846f7dab573fc13ea66',
x'c0c9f73a98f9672caaa090b976a03bc6e15c26d3d1b14a16b3fff34559d0aa22ec2d6ecbd984cdd496aedb4b31b26c6666533f6e81ed0bdbe73e960485e2e66e',
x'd44f959e67eb94d754402d5a41b99a4677fe6ca9b5340af4bd0c6ed8a517070bd56313670531468dbc67e727c74bed1e46111c9d8bbfec46ba1bbfb7bf41a1a5',
x'89998c1f236006401e72f6304d8d2d886735cf47feaf084a175923c1da4ebb9ab989ee9e4881f09e82337ecc8c6bfb55833e252c7ffe916c260e3e1b7f6e0b0c',
x'75f13710e2b59669367ac299e3f26c0841cb1baf9811d33515571ed981909f9c91626c6b69eac125f6034030261d11c35dd3488dd95c60661c01cf974bcacff1',
x'e1cd804da49039c291baa7eefbfc5a2010743ba02e5b33aa2c0e6f42bb0629ab58298e52d5b54a944831a69990e6ca3d09edb230bd014185c27816f09b8f313a',
x'210550b2cfd2fec464f8efb25d1d8ba88f508bcc9efe02cfb88542e9c01c7c09cdf119b079dd64c1380fa5878424ea20dde85904ac95434c7dc32673af9c2128',
x'71e4cfdfaf096a26f35055946d70521282253090b210cc4a11402599eb6165ce22b7e1ea63ee4be4377f1820eb436506caf0d9e01195d80db00869c125b35842',
x'746226ed2d9a45d1b6558108165d5aff11c069fe3d2d761bcb94b632911e42b9582e0c9857cd4fe057979b482da4aad0cab4a0afddfb3393308837d009c646b6',
x'383b5f516f470dd924bc7ca7623552e2783691302c379d9ce6181477cf828554fa5d0ec55360004e61daac249f5232b9ad1037739098385e5ba26a72dfec7370',
x'7ceba303e4c2346b8ddbfd1112aa0c129f432ab0b15bb6868568ac2de146e65cfabeee3d9ba45563c5e1d5973c27f8bc677c524287bc64af3bc55f106ec44035',
x'4d089cfcecf3b50fbeda046459a5115a7b3fb09383bc0ff2736dc63cf97f01caa5dab265827b69069826f34e24009a601fcf8cd4fe141a70c240d91be2350003',
x'cd8aea1fd622324887bb34b4d8d2aebeb12500c4cd45816cbaf6024d070724c4ef2e207825f93e08823cf59318b08b4b2579a718b348a84972ce2102fa6b216d',
x'35706ada796eedcca01ecc3997d0699c0a4ef590aa90592ba5fa564e1a3c131b0ddcdef152a03573db1528c6348bb37c20492adf4566993b5b7c276f057b8cb0',
x'ccef6b324be809a4e8d5222769be1e1dfbd538a70e84d9aaf22462cb59b5fcf7ade3cba43a8a5e2cfba97322551fbb3426f2ffeafdfb3ce336e26453ba4f3d3c',
x'091968fae44bb79f8d7778d44e276caf8aefb7c5bf64b07bb406e8648761d53cbe318ab0229370748de2369cae484596017c7e95543a4da675a483db96455a54',
x'6e06639addc778e4eaeb59bec3cc80201e2a5fee7c7dfd44b0dde2bdd5b58990943afcd6920a8949e3a95f7a9621dd2abbb68994a5cc658731689c821fb08723',
x'c381cac8bed51f11121c111116e3585a00fa019b8d71372f2f0ef92da09892d4e867f95fdb54533417c484aa719c75c5e67398408d4c579902d173a1fc8391b3',
x'1cf5ab9c9d85f6a31ee481e5b54c0159d8bc9e52e9fea1a0c1c9607280055b34ae1fe9276358e9259bb10e637c78c0f5db82c2ed0453676abee71d7888f81a28',
x'bbc3e957b8196b72ba0ebed150d8d917531ac470e0fd7d76d373c721697287df44ce4c10d91c3ba044e9fe74c499a888de71170d0047bd9d30c225ec4dadc3fe',
x'218ec72f00c7e56537f4d798b6bb1c2511cafee735442da422548cd694c64bdea42493fffcdcd155c7a97778093f1c5e18fef15aa4ef47b89d24948b1af0c39e',
x'14c4b14fa9fc9a8484960c423d804479ca7edb1c81c2afdeb72389ceeeea419493a4044e3823099c14bff196a729e1d497badc6a6e23c49b9430fd13aa8748b2',
x'116a1aa8df10ba592492228710e3645cf792efe34bc039344686cad873c75863ecaf9220eb4faed947d1ac70bf3091d96dd1b4e954719f7094fb06ee8a06c5ab',
x'8e35ffe276924fc9ec40374ef1f2f138693ab95030068ecb607e6d98d282db71f5d76edfe2607ddd03157ea80167b1a8c3e10383be2a07078792338c9e1f922b',
x'eac8b224525b07e144d1459f47d00ed3c37e8cb4aaf2f67c377d91f3e4614587b3aa4daf69fb6ce5aa8b25a1653d9b32ef2bd0c5b543a7ca2022159445ade31b',
x'460e7cc8613d3534fe0397d28b569174c9211cba850c137e92a3c8071914792bc29b48244b1f524d08df8ecd53b82b71e366fb050b1b3f299e72064aa2d9d297',
x'2db2b40e6c2f8cd7cb5f0609298f2d1a32763945256a78219873b2cc5493850ec835bfddbd05702caaa0d77d700db53865d632ba5ec687be460fe32b9d4d4d8e',
x'6f5cc9371890f37c52a6f8c40bb8f21da92eeda3f8b327f5bd0a39c6c7b35a21bb3f898cf3f64d2874c34ca845329c3506907abf4bd6267c2a25ae04cc6c48b0',
x'1709260d0497fabec3a39511cb62b74346d569192957cc6540d4462b17318ccde65a0f8959cea9e47ff6511c0d819e18dc8455744268d778a82aeb4e89cc9f63',
x'9b7632ab332de829a6c8bb47af81fe0c1a9ca7f1ac7dc53eaf34077ab855ca8bd30130a67f23e8a2dac5134e4412630fb5c6a8eb627acb85cd717f847a200017',
x'64bb30dae392d06aaac2bc93c583a7a1e158b92f6a1b7966cbc67adb15140b9485e727a3afc0893c2223b85bba94235415ab3a1c2a91443ee00c99d10d97ac79',
x'0d649086eb717d769ffbfea27a2903876ddcff12aacd1421ed5660e1e70b759ad619e0e5dbabae7e704fc864681deffa9a2d729fd2fd297372caaebf21775474',
x'7864b571503919dffd2cfcc92725243530cd579d682a912ae3d776df47015aa8ce9c72809cccde5dc45d9ee41fb91e61f4db0e400e2e9db157affd42b198bed3',
x'68bfd8a098f2f4d6981f64a0e02248bfdc2d5262fc9ffdb771a58dbd923b7408bd388fc0979dc041df9f65cb9908b889875681642dfdbb4532b695dd6e5491bd',
x'bcb8590893a8f2dc70cba6b6646311f319b5445132d380b66eed00f244bbc79965d0f69b0ffa8ed32e7a32aa1343c6a0a94b3a6ab864eb184bb68fded5afc7cd',
x'47a4b7e0afdad8c51e86e245636d018d328f9a9062a63dbe2709b2238a231f341155690d483e42771c40115594318c5282d0ea3f2e6b9535eefab300d04256a2',
x'589a36c4bda6609e291ff1dde95a5606766b86c7ea0054b0a2c5b78166bac9626c29234728b75086867d851129d758c6d4465e540676c5a5f30fa6c07b7c156b',
x'5615a135369c67336494a347645bb4dfa8b0dfd535bc4355792cfe41ba798071a6e23785f1a3595fd6713f4224bbd0c8ad3a6d279f1c8fdde2687651c5f8f0f6',
x'd2379e78bc2d9ebaad516c18d4bd277b4c52079c9db3897a460fd59c4a365658292c1edc0b28b366aafef64b462dae940752f14a17deca3f0ec1dc97232fde9a',
x'adfeed6a582e44f7acc3e3b06aad378fe6b5744d98491dbced3eb9e778a3b2ec920564284538e84cc0bd2b58d878745c133ca981f0ebb6dd758094e68f8ca9f8',
};
fn void test_whirlpool_sweep_block_size()
{
for (usz i = 1; i < SEQUENTIAL_HASHES.len; ++i)
{
char[] v = calloc(i)[:i];
defer free(v.ptr);
for (usz x = 0; x < i; ++x) v[x] = 'A';
char[*] result = whirlpool::hash(v);
assert(result[..] == SEQUENTIAL_HASHES[i - 1]);
}
}