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