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