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