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