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