The consequence of constification is that to pass the address to a
[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 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
86 #if defined(__FreeBSD__)
87 # define USE_TOD
88 #elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
89 # define TIMES
90 #endif
91 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE) && !defined(__NetBSD__)
92 # define TIMEB
93 #endif
94
95 #ifndef _IRIX
96 # include <time.h>
97 #endif
98 #ifdef TIMES
99 # include <sys/types.h>
100 # include <sys/times.h>
101 #endif
102 #ifdef USE_TOD
103 # include <sys/time.h>
104 # include <sys/resource.h>
105 #endif
106
107 /* Depending on the VMS version, the tms structure is perhaps defined.
108    The __TMS macro will show if it was.  If it wasn't defined, we should
109    undefine TIMES, since that tells the rest of the program how things
110    should be handled.                           -- Richard Levitte */
111 #if defined(VMS) && defined(__DECC) && !defined(__TMS)
112 #undef TIMES
113 #endif
114
115 #ifdef TIMEB
116 #include <sys/timeb.h>
117 #endif
118
119 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
120 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
121 #endif
122
123 #if defined(sun) || defined(__ultrix)
124 #define _POSIX_SOURCE
125 #include <limits.h>
126 #include <sys/param.h>
127 #endif
128
129 #ifndef NO_DES
130 #include <openssl/des.h>
131 #endif
132 #ifndef NO_MD2
133 #include <openssl/md2.h>
134 #endif
135 #ifndef NO_MDC2
136 #include <openssl/mdc2.h>
137 #endif
138 #ifndef NO_MD4
139 #include <openssl/md4.h>
140 #endif
141 #ifndef NO_MD5
142 #include <openssl/md5.h>
143 #endif
144 #ifndef NO_HMAC
145 #include <openssl/hmac.h>
146 #endif
147 #include <openssl/evp.h>
148 #ifndef NO_SHA
149 #include <openssl/sha.h>
150 #endif
151 #ifndef NO_RIPEMD
152 #include <openssl/ripemd.h>
153 #endif
154 #ifndef NO_RC4
155 #include <openssl/rc4.h>
156 #endif
157 #ifndef NO_RC5
158 #include <openssl/rc5.h>
159 #endif
160 #ifndef NO_RC2
161 #include <openssl/rc2.h>
162 #endif
163 #ifndef NO_IDEA
164 #include <openssl/idea.h>
165 #endif
166 #ifndef NO_BF
167 #include <openssl/blowfish.h>
168 #endif
169 #ifndef NO_CAST
170 #include <openssl/cast.h>
171 #endif
172 #ifndef NO_RSA
173 #include <openssl/rsa.h>
174 #include "./testrsa.h"
175 #endif
176 #include <openssl/x509.h>
177 #ifndef NO_DSA
178 #include "./testdsa.h"
179 #endif
180
181 /* The following if from times(3) man page.  It may need to be changed */
182 #ifndef HZ
183 # ifndef CLK_TCK
184 #  ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
185 #   define HZ   100.0
186 #  else /* _BSD_CLK_TCK_ */
187 #   define HZ ((double)_BSD_CLK_TCK_)
188 #  endif
189 # else /* CLK_TCK */
190 #  define HZ ((double)CLK_TCK)
191 # endif
192 #endif
193
194 #undef BUFSIZE
195 #define BUFSIZE ((long)1024*8+1)
196 int run=0;
197
198 static double Time_F(int s, int usertime);
199 static void print_message(char *s,long num,int length);
200 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
201 #ifdef SIGALRM
202 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
203 #define SIGRETTYPE void
204 #else
205 #define SIGRETTYPE int
206 #endif 
207
208 static SIGRETTYPE sig_done(int sig);
209 static SIGRETTYPE sig_done(int sig)
210         {
211         signal(SIGALRM,sig_done);
212         run=0;
213 #ifdef LINT
214         sig=sig;
215 #endif
216         }
217 #endif
218
219 #define START   0
220 #define STOP    1
221
222 static double Time_F(int s, int usertime)
223         {
224         double ret;
225
226 #ifdef USE_TOD
227         if(usertime)
228             {
229                 static struct rusage tstart,tend;
230
231                 if (s == START)
232                         {
233                         getrusage(RUSAGE_SELF,&tstart);
234                         return(0);
235                         }
236                 else
237                         {
238                         long i;
239
240                         getrusage(RUSAGE_SELF,&tend);
241                         i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
242                         ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
243                           +((double)i)/1000000.0;
244                         return((ret < 0.001)?0.001:ret);
245                         }
246                 }
247         else
248                 {
249                 static struct timeval tstart,tend;
250                 long i;
251
252                 if (s == START)
253                         {
254                         gettimeofday(&tstart,NULL);
255                         return(0);
256                         }
257                 else
258                         {
259                         gettimeofday(&tend,NULL);
260                         i=(long)tend.tv_usec-(long)tstart.tv_usec;
261                         ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
262                         return((ret < 0.001)?0.001:ret);
263                         }
264                 }
265 #else  /* ndef USE_TOD */
266                 
267 # ifdef TIMES
268         if (usertime)
269                 {
270                 static struct tms tstart,tend;
271
272                 if (s == START)
273                         {
274                         times(&tstart);
275                         return(0);
276                         }
277                 else
278                         {
279                         times(&tend);
280                         ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
281                         return((ret < 1e-3)?1e-3:ret);
282                         }
283                 }
284 # endif /* times() */
285 # if defined(TIMES) && defined(TIMEB)
286         else
287 # endif
288 # ifdef TIMEB
289                 {
290                 static struct timeb tstart,tend;
291                 long i;
292
293                 if (s == START)
294                         {
295                         ftime(&tstart);
296                         return(0);
297                         }
298                 else
299                         {
300                         ftime(&tend);
301                         i=(long)tend.millitm-(long)tstart.millitm;
302                         ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
303                         return((ret < 0.001)?0.001:ret);
304                         }
305                 }
306 # endif
307 #endif
308         }
309
310 int MAIN(int, char **);
311
312 int MAIN(int argc, char **argv)
313         {
314         ENGINE *e;
315         unsigned char *buf=NULL,*buf2=NULL;
316         int mret=1;
317 #define ALGOR_NUM       15
318 #define SIZE_NUM        5
319 #define RSA_NUM         4
320 #define DSA_NUM         3
321         long count,rsa_count;
322         int i,j,k;
323         unsigned rsa_num;
324 #ifndef NO_MD2
325         unsigned char md2[MD2_DIGEST_LENGTH];
326 #endif
327 #ifndef NO_MDC2
328         unsigned char mdc2[MDC2_DIGEST_LENGTH];
329 #endif
330 #ifndef NO_MD4
331         unsigned char md4[MD4_DIGEST_LENGTH];
332 #endif
333 #ifndef NO_MD5
334         unsigned char md5[MD5_DIGEST_LENGTH];
335         unsigned char hmac[MD5_DIGEST_LENGTH];
336 #endif
337 #ifndef NO_SHA
338         unsigned char sha[SHA_DIGEST_LENGTH];
339 #endif
340 #ifndef NO_RIPEMD
341         unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
342 #endif
343 #ifndef NO_RC4
344         RC4_KEY rc4_ks;
345 #endif
346 #ifndef NO_RC5
347         RC5_32_KEY rc5_ks;
348 #endif
349 #ifndef NO_RC2
350         RC2_KEY rc2_ks;
351 #endif
352 #ifndef NO_IDEA
353         IDEA_KEY_SCHEDULE idea_ks;
354 #endif
355 #ifndef NO_BF
356         BF_KEY bf_ks;
357 #endif
358 #ifndef NO_CAST
359         CAST_KEY cast_ks;
360 #endif
361         static unsigned char key16[16]=
362                 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
363                  0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
364         unsigned char iv[8];
365 #ifndef NO_DES
366         des_cblock *buf_as_des_cblock = NULL;
367         static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
368         static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
369         static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
370         des_key_schedule sch,sch2,sch3;
371 #endif
372 #define D_MD2           0
373 #define D_MDC2          1
374 #define D_MD4           2
375 #define D_MD5           3
376 #define D_HMAC          4
377 #define D_SHA1          5
378 #define D_RMD160        6
379 #define D_RC4           7
380 #define D_CBC_DES       8
381 #define D_EDE3_DES      9
382 #define D_CBC_IDEA      10
383 #define D_CBC_RC2       11
384 #define D_CBC_RC5       12
385 #define D_CBC_BF        13
386 #define D_CBC_CAST      14
387         double d,results[ALGOR_NUM][SIZE_NUM];
388         static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
389         long c[ALGOR_NUM][SIZE_NUM];
390         static char *names[ALGOR_NUM]={
391                 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
392                 "des cbc","des ede3","idea cbc",
393                 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
394 #define R_DSA_512       0
395 #define R_DSA_1024      1
396 #define R_DSA_2048      2
397 #define R_RSA_512       0
398 #define R_RSA_1024      1
399 #define R_RSA_2048      2
400 #define R_RSA_4096      3
401 #ifndef NO_RSA
402         RSA *rsa_key[RSA_NUM];
403         long rsa_c[RSA_NUM][2];
404         double rsa_results[RSA_NUM][2];
405         static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
406         static unsigned char *rsa_data[RSA_NUM]=
407                 {test512,test1024,test2048,test4096};
408         static int rsa_data_length[RSA_NUM]={
409                 sizeof(test512),sizeof(test1024),
410                 sizeof(test2048),sizeof(test4096)};
411 #endif
412 #ifndef NO_DSA
413         DSA *dsa_key[DSA_NUM];
414         long dsa_c[DSA_NUM][2];
415         double dsa_results[DSA_NUM][2];
416         static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
417 #endif
418         int rsa_doit[RSA_NUM];
419         int dsa_doit[DSA_NUM];
420         int doit[ALGOR_NUM];
421         int pr_header=0;
422         int usertime=1;
423
424 #ifndef TIMES
425         usertime=-1;
426 #endif
427
428         apps_startup();
429         memset(results, 0, sizeof(results));
430 #ifndef NO_DSA
431         memset(dsa_key,0,sizeof(dsa_key));
432 #endif
433
434         if (bio_err == NULL)
435                 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
436                         BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
437
438 #ifndef NO_RSA
439         memset(rsa_key,0,sizeof(rsa_key));
440         for (i=0; i<RSA_NUM; i++)
441                 rsa_key[i]=NULL;
442 #endif
443
444         if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
445                 {
446                 BIO_printf(bio_err,"out of memory\n");
447                 goto end;
448                 }
449 #ifndef NO_DES
450         buf_as_des_cblock = (des_cblock *)buf;
451 #endif
452         if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
453                 {
454                 BIO_printf(bio_err,"out of memory\n");
455                 goto end;
456                 }
457
458         memset(c,0,sizeof(c));
459         memset(iv,0,sizeof(iv));
460
461         for (i=0; i<ALGOR_NUM; i++)
462                 doit[i]=0;
463         for (i=0; i<RSA_NUM; i++)
464                 rsa_doit[i]=0;
465         for (i=0; i<DSA_NUM; i++)
466                 dsa_doit[i]=0;
467         
468         j=0;
469         argc--;
470         argv++;
471         while (argc)
472                 {
473                 if      ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
474                         usertime = 0;
475                 else
476                 if      ((argc > 0) && (strcmp(*argv,"-engine") == 0))
477                         {
478                         argc--;
479                         argv++;
480                         if(argc == 0)
481                                 {
482                                 BIO_printf(bio_err,"no engine given\n");
483                                 goto end;
484                                 }
485                         if((e = ENGINE_by_id(*argv)) == NULL)
486                                 {
487                                 BIO_printf(bio_err,"invalid engine \"%s\"\n",
488                                         *argv);
489                                 goto end;
490                                 }
491                         if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
492                                 {
493                                 BIO_printf(bio_err,"can't use that engine\n");
494                                 goto end;
495                                 }
496                         BIO_printf(bio_err,"engine \"%s\" set.\n", *argv);
497                         /* Free our "structural" reference. */
498                         ENGINE_free(e);
499                         /* It will be increased again further down.  We just
500                            don't want speed to confuse an engine with an
501                            algorithm, especially when none is given (which
502                            means all of them should be run) */
503                         j--;
504                         }
505                 else
506 #ifndef NO_MD2
507                 if      (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
508                 else
509 #endif
510 #ifndef NO_MDC2
511                         if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
512                 else
513 #endif
514 #ifndef NO_MD4
515                         if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
516                 else
517 #endif
518 #ifndef NO_MD5
519                         if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
520                 else
521 #endif
522 #ifndef NO_MD5
523                         if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
524                 else
525 #endif
526 #ifndef NO_SHA
527                         if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
528                 else
529                         if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
530                 else
531 #endif
532 #ifndef NO_RIPEMD
533                         if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
534                 else
535                         if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
536                 else
537                         if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
538                 else
539 #endif
540 #ifndef NO_RC4
541                         if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
542                 else 
543 #endif
544 #ifndef NO_DES
545                         if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
546                 else    if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
547                 else
548 #endif
549 #ifndef NO_RSA
550 #ifdef RSAref
551                         if (strcmp(*argv,"rsaref") == 0) 
552                         {
553                         RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
554                         j--;
555                         }
556                 else
557 #endif
558 #ifndef RSA_NULL
559                         if (strcmp(*argv,"openssl") == 0) 
560                         {
561                         RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
562                         j--;
563                         }
564                 else
565 #endif
566 #endif /* !NO_RSA */
567                      if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
568                 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
569                 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
570                 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
571                 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
572                 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
573                 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
574                 else
575 #ifndef NO_RC2
576                      if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
577                 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
578                 else
579 #endif
580 #ifndef NO_RC5
581                      if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
582                 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
583                 else
584 #endif
585 #ifndef NO_IDEA
586                      if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
587                 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
588                 else
589 #endif
590 #ifndef NO_BF
591                      if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
592                 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
593                 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
594                 else
595 #endif
596 #ifndef NO_CAST
597                      if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
598                 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
599                 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
600                 else
601 #endif
602 #ifndef NO_DES
603                         if (strcmp(*argv,"des") == 0)
604                         {
605                         doit[D_CBC_DES]=1;
606                         doit[D_EDE3_DES]=1;
607                         }
608                 else
609 #endif
610 #ifndef NO_RSA
611                         if (strcmp(*argv,"rsa") == 0)
612                         {
613                         rsa_doit[R_RSA_512]=1;
614                         rsa_doit[R_RSA_1024]=1;
615                         rsa_doit[R_RSA_2048]=1;
616                         rsa_doit[R_RSA_4096]=1;
617                         }
618                 else
619 #endif
620 #ifndef NO_DSA
621                         if (strcmp(*argv,"dsa") == 0)
622                         {
623                         dsa_doit[R_DSA_512]=1;
624                         dsa_doit[R_DSA_1024]=1;
625                         }
626                 else
627 #endif
628                         {
629                         BIO_printf(bio_err,"Error: bad option or value\n");
630                         BIO_printf(bio_err,"\n");
631                         BIO_printf(bio_err,"Available values:\n");
632 #ifndef NO_MD2
633                         BIO_printf(bio_err,"md2      ");
634 #endif
635 #ifndef NO_MDC2
636                         BIO_printf(bio_err,"mdc2     ");
637 #endif
638 #ifndef NO_MD4
639                         BIO_printf(bio_err,"md4      ");
640 #endif
641 #ifndef NO_MD5
642                         BIO_printf(bio_err,"md5      ");
643 #ifndef NO_HMAC
644                         BIO_printf(bio_err,"hmac     ");
645 #endif
646 #endif
647 #ifndef NO_SHA1
648                         BIO_printf(bio_err,"sha1     ");
649 #endif
650 #ifndef NO_RIPEMD160
651                         BIO_printf(bio_err,"rmd160");
652 #endif
653 #if !defined(NO_MD2) || !defined(NO_MDC2) || !defined(NO_MD4) || !defined(NO_MD5) || !defined(NO_SHA1) || !defined(NO_RIPEMD160)
654                         BIO_printf(bio_err,"\n");
655 #endif
656
657 #ifndef NO_IDEA
658                         BIO_printf(bio_err,"idea-cbc ");
659 #endif
660 #ifndef NO_RC2
661                         BIO_printf(bio_err,"rc2-cbc  ");
662 #endif
663 #ifndef NO_RC5
664                         BIO_printf(bio_err,"rc5-cbc  ");
665 #endif
666 #ifndef NO_BF
667                         BIO_printf(bio_err,"bf-cbc");
668 #endif
669 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_BF) || !defined(NO_RC5)
670                         BIO_printf(bio_err,"\n");
671 #endif
672
673                         BIO_printf(bio_err,"des-cbc  des-ede3 ");
674 #ifndef NO_RC4
675                         BIO_printf(bio_err,"rc4");
676 #endif
677                         BIO_printf(bio_err,"\n");
678
679 #ifndef NO_RSA
680                         BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
681 #endif
682
683 #ifndef NO_DSA
684                         BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
685 #endif
686
687 #ifndef NO_IDEA
688                         BIO_printf(bio_err,"idea     ");
689 #endif
690 #ifndef NO_RC2
691                         BIO_printf(bio_err,"rc2      ");
692 #endif
693 #ifndef NO_DES
694                         BIO_printf(bio_err,"des      ");
695 #endif
696 #ifndef NO_RSA
697                         BIO_printf(bio_err,"rsa      ");
698 #endif
699 #ifndef NO_BF
700                         BIO_printf(bio_err,"blowfish");
701 #endif
702 #if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_DES) || !defined(NO_RSA) || !defined(NO_BF)
703                         BIO_printf(bio_err,"\n");
704 #endif
705
706                         BIO_printf(bio_err,"\n");
707                         BIO_printf(bio_err,"Available options:\n");
708 #ifdef TIMES
709                         BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
710 #endif
711                         BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
712                         goto end;
713                         }
714                 argc--;
715                 argv++;
716                 j++;
717                 }
718
719         if (j == 0)
720                 {
721                 for (i=0; i<ALGOR_NUM; i++)
722                         doit[i]=1;
723                 for (i=0; i<RSA_NUM; i++)
724                         rsa_doit[i]=1;
725                 for (i=0; i<DSA_NUM; i++)
726                         dsa_doit[i]=1;
727                 }
728         for (i=0; i<ALGOR_NUM; i++)
729                 if (doit[i]) pr_header++;
730
731         if (usertime == 0)
732                 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
733         if (usertime <= 0)
734                 {
735                 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
736                 BIO_printf(bio_err,"program when this computer is idle.\n");
737                 }
738
739 #ifndef NO_RSA
740         for (i=0; i<RSA_NUM; i++)
741                 {
742                 const unsigned char *p;
743
744                 p=rsa_data[i];
745                 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
746                 if (rsa_key[i] == NULL)
747                         {
748                         BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
749                         goto end;
750                         }
751 #if 0
752                 else
753                         {
754                         BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
755                         BN_print(bio_err,rsa_key[i]->e);
756                         BIO_printf(bio_err,"\n");
757                         }
758 #endif
759                 }
760 #endif
761
762 #ifndef NO_DSA
763         dsa_key[0]=get_dsa512();
764         dsa_key[1]=get_dsa1024();
765         dsa_key[2]=get_dsa2048();
766 #endif
767
768 #ifndef NO_DES
769         des_set_key_unchecked(&key,sch);
770         des_set_key_unchecked(&key2,sch2);
771         des_set_key_unchecked(&key3,sch3);
772 #endif
773 #ifndef NO_IDEA
774         idea_set_encrypt_key(key16,&idea_ks);
775 #endif
776 #ifndef NO_RC4
777         RC4_set_key(&rc4_ks,16,key16);
778 #endif
779 #ifndef NO_RC2
780         RC2_set_key(&rc2_ks,16,key16,128);
781 #endif
782 #ifndef NO_RC5
783         RC5_32_set_key(&rc5_ks,16,key16,12);
784 #endif
785 #ifndef NO_BF
786         BF_set_key(&bf_ks,16,key16);
787 #endif
788 #ifndef NO_CAST
789         CAST_set_key(&cast_ks,16,key16);
790 #endif
791 #ifndef NO_RSA
792         memset(rsa_c,0,sizeof(rsa_c));
793 #endif
794 #ifndef SIGALRM
795 #ifndef NO_DES
796         BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
797         count=10;
798         do      {
799                 long i;
800                 count*=2;
801                 Time_F(START,usertime);
802                 for (i=count; i; i--)
803                         des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
804                                 &(sch[0]),DES_ENCRYPT);
805                 d=Time_F(STOP,usertime);
806                 } while (d <3);
807         c[D_MD2][0]=count/10;
808         c[D_MDC2][0]=count/10;
809         c[D_MD4][0]=count;
810         c[D_MD5][0]=count;
811         c[D_HMAC][0]=count;
812         c[D_SHA1][0]=count;
813         c[D_RMD160][0]=count;
814         c[D_RC4][0]=count*5;
815         c[D_CBC_DES][0]=count;
816         c[D_EDE3_DES][0]=count/3;
817         c[D_CBC_IDEA][0]=count;
818         c[D_CBC_RC2][0]=count;
819         c[D_CBC_RC5][0]=count;
820         c[D_CBC_BF][0]=count;
821         c[D_CBC_CAST][0]=count;
822
823         for (i=1; i<SIZE_NUM; i++)
824                 {
825                 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
826                 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
827                 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
828                 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
829                 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
830                 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
831                 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
832                 }
833         for (i=1; i<SIZE_NUM; i++)
834                 {
835                 long l0,l1;
836
837                 l0=(long)lengths[i-1];
838                 l1=(long)lengths[i];
839                 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
840                 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
841                 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
842                 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
843                 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
844                 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
845                 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
846                 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
847                 }
848 #ifndef NO_RSA
849         rsa_c[R_RSA_512][0]=count/2000;
850         rsa_c[R_RSA_512][1]=count/400;
851         for (i=1; i<RSA_NUM; i++)
852                 {
853                 rsa_c[i][0]=rsa_c[i-1][0]/8;
854                 rsa_c[i][1]=rsa_c[i-1][1]/4;
855                 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
856                         rsa_doit[i]=0;
857                 else
858                         {
859                         if (rsa_c[i][0] == 0)
860                                 {
861                                 rsa_c[i][0]=1;
862                                 rsa_c[i][1]=20;
863                                 }
864                         }                               
865                 }
866 #endif
867
868         dsa_c[R_DSA_512][0]=count/1000;
869         dsa_c[R_DSA_512][1]=count/1000/2;
870         for (i=1; i<DSA_NUM; i++)
871                 {
872                 dsa_c[i][0]=dsa_c[i-1][0]/4;
873                 dsa_c[i][1]=dsa_c[i-1][1]/4;
874                 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
875                         dsa_doit[i]=0;
876                 else
877                         {
878                         if (dsa_c[i] == 0)
879                                 {
880                                 dsa_c[i][0]=1;
881                                 dsa_c[i][1]=1;
882                                 }
883                         }                               
884                 }
885
886 #define COND(d) (count < (d))
887 #define COUNT(d) (d)
888 #else
889 /* not worth fixing */
890 # error "You cannot disable DES on systems without SIGALRM."
891 #endif /* NO_DES */
892 #else
893 #define COND(c) (run)
894 #define COUNT(d) (count)
895         signal(SIGALRM,sig_done);
896 #endif /* SIGALRM */
897
898 #ifndef NO_MD2
899         if (doit[D_MD2])
900                 {
901                 for (j=0; j<SIZE_NUM; j++)
902                         {
903                         print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
904                         Time_F(START,usertime);
905                         for (count=0,run=1; COND(c[D_MD2][j]); count++)
906                                 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
907                         d=Time_F(STOP,usertime);
908                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
909                                 count,names[D_MD2],d);
910                         results[D_MD2][j]=((double)count)/d*lengths[j];
911                         }
912                 }
913 #endif
914 #ifndef NO_MDC2
915         if (doit[D_MDC2])
916                 {
917                 for (j=0; j<SIZE_NUM; j++)
918                         {
919                         print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
920                         Time_F(START,usertime);
921                         for (count=0,run=1; COND(c[D_MDC2][j]); count++)
922                                 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
923                         d=Time_F(STOP,usertime);
924                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
925                                 count,names[D_MDC2],d);
926                         results[D_MDC2][j]=((double)count)/d*lengths[j];
927                         }
928                 }
929 #endif
930
931 #ifndef NO_MD4
932         if (doit[D_MD4])
933                 {
934                 for (j=0; j<SIZE_NUM; j++)
935                         {
936                         print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
937                         Time_F(START,usertime);
938                         for (count=0,run=1; COND(c[D_MD4][j]); count++)
939                                 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
940                         d=Time_F(STOP,usertime);
941                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
942                                 count,names[D_MD4],d);
943                         results[D_MD4][j]=((double)count)/d*lengths[j];
944                         }
945                 }
946 #endif
947
948 #ifndef NO_MD5
949         if (doit[D_MD5])
950                 {
951                 for (j=0; j<SIZE_NUM; j++)
952                         {
953                         print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
954                         Time_F(START,usertime);
955                         for (count=0,run=1; COND(c[D_MD5][j]); count++)
956                                 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
957                         d=Time_F(STOP,usertime);
958                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
959                                 count,names[D_MD5],d);
960                         results[D_MD5][j]=((double)count)/d*lengths[j];
961                         }
962                 }
963 #endif
964
965 #if !defined(NO_MD5) && !defined(NO_HMAC)
966         if (doit[D_HMAC])
967                 {
968                 HMAC_CTX hctx;
969                 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
970                         16,EVP_md5());
971
972                 for (j=0; j<SIZE_NUM; j++)
973                         {
974                         print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
975                         Time_F(START,usertime);
976                         for (count=0,run=1; COND(c[D_HMAC][j]); count++)
977                                 {
978                                 HMAC_Init(&hctx,NULL,0,NULL);
979                                 HMAC_Update(&hctx,buf,lengths[j]);
980                                 HMAC_Final(&hctx,&(hmac[0]),NULL);
981                                 }
982                         d=Time_F(STOP,usertime);
983                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
984                                 count,names[D_HMAC],d);
985                         results[D_HMAC][j]=((double)count)/d*lengths[j];
986                         }
987                 }
988 #endif
989 #ifndef NO_SHA
990         if (doit[D_SHA1])
991                 {
992                 for (j=0; j<SIZE_NUM; j++)
993                         {
994                         print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
995                         Time_F(START,usertime);
996                         for (count=0,run=1; COND(c[D_SHA1][j]); count++)
997                                 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
998                         d=Time_F(STOP,usertime);
999                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1000                                 count,names[D_SHA1],d);
1001                         results[D_SHA1][j]=((double)count)/d*lengths[j];
1002                         }
1003                 }
1004 #endif
1005 #ifndef NO_RIPEMD
1006         if (doit[D_RMD160])
1007                 {
1008                 for (j=0; j<SIZE_NUM; j++)
1009                         {
1010                         print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1011                         Time_F(START,usertime);
1012                         for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1013                                 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
1014                         d=Time_F(STOP,usertime);
1015                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1016                                 count,names[D_RMD160],d);
1017                         results[D_RMD160][j]=((double)count)/d*lengths[j];
1018                         }
1019                 }
1020 #endif
1021 #ifndef NO_RC4
1022         if (doit[D_RC4])
1023                 {
1024                 for (j=0; j<SIZE_NUM; j++)
1025                         {
1026                         print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1027                         Time_F(START,usertime);
1028                         for (count=0,run=1; COND(c[D_RC4][j]); count++)
1029                                 RC4(&rc4_ks,(unsigned int)lengths[j],
1030                                         buf,buf);
1031                         d=Time_F(STOP,usertime);
1032                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1033                                 count,names[D_RC4],d);
1034                         results[D_RC4][j]=((double)count)/d*lengths[j];
1035                         }
1036                 }
1037 #endif
1038 #ifndef NO_DES
1039         if (doit[D_CBC_DES])
1040                 {
1041                 for (j=0; j<SIZE_NUM; j++)
1042                         {
1043                         print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1044                         Time_F(START,usertime);
1045                         for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1046                                 des_ncbc_encrypt(buf,buf,lengths[j],sch,
1047                                                  &iv,DES_ENCRYPT);
1048                         d=Time_F(STOP,usertime);
1049                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1050                                 count,names[D_CBC_DES],d);
1051                         results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1052                         }
1053                 }
1054
1055         if (doit[D_EDE3_DES])
1056                 {
1057                 for (j=0; j<SIZE_NUM; j++)
1058                         {
1059                         print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1060                         Time_F(START,usertime);
1061                         for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1062                                 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1063                                                      sch,sch2,sch3,
1064                                                      &iv,DES_ENCRYPT);
1065                         d=Time_F(STOP,usertime);
1066                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1067                                 count,names[D_EDE3_DES],d);
1068                         results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1069                         }
1070                 }
1071 #endif
1072 #ifndef NO_IDEA
1073         if (doit[D_CBC_IDEA])
1074                 {
1075                 for (j=0; j<SIZE_NUM; j++)
1076                         {
1077                         print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1078                         Time_F(START,usertime);
1079                         for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1080                                 idea_cbc_encrypt(buf,buf,
1081                                         (unsigned long)lengths[j],&idea_ks,
1082                                         iv,IDEA_ENCRYPT);
1083                         d=Time_F(STOP,usertime);
1084                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1085                                 count,names[D_CBC_IDEA],d);
1086                         results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1087                         }
1088                 }
1089 #endif
1090 #ifndef NO_RC2
1091         if (doit[D_CBC_RC2])
1092                 {
1093                 for (j=0; j<SIZE_NUM; j++)
1094                         {
1095                         print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1096                         Time_F(START,usertime);
1097                         for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1098                                 RC2_cbc_encrypt(buf,buf,
1099                                         (unsigned long)lengths[j],&rc2_ks,
1100                                         iv,RC2_ENCRYPT);
1101                         d=Time_F(STOP,usertime);
1102                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1103                                 count,names[D_CBC_RC2],d);
1104                         results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1105                         }
1106                 }
1107 #endif
1108 #ifndef NO_RC5
1109         if (doit[D_CBC_RC5])
1110                 {
1111                 for (j=0; j<SIZE_NUM; j++)
1112                         {
1113                         print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1114                         Time_F(START,usertime);
1115                         for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1116                                 RC5_32_cbc_encrypt(buf,buf,
1117                                         (unsigned long)lengths[j],&rc5_ks,
1118                                         iv,RC5_ENCRYPT);
1119                         d=Time_F(STOP,usertime);
1120                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1121                                 count,names[D_CBC_RC5],d);
1122                         results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1123                         }
1124                 }
1125 #endif
1126 #ifndef NO_BF
1127         if (doit[D_CBC_BF])
1128                 {
1129                 for (j=0; j<SIZE_NUM; j++)
1130                         {
1131                         print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1132                         Time_F(START,usertime);
1133                         for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1134                                 BF_cbc_encrypt(buf,buf,
1135                                         (unsigned long)lengths[j],&bf_ks,
1136                                         iv,BF_ENCRYPT);
1137                         d=Time_F(STOP,usertime);
1138                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1139                                 count,names[D_CBC_BF],d);
1140                         results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1141                         }
1142                 }
1143 #endif
1144 #ifndef NO_CAST
1145         if (doit[D_CBC_CAST])
1146                 {
1147                 for (j=0; j<SIZE_NUM; j++)
1148                         {
1149                         print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1150                         Time_F(START,usertime);
1151                         for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1152                                 CAST_cbc_encrypt(buf,buf,
1153                                         (unsigned long)lengths[j],&cast_ks,
1154                                         iv,CAST_ENCRYPT);
1155                         d=Time_F(STOP,usertime);
1156                         BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1157                                 count,names[D_CBC_CAST],d);
1158                         results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1159                         }
1160                 }
1161 #endif
1162
1163         RAND_pseudo_bytes(buf,36);
1164 #ifndef NO_RSA
1165         for (j=0; j<RSA_NUM; j++)
1166                 {
1167                 int ret;
1168                 if (!rsa_doit[j]) continue;
1169                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1170                 if (ret == 0)
1171                         {
1172                         BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
1173                         ERR_print_errors(bio_err);
1174                         rsa_count=1;
1175                         }
1176                 else
1177                         {
1178                         pkey_print_message("private","rsa",
1179                                 rsa_c[j][0],rsa_bits[j],
1180                                 RSA_SECONDS);
1181 /*                      RSA_blinding_on(rsa_key[j],NULL); */
1182                         Time_F(START,usertime);
1183                         for (count=0,run=1; COND(rsa_c[j][0]); count++)
1184                                 {
1185                                 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1186                                         &rsa_num, rsa_key[j]);
1187                                 if (ret == 0)
1188                                         {
1189                                         BIO_printf(bio_err,
1190                                                 "RSA sign failure\n");
1191                                         ERR_print_errors(bio_err);
1192                                         count=1;
1193                                         break;
1194                                         }
1195                                 }
1196                         d=Time_F(STOP,usertime);
1197                         BIO_printf(bio_err,
1198                                 "%ld %d bit private RSA's in %.2fs\n",
1199                                 count,rsa_bits[j],d);
1200                         rsa_results[j][0]=d/(double)count;
1201                         rsa_count=count;
1202                         }
1203
1204 #if 1
1205                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1206                 if (ret <= 0)
1207                         {
1208                         BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
1209                         ERR_print_errors(bio_err);
1210                         dsa_doit[j] = 0;
1211                         }
1212                 else
1213                         {
1214                         pkey_print_message("public","rsa",
1215                                 rsa_c[j][1],rsa_bits[j],
1216                                 RSA_SECONDS);
1217                         Time_F(START,usertime);
1218                         for (count=0,run=1; COND(rsa_c[j][1]); count++)
1219                                 {
1220                                 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1221                                         rsa_num, rsa_key[j]);
1222                                 if (ret == 0)
1223                                         {
1224                                         BIO_printf(bio_err,
1225                                                 "RSA verify failure\n");
1226                                         ERR_print_errors(bio_err);
1227                                         count=1;
1228                                         break;
1229                                         }
1230                                 }
1231                         d=Time_F(STOP,usertime);
1232                         BIO_printf(bio_err,
1233                                 "%ld %d bit public RSA's in %.2fs\n",
1234                                 count,rsa_bits[j],d);
1235                         rsa_results[j][1]=d/(double)count;
1236                         }
1237 #endif
1238
1239                 if (rsa_count <= 1)
1240                         {
1241                         /* if longer than 10s, don't do any more */
1242                         for (j++; j<RSA_NUM; j++)
1243                                 rsa_doit[j]=0;
1244                         }
1245                 }
1246 #endif
1247
1248         RAND_pseudo_bytes(buf,20);
1249 #ifndef NO_DSA
1250         if (RAND_status() != 1)
1251                 {
1252                 RAND_seed(rnd_seed, sizeof rnd_seed);
1253                 rnd_fake = 1;
1254                 }
1255         for (j=0; j<DSA_NUM; j++)
1256                 {
1257                 unsigned int kk;
1258                 int ret;
1259
1260                 if (!dsa_doit[j]) continue;
1261                 DSA_generate_key(dsa_key[j]);
1262 /*              DSA_sign_setup(dsa_key[j],NULL); */
1263                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1264                         &kk,dsa_key[j]);
1265                 if (ret == 0)
1266                         {
1267                         BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
1268                         ERR_print_errors(bio_err);
1269                         rsa_count=1;
1270                         }
1271                 else
1272                         {
1273                         pkey_print_message("sign","dsa",
1274                                 dsa_c[j][0],dsa_bits[j],
1275                                 DSA_SECONDS);
1276                         Time_F(START,usertime);
1277                         for (count=0,run=1; COND(dsa_c[j][0]); count++)
1278                                 {
1279                                 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1280                                         &kk,dsa_key[j]);
1281                                 if (ret == 0)
1282                                         {
1283                                         BIO_printf(bio_err,
1284                                                 "DSA sign failure\n");
1285                                         ERR_print_errors(bio_err);
1286                                         count=1;
1287                                         break;
1288                                         }
1289                                 }
1290                         d=Time_F(STOP,usertime);
1291                         BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1292                                 count,dsa_bits[j],d);
1293                         dsa_results[j][0]=d/(double)count;
1294                         rsa_count=count;
1295                         }
1296
1297                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1298                         kk,dsa_key[j]);
1299                 if (ret <= 0)
1300                         {
1301                         BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
1302                         ERR_print_errors(bio_err);
1303                         dsa_doit[j] = 0;
1304                         }
1305                 else
1306                         {
1307                         pkey_print_message("verify","dsa",
1308                                 dsa_c[j][1],dsa_bits[j],
1309                                 DSA_SECONDS);
1310                         Time_F(START,usertime);
1311                         for (count=0,run=1; COND(dsa_c[j][1]); count++)
1312                                 {
1313                                 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1314                                         kk,dsa_key[j]);
1315                                 if (ret <= 0)
1316                                         {
1317                                         BIO_printf(bio_err,
1318                                                 "DSA verify failure\n");
1319                                         ERR_print_errors(bio_err);
1320                                         count=1;
1321                                         break;
1322                                         }
1323                                 }
1324                         d=Time_F(STOP,usertime);
1325                         BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1326                                 count,dsa_bits[j],d);
1327                         dsa_results[j][1]=d/(double)count;
1328                         }
1329
1330                 if (rsa_count <= 1)
1331                         {
1332                         /* if longer than 10s, don't do any more */
1333                         for (j++; j<DSA_NUM; j++)
1334                                 dsa_doit[j]=0;
1335                         }
1336                 }
1337         if (rnd_fake) RAND_cleanup();
1338 #endif
1339
1340         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1341         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1342         printf("options:");
1343         printf("%s ",BN_options());
1344 #ifndef NO_MD2
1345         printf("%s ",MD2_options());
1346 #endif
1347 #ifndef NO_RC4
1348         printf("%s ",RC4_options());
1349 #endif
1350 #ifndef NO_DES
1351         printf("%s ",des_options());
1352 #endif
1353 #ifndef NO_IDEA
1354         printf("%s ",idea_options());
1355 #endif
1356 #ifndef NO_BF
1357         printf("%s ",BF_options());
1358 #endif
1359         fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1360
1361         if (pr_header)
1362                 {
1363                 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 
1364                 fprintf(stdout,"type        ");
1365                 for (j=0;  j<SIZE_NUM; j++)
1366                         fprintf(stdout,"%7d bytes",lengths[j]);
1367                 fprintf(stdout,"\n");
1368                 }
1369
1370         for (k=0; k<ALGOR_NUM; k++)
1371                 {
1372                 if (!doit[k]) continue;
1373                 fprintf(stdout,"%-13s",names[k]);
1374                 for (j=0; j<SIZE_NUM; j++)
1375                         {
1376                         if (results[k][j] > 10000)
1377                                 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1378                         else
1379                                 fprintf(stdout," %11.2f ",results[k][j]);
1380                         }
1381                 fprintf(stdout,"\n");
1382                 }
1383 #ifndef NO_RSA
1384         j=1;
1385         for (k=0; k<RSA_NUM; k++)
1386                 {
1387                 if (!rsa_doit[k]) continue;
1388                 if (j)
1389                         {
1390                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1391                         j=0;
1392                         }
1393                 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1394                         rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1395                         1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1396                 fprintf(stdout,"\n");
1397                 }
1398 #endif
1399 #ifndef NO_DSA
1400         j=1;
1401         for (k=0; k<DSA_NUM; k++)
1402                 {
1403                 if (!dsa_doit[k]) continue;
1404                 if (j)  {
1405                         printf("%18ssign    verify    sign/s verify/s\n"," ");
1406                         j=0;
1407                         }
1408                 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
1409                         dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1410                         1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1411                 fprintf(stdout,"\n");
1412                 }
1413 #endif
1414         mret=0;
1415 end:
1416         ERR_print_errors(bio_err);
1417         if (buf != NULL) OPENSSL_free(buf);
1418         if (buf2 != NULL) OPENSSL_free(buf2);
1419 #ifndef NO_RSA
1420         for (i=0; i<RSA_NUM; i++)
1421                 if (rsa_key[i] != NULL)
1422                         RSA_free(rsa_key[i]);
1423 #endif
1424 #ifndef NO_DSA
1425         for (i=0; i<DSA_NUM; i++)
1426                 if (dsa_key[i] != NULL)
1427                         DSA_free(dsa_key[i]);
1428 #endif
1429         EXIT(mret);
1430         }
1431
1432 static void print_message(char *s, long num, int length)
1433         {
1434 #ifdef SIGALRM
1435         BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1436         (void)BIO_flush(bio_err);
1437         alarm(SECONDS);
1438 #else
1439         BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
1440         (void)BIO_flush(bio_err);
1441 #endif
1442 #ifdef LINT
1443         num=num;
1444 #endif
1445         }
1446
1447 static void pkey_print_message(char *str, char *str2, long num, int bits,
1448              int tm)
1449         {
1450 #ifdef SIGALRM
1451         BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1452         (void)BIO_flush(bio_err);
1453         alarm(RSA_SECONDS);
1454 #else
1455         BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1456         (void)BIO_flush(bio_err);
1457 #endif
1458 #ifdef LINT
1459         num=num;
1460 #endif
1461         }
1462