xref: /netbsd-src/sys/external/isc/libsodium/dist/test/default/randombytes.c (revision f447f37a0a0b7f2a0e879f17bef92d4992e27500)
1*f447f37aSriastradh 
2*f447f37aSriastradh #define TEST_NAME "randombytes"
3*f447f37aSriastradh #include "cmptest.h"
4*f447f37aSriastradh 
5*f447f37aSriastradh static unsigned char      x[65536];
6*f447f37aSriastradh static unsigned long long freq[256];
7*f447f37aSriastradh 
8*f447f37aSriastradh static int
compat_tests(void)9*f447f37aSriastradh compat_tests(void)
10*f447f37aSriastradh {
11*f447f37aSriastradh     size_t i;
12*f447f37aSriastradh 
13*f447f37aSriastradh     memset(x, 0, sizeof x);
14*f447f37aSriastradh     randombytes(x, sizeof x);
15*f447f37aSriastradh     for (i = 0; i < 256; ++i) {
16*f447f37aSriastradh         freq[i] = 0;
17*f447f37aSriastradh     }
18*f447f37aSriastradh     for (i = 0; i < sizeof x; ++i) {
19*f447f37aSriastradh         ++freq[255 & (int) x[i]];
20*f447f37aSriastradh     }
21*f447f37aSriastradh     for (i = 0; i < 256; ++i) {
22*f447f37aSriastradh         if (!freq[i]) {
23*f447f37aSriastradh             printf("nacl_tests failed\n");
24*f447f37aSriastradh         }
25*f447f37aSriastradh     }
26*f447f37aSriastradh     return 0;
27*f447f37aSriastradh }
28*f447f37aSriastradh 
29*f447f37aSriastradh static int
randombytes_tests(void)30*f447f37aSriastradh randombytes_tests(void)
31*f447f37aSriastradh {
32*f447f37aSriastradh     static const unsigned char seed[randombytes_SEEDBYTES] = {
33*f447f37aSriastradh         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
34*f447f37aSriastradh         0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
35*f447f37aSriastradh         0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
36*f447f37aSriastradh     };
37*f447f37aSriastradh     unsigned char out[100];
38*f447f37aSriastradh     unsigned int  f = 0U;
39*f447f37aSriastradh     unsigned int  i;
40*f447f37aSriastradh     uint32_t      n;
41*f447f37aSriastradh 
42*f447f37aSriastradh #ifndef BENCHMARKS
43*f447f37aSriastradh # ifdef __EMSCRIPTEN__
44*f447f37aSriastradh     assert(strcmp(randombytes_implementation_name(), "js") == 0);
45*f447f37aSriastradh # elif defined(__native_client__)
46*f447f37aSriastradh     assert(strcmp(randombytes_implementation_name(), "nativeclient") == 0);
47*f447f37aSriastradh # else
48*f447f37aSriastradh     assert(strcmp(randombytes_implementation_name(), "sysrandom") == 0);
49*f447f37aSriastradh # endif
50*f447f37aSriastradh #endif
51*f447f37aSriastradh     randombytes(x, 1U);
52*f447f37aSriastradh     do {
53*f447f37aSriastradh         n = randombytes_random();
54*f447f37aSriastradh         f |= ((n >> 24) > 1);
55*f447f37aSriastradh         f |= ((n >> 16) > 1) << 1;
56*f447f37aSriastradh         f |= ((n >> 8) > 1) << 2;
57*f447f37aSriastradh         f |= ((n) > 1) << 3;
58*f447f37aSriastradh         f |= (n > 0x7fffffff) << 4;
59*f447f37aSriastradh     } while (f != 0x1f);
60*f447f37aSriastradh     randombytes_close();
61*f447f37aSriastradh 
62*f447f37aSriastradh     for (i = 0; i < 256; ++i) {
63*f447f37aSriastradh         freq[i] = 0;
64*f447f37aSriastradh     }
65*f447f37aSriastradh     for (i = 0; i < 65536; ++i) {
66*f447f37aSriastradh         ++freq[randombytes_uniform(256)];
67*f447f37aSriastradh     }
68*f447f37aSriastradh     for (i = 0; i < 256; ++i) {
69*f447f37aSriastradh         if (!freq[i]) {
70*f447f37aSriastradh             printf("randombytes_uniform() test failed\n");
71*f447f37aSriastradh         }
72*f447f37aSriastradh     }
73*f447f37aSriastradh     assert(randombytes_uniform(1U) == 0U);
74*f447f37aSriastradh     randombytes_close();
75*f447f37aSriastradh #ifndef __EMSCRIPTEN__
76*f447f37aSriastradh     randombytes_set_implementation(&randombytes_salsa20_implementation);
77*f447f37aSriastradh     assert(strcmp(randombytes_implementation_name(), "salsa20") == 0);
78*f447f37aSriastradh #endif
79*f447f37aSriastradh     randombytes_stir();
80*f447f37aSriastradh     for (i = 0; i < 256; ++i) {
81*f447f37aSriastradh         freq[i] = 0;
82*f447f37aSriastradh     }
83*f447f37aSriastradh     for (i = 0; i < 65536; ++i) {
84*f447f37aSriastradh         ++freq[randombytes_uniform(256)];
85*f447f37aSriastradh     }
86*f447f37aSriastradh     for (i = 0; i < 256; ++i) {
87*f447f37aSriastradh         if (!freq[i]) {
88*f447f37aSriastradh             printf("randombytes_uniform() test failed\n");
89*f447f37aSriastradh         }
90*f447f37aSriastradh     }
91*f447f37aSriastradh     memset(x, 0, sizeof x);
92*f447f37aSriastradh     randombytes_buf(x, sizeof x);
93*f447f37aSriastradh     for (i = 0; i < 256; ++i) {
94*f447f37aSriastradh         freq[i] = 0;
95*f447f37aSriastradh     }
96*f447f37aSriastradh     for (i = 0; i < sizeof x; ++i) {
97*f447f37aSriastradh         ++freq[255 & (int) x[i]];
98*f447f37aSriastradh     }
99*f447f37aSriastradh     for (i = 0; i < 256; ++i) {
100*f447f37aSriastradh         if (!freq[i]) {
101*f447f37aSriastradh             printf("randombytes_buf() test failed\n");
102*f447f37aSriastradh         }
103*f447f37aSriastradh     }
104*f447f37aSriastradh     assert(randombytes_uniform(1U) == 0U);
105*f447f37aSriastradh 
106*f447f37aSriastradh     randombytes_buf_deterministic(out, sizeof out, seed);
107*f447f37aSriastradh     for (i = 0; i < sizeof out; ++i) {
108*f447f37aSriastradh         printf("%02x", out[i]);
109*f447f37aSriastradh     }
110*f447f37aSriastradh     printf(" (deterministic)\n");
111*f447f37aSriastradh 
112*f447f37aSriastradh     randombytes_close();
113*f447f37aSriastradh 
114*f447f37aSriastradh     randombytes(x, 1U);
115*f447f37aSriastradh     randombytes_close();
116*f447f37aSriastradh 
117*f447f37aSriastradh     assert(randombytes_SEEDBYTES > 0);
118*f447f37aSriastradh     assert(randombytes_seedbytes() == randombytes_SEEDBYTES);
119*f447f37aSriastradh 
120*f447f37aSriastradh     return 0;
121*f447f37aSriastradh }
122*f447f37aSriastradh 
123*f447f37aSriastradh static uint32_t
randombytes_uniform_impl(const uint32_t upper_bound)124*f447f37aSriastradh randombytes_uniform_impl(const uint32_t upper_bound)
125*f447f37aSriastradh {
126*f447f37aSriastradh     return upper_bound;
127*f447f37aSriastradh }
128*f447f37aSriastradh 
129*f447f37aSriastradh static int
impl_tests(void)130*f447f37aSriastradh impl_tests(void)
131*f447f37aSriastradh {
132*f447f37aSriastradh #ifndef __native_client__
133*f447f37aSriastradh     randombytes_implementation impl = randombytes_sysrandom_implementation;
134*f447f37aSriastradh #else
135*f447f37aSriastradh     randombytes_implementation impl = randombytes_nativeclient_implementation;
136*f447f37aSriastradh #endif
137*f447f37aSriastradh     uint32_t                   v = randombytes_random();
138*f447f37aSriastradh 
139*f447f37aSriastradh     impl.uniform = randombytes_uniform_impl;
140*f447f37aSriastradh     randombytes_close();
141*f447f37aSriastradh     randombytes_set_implementation(&impl);
142*f447f37aSriastradh     assert(randombytes_uniform(1) == 1);
143*f447f37aSriastradh     assert(randombytes_uniform(v) == v);
144*f447f37aSriastradh     assert(randombytes_uniform(v) == v);
145*f447f37aSriastradh     assert(randombytes_uniform(v) == v);
146*f447f37aSriastradh     assert(randombytes_uniform(v) == v);
147*f447f37aSriastradh     randombytes_close();
148*f447f37aSriastradh     impl.close = NULL;
149*f447f37aSriastradh     randombytes_close();
150*f447f37aSriastradh 
151*f447f37aSriastradh     return 0;
152*f447f37aSriastradh }
153*f447f37aSriastradh 
154*f447f37aSriastradh int
main(void)155*f447f37aSriastradh main(void)
156*f447f37aSriastradh {
157*f447f37aSriastradh     compat_tests();
158*f447f37aSriastradh     randombytes_tests();
159*f447f37aSriastradh #ifndef __EMSCRIPTEN__
160*f447f37aSriastradh     impl_tests();
161*f447f37aSriastradh #endif
162*f447f37aSriastradh     printf("OK\n");
163*f447f37aSriastradh 
164*f447f37aSriastradh     randombytes_set_implementation(&randombytes_salsa20_implementation);
165*f447f37aSriastradh 
166*f447f37aSriastradh     return 0;
167*f447f37aSriastradh }
168