sha2_test: do correctness checks for all implementations

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Attila Fülöp <attila@fueloep.org>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Alexander Motin <alexander.motin@TrueNAS.com>
Signed-off-by: Rob Norris <rob.norris@truenas.com>
Closes #18232
This commit is contained in:
Rob Norris 2026-02-18 13:37:18 +11:00 committed by Brian Behlendorf
parent b291d9aa22
commit aeb9fb3828

View File

@ -22,6 +22,7 @@
/* /*
* Copyright 2013 Saso Kiselkov. All rights reserved. * Copyright 2013 Saso Kiselkov. All rights reserved.
* Copyright (c) 2026, TrueNAS.
*/ */
/* /*
@ -142,15 +143,15 @@ main(int argc, char *argv[])
if (!sha512) if (!sha512)
return (1); return (1);
#define SHA2_ALGO_TEST(_m, mode, diglen, testdigest) \ #define SHA2_ALGO_TEST(_m, mode, diglen, testdigest, name) \
do { \ do { \
SHA2_CTX ctx; \ SHA2_CTX ctx; \
uint8_t digest[diglen / 8]; \ uint8_t digest[diglen / 8]; \
SHA2Init(mode, &ctx); \ SHA2Init(mode, &ctx); \
SHA2Update(&ctx, _m, strlen(_m)); \ SHA2Update(&ctx, _m, strlen(_m)); \
SHA2Final(digest, &ctx); \ SHA2Final(digest, &ctx); \
(void) printf("SHA%-9sMessage: " #_m \ (void) printf("%-11s %-9s Message: " #_m \
"\tResult: ", #mode); \ "\tResult: ", #mode, name); \
if (memcmp(digest, testdigest, diglen / 8) == 0) { \ if (memcmp(digest, testdigest, diglen / 8) == 0) { \
(void) printf("OK\n"); \ (void) printf("OK\n"); \
} else { \ } else { \
@ -181,22 +182,38 @@ main(int argc, char *argv[])
cpb = (cpu_mhz * 1e6 * ((double)delta / \ cpb = (cpu_mhz * 1e6 * ((double)delta / \
1000000)) / (8192 * 128 * 1024); \ 1000000)) / (8192 * 128 * 1024); \
} \ } \
(void) printf("sha%s-%-9s%7llu us (%.02f CPB)\n", #mode,\ (void) printf("%s-%-9s %9llu us (%.02f CPB)\n", #mode, \
name, (u_longlong_t)delta, cpb); \ name, (u_longlong_t)delta, cpb); \
} while (0) } while (0)
(void) printf("Running algorithm correctness tests:\n"); (void) printf("Running algorithm correctness tests:\n");
SHA2_ALGO_TEST(test_msg0, SHA256, 256, sha256_test_digests[0]);
SHA2_ALGO_TEST(test_msg1, SHA256, 256, sha256_test_digests[1]); for (id = 0; id < sha256->getcnt(); id++) {
SHA2_ALGO_TEST(test_msg0, SHA512, 512, sha512_test_digests[0]); sha256->setid(id);
SHA2_ALGO_TEST(test_msg2, SHA512, 512, sha512_test_digests[2]); const char *name = sha256->getname();
SHA2_ALGO_TEST(test_msg0, SHA512_256, 256, sha512_256_test_digests[0]); SHA2_ALGO_TEST(test_msg0, SHA256, 256,
SHA2_ALGO_TEST(test_msg2, SHA512_256, 256, sha512_256_test_digests[2]); sha256_test_digests[0], name);
SHA2_ALGO_TEST(test_msg1, SHA256, 256,
sha256_test_digests[1], name);
}
for (id = 0; id < sha512->getcnt(); id++) {
sha512->setid(id);
const char *name = sha512->getname();
SHA2_ALGO_TEST(test_msg0, SHA512, 512,
sha512_test_digests[0], name);
SHA2_ALGO_TEST(test_msg2, SHA512, 512,
sha512_test_digests[2], name);
SHA2_ALGO_TEST(test_msg0, SHA512_256, 256,
sha512_256_test_digests[0], name);
SHA2_ALGO_TEST(test_msg2, SHA512_256, 256,
sha512_256_test_digests[2], name);
}
if (failed) if (failed)
return (1); return (1);
(void) printf("Running performance tests (hashing 1024 MiB of " (void) printf("\nRunning performance tests (hashing 1024 MiB of "
"data):\n"); "data):\n");
for (id = 0; id < sha256->getcnt(); id++) { for (id = 0; id < sha256->getcnt(); id++) {