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