]> git.ipfire.org Git - thirdparty/openssl.git/blame - apps/speed.c
Make BN_mod_inverse a little faster
[thirdparty/openssl.git] / apps / speed.c
CommitLineData
d02b48c6 1/* apps/speed.c */
58964a49 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
d02b48c6
RE
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
dfeab068
RE
63#define RSA_SECONDS 10
64#define DSA_SECONDS 10
d02b48c6
RE
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>
58964a49 76#include <math.h>
d02b48c6 77#include "apps.h"
58964a49 78#ifdef NO_STDIO
d02b48c6
RE
79#define APPS_WIN16
80#endif
ec577822
BM
81#include <openssl/crypto.h>
82#include <openssl/rand.h>
83#include <openssl/err.h>
5270e702 84#include <openssl/engine.h>
646d5695
BL
85#include <openssl/evp.h>
86#include <openssl/objects.h>
d02b48c6 87
2bfb4dbc
BL
88#if defined(__FreeBSD__)
89# define USE_TOD
90#elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
91# define TIMES
d02b48c6 92#endif
5660eb48 93#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE) && !defined(__NetBSD__)
3132e196
RL
94# define TIMEB
95#endif
d02b48c6 96
d02b48c6 97#ifndef _IRIX
2bfb4dbc 98# include <time.h>
d02b48c6
RE
99#endif
100#ifdef TIMES
2bfb4dbc
BL
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>
d02b48c6 107#endif
7d7d2cbc
UM
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(VMS) && defined(__DECC) && !defined(__TMS)
114#undef TIMES
d02b48c6 115#endif
7d7d2cbc 116
3132e196 117#ifdef TIMEB
d02b48c6 118#include <sys/timeb.h>
3132e196
RL
119#endif
120
1cbb729f 121#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
3132e196
RL
122#error "It seems neither struct tms nor struct timeb is supported in this platform!"
123#endif
d02b48c6 124
dfeab068
RE
125#if defined(sun) || defined(__ultrix)
126#define _POSIX_SOURCE
d02b48c6
RE
127#include <limits.h>
128#include <sys/param.h>
129#endif
130
131#ifndef NO_DES
ec577822 132#include <openssl/des.h>
d02b48c6
RE
133#endif
134#ifndef NO_MD2
ec577822 135#include <openssl/md2.h>
d02b48c6
RE
136#endif
137#ifndef NO_MDC2
ec577822 138#include <openssl/mdc2.h>
d02b48c6 139#endif
3009458e
RL
140#ifndef NO_MD4
141#include <openssl/md4.h>
142#endif
d02b48c6 143#ifndef NO_MD5
ec577822 144#include <openssl/md5.h>
5271ebd9
UM
145#endif
146#ifndef NO_HMAC
ec577822 147#include <openssl/hmac.h>
d02b48c6 148#endif
5271ebd9 149#include <openssl/evp.h>
f5d7a031 150#ifndef NO_SHA
ec577822 151#include <openssl/sha.h>
d02b48c6 152#endif
f5d7a031 153#ifndef NO_RIPEMD
ec577822 154#include <openssl/ripemd.h>
58964a49 155#endif
d02b48c6 156#ifndef NO_RC4
ec577822 157#include <openssl/rc4.h>
d02b48c6 158#endif
58964a49 159#ifndef NO_RC5
ec577822 160#include <openssl/rc5.h>
58964a49 161#endif
d02b48c6 162#ifndef NO_RC2
ec577822 163#include <openssl/rc2.h>
d02b48c6
RE
164#endif
165#ifndef NO_IDEA
ec577822 166#include <openssl/idea.h>
d02b48c6 167#endif
f5d7a031 168#ifndef NO_BF
ec577822 169#include <openssl/blowfish.h>
d02b48c6 170#endif
58964a49 171#ifndef NO_CAST
ec577822 172#include <openssl/cast.h>
58964a49 173#endif
d02b48c6 174#ifndef NO_RSA
ec577822 175#include <openssl/rsa.h>
f5d7a031 176#include "./testrsa.h"
d02b48c6 177#endif
ec577822 178#include <openssl/x509.h>
d02b48c6
RE
179#ifndef 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 */
5c83b4c9 187# define HZ 100.0
d02b48c6
RE
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
58964a49 197#define BUFSIZE ((long)1024*8+1)
d02b48c6
RE
198int run=0;
199
4e74239c 200static double Time_F(int s, int usertime);
646d5695 201static void print_message(const char *s,long num,int length);
d02b48c6 202static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
d02b48c6
RE
203#ifdef SIGALRM
204#if defined(__STDC__) || defined(sgi) || defined(_AIX)
205#define SIGRETTYPE void
206#else
207#define SIGRETTYPE int
208#endif
209
d02b48c6 210static SIGRETTYPE sig_done(int sig);
6b691a5c 211static SIGRETTYPE sig_done(int sig)
d02b48c6
RE
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
4e74239c 224static double Time_F(int s, int usertime)
d02b48c6
RE
225 {
226 double ret;
2bfb4dbc
BL
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
4e74239c 270 if (usertime)
d02b48c6 271 {
4e74239c 272 static struct tms tstart,tend;
d02b48c6 273
4e74239c
RL
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 }
d02b48c6 285 }
2bfb4dbc 286# endif /* times() */
3132e196
RL
287# if defined(TIMES) && defined(TIMEB)
288 else
289# endif
290# ifdef TIMEB
d02b48c6 291 {
4e74239c
RL
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 }
d02b48c6 307 }
3132e196 308# endif
2bfb4dbc 309#endif
d02b48c6
RE
310 }
311
667ac4ec
RE
312int MAIN(int, char **);
313
6b691a5c 314int MAIN(int argc, char **argv)
d02b48c6 315 {
5270e702 316 ENGINE *e;
d02b48c6 317 unsigned char *buf=NULL,*buf2=NULL;
18c77bf2 318 int mret=1;
646d5695 319#define ALGOR_NUM 16
d02b48c6
RE
320#define SIZE_NUM 5
321#define RSA_NUM 4
322#define DSA_NUM 3
646d5695 323 long count,rsa_count,save_count=0;
18c77bf2 324 int i,j,k;
5614bb91 325 unsigned rsa_num;
d02b48c6
RE
326#ifndef NO_MD2
327 unsigned char md2[MD2_DIGEST_LENGTH];
328#endif
329#ifndef NO_MDC2
330 unsigned char mdc2[MDC2_DIGEST_LENGTH];
331#endif
3009458e
RL
332#ifndef NO_MD4
333 unsigned char md4[MD4_DIGEST_LENGTH];
334#endif
d02b48c6
RE
335#ifndef NO_MD5
336 unsigned char md5[MD5_DIGEST_LENGTH];
58964a49 337 unsigned char hmac[MD5_DIGEST_LENGTH];
d02b48c6 338#endif
f5d7a031 339#ifndef NO_SHA
d02b48c6
RE
340 unsigned char sha[SHA_DIGEST_LENGTH];
341#endif
f5d7a031 342#ifndef NO_RIPEMD
58964a49
RE
343 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
344#endif
d02b48c6
RE
345#ifndef NO_RC4
346 RC4_KEY rc4_ks;
347#endif
58964a49
RE
348#ifndef NO_RC5
349 RC5_32_KEY rc5_ks;
350#endif
d02b48c6
RE
351#ifndef NO_RC2
352 RC2_KEY rc2_ks;
353#endif
354#ifndef NO_IDEA
355 IDEA_KEY_SCHEDULE idea_ks;
356#endif
f5d7a031 357#ifndef NO_BF
d02b48c6 358 BF_KEY bf_ks;
58964a49
RE
359#endif
360#ifndef NO_CAST
361 CAST_KEY cast_ks;
d02b48c6
RE
362#endif
363 static unsigned char key16[16]=
364 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
365 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
366 unsigned char iv[8];
367#ifndef NO_DES
5676d8cb 368 des_cblock *buf_as_des_cblock = NULL;
d02b48c6
RE
369 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
370 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
371 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
372 des_key_schedule sch,sch2,sch3;
373#endif
374#define D_MD2 0
375#define D_MDC2 1
3009458e
RL
376#define D_MD4 2
377#define D_MD5 3
378#define D_HMAC 4
379#define D_SHA1 5
380#define D_RMD160 6
381#define D_RC4 7
382#define D_CBC_DES 8
383#define D_EDE3_DES 9
384#define D_CBC_IDEA 10
385#define D_CBC_RC2 11
386#define D_CBC_RC5 12
387#define D_CBC_BF 13
388#define D_CBC_CAST 14
646d5695 389#define D_EVP 15
d02b48c6
RE
390 double d,results[ALGOR_NUM][SIZE_NUM];
391 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
392 long c[ALGOR_NUM][SIZE_NUM];
646d5695 393 static const char *names[ALGOR_NUM]={
3009458e 394 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
d02b48c6 395 "des cbc","des ede3","idea cbc",
58964a49 396 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
d02b48c6
RE
397#define R_DSA_512 0
398#define R_DSA_1024 1
399#define R_DSA_2048 2
400#define R_RSA_512 0
401#define R_RSA_1024 1
402#define R_RSA_2048 2
403#define R_RSA_4096 3
f5d7a031 404#ifndef NO_RSA
d02b48c6 405 RSA *rsa_key[RSA_NUM];
d02b48c6 406 long rsa_c[RSA_NUM][2];
d02b48c6 407 double rsa_results[RSA_NUM][2];
d02b48c6 408 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
d02b48c6
RE
409 static unsigned char *rsa_data[RSA_NUM]=
410 {test512,test1024,test2048,test4096};
411 static int rsa_data_length[RSA_NUM]={
412 sizeof(test512),sizeof(test1024),
413 sizeof(test2048),sizeof(test4096)};
58964a49
RE
414#endif
415#ifndef NO_DSA
416 DSA *dsa_key[DSA_NUM];
417 long dsa_c[DSA_NUM][2];
418 double dsa_results[DSA_NUM][2];
419 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
420#endif
d02b48c6
RE
421 int rsa_doit[RSA_NUM];
422 int dsa_doit[DSA_NUM];
58964a49 423 int doit[ALGOR_NUM];
d02b48c6 424 int pr_header=0;
4e74239c 425 int usertime=1;
646d5695 426 const EVP_CIPHER *evp=NULL;
4e74239c
RL
427
428#ifndef TIMES
429 usertime=-1;
430#endif
d02b48c6
RE
431
432 apps_startup();
396f6314 433 memset(results, 0, sizeof(results));
f5d7a031 434#ifndef NO_DSA
dfeab068
RE
435 memset(dsa_key,0,sizeof(dsa_key));
436#endif
d02b48c6
RE
437
438 if (bio_err == NULL)
439 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
58964a49 440 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
d02b48c6 441
dfeab068
RE
442#ifndef NO_RSA
443 memset(rsa_key,0,sizeof(rsa_key));
d02b48c6
RE
444 for (i=0; i<RSA_NUM; i++)
445 rsa_key[i]=NULL;
dfeab068 446#endif
d02b48c6 447
26a3a48d 448 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
449 {
450 BIO_printf(bio_err,"out of memory\n");
451 goto end;
452 }
5676d8cb 453#ifndef NO_DES
12ba413c 454 buf_as_des_cblock = (des_cblock *)buf;
5676d8cb 455#endif
26a3a48d 456 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
457 {
458 BIO_printf(bio_err,"out of memory\n");
459 goto end;
460 }
461
462 memset(c,0,sizeof(c));
463 memset(iv,0,sizeof(iv));
464
465 for (i=0; i<ALGOR_NUM; i++)
466 doit[i]=0;
467 for (i=0; i<RSA_NUM; i++)
468 rsa_doit[i]=0;
469 for (i=0; i<DSA_NUM; i++)
470 dsa_doit[i]=0;
471
472 j=0;
473 argc--;
474 argv++;
475 while (argc)
476 {
4e74239c
RL
477 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
478 usertime = 0;
646d5695
BL
479 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
480 {
481 argc--;
482 argv++;
483 if(argc == 0)
484 {
485 BIO_printf(bio_err,"no EVP given\n");
486 goto end;
487 }
488 evp=EVP_get_cipherbyname(*argv);
489 if(!evp)
490 {
491 BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
492 goto end;
493 }
494 doit[D_EVP]=1;
495 }
5270e702
RL
496 else
497 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
498 {
499 argc--;
500 argv++;
501 if(argc == 0)
502 {
503 BIO_printf(bio_err,"no engine given\n");
504 goto end;
505 }
506 if((e = ENGINE_by_id(*argv)) == NULL)
507 {
508 BIO_printf(bio_err,"invalid engine \"%s\"\n",
509 *argv);
510 goto end;
511 }
512 if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
513 {
514 BIO_printf(bio_err,"can't use that engine\n");
515 goto end;
516 }
517 BIO_printf(bio_err,"engine \"%s\" set.\n", *argv);
518 /* Free our "structural" reference. */
519 ENGINE_free(e);
520 /* It will be increased again further down. We just
521 don't want speed to confuse an engine with an
522 algorithm, especially when none is given (which
523 means all of them should be run) */
524 j--;
525 }
526 else
d02b48c6
RE
527#ifndef NO_MD2
528 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
529 else
530#endif
531#ifndef NO_MDC2
532 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
533 else
534#endif
3009458e
RL
535#ifndef NO_MD4
536 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
537 else
538#endif
d02b48c6
RE
539#ifndef NO_MD5
540 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
541 else
542#endif
58964a49
RE
543#ifndef NO_MD5
544 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
d02b48c6
RE
545 else
546#endif
f5d7a031 547#ifndef NO_SHA
d02b48c6
RE
548 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
549 else
58964a49
RE
550 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
551 else
552#endif
f5d7a031 553#ifndef NO_RIPEMD
58964a49
RE
554 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
555 else
556 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
557 else
558 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
559 else
d02b48c6
RE
560#endif
561#ifndef NO_RC4
562 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
563 else
564#endif
f4e723f3 565#ifndef NO_DES
d02b48c6
RE
566 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
567 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
568 else
569#endif
570#ifndef NO_RSA
ccb9643f 571#if 0 /* was: #ifdef RSAref */
d02b48c6
RE
572 if (strcmp(*argv,"rsaref") == 0)
573 {
5270e702 574 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
d02b48c6
RE
575 j--;
576 }
577 else
578#endif
c1cd88a0 579#ifndef RSA_NULL
e170a5c0 580 if (strcmp(*argv,"openssl") == 0)
d02b48c6 581 {
5270e702 582 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
d02b48c6
RE
583 j--;
584 }
585 else
c1cd88a0 586#endif
d02b48c6
RE
587#endif /* !NO_RSA */
588 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
589 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
590 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
591 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
592 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
593 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
594 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
595 else
596#ifndef NO_RC2
597 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
598 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
599 else
600#endif
58964a49
RE
601#ifndef NO_RC5
602 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
603 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
604 else
605#endif
d02b48c6
RE
606#ifndef NO_IDEA
607 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
608 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
609 else
610#endif
f5d7a031 611#ifndef NO_BF
d02b48c6
RE
612 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
613 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
58964a49
RE
614 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
615 else
616#endif
617#ifndef NO_CAST
618 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
619 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
620 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
d02b48c6
RE
621 else
622#endif
623#ifndef NO_DES
624 if (strcmp(*argv,"des") == 0)
625 {
626 doit[D_CBC_DES]=1;
627 doit[D_EDE3_DES]=1;
628 }
629 else
630#endif
631#ifndef NO_RSA
632 if (strcmp(*argv,"rsa") == 0)
633 {
634 rsa_doit[R_RSA_512]=1;
635 rsa_doit[R_RSA_1024]=1;
636 rsa_doit[R_RSA_2048]=1;
637 rsa_doit[R_RSA_4096]=1;
638 }
639 else
640#endif
641#ifndef NO_DSA
642 if (strcmp(*argv,"dsa") == 0)
643 {
644 dsa_doit[R_DSA_512]=1;
645 dsa_doit[R_DSA_1024]=1;
646 }
647 else
648#endif
649 {
3009458e
RL
650 BIO_printf(bio_err,"Error: bad option or value\n");
651 BIO_printf(bio_err,"\n");
652 BIO_printf(bio_err,"Available values:\n");
653#ifndef NO_MD2
654 BIO_printf(bio_err,"md2 ");
655#endif
656#ifndef NO_MDC2
657 BIO_printf(bio_err,"mdc2 ");
658#endif
659#ifndef NO_MD4
660 BIO_printf(bio_err,"md4 ");
661#endif
662#ifndef NO_MD5
663 BIO_printf(bio_err,"md5 ");
664#ifndef NO_HMAC
665 BIO_printf(bio_err,"hmac ");
666#endif
667#endif
668#ifndef NO_SHA1
669 BIO_printf(bio_err,"sha1 ");
670#endif
671#ifndef NO_RIPEMD160
672 BIO_printf(bio_err,"rmd160");
673#endif
674#if !defined(NO_MD2) || !defined(NO_MDC2) || !defined(NO_MD4) || !defined(NO_MD5) || !defined(NO_SHA1) || !defined(NO_RIPEMD160)
675 BIO_printf(bio_err,"\n");
676#endif
677
d02b48c6
RE
678#ifndef NO_IDEA
679 BIO_printf(bio_err,"idea-cbc ");
680#endif
681#ifndef NO_RC2
682 BIO_printf(bio_err,"rc2-cbc ");
683#endif
58964a49
RE
684#ifndef NO_RC5
685 BIO_printf(bio_err,"rc5-cbc ");
686#endif
f5d7a031 687#ifndef NO_BF
d02b48c6
RE
688 BIO_printf(bio_err,"bf-cbc");
689#endif
3009458e 690#if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_BF) || !defined(NO_RC5)
d02b48c6
RE
691 BIO_printf(bio_err,"\n");
692#endif
3009458e 693
d02b48c6
RE
694 BIO_printf(bio_err,"des-cbc des-ede3 ");
695#ifndef NO_RC4
696 BIO_printf(bio_err,"rc4");
697#endif
3009458e
RL
698 BIO_printf(bio_err,"\n");
699
d02b48c6 700#ifndef NO_RSA
3009458e 701 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
d02b48c6 702#endif
3009458e 703
d02b48c6 704#ifndef NO_DSA
3009458e
RL
705 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
706#endif
707
708#ifndef NO_IDEA
709 BIO_printf(bio_err,"idea ");
710#endif
711#ifndef NO_RC2
712 BIO_printf(bio_err,"rc2 ");
713#endif
714#ifndef NO_DES
715 BIO_printf(bio_err,"des ");
d02b48c6 716#endif
3009458e
RL
717#ifndef NO_RSA
718 BIO_printf(bio_err,"rsa ");
719#endif
720#ifndef NO_BF
721 BIO_printf(bio_err,"blowfish");
722#endif
723#if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_DES) || !defined(NO_RSA) || !defined(NO_BF)
4e74239c 724 BIO_printf(bio_err,"\n");
3009458e
RL
725#endif
726
4e74239c 727 BIO_printf(bio_err,"\n");
3009458e 728 BIO_printf(bio_err,"Available options:\n");
5270e702 729#ifdef TIMES
4e74239c 730 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
3132e196 731#endif
5270e702 732 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
d02b48c6
RE
733 goto end;
734 }
735 argc--;
736 argv++;
737 j++;
738 }
739
740 if (j == 0)
741 {
742 for (i=0; i<ALGOR_NUM; i++)
743 doit[i]=1;
744 for (i=0; i<RSA_NUM; i++)
745 rsa_doit[i]=1;
746 for (i=0; i<DSA_NUM; i++)
747 dsa_doit[i]=1;
748 }
749 for (i=0; i<ALGOR_NUM; i++)
750 if (doit[i]) pr_header++;
751
4e74239c
RL
752 if (usertime == 0)
753 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
754 if (usertime <= 0)
755 {
756 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
757 BIO_printf(bio_err,"program when this computer is idle.\n");
758 }
d02b48c6
RE
759
760#ifndef NO_RSA
761 for (i=0; i<RSA_NUM; i++)
762 {
5e4ca422 763 const unsigned char *p;
d02b48c6
RE
764
765 p=rsa_data[i];
766 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
767 if (rsa_key[i] == NULL)
768 {
769 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
770 goto end;
771 }
58964a49
RE
772#if 0
773 else
774 {
775 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
776 BN_print(bio_err,rsa_key[i]->e);
777 BIO_printf(bio_err,"\n");
778 }
779#endif
d02b48c6
RE
780 }
781#endif
782
783#ifndef NO_DSA
784 dsa_key[0]=get_dsa512();
785 dsa_key[1]=get_dsa1024();
786 dsa_key[2]=get_dsa2048();
787#endif
788
789#ifndef NO_DES
cddfe788
BM
790 des_set_key_unchecked(&key,sch);
791 des_set_key_unchecked(&key2,sch2);
792 des_set_key_unchecked(&key3,sch3);
d02b48c6
RE
793#endif
794#ifndef NO_IDEA
795 idea_set_encrypt_key(key16,&idea_ks);
796#endif
797#ifndef NO_RC4
798 RC4_set_key(&rc4_ks,16,key16);
799#endif
800#ifndef NO_RC2
801 RC2_set_key(&rc2_ks,16,key16,128);
802#endif
58964a49
RE
803#ifndef NO_RC5
804 RC5_32_set_key(&rc5_ks,16,key16,12);
805#endif
f5d7a031 806#ifndef NO_BF
d02b48c6
RE
807 BF_set_key(&bf_ks,16,key16);
808#endif
58964a49
RE
809#ifndef NO_CAST
810 CAST_set_key(&cast_ks,16,key16);
811#endif
f5d7a031 812#ifndef NO_RSA
d02b48c6 813 memset(rsa_c,0,sizeof(rsa_c));
f5d7a031 814#endif
d02b48c6 815#ifndef SIGALRM
63da21c0 816#ifndef NO_DES
d02b48c6
RE
817 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
818 count=10;
819 do {
820 long i;
821 count*=2;
4e74239c 822 Time_F(START,usertime);
d02b48c6 823 for (i=count; i; i--)
12ba413c
BM
824 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
825 &(sch[0]),DES_ENCRYPT);
4e74239c 826 d=Time_F(STOP,usertime);
d02b48c6 827 } while (d <3);
646d5695 828 save_count=count;
d02b48c6
RE
829 c[D_MD2][0]=count/10;
830 c[D_MDC2][0]=count/10;
3009458e 831 c[D_MD4][0]=count;
d02b48c6 832 c[D_MD5][0]=count;
58964a49 833 c[D_HMAC][0]=count;
d02b48c6 834 c[D_SHA1][0]=count;
58964a49 835 c[D_RMD160][0]=count;
d02b48c6
RE
836 c[D_RC4][0]=count*5;
837 c[D_CBC_DES][0]=count;
838 c[D_EDE3_DES][0]=count/3;
839 c[D_CBC_IDEA][0]=count;
840 c[D_CBC_RC2][0]=count;
58964a49 841 c[D_CBC_RC5][0]=count;
d02b48c6 842 c[D_CBC_BF][0]=count;
58964a49 843 c[D_CBC_CAST][0]=count;
d02b48c6
RE
844
845 for (i=1; i<SIZE_NUM; i++)
846 {
847 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
848 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
3009458e 849 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
d02b48c6 850 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
58964a49 851 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
d02b48c6 852 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
58964a49 853 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
d02b48c6
RE
854 }
855 for (i=1; i<SIZE_NUM; i++)
856 {
857 long l0,l1;
858
859 l0=(long)lengths[i-1];
860 l1=(long)lengths[i];
861 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
862 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
863 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
864 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
865 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
58964a49 866 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
d02b48c6 867 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
58964a49 868 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
d02b48c6 869 }
f5d7a031 870#ifndef NO_RSA
d02b48c6
RE
871 rsa_c[R_RSA_512][0]=count/2000;
872 rsa_c[R_RSA_512][1]=count/400;
873 for (i=1; i<RSA_NUM; i++)
874 {
875 rsa_c[i][0]=rsa_c[i-1][0]/8;
876 rsa_c[i][1]=rsa_c[i-1][1]/4;
877 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
878 rsa_doit[i]=0;
879 else
880 {
dfeab068 881 if (rsa_c[i][0] == 0)
d02b48c6
RE
882 {
883 rsa_c[i][0]=1;
884 rsa_c[i][1]=20;
885 }
886 }
887 }
f5d7a031 888#endif
d02b48c6
RE
889
890 dsa_c[R_DSA_512][0]=count/1000;
891 dsa_c[R_DSA_512][1]=count/1000/2;
892 for (i=1; i<DSA_NUM; i++)
893 {
894 dsa_c[i][0]=dsa_c[i-1][0]/4;
895 dsa_c[i][1]=dsa_c[i-1][1]/4;
896 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
897 dsa_doit[i]=0;
898 else
899 {
900 if (dsa_c[i] == 0)
901 {
902 dsa_c[i][0]=1;
903 dsa_c[i][1]=1;
904 }
905 }
906 }
907
58964a49 908#define COND(d) (count < (d))
d02b48c6
RE
909#define COUNT(d) (d)
910#else
63da21c0
BM
911/* not worth fixing */
912# error "You cannot disable DES on systems without SIGALRM."
913#endif /* NO_DES */
914#else
d02b48c6
RE
915#define COND(c) (run)
916#define COUNT(d) (count)
917 signal(SIGALRM,sig_done);
63da21c0 918#endif /* SIGALRM */
d02b48c6
RE
919
920#ifndef NO_MD2
921 if (doit[D_MD2])
922 {
923 for (j=0; j<SIZE_NUM; j++)
924 {
925 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
4e74239c 926 Time_F(START,usertime);
d02b48c6
RE
927 for (count=0,run=1; COND(c[D_MD2][j]); count++)
928 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
4e74239c 929 d=Time_F(STOP,usertime);
d02b48c6
RE
930 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
931 count,names[D_MD2],d);
932 results[D_MD2][j]=((double)count)/d*lengths[j];
933 }
934 }
935#endif
936#ifndef NO_MDC2
937 if (doit[D_MDC2])
938 {
939 for (j=0; j<SIZE_NUM; j++)
940 {
941 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
4e74239c 942 Time_F(START,usertime);
d02b48c6
RE
943 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
944 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
4e74239c 945 d=Time_F(STOP,usertime);
d02b48c6
RE
946 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
947 count,names[D_MDC2],d);
948 results[D_MDC2][j]=((double)count)/d*lengths[j];
949 }
950 }
951#endif
952
3009458e
RL
953#ifndef NO_MD4
954 if (doit[D_MD4])
955 {
956 for (j=0; j<SIZE_NUM; j++)
957 {
958 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
959 Time_F(START,usertime);
960 for (count=0,run=1; COND(c[D_MD4][j]); count++)
961 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
962 d=Time_F(STOP,usertime);
963 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
964 count,names[D_MD4],d);
965 results[D_MD4][j]=((double)count)/d*lengths[j];
966 }
967 }
968#endif
969
d02b48c6
RE
970#ifndef NO_MD5
971 if (doit[D_MD5])
972 {
973 for (j=0; j<SIZE_NUM; j++)
974 {
975 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
4e74239c 976 Time_F(START,usertime);
d02b48c6 977 for (count=0,run=1; COND(c[D_MD5][j]); count++)
58964a49 978 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
4e74239c 979 d=Time_F(STOP,usertime);
d02b48c6
RE
980 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
981 count,names[D_MD5],d);
982 results[D_MD5][j]=((double)count)/d*lengths[j];
983 }
984 }
985#endif
986
5271ebd9 987#if !defined(NO_MD5) && !defined(NO_HMAC)
58964a49 988 if (doit[D_HMAC])
d02b48c6 989 {
58964a49
RE
990 HMAC_CTX hctx;
991 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
992 16,EVP_md5());
993
d02b48c6
RE
994 for (j=0; j<SIZE_NUM; j++)
995 {
58964a49 996 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
4e74239c 997 Time_F(START,usertime);
58964a49
RE
998 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
999 {
1000 HMAC_Init(&hctx,NULL,0,NULL);
1001 HMAC_Update(&hctx,buf,lengths[j]);
1002 HMAC_Final(&hctx,&(hmac[0]),NULL);
1003 }
4e74239c 1004 d=Time_F(STOP,usertime);
d02b48c6 1005 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
58964a49
RE
1006 count,names[D_HMAC],d);
1007 results[D_HMAC][j]=((double)count)/d*lengths[j];
d02b48c6
RE
1008 }
1009 }
1010#endif
f5d7a031 1011#ifndef NO_SHA
d02b48c6
RE
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]);
4e74239c 1017 Time_F(START,usertime);
d02b48c6
RE
1018 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1019 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
4e74239c 1020 d=Time_F(STOP,usertime);
d02b48c6
RE
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
f5d7a031 1027#ifndef NO_RIPEMD
58964a49
RE
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]);
4e74239c 1033 Time_F(START,usertime);
58964a49
RE
1034 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1035 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
4e74239c 1036 d=Time_F(STOP,usertime);
58964a49
RE
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
d02b48c6
RE
1043#ifndef 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]);
4e74239c 1049 Time_F(START,usertime);
d02b48c6
RE
1050 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1051 RC4(&rc4_ks,(unsigned int)lengths[j],
1052 buf,buf);
4e74239c 1053 d=Time_F(STOP,usertime);
d02b48c6
RE
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 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]);
4e74239c 1066 Time_F(START,usertime);
d02b48c6 1067 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
4e31df2c 1068 des_ncbc_encrypt(buf,buf,lengths[j],sch,
edf0bfb5 1069 &iv,DES_ENCRYPT);
4e74239c 1070 d=Time_F(STOP,usertime);
d02b48c6
RE
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]);
4e74239c 1082 Time_F(START,usertime);
d02b48c6 1083 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
4e31df2c
BL
1084 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1085 sch,sch2,sch3,
edf0bfb5 1086 &iv,DES_ENCRYPT);
4e74239c 1087 d=Time_F(STOP,usertime);
d02b48c6
RE
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 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]);
4e74239c 1100 Time_F(START,usertime);
d02b48c6
RE
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,
12ba413c 1104 iv,IDEA_ENCRYPT);
4e74239c 1105 d=Time_F(STOP,usertime);
d02b48c6
RE
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 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]);
4e74239c 1118 Time_F(START,usertime);
d02b48c6
RE
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,
12ba413c 1122 iv,RC2_ENCRYPT);
4e74239c 1123 d=Time_F(STOP,usertime);
d02b48c6
RE
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
58964a49
RE
1130#ifndef 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]);
4e74239c 1136 Time_F(START,usertime);
58964a49
RE
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,
12ba413c 1140 iv,RC5_ENCRYPT);
4e74239c 1141 d=Time_F(STOP,usertime);
58964a49
RE
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
f5d7a031 1148#ifndef NO_BF
d02b48c6
RE
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]);
4e74239c 1154 Time_F(START,usertime);
d02b48c6
RE
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,
12ba413c 1158 iv,BF_ENCRYPT);
4e74239c 1159 d=Time_F(STOP,usertime);
d02b48c6
RE
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
58964a49
RE
1166#ifndef 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]);
4e74239c 1172 Time_F(START,usertime);
58964a49
RE
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,
12ba413c 1176 iv,CAST_ENCRYPT);
4e74239c 1177 d=Time_F(STOP,usertime);
58964a49
RE
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
d02b48c6 1184
646d5695
BL
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
373b575f 1207 RAND_pseudo_bytes(buf,36);
d02b48c6
RE
1208#ifndef NO_RSA
1209 for (j=0; j<RSA_NUM; j++)
1210 {
c91e1259 1211 int ret;
d02b48c6 1212 if (!rsa_doit[j]) continue;
c91e1259 1213 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
03ea28c9
RL
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
d02b48c6 1221 {
03ea28c9
RL
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++)
d02b48c6 1228 {
03ea28c9
RL
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 }
d02b48c6 1239 }
03ea28c9
RL
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;
d02b48c6 1246 }
d02b48c6 1247
58964a49 1248#if 1
c91e1259 1249 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
03ea28c9 1250 if (ret <= 0)
d02b48c6 1251 {
03ea28c9
RL
1252 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1253 ERR_print_errors(bio_err);
1254 dsa_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++)
d02b48c6 1263 {
03ea28c9
RL
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 }
d02b48c6 1274 }
03ea28c9
RL
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;
d02b48c6 1280 }
58964a49 1281#endif
d02b48c6
RE
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
373b575f 1292 RAND_pseudo_bytes(buf,20);
d02b48c6 1293#ifndef NO_DSA
99a97051
UM
1294 if (RAND_status() != 1)
1295 {
1296 RAND_seed(rnd_seed, sizeof rnd_seed);
1297 rnd_fake = 1;
1298 }
d02b48c6
RE
1299 for (j=0; j<DSA_NUM; j++)
1300 {
58964a49 1301 unsigned int kk;
03ea28c9 1302 int ret;
58964a49 1303
d02b48c6
RE
1304 if (!dsa_doit[j]) continue;
1305 DSA_generate_key(dsa_key[j]);
1306/* DSA_sign_setup(dsa_key[j],NULL); */
03ea28c9 1307 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1308 &kk,dsa_key[j]);
03ea28c9
RL
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
d02b48c6 1316 {
03ea28c9
RL
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++)
d02b48c6 1322 {
03ea28c9
RL
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 }
d02b48c6 1333 }
03ea28c9
RL
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;
d02b48c6 1339 }
d02b48c6 1340
03ea28c9 1341 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1342 kk,dsa_key[j]);
03ea28c9
RL
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
d02b48c6 1350 {
03ea28c9
RL
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++)
d02b48c6 1356 {
03ea28c9
RL
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 }
d02b48c6 1367 }
03ea28c9
RL
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;
d02b48c6 1372 }
d02b48c6
RE
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 }
99a97051 1381 if (rnd_fake) RAND_cleanup();
d02b48c6
RE
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 NO_MD2
1389 printf("%s ",MD2_options());
1390#endif
1391#ifndef NO_RC4
1392 printf("%s ",RC4_options());
1393#endif
1394#ifndef NO_DES
1395 printf("%s ",des_options());
1396#endif
1397#ifndef NO_IDEA
1398 printf("%s ",idea_options());
1399#endif
f5d7a031 1400#ifndef NO_BF
d02b48c6
RE
1401 printf("%s ",BF_options());
1402#endif
58964a49 1403 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
d02b48c6
RE
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;
58964a49 1417 fprintf(stdout,"%-13s",names[k]);
d02b48c6
RE
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 NO_RSA
1428 j=1;
1429 for (k=0; k<RSA_NUM; k++)
1430 {
1431 if (!rsa_doit[k]) continue;
58964a49
RE
1432 if (j)
1433 {
1434 printf("%18ssign verify sign/s verify/s\n"," ");
1435 j=0;
1436 }
d58d092b 1437 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
58964a49
RE
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]);
d02b48c6
RE
1440 fprintf(stdout,"\n");
1441 }
1442#endif
1443#ifndef NO_DSA
1444 j=1;
1445 for (k=0; k<DSA_NUM; k++)
1446 {
1447 if (!dsa_doit[k]) continue;
58964a49
RE
1448 if (j) {
1449 printf("%18ssign verify sign/s verify/s\n"," ");
1450 j=0;
1451 }
d58d092b 1452 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
58964a49
RE
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]);
d02b48c6
RE
1455 fprintf(stdout,"\n");
1456 }
1457#endif
18c77bf2 1458 mret=0;
d02b48c6 1459end:
5270e702 1460 ERR_print_errors(bio_err);
26a3a48d
RL
1461 if (buf != NULL) OPENSSL_free(buf);
1462 if (buf2 != NULL) OPENSSL_free(buf2);
d02b48c6
RE
1463#ifndef 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 NO_DSA
1469 for (i=0; i<DSA_NUM; i++)
1470 if (dsa_key[i] != NULL)
1471 DSA_free(dsa_key[i]);
1472#endif
18c77bf2 1473 EXIT(mret);
d02b48c6
RE
1474 }
1475
646d5695 1476static void print_message(const char *s, long num, int length)
d02b48c6
RE
1477 {
1478#ifdef SIGALRM
1479 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
d58d092b 1480 (void)BIO_flush(bio_err);
d02b48c6
RE
1481 alarm(SECONDS);
1482#else
1483 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
d58d092b 1484 (void)BIO_flush(bio_err);
d02b48c6
RE
1485#endif
1486#ifdef LINT
1487 num=num;
1488#endif
1489 }
1490
6b691a5c
UM
1491static void pkey_print_message(char *str, char *str2, long num, int bits,
1492 int tm)
d02b48c6
RE
1493 {
1494#ifdef SIGALRM
1495 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
d58d092b 1496 (void)BIO_flush(bio_err);
d02b48c6
RE
1497 alarm(RSA_SECONDS);
1498#else
1499 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
d58d092b 1500 (void)BIO_flush(bio_err);
d02b48c6
RE
1501#endif
1502#ifdef LINT
1503 num=num;
1504#endif
1505 }
58964a49 1506