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