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