Stop spurious "unable to load config info" errors in req
[openssl.git] / apps / speed.c
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 /* most of this code has been pilfered from my libdes speed.c program */
60
61 #undef SECONDS
62 #define SECONDS         3       
63 #define RSA_SECONDS     10
64 #define DSA_SECONDS     10
65
66 /* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */
67 /* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
68
69 #undef PROG
70 #define PROG speed_main
71
72 #include <stdio.h>
73 #include <stdlib.h>
74 #include <signal.h>
75 #include <string.h>
76 #include <math.h>
77 #include "apps.h"
78 #ifdef OPENSSL_NO_STDIO
79 #define APPS_WIN16
80 #endif
81 #include <openssl/crypto.h>
82 #include <openssl/rand.h>
83 #include <openssl/err.h>
84 #include <openssl/evp.h>
85 #include <openssl/objects.h>
86 #include OPENSSL_UNISTD
87
88 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
89 # define USE_TOD
90 #elif !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
91 # define TIMES
92 #endif
93 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) /* FIXME */
94 # define TIMEB
95 #endif
96
97 #ifndef _IRIX
98 # include <time.h>
99 #endif
100 #ifdef TIMES
101 # include <sys/types.h>
102 # include <sys/times.h>
103 #endif
104 #ifdef USE_TOD
105 # include <sys/time.h>
106 # include <sys/resource.h>
107 #endif
108
109 /* Depending on the VMS version, the tms structure is perhaps defined.
110    The __TMS macro will show if it was.  If it wasn't defined, we should
111    undefine TIMES, since that tells the rest of the program how things
112    should be handled.                           -- Richard Levitte */
113 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
114 #undef TIMES
115 #endif
116
117 #ifdef TIMEB
118 #include <sys/timeb.h>
119 #endif
120
121 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
122 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
123 #endif
124
125 #if defined(sun) || defined(__ultrix)
126 #define _POSIX_SOURCE
127 #include <limits.h>
128 #include <sys/param.h>
129 #endif
130
131 #ifndef OPENSSL_NO_DES
132 #include <openssl/des.h>
133 #endif
134 #ifndef OPENSSL_NO_MD2
135 #include <openssl/md2.h>
136 #endif
137 #ifndef OPENSSL_NO_MDC2
138 #include <openssl/mdc2.h>
139 #endif
140 #ifndef OPENSSL_NO_MD4
141 #include <openssl/md4.h>
142 #endif
143 #ifndef OPENSSL_NO_MD5
144 #include <openssl/md5.h>
145 #endif
146 #ifndef OPENSSL_NO_HMAC
147 #include <openssl/hmac.h>
148 #endif
149 #include <openssl/evp.h>
150 #ifndef OPENSSL_NO_SHA
151 #include <openssl/sha.h>
152 #endif
153 #ifndef OPENSSL_NO_RIPEMD
154 #include <openssl/ripemd.h>
155 #endif
156 #ifndef OPENSSL_NO_RC4
157 #include <openssl/rc4.h>
158 #endif
159 #ifndef OPENSSL_NO_RC5
160 #include <openssl/rc5.h>
161 #endif
162 #ifndef OPENSSL_NO_RC2
163 #include <openssl/rc2.h>
164 #endif
165 #ifndef OPENSSL_NO_IDEA
166 #include <openssl/idea.h>
167 #endif
168 #ifndef OPENSSL_NO_BF
169 #include <openssl/blowfish.h>
170 #endif
171 #ifndef OPENSSL_NO_CAST
172 #include <openssl/cast.h>
173 #endif
174 #ifndef OPENSSL_NO_RSA
175 #include <openssl/rsa.h>
176 #include "./testrsa.h"
177 #endif
178 #include <openssl/x509.h>
179 #ifndef OPENSSL_NO_DSA
180 #include "./testdsa.h"
181 #endif
182
183 /* The following if from times(3) man page.  It may need to be changed */
184 #ifndef HZ
185 # ifdef _SC_CLK_TCK
186 #  define HZ ((double)sysconf(_SC_CLK_TCK))
187 # else
188 #  ifndef CLK_TCK
189 #   ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
190 #    define HZ  100.0
191 #   else /* _BSD_CLK_TCK_ */
192 #    define HZ ((double)_BSD_CLK_TCK_)
193 #   endif
194 #  else /* CLK_TCK */
195 #   define HZ ((double)CLK_TCK)
196 #  endif
197 # endif
198 #endif
199
200 #undef BUFSIZE
201 #define BUFSIZE ((long)1024*8+1)
202 int run=0;
203
204 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
205
206 static double Time_F(int s, int usertime);
207 static void print_message(const char *s,long num,int length);
208 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
209 #ifdef SIGALRM
210 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
211 #define SIGRETTYPE void
212 #else
213 #define SIGRETTYPE int
214 #endif 
215
216 static SIGRETTYPE sig_done(int sig);
217 static SIGRETTYPE sig_done(int sig)
218         {
219         signal(SIGALRM,sig_done);
220         run=0;
221 #ifdef LINT
222         sig=sig;
223 #endif
224         }
225 #endif
226
227 #define START   0
228 #define STOP    1
229
230 static double Time_F(int s, int usertime)
231         {
232         double ret;
233
234 #ifdef USE_TOD
235         if(usertime)
236             {
237                 static struct rusage tstart,tend;
238
239                 getrusage_used = 1;
240                 if (s == START)
241                         {
242                         getrusage(RUSAGE_SELF,&tstart);
243                         return(0);
244                         }
245                 else
246                         {
247                         long i;
248
249                         getrusage(RUSAGE_SELF,&tend);
250                         i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
251                         ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
252                           +((double)i)/1000000.0;
253                         return((ret < 0.001)?0.001:ret);
254                         }
255                 }
256         else
257                 {
258                 static struct timeval tstart,tend;
259                 long i;
260
261                 gettimeofday_used = 1;
262                 if (s == START)
263                         {
264                         gettimeofday(&tstart,NULL);
265                         return(0);
266                         }
267                 else
268                         {
269                         gettimeofday(&tend,NULL);
270                         i=(long)tend.tv_usec-(long)tstart.tv_usec;
271                         ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
272                         return((ret < 0.001)?0.001:ret);
273                         }
274                 }
275 #else  /* ndef USE_TOD */
276                 
277 # ifdef TIMES
278         if (usertime)
279                 {
280                 static struct tms tstart,tend;
281
282                 times_used = 1;
283                 if (s == START)
284                         {
285                         times(&tstart);
286                         return(0);
287                         }
288                 else
289                         {
290                         times(&tend);
291                         ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
292                         return((ret < 1e-3)?1e-3:ret);
293                         }
294                 }
295 # endif /* times() */
296 # if defined(TIMES) && defined(TIMEB)
297         else
298 # endif
299 # ifdef TIMEB
300                 {
301                 static struct timeb tstart,tend;
302                 long i;
303
304                 ftime_used = 1;
305                 if (s == START)
306                         {
307                         ftime(&tstart);
308                         return(0);
309                         }
310                 else
311                         {
312                         ftime(&tend);
313                         i=(long)tend.millitm-(long)tstart.millitm;
314                         ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
315                         return((ret < 0.001)?0.001:ret);
316                         }
317                 }
318 # endif
319 #endif
320         }
321
322 int MAIN(int, char **);
323
324 int MAIN(int argc, char **argv)
325         {
326         ENGINE *e;
327         unsigned char *buf=NULL,*buf2=NULL;
328         int mret=1;
329 #define ALGOR_NUM       16
330 #define SIZE_NUM        5
331 #define RSA_NUM         4
332 #define DSA_NUM         3
333         long count,rsa_count,save_count=0;
334         int i,j,k;
335 #ifndef OPENSSL_NO_RSA
336         unsigned rsa_num;
337 #endif
338 #ifndef OPENSSL_NO_MD2
339         unsigned char md2[MD2_DIGEST_LENGTH];
340 #endif
341 #ifndef OPENSSL_NO_MDC2
342         unsigned char mdc2[MDC2_DIGEST_LENGTH];
343 #endif
344 #ifndef OPENSSL_NO_MD4
345         unsigned char md4[MD4_DIGEST_LENGTH];
346 #endif
347 #ifndef OPENSSL_NO_MD5
348         unsigned char md5[MD5_DIGEST_LENGTH];
349         unsigned char hmac[MD5_DIGEST_LENGTH];
350 #endif
351 #ifndef OPENSSL_NO_SHA
352         unsigned char sha[SHA_DIGEST_LENGTH];
353 #endif
354 #ifndef OPENSSL_NO_RIPEMD
355         unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
356 #endif
357 #ifndef OPENSSL_NO_RC4
358         RC4_KEY rc4_ks;
359 #endif
360 #ifndef OPENSSL_NO_RC5
361         RC5_32_KEY rc5_ks;
362 #endif
363 #ifndef OPENSSL_NO_RC2
364         RC2_KEY rc2_ks;
365 #endif
366 #ifndef OPENSSL_NO_IDEA
367         IDEA_KEY_SCHEDULE idea_ks;
368 #endif
369 #ifndef OPENSSL_NO_BF
370         BF_KEY bf_ks;
371 #endif
372 #ifndef OPENSSL_NO_CAST
373         CAST_KEY cast_ks;
374 #endif
375         static unsigned char key16[16]=
376                 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
377                  0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
378         unsigned char iv[8];
379 #ifndef OPENSSL_NO_DES
380         des_cblock *buf_as_des_cblock = NULL;
381         static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
382         static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
383         static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
384         des_key_schedule sch,sch2,sch3;
385 #endif
386 #define D_MD2           0
387 #define D_MDC2          1
388 #define D_MD4           2
389 #define D_MD5           3
390 #define D_HMAC          4
391 #define D_SHA1          5
392 #define D_RMD160        6
393 #define D_RC4           7
394 #define D_CBC_DES       8
395 #define D_EDE3_DES      9
396 #define D_CBC_IDEA      10
397 #define D_CBC_RC2       11
398 #define D_CBC_RC5       12
399 #define D_CBC_BF        13
400 #define D_CBC_CAST      14
401 #define D_EVP           15
402         double d,results[ALGOR_NUM][SIZE_NUM];
403         static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
404         long c[ALGOR_NUM][SIZE_NUM];
405         static const char *names[ALGOR_NUM]={
406                 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
407                 "des cbc","des ede3","idea cbc",
408                 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
409 #define R_DSA_512       0
410 #define R_DSA_1024      1
411 #define R_DSA_2048      2
412 #define R_RSA_512       0
413 #define R_RSA_1024      1
414 #define R_RSA_2048      2
415 #define R_RSA_4096      3
416 #ifndef OPENSSL_NO_RSA
417         RSA *rsa_key[RSA_NUM];
418         long rsa_c[RSA_NUM][2];
419         double rsa_results[RSA_NUM][2];
420         static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
421         static unsigned char *rsa_data[RSA_NUM]=
422                 {test512,test1024,test2048,test4096};
423         static int rsa_data_length[RSA_NUM]={
424                 sizeof(test512),sizeof(test1024),
425                 sizeof(test2048),sizeof(test4096)};
426 #endif
427 #ifndef OPENSSL_NO_DSA
428         DSA *dsa_key[DSA_NUM];
429         long dsa_c[DSA_NUM][2];
430         double dsa_results[DSA_NUM][2];
431         static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
432 #endif
433         int rsa_doit[RSA_NUM];
434         int dsa_doit[DSA_NUM];
435         int doit[ALGOR_NUM];
436         int pr_header=0;
437         int usertime=1;
438         const EVP_CIPHER *evp=NULL;
439         int decrypt=0;
440
441 #ifndef TIMES
442         usertime=-1;
443 #endif
444
445         apps_startup();
446         memset(results, 0, sizeof(results));
447 #ifndef OPENSSL_NO_DSA
448         memset(dsa_key,0,sizeof(dsa_key));
449 #endif
450
451         if (bio_err == NULL)
452                 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
453                         BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
454
455 #ifndef OPENSSL_NO_RSA
456         memset(rsa_key,0,sizeof(rsa_key));
457         for (i=0; i<RSA_NUM; i++)
458                 rsa_key[i]=NULL;
459 #endif
460
461         if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
462                 {
463                 BIO_printf(bio_err,"out of memory\n");
464                 goto end;
465                 }
466 #ifndef OPENSSL_NO_DES
467         buf_as_des_cblock = (des_cblock *)buf;
468 #endif
469         if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
470                 {
471                 BIO_printf(bio_err,"out of memory\n");
472                 goto end;
473                 }
474
475         memset(c,0,sizeof(c));
476         memset(iv,0,sizeof(iv));
477
478         for (i=0; i<ALGOR_NUM; i++)
479                 doit[i]=0;
480         for (i=0; i<RSA_NUM; i++)
481                 rsa_doit[i]=0;
482         for (i=0; i<DSA_NUM; i++)
483                 dsa_doit[i]=0;
484         
485         j=0;
486         argc--;
487         argv++;
488         while (argc)
489                 {
490                 if      ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
491                         {
492                         usertime = 0;
493                         j--;    /* Otherwise, -elapsed gets confused with
494                                    an algorithm. */
495                         }
496                 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
497                         {
498                         argc--;
499                         argv++;
500                         if(argc == 0)
501                                 {
502                                 BIO_printf(bio_err,"no EVP given\n");
503                                 goto end;
504                                 }
505                         evp=EVP_get_cipherbyname(*argv);
506                         if(!evp)
507                                 {
508                                 BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
509                                 goto end;
510                                 }
511                         doit[D_EVP]=1;
512                         }
513                 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
514                         {
515                         decrypt=1;
516                         j--;    /* Otherwise, -elapsed gets confused with
517                                    an algorithm. */
518                         }
519                 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
520                         {
521                         argc--;
522                         argv++;
523                         if(argc == 0)
524                                 {
525                                 BIO_printf(bio_err,"no engine given\n");
526                                 goto end;
527                                 }
528                         e = setup_engine(bio_err, *argv, 0);
529                         /* j will be increased again further down.  We just
530                            don't want speed to confuse an engine with an
531                            algorithm, especially when none is given (which
532                            means all of them should be run) */
533                         j--;
534                         }
535                 else
536 #ifndef OPENSSL_NO_MD2
537                 if      (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
538                 else
539 #endif
540 #ifndef OPENSSL_NO_MDC2
541                         if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
542                 else
543 #endif
544 #ifndef OPENSSL_NO_MD4
545                         if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
546                 else
547 #endif
548 #ifndef OPENSSL_NO_MD5
549                         if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
550                 else
551 #endif
552 #ifndef OPENSSL_NO_MD5
553                         if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
554                 else
555 #endif
556 #ifndef OPENSSL_NO_SHA
557                         if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
558                 else
559                         if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
560                 else
561 #endif
562 #ifndef OPENSSL_NO_RIPEMD
563                         if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
564                 else
565                         if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
566                 else
567                         if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
568                 else
569 #endif
570 #ifndef OPENSSL_NO_RC4
571                         if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
572                 else 
573 #endif
574 #ifndef OPENSSL_NO_DES
575                         if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
576                 else    if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
577                 else
578 #endif
579 #ifndef OPENSSL_NO_RSA
580 #if 0 /* was: #ifdef RSAref */
581                         if (strcmp(*argv,"rsaref") == 0) 
582                         {
583                         RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
584                         j--;
585                         }
586                 else
587 #endif
588 #ifndef RSA_NULL
589                         if (strcmp(*argv,"openssl") == 0) 
590                         {
591                         RSA_set_default_method(RSA_PKCS1_SSLeay());
592                         j--;
593                         }
594                 else
595 #endif
596 #endif /* !OPENSSL_NO_RSA */
597                      if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
598                 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
599                 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
600                 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
601                 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
602                 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
603                 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
604                 else
605 #ifndef OPENSSL_NO_RC2
606                      if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
607                 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
608                 else
609 #endif
610 #ifndef OPENSSL_NO_RC5
611                      if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
612                 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
613                 else
614 #endif
615 #ifndef OPENSSL_NO_IDEA
616                      if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
617                 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
618                 else
619 #endif
620 #ifndef OPENSSL_NO_BF
621                      if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
622                 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
623                 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
624                 else
625 #endif
626 #ifndef OPENSSL_NO_CAST
627                      if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
628                 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
629                 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
630                 else
631 #endif
632 #ifndef OPENSSL_NO_DES
633                         if (strcmp(*argv,"des") == 0)
634                         {
635                         doit[D_CBC_DES]=1;
636                         doit[D_EDE3_DES]=1;
637                         }
638                 else
639 #endif
640 #ifndef OPENSSL_NO_RSA
641                         if (strcmp(*argv,"rsa") == 0)
642                         {
643                         rsa_doit[R_RSA_512]=1;
644                         rsa_doit[R_RSA_1024]=1;
645                         rsa_doit[R_RSA_2048]=1;
646                         rsa_doit[R_RSA_4096]=1;
647                         }
648                 else
649 #endif
650 #ifndef OPENSSL_NO_DSA
651                         if (strcmp(*argv,"dsa") == 0)
652                         {
653                         dsa_doit[R_DSA_512]=1;
654                         dsa_doit[R_DSA_1024]=1;
655                         }
656                 else
657 #endif
658                         {
659                         BIO_printf(bio_err,"Error: bad option or value\n");
660                         BIO_printf(bio_err,"\n");
661                         BIO_printf(bio_err,"Available values:\n");
662 #ifndef OPENSSL_NO_MD2
663                         BIO_printf(bio_err,"md2      ");
664 #endif
665 #ifndef OPENSSL_NO_MDC2
666                         BIO_printf(bio_err,"mdc2     ");
667 #endif
668 #ifndef OPENSSL_NO_MD4
669                         BIO_printf(bio_err,"md4      ");
670 #endif
671 #ifndef OPENSSL_NO_MD5
672                         BIO_printf(bio_err,"md5      ");
673 #ifndef OPENSSL_NO_HMAC
674                         BIO_printf(bio_err,"hmac     ");
675 #endif
676 #endif
677 #ifndef OPENSSL_NO_SHA1
678                         BIO_printf(bio_err,"sha1     ");
679 #endif
680 #ifndef OPENSSL_NO_RIPEMD160
681                         BIO_printf(bio_err,"rmd160");
682 #endif
683 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
684     !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
685     !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
686                         BIO_printf(bio_err,"\n");
687 #endif
688
689 #ifndef OPENSSL_NO_IDEA
690                         BIO_printf(bio_err,"idea-cbc ");
691 #endif
692 #ifndef OPENSSL_NO_RC2
693                         BIO_printf(bio_err,"rc2-cbc  ");
694 #endif
695 #ifndef OPENSSL_NO_RC5
696                         BIO_printf(bio_err,"rc5-cbc  ");
697 #endif
698 #ifndef OPENSSL_NO_BF
699                         BIO_printf(bio_err,"bf-cbc");
700 #endif
701 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
702     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
703                         BIO_printf(bio_err,"\n");
704 #endif
705
706                         BIO_printf(bio_err,"des-cbc  des-ede3 ");
707 #ifndef OPENSSL_NO_RC4
708                         BIO_printf(bio_err,"rc4");
709 #endif
710                         BIO_printf(bio_err,"\n");
711
712 #ifndef OPENSSL_NO_RSA
713                         BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
714 #endif
715
716 #ifndef OPENSSL_NO_DSA
717                         BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
718 #endif
719
720 #ifndef OPENSSL_NO_IDEA
721                         BIO_printf(bio_err,"idea     ");
722 #endif
723 #ifndef OPENSSL_NO_RC2
724                         BIO_printf(bio_err,"rc2      ");
725 #endif
726 #ifndef OPENSSL_NO_DES
727                         BIO_printf(bio_err,"des      ");
728 #endif
729 #ifndef OPENSSL_NO_RSA
730                         BIO_printf(bio_err,"rsa      ");
731 #endif
732 #ifndef OPENSSL_NO_BF
733                         BIO_printf(bio_err,"blowfish");
734 #endif
735 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
736     !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
737     !defined(OPENSSL_NO_BF)
738                         BIO_printf(bio_err,"\n");
739 #endif
740
741                         BIO_printf(bio_err,"\n");
742                         BIO_printf(bio_err,"Available options:\n");
743 #ifdef TIMES
744                         BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
745 #endif
746                         BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
747                         goto end;
748                         }
749                 argc--;
750                 argv++;
751                 j++;
752                 }
753
754         if (j == 0)
755                 {
756                 for (i=0; i<ALGOR_NUM; i++)
757                         {
758                         if (i != D_EVP)
759                                 doit[i]=1;
760                         }
761                 for (i=0; i<RSA_NUM; i++)
762                         rsa_doit[i]=1;
763                 for (i=0; i<DSA_NUM; i++)
764                         dsa_doit[i]=1;
765                 }
766         for (i=0; i<ALGOR_NUM; i++)
767                 if (doit[i]) pr_header++;
768
769         if (usertime == 0)
770                 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
771         if (usertime <= 0)
772                 {
773                 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
774                 BIO_printf(bio_err,"program when this computer is idle.\n");
775                 }
776
777 #ifndef OPENSSL_NO_RSA
778         for (i=0; i<RSA_NUM; i++)
779                 {
780                 const unsigned char *p;
781
782                 p=rsa_data[i];
783                 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
784                 if (rsa_key[i] == NULL)
785                         {
786                         BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
787                         goto end;
788                         }
789 #if 0
790                 else
791                         {
792                         BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
793                         BN_print(bio_err,rsa_key[i]->e);
794                         BIO_printf(bio_err,"\n");
795                         }
796 #endif
797                 }
798 #endif
799
800 #ifndef OPENSSL_NO_DSA
801         dsa_key[0]=get_dsa512();
802         dsa_key[1]=get_dsa1024();
803         dsa_key[2]=get_dsa2048();
804 #endif
805
806 #ifndef OPENSSL_NO_DES
807         des_set_key_unchecked(&key,&sch);
808         des_set_key_unchecked(&key2,&sch2);
809         des_set_key_unchecked(&key3,&sch3);
810 #endif
811 #ifndef OPENSSL_NO_IDEA
812         idea_set_encrypt_key(key16,&idea_ks);
813 #endif
814 #ifndef OPENSSL_NO_RC4
815         RC4_set_key(&rc4_ks,16,key16);
816 #endif
817 #ifndef OPENSSL_NO_RC2
818         RC2_set_key(&rc2_ks,16,key16,128);
819 #endif
820 #ifndef OPENSSL_NO_RC5
821         RC5_32_set_key(&rc5_ks,16,key16,12);
822 #endif
823 #ifndef OPENSSL_NO_BF
824         BF_set_key(&bf_ks,16,key16);
825 #endif
826 #ifndef OPENSSL_NO_CAST
827         CAST_set_key(&cast_ks,16,key16);
828 #endif
829 #ifndef OPENSSL_NO_RSA
830         memset(rsa_c,0,sizeof(rsa_c));
831 #endif
832 #ifndef SIGALRM
833 #ifndef OPENSSL_NO_DES
834         BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
835         count=10;
836         do      {
837                 long i;
838                 count*=2;
839                 Time_F(START,usertime);
840                 for (i=count; i; i--)
841                         des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
842                                 &sch,DES_ENCRYPT);
843                 d=Time_F(STOP,usertime);
844                 } while (d <3);
845         save_count=count;
846         c[D_MD2][0]=count/10;
847         c[D_MDC2][0]=count/10;
848         c[D_MD4][0]=count;
849         c[D_MD5][0]=count;
850         c[D_HMAC][0]=count;
851         c[D_SHA1][0]=count;
852         c[D_RMD160][0]=count;
853         c[D_RC4][0]=count*5;
854         c[D_CBC_DES][0]=count;
855         c[D_EDE3_DES][0]=count/3;
856         c[D_CBC_IDEA][0]=count;
857         c[D_CBC_RC2][0]=count;
858         c[D_CBC_RC5][0]=count;
859         c[D_CBC_BF][0]=count;
860         c[D_CBC_CAST][0]=count;
861
862         for (i=1; i<SIZE_NUM; i++)
863                 {
864                 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
865                 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
866                 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
867                 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
868                 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
869                 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
870                 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
871                 }
872         for (i=1; i<SIZE_NUM; i++)
873                 {
874                 long l0,l1;
875
876                 l0=(long)lengths[i-1];
877                 l1=(long)lengths[i];
878                 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
879                 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
880                 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
881                 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
882                 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
883                 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
884                 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
885                 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
886                 }
887 #ifndef OPENSSL_NO_RSA
888         rsa_c[R_RSA_512][0]=count/2000;
889         rsa_c[R_RSA_512][1]=count/400;
890         for (i=1; i<RSA_NUM; i++)
891                 {
892                 rsa_c[i][0]=rsa_c[i-1][0]/8;
893                 rsa_c[i][1]=rsa_c[i-1][1]/4;
894                 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
895                         rsa_doit[i]=0;
896                 else
897                         {
898                         if (rsa_c[i][0] == 0)
899                                 {
900                                 rsa_c[i][0]=1;
901                                 rsa_c[i][1]=20;
902                                 }
903                         }                               
904                 }
905 #endif
906
907 #ifndef OPENSSL_NO_DSA
908         dsa_c[R_DSA_512][0]=count/1000;
909         dsa_c[R_DSA_512][1]=count/1000/2;
910         for (i=1; i<DSA_NUM; i++)
911                 {
912                 dsa_c[i][0]=dsa_c[i-1][0]/4;
913                 dsa_c[i][1]=dsa_c[i-1][1]/4;
914                 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
915                         dsa_doit[i]=0;
916                 else
917                         {
918                         if (dsa_c[i] == 0)
919                                 {
920                                 dsa_c[i][0]=1;
921                                 dsa_c[i][1]=1;
922                                 }
923                         }                               
924                 }
925 #endif
926
927 #define COND(d) (count < (d))
928 #define COUNT(d) (d)
929 #else
930 /* not worth fixing */
931 # error "You cannot disable DES on systems without SIGALRM."
932 #endif /* OPENSSL_NO_DES */
933 #else
934 #define COND(c) (run)
935 #define COUNT(d) (count)
936         signal(SIGALRM,sig_done);
937 #endif /* SIGALRM */
938
939 #ifndef OPENSSL_NO_MD2
940         if (doit[D_MD2])
941                 {
942                 for (j=0; j<SIZE_NUM; j++)
943                         {
944                         print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
945                         Time_F(START,usertime);
946                         for (count=0,run=1; COND(c[D_MD2][j]); count++)
947                                 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(), NULL);
948                         d=Time_F(STOP,usertime);
949                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
950                                 count,names[D_MD2],d);
951                         results[D_MD2][j]=((double)count)/d*lengths[j];
952                         }
953                 }
954 #endif
955 #ifndef OPENSSL_NO_MDC2
956         if (doit[D_MDC2])
957                 {
958                 for (j=0; j<SIZE_NUM; j++)
959                         {
960                         print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
961                         Time_F(START,usertime);
962                         for (count=0,run=1; COND(c[D_MDC2][j]); count++)
963                                 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(), NULL);
964                         d=Time_F(STOP,usertime);
965                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
966                                 count,names[D_MDC2],d);
967                         results[D_MDC2][j]=((double)count)/d*lengths[j];
968                         }
969                 }
970 #endif
971
972 #ifndef OPENSSL_NO_MD4
973         if (doit[D_MD4])
974                 {
975                 for (j=0; j<SIZE_NUM; j++)
976                         {
977                         print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
978                         Time_F(START,usertime);
979                         for (count=0,run=1; COND(c[D_MD4][j]); count++)
980                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(), NULL);
981                         d=Time_F(STOP,usertime);
982                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
983                                 count,names[D_MD4],d);
984                         results[D_MD4][j]=((double)count)/d*lengths[j];
985                         }
986                 }
987 #endif
988
989 #ifndef OPENSSL_NO_MD5
990         if (doit[D_MD5])
991                 {
992                 for (j=0; j<SIZE_NUM; j++)
993                         {
994                         print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
995                         Time_F(START,usertime);
996                         for (count=0,run=1; COND(c[D_MD5][j]); count++)
997                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,
998                                                                                 EVP_get_digestbyname("md5"), NULL);
999                         d=Time_F(STOP,usertime);
1000                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1001                                 count,names[D_MD5],d);
1002                         results[D_MD5][j]=((double)count)/d*lengths[j];
1003                         }
1004                 }
1005 #endif
1006
1007 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1008         if (doit[D_HMAC])
1009                 {
1010                 HMAC_CTX hctx;
1011
1012                 HMAC_CTX_init(&hctx);
1013                 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
1014                         16,EVP_md5());
1015
1016                 for (j=0; j<SIZE_NUM; j++)
1017                         {
1018                         print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1019                         Time_F(START,usertime);
1020                         for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1021                                 {
1022                                 HMAC_Init(&hctx,NULL,0,NULL);
1023                                 HMAC_Update(&hctx,buf,lengths[j]);
1024                                 HMAC_Final(&hctx,&(hmac[0]),NULL);
1025                                 }
1026                         d=Time_F(STOP,usertime);
1027                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1028                                 count,names[D_HMAC],d);
1029                         results[D_HMAC][j]=((double)count)/d*lengths[j];
1030                         }
1031                 HMAC_CTX_cleanup(&hctx);
1032                 }
1033 #endif
1034 #ifndef OPENSSL_NO_SHA
1035         if (doit[D_SHA1])
1036                 {
1037                 for (j=0; j<SIZE_NUM; j++)
1038                         {
1039                         print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1040                         Time_F(START,usertime);
1041                         for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1042                                 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(), NULL);
1043                         d=Time_F(STOP,usertime);
1044                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1045                                 count,names[D_SHA1],d);
1046                         results[D_SHA1][j]=((double)count)/d*lengths[j];
1047                         }
1048                 }
1049 #endif
1050 #ifndef OPENSSL_NO_RIPEMD
1051         if (doit[D_RMD160])
1052                 {
1053                 for (j=0; j<SIZE_NUM; j++)
1054                         {
1055                         print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1056                         Time_F(START,usertime);
1057                         for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1058                                 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(), NULL);
1059                         d=Time_F(STOP,usertime);
1060                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1061                                 count,names[D_RMD160],d);
1062                         results[D_RMD160][j]=((double)count)/d*lengths[j];
1063                         }
1064                 }
1065 #endif
1066 #ifndef OPENSSL_NO_RC4
1067         if (doit[D_RC4])
1068                 {
1069                 for (j=0; j<SIZE_NUM; j++)
1070                         {
1071                         print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1072                         Time_F(START,usertime);
1073                         for (count=0,run=1; COND(c[D_RC4][j]); count++)
1074                                 RC4(&rc4_ks,(unsigned int)lengths[j],
1075                                         buf,buf);
1076                         d=Time_F(STOP,usertime);
1077                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1078                                 count,names[D_RC4],d);
1079                         results[D_RC4][j]=((double)count)/d*lengths[j];
1080                         }
1081                 }
1082 #endif
1083 #ifndef OPENSSL_NO_DES
1084         if (doit[D_CBC_DES])
1085                 {
1086                 for (j=0; j<SIZE_NUM; j++)
1087                         {
1088                         print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1089                         Time_F(START,usertime);
1090                         for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1091                                 des_ncbc_encrypt(buf,buf,lengths[j],&sch,
1092                                                  &iv,DES_ENCRYPT);
1093                         d=Time_F(STOP,usertime);
1094                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1095                                    count,names[D_CBC_DES],d);
1096                         results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1097                         }
1098                 }
1099
1100         if (doit[D_EDE3_DES])
1101                 {
1102                 for (j=0; j<SIZE_NUM; j++)
1103                         {
1104                         print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1105                         Time_F(START,usertime);
1106                         for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1107                                 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1108                                                      &sch,&sch2,&sch3,
1109                                                      &iv,DES_ENCRYPT);
1110                         d=Time_F(STOP,usertime);
1111                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1112                                 count,names[D_EDE3_DES],d);
1113                         results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1114                         }
1115                 }
1116 #endif
1117 #ifndef OPENSSL_NO_IDEA
1118         if (doit[D_CBC_IDEA])
1119                 {
1120                 for (j=0; j<SIZE_NUM; j++)
1121                         {
1122                         print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1123                         Time_F(START,usertime);
1124                         for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1125                                 idea_cbc_encrypt(buf,buf,
1126                                         (unsigned long)lengths[j],&idea_ks,
1127                                         iv,IDEA_ENCRYPT);
1128                         d=Time_F(STOP,usertime);
1129                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1130                                 count,names[D_CBC_IDEA],d);
1131                         results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1132                         }
1133                 }
1134 #endif
1135 #ifndef OPENSSL_NO_RC2
1136         if (doit[D_CBC_RC2])
1137                 {
1138                 for (j=0; j<SIZE_NUM; j++)
1139                         {
1140                         print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1141                         Time_F(START,usertime);
1142                         for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1143                                 RC2_cbc_encrypt(buf,buf,
1144                                         (unsigned long)lengths[j],&rc2_ks,
1145                                         iv,RC2_ENCRYPT);
1146                         d=Time_F(STOP,usertime);
1147                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1148                                 count,names[D_CBC_RC2],d);
1149                         results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1150                         }
1151                 }
1152 #endif
1153 #ifndef OPENSSL_NO_RC5
1154         if (doit[D_CBC_RC5])
1155                 {
1156                 for (j=0; j<SIZE_NUM; j++)
1157                         {
1158                         print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1159                         Time_F(START,usertime);
1160                         for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1161                                 RC5_32_cbc_encrypt(buf,buf,
1162                                         (unsigned long)lengths[j],&rc5_ks,
1163                                         iv,RC5_ENCRYPT);
1164                         d=Time_F(STOP,usertime);
1165                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1166                                 count,names[D_CBC_RC5],d);
1167                         results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1168                         }
1169                 }
1170 #endif
1171 #ifndef OPENSSL_NO_BF
1172         if (doit[D_CBC_BF])
1173                 {
1174                 for (j=0; j<SIZE_NUM; j++)
1175                         {
1176                         print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1177                         Time_F(START,usertime);
1178                         for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1179                                 BF_cbc_encrypt(buf,buf,
1180                                         (unsigned long)lengths[j],&bf_ks,
1181                                         iv,BF_ENCRYPT);
1182                         d=Time_F(STOP,usertime);
1183                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1184                                 count,names[D_CBC_BF],d);
1185                         results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1186                         }
1187                 }
1188 #endif
1189 #ifndef OPENSSL_NO_CAST
1190         if (doit[D_CBC_CAST])
1191                 {
1192                 for (j=0; j<SIZE_NUM; j++)
1193                         {
1194                         print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1195                         Time_F(START,usertime);
1196                         for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1197                                 CAST_cbc_encrypt(buf,buf,
1198                                         (unsigned long)lengths[j],&cast_ks,
1199                                         iv,CAST_ENCRYPT);
1200                         d=Time_F(STOP,usertime);
1201                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1202                                 count,names[D_CBC_CAST],d);
1203                         results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1204                         }
1205                 }
1206 #endif
1207
1208         if (doit[D_EVP])
1209                 {
1210                 for (j=0; j<SIZE_NUM; j++)
1211                         {
1212                         EVP_CIPHER_CTX ctx;
1213                         int outl;
1214
1215                         names[D_EVP]=OBJ_nid2ln(evp->nid);
1216                         print_message(names[D_EVP],save_count,
1217                                                   lengths[j]);
1218                         EVP_CIPHER_CTX_init(&ctx);
1219                         if(decrypt)
1220                                 EVP_DecryptInit_ex(&ctx,evp,NULL,key16,iv);
1221                         else
1222                                 EVP_EncryptInit_ex(&ctx,evp,NULL,key16,iv);
1223                                 
1224                         Time_F(START,usertime);
1225                         if(decrypt)
1226                                 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1227                                         EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1228                         else
1229                                 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1230                                         EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1231                         if(decrypt)
1232                                 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1233                         else
1234                                 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1235                         d=Time_F(STOP,usertime);
1236                         EVP_CIPHER_CTX_cleanup(&ctx);
1237                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1238                                            count,names[D_EVP],d);
1239                         results[D_EVP][j]=((double)count)/d*lengths[j];
1240                         }
1241                 }
1242
1243         RAND_pseudo_bytes(buf,36);
1244 #ifndef OPENSSL_NO_RSA
1245         for (j=0; j<RSA_NUM; j++)
1246                 {
1247                 int ret;
1248                 if (!rsa_doit[j]) continue;
1249                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1250                 if (ret == 0)
1251                         {
1252                         BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1253                         ERR_print_errors(bio_err);
1254                         rsa_count=1;
1255                         }
1256                 else
1257                         {
1258                         pkey_print_message("private","rsa",
1259                                 rsa_c[j][0],rsa_bits[j],
1260                                 RSA_SECONDS);
1261 /*                      RSA_blinding_on(rsa_key[j],NULL); */
1262                         Time_F(START,usertime);
1263                         for (count=0,run=1; COND(rsa_c[j][0]); count++)
1264                                 {
1265                                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1266                                         &rsa_num, rsa_key[j]);
1267                                 if (ret == 0)
1268                                         {
1269                                         BIO_printf(bio_err,
1270                                                 "RSA sign failure\n");
1271                                         ERR_print_errors(bio_err);
1272                                         count=1;
1273                                         break;
1274                                         }
1275                                 }
1276                         d=Time_F(STOP,usertime);
1277                         BIO_printf(bio_err,
1278                                 "%ld %d bit private RSA's in %.2fs\n",
1279                                 count,rsa_bits[j],d);
1280                         rsa_results[j][0]=d/(double)count;
1281                         rsa_count=count;
1282                         }
1283
1284 #if 1
1285                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1286                 if (ret <= 0)
1287                         {
1288                         BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1289                         ERR_print_errors(bio_err);
1290                         rsa_doit[j] = 0;
1291                         }
1292                 else
1293                         {
1294                         pkey_print_message("public","rsa",
1295                                 rsa_c[j][1],rsa_bits[j],
1296                                 RSA_SECONDS);
1297                         Time_F(START,usertime);
1298                         for (count=0,run=1; COND(rsa_c[j][1]); count++)
1299                                 {
1300                                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1301                                         rsa_num, rsa_key[j]);
1302                                 if (ret == 0)
1303                                         {
1304                                         BIO_printf(bio_err,
1305                                                 "RSA verify failure\n");
1306                                         ERR_print_errors(bio_err);
1307                                         count=1;
1308                                         break;
1309                                         }
1310                                 }
1311                         d=Time_F(STOP,usertime);
1312                         BIO_printf(bio_err,
1313                                 "%ld %d bit public RSA's in %.2fs\n",
1314                                 count,rsa_bits[j],d);
1315                         rsa_results[j][1]=d/(double)count;
1316                         }
1317 #endif
1318
1319                 if (rsa_count <= 1)
1320                         {
1321                         /* if longer than 10s, don't do any more */
1322                         for (j++; j<RSA_NUM; j++)
1323                                 rsa_doit[j]=0;
1324                         }
1325                 }
1326 #endif
1327
1328         RAND_pseudo_bytes(buf,20);
1329 #ifndef OPENSSL_NO_DSA
1330         if (RAND_status() != 1)
1331                 {
1332                 RAND_seed(rnd_seed, sizeof rnd_seed);
1333                 rnd_fake = 1;
1334                 }
1335         for (j=0; j<DSA_NUM; j++)
1336                 {
1337                 unsigned int kk;
1338                 int ret;
1339
1340                 if (!dsa_doit[j]) continue;
1341 /*              DSA_generate_key(dsa_key[j]); */
1342 /*              DSA_sign_setup(dsa_key[j],NULL); */
1343                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1344                         &kk,dsa_key[j]);
1345                 if (ret == 0)
1346                         {
1347                         BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1348                         ERR_print_errors(bio_err);
1349                         rsa_count=1;
1350                         }
1351                 else
1352                         {
1353                         pkey_print_message("sign","dsa",
1354                                 dsa_c[j][0],dsa_bits[j],
1355                                 DSA_SECONDS);
1356                         Time_F(START,usertime);
1357                         for (count=0,run=1; COND(dsa_c[j][0]); count++)
1358                                 {
1359                                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1360                                         &kk,dsa_key[j]);
1361                                 if (ret == 0)
1362                                         {
1363                                         BIO_printf(bio_err,
1364                                                 "DSA sign failure\n");
1365                                         ERR_print_errors(bio_err);
1366                                         count=1;
1367                                         break;
1368                                         }
1369                                 }
1370                         d=Time_F(STOP,usertime);
1371                         BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1372                                 count,dsa_bits[j],d);
1373                         dsa_results[j][0]=d/(double)count;
1374                         rsa_count=count;
1375                         }
1376
1377                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1378                         kk,dsa_key[j]);
1379                 if (ret <= 0)
1380                         {
1381                         BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1382                         ERR_print_errors(bio_err);
1383                         dsa_doit[j] = 0;
1384                         }
1385                 else
1386                         {
1387                         pkey_print_message("verify","dsa",
1388                                 dsa_c[j][1],dsa_bits[j],
1389                                 DSA_SECONDS);
1390                         Time_F(START,usertime);
1391                         for (count=0,run=1; COND(dsa_c[j][1]); count++)
1392                                 {
1393                                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1394                                         kk,dsa_key[j]);
1395                                 if (ret <= 0)
1396                                         {
1397                                         BIO_printf(bio_err,
1398                                                 "DSA verify failure\n");
1399                                         ERR_print_errors(bio_err);
1400                                         count=1;
1401                                         break;
1402                                         }
1403                                 }
1404                         d=Time_F(STOP,usertime);
1405                         BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1406                                 count,dsa_bits[j],d);
1407                         dsa_results[j][1]=d/(double)count;
1408                         }
1409
1410                 if (rsa_count <= 1)
1411                         {
1412                         /* if longer than 10s, don't do any more */
1413                         for (j++; j<DSA_NUM; j++)
1414                                 dsa_doit[j]=0;
1415                         }
1416                 }
1417         if (rnd_fake) RAND_cleanup();
1418 #endif
1419
1420         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1421         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1422         printf("options:");
1423         printf("%s ",BN_options());
1424 #ifndef OPENSSL_NO_MD2
1425         printf("%s ",MD2_options());
1426 #endif
1427 #ifndef OPENSSL_NO_RC4
1428         printf("%s ",RC4_options());
1429 #endif
1430 #ifndef OPENSSL_NO_DES
1431         printf("%s ",des_options());
1432 #endif
1433 #ifndef OPENSSL_NO_IDEA
1434         printf("%s ",idea_options());
1435 #endif
1436 #ifndef OPENSSL_NO_BF
1437         printf("%s ",BF_options());
1438 #endif
1439         fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1440         printf("available timing options: ");
1441 #ifdef TIMES
1442         printf("TIMES ");
1443 #endif
1444 #ifdef TIMEB
1445         printf("TIMEB ");
1446 #endif
1447 #ifdef USE_TOD
1448         printf("USE_TOD ");
1449 #endif
1450 #ifdef HZ
1451 #define as_string(s) (#s)
1452         printf("HZ=%g", HZ);
1453 # ifdef _SC_CLK_TCK
1454         printf(" [sysconf value]");
1455 # endif
1456 #endif
1457         printf("\n");
1458         printf("timing function used: %s%s%s%s%s%s%s\n",
1459                 (ftime_used ? "ftime" : ""),
1460                 (ftime_used + times_used > 1 ? "," : ""),
1461                 (times_used ? "times" : ""),
1462                 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1463                 (gettimeofday_used ? "gettimeofday" : ""),
1464                 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1465                 (getrusage_used ? "getrusage" : ""));
1466
1467
1468         if (pr_header)
1469                 {
1470                 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 
1471                 fprintf(stdout,"type        ");
1472                 for (j=0;  j<SIZE_NUM; j++)
1473                         fprintf(stdout,"%7d bytes",lengths[j]);
1474                 fprintf(stdout,"\n");
1475                 }
1476
1477         for (k=0; k<ALGOR_NUM; k++)
1478                 {
1479                 if (!doit[k]) continue;
1480                 fprintf(stdout,"%-13s",names[k]);
1481                 for (j=0; j<SIZE_NUM; j++)
1482                         {
1483                         if (results[k][j] > 10000)
1484                                 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1485                         else
1486                                 fprintf(stdout," %11.2f ",results[k][j]);
1487                         }
1488                 fprintf(stdout,"\n");
1489                 }
1490 #ifndef OPENSSL_NO_RSA
1491         j=1;
1492         for (k=0; k<RSA_NUM; k++)
1493                 {
1494                 if (!rsa_doit[k]) continue;
1495                 if (j)
1496                         {
1497                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1498                         j=0;
1499                         }
1500                 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1501                         rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1502                         1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1503                 fprintf(stdout,"\n");
1504                 }
1505 #endif
1506 #ifndef OPENSSL_NO_DSA
1507         j=1;
1508         for (k=0; k<DSA_NUM; k++)
1509                 {
1510                 if (!dsa_doit[k]) continue;
1511                 if (j)  {
1512                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1513                         j=0;
1514                         }
1515                 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1516                         dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1517                         1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1518                 fprintf(stdout,"\n");
1519                 }
1520 #endif
1521         mret=0;
1522 end:
1523         ERR_print_errors(bio_err);
1524         if (buf != NULL) OPENSSL_free(buf);
1525         if (buf2 != NULL) OPENSSL_free(buf2);
1526 #ifndef OPENSSL_NO_RSA
1527         for (i=0; i<RSA_NUM; i++)
1528                 if (rsa_key[i] != NULL)
1529                         RSA_free(rsa_key[i]);
1530 #endif
1531 #ifndef OPENSSL_NO_DSA
1532         for (i=0; i<DSA_NUM; i++)
1533                 if (dsa_key[i] != NULL)
1534                         DSA_free(dsa_key[i]);
1535 #endif
1536         apps_shutdown();
1537         EXIT(mret);
1538         }
1539
1540 static void print_message(const char *s, long num, int length)
1541         {
1542 #ifdef SIGALRM
1543         BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1544         (void)BIO_flush(bio_err);
1545         alarm(SECONDS);
1546 #else
1547         BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1548         (void)BIO_flush(bio_err);
1549 #endif
1550 #ifdef LINT
1551         num=num;
1552 #endif
1553         }
1554
1555 static void pkey_print_message(char *str, char *str2, long num, int bits,
1556              int tm)
1557         {
1558 #ifdef SIGALRM
1559         BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1560         (void)BIO_flush(bio_err);
1561         alarm(RSA_SECONDS);
1562 #else
1563         BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1564         (void)BIO_flush(bio_err);
1565 #endif
1566 #ifdef LINT
1567         num=num;
1568 #endif
1569         }
1570