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

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