b5e4e0e90abf9c234a5fc713a61255184d975a77
[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_old.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;
385         DES_key_schedule sch2;
386         DES_key_schedule sch3;
387 #endif
388 #define D_MD2           0
389 #define D_MDC2          1
390 #define D_MD4           2
391 #define D_MD5           3
392 #define D_HMAC          4
393 #define D_SHA1          5
394 #define D_RMD160        6
395 #define D_RC4           7
396 #define D_CBC_DES       8
397 #define D_EDE3_DES      9
398 #define D_CBC_IDEA      10
399 #define D_CBC_RC2       11
400 #define D_CBC_RC5       12
401 #define D_CBC_BF        13
402 #define D_CBC_CAST      14
403 #define D_EVP           15
404         double d,results[ALGOR_NUM][SIZE_NUM];
405         static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
406         long c[ALGOR_NUM][SIZE_NUM];
407         static const char *names[ALGOR_NUM]={
408                 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
409                 "des cbc","des ede3","idea cbc",
410                 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
411 #define R_DSA_512       0
412 #define R_DSA_1024      1
413 #define R_DSA_2048      2
414 #define R_RSA_512       0
415 #define R_RSA_1024      1
416 #define R_RSA_2048      2
417 #define R_RSA_4096      3
418 #ifndef OPENSSL_NO_RSA
419         RSA *rsa_key[RSA_NUM];
420         long rsa_c[RSA_NUM][2];
421         double rsa_results[RSA_NUM][2];
422         static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
423         static unsigned char *rsa_data[RSA_NUM]=
424                 {test512,test1024,test2048,test4096};
425         static int rsa_data_length[RSA_NUM]={
426                 sizeof(test512),sizeof(test1024),
427                 sizeof(test2048),sizeof(test4096)};
428 #endif
429 #ifndef OPENSSL_NO_DSA
430         DSA *dsa_key[DSA_NUM];
431         long dsa_c[DSA_NUM][2];
432         double dsa_results[DSA_NUM][2];
433         static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
434 #endif
435         int rsa_doit[RSA_NUM];
436         int dsa_doit[DSA_NUM];
437         int doit[ALGOR_NUM];
438         int pr_header=0;
439         int usertime=1;
440         const EVP_CIPHER *evp=NULL;
441         int decrypt=0;
442
443 #ifndef TIMES
444         usertime=-1;
445 #endif
446
447         apps_startup();
448         memset(results, 0, sizeof(results));
449 #ifndef OPENSSL_NO_DSA
450         memset(dsa_key,0,sizeof(dsa_key));
451 #endif
452
453         if (bio_err == NULL)
454                 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
455                         BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
456
457 #ifndef OPENSSL_NO_RSA
458         memset(rsa_key,0,sizeof(rsa_key));
459         for (i=0; i<RSA_NUM; i++)
460                 rsa_key[i]=NULL;
461 #endif
462
463         if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
464                 {
465                 BIO_printf(bio_err,"out of memory\n");
466                 goto end;
467                 }
468 #ifndef OPENSSL_NO_DES
469         buf_as_des_cblock = (des_cblock *)buf;
470 #endif
471         if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
472                 {
473                 BIO_printf(bio_err,"out of memory\n");
474                 goto end;
475                 }
476
477         memset(c,0,sizeof(c));
478         memset(iv,0,sizeof(iv));
479
480         for (i=0; i<ALGOR_NUM; i++)
481                 doit[i]=0;
482         for (i=0; i<RSA_NUM; i++)
483                 rsa_doit[i]=0;
484         for (i=0; i<DSA_NUM; i++)
485                 dsa_doit[i]=0;
486         
487         j=0;
488         argc--;
489         argv++;
490         while (argc)
491                 {
492                 if      ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
493                         {
494                         usertime = 0;
495                         j--;    /* Otherwise, -elapsed gets confused with
496                                    an algorithm. */
497                         }
498                 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
499                         {
500                         argc--;
501                         argv++;
502                         if(argc == 0)
503                                 {
504                                 BIO_printf(bio_err,"no EVP given\n");
505                                 goto end;
506                                 }
507                         evp=EVP_get_cipherbyname(*argv);
508                         if(!evp)
509                                 {
510                                 BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
511                                 goto end;
512                                 }
513                         doit[D_EVP]=1;
514                         }
515                 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
516                         {
517                         decrypt=1;
518                         j--;    /* Otherwise, -elapsed gets confused with
519                                    an algorithm. */
520                         }
521                 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
522                         {
523                         argc--;
524                         argv++;
525                         if(argc == 0)
526                                 {
527                                 BIO_printf(bio_err,"no engine given\n");
528                                 goto end;
529                                 }
530                         e = setup_engine(bio_err, *argv, 0);
531                         /* j will be increased again further down.  We just
532                            don't want speed to confuse an engine with an
533                            algorithm, especially when none is given (which
534                            means all of them should be run) */
535                         j--;
536                         }
537                 else
538 #ifndef OPENSSL_NO_MD2
539                 if      (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
540                 else
541 #endif
542 #ifndef OPENSSL_NO_MDC2
543                         if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
544                 else
545 #endif
546 #ifndef OPENSSL_NO_MD4
547                         if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
548                 else
549 #endif
550 #ifndef OPENSSL_NO_MD5
551                         if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
552                 else
553 #endif
554 #ifndef OPENSSL_NO_MD5
555                         if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
556                 else
557 #endif
558 #ifndef OPENSSL_NO_SHA
559                         if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
560                 else
561                         if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
562                 else
563 #endif
564 #ifndef OPENSSL_NO_RIPEMD
565                         if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
566                 else
567                         if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
568                 else
569                         if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
570                 else
571 #endif
572 #ifndef OPENSSL_NO_RC4
573                         if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
574                 else 
575 #endif
576 #ifndef OPENSSL_NO_DES
577                         if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
578                 else    if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
579                 else
580 #endif
581 #ifndef OPENSSL_NO_RSA
582 #if 0 /* was: #ifdef RSAref */
583                         if (strcmp(*argv,"rsaref") == 0) 
584                         {
585                         RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
586                         j--;
587                         }
588                 else
589 #endif
590 #ifndef RSA_NULL
591                         if (strcmp(*argv,"openssl") == 0) 
592                         {
593                         RSA_set_default_method(RSA_PKCS1_SSLeay());
594                         j--;
595                         }
596                 else
597 #endif
598 #endif /* !OPENSSL_NO_RSA */
599                      if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
600                 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
601                 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
602                 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
603                 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
604                 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
605                 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
606                 else
607 #ifndef OPENSSL_NO_RC2
608                      if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
609                 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
610                 else
611 #endif
612 #ifndef OPENSSL_NO_RC5
613                      if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
614                 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
615                 else
616 #endif
617 #ifndef OPENSSL_NO_IDEA
618                      if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
619                 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
620                 else
621 #endif
622 #ifndef OPENSSL_NO_BF
623                      if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
624                 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
625                 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
626                 else
627 #endif
628 #ifndef OPENSSL_NO_CAST
629                      if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
630                 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
631                 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
632                 else
633 #endif
634 #ifndef OPENSSL_NO_DES
635                         if (strcmp(*argv,"des") == 0)
636                         {
637                         doit[D_CBC_DES]=1;
638                         doit[D_EDE3_DES]=1;
639                         }
640                 else
641 #endif
642 #ifndef OPENSSL_NO_RSA
643                         if (strcmp(*argv,"rsa") == 0)
644                         {
645                         rsa_doit[R_RSA_512]=1;
646                         rsa_doit[R_RSA_1024]=1;
647                         rsa_doit[R_RSA_2048]=1;
648                         rsa_doit[R_RSA_4096]=1;
649                         }
650                 else
651 #endif
652 #ifndef OPENSSL_NO_DSA
653                         if (strcmp(*argv,"dsa") == 0)
654                         {
655                         dsa_doit[R_DSA_512]=1;
656                         dsa_doit[R_DSA_1024]=1;
657                         }
658                 else
659 #endif
660                         {
661                         BIO_printf(bio_err,"Error: bad option or value\n");
662                         BIO_printf(bio_err,"\n");
663                         BIO_printf(bio_err,"Available values:\n");
664 #ifndef OPENSSL_NO_MD2
665                         BIO_printf(bio_err,"md2      ");
666 #endif
667 #ifndef OPENSSL_NO_MDC2
668                         BIO_printf(bio_err,"mdc2     ");
669 #endif
670 #ifndef OPENSSL_NO_MD4
671                         BIO_printf(bio_err,"md4      ");
672 #endif
673 #ifndef OPENSSL_NO_MD5
674                         BIO_printf(bio_err,"md5      ");
675 #ifndef OPENSSL_NO_HMAC
676                         BIO_printf(bio_err,"hmac     ");
677 #endif
678 #endif
679 #ifndef OPENSSL_NO_SHA1
680                         BIO_printf(bio_err,"sha1     ");
681 #endif
682 #ifndef OPENSSL_NO_RIPEMD160
683                         BIO_printf(bio_err,"rmd160");
684 #endif
685 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
686     !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
687     !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
688                         BIO_printf(bio_err,"\n");
689 #endif
690
691 #ifndef OPENSSL_NO_IDEA
692                         BIO_printf(bio_err,"idea-cbc ");
693 #endif
694 #ifndef OPENSSL_NO_RC2
695                         BIO_printf(bio_err,"rc2-cbc  ");
696 #endif
697 #ifndef OPENSSL_NO_RC5
698                         BIO_printf(bio_err,"rc5-cbc  ");
699 #endif
700 #ifndef OPENSSL_NO_BF
701                         BIO_printf(bio_err,"bf-cbc");
702 #endif
703 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
704     !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
705                         BIO_printf(bio_err,"\n");
706 #endif
707
708                         BIO_printf(bio_err,"des-cbc  des-ede3 ");
709 #ifndef OPENSSL_NO_RC4
710                         BIO_printf(bio_err,"rc4");
711 #endif
712                         BIO_printf(bio_err,"\n");
713
714 #ifndef OPENSSL_NO_RSA
715                         BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
716 #endif
717
718 #ifndef OPENSSL_NO_DSA
719                         BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
720 #endif
721
722 #ifndef OPENSSL_NO_IDEA
723                         BIO_printf(bio_err,"idea     ");
724 #endif
725 #ifndef OPENSSL_NO_RC2
726                         BIO_printf(bio_err,"rc2      ");
727 #endif
728 #ifndef OPENSSL_NO_DES
729                         BIO_printf(bio_err,"des      ");
730 #endif
731 #ifndef OPENSSL_NO_RSA
732                         BIO_printf(bio_err,"rsa      ");
733 #endif
734 #ifndef OPENSSL_NO_BF
735                         BIO_printf(bio_err,"blowfish");
736 #endif
737 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
738     !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
739     !defined(OPENSSL_NO_BF)
740                         BIO_printf(bio_err,"\n");
741 #endif
742
743                         BIO_printf(bio_err,"\n");
744                         BIO_printf(bio_err,"Available options:\n");
745 #ifdef TIMES
746                         BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
747 #endif
748                         BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
749                         goto end;
750                         }
751                 argc--;
752                 argv++;
753                 j++;
754                 }
755
756         if (j == 0)
757                 {
758                 for (i=0; i<ALGOR_NUM; i++)
759                         {
760                         if (i != D_EVP)
761                                 doit[i]=1;
762                         }
763                 for (i=0; i<RSA_NUM; i++)
764                         rsa_doit[i]=1;
765                 for (i=0; i<DSA_NUM; i++)
766                         dsa_doit[i]=1;
767                 }
768         for (i=0; i<ALGOR_NUM; i++)
769                 if (doit[i]) pr_header++;
770
771         if (usertime == 0)
772                 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
773         if (usertime <= 0)
774                 {
775                 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
776                 BIO_printf(bio_err,"program when this computer is idle.\n");
777                 }
778
779 #ifndef OPENSSL_NO_RSA
780         for (i=0; i<RSA_NUM; i++)
781                 {
782                 const unsigned char *p;
783
784                 p=rsa_data[i];
785                 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
786                 if (rsa_key[i] == NULL)
787                         {
788                         BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
789                         goto end;
790                         }
791 #if 0
792                 else
793                         {
794                         BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
795                         BN_print(bio_err,rsa_key[i]->e);
796                         BIO_printf(bio_err,"\n");
797                         }
798 #endif
799                 }
800 #endif
801
802 #ifndef OPENSSL_NO_DSA
803         dsa_key[0]=get_dsa512();
804         dsa_key[1]=get_dsa1024();
805         dsa_key[2]=get_dsa2048();
806 #endif
807
808 #ifndef OPENSSL_NO_DES
809         DES_set_key_unchecked(&key,&sch);
810         DES_set_key_unchecked(&key2,&sch2);
811         DES_set_key_unchecked(&key3,&sch3);
812 #endif
813 #ifndef OPENSSL_NO_IDEA
814         idea_set_encrypt_key(key16,&idea_ks);
815 #endif
816 #ifndef OPENSSL_NO_RC4
817         RC4_set_key(&rc4_ks,16,key16);
818 #endif
819 #ifndef OPENSSL_NO_RC2
820         RC2_set_key(&rc2_ks,16,key16,128);
821 #endif
822 #ifndef OPENSSL_NO_RC5
823         RC5_32_set_key(&rc5_ks,16,key16,12);
824 #endif
825 #ifndef OPENSSL_NO_BF
826         BF_set_key(&bf_ks,16,key16);
827 #endif
828 #ifndef OPENSSL_NO_CAST
829         CAST_set_key(&cast_ks,16,key16);
830 #endif
831 #ifndef OPENSSL_NO_RSA
832         memset(rsa_c,0,sizeof(rsa_c));
833 #endif
834 #ifndef SIGALRM
835 #ifndef OPENSSL_NO_DES
836         BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
837         count=10;
838         do      {
839                 long i;
840                 count*=2;
841                 Time_F(START,usertime);
842                 for (i=count; i; i--)
843                         des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
844                                 &sch,DES_ENCRYPT);
845                 d=Time_F(STOP,usertime);
846                 } while (d <3);
847         save_count=count;
848         c[D_MD2][0]=count/10;
849         c[D_MDC2][0]=count/10;
850         c[D_MD4][0]=count;
851         c[D_MD5][0]=count;
852         c[D_HMAC][0]=count;
853         c[D_SHA1][0]=count;
854         c[D_RMD160][0]=count;
855         c[D_RC4][0]=count*5;
856         c[D_CBC_DES][0]=count;
857         c[D_EDE3_DES][0]=count/3;
858         c[D_CBC_IDEA][0]=count;
859         c[D_CBC_RC2][0]=count;
860         c[D_CBC_RC5][0]=count;
861         c[D_CBC_BF][0]=count;
862         c[D_CBC_CAST][0]=count;
863
864         for (i=1; i<SIZE_NUM; i++)
865                 {
866                 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
867                 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
868                 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
869                 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
870                 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
871                 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
872                 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
873                 }
874         for (i=1; i<SIZE_NUM; i++)
875                 {
876                 long l0,l1;
877
878                 l0=(long)lengths[i-1];
879                 l1=(long)lengths[i];
880                 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
881                 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
882                 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
883                 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
884                 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
885                 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
886                 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
887                 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
888                 }
889 #ifndef OPENSSL_NO_RSA
890         rsa_c[R_RSA_512][0]=count/2000;
891         rsa_c[R_RSA_512][1]=count/400;
892         for (i=1; i<RSA_NUM; i++)
893                 {
894                 rsa_c[i][0]=rsa_c[i-1][0]/8;
895                 rsa_c[i][1]=rsa_c[i-1][1]/4;
896                 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
897                         rsa_doit[i]=0;
898                 else
899                         {
900                         if (rsa_c[i][0] == 0)
901                                 {
902                                 rsa_c[i][0]=1;
903                                 rsa_c[i][1]=20;
904                                 }
905                         }                               
906                 }
907 #endif
908
909 #ifndef OPENSSL_NO_DSA
910         dsa_c[R_DSA_512][0]=count/1000;
911         dsa_c[R_DSA_512][1]=count/1000/2;
912         for (i=1; i<DSA_NUM; i++)
913                 {
914                 dsa_c[i][0]=dsa_c[i-1][0]/4;
915                 dsa_c[i][1]=dsa_c[i-1][1]/4;
916                 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
917                         dsa_doit[i]=0;
918                 else
919                         {
920                         if (dsa_c[i] == 0)
921                                 {
922                                 dsa_c[i][0]=1;
923                                 dsa_c[i][1]=1;
924                                 }
925                         }                               
926                 }
927 #endif
928
929 #define COND(d) (count < (d))
930 #define COUNT(d) (d)
931 #else
932 /* not worth fixing */
933 # error "You cannot disable DES on systems without SIGALRM."
934 #endif /* OPENSSL_NO_DES */
935 #else
936 #define COND(c) (run)
937 #define COUNT(d) (count)
938         signal(SIGALRM,sig_done);
939 #endif /* SIGALRM */
940
941 #ifndef OPENSSL_NO_MD2
942         if (doit[D_MD2])
943                 {
944                 for (j=0; j<SIZE_NUM; j++)
945                         {
946                         print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
947                         Time_F(START,usertime);
948                         for (count=0,run=1; COND(c[D_MD2][j]); count++)
949                                 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(), NULL);
950                         d=Time_F(STOP,usertime);
951                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
952                                 count,names[D_MD2],d);
953                         results[D_MD2][j]=((double)count)/d*lengths[j];
954                         }
955                 }
956 #endif
957 #ifndef OPENSSL_NO_MDC2
958         if (doit[D_MDC2])
959                 {
960                 for (j=0; j<SIZE_NUM; j++)
961                         {
962                         print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
963                         Time_F(START,usertime);
964                         for (count=0,run=1; COND(c[D_MDC2][j]); count++)
965                                 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(), NULL);
966                         d=Time_F(STOP,usertime);
967                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
968                                 count,names[D_MDC2],d);
969                         results[D_MDC2][j]=((double)count)/d*lengths[j];
970                         }
971                 }
972 #endif
973
974 #ifndef OPENSSL_NO_MD4
975         if (doit[D_MD4])
976                 {
977                 for (j=0; j<SIZE_NUM; j++)
978                         {
979                         print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
980                         Time_F(START,usertime);
981                         for (count=0,run=1; COND(c[D_MD4][j]); count++)
982                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(), NULL);
983                         d=Time_F(STOP,usertime);
984                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
985                                 count,names[D_MD4],d);
986                         results[D_MD4][j]=((double)count)/d*lengths[j];
987                         }
988                 }
989 #endif
990
991 #ifndef OPENSSL_NO_MD5
992         if (doit[D_MD5])
993                 {
994                 for (j=0; j<SIZE_NUM; j++)
995                         {
996                         print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
997                         Time_F(START,usertime);
998                         for (count=0,run=1; COND(c[D_MD5][j]); count++)
999                                 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,
1000                                                                                 EVP_get_digestbyname("md5"), NULL);
1001                         d=Time_F(STOP,usertime);
1002                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1003                                 count,names[D_MD5],d);
1004                         results[D_MD5][j]=((double)count)/d*lengths[j];
1005                         }
1006                 }
1007 #endif
1008
1009 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1010         if (doit[D_HMAC])
1011                 {
1012                 HMAC_CTX hctx;
1013
1014                 HMAC_CTX_init(&hctx);
1015                 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
1016                         16,EVP_md5());
1017
1018                 for (j=0; j<SIZE_NUM; j++)
1019                         {
1020                         print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1021                         Time_F(START,usertime);
1022                         for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1023                                 {
1024                                 HMAC_Init(&hctx,NULL,0,NULL);
1025                                 HMAC_Update(&hctx,buf,lengths[j]);
1026                                 HMAC_Final(&hctx,&(hmac[0]),NULL);
1027                                 }
1028                         d=Time_F(STOP,usertime);
1029                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1030                                 count,names[D_HMAC],d);
1031                         results[D_HMAC][j]=((double)count)/d*lengths[j];
1032                         }
1033                 HMAC_CTX_cleanup(&hctx);
1034                 }
1035 #endif
1036 #ifndef OPENSSL_NO_SHA
1037         if (doit[D_SHA1])
1038                 {
1039                 for (j=0; j<SIZE_NUM; j++)
1040                         {
1041                         print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1042                         Time_F(START,usertime);
1043                         for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1044                                 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(), NULL);
1045                         d=Time_F(STOP,usertime);
1046                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1047                                 count,names[D_SHA1],d);
1048                         results[D_SHA1][j]=((double)count)/d*lengths[j];
1049                         }
1050                 }
1051 #endif
1052 #ifndef OPENSSL_NO_RIPEMD
1053         if (doit[D_RMD160])
1054                 {
1055                 for (j=0; j<SIZE_NUM; j++)
1056                         {
1057                         print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1058                         Time_F(START,usertime);
1059                         for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1060                                 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(), NULL);
1061                         d=Time_F(STOP,usertime);
1062                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1063                                 count,names[D_RMD160],d);
1064                         results[D_RMD160][j]=((double)count)/d*lengths[j];
1065                         }
1066                 }
1067 #endif
1068 #ifndef OPENSSL_NO_RC4
1069         if (doit[D_RC4])
1070                 {
1071                 for (j=0; j<SIZE_NUM; j++)
1072                         {
1073                         print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1074                         Time_F(START,usertime);
1075                         for (count=0,run=1; COND(c[D_RC4][j]); count++)
1076                                 RC4(&rc4_ks,(unsigned int)lengths[j],
1077                                         buf,buf);
1078                         d=Time_F(STOP,usertime);
1079                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1080                                 count,names[D_RC4],d);
1081                         results[D_RC4][j]=((double)count)/d*lengths[j];
1082                         }
1083                 }
1084 #endif
1085 #ifndef OPENSSL_NO_DES
1086         if (doit[D_CBC_DES])
1087                 {
1088                 for (j=0; j<SIZE_NUM; j++)
1089                         {
1090                         print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1091                         Time_F(START,usertime);
1092                         for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1093                                 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1094                                                  &iv,DES_ENCRYPT);
1095                         d=Time_F(STOP,usertime);
1096                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1097                                    count,names[D_CBC_DES],d);
1098                         results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1099                         }
1100                 }
1101
1102         if (doit[D_EDE3_DES])
1103                 {
1104                 for (j=0; j<SIZE_NUM; j++)
1105                         {
1106                         print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1107                         Time_F(START,usertime);
1108                         for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1109                                 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1110                                                      &sch,&sch2,&sch3,
1111                                                      &iv,DES_ENCRYPT);
1112                         d=Time_F(STOP,usertime);
1113                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1114                                 count,names[D_EDE3_DES],d);
1115                         results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1116                         }
1117                 }
1118 #endif
1119 #ifndef OPENSSL_NO_IDEA
1120         if (doit[D_CBC_IDEA])
1121                 {
1122                 for (j=0; j<SIZE_NUM; j++)
1123                         {
1124                         print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1125                         Time_F(START,usertime);
1126                         for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1127                                 idea_cbc_encrypt(buf,buf,
1128                                         (unsigned long)lengths[j],&idea_ks,
1129                                         iv,IDEA_ENCRYPT);
1130                         d=Time_F(STOP,usertime);
1131                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1132                                 count,names[D_CBC_IDEA],d);
1133                         results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1134                         }
1135                 }
1136 #endif
1137 #ifndef OPENSSL_NO_RC2
1138         if (doit[D_CBC_RC2])
1139                 {
1140                 for (j=0; j<SIZE_NUM; j++)
1141                         {
1142                         print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1143                         Time_F(START,usertime);
1144                         for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1145                                 RC2_cbc_encrypt(buf,buf,
1146                                         (unsigned long)lengths[j],&rc2_ks,
1147                                         iv,RC2_ENCRYPT);
1148                         d=Time_F(STOP,usertime);
1149                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1150                                 count,names[D_CBC_RC2],d);
1151                         results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1152                         }
1153                 }
1154 #endif
1155 #ifndef OPENSSL_NO_RC5
1156         if (doit[D_CBC_RC5])
1157                 {
1158                 for (j=0; j<SIZE_NUM; j++)
1159                         {
1160                         print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1161                         Time_F(START,usertime);
1162                         for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1163                                 RC5_32_cbc_encrypt(buf,buf,
1164                                         (unsigned long)lengths[j],&rc5_ks,
1165                                         iv,RC5_ENCRYPT);
1166                         d=Time_F(STOP,usertime);
1167                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1168                                 count,names[D_CBC_RC5],d);
1169                         results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1170                         }
1171                 }
1172 #endif
1173 #ifndef OPENSSL_NO_BF
1174         if (doit[D_CBC_BF])
1175                 {
1176                 for (j=0; j<SIZE_NUM; j++)
1177                         {
1178                         print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1179                         Time_F(START,usertime);
1180                         for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1181                                 BF_cbc_encrypt(buf,buf,
1182                                         (unsigned long)lengths[j],&bf_ks,
1183                                         iv,BF_ENCRYPT);
1184                         d=Time_F(STOP,usertime);
1185                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1186                                 count,names[D_CBC_BF],d);
1187                         results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1188                         }
1189                 }
1190 #endif
1191 #ifndef OPENSSL_NO_CAST
1192         if (doit[D_CBC_CAST])
1193                 {
1194                 for (j=0; j<SIZE_NUM; j++)
1195                         {
1196                         print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1197                         Time_F(START,usertime);
1198                         for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1199                                 CAST_cbc_encrypt(buf,buf,
1200                                         (unsigned long)lengths[j],&cast_ks,
1201                                         iv,CAST_ENCRYPT);
1202                         d=Time_F(STOP,usertime);
1203                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1204                                 count,names[D_CBC_CAST],d);
1205                         results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1206                         }
1207                 }
1208 #endif
1209
1210         if (doit[D_EVP])
1211                 {
1212                 for (j=0; j<SIZE_NUM; j++)
1213                         {
1214                         EVP_CIPHER_CTX ctx;
1215                         int outl;
1216
1217                         names[D_EVP]=OBJ_nid2ln(evp->nid);
1218                         print_message(names[D_EVP],save_count,
1219                                                   lengths[j]);
1220                         EVP_CIPHER_CTX_init(&ctx);
1221                         if(decrypt)
1222                                 EVP_DecryptInit_ex(&ctx,evp,NULL,key16,iv);
1223                         else
1224                                 EVP_EncryptInit_ex(&ctx,evp,NULL,key16,iv);
1225                                 
1226                         Time_F(START,usertime);
1227                         if(decrypt)
1228                                 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1229                                         EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1230                         else
1231                                 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1232                                         EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1233                         if(decrypt)
1234                                 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1235                         else
1236                                 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1237                         d=Time_F(STOP,usertime);
1238                         EVP_CIPHER_CTX_cleanup(&ctx);
1239                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1240                                            count,names[D_EVP],d);
1241                         results[D_EVP][j]=((double)count)/d*lengths[j];
1242                         }
1243                 }
1244
1245         RAND_pseudo_bytes(buf,36);
1246 #ifndef OPENSSL_NO_RSA
1247         for (j=0; j<RSA_NUM; j++)
1248                 {
1249                 int ret;
1250                 if (!rsa_doit[j]) continue;
1251                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1252                 if (ret == 0)
1253                         {
1254                         BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1255                         ERR_print_errors(bio_err);
1256                         rsa_count=1;
1257                         }
1258                 else
1259                         {
1260                         pkey_print_message("private","rsa",
1261                                 rsa_c[j][0],rsa_bits[j],
1262                                 RSA_SECONDS);
1263 /*                      RSA_blinding_on(rsa_key[j],NULL); */
1264                         Time_F(START,usertime);
1265                         for (count=0,run=1; COND(rsa_c[j][0]); count++)
1266                                 {
1267                                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1268                                         &rsa_num, rsa_key[j]);
1269                                 if (ret == 0)
1270                                         {
1271                                         BIO_printf(bio_err,
1272                                                 "RSA sign failure\n");
1273                                         ERR_print_errors(bio_err);
1274                                         count=1;
1275                                         break;
1276                                         }
1277                                 }
1278                         d=Time_F(STOP,usertime);
1279                         BIO_printf(bio_err,
1280                                 "%ld %d bit private RSA's in %.2fs\n",
1281                                 count,rsa_bits[j],d);
1282                         rsa_results[j][0]=d/(double)count;
1283                         rsa_count=count;
1284                         }
1285
1286 #if 1
1287                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1288                 if (ret <= 0)
1289                         {
1290                         BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1291                         ERR_print_errors(bio_err);
1292                         rsa_doit[j] = 0;
1293                         }
1294                 else
1295                         {
1296                         pkey_print_message("public","rsa",
1297                                 rsa_c[j][1],rsa_bits[j],
1298                                 RSA_SECONDS);
1299                         Time_F(START,usertime);
1300                         for (count=0,run=1; COND(rsa_c[j][1]); count++)
1301                                 {
1302                                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1303                                         rsa_num, rsa_key[j]);
1304                                 if (ret == 0)
1305                                         {
1306                                         BIO_printf(bio_err,
1307                                                 "RSA verify failure\n");
1308                                         ERR_print_errors(bio_err);
1309                                         count=1;
1310                                         break;
1311                                         }
1312                                 }
1313                         d=Time_F(STOP,usertime);
1314                         BIO_printf(bio_err,
1315                                 "%ld %d bit public RSA's in %.2fs\n",
1316                                 count,rsa_bits[j],d);
1317                         rsa_results[j][1]=d/(double)count;
1318                         }
1319 #endif
1320
1321                 if (rsa_count <= 1)
1322                         {
1323                         /* if longer than 10s, don't do any more */
1324                         for (j++; j<RSA_NUM; j++)
1325                                 rsa_doit[j]=0;
1326                         }
1327                 }
1328 #endif
1329
1330         RAND_pseudo_bytes(buf,20);
1331 #ifndef OPENSSL_NO_DSA
1332         if (RAND_status() != 1)
1333                 {
1334                 RAND_seed(rnd_seed, sizeof rnd_seed);
1335                 rnd_fake = 1;
1336                 }
1337         for (j=0; j<DSA_NUM; j++)
1338                 {
1339                 unsigned int kk;
1340                 int ret;
1341
1342                 if (!dsa_doit[j]) continue;
1343 /*              DSA_generate_key(dsa_key[j]); */
1344 /*              DSA_sign_setup(dsa_key[j],NULL); */
1345                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1346                         &kk,dsa_key[j]);
1347                 if (ret == 0)
1348                         {
1349                         BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1350                         ERR_print_errors(bio_err);
1351                         rsa_count=1;
1352                         }
1353                 else
1354                         {
1355                         pkey_print_message("sign","dsa",
1356                                 dsa_c[j][0],dsa_bits[j],
1357                                 DSA_SECONDS);
1358                         Time_F(START,usertime);
1359                         for (count=0,run=1; COND(dsa_c[j][0]); count++)
1360                                 {
1361                                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1362                                         &kk,dsa_key[j]);
1363                                 if (ret == 0)
1364                                         {
1365                                         BIO_printf(bio_err,
1366                                                 "DSA sign failure\n");
1367                                         ERR_print_errors(bio_err);
1368                                         count=1;
1369                                         break;
1370                                         }
1371                                 }
1372                         d=Time_F(STOP,usertime);
1373                         BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1374                                 count,dsa_bits[j],d);
1375                         dsa_results[j][0]=d/(double)count;
1376                         rsa_count=count;
1377                         }
1378
1379                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1380                         kk,dsa_key[j]);
1381                 if (ret <= 0)
1382                         {
1383                         BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1384                         ERR_print_errors(bio_err);
1385                         dsa_doit[j] = 0;
1386                         }
1387                 else
1388                         {
1389                         pkey_print_message("verify","dsa",
1390                                 dsa_c[j][1],dsa_bits[j],
1391                                 DSA_SECONDS);
1392                         Time_F(START,usertime);
1393                         for (count=0,run=1; COND(dsa_c[j][1]); count++)
1394                                 {
1395                                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1396                                         kk,dsa_key[j]);
1397                                 if (ret <= 0)
1398                                         {
1399                                         BIO_printf(bio_err,
1400                                                 "DSA verify failure\n");
1401                                         ERR_print_errors(bio_err);
1402                                         count=1;
1403                                         break;
1404                                         }
1405                                 }
1406                         d=Time_F(STOP,usertime);
1407                         BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1408                                 count,dsa_bits[j],d);
1409                         dsa_results[j][1]=d/(double)count;
1410                         }
1411
1412                 if (rsa_count <= 1)
1413                         {
1414                         /* if longer than 10s, don't do any more */
1415                         for (j++; j<DSA_NUM; j++)
1416                                 dsa_doit[j]=0;
1417                         }
1418                 }
1419         if (rnd_fake) RAND_cleanup();
1420 #endif
1421
1422         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1423         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1424         printf("options:");
1425         printf("%s ",BN_options());
1426 #ifndef OPENSSL_NO_MD2
1427         printf("%s ",MD2_options());
1428 #endif
1429 #ifndef OPENSSL_NO_RC4
1430         printf("%s ",RC4_options());
1431 #endif
1432 #ifndef OPENSSL_NO_DES
1433         printf("%s ",des_options());
1434 #endif
1435 #ifndef OPENSSL_NO_IDEA
1436         printf("%s ",idea_options());
1437 #endif
1438 #ifndef OPENSSL_NO_BF
1439         printf("%s ",BF_options());
1440 #endif
1441         fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1442         printf("available timing options: ");
1443 #ifdef TIMES
1444         printf("TIMES ");
1445 #endif
1446 #ifdef TIMEB
1447         printf("TIMEB ");
1448 #endif
1449 #ifdef USE_TOD
1450         printf("USE_TOD ");
1451 #endif
1452 #ifdef HZ
1453 #define as_string(s) (#s)
1454         printf("HZ=%g", HZ);
1455 # ifdef _SC_CLK_TCK
1456         printf(" [sysconf value]");
1457 # endif
1458 #endif
1459         printf("\n");
1460         printf("timing function used: %s%s%s%s%s%s%s\n",
1461                 (ftime_used ? "ftime" : ""),
1462                 (ftime_used + times_used > 1 ? "," : ""),
1463                 (times_used ? "times" : ""),
1464                 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1465                 (gettimeofday_used ? "gettimeofday" : ""),
1466                 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1467                 (getrusage_used ? "getrusage" : ""));
1468
1469
1470         if (pr_header)
1471                 {
1472                 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 
1473                 fprintf(stdout,"type        ");
1474                 for (j=0;  j<SIZE_NUM; j++)
1475                         fprintf(stdout,"%7d bytes",lengths[j]);
1476                 fprintf(stdout,"\n");
1477                 }
1478
1479         for (k=0; k<ALGOR_NUM; k++)
1480                 {
1481                 if (!doit[k]) continue;
1482                 fprintf(stdout,"%-13s",names[k]);
1483                 for (j=0; j<SIZE_NUM; j++)
1484                         {
1485                         if (results[k][j] > 10000)
1486                                 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1487                         else
1488                                 fprintf(stdout," %11.2f ",results[k][j]);
1489                         }
1490                 fprintf(stdout,"\n");
1491                 }
1492 #ifndef OPENSSL_NO_RSA
1493         j=1;
1494         for (k=0; k<RSA_NUM; k++)
1495                 {
1496                 if (!rsa_doit[k]) continue;
1497                 if (j)
1498                         {
1499                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1500                         j=0;
1501                         }
1502                 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1503                         rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1504                         1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1505                 fprintf(stdout,"\n");
1506                 }
1507 #endif
1508 #ifndef OPENSSL_NO_DSA
1509         j=1;
1510         for (k=0; k<DSA_NUM; k++)
1511                 {
1512                 if (!dsa_doit[k]) continue;
1513                 if (j)  {
1514                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1515                         j=0;
1516                         }
1517                 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1518                         dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1519                         1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1520                 fprintf(stdout,"\n");
1521                 }
1522 #endif
1523         mret=0;
1524 end:
1525         ERR_print_errors(bio_err);
1526         if (buf != NULL) OPENSSL_free(buf);
1527         if (buf2 != NULL) OPENSSL_free(buf2);
1528 #ifndef OPENSSL_NO_RSA
1529         for (i=0; i<RSA_NUM; i++)
1530                 if (rsa_key[i] != NULL)
1531                         RSA_free(rsa_key[i]);
1532 #endif
1533 #ifndef OPENSSL_NO_DSA
1534         for (i=0; i<DSA_NUM; i++)
1535                 if (dsa_key[i] != NULL)
1536                         DSA_free(dsa_key[i]);
1537 #endif
1538         apps_shutdown();
1539         EXIT(mret);
1540         }
1541
1542 static void print_message(const char *s, long num, int length)
1543         {
1544 #ifdef SIGALRM
1545         BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1546         (void)BIO_flush(bio_err);
1547         alarm(SECONDS);
1548 #else
1549         BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1550         (void)BIO_flush(bio_err);
1551 #endif
1552 #ifdef LINT
1553         num=num;
1554 #endif
1555         }
1556
1557 static void pkey_print_message(char *str, char *str2, long num, int bits,
1558              int tm)
1559         {
1560 #ifdef SIGALRM
1561         BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1562         (void)BIO_flush(bio_err);
1563         alarm(RSA_SECONDS);
1564 #else
1565         BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1566         (void)BIO_flush(bio_err);
1567 #endif
1568 #ifdef LINT
1569         num=num;
1570 #endif
1571         }
1572