| 1 | #include "crypto/tests/test_internal.h" |
| 2 | |
| 3 | TEST_GROUP_DECLARE(prng, .intensity_desc = { |
| 4 | .curve = SCALE_PIECEWISE_LOG, |
| 5 | .unit = "samples" , |
| 6 | }); |
| 7 | |
| 8 | TEST_DECLARE_UNIT(prng, determinism, TEST_INTENSITY(16, 256, 65536)) { |
| 9 | size_t samples = ctx->intensity_val ? ctx->intensity_val : 256; |
| 10 | uint64_t seed_val = 0xDEADBEEFCAFEULL; |
| 11 | uint64_t *seq1 = kmalloc(samples * sizeof(uint64_t), ALLOC_FLAGS_NONE); |
| 12 | TEST_ASSERT_NONNULL(seq1); |
| 13 | |
| 14 | prng_seed(seed: seed_val); |
| 15 | for (size_t i = 0; i < samples; i++) |
| 16 | seq1[i] = prng_next(); |
| 17 | |
| 18 | prng_seed(seed: seed_val); |
| 19 | for (size_t i = 0; i < samples; i++) { |
| 20 | uint64_t val = prng_next(); |
| 21 | TEST_ASSERT_EQ(seq1[i], val); |
| 22 | } |
| 23 | |
| 24 | for (size_t i = 1; i < samples; i++) |
| 25 | TEST_ASSERT_NE(seq1[i], seq1[i - 1]); |
| 26 | |
| 27 | kfree(seq1); |
| 28 | return TEST_SUCCESS; |
| 29 | } |
| 30 | |
| 31 | TEST_DECLARE_UNIT(prng, splitmix64_determinism, |
| 32 | TEST_INTENSITY(16, 256, 65536)) { |
| 33 | size_t samples = ctx->intensity_val ? ctx->intensity_val : 256; |
| 34 | uint64_t seed_val = 0x123456789ABCDEF0ULL; |
| 35 | uint64_t *seq1 = kmalloc(samples * sizeof(uint64_t), ALLOC_FLAGS_NONE); |
| 36 | TEST_ASSERT_NONNULL(seq1); |
| 37 | |
| 38 | uint64_t state1 = seed_val; |
| 39 | for (size_t i = 0; i < samples; i++) |
| 40 | seq1[i] = prng_splitmix64_next(state: &state1); |
| 41 | |
| 42 | uint64_t state2 = seed_val; |
| 43 | for (size_t i = 0; i < samples; i++) { |
| 44 | uint64_t val = prng_splitmix64_next(state: &state2); |
| 45 | TEST_ASSERT_EQ(seq1[i], val); |
| 46 | } |
| 47 | |
| 48 | for (size_t i = 1; i < samples; i++) |
| 49 | TEST_ASSERT_NE(seq1[i], seq1[i - 1]); |
| 50 | |
| 51 | kfree(seq1); |
| 52 | return TEST_SUCCESS; |
| 53 | } |
| 54 | |