1 /* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
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.
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
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
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
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 */
72 #define PROG speed_main
80 #ifdef OPENSSL_NO_STDIO
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
92 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
94 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
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 */
105 # include <sys/types.h>
106 # include <sys/times.h>
109 # include <sys/time.h>
110 # include <sys/resource.h>
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)
122 #include <sys/timeb.h>
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!"
129 #if defined(sun) || defined(__ultrix)
130 #define _POSIX_SOURCE
132 #include <sys/param.h>
135 #ifndef OPENSSL_NO_DES
136 #include <openssl/des.h>
138 #ifndef OPENSSL_NO_AES
139 #include <openssl/aes.h>
141 #ifndef OPENSSL_NO_MD2
142 #include <openssl/md2.h>
144 #ifndef OPENSSL_NO_MDC2
145 #include <openssl/mdc2.h>
147 #ifndef OPENSSL_NO_MD4
148 #include <openssl/md4.h>
150 #ifndef OPENSSL_NO_MD5
151 #include <openssl/md5.h>
153 #ifndef OPENSSL_NO_HMAC
154 #include <openssl/hmac.h>
156 #include <openssl/evp.h>
157 #ifndef OPENSSL_NO_SHA
158 #include <openssl/sha.h>
160 #ifndef OPENSSL_NO_RIPEMD
161 #include <openssl/ripemd.h>
163 #ifndef OPENSSL_NO_RC4
164 #include <openssl/rc4.h>
166 #ifndef OPENSSL_NO_RC5
167 #include <openssl/rc5.h>
169 #ifndef OPENSSL_NO_RC2
170 #include <openssl/rc2.h>
172 #ifndef OPENSSL_NO_IDEA
173 #include <openssl/idea.h>
175 #ifndef OPENSSL_NO_BF
176 #include <openssl/blowfish.h>
178 #ifndef OPENSSL_NO_CAST
179 #include <openssl/cast.h>
181 #ifndef OPENSSL_NO_RSA
182 #include <openssl/rsa.h>
183 #include "./testrsa.h"
185 #include <openssl/x509.h>
186 #ifndef OPENSSL_NO_DSA
187 #include "./testdsa.h"
190 /* The following if from times(3) man page. It may need to be changed */
192 # if defined(_SC_CLK_TCK) \
193 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
194 # define HZ ((double)sysconf(_SC_CLK_TCK))
197 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
199 # else /* _BSD_CLK_TCK_ */
200 # define HZ ((double)_BSD_CLK_TCK_)
203 # define HZ ((double)CLK_TCK)
208 #if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
213 #define BUFSIZE ((long)1024*8+1)
216 static char ftime_used
= 0, times_used
= 0, gettimeofday_used
= 0, getrusage_used
= 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
);
225 static int do_multi(int multi
);
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];
243 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
244 #define SIGRETTYPE void
246 #define SIGRETTYPE int
249 static SIGRETTYPE
sig_done(int sig
);
250 static SIGRETTYPE
sig_done(int sig
)
252 signal(SIGALRM
,sig_done
);
263 static double Time_F(int s
)
270 static struct rusage tstart
,tend
;
275 getrusage(RUSAGE_SELF
,&tstart
);
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
);
291 static struct timeval tstart
,tend
;
294 gettimeofday_used
= 1;
297 gettimeofday(&tstart
,NULL
);
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 */
313 static struct tms tstart
,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)
332 # ifdef OPENSSL_SYS_VXWORKS
334 static unsigned long tick_start
, tick_end
;
338 tick_start
= tickGet();
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
;
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
);
371 int MAIN(int, char **);
373 int MAIN(int argc
, char **argv
)
375 #ifndef OPENSSL_NO_ENGINE
378 unsigned char *buf
=NULL
,*buf2
=NULL
;
380 long count
=0,save_count
=0;
382 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
385 #ifndef OPENSSL_NO_RSA
388 unsigned char md
[EVP_MAX_MD_SIZE
];
389 #ifndef OPENSSL_NO_MD2
390 unsigned char md2
[MD2_DIGEST_LENGTH
];
392 #ifndef OPENSSL_NO_MDC2
393 unsigned char mdc2
[MDC2_DIGEST_LENGTH
];
395 #ifndef OPENSSL_NO_MD4
396 unsigned char md4
[MD4_DIGEST_LENGTH
];
398 #ifndef OPENSSL_NO_MD5
399 unsigned char md5
[MD5_DIGEST_LENGTH
];
400 unsigned char hmac
[MD5_DIGEST_LENGTH
];
402 #ifndef OPENSSL_NO_SHA
403 unsigned char sha
[SHA_DIGEST_LENGTH
];
405 #ifndef OPENSSL_NO_RIPEMD
406 unsigned char rmd160
[RIPEMD160_DIGEST_LENGTH
];
408 #ifndef OPENSSL_NO_RC4
411 #ifndef OPENSSL_NO_RC5
414 #ifndef OPENSSL_NO_RC2
417 #ifndef OPENSSL_NO_IDEA
418 IDEA_KEY_SCHEDULE idea_ks
;
420 #ifndef OPENSSL_NO_BF
423 #ifndef OPENSSL_NO_CAST
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
441 #define MAX_BLOCK_SIZE 64
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
;
454 #ifndef OPENSSL_NO_AES
455 AES_KEY aes_ks1
, aes_ks2
, aes_ks3
;
467 #define D_CBC_IDEA 10
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
477 long c
[ALGOR_NUM
][SIZE_NUM
];
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
)};
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};
500 int rsa_doit
[RSA_NUM
];
501 int dsa_doit
[DSA_NUM
];
504 const EVP_CIPHER
*evp_cipher
=NULL
;
505 const EVP_MD
*evp_md
=NULL
;
516 memset(results
, 0, sizeof(results
));
517 #ifndef OPENSSL_NO_DSA
518 memset(dsa_key
,0,sizeof(dsa_key
));
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
))
528 #ifndef OPENSSL_NO_RSA
529 memset(rsa_key
,0,sizeof(rsa_key
));
530 for (i
=0; i
<RSA_NUM
; i
++)
534 if ((buf
=(unsigned char *)OPENSSL_malloc((int)BUFSIZE
)) == NULL
)
536 BIO_printf(bio_err
,"out of memory\n");
539 #ifndef OPENSSL_NO_DES
540 buf_as_des_cblock
= (DES_cblock
*)buf
;
542 if ((buf2
=(unsigned char *)OPENSSL_malloc((int)BUFSIZE
)) == NULL
)
544 BIO_printf(bio_err
,"out of memory\n");
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
++)
554 for (i
=0; i
<RSA_NUM
; i
++)
556 for (i
=0; i
<DSA_NUM
; i
++)
564 if ((argc
> 0) && (strcmp(*argv
,"-elapsed") == 0))
567 j
--; /* Otherwise, -elapsed gets confused with
570 else if ((argc
> 0) && (strcmp(*argv
,"-evp") == 0))
576 BIO_printf(bio_err
,"no EVP given\n");
579 evp_cipher
=EVP_get_cipherbyname(*argv
);
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
);
591 else if (argc
> 0 && !strcmp(*argv
,"-decrypt"))
594 j
--; /* Otherwise, -elapsed gets confused with
597 #ifndef OPENSSL_NO_ENGINE
598 else if ((argc
> 0) && (strcmp(*argv
,"-engine") == 0))
604 BIO_printf(bio_err
,"no engine given\n");
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) */
616 else if ((argc
> 0) && (strcmp(*argv
,"-multi") == 0))
622 BIO_printf(bio_err
,"no multi count given\n");
628 BIO_printf(bio_err
,"bad multi count\n");
631 j
--; /* Otherwise, -mr gets confused with
635 else if (argc
> 0 && !strcmp(*argv
,"-mr"))
638 j
--; /* Otherwise, -mr gets confused with
642 #ifndef OPENSSL_NO_MD2
643 if (strcmp(*argv
,"md2") == 0) doit
[D_MD2
]=1;
646 #ifndef OPENSSL_NO_MDC2
647 if (strcmp(*argv
,"mdc2") == 0) doit
[D_MDC2
]=1;
650 #ifndef OPENSSL_NO_MD4
651 if (strcmp(*argv
,"md4") == 0) doit
[D_MD4
]=1;
654 #ifndef OPENSSL_NO_MD5
655 if (strcmp(*argv
,"md5") == 0) doit
[D_MD5
]=1;
658 #ifndef OPENSSL_NO_MD5
659 if (strcmp(*argv
,"hmac") == 0) doit
[D_HMAC
]=1;
662 #ifndef OPENSSL_NO_SHA
663 if (strcmp(*argv
,"sha1") == 0) doit
[D_SHA1
]=1;
665 if (strcmp(*argv
,"sha") == 0) doit
[D_SHA1
]=1;
668 #ifndef OPENSSL_NO_RIPEMD
669 if (strcmp(*argv
,"ripemd") == 0) doit
[D_RMD160
]=1;
671 if (strcmp(*argv
,"rmd160") == 0) doit
[D_RMD160
]=1;
673 if (strcmp(*argv
,"ripemd160") == 0) doit
[D_RMD160
]=1;
676 #ifndef OPENSSL_NO_RC4
677 if (strcmp(*argv
,"rc4") == 0) doit
[D_RC4
]=1;
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;
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;
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());
701 if (strcmp(*argv
,"openssl") == 0)
703 RSA_set_default_method(RSA_PKCS1_SSLeay());
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;
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;
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;
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;
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;
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;
744 #ifndef OPENSSL_NO_DES
745 if (strcmp(*argv
,"des") == 0)
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;
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;
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;
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 ");
787 #ifndef OPENSSL_NO_MDC2
788 BIO_printf(bio_err
,"mdc2 ");
790 #ifndef OPENSSL_NO_MD4
791 BIO_printf(bio_err
,"md4 ");
793 #ifndef OPENSSL_NO_MD5
794 BIO_printf(bio_err
,"md5 ");
795 #ifndef OPENSSL_NO_HMAC
796 BIO_printf(bio_err
,"hmac ");
799 #ifndef OPENSSL_NO_SHA1
800 BIO_printf(bio_err
,"sha1 ");
802 #ifndef OPENSSL_NO_RIPEMD160
803 BIO_printf(bio_err
,"rmd160");
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");
811 #ifndef OPENSSL_NO_IDEA
812 BIO_printf(bio_err
,"idea-cbc ");
814 #ifndef OPENSSL_NO_RC2
815 BIO_printf(bio_err
,"rc2-cbc ");
817 #ifndef OPENSSL_NO_RC5
818 BIO_printf(bio_err
,"rc5-cbc ");
820 #ifndef OPENSSL_NO_BF
821 BIO_printf(bio_err
,"bf-cbc");
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");
827 #ifndef OPENSSL_NO_DES
828 BIO_printf(bio_err
,"des-cbc des-ede3 ");
830 #ifndef OPENSSL_NO_AES
831 BIO_printf(bio_err
,"aes-128-cbc aes-192-cbc aes-256-cbc ");
833 #ifndef OPENSSL_NO_RC4
834 BIO_printf(bio_err
,"rc4");
836 BIO_printf(bio_err
,"\n");
838 #ifndef OPENSSL_NO_RSA
839 BIO_printf(bio_err
,"rsa512 rsa1024 rsa2048 rsa4096\n");
842 #ifndef OPENSSL_NO_DSA
843 BIO_printf(bio_err
,"dsa512 dsa1024 dsa2048\n");
846 #ifndef OPENSSL_NO_IDEA
847 BIO_printf(bio_err
,"idea ");
849 #ifndef OPENSSL_NO_RC2
850 BIO_printf(bio_err
,"rc2 ");
852 #ifndef OPENSSL_NO_DES
853 BIO_printf(bio_err
,"des ");
855 #ifndef OPENSSL_NO_AES
856 BIO_printf(bio_err
,"aes ");
858 #ifndef OPENSSL_NO_RSA
859 BIO_printf(bio_err
,"rsa ");
861 #ifndef OPENSSL_NO_BF
862 BIO_printf(bio_err
,"blowfish");
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");
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");
875 #ifndef OPENSSL_NO_ENGINE
876 BIO_printf(bio_err
,"-engine e use engine e, possibly a hardware device.\n");
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");
882 BIO_printf(bio_err
,"-multi n run n benchmarks in parallel.\n");
892 if(multi
&& do_multi(multi
))
898 for (i
=0; i
<ALGOR_NUM
; i
++)
903 for (i
=0; i
<RSA_NUM
; i
++)
905 for (i
=0; i
<DSA_NUM
; i
++)
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
;
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
);
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");
944 #ifndef OPENSSL_NO_DSA
945 dsa_key
[0]=get_dsa512();
946 dsa_key
[1]=get_dsa1024();
947 dsa_key
[2]=get_dsa2048();
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
);
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
);
960 #ifndef OPENSSL_NO_IDEA
961 idea_set_encrypt_key(key16
,&idea_ks
);
963 #ifndef OPENSSL_NO_RC4
964 RC4_set_key(&rc4_ks
,16,key16
);
966 #ifndef OPENSSL_NO_RC2
967 RC2_set_key(&rc2_ks
,16,key16
,128);
969 #ifndef OPENSSL_NO_RC5
970 RC5_32_set_key(&rc5_ks
,16,key16
,12);
972 #ifndef OPENSSL_NO_BF
973 BF_set_key(&bf_ks
,16,key16
);
975 #ifndef OPENSSL_NO_CAST
976 CAST_set_key(&cast_ks
,16,key16
);
978 #ifndef OPENSSL_NO_RSA
979 memset(rsa_c
,0,sizeof(rsa_c
));
982 #ifndef OPENSSL_NO_DES
983 BIO_printf(bio_err
,"First we calculate the approximate speed ...\n");
989 for (i
=count
; i
; i
--)
990 DES_ecb_encrypt(buf_as_des_cblock
,buf_as_des_cblock
,
995 c
[D_MD2
][0]=count
/10;
996 c
[D_MDC2
][0]=count
/10;
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
++)
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))
1053 if (rsa_c
[i
][0] == 0)
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))
1082 #define COND(d) (count < (d))
1083 #define COUNT(d) (d)
1085 /* not worth fixing */
1086 # error "You cannot disable DES on systems without SIGALRM."
1087 #endif /* OPENSSL_NO_DES */
1089 #define COND(c) (run)
1090 #define COUNT(d) (count)
1091 signal(SIGALRM
,sig_done
);
1092 #endif /* SIGALRM */
1094 #ifndef OPENSSL_NO_MD2
1097 for (j
=0; j
<SIZE_NUM
; j
++)
1099 print_message(names
[D_MD2
],c
[D_MD2
][j
],lengths
[j
]);
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
);
1104 print_result(D_MD2
,j
,count
,d
);
1108 #ifndef OPENSSL_NO_MDC2
1111 for (j
=0; j
<SIZE_NUM
; j
++)
1113 print_message(names
[D_MDC2
],c
[D_MDC2
][j
],lengths
[j
]);
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
);
1118 print_result(D_MDC2
,j
,count
,d
);
1123 #ifndef OPENSSL_NO_MD4
1126 for (j
=0; j
<SIZE_NUM
; j
++)
1128 print_message(names
[D_MD4
],c
[D_MD4
][j
],lengths
[j
]);
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
);
1133 print_result(D_MD4
,j
,count
,d
);
1138 #ifndef OPENSSL_NO_MD5
1141 for (j
=0; j
<SIZE_NUM
; j
++)
1143 print_message(names
[D_MD5
],c
[D_MD5
][j
],lengths
[j
]);
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
);
1148 print_result(D_MD5
,j
,count
,d
);
1153 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
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
]);
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
);
1173 print_result(D_HMAC
,j
,count
,d
);
1175 HMAC_CTX_cleanup(&hctx
);
1178 #ifndef OPENSSL_NO_SHA
1181 for (j
=0; j
<SIZE_NUM
; j
++)
1183 print_message(names
[D_SHA1
],c
[D_SHA1
][j
],lengths
[j
]);
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
);
1188 print_result(D_SHA1
,j
,count
,d
);
1192 #ifndef OPENSSL_NO_RIPEMD
1195 for (j
=0; j
<SIZE_NUM
; j
++)
1197 print_message(names
[D_RMD160
],c
[D_RMD160
][j
],lengths
[j
]);
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
);
1202 print_result(D_RMD160
,j
,count
,d
);
1206 #ifndef OPENSSL_NO_RC4
1209 for (j
=0; j
<SIZE_NUM
; j
++)
1211 print_message(names
[D_RC4
],c
[D_RC4
][j
],lengths
[j
]);
1213 for (count
=0,run
=1; COND(c
[D_RC4
][j
]); count
++)
1214 RC4(&rc4_ks
,(unsigned int)lengths
[j
],
1217 print_result(D_RC4
,j
,count
,d
);
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
]);
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
);
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
]);
1242 for (count
=0,run
=1; COND(c
[D_EDE3_DES
][j
]); count
++)
1243 DES_ede3_cbc_encrypt(buf
,buf
,lengths
[j
],
1245 &DES_iv
,DES_ENCRYPT
);
1247 print_result(D_EDE3_DES
,j
,count
,d
);
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
]);
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
,
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
]);
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
,
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
]);
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
,
1291 print_result(D_CBC_256_AES
,j
,count
,d
);
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
]);
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
,
1308 print_result(D_CBC_IDEA
,j
,count
,d
);
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
]);
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
,
1324 print_result(D_CBC_RC2
,j
,count
,d
);
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
]);
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
,
1340 print_result(D_CBC_RC5
,j
,count
,d
);
1344 #ifndef OPENSSL_NO_BF
1347 for (j
=0; j
<SIZE_NUM
; j
++)
1349 print_message(names
[D_CBC_BF
],c
[D_CBC_BF
][j
],lengths
[j
]);
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
,
1356 print_result(D_CBC_BF
,j
,count
,d
);
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
]);
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
,
1372 print_result(D_CBC_CAST
,j
,count
,d
);
1379 for (j
=0; j
<SIZE_NUM
; j
++)
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
,
1393 EVP_CIPHER_CTX_init(&ctx
);
1395 EVP_DecryptInit_ex(&ctx
,evp_cipher
,NULL
,key16
,iv
);
1397 EVP_EncryptInit_ex(&ctx
,evp_cipher
,NULL
,key16
,iv
);
1401 for (count
=0,run
=1; COND(save_count
*4*lengths
[0]/lengths
[j
]); count
++)
1402 EVP_DecryptUpdate(&ctx
,buf
,&outl
,buf
,lengths
[j
]);
1404 for (count
=0,run
=1; COND(save_count
*4*lengths
[0]/lengths
[j
]); count
++)
1405 EVP_EncryptUpdate(&ctx
,buf
,&outl
,buf
,lengths
[j
]);
1407 EVP_DecryptFinal_ex(&ctx
,buf
,&outl
);
1409 EVP_EncryptFinal_ex(&ctx
,buf
,&outl
);
1411 EVP_CIPHER_CTX_cleanup(&ctx
);
1415 names
[D_EVP
]=OBJ_nid2ln(evp_md
->type
);
1416 print_message(names
[D_EVP
],save_count
,
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
);
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
++)
1434 if (!rsa_doit
[j
]) continue;
1435 ret
=RSA_sign(NID_md5_sha1
, buf
,36, buf2
, &rsa_num
, rsa_key
[j
]);
1438 BIO_printf(bio_err
,"RSA sign failure. No RSA sign will be done.\n");
1439 ERR_print_errors(bio_err
);
1444 pkey_print_message("private","rsa",
1445 rsa_c
[j
][0],rsa_bits
[j
],
1447 /* RSA_blinding_on(rsa_key[j],NULL); */
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
]);
1456 "RSA sign failure\n");
1457 ERR_print_errors(bio_err
);
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
;
1471 ret
=RSA_verify(NID_md5_sha1
, buf
,36, buf2
, rsa_num
, rsa_key
[j
]);
1474 BIO_printf(bio_err
,"RSA verify failure. No RSA verify will be done.\n");
1475 ERR_print_errors(bio_err
);
1480 pkey_print_message("public","rsa",
1481 rsa_c
[j
][1],rsa_bits
[j
],
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
]);
1491 "RSA verify failure\n");
1492 ERR_print_errors(bio_err
);
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
;
1507 /* if longer than 10s, don't do any more */
1508 for (j
++; j
<RSA_NUM
; j
++)
1514 RAND_pseudo_bytes(buf
,20);
1515 #ifndef OPENSSL_NO_DSA
1516 if (RAND_status() != 1)
1518 RAND_seed(rnd_seed
, sizeof rnd_seed
);
1521 for (j
=0; j
<DSA_NUM
; j
++)
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
,
1533 BIO_printf(bio_err
,"DSA sign failure. No DSA sign will be done.\n");
1534 ERR_print_errors(bio_err
);
1539 pkey_print_message("sign","dsa",
1540 dsa_c
[j
][0],dsa_bits
[j
],
1543 for (count
=0,run
=1; COND(dsa_c
[j
][0]); count
++)
1545 ret
=DSA_sign(EVP_PKEY_DSA
,buf
,20,buf2
,
1550 "DSA sign failure\n");
1551 ERR_print_errors(bio_err
);
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
;
1564 ret
=DSA_verify(EVP_PKEY_DSA
,buf
,20,buf2
,
1568 BIO_printf(bio_err
,"DSA verify failure. No DSA verify will be done.\n");
1569 ERR_print_errors(bio_err
);
1574 pkey_print_message("verify","dsa",
1575 dsa_c
[j
][1],dsa_bits
[j
],
1578 for (count
=0,run
=1; COND(dsa_c
[j
][1]); count
++)
1580 ret
=DSA_verify(EVP_PKEY_DSA
,buf
,20,buf2
,
1585 "DSA verify failure\n");
1586 ERR_print_errors(bio_err
);
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
;
1600 /* if longer than 10s, don't do any more */
1601 for (j
++; j
<DSA_NUM
; j
++)
1605 if (rnd_fake
) RAND_cleanup();
1612 fprintf(stdout
,"%s\n",SSLeay_version(SSLEAY_VERSION
));
1613 fprintf(stdout
,"%s\n",SSLeay_version(SSLEAY_BUILT_ON
));
1615 printf("%s ",BN_options());
1616 #ifndef OPENSSL_NO_MD2
1617 printf("%s ",MD2_options());
1619 #ifndef OPENSSL_NO_RC4
1620 printf("%s ",RC4_options());
1622 #ifndef OPENSSL_NO_DES
1623 printf("%s ",DES_options());
1625 #ifndef OPENSSL_NO_AES
1626 printf("%s ",AES_options());
1628 #ifndef OPENSSL_NO_IDEA
1629 printf("%s ",idea_options());
1631 #ifndef OPENSSL_NO_BF
1632 printf("%s ",BF_options());
1634 fprintf(stdout
,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS
));
1635 printf("available timing options: ");
1646 #define as_string(s) (#s)
1647 printf("HZ=%g", (double)HZ
);
1649 printf(" [sysconf value]");
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" : ""));
1666 fprintf(stdout
,"+H");
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;
1681 fprintf(stdout
,"+F:%d:%s",k
,names
[k
]);
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
);
1689 fprintf(stdout
,mr
? ":%.2f" : " %11.2f ",results
[k
][j
]);
1691 fprintf(stdout
,"\n");
1693 #ifndef OPENSSL_NO_RSA
1695 for (k
=0; k
<RSA_NUM
; k
++)
1697 if (!rsa_doit
[k
]) continue;
1700 printf("%18ssign verify sign/s verify/s\n"," ");
1704 fprintf(stdout
,"+F2:%u:%u:%f:%f\n",
1705 k
,rsa_bits
[k
],rsa_results
[k
][0],
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]);
1713 #ifndef OPENSSL_NO_DSA
1715 for (k
=0; k
<DSA_NUM
; k
++)
1717 if (!dsa_doit
[k
]) continue;
1720 printf("%18ssign verify sign/s verify/s\n"," ");
1724 fprintf(stdout
,"+F3:%u:%u:%f:%f\n",
1725 k
,dsa_bits
[k
],dsa_results
[k
][0],dsa_results
[k
][1]);
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]);
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
]);
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
]);
1751 static void print_message(const char *s
, long num
, int length
)
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
);
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
);
1768 static void pkey_print_message(char *str
, char *str2
, long num
, int bits
,
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
);
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
);
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
)
1796 char *token
= *string
;
1801 memset(isdelim
, 0, sizeof isdelim
);
1806 isdelim
[(unsigned char)(*delim
)] = 1;
1810 while (!isdelim
[(unsigned char)(**string
)])
1825 static int do_multi(int multi
)
1830 static char sep
[]=":";
1832 fds
=malloc(multi
*sizeof *fds
);
1833 for(n
=0 ; n
< multi
; ++n
)
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
)
1861 f
=fdopen(fds
[n
],"r");
1862 while(fgets(buf
,sizeof buf
,f
))
1869 fprintf(stderr
,"Don't understand line '%s' from child %d\n",
1873 printf("Got: %s from %d\n",buf
,n
);
1874 if(!strncmp(buf
,"+F:",3))
1880 alg
=atoi(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))
1891 k
=atoi(sstrsep(&p
,sep
));
1894 d
=atof(sstrsep(&p
,sep
));
1896 rsa_results
[k
][0]=1/(1/rsa_results
[k
][0]+1/d
);
1898 rsa_results
[k
][0]=d
;
1900 d
=atof(sstrsep(&p
,sep
));
1902 rsa_results
[k
][1]=1/(1/rsa_results
[k
][1]+1/d
);
1904 rsa_results
[k
][1]=d
;
1906 else if(!strncmp(buf
,"+F2:",4))
1912 k
=atoi(sstrsep(&p
,sep
));
1915 d
=atof(sstrsep(&p
,sep
));
1917 rsa_results
[k
][0]=1/(1/rsa_results
[k
][0]+1/d
);
1919 rsa_results
[k
][0]=d
;
1921 d
=atof(sstrsep(&p
,sep
));
1923 rsa_results
[k
][1]=1/(1/rsa_results
[k
][1]+1/d
);
1925 rsa_results
[k
][1]=d
;
1927 else if(!strncmp(buf
,"+F3:",4))
1933 k
=atoi(sstrsep(&p
,sep
));
1936 d
=atof(sstrsep(&p
,sep
));
1938 dsa_results
[k
][0]=1/(1/dsa_results
[k
][0]+1/d
);
1940 dsa_results
[k
][0]=d
;
1942 d
=atof(sstrsep(&p
,sep
));
1944 dsa_results
[k
][1]=1/(1/dsa_results
[k
][1]+1/d
);
1946 dsa_results
[k
][1]=d
;
1948 else if(!strncmp(buf
,"+H:",3))
1952 fprintf(stderr
,"Unknown type '%s' from child %d\n",buf
,n
);