Import OpenSSL-0.9.8i.
[dragonfly.git] / crypto / openssl-0.9.7d / apps / speed.c
blob24122000092a5d0bd2a95b7b1f8d8282ad44ea74
1 /* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
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).
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.
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)"
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.
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.]
59 /* most of this code has been pilfered from my libdes speed.c program */
61 #ifndef OPENSSL_NO_SPEED
63 #undef SECONDS
64 #define SECONDS 3
65 #define RSA_SECONDS 10
66 #define DSA_SECONDS 10
68 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
69 /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
71 #undef PROG
72 #define PROG speed_main
74 #include <stdio.h>
75 #include <stdlib.h>
76 #include <signal.h>
77 #include <string.h>
78 #include <math.h>
79 #include "apps.h"
80 #ifdef OPENSSL_NO_STDIO
81 #define APPS_WIN16
82 #endif
83 #include <openssl/crypto.h>
84 #include <openssl/rand.h>
85 #include <openssl/err.h>
86 #include <openssl/evp.h>
87 #include <openssl/objects.h>
88 #if !defined(OPENSSL_SYS_MSDOS)
89 #include OPENSSL_UNISTD
90 #endif
92 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
93 # define USE_TOD
94 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
95 # define TIMES
96 #endif
97 #if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) && !defined(OPENSSL_SYS_VXWORKS) /* FIXME */
98 # define TIMEB
99 #endif
101 #ifndef _IRIX
102 # include <time.h>
103 #endif
104 #ifdef TIMES
105 # include <sys/types.h>
106 # include <sys/times.h>
107 #endif
108 #ifdef USE_TOD
109 # include <sys/time.h>
110 # include <sys/resource.h>
111 #endif
113 /* Depending on the VMS version, the tms structure is perhaps defined.
114 The __TMS macro will show if it was. If it wasn't defined, we should
115 undefine TIMES, since that tells the rest of the program how things
116 should be handled. -- Richard Levitte */
117 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
118 #undef TIMES
119 #endif
121 #ifdef TIMEB
122 #include <sys/timeb.h>
123 #endif
125 #if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
126 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
127 #endif
129 #if defined(sun) || defined(__ultrix)
130 #define _POSIX_SOURCE
131 #include <limits.h>
132 #include <sys/param.h>
133 #endif
135 #ifndef OPENSSL_NO_DES
136 #include <openssl/des.h>
137 #endif
138 #ifndef OPENSSL_NO_AES
139 #include <openssl/aes.h>
140 #endif
141 #ifndef OPENSSL_NO_MD2
142 #include <openssl/md2.h>
143 #endif
144 #ifndef OPENSSL_NO_MDC2
145 #include <openssl/mdc2.h>
146 #endif
147 #ifndef OPENSSL_NO_MD4
148 #include <openssl/md4.h>
149 #endif
150 #ifndef OPENSSL_NO_MD5
151 #include <openssl/md5.h>
152 #endif
153 #ifndef OPENSSL_NO_HMAC
154 #include <openssl/hmac.h>
155 #endif
156 #include <openssl/evp.h>
157 #ifndef OPENSSL_NO_SHA
158 #include <openssl/sha.h>
159 #endif
160 #ifndef OPENSSL_NO_RIPEMD
161 #include <openssl/ripemd.h>
162 #endif
163 #ifndef OPENSSL_NO_RC4
164 #include <openssl/rc4.h>
165 #endif
166 #ifndef OPENSSL_NO_RC5
167 #include <openssl/rc5.h>
168 #endif
169 #ifndef OPENSSL_NO_RC2
170 #include <openssl/rc2.h>
171 #endif
172 #ifndef OPENSSL_NO_IDEA
173 #include <openssl/idea.h>
174 #endif
175 #ifndef OPENSSL_NO_BF
176 #include <openssl/blowfish.h>
177 #endif
178 #ifndef OPENSSL_NO_CAST
179 #include <openssl/cast.h>
180 #endif
181 #ifndef OPENSSL_NO_RSA
182 #include <openssl/rsa.h>
183 #include "./testrsa.h"
184 #endif
185 #include <openssl/x509.h>
186 #ifndef OPENSSL_NO_DSA
187 #include "./testdsa.h"
188 #endif
190 /* The following if from times(3) man page. It may need to be changed */
191 #ifndef HZ
192 # if defined(_SC_CLK_TCK) \
193 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
194 # define HZ ((double)sysconf(_SC_CLK_TCK))
195 # else
196 # ifndef CLK_TCK
197 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
198 # define HZ 100.0
199 # else /* _BSD_CLK_TCK_ */
200 # define HZ ((double)_BSD_CLK_TCK_)
201 # endif
202 # else /* CLK_TCK */
203 # define HZ ((double)CLK_TCK)
204 # endif
205 # endif
206 #endif
208 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
209 # define HAVE_FORK 1
210 #endif
212 #undef BUFSIZE
213 #define BUFSIZE ((long)1024*8+1)
214 int run=0;
216 static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
217 static int mr=0;
218 static int usertime=1;
220 static double Time_F(int s);
221 static void print_message(const char *s,long num,int length);
222 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
223 static void print_result(int alg,int run_no,int count,double time_used);
224 #ifdef HAVE_FORK
225 static int do_multi(int multi);
226 #endif
228 #define ALGOR_NUM 19
229 #define SIZE_NUM 5
230 #define RSA_NUM 4
231 #define DSA_NUM 3
232 static const char *names[ALGOR_NUM]={
233 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
234 "des cbc","des ede3","idea cbc",
235 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
236 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
237 static double results[ALGOR_NUM][SIZE_NUM];
238 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
239 static double rsa_results[RSA_NUM][2];
240 static double dsa_results[DSA_NUM][2];
242 #ifdef SIGALRM
243 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
244 #define SIGRETTYPE void
245 #else
246 #define SIGRETTYPE int
247 #endif
249 static SIGRETTYPE sig_done(int sig);
250 static SIGRETTYPE sig_done(int sig)
252 signal(SIGALRM,sig_done);
253 run=0;
254 #ifdef LINT
255 sig=sig;
256 #endif
258 #endif
260 #define START 0
261 #define STOP 1
263 static double Time_F(int s)
265 double ret;
267 #ifdef USE_TOD
268 if(usertime)
270 static struct rusage tstart,tend;
272 getrusage_used = 1;
273 if (s == START)
275 getrusage(RUSAGE_SELF,&tstart);
276 return(0);
278 else
280 long i;
282 getrusage(RUSAGE_SELF,&tend);
283 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
284 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
285 +((double)i)/1000000.0;
286 return((ret < 0.001)?0.001:ret);
289 else
291 static struct timeval tstart,tend;
292 long i;
294 gettimeofday_used = 1;
295 if (s == START)
297 gettimeofday(&tstart,NULL);
298 return(0);
300 else
302 gettimeofday(&tend,NULL);
303 i=(long)tend.tv_usec-(long)tstart.tv_usec;
304 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
305 return((ret < 0.001)?0.001:ret);
308 #else /* ndef USE_TOD */
310 # ifdef TIMES
311 if (usertime)
313 static struct tms tstart,tend;
315 times_used = 1;
316 if (s == START)
318 times(&tstart);
319 return(0);
321 else
323 times(&tend);
324 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
325 return((ret < 1e-3)?1e-3:ret);
328 # endif /* times() */
329 # if defined(TIMES) && defined(TIMEB)
330 else
331 # endif
332 # ifdef OPENSSL_SYS_VXWORKS
334 static unsigned long tick_start, tick_end;
336 if( s == START )
338 tick_start = tickGet();
339 return 0;
341 else
343 tick_end = tickGet();
344 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
345 return((ret < 0.001)?0.001:ret);
348 # elif defined(TIMEB)
350 static struct timeb tstart,tend;
351 long i;
353 ftime_used = 1;
354 if (s == START)
356 ftime(&tstart);
357 return(0);
359 else
361 ftime(&tend);
362 i=(long)tend.millitm-(long)tstart.millitm;
363 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
364 return((ret < 0.001)?0.001:ret);
367 # endif
368 #endif
371 int MAIN(int, char **);
373 int MAIN(int argc, char **argv)
375 #ifndef OPENSSL_NO_ENGINE
376 ENGINE *e = NULL;
377 #endif
378 unsigned char *buf=NULL,*buf2=NULL;
379 int mret=1;
380 long count=0,save_count=0;
381 int i,j,k;
382 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
383 long rsa_count;
384 #endif
385 #ifndef OPENSSL_NO_RSA
386 unsigned rsa_num;
387 #endif
388 unsigned char md[EVP_MAX_MD_SIZE];
389 #ifndef OPENSSL_NO_MD2
390 unsigned char md2[MD2_DIGEST_LENGTH];
391 #endif
392 #ifndef OPENSSL_NO_MDC2
393 unsigned char mdc2[MDC2_DIGEST_LENGTH];
394 #endif
395 #ifndef OPENSSL_NO_MD4
396 unsigned char md4[MD4_DIGEST_LENGTH];
397 #endif
398 #ifndef OPENSSL_NO_MD5
399 unsigned char md5[MD5_DIGEST_LENGTH];
400 unsigned char hmac[MD5_DIGEST_LENGTH];
401 #endif
402 #ifndef OPENSSL_NO_SHA
403 unsigned char sha[SHA_DIGEST_LENGTH];
404 #endif
405 #ifndef OPENSSL_NO_RIPEMD
406 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
407 #endif
408 #ifndef OPENSSL_NO_RC4
409 RC4_KEY rc4_ks;
410 #endif
411 #ifndef OPENSSL_NO_RC5
412 RC5_32_KEY rc5_ks;
413 #endif
414 #ifndef OPENSSL_NO_RC2
415 RC2_KEY rc2_ks;
416 #endif
417 #ifndef OPENSSL_NO_IDEA
418 IDEA_KEY_SCHEDULE idea_ks;
419 #endif
420 #ifndef OPENSSL_NO_BF
421 BF_KEY bf_ks;
422 #endif
423 #ifndef OPENSSL_NO_CAST
424 CAST_KEY cast_ks;
425 #endif
426 static const unsigned char key16[16]=
427 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
428 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
429 static const unsigned char key24[24]=
430 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
431 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
432 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
433 static const unsigned char key32[32]=
434 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
435 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
436 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
437 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
438 #ifndef OPENSSL_NO_AES
439 #define MAX_BLOCK_SIZE 128
440 #else
441 #define MAX_BLOCK_SIZE 64
442 #endif
443 unsigned char DES_iv[8];
444 unsigned char iv[MAX_BLOCK_SIZE/8];
445 #ifndef OPENSSL_NO_DES
446 DES_cblock *buf_as_des_cblock = NULL;
447 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
448 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
449 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
450 DES_key_schedule sch;
451 DES_key_schedule sch2;
452 DES_key_schedule sch3;
453 #endif
454 #ifndef OPENSSL_NO_AES
455 AES_KEY aes_ks1, aes_ks2, aes_ks3;
456 #endif
457 #define D_MD2 0
458 #define D_MDC2 1
459 #define D_MD4 2
460 #define D_MD5 3
461 #define D_HMAC 4
462 #define D_SHA1 5
463 #define D_RMD160 6
464 #define D_RC4 7
465 #define D_CBC_DES 8
466 #define D_EDE3_DES 9
467 #define D_CBC_IDEA 10
468 #define D_CBC_RC2 11
469 #define D_CBC_RC5 12
470 #define D_CBC_BF 13
471 #define D_CBC_CAST 14
472 #define D_CBC_128_AES 15
473 #define D_CBC_192_AES 16
474 #define D_CBC_256_AES 17
475 #define D_EVP 18
476 double d=0.0;
477 long c[ALGOR_NUM][SIZE_NUM];
478 #define R_DSA_512 0
479 #define R_DSA_1024 1
480 #define R_DSA_2048 2
481 #define R_RSA_512 0
482 #define R_RSA_1024 1
483 #define R_RSA_2048 2
484 #define R_RSA_4096 3
485 #ifndef OPENSSL_NO_RSA
486 RSA *rsa_key[RSA_NUM];
487 long rsa_c[RSA_NUM][2];
488 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
489 static unsigned char *rsa_data[RSA_NUM]=
490 {test512,test1024,test2048,test4096};
491 static int rsa_data_length[RSA_NUM]={
492 sizeof(test512),sizeof(test1024),
493 sizeof(test2048),sizeof(test4096)};
494 #endif
495 #ifndef OPENSSL_NO_DSA
496 DSA *dsa_key[DSA_NUM];
497 long dsa_c[DSA_NUM][2];
498 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
499 #endif
500 int rsa_doit[RSA_NUM];
501 int dsa_doit[DSA_NUM];
502 int doit[ALGOR_NUM];
503 int pr_header=0;
504 const EVP_CIPHER *evp_cipher=NULL;
505 const EVP_MD *evp_md=NULL;
506 int decrypt=0;
507 #ifdef HAVE_FORK
508 int multi=0;
509 #endif
511 #ifndef TIMES
512 usertime=-1;
513 #endif
515 apps_startup();
516 memset(results, 0, sizeof(results));
517 #ifndef OPENSSL_NO_DSA
518 memset(dsa_key,0,sizeof(dsa_key));
519 #endif
521 if (bio_err == NULL)
522 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
523 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
525 if (!load_config(bio_err, NULL))
526 goto end;
528 #ifndef OPENSSL_NO_RSA
529 memset(rsa_key,0,sizeof(rsa_key));
530 for (i=0; i<RSA_NUM; i++)
531 rsa_key[i]=NULL;
532 #endif
534 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
536 BIO_printf(bio_err,"out of memory\n");
537 goto end;
539 #ifndef OPENSSL_NO_DES
540 buf_as_des_cblock = (DES_cblock *)buf;
541 #endif
542 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
544 BIO_printf(bio_err,"out of memory\n");
545 goto end;
548 memset(c,0,sizeof(c));
549 memset(DES_iv,0,sizeof(DES_iv));
550 memset(iv,0,sizeof(iv));
552 for (i=0; i<ALGOR_NUM; i++)
553 doit[i]=0;
554 for (i=0; i<RSA_NUM; i++)
555 rsa_doit[i]=0;
556 for (i=0; i<DSA_NUM; i++)
557 dsa_doit[i]=0;
559 j=0;
560 argc--;
561 argv++;
562 while (argc)
564 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
566 usertime = 0;
567 j--; /* Otherwise, -elapsed gets confused with
568 an algorithm. */
570 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
572 argc--;
573 argv++;
574 if(argc == 0)
576 BIO_printf(bio_err,"no EVP given\n");
577 goto end;
579 evp_cipher=EVP_get_cipherbyname(*argv);
580 if(!evp_cipher)
582 evp_md=EVP_get_digestbyname(*argv);
584 if(!evp_cipher && !evp_md)
586 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
587 goto end;
589 doit[D_EVP]=1;
591 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
593 decrypt=1;
594 j--; /* Otherwise, -elapsed gets confused with
595 an algorithm. */
597 #ifndef OPENSSL_NO_ENGINE
598 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
600 argc--;
601 argv++;
602 if(argc == 0)
604 BIO_printf(bio_err,"no engine given\n");
605 goto end;
607 e = setup_engine(bio_err, *argv, 0);
608 /* j will be increased again further down. We just
609 don't want speed to confuse an engine with an
610 algorithm, especially when none is given (which
611 means all of them should be run) */
612 j--;
614 #endif
615 #ifdef HAVE_FORK
616 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
618 argc--;
619 argv++;
620 if(argc == 0)
622 BIO_printf(bio_err,"no multi count given\n");
623 goto end;
625 multi=atoi(argv[0]);
626 if(multi <= 0)
628 BIO_printf(bio_err,"bad multi count\n");
629 goto end;
631 j--; /* Otherwise, -mr gets confused with
632 an algorithm. */
634 #endif
635 else if (argc > 0 && !strcmp(*argv,"-mr"))
637 mr=1;
638 j--; /* Otherwise, -mr gets confused with
639 an algorithm. */
641 else
642 #ifndef OPENSSL_NO_MD2
643 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
644 else
645 #endif
646 #ifndef OPENSSL_NO_MDC2
647 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
648 else
649 #endif
650 #ifndef OPENSSL_NO_MD4
651 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
652 else
653 #endif
654 #ifndef OPENSSL_NO_MD5
655 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
656 else
657 #endif
658 #ifndef OPENSSL_NO_MD5
659 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
660 else
661 #endif
662 #ifndef OPENSSL_NO_SHA
663 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
664 else
665 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
666 else
667 #endif
668 #ifndef OPENSSL_NO_RIPEMD
669 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
670 else
671 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
672 else
673 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
674 else
675 #endif
676 #ifndef OPENSSL_NO_RC4
677 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
678 else
679 #endif
680 #ifndef OPENSSL_NO_DES
681 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
682 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
683 else
684 #endif
685 #ifndef OPENSSL_NO_AES
686 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
687 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
688 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
689 else
690 #endif
691 #ifndef OPENSSL_NO_RSA
692 #if 0 /* was: #ifdef RSAref */
693 if (strcmp(*argv,"rsaref") == 0)
695 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
696 j--;
698 else
699 #endif
700 #ifndef RSA_NULL
701 if (strcmp(*argv,"openssl") == 0)
703 RSA_set_default_method(RSA_PKCS1_SSLeay());
704 j--;
706 else
707 #endif
708 #endif /* !OPENSSL_NO_RSA */
709 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
710 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
711 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
712 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
713 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
714 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
715 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
716 else
717 #ifndef OPENSSL_NO_RC2
718 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
719 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
720 else
721 #endif
722 #ifndef OPENSSL_NO_RC5
723 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
724 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
725 else
726 #endif
727 #ifndef OPENSSL_NO_IDEA
728 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
729 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
730 else
731 #endif
732 #ifndef OPENSSL_NO_BF
733 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
734 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
735 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
736 else
737 #endif
738 #ifndef OPENSSL_NO_CAST
739 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
740 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
741 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
742 else
743 #endif
744 #ifndef OPENSSL_NO_DES
745 if (strcmp(*argv,"des") == 0)
747 doit[D_CBC_DES]=1;
748 doit[D_EDE3_DES]=1;
750 else
751 #endif
752 #ifndef OPENSSL_NO_AES
753 if (strcmp(*argv,"aes") == 0)
755 doit[D_CBC_128_AES]=1;
756 doit[D_CBC_192_AES]=1;
757 doit[D_CBC_256_AES]=1;
759 else
760 #endif
761 #ifndef OPENSSL_NO_RSA
762 if (strcmp(*argv,"rsa") == 0)
764 rsa_doit[R_RSA_512]=1;
765 rsa_doit[R_RSA_1024]=1;
766 rsa_doit[R_RSA_2048]=1;
767 rsa_doit[R_RSA_4096]=1;
769 else
770 #endif
771 #ifndef OPENSSL_NO_DSA
772 if (strcmp(*argv,"dsa") == 0)
774 dsa_doit[R_DSA_512]=1;
775 dsa_doit[R_DSA_1024]=1;
776 dsa_doit[R_DSA_2048]=1;
778 else
779 #endif
781 BIO_printf(bio_err,"Error: bad option or value\n");
782 BIO_printf(bio_err,"\n");
783 BIO_printf(bio_err,"Available values:\n");
784 #ifndef OPENSSL_NO_MD2
785 BIO_printf(bio_err,"md2 ");
786 #endif
787 #ifndef OPENSSL_NO_MDC2
788 BIO_printf(bio_err,"mdc2 ");
789 #endif
790 #ifndef OPENSSL_NO_MD4
791 BIO_printf(bio_err,"md4 ");
792 #endif
793 #ifndef OPENSSL_NO_MD5
794 BIO_printf(bio_err,"md5 ");
795 #ifndef OPENSSL_NO_HMAC
796 BIO_printf(bio_err,"hmac ");
797 #endif
798 #endif
799 #ifndef OPENSSL_NO_SHA1
800 BIO_printf(bio_err,"sha1 ");
801 #endif
802 #ifndef OPENSSL_NO_RIPEMD160
803 BIO_printf(bio_err,"rmd160");
804 #endif
805 #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
806 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
807 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
808 BIO_printf(bio_err,"\n");
809 #endif
811 #ifndef OPENSSL_NO_IDEA
812 BIO_printf(bio_err,"idea-cbc ");
813 #endif
814 #ifndef OPENSSL_NO_RC2
815 BIO_printf(bio_err,"rc2-cbc ");
816 #endif
817 #ifndef OPENSSL_NO_RC5
818 BIO_printf(bio_err,"rc5-cbc ");
819 #endif
820 #ifndef OPENSSL_NO_BF
821 BIO_printf(bio_err,"bf-cbc");
822 #endif
823 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
824 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
825 BIO_printf(bio_err,"\n");
826 #endif
827 #ifndef OPENSSL_NO_DES
828 BIO_printf(bio_err,"des-cbc des-ede3 ");
829 #endif
830 #ifndef OPENSSL_NO_AES
831 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
832 #endif
833 #ifndef OPENSSL_NO_RC4
834 BIO_printf(bio_err,"rc4");
835 #endif
836 BIO_printf(bio_err,"\n");
838 #ifndef OPENSSL_NO_RSA
839 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
840 #endif
842 #ifndef OPENSSL_NO_DSA
843 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
844 #endif
846 #ifndef OPENSSL_NO_IDEA
847 BIO_printf(bio_err,"idea ");
848 #endif
849 #ifndef OPENSSL_NO_RC2
850 BIO_printf(bio_err,"rc2 ");
851 #endif
852 #ifndef OPENSSL_NO_DES
853 BIO_printf(bio_err,"des ");
854 #endif
855 #ifndef OPENSSL_NO_AES
856 BIO_printf(bio_err,"aes ");
857 #endif
858 #ifndef OPENSSL_NO_RSA
859 BIO_printf(bio_err,"rsa ");
860 #endif
861 #ifndef OPENSSL_NO_BF
862 BIO_printf(bio_err,"blowfish");
863 #endif
864 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
865 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
866 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
867 BIO_printf(bio_err,"\n");
868 #endif
870 BIO_printf(bio_err,"\n");
871 BIO_printf(bio_err,"Available options:\n");
872 #if defined(TIMES) || defined(USE_TOD)
873 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
874 #endif
875 #ifndef OPENSSL_NO_ENGINE
876 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
877 #endif
878 BIO_printf(bio_err,"-evp e use EVP e.\n");
879 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
880 BIO_printf(bio_err,"-mr produce machine readable output.\n");
881 #ifdef HAVE_FORK
882 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
883 #endif
884 goto end;
886 argc--;
887 argv++;
888 j++;
891 #ifdef HAVE_FORK
892 if(multi && do_multi(multi))
893 goto show_res;
894 #endif
896 if (j == 0)
898 for (i=0; i<ALGOR_NUM; i++)
900 if (i != D_EVP)
901 doit[i]=1;
903 for (i=0; i<RSA_NUM; i++)
904 rsa_doit[i]=1;
905 for (i=0; i<DSA_NUM; i++)
906 dsa_doit[i]=1;
908 for (i=0; i<ALGOR_NUM; i++)
909 if (doit[i]) pr_header++;
911 if (usertime == 0 && !mr)
912 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
913 if (usertime <= 0 && !mr)
915 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
916 BIO_printf(bio_err,"program when this computer is idle.\n");
919 #ifndef OPENSSL_NO_RSA
920 for (i=0; i<RSA_NUM; i++)
922 const unsigned char *p;
924 p=rsa_data[i];
925 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
926 if (rsa_key[i] == NULL)
928 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
929 goto end;
931 #if 0
932 else
934 BIO_printf(bio_err,mr ? "+RK:%d:"
935 : "Loaded RSA key, %d bit modulus and e= 0x",
936 BN_num_bits(rsa_key[i]->n));
937 BN_print(bio_err,rsa_key[i]->e);
938 BIO_printf(bio_err,"\n");
940 #endif
942 #endif
944 #ifndef OPENSSL_NO_DSA
945 dsa_key[0]=get_dsa512();
946 dsa_key[1]=get_dsa1024();
947 dsa_key[2]=get_dsa2048();
948 #endif
950 #ifndef OPENSSL_NO_DES
951 DES_set_key_unchecked(&key,&sch);
952 DES_set_key_unchecked(&key2,&sch2);
953 DES_set_key_unchecked(&key3,&sch3);
954 #endif
955 #ifndef OPENSSL_NO_AES
956 AES_set_encrypt_key(key16,128,&aes_ks1);
957 AES_set_encrypt_key(key24,192,&aes_ks2);
958 AES_set_encrypt_key(key32,256,&aes_ks3);
959 #endif
960 #ifndef OPENSSL_NO_IDEA
961 idea_set_encrypt_key(key16,&idea_ks);
962 #endif
963 #ifndef OPENSSL_NO_RC4
964 RC4_set_key(&rc4_ks,16,key16);
965 #endif
966 #ifndef OPENSSL_NO_RC2
967 RC2_set_key(&rc2_ks,16,key16,128);
968 #endif
969 #ifndef OPENSSL_NO_RC5
970 RC5_32_set_key(&rc5_ks,16,key16,12);
971 #endif
972 #ifndef OPENSSL_NO_BF
973 BF_set_key(&bf_ks,16,key16);
974 #endif
975 #ifndef OPENSSL_NO_CAST
976 CAST_set_key(&cast_ks,16,key16);
977 #endif
978 #ifndef OPENSSL_NO_RSA
979 memset(rsa_c,0,sizeof(rsa_c));
980 #endif
981 #ifndef SIGALRM
982 #ifndef OPENSSL_NO_DES
983 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
984 count=10;
985 do {
986 long i;
987 count*=2;
988 Time_F(START);
989 for (i=count; i; i--)
990 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
991 &sch,DES_ENCRYPT);
992 d=Time_F(STOP);
993 } while (d <3);
994 save_count=count;
995 c[D_MD2][0]=count/10;
996 c[D_MDC2][0]=count/10;
997 c[D_MD4][0]=count;
998 c[D_MD5][0]=count;
999 c[D_HMAC][0]=count;
1000 c[D_SHA1][0]=count;
1001 c[D_RMD160][0]=count;
1002 c[D_RC4][0]=count*5;
1003 c[D_CBC_DES][0]=count;
1004 c[D_EDE3_DES][0]=count/3;
1005 c[D_CBC_IDEA][0]=count;
1006 c[D_CBC_RC2][0]=count;
1007 c[D_CBC_RC5][0]=count;
1008 c[D_CBC_BF][0]=count;
1009 c[D_CBC_CAST][0]=count;
1010 c[D_CBC_128_AES][0]=count;
1011 c[D_CBC_192_AES][0]=count;
1012 c[D_CBC_256_AES][0]=count;
1014 for (i=1; i<SIZE_NUM; i++)
1016 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1017 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
1018 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
1019 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
1020 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
1021 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
1022 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
1024 for (i=1; i<SIZE_NUM; i++)
1026 long l0,l1;
1028 l0=(long)lengths[i-1];
1029 l1=(long)lengths[i];
1030 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1031 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1032 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1033 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1034 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
1035 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
1036 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
1037 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
1038 c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
1039 c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
1040 c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
1042 #ifndef OPENSSL_NO_RSA
1043 rsa_c[R_RSA_512][0]=count/2000;
1044 rsa_c[R_RSA_512][1]=count/400;
1045 for (i=1; i<RSA_NUM; i++)
1047 rsa_c[i][0]=rsa_c[i-1][0]/8;
1048 rsa_c[i][1]=rsa_c[i-1][1]/4;
1049 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1050 rsa_doit[i]=0;
1051 else
1053 if (rsa_c[i][0] == 0)
1055 rsa_c[i][0]=1;
1056 rsa_c[i][1]=20;
1060 #endif
1062 #ifndef OPENSSL_NO_DSA
1063 dsa_c[R_DSA_512][0]=count/1000;
1064 dsa_c[R_DSA_512][1]=count/1000/2;
1065 for (i=1; i<DSA_NUM; i++)
1067 dsa_c[i][0]=dsa_c[i-1][0]/4;
1068 dsa_c[i][1]=dsa_c[i-1][1]/4;
1069 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1070 dsa_doit[i]=0;
1071 else
1073 if (dsa_c[i] == 0)
1075 dsa_c[i][0]=1;
1076 dsa_c[i][1]=1;
1080 #endif
1082 #define COND(d) (count < (d))
1083 #define COUNT(d) (d)
1084 #else
1085 /* not worth fixing */
1086 # error "You cannot disable DES on systems without SIGALRM."
1087 #endif /* OPENSSL_NO_DES */
1088 #else
1089 #define COND(c) (run)
1090 #define COUNT(d) (count)
1091 signal(SIGALRM,sig_done);
1092 #endif /* SIGALRM */
1094 #ifndef OPENSSL_NO_MD2
1095 if (doit[D_MD2])
1097 for (j=0; j<SIZE_NUM; j++)
1099 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
1100 Time_F(START);
1101 for (count=0,run=1; COND(c[D_MD2][j]); count++)
1102 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1103 d=Time_F(STOP);
1104 print_result(D_MD2,j,count,d);
1107 #endif
1108 #ifndef OPENSSL_NO_MDC2
1109 if (doit[D_MDC2])
1111 for (j=0; j<SIZE_NUM; j++)
1113 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
1114 Time_F(START);
1115 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
1116 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1117 d=Time_F(STOP);
1118 print_result(D_MDC2,j,count,d);
1121 #endif
1123 #ifndef OPENSSL_NO_MD4
1124 if (doit[D_MD4])
1126 for (j=0; j<SIZE_NUM; j++)
1128 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
1129 Time_F(START);
1130 for (count=0,run=1; COND(c[D_MD4][j]); count++)
1131 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1132 d=Time_F(STOP);
1133 print_result(D_MD4,j,count,d);
1136 #endif
1138 #ifndef OPENSSL_NO_MD5
1139 if (doit[D_MD5])
1141 for (j=0; j<SIZE_NUM; j++)
1143 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
1144 Time_F(START);
1145 for (count=0,run=1; COND(c[D_MD5][j]); count++)
1146 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1147 d=Time_F(STOP);
1148 print_result(D_MD5,j,count,d);
1151 #endif
1153 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1154 if (doit[D_HMAC])
1156 HMAC_CTX hctx;
1158 HMAC_CTX_init(&hctx);
1159 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
1160 16,EVP_md5(), NULL);
1162 for (j=0; j<SIZE_NUM; j++)
1164 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
1165 Time_F(START);
1166 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1168 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1169 HMAC_Update(&hctx,buf,lengths[j]);
1170 HMAC_Final(&hctx,&(hmac[0]),NULL);
1172 d=Time_F(STOP);
1173 print_result(D_HMAC,j,count,d);
1175 HMAC_CTX_cleanup(&hctx);
1177 #endif
1178 #ifndef OPENSSL_NO_SHA
1179 if (doit[D_SHA1])
1181 for (j=0; j<SIZE_NUM; j++)
1183 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
1184 Time_F(START);
1185 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1186 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1187 d=Time_F(STOP);
1188 print_result(D_SHA1,j,count,d);
1191 #endif
1192 #ifndef OPENSSL_NO_RIPEMD
1193 if (doit[D_RMD160])
1195 for (j=0; j<SIZE_NUM; j++)
1197 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
1198 Time_F(START);
1199 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1200 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1201 d=Time_F(STOP);
1202 print_result(D_RMD160,j,count,d);
1205 #endif
1206 #ifndef OPENSSL_NO_RC4
1207 if (doit[D_RC4])
1209 for (j=0; j<SIZE_NUM; j++)
1211 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
1212 Time_F(START);
1213 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1214 RC4(&rc4_ks,(unsigned int)lengths[j],
1215 buf,buf);
1216 d=Time_F(STOP);
1217 print_result(D_RC4,j,count,d);
1220 #endif
1221 #ifndef OPENSSL_NO_DES
1222 if (doit[D_CBC_DES])
1224 for (j=0; j<SIZE_NUM; j++)
1226 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
1227 Time_F(START);
1228 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
1229 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
1230 &DES_iv,DES_ENCRYPT);
1231 d=Time_F(STOP);
1232 print_result(D_CBC_DES,j,count,d);
1236 if (doit[D_EDE3_DES])
1238 for (j=0; j<SIZE_NUM; j++)
1240 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
1241 Time_F(START);
1242 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
1243 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
1244 &sch,&sch2,&sch3,
1245 &DES_iv,DES_ENCRYPT);
1246 d=Time_F(STOP);
1247 print_result(D_EDE3_DES,j,count,d);
1250 #endif
1251 #ifndef OPENSSL_NO_AES
1252 if (doit[D_CBC_128_AES])
1254 for (j=0; j<SIZE_NUM; j++)
1256 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1257 Time_F(START);
1258 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1259 AES_cbc_encrypt(buf,buf,
1260 (unsigned long)lengths[j],&aes_ks1,
1261 iv,AES_ENCRYPT);
1262 d=Time_F(STOP);
1263 print_result(D_CBC_128_AES,j,count,d);
1266 if (doit[D_CBC_192_AES])
1268 for (j=0; j<SIZE_NUM; j++)
1270 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1271 Time_F(START);
1272 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1273 AES_cbc_encrypt(buf,buf,
1274 (unsigned long)lengths[j],&aes_ks2,
1275 iv,AES_ENCRYPT);
1276 d=Time_F(STOP);
1277 print_result(D_CBC_192_AES,j,count,d);
1280 if (doit[D_CBC_256_AES])
1282 for (j=0; j<SIZE_NUM; j++)
1284 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1285 Time_F(START);
1286 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1287 AES_cbc_encrypt(buf,buf,
1288 (unsigned long)lengths[j],&aes_ks3,
1289 iv,AES_ENCRYPT);
1290 d=Time_F(STOP);
1291 print_result(D_CBC_256_AES,j,count,d);
1295 #endif
1296 #ifndef OPENSSL_NO_IDEA
1297 if (doit[D_CBC_IDEA])
1299 for (j=0; j<SIZE_NUM; j++)
1301 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
1302 Time_F(START);
1303 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1304 idea_cbc_encrypt(buf,buf,
1305 (unsigned long)lengths[j],&idea_ks,
1306 iv,IDEA_ENCRYPT);
1307 d=Time_F(STOP);
1308 print_result(D_CBC_IDEA,j,count,d);
1311 #endif
1312 #ifndef OPENSSL_NO_RC2
1313 if (doit[D_CBC_RC2])
1315 for (j=0; j<SIZE_NUM; j++)
1317 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
1318 Time_F(START);
1319 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1320 RC2_cbc_encrypt(buf,buf,
1321 (unsigned long)lengths[j],&rc2_ks,
1322 iv,RC2_ENCRYPT);
1323 d=Time_F(STOP);
1324 print_result(D_CBC_RC2,j,count,d);
1327 #endif
1328 #ifndef OPENSSL_NO_RC5
1329 if (doit[D_CBC_RC5])
1331 for (j=0; j<SIZE_NUM; j++)
1333 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
1334 Time_F(START);
1335 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1336 RC5_32_cbc_encrypt(buf,buf,
1337 (unsigned long)lengths[j],&rc5_ks,
1338 iv,RC5_ENCRYPT);
1339 d=Time_F(STOP);
1340 print_result(D_CBC_RC5,j,count,d);
1343 #endif
1344 #ifndef OPENSSL_NO_BF
1345 if (doit[D_CBC_BF])
1347 for (j=0; j<SIZE_NUM; j++)
1349 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
1350 Time_F(START);
1351 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1352 BF_cbc_encrypt(buf,buf,
1353 (unsigned long)lengths[j],&bf_ks,
1354 iv,BF_ENCRYPT);
1355 d=Time_F(STOP);
1356 print_result(D_CBC_BF,j,count,d);
1359 #endif
1360 #ifndef OPENSSL_NO_CAST
1361 if (doit[D_CBC_CAST])
1363 for (j=0; j<SIZE_NUM; j++)
1365 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
1366 Time_F(START);
1367 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1368 CAST_cbc_encrypt(buf,buf,
1369 (unsigned long)lengths[j],&cast_ks,
1370 iv,CAST_ENCRYPT);
1371 d=Time_F(STOP);
1372 print_result(D_CBC_CAST,j,count,d);
1375 #endif
1377 if (doit[D_EVP])
1379 for (j=0; j<SIZE_NUM; j++)
1381 if (evp_cipher)
1383 EVP_CIPHER_CTX ctx;
1384 int outl;
1386 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
1387 /* -O3 -fschedule-insns messes up an
1388 * optimization here! names[D_EVP]
1389 * somehow becomes NULL */
1390 print_message(names[D_EVP],save_count,
1391 lengths[j]);
1393 EVP_CIPHER_CTX_init(&ctx);
1394 if(decrypt)
1395 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1396 else
1397 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1399 Time_F(START);
1400 if(decrypt)
1401 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1402 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1403 else
1404 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1405 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1406 if(decrypt)
1407 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1408 else
1409 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1410 d=Time_F(STOP);
1411 EVP_CIPHER_CTX_cleanup(&ctx);
1413 if (evp_md)
1415 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1416 print_message(names[D_EVP],save_count,
1417 lengths[j]);
1419 Time_F(START);
1420 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1421 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1423 d=Time_F(STOP);
1425 print_result(D_EVP,j,count,d);
1429 RAND_pseudo_bytes(buf,36);
1430 #ifndef OPENSSL_NO_RSA
1431 for (j=0; j<RSA_NUM; j++)
1433 int ret;
1434 if (!rsa_doit[j]) continue;
1435 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
1436 if (ret == 0)
1438 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1439 ERR_print_errors(bio_err);
1440 rsa_count=1;
1442 else
1444 pkey_print_message("private","rsa",
1445 rsa_c[j][0],rsa_bits[j],
1446 RSA_SECONDS);
1447 /* RSA_blinding_on(rsa_key[j],NULL); */
1448 Time_F(START);
1449 for (count=0,run=1; COND(rsa_c[j][0]); count++)
1451 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1452 &rsa_num, rsa_key[j]);
1453 if (ret == 0)
1455 BIO_printf(bio_err,
1456 "RSA sign failure\n");
1457 ERR_print_errors(bio_err);
1458 count=1;
1459 break;
1462 d=Time_F(STOP);
1463 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1464 : "%ld %d bit private RSA's in %.2fs\n",
1465 count,rsa_bits[j],d);
1466 rsa_results[j][0]=d/(double)count;
1467 rsa_count=count;
1470 #if 1
1471 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
1472 if (ret <= 0)
1474 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1475 ERR_print_errors(bio_err);
1476 rsa_doit[j] = 0;
1478 else
1480 pkey_print_message("public","rsa",
1481 rsa_c[j][1],rsa_bits[j],
1482 RSA_SECONDS);
1483 Time_F(START);
1484 for (count=0,run=1; COND(rsa_c[j][1]); count++)
1486 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1487 rsa_num, rsa_key[j]);
1488 if (ret == 0)
1490 BIO_printf(bio_err,
1491 "RSA verify failure\n");
1492 ERR_print_errors(bio_err);
1493 count=1;
1494 break;
1497 d=Time_F(STOP);
1498 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1499 : "%ld %d bit public RSA's in %.2fs\n",
1500 count,rsa_bits[j],d);
1501 rsa_results[j][1]=d/(double)count;
1503 #endif
1505 if (rsa_count <= 1)
1507 /* if longer than 10s, don't do any more */
1508 for (j++; j<RSA_NUM; j++)
1509 rsa_doit[j]=0;
1512 #endif
1514 RAND_pseudo_bytes(buf,20);
1515 #ifndef OPENSSL_NO_DSA
1516 if (RAND_status() != 1)
1518 RAND_seed(rnd_seed, sizeof rnd_seed);
1519 rnd_fake = 1;
1521 for (j=0; j<DSA_NUM; j++)
1523 unsigned int kk;
1524 int ret;
1526 if (!dsa_doit[j]) continue;
1527 /* DSA_generate_key(dsa_key[j]); */
1528 /* DSA_sign_setup(dsa_key[j],NULL); */
1529 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1530 &kk,dsa_key[j]);
1531 if (ret == 0)
1533 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1534 ERR_print_errors(bio_err);
1535 rsa_count=1;
1537 else
1539 pkey_print_message("sign","dsa",
1540 dsa_c[j][0],dsa_bits[j],
1541 DSA_SECONDS);
1542 Time_F(START);
1543 for (count=0,run=1; COND(dsa_c[j][0]); count++)
1545 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1546 &kk,dsa_key[j]);
1547 if (ret == 0)
1549 BIO_printf(bio_err,
1550 "DSA sign failure\n");
1551 ERR_print_errors(bio_err);
1552 count=1;
1553 break;
1556 d=Time_F(STOP);
1557 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1558 : "%ld %d bit DSA signs in %.2fs\n",
1559 count,dsa_bits[j],d);
1560 dsa_results[j][0]=d/(double)count;
1561 rsa_count=count;
1564 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1565 kk,dsa_key[j]);
1566 if (ret <= 0)
1568 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1569 ERR_print_errors(bio_err);
1570 dsa_doit[j] = 0;
1572 else
1574 pkey_print_message("verify","dsa",
1575 dsa_c[j][1],dsa_bits[j],
1576 DSA_SECONDS);
1577 Time_F(START);
1578 for (count=0,run=1; COND(dsa_c[j][1]); count++)
1580 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1581 kk,dsa_key[j]);
1582 if (ret <= 0)
1584 BIO_printf(bio_err,
1585 "DSA verify failure\n");
1586 ERR_print_errors(bio_err);
1587 count=1;
1588 break;
1591 d=Time_F(STOP);
1592 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1593 : "%ld %d bit DSA verify in %.2fs\n",
1594 count,dsa_bits[j],d);
1595 dsa_results[j][1]=d/(double)count;
1598 if (rsa_count <= 1)
1600 /* if longer than 10s, don't do any more */
1601 for (j++; j<DSA_NUM; j++)
1602 dsa_doit[j]=0;
1605 if (rnd_fake) RAND_cleanup();
1606 #endif
1607 #ifdef HAVE_FORK
1608 show_res:
1609 #endif
1610 if(!mr)
1612 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1613 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1614 printf("options:");
1615 printf("%s ",BN_options());
1616 #ifndef OPENSSL_NO_MD2
1617 printf("%s ",MD2_options());
1618 #endif
1619 #ifndef OPENSSL_NO_RC4
1620 printf("%s ",RC4_options());
1621 #endif
1622 #ifndef OPENSSL_NO_DES
1623 printf("%s ",DES_options());
1624 #endif
1625 #ifndef OPENSSL_NO_AES
1626 printf("%s ",AES_options());
1627 #endif
1628 #ifndef OPENSSL_NO_IDEA
1629 printf("%s ",idea_options());
1630 #endif
1631 #ifndef OPENSSL_NO_BF
1632 printf("%s ",BF_options());
1633 #endif
1634 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1635 printf("available timing options: ");
1636 #ifdef TIMES
1637 printf("TIMES ");
1638 #endif
1639 #ifdef TIMEB
1640 printf("TIMEB ");
1641 #endif
1642 #ifdef USE_TOD
1643 printf("USE_TOD ");
1644 #endif
1645 #ifdef HZ
1646 #define as_string(s) (#s)
1647 printf("HZ=%g", (double)HZ);
1648 # ifdef _SC_CLK_TCK
1649 printf(" [sysconf value]");
1650 # endif
1651 #endif
1652 printf("\n");
1653 printf("timing function used: %s%s%s%s%s%s%s\n",
1654 (ftime_used ? "ftime" : ""),
1655 (ftime_used + times_used > 1 ? "," : ""),
1656 (times_used ? "times" : ""),
1657 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1658 (gettimeofday_used ? "gettimeofday" : ""),
1659 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1660 (getrusage_used ? "getrusage" : ""));
1663 if (pr_header)
1665 if(mr)
1666 fprintf(stdout,"+H");
1667 else
1669 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1670 fprintf(stdout,"type ");
1672 for (j=0; j<SIZE_NUM; j++)
1673 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
1674 fprintf(stdout,"\n");
1677 for (k=0; k<ALGOR_NUM; k++)
1679 if (!doit[k]) continue;
1680 if(mr)
1681 fprintf(stdout,"+F:%d:%s",k,names[k]);
1682 else
1683 fprintf(stdout,"%-13s",names[k]);
1684 for (j=0; j<SIZE_NUM; j++)
1686 if (results[k][j] > 10000 && !mr)
1687 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1688 else
1689 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
1691 fprintf(stdout,"\n");
1693 #ifndef OPENSSL_NO_RSA
1694 j=1;
1695 for (k=0; k<RSA_NUM; k++)
1697 if (!rsa_doit[k]) continue;
1698 if (j && !mr)
1700 printf("%18ssign verify sign/s verify/s\n"," ");
1701 j=0;
1703 if(mr)
1704 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1705 k,rsa_bits[k],rsa_results[k][0],
1706 rsa_results[k][1]);
1707 else
1708 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1709 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1710 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
1712 #endif
1713 #ifndef OPENSSL_NO_DSA
1714 j=1;
1715 for (k=0; k<DSA_NUM; k++)
1717 if (!dsa_doit[k]) continue;
1718 if (j && !mr)
1720 printf("%18ssign verify sign/s verify/s\n"," ");
1721 j=0;
1723 if(mr)
1724 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1725 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1726 else
1727 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1728 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1729 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
1731 #endif
1732 mret=0;
1733 end:
1734 ERR_print_errors(bio_err);
1735 if (buf != NULL) OPENSSL_free(buf);
1736 if (buf2 != NULL) OPENSSL_free(buf2);
1737 #ifndef OPENSSL_NO_RSA
1738 for (i=0; i<RSA_NUM; i++)
1739 if (rsa_key[i] != NULL)
1740 RSA_free(rsa_key[i]);
1741 #endif
1742 #ifndef OPENSSL_NO_DSA
1743 for (i=0; i<DSA_NUM; i++)
1744 if (dsa_key[i] != NULL)
1745 DSA_free(dsa_key[i]);
1746 #endif
1747 apps_shutdown();
1748 OPENSSL_EXIT(mret);
1751 static void print_message(const char *s, long num, int length)
1753 #ifdef SIGALRM
1754 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1755 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
1756 (void)BIO_flush(bio_err);
1757 alarm(SECONDS);
1758 #else
1759 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1760 : "Doing %s %ld times on %d size blocks: ",s,num,length);
1761 (void)BIO_flush(bio_err);
1762 #endif
1763 #ifdef LINT
1764 num=num;
1765 #endif
1768 static void pkey_print_message(char *str, char *str2, long num, int bits,
1769 int tm)
1771 #ifdef SIGALRM
1772 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1773 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
1774 (void)BIO_flush(bio_err);
1775 alarm(RSA_SECONDS);
1776 #else
1777 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1778 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
1779 (void)BIO_flush(bio_err);
1780 #endif
1781 #ifdef LINT
1782 num=num;
1783 #endif
1786 static void print_result(int alg,int run_no,int count,double time_used)
1788 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1789 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1790 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1793 static char *sstrsep(char **string, const char *delim)
1795 char isdelim[256];
1796 char *token = *string;
1798 if (**string == 0)
1799 return NULL;
1801 memset(isdelim, 0, sizeof isdelim);
1802 isdelim[0] = 1;
1804 while (*delim)
1806 isdelim[(unsigned char)(*delim)] = 1;
1807 delim++;
1810 while (!isdelim[(unsigned char)(**string)])
1812 (*string)++;
1815 if (**string)
1817 **string = 0;
1818 (*string)++;
1821 return token;
1824 #ifdef HAVE_FORK
1825 static int do_multi(int multi)
1827 int n;
1828 int fd[2];
1829 int *fds;
1830 static char sep[]=":";
1832 fds=malloc(multi*sizeof *fds);
1833 for(n=0 ; n < multi ; ++n)
1835 pipe(fd);
1836 if(fork())
1838 close(fd[1]);
1839 fds[n]=fd[0];
1841 else
1843 close(fd[0]);
1844 close(1);
1845 dup(fd[1]);
1846 close(fd[1]);
1847 mr=1;
1848 usertime=0;
1849 return 0;
1851 printf("Forked child %d\n",n);
1854 /* for now, assume the pipe is long enough to take all the output */
1855 for(n=0 ; n < multi ; ++n)
1857 FILE *f;
1858 char buf[1024];
1859 char *p;
1861 f=fdopen(fds[n],"r");
1862 while(fgets(buf,sizeof buf,f))
1864 p=strchr(buf,'\n');
1865 if(p)
1866 *p='\0';
1867 if(buf[0] != '+')
1869 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1870 buf,n);
1871 continue;
1873 printf("Got: %s from %d\n",buf,n);
1874 if(!strncmp(buf,"+F:",3))
1876 int alg;
1877 int j;
1879 p=buf+3;
1880 alg=atoi(sstrsep(&p,sep));
1881 sstrsep(&p,sep);
1882 for(j=0 ; j < SIZE_NUM ; ++j)
1883 results[alg][j]+=atof(sstrsep(&p,sep));
1885 else if(!strncmp(buf,"+F2:",4))
1887 int k;
1888 double d;
1890 p=buf+4;
1891 k=atoi(sstrsep(&p,sep));
1892 sstrsep(&p,sep);
1894 d=atof(sstrsep(&p,sep));
1895 if(n)
1896 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1897 else
1898 rsa_results[k][0]=d;
1900 d=atof(sstrsep(&p,sep));
1901 if(n)
1902 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1903 else
1904 rsa_results[k][1]=d;
1906 else if(!strncmp(buf,"+F2:",4))
1908 int k;
1909 double d;
1911 p=buf+4;
1912 k=atoi(sstrsep(&p,sep));
1913 sstrsep(&p,sep);
1915 d=atof(sstrsep(&p,sep));
1916 if(n)
1917 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1918 else
1919 rsa_results[k][0]=d;
1921 d=atof(sstrsep(&p,sep));
1922 if(n)
1923 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1924 else
1925 rsa_results[k][1]=d;
1927 else if(!strncmp(buf,"+F3:",4))
1929 int k;
1930 double d;
1932 p=buf+4;
1933 k=atoi(sstrsep(&p,sep));
1934 sstrsep(&p,sep);
1936 d=atof(sstrsep(&p,sep));
1937 if(n)
1938 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1939 else
1940 dsa_results[k][0]=d;
1942 d=atof(sstrsep(&p,sep));
1943 if(n)
1944 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1945 else
1946 dsa_results[k][1]=d;
1948 else if(!strncmp(buf,"+H:",3))
1951 else
1952 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
1955 return 1;
1957 #endif
1958 #endif