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 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 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 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 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 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