Blame SOURCES/libsodium-1.0.18/test/default/cmptest.h

rdobuilder 775784
rdobuilder 775784
#ifndef __CMPTEST_H__
rdobuilder 775784
#define __CMPTEST_H__
rdobuilder 775784
rdobuilder 775784
#ifdef NDEBUG
rdobuilder 775784
#/**/undef/**/ NDEBUG
rdobuilder 775784
#endif
rdobuilder 775784
rdobuilder 775784
#include <assert.h>
rdobuilder 775784
#include <errno.h>
rdobuilder 775784
#include <limits.h>
rdobuilder 775784
#include <stdio.h>
rdobuilder 775784
#include <stdint.h>
rdobuilder 775784
#include <stdlib.h>
rdobuilder 775784
#include <string.h>
rdobuilder 775784
rdobuilder 775784
#include "sodium.h"
rdobuilder 775784
#include "quirks.h"
rdobuilder 775784
rdobuilder 775784
#ifdef __EMSCRIPTEN__
rdobuilder 775784
# undef TEST_SRCDIR
rdobuilder 775784
# define TEST_SRCDIR "/test-data"
rdobuilder 775784
#endif
rdobuilder 775784
#ifndef TEST_SRCDIR
rdobuilder 775784
# define TEST_SRCDIR "."
rdobuilder 775784
#endif
rdobuilder 775784
rdobuilder 775784
#define TEST_NAME_RES TEST_NAME ".res"
rdobuilder 775784
#define TEST_NAME_OUT TEST_SRCDIR "/" TEST_NAME ".exp"
rdobuilder 775784
rdobuilder 775784
#ifdef HAVE_ARC4RANDOM
rdobuilder 775784
# undef rand
rdobuilder 775784
# define rand(X) arc4random(X)
rdobuilder 775784
#endif
rdobuilder 775784
rdobuilder 775784
int xmain(void);
rdobuilder 775784
rdobuilder 775784
static unsigned char *guard_page;
rdobuilder 775784
rdobuilder 775784
#ifdef BENCHMARKS
rdobuilder 775784
rdobuilder 775784
# include <sys/time.h>
rdobuilder 775784
rdobuilder 775784
# ifndef ITERATIONS
rdobuilder 775784
#  define ITERATIONS 128
rdobuilder 775784
# endif
rdobuilder 775784
rdobuilder 775784
struct {
rdobuilder 775784
    void   *pnt;
rdobuilder 775784
    size_t  size;
rdobuilder 775784
} mempool[1024];
rdobuilder 775784
rdobuilder 775784
static size_t mempool_idx;
rdobuilder 775784
rdobuilder 775784
static __attribute__((malloc)) void *mempool_alloc(size_t size)
rdobuilder 775784
{
rdobuilder 775784
    size_t i;
rdobuilder 775784
    if (size >= (size_t) 0x80000000 - (size_t) 0x00000fff) {
rdobuilder 775784
        return NULL;
rdobuilder 775784
    }
rdobuilder 775784
    size = (size + (size_t) 0x00000fff) & ~ (size_t) 0x00000fff;
rdobuilder 775784
    for (i = 0U; i < mempool_idx; i++) {
rdobuilder 775784
        if (mempool[i].size >= (size | (size_t) 0x80000000)) {
rdobuilder 775784
            mempool[i].size &= ~ (size_t) 0x80000000;
rdobuilder 775784
            return mempool[i].pnt;
rdobuilder 775784
        }
rdobuilder 775784
    }
rdobuilder 775784
    if (mempool_idx >= sizeof mempool / sizeof mempool[0]) {
rdobuilder 775784
        return NULL;
rdobuilder 775784
    }
rdobuilder 775784
    mempool[mempool_idx].size = size;
rdobuilder 775784
    return (mempool[mempool_idx++].pnt = (void *) malloc(size));
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
static void mempool_free(void *pnt)
rdobuilder 775784
{
rdobuilder 775784
    size_t i;
rdobuilder 775784
    for (i = 0U; i < mempool_idx; i++) {
rdobuilder 775784
        if (mempool[i].pnt == pnt) {
rdobuilder 775784
            if ((mempool[i].size & (size_t) 0x80000000) != (size_t) 0x0) {
rdobuilder 775784
                break;
rdobuilder 775784
            }
rdobuilder 775784
            mempool[i].size |= (size_t) 0x80000000;
rdobuilder 775784
            return;
rdobuilder 775784
        }
rdobuilder 775784
    }
rdobuilder 775784
    abort();
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
static __attribute__((malloc)) void *mempool_allocarray(size_t count, size_t size)
rdobuilder 775784
{
rdobuilder 775784
    if (count > (size_t) 0U && size >= (size_t) SIZE_MAX / count) {
rdobuilder 775784
        return NULL;
rdobuilder 775784
    }
rdobuilder 775784
    return mempool_alloc(count * size);
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
static int mempool_free_all(void)
rdobuilder 775784
{
rdobuilder 775784
    size_t i;
rdobuilder 775784
    int    ret = 0;
rdobuilder 775784
rdobuilder 775784
    for (i = 0U; i < mempool_idx; i++) {
rdobuilder 775784
        if ((mempool[i].size & (size_t) 0x80000000) == (size_t) 0x0) {
rdobuilder 775784
            ret = -1;
rdobuilder 775784
        }
rdobuilder 775784
        free(mempool[i].pnt);
rdobuilder 775784
        mempool[i].pnt = NULL;
rdobuilder 775784
    }
rdobuilder 775784
    mempool_idx = (size_t) 0U;
rdobuilder 775784
rdobuilder 775784
    return ret;
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
#define sodium_malloc(X)        mempool_alloc(X)
rdobuilder 775784
#define sodium_free(X)          mempool_free(X)
rdobuilder 775784
#define sodium_allocarray(X, Y) mempool_allocarray((X), (Y))
rdobuilder 775784
rdobuilder 775784
static unsigned long long now(void)
rdobuilder 775784
{
rdobuilder 775784
    struct             timeval tp;
rdobuilder 775784
    unsigned long long now;
rdobuilder 775784
rdobuilder 775784
    if (gettimeofday(&tp, NULL) != 0) {
rdobuilder 775784
        abort();
rdobuilder 775784
    }
rdobuilder 775784
    now = ((unsigned long long) tp.tv_sec * 1000000ULL) +
rdobuilder 775784
        (unsigned long long) tp.tv_usec;
rdobuilder 775784
rdobuilder 775784
    return now;
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
int main(void)
rdobuilder 775784
{
rdobuilder 775784
    unsigned long long ts_start;
rdobuilder 775784
    unsigned long long ts_end;
rdobuilder 775784
    unsigned int       i;
rdobuilder 775784
rdobuilder 775784
    if (sodium_init() != 0) {
rdobuilder 775784
        return 99;
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
#ifndef __EMSCRIPTEN__
rdobuilder 775784
    randombytes_set_implementation(&randombytes_salsa20_implementation);
rdobuilder 775784
#endif
rdobuilder 775784
    ts_start = now();
rdobuilder 775784
    for (i = 0; i < ITERATIONS; i++) {
rdobuilder 775784
        if (xmain() != 0) {
rdobuilder 775784
            abort();
rdobuilder 775784
        }
rdobuilder 775784
    }
rdobuilder 775784
    ts_end = now();
rdobuilder 775784
    printf("%llu\n", 1000000ULL * (ts_end - ts_start) / ITERATIONS);
rdobuilder 775784
    if (mempool_free_all() != 0) {
rdobuilder 775784
        fprintf(stderr, "** memory leaks detected **\n");
rdobuilder 775784
        return 99;
rdobuilder 775784
    }
rdobuilder 775784
    return 0;
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
#undef  printf
rdobuilder 775784
#define printf(...) do { } while(0)
rdobuilder 775784
rdobuilder 775784
#elif !defined(BROWSER_TESTS)
rdobuilder 775784
rdobuilder 775784
static FILE *fp_res;
rdobuilder 775784
rdobuilder 775784
int main(void)
rdobuilder 775784
{
rdobuilder 775784
    FILE          *fp_out;
rdobuilder 775784
    unsigned char *_guard_page;
rdobuilder 775784
    int           c;
rdobuilder 775784
rdobuilder 775784
    if ((fp_res = fopen(TEST_NAME_RES, "w+")) == NULL) {
rdobuilder 775784
        perror("fopen(" TEST_NAME_RES ")");
rdobuilder 775784
        return 99;
rdobuilder 775784
    }
rdobuilder 775784
    if (sodium_init() != 0) {
rdobuilder 775784
        return 99;
rdobuilder 775784
    }
rdobuilder 775784
# if defined(__EMSCRIPTEN__) || defined(__SANITIZE_ADDRESS__)
rdobuilder 775784
    guard_page = _guard_page = NULL;
rdobuilder 775784
#else
rdobuilder 775784
    if ((_guard_page = (unsigned char *) sodium_malloc(0)) == NULL) {
rdobuilder 775784
        perror("sodium_malloc()");
rdobuilder 775784
        return 99;
rdobuilder 775784
    }
rdobuilder 775784
    guard_page = _guard_page + 1;
rdobuilder 775784
#endif
rdobuilder 775784
    if (xmain() != 0) {
rdobuilder 775784
        return 99;
rdobuilder 775784
    }
rdobuilder 775784
    rewind(fp_res);
rdobuilder 775784
    if ((fp_out = fopen(TEST_NAME_OUT, "r")) == NULL) {
rdobuilder 775784
        perror("fopen(" TEST_NAME_OUT ")");
rdobuilder 775784
        return 99;
rdobuilder 775784
    }
rdobuilder 775784
    do {
rdobuilder 775784
        if ((c = fgetc(fp_res)) != fgetc(fp_out)) {
rdobuilder 775784
            return 99;
rdobuilder 775784
        }
rdobuilder 775784
    } while (c != EOF);
rdobuilder 775784
    sodium_free(_guard_page);
rdobuilder 775784
rdobuilder 775784
    return 0;
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
#undef  printf
rdobuilder 775784
#define printf(...) fprintf(fp_res, __VA_ARGS__)
rdobuilder 775784
rdobuilder 775784
#else
rdobuilder 775784
rdobuilder 775784
int main(void)
rdobuilder 775784
{
rdobuilder 775784
    if (sodium_init() != 0) {
rdobuilder 775784
        return 99;
rdobuilder 775784
    }
rdobuilder 775784
    if (xmain() != 0) {
rdobuilder 775784
        return 99;
rdobuilder 775784
    }
rdobuilder 775784
    printf("--- SUCCESS ---\n");
rdobuilder 775784
rdobuilder 775784
    return 0;
rdobuilder 775784
}
rdobuilder 775784
rdobuilder 775784
#endif
rdobuilder 775784
rdobuilder 775784
#define main xmain
rdobuilder 775784
rdobuilder 775784
#endif