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