]> git.ipfire.org Git - thirdparty/openssl.git/blob - apps/speed.c
speed.c: simplify aggregation of dsa --multi results
[thirdparty/openssl.git] / apps / speed.c
1 /*
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /* ====================================================================
11 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
12 *
13 * Portions of the attached software ("Contribution") are developed by
14 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
15 *
16 * The Contribution is licensed pursuant to the OpenSSL open source
17 * license provided above.
18 *
19 * The ECDH and ECDSA speed test software is originally written by
20 * Sumit Gupta of Sun Microsystems Laboratories.
21 *
22 */
23
24 #undef SECONDS
25 #define SECONDS 3
26 #define PRIME_SECONDS 10
27 #define RSA_SECONDS 10
28 #define DSA_SECONDS 10
29 #define ECDSA_SECONDS 10
30 #define ECDH_SECONDS 10
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <math.h>
36 #include "apps.h"
37 #include <openssl/crypto.h>
38 #include <openssl/rand.h>
39 #include <openssl/err.h>
40 #include <openssl/evp.h>
41 #include <openssl/objects.h>
42 #include <openssl/async.h>
43 #if !defined(OPENSSL_SYS_MSDOS)
44 # include OPENSSL_UNISTD
45 #endif
46
47 #if defined(_WIN32)
48 # include <windows.h>
49 #endif
50
51 #include <openssl/bn.h>
52 #ifndef OPENSSL_NO_DES
53 # include <openssl/des.h>
54 #endif
55 #include <openssl/aes.h>
56 #ifndef OPENSSL_NO_CAMELLIA
57 # include <openssl/camellia.h>
58 #endif
59 #ifndef OPENSSL_NO_MD2
60 # include <openssl/md2.h>
61 #endif
62 #ifndef OPENSSL_NO_MDC2
63 # include <openssl/mdc2.h>
64 #endif
65 #ifndef OPENSSL_NO_MD4
66 # include <openssl/md4.h>
67 #endif
68 #ifndef OPENSSL_NO_MD5
69 # include <openssl/md5.h>
70 #endif
71 #include <openssl/hmac.h>
72 #include <openssl/sha.h>
73 #ifndef OPENSSL_NO_RMD160
74 # include <openssl/ripemd.h>
75 #endif
76 #ifndef OPENSSL_NO_WHIRLPOOL
77 # include <openssl/whrlpool.h>
78 #endif
79 #ifndef OPENSSL_NO_RC4
80 # include <openssl/rc4.h>
81 #endif
82 #ifndef OPENSSL_NO_RC5
83 # include <openssl/rc5.h>
84 #endif
85 #ifndef OPENSSL_NO_RC2
86 # include <openssl/rc2.h>
87 #endif
88 #ifndef OPENSSL_NO_IDEA
89 # include <openssl/idea.h>
90 #endif
91 #ifndef OPENSSL_NO_SEED
92 # include <openssl/seed.h>
93 #endif
94 #ifndef OPENSSL_NO_BF
95 # include <openssl/blowfish.h>
96 #endif
97 #ifndef OPENSSL_NO_CAST
98 # include <openssl/cast.h>
99 #endif
100 #ifndef OPENSSL_NO_RSA
101 # include <openssl/rsa.h>
102 # include "./testrsa.h"
103 #endif
104 #include <openssl/x509.h>
105 #ifndef OPENSSL_NO_DSA
106 # include <openssl/dsa.h>
107 # include "./testdsa.h"
108 #endif
109 #ifndef OPENSSL_NO_EC
110 # include <openssl/ec.h>
111 #endif
112 #include <openssl/modes.h>
113
114 #ifndef HAVE_FORK
115 # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS)
116 # define HAVE_FORK 0
117 # else
118 # define HAVE_FORK 1
119 # endif
120 #endif
121
122 #if HAVE_FORK
123 # undef NO_FORK
124 #else
125 # define NO_FORK
126 #endif
127
128 #undef BUFSIZE
129 #define BUFSIZE (1024*16+1)
130 #define MAX_MISALIGNMENT 63
131
132 #define ALGOR_NUM 30
133 #define SIZE_NUM 6
134 #define PRIME_NUM 3
135 #define RSA_NUM 7
136 #define DSA_NUM 3
137
138 #define EC_NUM 17
139 #define MAX_ECDH_SIZE 256
140 #define MISALIGN 64
141
142 static volatile int run = 0;
143
144 static int mr = 0;
145 static int usertime = 1;
146
147 typedef struct loopargs_st {
148 ASYNC_JOB *inprogress_job;
149 ASYNC_WAIT_CTX *wait_ctx;
150 unsigned char *buf;
151 unsigned char *buf2;
152 unsigned char *buf_malloc;
153 unsigned char *buf2_malloc;
154 unsigned int siglen;
155 #ifndef OPENSSL_NO_RSA
156 RSA *rsa_key[RSA_NUM];
157 #endif
158 #ifndef OPENSSL_NO_DSA
159 DSA *dsa_key[DSA_NUM];
160 #endif
161 #ifndef OPENSSL_NO_EC
162 EC_KEY *ecdsa[EC_NUM];
163 EVP_PKEY_CTX *ecdh_ctx[EC_NUM];
164 unsigned char *secret_a;
165 unsigned char *secret_b;
166 size_t outlen[EC_NUM];
167 #endif
168 EVP_CIPHER_CTX *ctx;
169 HMAC_CTX *hctx;
170 GCM128_CONTEXT *gcm_ctx;
171 } loopargs_t;
172
173 #ifndef OPENSSL_NO_MD2
174 static int EVP_Digest_MD2_loop(void *args);
175 #endif
176
177 #ifndef OPENSSL_NO_MDC2
178 static int EVP_Digest_MDC2_loop(void *args);
179 #endif
180 #ifndef OPENSSL_NO_MD4
181 static int EVP_Digest_MD4_loop(void *args);
182 #endif
183 #ifndef OPENSSL_NO_MD5
184 static int MD5_loop(void *args);
185 static int HMAC_loop(void *args);
186 #endif
187 static int SHA1_loop(void *args);
188 static int SHA256_loop(void *args);
189 static int SHA512_loop(void *args);
190 #ifndef OPENSSL_NO_WHIRLPOOL
191 static int WHIRLPOOL_loop(void *args);
192 #endif
193 #ifndef OPENSSL_NO_RMD160
194 static int EVP_Digest_RMD160_loop(void *args);
195 #endif
196 #ifndef OPENSSL_NO_RC4
197 static int RC4_loop(void *args);
198 #endif
199 #ifndef OPENSSL_NO_DES
200 static int DES_ncbc_encrypt_loop(void *args);
201 static int DES_ede3_cbc_encrypt_loop(void *args);
202 #endif
203 static int AES_cbc_128_encrypt_loop(void *args);
204 static int AES_cbc_192_encrypt_loop(void *args);
205 static int AES_ige_128_encrypt_loop(void *args);
206 static int AES_cbc_256_encrypt_loop(void *args);
207 static int AES_ige_192_encrypt_loop(void *args);
208 static int AES_ige_256_encrypt_loop(void *args);
209 static int CRYPTO_gcm128_aad_loop(void *args);
210 static int EVP_Update_loop(void *args);
211 static int EVP_Digest_loop(void *args);
212 #ifndef OPENSSL_NO_RSA
213 static int RSA_sign_loop(void *args);
214 static int RSA_verify_loop(void *args);
215 #endif
216 #ifndef OPENSSL_NO_DSA
217 static int DSA_sign_loop(void *args);
218 static int DSA_verify_loop(void *args);
219 #endif
220 #ifndef OPENSSL_NO_EC
221 static int ECDSA_sign_loop(void *args);
222 static int ECDSA_verify_loop(void *args);
223 #endif
224 static int run_benchmark(int async_jobs, int (*loop_function) (void *),
225 loopargs_t * loopargs);
226
227 static double Time_F(int s);
228 static void print_message(const char *s, long num, int length);
229 static void pkey_print_message(const char *str, const char *str2,
230 long num, int bits, int sec);
231 static void print_result(int alg, int run_no, int count, double time_used);
232 #ifndef NO_FORK
233 static int do_multi(int multi);
234 #endif
235
236 static const char *names[ALGOR_NUM] = {
237 "md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
238 "des cbc", "des ede3", "idea cbc", "seed cbc",
239 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
240 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
241 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
242 "evp", "sha256", "sha512", "whirlpool",
243 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash"
244 };
245
246 static double results[ALGOR_NUM][SIZE_NUM];
247
248 static const int lengths[SIZE_NUM] = {
249 16, 64, 256, 1024, 8 * 1024, 16 * 1024
250 };
251
252 #ifndef OPENSSL_NO_RSA
253 static double rsa_results[RSA_NUM][2];
254 #endif
255 #ifndef OPENSSL_NO_DSA
256 static double dsa_results[DSA_NUM][2];
257 #endif
258 #ifndef OPENSSL_NO_EC
259 static double ecdsa_results[EC_NUM][2];
260 static double ecdh_results[EC_NUM][1];
261 #endif
262
263 #if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
264 static const char rnd_seed[] =
265 "string to make the random number generator think it has entropy";
266 #endif
267
268 #ifdef SIGALRM
269 # if defined(__STDC__) || defined(sgi) || defined(_AIX)
270 # define SIGRETTYPE void
271 # else
272 # define SIGRETTYPE int
273 # endif
274
275 static SIGRETTYPE sig_done(int sig);
276 static SIGRETTYPE sig_done(int sig)
277 {
278 signal(SIGALRM, sig_done);
279 run = 0;
280 }
281 #endif
282
283 #define START 0
284 #define STOP 1
285
286 #if defined(_WIN32)
287
288 # if !defined(SIGALRM)
289 # define SIGALRM
290 # endif
291 static unsigned int lapse, schlock;
292 static void alarm_win32(unsigned int secs)
293 {
294 lapse = secs * 1000;
295 }
296
297 # define alarm alarm_win32
298
299 static DWORD WINAPI sleepy(VOID * arg)
300 {
301 schlock = 1;
302 Sleep(lapse);
303 run = 0;
304 return 0;
305 }
306
307 static double Time_F(int s)
308 {
309 double ret;
310 static HANDLE thr;
311
312 if (s == START) {
313 schlock = 0;
314 thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL);
315 if (thr == NULL) {
316 DWORD err = GetLastError();
317 BIO_printf(bio_err, "unable to CreateThread (%lu)", err);
318 ExitProcess(err);
319 }
320 while (!schlock)
321 Sleep(0); /* scheduler spinlock */
322 ret = app_tminterval(s, usertime);
323 } else {
324 ret = app_tminterval(s, usertime);
325 if (run)
326 TerminateThread(thr, 0);
327 CloseHandle(thr);
328 }
329
330 return ret;
331 }
332 #else
333
334 static double Time_F(int s)
335 {
336 double ret = app_tminterval(s, usertime);
337 if (s == STOP)
338 alarm(0);
339 return ret;
340 }
341 #endif
342
343 static void multiblock_speed(const EVP_CIPHER *evp_cipher);
344
345 static int found(const char *name, const OPT_PAIR *pairs, int *result)
346 {
347 for (; pairs->name; pairs++)
348 if (strcmp(name, pairs->name) == 0) {
349 *result = pairs->retval;
350 return 1;
351 }
352 return 0;
353 }
354
355 typedef enum OPTION_choice {
356 OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
357 OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
358 OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS
359 } OPTION_CHOICE;
360
361 const OPTIONS speed_options[] = {
362 {OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
363 {OPT_HELP_STR, 1, '-', "Valid options are:\n"},
364 {"help", OPT_HELP, '-', "Display this summary"},
365 {"evp", OPT_EVP, 's', "Use specified EVP cipher"},
366 {"decrypt", OPT_DECRYPT, '-',
367 "Time decryption instead of encryption (only EVP)"},
368 {"mr", OPT_MR, '-', "Produce machine readable output"},
369 {"mb", OPT_MB, '-',
370 "Enable (tls1.1) multi-block mode on evp_cipher requested with -evp"},
371 {"misalign", OPT_MISALIGN, 'n', "Amount to mis-align buffers"},
372 {"elapsed", OPT_ELAPSED, '-',
373 "Measure time in real time instead of CPU user time"},
374 #ifndef NO_FORK
375 {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
376 #endif
377 #ifndef OPENSSL_NO_ASYNC
378 {"async_jobs", OPT_ASYNCJOBS, 'p',
379 "Enable async mode and start pnum jobs"},
380 #endif
381 #ifndef OPENSSL_NO_ENGINE
382 {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
383 #endif
384 {NULL},
385 };
386
387 #define D_MD2 0
388 #define D_MDC2 1
389 #define D_MD4 2
390 #define D_MD5 3
391 #define D_HMAC 4
392 #define D_SHA1 5
393 #define D_RMD160 6
394 #define D_RC4 7
395 #define D_CBC_DES 8
396 #define D_EDE3_DES 9
397 #define D_CBC_IDEA 10
398 #define D_CBC_SEED 11
399 #define D_CBC_RC2 12
400 #define D_CBC_RC5 13
401 #define D_CBC_BF 14
402 #define D_CBC_CAST 15
403 #define D_CBC_128_AES 16
404 #define D_CBC_192_AES 17
405 #define D_CBC_256_AES 18
406 #define D_CBC_128_CML 19
407 #define D_CBC_192_CML 20
408 #define D_CBC_256_CML 21
409 #define D_EVP 22
410 #define D_SHA256 23
411 #define D_SHA512 24
412 #define D_WHIRLPOOL 25
413 #define D_IGE_128_AES 26
414 #define D_IGE_192_AES 27
415 #define D_IGE_256_AES 28
416 #define D_GHASH 29
417 static OPT_PAIR doit_choices[] = {
418 #ifndef OPENSSL_NO_MD2
419 {"md2", D_MD2},
420 #endif
421 #ifndef OPENSSL_NO_MDC2
422 {"mdc2", D_MDC2},
423 #endif
424 #ifndef OPENSSL_NO_MD4
425 {"md4", D_MD4},
426 #endif
427 #ifndef OPENSSL_NO_MD5
428 {"md5", D_MD5},
429 {"hmac", D_HMAC},
430 #endif
431 {"sha1", D_SHA1},
432 {"sha256", D_SHA256},
433 {"sha512", D_SHA512},
434 #ifndef OPENSSL_NO_WHIRLPOOL
435 {"whirlpool", D_WHIRLPOOL},
436 #endif
437 #ifndef OPENSSL_NO_RMD160
438 {"ripemd", D_RMD160},
439 {"rmd160", D_RMD160},
440 {"ripemd160", D_RMD160},
441 #endif
442 #ifndef OPENSSL_NO_RC4
443 {"rc4", D_RC4},
444 #endif
445 #ifndef OPENSSL_NO_DES
446 {"des-cbc", D_CBC_DES},
447 {"des-ede3", D_EDE3_DES},
448 #endif
449 {"aes-128-cbc", D_CBC_128_AES},
450 {"aes-192-cbc", D_CBC_192_AES},
451 {"aes-256-cbc", D_CBC_256_AES},
452 {"aes-128-ige", D_IGE_128_AES},
453 {"aes-192-ige", D_IGE_192_AES},
454 {"aes-256-ige", D_IGE_256_AES},
455 #ifndef OPENSSL_NO_RC2
456 {"rc2-cbc", D_CBC_RC2},
457 {"rc2", D_CBC_RC2},
458 #endif
459 #ifndef OPENSSL_NO_RC5
460 {"rc5-cbc", D_CBC_RC5},
461 {"rc5", D_CBC_RC5},
462 #endif
463 #ifndef OPENSSL_NO_IDEA
464 {"idea-cbc", D_CBC_IDEA},
465 {"idea", D_CBC_IDEA},
466 #endif
467 #ifndef OPENSSL_NO_SEED
468 {"seed-cbc", D_CBC_SEED},
469 {"seed", D_CBC_SEED},
470 #endif
471 #ifndef OPENSSL_NO_BF
472 {"bf-cbc", D_CBC_BF},
473 {"blowfish", D_CBC_BF},
474 {"bf", D_CBC_BF},
475 #endif
476 #ifndef OPENSSL_NO_CAST
477 {"cast-cbc", D_CBC_CAST},
478 {"cast", D_CBC_CAST},
479 {"cast5", D_CBC_CAST},
480 #endif
481 {"ghash", D_GHASH},
482 {NULL}
483 };
484
485 #ifndef OPENSSL_NO_DSA
486 # define R_DSA_512 0
487 # define R_DSA_1024 1
488 # define R_DSA_2048 2
489 static OPT_PAIR dsa_choices[] = {
490 {"dsa512", R_DSA_512},
491 {"dsa1024", R_DSA_1024},
492 {"dsa2048", R_DSA_2048},
493 {NULL},
494 };
495 #endif
496
497 #define R_RSA_512 0
498 #define R_RSA_1024 1
499 #define R_RSA_2048 2
500 #define R_RSA_3072 3
501 #define R_RSA_4096 4
502 #define R_RSA_7680 5
503 #define R_RSA_15360 6
504 static OPT_PAIR rsa_choices[] = {
505 {"rsa512", R_RSA_512},
506 {"rsa1024", R_RSA_1024},
507 {"rsa2048", R_RSA_2048},
508 {"rsa3072", R_RSA_3072},
509 {"rsa4096", R_RSA_4096},
510 {"rsa7680", R_RSA_7680},
511 {"rsa15360", R_RSA_15360},
512 {NULL}
513 };
514
515 #define R_EC_P160 0
516 #define R_EC_P192 1
517 #define R_EC_P224 2
518 #define R_EC_P256 3
519 #define R_EC_P384 4
520 #define R_EC_P521 5
521 #define R_EC_K163 6
522 #define R_EC_K233 7
523 #define R_EC_K283 8
524 #define R_EC_K409 9
525 #define R_EC_K571 10
526 #define R_EC_B163 11
527 #define R_EC_B233 12
528 #define R_EC_B283 13
529 #define R_EC_B409 14
530 #define R_EC_B571 15
531 #define R_EC_X25519 16
532 #ifndef OPENSSL_NO_EC
533 static OPT_PAIR ecdsa_choices[] = {
534 {"ecdsap160", R_EC_P160},
535 {"ecdsap192", R_EC_P192},
536 {"ecdsap224", R_EC_P224},
537 {"ecdsap256", R_EC_P256},
538 {"ecdsap384", R_EC_P384},
539 {"ecdsap521", R_EC_P521},
540 {"ecdsak163", R_EC_K163},
541 {"ecdsak233", R_EC_K233},
542 {"ecdsak283", R_EC_K283},
543 {"ecdsak409", R_EC_K409},
544 {"ecdsak571", R_EC_K571},
545 {"ecdsab163", R_EC_B163},
546 {"ecdsab233", R_EC_B233},
547 {"ecdsab283", R_EC_B283},
548 {"ecdsab409", R_EC_B409},
549 {"ecdsab571", R_EC_B571},
550 {NULL}
551 };
552
553 static OPT_PAIR ecdh_choices[] = {
554 {"ecdhp160", R_EC_P160},
555 {"ecdhp192", R_EC_P192},
556 {"ecdhp224", R_EC_P224},
557 {"ecdhp256", R_EC_P256},
558 {"ecdhp384", R_EC_P384},
559 {"ecdhp521", R_EC_P521},
560 {"ecdhk163", R_EC_K163},
561 {"ecdhk233", R_EC_K233},
562 {"ecdhk283", R_EC_K283},
563 {"ecdhk409", R_EC_K409},
564 {"ecdhk571", R_EC_K571},
565 {"ecdhb163", R_EC_B163},
566 {"ecdhb233", R_EC_B233},
567 {"ecdhb283", R_EC_B283},
568 {"ecdhb409", R_EC_B409},
569 {"ecdhb571", R_EC_B571},
570 {"ecdhx25519", R_EC_X25519},
571 {NULL}
572 };
573 #endif
574
575 #ifndef SIGALRM
576 # define COND(d) (count < (d))
577 # define COUNT(d) (d)
578 #else
579 # define COND(unused_cond) (run && count<0x7fffffff)
580 # define COUNT(d) (count)
581 #endif /* SIGALRM */
582
583 static int testnum;
584
585 /* Nb of iterations to do per algorithm and key-size */
586 static long c[ALGOR_NUM][SIZE_NUM];
587
588 #ifndef OPENSSL_NO_MD2
589 static int EVP_Digest_MD2_loop(void *args)
590 {
591 loopargs_t *tempargs = *(loopargs_t **) args;
592 unsigned char *buf = tempargs->buf;
593 unsigned char md2[MD2_DIGEST_LENGTH];
594 int count;
595
596 for (count = 0; COND(c[D_MD2][testnum]); count++) {
597 if (!EVP_Digest(buf, (size_t)lengths[testnum], md2, NULL, EVP_md2(),
598 NULL))
599 return -1;
600 }
601 return count;
602 }
603 #endif
604
605 #ifndef OPENSSL_NO_MDC2
606 static int EVP_Digest_MDC2_loop(void *args)
607 {
608 loopargs_t *tempargs = *(loopargs_t **) args;
609 unsigned char *buf = tempargs->buf;
610 unsigned char mdc2[MDC2_DIGEST_LENGTH];
611 int count;
612
613 for (count = 0; COND(c[D_MDC2][testnum]); count++) {
614 if (!EVP_Digest(buf, (size_t)lengths[testnum], mdc2, NULL, EVP_mdc2(),
615 NULL))
616 return -1;
617 }
618 return count;
619 }
620 #endif
621
622 #ifndef OPENSSL_NO_MD4
623 static int EVP_Digest_MD4_loop(void *args)
624 {
625 loopargs_t *tempargs = *(loopargs_t **) args;
626 unsigned char *buf = tempargs->buf;
627 unsigned char md4[MD4_DIGEST_LENGTH];
628 int count;
629
630 for (count = 0; COND(c[D_MD4][testnum]); count++) {
631 if (!EVP_Digest(buf, (size_t)lengths[testnum], md4, NULL, EVP_md4(),
632 NULL))
633 return -1;
634 }
635 return count;
636 }
637 #endif
638
639 #ifndef OPENSSL_NO_MD5
640 static int MD5_loop(void *args)
641 {
642 loopargs_t *tempargs = *(loopargs_t **) args;
643 unsigned char *buf = tempargs->buf;
644 unsigned char md5[MD5_DIGEST_LENGTH];
645 int count;
646 for (count = 0; COND(c[D_MD5][testnum]); count++)
647 MD5(buf, lengths[testnum], md5);
648 return count;
649 }
650
651 static int HMAC_loop(void *args)
652 {
653 loopargs_t *tempargs = *(loopargs_t **) args;
654 unsigned char *buf = tempargs->buf;
655 HMAC_CTX *hctx = tempargs->hctx;
656 unsigned char hmac[MD5_DIGEST_LENGTH];
657 int count;
658
659 for (count = 0; COND(c[D_HMAC][testnum]); count++) {
660 HMAC_Init_ex(hctx, NULL, 0, NULL, NULL);
661 HMAC_Update(hctx, buf, lengths[testnum]);
662 HMAC_Final(hctx, hmac, NULL);
663 }
664 return count;
665 }
666 #endif
667
668 static int SHA1_loop(void *args)
669 {
670 loopargs_t *tempargs = *(loopargs_t **) args;
671 unsigned char *buf = tempargs->buf;
672 unsigned char sha[SHA_DIGEST_LENGTH];
673 int count;
674 for (count = 0; COND(c[D_SHA1][testnum]); count++)
675 SHA1(buf, lengths[testnum], sha);
676 return count;
677 }
678
679 static int SHA256_loop(void *args)
680 {
681 loopargs_t *tempargs = *(loopargs_t **) args;
682 unsigned char *buf = tempargs->buf;
683 unsigned char sha256[SHA256_DIGEST_LENGTH];
684 int count;
685 for (count = 0; COND(c[D_SHA256][testnum]); count++)
686 SHA256(buf, lengths[testnum], sha256);
687 return count;
688 }
689
690 static int SHA512_loop(void *args)
691 {
692 loopargs_t *tempargs = *(loopargs_t **) args;
693 unsigned char *buf = tempargs->buf;
694 unsigned char sha512[SHA512_DIGEST_LENGTH];
695 int count;
696 for (count = 0; COND(c[D_SHA512][testnum]); count++)
697 SHA512(buf, lengths[testnum], sha512);
698 return count;
699 }
700
701 #ifndef OPENSSL_NO_WHIRLPOOL
702 static int WHIRLPOOL_loop(void *args)
703 {
704 loopargs_t *tempargs = *(loopargs_t **) args;
705 unsigned char *buf = tempargs->buf;
706 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
707 int count;
708 for (count = 0; COND(c[D_WHIRLPOOL][testnum]); count++)
709 WHIRLPOOL(buf, lengths[testnum], whirlpool);
710 return count;
711 }
712 #endif
713
714 #ifndef OPENSSL_NO_RMD160
715 static int EVP_Digest_RMD160_loop(void *args)
716 {
717 loopargs_t *tempargs = *(loopargs_t **) args;
718 unsigned char *buf = tempargs->buf;
719 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
720 int count;
721 for (count = 0; COND(c[D_RMD160][testnum]); count++) {
722 if (!EVP_Digest(buf, (size_t)lengths[testnum], &(rmd160[0]),
723 NULL, EVP_ripemd160(), NULL))
724 return -1;
725 }
726 return count;
727 }
728 #endif
729
730 #ifndef OPENSSL_NO_RC4
731 static RC4_KEY rc4_ks;
732 static int RC4_loop(void *args)
733 {
734 loopargs_t *tempargs = *(loopargs_t **) args;
735 unsigned char *buf = tempargs->buf;
736 int count;
737 for (count = 0; COND(c[D_RC4][testnum]); count++)
738 RC4(&rc4_ks, (size_t)lengths[testnum], buf, buf);
739 return count;
740 }
741 #endif
742
743 #ifndef OPENSSL_NO_DES
744 static unsigned char DES_iv[8];
745 static DES_key_schedule sch;
746 static DES_key_schedule sch2;
747 static DES_key_schedule sch3;
748 static int DES_ncbc_encrypt_loop(void *args)
749 {
750 loopargs_t *tempargs = *(loopargs_t **) args;
751 unsigned char *buf = tempargs->buf;
752 int count;
753 for (count = 0; COND(c[D_CBC_DES][testnum]); count++)
754 DES_ncbc_encrypt(buf, buf, lengths[testnum], &sch,
755 &DES_iv, DES_ENCRYPT);
756 return count;
757 }
758
759 static int DES_ede3_cbc_encrypt_loop(void *args)
760 {
761 loopargs_t *tempargs = *(loopargs_t **) args;
762 unsigned char *buf = tempargs->buf;
763 int count;
764 for (count = 0; COND(c[D_EDE3_DES][testnum]); count++)
765 DES_ede3_cbc_encrypt(buf, buf, lengths[testnum],
766 &sch, &sch2, &sch3, &DES_iv, DES_ENCRYPT);
767 return count;
768 }
769 #endif
770
771 #define MAX_BLOCK_SIZE 128
772
773 static unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
774 static AES_KEY aes_ks1, aes_ks2, aes_ks3;
775 static int AES_cbc_128_encrypt_loop(void *args)
776 {
777 loopargs_t *tempargs = *(loopargs_t **) args;
778 unsigned char *buf = tempargs->buf;
779 int count;
780 for (count = 0; COND(c[D_CBC_128_AES][testnum]); count++)
781 AES_cbc_encrypt(buf, buf,
782 (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
783 return count;
784 }
785
786 static int AES_cbc_192_encrypt_loop(void *args)
787 {
788 loopargs_t *tempargs = *(loopargs_t **) args;
789 unsigned char *buf = tempargs->buf;
790 int count;
791 for (count = 0; COND(c[D_CBC_192_AES][testnum]); count++)
792 AES_cbc_encrypt(buf, buf,
793 (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
794 return count;
795 }
796
797 static int AES_cbc_256_encrypt_loop(void *args)
798 {
799 loopargs_t *tempargs = *(loopargs_t **) args;
800 unsigned char *buf = tempargs->buf;
801 int count;
802 for (count = 0; COND(c[D_CBC_256_AES][testnum]); count++)
803 AES_cbc_encrypt(buf, buf,
804 (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
805 return count;
806 }
807
808 static int AES_ige_128_encrypt_loop(void *args)
809 {
810 loopargs_t *tempargs = *(loopargs_t **) args;
811 unsigned char *buf = tempargs->buf;
812 unsigned char *buf2 = tempargs->buf2;
813 int count;
814 for (count = 0; COND(c[D_IGE_128_AES][testnum]); count++)
815 AES_ige_encrypt(buf, buf2,
816 (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT);
817 return count;
818 }
819
820 static int AES_ige_192_encrypt_loop(void *args)
821 {
822 loopargs_t *tempargs = *(loopargs_t **) args;
823 unsigned char *buf = tempargs->buf;
824 unsigned char *buf2 = tempargs->buf2;
825 int count;
826 for (count = 0; COND(c[D_IGE_192_AES][testnum]); count++)
827 AES_ige_encrypt(buf, buf2,
828 (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT);
829 return count;
830 }
831
832 static int AES_ige_256_encrypt_loop(void *args)
833 {
834 loopargs_t *tempargs = *(loopargs_t **) args;
835 unsigned char *buf = tempargs->buf;
836 unsigned char *buf2 = tempargs->buf2;
837 int count;
838 for (count = 0; COND(c[D_IGE_256_AES][testnum]); count++)
839 AES_ige_encrypt(buf, buf2,
840 (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT);
841 return count;
842 }
843
844 static int CRYPTO_gcm128_aad_loop(void *args)
845 {
846 loopargs_t *tempargs = *(loopargs_t **) args;
847 unsigned char *buf = tempargs->buf;
848 GCM128_CONTEXT *gcm_ctx = tempargs->gcm_ctx;
849 int count;
850 for (count = 0; COND(c[D_GHASH][testnum]); count++)
851 CRYPTO_gcm128_aad(gcm_ctx, buf, lengths[testnum]);
852 return count;
853 }
854
855 static long save_count = 0;
856 static int decrypt = 0;
857 static int EVP_Update_loop(void *args)
858 {
859 loopargs_t *tempargs = *(loopargs_t **) args;
860 unsigned char *buf = tempargs->buf;
861 EVP_CIPHER_CTX *ctx = tempargs->ctx;
862 int outl, count;
863 #ifndef SIGALRM
864 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
865 #endif
866 if (decrypt)
867 for (count = 0; COND(nb_iter); count++)
868 EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
869 else
870 for (count = 0; COND(nb_iter); count++)
871 EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
872 if (decrypt)
873 EVP_DecryptFinal_ex(ctx, buf, &outl);
874 else
875 EVP_EncryptFinal_ex(ctx, buf, &outl);
876 return count;
877 }
878
879 static const EVP_MD *evp_md = NULL;
880 static int EVP_Digest_loop(void *args)
881 {
882 loopargs_t *tempargs = *(loopargs_t **) args;
883 unsigned char *buf = tempargs->buf;
884 unsigned char md[EVP_MAX_MD_SIZE];
885 int count;
886 #ifndef SIGALRM
887 int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
888 #endif
889
890 for (count = 0; COND(nb_iter); count++) {
891 if (!EVP_Digest(buf, lengths[testnum], md, NULL, evp_md, NULL))
892 return -1;
893 }
894 return count;
895 }
896
897 #ifndef OPENSSL_NO_RSA
898 static long rsa_c[RSA_NUM][2]; /* # RSA iteration test */
899
900 static int RSA_sign_loop(void *args)
901 {
902 loopargs_t *tempargs = *(loopargs_t **) args;
903 unsigned char *buf = tempargs->buf;
904 unsigned char *buf2 = tempargs->buf2;
905 unsigned int *rsa_num = &tempargs->siglen;
906 RSA **rsa_key = tempargs->rsa_key;
907 int ret, count;
908 for (count = 0; COND(rsa_c[testnum][0]); count++) {
909 ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
910 if (ret == 0) {
911 BIO_printf(bio_err, "RSA sign failure\n");
912 ERR_print_errors(bio_err);
913 count = -1;
914 break;
915 }
916 }
917 return count;
918 }
919
920 static int RSA_verify_loop(void *args)
921 {
922 loopargs_t *tempargs = *(loopargs_t **) args;
923 unsigned char *buf = tempargs->buf;
924 unsigned char *buf2 = tempargs->buf2;
925 unsigned int rsa_num = tempargs->siglen;
926 RSA **rsa_key = tempargs->rsa_key;
927 int ret, count;
928 for (count = 0; COND(rsa_c[testnum][1]); count++) {
929 ret =
930 RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]);
931 if (ret <= 0) {
932 BIO_printf(bio_err, "RSA verify failure\n");
933 ERR_print_errors(bio_err);
934 count = -1;
935 break;
936 }
937 }
938 return count;
939 }
940 #endif
941
942 #ifndef OPENSSL_NO_DSA
943 static long dsa_c[DSA_NUM][2];
944 static int DSA_sign_loop(void *args)
945 {
946 loopargs_t *tempargs = *(loopargs_t **) args;
947 unsigned char *buf = tempargs->buf;
948 unsigned char *buf2 = tempargs->buf2;
949 DSA **dsa_key = tempargs->dsa_key;
950 unsigned int *siglen = &tempargs->siglen;
951 int ret, count;
952 for (count = 0; COND(dsa_c[testnum][0]); count++) {
953 ret = DSA_sign(0, buf, 20, buf2, siglen, dsa_key[testnum]);
954 if (ret == 0) {
955 BIO_printf(bio_err, "DSA sign failure\n");
956 ERR_print_errors(bio_err);
957 count = -1;
958 break;
959 }
960 }
961 return count;
962 }
963
964 static int DSA_verify_loop(void *args)
965 {
966 loopargs_t *tempargs = *(loopargs_t **) args;
967 unsigned char *buf = tempargs->buf;
968 unsigned char *buf2 = tempargs->buf2;
969 DSA **dsa_key = tempargs->dsa_key;
970 unsigned int siglen = tempargs->siglen;
971 int ret, count;
972 for (count = 0; COND(dsa_c[testnum][1]); count++) {
973 ret = DSA_verify(0, buf, 20, buf2, siglen, dsa_key[testnum]);
974 if (ret <= 0) {
975 BIO_printf(bio_err, "DSA verify failure\n");
976 ERR_print_errors(bio_err);
977 count = -1;
978 break;
979 }
980 }
981 return count;
982 }
983 #endif
984
985 #ifndef OPENSSL_NO_EC
986 static long ecdsa_c[EC_NUM][2];
987 static int ECDSA_sign_loop(void *args)
988 {
989 loopargs_t *tempargs = *(loopargs_t **) args;
990 unsigned char *buf = tempargs->buf;
991 EC_KEY **ecdsa = tempargs->ecdsa;
992 unsigned char *ecdsasig = tempargs->buf2;
993 unsigned int *ecdsasiglen = &tempargs->siglen;
994 int ret, count;
995 for (count = 0; COND(ecdsa_c[testnum][0]); count++) {
996 ret = ECDSA_sign(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
997 if (ret == 0) {
998 BIO_printf(bio_err, "ECDSA sign failure\n");
999 ERR_print_errors(bio_err);
1000 count = -1;
1001 break;
1002 }
1003 }
1004 return count;
1005 }
1006
1007 static int ECDSA_verify_loop(void *args)
1008 {
1009 loopargs_t *tempargs = *(loopargs_t **) args;
1010 unsigned char *buf = tempargs->buf;
1011 EC_KEY **ecdsa = tempargs->ecdsa;
1012 unsigned char *ecdsasig = tempargs->buf2;
1013 unsigned int ecdsasiglen = tempargs->siglen;
1014 int ret, count;
1015 for (count = 0; COND(ecdsa_c[testnum][1]); count++) {
1016 ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]);
1017 if (ret != 1) {
1018 BIO_printf(bio_err, "ECDSA verify failure\n");
1019 ERR_print_errors(bio_err);
1020 count = -1;
1021 break;
1022 }
1023 }
1024 return count;
1025 }
1026
1027 /* ******************************************************************** */
1028 static long ecdh_c[EC_NUM][1];
1029
1030 static int ECDH_EVP_derive_key_loop(void *args)
1031 {
1032 loopargs_t *tempargs = *(loopargs_t **) args;
1033 EVP_PKEY_CTX *ctx = tempargs->ecdh_ctx[testnum];
1034 unsigned char *derived_secret = tempargs->secret_a;
1035 int count;
1036 size_t *outlen = &(tempargs->outlen[testnum]);
1037
1038 for (count = 0; COND(ecdh_c[testnum][0]); count++)
1039 EVP_PKEY_derive(ctx, derived_secret, outlen);
1040
1041 return count;
1042 }
1043
1044 #endif /* OPENSSL_NO_EC */
1045
1046 static int run_benchmark(int async_jobs,
1047 int (*loop_function) (void *), loopargs_t * loopargs)
1048 {
1049 int job_op_count = 0;
1050 int total_op_count = 0;
1051 int num_inprogress = 0;
1052 int error = 0, i = 0, ret = 0;
1053 OSSL_ASYNC_FD job_fd = 0;
1054 size_t num_job_fds = 0;
1055
1056 run = 1;
1057
1058 if (async_jobs == 0) {
1059 return loop_function((void *)&loopargs);
1060 }
1061
1062 for (i = 0; i < async_jobs && !error; i++) {
1063 loopargs_t *looparg_item = loopargs + i;
1064
1065 /* Copy pointer content (looparg_t item address) into async context */
1066 ret = ASYNC_start_job(&loopargs[i].inprogress_job, loopargs[i].wait_ctx,
1067 &job_op_count, loop_function,
1068 (void *)&looparg_item, sizeof(looparg_item));
1069 switch (ret) {
1070 case ASYNC_PAUSE:
1071 ++num_inprogress;
1072 break;
1073 case ASYNC_FINISH:
1074 if (job_op_count == -1) {
1075 error = 1;
1076 } else {
1077 total_op_count += job_op_count;
1078 }
1079 break;
1080 case ASYNC_NO_JOBS:
1081 case ASYNC_ERR:
1082 BIO_printf(bio_err, "Failure in the job\n");
1083 ERR_print_errors(bio_err);
1084 error = 1;
1085 break;
1086 }
1087 }
1088
1089 while (num_inprogress > 0) {
1090 #if defined(OPENSSL_SYS_WINDOWS)
1091 DWORD avail = 0;
1092 #elif defined(OPENSSL_SYS_UNIX)
1093 int select_result = 0;
1094 OSSL_ASYNC_FD max_fd = 0;
1095 fd_set waitfdset;
1096
1097 FD_ZERO(&waitfdset);
1098
1099 for (i = 0; i < async_jobs && num_inprogress > 0; i++) {
1100 if (loopargs[i].inprogress_job == NULL)
1101 continue;
1102
1103 if (!ASYNC_WAIT_CTX_get_all_fds
1104 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1105 || num_job_fds > 1) {
1106 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1107 ERR_print_errors(bio_err);
1108 error = 1;
1109 break;
1110 }
1111 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1112 &num_job_fds);
1113 FD_SET(job_fd, &waitfdset);
1114 if (job_fd > max_fd)
1115 max_fd = job_fd;
1116 }
1117
1118 if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) {
1119 BIO_printf(bio_err,
1120 "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). "
1121 "Decrease the value of async_jobs\n",
1122 max_fd, FD_SETSIZE);
1123 ERR_print_errors(bio_err);
1124 error = 1;
1125 break;
1126 }
1127
1128 select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL);
1129 if (select_result == -1 && errno == EINTR)
1130 continue;
1131
1132 if (select_result == -1) {
1133 BIO_printf(bio_err, "Failure in the select\n");
1134 ERR_print_errors(bio_err);
1135 error = 1;
1136 break;
1137 }
1138
1139 if (select_result == 0)
1140 continue;
1141 #endif
1142
1143 for (i = 0; i < async_jobs; i++) {
1144 if (loopargs[i].inprogress_job == NULL)
1145 continue;
1146
1147 if (!ASYNC_WAIT_CTX_get_all_fds
1148 (loopargs[i].wait_ctx, NULL, &num_job_fds)
1149 || num_job_fds > 1) {
1150 BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n");
1151 ERR_print_errors(bio_err);
1152 error = 1;
1153 break;
1154 }
1155 ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd,
1156 &num_job_fds);
1157
1158 #if defined(OPENSSL_SYS_UNIX)
1159 if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
1160 continue;
1161 #elif defined(OPENSSL_SYS_WINDOWS)
1162 if (num_job_fds == 1
1163 && !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL)
1164 && avail > 0)
1165 continue;
1166 #endif
1167
1168 ret = ASYNC_start_job(&loopargs[i].inprogress_job,
1169 loopargs[i].wait_ctx, &job_op_count,
1170 loop_function, (void *)(loopargs + i),
1171 sizeof(loopargs_t));
1172 switch (ret) {
1173 case ASYNC_PAUSE:
1174 break;
1175 case ASYNC_FINISH:
1176 if (job_op_count == -1) {
1177 error = 1;
1178 } else {
1179 total_op_count += job_op_count;
1180 }
1181 --num_inprogress;
1182 loopargs[i].inprogress_job = NULL;
1183 break;
1184 case ASYNC_NO_JOBS:
1185 case ASYNC_ERR:
1186 --num_inprogress;
1187 loopargs[i].inprogress_job = NULL;
1188 BIO_printf(bio_err, "Failure in the job\n");
1189 ERR_print_errors(bio_err);
1190 error = 1;
1191 break;
1192 }
1193 }
1194 }
1195
1196 return error ? -1 : total_op_count;
1197 }
1198
1199 int speed_main(int argc, char **argv)
1200 {
1201 ENGINE *e = NULL;
1202 loopargs_t *loopargs = NULL;
1203 int async_init = 0;
1204 int loopargs_len = 0;
1205 char *prog;
1206 const char *engine_id = NULL;
1207 const EVP_CIPHER *evp_cipher = NULL;
1208 double d = 0.0;
1209 OPTION_CHOICE o;
1210 int multiblock = 0, pr_header = 0;
1211 int doit[ALGOR_NUM] = { 0 };
1212 int ret = 1, i, k, misalign = 0;
1213 long count = 0;
1214 #ifndef NO_FORK
1215 int multi = 0;
1216 #endif
1217 int async_jobs = 0;
1218 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) \
1219 || !defined(OPENSSL_NO_EC)
1220 long rsa_count = 1;
1221 #endif
1222
1223 /* What follows are the buffers and key material. */
1224 #ifndef OPENSSL_NO_RC5
1225 RC5_32_KEY rc5_ks;
1226 #endif
1227 #ifndef OPENSSL_NO_RC2
1228 RC2_KEY rc2_ks;
1229 #endif
1230 #ifndef OPENSSL_NO_IDEA
1231 IDEA_KEY_SCHEDULE idea_ks;
1232 #endif
1233 #ifndef OPENSSL_NO_SEED
1234 SEED_KEY_SCHEDULE seed_ks;
1235 #endif
1236 #ifndef OPENSSL_NO_BF
1237 BF_KEY bf_ks;
1238 #endif
1239 #ifndef OPENSSL_NO_CAST
1240 CAST_KEY cast_ks;
1241 #endif
1242 static const unsigned char key16[16] = {
1243 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1244 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1245 };
1246 static const unsigned char key24[24] = {
1247 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1248 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1249 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1250 };
1251 static const unsigned char key32[32] = {
1252 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1253 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1254 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1255 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1256 };
1257 #ifndef OPENSSL_NO_CAMELLIA
1258 static const unsigned char ckey24[24] = {
1259 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1260 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1261 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1262 };
1263 static const unsigned char ckey32[32] = {
1264 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1265 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1266 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1267 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
1268 };
1269 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
1270 #endif
1271 #ifndef OPENSSL_NO_DES
1272 static DES_cblock key = {
1273 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0
1274 };
1275 static DES_cblock key2 = {
1276 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
1277 };
1278 static DES_cblock key3 = {
1279 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
1280 };
1281 #endif
1282 #ifndef OPENSSL_NO_RSA
1283 static const unsigned int rsa_bits[RSA_NUM] = {
1284 512, 1024, 2048, 3072, 4096, 7680, 15360
1285 };
1286 static const unsigned char *rsa_data[RSA_NUM] = {
1287 test512, test1024, test2048, test3072, test4096, test7680, test15360
1288 };
1289 static const int rsa_data_length[RSA_NUM] = {
1290 sizeof(test512), sizeof(test1024),
1291 sizeof(test2048), sizeof(test3072),
1292 sizeof(test4096), sizeof(test7680),
1293 sizeof(test15360)
1294 };
1295 int rsa_doit[RSA_NUM] = { 0 };
1296 #endif
1297 #ifndef OPENSSL_NO_DSA
1298 static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
1299 int dsa_doit[DSA_NUM] = { 0 };
1300 #endif
1301 #ifndef OPENSSL_NO_EC
1302 /*
1303 * We only test over the following curves as they are representative, To
1304 * add tests over more curves, simply add the curve NID and curve name to
1305 * the following arrays and increase the EC_NUM value accordingly.
1306 */
1307 static const unsigned int test_curves[EC_NUM] = {
1308 /* Prime Curves */
1309 NID_secp160r1, NID_X9_62_prime192v1, NID_secp224r1,
1310 NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1,
1311 /* Binary Curves */
1312 NID_sect163k1, NID_sect233k1, NID_sect283k1,
1313 NID_sect409k1, NID_sect571k1, NID_sect163r2,
1314 NID_sect233r1, NID_sect283r1, NID_sect409r1,
1315 NID_sect571r1,
1316 /* Other */
1317 NID_X25519
1318 };
1319 static const char *test_curves_names[EC_NUM] = {
1320 /* Prime Curves */
1321 "secp160r1", "nistp192", "nistp224",
1322 "nistp256", "nistp384", "nistp521",
1323 /* Binary Curves */
1324 "nistk163", "nistk233", "nistk283",
1325 "nistk409", "nistk571", "nistb163",
1326 "nistb233", "nistb283", "nistb409",
1327 "nistb571",
1328 /* Other */
1329 "X25519"
1330 };
1331 static const int test_curves_bits[EC_NUM] = {
1332 160, 192, 224,
1333 256, 384, 521,
1334 163, 233, 283,
1335 409, 571, 163,
1336 233, 283, 409,
1337 571, 253 /* X25519 */
1338 };
1339
1340 int ecdsa_doit[EC_NUM] = { 0 };
1341 int ecdh_doit[EC_NUM] = { 0 };
1342 #endif /* ndef OPENSSL_NO_EC */
1343
1344 prog = opt_init(argc, argv, speed_options);
1345 while ((o = opt_next()) != OPT_EOF) {
1346 switch (o) {
1347 case OPT_EOF:
1348 case OPT_ERR:
1349 opterr:
1350 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
1351 goto end;
1352 case OPT_HELP:
1353 opt_help(speed_options);
1354 ret = 0;
1355 goto end;
1356 case OPT_ELAPSED:
1357 usertime = 0;
1358 break;
1359 case OPT_EVP:
1360 evp_cipher = EVP_get_cipherbyname(opt_arg());
1361 if (evp_cipher == NULL)
1362 evp_md = EVP_get_digestbyname(opt_arg());
1363 if (evp_cipher == NULL && evp_md == NULL) {
1364 BIO_printf(bio_err,
1365 "%s: %s is an unknown cipher or digest\n",
1366 prog, opt_arg());
1367 goto end;
1368 }
1369 doit[D_EVP] = 1;
1370 break;
1371 case OPT_DECRYPT:
1372 decrypt = 1;
1373 break;
1374 case OPT_ENGINE:
1375 /*
1376 * In a forked execution, an engine might need to be
1377 * initialised by each child process, not by the parent.
1378 * So store the name here and run setup_engine() later on.
1379 */
1380 engine_id = opt_arg();
1381 break;
1382 case OPT_MULTI:
1383 #ifndef NO_FORK
1384 multi = atoi(opt_arg());
1385 #endif
1386 break;
1387 case OPT_ASYNCJOBS:
1388 #ifndef OPENSSL_NO_ASYNC
1389 async_jobs = atoi(opt_arg());
1390 if (!ASYNC_is_capable()) {
1391 BIO_printf(bio_err,
1392 "%s: async_jobs specified but async not supported\n",
1393 prog);
1394 goto opterr;
1395 }
1396 #endif
1397 break;
1398 case OPT_MISALIGN:
1399 if (!opt_int(opt_arg(), &misalign))
1400 goto end;
1401 if (misalign > MISALIGN) {
1402 BIO_printf(bio_err,
1403 "%s: Maximum offset is %d\n", prog, MISALIGN);
1404 goto opterr;
1405 }
1406 break;
1407 case OPT_MR:
1408 mr = 1;
1409 break;
1410 case OPT_MB:
1411 multiblock = 1;
1412 #ifdef OPENSSL_NO_MULTIBLOCK
1413 BIO_printf(bio_err,
1414 "%s: -mb specified but multi-block support is disabled\n",
1415 prog);
1416 goto end;
1417 #endif
1418 break;
1419 }
1420 }
1421 argc = opt_num_rest();
1422 argv = opt_rest();
1423
1424 /* Remaining arguments are algorithms. */
1425 for (; *argv; argv++) {
1426 if (found(*argv, doit_choices, &i)) {
1427 doit[i] = 1;
1428 continue;
1429 }
1430 #ifndef OPENSSL_NO_DES
1431 if (strcmp(*argv, "des") == 0) {
1432 doit[D_CBC_DES] = doit[D_EDE3_DES] = 1;
1433 continue;
1434 }
1435 #endif
1436 if (strcmp(*argv, "sha") == 0) {
1437 doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1;
1438 continue;
1439 }
1440 #ifndef OPENSSL_NO_RSA
1441 # ifndef RSA_NULL
1442 if (strcmp(*argv, "openssl") == 0) {
1443 RSA_set_default_method(RSA_PKCS1_OpenSSL());
1444 continue;
1445 }
1446 # endif
1447 if (strcmp(*argv, "rsa") == 0) {
1448 rsa_doit[R_RSA_512] = rsa_doit[R_RSA_1024] =
1449 rsa_doit[R_RSA_2048] = rsa_doit[R_RSA_3072] =
1450 rsa_doit[R_RSA_4096] = rsa_doit[R_RSA_7680] =
1451 rsa_doit[R_RSA_15360] = 1;
1452 continue;
1453 }
1454 if (found(*argv, rsa_choices, &i)) {
1455 rsa_doit[i] = 1;
1456 continue;
1457 }
1458 #endif
1459 #ifndef OPENSSL_NO_DSA
1460 if (strcmp(*argv, "dsa") == 0) {
1461 dsa_doit[R_DSA_512] = dsa_doit[R_DSA_1024] =
1462 dsa_doit[R_DSA_2048] = 1;
1463 continue;
1464 }
1465 if (found(*argv, dsa_choices, &i)) {
1466 dsa_doit[i] = 2;
1467 continue;
1468 }
1469 #endif
1470 if (strcmp(*argv, "aes") == 0) {
1471 doit[D_CBC_128_AES] = doit[D_CBC_192_AES] = doit[D_CBC_256_AES] = 1;
1472 continue;
1473 }
1474 #ifndef OPENSSL_NO_CAMELLIA
1475 if (strcmp(*argv, "camellia") == 0) {
1476 doit[D_CBC_128_CML] = doit[D_CBC_192_CML] = doit[D_CBC_256_CML] = 1;
1477 continue;
1478 }
1479 #endif
1480 #ifndef OPENSSL_NO_EC
1481 if (strcmp(*argv, "ecdsa") == 0) {
1482 for (i = 0; i < EC_NUM; i++)
1483 ecdsa_doit[i] = 1;
1484 continue;
1485 }
1486 if (found(*argv, ecdsa_choices, &i)) {
1487 ecdsa_doit[i] = 2;
1488 continue;
1489 }
1490 if (strcmp(*argv, "ecdh") == 0) {
1491 for (i = 0; i < EC_NUM; i++)
1492 ecdh_doit[i] = 1;
1493 continue;
1494 }
1495 if (found(*argv, ecdh_choices, &i)) {
1496 ecdh_doit[i] = 2;
1497 continue;
1498 }
1499 #endif
1500 BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, *argv);
1501 goto end;
1502 }
1503
1504 /* Initialize the job pool if async mode is enabled */
1505 if (async_jobs > 0) {
1506 async_init = ASYNC_init_thread(async_jobs, async_jobs);
1507 if (!async_init) {
1508 BIO_printf(bio_err, "Error creating the ASYNC job pool\n");
1509 goto end;
1510 }
1511 }
1512
1513 loopargs_len = (async_jobs == 0 ? 1 : async_jobs);
1514 loopargs =
1515 app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs");
1516 memset(loopargs, 0, loopargs_len * sizeof(loopargs_t));
1517
1518 for (i = 0; i < loopargs_len; i++) {
1519 if (async_jobs > 0) {
1520 loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new();
1521 if (loopargs[i].wait_ctx == NULL) {
1522 BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n");
1523 goto end;
1524 }
1525 }
1526
1527 loopargs[i].buf_malloc =
1528 app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
1529 loopargs[i].buf2_malloc =
1530 app_malloc((int)BUFSIZE + MAX_MISALIGNMENT + 1, "input buffer");
1531 /* Align the start of buffers on a 64 byte boundary */
1532 loopargs[i].buf = loopargs[i].buf_malloc + misalign;
1533 loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign;
1534 #ifndef OPENSSL_NO_EC
1535 loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a");
1536 loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b");
1537 #endif
1538 }
1539
1540 #ifndef NO_FORK
1541 if (multi && do_multi(multi))
1542 goto show_res;
1543 #endif
1544
1545 /* Initialize the engine after the fork */
1546 e = setup_engine(engine_id, 0);
1547
1548 /* No parameters; turn on everything. */
1549 if ((argc == 0) && !doit[D_EVP]) {
1550 for (i = 0; i < ALGOR_NUM; i++)
1551 if (i != D_EVP)
1552 doit[i] = 1;
1553 #ifndef OPENSSL_NO_RSA
1554 for (i = 0; i < RSA_NUM; i++)
1555 rsa_doit[i] = 1;
1556 #endif
1557 #ifndef OPENSSL_NO_DSA
1558 for (i = 0; i < DSA_NUM; i++)
1559 dsa_doit[i] = 1;
1560 #endif
1561 #ifndef OPENSSL_NO_EC
1562 for (i = 0; i < EC_NUM; i++)
1563 ecdsa_doit[i] = 1;
1564 for (i = 0; i < EC_NUM; i++)
1565 ecdh_doit[i] = 1;
1566 #endif
1567 }
1568 for (i = 0; i < ALGOR_NUM; i++)
1569 if (doit[i])
1570 pr_header++;
1571
1572 if (usertime == 0 && !mr)
1573 BIO_printf(bio_err,
1574 "You have chosen to measure elapsed time "
1575 "instead of user CPU time.\n");
1576
1577 #ifndef OPENSSL_NO_RSA
1578 for (i = 0; i < loopargs_len; i++) {
1579 for (k = 0; k < RSA_NUM; k++) {
1580 const unsigned char *p;
1581
1582 p = rsa_data[k];
1583 loopargs[i].rsa_key[k] =
1584 d2i_RSAPrivateKey(NULL, &p, rsa_data_length[k]);
1585 if (loopargs[i].rsa_key[k] == NULL) {
1586 BIO_printf(bio_err,
1587 "internal error loading RSA key number %d\n", k);
1588 goto end;
1589 }
1590 }
1591 }
1592 #endif
1593 #ifndef OPENSSL_NO_DSA
1594 for (i = 0; i < loopargs_len; i++) {
1595 loopargs[i].dsa_key[0] = get_dsa512();
1596 loopargs[i].dsa_key[1] = get_dsa1024();
1597 loopargs[i].dsa_key[2] = get_dsa2048();
1598 }
1599 #endif
1600 #ifndef OPENSSL_NO_DES
1601 DES_set_key_unchecked(&key, &sch);
1602 DES_set_key_unchecked(&key2, &sch2);
1603 DES_set_key_unchecked(&key3, &sch3);
1604 #endif
1605 AES_set_encrypt_key(key16, 128, &aes_ks1);
1606 AES_set_encrypt_key(key24, 192, &aes_ks2);
1607 AES_set_encrypt_key(key32, 256, &aes_ks3);
1608 #ifndef OPENSSL_NO_CAMELLIA
1609 Camellia_set_key(key16, 128, &camellia_ks1);
1610 Camellia_set_key(ckey24, 192, &camellia_ks2);
1611 Camellia_set_key(ckey32, 256, &camellia_ks3);
1612 #endif
1613 #ifndef OPENSSL_NO_IDEA
1614 IDEA_set_encrypt_key(key16, &idea_ks);
1615 #endif
1616 #ifndef OPENSSL_NO_SEED
1617 SEED_set_key(key16, &seed_ks);
1618 #endif
1619 #ifndef OPENSSL_NO_RC4
1620 RC4_set_key(&rc4_ks, 16, key16);
1621 #endif
1622 #ifndef OPENSSL_NO_RC2
1623 RC2_set_key(&rc2_ks, 16, key16, 128);
1624 #endif
1625 #ifndef OPENSSL_NO_RC5
1626 RC5_32_set_key(&rc5_ks, 16, key16, 12);
1627 #endif
1628 #ifndef OPENSSL_NO_BF
1629 BF_set_key(&bf_ks, 16, key16);
1630 #endif
1631 #ifndef OPENSSL_NO_CAST
1632 CAST_set_key(&cast_ks, 16, key16);
1633 #endif
1634 #ifndef SIGALRM
1635 # ifndef OPENSSL_NO_DES
1636 BIO_printf(bio_err, "First we calculate the approximate speed ...\n");
1637 count = 10;
1638 do {
1639 long it;
1640 count *= 2;
1641 Time_F(START);
1642 for (it = count; it; it--)
1643 DES_ecb_encrypt((DES_cblock *)loopargs[0].buf,
1644 (DES_cblock *)loopargs[0].buf, &sch, DES_ENCRYPT);
1645 d = Time_F(STOP);
1646 } while (d < 3);
1647 save_count = count;
1648 c[D_MD2][0] = count / 10;
1649 c[D_MDC2][0] = count / 10;
1650 c[D_MD4][0] = count;
1651 c[D_MD5][0] = count;
1652 c[D_HMAC][0] = count;
1653 c[D_SHA1][0] = count;
1654 c[D_RMD160][0] = count;
1655 c[D_RC4][0] = count * 5;
1656 c[D_CBC_DES][0] = count;
1657 c[D_EDE3_DES][0] = count / 3;
1658 c[D_CBC_IDEA][0] = count;
1659 c[D_CBC_SEED][0] = count;
1660 c[D_CBC_RC2][0] = count;
1661 c[D_CBC_RC5][0] = count;
1662 c[D_CBC_BF][0] = count;
1663 c[D_CBC_CAST][0] = count;
1664 c[D_CBC_128_AES][0] = count;
1665 c[D_CBC_192_AES][0] = count;
1666 c[D_CBC_256_AES][0] = count;
1667 c[D_CBC_128_CML][0] = count;
1668 c[D_CBC_192_CML][0] = count;
1669 c[D_CBC_256_CML][0] = count;
1670 c[D_SHA256][0] = count;
1671 c[D_SHA512][0] = count;
1672 c[D_WHIRLPOOL][0] = count;
1673 c[D_IGE_128_AES][0] = count;
1674 c[D_IGE_192_AES][0] = count;
1675 c[D_IGE_256_AES][0] = count;
1676 c[D_GHASH][0] = count;
1677
1678 for (i = 1; i < SIZE_NUM; i++) {
1679 long l0, l1;
1680
1681 l0 = (long)lengths[0];
1682 l1 = (long)lengths[i];
1683
1684 c[D_MD2][i] = c[D_MD2][0] * 4 * l0 / l1;
1685 c[D_MDC2][i] = c[D_MDC2][0] * 4 * l0 / l1;
1686 c[D_MD4][i] = c[D_MD4][0] * 4 * l0 / l1;
1687 c[D_MD5][i] = c[D_MD5][0] * 4 * l0 / l1;
1688 c[D_HMAC][i] = c[D_HMAC][0] * 4 * l0 / l1;
1689 c[D_SHA1][i] = c[D_SHA1][0] * 4 * l0 / l1;
1690 c[D_RMD160][i] = c[D_RMD160][0] * 4 * l0 / l1;
1691 c[D_SHA256][i] = c[D_SHA256][0] * 4 * l0 / l1;
1692 c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1;
1693 c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1;
1694 c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1;
1695
1696 l0 = (long)lengths[i - 1];
1697
1698 c[D_RC4][i] = c[D_RC4][i - 1] * l0 / l1;
1699 c[D_CBC_DES][i] = c[D_CBC_DES][i - 1] * l0 / l1;
1700 c[D_EDE3_DES][i] = c[D_EDE3_DES][i - 1] * l0 / l1;
1701 c[D_CBC_IDEA][i] = c[D_CBC_IDEA][i - 1] * l0 / l1;
1702 c[D_CBC_SEED][i] = c[D_CBC_SEED][i - 1] * l0 / l1;
1703 c[D_CBC_RC2][i] = c[D_CBC_RC2][i - 1] * l0 / l1;
1704 c[D_CBC_RC5][i] = c[D_CBC_RC5][i - 1] * l0 / l1;
1705 c[D_CBC_BF][i] = c[D_CBC_BF][i - 1] * l0 / l1;
1706 c[D_CBC_CAST][i] = c[D_CBC_CAST][i - 1] * l0 / l1;
1707 c[D_CBC_128_AES][i] = c[D_CBC_128_AES][i - 1] * l0 / l1;
1708 c[D_CBC_192_AES][i] = c[D_CBC_192_AES][i - 1] * l0 / l1;
1709 c[D_CBC_256_AES][i] = c[D_CBC_256_AES][i - 1] * l0 / l1;
1710 c[D_CBC_128_CML][i] = c[D_CBC_128_CML][i - 1] * l0 / l1;
1711 c[D_CBC_192_CML][i] = c[D_CBC_192_CML][i - 1] * l0 / l1;
1712 c[D_CBC_256_CML][i] = c[D_CBC_256_CML][i - 1] * l0 / l1;
1713 c[D_IGE_128_AES][i] = c[D_IGE_128_AES][i - 1] * l0 / l1;
1714 c[D_IGE_192_AES][i] = c[D_IGE_192_AES][i - 1] * l0 / l1;
1715 c[D_IGE_256_AES][i] = c[D_IGE_256_AES][i - 1] * l0 / l1;
1716 }
1717
1718 # ifndef OPENSSL_NO_RSA
1719 rsa_c[R_RSA_512][0] = count / 2000;
1720 rsa_c[R_RSA_512][1] = count / 400;
1721 for (i = 1; i < RSA_NUM; i++) {
1722 rsa_c[i][0] = rsa_c[i - 1][0] / 8;
1723 rsa_c[i][1] = rsa_c[i - 1][1] / 4;
1724 if (rsa_doit[i] <= 1 && rsa_c[i][0] == 0)
1725 rsa_doit[i] = 0;
1726 else {
1727 if (rsa_c[i][0] == 0) {
1728 rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1729 rsa_c[i][1] = 20;
1730 }
1731 }
1732 }
1733 # endif
1734
1735 # ifndef OPENSSL_NO_DSA
1736 dsa_c[R_DSA_512][0] = count / 1000;
1737 dsa_c[R_DSA_512][1] = count / 1000 / 2;
1738 for (i = 1; i < DSA_NUM; i++) {
1739 dsa_c[i][0] = dsa_c[i - 1][0] / 4;
1740 dsa_c[i][1] = dsa_c[i - 1][1] / 4;
1741 if (dsa_doit[i] <= 1 && dsa_c[i][0] == 0)
1742 dsa_doit[i] = 0;
1743 else {
1744 if (dsa_c[i][0] == 0) {
1745 dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */
1746 dsa_c[i][1] = 1;
1747 }
1748 }
1749 }
1750 # endif
1751
1752 # ifndef OPENSSL_NO_EC
1753 ecdsa_c[R_EC_P160][0] = count / 1000;
1754 ecdsa_c[R_EC_P160][1] = count / 1000 / 2;
1755 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1756 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1757 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1758 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1759 ecdsa_doit[i] = 0;
1760 else {
1761 if (ecdsa_c[i][0] == 0) {
1762 ecdsa_c[i][0] = 1;
1763 ecdsa_c[i][1] = 1;
1764 }
1765 }
1766 }
1767 ecdsa_c[R_EC_K163][0] = count / 1000;
1768 ecdsa_c[R_EC_K163][1] = count / 1000 / 2;
1769 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1770 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1771 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1772 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1773 ecdsa_doit[i] = 0;
1774 else {
1775 if (ecdsa_c[i][0] == 0) {
1776 ecdsa_c[i][0] = 1;
1777 ecdsa_c[i][1] = 1;
1778 }
1779 }
1780 }
1781 ecdsa_c[R_EC_B163][0] = count / 1000;
1782 ecdsa_c[R_EC_B163][1] = count / 1000 / 2;
1783 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1784 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1785 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1786 if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0)
1787 ecdsa_doit[i] = 0;
1788 else {
1789 if (ecdsa_c[i][0] == 0) {
1790 ecdsa_c[i][0] = 1;
1791 ecdsa_c[i][1] = 1;
1792 }
1793 }
1794 }
1795
1796 ecdh_c[R_EC_P160][0] = count / 1000;
1797 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1798 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1799 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1800 ecdh_doit[i] = 0;
1801 else {
1802 if (ecdh_c[i][0] == 0) {
1803 ecdh_c[i][0] = 1;
1804 }
1805 }
1806 }
1807 ecdh_c[R_EC_K163][0] = count / 1000;
1808 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1809 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1810 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1811 ecdh_doit[i] = 0;
1812 else {
1813 if (ecdh_c[i][0] == 0) {
1814 ecdh_c[i][0] = 1;
1815 }
1816 }
1817 }
1818 ecdh_c[R_EC_B163][0] = count / 1000;
1819 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1820 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1821 if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0)
1822 ecdh_doit[i] = 0;
1823 else {
1824 if (ecdh_c[i][0] == 0) {
1825 ecdh_c[i][0] = 1;
1826 }
1827 }
1828 }
1829 # endif
1830
1831 # else
1832 /* not worth fixing */
1833 # error "You cannot disable DES on systems without SIGALRM."
1834 # endif /* OPENSSL_NO_DES */
1835 #else
1836 # ifndef _WIN32
1837 signal(SIGALRM, sig_done);
1838 # endif
1839 #endif /* SIGALRM */
1840
1841 #ifndef OPENSSL_NO_MD2
1842 if (doit[D_MD2]) {
1843 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1844 print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum]);
1845 Time_F(START);
1846 count = run_benchmark(async_jobs, EVP_Digest_MD2_loop, loopargs);
1847 d = Time_F(STOP);
1848 print_result(D_MD2, testnum, count, d);
1849 }
1850 }
1851 #endif
1852 #ifndef OPENSSL_NO_MDC2
1853 if (doit[D_MDC2]) {
1854 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1855 print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum]);
1856 Time_F(START);
1857 count = run_benchmark(async_jobs, EVP_Digest_MDC2_loop, loopargs);
1858 d = Time_F(STOP);
1859 print_result(D_MDC2, testnum, count, d);
1860 }
1861 }
1862 #endif
1863
1864 #ifndef OPENSSL_NO_MD4
1865 if (doit[D_MD4]) {
1866 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1867 print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum]);
1868 Time_F(START);
1869 count = run_benchmark(async_jobs, EVP_Digest_MD4_loop, loopargs);
1870 d = Time_F(STOP);
1871 print_result(D_MD4, testnum, count, d);
1872 }
1873 }
1874 #endif
1875
1876 #ifndef OPENSSL_NO_MD5
1877 if (doit[D_MD5]) {
1878 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1879 print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum]);
1880 Time_F(START);
1881 count = run_benchmark(async_jobs, MD5_loop, loopargs);
1882 d = Time_F(STOP);
1883 print_result(D_MD5, testnum, count, d);
1884 }
1885 }
1886
1887 if (doit[D_HMAC]) {
1888 static const char hmac_key[] = "This is a key...";
1889 int len = strlen(hmac_key);
1890
1891 for (i = 0; i < loopargs_len; i++) {
1892 loopargs[i].hctx = HMAC_CTX_new();
1893 if (loopargs[i].hctx == NULL) {
1894 BIO_printf(bio_err, "HMAC malloc failure, exiting...");
1895 exit(1);
1896 }
1897
1898 HMAC_Init_ex(loopargs[i].hctx, hmac_key, len, EVP_md5(), NULL);
1899 }
1900 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1901 print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum]);
1902 Time_F(START);
1903 count = run_benchmark(async_jobs, HMAC_loop, loopargs);
1904 d = Time_F(STOP);
1905 print_result(D_HMAC, testnum, count, d);
1906 }
1907 for (i = 0; i < loopargs_len; i++) {
1908 HMAC_CTX_free(loopargs[i].hctx);
1909 }
1910 }
1911 #endif
1912 if (doit[D_SHA1]) {
1913 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1914 print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum]);
1915 Time_F(START);
1916 count = run_benchmark(async_jobs, SHA1_loop, loopargs);
1917 d = Time_F(STOP);
1918 print_result(D_SHA1, testnum, count, d);
1919 }
1920 }
1921 if (doit[D_SHA256]) {
1922 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1923 print_message(names[D_SHA256], c[D_SHA256][testnum],
1924 lengths[testnum]);
1925 Time_F(START);
1926 count = run_benchmark(async_jobs, SHA256_loop, loopargs);
1927 d = Time_F(STOP);
1928 print_result(D_SHA256, testnum, count, d);
1929 }
1930 }
1931 if (doit[D_SHA512]) {
1932 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1933 print_message(names[D_SHA512], c[D_SHA512][testnum],
1934 lengths[testnum]);
1935 Time_F(START);
1936 count = run_benchmark(async_jobs, SHA512_loop, loopargs);
1937 d = Time_F(STOP);
1938 print_result(D_SHA512, testnum, count, d);
1939 }
1940 }
1941 #ifndef OPENSSL_NO_WHIRLPOOL
1942 if (doit[D_WHIRLPOOL]) {
1943 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1944 print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum],
1945 lengths[testnum]);
1946 Time_F(START);
1947 count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs);
1948 d = Time_F(STOP);
1949 print_result(D_WHIRLPOOL, testnum, count, d);
1950 }
1951 }
1952 #endif
1953
1954 #ifndef OPENSSL_NO_RMD160
1955 if (doit[D_RMD160]) {
1956 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1957 print_message(names[D_RMD160], c[D_RMD160][testnum],
1958 lengths[testnum]);
1959 Time_F(START);
1960 count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs);
1961 d = Time_F(STOP);
1962 print_result(D_RMD160, testnum, count, d);
1963 }
1964 }
1965 #endif
1966 #ifndef OPENSSL_NO_RC4
1967 if (doit[D_RC4]) {
1968 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1969 print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum]);
1970 Time_F(START);
1971 count = run_benchmark(async_jobs, RC4_loop, loopargs);
1972 d = Time_F(STOP);
1973 print_result(D_RC4, testnum, count, d);
1974 }
1975 }
1976 #endif
1977 #ifndef OPENSSL_NO_DES
1978 if (doit[D_CBC_DES]) {
1979 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1980 print_message(names[D_CBC_DES], c[D_CBC_DES][testnum],
1981 lengths[testnum]);
1982 Time_F(START);
1983 count = run_benchmark(async_jobs, DES_ncbc_encrypt_loop, loopargs);
1984 d = Time_F(STOP);
1985 print_result(D_CBC_DES, testnum, count, d);
1986 }
1987 }
1988
1989 if (doit[D_EDE3_DES]) {
1990 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
1991 print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum],
1992 lengths[testnum]);
1993 Time_F(START);
1994 count =
1995 run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs);
1996 d = Time_F(STOP);
1997 print_result(D_EDE3_DES, testnum, count, d);
1998 }
1999 }
2000 #endif
2001
2002 if (doit[D_CBC_128_AES]) {
2003 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2004 print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum],
2005 lengths[testnum]);
2006 Time_F(START);
2007 count =
2008 run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs);
2009 d = Time_F(STOP);
2010 print_result(D_CBC_128_AES, testnum, count, d);
2011 }
2012 }
2013 if (doit[D_CBC_192_AES]) {
2014 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2015 print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][testnum],
2016 lengths[testnum]);
2017 Time_F(START);
2018 count =
2019 run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs);
2020 d = Time_F(STOP);
2021 print_result(D_CBC_192_AES, testnum, count, d);
2022 }
2023 }
2024 if (doit[D_CBC_256_AES]) {
2025 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2026 print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][testnum],
2027 lengths[testnum]);
2028 Time_F(START);
2029 count =
2030 run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs);
2031 d = Time_F(STOP);
2032 print_result(D_CBC_256_AES, testnum, count, d);
2033 }
2034 }
2035
2036 if (doit[D_IGE_128_AES]) {
2037 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2038 print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][testnum],
2039 lengths[testnum]);
2040 Time_F(START);
2041 count =
2042 run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs);
2043 d = Time_F(STOP);
2044 print_result(D_IGE_128_AES, testnum, count, d);
2045 }
2046 }
2047 if (doit[D_IGE_192_AES]) {
2048 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2049 print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][testnum],
2050 lengths[testnum]);
2051 Time_F(START);
2052 count =
2053 run_benchmark(async_jobs, AES_ige_192_encrypt_loop, loopargs);
2054 d = Time_F(STOP);
2055 print_result(D_IGE_192_AES, testnum, count, d);
2056 }
2057 }
2058 if (doit[D_IGE_256_AES]) {
2059 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2060 print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][testnum],
2061 lengths[testnum]);
2062 Time_F(START);
2063 count =
2064 run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs);
2065 d = Time_F(STOP);
2066 print_result(D_IGE_256_AES, testnum, count, d);
2067 }
2068 }
2069 if (doit[D_GHASH]) {
2070 for (i = 0; i < loopargs_len; i++) {
2071 loopargs[i].gcm_ctx =
2072 CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
2073 CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx,
2074 (unsigned char *)"0123456789ab", 12);
2075 }
2076
2077 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2078 print_message(names[D_GHASH], c[D_GHASH][testnum],
2079 lengths[testnum]);
2080 Time_F(START);
2081 count = run_benchmark(async_jobs, CRYPTO_gcm128_aad_loop, loopargs);
2082 d = Time_F(STOP);
2083 print_result(D_GHASH, testnum, count, d);
2084 }
2085 for (i = 0; i < loopargs_len; i++)
2086 CRYPTO_gcm128_release(loopargs[i].gcm_ctx);
2087 }
2088 #ifndef OPENSSL_NO_CAMELLIA
2089 if (doit[D_CBC_128_CML]) {
2090 if (async_jobs > 0) {
2091 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2092 names[D_CBC_128_CML]);
2093 doit[D_CBC_128_CML] = 0;
2094 }
2095 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2096 print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][testnum],
2097 lengths[testnum]);
2098 Time_F(START);
2099 for (count = 0, run = 1; COND(c[D_CBC_128_CML][testnum]); count++)
2100 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2101 (size_t)lengths[testnum], &camellia_ks1,
2102 iv, CAMELLIA_ENCRYPT);
2103 d = Time_F(STOP);
2104 print_result(D_CBC_128_CML, testnum, count, d);
2105 }
2106 }
2107 if (doit[D_CBC_192_CML]) {
2108 if (async_jobs > 0) {
2109 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2110 names[D_CBC_192_CML]);
2111 doit[D_CBC_192_CML] = 0;
2112 }
2113 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2114 print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][testnum],
2115 lengths[testnum]);
2116 if (async_jobs > 0) {
2117 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2118 exit(1);
2119 }
2120 Time_F(START);
2121 for (count = 0, run = 1; COND(c[D_CBC_192_CML][testnum]); count++)
2122 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2123 (size_t)lengths[testnum], &camellia_ks2,
2124 iv, CAMELLIA_ENCRYPT);
2125 d = Time_F(STOP);
2126 print_result(D_CBC_192_CML, testnum, count, d);
2127 }
2128 }
2129 if (doit[D_CBC_256_CML]) {
2130 if (async_jobs > 0) {
2131 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2132 names[D_CBC_256_CML]);
2133 doit[D_CBC_256_CML] = 0;
2134 }
2135 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2136 print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][testnum],
2137 lengths[testnum]);
2138 Time_F(START);
2139 for (count = 0, run = 1; COND(c[D_CBC_256_CML][testnum]); count++)
2140 Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2141 (size_t)lengths[testnum], &camellia_ks3,
2142 iv, CAMELLIA_ENCRYPT);
2143 d = Time_F(STOP);
2144 print_result(D_CBC_256_CML, testnum, count, d);
2145 }
2146 }
2147 #endif
2148 #ifndef OPENSSL_NO_IDEA
2149 if (doit[D_CBC_IDEA]) {
2150 if (async_jobs > 0) {
2151 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2152 names[D_CBC_IDEA]);
2153 doit[D_CBC_IDEA] = 0;
2154 }
2155 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2156 print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum],
2157 lengths[testnum]);
2158 Time_F(START);
2159 for (count = 0, run = 1; COND(c[D_CBC_IDEA][testnum]); count++)
2160 IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2161 (size_t)lengths[testnum], &idea_ks,
2162 iv, IDEA_ENCRYPT);
2163 d = Time_F(STOP);
2164 print_result(D_CBC_IDEA, testnum, count, d);
2165 }
2166 }
2167 #endif
2168 #ifndef OPENSSL_NO_SEED
2169 if (doit[D_CBC_SEED]) {
2170 if (async_jobs > 0) {
2171 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2172 names[D_CBC_SEED]);
2173 doit[D_CBC_SEED] = 0;
2174 }
2175 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2176 print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum],
2177 lengths[testnum]);
2178 Time_F(START);
2179 for (count = 0, run = 1; COND(c[D_CBC_SEED][testnum]); count++)
2180 SEED_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2181 (size_t)lengths[testnum], &seed_ks, iv, 1);
2182 d = Time_F(STOP);
2183 print_result(D_CBC_SEED, testnum, count, d);
2184 }
2185 }
2186 #endif
2187 #ifndef OPENSSL_NO_RC2
2188 if (doit[D_CBC_RC2]) {
2189 if (async_jobs > 0) {
2190 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2191 names[D_CBC_RC2]);
2192 doit[D_CBC_RC2] = 0;
2193 }
2194 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2195 print_message(names[D_CBC_RC2], c[D_CBC_RC2][testnum],
2196 lengths[testnum]);
2197 if (async_jobs > 0) {
2198 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2199 exit(1);
2200 }
2201 Time_F(START);
2202 for (count = 0, run = 1; COND(c[D_CBC_RC2][testnum]); count++)
2203 RC2_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2204 (size_t)lengths[testnum], &rc2_ks,
2205 iv, RC2_ENCRYPT);
2206 d = Time_F(STOP);
2207 print_result(D_CBC_RC2, testnum, count, d);
2208 }
2209 }
2210 #endif
2211 #ifndef OPENSSL_NO_RC5
2212 if (doit[D_CBC_RC5]) {
2213 if (async_jobs > 0) {
2214 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2215 names[D_CBC_RC5]);
2216 doit[D_CBC_RC5] = 0;
2217 }
2218 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2219 print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum],
2220 lengths[testnum]);
2221 if (async_jobs > 0) {
2222 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2223 exit(1);
2224 }
2225 Time_F(START);
2226 for (count = 0, run = 1; COND(c[D_CBC_RC5][testnum]); count++)
2227 RC5_32_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2228 (size_t)lengths[testnum], &rc5_ks,
2229 iv, RC5_ENCRYPT);
2230 d = Time_F(STOP);
2231 print_result(D_CBC_RC5, testnum, count, d);
2232 }
2233 }
2234 #endif
2235 #ifndef OPENSSL_NO_BF
2236 if (doit[D_CBC_BF]) {
2237 if (async_jobs > 0) {
2238 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2239 names[D_CBC_BF]);
2240 doit[D_CBC_BF] = 0;
2241 }
2242 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2243 print_message(names[D_CBC_BF], c[D_CBC_BF][testnum],
2244 lengths[testnum]);
2245 Time_F(START);
2246 for (count = 0, run = 1; COND(c[D_CBC_BF][testnum]); count++)
2247 BF_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2248 (size_t)lengths[testnum], &bf_ks,
2249 iv, BF_ENCRYPT);
2250 d = Time_F(STOP);
2251 print_result(D_CBC_BF, testnum, count, d);
2252 }
2253 }
2254 #endif
2255 #ifndef OPENSSL_NO_CAST
2256 if (doit[D_CBC_CAST]) {
2257 if (async_jobs > 0) {
2258 BIO_printf(bio_err, "Async mode is not supported with %s\n",
2259 names[D_CBC_CAST]);
2260 doit[D_CBC_CAST] = 0;
2261 }
2262 for (testnum = 0; testnum < SIZE_NUM && async_init == 0; testnum++) {
2263 print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum],
2264 lengths[testnum]);
2265 Time_F(START);
2266 for (count = 0, run = 1; COND(c[D_CBC_CAST][testnum]); count++)
2267 CAST_cbc_encrypt(loopargs[0].buf, loopargs[0].buf,
2268 (size_t)lengths[testnum], &cast_ks,
2269 iv, CAST_ENCRYPT);
2270 d = Time_F(STOP);
2271 print_result(D_CBC_CAST, testnum, count, d);
2272 }
2273 }
2274 #endif
2275
2276 if (doit[D_EVP]) {
2277 if (multiblock && evp_cipher) {
2278 if (!
2279 (EVP_CIPHER_flags(evp_cipher) &
2280 EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
2281 BIO_printf(bio_err, "%s is not multi-block capable\n",
2282 OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
2283 goto end;
2284 }
2285 if (async_jobs > 0) {
2286 BIO_printf(bio_err, "Async mode is not supported, exiting...");
2287 exit(1);
2288 }
2289 multiblock_speed(evp_cipher);
2290 ret = 0;
2291 goto end;
2292 }
2293 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2294 if (evp_cipher) {
2295
2296 names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
2297 /*
2298 * -O3 -fschedule-insns messes up an optimization here!
2299 * names[D_EVP] somehow becomes NULL
2300 */
2301 print_message(names[D_EVP], save_count, lengths[testnum]);
2302
2303 for (k = 0; k < loopargs_len; k++) {
2304 loopargs[k].ctx = EVP_CIPHER_CTX_new();
2305 if (decrypt)
2306 EVP_DecryptInit_ex(loopargs[k].ctx, evp_cipher, NULL,
2307 key16, iv);
2308 else
2309 EVP_EncryptInit_ex(loopargs[k].ctx, evp_cipher, NULL,
2310 key16, iv);
2311 EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0);
2312 }
2313
2314 Time_F(START);
2315 count = run_benchmark(async_jobs, EVP_Update_loop, loopargs);
2316 d = Time_F(STOP);
2317 for (k = 0; k < loopargs_len; k++) {
2318 EVP_CIPHER_CTX_free(loopargs[k].ctx);
2319 }
2320 }
2321 if (evp_md) {
2322 names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
2323 print_message(names[D_EVP], save_count, lengths[testnum]);
2324 Time_F(START);
2325 count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs);
2326 d = Time_F(STOP);
2327 }
2328 print_result(D_EVP, testnum, count, d);
2329 }
2330 }
2331
2332 for (i = 0; i < loopargs_len; i++)
2333 RAND_bytes(loopargs[i].buf, 36);
2334
2335 #ifndef OPENSSL_NO_RSA
2336 for (testnum = 0; testnum < RSA_NUM; testnum++) {
2337 int st = 0;
2338 if (!rsa_doit[testnum])
2339 continue;
2340 for (i = 0; i < loopargs_len; i++) {
2341 st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2342 &loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2343 if (st == 0)
2344 break;
2345 }
2346 if (st == 0) {
2347 BIO_printf(bio_err,
2348 "RSA sign failure. No RSA sign will be done.\n");
2349 ERR_print_errors(bio_err);
2350 rsa_count = 1;
2351 } else {
2352 pkey_print_message("private", "rsa",
2353 rsa_c[testnum][0], rsa_bits[testnum],
2354 RSA_SECONDS);
2355 /* RSA_blinding_on(rsa_key[testnum],NULL); */
2356 Time_F(START);
2357 count = run_benchmark(async_jobs, RSA_sign_loop, loopargs);
2358 d = Time_F(STOP);
2359 BIO_printf(bio_err,
2360 mr ? "+R1:%ld:%d:%.2f\n"
2361 : "%ld %d bit private RSA's in %.2fs\n",
2362 count, rsa_bits[testnum], d);
2363 rsa_results[testnum][0] = (double)count / d;
2364 rsa_count = count;
2365 }
2366
2367 for (i = 0; i < loopargs_len; i++) {
2368 st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2,
2369 loopargs[i].siglen, loopargs[i].rsa_key[testnum]);
2370 if (st <= 0)
2371 break;
2372 }
2373 if (st <= 0) {
2374 BIO_printf(bio_err,
2375 "RSA verify failure. No RSA verify will be done.\n");
2376 ERR_print_errors(bio_err);
2377 rsa_doit[testnum] = 0;
2378 } else {
2379 pkey_print_message("public", "rsa",
2380 rsa_c[testnum][1], rsa_bits[testnum],
2381 RSA_SECONDS);
2382 Time_F(START);
2383 count = run_benchmark(async_jobs, RSA_verify_loop, loopargs);
2384 d = Time_F(STOP);
2385 BIO_printf(bio_err,
2386 mr ? "+R2:%ld:%d:%.2f\n"
2387 : "%ld %d bit public RSA's in %.2fs\n",
2388 count, rsa_bits[testnum], d);
2389 rsa_results[testnum][1] = (double)count / d;
2390 }
2391
2392 if (rsa_count <= 1) {
2393 /* if longer than 10s, don't do any more */
2394 for (testnum++; testnum < RSA_NUM; testnum++)
2395 rsa_doit[testnum] = 0;
2396 }
2397 }
2398 #endif /* OPENSSL_NO_RSA */
2399
2400 for (i = 0; i < loopargs_len; i++)
2401 RAND_bytes(loopargs[i].buf, 36);
2402
2403 #ifndef OPENSSL_NO_DSA
2404 if (RAND_status() != 1) {
2405 RAND_seed(rnd_seed, sizeof rnd_seed);
2406 }
2407 for (testnum = 0; testnum < DSA_NUM; testnum++) {
2408 int st = 0;
2409 if (!dsa_doit[testnum])
2410 continue;
2411
2412 /* DSA_generate_key(dsa_key[testnum]); */
2413 /* DSA_sign_setup(dsa_key[testnum],NULL); */
2414 for (i = 0; i < loopargs_len; i++) {
2415 st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2416 &loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2417 if (st == 0)
2418 break;
2419 }
2420 if (st == 0) {
2421 BIO_printf(bio_err,
2422 "DSA sign failure. No DSA sign will be done.\n");
2423 ERR_print_errors(bio_err);
2424 rsa_count = 1;
2425 } else {
2426 pkey_print_message("sign", "dsa",
2427 dsa_c[testnum][0], dsa_bits[testnum],
2428 DSA_SECONDS);
2429 Time_F(START);
2430 count = run_benchmark(async_jobs, DSA_sign_loop, loopargs);
2431 d = Time_F(STOP);
2432 BIO_printf(bio_err,
2433 mr ? "+R3:%ld:%d:%.2f\n"
2434 : "%ld %d bit DSA signs in %.2fs\n",
2435 count, dsa_bits[testnum], d);
2436 dsa_results[testnum][0] = (double)count / d;
2437 rsa_count = count;
2438 }
2439
2440 for (i = 0; i < loopargs_len; i++) {
2441 st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2442 loopargs[i].siglen, loopargs[i].dsa_key[testnum]);
2443 if (st <= 0)
2444 break;
2445 }
2446 if (st <= 0) {
2447 BIO_printf(bio_err,
2448 "DSA verify failure. No DSA verify will be done.\n");
2449 ERR_print_errors(bio_err);
2450 dsa_doit[testnum] = 0;
2451 } else {
2452 pkey_print_message("verify", "dsa",
2453 dsa_c[testnum][1], dsa_bits[testnum],
2454 DSA_SECONDS);
2455 Time_F(START);
2456 count = run_benchmark(async_jobs, DSA_verify_loop, loopargs);
2457 d = Time_F(STOP);
2458 BIO_printf(bio_err,
2459 mr ? "+R4:%ld:%d:%.2f\n"
2460 : "%ld %d bit DSA verify in %.2fs\n",
2461 count, dsa_bits[testnum], d);
2462 dsa_results[testnum][1] = (double)count / d;
2463 }
2464
2465 if (rsa_count <= 1) {
2466 /* if longer than 10s, don't do any more */
2467 for (testnum++; testnum < DSA_NUM; testnum++)
2468 dsa_doit[testnum] = 0;
2469 }
2470 }
2471 #endif /* OPENSSL_NO_DSA */
2472
2473 #ifndef OPENSSL_NO_EC
2474 if (RAND_status() != 1) {
2475 RAND_seed(rnd_seed, sizeof rnd_seed);
2476 }
2477 for (testnum = 0; testnum < EC_NUM; testnum++) {
2478 int st = 1;
2479
2480 if (!ecdsa_doit[testnum])
2481 continue; /* Ignore Curve */
2482 for (i = 0; i < loopargs_len; i++) {
2483 loopargs[i].ecdsa[testnum] =
2484 EC_KEY_new_by_curve_name(test_curves[testnum]);
2485 if (loopargs[i].ecdsa[testnum] == NULL) {
2486 st = 0;
2487 break;
2488 }
2489 }
2490 if (st == 0) {
2491 BIO_printf(bio_err, "ECDSA failure.\n");
2492 ERR_print_errors(bio_err);
2493 rsa_count = 1;
2494 } else {
2495 for (i = 0; i < loopargs_len; i++) {
2496 EC_KEY_precompute_mult(loopargs[i].ecdsa[testnum], NULL);
2497 /* Perform ECDSA signature test */
2498 EC_KEY_generate_key(loopargs[i].ecdsa[testnum]);
2499 st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2,
2500 &loopargs[i].siglen,
2501 loopargs[i].ecdsa[testnum]);
2502 if (st == 0)
2503 break;
2504 }
2505 if (st == 0) {
2506 BIO_printf(bio_err,
2507 "ECDSA sign failure. No ECDSA sign will be done.\n");
2508 ERR_print_errors(bio_err);
2509 rsa_count = 1;
2510 } else {
2511 pkey_print_message("sign", "ecdsa",
2512 ecdsa_c[testnum][0],
2513 test_curves_bits[testnum], ECDSA_SECONDS);
2514 Time_F(START);
2515 count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs);
2516 d = Time_F(STOP);
2517
2518 BIO_printf(bio_err,
2519 mr ? "+R5:%ld:%d:%.2f\n" :
2520 "%ld %d bit ECDSA signs in %.2fs \n",
2521 count, test_curves_bits[testnum], d);
2522 ecdsa_results[testnum][0] = d / (double)count;
2523 rsa_count = count;
2524 }
2525
2526 /* Perform ECDSA verification test */
2527 for (i = 0; i < loopargs_len; i++) {
2528 st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2,
2529 loopargs[i].siglen,
2530 loopargs[i].ecdsa[testnum]);
2531 if (st != 1)
2532 break;
2533 }
2534 if (st != 1) {
2535 BIO_printf(bio_err,
2536 "ECDSA verify failure. No ECDSA verify will be done.\n");
2537 ERR_print_errors(bio_err);
2538 ecdsa_doit[testnum] = 0;
2539 } else {
2540 pkey_print_message("verify", "ecdsa",
2541 ecdsa_c[testnum][1],
2542 test_curves_bits[testnum], ECDSA_SECONDS);
2543 Time_F(START);
2544 count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs);
2545 d = Time_F(STOP);
2546 BIO_printf(bio_err,
2547 mr ? "+R6:%ld:%d:%.2f\n"
2548 : "%ld %d bit ECDSA verify in %.2fs\n",
2549 count, test_curves_bits[testnum], d);
2550 ecdsa_results[testnum][1] = d / (double)count;
2551 }
2552
2553 if (rsa_count <= 1) {
2554 /* if longer than 10s, don't do any more */
2555 for (testnum++; testnum < EC_NUM; testnum++)
2556 ecdsa_doit[testnum] = 0;
2557 }
2558 }
2559 }
2560
2561 if (RAND_status() != 1) {
2562 RAND_seed(rnd_seed, sizeof rnd_seed);
2563 }
2564 for (testnum = 0; testnum < EC_NUM; testnum++) {
2565 int ecdh_checks = 1;
2566
2567 if (!ecdh_doit[testnum])
2568 continue;
2569
2570 for (i = 0; i < loopargs_len; i++) {
2571 EVP_PKEY_CTX *kctx = NULL;
2572 EVP_PKEY_CTX *test_ctx = NULL;
2573 EVP_PKEY_CTX *ctx = NULL;
2574 EVP_PKEY *key_A = NULL;
2575 EVP_PKEY *key_B = NULL;
2576 size_t outlen;
2577 size_t test_outlen;
2578
2579 /* Ensure that the error queue is empty */
2580 if (ERR_peek_error()) {
2581 BIO_printf(bio_err,
2582 "WARNING: the error queue contains previous unhandled errors.\n");
2583 ERR_print_errors(bio_err);
2584 }
2585
2586 /* Let's try to create a ctx directly from the NID: this works for
2587 * curves like Curve25519 that are not implemented through the low
2588 * level EC interface.
2589 * If this fails we try creating a EVP_PKEY_EC generic param ctx,
2590 * then we set the curve by NID before deriving the actual keygen
2591 * ctx for that specific curve. */
2592 kctx = EVP_PKEY_CTX_new_id(test_curves[testnum], NULL); /* keygen ctx from NID */
2593 if (!kctx) {
2594 EVP_PKEY_CTX *pctx = NULL;
2595 EVP_PKEY *params = NULL;
2596
2597 /* If we reach this code EVP_PKEY_CTX_new_id() failed and a
2598 * "int_ctx_new:unsupported algorithm" error was added to the
2599 * error queue.
2600 * We remove it from the error queue as we are handling it. */
2601 unsigned long error = ERR_peek_error(); /* peek the latest error in the queue */
2602 if (error == ERR_peek_last_error() && /* oldest and latest errors match */
2603 /* check that the error origin matches */
2604 ERR_GET_LIB(error) == ERR_LIB_EVP &&
2605 ERR_GET_FUNC(error) == EVP_F_INT_CTX_NEW &&
2606 ERR_GET_REASON(error) == EVP_R_UNSUPPORTED_ALGORITHM)
2607 ERR_get_error(); /* pop error from queue */
2608 if (ERR_peek_error()) {
2609 BIO_printf(bio_err,
2610 "Unhandled error in the error queue during ECDH init.\n");
2611 ERR_print_errors(bio_err);
2612 rsa_count = 1;
2613 break;
2614 }
2615
2616 if ( /* Create the context for parameter generation */
2617 !(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)) ||
2618 /* Initialise the parameter generation */
2619 !EVP_PKEY_paramgen_init(pctx) ||
2620 /* Set the curve by NID */
2621 !EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
2622 test_curves
2623 [testnum]) ||
2624 /* Create the parameter object params */
2625 !EVP_PKEY_paramgen(pctx, &params)) {
2626 ecdh_checks = 0;
2627 BIO_printf(bio_err, "ECDH EC params init failure.\n");
2628 ERR_print_errors(bio_err);
2629 rsa_count = 1;
2630 break;
2631 }
2632 /* Create the context for the key generation */
2633 kctx = EVP_PKEY_CTX_new(params, NULL);
2634
2635 EVP_PKEY_free(params);
2636 params = NULL;
2637 EVP_PKEY_CTX_free(pctx);
2638 pctx = NULL;
2639 }
2640 if (!kctx || /* keygen ctx is not null */
2641 !EVP_PKEY_keygen_init(kctx) /* init keygen ctx */ ) {
2642 ecdh_checks = 0;
2643 BIO_printf(bio_err, "ECDH keygen failure.\n");
2644 ERR_print_errors(bio_err);
2645 rsa_count = 1;
2646 break;
2647 }
2648
2649 if (!EVP_PKEY_keygen(kctx, &key_A) || /* generate secret key A */
2650 !EVP_PKEY_keygen(kctx, &key_B) || /* generate secret key B */
2651 !(ctx = EVP_PKEY_CTX_new(key_A, NULL)) || /* derivation ctx from skeyA */
2652 !EVP_PKEY_derive_init(ctx) || /* init derivation ctx */
2653 !EVP_PKEY_derive_set_peer(ctx, key_B) || /* set peer pubkey in ctx */
2654 !EVP_PKEY_derive(ctx, NULL, &outlen) || /* determine max length */
2655 outlen == 0 || /* ensure outlen is a valid size */
2656 outlen > MAX_ECDH_SIZE /* avoid buffer overflow */ ) {
2657 ecdh_checks = 0;
2658 BIO_printf(bio_err, "ECDH key generation failure.\n");
2659 ERR_print_errors(bio_err);
2660 rsa_count = 1;
2661 break;
2662 }
2663
2664 /* Here we perform a test run, comparing the output of a*B and b*A;
2665 * we try this here and assume that further EVP_PKEY_derive calls
2666 * never fail, so we can skip checks in the actually benchmarked
2667 * code, for maximum performance. */
2668 if (!(test_ctx = EVP_PKEY_CTX_new(key_B, NULL)) || /* test ctx from skeyB */
2669 !EVP_PKEY_derive_init(test_ctx) || /* init derivation test_ctx */
2670 !EVP_PKEY_derive_set_peer(test_ctx, key_A) || /* set peer pubkey in test_ctx */
2671 !EVP_PKEY_derive(test_ctx, NULL, &test_outlen) || /* determine max length */
2672 !EVP_PKEY_derive(ctx, loopargs[i].secret_a, &outlen) || /* compute a*B */
2673 !EVP_PKEY_derive(test_ctx, loopargs[i].secret_b, &test_outlen) || /* compute b*A */
2674 test_outlen != outlen /* compare output length */ ) {
2675 ecdh_checks = 0;
2676 BIO_printf(bio_err, "ECDH computation failure.\n");
2677 ERR_print_errors(bio_err);
2678 rsa_count = 1;
2679 break;
2680 }
2681
2682 /* Compare the computation results: CRYPTO_memcmp() returns 0 if equal */
2683 if (CRYPTO_memcmp(loopargs[i].secret_a,
2684 loopargs[i].secret_b, outlen)) {
2685 ecdh_checks = 0;
2686 BIO_printf(bio_err, "ECDH computations don't match.\n");
2687 ERR_print_errors(bio_err);
2688 rsa_count = 1;
2689 break;
2690 }
2691
2692 loopargs[i].ecdh_ctx[testnum] = ctx;
2693 loopargs[i].outlen[testnum] = outlen;
2694
2695 EVP_PKEY_CTX_free(kctx);
2696 kctx = NULL;
2697 EVP_PKEY_CTX_free(test_ctx);
2698 test_ctx = NULL;
2699 }
2700 if (ecdh_checks != 0) {
2701 pkey_print_message("", "ecdh",
2702 ecdh_c[testnum][0],
2703 test_curves_bits[testnum], ECDH_SECONDS);
2704 Time_F(START);
2705 count =
2706 run_benchmark(async_jobs, ECDH_EVP_derive_key_loop, loopargs);
2707 d = Time_F(STOP);
2708 BIO_printf(bio_err,
2709 mr ? "+R7:%ld:%d:%.2f\n" :
2710 "%ld %d-bit ECDH ops in %.2fs\n", count,
2711 test_curves_bits[testnum], d);
2712 ecdh_results[testnum][0] = d / (double)count;
2713 rsa_count = count;
2714 }
2715
2716 if (rsa_count <= 1) {
2717 /* if longer than 10s, don't do any more */
2718 for (testnum++; testnum < EC_NUM; testnum++)
2719 ecdh_doit[testnum] = 0;
2720 }
2721 }
2722 #endif /* OPENSSL_NO_EC */
2723 #ifndef NO_FORK
2724 show_res:
2725 #endif
2726 if (!mr) {
2727 printf("%s\n", OpenSSL_version(OPENSSL_VERSION));
2728 printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON));
2729 printf("options:");
2730 printf("%s ", BN_options());
2731 #ifndef OPENSSL_NO_MD2
2732 printf("%s ", MD2_options());
2733 #endif
2734 #ifndef OPENSSL_NO_RC4
2735 printf("%s ", RC4_options());
2736 #endif
2737 #ifndef OPENSSL_NO_DES
2738 printf("%s ", DES_options());
2739 #endif
2740 printf("%s ", AES_options());
2741 #ifndef OPENSSL_NO_IDEA
2742 printf("%s ", IDEA_options());
2743 #endif
2744 #ifndef OPENSSL_NO_BF
2745 printf("%s ", BF_options());
2746 #endif
2747 printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS));
2748 }
2749
2750 if (pr_header) {
2751 if (mr)
2752 printf("+H");
2753 else {
2754 printf
2755 ("The 'numbers' are in 1000s of bytes per second processed.\n");
2756 printf("type ");
2757 }
2758 for (testnum = 0; testnum < SIZE_NUM; testnum++)
2759 printf(mr ? ":%d" : "%7d bytes", lengths[testnum]);
2760 printf("\n");
2761 }
2762
2763 for (k = 0; k < ALGOR_NUM; k++) {
2764 if (!doit[k])
2765 continue;
2766 if (mr)
2767 printf("+F:%d:%s", k, names[k]);
2768 else
2769 printf("%-13s", names[k]);
2770 for (testnum = 0; testnum < SIZE_NUM; testnum++) {
2771 if (results[k][testnum] > 10000 && !mr)
2772 printf(" %11.2fk", results[k][testnum] / 1e3);
2773 else
2774 printf(mr ? ":%.2f" : " %11.2f ", results[k][testnum]);
2775 }
2776 printf("\n");
2777 }
2778 #ifndef OPENSSL_NO_RSA
2779 testnum = 1;
2780 for (k = 0; k < RSA_NUM; k++) {
2781 if (!rsa_doit[k])
2782 continue;
2783 if (testnum && !mr) {
2784 printf("%18ssign verify sign/s verify/s\n", " ");
2785 testnum = 0;
2786 }
2787 if (mr)
2788 printf("+F2:%u:%u:%f:%f\n",
2789 k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]);
2790 else
2791 printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2792 rsa_bits[k], 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1],
2793 rsa_results[k][0], rsa_results[k][1]);
2794 }
2795 #endif
2796 #ifndef OPENSSL_NO_DSA
2797 testnum = 1;
2798 for (k = 0; k < DSA_NUM; k++) {
2799 if (!dsa_doit[k])
2800 continue;
2801 if (testnum && !mr) {
2802 printf("%18ssign verify sign/s verify/s\n", " ");
2803 testnum = 0;
2804 }
2805 if (mr)
2806 printf("+F3:%u:%u:%f:%f\n",
2807 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
2808 else
2809 printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2810 dsa_bits[k], 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1],
2811 dsa_results[k][0], dsa_results[k][1]);
2812 }
2813 #endif
2814 #ifndef OPENSSL_NO_EC
2815 testnum = 1;
2816 for (k = 0; k < EC_NUM; k++) {
2817 if (!ecdsa_doit[k])
2818 continue;
2819 if (testnum && !mr) {
2820 printf("%30ssign verify sign/s verify/s\n", " ");
2821 testnum = 0;
2822 }
2823
2824 if (mr)
2825 printf("+F4:%u:%u:%f:%f\n",
2826 k, test_curves_bits[k],
2827 ecdsa_results[k][0], ecdsa_results[k][1]);
2828 else
2829 printf("%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2830 test_curves_bits[k],
2831 test_curves_names[k],
2832 ecdsa_results[k][0], ecdsa_results[k][1],
2833 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1]);
2834 }
2835
2836 testnum = 1;
2837 for (k = 0; k < EC_NUM; k++) {
2838 if (!ecdh_doit[k])
2839 continue;
2840 if (testnum && !mr) {
2841 printf("%30sop op/s\n", " ");
2842 testnum = 0;
2843 }
2844 if (mr)
2845 printf("+F5:%u:%u:%f:%f\n",
2846 k, test_curves_bits[k],
2847 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2848
2849 else
2850 printf("%4u bit ecdh (%s) %8.4fs %8.1f\n",
2851 test_curves_bits[k],
2852 test_curves_names[k],
2853 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2854 }
2855 #endif
2856
2857 ret = 0;
2858
2859 end:
2860 ERR_print_errors(bio_err);
2861 for (i = 0; i < loopargs_len; i++) {
2862 OPENSSL_free(loopargs[i].buf_malloc);
2863 OPENSSL_free(loopargs[i].buf2_malloc);
2864
2865 #ifndef OPENSSL_NO_RSA
2866 for (k = 0; k < RSA_NUM; k++)
2867 RSA_free(loopargs[i].rsa_key[k]);
2868 #endif
2869 #ifndef OPENSSL_NO_DSA
2870 for (k = 0; k < DSA_NUM; k++)
2871 DSA_free(loopargs[i].dsa_key[k]);
2872 #endif
2873 #ifndef OPENSSL_NO_EC
2874 for (k = 0; k < EC_NUM; k++) {
2875 EC_KEY_free(loopargs[i].ecdsa[k]);
2876 EVP_PKEY_CTX_free(loopargs[i].ecdh_ctx[k]);
2877 }
2878 OPENSSL_free(loopargs[i].secret_a);
2879 OPENSSL_free(loopargs[i].secret_b);
2880 #endif
2881 }
2882
2883 if (async_jobs > 0) {
2884 for (i = 0; i < loopargs_len; i++)
2885 ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx);
2886 }
2887
2888 if (async_init) {
2889 ASYNC_cleanup_thread();
2890 }
2891 OPENSSL_free(loopargs);
2892 release_engine(e);
2893 return (ret);
2894 }
2895
2896 static void print_message(const char *s, long num, int length)
2897 {
2898 #ifdef SIGALRM
2899 BIO_printf(bio_err,
2900 mr ? "+DT:%s:%d:%d\n"
2901 : "Doing %s for %ds on %d size blocks: ", s, SECONDS, length);
2902 (void)BIO_flush(bio_err);
2903 alarm(SECONDS);
2904 #else
2905 BIO_printf(bio_err,
2906 mr ? "+DN:%s:%ld:%d\n"
2907 : "Doing %s %ld times on %d size blocks: ", s, num, length);
2908 (void)BIO_flush(bio_err);
2909 #endif
2910 }
2911
2912 static void pkey_print_message(const char *str, const char *str2, long num,
2913 int bits, int tm)
2914 {
2915 #ifdef SIGALRM
2916 BIO_printf(bio_err,
2917 mr ? "+DTP:%d:%s:%s:%d\n"
2918 : "Doing %d bit %s %s's for %ds: ", bits, str, str2, tm);
2919 (void)BIO_flush(bio_err);
2920 alarm(tm);
2921 #else
2922 BIO_printf(bio_err,
2923 mr ? "+DNP:%ld:%d:%s:%s\n"
2924 : "Doing %ld %d bit %s %s's: ", num, bits, str, str2);
2925 (void)BIO_flush(bio_err);
2926 #endif
2927 }
2928
2929 static void print_result(int alg, int run_no, int count, double time_used)
2930 {
2931 if (count == -1) {
2932 BIO_puts(bio_err, "EVP error!\n");
2933 exit(1);
2934 }
2935 BIO_printf(bio_err,
2936 mr ? "+R:%d:%s:%f\n"
2937 : "%d %s's in %.2fs\n", count, names[alg], time_used);
2938 results[alg][run_no] = ((double)count) / time_used * lengths[run_no];
2939 }
2940
2941 #ifndef NO_FORK
2942 static char *sstrsep(char **string, const char *delim)
2943 {
2944 char isdelim[256];
2945 char *token = *string;
2946
2947 if (**string == 0)
2948 return NULL;
2949
2950 memset(isdelim, 0, sizeof isdelim);
2951 isdelim[0] = 1;
2952
2953 while (*delim) {
2954 isdelim[(unsigned char)(*delim)] = 1;
2955 delim++;
2956 }
2957
2958 while (!isdelim[(unsigned char)(**string)]) {
2959 (*string)++;
2960 }
2961
2962 if (**string) {
2963 **string = 0;
2964 (*string)++;
2965 }
2966
2967 return token;
2968 }
2969
2970 static int do_multi(int multi)
2971 {
2972 int n;
2973 int fd[2];
2974 int *fds;
2975 static char sep[] = ":";
2976
2977 fds = malloc(sizeof(*fds) * multi);
2978 for (n = 0; n < multi; ++n) {
2979 if (pipe(fd) == -1) {
2980 BIO_printf(bio_err, "pipe failure\n");
2981 exit(1);
2982 }
2983 fflush(stdout);
2984 (void)BIO_flush(bio_err);
2985 if (fork()) {
2986 close(fd[1]);
2987 fds[n] = fd[0];
2988 } else {
2989 close(fd[0]);
2990 close(1);
2991 if (dup(fd[1]) == -1) {
2992 BIO_printf(bio_err, "dup failed\n");
2993 exit(1);
2994 }
2995 close(fd[1]);
2996 mr = 1;
2997 usertime = 0;
2998 free(fds);
2999 return 0;
3000 }
3001 printf("Forked child %d\n", n);
3002 }
3003
3004 /* for now, assume the pipe is long enough to take all the output */
3005 for (n = 0; n < multi; ++n) {
3006 FILE *f;
3007 char buf[1024];
3008 char *p;
3009
3010 f = fdopen(fds[n], "r");
3011 while (fgets(buf, sizeof buf, f)) {
3012 p = strchr(buf, '\n');
3013 if (p)
3014 *p = '\0';
3015 if (buf[0] != '+') {
3016 BIO_printf(bio_err,
3017 "Don't understand line '%s' from child %d\n", buf,
3018 n);
3019 continue;
3020 }
3021 printf("Got: %s from %d\n", buf, n);
3022 if (strncmp(buf, "+F:", 3) == 0) {
3023 int alg;
3024 int j;
3025
3026 p = buf + 3;
3027 alg = atoi(sstrsep(&p, sep));
3028 sstrsep(&p, sep);
3029 for (j = 0; j < SIZE_NUM; ++j)
3030 results[alg][j] += atof(sstrsep(&p, sep));
3031 } else if (strncmp(buf, "+F2:", 4) == 0) {
3032 int k;
3033 double d;
3034
3035 p = buf + 4;
3036 k = atoi(sstrsep(&p, sep));
3037 sstrsep(&p, sep);
3038
3039 d = atof(sstrsep(&p, sep));
3040 rsa_results[k][0] += d;
3041
3042 d = atof(sstrsep(&p, sep));
3043 rsa_results[k][1] += d;
3044 }
3045 # ifndef OPENSSL_NO_DSA
3046 else if (strncmp(buf, "+F3:", 4) == 0) {
3047 int k;
3048 double d;
3049
3050 p = buf + 4;
3051 k = atoi(sstrsep(&p, sep));
3052 sstrsep(&p, sep);
3053
3054 d = atof(sstrsep(&p, sep));
3055 dsa_results[k][0] += d;
3056
3057 d = atof(sstrsep(&p, sep));
3058 dsa_results[k][1] += d;
3059 }
3060 # endif
3061 # ifndef OPENSSL_NO_EC
3062 else if (strncmp(buf, "+F4:", 4) == 0) {
3063 int k;
3064 double d;
3065
3066 p = buf + 4;
3067 k = atoi(sstrsep(&p, sep));
3068 sstrsep(&p, sep);
3069
3070 d = atof(sstrsep(&p, sep));
3071 if (n)
3072 ecdsa_results[k][0] = 1 / (1 / ecdsa_results[k][0] + 1 / d);
3073 else
3074 ecdsa_results[k][0] = d;
3075
3076 d = atof(sstrsep(&p, sep));
3077 if (n)
3078 ecdsa_results[k][1] = 1 / (1 / ecdsa_results[k][1] + 1 / d);
3079 else
3080 ecdsa_results[k][1] = d;
3081 } else if (strncmp(buf, "+F5:", 4) == 0) {
3082 int k;
3083 double d;
3084
3085 p = buf + 4;
3086 k = atoi(sstrsep(&p, sep));
3087 sstrsep(&p, sep);
3088
3089 d = atof(sstrsep(&p, sep));
3090 if (n)
3091 ecdh_results[k][0] = 1 / (1 / ecdh_results[k][0] + 1 / d);
3092 else
3093 ecdh_results[k][0] = d;
3094
3095 }
3096 # endif
3097
3098 else if (strncmp(buf, "+H:", 3) == 0) {
3099 ;
3100 } else
3101 BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf,
3102 n);
3103 }
3104
3105 fclose(f);
3106 }
3107 free(fds);
3108 return 1;
3109 }
3110 #endif
3111
3112 static void multiblock_speed(const EVP_CIPHER *evp_cipher)
3113 {
3114 static int mblengths[] =
3115 { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
3116 int j, count, num = OSSL_NELEM(mblengths);
3117 const char *alg_name;
3118 unsigned char *inp, *out, no_key[32], no_iv[16];
3119 EVP_CIPHER_CTX *ctx;
3120 double d = 0.0;
3121
3122 inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
3123 out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
3124 ctx = EVP_CIPHER_CTX_new();
3125 EVP_EncryptInit_ex(ctx, evp_cipher, NULL, no_key, no_iv);
3126 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key), no_key);
3127 alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
3128
3129 for (j = 0; j < num; j++) {
3130 print_message(alg_name, 0, mblengths[j]);
3131 Time_F(START);
3132 for (count = 0, run = 1; run && count < 0x7fffffff; count++) {
3133 unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
3134 EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
3135 size_t len = mblengths[j];
3136 int packlen;
3137
3138 memset(aad, 0, 8); /* avoid uninitialized values */
3139 aad[8] = 23; /* SSL3_RT_APPLICATION_DATA */
3140 aad[9] = 3; /* version */
3141 aad[10] = 2;
3142 aad[11] = 0; /* length */
3143 aad[12] = 0;
3144 mb_param.out = NULL;
3145 mb_param.inp = aad;
3146 mb_param.len = len;
3147 mb_param.interleave = 8;
3148
3149 packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
3150 sizeof(mb_param), &mb_param);
3151
3152 if (packlen > 0) {
3153 mb_param.out = out;
3154 mb_param.inp = inp;
3155 mb_param.len = len;
3156 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
3157 sizeof(mb_param), &mb_param);
3158 } else {
3159 int pad;
3160
3161 RAND_bytes(out, 16);
3162 len += 16;
3163 aad[11] = len >> 8;
3164 aad[12] = len;
3165 pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
3166 EVP_AEAD_TLS1_AAD_LEN, aad);
3167 EVP_Cipher(ctx, out, inp, len + pad);
3168 }
3169 }
3170 d = Time_F(STOP);
3171 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
3172 : "%d %s's in %.2fs\n", count, "evp", d);
3173 results[D_EVP][j] = ((double)count) / d * mblengths[j];
3174 }
3175
3176 if (mr) {
3177 fprintf(stdout, "+H");
3178 for (j = 0; j < num; j++)
3179 fprintf(stdout, ":%d", mblengths[j]);
3180 fprintf(stdout, "\n");
3181 fprintf(stdout, "+F:%d:%s", D_EVP, alg_name);
3182 for (j = 0; j < num; j++)
3183 fprintf(stdout, ":%.2f", results[D_EVP][j]);
3184 fprintf(stdout, "\n");
3185 } else {
3186 fprintf(stdout,
3187 "The 'numbers' are in 1000s of bytes per second processed.\n");
3188 fprintf(stdout, "type ");
3189 for (j = 0; j < num; j++)
3190 fprintf(stdout, "%7d bytes", mblengths[j]);
3191 fprintf(stdout, "\n");
3192 fprintf(stdout, "%-24s", alg_name);
3193
3194 for (j = 0; j < num; j++) {
3195 if (results[D_EVP][j] > 10000)
3196 fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3);
3197 else
3198 fprintf(stdout, " %11.2f ", results[D_EVP][j]);
3199 }
3200 fprintf(stdout, "\n");
3201 }
3202
3203 OPENSSL_free(inp);
3204 OPENSSL_free(out);
3205 EVP_CIPHER_CTX_free(ctx);
3206 }