Blame SOURCES/libsodium-1.0.18/test/default/randombytes.c

rdobuilder 775784
rdobuilder 775784
#define TEST_NAME "randombytes"
rdobuilder 775784
#include "cmptest.h"
rdobuilder 775784
rdobuilder 775784
static unsigned char      x[65536];
rdobuilder 775784
static unsigned long long freq[256];
rdobuilder 775784
rdobuilder 775784
static int
rdobuilder 775784
compat_tests(void)
rdobuilder 775784
{
rdobuilder 775784
    size_t i;
rdobuilder 775784
rdobuilder 775784
    memset(x, 0, sizeof x);
rdobuilder 775784
    randombytes(x, sizeof x);
rdobuilder 775784
    for (i = 0; i < 256; ++i) {
rdobuilder 775784
        freq[i] = 0;
rdobuilder 775784
    }
rdobuilder 775784
    for (i = 0; i < sizeof x; ++i) {
rdobuilder 775784
        ++freq[255 & (int) x[i]];
rdobuilder 775784
    }
rdobuilder 775784
    for (i = 0; i < 256; ++i) {
rdobuilder 775784
        if (!freq[i]) {
rdobuilder 775784
            printf("nacl_tests failed\n");
rdobuilder 775784
        }
rdobuilder 775784
    }
rdobuilder 775784
    return 0;
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
static int
rdobuilder 775784
randombytes_tests(void)
rdobuilder 775784
{
rdobuilder 775784
    static const unsigned char seed[randombytes_SEEDBYTES] = {
rdobuilder 775784
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
rdobuilder 775784
        0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
rdobuilder 775784
        0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
rdobuilder 775784
    };
rdobuilder 775784
    unsigned char out[100];
rdobuilder 775784
    unsigned int  f = 0U;
rdobuilder 775784
    unsigned int  i;
rdobuilder 775784
    uint32_t      n;
rdobuilder 775784
rdobuilder 775784
#ifndef BENCHMARKS
rdobuilder 775784
# ifdef __EMSCRIPTEN__
rdobuilder 775784
    assert(strcmp(randombytes_implementation_name(), "js") == 0);
rdobuilder 775784
# else
rdobuilder 775784
    assert(strcmp(randombytes_implementation_name(), "sysrandom") == 0);
rdobuilder 775784
# endif
rdobuilder 775784
#endif
rdobuilder 775784
    randombytes(x, 1U);
rdobuilder 775784
    do {
rdobuilder 775784
        n = randombytes_random();
rdobuilder 775784
        f |= ((n >> 24) > 1);
rdobuilder 775784
        f |= ((n >> 16) > 1) << 1;
rdobuilder 775784
        f |= ((n >> 8) > 1) << 2;
rdobuilder 775784
        f |= ((n) > 1) << 3;
rdobuilder 775784
        f |= (n > 0x7fffffff) << 4;
rdobuilder 775784
    } while (f != 0x1f);
rdobuilder 775784
    randombytes_close();
rdobuilder 775784
rdobuilder 775784
    for (i = 0; i < 256; ++i) {
rdobuilder 775784
        freq[i] = 0;
rdobuilder 775784
    }
rdobuilder 775784
    for (i = 0; i < 65536; ++i) {
rdobuilder 775784
        ++freq[randombytes_uniform(256)];
rdobuilder 775784
    }
rdobuilder 775784
    for (i = 0; i < 256; ++i) {
rdobuilder 775784
        if (!freq[i]) {
rdobuilder 775784
            printf("randombytes_uniform() test failed\n");
rdobuilder 775784
        }
rdobuilder 775784
    }
rdobuilder 775784
    assert(randombytes_uniform(1U) == 0U);
rdobuilder 775784
    randombytes_close();
rdobuilder 775784
#ifndef __EMSCRIPTEN__
rdobuilder 775784
    assert(&randombytes_internal_implementation == &randombytes_salsa20_implementation);
rdobuilder 775784
    randombytes_set_implementation(&randombytes_internal_implementation);
rdobuilder 775784
    assert(strcmp(randombytes_implementation_name(), "internal") == 0);
rdobuilder 775784
#endif
rdobuilder 775784
    randombytes_stir();
rdobuilder 775784
    for (i = 0; i < 256; ++i) {
rdobuilder 775784
        freq[i] = 0;
rdobuilder 775784
    }
rdobuilder 775784
    for (i = 0; i < 65536; ++i) {
rdobuilder 775784
        ++freq[randombytes_uniform(256)];
rdobuilder 775784
    }
rdobuilder 775784
    for (i = 0; i < 256; ++i) {
rdobuilder 775784
        if (!freq[i]) {
rdobuilder 775784
            printf("randombytes_uniform() test failed\n");
rdobuilder 775784
        }
rdobuilder 775784
    }
rdobuilder 775784
    memset(x, 0, sizeof x);
rdobuilder 775784
    randombytes_buf(x, sizeof x);
rdobuilder 775784
    for (i = 0; i < 256; ++i) {
rdobuilder 775784
        freq[i] = 0;
rdobuilder 775784
    }
rdobuilder 775784
    for (i = 0; i < sizeof x; ++i) {
rdobuilder 775784
        ++freq[255 & (int) x[i]];
rdobuilder 775784
    }
rdobuilder 775784
    for (i = 0; i < 256; ++i) {
rdobuilder 775784
        if (!freq[i]) {
rdobuilder 775784
            printf("randombytes_buf() test failed\n");
rdobuilder 775784
        }
rdobuilder 775784
    }
rdobuilder 775784
    assert(randombytes_uniform(1U) == 0U);
rdobuilder 775784
rdobuilder 775784
    randombytes_buf_deterministic(out, sizeof out, seed);
rdobuilder 775784
    for (i = 0; i < sizeof out; ++i) {
rdobuilder 775784
        printf("%02x", out[i]);
rdobuilder 775784
    }
rdobuilder 775784
    printf(" (deterministic)\n");
rdobuilder 775784
rdobuilder 775784
    randombytes_close();
rdobuilder 775784
rdobuilder 775784
    randombytes(x, 1U);
rdobuilder 775784
    randombytes_close();
rdobuilder 775784
rdobuilder 775784
    assert(randombytes_SEEDBYTES > 0);
rdobuilder 775784
    assert(randombytes_seedbytes() == randombytes_SEEDBYTES);
rdobuilder 775784
rdobuilder 775784
    return 0;
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
static uint32_t
rdobuilder 775784
randombytes_uniform_impl(const uint32_t upper_bound)
rdobuilder 775784
{
rdobuilder 775784
    return upper_bound;
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
static int
rdobuilder 775784
impl_tests(void)
rdobuilder 775784
{
rdobuilder 775784
    randombytes_implementation impl = randombytes_sysrandom_implementation;
rdobuilder 775784
    uint32_t                   v = randombytes_random();
rdobuilder 775784
rdobuilder 775784
    impl.uniform = randombytes_uniform_impl;
rdobuilder 775784
    randombytes_close();
rdobuilder 775784
    randombytes_set_implementation(&impl;;
rdobuilder 775784
    assert(randombytes_uniform(1) == 1);
rdobuilder 775784
    assert(randombytes_uniform(v) == v);
rdobuilder 775784
    assert(randombytes_uniform(v) == v);
rdobuilder 775784
    assert(randombytes_uniform(v) == v);
rdobuilder 775784
    assert(randombytes_uniform(v) == v);
rdobuilder 775784
    randombytes_close();
rdobuilder 775784
    impl.close = NULL;
rdobuilder 775784
    randombytes_close();
rdobuilder 775784
rdobuilder 775784
    return 0;
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
int
rdobuilder 775784
main(void)
rdobuilder 775784
{
rdobuilder 775784
    compat_tests();
rdobuilder 775784
    randombytes_tests();
rdobuilder 775784
#ifndef __EMSCRIPTEN__
rdobuilder 775784
    impl_tests();
rdobuilder 775784
#endif
rdobuilder 775784
    printf("OK\n");
rdobuilder 775784
rdobuilder 775784
#ifndef __EMSCRIPTEN__
rdobuilder 775784
    randombytes_set_implementation(&randombytes_salsa20_implementation);
rdobuilder 775784
#endif
rdobuilder 775784
rdobuilder 775784
    return 0;
rdobuilder 775784
}