1#include "crypto/tests/test_internal.h"
2
3TEST_GROUP_DECLARE(prng, .intensity_desc = {
4 .curve = SCALE_PIECEWISE_LOG,
5 .unit = "samples",
6 });
7
8TEST_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
31TEST_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