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