2 /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
59 /* most of this code has been pilfered from my libdes speed.c program */
63 #define RSA_SECONDS 10
64 #define DSA_SECONDS 10
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 */
70 #define PROG speed_main
93 #include <sys/types.h>
94 #include <sys/times.h>
101 time_t tms_uchild
; /* I dunno... */
102 time_t tms_uchildsys
; /* so these names are a guess :-) */
106 #include <sys/timeb.h>
111 #include <sys/param.h>
126 #if !defined(NO_SHA) && !defined(NO_SHA1)
139 #include "blowfish.h"
145 #include "./testrsa.h"
147 #include "./testdsa.h"
150 /* The following if from times(3) man page. It may need to be changed */
153 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
159 # else /* _BSD_CLK_TCK_ */
160 # define HZ ((double)_BSD_CLK_TCK_)
163 # define HZ ((double)CLK_TCK)
168 #define BUFSIZE ((long)1024*8)
172 static double Time_F(int s
);
173 static void print_message(char *s
,long num
,int length
);
174 static void pkey_print_message(char *str
,char *str2
,long num
,int bits
,int sec
);
176 static double Time_F();
177 static void print_message();
178 static void pkey_print_message();
182 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
183 #define SIGRETTYPE void
185 #define SIGRETTYPE int
189 static SIGRETTYPE
sig_done(int sig
);
191 static SIGRETTYPE
sig_done();
194 static SIGRETTYPE
sig_done(sig
)
197 signal(SIGALRM
,sig_done
);
208 static double Time_F(s
)
213 static struct tms tstart
,tend
;
223 ret
=((double)(tend
.tms_utime
-tstart
.tms_utime
))/HZ
;
224 return((ret
< 1e-3)?1e-3:ret
);
227 static struct timeb tstart
,tend
;
238 i
=(long)tend
.millitm
-(long)tstart
.millitm
;
239 ret
=((double)(tend
.time
-tstart
.time
))+((double)i
)/1000.0;
240 return((ret
< 0.001)?0.001:ret
);
249 unsigned char *buf
=NULL
,*buf2
=NULL
;
255 long count
,rsa_count
;
256 int i
,j
,k
,rsa_num
,rsa_num2
;
259 unsigned char md2
[MD2_DIGEST_LENGTH
];
262 unsigned char mdc2
[MDC2_DIGEST_LENGTH
];
265 unsigned char md5
[MD5_DIGEST_LENGTH
];
267 #if !defined(NO_SHA) || !defined(NO_SHA1)
268 unsigned char sha
[SHA_DIGEST_LENGTH
];
277 IDEA_KEY_SCHEDULE idea_ks
;
282 static unsigned char key16
[16]=
283 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
284 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
287 static des_cblock key
={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
288 static des_cblock key2
={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
289 static des_cblock key3
={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
290 des_key_schedule sch
,sch2
,sch3
;
303 double d
,results
[ALGOR_NUM
][SIZE_NUM
];
304 static int lengths
[SIZE_NUM
]={8,64,256,1024,8*1024};
305 long c
[ALGOR_NUM
][SIZE_NUM
];
306 static char *names
[ALGOR_NUM
]={
307 "md2","mdc2","md5","sha","sha1","rc4",
308 "des cbc","des ede3","idea cbc",
309 "rc2 cbc","blowfish cbc"};
317 RSA
*rsa_key
[RSA_NUM
];
318 DSA
*dsa_key
[DSA_NUM
];
319 long rsa_c
[RSA_NUM
][2];
320 long dsa_c
[DSA_NUM
][2];
322 double rsa_results
[RSA_NUM
][2];
325 double dsa_results
[DSA_NUM
][2];
327 static unsigned int rsa_bits
[RSA_NUM
]={512,1024,2048,4096};
328 static unsigned int dsa_bits
[DSA_NUM
]={512,1024,2048};
329 static unsigned char *rsa_data
[RSA_NUM
]=
330 {test512
,test1024
,test2048
,test4096
};
331 static int rsa_data_length
[RSA_NUM
]={
332 sizeof(test512
),sizeof(test1024
),
333 sizeof(test2048
),sizeof(test4096
)};
335 int rsa_doit
[RSA_NUM
];
336 int dsa_doit
[DSA_NUM
];
342 if ((bio_err
=BIO_new(BIO_s_file())) != NULL
)
343 BIO_set_fp(bio_err
,stderr
,BIO_NOCLOSE
);
345 for (i
=0; i
<RSA_NUM
; i
++)
348 if ((buf
=(unsigned char *)Malloc((int)BUFSIZE
)) == NULL
)
350 BIO_printf(bio_err
,"out of memory\n");
353 if ((buf2
=(unsigned char *)Malloc((int)BUFSIZE
)) == NULL
)
355 BIO_printf(bio_err
,"out of memory\n");
359 memset(c
,0,sizeof(c
));
360 memset(iv
,0,sizeof(iv
));
362 for (i
=0; i
<ALGOR_NUM
; i
++)
364 for (i
=0; i
<RSA_NUM
; i
++)
366 for (i
=0; i
<DSA_NUM
; i
++)
375 if (strcmp(*argv
,"md2") == 0) doit
[D_MD2
]=1;
379 if (strcmp(*argv
,"mdc2") == 0) doit
[D_MDC2
]=1;
383 if (strcmp(*argv
,"md5") == 0) doit
[D_MD5
]=1;
387 if (strcmp(*argv
,"sha") == 0) doit
[D_SHA
]=1;
391 if (strcmp(*argv
,"sha1") == 0) doit
[D_SHA1
]=1;
395 if (strcmp(*argv
,"rc4") == 0) doit
[D_RC4
]=1;
399 if (strcmp(*argv
,"des-cbc") == 0) doit
[D_CBC_DES
]=1;
400 else if (strcmp(*argv
,"des-ede3") == 0) doit
[D_EDE3_DES
]=1;
405 if (strcmp(*argv
,"rsaref") == 0)
407 RSA_set_default_method(RSA_PKCS1_RSAref());
412 if (strcmp(*argv
,"ssleay") == 0)
414 RSA_set_default_method(RSA_PKCS1_SSLeay());
419 if (strcmp(*argv
,"dsa512") == 0) dsa_doit
[R_DSA_512
]=2;
420 else if (strcmp(*argv
,"dsa1024") == 0) dsa_doit
[R_DSA_1024
]=2;
421 else if (strcmp(*argv
,"dsa2048") == 0) dsa_doit
[R_DSA_2048
]=2;
422 else if (strcmp(*argv
,"rsa512") == 0) rsa_doit
[R_RSA_512
]=2;
423 else if (strcmp(*argv
,"rsa1024") == 0) rsa_doit
[R_RSA_1024
]=2;
424 else if (strcmp(*argv
,"rsa2048") == 0) rsa_doit
[R_RSA_2048
]=2;
425 else if (strcmp(*argv
,"rsa4096") == 0) rsa_doit
[R_RSA_4096
]=2;
428 if (strcmp(*argv
,"rc2-cbc") == 0) doit
[D_CBC_RC2
]=1;
429 else if (strcmp(*argv
,"rc2") == 0) doit
[D_CBC_RC2
]=1;
433 if (strcmp(*argv
,"idea-cbc") == 0) doit
[D_CBC_IDEA
]=1;
434 else if (strcmp(*argv
,"idea") == 0) doit
[D_CBC_IDEA
]=1;
438 if (strcmp(*argv
,"bf-cbc") == 0) doit
[D_CBC_BF
]=1;
439 else if (strcmp(*argv
,"blowfish") == 0) doit
[D_CBC_BF
]=1;
443 if (strcmp(*argv
,"des") == 0)
451 if (strcmp(*argv
,"rsa") == 0)
453 rsa_doit
[R_RSA_512
]=1;
454 rsa_doit
[R_RSA_1024
]=1;
455 rsa_doit
[R_RSA_2048
]=1;
456 rsa_doit
[R_RSA_4096
]=1;
461 if (strcmp(*argv
,"dsa") == 0)
463 dsa_doit
[R_DSA_512
]=1;
464 dsa_doit
[R_DSA_1024
]=1;
469 BIO_printf(bio_err
,"bad value, pick one of\n");
470 BIO_printf(bio_err
,"md2 mdc2 md5 sha sha1\n");
472 BIO_printf(bio_err
,"idea-cbc ");
475 BIO_printf(bio_err
,"rc2-cbc ");
478 BIO_printf(bio_err
,"bf-cbc");
480 #if !defined(NO_IDEA) && !defined(NO_RC2) && !defined(NO_BLOWFISH)
481 BIO_printf(bio_err
,"\n");
483 BIO_printf(bio_err
,"des-cbc des-ede3 ");
485 BIO_printf(bio_err
,"rc4");
488 BIO_printf(bio_err
,"\nrsa512 rsa1024 rsa2048 rsa4096\n");
491 BIO_printf(bio_err
,"\ndsa512 dsa1024 dsa2048\n");
493 BIO_printf(bio_err
,"idea rc2 des rsa blowfish\n");
503 for (i
=0; i
<ALGOR_NUM
; i
++)
505 for (i
=0; i
<RSA_NUM
; i
++)
507 for (i
=0; i
<DSA_NUM
; i
++)
510 for (i
=0; i
<ALGOR_NUM
; i
++)
511 if (doit
[i
]) pr_header
++;
514 BIO_printf(bio_err
,"To get the most accurate results, try to run this\n");
515 BIO_printf(bio_err
,"program when this computer is idle.\n");
519 for (i
=0; i
<RSA_NUM
; i
++)
524 rsa_key
[i
]=d2i_RSAPrivateKey(NULL
,&p
,rsa_data_length
[i
]);
525 if (rsa_key
[i
] == NULL
)
527 BIO_printf(bio_err
,"internal error loading RSA key number %d\n",i
);
534 dsa_key
[0]=get_dsa512();
535 dsa_key
[1]=get_dsa1024();
536 dsa_key
[2]=get_dsa2048();
540 des_set_key((C_Block
*)key
,sch
);
541 des_set_key((C_Block
*)key2
,sch2
);
542 des_set_key((C_Block
*)key3
,sch3
);
545 idea_set_encrypt_key(key16
,&idea_ks
);
548 RC4_set_key(&rc4_ks
,16,key16
);
551 RC2_set_key(&rc2_ks
,16,key16
,128);
554 BF_set_key(&bf_ks
,16,key16
);
557 memset(rsa_c
,0,sizeof(rsa_c
));
559 BIO_printf(bio_err
,"First we calculate the approximate speed ...\n");
565 for (i
=count
; i
; i
--)
566 des_ecb_encrypt((C_Block
*)buf
,(C_Block
*)buf
,
567 &(sch
[0]),DES_ENCRYPT
);
570 c
[D_MD2
][0]=count
/10;
571 c
[D_MDC2
][0]=count
/10;
576 c
[D_CBC_DES
][0]=count
;
577 c
[D_EDE3_DES
][0]=count
/3;
578 c
[D_CBC_IDEA
][0]=count
;
579 c
[D_CBC_RC2
][0]=count
;
580 c
[D_CBC_BF
][0]=count
;
582 for (i
=1; i
<SIZE_NUM
; i
++)
584 c
[D_MD2
][i
]=c
[D_MD2
][0]*4*lengths
[0]/lengths
[i
];
585 c
[D_MDC2
][i
]=c
[D_MDC2
][0]*4*lengths
[0]/lengths
[i
];
586 c
[D_MD5
][i
]=c
[D_MD5
][0]*4*lengths
[0]/lengths
[i
];
587 c
[D_SHA
][i
]=c
[D_SHA
][0]*4*lengths
[0]/lengths
[i
];
588 c
[D_SHA1
][i
]=c
[D_SHA1
][0]*4*lengths
[0]/lengths
[i
];
590 for (i
=1; i
<SIZE_NUM
; i
++)
594 l0
=(long)lengths
[i
-1];
596 c
[D_RC4
][i
]=c
[D_RC4
][i
-1]*l0
/l1
;
597 c
[D_CBC_DES
][i
]=c
[D_CBC_DES
][i
-1]*l0
/l1
;
598 c
[D_EDE3_DES
][i
]=c
[D_EDE3_DES
][i
-1]*l0
/l1
;
599 c
[D_CBC_IDEA
][i
]=c
[D_CBC_IDEA
][i
-1]*l0
/l1
;
600 c
[D_CBC_RC2
][i
]=c
[D_CBC_RC2
][i
-1]*l0
/l1
;
601 c
[D_CBC_BF
][i
]=c
[D_CBC_BF
][i
-1]*l0
/l1
;
603 rsa_c
[R_RSA_512
][0]=count
/2000;
604 rsa_c
[R_RSA_512
][1]=count
/400;
605 for (i
=1; i
<RSA_NUM
; i
++)
607 rsa_c
[i
][0]=rsa_c
[i
-1][0]/8;
608 rsa_c
[i
][1]=rsa_c
[i
-1][1]/4;
609 if ((rsa_doit
[i
] <= 1) && (rsa_c
[i
][0] == 0))
621 dsa_c
[R_DSA_512
][0]=count
/1000;
622 dsa_c
[R_DSA_512
][1]=count
/1000/2;
623 for (i
=1; i
<DSA_NUM
; i
++)
625 dsa_c
[i
][0]=dsa_c
[i
-1][0]/4;
626 dsa_c
[i
][1]=dsa_c
[i
-1][1]/4;
627 if ((dsa_doit
[i
] <= 1) && (dsa_c
[i
][0] == 0))
639 #define COND(d) (count != (d))
642 #define COND(c) (run)
643 #define COUNT(d) (count)
644 signal(SIGALRM
,sig_done
);
650 for (j
=0; j
<SIZE_NUM
; j
++)
652 print_message(names
[D_MD2
],c
[D_MD2
][j
],lengths
[j
]);
654 for (count
=0,run
=1; COND(c
[D_MD2
][j
]); count
++)
655 MD2(buf
,(unsigned long)lengths
[j
],&(md2
[0]));
657 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
658 count
,names
[D_MD2
],d
);
659 results
[D_MD2
][j
]=((double)count
)/d
*lengths
[j
];
666 for (j
=0; j
<SIZE_NUM
; j
++)
668 print_message(names
[D_MDC2
],c
[D_MDC2
][j
],lengths
[j
]);
670 for (count
=0,run
=1; COND(c
[D_MDC2
][j
]); count
++)
671 MDC2(buf
,(unsigned long)lengths
[j
],&(mdc2
[0]));
673 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
674 count
,names
[D_MDC2
],d
);
675 results
[D_MDC2
][j
]=((double)count
)/d
*lengths
[j
];
683 for (j
=0; j
<SIZE_NUM
; j
++)
685 print_message(names
[D_MD5
],c
[D_MD5
][j
],lengths
[j
]);
687 for (count
=0,run
=1; COND(c
[D_MD5
][j
]); count
++)
688 MD5(buf
,(unsigned long)lengths
[j
],&(md5
[0]));
690 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
691 count
,names
[D_MD5
],d
);
692 results
[D_MD5
][j
]=((double)count
)/d
*lengths
[j
];
700 for (j
=0; j
<SIZE_NUM
; j
++)
702 print_message(names
[D_SHA
],c
[D_SHA
][j
],lengths
[j
]);
704 for (count
=0,run
=1; COND(c
[D_SHA
][j
]); count
++)
705 SHA(buf
,(unsigned long)lengths
[j
],&(sha
[0]));
707 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
708 count
,names
[D_SHA
],d
);
709 results
[D_SHA
][j
]=((double)count
)/d
*lengths
[j
];
716 for (j
=0; j
<SIZE_NUM
; j
++)
718 print_message(names
[D_SHA1
],c
[D_SHA1
][j
],lengths
[j
]);
720 for (count
=0,run
=1; COND(c
[D_SHA1
][j
]); count
++)
721 SHA1(buf
,(unsigned long)lengths
[j
],&(sha
[0]));
723 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
724 count
,names
[D_SHA1
],d
);
725 results
[D_SHA1
][j
]=((double)count
)/d
*lengths
[j
];
732 for (j
=0; j
<SIZE_NUM
; j
++)
734 print_message(names
[D_RC4
],c
[D_RC4
][j
],lengths
[j
]);
736 for (count
=0,run
=1; COND(c
[D_RC4
][j
]); count
++)
737 RC4(&rc4_ks
,(unsigned int)lengths
[j
],
740 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
741 count
,names
[D_RC4
],d
);
742 results
[D_RC4
][j
]=((double)count
)/d
*lengths
[j
];
749 for (j
=0; j
<SIZE_NUM
; j
++)
751 print_message(names
[D_CBC_DES
],c
[D_CBC_DES
][j
],lengths
[j
]);
753 for (count
=0,run
=1; COND(c
[D_CBC_DES
][j
]); count
++)
754 des_ncbc_encrypt((C_Block
*)buf
,
756 (long)lengths
[j
],sch
,
757 (C_Block
*)&(iv
[0]),DES_ENCRYPT
);
759 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
760 count
,names
[D_CBC_DES
],d
);
761 results
[D_CBC_DES
][j
]=((double)count
)/d
*lengths
[j
];
765 if (doit
[D_EDE3_DES
])
767 for (j
=0; j
<SIZE_NUM
; j
++)
769 print_message(names
[D_EDE3_DES
],c
[D_EDE3_DES
][j
],lengths
[j
]);
771 for (count
=0,run
=1; COND(c
[D_EDE3_DES
][j
]); count
++)
772 des_ede3_cbc_encrypt((C_Block
*)buf
,
774 (long)lengths
[j
],sch
,sch2
,sch3
,
775 (C_Block
*)&(iv
[0]),DES_ENCRYPT
);
777 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
778 count
,names
[D_EDE3_DES
],d
);
779 results
[D_EDE3_DES
][j
]=((double)count
)/d
*lengths
[j
];
784 if (doit
[D_CBC_IDEA
])
786 for (j
=0; j
<SIZE_NUM
; j
++)
788 print_message(names
[D_CBC_IDEA
],c
[D_CBC_IDEA
][j
],lengths
[j
]);
790 for (count
=0,run
=1; COND(c
[D_CBC_IDEA
][j
]); count
++)
791 idea_cbc_encrypt(buf
,buf
,
792 (unsigned long)lengths
[j
],&idea_ks
,
793 (unsigned char *)&(iv
[0]),IDEA_ENCRYPT
);
795 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
796 count
,names
[D_CBC_IDEA
],d
);
797 results
[D_CBC_IDEA
][j
]=((double)count
)/d
*lengths
[j
];
804 for (j
=0; j
<SIZE_NUM
; j
++)
806 print_message(names
[D_CBC_RC2
],c
[D_CBC_RC2
][j
],lengths
[j
]);
808 for (count
=0,run
=1; COND(c
[D_CBC_RC2
][j
]); count
++)
809 RC2_cbc_encrypt(buf
,buf
,
810 (unsigned long)lengths
[j
],&rc2_ks
,
811 (unsigned char *)&(iv
[0]),RC2_ENCRYPT
);
813 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
814 count
,names
[D_CBC_RC2
],d
);
815 results
[D_CBC_RC2
][j
]=((double)count
)/d
*lengths
[j
];
822 for (j
=0; j
<SIZE_NUM
; j
++)
824 print_message(names
[D_CBC_BF
],c
[D_CBC_BF
][j
],lengths
[j
]);
826 for (count
=0,run
=1; COND(c
[D_CBC_BF
][j
]); count
++)
827 BF_cbc_encrypt(buf
,buf
,
828 (unsigned long)lengths
[j
],&bf_ks
,
829 (unsigned char *)&(iv
[0]),BF_ENCRYPT
);
831 BIO_printf(bio_err
,"%ld %s's in %.2fs\n",
832 count
,names
[D_CBC_BF
],d
);
833 results
[D_CBC_BF
][j
]=((double)count
)/d
*lengths
[j
];
840 for (j
=0; j
<RSA_NUM
; j
++)
842 if (!rsa_doit
[j
]) continue;
843 pkey_print_message("private","rsa",rsa_c
[j
][0],rsa_bits
[j
],
846 for (count
=0,run
=1; COND(rsa_c
[j
][0]); count
++)
848 rsa_num
=RSA_private_encrypt(30,buf
,buf2
,rsa_key
[j
],
852 BIO_printf(bio_err
,"RSA private encrypt failure\n");
853 ERR_print_errors(bio_err
);
859 BIO_printf(bio_err
,"%ld %d bit private RSA's in %.2fs\n",
860 count
,rsa_bits
[j
],d
);
861 rsa_results
[j
][0]=d
/(double)count
;
864 pkey_print_message("public","rsa",rsa_c
[j
][1],rsa_bits
[j
],
867 for (count
=0,run
=1; COND(rsa_c
[j
][1]); count
++)
869 rsa_num2
=RSA_public_decrypt(rsa_num
,buf2
,buf
,rsa_key
[j
],
873 BIO_printf(bio_err
,"RSA public encrypt failure\n");
874 ERR_print_errors(bio_err
);
880 BIO_printf(bio_err
,"%ld %d bit public RSA's in %.2fs\n",
881 count
,rsa_bits
[j
],d
);
882 rsa_results
[j
][1]=d
/(double)count
;
886 /* if longer than 10s, don't do any more */
887 for (j
++; j
<RSA_NUM
; j
++)
895 for (j
=0; j
<DSA_NUM
; j
++)
897 if (!dsa_doit
[j
]) continue;
898 DSA_generate_key(dsa_key
[j
]);
899 /* DSA_sign_setup(dsa_key[j],NULL); */
900 pkey_print_message("sign","dsa",dsa_c
[j
][0],dsa_bits
[j
],
903 for (count
=0,run
=1; COND(dsa_c
[j
][0]); count
++)
905 rsa_num
=DSA_sign(EVP_PKEY_DSA
,buf
,20,buf2
,
909 BIO_printf(bio_err
,"DSA sign failure\n");
910 ERR_print_errors(bio_err
);
916 BIO_printf(bio_err
,"%ld %d bit DSA signs in %.2fs\n",
917 count
,dsa_bits
[j
],d
);
918 dsa_results
[j
][0]=d
/(double)count
;
921 pkey_print_message("verify","dsa",dsa_c
[j
][1],dsa_bits
[j
],
924 for (count
=0,run
=1; COND(dsa_c
[j
][1]); count
++)
926 rsa_num2
=DSA_verify(EVP_PKEY_DSA
,buf
,20,buf2
,
930 BIO_printf(bio_err
,"DSA verify failure\n");
931 ERR_print_errors(bio_err
);
937 BIO_printf(bio_err
,"%ld %d bit DSA verify in %.2fs\n",
938 count
,dsa_bits
[j
],d
);
939 dsa_results
[j
][1]=d
/(double)count
;
943 /* if longer than 10s, don't do any more */
944 for (j
++; j
<DSA_NUM
; j
++)
950 fprintf(stdout
,"%s\n",SSLeay_version(SSLEAY_VERSION
));
951 fprintf(stdout
,"%s\n",SSLeay_version(SSLEAY_BUILT_ON
));
953 printf("%s ",BN_options());
955 printf("%s ",MD2_options());
958 printf("%s ",RC4_options());
961 printf("%s ",des_options());
964 printf("%s ",idea_options());
967 printf("%s ",BF_options());
969 fprintf(stdout
,"%s\n",SSLeay_version(SSLEAY_CFLAGS
));
973 fprintf(stdout
,"The 'numbers' are in 1000s of bytes per second processed.\n");
974 fprintf(stdout
,"type ");
975 for (j
=0; j
<SIZE_NUM
; j
++)
976 fprintf(stdout
,"%7d bytes",lengths
[j
]);
977 fprintf(stdout
,"\n");
980 for (k
=0; k
<ALGOR_NUM
; k
++)
982 if (!doit
[k
]) continue;
983 fprintf(stdout
,"%-12s",names
[k
]);
984 for (j
=0; j
<SIZE_NUM
; j
++)
986 if (results
[k
][j
] > 10000)
987 fprintf(stdout
," %11.2fk",results
[k
][j
]/1e3
);
989 fprintf(stdout
," %11.2f ",results
[k
][j
]);
991 fprintf(stdout
,"\n");
995 for (k
=0; k
<RSA_NUM
; k
++)
997 if (!rsa_doit
[k
]) continue;
998 if (j
) { printf("%18ssign verify\n"," "); j
=0; }
999 fprintf(stdout
,"rsa %4d bits %8.4fs %8.4fs",
1000 rsa_bits
[k
],rsa_results
[k
][0],rsa_results
[k
][1]);
1001 fprintf(stdout
,"\n");
1006 for (k
=0; k
<DSA_NUM
; k
++)
1008 if (!dsa_doit
[k
]) continue;
1009 if (j
) { printf("%18ssign verify\n"," "); j
=0; }
1010 fprintf(stdout
,"dsa %4d bits %8.4fs %8.4fs",
1011 dsa_bits
[k
],dsa_results
[k
][0],dsa_results
[k
][1]);
1012 fprintf(stdout
,"\n");
1017 if (buf
!= NULL
) Free(buf
);
1018 if (buf2
!= NULL
) Free(buf2
);
1020 for (i
=0; i
<RSA_NUM
; i
++)
1021 if (rsa_key
[i
] != NULL
)
1022 RSA_free(rsa_key
[i
]);
1025 for (i
=0; i
<DSA_NUM
; i
++)
1026 if (dsa_key
[i
] != NULL
)
1027 DSA_free(dsa_key
[i
]);
1032 static void print_message(s
,num
,length
)
1038 BIO_printf(bio_err
,"Doing %s for %ds on %d size blocks: ",s
,SECONDS
,length
);
1042 BIO_printf(bio_err
,"Doing %s %ld times on %d size blocks: ",s
,num
,length
);
1050 static void pkey_print_message(str
,str2
,num
,bits
,tm
)
1058 BIO_printf(bio_err
,"Doing %d bit %s %s's for %ds: ",bits
,str
,str2
,tm
);
1062 BIO_printf(bio_err
,"Doing %ld %d bit %s %s's: ",num
,bits
,str
,str2
);