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