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