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