1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi * Benchmark demonstration program
3*62c56f98SSadaf Ebrahimi *
4*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors
5*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6*62c56f98SSadaf Ebrahimi */
7*62c56f98SSadaf Ebrahimi
8*62c56f98SSadaf Ebrahimi #define MBEDTLS_ALLOW_PRIVATE_ACCESS
9*62c56f98SSadaf Ebrahimi
10*62c56f98SSadaf Ebrahimi #include "mbedtls/build_info.h"
11*62c56f98SSadaf Ebrahimi
12*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h"
13*62c56f98SSadaf Ebrahimi
14*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_HAVE_TIME)
main(void)15*62c56f98SSadaf Ebrahimi int main(void)
16*62c56f98SSadaf Ebrahimi {
17*62c56f98SSadaf Ebrahimi mbedtls_printf("MBEDTLS_HAVE_TIME not defined.\n");
18*62c56f98SSadaf Ebrahimi mbedtls_exit(0);
19*62c56f98SSadaf Ebrahimi }
20*62c56f98SSadaf Ebrahimi #else
21*62c56f98SSadaf Ebrahimi
22*62c56f98SSadaf Ebrahimi #include <string.h>
23*62c56f98SSadaf Ebrahimi #include <stdlib.h>
24*62c56f98SSadaf Ebrahimi
25*62c56f98SSadaf Ebrahimi #include "mbedtls/md5.h"
26*62c56f98SSadaf Ebrahimi #include "mbedtls/ripemd160.h"
27*62c56f98SSadaf Ebrahimi #include "mbedtls/sha1.h"
28*62c56f98SSadaf Ebrahimi #include "mbedtls/sha256.h"
29*62c56f98SSadaf Ebrahimi #include "mbedtls/sha512.h"
30*62c56f98SSadaf Ebrahimi #include "mbedtls/sha3.h"
31*62c56f98SSadaf Ebrahimi
32*62c56f98SSadaf Ebrahimi #include "mbedtls/des.h"
33*62c56f98SSadaf Ebrahimi #include "mbedtls/aes.h"
34*62c56f98SSadaf Ebrahimi #include "mbedtls/aria.h"
35*62c56f98SSadaf Ebrahimi #include "mbedtls/camellia.h"
36*62c56f98SSadaf Ebrahimi #include "mbedtls/chacha20.h"
37*62c56f98SSadaf Ebrahimi #include "mbedtls/gcm.h"
38*62c56f98SSadaf Ebrahimi #include "mbedtls/ccm.h"
39*62c56f98SSadaf Ebrahimi #include "mbedtls/chachapoly.h"
40*62c56f98SSadaf Ebrahimi #include "mbedtls/cmac.h"
41*62c56f98SSadaf Ebrahimi #include "mbedtls/poly1305.h"
42*62c56f98SSadaf Ebrahimi
43*62c56f98SSadaf Ebrahimi #include "mbedtls/ctr_drbg.h"
44*62c56f98SSadaf Ebrahimi #include "mbedtls/hmac_drbg.h"
45*62c56f98SSadaf Ebrahimi
46*62c56f98SSadaf Ebrahimi #include "mbedtls/rsa.h"
47*62c56f98SSadaf Ebrahimi #include "mbedtls/dhm.h"
48*62c56f98SSadaf Ebrahimi #include "mbedtls/ecdsa.h"
49*62c56f98SSadaf Ebrahimi #include "mbedtls/ecdh.h"
50*62c56f98SSadaf Ebrahimi
51*62c56f98SSadaf Ebrahimi #include "mbedtls/error.h"
52*62c56f98SSadaf Ebrahimi
53*62c56f98SSadaf Ebrahimi /* *INDENT-OFF* */
54*62c56f98SSadaf Ebrahimi #ifndef asm
55*62c56f98SSadaf Ebrahimi #define asm __asm
56*62c56f98SSadaf Ebrahimi #endif
57*62c56f98SSadaf Ebrahimi /* *INDENT-ON* */
58*62c56f98SSadaf Ebrahimi
59*62c56f98SSadaf Ebrahimi #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
60*62c56f98SSadaf Ebrahimi
61*62c56f98SSadaf Ebrahimi #include <windows.h>
62*62c56f98SSadaf Ebrahimi #include <process.h>
63*62c56f98SSadaf Ebrahimi
64*62c56f98SSadaf Ebrahimi struct _hr_time {
65*62c56f98SSadaf Ebrahimi LARGE_INTEGER start;
66*62c56f98SSadaf Ebrahimi };
67*62c56f98SSadaf Ebrahimi
68*62c56f98SSadaf Ebrahimi #else
69*62c56f98SSadaf Ebrahimi
70*62c56f98SSadaf Ebrahimi #include <unistd.h>
71*62c56f98SSadaf Ebrahimi #include <sys/types.h>
72*62c56f98SSadaf Ebrahimi #include <sys/time.h>
73*62c56f98SSadaf Ebrahimi #include <signal.h>
74*62c56f98SSadaf Ebrahimi #include <time.h>
75*62c56f98SSadaf Ebrahimi
76*62c56f98SSadaf Ebrahimi struct _hr_time {
77*62c56f98SSadaf Ebrahimi struct timeval start;
78*62c56f98SSadaf Ebrahimi };
79*62c56f98SSadaf Ebrahimi
80*62c56f98SSadaf Ebrahimi #endif /* _WIN32 && !EFIX64 && !EFI32 */
81*62c56f98SSadaf Ebrahimi
82*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
83*62c56f98SSadaf Ebrahimi #include "mbedtls/memory_buffer_alloc.h"
84*62c56f98SSadaf Ebrahimi #endif
85*62c56f98SSadaf Ebrahimi
86*62c56f98SSadaf Ebrahimi static void mbedtls_set_alarm(int seconds);
87*62c56f98SSadaf Ebrahimi
88*62c56f98SSadaf Ebrahimi /*
89*62c56f98SSadaf Ebrahimi * For heap usage estimates, we need an estimate of the overhead per allocated
90*62c56f98SSadaf Ebrahimi * block. ptmalloc2/3 (used in gnu libc for instance) uses 2 size_t per block,
91*62c56f98SSadaf Ebrahimi * so use that as our baseline.
92*62c56f98SSadaf Ebrahimi */
93*62c56f98SSadaf Ebrahimi #define MEM_BLOCK_OVERHEAD (2 * sizeof(size_t))
94*62c56f98SSadaf Ebrahimi
95*62c56f98SSadaf Ebrahimi /*
96*62c56f98SSadaf Ebrahimi * Size to use for the alloc buffer if MEMORY_BUFFER_ALLOC_C is defined.
97*62c56f98SSadaf Ebrahimi */
98*62c56f98SSadaf Ebrahimi #define HEAP_SIZE (1u << 16) /* 64k */
99*62c56f98SSadaf Ebrahimi
100*62c56f98SSadaf Ebrahimi #define BUFSIZE 1024
101*62c56f98SSadaf Ebrahimi #define HEADER_FORMAT " %-24s : "
102*62c56f98SSadaf Ebrahimi #define TITLE_LEN 25
103*62c56f98SSadaf Ebrahimi
104*62c56f98SSadaf Ebrahimi #define OPTIONS \
105*62c56f98SSadaf Ebrahimi "md5, ripemd160, sha1, sha256, sha512,\n" \
106*62c56f98SSadaf Ebrahimi "sha3_224, sha3_256, sha3_384, sha3_512,\n" \
107*62c56f98SSadaf Ebrahimi "des3, des, camellia, chacha20,\n" \
108*62c56f98SSadaf Ebrahimi "aes_cbc, aes_gcm, aes_ccm, aes_xts, chachapoly,\n" \
109*62c56f98SSadaf Ebrahimi "aes_cmac, des3_cmac, poly1305\n" \
110*62c56f98SSadaf Ebrahimi "ctr_drbg, hmac_drbg\n" \
111*62c56f98SSadaf Ebrahimi "rsa, dhm, ecdsa, ecdh.\n"
112*62c56f98SSadaf Ebrahimi
113*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ERROR_C)
114*62c56f98SSadaf Ebrahimi #define PRINT_ERROR \
115*62c56f98SSadaf Ebrahimi mbedtls_strerror(ret, (char *) tmp, sizeof(tmp)); \
116*62c56f98SSadaf Ebrahimi mbedtls_printf("FAILED: %s\n", tmp);
117*62c56f98SSadaf Ebrahimi #else
118*62c56f98SSadaf Ebrahimi #define PRINT_ERROR \
119*62c56f98SSadaf Ebrahimi mbedtls_printf("FAILED: -0x%04x\n", (unsigned int) -ret);
120*62c56f98SSadaf Ebrahimi #endif
121*62c56f98SSadaf Ebrahimi
122*62c56f98SSadaf Ebrahimi #define TIME_AND_TSC(TITLE, CODE) \
123*62c56f98SSadaf Ebrahimi do { \
124*62c56f98SSadaf Ebrahimi unsigned long ii, jj, tsc; \
125*62c56f98SSadaf Ebrahimi int ret = 0; \
126*62c56f98SSadaf Ebrahimi \
127*62c56f98SSadaf Ebrahimi mbedtls_printf(HEADER_FORMAT, TITLE); \
128*62c56f98SSadaf Ebrahimi fflush(stdout); \
129*62c56f98SSadaf Ebrahimi \
130*62c56f98SSadaf Ebrahimi mbedtls_set_alarm(1); \
131*62c56f98SSadaf Ebrahimi for (ii = 1; ret == 0 && !mbedtls_timing_alarmed; ii++) \
132*62c56f98SSadaf Ebrahimi { \
133*62c56f98SSadaf Ebrahimi ret = CODE; \
134*62c56f98SSadaf Ebrahimi } \
135*62c56f98SSadaf Ebrahimi \
136*62c56f98SSadaf Ebrahimi tsc = mbedtls_timing_hardclock(); \
137*62c56f98SSadaf Ebrahimi for (jj = 0; ret == 0 && jj < 1024; jj++) \
138*62c56f98SSadaf Ebrahimi { \
139*62c56f98SSadaf Ebrahimi ret = CODE; \
140*62c56f98SSadaf Ebrahimi } \
141*62c56f98SSadaf Ebrahimi \
142*62c56f98SSadaf Ebrahimi if (ret != 0) \
143*62c56f98SSadaf Ebrahimi { \
144*62c56f98SSadaf Ebrahimi PRINT_ERROR; \
145*62c56f98SSadaf Ebrahimi } \
146*62c56f98SSadaf Ebrahimi else \
147*62c56f98SSadaf Ebrahimi { \
148*62c56f98SSadaf Ebrahimi mbedtls_printf("%9lu KiB/s, %9lu cycles/byte\n", \
149*62c56f98SSadaf Ebrahimi ii * BUFSIZE / 1024, \
150*62c56f98SSadaf Ebrahimi (mbedtls_timing_hardclock() - tsc) \
151*62c56f98SSadaf Ebrahimi / (jj * BUFSIZE)); \
152*62c56f98SSadaf Ebrahimi } \
153*62c56f98SSadaf Ebrahimi } while (0)
154*62c56f98SSadaf Ebrahimi
155*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_MEMORY_DEBUG)
156*62c56f98SSadaf Ebrahimi
157*62c56f98SSadaf Ebrahimi /* How much space to reserve for the title when printing heap usage results.
158*62c56f98SSadaf Ebrahimi * Updated manually as the output of the following command:
159*62c56f98SSadaf Ebrahimi *
160*62c56f98SSadaf Ebrahimi * sed -n 's/.*[T]IME_PUBLIC.*"\(.*\)",/\1/p' programs/test/benchmark.c |
161*62c56f98SSadaf Ebrahimi * awk '{print length+3}' | sort -rn | head -n1
162*62c56f98SSadaf Ebrahimi *
163*62c56f98SSadaf Ebrahimi * This computes the maximum length of a title +3, because we appends "/s" and
164*62c56f98SSadaf Ebrahimi * want at least one space. (If the value is too small, the only consequence
165*62c56f98SSadaf Ebrahimi * is poor alignment.) */
166*62c56f98SSadaf Ebrahimi #define TITLE_SPACE 17
167*62c56f98SSadaf Ebrahimi
168*62c56f98SSadaf Ebrahimi #define MEMORY_MEASURE_INIT \
169*62c56f98SSadaf Ebrahimi size_t max_used, max_blocks, max_bytes; \
170*62c56f98SSadaf Ebrahimi size_t prv_used, prv_blocks; \
171*62c56f98SSadaf Ebrahimi size_t alloc_cnt, free_cnt, prv_alloc, prv_free; \
172*62c56f98SSadaf Ebrahimi mbedtls_memory_buffer_alloc_cur_get(&prv_used, &prv_blocks); \
173*62c56f98SSadaf Ebrahimi mbedtls_memory_buffer_alloc_max_reset();
174*62c56f98SSadaf Ebrahimi
175*62c56f98SSadaf Ebrahimi #define MEMORY_MEASURE_RESET \
176*62c56f98SSadaf Ebrahimi mbedtls_memory_buffer_alloc_count_get(&prv_alloc, &prv_free);
177*62c56f98SSadaf Ebrahimi
178*62c56f98SSadaf Ebrahimi #define MEMORY_MEASURE_PRINT(title_len) \
179*62c56f98SSadaf Ebrahimi mbedtls_memory_buffer_alloc_max_get(&max_used, &max_blocks); \
180*62c56f98SSadaf Ebrahimi mbedtls_memory_buffer_alloc_count_get(&alloc_cnt, &free_cnt); \
181*62c56f98SSadaf Ebrahimi ii = TITLE_SPACE > (title_len) ? TITLE_SPACE - (title_len) : 1; \
182*62c56f98SSadaf Ebrahimi while (ii--) mbedtls_printf(" "); \
183*62c56f98SSadaf Ebrahimi max_used -= prv_used; \
184*62c56f98SSadaf Ebrahimi max_blocks -= prv_blocks; \
185*62c56f98SSadaf Ebrahimi max_bytes = max_used + MEM_BLOCK_OVERHEAD * max_blocks; \
186*62c56f98SSadaf Ebrahimi mbedtls_printf("%6u heap bytes, %6u allocs", \
187*62c56f98SSadaf Ebrahimi (unsigned) max_bytes, \
188*62c56f98SSadaf Ebrahimi (unsigned) (alloc_cnt - prv_alloc));
189*62c56f98SSadaf Ebrahimi
190*62c56f98SSadaf Ebrahimi #else
191*62c56f98SSadaf Ebrahimi #define MEMORY_MEASURE_INIT
192*62c56f98SSadaf Ebrahimi #define MEMORY_MEASURE_RESET
193*62c56f98SSadaf Ebrahimi #define MEMORY_MEASURE_PRINT(title_len)
194*62c56f98SSadaf Ebrahimi #endif
195*62c56f98SSadaf Ebrahimi
196*62c56f98SSadaf Ebrahimi #define TIME_PUBLIC(TITLE, TYPE, CODE) \
197*62c56f98SSadaf Ebrahimi do { \
198*62c56f98SSadaf Ebrahimi unsigned long ii; \
199*62c56f98SSadaf Ebrahimi int ret; \
200*62c56f98SSadaf Ebrahimi MEMORY_MEASURE_INIT; \
201*62c56f98SSadaf Ebrahimi \
202*62c56f98SSadaf Ebrahimi mbedtls_printf(HEADER_FORMAT, TITLE); \
203*62c56f98SSadaf Ebrahimi fflush(stdout); \
204*62c56f98SSadaf Ebrahimi mbedtls_set_alarm(3); \
205*62c56f98SSadaf Ebrahimi \
206*62c56f98SSadaf Ebrahimi ret = 0; \
207*62c56f98SSadaf Ebrahimi for (ii = 1; !mbedtls_timing_alarmed && !ret; ii++) \
208*62c56f98SSadaf Ebrahimi { \
209*62c56f98SSadaf Ebrahimi MEMORY_MEASURE_RESET; \
210*62c56f98SSadaf Ebrahimi CODE; \
211*62c56f98SSadaf Ebrahimi } \
212*62c56f98SSadaf Ebrahimi \
213*62c56f98SSadaf Ebrahimi if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED) \
214*62c56f98SSadaf Ebrahimi { \
215*62c56f98SSadaf Ebrahimi mbedtls_printf("Feature Not Supported. Skipping.\n"); \
216*62c56f98SSadaf Ebrahimi ret = 0; \
217*62c56f98SSadaf Ebrahimi } \
218*62c56f98SSadaf Ebrahimi else if (ret != 0) \
219*62c56f98SSadaf Ebrahimi { \
220*62c56f98SSadaf Ebrahimi PRINT_ERROR; \
221*62c56f98SSadaf Ebrahimi } \
222*62c56f98SSadaf Ebrahimi else \
223*62c56f98SSadaf Ebrahimi { \
224*62c56f98SSadaf Ebrahimi mbedtls_printf("%6lu " TYPE "/s", ii / 3); \
225*62c56f98SSadaf Ebrahimi MEMORY_MEASURE_PRINT(sizeof(TYPE) + 1); \
226*62c56f98SSadaf Ebrahimi mbedtls_printf("\n"); \
227*62c56f98SSadaf Ebrahimi } \
228*62c56f98SSadaf Ebrahimi } while (0)
229*62c56f98SSadaf Ebrahimi
230*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
231*62c56f98SSadaf Ebrahimi (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
232*62c56f98SSadaf Ebrahimi
233*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
234*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)235*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
236*62c56f98SSadaf Ebrahimi {
237*62c56f98SSadaf Ebrahimi unsigned long tsc;
238*62c56f98SSadaf Ebrahimi __asm rdtsc
239*62c56f98SSadaf Ebrahimi __asm mov[tsc], eax
240*62c56f98SSadaf Ebrahimi return tsc;
241*62c56f98SSadaf Ebrahimi }
242*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
243*62c56f98SSadaf Ebrahimi ( _MSC_VER && _M_IX86 ) || __WATCOMC__ */
244*62c56f98SSadaf Ebrahimi
245*62c56f98SSadaf Ebrahimi /* some versions of mingw-64 have 32-bit longs even on x84_64 */
246*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
247*62c56f98SSadaf Ebrahimi defined(__GNUC__) && (defined(__i386__) || ( \
248*62c56f98SSadaf Ebrahimi (defined(__amd64__) || defined(__x86_64__)) && __SIZEOF_LONG__ == 4))
249*62c56f98SSadaf Ebrahimi
250*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
251*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)252*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
253*62c56f98SSadaf Ebrahimi {
254*62c56f98SSadaf Ebrahimi unsigned long lo, hi;
255*62c56f98SSadaf Ebrahimi asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));
256*62c56f98SSadaf Ebrahimi return lo;
257*62c56f98SSadaf Ebrahimi }
258*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
259*62c56f98SSadaf Ebrahimi __GNUC__ && __i386__ */
260*62c56f98SSadaf Ebrahimi
261*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
262*62c56f98SSadaf Ebrahimi defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__))
263*62c56f98SSadaf Ebrahimi
264*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
265*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)266*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
267*62c56f98SSadaf Ebrahimi {
268*62c56f98SSadaf Ebrahimi unsigned long lo, hi;
269*62c56f98SSadaf Ebrahimi asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));
270*62c56f98SSadaf Ebrahimi return lo | (hi << 32);
271*62c56f98SSadaf Ebrahimi }
272*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
273*62c56f98SSadaf Ebrahimi __GNUC__ && ( __amd64__ || __x86_64__ ) */
274*62c56f98SSadaf Ebrahimi
275*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
276*62c56f98SSadaf Ebrahimi defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
277*62c56f98SSadaf Ebrahimi
278*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
279*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)280*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
281*62c56f98SSadaf Ebrahimi {
282*62c56f98SSadaf Ebrahimi unsigned long tbl, tbu0, tbu1;
283*62c56f98SSadaf Ebrahimi
284*62c56f98SSadaf Ebrahimi do {
285*62c56f98SSadaf Ebrahimi asm volatile ("mftbu %0" : "=r" (tbu0));
286*62c56f98SSadaf Ebrahimi asm volatile ("mftb %0" : "=r" (tbl));
287*62c56f98SSadaf Ebrahimi asm volatile ("mftbu %0" : "=r" (tbu1));
288*62c56f98SSadaf Ebrahimi } while (tbu0 != tbu1);
289*62c56f98SSadaf Ebrahimi
290*62c56f98SSadaf Ebrahimi return tbl;
291*62c56f98SSadaf Ebrahimi }
292*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
293*62c56f98SSadaf Ebrahimi __GNUC__ && ( __powerpc__ || __ppc__ ) */
294*62c56f98SSadaf Ebrahimi
295*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
296*62c56f98SSadaf Ebrahimi defined(__GNUC__) && defined(__sparc64__)
297*62c56f98SSadaf Ebrahimi
298*62c56f98SSadaf Ebrahimi #if defined(__OpenBSD__)
299*62c56f98SSadaf Ebrahimi #warning OpenBSD does not allow access to tick register using software version instead
300*62c56f98SSadaf Ebrahimi #else
301*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
302*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)303*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
304*62c56f98SSadaf Ebrahimi {
305*62c56f98SSadaf Ebrahimi unsigned long tick;
306*62c56f98SSadaf Ebrahimi asm volatile ("rdpr %%tick, %0;" : "=&r" (tick));
307*62c56f98SSadaf Ebrahimi return tick;
308*62c56f98SSadaf Ebrahimi }
309*62c56f98SSadaf Ebrahimi #endif /* __OpenBSD__ */
310*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
311*62c56f98SSadaf Ebrahimi __GNUC__ && __sparc64__ */
312*62c56f98SSadaf Ebrahimi
313*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
314*62c56f98SSadaf Ebrahimi defined(__GNUC__) && defined(__sparc__) && !defined(__sparc64__)
315*62c56f98SSadaf Ebrahimi
316*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
317*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)318*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
319*62c56f98SSadaf Ebrahimi {
320*62c56f98SSadaf Ebrahimi unsigned long tick;
321*62c56f98SSadaf Ebrahimi asm volatile (".byte 0x83, 0x41, 0x00, 0x00");
322*62c56f98SSadaf Ebrahimi asm volatile ("mov %%g1, %0" : "=r" (tick));
323*62c56f98SSadaf Ebrahimi return tick;
324*62c56f98SSadaf Ebrahimi }
325*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
326*62c56f98SSadaf Ebrahimi __GNUC__ && __sparc__ && !__sparc64__ */
327*62c56f98SSadaf Ebrahimi
328*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
329*62c56f98SSadaf Ebrahimi defined(__GNUC__) && defined(__alpha__)
330*62c56f98SSadaf Ebrahimi
331*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
332*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)333*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
334*62c56f98SSadaf Ebrahimi {
335*62c56f98SSadaf Ebrahimi unsigned long cc;
336*62c56f98SSadaf Ebrahimi asm volatile ("rpcc %0" : "=r" (cc));
337*62c56f98SSadaf Ebrahimi return cc & 0xFFFFFFFF;
338*62c56f98SSadaf Ebrahimi }
339*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
340*62c56f98SSadaf Ebrahimi __GNUC__ && __alpha__ */
341*62c56f98SSadaf Ebrahimi
342*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
343*62c56f98SSadaf Ebrahimi defined(__GNUC__) && defined(__ia64__)
344*62c56f98SSadaf Ebrahimi
345*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
346*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)347*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
348*62c56f98SSadaf Ebrahimi {
349*62c56f98SSadaf Ebrahimi unsigned long itc;
350*62c56f98SSadaf Ebrahimi asm volatile ("mov %0 = ar.itc" : "=r" (itc));
351*62c56f98SSadaf Ebrahimi return itc;
352*62c56f98SSadaf Ebrahimi }
353*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
354*62c56f98SSadaf Ebrahimi __GNUC__ && __ia64__ */
355*62c56f98SSadaf Ebrahimi
356*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK) && defined(_WIN32) && \
357*62c56f98SSadaf Ebrahimi !defined(EFIX64) && !defined(EFI32)
358*62c56f98SSadaf Ebrahimi
359*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
360*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)361*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
362*62c56f98SSadaf Ebrahimi {
363*62c56f98SSadaf Ebrahimi LARGE_INTEGER offset;
364*62c56f98SSadaf Ebrahimi
365*62c56f98SSadaf Ebrahimi QueryPerformanceCounter(&offset);
366*62c56f98SSadaf Ebrahimi
367*62c56f98SSadaf Ebrahimi return (unsigned long) (offset.QuadPart);
368*62c56f98SSadaf Ebrahimi }
369*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK && _WIN32 && !EFIX64 && !EFI32 */
370*62c56f98SSadaf Ebrahimi
371*62c56f98SSadaf Ebrahimi #if !defined(HAVE_HARDCLOCK)
372*62c56f98SSadaf Ebrahimi
373*62c56f98SSadaf Ebrahimi #define HAVE_HARDCLOCK
374*62c56f98SSadaf Ebrahimi
375*62c56f98SSadaf Ebrahimi static int hardclock_init = 0;
376*62c56f98SSadaf Ebrahimi static struct timeval tv_init;
377*62c56f98SSadaf Ebrahimi
mbedtls_timing_hardclock(void)378*62c56f98SSadaf Ebrahimi static unsigned long mbedtls_timing_hardclock(void)
379*62c56f98SSadaf Ebrahimi {
380*62c56f98SSadaf Ebrahimi struct timeval tv_cur;
381*62c56f98SSadaf Ebrahimi
382*62c56f98SSadaf Ebrahimi if (hardclock_init == 0) {
383*62c56f98SSadaf Ebrahimi gettimeofday(&tv_init, NULL);
384*62c56f98SSadaf Ebrahimi hardclock_init = 1;
385*62c56f98SSadaf Ebrahimi }
386*62c56f98SSadaf Ebrahimi
387*62c56f98SSadaf Ebrahimi gettimeofday(&tv_cur, NULL);
388*62c56f98SSadaf Ebrahimi return (tv_cur.tv_sec - tv_init.tv_sec) * 1000000U
389*62c56f98SSadaf Ebrahimi + (tv_cur.tv_usec - tv_init.tv_usec);
390*62c56f98SSadaf Ebrahimi }
391*62c56f98SSadaf Ebrahimi #endif /* !HAVE_HARDCLOCK */
392*62c56f98SSadaf Ebrahimi
393*62c56f98SSadaf Ebrahimi volatile int mbedtls_timing_alarmed = 0;
394*62c56f98SSadaf Ebrahimi
395*62c56f98SSadaf Ebrahimi #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
396*62c56f98SSadaf Ebrahimi
397*62c56f98SSadaf Ebrahimi /* It's OK to use a global because alarm() is supposed to be global anyway */
398*62c56f98SSadaf Ebrahimi static DWORD alarmMs;
399*62c56f98SSadaf Ebrahimi
TimerProc(void * TimerContext)400*62c56f98SSadaf Ebrahimi static void TimerProc(void *TimerContext)
401*62c56f98SSadaf Ebrahimi {
402*62c56f98SSadaf Ebrahimi (void) TimerContext;
403*62c56f98SSadaf Ebrahimi Sleep(alarmMs);
404*62c56f98SSadaf Ebrahimi mbedtls_timing_alarmed = 1;
405*62c56f98SSadaf Ebrahimi /* _endthread will be called implicitly on return
406*62c56f98SSadaf Ebrahimi * That ensures execution of thread function's epilogue */
407*62c56f98SSadaf Ebrahimi }
408*62c56f98SSadaf Ebrahimi
mbedtls_set_alarm(int seconds)409*62c56f98SSadaf Ebrahimi static void mbedtls_set_alarm(int seconds)
410*62c56f98SSadaf Ebrahimi {
411*62c56f98SSadaf Ebrahimi if (seconds == 0) {
412*62c56f98SSadaf Ebrahimi /* No need to create a thread for this simple case.
413*62c56f98SSadaf Ebrahimi * Also, this shorcut is more reliable at least on MinGW32 */
414*62c56f98SSadaf Ebrahimi mbedtls_timing_alarmed = 1;
415*62c56f98SSadaf Ebrahimi return;
416*62c56f98SSadaf Ebrahimi }
417*62c56f98SSadaf Ebrahimi
418*62c56f98SSadaf Ebrahimi mbedtls_timing_alarmed = 0;
419*62c56f98SSadaf Ebrahimi alarmMs = seconds * 1000;
420*62c56f98SSadaf Ebrahimi (void) _beginthread(TimerProc, 0, NULL);
421*62c56f98SSadaf Ebrahimi }
422*62c56f98SSadaf Ebrahimi
423*62c56f98SSadaf Ebrahimi #else /* _WIN32 && !EFIX64 && !EFI32 */
424*62c56f98SSadaf Ebrahimi
sighandler(int signum)425*62c56f98SSadaf Ebrahimi static void sighandler(int signum)
426*62c56f98SSadaf Ebrahimi {
427*62c56f98SSadaf Ebrahimi mbedtls_timing_alarmed = 1;
428*62c56f98SSadaf Ebrahimi signal(signum, sighandler);
429*62c56f98SSadaf Ebrahimi }
430*62c56f98SSadaf Ebrahimi
mbedtls_set_alarm(int seconds)431*62c56f98SSadaf Ebrahimi static void mbedtls_set_alarm(int seconds)
432*62c56f98SSadaf Ebrahimi {
433*62c56f98SSadaf Ebrahimi mbedtls_timing_alarmed = 0;
434*62c56f98SSadaf Ebrahimi signal(SIGALRM, sighandler);
435*62c56f98SSadaf Ebrahimi alarm(seconds);
436*62c56f98SSadaf Ebrahimi if (seconds == 0) {
437*62c56f98SSadaf Ebrahimi /* alarm(0) cancelled any previous pending alarm, but the
438*62c56f98SSadaf Ebrahimi handler won't fire, so raise the flag straight away. */
439*62c56f98SSadaf Ebrahimi mbedtls_timing_alarmed = 1;
440*62c56f98SSadaf Ebrahimi }
441*62c56f98SSadaf Ebrahimi }
442*62c56f98SSadaf Ebrahimi
443*62c56f98SSadaf Ebrahimi #endif /* _WIN32 && !EFIX64 && !EFI32 */
444*62c56f98SSadaf Ebrahimi
myrand(void * rng_state,unsigned char * output,size_t len)445*62c56f98SSadaf Ebrahimi static int myrand(void *rng_state, unsigned char *output, size_t len)
446*62c56f98SSadaf Ebrahimi {
447*62c56f98SSadaf Ebrahimi size_t use_len;
448*62c56f98SSadaf Ebrahimi int rnd;
449*62c56f98SSadaf Ebrahimi
450*62c56f98SSadaf Ebrahimi if (rng_state != NULL) {
451*62c56f98SSadaf Ebrahimi rng_state = NULL;
452*62c56f98SSadaf Ebrahimi }
453*62c56f98SSadaf Ebrahimi
454*62c56f98SSadaf Ebrahimi while (len > 0) {
455*62c56f98SSadaf Ebrahimi use_len = len;
456*62c56f98SSadaf Ebrahimi if (use_len > sizeof(int)) {
457*62c56f98SSadaf Ebrahimi use_len = sizeof(int);
458*62c56f98SSadaf Ebrahimi }
459*62c56f98SSadaf Ebrahimi
460*62c56f98SSadaf Ebrahimi rnd = rand();
461*62c56f98SSadaf Ebrahimi memcpy(output, &rnd, use_len);
462*62c56f98SSadaf Ebrahimi output += use_len;
463*62c56f98SSadaf Ebrahimi len -= use_len;
464*62c56f98SSadaf Ebrahimi }
465*62c56f98SSadaf Ebrahimi
466*62c56f98SSadaf Ebrahimi return 0;
467*62c56f98SSadaf Ebrahimi }
468*62c56f98SSadaf Ebrahimi
469*62c56f98SSadaf Ebrahimi #define CHECK_AND_CONTINUE(R) \
470*62c56f98SSadaf Ebrahimi { \
471*62c56f98SSadaf Ebrahimi int CHECK_AND_CONTINUE_ret = (R); \
472*62c56f98SSadaf Ebrahimi if (CHECK_AND_CONTINUE_ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED) { \
473*62c56f98SSadaf Ebrahimi mbedtls_printf("Feature not supported. Skipping.\n"); \
474*62c56f98SSadaf Ebrahimi continue; \
475*62c56f98SSadaf Ebrahimi } \
476*62c56f98SSadaf Ebrahimi else if (CHECK_AND_CONTINUE_ret != 0) { \
477*62c56f98SSadaf Ebrahimi mbedtls_exit(1); \
478*62c56f98SSadaf Ebrahimi } \
479*62c56f98SSadaf Ebrahimi }
480*62c56f98SSadaf Ebrahimi
481*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_C)
set_ecp_curve(const char * string,mbedtls_ecp_curve_info * curve)482*62c56f98SSadaf Ebrahimi static int set_ecp_curve(const char *string, mbedtls_ecp_curve_info *curve)
483*62c56f98SSadaf Ebrahimi {
484*62c56f98SSadaf Ebrahimi const mbedtls_ecp_curve_info *found =
485*62c56f98SSadaf Ebrahimi mbedtls_ecp_curve_info_from_name(string);
486*62c56f98SSadaf Ebrahimi if (found != NULL) {
487*62c56f98SSadaf Ebrahimi *curve = *found;
488*62c56f98SSadaf Ebrahimi return 1;
489*62c56f98SSadaf Ebrahimi } else {
490*62c56f98SSadaf Ebrahimi return 0;
491*62c56f98SSadaf Ebrahimi }
492*62c56f98SSadaf Ebrahimi }
493*62c56f98SSadaf Ebrahimi #endif
494*62c56f98SSadaf Ebrahimi
495*62c56f98SSadaf Ebrahimi unsigned char buf[BUFSIZE];
496*62c56f98SSadaf Ebrahimi
497*62c56f98SSadaf Ebrahimi typedef struct {
498*62c56f98SSadaf Ebrahimi char md5, ripemd160, sha1, sha256, sha512,
499*62c56f98SSadaf Ebrahimi sha3_224, sha3_256, sha3_384, sha3_512,
500*62c56f98SSadaf Ebrahimi des3, des,
501*62c56f98SSadaf Ebrahimi aes_cbc, aes_gcm, aes_ccm, aes_xts, chachapoly,
502*62c56f98SSadaf Ebrahimi aes_cmac, des3_cmac,
503*62c56f98SSadaf Ebrahimi aria, camellia, chacha20,
504*62c56f98SSadaf Ebrahimi poly1305,
505*62c56f98SSadaf Ebrahimi ctr_drbg, hmac_drbg,
506*62c56f98SSadaf Ebrahimi rsa, dhm, ecdsa, ecdh;
507*62c56f98SSadaf Ebrahimi } todo_list;
508*62c56f98SSadaf Ebrahimi
509*62c56f98SSadaf Ebrahimi
main(int argc,char * argv[])510*62c56f98SSadaf Ebrahimi int main(int argc, char *argv[])
511*62c56f98SSadaf Ebrahimi {
512*62c56f98SSadaf Ebrahimi int i;
513*62c56f98SSadaf Ebrahimi unsigned char tmp[200];
514*62c56f98SSadaf Ebrahimi char title[TITLE_LEN];
515*62c56f98SSadaf Ebrahimi todo_list todo;
516*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
517*62c56f98SSadaf Ebrahimi unsigned char alloc_buf[HEAP_SIZE] = { 0 };
518*62c56f98SSadaf Ebrahimi #endif
519*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_C)
520*62c56f98SSadaf Ebrahimi mbedtls_ecp_curve_info single_curve[2] = {
521*62c56f98SSadaf Ebrahimi { MBEDTLS_ECP_DP_NONE, 0, 0, NULL },
522*62c56f98SSadaf Ebrahimi { MBEDTLS_ECP_DP_NONE, 0, 0, NULL },
523*62c56f98SSadaf Ebrahimi };
524*62c56f98SSadaf Ebrahimi const mbedtls_ecp_curve_info *curve_list = mbedtls_ecp_curve_list();
525*62c56f98SSadaf Ebrahimi #endif
526*62c56f98SSadaf Ebrahimi
527*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_C)
528*62c56f98SSadaf Ebrahimi (void) curve_list; /* Unused in some configurations where no benchmark uses ECC */
529*62c56f98SSadaf Ebrahimi #endif
530*62c56f98SSadaf Ebrahimi
531*62c56f98SSadaf Ebrahimi if (argc <= 1) {
532*62c56f98SSadaf Ebrahimi memset(&todo, 1, sizeof(todo));
533*62c56f98SSadaf Ebrahimi } else {
534*62c56f98SSadaf Ebrahimi memset(&todo, 0, sizeof(todo));
535*62c56f98SSadaf Ebrahimi
536*62c56f98SSadaf Ebrahimi for (i = 1; i < argc; i++) {
537*62c56f98SSadaf Ebrahimi if (strcmp(argv[i], "md5") == 0) {
538*62c56f98SSadaf Ebrahimi todo.md5 = 1;
539*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "ripemd160") == 0) {
540*62c56f98SSadaf Ebrahimi todo.ripemd160 = 1;
541*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "sha1") == 0) {
542*62c56f98SSadaf Ebrahimi todo.sha1 = 1;
543*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "sha256") == 0) {
544*62c56f98SSadaf Ebrahimi todo.sha256 = 1;
545*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "sha512") == 0) {
546*62c56f98SSadaf Ebrahimi todo.sha512 = 1;
547*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "sha3_224") == 0) {
548*62c56f98SSadaf Ebrahimi todo.sha3_224 = 1;
549*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "sha3_256") == 0) {
550*62c56f98SSadaf Ebrahimi todo.sha3_256 = 1;
551*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "sha3_384") == 0) {
552*62c56f98SSadaf Ebrahimi todo.sha3_384 = 1;
553*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "sha3_512") == 0) {
554*62c56f98SSadaf Ebrahimi todo.sha3_512 = 1;
555*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "des3") == 0) {
556*62c56f98SSadaf Ebrahimi todo.des3 = 1;
557*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "des") == 0) {
558*62c56f98SSadaf Ebrahimi todo.des = 1;
559*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "aes_cbc") == 0) {
560*62c56f98SSadaf Ebrahimi todo.aes_cbc = 1;
561*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "aes_xts") == 0) {
562*62c56f98SSadaf Ebrahimi todo.aes_xts = 1;
563*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "aes_gcm") == 0) {
564*62c56f98SSadaf Ebrahimi todo.aes_gcm = 1;
565*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "aes_ccm") == 0) {
566*62c56f98SSadaf Ebrahimi todo.aes_ccm = 1;
567*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "chachapoly") == 0) {
568*62c56f98SSadaf Ebrahimi todo.chachapoly = 1;
569*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "aes_cmac") == 0) {
570*62c56f98SSadaf Ebrahimi todo.aes_cmac = 1;
571*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "des3_cmac") == 0) {
572*62c56f98SSadaf Ebrahimi todo.des3_cmac = 1;
573*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "aria") == 0) {
574*62c56f98SSadaf Ebrahimi todo.aria = 1;
575*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "camellia") == 0) {
576*62c56f98SSadaf Ebrahimi todo.camellia = 1;
577*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "chacha20") == 0) {
578*62c56f98SSadaf Ebrahimi todo.chacha20 = 1;
579*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "poly1305") == 0) {
580*62c56f98SSadaf Ebrahimi todo.poly1305 = 1;
581*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "ctr_drbg") == 0) {
582*62c56f98SSadaf Ebrahimi todo.ctr_drbg = 1;
583*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "hmac_drbg") == 0) {
584*62c56f98SSadaf Ebrahimi todo.hmac_drbg = 1;
585*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "rsa") == 0) {
586*62c56f98SSadaf Ebrahimi todo.rsa = 1;
587*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "dhm") == 0) {
588*62c56f98SSadaf Ebrahimi todo.dhm = 1;
589*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "ecdsa") == 0) {
590*62c56f98SSadaf Ebrahimi todo.ecdsa = 1;
591*62c56f98SSadaf Ebrahimi } else if (strcmp(argv[i], "ecdh") == 0) {
592*62c56f98SSadaf Ebrahimi todo.ecdh = 1;
593*62c56f98SSadaf Ebrahimi }
594*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_C)
595*62c56f98SSadaf Ebrahimi else if (set_ecp_curve(argv[i], single_curve)) {
596*62c56f98SSadaf Ebrahimi curve_list = single_curve;
597*62c56f98SSadaf Ebrahimi }
598*62c56f98SSadaf Ebrahimi #endif
599*62c56f98SSadaf Ebrahimi else {
600*62c56f98SSadaf Ebrahimi mbedtls_printf("Unrecognized option: %s\n", argv[i]);
601*62c56f98SSadaf Ebrahimi mbedtls_printf("Available options: " OPTIONS);
602*62c56f98SSadaf Ebrahimi }
603*62c56f98SSadaf Ebrahimi }
604*62c56f98SSadaf Ebrahimi }
605*62c56f98SSadaf Ebrahimi
606*62c56f98SSadaf Ebrahimi mbedtls_printf("\n");
607*62c56f98SSadaf Ebrahimi
608*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
609*62c56f98SSadaf Ebrahimi mbedtls_memory_buffer_alloc_init(alloc_buf, sizeof(alloc_buf));
610*62c56f98SSadaf Ebrahimi #endif
611*62c56f98SSadaf Ebrahimi memset(buf, 0xAA, sizeof(buf));
612*62c56f98SSadaf Ebrahimi memset(tmp, 0xBB, sizeof(tmp));
613*62c56f98SSadaf Ebrahimi
614*62c56f98SSadaf Ebrahimi /* Avoid "unused static function" warning in configurations without
615*62c56f98SSadaf Ebrahimi * symmetric crypto. */
616*62c56f98SSadaf Ebrahimi (void) mbedtls_timing_hardclock;
617*62c56f98SSadaf Ebrahimi
618*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD5_C)
619*62c56f98SSadaf Ebrahimi if (todo.md5) {
620*62c56f98SSadaf Ebrahimi TIME_AND_TSC("MD5", mbedtls_md5(buf, BUFSIZE, tmp));
621*62c56f98SSadaf Ebrahimi }
622*62c56f98SSadaf Ebrahimi #endif
623*62c56f98SSadaf Ebrahimi
624*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RIPEMD160_C)
625*62c56f98SSadaf Ebrahimi if (todo.ripemd160) {
626*62c56f98SSadaf Ebrahimi TIME_AND_TSC("RIPEMD160", mbedtls_ripemd160(buf, BUFSIZE, tmp));
627*62c56f98SSadaf Ebrahimi }
628*62c56f98SSadaf Ebrahimi #endif
629*62c56f98SSadaf Ebrahimi
630*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA1_C)
631*62c56f98SSadaf Ebrahimi if (todo.sha1) {
632*62c56f98SSadaf Ebrahimi TIME_AND_TSC("SHA-1", mbedtls_sha1(buf, BUFSIZE, tmp));
633*62c56f98SSadaf Ebrahimi }
634*62c56f98SSadaf Ebrahimi #endif
635*62c56f98SSadaf Ebrahimi
636*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA256_C)
637*62c56f98SSadaf Ebrahimi if (todo.sha256) {
638*62c56f98SSadaf Ebrahimi TIME_AND_TSC("SHA-256", mbedtls_sha256(buf, BUFSIZE, tmp, 0));
639*62c56f98SSadaf Ebrahimi }
640*62c56f98SSadaf Ebrahimi #endif
641*62c56f98SSadaf Ebrahimi
642*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA512_C)
643*62c56f98SSadaf Ebrahimi if (todo.sha512) {
644*62c56f98SSadaf Ebrahimi TIME_AND_TSC("SHA-512", mbedtls_sha512(buf, BUFSIZE, tmp, 0));
645*62c56f98SSadaf Ebrahimi }
646*62c56f98SSadaf Ebrahimi #endif
647*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA3_C)
648*62c56f98SSadaf Ebrahimi if (todo.sha3_224) {
649*62c56f98SSadaf Ebrahimi TIME_AND_TSC("SHA3-224", mbedtls_sha3(MBEDTLS_SHA3_224, buf, BUFSIZE, tmp, 28));
650*62c56f98SSadaf Ebrahimi }
651*62c56f98SSadaf Ebrahimi if (todo.sha3_256) {
652*62c56f98SSadaf Ebrahimi TIME_AND_TSC("SHA3-256", mbedtls_sha3(MBEDTLS_SHA3_256, buf, BUFSIZE, tmp, 32));
653*62c56f98SSadaf Ebrahimi }
654*62c56f98SSadaf Ebrahimi if (todo.sha3_384) {
655*62c56f98SSadaf Ebrahimi TIME_AND_TSC("SHA3-384", mbedtls_sha3(MBEDTLS_SHA3_384, buf, BUFSIZE, tmp, 48));
656*62c56f98SSadaf Ebrahimi }
657*62c56f98SSadaf Ebrahimi if (todo.sha3_512) {
658*62c56f98SSadaf Ebrahimi TIME_AND_TSC("SHA3-512", mbedtls_sha3(MBEDTLS_SHA3_512, buf, BUFSIZE, tmp, 64));
659*62c56f98SSadaf Ebrahimi }
660*62c56f98SSadaf Ebrahimi #endif
661*62c56f98SSadaf Ebrahimi
662*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DES_C)
663*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_CBC)
664*62c56f98SSadaf Ebrahimi if (todo.des3) {
665*62c56f98SSadaf Ebrahimi mbedtls_des3_context des3;
666*62c56f98SSadaf Ebrahimi mbedtls_des3_init(&des3);
667*62c56f98SSadaf Ebrahimi if (mbedtls_des3_set3key_enc(&des3, tmp) != 0) {
668*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
669*62c56f98SSadaf Ebrahimi }
670*62c56f98SSadaf Ebrahimi TIME_AND_TSC("3DES",
671*62c56f98SSadaf Ebrahimi mbedtls_des3_crypt_cbc(&des3, MBEDTLS_DES_ENCRYPT, BUFSIZE, tmp, buf, buf));
672*62c56f98SSadaf Ebrahimi mbedtls_des3_free(&des3);
673*62c56f98SSadaf Ebrahimi }
674*62c56f98SSadaf Ebrahimi
675*62c56f98SSadaf Ebrahimi if (todo.des) {
676*62c56f98SSadaf Ebrahimi mbedtls_des_context des;
677*62c56f98SSadaf Ebrahimi mbedtls_des_init(&des);
678*62c56f98SSadaf Ebrahimi if (mbedtls_des_setkey_enc(&des, tmp) != 0) {
679*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
680*62c56f98SSadaf Ebrahimi }
681*62c56f98SSadaf Ebrahimi TIME_AND_TSC("DES",
682*62c56f98SSadaf Ebrahimi mbedtls_des_crypt_cbc(&des, MBEDTLS_DES_ENCRYPT, BUFSIZE, tmp, buf, buf));
683*62c56f98SSadaf Ebrahimi mbedtls_des_free(&des);
684*62c56f98SSadaf Ebrahimi }
685*62c56f98SSadaf Ebrahimi
686*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_CIPHER_MODE_CBC */
687*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CMAC_C)
688*62c56f98SSadaf Ebrahimi if (todo.des3_cmac) {
689*62c56f98SSadaf Ebrahimi unsigned char output[8];
690*62c56f98SSadaf Ebrahimi const mbedtls_cipher_info_t *cipher_info;
691*62c56f98SSadaf Ebrahimi
692*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
693*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
694*62c56f98SSadaf Ebrahimi
695*62c56f98SSadaf Ebrahimi cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_DES_EDE3_ECB);
696*62c56f98SSadaf Ebrahimi
697*62c56f98SSadaf Ebrahimi TIME_AND_TSC("3DES-CMAC",
698*62c56f98SSadaf Ebrahimi mbedtls_cipher_cmac(cipher_info, tmp, 192, buf,
699*62c56f98SSadaf Ebrahimi BUFSIZE, output));
700*62c56f98SSadaf Ebrahimi }
701*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_CMAC_C */
702*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DES_C */
703*62c56f98SSadaf Ebrahimi
704*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_AES_C)
705*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_CBC)
706*62c56f98SSadaf Ebrahimi if (todo.aes_cbc) {
707*62c56f98SSadaf Ebrahimi int keysize;
708*62c56f98SSadaf Ebrahimi mbedtls_aes_context aes;
709*62c56f98SSadaf Ebrahimi mbedtls_aes_init(&aes);
710*62c56f98SSadaf Ebrahimi for (keysize = 128; keysize <= 256; keysize += 64) {
711*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "AES-CBC-%d", keysize);
712*62c56f98SSadaf Ebrahimi
713*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
714*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
715*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_aes_setkey_enc(&aes, tmp, keysize));
716*62c56f98SSadaf Ebrahimi
717*62c56f98SSadaf Ebrahimi TIME_AND_TSC(title,
718*62c56f98SSadaf Ebrahimi mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, BUFSIZE, tmp, buf, buf));
719*62c56f98SSadaf Ebrahimi }
720*62c56f98SSadaf Ebrahimi mbedtls_aes_free(&aes);
721*62c56f98SSadaf Ebrahimi }
722*62c56f98SSadaf Ebrahimi #endif
723*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_XTS)
724*62c56f98SSadaf Ebrahimi if (todo.aes_xts) {
725*62c56f98SSadaf Ebrahimi int keysize;
726*62c56f98SSadaf Ebrahimi mbedtls_aes_xts_context ctx;
727*62c56f98SSadaf Ebrahimi
728*62c56f98SSadaf Ebrahimi mbedtls_aes_xts_init(&ctx);
729*62c56f98SSadaf Ebrahimi for (keysize = 128; keysize <= 256; keysize += 128) {
730*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "AES-XTS-%d", keysize);
731*62c56f98SSadaf Ebrahimi
732*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
733*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
734*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_aes_xts_setkey_enc(&ctx, tmp, keysize * 2));
735*62c56f98SSadaf Ebrahimi
736*62c56f98SSadaf Ebrahimi TIME_AND_TSC(title,
737*62c56f98SSadaf Ebrahimi mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, BUFSIZE,
738*62c56f98SSadaf Ebrahimi tmp, buf, buf));
739*62c56f98SSadaf Ebrahimi
740*62c56f98SSadaf Ebrahimi mbedtls_aes_xts_free(&ctx);
741*62c56f98SSadaf Ebrahimi }
742*62c56f98SSadaf Ebrahimi }
743*62c56f98SSadaf Ebrahimi #endif
744*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_GCM_C)
745*62c56f98SSadaf Ebrahimi if (todo.aes_gcm) {
746*62c56f98SSadaf Ebrahimi int keysize;
747*62c56f98SSadaf Ebrahimi mbedtls_gcm_context gcm;
748*62c56f98SSadaf Ebrahimi
749*62c56f98SSadaf Ebrahimi mbedtls_gcm_init(&gcm);
750*62c56f98SSadaf Ebrahimi for (keysize = 128; keysize <= 256; keysize += 64) {
751*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "AES-GCM-%d", keysize);
752*62c56f98SSadaf Ebrahimi
753*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
754*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
755*62c56f98SSadaf Ebrahimi mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
756*62c56f98SSadaf Ebrahimi
757*62c56f98SSadaf Ebrahimi TIME_AND_TSC(title,
758*62c56f98SSadaf Ebrahimi mbedtls_gcm_crypt_and_tag(&gcm, MBEDTLS_GCM_ENCRYPT, BUFSIZE, tmp,
759*62c56f98SSadaf Ebrahimi 12, NULL, 0, buf, buf, 16, tmp));
760*62c56f98SSadaf Ebrahimi
761*62c56f98SSadaf Ebrahimi mbedtls_gcm_free(&gcm);
762*62c56f98SSadaf Ebrahimi }
763*62c56f98SSadaf Ebrahimi }
764*62c56f98SSadaf Ebrahimi #endif
765*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CCM_C)
766*62c56f98SSadaf Ebrahimi if (todo.aes_ccm) {
767*62c56f98SSadaf Ebrahimi int keysize;
768*62c56f98SSadaf Ebrahimi mbedtls_ccm_context ccm;
769*62c56f98SSadaf Ebrahimi
770*62c56f98SSadaf Ebrahimi mbedtls_ccm_init(&ccm);
771*62c56f98SSadaf Ebrahimi for (keysize = 128; keysize <= 256; keysize += 64) {
772*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "AES-CCM-%d", keysize);
773*62c56f98SSadaf Ebrahimi
774*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
775*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
776*62c56f98SSadaf Ebrahimi mbedtls_ccm_setkey(&ccm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
777*62c56f98SSadaf Ebrahimi
778*62c56f98SSadaf Ebrahimi TIME_AND_TSC(title,
779*62c56f98SSadaf Ebrahimi mbedtls_ccm_encrypt_and_tag(&ccm, BUFSIZE, tmp,
780*62c56f98SSadaf Ebrahimi 12, NULL, 0, buf, buf, tmp, 16));
781*62c56f98SSadaf Ebrahimi
782*62c56f98SSadaf Ebrahimi mbedtls_ccm_free(&ccm);
783*62c56f98SSadaf Ebrahimi }
784*62c56f98SSadaf Ebrahimi }
785*62c56f98SSadaf Ebrahimi #endif
786*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CHACHAPOLY_C)
787*62c56f98SSadaf Ebrahimi if (todo.chachapoly) {
788*62c56f98SSadaf Ebrahimi mbedtls_chachapoly_context chachapoly;
789*62c56f98SSadaf Ebrahimi
790*62c56f98SSadaf Ebrahimi mbedtls_chachapoly_init(&chachapoly);
791*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
792*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
793*62c56f98SSadaf Ebrahimi
794*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "ChaCha20-Poly1305");
795*62c56f98SSadaf Ebrahimi
796*62c56f98SSadaf Ebrahimi mbedtls_chachapoly_setkey(&chachapoly, tmp);
797*62c56f98SSadaf Ebrahimi
798*62c56f98SSadaf Ebrahimi TIME_AND_TSC(title,
799*62c56f98SSadaf Ebrahimi mbedtls_chachapoly_encrypt_and_tag(&chachapoly,
800*62c56f98SSadaf Ebrahimi BUFSIZE, tmp, NULL, 0, buf, buf, tmp));
801*62c56f98SSadaf Ebrahimi
802*62c56f98SSadaf Ebrahimi mbedtls_chachapoly_free(&chachapoly);
803*62c56f98SSadaf Ebrahimi }
804*62c56f98SSadaf Ebrahimi #endif
805*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CMAC_C)
806*62c56f98SSadaf Ebrahimi if (todo.aes_cmac) {
807*62c56f98SSadaf Ebrahimi unsigned char output[16];
808*62c56f98SSadaf Ebrahimi const mbedtls_cipher_info_t *cipher_info;
809*62c56f98SSadaf Ebrahimi mbedtls_cipher_type_t cipher_type;
810*62c56f98SSadaf Ebrahimi int keysize;
811*62c56f98SSadaf Ebrahimi
812*62c56f98SSadaf Ebrahimi for (keysize = 128, cipher_type = MBEDTLS_CIPHER_AES_128_ECB;
813*62c56f98SSadaf Ebrahimi keysize <= 256;
814*62c56f98SSadaf Ebrahimi keysize += 64, cipher_type++) {
815*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "AES-CMAC-%d", keysize);
816*62c56f98SSadaf Ebrahimi
817*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
818*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
819*62c56f98SSadaf Ebrahimi
820*62c56f98SSadaf Ebrahimi cipher_info = mbedtls_cipher_info_from_type(cipher_type);
821*62c56f98SSadaf Ebrahimi
822*62c56f98SSadaf Ebrahimi TIME_AND_TSC(title,
823*62c56f98SSadaf Ebrahimi mbedtls_cipher_cmac(cipher_info, tmp, keysize,
824*62c56f98SSadaf Ebrahimi buf, BUFSIZE, output));
825*62c56f98SSadaf Ebrahimi }
826*62c56f98SSadaf Ebrahimi
827*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
828*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
829*62c56f98SSadaf Ebrahimi TIME_AND_TSC("AES-CMAC-PRF-128",
830*62c56f98SSadaf Ebrahimi mbedtls_aes_cmac_prf_128(tmp, 16, buf, BUFSIZE,
831*62c56f98SSadaf Ebrahimi output));
832*62c56f98SSadaf Ebrahimi }
833*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_CMAC_C */
834*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_AES_C */
835*62c56f98SSadaf Ebrahimi
836*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ARIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
837*62c56f98SSadaf Ebrahimi if (todo.aria) {
838*62c56f98SSadaf Ebrahimi int keysize;
839*62c56f98SSadaf Ebrahimi mbedtls_aria_context aria;
840*62c56f98SSadaf Ebrahimi mbedtls_aria_init(&aria);
841*62c56f98SSadaf Ebrahimi for (keysize = 128; keysize <= 256; keysize += 64) {
842*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "ARIA-CBC-%d", keysize);
843*62c56f98SSadaf Ebrahimi
844*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
845*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
846*62c56f98SSadaf Ebrahimi mbedtls_aria_setkey_enc(&aria, tmp, keysize);
847*62c56f98SSadaf Ebrahimi
848*62c56f98SSadaf Ebrahimi TIME_AND_TSC(title,
849*62c56f98SSadaf Ebrahimi mbedtls_aria_crypt_cbc(&aria, MBEDTLS_ARIA_ENCRYPT,
850*62c56f98SSadaf Ebrahimi BUFSIZE, tmp, buf, buf));
851*62c56f98SSadaf Ebrahimi }
852*62c56f98SSadaf Ebrahimi mbedtls_aria_free(&aria);
853*62c56f98SSadaf Ebrahimi }
854*62c56f98SSadaf Ebrahimi #endif
855*62c56f98SSadaf Ebrahimi
856*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
857*62c56f98SSadaf Ebrahimi if (todo.camellia) {
858*62c56f98SSadaf Ebrahimi int keysize;
859*62c56f98SSadaf Ebrahimi mbedtls_camellia_context camellia;
860*62c56f98SSadaf Ebrahimi mbedtls_camellia_init(&camellia);
861*62c56f98SSadaf Ebrahimi for (keysize = 128; keysize <= 256; keysize += 64) {
862*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "CAMELLIA-CBC-%d", keysize);
863*62c56f98SSadaf Ebrahimi
864*62c56f98SSadaf Ebrahimi memset(buf, 0, sizeof(buf));
865*62c56f98SSadaf Ebrahimi memset(tmp, 0, sizeof(tmp));
866*62c56f98SSadaf Ebrahimi mbedtls_camellia_setkey_enc(&camellia, tmp, keysize);
867*62c56f98SSadaf Ebrahimi
868*62c56f98SSadaf Ebrahimi TIME_AND_TSC(title,
869*62c56f98SSadaf Ebrahimi mbedtls_camellia_crypt_cbc(&camellia, MBEDTLS_CAMELLIA_ENCRYPT,
870*62c56f98SSadaf Ebrahimi BUFSIZE, tmp, buf, buf));
871*62c56f98SSadaf Ebrahimi }
872*62c56f98SSadaf Ebrahimi mbedtls_camellia_free(&camellia);
873*62c56f98SSadaf Ebrahimi }
874*62c56f98SSadaf Ebrahimi #endif
875*62c56f98SSadaf Ebrahimi
876*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CHACHA20_C)
877*62c56f98SSadaf Ebrahimi if (todo.chacha20) {
878*62c56f98SSadaf Ebrahimi TIME_AND_TSC("ChaCha20", mbedtls_chacha20_crypt(buf, buf, 0U, BUFSIZE, buf, buf));
879*62c56f98SSadaf Ebrahimi }
880*62c56f98SSadaf Ebrahimi #endif
881*62c56f98SSadaf Ebrahimi
882*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_POLY1305_C)
883*62c56f98SSadaf Ebrahimi if (todo.poly1305) {
884*62c56f98SSadaf Ebrahimi TIME_AND_TSC("Poly1305", mbedtls_poly1305_mac(buf, buf, BUFSIZE, buf));
885*62c56f98SSadaf Ebrahimi }
886*62c56f98SSadaf Ebrahimi #endif
887*62c56f98SSadaf Ebrahimi
888*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CTR_DRBG_C)
889*62c56f98SSadaf Ebrahimi if (todo.ctr_drbg) {
890*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_context ctr_drbg;
891*62c56f98SSadaf Ebrahimi
892*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_init(&ctr_drbg);
893*62c56f98SSadaf Ebrahimi if (mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0) != 0) {
894*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
895*62c56f98SSadaf Ebrahimi }
896*62c56f98SSadaf Ebrahimi TIME_AND_TSC("CTR_DRBG (NOPR)",
897*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
898*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_free(&ctr_drbg);
899*62c56f98SSadaf Ebrahimi
900*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_init(&ctr_drbg);
901*62c56f98SSadaf Ebrahimi if (mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0) != 0) {
902*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
903*62c56f98SSadaf Ebrahimi }
904*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_set_prediction_resistance(&ctr_drbg, MBEDTLS_CTR_DRBG_PR_ON);
905*62c56f98SSadaf Ebrahimi TIME_AND_TSC("CTR_DRBG (PR)",
906*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
907*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_free(&ctr_drbg);
908*62c56f98SSadaf Ebrahimi }
909*62c56f98SSadaf Ebrahimi #endif
910*62c56f98SSadaf Ebrahimi
911*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HMAC_DRBG_C) && \
912*62c56f98SSadaf Ebrahimi (defined(MBEDTLS_SHA1_C) || defined(MBEDTLS_SHA256_C))
913*62c56f98SSadaf Ebrahimi if (todo.hmac_drbg) {
914*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_context hmac_drbg;
915*62c56f98SSadaf Ebrahimi const mbedtls_md_info_t *md_info;
916*62c56f98SSadaf Ebrahimi
917*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_init(&hmac_drbg);
918*62c56f98SSadaf Ebrahimi
919*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA1_C)
920*62c56f98SSadaf Ebrahimi if ((md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1)) == NULL) {
921*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
922*62c56f98SSadaf Ebrahimi }
923*62c56f98SSadaf Ebrahimi
924*62c56f98SSadaf Ebrahimi if (mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0) != 0) {
925*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
926*62c56f98SSadaf Ebrahimi }
927*62c56f98SSadaf Ebrahimi TIME_AND_TSC("HMAC_DRBG SHA-1 (NOPR)",
928*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
929*62c56f98SSadaf Ebrahimi
930*62c56f98SSadaf Ebrahimi if (mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0) != 0) {
931*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
932*62c56f98SSadaf Ebrahimi }
933*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
934*62c56f98SSadaf Ebrahimi MBEDTLS_HMAC_DRBG_PR_ON);
935*62c56f98SSadaf Ebrahimi TIME_AND_TSC("HMAC_DRBG SHA-1 (PR)",
936*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
937*62c56f98SSadaf Ebrahimi #endif
938*62c56f98SSadaf Ebrahimi
939*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA256_C)
940*62c56f98SSadaf Ebrahimi if ((md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256)) == NULL) {
941*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
942*62c56f98SSadaf Ebrahimi }
943*62c56f98SSadaf Ebrahimi
944*62c56f98SSadaf Ebrahimi if (mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0) != 0) {
945*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
946*62c56f98SSadaf Ebrahimi }
947*62c56f98SSadaf Ebrahimi TIME_AND_TSC("HMAC_DRBG SHA-256 (NOPR)",
948*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
949*62c56f98SSadaf Ebrahimi
950*62c56f98SSadaf Ebrahimi if (mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0) != 0) {
951*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
952*62c56f98SSadaf Ebrahimi }
953*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
954*62c56f98SSadaf Ebrahimi MBEDTLS_HMAC_DRBG_PR_ON);
955*62c56f98SSadaf Ebrahimi TIME_AND_TSC("HMAC_DRBG SHA-256 (PR)",
956*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
957*62c56f98SSadaf Ebrahimi #endif
958*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_free(&hmac_drbg);
959*62c56f98SSadaf Ebrahimi }
960*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_HMAC_DRBG_C && ( MBEDTLS_SHA1_C || MBEDTLS_SHA256_C ) */
961*62c56f98SSadaf Ebrahimi
962*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)
963*62c56f98SSadaf Ebrahimi if (todo.rsa) {
964*62c56f98SSadaf Ebrahimi int keysize;
965*62c56f98SSadaf Ebrahimi mbedtls_rsa_context rsa;
966*62c56f98SSadaf Ebrahimi for (keysize = 2048; keysize <= 4096; keysize *= 2) {
967*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "RSA-%d", keysize);
968*62c56f98SSadaf Ebrahimi
969*62c56f98SSadaf Ebrahimi mbedtls_rsa_init(&rsa);
970*62c56f98SSadaf Ebrahimi mbedtls_rsa_gen_key(&rsa, myrand, NULL, keysize, 65537);
971*62c56f98SSadaf Ebrahimi
972*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title, " public",
973*62c56f98SSadaf Ebrahimi buf[0] = 0;
974*62c56f98SSadaf Ebrahimi ret = mbedtls_rsa_public(&rsa, buf, buf));
975*62c56f98SSadaf Ebrahimi
976*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title, "private",
977*62c56f98SSadaf Ebrahimi buf[0] = 0;
978*62c56f98SSadaf Ebrahimi ret = mbedtls_rsa_private(&rsa, myrand, NULL, buf, buf));
979*62c56f98SSadaf Ebrahimi
980*62c56f98SSadaf Ebrahimi mbedtls_rsa_free(&rsa);
981*62c56f98SSadaf Ebrahimi }
982*62c56f98SSadaf Ebrahimi }
983*62c56f98SSadaf Ebrahimi #endif
984*62c56f98SSadaf Ebrahimi
985*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)
986*62c56f98SSadaf Ebrahimi if (todo.dhm) {
987*62c56f98SSadaf Ebrahimi int dhm_sizes[] = { 2048, 3072 };
988*62c56f98SSadaf Ebrahimi static const unsigned char dhm_P_2048[] =
989*62c56f98SSadaf Ebrahimi MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
990*62c56f98SSadaf Ebrahimi static const unsigned char dhm_P_3072[] =
991*62c56f98SSadaf Ebrahimi MBEDTLS_DHM_RFC3526_MODP_3072_P_BIN;
992*62c56f98SSadaf Ebrahimi static const unsigned char dhm_G_2048[] =
993*62c56f98SSadaf Ebrahimi MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
994*62c56f98SSadaf Ebrahimi static const unsigned char dhm_G_3072[] =
995*62c56f98SSadaf Ebrahimi MBEDTLS_DHM_RFC3526_MODP_3072_G_BIN;
996*62c56f98SSadaf Ebrahimi
997*62c56f98SSadaf Ebrahimi const unsigned char *dhm_P[] = { dhm_P_2048, dhm_P_3072 };
998*62c56f98SSadaf Ebrahimi const size_t dhm_P_size[] = { sizeof(dhm_P_2048),
999*62c56f98SSadaf Ebrahimi sizeof(dhm_P_3072) };
1000*62c56f98SSadaf Ebrahimi
1001*62c56f98SSadaf Ebrahimi const unsigned char *dhm_G[] = { dhm_G_2048, dhm_G_3072 };
1002*62c56f98SSadaf Ebrahimi const size_t dhm_G_size[] = { sizeof(dhm_G_2048),
1003*62c56f98SSadaf Ebrahimi sizeof(dhm_G_3072) };
1004*62c56f98SSadaf Ebrahimi
1005*62c56f98SSadaf Ebrahimi mbedtls_dhm_context dhm;
1006*62c56f98SSadaf Ebrahimi size_t olen;
1007*62c56f98SSadaf Ebrahimi size_t n;
1008*62c56f98SSadaf Ebrahimi for (i = 0; (size_t) i < sizeof(dhm_sizes) / sizeof(dhm_sizes[0]); i++) {
1009*62c56f98SSadaf Ebrahimi mbedtls_dhm_init(&dhm);
1010*62c56f98SSadaf Ebrahimi
1011*62c56f98SSadaf Ebrahimi if (mbedtls_mpi_read_binary(&dhm.P, dhm_P[i],
1012*62c56f98SSadaf Ebrahimi dhm_P_size[i]) != 0 ||
1013*62c56f98SSadaf Ebrahimi mbedtls_mpi_read_binary(&dhm.G, dhm_G[i],
1014*62c56f98SSadaf Ebrahimi dhm_G_size[i]) != 0) {
1015*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
1016*62c56f98SSadaf Ebrahimi }
1017*62c56f98SSadaf Ebrahimi
1018*62c56f98SSadaf Ebrahimi n = mbedtls_mpi_size(&dhm.P);
1019*62c56f98SSadaf Ebrahimi mbedtls_dhm_make_public(&dhm, (int) n, buf, n, myrand, NULL);
1020*62c56f98SSadaf Ebrahimi if (mbedtls_mpi_copy(&dhm.GY, &dhm.GX) != 0) {
1021*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
1022*62c56f98SSadaf Ebrahimi }
1023*62c56f98SSadaf Ebrahimi
1024*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "DHE-%d", dhm_sizes[i]);
1025*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title, "handshake",
1026*62c56f98SSadaf Ebrahimi ret |= mbedtls_dhm_make_public(&dhm, (int) n, buf, n,
1027*62c56f98SSadaf Ebrahimi myrand, NULL);
1028*62c56f98SSadaf Ebrahimi ret |=
1029*62c56f98SSadaf Ebrahimi mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf), &olen, myrand, NULL));
1030*62c56f98SSadaf Ebrahimi
1031*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "DH-%d", dhm_sizes[i]);
1032*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title, "handshake",
1033*62c56f98SSadaf Ebrahimi ret |=
1034*62c56f98SSadaf Ebrahimi mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf), &olen, myrand, NULL));
1035*62c56f98SSadaf Ebrahimi
1036*62c56f98SSadaf Ebrahimi mbedtls_dhm_free(&dhm);
1037*62c56f98SSadaf Ebrahimi }
1038*62c56f98SSadaf Ebrahimi }
1039*62c56f98SSadaf Ebrahimi #endif
1040*62c56f98SSadaf Ebrahimi
1041*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)
1042*62c56f98SSadaf Ebrahimi if (todo.ecdsa) {
1043*62c56f98SSadaf Ebrahimi mbedtls_ecdsa_context ecdsa;
1044*62c56f98SSadaf Ebrahimi const mbedtls_ecp_curve_info *curve_info;
1045*62c56f98SSadaf Ebrahimi size_t sig_len;
1046*62c56f98SSadaf Ebrahimi
1047*62c56f98SSadaf Ebrahimi memset(buf, 0x2A, sizeof(buf));
1048*62c56f98SSadaf Ebrahimi
1049*62c56f98SSadaf Ebrahimi for (curve_info = curve_list;
1050*62c56f98SSadaf Ebrahimi curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
1051*62c56f98SSadaf Ebrahimi curve_info++) {
1052*62c56f98SSadaf Ebrahimi if (!mbedtls_ecdsa_can_do(curve_info->grp_id)) {
1053*62c56f98SSadaf Ebrahimi continue;
1054*62c56f98SSadaf Ebrahimi }
1055*62c56f98SSadaf Ebrahimi
1056*62c56f98SSadaf Ebrahimi mbedtls_ecdsa_init(&ecdsa);
1057*62c56f98SSadaf Ebrahimi
1058*62c56f98SSadaf Ebrahimi if (mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL) != 0) {
1059*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
1060*62c56f98SSadaf Ebrahimi }
1061*62c56f98SSadaf Ebrahimi
1062*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
1063*62c56f98SSadaf Ebrahimi curve_info->name);
1064*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title,
1065*62c56f98SSadaf Ebrahimi "sign",
1066*62c56f98SSadaf Ebrahimi ret =
1067*62c56f98SSadaf Ebrahimi mbedtls_ecdsa_write_signature(&ecdsa, MBEDTLS_MD_SHA256, buf,
1068*62c56f98SSadaf Ebrahimi curve_info->bit_size,
1069*62c56f98SSadaf Ebrahimi tmp, sizeof(tmp), &sig_len, myrand,
1070*62c56f98SSadaf Ebrahimi NULL));
1071*62c56f98SSadaf Ebrahimi
1072*62c56f98SSadaf Ebrahimi mbedtls_ecdsa_free(&ecdsa);
1073*62c56f98SSadaf Ebrahimi }
1074*62c56f98SSadaf Ebrahimi
1075*62c56f98SSadaf Ebrahimi for (curve_info = curve_list;
1076*62c56f98SSadaf Ebrahimi curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
1077*62c56f98SSadaf Ebrahimi curve_info++) {
1078*62c56f98SSadaf Ebrahimi if (!mbedtls_ecdsa_can_do(curve_info->grp_id)) {
1079*62c56f98SSadaf Ebrahimi continue;
1080*62c56f98SSadaf Ebrahimi }
1081*62c56f98SSadaf Ebrahimi
1082*62c56f98SSadaf Ebrahimi mbedtls_ecdsa_init(&ecdsa);
1083*62c56f98SSadaf Ebrahimi
1084*62c56f98SSadaf Ebrahimi if (mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL) != 0 ||
1085*62c56f98SSadaf Ebrahimi mbedtls_ecdsa_write_signature(&ecdsa, MBEDTLS_MD_SHA256, buf, curve_info->bit_size,
1086*62c56f98SSadaf Ebrahimi tmp, sizeof(tmp), &sig_len, myrand, NULL) != 0) {
1087*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
1088*62c56f98SSadaf Ebrahimi }
1089*62c56f98SSadaf Ebrahimi
1090*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
1091*62c56f98SSadaf Ebrahimi curve_info->name);
1092*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title, "verify",
1093*62c56f98SSadaf Ebrahimi ret = mbedtls_ecdsa_read_signature(&ecdsa, buf, curve_info->bit_size,
1094*62c56f98SSadaf Ebrahimi tmp, sig_len));
1095*62c56f98SSadaf Ebrahimi
1096*62c56f98SSadaf Ebrahimi mbedtls_ecdsa_free(&ecdsa);
1097*62c56f98SSadaf Ebrahimi }
1098*62c56f98SSadaf Ebrahimi }
1099*62c56f98SSadaf Ebrahimi #endif
1100*62c56f98SSadaf Ebrahimi
1101*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECDH_C) && defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
1102*62c56f98SSadaf Ebrahimi if (todo.ecdh) {
1103*62c56f98SSadaf Ebrahimi mbedtls_ecdh_context ecdh;
1104*62c56f98SSadaf Ebrahimi mbedtls_mpi z;
1105*62c56f98SSadaf Ebrahimi const mbedtls_ecp_curve_info montgomery_curve_list[] = {
1106*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
1107*62c56f98SSadaf Ebrahimi { MBEDTLS_ECP_DP_CURVE25519, 0, 0, "Curve25519" },
1108*62c56f98SSadaf Ebrahimi #endif
1109*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED)
1110*62c56f98SSadaf Ebrahimi { MBEDTLS_ECP_DP_CURVE448, 0, 0, "Curve448" },
1111*62c56f98SSadaf Ebrahimi #endif
1112*62c56f98SSadaf Ebrahimi { MBEDTLS_ECP_DP_NONE, 0, 0, 0 }
1113*62c56f98SSadaf Ebrahimi };
1114*62c56f98SSadaf Ebrahimi const mbedtls_ecp_curve_info *curve_info;
1115*62c56f98SSadaf Ebrahimi size_t olen;
1116*62c56f98SSadaf Ebrahimi const mbedtls_ecp_curve_info *selected_montgomery_curve_list =
1117*62c56f98SSadaf Ebrahimi montgomery_curve_list;
1118*62c56f98SSadaf Ebrahimi
1119*62c56f98SSadaf Ebrahimi if (curve_list == (const mbedtls_ecp_curve_info *) &single_curve) {
1120*62c56f98SSadaf Ebrahimi mbedtls_ecp_group grp;
1121*62c56f98SSadaf Ebrahimi mbedtls_ecp_group_init(&grp);
1122*62c56f98SSadaf Ebrahimi if (mbedtls_ecp_group_load(&grp, curve_list->grp_id) != 0) {
1123*62c56f98SSadaf Ebrahimi mbedtls_exit(1);
1124*62c56f98SSadaf Ebrahimi }
1125*62c56f98SSadaf Ebrahimi if (mbedtls_ecp_get_type(&grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) {
1126*62c56f98SSadaf Ebrahimi selected_montgomery_curve_list = single_curve;
1127*62c56f98SSadaf Ebrahimi } else { /* empty list */
1128*62c56f98SSadaf Ebrahimi selected_montgomery_curve_list = single_curve + 1;
1129*62c56f98SSadaf Ebrahimi }
1130*62c56f98SSadaf Ebrahimi mbedtls_ecp_group_free(&grp);
1131*62c56f98SSadaf Ebrahimi }
1132*62c56f98SSadaf Ebrahimi
1133*62c56f98SSadaf Ebrahimi for (curve_info = curve_list;
1134*62c56f98SSadaf Ebrahimi curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
1135*62c56f98SSadaf Ebrahimi curve_info++) {
1136*62c56f98SSadaf Ebrahimi if (!mbedtls_ecdh_can_do(curve_info->grp_id)) {
1137*62c56f98SSadaf Ebrahimi continue;
1138*62c56f98SSadaf Ebrahimi }
1139*62c56f98SSadaf Ebrahimi
1140*62c56f98SSadaf Ebrahimi mbedtls_ecdh_init(&ecdh);
1141*62c56f98SSadaf Ebrahimi
1142*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id));
1143*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf),
1144*62c56f98SSadaf Ebrahimi myrand, NULL));
1145*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecp_copy(&ecdh.Qp, &ecdh.Q));
1146*62c56f98SSadaf Ebrahimi
1147*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "ECDHE-%s",
1148*62c56f98SSadaf Ebrahimi curve_info->name);
1149*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title, "handshake",
1150*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf),
1151*62c56f98SSadaf Ebrahimi myrand, NULL));
1152*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_calc_secret(&ecdh, &olen, buf, sizeof(buf),
1153*62c56f98SSadaf Ebrahimi myrand, NULL)));
1154*62c56f98SSadaf Ebrahimi mbedtls_ecdh_free(&ecdh);
1155*62c56f98SSadaf Ebrahimi }
1156*62c56f98SSadaf Ebrahimi
1157*62c56f98SSadaf Ebrahimi /* Montgomery curves need to be handled separately */
1158*62c56f98SSadaf Ebrahimi for (curve_info = selected_montgomery_curve_list;
1159*62c56f98SSadaf Ebrahimi curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
1160*62c56f98SSadaf Ebrahimi curve_info++) {
1161*62c56f98SSadaf Ebrahimi mbedtls_ecdh_init(&ecdh);
1162*62c56f98SSadaf Ebrahimi mbedtls_mpi_init(&z);
1163*62c56f98SSadaf Ebrahimi
1164*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id));
1165*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Qp, myrand, NULL));
1166*62c56f98SSadaf Ebrahimi
1167*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "ECDHE-%s",
1168*62c56f98SSadaf Ebrahimi curve_info->name);
1169*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title, "handshake",
1170*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Q,
1171*62c56f98SSadaf Ebrahimi myrand, NULL));
1172*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_compute_shared(&ecdh.grp, &z, &ecdh.Qp,
1173*62c56f98SSadaf Ebrahimi &ecdh.d,
1174*62c56f98SSadaf Ebrahimi myrand, NULL)));
1175*62c56f98SSadaf Ebrahimi
1176*62c56f98SSadaf Ebrahimi mbedtls_ecdh_free(&ecdh);
1177*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&z);
1178*62c56f98SSadaf Ebrahimi }
1179*62c56f98SSadaf Ebrahimi
1180*62c56f98SSadaf Ebrahimi for (curve_info = curve_list;
1181*62c56f98SSadaf Ebrahimi curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
1182*62c56f98SSadaf Ebrahimi curve_info++) {
1183*62c56f98SSadaf Ebrahimi if (!mbedtls_ecdh_can_do(curve_info->grp_id)) {
1184*62c56f98SSadaf Ebrahimi continue;
1185*62c56f98SSadaf Ebrahimi }
1186*62c56f98SSadaf Ebrahimi
1187*62c56f98SSadaf Ebrahimi mbedtls_ecdh_init(&ecdh);
1188*62c56f98SSadaf Ebrahimi
1189*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id));
1190*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf),
1191*62c56f98SSadaf Ebrahimi myrand, NULL));
1192*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecp_copy(&ecdh.Qp, &ecdh.Q));
1193*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf),
1194*62c56f98SSadaf Ebrahimi myrand, NULL));
1195*62c56f98SSadaf Ebrahimi
1196*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "ECDH-%s",
1197*62c56f98SSadaf Ebrahimi curve_info->name);
1198*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title, "handshake",
1199*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_calc_secret(&ecdh, &olen, buf, sizeof(buf),
1200*62c56f98SSadaf Ebrahimi myrand, NULL)));
1201*62c56f98SSadaf Ebrahimi mbedtls_ecdh_free(&ecdh);
1202*62c56f98SSadaf Ebrahimi }
1203*62c56f98SSadaf Ebrahimi
1204*62c56f98SSadaf Ebrahimi /* Montgomery curves need to be handled separately */
1205*62c56f98SSadaf Ebrahimi for (curve_info = selected_montgomery_curve_list;
1206*62c56f98SSadaf Ebrahimi curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
1207*62c56f98SSadaf Ebrahimi curve_info++) {
1208*62c56f98SSadaf Ebrahimi mbedtls_ecdh_init(&ecdh);
1209*62c56f98SSadaf Ebrahimi mbedtls_mpi_init(&z);
1210*62c56f98SSadaf Ebrahimi
1211*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id));
1212*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Qp,
1213*62c56f98SSadaf Ebrahimi myrand, NULL));
1214*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Q, myrand, NULL));
1215*62c56f98SSadaf Ebrahimi
1216*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "ECDH-%s",
1217*62c56f98SSadaf Ebrahimi curve_info->name);
1218*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title, "handshake",
1219*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_compute_shared(&ecdh.grp, &z, &ecdh.Qp,
1220*62c56f98SSadaf Ebrahimi &ecdh.d,
1221*62c56f98SSadaf Ebrahimi myrand, NULL)));
1222*62c56f98SSadaf Ebrahimi
1223*62c56f98SSadaf Ebrahimi mbedtls_ecdh_free(&ecdh);
1224*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&z);
1225*62c56f98SSadaf Ebrahimi }
1226*62c56f98SSadaf Ebrahimi }
1227*62c56f98SSadaf Ebrahimi #endif
1228*62c56f98SSadaf Ebrahimi
1229*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECDH_C)
1230*62c56f98SSadaf Ebrahimi if (todo.ecdh) {
1231*62c56f98SSadaf Ebrahimi mbedtls_ecdh_context ecdh_srv, ecdh_cli;
1232*62c56f98SSadaf Ebrahimi unsigned char buf_srv[BUFSIZE], buf_cli[BUFSIZE];
1233*62c56f98SSadaf Ebrahimi const mbedtls_ecp_curve_info *curve_info;
1234*62c56f98SSadaf Ebrahimi size_t olen;
1235*62c56f98SSadaf Ebrahimi
1236*62c56f98SSadaf Ebrahimi for (curve_info = curve_list;
1237*62c56f98SSadaf Ebrahimi curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
1238*62c56f98SSadaf Ebrahimi curve_info++) {
1239*62c56f98SSadaf Ebrahimi if (!mbedtls_ecdh_can_do(curve_info->grp_id)) {
1240*62c56f98SSadaf Ebrahimi continue;
1241*62c56f98SSadaf Ebrahimi }
1242*62c56f98SSadaf Ebrahimi
1243*62c56f98SSadaf Ebrahimi mbedtls_ecdh_init(&ecdh_srv);
1244*62c56f98SSadaf Ebrahimi mbedtls_ecdh_init(&ecdh_cli);
1245*62c56f98SSadaf Ebrahimi
1246*62c56f98SSadaf Ebrahimi mbedtls_snprintf(title, sizeof(title), "ECDHE-%s", curve_info->name);
1247*62c56f98SSadaf Ebrahimi TIME_PUBLIC(title,
1248*62c56f98SSadaf Ebrahimi "full handshake",
1249*62c56f98SSadaf Ebrahimi const unsigned char *p_srv = buf_srv;
1250*62c56f98SSadaf Ebrahimi
1251*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_setup(&ecdh_srv, curve_info->grp_id));
1252*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_make_params(&ecdh_srv, &olen, buf_srv,
1253*62c56f98SSadaf Ebrahimi sizeof(buf_srv), myrand, NULL));
1254*62c56f98SSadaf Ebrahimi
1255*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_read_params(&ecdh_cli, &p_srv,
1256*62c56f98SSadaf Ebrahimi p_srv + olen));
1257*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_make_public(&ecdh_cli, &olen, buf_cli,
1258*62c56f98SSadaf Ebrahimi sizeof(buf_cli), myrand, NULL));
1259*62c56f98SSadaf Ebrahimi
1260*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_read_public(&ecdh_srv, buf_cli, olen));
1261*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_calc_secret(&ecdh_srv, &olen, buf_srv,
1262*62c56f98SSadaf Ebrahimi sizeof(buf_srv), myrand, NULL));
1263*62c56f98SSadaf Ebrahimi
1264*62c56f98SSadaf Ebrahimi CHECK_AND_CONTINUE(mbedtls_ecdh_calc_secret(&ecdh_cli, &olen, buf_cli,
1265*62c56f98SSadaf Ebrahimi sizeof(buf_cli), myrand, NULL));
1266*62c56f98SSadaf Ebrahimi mbedtls_ecdh_free(&ecdh_cli);
1267*62c56f98SSadaf Ebrahimi
1268*62c56f98SSadaf Ebrahimi mbedtls_ecdh_free(&ecdh_srv);
1269*62c56f98SSadaf Ebrahimi );
1270*62c56f98SSadaf Ebrahimi
1271*62c56f98SSadaf Ebrahimi }
1272*62c56f98SSadaf Ebrahimi }
1273*62c56f98SSadaf Ebrahimi #endif
1274*62c56f98SSadaf Ebrahimi
1275*62c56f98SSadaf Ebrahimi mbedtls_printf("\n");
1276*62c56f98SSadaf Ebrahimi
1277*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
1278*62c56f98SSadaf Ebrahimi mbedtls_memory_buffer_alloc_free();
1279*62c56f98SSadaf Ebrahimi #endif
1280*62c56f98SSadaf Ebrahimi
1281*62c56f98SSadaf Ebrahimi mbedtls_exit(0);
1282*62c56f98SSadaf Ebrahimi }
1283*62c56f98SSadaf Ebrahimi
1284*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_HAVE_TIME */
1285