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