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