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