]> git.ipfire.org Git - thirdparty/openssl.git/blame - apps/speed.c
Remove unused parameters from internal functions
[thirdparty/openssl.git] / apps / speed.c
CommitLineData
58964a49 1/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
d02b48c6
RE
2 * All rights reserved.
3 *
4 * This package is an SSL implementation written
5 * by Eric Young (eay@cryptsoft.com).
6 * The implementation was written so as to conform with Netscapes SSL.
0f113f3e 7 *
d02b48c6
RE
8 * This library is free for commercial and non-commercial use as long as
9 * the following conditions are aheared to. The following conditions
10 * apply to all code found in this distribution, be it the RC4, RSA,
11 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12 * included with this distribution is covered by the same copyright terms
13 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
0f113f3e 14 *
d02b48c6
RE
15 * Copyright remains Eric Young's, and as such any Copyright notices in
16 * the code are not to be removed.
17 * If this package is used in a product, Eric Young should be given attribution
18 * as the author of the parts of the library used.
19 * This can be in the form of a textual message at program startup or
20 * in documentation (online or textual) provided with the package.
0f113f3e 21 *
d02b48c6
RE
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the copyright
26 * notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 * notice, this list of conditions and the following disclaimer in the
29 * documentation and/or other materials provided with the distribution.
30 * 3. All advertising materials mentioning features or use of this software
31 * must display the following acknowledgement:
32 * "This product includes cryptographic software written by
33 * Eric Young (eay@cryptsoft.com)"
34 * The word 'cryptographic' can be left out if the rouines from the library
35 * being used are not cryptographic related :-).
0f113f3e 36 * 4. If you include any Windows specific code (or a derivative thereof) from
d02b48c6
RE
37 * the apps directory (application code) you must include an acknowledgement:
38 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
0f113f3e 39 *
d02b48c6
RE
40 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * SUCH DAMAGE.
0f113f3e 51 *
d02b48c6
RE
52 * The licence and distribution terms for any publically available version or
53 * derivative of this code cannot be changed. i.e. this code cannot simply be
54 * copied and put under another distribution licence
55 * [including the GNU Public Licence.]
56 */
e172d60d 57/* ====================================================================
7e965dcc 58 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
e172d60d 59 *
0f113f3e 60 * Portions of the attached software ("Contribution") are developed by
e172d60d
BM
61 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
62 *
63 * The Contribution is licensed pursuant to the OpenSSL open source
64 * license provided above.
65 *
0f113f3e 66 * The ECDH and ECDSA speed test software is originally written by
e172d60d
BM
67 * Sumit Gupta of Sun Microsystems Laboratories.
68 *
69 */
d02b48c6 70
a00ae6c4
RS
71#undef SECONDS
72#define SECONDS 3
73#define PRIME_SECONDS 10
74#define RSA_SECONDS 10
75#define DSA_SECONDS 10
76#define ECDSA_SECONDS 10
77#define ECDH_SECONDS 10
78
a00ae6c4
RS
79#include <stdio.h>
80#include <stdlib.h>
a00ae6c4
RS
81#include <string.h>
82#include <math.h>
83#include "apps.h"
84#include <openssl/crypto.h>
85#include <openssl/rand.h>
86#include <openssl/err.h>
87#include <openssl/evp.h>
88#include <openssl/objects.h>
89#if !defined(OPENSSL_SYS_MSDOS)
90# include OPENSSL_UNISTD
91#endif
d02b48c6 92
a00ae6c4
RS
93#ifndef OPENSSL_SYS_NETWARE
94# include <signal.h>
95#endif
4d8743f4 96
8d35ceb9 97#if defined(_WIN32)
a00ae6c4 98# include <windows.h>
a00ae6c4 99#endif
d02b48c6 100
a00ae6c4
RS
101#include <openssl/bn.h>
102#ifndef OPENSSL_NO_DES
103# include <openssl/des.h>
104#endif
105#ifndef OPENSSL_NO_AES
106# include <openssl/aes.h>
107#endif
108#ifndef OPENSSL_NO_CAMELLIA
109# include <openssl/camellia.h>
110#endif
111#ifndef OPENSSL_NO_MD2
112# include <openssl/md2.h>
113#endif
114#ifndef OPENSSL_NO_MDC2
115# include <openssl/mdc2.h>
116#endif
117#ifndef OPENSSL_NO_MD4
118# include <openssl/md4.h>
119#endif
120#ifndef OPENSSL_NO_MD5
121# include <openssl/md5.h>
122#endif
7e1b7485 123#include <openssl/hmac.h>
7e1b7485 124#include <openssl/sha.h>
a00ae6c4
RS
125#ifndef OPENSSL_NO_RMD160
126# include <openssl/ripemd.h>
127#endif
128#ifndef OPENSSL_NO_WHIRLPOOL
129# include <openssl/whrlpool.h>
130#endif
131#ifndef OPENSSL_NO_RC4
132# include <openssl/rc4.h>
133#endif
134#ifndef OPENSSL_NO_RC5
135# include <openssl/rc5.h>
136#endif
137#ifndef OPENSSL_NO_RC2
138# include <openssl/rc2.h>
139#endif
140#ifndef OPENSSL_NO_IDEA
141# include <openssl/idea.h>
142#endif
143#ifndef OPENSSL_NO_SEED
144# include <openssl/seed.h>
145#endif
146#ifndef OPENSSL_NO_BF
147# include <openssl/blowfish.h>
148#endif
149#ifndef OPENSSL_NO_CAST
150# include <openssl/cast.h>
151#endif
152#ifndef OPENSSL_NO_RSA
153# include <openssl/rsa.h>
154# include "./testrsa.h"
155#endif
156#include <openssl/x509.h>
157#ifndef OPENSSL_NO_DSA
158# include <openssl/dsa.h>
159# include "./testdsa.h"
160#endif
10bf4fc2 161#ifndef OPENSSL_NO_EC
fb29bb59 162# include <openssl/ec.h>
a00ae6c4
RS
163#endif
164#include <openssl/modes.h>
b5419b81 165
a00ae6c4
RS
166#ifndef HAVE_FORK
167# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
168# define HAVE_FORK 0
0f113f3e 169# else
a00ae6c4 170# define HAVE_FORK 1
0f113f3e 171# endif
a00ae6c4 172#endif
66d3e748 173
a00ae6c4
RS
174#if HAVE_FORK
175# undef NO_FORK
176#else
177# define NO_FORK
178#endif
179
180#undef BUFSIZE
181#define BUFSIZE (1024*8+1)
182#define MAX_MISALIGNMENT 63
e2d03db4 183
0f113f3e 184static volatile int run = 0;
d02b48c6 185
0f113f3e
MC
186static int mr = 0;
187static int usertime = 1;
7876e448 188
0e211563 189static double Time_F(int s);
0f113f3e 190static void print_message(const char *s, long num, int length);
689c6f25 191static void pkey_print_message(const char *str, const char *str2,
0f113f3e
MC
192 long num, int bits, int sec);
193static void print_result(int alg, int run_no, int count, double time_used);
a00ae6c4 194#ifndef NO_FORK
0e211563 195static int do_multi(int multi);
a00ae6c4 196#endif
0f113f3e 197
a00ae6c4
RS
198#define ALGOR_NUM 30
199#define SIZE_NUM 5
200#define PRIME_NUM 3
201#define RSA_NUM 7
202#define DSA_NUM 3
0f113f3e 203
a00ae6c4
RS
204#define EC_NUM 16
205#define MAX_ECDH_SIZE 256
7e1b7485 206#define MISALIGN 64
0f113f3e
MC
207
208static const char *names[ALGOR_NUM] = {
209 "md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4",
210 "des cbc", "des ede3", "idea cbc", "seed cbc",
211 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
212 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
213 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
214 "evp", "sha256", "sha512", "whirlpool",
215 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash"
216};
d02b48c6 217
0e211563 218static double results[ALGOR_NUM][SIZE_NUM];
7e1b7485
RS
219static int lengths[SIZE_NUM] = {
220 16, 64, 256, 1024, 8 * 1024
221};
0f113f3e 222
a00ae6c4 223#ifndef OPENSSL_NO_RSA
0e211563 224static double rsa_results[RSA_NUM][2];
a00ae6c4
RS
225#endif
226#ifndef OPENSSL_NO_DSA
0e211563 227static double dsa_results[DSA_NUM][2];
a00ae6c4 228#endif
10bf4fc2 229#ifndef OPENSSL_NO_EC
e172d60d
BM
230static double ecdsa_results[EC_NUM][2];
231static double ecdh_results[EC_NUM][1];
a00ae6c4 232#endif
e172d60d 233
10bf4fc2 234#if defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_EC)
0f113f3e
MC
235static const char rnd_seed[] =
236 "string to make the random number generator think it has entropy";
3eeaab4b 237static int rnd_fake = 0;
a00ae6c4 238#endif
0e211563 239
a00ae6c4
RS
240#ifdef SIGALRM
241# if defined(__STDC__) || defined(sgi) || defined(_AIX)
242# define SIGRETTYPE void
243# else
244# define SIGRETTYPE int
245# endif
b83eddc5 246
d02b48c6 247static SIGRETTYPE sig_done(int sig);
6b691a5c 248static SIGRETTYPE sig_done(int sig)
0f113f3e
MC
249{
250 signal(SIGALRM, sig_done);
251 run = 0;
252}
a00ae6c4 253#endif
d02b48c6 254
a00ae6c4
RS
255#define START 0
256#define STOP 1
d02b48c6 257
a00ae6c4 258#if defined(_WIN32)
4d8743f4 259
a00ae6c4
RS
260# if !defined(SIGALRM)
261# define SIGALRM
262# endif
0f113f3e
MC
263static unsigned int lapse, schlock;
264static void alarm_win32(unsigned int secs)
265{
266 lapse = secs * 1000;
267}
4d8743f4 268
a00ae6c4 269# define alarm alarm_win32
0f113f3e
MC
270
271static DWORD WINAPI sleepy(VOID * arg)
272{
273 schlock = 1;
274 Sleep(lapse);
275 run = 0;
276 return 0;
277}
4e74239c 278
0a39d8f2 279static double Time_F(int s)
0f113f3e
MC
280{
281 double ret;
282 static HANDLE thr;
283
284 if (s == START) {
285 schlock = 0;
286 thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL);
287 if (thr == NULL) {
db40a14e
AP
288 DWORD err = GetLastError();
289 BIO_printf(bio_err, "unable to CreateThread (%lu)", err);
290 ExitProcess(err);
0f113f3e
MC
291 }
292 while (!schlock)
293 Sleep(0); /* scheduler spinlock */
294 ret = app_tminterval(s, usertime);
295 } else {
296 ret = app_tminterval(s, usertime);
297 if (run)
298 TerminateThread(thr, 0);
299 CloseHandle(thr);
300 }
301
302 return ret;
303}
a00ae6c4 304#else
d02b48c6 305
0f113f3e
MC
306static double Time_F(int s)
307{
308 double ret = app_tminterval(s, usertime);
309 if (s == STOP)
310 alarm(0);
311 return ret;
312}
a00ae6c4 313#endif
176f31dd 314
10bf4fc2 315#ifndef OPENSSL_NO_EC
176f31dd 316static const int KDF1_SHA1_len = 20;
0f113f3e
MC
317static void *KDF1_SHA1(const void *in, size_t inlen, void *out,
318 size_t *outlen)
319{
0f113f3e
MC
320 if (*outlen < SHA_DIGEST_LENGTH)
321 return NULL;
474e469b 322 *outlen = SHA_DIGEST_LENGTH;
0f113f3e 323 return SHA1(in, inlen, out);
0f113f3e 324}
10bf4fc2 325#endif /* OPENSSL_NO_EC */
176f31dd 326
375a64e3 327static void multiblock_speed(const EVP_CIPHER *evp_cipher);
176f31dd 328
7e1b7485
RS
329static int found(const char *name, const OPT_PAIR * pairs, int *result)
330{
331 for (; pairs->name; pairs++)
332 if (strcmp(name, pairs->name) == 0) {
333 *result = pairs->retval;
334 return 1;
335 }
336 return 0;
337}
338
339typedef enum OPTION_choice {
340 OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
341 OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
342 OPT_MR, OPT_MB, OPT_MISALIGN
343} OPTION_CHOICE;
344
345OPTIONS speed_options[] = {
346 {OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
347 {OPT_HELP_STR, 1, '-', "Valid options are:\n"},
348 {"help", OPT_HELP, '-', "Display this summary"},
9c3bcfa0
RS
349 {"evp", OPT_EVP, 's', "Use specified EVP cipher"},
350 {"decrypt", OPT_DECRYPT, '-',
351 "Time decryption instead of encryption (only EVP)"},
352 {"mr", OPT_MR, '-', "Produce machine readable output"},
353 {"mb", OPT_MB, '-'},
354 {"misalign", OPT_MISALIGN, 'n', "Amount to mis-align buffers"},
7e1b7485
RS
355 {"elapsed", OPT_ELAPSED, '-',
356 "Measure time in real time instead of CPU user time"},
7e1b7485
RS
357#ifndef NO_FORK
358 {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
359#endif
7e1b7485
RS
360#ifndef OPENSSL_NO_ENGINE
361 {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
362#endif
7786005d 363 {NULL},
7e1b7485
RS
364};
365
366#define D_MD2 0
367#define D_MDC2 1
368#define D_MD4 2
369#define D_MD5 3
370#define D_HMAC 4
371#define D_SHA1 5
372#define D_RMD160 6
373#define D_RC4 7
374#define D_CBC_DES 8
375#define D_EDE3_DES 9
376#define D_CBC_IDEA 10
377#define D_CBC_SEED 11
378#define D_CBC_RC2 12
379#define D_CBC_RC5 13
380#define D_CBC_BF 14
381#define D_CBC_CAST 15
382#define D_CBC_128_AES 16
383#define D_CBC_192_AES 17
384#define D_CBC_256_AES 18
385#define D_CBC_128_CML 19
386#define D_CBC_192_CML 20
387#define D_CBC_256_CML 21
388#define D_EVP 22
389#define D_SHA256 23
390#define D_SHA512 24
391#define D_WHIRLPOOL 25
392#define D_IGE_128_AES 26
393#define D_IGE_192_AES 27
394#define D_IGE_256_AES 28
395#define D_GHASH 29
df2ee0e2 396static OPT_PAIR doit_choices[] = {
7e1b7485
RS
397#ifndef OPENSSL_NO_MD2
398 {"md2", D_MD2},
399#endif
400#ifndef OPENSSL_NO_MDC2
401 {"mdc2", D_MDC2},
402#endif
403#ifndef OPENSSL_NO_MD4
404 {"md4", D_MD4},
405#endif
406#ifndef OPENSSL_NO_MD5
407 {"md5", D_MD5},
408#endif
409#ifndef OPENSSL_NO_MD5
410 {"hmac", D_HMAC},
411#endif
412 {"sha1", D_SHA1},
413 {"sha256", D_SHA256},
414 {"sha512", D_SHA512},
415#ifndef OPENSSL_NO_WHIRLPOOL
416 {"whirlpool", D_WHIRLPOOL},
417#endif
fd682e4c 418#ifndef OPENSSL_NO_RMD160
7e1b7485
RS
419 {"ripemd", D_RMD160},
420 {"rmd160", D_RMD160},
421 {"ripemd160", D_RMD160},
422#endif
423#ifndef OPENSSL_NO_RC4
424 {"rc4", D_RC4},
425#endif
426#ifndef OPENSSL_NO_DES
427 {"des-cbc", D_CBC_DES},
428 {"des-ede3", D_EDE3_DES},
429#endif
430#ifndef OPENSSL_NO_AES
431 {"aes-128-cbc", D_CBC_128_AES},
432 {"aes-192-cbc", D_CBC_192_AES},
433 {"aes-256-cbc", D_CBC_256_AES},
434 {"aes-128-ige", D_IGE_128_AES},
435 {"aes-192-ige", D_IGE_192_AES},
436 {"aes-256-ige", D_IGE_256_AES},
437#endif
438#ifndef OPENSSL_NO_RC2
439 {"rc2-cbc", D_CBC_RC2},
440 {"rc2", D_CBC_RC2},
441#endif
442#ifndef OPENSSL_NO_RC5
443 {"rc5-cbc", D_CBC_RC5},
444 {"rc5", D_CBC_RC5},
445#endif
446#ifndef OPENSSL_NO_IDEA
447 {"idea-cbc", D_CBC_IDEA},
448 {"idea", D_CBC_IDEA},
449#endif
450#ifndef OPENSSL_NO_SEED
451 {"seed-cbc", D_CBC_SEED},
452 {"seed", D_CBC_SEED},
453#endif
454#ifndef OPENSSL_NO_BF
455 {"bf-cbc", D_CBC_BF},
456 {"blowfish", D_CBC_BF},
457 {"bf", D_CBC_BF},
458#endif
459#ifndef OPENSSL_NO_CAST
460 {"cast-cbc", D_CBC_CAST},
461 {"cast", D_CBC_CAST},
462 {"cast5", D_CBC_CAST},
463#endif
464 {"ghash", D_GHASH},
465 {NULL}
466};
467
468#define R_DSA_512 0
469#define R_DSA_1024 1
470#define R_DSA_2048 2
471static OPT_PAIR dsa_choices[] = {
472 {"dsa512", R_DSA_512},
473 {"dsa1024", R_DSA_1024},
474 {"dsa2048", R_DSA_2048},
475 {NULL},
476};
667ac4ec 477
7e1b7485
RS
478#define R_RSA_512 0
479#define R_RSA_1024 1
480#define R_RSA_2048 2
481#define R_RSA_3072 3
482#define R_RSA_4096 4
483#define R_RSA_7680 5
484#define R_RSA_15360 6
485static OPT_PAIR rsa_choices[] = {
486 {"rsa512", R_RSA_512},
487 {"rsa1024", R_RSA_1024},
488 {"rsa2048", R_RSA_2048},
489 {"rsa3072", R_RSA_3072},
490 {"rsa4096", R_RSA_4096},
491 {"rsa7680", R_RSA_7680},
492 {"rsa15360", R_RSA_15360},
493 {NULL}
494};
495
496#define R_EC_P160 0
497#define R_EC_P192 1
498#define R_EC_P224 2
499#define R_EC_P256 3
500#define R_EC_P384 4
501#define R_EC_P521 5
502#define R_EC_K163 6
503#define R_EC_K233 7
504#define R_EC_K283 8
505#define R_EC_K409 9
506#define R_EC_K571 10
507#define R_EC_B163 11
508#define R_EC_B233 12
509#define R_EC_B283 13
510#define R_EC_B409 14
511#define R_EC_B571 15
f5349f8c 512#ifndef OPENSSL_NO_EC
7e1b7485
RS
513static OPT_PAIR ecdsa_choices[] = {
514 {"ecdsap160", R_EC_P160},
515 {"ecdsap192", R_EC_P192},
516 {"ecdsap224", R_EC_P224},
517 {"ecdsap256", R_EC_P256},
518 {"ecdsap384", R_EC_P384},
519 {"ecdsap521", R_EC_P521},
520 {"ecdsak163", R_EC_K163},
521 {"ecdsak233", R_EC_K233},
522 {"ecdsak283", R_EC_K283},
523 {"ecdsak409", R_EC_K409},
524 {"ecdsak571", R_EC_K571},
525 {"ecdsab163", R_EC_B163},
526 {"ecdsab233", R_EC_B233},
527 {"ecdsab283", R_EC_B283},
528 {"ecdsab409", R_EC_B409},
529 {"ecdsab571", R_EC_B571},
530 {NULL}
531};
532static OPT_PAIR ecdh_choices[] = {
533 {"ecdhp160", R_EC_P160},
534 {"ecdhp192", R_EC_P192},
535 {"ecdhp224", R_EC_P224},
536 {"ecdhp256", R_EC_P256},
537 {"ecdhp384", R_EC_P384},
538 {"ecdhp521", R_EC_P521},
539 {"ecdhk163", R_EC_K163},
540 {"ecdhk233", R_EC_K233},
541 {"ecdhk283", R_EC_K283},
542 {"ecdhk409", R_EC_K409},
543 {"ecdhk571", R_EC_K571},
544 {"ecdhb163", R_EC_B163},
545 {"ecdhb233", R_EC_B233},
546 {"ecdhb283", R_EC_B283},
547 {"ecdhb409", R_EC_B409},
548 {"ecdhb571", R_EC_B571},
549 {NULL}
550};
551#endif
552
553int speed_main(int argc, char **argv)
0f113f3e 554{
7e1b7485
RS
555 char *prog;
556 const EVP_CIPHER *evp_cipher = NULL;
557 const EVP_MD *evp_md = NULL;
558 double d = 0.0;
559 OPTION_CHOICE o;
560 int decrypt = 0, multiblock = 0, doit[ALGOR_NUM], pr_header = 0;
561 int dsa_doit[DSA_NUM], rsa_doit[RSA_NUM];
562 int ret = 1, i, j, k, misalign = MAX_MISALIGNMENT + 1;
563 long c[ALGOR_NUM][SIZE_NUM], count = 0, save_count = 0;
0f113f3e
MC
564 unsigned char *buf_malloc = NULL, *buf2_malloc = NULL;
565 unsigned char *buf = NULL, *buf2 = NULL;
7e1b7485
RS
566 unsigned char md[EVP_MAX_MD_SIZE];
567#ifndef NO_FORK
568 int multi = 0;
569#endif
570 /* What follows are the buffers and key material. */
a00ae6c4 571#if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
0f113f3e 572 long rsa_count;
a00ae6c4 573#endif
a00ae6c4 574#ifndef OPENSSL_NO_MD2
0f113f3e 575 unsigned char md2[MD2_DIGEST_LENGTH];
a00ae6c4
RS
576#endif
577#ifndef OPENSSL_NO_MDC2
0f113f3e 578 unsigned char mdc2[MDC2_DIGEST_LENGTH];
a00ae6c4
RS
579#endif
580#ifndef OPENSSL_NO_MD4
0f113f3e 581 unsigned char md4[MD4_DIGEST_LENGTH];
a00ae6c4
RS
582#endif
583#ifndef OPENSSL_NO_MD5
0f113f3e
MC
584 unsigned char md5[MD5_DIGEST_LENGTH];
585 unsigned char hmac[MD5_DIGEST_LENGTH];
a00ae6c4 586#endif
0f113f3e 587 unsigned char sha[SHA_DIGEST_LENGTH];
0f113f3e 588 unsigned char sha256[SHA256_DIGEST_LENGTH];
0f113f3e 589 unsigned char sha512[SHA512_DIGEST_LENGTH];
a00ae6c4 590#ifndef OPENSSL_NO_WHIRLPOOL
0f113f3e 591 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
a00ae6c4 592#endif
fd682e4c 593#ifndef OPENSSL_NO_RMD160
0f113f3e 594 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
a00ae6c4
RS
595#endif
596#ifndef OPENSSL_NO_RC4
0f113f3e 597 RC4_KEY rc4_ks;
a00ae6c4
RS
598#endif
599#ifndef OPENSSL_NO_RC5
0f113f3e 600 RC5_32_KEY rc5_ks;
a00ae6c4
RS
601#endif
602#ifndef OPENSSL_NO_RC2
0f113f3e 603 RC2_KEY rc2_ks;
a00ae6c4
RS
604#endif
605#ifndef OPENSSL_NO_IDEA
0f113f3e 606 IDEA_KEY_SCHEDULE idea_ks;
a00ae6c4
RS
607#endif
608#ifndef OPENSSL_NO_SEED
0f113f3e 609 SEED_KEY_SCHEDULE seed_ks;
a00ae6c4
RS
610#endif
611#ifndef OPENSSL_NO_BF
0f113f3e 612 BF_KEY bf_ks;
a00ae6c4
RS
613#endif
614#ifndef OPENSSL_NO_CAST
0f113f3e 615 CAST_KEY cast_ks;
a00ae6c4 616#endif
0f113f3e
MC
617 static const unsigned char key16[16] = {
618 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
619 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
620 };
a00ae6c4 621#ifndef OPENSSL_NO_AES
0f113f3e
MC
622 static const unsigned char key24[24] = {
623 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
624 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
625 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
626 };
627 static const unsigned char key32[32] = {
628 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
629 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
630 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
631 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
632 };
a00ae6c4
RS
633#endif
634#ifndef OPENSSL_NO_CAMELLIA
0f113f3e
MC
635 static const unsigned char ckey24[24] = {
636 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
637 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
638 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
639 };
640 static const unsigned char ckey32[32] = {
641 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
642 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
643 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
644 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56
645 };
7e1b7485 646 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
a00ae6c4
RS
647#endif
648#ifndef OPENSSL_NO_AES
649# define MAX_BLOCK_SIZE 128
650#else
651# define MAX_BLOCK_SIZE 64
652#endif
0f113f3e
MC
653 unsigned char DES_iv[8];
654 unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
a00ae6c4 655#ifndef OPENSSL_NO_DES
7e1b7485
RS
656 static DES_cblock key = {
657 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0
658 };
659 static DES_cblock key2 = {
660 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12
661 };
662 static DES_cblock key3 = {
663 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34
664 };
0f113f3e
MC
665 DES_key_schedule sch;
666 DES_key_schedule sch2;
667 DES_key_schedule sch3;
a00ae6c4
RS
668#endif
669#ifndef OPENSSL_NO_AES
0f113f3e 670 AES_KEY aes_ks1, aes_ks2, aes_ks3;
a00ae6c4 671#endif
a00ae6c4 672#ifndef OPENSSL_NO_RSA
7e1b7485 673 unsigned rsa_num;
0f113f3e
MC
674 RSA *rsa_key[RSA_NUM];
675 long rsa_c[RSA_NUM][2];
676 static unsigned int rsa_bits[RSA_NUM] = {
677 512, 1024, 2048, 3072, 4096, 7680, 15360
678 };
679 static unsigned char *rsa_data[RSA_NUM] = {
680 test512, test1024, test2048, test3072, test4096, test7680, test15360
681 };
682 static int rsa_data_length[RSA_NUM] = {
683 sizeof(test512), sizeof(test1024),
684 sizeof(test2048), sizeof(test3072),
685 sizeof(test4096), sizeof(test7680),
686 sizeof(test15360)
687 };
a00ae6c4
RS
688#endif
689#ifndef OPENSSL_NO_DSA
0f113f3e
MC
690 DSA *dsa_key[DSA_NUM];
691 long dsa_c[DSA_NUM][2];
692 static unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 };
a00ae6c4
RS
693#endif
694#ifndef OPENSSL_NO_EC
0f113f3e
MC
695 /*
696 * We only test over the following curves as they are representative, To
697 * add tests over more curves, simply add the curve NID and curve name to
698 * the following arrays and increase the EC_NUM value accordingly.
699 */
700 static unsigned int test_curves[EC_NUM] = {
701 /* Prime Curves */
7e1b7485
RS
702 NID_secp160r1, NID_X9_62_prime192v1, NID_secp224r1,
703 NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1,
0f113f3e 704 /* Binary Curves */
7e1b7485
RS
705 NID_sect163k1, NID_sect233k1, NID_sect283k1,
706 NID_sect409k1, NID_sect571k1, NID_sect163r2,
707 NID_sect233r1, NID_sect283r1, NID_sect409r1,
0f113f3e
MC
708 NID_sect571r1
709 };
710 static const char *test_curves_names[EC_NUM] = {
711 /* Prime Curves */
7e1b7485
RS
712 "secp160r1", "nistp192", "nistp224",
713 "nistp256", "nistp384", "nistp521",
0f113f3e 714 /* Binary Curves */
7e1b7485
RS
715 "nistk163", "nistk233", "nistk283",
716 "nistk409", "nistk571", "nistb163",
717 "nistb233", "nistb283", "nistb409",
0f113f3e
MC
718 "nistb571"
719 };
720 static int test_curves_bits[EC_NUM] = {
7e1b7485
RS
721 160, 192, 224,
722 256, 384, 521,
723 163, 233, 283,
724 409, 571, 163,
725 233, 283, 409,
726 571
0f113f3e 727 };
a00ae6c4 728#endif
10bf4fc2 729#ifndef OPENSSL_NO_EC
0f113f3e
MC
730 unsigned char ecdsasig[256];
731 unsigned int ecdsasiglen;
732 EC_KEY *ecdsa[EC_NUM];
733 long ecdsa_c[EC_NUM][2];
7e1b7485 734 int ecdsa_doit[EC_NUM];
0f113f3e
MC
735 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
736 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
737 int secret_size_a, secret_size_b;
738 int ecdh_checks = 0;
739 int secret_idx = 0;
740 long ecdh_c[EC_NUM][2];
10bf4fc2 741 int ecdh_doit[EC_NUM];
a00ae6c4 742#endif
d02b48c6 743
0f113f3e 744 memset(results, 0, sizeof(results));
a00ae6c4 745#ifndef OPENSSL_NO_DSA
0f113f3e 746 memset(dsa_key, 0, sizeof(dsa_key));
a00ae6c4 747#endif
10bf4fc2 748#ifndef OPENSSL_NO_EC
0f113f3e
MC
749 for (i = 0; i < EC_NUM; i++)
750 ecdsa[i] = NULL;
7e1b7485
RS
751 for (i = 0; i < EC_NUM; i++)
752 ecdh_a[i] = ecdh_b[i] = NULL;
a00ae6c4 753#endif
a00ae6c4 754#ifndef OPENSSL_NO_RSA
0f113f3e
MC
755 memset(rsa_key, 0, sizeof(rsa_key));
756 for (i = 0; i < RSA_NUM; i++)
757 rsa_key[i] = NULL;
a00ae6c4 758#endif
3647bee2 759
0f113f3e
MC
760 memset(c, 0, sizeof(c));
761 memset(DES_iv, 0, sizeof(DES_iv));
762 memset(iv, 0, sizeof(iv));
763
764 for (i = 0; i < ALGOR_NUM; i++)
765 doit[i] = 0;
766 for (i = 0; i < RSA_NUM; i++)
767 rsa_doit[i] = 0;
768 for (i = 0; i < DSA_NUM; i++)
769 dsa_doit[i] = 0;
10bf4fc2 770#ifndef OPENSSL_NO_EC
0f113f3e
MC
771 for (i = 0; i < EC_NUM; i++)
772 ecdsa_doit[i] = 0;
0f113f3e
MC
773 for (i = 0; i < EC_NUM; i++)
774 ecdh_doit[i] = 0;
a00ae6c4 775#endif
0f113f3e 776
68dc6824
RS
777 buf = buf_malloc = app_malloc((int)BUFSIZE + misalign, "input buffer");
778 buf2 = buf2_malloc = app_malloc((int)BUFSIZE + misalign, "output buffer");
7e1b7485 779 misalign = 0;
7e1b7485
RS
780
781 prog = opt_init(argc, argv, speed_options);
782 while ((o = opt_next()) != OPT_EOF) {
783 switch (o) {
784 case OPT_EOF:
785 case OPT_ERR:
786 opterr:
787 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
788 goto end;
789 case OPT_HELP:
790 opt_help(speed_options);
791 ret = 0;
792 goto end;
793 case OPT_ELAPSED:
0f113f3e 794 usertime = 0;
7e1b7485
RS
795 break;
796 case OPT_EVP:
797 evp_cipher = EVP_get_cipherbyname(opt_arg());
798 if (evp_cipher == NULL)
799 evp_md = EVP_get_digestbyname(opt_arg());
800 if (evp_cipher == NULL && evp_md == NULL) {
801 BIO_printf(bio_err,
802 "%s: %s an unknown cipher or digest\n",
803 prog, opt_arg());
0f113f3e
MC
804 goto end;
805 }
806 doit[D_EVP] = 1;
7e1b7485
RS
807 break;
808 case OPT_DECRYPT:
0f113f3e 809 decrypt = 1;
7e1b7485 810 break;
7e1b7485 811 case OPT_ENGINE:
333b070e 812 (void)setup_engine(opt_arg(), 0);
7e1b7485 813 break;
7e1b7485 814 case OPT_MULTI:
9c3bcfa0 815#ifndef NO_FORK
7e1b7485 816 multi = atoi(opt_arg());
a00ae6c4 817#endif
9c3bcfa0 818 break;
7e1b7485
RS
819 case OPT_MISALIGN:
820 if (!opt_int(opt_arg(), &misalign))
0f113f3e 821 goto end;
7e1b7485 822 if (misalign > MISALIGN) {
0f113f3e 823 BIO_printf(bio_err,
7e1b7485
RS
824 "%s: Maximum offset is %d\n", prog, MISALIGN);
825 goto opterr;
0f113f3e
MC
826 }
827 buf = buf_malloc + misalign;
828 buf2 = buf2_malloc + misalign;
7e1b7485
RS
829 break;
830 case OPT_MR:
831 mr = 1;
832 break;
833 case OPT_MB:
834 multiblock = 1;
835 break;
836 }
837 }
838 argc = opt_num_rest();
839 argv = opt_rest();
840
841 /* Remaining arguments are algorithms. */
842 for ( ; *argv; argv++) {
843 if (found(*argv, doit_choices, &i)) {
844 doit[i] = 1;
845 continue;
846 }
a00ae6c4 847#ifndef OPENSSL_NO_DES
7e1b7485
RS
848 if (strcmp(*argv, "des") == 0) {
849 doit[D_CBC_DES] = doit[D_EDE3_DES] = 1;
850 continue;
851 }
a00ae6c4 852#endif
7e1b7485
RS
853 if (strcmp(*argv, "sha") == 0) {
854 doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1;
855 continue;
856 }
a00ae6c4 857#ifndef OPENSSL_NO_RSA
a00ae6c4 858# ifndef RSA_NULL
0f113f3e 859 if (strcmp(*argv, "openssl") == 0) {
b0700d2c 860 RSA_set_default_method(RSA_PKCS1_OpenSSL());
7e1b7485
RS
861 continue;
862 }
a00ae6c4 863# endif
7e1b7485
RS
864 if (strcmp(*argv, "rsa") == 0) {
865 rsa_doit[R_RSA_512] = rsa_doit[R_RSA_1024] =
866 rsa_doit[R_RSA_2048] = rsa_doit[R_RSA_3072] =
867 rsa_doit[R_RSA_4096] = rsa_doit[R_RSA_7680] =
868 rsa_doit[R_RSA_15360] = 1;
869 continue;
870 }
871 if (found(*argv, rsa_choices, &i)) {
872 rsa_doit[i] = 1;
873 continue;
874 }
a00ae6c4 875#endif
7e1b7485
RS
876#ifndef OPENSSL_NO_DSA
877 if (strcmp(*argv, "dsa") == 0) {
878 dsa_doit[R_DSA_512] = dsa_doit[R_DSA_1024] =
879 dsa_doit[R_DSA_2048] = 1;
880 continue;
881 }
882 if (found(*argv, dsa_choices, &i)) {
883 dsa_doit[i] = 2;
884 continue;
885 }
a00ae6c4
RS
886#endif
887#ifndef OPENSSL_NO_AES
0f113f3e 888 if (strcmp(*argv, "aes") == 0) {
7e1b7485
RS
889 doit[D_CBC_128_AES] = doit[D_CBC_192_AES] =
890 doit[D_CBC_256_AES] = 1;
891 continue;
892 }
a00ae6c4
RS
893#endif
894#ifndef OPENSSL_NO_CAMELLIA
0f113f3e 895 if (strcmp(*argv, "camellia") == 0) {
7e1b7485
RS
896 doit[D_CBC_128_CML] = doit[D_CBC_192_CML] =
897 doit[D_CBC_256_CML] = 1;
898 continue;
899 }
a00ae6c4 900#endif
10bf4fc2 901#ifndef OPENSSL_NO_EC
7e1b7485 902 if (strcmp(*argv, "ecdsa") == 0) {
0f113f3e
MC
903 for (i = 0; i < EC_NUM; i++)
904 ecdsa_doit[i] = 1;
7e1b7485
RS
905 continue;
906 }
907 if (found(*argv, ecdsa_choices, &i)) {
908 ecdsa_doit[i] = 2;
909 continue;
910 }
911 if (strcmp(*argv, "ecdh") == 0) {
0f113f3e
MC
912 for (i = 0; i < EC_NUM; i++)
913 ecdh_doit[i] = 1;
7e1b7485
RS
914 continue;
915 }
916 if (found(*argv, ecdh_choices, &i)) {
917 ecdh_doit[i] = 2;
918 continue;
0f113f3e 919 }
7e1b7485
RS
920#endif
921 BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, *argv);
922 goto end;
0f113f3e 923 }
d02b48c6 924
a00ae6c4 925#ifndef NO_FORK
0f113f3e
MC
926 if (multi && do_multi(multi))
927 goto show_res;
a00ae6c4 928#endif
d02b48c6 929
7e1b7485 930 /* No parameters; turn on everything. */
dfba17b4 931 if ((argc == 0) && !doit[D_EVP]) {
7e1b7485 932 for (i = 0; i < ALGOR_NUM; i++)
0f113f3e
MC
933 if (i != D_EVP)
934 doit[i] = 1;
0f113f3e
MC
935 for (i = 0; i < RSA_NUM; i++)
936 rsa_doit[i] = 1;
937 for (i = 0; i < DSA_NUM; i++)
938 dsa_doit[i] = 1;
10bf4fc2 939#ifndef OPENSSL_NO_EC
0f113f3e
MC
940 for (i = 0; i < EC_NUM; i++)
941 ecdsa_doit[i] = 1;
0f113f3e
MC
942 for (i = 0; i < EC_NUM; i++)
943 ecdh_doit[i] = 1;
a00ae6c4 944#endif
0f113f3e
MC
945 }
946 for (i = 0; i < ALGOR_NUM; i++)
947 if (doit[i])
948 pr_header++;
949
950 if (usertime == 0 && !mr)
951 BIO_printf(bio_err,
952 "You have chosen to measure elapsed time "
953 "instead of user CPU time.\n");
954
a00ae6c4 955#ifndef OPENSSL_NO_RSA
0f113f3e
MC
956 for (i = 0; i < RSA_NUM; i++) {
957 const unsigned char *p;
958
959 p = rsa_data[i];
960 rsa_key[i] = d2i_RSAPrivateKey(NULL, &p, rsa_data_length[i]);
961 if (rsa_key[i] == NULL) {
962 BIO_printf(bio_err, "internal error loading RSA key number %d\n",
963 i);
964 goto end;
965 }
a00ae6c4
RS
966 }
967#endif
d02b48c6 968
a00ae6c4 969#ifndef OPENSSL_NO_DSA
0f113f3e
MC
970 dsa_key[0] = get_dsa512();
971 dsa_key[1] = get_dsa1024();
972 dsa_key[2] = get_dsa2048();
a00ae6c4 973#endif
d02b48c6 974
a00ae6c4 975#ifndef OPENSSL_NO_DES
0f113f3e
MC
976 DES_set_key_unchecked(&key, &sch);
977 DES_set_key_unchecked(&key2, &sch2);
978 DES_set_key_unchecked(&key3, &sch3);
a00ae6c4
RS
979#endif
980#ifndef OPENSSL_NO_AES
0f113f3e
MC
981 AES_set_encrypt_key(key16, 128, &aes_ks1);
982 AES_set_encrypt_key(key24, 192, &aes_ks2);
983 AES_set_encrypt_key(key32, 256, &aes_ks3);
a00ae6c4
RS
984#endif
985#ifndef OPENSSL_NO_CAMELLIA
0f113f3e
MC
986 Camellia_set_key(key16, 128, &camellia_ks1);
987 Camellia_set_key(ckey24, 192, &camellia_ks2);
988 Camellia_set_key(ckey32, 256, &camellia_ks3);
a00ae6c4
RS
989#endif
990#ifndef OPENSSL_NO_IDEA
0f113f3e 991 idea_set_encrypt_key(key16, &idea_ks);
a00ae6c4
RS
992#endif
993#ifndef OPENSSL_NO_SEED
0f113f3e 994 SEED_set_key(key16, &seed_ks);
a00ae6c4
RS
995#endif
996#ifndef OPENSSL_NO_RC4
0f113f3e 997 RC4_set_key(&rc4_ks, 16, key16);
a00ae6c4
RS
998#endif
999#ifndef OPENSSL_NO_RC2
0f113f3e 1000 RC2_set_key(&rc2_ks, 16, key16, 128);
a00ae6c4
RS
1001#endif
1002#ifndef OPENSSL_NO_RC5
0f113f3e 1003 RC5_32_set_key(&rc5_ks, 16, key16, 12);
a00ae6c4
RS
1004#endif
1005#ifndef OPENSSL_NO_BF
0f113f3e 1006 BF_set_key(&bf_ks, 16, key16);
a00ae6c4
RS
1007#endif
1008#ifndef OPENSSL_NO_CAST
0f113f3e 1009 CAST_set_key(&cast_ks, 16, key16);
a00ae6c4
RS
1010#endif
1011#ifndef OPENSSL_NO_RSA
0f113f3e 1012 memset(rsa_c, 0, sizeof(rsa_c));
a00ae6c4
RS
1013#endif
1014#ifndef SIGALRM
1015# ifndef OPENSSL_NO_DES
0f113f3e
MC
1016 BIO_printf(bio_err, "First we calculate the approximate speed ...\n");
1017 count = 10;
1018 do {
1019 long it;
1020 count *= 2;
1021 Time_F(START);
1022 for (it = count; it; it--)
1023 DES_ecb_encrypt((DES_cblock *)buf,
1024 (DES_cblock *)buf, &sch, DES_ENCRYPT);
1025 d = Time_F(STOP);
1026 } while (d < 3);
1027 save_count = count;
1028 c[D_MD2][0] = count / 10;
1029 c[D_MDC2][0] = count / 10;
1030 c[D_MD4][0] = count;
1031 c[D_MD5][0] = count;
1032 c[D_HMAC][0] = count;
1033 c[D_SHA1][0] = count;
1034 c[D_RMD160][0] = count;
1035 c[D_RC4][0] = count * 5;
1036 c[D_CBC_DES][0] = count;
1037 c[D_EDE3_DES][0] = count / 3;
1038 c[D_CBC_IDEA][0] = count;
1039 c[D_CBC_SEED][0] = count;
1040 c[D_CBC_RC2][0] = count;
1041 c[D_CBC_RC5][0] = count;
1042 c[D_CBC_BF][0] = count;
1043 c[D_CBC_CAST][0] = count;
1044 c[D_CBC_128_AES][0] = count;
1045 c[D_CBC_192_AES][0] = count;
1046 c[D_CBC_256_AES][0] = count;
1047 c[D_CBC_128_CML][0] = count;
1048 c[D_CBC_192_CML][0] = count;
1049 c[D_CBC_256_CML][0] = count;
1050 c[D_SHA256][0] = count;
1051 c[D_SHA512][0] = count;
1052 c[D_WHIRLPOOL][0] = count;
1053 c[D_IGE_128_AES][0] = count;
1054 c[D_IGE_192_AES][0] = count;
1055 c[D_IGE_256_AES][0] = count;
1056 c[D_GHASH][0] = count;
1057
1058 for (i = 1; i < SIZE_NUM; i++) {
1059 long l0, l1;
1060
1061 l0 = (long)lengths[0];
1062 l1 = (long)lengths[i];
1063
1064 c[D_MD2][i] = c[D_MD2][0] * 4 * l0 / l1;
1065 c[D_MDC2][i] = c[D_MDC2][0] * 4 * l0 / l1;
1066 c[D_MD4][i] = c[D_MD4][0] * 4 * l0 / l1;
1067 c[D_MD5][i] = c[D_MD5][0] * 4 * l0 / l1;
1068 c[D_HMAC][i] = c[D_HMAC][0] * 4 * l0 / l1;
1069 c[D_SHA1][i] = c[D_SHA1][0] * 4 * l0 / l1;
1070 c[D_RMD160][i] = c[D_RMD160][0] * 4 * l0 / l1;
1071 c[D_SHA256][i] = c[D_SHA256][0] * 4 * l0 / l1;
1072 c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1;
1073 c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1;
6d9843e7 1074 c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1;
0f113f3e
MC
1075
1076 l0 = (long)lengths[i - 1];
1077
1078 c[D_RC4][i] = c[D_RC4][i - 1] * l0 / l1;
1079 c[D_CBC_DES][i] = c[D_CBC_DES][i - 1] * l0 / l1;
1080 c[D_EDE3_DES][i] = c[D_EDE3_DES][i - 1] * l0 / l1;
1081 c[D_CBC_IDEA][i] = c[D_CBC_IDEA][i - 1] * l0 / l1;
1082 c[D_CBC_SEED][i] = c[D_CBC_SEED][i - 1] * l0 / l1;
1083 c[D_CBC_RC2][i] = c[D_CBC_RC2][i - 1] * l0 / l1;
1084 c[D_CBC_RC5][i] = c[D_CBC_RC5][i - 1] * l0 / l1;
1085 c[D_CBC_BF][i] = c[D_CBC_BF][i - 1] * l0 / l1;
1086 c[D_CBC_CAST][i] = c[D_CBC_CAST][i - 1] * l0 / l1;
1087 c[D_CBC_128_AES][i] = c[D_CBC_128_AES][i - 1] * l0 / l1;
1088 c[D_CBC_192_AES][i] = c[D_CBC_192_AES][i - 1] * l0 / l1;
1089 c[D_CBC_256_AES][i] = c[D_CBC_256_AES][i - 1] * l0 / l1;
1090 c[D_CBC_128_CML][i] = c[D_CBC_128_CML][i - 1] * l0 / l1;
1091 c[D_CBC_192_CML][i] = c[D_CBC_192_CML][i - 1] * l0 / l1;
1092 c[D_CBC_256_CML][i] = c[D_CBC_256_CML][i - 1] * l0 / l1;
1093 c[D_IGE_128_AES][i] = c[D_IGE_128_AES][i - 1] * l0 / l1;
1094 c[D_IGE_192_AES][i] = c[D_IGE_192_AES][i - 1] * l0 / l1;
1095 c[D_IGE_256_AES][i] = c[D_IGE_256_AES][i - 1] * l0 / l1;
1096 }
e172d60d 1097
a00ae6c4 1098# ifndef OPENSSL_NO_RSA
0f113f3e
MC
1099 rsa_c[R_RSA_512][0] = count / 2000;
1100 rsa_c[R_RSA_512][1] = count / 400;
1101 for (i = 1; i < RSA_NUM; i++) {
1102 rsa_c[i][0] = rsa_c[i - 1][0] / 8;
1103 rsa_c[i][1] = rsa_c[i - 1][1] / 4;
1104 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1105 rsa_doit[i] = 0;
1106 else {
1107 if (rsa_c[i][0] == 0) {
1108 rsa_c[i][0] = 1;
1109 rsa_c[i][1] = 20;
1110 }
1111 }
1112 }
a00ae6c4 1113# endif
0f113f3e 1114
a00ae6c4 1115# ifndef OPENSSL_NO_DSA
0f113f3e
MC
1116 dsa_c[R_DSA_512][0] = count / 1000;
1117 dsa_c[R_DSA_512][1] = count / 1000 / 2;
1118 for (i = 1; i < DSA_NUM; i++) {
1119 dsa_c[i][0] = dsa_c[i - 1][0] / 4;
1120 dsa_c[i][1] = dsa_c[i - 1][1] / 4;
1121 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1122 dsa_doit[i] = 0;
1123 else {
1124 if (dsa_c[i] == 0) {
1125 dsa_c[i][0] = 1;
1126 dsa_c[i][1] = 1;
1127 }
1128 }
1129 }
a00ae6c4 1130# endif
0f113f3e 1131
10bf4fc2 1132# ifndef OPENSSL_NO_EC
0f113f3e
MC
1133 ecdsa_c[R_EC_P160][0] = count / 1000;
1134 ecdsa_c[R_EC_P160][1] = count / 1000 / 2;
1135 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1136 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1137 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1138 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1139 ecdsa_doit[i] = 0;
1140 else {
1141 if (ecdsa_c[i] == 0) {
1142 ecdsa_c[i][0] = 1;
1143 ecdsa_c[i][1] = 1;
1144 }
1145 }
1146 }
1147 ecdsa_c[R_EC_K163][0] = count / 1000;
1148 ecdsa_c[R_EC_K163][1] = count / 1000 / 2;
1149 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1150 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1151 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1152 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1153 ecdsa_doit[i] = 0;
1154 else {
1155 if (ecdsa_c[i] == 0) {
1156 ecdsa_c[i][0] = 1;
1157 ecdsa_c[i][1] = 1;
1158 }
1159 }
1160 }
1161 ecdsa_c[R_EC_B163][0] = count / 1000;
1162 ecdsa_c[R_EC_B163][1] = count / 1000 / 2;
1163 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1164 ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2;
1165 ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2;
1166 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1167 ecdsa_doit[i] = 0;
1168 else {
1169 if (ecdsa_c[i] == 0) {
1170 ecdsa_c[i][0] = 1;
1171 ecdsa_c[i][1] = 1;
1172 }
1173 }
1174 }
7e1b7485 1175
0f113f3e
MC
1176 ecdh_c[R_EC_P160][0] = count / 1000;
1177 ecdh_c[R_EC_P160][1] = count / 1000;
1178 for (i = R_EC_P192; i <= R_EC_P521; i++) {
1179 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1180 ecdh_c[i][1] = ecdh_c[i - 1][1] / 2;
1181 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1182 ecdh_doit[i] = 0;
1183 else {
1184 if (ecdh_c[i] == 0) {
1185 ecdh_c[i][0] = 1;
1186 ecdh_c[i][1] = 1;
1187 }
1188 }
1189 }
1190 ecdh_c[R_EC_K163][0] = count / 1000;
1191 ecdh_c[R_EC_K163][1] = count / 1000;
1192 for (i = R_EC_K233; i <= R_EC_K571; i++) {
1193 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1194 ecdh_c[i][1] = ecdh_c[i - 1][1] / 2;
1195 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1196 ecdh_doit[i] = 0;
1197 else {
1198 if (ecdh_c[i] == 0) {
1199 ecdh_c[i][0] = 1;
1200 ecdh_c[i][1] = 1;
1201 }
1202 }
1203 }
1204 ecdh_c[R_EC_B163][0] = count / 1000;
1205 ecdh_c[R_EC_B163][1] = count / 1000;
1206 for (i = R_EC_B233; i <= R_EC_B571; i++) {
1207 ecdh_c[i][0] = ecdh_c[i - 1][0] / 2;
1208 ecdh_c[i][1] = ecdh_c[i - 1][1] / 2;
1209 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1210 ecdh_doit[i] = 0;
1211 else {
1212 if (ecdh_c[i] == 0) {
1213 ecdh_c[i][0] = 1;
1214 ecdh_c[i][1] = 1;
1215 }
1216 }
1217 }
a00ae6c4 1218# endif
e172d60d 1219
a00ae6c4
RS
1220# define COND(d) (count < (d))
1221# define COUNT(d) (d)
0f113f3e 1222# else
a00ae6c4
RS
1223/* not worth fixing */
1224# error "You cannot disable DES on systems without SIGALRM."
1225# endif /* OPENSSL_NO_DES */
1226#else
1227# define COND(c) (run && count<0x7fffffff)
1228# define COUNT(d) (count)
1229# ifndef _WIN32
0f113f3e 1230 signal(SIGALRM, sig_done);
a00ae6c4
RS
1231# endif
1232#endif /* SIGALRM */
0f113f3e 1233
a00ae6c4 1234#ifndef OPENSSL_NO_MD2
0f113f3e
MC
1235 if (doit[D_MD2]) {
1236 for (j = 0; j < SIZE_NUM; j++) {
1237 print_message(names[D_MD2], c[D_MD2][j], lengths[j]);
1238 Time_F(START);
1239 for (count = 0, run = 1; COND(c[D_MD2][j]); count++)
1240 EVP_Digest(buf, (unsigned long)lengths[j], &(md2[0]), NULL,
1241 EVP_md2(), NULL);
1242 d = Time_F(STOP);
1243 print_result(D_MD2, j, count, d);
1244 }
1245 }
a00ae6c4
RS
1246#endif
1247#ifndef OPENSSL_NO_MDC2
0f113f3e
MC
1248 if (doit[D_MDC2]) {
1249 for (j = 0; j < SIZE_NUM; j++) {
1250 print_message(names[D_MDC2], c[D_MDC2][j], lengths[j]);
1251 Time_F(START);
1252 for (count = 0, run = 1; COND(c[D_MDC2][j]); count++)
1253 EVP_Digest(buf, (unsigned long)lengths[j], &(mdc2[0]), NULL,
1254 EVP_mdc2(), NULL);
1255 d = Time_F(STOP);
1256 print_result(D_MDC2, j, count, d);
1257 }
1258 }
a00ae6c4 1259#endif
d02b48c6 1260
a00ae6c4 1261#ifndef OPENSSL_NO_MD4
0f113f3e
MC
1262 if (doit[D_MD4]) {
1263 for (j = 0; j < SIZE_NUM; j++) {
1264 print_message(names[D_MD4], c[D_MD4][j], lengths[j]);
1265 Time_F(START);
1266 for (count = 0, run = 1; COND(c[D_MD4][j]); count++)
1267 EVP_Digest(&(buf[0]), (unsigned long)lengths[j], &(md4[0]),
1268 NULL, EVP_md4(), NULL);
1269 d = Time_F(STOP);
1270 print_result(D_MD4, j, count, d);
1271 }
1272 }
a00ae6c4 1273#endif
3009458e 1274
a00ae6c4 1275#ifndef OPENSSL_NO_MD5
0f113f3e
MC
1276 if (doit[D_MD5]) {
1277 for (j = 0; j < SIZE_NUM; j++) {
1278 print_message(names[D_MD5], c[D_MD5][j], lengths[j]);
1279 Time_F(START);
1280 for (count = 0, run = 1; COND(c[D_MD5][j]); count++)
1281 MD5(buf, lengths[j], md5);
1282 d = Time_F(STOP);
1283 print_result(D_MD5, j, count, d);
1284 }
1285 }
a00ae6c4 1286#endif
d02b48c6 1287
a283d2a8 1288#if !defined(OPENSSL_NO_MD5)
0f113f3e 1289 if (doit[D_HMAC]) {
bf7c6817 1290 HMAC_CTX *hctx = NULL;
0f113f3e 1291
bf7c6817
RL
1292 hctx = HMAC_CTX_new();
1293 if (hctx == NULL) {
1294 BIO_printf(bio_err, "HMAC malloc failure, exiting...");
1295 exit(1);
1296 }
1297 HMAC_Init_ex(hctx, (unsigned char *)"This is a key...",
0f113f3e
MC
1298 16, EVP_md5(), NULL);
1299
1300 for (j = 0; j < SIZE_NUM; j++) {
1301 print_message(names[D_HMAC], c[D_HMAC][j], lengths[j]);
1302 Time_F(START);
1303 for (count = 0, run = 1; COND(c[D_HMAC][j]); count++) {
bf7c6817
RL
1304 HMAC_Init_ex(hctx, NULL, 0, NULL, NULL);
1305 HMAC_Update(hctx, buf, lengths[j]);
1306 HMAC_Final(hctx, &(hmac[0]), NULL);
0f113f3e
MC
1307 }
1308 d = Time_F(STOP);
1309 print_result(D_HMAC, j, count, d);
1310 }
bf7c6817 1311 HMAC_CTX_free(hctx);
0f113f3e 1312 }
a00ae6c4 1313#endif
0f113f3e
MC
1314 if (doit[D_SHA1]) {
1315 for (j = 0; j < SIZE_NUM; j++) {
1316 print_message(names[D_SHA1], c[D_SHA1][j], lengths[j]);
1317 Time_F(START);
1318 for (count = 0, run = 1; COND(c[D_SHA1][j]); count++)
0f113f3e 1319 SHA1(buf, lengths[j], sha);
0f113f3e
MC
1320 d = Time_F(STOP);
1321 print_result(D_SHA1, j, count, d);
1322 }
1323 }
0f113f3e
MC
1324 if (doit[D_SHA256]) {
1325 for (j = 0; j < SIZE_NUM; j++) {
1326 print_message(names[D_SHA256], c[D_SHA256][j], lengths[j]);
1327 Time_F(START);
1328 for (count = 0, run = 1; COND(c[D_SHA256][j]); count++)
1329 SHA256(buf, lengths[j], sha256);
1330 d = Time_F(STOP);
1331 print_result(D_SHA256, j, count, d);
1332 }
1333 }
0f113f3e
MC
1334 if (doit[D_SHA512]) {
1335 for (j = 0; j < SIZE_NUM; j++) {
1336 print_message(names[D_SHA512], c[D_SHA512][j], lengths[j]);
1337 Time_F(START);
1338 for (count = 0, run = 1; COND(c[D_SHA512][j]); count++)
1339 SHA512(buf, lengths[j], sha512);
1340 d = Time_F(STOP);
1341 print_result(D_SHA512, j, count, d);
1342 }
1343 }
46ceb15c 1344
a00ae6c4 1345#ifndef OPENSSL_NO_WHIRLPOOL
0f113f3e
MC
1346 if (doit[D_WHIRLPOOL]) {
1347 for (j = 0; j < SIZE_NUM; j++) {
1348 print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][j], lengths[j]);
1349 Time_F(START);
1350 for (count = 0, run = 1; COND(c[D_WHIRLPOOL][j]); count++)
1351 WHIRLPOOL(buf, lengths[j], whirlpool);
1352 d = Time_F(STOP);
1353 print_result(D_WHIRLPOOL, j, count, d);
1354 }
1355 }
a00ae6c4 1356#endif
c88f8f76 1357
a00ae6c4 1358#ifndef OPENSSL_NO_RMD160
0f113f3e
MC
1359 if (doit[D_RMD160]) {
1360 for (j = 0; j < SIZE_NUM; j++) {
1361 print_message(names[D_RMD160], c[D_RMD160][j], lengths[j]);
1362 Time_F(START);
1363 for (count = 0, run = 1; COND(c[D_RMD160][j]); count++)
1364 EVP_Digest(buf, (unsigned long)lengths[j], &(rmd160[0]), NULL,
1365 EVP_ripemd160(), NULL);
1366 d = Time_F(STOP);
1367 print_result(D_RMD160, j, count, d);
1368 }
1369 }
a00ae6c4
RS
1370#endif
1371#ifndef OPENSSL_NO_RC4
0f113f3e
MC
1372 if (doit[D_RC4]) {
1373 for (j = 0; j < SIZE_NUM; j++) {
1374 print_message(names[D_RC4], c[D_RC4][j], lengths[j]);
1375 Time_F(START);
1376 for (count = 0, run = 1; COND(c[D_RC4][j]); count++)
1377 RC4(&rc4_ks, (unsigned int)lengths[j], buf, buf);
1378 d = Time_F(STOP);
1379 print_result(D_RC4, j, count, d);
1380 }
1381 }
a00ae6c4
RS
1382#endif
1383#ifndef OPENSSL_NO_DES
0f113f3e
MC
1384 if (doit[D_CBC_DES]) {
1385 for (j = 0; j < SIZE_NUM; j++) {
1386 print_message(names[D_CBC_DES], c[D_CBC_DES][j], lengths[j]);
1387 Time_F(START);
1388 for (count = 0, run = 1; COND(c[D_CBC_DES][j]); count++)
1389 DES_ncbc_encrypt(buf, buf, lengths[j], &sch,
1390 &DES_iv, DES_ENCRYPT);
1391 d = Time_F(STOP);
1392 print_result(D_CBC_DES, j, count, d);
1393 }
1394 }
ae93dc13 1395
0f113f3e
MC
1396 if (doit[D_EDE3_DES]) {
1397 for (j = 0; j < SIZE_NUM; j++) {
1398 print_message(names[D_EDE3_DES], c[D_EDE3_DES][j], lengths[j]);
1399 Time_F(START);
1400 for (count = 0, run = 1; COND(c[D_EDE3_DES][j]); count++)
1401 DES_ede3_cbc_encrypt(buf, buf, lengths[j],
1402 &sch, &sch2, &sch3,
1403 &DES_iv, DES_ENCRYPT);
1404 d = Time_F(STOP);
1405 print_result(D_EDE3_DES, j, count, d);
1406 }
1407 }
a00ae6c4
RS
1408#endif
1409#ifndef OPENSSL_NO_AES
0f113f3e
MC
1410 if (doit[D_CBC_128_AES]) {
1411 for (j = 0; j < SIZE_NUM; j++) {
1412 print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][j],
1413 lengths[j]);
1414 Time_F(START);
1415 for (count = 0, run = 1; COND(c[D_CBC_128_AES][j]); count++)
1416 AES_cbc_encrypt(buf, buf,
1417 (unsigned long)lengths[j], &aes_ks1,
1418 iv, AES_ENCRYPT);
1419 d = Time_F(STOP);
1420 print_result(D_CBC_128_AES, j, count, d);
1421 }
1422 }
1423 if (doit[D_CBC_192_AES]) {
1424 for (j = 0; j < SIZE_NUM; j++) {
1425 print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][j],
1426 lengths[j]);
1427 Time_F(START);
1428 for (count = 0, run = 1; COND(c[D_CBC_192_AES][j]); count++)
1429 AES_cbc_encrypt(buf, buf,
1430 (unsigned long)lengths[j], &aes_ks2,
1431 iv, AES_ENCRYPT);
1432 d = Time_F(STOP);
1433 print_result(D_CBC_192_AES, j, count, d);
1434 }
1435 }
1436 if (doit[D_CBC_256_AES]) {
1437 for (j = 0; j < SIZE_NUM; j++) {
1438 print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][j],
1439 lengths[j]);
1440 Time_F(START);
1441 for (count = 0, run = 1; COND(c[D_CBC_256_AES][j]); count++)
1442 AES_cbc_encrypt(buf, buf,
1443 (unsigned long)lengths[j], &aes_ks3,
1444 iv, AES_ENCRYPT);
1445 d = Time_F(STOP);
1446 print_result(D_CBC_256_AES, j, count, d);
1447 }
1448 }
5f09d0ec 1449
0f113f3e
MC
1450 if (doit[D_IGE_128_AES]) {
1451 for (j = 0; j < SIZE_NUM; j++) {
1452 print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][j],
1453 lengths[j]);
1454 Time_F(START);
1455 for (count = 0, run = 1; COND(c[D_IGE_128_AES][j]); count++)
1456 AES_ige_encrypt(buf, buf2,
1457 (unsigned long)lengths[j], &aes_ks1,
1458 iv, AES_ENCRYPT);
1459 d = Time_F(STOP);
1460 print_result(D_IGE_128_AES, j, count, d);
1461 }
1462 }
1463 if (doit[D_IGE_192_AES]) {
1464 for (j = 0; j < SIZE_NUM; j++) {
1465 print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][j],
1466 lengths[j]);
1467 Time_F(START);
1468 for (count = 0, run = 1; COND(c[D_IGE_192_AES][j]); count++)
1469 AES_ige_encrypt(buf, buf2,
1470 (unsigned long)lengths[j], &aes_ks2,
1471 iv, AES_ENCRYPT);
1472 d = Time_F(STOP);
1473 print_result(D_IGE_192_AES, j, count, d);
1474 }
1475 }
1476 if (doit[D_IGE_256_AES]) {
1477 for (j = 0; j < SIZE_NUM; j++) {
1478 print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][j],
1479 lengths[j]);
1480 Time_F(START);
1481 for (count = 0, run = 1; COND(c[D_IGE_256_AES][j]); count++)
1482 AES_ige_encrypt(buf, buf2,
1483 (unsigned long)lengths[j], &aes_ks3,
1484 iv, AES_ENCRYPT);
1485 d = Time_F(STOP);
1486 print_result(D_IGE_256_AES, j, count, d);
1487 }
1488 }
1489 if (doit[D_GHASH]) {
1490 GCM128_CONTEXT *ctx =
1491 CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
1492 CRYPTO_gcm128_setiv(ctx, (unsigned char *)"0123456789ab", 12);
1493
1494 for (j = 0; j < SIZE_NUM; j++) {
1495 print_message(names[D_GHASH], c[D_GHASH][j], lengths[j]);
1496 Time_F(START);
1497 for (count = 0, run = 1; COND(c[D_GHASH][j]); count++)
1498 CRYPTO_gcm128_aad(ctx, buf, lengths[j]);
1499 d = Time_F(STOP);
1500 print_result(D_GHASH, j, count, d);
1501 }
1502 CRYPTO_gcm128_release(ctx);
1503 }
a00ae6c4
RS
1504#endif
1505#ifndef OPENSSL_NO_CAMELLIA
0f113f3e
MC
1506 if (doit[D_CBC_128_CML]) {
1507 for (j = 0; j < SIZE_NUM; j++) {
1508 print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][j],
1509 lengths[j]);
1510 Time_F(START);
1511 for (count = 0, run = 1; COND(c[D_CBC_128_CML][j]); count++)
1512 Camellia_cbc_encrypt(buf, buf,
1513 (unsigned long)lengths[j], &camellia_ks1,
1514 iv, CAMELLIA_ENCRYPT);
1515 d = Time_F(STOP);
1516 print_result(D_CBC_128_CML, j, count, d);
1517 }
1518 }
1519 if (doit[D_CBC_192_CML]) {
1520 for (j = 0; j < SIZE_NUM; j++) {
1521 print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][j],
1522 lengths[j]);
1523 Time_F(START);
1524 for (count = 0, run = 1; COND(c[D_CBC_192_CML][j]); count++)
1525 Camellia_cbc_encrypt(buf, buf,
1526 (unsigned long)lengths[j], &camellia_ks2,
1527 iv, CAMELLIA_ENCRYPT);
1528 d = Time_F(STOP);
1529 print_result(D_CBC_192_CML, j, count, d);
1530 }
1531 }
1532 if (doit[D_CBC_256_CML]) {
1533 for (j = 0; j < SIZE_NUM; j++) {
1534 print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][j],
1535 lengths[j]);
1536 Time_F(START);
1537 for (count = 0, run = 1; COND(c[D_CBC_256_CML][j]); count++)
1538 Camellia_cbc_encrypt(buf, buf,
1539 (unsigned long)lengths[j], &camellia_ks3,
1540 iv, CAMELLIA_ENCRYPT);
1541 d = Time_F(STOP);
1542 print_result(D_CBC_256_CML, j, count, d);
1543 }
1544 }
a00ae6c4
RS
1545#endif
1546#ifndef OPENSSL_NO_IDEA
0f113f3e
MC
1547 if (doit[D_CBC_IDEA]) {
1548 for (j = 0; j < SIZE_NUM; j++) {
1549 print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][j], lengths[j]);
1550 Time_F(START);
1551 for (count = 0, run = 1; COND(c[D_CBC_IDEA][j]); count++)
1552 idea_cbc_encrypt(buf, buf,
1553 (unsigned long)lengths[j], &idea_ks,
1554 iv, IDEA_ENCRYPT);
1555 d = Time_F(STOP);
1556 print_result(D_CBC_IDEA, j, count, d);
1557 }
1558 }
a00ae6c4
RS
1559#endif
1560#ifndef OPENSSL_NO_SEED
0f113f3e
MC
1561 if (doit[D_CBC_SEED]) {
1562 for (j = 0; j < SIZE_NUM; j++) {
1563 print_message(names[D_CBC_SEED], c[D_CBC_SEED][j], lengths[j]);
1564 Time_F(START);
1565 for (count = 0, run = 1; COND(c[D_CBC_SEED][j]); count++)
1566 SEED_cbc_encrypt(buf, buf,
1567 (unsigned long)lengths[j], &seed_ks, iv, 1);
1568 d = Time_F(STOP);
1569 print_result(D_CBC_SEED, j, count, d);
1570 }
1571 }
a00ae6c4
RS
1572#endif
1573#ifndef OPENSSL_NO_RC2
0f113f3e
MC
1574 if (doit[D_CBC_RC2]) {
1575 for (j = 0; j < SIZE_NUM; j++) {
1576 print_message(names[D_CBC_RC2], c[D_CBC_RC2][j], lengths[j]);
1577 Time_F(START);
1578 for (count = 0, run = 1; COND(c[D_CBC_RC2][j]); count++)
1579 RC2_cbc_encrypt(buf, buf,
1580 (unsigned long)lengths[j], &rc2_ks,
1581 iv, RC2_ENCRYPT);
1582 d = Time_F(STOP);
1583 print_result(D_CBC_RC2, j, count, d);
1584 }
1585 }
a00ae6c4
RS
1586#endif
1587#ifndef OPENSSL_NO_RC5
0f113f3e
MC
1588 if (doit[D_CBC_RC5]) {
1589 for (j = 0; j < SIZE_NUM; j++) {
1590 print_message(names[D_CBC_RC5], c[D_CBC_RC5][j], lengths[j]);
1591 Time_F(START);
1592 for (count = 0, run = 1; COND(c[D_CBC_RC5][j]); count++)
1593 RC5_32_cbc_encrypt(buf, buf,
1594 (unsigned long)lengths[j], &rc5_ks,
1595 iv, RC5_ENCRYPT);
1596 d = Time_F(STOP);
1597 print_result(D_CBC_RC5, j, count, d);
1598 }
1599 }
a00ae6c4
RS
1600#endif
1601#ifndef OPENSSL_NO_BF
0f113f3e
MC
1602 if (doit[D_CBC_BF]) {
1603 for (j = 0; j < SIZE_NUM; j++) {
1604 print_message(names[D_CBC_BF], c[D_CBC_BF][j], lengths[j]);
1605 Time_F(START);
1606 for (count = 0, run = 1; COND(c[D_CBC_BF][j]); count++)
1607 BF_cbc_encrypt(buf, buf,
1608 (unsigned long)lengths[j], &bf_ks,
1609 iv, BF_ENCRYPT);
1610 d = Time_F(STOP);
1611 print_result(D_CBC_BF, j, count, d);
1612 }
1613 }
a00ae6c4
RS
1614#endif
1615#ifndef OPENSSL_NO_CAST
0f113f3e
MC
1616 if (doit[D_CBC_CAST]) {
1617 for (j = 0; j < SIZE_NUM; j++) {
1618 print_message(names[D_CBC_CAST], c[D_CBC_CAST][j], lengths[j]);
1619 Time_F(START);
1620 for (count = 0, run = 1; COND(c[D_CBC_CAST][j]); count++)
1621 CAST_cbc_encrypt(buf, buf,
1622 (unsigned long)lengths[j], &cast_ks,
1623 iv, CAST_ENCRYPT);
1624 d = Time_F(STOP);
1625 print_result(D_CBC_CAST, j, count, d);
1626 }
1627 }
a00ae6c4 1628#endif
f3dea9a5 1629
0f113f3e 1630 if (doit[D_EVP]) {
a00ae6c4 1631#ifdef EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK
0f113f3e
MC
1632 if (multiblock && evp_cipher) {
1633 if (!
1634 (EVP_CIPHER_flags(evp_cipher) &
1635 EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
7768e116 1636 BIO_printf(bio_err, "%s is not multi-block capable\n",
6c2ff56e 1637 OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
0f113f3e
MC
1638 goto end;
1639 }
1640 multiblock_speed(evp_cipher);
7e1b7485 1641 ret = 0;
0f113f3e
MC
1642 goto end;
1643 }
a00ae6c4 1644#endif
0f113f3e
MC
1645 for (j = 0; j < SIZE_NUM; j++) {
1646 if (evp_cipher) {
846ec07d 1647 EVP_CIPHER_CTX *ctx;
0f113f3e
MC
1648 int outl;
1649
6c2ff56e 1650 names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
0f113f3e
MC
1651 /*
1652 * -O3 -fschedule-insns messes up an optimization here!
1653 * names[D_EVP] somehow becomes NULL
1654 */
1655 print_message(names[D_EVP], save_count, lengths[j]);
1656
846ec07d 1657 ctx = EVP_CIPHER_CTX_new();
0f113f3e 1658 if (decrypt)
846ec07d 1659 EVP_DecryptInit_ex(ctx, evp_cipher, NULL, key16, iv);
0f113f3e 1660 else
846ec07d
RL
1661 EVP_EncryptInit_ex(ctx, evp_cipher, NULL, key16, iv);
1662 EVP_CIPHER_CTX_set_padding(ctx, 0);
0f113f3e
MC
1663
1664 Time_F(START);
1665 if (decrypt)
1666 for (count = 0, run = 1;
1667 COND(save_count * 4 * lengths[0] / lengths[j]);
1668 count++)
846ec07d 1669 EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[j]);
0f113f3e
MC
1670 else
1671 for (count = 0, run = 1;
1672 COND(save_count * 4 * lengths[0] / lengths[j]);
1673 count++)
846ec07d 1674 EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[j]);
0f113f3e 1675 if (decrypt)
846ec07d 1676 EVP_DecryptFinal_ex(ctx, buf, &outl);
0f113f3e 1677 else
846ec07d 1678 EVP_EncryptFinal_ex(ctx, buf, &outl);
0f113f3e 1679 d = Time_F(STOP);
846ec07d 1680 EVP_CIPHER_CTX_free(ctx);
0f113f3e
MC
1681 }
1682 if (evp_md) {
cc9d6655 1683 names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
0f113f3e
MC
1684 print_message(names[D_EVP], save_count, lengths[j]);
1685
1686 Time_F(START);
1687 for (count = 0, run = 1;
1688 COND(save_count * 4 * lengths[0] / lengths[j]); count++)
1689 EVP_Digest(buf, lengths[j], &(md[0]), NULL, evp_md, NULL);
1690
1691 d = Time_F(STOP);
1692 }
1693 print_result(D_EVP, j, count, d);
1694 }
1695 }
7e1b7485 1696
266483d2 1697 RAND_bytes(buf, 36);
a00ae6c4 1698#ifndef OPENSSL_NO_RSA
0f113f3e 1699 for (j = 0; j < RSA_NUM; j++) {
7e1b7485 1700 int st;
0f113f3e
MC
1701 if (!rsa_doit[j])
1702 continue;
7e1b7485
RS
1703 st = RSA_sign(NID_md5_sha1, buf, 36, buf2, &rsa_num, rsa_key[j]);
1704 if (st == 0) {
0f113f3e
MC
1705 BIO_printf(bio_err,
1706 "RSA sign failure. No RSA sign will be done.\n");
1707 ERR_print_errors(bio_err);
1708 rsa_count = 1;
1709 } else {
1710 pkey_print_message("private", "rsa",
1711 rsa_c[j][0], rsa_bits[j], RSA_SECONDS);
1712 /* RSA_blinding_on(rsa_key[j],NULL); */
1713 Time_F(START);
1714 for (count = 0, run = 1; COND(rsa_c[j][0]); count++) {
7e1b7485
RS
1715 st = RSA_sign(NID_md5_sha1, buf, 36, buf2,
1716 &rsa_num, rsa_key[j]);
1717 if (st == 0) {
0f113f3e
MC
1718 BIO_printf(bio_err, "RSA sign failure\n");
1719 ERR_print_errors(bio_err);
1720 count = 1;
1721 break;
1722 }
1723 }
1724 d = Time_F(STOP);
1725 BIO_printf(bio_err,
1726 mr ? "+R1:%ld:%d:%.2f\n"
1727 : "%ld %d bit private RSA's in %.2fs\n",
1728 count, rsa_bits[j], d);
1729 rsa_results[j][0] = d / (double)count;
1730 rsa_count = count;
1731 }
d02b48c6 1732
7e1b7485
RS
1733 st = RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[j]);
1734 if (st <= 0) {
0f113f3e
MC
1735 BIO_printf(bio_err,
1736 "RSA verify failure. No RSA verify will be done.\n");
1737 ERR_print_errors(bio_err);
1738 rsa_doit[j] = 0;
1739 } else {
1740 pkey_print_message("public", "rsa",
1741 rsa_c[j][1], rsa_bits[j], RSA_SECONDS);
1742 Time_F(START);
1743 for (count = 0, run = 1; COND(rsa_c[j][1]); count++) {
7e1b7485
RS
1744 st = RSA_verify(NID_md5_sha1, buf, 36, buf2,
1745 rsa_num, rsa_key[j]);
1746 if (st <= 0) {
0f113f3e
MC
1747 BIO_printf(bio_err, "RSA verify failure\n");
1748 ERR_print_errors(bio_err);
1749 count = 1;
1750 break;
1751 }
1752 }
1753 d = Time_F(STOP);
1754 BIO_printf(bio_err,
1755 mr ? "+R2:%ld:%d:%.2f\n"
1756 : "%ld %d bit public RSA's in %.2fs\n",
1757 count, rsa_bits[j], d);
1758 rsa_results[j][1] = d / (double)count;
1759 }
d02b48c6 1760
0f113f3e
MC
1761 if (rsa_count <= 1) {
1762 /* if longer than 10s, don't do any more */
1763 for (j++; j < RSA_NUM; j++)
1764 rsa_doit[j] = 0;
1765 }
1766 }
a00ae6c4 1767#endif
d02b48c6 1768
266483d2 1769 RAND_bytes(buf, 20);
a00ae6c4 1770#ifndef OPENSSL_NO_DSA
0f113f3e
MC
1771 if (RAND_status() != 1) {
1772 RAND_seed(rnd_seed, sizeof rnd_seed);
1773 rnd_fake = 1;
1774 }
1775 for (j = 0; j < DSA_NUM; j++) {
1776 unsigned int kk;
7e1b7485 1777 int st;
0f113f3e
MC
1778
1779 if (!dsa_doit[j])
1780 continue;
1781
1782 /* DSA_generate_key(dsa_key[j]); */
1783 /* DSA_sign_setup(dsa_key[j],NULL); */
a773b52a 1784 st = DSA_sign(0, buf, 20, buf2, &kk, dsa_key[j]);
7e1b7485 1785 if (st == 0) {
0f113f3e
MC
1786 BIO_printf(bio_err,
1787 "DSA sign failure. No DSA sign will be done.\n");
1788 ERR_print_errors(bio_err);
1789 rsa_count = 1;
1790 } else {
1791 pkey_print_message("sign", "dsa",
1792 dsa_c[j][0], dsa_bits[j], DSA_SECONDS);
1793 Time_F(START);
1794 for (count = 0, run = 1; COND(dsa_c[j][0]); count++) {
a773b52a 1795 st = DSA_sign(0, buf, 20, buf2, &kk, dsa_key[j]);
7e1b7485 1796 if (st == 0) {
0f113f3e
MC
1797 BIO_printf(bio_err, "DSA sign failure\n");
1798 ERR_print_errors(bio_err);
1799 count = 1;
1800 break;
1801 }
1802 }
1803 d = Time_F(STOP);
1804 BIO_printf(bio_err,
1805 mr ? "+R3:%ld:%d:%.2f\n"
1806 : "%ld %d bit DSA signs in %.2fs\n",
1807 count, dsa_bits[j], d);
1808 dsa_results[j][0] = d / (double)count;
1809 rsa_count = count;
1810 }
e172d60d 1811
a773b52a 1812 st = DSA_verify(0, buf, 20, buf2, kk, dsa_key[j]);
7e1b7485 1813 if (st <= 0) {
0f113f3e
MC
1814 BIO_printf(bio_err,
1815 "DSA verify failure. No DSA verify will be done.\n");
1816 ERR_print_errors(bio_err);
1817 dsa_doit[j] = 0;
1818 } else {
1819 pkey_print_message("verify", "dsa",
1820 dsa_c[j][1], dsa_bits[j], DSA_SECONDS);
1821 Time_F(START);
1822 for (count = 0, run = 1; COND(dsa_c[j][1]); count++) {
a773b52a 1823 st = DSA_verify(0, buf, 20, buf2, kk, dsa_key[j]);
7e1b7485 1824 if (st <= 0) {
0f113f3e
MC
1825 BIO_printf(bio_err, "DSA verify failure\n");
1826 ERR_print_errors(bio_err);
1827 count = 1;
1828 break;
1829 }
1830 }
1831 d = Time_F(STOP);
1832 BIO_printf(bio_err,
1833 mr ? "+R4:%ld:%d:%.2f\n"
1834 : "%ld %d bit DSA verify in %.2fs\n",
1835 count, dsa_bits[j], d);
1836 dsa_results[j][1] = d / (double)count;
1837 }
e172d60d 1838
0f113f3e
MC
1839 if (rsa_count <= 1) {
1840 /* if longer than 10s, don't do any more */
1841 for (j++; j < DSA_NUM; j++)
1842 dsa_doit[j] = 0;
1843 }
1844 }
1845 if (rnd_fake)
1846 RAND_cleanup();
a00ae6c4 1847#endif
e172d60d 1848
10bf4fc2 1849#ifndef OPENSSL_NO_EC
0f113f3e
MC
1850 if (RAND_status() != 1) {
1851 RAND_seed(rnd_seed, sizeof rnd_seed);
1852 rnd_fake = 1;
1853 }
1854 for (j = 0; j < EC_NUM; j++) {
7e1b7485 1855 int st;
0f113f3e
MC
1856
1857 if (!ecdsa_doit[j])
1858 continue; /* Ignore Curve */
1859 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]);
1860 if (ecdsa[j] == NULL) {
1861 BIO_printf(bio_err, "ECDSA failure.\n");
1862 ERR_print_errors(bio_err);
1863 rsa_count = 1;
1864 } else {
0f113f3e 1865 EC_KEY_precompute_mult(ecdsa[j], NULL);
0f113f3e
MC
1866 /* Perform ECDSA signature test */
1867 EC_KEY_generate_key(ecdsa[j]);
7e1b7485
RS
1868 st = ECDSA_sign(0, buf, 20, ecdsasig, &ecdsasiglen, ecdsa[j]);
1869 if (st == 0) {
0f113f3e
MC
1870 BIO_printf(bio_err,
1871 "ECDSA sign failure. No ECDSA sign will be done.\n");
1872 ERR_print_errors(bio_err);
1873 rsa_count = 1;
1874 } else {
1875 pkey_print_message("sign", "ecdsa",
1876 ecdsa_c[j][0],
1877 test_curves_bits[j], ECDSA_SECONDS);
1878
1879 Time_F(START);
1880 for (count = 0, run = 1; COND(ecdsa_c[j][0]); count++) {
7e1b7485
RS
1881 st = ECDSA_sign(0, buf, 20,
1882 ecdsasig, &ecdsasiglen, ecdsa[j]);
1883 if (st == 0) {
0f113f3e
MC
1884 BIO_printf(bio_err, "ECDSA sign failure\n");
1885 ERR_print_errors(bio_err);
1886 count = 1;
1887 break;
1888 }
1889 }
1890 d = Time_F(STOP);
1891
1892 BIO_printf(bio_err,
1893 mr ? "+R5:%ld:%d:%.2f\n" :
1894 "%ld %d bit ECDSA signs in %.2fs \n",
1895 count, test_curves_bits[j], d);
1896 ecdsa_results[j][0] = d / (double)count;
1897 rsa_count = count;
1898 }
1899
1900 /* Perform ECDSA verification test */
7e1b7485
RS
1901 st = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
1902 if (st != 1) {
0f113f3e
MC
1903 BIO_printf(bio_err,
1904 "ECDSA verify failure. No ECDSA verify will be done.\n");
1905 ERR_print_errors(bio_err);
1906 ecdsa_doit[j] = 0;
1907 } else {
1908 pkey_print_message("verify", "ecdsa",
1909 ecdsa_c[j][1],
1910 test_curves_bits[j], ECDSA_SECONDS);
1911 Time_F(START);
1912 for (count = 0, run = 1; COND(ecdsa_c[j][1]); count++) {
7e1b7485
RS
1913 st = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen,
1914 ecdsa[j]);
1915 if (st != 1) {
0f113f3e
MC
1916 BIO_printf(bio_err, "ECDSA verify failure\n");
1917 ERR_print_errors(bio_err);
1918 count = 1;
1919 break;
1920 }
1921 }
1922 d = Time_F(STOP);
1923 BIO_printf(bio_err,
1924 mr ? "+R6:%ld:%d:%.2f\n"
1925 : "%ld %d bit ECDSA verify in %.2fs\n",
1926 count, test_curves_bits[j], d);
1927 ecdsa_results[j][1] = d / (double)count;
1928 }
1929
1930 if (rsa_count <= 1) {
1931 /* if longer than 10s, don't do any more */
1932 for (j++; j < EC_NUM; j++)
1933 ecdsa_doit[j] = 0;
1934 }
1935 }
1936 }
1937 if (rnd_fake)
1938 RAND_cleanup();
7e1b7485
RS
1939#endif
1940
1941#ifndef OPENSSL_NO_EC
0f113f3e
MC
1942 if (RAND_status() != 1) {
1943 RAND_seed(rnd_seed, sizeof rnd_seed);
1944 rnd_fake = 1;
1945 }
1946 for (j = 0; j < EC_NUM; j++) {
1947 if (!ecdh_doit[j])
1948 continue;
1949 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]);
1950 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]);
1951 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL)) {
1952 BIO_printf(bio_err, "ECDH failure.\n");
1953 ERR_print_errors(bio_err);
1954 rsa_count = 1;
1955 } else {
1956 /* generate two ECDH key pairs */
1957 if (!EC_KEY_generate_key(ecdh_a[j]) ||
1958 !EC_KEY_generate_key(ecdh_b[j])) {
1959 BIO_printf(bio_err, "ECDH key generation failure.\n");
1960 ERR_print_errors(bio_err);
1961 rsa_count = 1;
1962 } else {
1963 /*
1964 * If field size is not more than 24 octets, then use SHA-1
1965 * hash of result; otherwise, use result (see section 4.8 of
1966 * draft-ietf-tls-ecc-03.txt).
1967 */
1968 int field_size, outlen;
1969 void *(*kdf) (const void *in, size_t inlen, void *out,
1970 size_t *xoutlen);
1971 field_size =
1972 EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j]));
1973 if (field_size <= 24 * 8) {
1974 outlen = KDF1_SHA1_len;
1975 kdf = KDF1_SHA1;
1976 } else {
1977 outlen = (field_size + 7) / 8;
1978 kdf = NULL;
1979 }
1980 secret_size_a =
1981 ECDH_compute_key(secret_a, outlen,
1982 EC_KEY_get0_public_key(ecdh_b[j]),
1983 ecdh_a[j], kdf);
1984 secret_size_b =
1985 ECDH_compute_key(secret_b, outlen,
1986 EC_KEY_get0_public_key(ecdh_a[j]),
1987 ecdh_b[j], kdf);
1988 if (secret_size_a != secret_size_b)
1989 ecdh_checks = 0;
1990 else
1991 ecdh_checks = 1;
1992
1993 for (secret_idx = 0; (secret_idx < secret_size_a)
1994 && (ecdh_checks == 1); secret_idx++) {
1995 if (secret_a[secret_idx] != secret_b[secret_idx])
1996 ecdh_checks = 0;
1997 }
1998
1999 if (ecdh_checks == 0) {
2000 BIO_printf(bio_err, "ECDH computations don't match.\n");
2001 ERR_print_errors(bio_err);
2002 rsa_count = 1;
2003 }
2004
2005 pkey_print_message("", "ecdh",
2006 ecdh_c[j][0],
2007 test_curves_bits[j], ECDH_SECONDS);
2008 Time_F(START);
2009 for (count = 0, run = 1; COND(ecdh_c[j][0]); count++) {
2010 ECDH_compute_key(secret_a, outlen,
2011 EC_KEY_get0_public_key(ecdh_b[j]),
2012 ecdh_a[j], kdf);
2013 }
2014 d = Time_F(STOP);
2015 BIO_printf(bio_err,
2016 mr ? "+R7:%ld:%d:%.2f\n" :
2017 "%ld %d-bit ECDH ops in %.2fs\n", count,
2018 test_curves_bits[j], d);
2019 ecdh_results[j][0] = d / (double)count;
2020 rsa_count = count;
2021 }
2022 }
e172d60d 2023
0f113f3e
MC
2024 if (rsa_count <= 1) {
2025 /* if longer than 10s, don't do any more */
2026 for (j++; j < EC_NUM; j++)
2027 ecdh_doit[j] = 0;
2028 }
2029 }
2030 if (rnd_fake)
2031 RAND_cleanup();
a00ae6c4
RS
2032#endif
2033#ifndef NO_FORK
0f113f3e 2034 show_res:
a00ae6c4 2035#endif
0f113f3e 2036 if (!mr) {
b0700d2c
RS
2037 printf("%s\n", OpenSSL_version(OPENSSL_VERSION));
2038 printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON));
0f113f3e
MC
2039 printf("options:");
2040 printf("%s ", BN_options());
a00ae6c4 2041#ifndef OPENSSL_NO_MD2
0f113f3e 2042 printf("%s ", MD2_options());
a00ae6c4
RS
2043#endif
2044#ifndef OPENSSL_NO_RC4
0f113f3e 2045 printf("%s ", RC4_options());
a00ae6c4
RS
2046#endif
2047#ifndef OPENSSL_NO_DES
0f113f3e 2048 printf("%s ", DES_options());
a00ae6c4
RS
2049#endif
2050#ifndef OPENSSL_NO_AES
0f113f3e 2051 printf("%s ", AES_options());
a00ae6c4
RS
2052#endif
2053#ifndef OPENSSL_NO_IDEA
0f113f3e 2054 printf("%s ", idea_options());
a00ae6c4
RS
2055#endif
2056#ifndef OPENSSL_NO_BF
0f113f3e 2057 printf("%s ", BF_options());
a00ae6c4 2058#endif
b0700d2c 2059 printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS));
0f113f3e 2060 }
e172d60d 2061
0f113f3e
MC
2062 if (pr_header) {
2063 if (mr)
7e1b7485 2064 printf("+H");
0f113f3e 2065 else {
7e1b7485
RS
2066 printf
2067 ("The 'numbers' are in 1000s of bytes per second processed.\n");
2068 printf("type ");
0f113f3e
MC
2069 }
2070 for (j = 0; j < SIZE_NUM; j++)
7e1b7485
RS
2071 printf(mr ? ":%d" : "%7d bytes", lengths[j]);
2072 printf("\n");
0f113f3e 2073 }
e172d60d 2074
0f113f3e
MC
2075 for (k = 0; k < ALGOR_NUM; k++) {
2076 if (!doit[k])
2077 continue;
2078 if (mr)
7e1b7485 2079 printf("+F:%d:%s", k, names[k]);
0f113f3e 2080 else
7e1b7485 2081 printf("%-13s", names[k]);
0f113f3e
MC
2082 for (j = 0; j < SIZE_NUM; j++) {
2083 if (results[k][j] > 10000 && !mr)
7e1b7485 2084 printf(" %11.2fk", results[k][j] / 1e3);
0f113f3e 2085 else
7e1b7485 2086 printf(mr ? ":%.2f" : " %11.2f ", results[k][j]);
0f113f3e 2087 }
7e1b7485 2088 printf("\n");
0f113f3e 2089 }
a00ae6c4 2090#ifndef OPENSSL_NO_RSA
0f113f3e
MC
2091 j = 1;
2092 for (k = 0; k < RSA_NUM; k++) {
2093 if (!rsa_doit[k])
2094 continue;
2095 if (j && !mr) {
2096 printf("%18ssign verify sign/s verify/s\n", " ");
2097 j = 0;
2098 }
2099 if (mr)
7e1b7485
RS
2100 printf("+F2:%u:%u:%f:%f\n",
2101 k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]);
0f113f3e 2102 else
7e1b7485
RS
2103 printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2104 rsa_bits[k], rsa_results[k][0], rsa_results[k][1],
2105 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1]);
0f113f3e 2106 }
a00ae6c4
RS
2107#endif
2108#ifndef OPENSSL_NO_DSA
0f113f3e
MC
2109 j = 1;
2110 for (k = 0; k < DSA_NUM; k++) {
2111 if (!dsa_doit[k])
2112 continue;
2113 if (j && !mr) {
2114 printf("%18ssign verify sign/s verify/s\n", " ");
2115 j = 0;
2116 }
2117 if (mr)
7e1b7485
RS
2118 printf("+F3:%u:%u:%f:%f\n",
2119 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
0f113f3e 2120 else
7e1b7485
RS
2121 printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2122 dsa_bits[k], dsa_results[k][0], dsa_results[k][1],
2123 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1]);
0f113f3e 2124 }
a00ae6c4 2125#endif
10bf4fc2 2126#ifndef OPENSSL_NO_EC
0f113f3e
MC
2127 j = 1;
2128 for (k = 0; k < EC_NUM; k++) {
2129 if (!ecdsa_doit[k])
2130 continue;
2131 if (j && !mr) {
2132 printf("%30ssign verify sign/s verify/s\n", " ");
2133 j = 0;
2134 }
2135
2136 if (mr)
7e1b7485
RS
2137 printf("+F4:%u:%u:%f:%f\n",
2138 k, test_curves_bits[k],
2139 ecdsa_results[k][0], ecdsa_results[k][1]);
0f113f3e 2140 else
7e1b7485
RS
2141 printf("%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2142 test_curves_bits[k],
2143 test_curves_names[k],
2144 ecdsa_results[k][0], ecdsa_results[k][1],
2145 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1]);
0f113f3e 2146 }
7e1b7485
RS
2147#endif
2148
2149#ifndef OPENSSL_NO_EC
0f113f3e
MC
2150 j = 1;
2151 for (k = 0; k < EC_NUM; k++) {
2152 if (!ecdh_doit[k])
2153 continue;
2154 if (j && !mr) {
2155 printf("%30sop op/s\n", " ");
2156 j = 0;
2157 }
2158 if (mr)
7e1b7485
RS
2159 printf("+F5:%u:%u:%f:%f\n",
2160 k, test_curves_bits[k],
2161 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
0f113f3e
MC
2162
2163 else
7e1b7485
RS
2164 printf("%4u bit ecdh (%s) %8.4fs %8.1f\n",
2165 test_curves_bits[k],
2166 test_curves_names[k],
2167 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
0f113f3e 2168 }
a00ae6c4 2169#endif
0f113f3e 2170
7e1b7485 2171 ret = 0;
0f113f3e
MC
2172
2173 end:
2174 ERR_print_errors(bio_err);
08a721ac
EK
2175 OPENSSL_free(buf_malloc);
2176 OPENSSL_free(buf2_malloc);
a00ae6c4 2177#ifndef OPENSSL_NO_RSA
0f113f3e 2178 for (i = 0; i < RSA_NUM; i++)
d6407083 2179 RSA_free(rsa_key[i]);
a00ae6c4
RS
2180#endif
2181#ifndef OPENSSL_NO_DSA
0f113f3e 2182 for (i = 0; i < DSA_NUM; i++)
d6407083 2183 DSA_free(dsa_key[i]);
a00ae6c4 2184#endif
0f113f3e 2185
10bf4fc2 2186#ifndef OPENSSL_NO_EC
0f113f3e 2187 for (i = 0; i < EC_NUM; i++) {
7e1b7485 2188 EC_KEY_free(ecdsa[i]);
8fdc3734
RS
2189 EC_KEY_free(ecdh_a[i]);
2190 EC_KEY_free(ecdh_b[i]);
0f113f3e 2191 }
a00ae6c4 2192#endif
7e1b7485 2193 return (ret);
0f113f3e 2194}
d02b48c6 2195
646d5695 2196static void print_message(const char *s, long num, int length)
0f113f3e 2197{
a00ae6c4 2198#ifdef SIGALRM
0f113f3e
MC
2199 BIO_printf(bio_err,
2200 mr ? "+DT:%s:%d:%d\n"
2201 : "Doing %s for %ds on %d size blocks: ", s, SECONDS, length);
2202 (void)BIO_flush(bio_err);
2203 alarm(SECONDS);
a00ae6c4 2204#else
0f113f3e
MC
2205 BIO_printf(bio_err,
2206 mr ? "+DN:%s:%ld:%d\n"
2207 : "Doing %s %ld times on %d size blocks: ", s, num, length);
2208 (void)BIO_flush(bio_err);
a00ae6c4 2209#endif
0f113f3e 2210}
d02b48c6 2211
689c6f25 2212static void pkey_print_message(const char *str, const char *str2, long num,
0f113f3e
MC
2213 int bits, int tm)
2214{
a00ae6c4 2215#ifdef SIGALRM
0f113f3e
MC
2216 BIO_printf(bio_err,
2217 mr ? "+DTP:%d:%s:%s:%d\n"
2218 : "Doing %d bit %s %s's for %ds: ", bits, str, str2, tm);
2219 (void)BIO_flush(bio_err);
2220 alarm(tm);
a00ae6c4 2221#else
0f113f3e
MC
2222 BIO_printf(bio_err,
2223 mr ? "+DNP:%ld:%d:%s:%s\n"
2224 : "Doing %ld %d bit %s %s's: ", num, bits, str, str2);
2225 (void)BIO_flush(bio_err);
a00ae6c4 2226#endif
0f113f3e 2227}
58964a49 2228
0f113f3e
MC
2229static void print_result(int alg, int run_no, int count, double time_used)
2230{
2231 BIO_printf(bio_err,
2232 mr ? "+R:%d:%s:%f\n"
2233 : "%d %s's in %.2fs\n", count, names[alg], time_used);
2234 results[alg][run_no] = ((double)count) / time_used * lengths[run_no];
2235}
0e211563 2236
a00ae6c4 2237#ifndef NO_FORK
0e211563 2238static char *sstrsep(char **string, const char *delim)
0f113f3e 2239{
0e211563
BL
2240 char isdelim[256];
2241 char *token = *string;
2242
2243 if (**string == 0)
2244 return NULL;
2245
54a656ef 2246 memset(isdelim, 0, sizeof isdelim);
0e211563
BL
2247 isdelim[0] = 1;
2248
0f113f3e 2249 while (*delim) {
0e211563
BL
2250 isdelim[(unsigned char)(*delim)] = 1;
2251 delim++;
0f113f3e 2252 }
0e211563 2253
0f113f3e 2254 while (!isdelim[(unsigned char)(**string)]) {
0e211563 2255 (*string)++;
0f113f3e 2256 }
0e211563 2257
0f113f3e 2258 if (**string) {
0e211563
BL
2259 **string = 0;
2260 (*string)++;
0f113f3e 2261 }
0e211563
BL
2262
2263 return token;
0f113f3e 2264}
0e211563
BL
2265
2266static int do_multi(int multi)
0f113f3e
MC
2267{
2268 int n;
2269 int fd[2];
2270 int *fds;
2271 static char sep[] = ":";
2272
b4faea50 2273 fds = malloc(sizeof(*fds) * multi);
0f113f3e
MC
2274 for (n = 0; n < multi; ++n) {
2275 if (pipe(fd) == -1) {
7768e116 2276 BIO_printf(bio_err, "pipe failure\n");
0f113f3e
MC
2277 exit(1);
2278 }
2279 fflush(stdout);
7768e116 2280 (void)BIO_flush(bio_err);
0f113f3e
MC
2281 if (fork()) {
2282 close(fd[1]);
2283 fds[n] = fd[0];
2284 } else {
2285 close(fd[0]);
2286 close(1);
2287 if (dup(fd[1]) == -1) {
7768e116 2288 BIO_printf(bio_err, "dup failed\n");
0f113f3e
MC
2289 exit(1);
2290 }
2291 close(fd[1]);
2292 mr = 1;
2293 usertime = 0;
2294 free(fds);
2295 return 0;
2296 }
2297 printf("Forked child %d\n", n);
2298 }
e172d60d 2299
0f113f3e
MC
2300 /* for now, assume the pipe is long enough to take all the output */
2301 for (n = 0; n < multi; ++n) {
2302 FILE *f;
2303 char buf[1024];
2304 char *p;
2305
2306 f = fdopen(fds[n], "r");
2307 while (fgets(buf, sizeof buf, f)) {
2308 p = strchr(buf, '\n');
2309 if (p)
2310 *p = '\0';
2311 if (buf[0] != '+') {
7768e116 2312 BIO_printf(bio_err, "Don't understand line '%s' from child %d\n",
0f113f3e
MC
2313 buf, n);
2314 continue;
2315 }
2316 printf("Got: %s from %d\n", buf, n);
86885c28 2317 if (strncmp(buf, "+F:", 3) == 0) {
0f113f3e
MC
2318 int alg;
2319 int j;
2320
2321 p = buf + 3;
2322 alg = atoi(sstrsep(&p, sep));
2323 sstrsep(&p, sep);
2324 for (j = 0; j < SIZE_NUM; ++j)
2325 results[alg][j] += atof(sstrsep(&p, sep));
86885c28 2326 } else if (strncmp(buf, "+F2:", 4) == 0) {
0f113f3e
MC
2327 int k;
2328 double d;
2329
2330 p = buf + 4;
2331 k = atoi(sstrsep(&p, sep));
2332 sstrsep(&p, sep);
2333
0f113f3e
MC
2334 d = atof(sstrsep(&p, sep));
2335 if (n)
2336 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d);
2337 else
2338 rsa_results[k][0] = d;
2339
2340 d = atof(sstrsep(&p, sep));
2341 if (n)
2342 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d);
2343 else
2344 rsa_results[k][1] = d;
2345 }
a00ae6c4 2346# ifndef OPENSSL_NO_DSA
86885c28 2347 else if (strncmp(buf, "+F3:", 4) == 0) {
0f113f3e
MC
2348 int k;
2349 double d;
2350
2351 p = buf + 4;
2352 k = atoi(sstrsep(&p, sep));
2353 sstrsep(&p, sep);
2354
2355 d = atof(sstrsep(&p, sep));
2356 if (n)
2357 dsa_results[k][0] = 1 / (1 / dsa_results[k][0] + 1 / d);
2358 else
2359 dsa_results[k][0] = d;
2360
2361 d = atof(sstrsep(&p, sep));
2362 if (n)
2363 dsa_results[k][1] = 1 / (1 / dsa_results[k][1] + 1 / d);
2364 else
2365 dsa_results[k][1] = d;
2366 }
a00ae6c4 2367# endif
10bf4fc2 2368# ifndef OPENSSL_NO_EC
86885c28 2369 else if (strncmp(buf, "+F4:", 4) == 0) {
0f113f3e
MC
2370 int k;
2371 double d;
2372
2373 p = buf + 4;
2374 k = atoi(sstrsep(&p, sep));
2375 sstrsep(&p, sep);
2376
2377 d = atof(sstrsep(&p, sep));
2378 if (n)
2379 ecdsa_results[k][0] =
2380 1 / (1 / ecdsa_results[k][0] + 1 / d);
2381 else
2382 ecdsa_results[k][0] = d;
2383
2384 d = atof(sstrsep(&p, sep));
2385 if (n)
2386 ecdsa_results[k][1] =
2387 1 / (1 / ecdsa_results[k][1] + 1 / d);
2388 else
2389 ecdsa_results[k][1] = d;
2390 }
7e1b7485
RS
2391# endif
2392
2393# ifndef OPENSSL_NO_EC
86885c28 2394 else if (strncmp(buf, "+F5:", 4) == 0) {
0f113f3e
MC
2395 int k;
2396 double d;
2397
2398 p = buf + 4;
2399 k = atoi(sstrsep(&p, sep));
2400 sstrsep(&p, sep);
2401
2402 d = atof(sstrsep(&p, sep));
2403 if (n)
2404 ecdh_results[k][0] = 1 / (1 / ecdh_results[k][0] + 1 / d);
2405 else
2406 ecdh_results[k][0] = d;
2407
2408 }
a00ae6c4 2409# endif
0f113f3e 2410
86885c28 2411 else if (strncmp(buf, "+H:", 3) == 0) {
7e1b7485 2412 ;
0f113f3e 2413 } else
7768e116 2414 BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf, n);
0f113f3e
MC
2415 }
2416
2417 fclose(f);
2418 }
2419 free(fds);
2420 return 1;
2421}
a00ae6c4 2422#endif
375a64e3
AP
2423
2424static void multiblock_speed(const EVP_CIPHER *evp_cipher)
0f113f3e
MC
2425{
2426 static int mblengths[] =
2427 { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 };
bdcb1a2c 2428 int j, count, num = OSSL_NELEM(lengths);
0f113f3e
MC
2429 const char *alg_name;
2430 unsigned char *inp, *out, no_key[32], no_iv[16];
846ec07d 2431 EVP_CIPHER_CTX *ctx;
0f113f3e
MC
2432 double d = 0.0;
2433
68dc6824
RS
2434 inp = app_malloc(mblengths[num - 1], "multiblock input buffer");
2435 out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer");
846ec07d
RL
2436 ctx = EVP_CIPHER_CTX_new();
2437 EVP_EncryptInit_ex(ctx, evp_cipher, NULL, no_key, no_iv);
2438 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key),
0f113f3e 2439 no_key);
6c2ff56e 2440 alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
0f113f3e
MC
2441
2442 for (j = 0; j < num; j++) {
2443 print_message(alg_name, 0, mblengths[j]);
2444 Time_F(START);
2445 for (count = 0, run = 1; run && count < 0x7fffffff; count++) {
c8269881 2446 unsigned char aad[EVP_AEAD_TLS1_AAD_LEN];
0f113f3e
MC
2447 EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
2448 size_t len = mblengths[j];
2449 int packlen;
2450
2451 memset(aad, 0, 8); /* avoid uninitialized values */
2452 aad[8] = 23; /* SSL3_RT_APPLICATION_DATA */
2453 aad[9] = 3; /* version */
2454 aad[10] = 2;
2455 aad[11] = 0; /* length */
2456 aad[12] = 0;
2457 mb_param.out = NULL;
2458 mb_param.inp = aad;
2459 mb_param.len = len;
2460 mb_param.interleave = 8;
2461
846ec07d 2462 packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
0f113f3e
MC
2463 sizeof(mb_param), &mb_param);
2464
2465 if (packlen > 0) {
2466 mb_param.out = out;
2467 mb_param.inp = inp;
2468 mb_param.len = len;
846ec07d 2469 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
0f113f3e
MC
2470 sizeof(mb_param), &mb_param);
2471 } else {
2472 int pad;
2473
2474 RAND_bytes(out, 16);
2475 len += 16;
2476 aad[11] = len >> 8;
2477 aad[12] = len;
846ec07d 2478 pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD,
c8269881 2479 EVP_AEAD_TLS1_AAD_LEN, aad);
846ec07d 2480 EVP_Cipher(ctx, out, inp, len + pad);
0f113f3e
MC
2481 }
2482 }
2483 d = Time_F(STOP);
7e1b7485 2484 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
0f113f3e
MC
2485 : "%d %s's in %.2fs\n", count, "evp", d);
2486 results[D_EVP][j] = ((double)count) / d * mblengths[j];
2487 }
2488
2489 if (mr) {
2490 fprintf(stdout, "+H");
2491 for (j = 0; j < num; j++)
2492 fprintf(stdout, ":%d", mblengths[j]);
2493 fprintf(stdout, "\n");
2494 fprintf(stdout, "+F:%d:%s", D_EVP, alg_name);
2495 for (j = 0; j < num; j++)
2496 fprintf(stdout, ":%.2f", results[D_EVP][j]);
2497 fprintf(stdout, "\n");
2498 } else {
2499 fprintf(stdout,
2500 "The 'numbers' are in 1000s of bytes per second processed.\n");
2501 fprintf(stdout, "type ");
2502 for (j = 0; j < num; j++)
2503 fprintf(stdout, "%7d bytes", mblengths[j]);
2504 fprintf(stdout, "\n");
2505 fprintf(stdout, "%-24s", alg_name);
2506
2507 for (j = 0; j < num; j++) {
2508 if (results[D_EVP][j] > 10000)
2509 fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3);
2510 else
2511 fprintf(stdout, " %11.2f ", results[D_EVP][j]);
2512 }
2513 fprintf(stdout, "\n");
2514 }
2515
b548a1f1
RS
2516 OPENSSL_free(inp);
2517 OPENSSL_free(out);
846ec07d 2518 EVP_CIPHER_CTX_free(ctx);
0f113f3e 2519}