randombytes.c (3963B)
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 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 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 123 randombytes_uniform_impl(const uint32_t upper_bound) 124 { 125 return upper_bound; 126 } 127 128 static int 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 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 }