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