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