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