2013-01-20 18:25:22 -05:00
|
|
|
|
|
|
|
#ifndef __CMPTEST_H__
|
|
|
|
#define __CMPTEST_H__
|
|
|
|
|
2017-12-06 07:17:57 -05:00
|
|
|
#ifdef NDEBUG
|
|
|
|
#/**/undef/**/ NDEBUG
|
|
|
|
#endif
|
|
|
|
|
2014-09-13 17:11:12 -04:00
|
|
|
#include <assert.h>
|
2017-12-16 07:08:55 -05:00
|
|
|
#include <errno.h>
|
2017-12-16 07:08:34 -05:00
|
|
|
#include <limits.h>
|
2013-01-20 18:25:22 -05:00
|
|
|
#include <stdio.h>
|
2014-09-13 17:11:12 -04:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2013-01-20 18:25:22 -05:00
|
|
|
|
2013-04-18 08:57:41 -04:00
|
|
|
#include "sodium.h"
|
2015-01-23 04:41:28 -05:00
|
|
|
#include "quirks.h"
|
2013-04-18 08:57:41 -04:00
|
|
|
|
2014-11-22 16:46:09 -05:00
|
|
|
#ifdef __EMSCRIPTEN__
|
|
|
|
# undef TEST_SRCDIR
|
|
|
|
# define TEST_SRCDIR "/test-data"
|
|
|
|
#endif
|
2014-04-14 18:52:55 -04:00
|
|
|
#ifndef TEST_SRCDIR
|
|
|
|
# define TEST_SRCDIR "."
|
|
|
|
#endif
|
|
|
|
|
2013-01-20 18:25:22 -05:00
|
|
|
#define TEST_NAME_RES TEST_NAME ".res"
|
2013-04-27 14:43:26 -04:00
|
|
|
#define TEST_NAME_OUT TEST_SRCDIR "/" TEST_NAME ".exp"
|
2013-01-20 18:25:22 -05:00
|
|
|
|
2013-10-06 18:51:45 -04:00
|
|
|
#ifdef HAVE_ARC4RANDOM
|
|
|
|
# undef rand
|
|
|
|
# define rand(X) arc4random(X)
|
|
|
|
#endif
|
|
|
|
|
2015-12-06 19:44:33 -05:00
|
|
|
int xmain(void);
|
|
|
|
|
2019-01-03 03:49:33 -05:00
|
|
|
static unsigned char *guard_page;
|
2018-12-24 09:02:59 -05:00
|
|
|
|
2017-08-04 17:08:22 -04:00
|
|
|
#ifdef BENCHMARKS
|
|
|
|
|
|
|
|
# include <sys/time.h>
|
|
|
|
|
2017-08-04 17:16:42 -04:00
|
|
|
# ifndef ITERATIONS
|
|
|
|
# define ITERATIONS 128
|
|
|
|
# endif
|
2017-08-04 17:08:22 -04:00
|
|
|
|
2017-12-16 07:05:49 -05:00
|
|
|
struct {
|
|
|
|
void *pnt;
|
|
|
|
size_t size;
|
|
|
|
} mempool[1024];
|
|
|
|
|
|
|
|
static size_t mempool_idx;
|
|
|
|
|
|
|
|
static __attribute__((malloc)) void *mempool_alloc(size_t size)
|
|
|
|
{
|
|
|
|
size_t i;
|
|
|
|
if (size >= (size_t) 0x80000000 - (size_t) 0x00000fff) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
size = (size + (size_t) 0x00000fff) & ~ (size_t) 0x00000fff;
|
|
|
|
for (i = 0U; i < mempool_idx; i++) {
|
|
|
|
if (mempool[i].size >= (size | (size_t) 0x80000000)) {
|
|
|
|
mempool[i].size &= ~ (size_t) 0x80000000;
|
|
|
|
return mempool[i].pnt;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (mempool_idx >= sizeof mempool / sizeof mempool[0]) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
mempool[mempool_idx].size = size;
|
2017-12-16 07:12:07 -05:00
|
|
|
return (mempool[mempool_idx++].pnt = (void *) malloc(size));
|
2017-12-16 07:05:49 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void mempool_free(void *pnt)
|
|
|
|
{
|
|
|
|
size_t i;
|
|
|
|
for (i = 0U; i < mempool_idx; i++) {
|
|
|
|
if (mempool[i].pnt == pnt) {
|
|
|
|
if ((mempool[i].size & (size_t) 0x80000000) != (size_t) 0x0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
mempool[i].size |= (size_t) 0x80000000;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
|
|
|
|
static __attribute__((malloc)) void *mempool_allocarray(size_t count, size_t size)
|
|
|
|
{
|
|
|
|
if (count > (size_t) 0U && size >= (size_t) SIZE_MAX / count) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return mempool_alloc(count * size);
|
|
|
|
}
|
|
|
|
|
2017-12-16 08:51:11 -05:00
|
|
|
static int mempool_free_all(void)
|
|
|
|
{
|
|
|
|
size_t i;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
for (i = 0U; i < mempool_idx; i++) {
|
|
|
|
if ((mempool[i].size & (size_t) 0x80000000) == (size_t) 0x0) {
|
|
|
|
ret = -1;
|
|
|
|
}
|
|
|
|
free(mempool[i].pnt);
|
|
|
|
mempool[i].pnt = NULL;
|
|
|
|
}
|
|
|
|
mempool_idx = (size_t) 0U;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2017-12-16 07:05:49 -05:00
|
|
|
#define sodium_malloc(X) mempool_alloc(X)
|
|
|
|
#define sodium_free(X) mempool_free(X)
|
|
|
|
#define sodium_allocarray(X, Y) mempool_allocarray((X), (Y))
|
|
|
|
|
2017-08-04 17:08:22 -04:00
|
|
|
static unsigned long long now(void)
|
|
|
|
{
|
2023-02-15 13:42:08 -05:00
|
|
|
#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
|
|
|
|
struct timespec tp;
|
|
|
|
|
|
|
|
if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0) {
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
return (unsigned long long) tp.tv_sec * 1000000ULL +
|
|
|
|
(unsigned long long) tp.tv_nsec / 1000ULL;
|
|
|
|
#else
|
|
|
|
struct timeval tp;
|
2017-08-04 17:08:22 -04:00
|
|
|
|
|
|
|
if (gettimeofday(&tp, NULL) != 0) {
|
|
|
|
abort();
|
|
|
|
}
|
2023-02-15 13:42:08 -05:00
|
|
|
return (unsigned long long) tp.tv_sec * 1000000ULL +
|
2017-08-04 17:08:22 -04:00
|
|
|
(unsigned long long) tp.tv_usec;
|
2023-02-15 13:42:08 -05:00
|
|
|
#endif
|
2017-08-04 17:08:22 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
unsigned long long ts_start;
|
|
|
|
unsigned long long ts_end;
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
if (sodium_init() != 0) {
|
|
|
|
return 99;
|
|
|
|
}
|
2017-12-21 12:46:29 -05:00
|
|
|
|
2017-12-20 20:02:39 -05:00
|
|
|
#ifndef __EMSCRIPTEN__
|
2017-08-04 17:08:22 -04:00
|
|
|
randombytes_set_implementation(&randombytes_salsa20_implementation);
|
2017-12-20 20:02:39 -05:00
|
|
|
#endif
|
2017-08-04 17:08:22 -04:00
|
|
|
ts_start = now();
|
|
|
|
for (i = 0; i < ITERATIONS; i++) {
|
|
|
|
if (xmain() != 0) {
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ts_end = now();
|
2017-08-04 17:30:30 -04:00
|
|
|
printf("%llu\n", 1000000ULL * (ts_end - ts_start) / ITERATIONS);
|
2017-12-16 08:51:11 -05:00
|
|
|
if (mempool_free_all() != 0) {
|
|
|
|
fprintf(stderr, "** memory leaks detected **\n");
|
|
|
|
return 99;
|
|
|
|
}
|
2017-08-04 17:08:22 -04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-12-16 15:00:44 -05:00
|
|
|
#undef printf
|
2017-08-04 17:08:22 -04:00
|
|
|
#define printf(...) do { } while(0)
|
|
|
|
|
|
|
|
#elif !defined(BROWSER_TESTS)
|
2015-12-06 19:44:33 -05:00
|
|
|
|
2017-12-21 12:27:29 -05:00
|
|
|
static FILE *fp_res;
|
2013-01-20 18:25:22 -05:00
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
2019-01-03 03:49:33 -05:00
|
|
|
FILE *fp_out;
|
|
|
|
unsigned char *_guard_page;
|
|
|
|
int c;
|
2013-01-20 18:25:22 -05:00
|
|
|
|
|
|
|
if ((fp_res = fopen(TEST_NAME_RES, "w+")) == NULL) {
|
|
|
|
perror("fopen(" TEST_NAME_RES ")");
|
|
|
|
return 99;
|
|
|
|
}
|
2013-04-18 13:14:10 -04:00
|
|
|
if (sodium_init() != 0) {
|
|
|
|
return 99;
|
|
|
|
}
|
2019-02-02 16:47:31 -05:00
|
|
|
# if defined(__EMSCRIPTEN__) || defined(__SANITIZE_ADDRESS__)
|
|
|
|
guard_page = _guard_page = NULL;
|
|
|
|
#else
|
2019-01-03 03:49:33 -05:00
|
|
|
if ((_guard_page = (unsigned char *) sodium_malloc(0)) == NULL) {
|
2018-12-24 09:02:59 -05:00
|
|
|
perror("sodium_malloc()");
|
|
|
|
return 99;
|
|
|
|
}
|
2019-01-03 03:49:33 -05:00
|
|
|
guard_page = _guard_page + 1;
|
2019-02-02 16:47:31 -05:00
|
|
|
#endif
|
2013-12-31 12:37:05 -05:00
|
|
|
if (xmain() != 0) {
|
|
|
|
return 99;
|
|
|
|
}
|
2019-09-13 05:16:58 -04:00
|
|
|
fflush(fp_res);
|
2013-01-20 18:25:22 -05:00
|
|
|
rewind(fp_res);
|
|
|
|
if ((fp_out = fopen(TEST_NAME_OUT, "r")) == NULL) {
|
2013-04-21 09:15:25 -04:00
|
|
|
perror("fopen(" TEST_NAME_OUT ")");
|
2013-01-20 18:25:22 -05:00
|
|
|
return 99;
|
|
|
|
}
|
|
|
|
do {
|
|
|
|
if ((c = fgetc(fp_res)) != fgetc(fp_out)) {
|
|
|
|
return 99;
|
|
|
|
}
|
|
|
|
} while (c != EOF);
|
2018-12-24 09:02:59 -05:00
|
|
|
sodium_free(_guard_page);
|
2013-01-20 18:25:22 -05:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-04-26 02:25:39 -04:00
|
|
|
#undef printf
|
2013-01-20 18:25:22 -05:00
|
|
|
#define printf(...) fprintf(fp_res, __VA_ARGS__)
|
2015-12-06 19:44:33 -05:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
if (sodium_init() != 0) {
|
|
|
|
return 99;
|
|
|
|
}
|
|
|
|
if (xmain() != 0) {
|
|
|
|
return 99;
|
|
|
|
}
|
|
|
|
printf("--- SUCCESS ---\n");
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2013-01-20 18:25:22 -05:00
|
|
|
#define main xmain
|
|
|
|
|
|
|
|
#endif
|