* @brief Tests SHA256 implementations, comparing serial and SIMD variants * against known FIPS 180-4 test vectors. */
| 354 | * against known FIPS 180-4 test vectors. |
| 355 | */ |
| 356 | void test_sha256_equivalence( // |
| 357 | sz_sha256_state_init_t init_base, sz_sha256_state_update_t update_base, sz_sha256_state_digest_t digest_base, // |
| 358 | sz_sha256_state_init_t init_simd, sz_sha256_state_update_t update_simd, sz_sha256_state_digest_t digest_simd) { |
| 359 | |
| 360 | // Test random inputs of various lengths |
| 361 | for (std::size_t length = 0; length <= 256; ++length) { |
| 362 | std::string random_text(length, '\0'); |
| 363 | randomize_string(&random_text[0], length); |
| 364 | |
| 365 | sz_sha256_state_t state_base, state_simd; |
| 366 | sz_u8_t digest_base_result[32], digest_simd_result[32]; |
| 367 | |
| 368 | // One-shot hashing |
| 369 | init_base(&state_base); |
| 370 | init_simd(&state_simd); |
| 371 | update_base(&state_base, random_text.data(), length); |
| 372 | update_simd(&state_simd, random_text.data(), length); |
| 373 | digest_base(&state_base, digest_base_result); |
| 374 | digest_simd(&state_simd, digest_simd_result); |
| 375 | assert(std::memcmp(digest_base_result, digest_simd_result, 32) == 0); |
| 376 | |
| 377 | // Incremental hashing with random chunks |
| 378 | init_base(&state_base); |
| 379 | init_simd(&state_simd); |
| 380 | iterate_in_random_slices(random_text, [&](std::string slice) { |
| 381 | update_base(&state_base, slice.data(), slice.size()); |
| 382 | update_simd(&state_simd, slice.data(), slice.size()); |
| 383 | }); |
| 384 | digest_base(&state_base, digest_base_result); |
| 385 | digest_simd(&state_simd, digest_simd_result); |
| 386 | assert(std::memcmp(digest_base_result, digest_simd_result, 32) == 0); |
| 387 | } |
| 388 | } |
| 389 | |
| 390 | /** |
| 391 | * @brief Tests UTF-8 functions across different SIMD backends against the serial implementation. |
no test coverage detected
searching dependent graphs…