xref: /freebsd/sys/contrib/libsodium/test/default/cmptest.h (revision 3611ec604864a7d4dcc9a3ea898c80eb35eef8a0)
1*0ac341f1SConrad Meyer 
2*0ac341f1SConrad Meyer #ifndef __CMPTEST_H__
3*0ac341f1SConrad Meyer #define __CMPTEST_H__
4*0ac341f1SConrad Meyer 
5*0ac341f1SConrad Meyer #ifdef NDEBUG
6*0ac341f1SConrad Meyer #/**/undef/**/ NDEBUG
7*0ac341f1SConrad Meyer #endif
8*0ac341f1SConrad Meyer 
9*0ac341f1SConrad Meyer #include <assert.h>
10*0ac341f1SConrad Meyer #include <errno.h>
11*0ac341f1SConrad Meyer #include <limits.h>
12*0ac341f1SConrad Meyer #include <stdio.h>
13*0ac341f1SConrad Meyer #include <stdint.h>
14*0ac341f1SConrad Meyer #include <stdlib.h>
15*0ac341f1SConrad Meyer #include <string.h>
16*0ac341f1SConrad Meyer 
17*0ac341f1SConrad Meyer #include "sodium.h"
18*0ac341f1SConrad Meyer #include "quirks.h"
19*0ac341f1SConrad Meyer 
20*0ac341f1SConrad Meyer #ifdef __EMSCRIPTEN__
21*0ac341f1SConrad Meyer # undef TEST_SRCDIR
22*0ac341f1SConrad Meyer # define TEST_SRCDIR "/test-data"
23*0ac341f1SConrad Meyer #endif
24*0ac341f1SConrad Meyer #ifndef TEST_SRCDIR
25*0ac341f1SConrad Meyer # define TEST_SRCDIR "."
26*0ac341f1SConrad Meyer #endif
27*0ac341f1SConrad Meyer 
28*0ac341f1SConrad Meyer #define TEST_NAME_RES TEST_NAME ".res"
29*0ac341f1SConrad Meyer #define TEST_NAME_OUT TEST_SRCDIR "/" TEST_NAME ".exp"
30*0ac341f1SConrad Meyer 
31*0ac341f1SConrad Meyer #ifdef HAVE_ARC4RANDOM
32*0ac341f1SConrad Meyer # undef rand
33*0ac341f1SConrad Meyer # define rand(X) arc4random(X)
34*0ac341f1SConrad Meyer #endif
35*0ac341f1SConrad Meyer 
36*0ac341f1SConrad Meyer int xmain(void);
37*0ac341f1SConrad Meyer 
38*0ac341f1SConrad Meyer #ifdef BENCHMARKS
39*0ac341f1SConrad Meyer 
40*0ac341f1SConrad Meyer # include <sys/time.h>
41*0ac341f1SConrad Meyer 
42*0ac341f1SConrad Meyer # ifndef ITERATIONS
43*0ac341f1SConrad Meyer #  define ITERATIONS 128
44*0ac341f1SConrad Meyer # endif
45*0ac341f1SConrad Meyer 
46*0ac341f1SConrad Meyer struct {
47*0ac341f1SConrad Meyer     void   *pnt;
48*0ac341f1SConrad Meyer     size_t  size;
49*0ac341f1SConrad Meyer } mempool[1024];
50*0ac341f1SConrad Meyer 
51*0ac341f1SConrad Meyer static size_t mempool_idx;
52*0ac341f1SConrad Meyer 
mempool_alloc(size_t size)53*0ac341f1SConrad Meyer static __attribute__((malloc)) void *mempool_alloc(size_t size)
54*0ac341f1SConrad Meyer {
55*0ac341f1SConrad Meyer     size_t i;
56*0ac341f1SConrad Meyer     if (size >= (size_t) 0x80000000 - (size_t) 0x00000fff) {
57*0ac341f1SConrad Meyer         return NULL;
58*0ac341f1SConrad Meyer     }
59*0ac341f1SConrad Meyer     size = (size + (size_t) 0x00000fff) & ~ (size_t) 0x00000fff;
60*0ac341f1SConrad Meyer     for (i = 0U; i < mempool_idx; i++) {
61*0ac341f1SConrad Meyer         if (mempool[i].size >= (size | (size_t) 0x80000000)) {
62*0ac341f1SConrad Meyer             mempool[i].size &= ~ (size_t) 0x80000000;
63*0ac341f1SConrad Meyer             return mempool[i].pnt;
64*0ac341f1SConrad Meyer         }
65*0ac341f1SConrad Meyer     }
66*0ac341f1SConrad Meyer     if (mempool_idx >= sizeof mempool / sizeof mempool[0]) {
67*0ac341f1SConrad Meyer         return NULL;
68*0ac341f1SConrad Meyer     }
69*0ac341f1SConrad Meyer     mempool[mempool_idx].size = size;
70*0ac341f1SConrad Meyer     return (mempool[mempool_idx++].pnt = (void *) malloc(size));
71*0ac341f1SConrad Meyer }
72*0ac341f1SConrad Meyer 
mempool_free(void * pnt)73*0ac341f1SConrad Meyer static void mempool_free(void *pnt)
74*0ac341f1SConrad Meyer {
75*0ac341f1SConrad Meyer     size_t i;
76*0ac341f1SConrad Meyer     for (i = 0U; i < mempool_idx; i++) {
77*0ac341f1SConrad Meyer         if (mempool[i].pnt == pnt) {
78*0ac341f1SConrad Meyer             if ((mempool[i].size & (size_t) 0x80000000) != (size_t) 0x0) {
79*0ac341f1SConrad Meyer                 break;
80*0ac341f1SConrad Meyer             }
81*0ac341f1SConrad Meyer             mempool[i].size |= (size_t) 0x80000000;
82*0ac341f1SConrad Meyer             return;
83*0ac341f1SConrad Meyer         }
84*0ac341f1SConrad Meyer     }
85*0ac341f1SConrad Meyer     abort();
86*0ac341f1SConrad Meyer }
87*0ac341f1SConrad Meyer 
mempool_allocarray(size_t count,size_t size)88*0ac341f1SConrad Meyer static __attribute__((malloc)) void *mempool_allocarray(size_t count, size_t size)
89*0ac341f1SConrad Meyer {
90*0ac341f1SConrad Meyer     if (count > (size_t) 0U && size >= (size_t) SIZE_MAX / count) {
91*0ac341f1SConrad Meyer         return NULL;
92*0ac341f1SConrad Meyer     }
93*0ac341f1SConrad Meyer     return mempool_alloc(count * size);
94*0ac341f1SConrad Meyer }
95*0ac341f1SConrad Meyer 
mempool_free_all(void)96*0ac341f1SConrad Meyer static int mempool_free_all(void)
97*0ac341f1SConrad Meyer {
98*0ac341f1SConrad Meyer     size_t i;
99*0ac341f1SConrad Meyer     int    ret = 0;
100*0ac341f1SConrad Meyer 
101*0ac341f1SConrad Meyer     for (i = 0U; i < mempool_idx; i++) {
102*0ac341f1SConrad Meyer         if ((mempool[i].size & (size_t) 0x80000000) == (size_t) 0x0) {
103*0ac341f1SConrad Meyer             ret = -1;
104*0ac341f1SConrad Meyer         }
105*0ac341f1SConrad Meyer         free(mempool[i].pnt);
106*0ac341f1SConrad Meyer         mempool[i].pnt = NULL;
107*0ac341f1SConrad Meyer     }
108*0ac341f1SConrad Meyer     mempool_idx = (size_t) 0U;
109*0ac341f1SConrad Meyer 
110*0ac341f1SConrad Meyer     return ret;
111*0ac341f1SConrad Meyer }
112*0ac341f1SConrad Meyer 
113*0ac341f1SConrad Meyer #define sodium_malloc(X)        mempool_alloc(X)
114*0ac341f1SConrad Meyer #define sodium_free(X)          mempool_free(X)
115*0ac341f1SConrad Meyer #define sodium_allocarray(X, Y) mempool_allocarray((X), (Y))
116*0ac341f1SConrad Meyer 
now(void)117*0ac341f1SConrad Meyer static unsigned long long now(void)
118*0ac341f1SConrad Meyer {
119*0ac341f1SConrad Meyer     struct             timeval tp;
120*0ac341f1SConrad Meyer     unsigned long long now;
121*0ac341f1SConrad Meyer 
122*0ac341f1SConrad Meyer     if (gettimeofday(&tp, NULL) != 0) {
123*0ac341f1SConrad Meyer         abort();
124*0ac341f1SConrad Meyer     }
125*0ac341f1SConrad Meyer     now = ((unsigned long long) tp.tv_sec * 1000000ULL) +
126*0ac341f1SConrad Meyer         (unsigned long long) tp.tv_usec;
127*0ac341f1SConrad Meyer 
128*0ac341f1SConrad Meyer     return now;
129*0ac341f1SConrad Meyer }
130*0ac341f1SConrad Meyer 
main(void)131*0ac341f1SConrad Meyer int main(void)
132*0ac341f1SConrad Meyer {
133*0ac341f1SConrad Meyer     unsigned long long ts_start;
134*0ac341f1SConrad Meyer     unsigned long long ts_end;
135*0ac341f1SConrad Meyer     unsigned int       i;
136*0ac341f1SConrad Meyer 
137*0ac341f1SConrad Meyer     if (sodium_init() != 0) {
138*0ac341f1SConrad Meyer         return 99;
139*0ac341f1SConrad Meyer     }
140*0ac341f1SConrad Meyer 
141*0ac341f1SConrad Meyer #ifndef __EMSCRIPTEN__
142*0ac341f1SConrad Meyer     randombytes_set_implementation(&randombytes_salsa20_implementation);
143*0ac341f1SConrad Meyer #endif
144*0ac341f1SConrad Meyer     ts_start = now();
145*0ac341f1SConrad Meyer     for (i = 0; i < ITERATIONS; i++) {
146*0ac341f1SConrad Meyer         if (xmain() != 0) {
147*0ac341f1SConrad Meyer             abort();
148*0ac341f1SConrad Meyer         }
149*0ac341f1SConrad Meyer     }
150*0ac341f1SConrad Meyer     ts_end = now();
151*0ac341f1SConrad Meyer     printf("%llu\n", 1000000ULL * (ts_end - ts_start) / ITERATIONS);
152*0ac341f1SConrad Meyer     if (mempool_free_all() != 0) {
153*0ac341f1SConrad Meyer         fprintf(stderr, "** memory leaks detected **\n");
154*0ac341f1SConrad Meyer         return 99;
155*0ac341f1SConrad Meyer     }
156*0ac341f1SConrad Meyer     return 0;
157*0ac341f1SConrad Meyer }
158*0ac341f1SConrad Meyer 
159*0ac341f1SConrad Meyer #undef  printf
160*0ac341f1SConrad Meyer #define printf(...) do { } while(0)
161*0ac341f1SConrad Meyer 
162*0ac341f1SConrad Meyer #elif !defined(BROWSER_TESTS)
163*0ac341f1SConrad Meyer 
164*0ac341f1SConrad Meyer static FILE *fp_res;
165*0ac341f1SConrad Meyer 
main(void)166*0ac341f1SConrad Meyer int main(void)
167*0ac341f1SConrad Meyer {
168*0ac341f1SConrad Meyer     FILE *fp_out;
169*0ac341f1SConrad Meyer     int   c;
170*0ac341f1SConrad Meyer 
171*0ac341f1SConrad Meyer     if ((fp_res = fopen(TEST_NAME_RES, "w+")) == NULL) {
172*0ac341f1SConrad Meyer         perror("fopen(" TEST_NAME_RES ")");
173*0ac341f1SConrad Meyer         return 99;
174*0ac341f1SConrad Meyer     }
175*0ac341f1SConrad Meyer     if (sodium_init() != 0) {
176*0ac341f1SConrad Meyer         return 99;
177*0ac341f1SConrad Meyer     }
178*0ac341f1SConrad Meyer     if (xmain() != 0) {
179*0ac341f1SConrad Meyer         return 99;
180*0ac341f1SConrad Meyer     }
181*0ac341f1SConrad Meyer     rewind(fp_res);
182*0ac341f1SConrad Meyer     if ((fp_out = fopen(TEST_NAME_OUT, "r")) == NULL) {
183*0ac341f1SConrad Meyer         perror("fopen(" TEST_NAME_OUT ")");
184*0ac341f1SConrad Meyer         return 99;
185*0ac341f1SConrad Meyer     }
186*0ac341f1SConrad Meyer     do {
187*0ac341f1SConrad Meyer         if ((c = fgetc(fp_res)) != fgetc(fp_out)) {
188*0ac341f1SConrad Meyer             return 99;
189*0ac341f1SConrad Meyer         }
190*0ac341f1SConrad Meyer     } while (c != EOF);
191*0ac341f1SConrad Meyer 
192*0ac341f1SConrad Meyer     return 0;
193*0ac341f1SConrad Meyer }
194*0ac341f1SConrad Meyer 
195*0ac341f1SConrad Meyer #undef  printf
196*0ac341f1SConrad Meyer #define printf(...) fprintf(fp_res, __VA_ARGS__)
197*0ac341f1SConrad Meyer 
198*0ac341f1SConrad Meyer #else
199*0ac341f1SConrad Meyer 
main(void)200*0ac341f1SConrad Meyer int main(void)
201*0ac341f1SConrad Meyer {
202*0ac341f1SConrad Meyer     if (sodium_init() != 0) {
203*0ac341f1SConrad Meyer         return 99;
204*0ac341f1SConrad Meyer     }
205*0ac341f1SConrad Meyer     if (xmain() != 0) {
206*0ac341f1SConrad Meyer         return 99;
207*0ac341f1SConrad Meyer     }
208*0ac341f1SConrad Meyer     printf("--- SUCCESS ---\n");
209*0ac341f1SConrad Meyer 
210*0ac341f1SConrad Meyer     return 0;
211*0ac341f1SConrad Meyer }
212*0ac341f1SConrad Meyer 
213*0ac341f1SConrad Meyer #endif
214*0ac341f1SConrad Meyer 
215*0ac341f1SConrad Meyer #define main xmain
216*0ac341f1SConrad Meyer 
217*0ac341f1SConrad Meyer #endif
218