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