Bug Summary

File:src/usr.bin/openssl/speed.c
Warning:line 1580, column 4
Value stored to 'rsa_count' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.4 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name speed.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/usr.bin/openssl/obj -resource-dir /usr/local/llvm16/lib/clang/16 -D LIBRESSL_INTERNAL -internal-isystem /usr/local/llvm16/lib/clang/16/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.bin/openssl/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fcf-protection=branch -fno-jump-tables -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/scan/2024-01-11-140451-98009-1 -x c /usr/src/usr.bin/openssl/speed.c
1/* $OpenBSD: speed.c,v 1.34 2023/07/27 07:01:50 tb Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60 *
61 * Portions of the attached software ("Contribution") are developed by
62 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
63 *
64 * The Contribution is licensed pursuant to the OpenSSL open source
65 * license provided above.
66 *
67 * The ECDH and ECDSA speed test software is originally written by
68 * Sumit Gupta of Sun Microsystems Laboratories.
69 *
70 */
71
72/* most of this code has been pilfered from my libdes speed.c program */
73
74#ifndef OPENSSL_NO_SPEED
75
76#define SECONDS3 3
77#define RSA_SECONDS10 10
78#define DSA_SECONDS10 10
79#define ECDSA_SECONDS10 10
80#define ECDH_SECONDS10 10
81
82#define MAX_UNALIGN16 16
83
84#include <math.h>
85#include <signal.h>
86#include <stdio.h>
87#include <stdlib.h>
88#include <limits.h>
89#include <string.h>
90#include <unistd.h>
91
92#include "apps.h"
93
94#include <openssl/bn.h>
95#include <openssl/crypto.h>
96#include <openssl/err.h>
97#include <openssl/evp.h>
98#include <openssl/modes.h>
99#include <openssl/objects.h>
100#include <openssl/x509.h>
101
102#ifndef OPENSSL_NO_AES
103#include <openssl/aes.h>
104#endif
105#ifndef OPENSSL_NO_BF
106#include <openssl/blowfish.h>
107#endif
108#ifndef OPENSSL_NO_CAST
109#include <openssl/cast.h>
110#endif
111#ifndef OPENSSL_NO_CAMELLIA
112#include <openssl/camellia.h>
113#endif
114#ifndef OPENSSL_NO_DES
115#include <openssl/des.h>
116#endif
117#include <openssl/dsa.h>
118#include <openssl/ecdh.h>
119#include <openssl/ecdsa.h>
120#ifndef OPENSSL_NO_HMAC
121#include <openssl/hmac.h>
122#endif
123#ifndef OPENSSL_NO_IDEA
124#include <openssl/idea.h>
125#endif
126#ifndef OPENSSL_NO_MD4
127#include <openssl/md4.h>
128#endif
129#ifndef OPENSSL_NO_MD5
130#include <openssl/md5.h>
131#endif
132#ifndef OPENSSL_NO_RC2
133#include <openssl/rc2.h>
134#endif
135#ifndef OPENSSL_NO_RC4
136#include <openssl/rc4.h>
137#endif
138#include <openssl/rsa.h>
139#ifndef OPENSSL_NO_RIPEMD
140#include <openssl/ripemd.h>
141#endif
142#ifndef OPENSSL_NO_SHA
143#include <openssl/sha.h>
144#endif
145#ifndef OPENSSL_NO_WHIRLPOOL
146#include <openssl/whrlpool.h>
147#endif
148
149#include "./testdsa.h"
150#include "./testrsa.h"
151
152#define BUFSIZE(1024*8+64) (1024*8+64)
153int run = 0;
154
155static int mr = 0;
156static int usertime = 1;
157
158static double Time_F(int s);
159static void print_message(const char *s, long num, int length);
160static void
161pkey_print_message(const char *str, const char *str2,
162 long num, int bits, int sec);
163static void print_result(int alg, int run_no, int count, double time_used);
164static int do_multi(int multi);
165
166#define ALGOR_NUM32 32
167#define SIZE_NUM5 5
168#define RSA_NUM4 4
169#define DSA_NUM3 3
170
171#define EC_NUM6 6
172#define MAX_ECDH_SIZE256 256
173
174static const char *names[ALGOR_NUM32] = {
175 "md2", "md4", "md5", "hmac(md5)", "sha1", "rmd160",
176 "rc4", "des cbc", "des ede3", "idea cbc", "seed cbc",
177 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
178 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
179 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
180 "evp", "sha256", "sha512", "whirlpool",
181 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash",
182 "aes-128 gcm", "aes-256 gcm", "chacha20 poly1305",
183};
184static double results[ALGOR_NUM32][SIZE_NUM5];
185static int lengths[SIZE_NUM5] = {16, 64, 256, 1024, 8 * 1024};
186static double rsa_results[RSA_NUM4][2];
187static double dsa_results[DSA_NUM3][2];
188static double ecdsa_results[EC_NUM6][2];
189static double ecdh_results[EC_NUM6][1];
190
191static void sig_done(int sig);
192
193static void
194sig_done(int sig)
195{
196 signal(SIGALRM14, sig_done);
197 run = 0;
198}
199
200#define START0 TM_RESET0
201#define STOP1 TM_GET1
202
203
204static double
205Time_F(int s)
206{
207 if (usertime)
208 return app_timer_user(s);
209 else
210 return app_timer_real(s);
211}
212
213
214static const int KDF1_SHA1_len = 20;
215static void *
216KDF1_SHA1(const void *in, size_t inlen, void *out, size_t * outlen)
217{
218#ifndef OPENSSL_NO_SHA
219 if (*outlen < SHA_DIGEST_LENGTH20)
220 return NULL((void *)0);
221 else
222 *outlen = SHA_DIGEST_LENGTH20;
223 return SHA1(in, inlen, out);
224#else
225 return NULL((void *)0);
226#endif /* OPENSSL_NO_SHA */
227}
228
229int
230speed_main(int argc, char **argv)
231{
232 unsigned char *real_buf = NULL((void *)0), *real_buf2 = NULL((void *)0);
233 unsigned char *buf = NULL((void *)0), *buf2 = NULL((void *)0);
234 size_t unaligned = 0;
235 int mret = 1;
236 long count = 0, save_count = 0;
237 int i, j, k;
238 long rsa_count;
239 unsigned rsa_num;
240 unsigned char md[EVP_MAX_MD_SIZE64];
241#ifndef OPENSSL_NO_MD4
242 unsigned char md4[MD4_DIGEST_LENGTH16];
243#endif
244#ifndef OPENSSL_NO_MD5
245 unsigned char md5[MD5_DIGEST_LENGTH16];
246 unsigned char hmac[MD5_DIGEST_LENGTH16];
247#endif
248#ifndef OPENSSL_NO_SHA
249 unsigned char sha[SHA_DIGEST_LENGTH20];
250#ifndef OPENSSL_NO_SHA256
251 unsigned char sha256[SHA256_DIGEST_LENGTH32];
252#endif
253#ifndef OPENSSL_NO_SHA512
254 unsigned char sha512[SHA512_DIGEST_LENGTH64];
255#endif
256#endif
257#ifndef OPENSSL_NO_WHIRLPOOL
258 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH(512/8)];
259#endif
260#ifndef OPENSSL_NO_RIPEMD
261 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH20];
262#endif
263#ifndef OPENSSL_NO_RC4
264 RC4_KEY rc4_ks;
265#endif
266#ifndef OPENSSL_NO_RC2
267 RC2_KEY rc2_ks;
268#endif
269#ifndef OPENSSL_NO_IDEA
270 IDEA_KEY_SCHEDULE idea_ks;
271#endif
272#ifndef OPENSSL_NO_BF
273 BF_KEY bf_ks;
274#endif
275#ifndef OPENSSL_NO_CAST
276 CAST_KEY cast_ks;
277#endif
278 static const unsigned char key16[16] =
279 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
280 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12};
281#ifndef OPENSSL_NO_AES
282 static const unsigned char key24[24] =
283 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
284 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
285 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34};
286 static const unsigned char key32[32] =
287 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
288 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
289 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
290 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56};
291#endif
292#ifndef OPENSSL_NO_CAMELLIA
293 static const unsigned char ckey24[24] =
294 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
295 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
296 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34};
297 static const unsigned char ckey32[32] =
298 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
299 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
300 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
301 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56};
302#endif
303#ifndef OPENSSL_NO_AES
304#define MAX_BLOCK_SIZE128 128
305#else
306#define MAX_BLOCK_SIZE128 64
307#endif
308 unsigned char DES_iv[8];
309 unsigned char iv[2 * MAX_BLOCK_SIZE128 / 8];
310#ifndef OPENSSL_NO_DES
311 static DES_cblock key = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0};
312 static DES_cblock key2 = {0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12};
313 static DES_cblock key3 = {0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34};
314 DES_key_schedule sch;
315 DES_key_schedule sch2;
316 DES_key_schedule sch3;
317#endif
318#ifndef OPENSSL_NO_AES
319 AES_KEY aes_ks1, aes_ks2, aes_ks3;
320#endif
321#ifndef OPENSSL_NO_CAMELLIA
322 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
323#endif
324#define D_MD20 0
325#define D_MD41 1
326#define D_MD52 2
327#define D_HMAC3 3
328#define D_SHA14 4
329#define D_RMD1605 5
330#define D_RC46 6
331#define D_CBC_DES7 7
332#define D_EDE3_DES8 8
333#define D_CBC_IDEA9 9
334#define D_CBC_SEED10 10
335#define D_CBC_RC211 11
336#define D_CBC_RC512 12
337#define D_CBC_BF13 13
338#define D_CBC_CAST14 14
339#define D_CBC_128_AES15 15
340#define D_CBC_192_AES16 16
341#define D_CBC_256_AES17 17
342#define D_CBC_128_CML18 18
343#define D_CBC_192_CML19 19
344#define D_CBC_256_CML20 20
345#define D_EVP21 21
346#define D_SHA25622 22
347#define D_SHA51223 23
348#define D_WHIRLPOOL24 24
349#define D_IGE_128_AES25 25
350#define D_IGE_192_AES26 26
351#define D_IGE_256_AES27 27
352#define D_GHASH28 28
353#define D_AES_128_GCM29 29
354#define D_AES_256_GCM30 30
355#define D_CHACHA20_POLY130531 31
356 double d = 0.0;
357 long c[ALGOR_NUM32][SIZE_NUM5];
358#define R_DSA_5120 0
359#define R_DSA_10241 1
360#define R_DSA_20482 2
361#define R_RSA_5120 0
362#define R_RSA_10241 1
363#define R_RSA_20482 2
364#define R_RSA_40963 3
365
366#define R_EC_P1600 0
367#define R_EC_P1921 1
368#define R_EC_P2242 2
369#define R_EC_P2563 3
370#define R_EC_P3844 4
371#define R_EC_P5215 5
372
373 RSA *rsa_key[RSA_NUM4];
374 long rsa_c[RSA_NUM4][2];
375 static unsigned int rsa_bits[RSA_NUM4] = {512, 1024, 2048, 4096};
376 static unsigned char *rsa_data[RSA_NUM4] =
377 {test512, test1024, test2048, test4096};
378 static int rsa_data_length[RSA_NUM4] = {
379 sizeof(test512), sizeof(test1024),
380 sizeof(test2048), sizeof(test4096)};
381 DSA *dsa_key[DSA_NUM3];
382 long dsa_c[DSA_NUM3][2];
383 static unsigned int dsa_bits[DSA_NUM3] = {512, 1024, 2048};
384#ifndef OPENSSL_NO_EC
385 /*
386 * We only test over the following curves as they are representative,
387 * To add tests over more curves, simply add the curve NID and curve
388 * name to the following arrays and increase the EC_NUM value
389 * accordingly.
390 */
391 static unsigned int test_curves[EC_NUM6] = {
392 NID_secp160r1709,
393 NID_X9_62_prime192v1409,
394 NID_secp224r1713,
395 NID_X9_62_prime256v1415,
396 NID_secp384r1715,
397 NID_secp521r1716,
398 };
399 static const char *test_curves_names[EC_NUM6] = {
400 "secp160r1",
401 "nistp192",
402 "nistp224",
403 "nistp256",
404 "nistp384",
405 "nistp521",
406 };
407 static int test_curves_bits[EC_NUM6] = {
408 160, 192, 224, 256, 384, 521,
409 };
410
411#endif
412
413 unsigned char ecdsasig[256];
414 unsigned int ecdsasiglen;
415 EC_KEY *ecdsa[EC_NUM6];
416 long ecdsa_c[EC_NUM6][2];
417
418 EC_KEY *ecdh_a[EC_NUM6], *ecdh_b[EC_NUM6];
419 unsigned char secret_a[MAX_ECDH_SIZE256], secret_b[MAX_ECDH_SIZE256];
420 int secret_size_a, secret_size_b;
421 int ecdh_checks = 0;
422 int secret_idx = 0;
423 long ecdh_c[EC_NUM6][2];
424
425 int rsa_doit[RSA_NUM4];
426 int dsa_doit[DSA_NUM3];
427 int ecdsa_doit[EC_NUM6];
428 int ecdh_doit[EC_NUM6];
429 int doit[ALGOR_NUM32];
430 int pr_header = 0;
431 const EVP_CIPHER *evp_cipher = NULL((void *)0);
432 const EVP_MD *evp_md = NULL((void *)0);
433 int decrypt = 0;
434 int multi = 0;
435 const char *errstr = NULL((void *)0);
436
437 if (pledge("stdio proc", NULL((void *)0)) == -1) {
438 perror("pledge");
439 exit(1);
440 }
441
442 usertime = -1;
443
444 memset(results, 0, sizeof(results));
445 memset(dsa_key, 0, sizeof(dsa_key));
446 for (i = 0; i < EC_NUM6; i++)
447 ecdsa[i] = NULL((void *)0);
448 for (i = 0; i < EC_NUM6; i++) {
449 ecdh_a[i] = NULL((void *)0);
450 ecdh_b[i] = NULL((void *)0);
451 }
452
453 memset(rsa_key, 0, sizeof(rsa_key));
454 for (i = 0; i < RSA_NUM4; i++)
455 rsa_key[i] = NULL((void *)0);
456
457 if ((buf = real_buf = malloc(BUFSIZE(1024*8+64) + MAX_UNALIGN16)) == NULL((void *)0)) {
458 BIO_printf(bio_err, "out of memory\n");
459 goto end;
460 }
461 if ((buf2 = real_buf2 = malloc(BUFSIZE(1024*8+64) + MAX_UNALIGN16)) == NULL((void *)0)) {
462 BIO_printf(bio_err, "out of memory\n");
463 goto end;
464 }
465 memset(c, 0, sizeof(c));
466 memset(DES_iv, 0, sizeof(DES_iv));
467 memset(iv, 0, sizeof(iv));
468
469 for (i = 0; i < ALGOR_NUM32; i++)
470 doit[i] = 0;
471 for (i = 0; i < RSA_NUM4; i++)
472 rsa_doit[i] = 0;
473 for (i = 0; i < DSA_NUM3; i++)
474 dsa_doit[i] = 0;
475 for (i = 0; i < EC_NUM6; i++)
476 ecdsa_doit[i] = 0;
477 for (i = 0; i < EC_NUM6; i++)
478 ecdh_doit[i] = 0;
479
480
481 j = 0;
482 argc--;
483 argv++;
484 while (argc) {
485 if (argc > 0 && strcmp(*argv, "-elapsed") == 0) {
486 usertime = 0;
487 j--; /* Otherwise, -elapsed gets confused with an
488 * algorithm. */
489 } else if (argc > 0 && strcmp(*argv, "-evp") == 0) {
490 argc--;
491 argv++;
492 if (argc == 0) {
493 BIO_printf(bio_err, "no EVP given\n");
494 goto end;
495 }
496 evp_cipher = EVP_get_cipherbyname(*argv);
497 if (!evp_cipher) {
498 evp_md = EVP_get_digestbyname(*argv);
499 }
500 if (!evp_cipher && !evp_md) {
501 BIO_printf(bio_err, "%s is an unknown cipher or digest\n", *argv);
502 goto end;
503 }
504 doit[D_EVP21] = 1;
505 } else if (argc > 0 && strcmp(*argv, "-decrypt") == 0) {
506 decrypt = 1;
507 j--; /* Otherwise, -decrypt gets confused with an
508 * algorithm. */
509 } else if (argc > 0 && strcmp(*argv, "-multi") == 0) {
510 argc--;
511 argv++;
512 if (argc == 0) {
513 BIO_printf(bio_err, "no multi count given\n");
514 goto end;
515 }
516 multi = strtonum(argv[0], 1, INT_MAX0x7fffffff, &errstr);
517 if (errstr) {
518 BIO_printf(bio_err, "bad multi count: %s", errstr);
519 goto end;
520 }
521 j--; /* Otherwise, -multi gets confused with an
522 * algorithm. */
523 } else if (argc > 0 && strcmp(*argv, "-unaligned") == 0) {
524 argc--;
525 argv++;
526 if (argc == 0) {
527 BIO_printf(bio_err, "no alignment offset given\n");
528 goto end;
529 }
530 unaligned = strtonum(argv[0], 0, MAX_UNALIGN16, &errstr);
531 if (errstr) {
532 BIO_printf(bio_err, "bad alignment offset: %s",
533 errstr);
534 goto end;
535 }
536 buf = real_buf + unaligned;
537 buf2 = real_buf2 + unaligned;
538 j--; /* Otherwise, -unaligned gets confused with an
539 * algorithm. */
540 } else if (argc > 0 && strcmp(*argv, "-mr") == 0) {
541 mr = 1;
542 j--; /* Otherwise, -mr gets confused with an
543 * algorithm. */
544 } else
545#ifndef OPENSSL_NO_MD4
546 if (strcmp(*argv, "md4") == 0)
547 doit[D_MD41] = 1;
548 else
549#endif
550#ifndef OPENSSL_NO_MD5
551 if (strcmp(*argv, "md5") == 0)
552 doit[D_MD52] = 1;
553 else
554#endif
555#ifndef OPENSSL_NO_MD5
556 if (strcmp(*argv, "hmac") == 0)
557 doit[D_HMAC3] = 1;
558 else
559#endif
560#ifndef OPENSSL_NO_SHA
561 if (strcmp(*argv, "sha1") == 0)
562 doit[D_SHA14] = 1;
563 else if (strcmp(*argv, "sha") == 0)
564 doit[D_SHA14] = 1,
565 doit[D_SHA25622] = 1,
566 doit[D_SHA51223] = 1;
567 else
568#ifndef OPENSSL_NO_SHA256
569 if (strcmp(*argv, "sha256") == 0)
570 doit[D_SHA25622] = 1;
571 else
572#endif
573#ifndef OPENSSL_NO_SHA512
574 if (strcmp(*argv, "sha512") == 0)
575 doit[D_SHA51223] = 1;
576 else
577#endif
578#endif
579#ifndef OPENSSL_NO_WHIRLPOOL
580 if (strcmp(*argv, "whirlpool") == 0)
581 doit[D_WHIRLPOOL24] = 1;
582 else
583#endif
584#ifndef OPENSSL_NO_RIPEMD
585 if (strcmp(*argv, "ripemd") == 0)
586 doit[D_RMD1605] = 1;
587 else if (strcmp(*argv, "rmd160") == 0)
588 doit[D_RMD1605] = 1;
589 else if (strcmp(*argv, "ripemd160") == 0)
590 doit[D_RMD1605] = 1;
591 else
592#endif
593#ifndef OPENSSL_NO_RC4
594 if (strcmp(*argv, "rc4") == 0)
595 doit[D_RC46] = 1;
596 else
597#endif
598#ifndef OPENSSL_NO_DES
599 if (strcmp(*argv, "des-cbc") == 0)
600 doit[D_CBC_DES7] = 1;
601 else if (strcmp(*argv, "des-ede3") == 0)
602 doit[D_EDE3_DES8] = 1;
603 else
604#endif
605#ifndef OPENSSL_NO_AES
606 if (strcmp(*argv, "aes-128-cbc") == 0)
607 doit[D_CBC_128_AES15] = 1;
608 else if (strcmp(*argv, "aes-192-cbc") == 0)
609 doit[D_CBC_192_AES16] = 1;
610 else if (strcmp(*argv, "aes-256-cbc") == 0)
611 doit[D_CBC_256_AES17] = 1;
612 else if (strcmp(*argv, "aes-128-ige") == 0)
613 doit[D_IGE_128_AES25] = 1;
614 else if (strcmp(*argv, "aes-192-ige") == 0)
615 doit[D_IGE_192_AES26] = 1;
616 else if (strcmp(*argv, "aes-256-ige") == 0)
617 doit[D_IGE_256_AES27] = 1;
618 else
619#endif
620#ifndef OPENSSL_NO_CAMELLIA
621 if (strcmp(*argv, "camellia-128-cbc") == 0)
622 doit[D_CBC_128_CML18] = 1;
623 else if (strcmp(*argv, "camellia-192-cbc") == 0)
624 doit[D_CBC_192_CML19] = 1;
625 else if (strcmp(*argv, "camellia-256-cbc") == 0)
626 doit[D_CBC_256_CML20] = 1;
627 else
628#endif
629#ifndef RSA_NULL
630 if (strcmp(*argv, "openssl") == 0) {
631 RSA_set_default_method(RSA_PKCS1_SSLeay());
632 j--;
633 } else
634#endif
635 if (strcmp(*argv, "dsa512") == 0)
636 dsa_doit[R_DSA_5120] = 2;
637 else if (strcmp(*argv, "dsa1024") == 0)
638 dsa_doit[R_DSA_10241] = 2;
639 else if (strcmp(*argv, "dsa2048") == 0)
640 dsa_doit[R_DSA_20482] = 2;
641 else if (strcmp(*argv, "rsa512") == 0)
642 rsa_doit[R_RSA_5120] = 2;
643 else if (strcmp(*argv, "rsa1024") == 0)
644 rsa_doit[R_RSA_10241] = 2;
645 else if (strcmp(*argv, "rsa2048") == 0)
646 rsa_doit[R_RSA_20482] = 2;
647 else if (strcmp(*argv, "rsa4096") == 0)
648 rsa_doit[R_RSA_40963] = 2;
649 else
650#ifndef OPENSSL_NO_RC2
651 if (strcmp(*argv, "rc2-cbc") == 0)
652 doit[D_CBC_RC211] = 1;
653 else if (strcmp(*argv, "rc2") == 0)
654 doit[D_CBC_RC211] = 1;
655 else
656#endif
657#ifndef OPENSSL_NO_IDEA
658 if (strcmp(*argv, "idea-cbc") == 0)
659 doit[D_CBC_IDEA9] = 1;
660 else if (strcmp(*argv, "idea") == 0)
661 doit[D_CBC_IDEA9] = 1;
662 else
663#endif
664#ifndef OPENSSL_NO_BF
665 if (strcmp(*argv, "bf-cbc") == 0)
666 doit[D_CBC_BF13] = 1;
667 else if (strcmp(*argv, "blowfish") == 0)
668 doit[D_CBC_BF13] = 1;
669 else if (strcmp(*argv, "bf") == 0)
670 doit[D_CBC_BF13] = 1;
671 else
672#endif
673#ifndef OPENSSL_NO_CAST
674 if (strcmp(*argv, "cast-cbc") == 0)
675 doit[D_CBC_CAST14] = 1;
676 else if (strcmp(*argv, "cast") == 0)
677 doit[D_CBC_CAST14] = 1;
678 else if (strcmp(*argv, "cast5") == 0)
679 doit[D_CBC_CAST14] = 1;
680 else
681#endif
682#ifndef OPENSSL_NO_DES
683 if (strcmp(*argv, "des") == 0) {
684 doit[D_CBC_DES7] = 1;
685 doit[D_EDE3_DES8] = 1;
686 } else
687#endif
688#ifndef OPENSSL_NO_AES
689 if (strcmp(*argv, "aes") == 0) {
690 doit[D_CBC_128_AES15] = 1;
691 doit[D_CBC_192_AES16] = 1;
692 doit[D_CBC_256_AES17] = 1;
693 } else if (strcmp(*argv, "ghash") == 0)
694 doit[D_GHASH28] = 1;
695 else if (strcmp(*argv,"aes-128-gcm") == 0)
696 doit[D_AES_128_GCM29]=1;
697 else if (strcmp(*argv,"aes-256-gcm") == 0)
698 doit[D_AES_256_GCM30]=1;
699 else
700#endif
701#ifndef OPENSSL_NO_CAMELLIA
702 if (strcmp(*argv, "camellia") == 0) {
703 doit[D_CBC_128_CML18] = 1;
704 doit[D_CBC_192_CML19] = 1;
705 doit[D_CBC_256_CML20] = 1;
706 } else
707#endif
708#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
709 if (strcmp(*argv,"chacha20-poly1305") == 0)
710 doit[D_CHACHA20_POLY130531]=1;
711 else
712#endif
713 if (strcmp(*argv, "rsa") == 0) {
714 rsa_doit[R_RSA_5120] = 1;
715 rsa_doit[R_RSA_10241] = 1;
716 rsa_doit[R_RSA_20482] = 1;
717 rsa_doit[R_RSA_40963] = 1;
718 } else
719 if (strcmp(*argv, "dsa") == 0) {
720 dsa_doit[R_DSA_5120] = 1;
721 dsa_doit[R_DSA_10241] = 1;
722 dsa_doit[R_DSA_20482] = 1;
723 } else
724 if (strcmp(*argv, "ecdsap160") == 0)
725 ecdsa_doit[R_EC_P1600] = 2;
726 else if (strcmp(*argv, "ecdsap192") == 0)
727 ecdsa_doit[R_EC_P1921] = 2;
728 else if (strcmp(*argv, "ecdsap224") == 0)
729 ecdsa_doit[R_EC_P2242] = 2;
730 else if (strcmp(*argv, "ecdsap256") == 0)
731 ecdsa_doit[R_EC_P2563] = 2;
732 else if (strcmp(*argv, "ecdsap384") == 0)
733 ecdsa_doit[R_EC_P3844] = 2;
734 else if (strcmp(*argv, "ecdsap521") == 0)
735 ecdsa_doit[R_EC_P5215] = 2;
736 else if (strcmp(*argv, "ecdsa") == 0) {
737 for (i = 0; i < EC_NUM6; i++)
738 ecdsa_doit[i] = 1;
739 } else
740 if (strcmp(*argv, "ecdhp160") == 0)
741 ecdh_doit[R_EC_P1600] = 2;
742 else if (strcmp(*argv, "ecdhp192") == 0)
743 ecdh_doit[R_EC_P1921] = 2;
744 else if (strcmp(*argv, "ecdhp224") == 0)
745 ecdh_doit[R_EC_P2242] = 2;
746 else if (strcmp(*argv, "ecdhp256") == 0)
747 ecdh_doit[R_EC_P2563] = 2;
748 else if (strcmp(*argv, "ecdhp384") == 0)
749 ecdh_doit[R_EC_P3844] = 2;
750 else if (strcmp(*argv, "ecdhp521") == 0)
751 ecdh_doit[R_EC_P5215] = 2;
752 else if (strcmp(*argv, "ecdh") == 0) {
753 for (i = 0; i < EC_NUM6; i++)
754 ecdh_doit[i] = 1;
755 } else
756 {
757 BIO_printf(bio_err, "Error: bad option or value\n");
758 BIO_printf(bio_err, "\n");
759 BIO_printf(bio_err, "Available values:\n");
760#ifndef OPENSSL_NO_MD4
761 BIO_printf(bio_err, "md4 ");
762#endif
763#ifndef OPENSSL_NO_MD5
764 BIO_printf(bio_err, "md5 ");
765#ifndef OPENSSL_NO_HMAC
766 BIO_printf(bio_err, "hmac ");
767#endif
768#endif
769#ifndef OPENSSL_NO_SHA1
770 BIO_printf(bio_err, "sha1 ");
771#endif
772#ifndef OPENSSL_NO_SHA256
773 BIO_printf(bio_err, "sha256 ");
774#endif
775#ifndef OPENSSL_NO_SHA512
776 BIO_printf(bio_err, "sha512 ");
777#endif
778#ifndef OPENSSL_NO_WHIRLPOOL
779 BIO_printf(bio_err, "whirlpool");
780#endif
781#ifndef OPENSSL_NO_RIPEMD160
782 BIO_printf(bio_err, "rmd160");
783#endif
784#if !defined(OPENSSL_NO_MD2) || \
785 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
786 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) || \
787 !defined(OPENSSL_NO_WHIRLPOOL)
788 BIO_printf(bio_err, "\n");
789#endif
790
791#ifndef OPENSSL_NO_IDEA
792 BIO_printf(bio_err, "idea-cbc ");
793#endif
794#ifndef OPENSSL_NO_RC2
795 BIO_printf(bio_err, "rc2-cbc ");
796#endif
797#ifndef OPENSSL_NO_BF
798 BIO_printf(bio_err, "bf-cbc ");
799#endif
800#ifndef OPENSSL_NO_DES
801 BIO_printf(bio_err, "des-cbc des-ede3\n");
802#endif
803#ifndef OPENSSL_NO_AES
804 BIO_printf(bio_err, "aes-128-cbc aes-192-cbc aes-256-cbc ");
805 BIO_printf(bio_err, "aes-128-ige aes-192-ige aes-256-ige\n");
806 BIO_printf(bio_err, "aes-128-gcm aes-256-gcm ");
807#endif
808#ifndef OPENSSL_NO_CAMELLIA
809 BIO_printf(bio_err, "\n");
810 BIO_printf(bio_err, "camellia-128-cbc camellia-192-cbc camellia-256-cbc ");
811#endif
812#ifndef OPENSSL_NO_RC4
813 BIO_printf(bio_err, "rc4");
814#endif
815#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
816 BIO_printf(bio_err," chacha20-poly1305");
817#endif
818 BIO_printf(bio_err, "\n");
819
820 BIO_printf(bio_err, "rsa512 rsa1024 rsa2048 rsa4096\n");
821
822 BIO_printf(bio_err, "dsa512 dsa1024 dsa2048\n");
823 BIO_printf(bio_err, "ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
824 BIO_printf(bio_err, "ecdhp160 ecdhp192 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
825
826#ifndef OPENSSL_NO_IDEA
827 BIO_printf(bio_err, "idea ");
828#endif
829#ifndef OPENSSL_NO_RC2
830 BIO_printf(bio_err, "rc2 ");
831#endif
832#ifndef OPENSSL_NO_DES
833 BIO_printf(bio_err, "des ");
834#endif
835#ifndef OPENSSL_NO_AES
836 BIO_printf(bio_err, "aes ");
837#endif
838#ifndef OPENSSL_NO_CAMELLIA
839 BIO_printf(bio_err, "camellia ");
840#endif
841 BIO_printf(bio_err, "rsa ");
842#ifndef OPENSSL_NO_BF
843 BIO_printf(bio_err, "blowfish");
844#endif
845#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || \
846 !defined(OPENSSL_NO_RC2) || !defined(OPENSSL_NO_DES) || \
847 !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_BF) || \
848 !defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA)
849 BIO_printf(bio_err, "\n");
850#endif
851
852 BIO_printf(bio_err, "\n");
853 BIO_printf(bio_err, "Available options:\n");
854 BIO_printf(bio_err, "-elapsed measure time in real time instead of CPU user time.\n");
855 BIO_printf(bio_err, "-evp e use EVP e.\n");
856 BIO_printf(bio_err, "-decrypt time decryption instead of encryption (only EVP).\n");
857 BIO_printf(bio_err, "-mr produce machine readable output.\n");
858 BIO_printf(bio_err, "-multi n run n benchmarks in parallel.\n");
859 BIO_printf(bio_err, "-unaligned n use buffers with offset n from proper alignment.\n");
860 goto end;
861 }
862 argc--;
863 argv++;
864 j++;
865 }
866
867 if (multi && do_multi(multi))
868 goto show_res;
869
870 if (j == 0) {
871 for (i = 0; i < ALGOR_NUM32; i++) {
872 if (i != D_EVP21)
873 doit[i] = 1;
874 }
875 for (i = 0; i < RSA_NUM4; i++)
876 rsa_doit[i] = 1;
877 for (i = 0; i < DSA_NUM3; i++)
878 dsa_doit[i] = 1;
879 for (i = 0; i < EC_NUM6; i++)
880 ecdsa_doit[i] = 1;
881 for (i = 0; i < EC_NUM6; i++)
882 ecdh_doit[i] = 1;
883 }
884 for (i = 0; i < ALGOR_NUM32; i++)
885 if (doit[i])
886 pr_header++;
887
888 if (usertime == 0 && !mr)
889 BIO_printf(bio_err, "You have chosen to measure elapsed time instead of user CPU time.\n");
890
891 for (i = 0; i < RSA_NUM4; i++) {
892 const unsigned char *p;
893
894 p = rsa_data[i];
895 rsa_key[i] = d2i_RSAPrivateKey(NULL((void *)0), &p, rsa_data_length[i]);
896 if (rsa_key[i] == NULL((void *)0)) {
897 BIO_printf(bio_err, "internal error loading RSA key number %d\n", i);
898 goto end;
899 }
900 }
901
902 dsa_key[0] = get_dsa512();
903 dsa_key[1] = get_dsa1024();
904 dsa_key[2] = get_dsa2048();
905
906#ifndef OPENSSL_NO_DES
907 DES_set_key_unchecked(&key, &sch);
908 DES_set_key_unchecked(&key2, &sch2);
909 DES_set_key_unchecked(&key3, &sch3);
910#endif
911#ifndef OPENSSL_NO_AES
912 AES_set_encrypt_key(key16, 128, &aes_ks1);
913 AES_set_encrypt_key(key24, 192, &aes_ks2);
914 AES_set_encrypt_key(key32, 256, &aes_ks3);
915#endif
916#ifndef OPENSSL_NO_CAMELLIA
917 Camellia_set_key(key16, 128, &camellia_ks1);
918 Camellia_set_key(ckey24, 192, &camellia_ks2);
919 Camellia_set_key(ckey32, 256, &camellia_ks3);
920#endif
921#ifndef OPENSSL_NO_IDEA
922 idea_set_encrypt_key(key16, &idea_ks);
923#endif
924#ifndef OPENSSL_NO_RC4
925 RC4_set_key(&rc4_ks, 16, key16);
926#endif
927#ifndef OPENSSL_NO_RC2
928 RC2_set_key(&rc2_ks, 16, key16, 128);
929#endif
930#ifndef OPENSSL_NO_BF
931 BF_set_key(&bf_ks, 16, key16);
932#endif
933#ifndef OPENSSL_NO_CAST
934 CAST_set_key(&cast_ks, 16, key16);
935#endif
936 memset(rsa_c, 0, sizeof(rsa_c));
937#define COND(c)(run && count<0x7fffffff) (run && count<0x7fffffff)
938#define COUNT(d)(count) (count)
939 signal(SIGALRM14, sig_done);
940
941#ifndef OPENSSL_NO_MD4
942 if (doit[D_MD41]) {
943 for (j = 0; j < SIZE_NUM5; j++) {
944 print_message(names[D_MD41], c[D_MD41][j], lengths[j]);
945 Time_F(START0);
946 for (count = 0, run = 1; COND(c[D_MD4][j])(run && count<0x7fffffff); count++)
947 EVP_Digest(&(buf[0]), (unsigned long) lengths[j], &(md4[0]), NULL((void *)0), EVP_md4(), NULL((void *)0));
948 d = Time_F(STOP1);
949 print_result(D_MD41, j, count, d);
950 }
951 }
952#endif
953
954#ifndef OPENSSL_NO_MD5
955 if (doit[D_MD52]) {
956 for (j = 0; j < SIZE_NUM5; j++) {
957 print_message(names[D_MD52], c[D_MD52][j], lengths[j]);
958 Time_F(START0);
959 for (count = 0, run = 1; COND(c[D_MD5][j])(run && count<0x7fffffff); count++)
960 EVP_Digest(&(buf[0]), (unsigned long) lengths[j], &(md5[0]), NULL((void *)0), EVP_get_digestbyname("md5"), NULL((void *)0));
961 d = Time_F(STOP1);
962 print_result(D_MD52, j, count, d);
963 }
964 }
965#endif
966
967#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
968 if (doit[D_HMAC3]) {
969 HMAC_CTX *hctx;
970
971 if ((hctx = HMAC_CTX_new()) == NULL((void *)0)) {
972 BIO_printf(bio_err, "Failed to allocate HMAC context.\n");
973 goto end;
974 }
975
976 HMAC_Init_ex(hctx, (unsigned char *) "This is a key...",
977 16, EVP_md5(), NULL((void *)0));
978
979 for (j = 0; j < SIZE_NUM5; j++) {
980 print_message(names[D_HMAC3], c[D_HMAC3][j], lengths[j]);
981 Time_F(START0);
982 for (count = 0, run = 1; COND(c[D_HMAC][j])(run && count<0x7fffffff); count++) {
983 if (!HMAC_Init_ex(hctx, NULL((void *)0), 0, NULL((void *)0), NULL((void *)0))) {
984 HMAC_CTX_free(hctx);
985 goto end;
986 }
987 if (!HMAC_Update(hctx, buf, lengths[j])) {
988 HMAC_CTX_free(hctx);
989 goto end;
990 }
991 if (!HMAC_Final(hctx, &(hmac[0]), NULL((void *)0))) {
992 HMAC_CTX_free(hctx);
993 goto end;
994 }
995 }
996 d = Time_F(STOP1);
997 print_result(D_HMAC3, j, count, d);
998 }
999 HMAC_CTX_free(hctx);
1000 }
1001#endif
1002#ifndef OPENSSL_NO_SHA
1003 if (doit[D_SHA14]) {
1004 for (j = 0; j < SIZE_NUM5; j++) {
1005 print_message(names[D_SHA14], c[D_SHA14][j], lengths[j]);
1006 Time_F(START0);
1007 for (count = 0, run = 1; COND(c[D_SHA1][j])(run && count<0x7fffffff); count++)
1008 EVP_Digest(buf, (unsigned long) lengths[j], &(sha[0]), NULL((void *)0), EVP_sha1(), NULL((void *)0));
1009 d = Time_F(STOP1);
1010 print_result(D_SHA14, j, count, d);
1011 }
1012 }
1013#ifndef OPENSSL_NO_SHA256
1014 if (doit[D_SHA25622]) {
1015 for (j = 0; j < SIZE_NUM5; j++) {
1016 print_message(names[D_SHA25622], c[D_SHA25622][j], lengths[j]);
1017 Time_F(START0);
1018 for (count = 0, run = 1; COND(c[D_SHA256][j])(run && count<0x7fffffff); count++)
1019 SHA256(buf, lengths[j], sha256);
1020 d = Time_F(STOP1);
1021 print_result(D_SHA25622, j, count, d);
1022 }
1023 }
1024#endif
1025
1026#ifndef OPENSSL_NO_SHA512
1027 if (doit[D_SHA51223]) {
1028 for (j = 0; j < SIZE_NUM5; j++) {
1029 print_message(names[D_SHA51223], c[D_SHA51223][j], lengths[j]);
1030 Time_F(START0);
1031 for (count = 0, run = 1; COND(c[D_SHA512][j])(run && count<0x7fffffff); count++)
1032 SHA512(buf, lengths[j], sha512);
1033 d = Time_F(STOP1);
1034 print_result(D_SHA51223, j, count, d);
1035 }
1036 }
1037#endif
1038#endif
1039
1040#ifndef OPENSSL_NO_WHIRLPOOL
1041 if (doit[D_WHIRLPOOL24]) {
1042 for (j = 0; j < SIZE_NUM5; j++) {
1043 print_message(names[D_WHIRLPOOL24], c[D_WHIRLPOOL24][j], lengths[j]);
1044 Time_F(START0);
1045 for (count = 0, run = 1; COND(c[D_WHIRLPOOL][j])(run && count<0x7fffffff); count++)
1046 WHIRLPOOL(buf, lengths[j], whirlpool);
1047 d = Time_F(STOP1);
1048 print_result(D_WHIRLPOOL24, j, count, d);
1049 }
1050 }
1051#endif
1052
1053#ifndef OPENSSL_NO_RIPEMD
1054 if (doit[D_RMD1605]) {
1055 for (j = 0; j < SIZE_NUM5; j++) {
1056 print_message(names[D_RMD1605], c[D_RMD1605][j], lengths[j]);
1057 Time_F(START0);
1058 for (count = 0, run = 1; COND(c[D_RMD160][j])(run && count<0x7fffffff); count++)
1059 EVP_Digest(buf, (unsigned long) lengths[j], &(rmd160[0]), NULL((void *)0), EVP_ripemd160(), NULL((void *)0));
1060 d = Time_F(STOP1);
1061 print_result(D_RMD1605, j, count, d);
1062 }
1063 }
1064#endif
1065#ifndef OPENSSL_NO_RC4
1066 if (doit[D_RC46]) {
1067 for (j = 0; j < SIZE_NUM5; j++) {
1068 print_message(names[D_RC46], c[D_RC46][j], lengths[j]);
1069 Time_F(START0);
1070 for (count = 0, run = 1; COND(c[D_RC4][j])(run && count<0x7fffffff); count++)
1071 RC4(&rc4_ks, (unsigned int) lengths[j],
1072 buf, buf);
1073 d = Time_F(STOP1);
1074 print_result(D_RC46, j, count, d);
1075 }
1076 }
1077#endif
1078#ifndef OPENSSL_NO_DES
1079 if (doit[D_CBC_DES7]) {
1080 for (j = 0; j < SIZE_NUM5; j++) {
1081 print_message(names[D_CBC_DES7], c[D_CBC_DES7][j], lengths[j]);
1082 Time_F(START0);
1083 for (count = 0, run = 1; COND(c[D_CBC_DES][j])(run && count<0x7fffffff); count++)
1084 DES_ncbc_encrypt(buf, buf, lengths[j], &sch,
1085 &DES_iv, DES_ENCRYPT1);
1086 d = Time_F(STOP1);
1087 print_result(D_CBC_DES7, j, count, d);
1088 }
1089 }
1090 if (doit[D_EDE3_DES8]) {
1091 for (j = 0; j < SIZE_NUM5; j++) {
1092 print_message(names[D_EDE3_DES8], c[D_EDE3_DES8][j], lengths[j]);
1093 Time_F(START0);
1094 for (count = 0, run = 1; COND(c[D_EDE3_DES][j])(run && count<0x7fffffff); count++)
1095 DES_ede3_cbc_encrypt(buf, buf, lengths[j],
1096 &sch, &sch2, &sch3,
1097 &DES_iv, DES_ENCRYPT1);
1098 d = Time_F(STOP1);
1099 print_result(D_EDE3_DES8, j, count, d);
1100 }
1101 }
1102#endif
1103#ifndef OPENSSL_NO_AES
1104 if (doit[D_CBC_128_AES15]) {
1105 for (j = 0; j < SIZE_NUM5; j++) {
1106 print_message(names[D_CBC_128_AES15], c[D_CBC_128_AES15][j], lengths[j]);
1107 Time_F(START0);
1108 for (count = 0, run = 1; COND(c[D_CBC_128_AES][j])(run && count<0x7fffffff); count++)
1109 AES_cbc_encrypt(buf, buf,
1110 (unsigned long) lengths[j], &aes_ks1,
1111 iv, AES_ENCRYPT1);
1112 d = Time_F(STOP1);
1113 print_result(D_CBC_128_AES15, j, count, d);
1114 }
1115 }
1116 if (doit[D_CBC_192_AES16]) {
1117 for (j = 0; j < SIZE_NUM5; j++) {
1118 print_message(names[D_CBC_192_AES16], c[D_CBC_192_AES16][j], lengths[j]);
1119 Time_F(START0);
1120 for (count = 0, run = 1; COND(c[D_CBC_192_AES][j])(run && count<0x7fffffff); count++)
1121 AES_cbc_encrypt(buf, buf,
1122 (unsigned long) lengths[j], &aes_ks2,
1123 iv, AES_ENCRYPT1);
1124 d = Time_F(STOP1);
1125 print_result(D_CBC_192_AES16, j, count, d);
1126 }
1127 }
1128 if (doit[D_CBC_256_AES17]) {
1129 for (j = 0; j < SIZE_NUM5; j++) {
1130 print_message(names[D_CBC_256_AES17], c[D_CBC_256_AES17][j], lengths[j]);
1131 Time_F(START0);
1132 for (count = 0, run = 1; COND(c[D_CBC_256_AES][j])(run && count<0x7fffffff); count++)
1133 AES_cbc_encrypt(buf, buf,
1134 (unsigned long) lengths[j], &aes_ks3,
1135 iv, AES_ENCRYPT1);
1136 d = Time_F(STOP1);
1137 print_result(D_CBC_256_AES17, j, count, d);
1138 }
1139 }
1140 if (doit[D_IGE_128_AES25]) {
1141 for (j = 0; j < SIZE_NUM5; j++) {
1142 print_message(names[D_IGE_128_AES25], c[D_IGE_128_AES25][j], lengths[j]);
1143 Time_F(START0);
1144 for (count = 0, run = 1; COND(c[D_IGE_128_AES][j])(run && count<0x7fffffff); count++)
1145 AES_ige_encrypt(buf, buf2,
1146 (unsigned long) lengths[j], &aes_ks1,
1147 iv, AES_ENCRYPT1);
1148 d = Time_F(STOP1);
1149 print_result(D_IGE_128_AES25, j, count, d);
1150 }
1151 }
1152 if (doit[D_IGE_192_AES26]) {
1153 for (j = 0; j < SIZE_NUM5; j++) {
1154 print_message(names[D_IGE_192_AES26], c[D_IGE_192_AES26][j], lengths[j]);
1155 Time_F(START0);
1156 for (count = 0, run = 1; COND(c[D_IGE_192_AES][j])(run && count<0x7fffffff); count++)
1157 AES_ige_encrypt(buf, buf2,
1158 (unsigned long) lengths[j], &aes_ks2,
1159 iv, AES_ENCRYPT1);
1160 d = Time_F(STOP1);
1161 print_result(D_IGE_192_AES26, j, count, d);
1162 }
1163 }
1164 if (doit[D_IGE_256_AES27]) {
1165 for (j = 0; j < SIZE_NUM5; j++) {
1166 print_message(names[D_IGE_256_AES27], c[D_IGE_256_AES27][j], lengths[j]);
1167 Time_F(START0);
1168 for (count = 0, run = 1; COND(c[D_IGE_256_AES][j])(run && count<0x7fffffff); count++)
1169 AES_ige_encrypt(buf, buf2,
1170 (unsigned long) lengths[j], &aes_ks3,
1171 iv, AES_ENCRYPT1);
1172 d = Time_F(STOP1);
1173 print_result(D_IGE_256_AES27, j, count, d);
1174 }
1175 }
1176 if (doit[D_GHASH28]) {
1177 GCM128_CONTEXT *ctx = CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
1178 CRYPTO_gcm128_setiv(ctx, (unsigned char *) "0123456789ab", 12);
1179
1180 for (j = 0; j < SIZE_NUM5; j++) {
1181 print_message(names[D_GHASH28], c[D_GHASH28][j], lengths[j]);
1182 Time_F(START0);
1183 for (count = 0, run = 1; COND(c[D_GHASH][j])(run && count<0x7fffffff); count++)
1184 CRYPTO_gcm128_aad(ctx, buf, lengths[j]);
1185 d = Time_F(STOP1);
1186 print_result(D_GHASH28, j, count, d);
1187 }
1188 CRYPTO_gcm128_release(ctx);
1189 }
1190 if (doit[D_AES_128_GCM29]) {
1191 const EVP_AEAD *aead = EVP_aead_aes_128_gcm();
1192 static const unsigned char nonce[32] = {0};
1193 size_t buf_len, nonce_len;
1194 EVP_AEAD_CTX *ctx;
1195
1196 if ((ctx = EVP_AEAD_CTX_new()) == NULL((void *)0)) {
1197 BIO_printf(bio_err,
1198 "Failed to allocate aead context.\n");
1199 goto end;
1200 }
1201
1202 EVP_AEAD_CTX_init(ctx, aead, key32, EVP_AEAD_key_length(aead),
1203 EVP_AEAD_DEFAULT_TAG_LENGTH0, NULL((void *)0));
1204 nonce_len = EVP_AEAD_nonce_length(aead);
1205
1206 for (j = 0; j < SIZE_NUM5; j++) {
1207 print_message(names[D_AES_128_GCM29],c[D_AES_128_GCM29][j],lengths[j]);
1208 Time_F(START0);
1209 for (count = 0, run = 1; COND(c[D_AES_128_GCM][j])(run && count<0x7fffffff); count++)
1210 EVP_AEAD_CTX_seal(ctx, buf, &buf_len, BUFSIZE(1024*8+64), nonce,
1211 nonce_len, buf, lengths[j], NULL((void *)0), 0);
1212 d=Time_F(STOP1);
1213 print_result(D_AES_128_GCM29,j,count,d);
1214 }
1215 EVP_AEAD_CTX_free(ctx);
1216 }
1217
1218 if (doit[D_AES_256_GCM30]) {
1219 const EVP_AEAD *aead = EVP_aead_aes_256_gcm();
1220 static const unsigned char nonce[32] = {0};
1221 size_t buf_len, nonce_len;
1222 EVP_AEAD_CTX *ctx;
1223
1224 if ((ctx = EVP_AEAD_CTX_new()) == NULL((void *)0)) {
1225 BIO_printf(bio_err,
1226 "Failed to allocate aead context.\n");
1227 goto end;
1228 }
1229
1230 EVP_AEAD_CTX_init(ctx, aead, key32, EVP_AEAD_key_length(aead),
1231 EVP_AEAD_DEFAULT_TAG_LENGTH0, NULL((void *)0));
1232 nonce_len = EVP_AEAD_nonce_length(aead);
1233
1234 for (j = 0; j < SIZE_NUM5; j++) {
1235 print_message(names[D_AES_256_GCM30],c[D_AES_256_GCM30][j],lengths[j]);
1236 Time_F(START0);
1237 for (count = 0, run = 1; COND(c[D_AES_256_GCM][j])(run && count<0x7fffffff); count++)
1238 EVP_AEAD_CTX_seal(ctx, buf, &buf_len, BUFSIZE(1024*8+64), nonce,
1239 nonce_len, buf, lengths[j], NULL((void *)0), 0);
1240 d=Time_F(STOP1);
1241 print_result(D_AES_256_GCM30, j, count, d);
1242 }
1243 EVP_AEAD_CTX_free(ctx);
1244 }
1245#endif
1246#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
1247 if (doit[D_CHACHA20_POLY130531]) {
1248 const EVP_AEAD *aead = EVP_aead_chacha20_poly1305();
1249 static const unsigned char nonce[32] = {0};
1250 size_t buf_len, nonce_len;
1251 EVP_AEAD_CTX *ctx;
1252
1253 if ((ctx = EVP_AEAD_CTX_new()) == NULL((void *)0)) {
1254 BIO_printf(bio_err,
1255 "Failed to allocate aead context.\n");
1256 goto end;
1257 }
1258
1259 EVP_AEAD_CTX_init(ctx, aead, key32, EVP_AEAD_key_length(aead),
1260 EVP_AEAD_DEFAULT_TAG_LENGTH0, NULL((void *)0));
1261 nonce_len = EVP_AEAD_nonce_length(aead);
1262
1263 for (j = 0; j < SIZE_NUM5; j++) {
1264 print_message(names[D_CHACHA20_POLY130531],
1265 c[D_CHACHA20_POLY130531][j], lengths[j]);
1266 Time_F(START0);
1267 for (count = 0, run = 1; COND(c[D_CHACHA20_POLY1305][j])(run && count<0x7fffffff); count++)
1268 EVP_AEAD_CTX_seal(ctx, buf, &buf_len, BUFSIZE(1024*8+64), nonce,
1269 nonce_len, buf, lengths[j], NULL((void *)0), 0);
1270 d=Time_F(STOP1);
1271 print_result(D_CHACHA20_POLY130531, j, count, d);
1272 }
1273 EVP_AEAD_CTX_free(ctx);
1274 }
1275#endif
1276#ifndef OPENSSL_NO_CAMELLIA
1277 if (doit[D_CBC_128_CML18]) {
1278 for (j = 0; j < SIZE_NUM5; j++) {
1279 print_message(names[D_CBC_128_CML18], c[D_CBC_128_CML18][j], lengths[j]);
1280 Time_F(START0);
1281 for (count = 0, run = 1; COND(c[D_CBC_128_CML][j])(run && count<0x7fffffff); count++)
1282 Camellia_cbc_encrypt(buf, buf,
1283 (unsigned long) lengths[j], &camellia_ks1,
1284 iv, CAMELLIA_ENCRYPT1);
1285 d = Time_F(STOP1);
1286 print_result(D_CBC_128_CML18, j, count, d);
1287 }
1288 }
1289 if (doit[D_CBC_192_CML19]) {
1290 for (j = 0; j < SIZE_NUM5; j++) {
1291 print_message(names[D_CBC_192_CML19], c[D_CBC_192_CML19][j], lengths[j]);
1292 Time_F(START0);
1293 for (count = 0, run = 1; COND(c[D_CBC_192_CML][j])(run && count<0x7fffffff); count++)
1294 Camellia_cbc_encrypt(buf, buf,
1295 (unsigned long) lengths[j], &camellia_ks2,
1296 iv, CAMELLIA_ENCRYPT1);
1297 d = Time_F(STOP1);
1298 print_result(D_CBC_192_CML19, j, count, d);
1299 }
1300 }
1301 if (doit[D_CBC_256_CML20]) {
1302 for (j = 0; j < SIZE_NUM5; j++) {
1303 print_message(names[D_CBC_256_CML20], c[D_CBC_256_CML20][j], lengths[j]);
1304 Time_F(START0);
1305 for (count = 0, run = 1; COND(c[D_CBC_256_CML][j])(run && count<0x7fffffff); count++)
1306 Camellia_cbc_encrypt(buf, buf,
1307 (unsigned long) lengths[j], &camellia_ks3,
1308 iv, CAMELLIA_ENCRYPT1);
1309 d = Time_F(STOP1);
1310 print_result(D_CBC_256_CML20, j, count, d);
1311 }
1312 }
1313#endif
1314#ifndef OPENSSL_NO_IDEA
1315 if (doit[D_CBC_IDEA9]) {
1316 for (j = 0; j < SIZE_NUM5; j++) {
1317 print_message(names[D_CBC_IDEA9], c[D_CBC_IDEA9][j], lengths[j]);
1318 Time_F(START0);
1319 for (count = 0, run = 1; COND(c[D_CBC_IDEA][j])(run && count<0x7fffffff); count++)
1320 idea_cbc_encrypt(buf, buf,
1321 (unsigned long) lengths[j], &idea_ks,
1322 iv, IDEA_ENCRYPT1);
1323 d = Time_F(STOP1);
1324 print_result(D_CBC_IDEA9, j, count, d);
1325 }
1326 }
1327#endif
1328#ifndef OPENSSL_NO_RC2
1329 if (doit[D_CBC_RC211]) {
1330 for (j = 0; j < SIZE_NUM5; j++) {
1331 print_message(names[D_CBC_RC211], c[D_CBC_RC211][j], lengths[j]);
1332 Time_F(START0);
1333 for (count = 0, run = 1; COND(c[D_CBC_RC2][j])(run && count<0x7fffffff); count++)
1334 RC2_cbc_encrypt(buf, buf,
1335 (unsigned long) lengths[j], &rc2_ks,
1336 iv, RC2_ENCRYPT1);
1337 d = Time_F(STOP1);
1338 print_result(D_CBC_RC211, j, count, d);
1339 }
1340 }
1341#endif
1342#ifndef OPENSSL_NO_BF
1343 if (doit[D_CBC_BF13]) {
1344 for (j = 0; j < SIZE_NUM5; j++) {
1345 print_message(names[D_CBC_BF13], c[D_CBC_BF13][j], lengths[j]);
1346 Time_F(START0);
1347 for (count = 0, run = 1; COND(c[D_CBC_BF][j])(run && count<0x7fffffff); count++)
1348 BF_cbc_encrypt(buf, buf,
1349 (unsigned long) lengths[j], &bf_ks,
1350 iv, BF_ENCRYPT1);
1351 d = Time_F(STOP1);
1352 print_result(D_CBC_BF13, j, count, d);
1353 }
1354 }
1355#endif
1356#ifndef OPENSSL_NO_CAST
1357 if (doit[D_CBC_CAST14]) {
1358 for (j = 0; j < SIZE_NUM5; j++) {
1359 print_message(names[D_CBC_CAST14], c[D_CBC_CAST14][j], lengths[j]);
1360 Time_F(START0);
1361 for (count = 0, run = 1; COND(c[D_CBC_CAST][j])(run && count<0x7fffffff); count++)
1362 CAST_cbc_encrypt(buf, buf,
1363 (unsigned long) lengths[j], &cast_ks,
1364 iv, CAST_ENCRYPT1);
1365 d = Time_F(STOP1);
1366 print_result(D_CBC_CAST14, j, count, d);
1367 }
1368 }
1369#endif
1370
1371 if (doit[D_EVP21]) {
1372 for (j = 0; j < SIZE_NUM5; j++) {
1373 if (evp_cipher) {
1374 EVP_CIPHER_CTX *ctx;
1375 int outl;
1376
1377 names[D_EVP21] =
1378 OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
1379 /*
1380 * -O3 -fschedule-insns messes up an
1381 * optimization here! names[D_EVP] somehow
1382 * becomes NULL
1383 */
1384 print_message(names[D_EVP21], save_count,
1385 lengths[j]);
1386
1387 if ((ctx = EVP_CIPHER_CTX_new()) == NULL((void *)0)) {
1388 BIO_printf(bio_err, "Failed to "
1389 "allocate cipher context.\n");
1390 goto end;
1391 }
1392 if (decrypt)
1393 EVP_DecryptInit_ex(ctx, evp_cipher, NULL((void *)0), key16, iv);
1394 else
1395 EVP_EncryptInit_ex(ctx, evp_cipher, NULL((void *)0), key16, iv);
1396 EVP_CIPHER_CTX_set_padding(ctx, 0);
1397
1398 Time_F(START0);
1399 if (decrypt)
1400 for (count = 0, run = 1; COND(save_count * 4 * lengths[0] / lengths[j])(run && count<0x7fffffff); count++)
1401 EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[j]);
1402 else
1403 for (count = 0, run = 1; COND(save_count * 4 * lengths[0] / lengths[j])(run && count<0x7fffffff); count++)
1404 EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[j]);
1405 if (decrypt)
1406 EVP_DecryptFinal_ex(ctx, buf, &outl);
1407 else
1408 EVP_EncryptFinal_ex(ctx, buf, &outl);
1409 d = Time_F(STOP1);
1410 EVP_CIPHER_CTX_free(ctx);
1411 }
1412 if (evp_md) {
1413 names[D_EVP21] = OBJ_nid2ln(EVP_MD_type(evp_md));
1414 print_message(names[D_EVP21], save_count,
1415 lengths[j]);
1416
1417 Time_F(START0);
1418 for (count = 0, run = 1; COND(save_count * 4 * lengths[0] / lengths[j])(run && count<0x7fffffff); count++)
1419 EVP_Digest(buf, lengths[j], &(md[0]), NULL((void *)0), evp_md, NULL((void *)0));
1420
1421 d = Time_F(STOP1);
1422 }
1423 print_result(D_EVP21, j, count, d);
1424 }
1425 }
1426 arc4random_buf(buf, 36);
1427 for (j = 0; j < RSA_NUM4; j++) {
1428 int ret;
1429 if (!rsa_doit[j])
1430 continue;
1431 ret = RSA_sign(NID_md5_sha1114, buf, 36, buf2, &rsa_num, rsa_key[j]);
1432 if (ret == 0) {
1433 BIO_printf(bio_err, "RSA sign failure. No RSA sign will be done.\n");
1434 ERR_print_errors(bio_err);
1435 rsa_count = 1;
1436 } else {
1437 pkey_print_message("private", "rsa",
1438 rsa_c[j][0], rsa_bits[j],
1439 RSA_SECONDS10);
1440/* RSA_blinding_on(rsa_key[j],NULL); */
1441 Time_F(START0);
1442 for (count = 0, run = 1; COND(rsa_c[j][0])(run && count<0x7fffffff); count++) {
1443 ret = RSA_sign(NID_md5_sha1114, buf, 36, buf2,
1444 &rsa_num, rsa_key[j]);
1445 if (ret == 0) {
1446 BIO_printf(bio_err,
1447 "RSA sign failure\n");
1448 ERR_print_errors(bio_err);
1449 count = 1;
1450 break;
1451 }
1452 }
1453 d = Time_F(STOP1);
1454 BIO_printf(bio_err, mr ? "+R1:%ld:%d:%.2f\n"
1455 : "%ld %d bit private RSA in %.2fs\n",
1456 count, rsa_bits[j], d);
1457 rsa_results[j][0] = d / (double) count;
1458 rsa_count = count;
1459 }
1460
1461 ret = RSA_verify(NID_md5_sha1114, buf, 36, buf2, rsa_num, rsa_key[j]);
1462 if (ret <= 0) {
1463 BIO_printf(bio_err, "RSA verify failure. No RSA verify will be done.\n");
1464 ERR_print_errors(bio_err);
1465 rsa_doit[j] = 0;
1466 } else {
1467 pkey_print_message("public", "rsa",
1468 rsa_c[j][1], rsa_bits[j],
1469 RSA_SECONDS10);
1470 Time_F(START0);
1471 for (count = 0, run = 1; COND(rsa_c[j][1])(run && count<0x7fffffff); count++) {
1472 ret = RSA_verify(NID_md5_sha1114, buf, 36, buf2,
1473 rsa_num, rsa_key[j]);
1474 if (ret <= 0) {
1475 BIO_printf(bio_err,
1476 "RSA verify failure\n");
1477 ERR_print_errors(bio_err);
1478 count = 1;
1479 break;
1480 }
1481 }
1482 d = Time_F(STOP1);
1483 BIO_printf(bio_err, mr ? "+R2:%ld:%d:%.2f\n"
1484 : "%ld %d bit public RSA in %.2fs\n",
1485 count, rsa_bits[j], d);
1486 rsa_results[j][1] = d / (double) count;
1487 }
1488
1489 if (rsa_count <= 1) {
1490 /* if longer than 10s, don't do any more */
1491 for (j++; j < RSA_NUM4; j++)
1492 rsa_doit[j] = 0;
1493 }
1494 }
1495
1496 arc4random_buf(buf, 20);
1497 for (j = 0; j < DSA_NUM3; j++) {
1498 unsigned int kk;
1499 int ret;
1500
1501 if (!dsa_doit[j])
1502 continue;
1503/* DSA_generate_key(dsa_key[j]); */
1504/* DSA_sign_setup(dsa_key[j],NULL); */
1505 ret = DSA_sign(EVP_PKEY_DSA116, buf, 20, buf2,
1506 &kk, dsa_key[j]);
1507 if (ret == 0) {
1508 BIO_printf(bio_err, "DSA sign failure. No DSA sign will be done.\n");
1509 ERR_print_errors(bio_err);
1510 rsa_count = 1;
1511 } else {
1512 pkey_print_message("sign", "dsa",
1513 dsa_c[j][0], dsa_bits[j],
1514 DSA_SECONDS10);
1515 Time_F(START0);
1516 for (count = 0, run = 1; COND(dsa_c[j][0])(run && count<0x7fffffff); count++) {
1517 ret = DSA_sign(EVP_PKEY_DSA116, buf, 20, buf2,
1518 &kk, dsa_key[j]);
1519 if (ret == 0) {
1520 BIO_printf(bio_err,
1521 "DSA sign failure\n");
1522 ERR_print_errors(bio_err);
1523 count = 1;
1524 break;
1525 }
1526 }
1527 d = Time_F(STOP1);
1528 BIO_printf(bio_err, mr ? "+R3:%ld:%d:%.2f\n"
1529 : "%ld %d bit DSA signs in %.2fs\n",
1530 count, dsa_bits[j], d);
1531 dsa_results[j][0] = d / (double) count;
1532 rsa_count = count;
1533 }
1534
1535 ret = DSA_verify(EVP_PKEY_DSA116, buf, 20, buf2,
1536 kk, dsa_key[j]);
1537 if (ret <= 0) {
1538 BIO_printf(bio_err, "DSA verify failure. No DSA verify will be done.\n");
1539 ERR_print_errors(bio_err);
1540 dsa_doit[j] = 0;
1541 } else {
1542 pkey_print_message("verify", "dsa",
1543 dsa_c[j][1], dsa_bits[j],
1544 DSA_SECONDS10);
1545 Time_F(START0);
1546 for (count = 0, run = 1; COND(dsa_c[j][1])(run && count<0x7fffffff); count++) {
1547 ret = DSA_verify(EVP_PKEY_DSA116, buf, 20, buf2,
1548 kk, dsa_key[j]);
1549 if (ret <= 0) {
1550 BIO_printf(bio_err,
1551 "DSA verify failure\n");
1552 ERR_print_errors(bio_err);
1553 count = 1;
1554 break;
1555 }
1556 }
1557 d = Time_F(STOP1);
1558 BIO_printf(bio_err, mr ? "+R4:%ld:%d:%.2f\n"
1559 : "%ld %d bit DSA verify in %.2fs\n",
1560 count, dsa_bits[j], d);
1561 dsa_results[j][1] = d / (double) count;
1562 }
1563
1564 if (rsa_count <= 1) {
1565 /* if longer than 10s, don't do any more */
1566 for (j++; j < DSA_NUM3; j++)
1567 dsa_doit[j] = 0;
1568 }
1569 }
1570
1571 for (j = 0; j < EC_NUM6; j++) {
1572 int ret;
1573
1574 if (!ecdsa_doit[j])
1575 continue; /* Ignore Curve */
1576 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]);
1577 if (ecdsa[j] == NULL((void *)0)) {
1578 BIO_printf(bio_err, "ECDSA failure.\n");
1579 ERR_print_errors(bio_err);
1580 rsa_count = 1;
Value stored to 'rsa_count' is never read
1581 } else {
1582 EC_KEY_precompute_mult(ecdsa[j], NULL((void *)0));
1583
1584 /* Perform ECDSA signature test */
1585 EC_KEY_generate_key(ecdsa[j]);
1586 ret = ECDSA_sign(0, buf, 20, ecdsasig,
1587 &ecdsasiglen, ecdsa[j]);
1588 if (ret == 0) {
1589 BIO_printf(bio_err, "ECDSA sign failure. No ECDSA sign will be done.\n");
1590 ERR_print_errors(bio_err);
1591 rsa_count = 1;
1592 } else {
1593 pkey_print_message("sign", "ecdsa",
1594 ecdsa_c[j][0],
1595 test_curves_bits[j],
1596 ECDSA_SECONDS10);
1597
1598 Time_F(START0);
1599 for (count = 0, run = 1; COND(ecdsa_c[j][0])(run && count<0x7fffffff);
1600 count++) {
1601 ret = ECDSA_sign(0, buf, 20,
1602 ecdsasig, &ecdsasiglen,
1603 ecdsa[j]);
1604 if (ret == 0) {
1605 BIO_printf(bio_err, "ECDSA sign failure\n");
1606 ERR_print_errors(bio_err);
1607 count = 1;
1608 break;
1609 }
1610 }
1611 d = Time_F(STOP1);
1612
1613 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
1614 "%ld %d bit ECDSA signs in %.2fs \n",
1615 count, test_curves_bits[j], d);
1616 ecdsa_results[j][0] = d / (double) count;
1617 rsa_count = count;
1618 }
1619
1620 /* Perform ECDSA verification test */
1621 ret = ECDSA_verify(0, buf, 20, ecdsasig,
1622 ecdsasiglen, ecdsa[j]);
1623 if (ret != 1) {
1624 BIO_printf(bio_err, "ECDSA verify failure. No ECDSA verify will be done.\n");
1625 ERR_print_errors(bio_err);
1626 ecdsa_doit[j] = 0;
1627 } else {
1628 pkey_print_message("verify", "ecdsa",
1629 ecdsa_c[j][1],
1630 test_curves_bits[j],
1631 ECDSA_SECONDS10);
1632 Time_F(START0);
1633 for (count = 0, run = 1; COND(ecdsa_c[j][1])(run && count<0x7fffffff); count++) {
1634 ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
1635 if (ret != 1) {
1636 BIO_printf(bio_err, "ECDSA verify failure\n");
1637 ERR_print_errors(bio_err);
1638 count = 1;
1639 break;
1640 }
1641 }
1642 d = Time_F(STOP1);
1643 BIO_printf(bio_err, mr ? "+R6:%ld:%d:%.2f\n"
1644 : "%ld %d bit ECDSA verify in %.2fs\n",
1645 count, test_curves_bits[j], d);
1646 ecdsa_results[j][1] = d / (double) count;
1647 }
1648
1649 if (rsa_count <= 1) {
1650 /* if longer than 10s, don't do any more */
1651 for (j++; j < EC_NUM6; j++)
1652 ecdsa_doit[j] = 0;
1653 }
1654 }
1655 }
1656
1657 for (j = 0; j < EC_NUM6; j++) {
1658 if (!ecdh_doit[j])
1659 continue;
1660 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]);
1661 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]);
1662 if ((ecdh_a[j] == NULL((void *)0)) || (ecdh_b[j] == NULL((void *)0))) {
1663 BIO_printf(bio_err, "ECDH failure.\n");
1664 ERR_print_errors(bio_err);
1665 rsa_count = 1;
1666 } else {
1667 /* generate two ECDH key pairs */
1668 if (!EC_KEY_generate_key(ecdh_a[j]) ||
1669 !EC_KEY_generate_key(ecdh_b[j])) {
1670 BIO_printf(bio_err, "ECDH key generation failure.\n");
1671 ERR_print_errors(bio_err);
1672 rsa_count = 1;
1673 } else {
1674 /*
1675 * If field size is not more than 24 octets,
1676 * then use SHA-1 hash of result; otherwise,
1677 * use result (see section 4.8 of
1678 * draft-ietf-tls-ecc-03.txt).
1679 */
1680 int field_size, outlen;
1681 void *(*kdf) (const void *in, size_t inlen, void *out, size_t * xoutlen);
1682 field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j]));
1683 if (field_size <= 24 * 8) {
1684 outlen = KDF1_SHA1_len;
1685 kdf = KDF1_SHA1;
1686 } else {
1687 outlen = (field_size + 7) / 8;
1688 kdf = NULL((void *)0);
1689 }
1690 secret_size_a = ECDH_compute_key(secret_a, outlen,
1691 EC_KEY_get0_public_key(ecdh_b[j]),
1692 ecdh_a[j], kdf);
1693 secret_size_b = ECDH_compute_key(secret_b, outlen,
1694 EC_KEY_get0_public_key(ecdh_a[j]),
1695 ecdh_b[j], kdf);
1696 if (secret_size_a != secret_size_b)
1697 ecdh_checks = 0;
1698 else
1699 ecdh_checks = 1;
1700
1701 for (secret_idx = 0;
1702 (secret_idx < secret_size_a)
1703 && (ecdh_checks == 1);
1704 secret_idx++) {
1705 if (secret_a[secret_idx] != secret_b[secret_idx])
1706 ecdh_checks = 0;
1707 }
1708
1709 if (ecdh_checks == 0) {
1710 BIO_printf(bio_err,
1711 "ECDH computations don't match.\n");
1712 ERR_print_errors(bio_err);
1713 rsa_count = 1;
1714 } else {
1715 pkey_print_message("", "ecdh",
1716 ecdh_c[j][0],
1717 test_curves_bits[j],
1718 ECDH_SECONDS10);
1719 Time_F(START0);
1720 for (count = 0, run = 1;
1721 COND(ecdh_c[j][0])(run && count<0x7fffffff); count++) {
1722 ECDH_compute_key(secret_a,
1723 outlen,
1724 EC_KEY_get0_public_key(ecdh_b[j]),
1725 ecdh_a[j], kdf);
1726 }
1727 d = Time_F(STOP1);
1728 BIO_printf(bio_err, mr
1729 ? "+R7:%ld:%d:%.2f\n"
1730 : "%ld %d-bit ECDH ops in %.2fs\n",
1731 count, test_curves_bits[j], d);
1732 ecdh_results[j][0] = d / (double) count;
1733 rsa_count = count;
1734 }
1735 }
1736 }
1737
1738
1739 if (rsa_count <= 1) {
1740 /* if longer than 10s, don't do any more */
1741 for (j++; j < EC_NUM6; j++)
1742 ecdh_doit[j] = 0;
1743 }
1744 }
1745show_res:
1746 if (!mr) {
1747 fprintf(stdout(&__sF[1]), "%s\n", SSLeay_version(SSLEAY_VERSION0));
1748 fprintf(stdout(&__sF[1]), "%s\n", SSLeay_version(SSLEAY_BUILT_ON3));
1749 fprintf(stdout(&__sF[1]), "%s\n", SSLeay_version(SSLEAY_CFLAGS2));
1750 }
1751 if (pr_header) {
1752 if (mr)
1753 fprintf(stdout(&__sF[1]), "+H");
1754 else {
1755 fprintf(stdout(&__sF[1]), "The 'numbers' are in 1000s of bytes per second processed.\n");
1756 fprintf(stdout(&__sF[1]), "type ");
1757 }
1758 for (j = 0; j < SIZE_NUM5; j++)
1759 fprintf(stdout(&__sF[1]), mr ? ":%d" : "%7d bytes", lengths[j]);
1760 fprintf(stdout(&__sF[1]), "\n");
1761 }
1762 for (k = 0; k < ALGOR_NUM32; k++) {
1763 if (!doit[k])
1764 continue;
1765 if (mr)
1766 fprintf(stdout(&__sF[1]), "+F:%d:%s", k, names[k]);
1767 else
1768 fprintf(stdout(&__sF[1]), "%-13s", names[k]);
1769 for (j = 0; j < SIZE_NUM5; j++) {
1770 if (results[k][j] > 10000 && !mr)
1771 fprintf(stdout(&__sF[1]), " %11.2fk", results[k][j] / 1e3);
1772 else
1773 fprintf(stdout(&__sF[1]), mr ? ":%.2f" : " %11.2f ", results[k][j]);
1774 }
1775 fprintf(stdout(&__sF[1]), "\n");
1776 }
1777 j = 1;
1778 for (k = 0; k < RSA_NUM4; k++) {
1779 if (!rsa_doit[k])
1780 continue;
1781 if (j && !mr) {
1782 printf("%18ssign verify sign/s verify/s\n", " ");
1783 j = 0;
1784 }
1785 if (mr)
1786 fprintf(stdout(&__sF[1]), "+F2:%u:%u:%f:%f\n",
1787 k, rsa_bits[k], rsa_results[k][0],
1788 rsa_results[k][1]);
1789 else
1790 fprintf(stdout(&__sF[1]), "rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
1791 rsa_bits[k], rsa_results[k][0], rsa_results[k][1],
1792 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1]);
1793 }
1794 j = 1;
1795 for (k = 0; k < DSA_NUM3; k++) {
1796 if (!dsa_doit[k])
1797 continue;
1798 if (j && !mr) {
1799 printf("%18ssign verify sign/s verify/s\n", " ");
1800 j = 0;
1801 }
1802 if (mr)
1803 fprintf(stdout(&__sF[1]), "+F3:%u:%u:%f:%f\n",
1804 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
1805 else
1806 fprintf(stdout(&__sF[1]), "dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
1807 dsa_bits[k], dsa_results[k][0], dsa_results[k][1],
1808 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1]);
1809 }
1810 j = 1;
1811 for (k = 0; k < EC_NUM6; k++) {
1812 if (!ecdsa_doit[k])
1813 continue;
1814 if (j && !mr) {
1815 printf("%30ssign verify sign/s verify/s\n", " ");
1816 j = 0;
1817 }
1818 if (mr)
1819 fprintf(stdout(&__sF[1]), "+F4:%u:%u:%f:%f\n",
1820 k, test_curves_bits[k],
1821 ecdsa_results[k][0], ecdsa_results[k][1]);
1822 else
1823 fprintf(stdout(&__sF[1]),
1824 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
1825 test_curves_bits[k],
1826 test_curves_names[k],
1827 ecdsa_results[k][0], ecdsa_results[k][1],
1828 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1]);
1829 }
1830
1831
1832 j = 1;
1833 for (k = 0; k < EC_NUM6; k++) {
1834 if (!ecdh_doit[k])
1835 continue;
1836 if (j && !mr) {
1837 printf("%30sop op/s\n", " ");
1838 j = 0;
1839 }
1840 if (mr)
1841 fprintf(stdout(&__sF[1]), "+F5:%u:%u:%f:%f\n",
1842 k, test_curves_bits[k],
1843 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
1844
1845 else
1846 fprintf(stdout(&__sF[1]), "%4u bit ecdh (%s) %8.4fs %8.1f\n",
1847 test_curves_bits[k],
1848 test_curves_names[k],
1849 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
1850 }
1851
1852 mret = 0;
1853
1854 end:
1855 ERR_print_errors(bio_err);
1856 free(real_buf);
1857 free(real_buf2);
1858 for (i = 0; i < RSA_NUM4; i++)
1859 if (rsa_key[i] != NULL((void *)0))
1860 RSA_free(rsa_key[i]);
1861 for (i = 0; i < DSA_NUM3; i++)
1862 if (dsa_key[i] != NULL((void *)0))
1863 DSA_free(dsa_key[i]);
1864
1865 for (i = 0; i < EC_NUM6; i++)
1866 if (ecdsa[i] != NULL((void *)0))
1867 EC_KEY_free(ecdsa[i]);
1868 for (i = 0; i < EC_NUM6; i++) {
1869 if (ecdh_a[i] != NULL((void *)0))
1870 EC_KEY_free(ecdh_a[i]);
1871 if (ecdh_b[i] != NULL((void *)0))
1872 EC_KEY_free(ecdh_b[i]);
1873 }
1874
1875
1876 return (mret);
1877}
1878
1879static void
1880print_message(const char *s, long num, int length)
1881{
1882 BIO_printf(bio_err, mr ? "+DT:%s:%d:%d\n"
1883 : "Doing %s for %ds on %d size blocks: ", s, SECONDS3, length);
1884 (void) BIO_flush(bio_err)(int)BIO_ctrl(bio_err,11,0,((void *)0));
1885 alarm(SECONDS3);
1886}
1887
1888static void
1889pkey_print_message(const char *str, const char *str2, long num,
1890 int bits, int tm)
1891{
1892 BIO_printf(bio_err, mr ? "+DTP:%d:%s:%s:%d\n"
1893 : "Doing %d bit %s %s for %ds: ", bits, str, str2, tm);
1894 (void) BIO_flush(bio_err)(int)BIO_ctrl(bio_err,11,0,((void *)0));
1895 alarm(tm);
1896}
1897
1898static void
1899print_result(int alg, int run_no, int count, double time_used)
1900{
1901 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
1902 : "%d %s in %.2fs\n", count, names[alg], time_used);
1903 results[alg][run_no] = ((double) count) / time_used * lengths[run_no];
1904}
1905
1906static char *
1907sstrsep(char **string, const char *delim)
1908{
1909 char isdelim[256];
1910 char *token = *string;
1911
1912 if (**string == 0)
1913 return NULL((void *)0);
1914
1915 memset(isdelim, 0, sizeof isdelim);
1916 isdelim[0] = 1;
1917
1918 while (*delim) {
1919 isdelim[(unsigned char) (*delim)] = 1;
1920 delim++;
1921 }
1922
1923 while (!isdelim[(unsigned char) (**string)]) {
1924 (*string)++;
1925 }
1926
1927 if (**string) {
1928 **string = 0;
1929 (*string)++;
1930 }
1931 return token;
1932}
1933
1934static int
1935do_multi(int multi)
1936{
1937 int n;
1938 int fd[2];
1939 int *fds;
1940 static char sep[] = ":";
1941 const char *errstr = NULL((void *)0);
1942
1943 fds = reallocarray(NULL((void *)0), multi, sizeof *fds);
1944 if (fds == NULL((void *)0)) {
1945 fprintf(stderr(&__sF[2]), "reallocarray failure\n");
1946 exit(1);
1947 }
1948 for (n = 0; n < multi; ++n) {
1949 if (pipe(fd) == -1) {
1950 fprintf(stderr(&__sF[2]), "pipe failure\n");
1951 exit(1);
1952 }
1953 fflush(stdout(&__sF[1]));
1954 fflush(stderr(&__sF[2]));
1955 if (fork()) {
1956 close(fd[1]);
1957 fds[n] = fd[0];
1958 } else {
1959 close(fd[0]);
1960 close(1);
1961 if (dup(fd[1]) == -1) {
1962 fprintf(stderr(&__sF[2]), "dup failed\n");
1963 exit(1);
1964 }
1965 close(fd[1]);
1966 mr = 1;
1967 usertime = 0;
1968 free(fds);
1969 return 0;
1970 }
1971 printf("Forked child %d\n", n);
1972 }
1973
1974 /* for now, assume the pipe is long enough to take all the output */
1975 for (n = 0; n < multi; ++n) {
1976 FILE *f;
1977 char buf[1024];
1978 char *p;
1979
1980 f = fdopen(fds[n], "r");
1981 while (fgets(buf, sizeof buf, f)) {
1982 p = strchr(buf, '\n');
1983 if (p)
1984 *p = '\0';
1985 if (buf[0] != '+') {
1986 fprintf(stderr(&__sF[2]), "Don't understand line '%s' from child %d\n",
1987 buf, n);
1988 continue;
1989 }
1990 printf("Got: %s from %d\n", buf, n);
1991 if (!strncmp(buf, "+F:", 3)) {
1992 int alg;
1993 int j;
1994
1995 p = buf + 3;
1996 alg = strtonum(sstrsep(&p, sep),
1997 0, ALGOR_NUM32 - 1, &errstr);
1998 sstrsep(&p, sep);
1999 for (j = 0; j < SIZE_NUM5; ++j)
2000 results[alg][j] += atof(sstrsep(&p, sep));
2001 } else if (!strncmp(buf, "+F2:", 4)) {
2002 int k;
2003 double d;
2004
2005 p = buf + 4;
2006 k = strtonum(sstrsep(&p, sep),
2007 0, ALGOR_NUM32 - 1, &errstr);
2008 sstrsep(&p, sep);
2009
2010 d = atof(sstrsep(&p, sep));
2011 if (n)
2012 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d);
2013 else
2014 rsa_results[k][0] = d;
2015
2016 d = atof(sstrsep(&p, sep));
2017 if (n)
2018 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d);
2019 else
2020 rsa_results[k][1] = d;
2021 } else if (!strncmp(buf, "+F2:", 4)) {
2022 int k;
2023 double d;
2024
2025 p = buf + 4;
2026 k = strtonum(sstrsep(&p, sep),
2027 0, ALGOR_NUM32 - 1, &errstr);
2028 sstrsep(&p, sep);
2029
2030 d = atof(sstrsep(&p, sep));
2031 if (n)
2032 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d);
2033 else
2034 rsa_results[k][0] = d;
2035
2036 d = atof(sstrsep(&p, sep));
2037 if (n)
2038 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d);
2039 else
2040 rsa_results[k][1] = d;
2041 }
2042 else if (!strncmp(buf, "+F3:", 4)) {
2043 int k;
2044 double d;
2045
2046 p = buf + 4;
2047 k = strtonum(sstrsep(&p, sep),
2048 0, ALGOR_NUM32 - 1, &errstr);
2049 sstrsep(&p, sep);
2050
2051 d = atof(sstrsep(&p, sep));
2052 if (n)
2053 dsa_results[k][0] = 1 / (1 / dsa_results[k][0] + 1 / d);
2054 else
2055 dsa_results[k][0] = d;
2056
2057 d = atof(sstrsep(&p, sep));
2058 if (n)
2059 dsa_results[k][1] = 1 / (1 / dsa_results[k][1] + 1 / d);
2060 else
2061 dsa_results[k][1] = d;
2062 }
2063 else if (!strncmp(buf, "+F4:", 4)) {
2064 int k;
2065 double d;
2066
2067 p = buf + 4;
2068 k = strtonum(sstrsep(&p, sep),
2069 0, ALGOR_NUM32 - 1, &errstr);
2070 sstrsep(&p, sep);
2071
2072 d = atof(sstrsep(&p, sep));
2073 if (n)
2074 ecdsa_results[k][0] = 1 / (1 / ecdsa_results[k][0] + 1 / d);
2075 else
2076 ecdsa_results[k][0] = d;
2077
2078 d = atof(sstrsep(&p, sep));
2079 if (n)
2080 ecdsa_results[k][1] = 1 / (1 / ecdsa_results[k][1] + 1 / d);
2081 else
2082 ecdsa_results[k][1] = d;
2083 }
2084
2085 else if (!strncmp(buf, "+F5:", 4)) {
2086 int k;
2087 double d;
2088
2089 p = buf + 4;
2090 k = strtonum(sstrsep(&p, sep),
2091 0, ALGOR_NUM32 - 1, &errstr);
2092 sstrsep(&p, sep);
2093
2094 d = atof(sstrsep(&p, sep));
2095 if (n)
2096 ecdh_results[k][0] = 1 / (1 / ecdh_results[k][0] + 1 / d);
2097 else
2098 ecdh_results[k][0] = d;
2099
2100 }
2101
2102 else if (!strncmp(buf, "+H:", 3)) {
2103 } else
2104 fprintf(stderr(&__sF[2]), "Unknown type '%s' from child %d\n", buf, n);
2105 }
2106
2107 fclose(f);
2108 }
2109 free(fds);
2110 return 1;
2111}
2112#endif