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