]> git.ipfire.org Git - thirdparty/openssl.git/blame - apps/speed.c
Remove redundant operations and update version info.
[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"
cf1b7d96 78#ifdef OPENSSL_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
7f19d42e 88#if defined(__FreeBSD__) || defined(OPENSSL_SYS_MACOSX)
2bfb4dbc 89# define USE_TOD
bc36ee62 90#elif !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
2bfb4dbc 91# define TIMES
d02b48c6 92#endif
cf1b7d96 93#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) /* FIXME */
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 */
bc36ee62 113#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
7d7d2cbc 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
cf1b7d96 131#ifndef OPENSSL_NO_DES
ec577822 132#include <openssl/des.h>
d02b48c6 133#endif
cf1b7d96 134#ifndef OPENSSL_NO_MD2
ec577822 135#include <openssl/md2.h>
d02b48c6 136#endif
cf1b7d96 137#ifndef OPENSSL_NO_MDC2
ec577822 138#include <openssl/mdc2.h>
d02b48c6 139#endif
cf1b7d96 140#ifndef OPENSSL_NO_MD4
3009458e
RL
141#include <openssl/md4.h>
142#endif
cf1b7d96 143#ifndef OPENSSL_NO_MD5
ec577822 144#include <openssl/md5.h>
5271ebd9 145#endif
cf1b7d96 146#ifndef OPENSSL_NO_HMAC
ec577822 147#include <openssl/hmac.h>
d02b48c6 148#endif
5271ebd9 149#include <openssl/evp.h>
cf1b7d96 150#ifndef OPENSSL_NO_SHA
ec577822 151#include <openssl/sha.h>
d02b48c6 152#endif
cf1b7d96 153#ifndef OPENSSL_NO_RIPEMD
ec577822 154#include <openssl/ripemd.h>
58964a49 155#endif
cf1b7d96 156#ifndef OPENSSL_NO_RC4
ec577822 157#include <openssl/rc4.h>
d02b48c6 158#endif
cf1b7d96 159#ifndef OPENSSL_NO_RC5
ec577822 160#include <openssl/rc5.h>
58964a49 161#endif
cf1b7d96 162#ifndef OPENSSL_NO_RC2
ec577822 163#include <openssl/rc2.h>
d02b48c6 164#endif
cf1b7d96 165#ifndef OPENSSL_NO_IDEA
ec577822 166#include <openssl/idea.h>
d02b48c6 167#endif
cf1b7d96 168#ifndef OPENSSL_NO_BF
ec577822 169#include <openssl/blowfish.h>
d02b48c6 170#endif
cf1b7d96 171#ifndef OPENSSL_NO_CAST
ec577822 172#include <openssl/cast.h>
58964a49 173#endif
cf1b7d96 174#ifndef OPENSSL_NO_RSA
ec577822 175#include <openssl/rsa.h>
f5d7a031 176#include "./testrsa.h"
d02b48c6 177#endif
ec577822 178#include <openssl/x509.h>
cf1b7d96 179#ifndef OPENSSL_NO_DSA
d02b48c6
RE
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;
cf1b7d96 325#ifndef OPENSSL_NO_RSA
5614bb91 326 unsigned rsa_num;
b2293b1e 327#endif
cf1b7d96 328#ifndef OPENSSL_NO_MD2
d02b48c6
RE
329 unsigned char md2[MD2_DIGEST_LENGTH];
330#endif
cf1b7d96 331#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
332 unsigned char mdc2[MDC2_DIGEST_LENGTH];
333#endif
cf1b7d96 334#ifndef OPENSSL_NO_MD4
3009458e
RL
335 unsigned char md4[MD4_DIGEST_LENGTH];
336#endif
cf1b7d96 337#ifndef OPENSSL_NO_MD5
d02b48c6 338 unsigned char md5[MD5_DIGEST_LENGTH];
58964a49 339 unsigned char hmac[MD5_DIGEST_LENGTH];
d02b48c6 340#endif
cf1b7d96 341#ifndef OPENSSL_NO_SHA
d02b48c6
RE
342 unsigned char sha[SHA_DIGEST_LENGTH];
343#endif
cf1b7d96 344#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
345 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
346#endif
cf1b7d96 347#ifndef OPENSSL_NO_RC4
d02b48c6
RE
348 RC4_KEY rc4_ks;
349#endif
cf1b7d96 350#ifndef OPENSSL_NO_RC5
58964a49
RE
351 RC5_32_KEY rc5_ks;
352#endif
cf1b7d96 353#ifndef OPENSSL_NO_RC2
d02b48c6
RE
354 RC2_KEY rc2_ks;
355#endif
cf1b7d96 356#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
357 IDEA_KEY_SCHEDULE idea_ks;
358#endif
cf1b7d96 359#ifndef OPENSSL_NO_BF
d02b48c6 360 BF_KEY bf_ks;
58964a49 361#endif
cf1b7d96 362#ifndef OPENSSL_NO_CAST
58964a49 363 CAST_KEY cast_ks;
d02b48c6
RE
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];
cf1b7d96 369#ifndef OPENSSL_NO_DES
5676d8cb 370 des_cblock *buf_as_des_cblock = NULL;
d02b48c6
RE
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
3009458e
RL
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
646d5695 391#define D_EVP 15
d02b48c6
RE
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];
646d5695 395 static const char *names[ALGOR_NUM]={
3009458e 396 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
d02b48c6 397 "des cbc","des ede3","idea cbc",
58964a49 398 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
d02b48c6
RE
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
cf1b7d96 406#ifndef OPENSSL_NO_RSA
d02b48c6 407 RSA *rsa_key[RSA_NUM];
d02b48c6 408 long rsa_c[RSA_NUM][2];
d02b48c6 409 double rsa_results[RSA_NUM][2];
d02b48c6 410 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
d02b48c6
RE
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)};
58964a49 416#endif
cf1b7d96 417#ifndef OPENSSL_NO_DSA
58964a49
RE
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
d02b48c6
RE
423 int rsa_doit[RSA_NUM];
424 int dsa_doit[DSA_NUM];
58964a49 425 int doit[ALGOR_NUM];
d02b48c6 426 int pr_header=0;
4e74239c 427 int usertime=1;
646d5695 428 const EVP_CIPHER *evp=NULL;
4e74239c
RL
429
430#ifndef TIMES
431 usertime=-1;
432#endif
d02b48c6
RE
433
434 apps_startup();
396f6314 435 memset(results, 0, sizeof(results));
cf1b7d96 436#ifndef OPENSSL_NO_DSA
dfeab068
RE
437 memset(dsa_key,0,sizeof(dsa_key));
438#endif
d02b48c6
RE
439
440 if (bio_err == NULL)
441 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
58964a49 442 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
d02b48c6 443
cf1b7d96 444#ifndef OPENSSL_NO_RSA
dfeab068 445 memset(rsa_key,0,sizeof(rsa_key));
d02b48c6
RE
446 for (i=0; i<RSA_NUM; i++)
447 rsa_key[i]=NULL;
dfeab068 448#endif
d02b48c6 449
26a3a48d 450 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
451 {
452 BIO_printf(bio_err,"out of memory\n");
453 goto end;
454 }
cf1b7d96 455#ifndef OPENSSL_NO_DES
12ba413c 456 buf_as_des_cblock = (des_cblock *)buf;
5676d8cb 457#endif
26a3a48d 458 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
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 {
4e74239c
RL
479 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
480 usertime = 0;
646d5695
BL
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 }
5270e702
RL
498 else
499 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
500 {
501 argc--;
502 argv++;
503 if(argc == 0)
504 {
505 BIO_printf(bio_err,"no engine given\n");
506 goto end;
507 }
508 if((e = ENGINE_by_id(*argv)) == NULL)
509 {
510 BIO_printf(bio_err,"invalid engine \"%s\"\n",
511 *argv);
512 goto end;
513 }
514 if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
515 {
516 BIO_printf(bio_err,"can't use that engine\n");
517 goto end;
518 }
519 BIO_printf(bio_err,"engine \"%s\" set.\n", *argv);
520 /* Free our "structural" reference. */
521 ENGINE_free(e);
522 /* It will be increased again further down. We just
523 don't want speed to confuse an engine with an
524 algorithm, especially when none is given (which
525 means all of them should be run) */
526 j--;
527 }
528 else
cf1b7d96 529#ifndef OPENSSL_NO_MD2
d02b48c6
RE
530 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
531 else
532#endif
cf1b7d96 533#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
534 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
535 else
536#endif
cf1b7d96 537#ifndef OPENSSL_NO_MD4
3009458e
RL
538 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
539 else
540#endif
cf1b7d96 541#ifndef OPENSSL_NO_MD5
d02b48c6
RE
542 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
543 else
544#endif
cf1b7d96 545#ifndef OPENSSL_NO_MD5
58964a49 546 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
d02b48c6
RE
547 else
548#endif
cf1b7d96 549#ifndef OPENSSL_NO_SHA
d02b48c6
RE
550 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
551 else
58964a49
RE
552 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
553 else
554#endif
cf1b7d96 555#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
556 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
557 else
558 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
559 else
560 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
561 else
d02b48c6 562#endif
cf1b7d96 563#ifndef OPENSSL_NO_RC4
d02b48c6
RE
564 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
565 else
566#endif
cf1b7d96 567#ifndef OPENSSL_NO_DES
d02b48c6
RE
568 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
569 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
570 else
571#endif
cf1b7d96 572#ifndef OPENSSL_NO_RSA
ccb9643f 573#if 0 /* was: #ifdef RSAref */
d02b48c6
RE
574 if (strcmp(*argv,"rsaref") == 0)
575 {
5270e702 576 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
d02b48c6
RE
577 j--;
578 }
579 else
580#endif
c1cd88a0 581#ifndef RSA_NULL
e170a5c0 582 if (strcmp(*argv,"openssl") == 0)
d02b48c6 583 {
5270e702 584 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
d02b48c6
RE
585 j--;
586 }
587 else
c1cd88a0 588#endif
cf1b7d96 589#endif /* !OPENSSL_NO_RSA */
d02b48c6
RE
590 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
591 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
592 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
593 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
594 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
595 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
596 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
597 else
cf1b7d96 598#ifndef OPENSSL_NO_RC2
d02b48c6
RE
599 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
600 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
601 else
602#endif
cf1b7d96 603#ifndef OPENSSL_NO_RC5
58964a49
RE
604 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
605 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
606 else
607#endif
cf1b7d96 608#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
609 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
610 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
611 else
612#endif
cf1b7d96 613#ifndef OPENSSL_NO_BF
d02b48c6
RE
614 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
615 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
58964a49
RE
616 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
617 else
618#endif
cf1b7d96 619#ifndef OPENSSL_NO_CAST
58964a49
RE
620 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
621 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
622 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
d02b48c6
RE
623 else
624#endif
cf1b7d96 625#ifndef OPENSSL_NO_DES
d02b48c6
RE
626 if (strcmp(*argv,"des") == 0)
627 {
628 doit[D_CBC_DES]=1;
629 doit[D_EDE3_DES]=1;
630 }
631 else
632#endif
cf1b7d96 633#ifndef OPENSSL_NO_RSA
d02b48c6
RE
634 if (strcmp(*argv,"rsa") == 0)
635 {
636 rsa_doit[R_RSA_512]=1;
637 rsa_doit[R_RSA_1024]=1;
638 rsa_doit[R_RSA_2048]=1;
639 rsa_doit[R_RSA_4096]=1;
640 }
641 else
642#endif
cf1b7d96 643#ifndef OPENSSL_NO_DSA
d02b48c6
RE
644 if (strcmp(*argv,"dsa") == 0)
645 {
646 dsa_doit[R_DSA_512]=1;
647 dsa_doit[R_DSA_1024]=1;
648 }
649 else
650#endif
651 {
3009458e
RL
652 BIO_printf(bio_err,"Error: bad option or value\n");
653 BIO_printf(bio_err,"\n");
654 BIO_printf(bio_err,"Available values:\n");
cf1b7d96 655#ifndef OPENSSL_NO_MD2
3009458e
RL
656 BIO_printf(bio_err,"md2 ");
657#endif
cf1b7d96 658#ifndef OPENSSL_NO_MDC2
3009458e
RL
659 BIO_printf(bio_err,"mdc2 ");
660#endif
cf1b7d96 661#ifndef OPENSSL_NO_MD4
3009458e
RL
662 BIO_printf(bio_err,"md4 ");
663#endif
cf1b7d96 664#ifndef OPENSSL_NO_MD5
3009458e 665 BIO_printf(bio_err,"md5 ");
cf1b7d96 666#ifndef OPENSSL_NO_HMAC
3009458e
RL
667 BIO_printf(bio_err,"hmac ");
668#endif
669#endif
cf1b7d96 670#ifndef OPENSSL_NO_SHA1
3009458e
RL
671 BIO_printf(bio_err,"sha1 ");
672#endif
cf1b7d96 673#ifndef OPENSSL_NO_RIPEMD160
3009458e
RL
674 BIO_printf(bio_err,"rmd160");
675#endif
cf1b7d96
RL
676#if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
677 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
678 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
3009458e
RL
679 BIO_printf(bio_err,"\n");
680#endif
681
cf1b7d96 682#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
683 BIO_printf(bio_err,"idea-cbc ");
684#endif
cf1b7d96 685#ifndef OPENSSL_NO_RC2
d02b48c6
RE
686 BIO_printf(bio_err,"rc2-cbc ");
687#endif
cf1b7d96 688#ifndef OPENSSL_NO_RC5
58964a49
RE
689 BIO_printf(bio_err,"rc5-cbc ");
690#endif
cf1b7d96 691#ifndef OPENSSL_NO_BF
d02b48c6
RE
692 BIO_printf(bio_err,"bf-cbc");
693#endif
cf1b7d96
RL
694#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
695 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
d02b48c6
RE
696 BIO_printf(bio_err,"\n");
697#endif
3009458e 698
d02b48c6 699 BIO_printf(bio_err,"des-cbc des-ede3 ");
cf1b7d96 700#ifndef OPENSSL_NO_RC4
d02b48c6
RE
701 BIO_printf(bio_err,"rc4");
702#endif
3009458e
RL
703 BIO_printf(bio_err,"\n");
704
cf1b7d96 705#ifndef OPENSSL_NO_RSA
3009458e 706 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
d02b48c6 707#endif
3009458e 708
cf1b7d96 709#ifndef OPENSSL_NO_DSA
3009458e
RL
710 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
711#endif
712
cf1b7d96 713#ifndef OPENSSL_NO_IDEA
3009458e
RL
714 BIO_printf(bio_err,"idea ");
715#endif
cf1b7d96 716#ifndef OPENSSL_NO_RC2
3009458e
RL
717 BIO_printf(bio_err,"rc2 ");
718#endif
cf1b7d96 719#ifndef OPENSSL_NO_DES
3009458e 720 BIO_printf(bio_err,"des ");
d02b48c6 721#endif
cf1b7d96 722#ifndef OPENSSL_NO_RSA
3009458e
RL
723 BIO_printf(bio_err,"rsa ");
724#endif
cf1b7d96 725#ifndef OPENSSL_NO_BF
3009458e
RL
726 BIO_printf(bio_err,"blowfish");
727#endif
cf1b7d96
RL
728#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
729 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
730 !defined(OPENSSL_NO_BF)
4e74239c 731 BIO_printf(bio_err,"\n");
3009458e
RL
732#endif
733
4e74239c 734 BIO_printf(bio_err,"\n");
3009458e 735 BIO_printf(bio_err,"Available options:\n");
5270e702 736#ifdef TIMES
4e74239c 737 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
3132e196 738#endif
5270e702 739 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
d02b48c6
RE
740 goto end;
741 }
742 argc--;
743 argv++;
744 j++;
745 }
746
747 if (j == 0)
748 {
749 for (i=0; i<ALGOR_NUM; i++)
53d28679
BM
750 {
751 if (i != D_EVP)
752 doit[i]=1;
753 }
d02b48c6
RE
754 for (i=0; i<RSA_NUM; i++)
755 rsa_doit[i]=1;
756 for (i=0; i<DSA_NUM; i++)
757 dsa_doit[i]=1;
758 }
759 for (i=0; i<ALGOR_NUM; i++)
760 if (doit[i]) pr_header++;
761
4e74239c
RL
762 if (usertime == 0)
763 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
764 if (usertime <= 0)
765 {
766 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
767 BIO_printf(bio_err,"program when this computer is idle.\n");
768 }
d02b48c6 769
cf1b7d96 770#ifndef OPENSSL_NO_RSA
d02b48c6
RE
771 for (i=0; i<RSA_NUM; i++)
772 {
5e4ca422 773 const unsigned char *p;
d02b48c6
RE
774
775 p=rsa_data[i];
776 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
777 if (rsa_key[i] == NULL)
778 {
779 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
780 goto end;
781 }
58964a49
RE
782#if 0
783 else
784 {
785 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
786 BN_print(bio_err,rsa_key[i]->e);
787 BIO_printf(bio_err,"\n");
788 }
789#endif
d02b48c6
RE
790 }
791#endif
792
cf1b7d96 793#ifndef OPENSSL_NO_DSA
d02b48c6
RE
794 dsa_key[0]=get_dsa512();
795 dsa_key[1]=get_dsa1024();
796 dsa_key[2]=get_dsa2048();
797#endif
798
cf1b7d96 799#ifndef OPENSSL_NO_DES
cddfe788
BM
800 des_set_key_unchecked(&key,sch);
801 des_set_key_unchecked(&key2,sch2);
802 des_set_key_unchecked(&key3,sch3);
d02b48c6 803#endif
cf1b7d96 804#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
805 idea_set_encrypt_key(key16,&idea_ks);
806#endif
cf1b7d96 807#ifndef OPENSSL_NO_RC4
d02b48c6
RE
808 RC4_set_key(&rc4_ks,16,key16);
809#endif
cf1b7d96 810#ifndef OPENSSL_NO_RC2
d02b48c6
RE
811 RC2_set_key(&rc2_ks,16,key16,128);
812#endif
cf1b7d96 813#ifndef OPENSSL_NO_RC5
58964a49
RE
814 RC5_32_set_key(&rc5_ks,16,key16,12);
815#endif
cf1b7d96 816#ifndef OPENSSL_NO_BF
d02b48c6
RE
817 BF_set_key(&bf_ks,16,key16);
818#endif
cf1b7d96 819#ifndef OPENSSL_NO_CAST
58964a49
RE
820 CAST_set_key(&cast_ks,16,key16);
821#endif
cf1b7d96 822#ifndef OPENSSL_NO_RSA
d02b48c6 823 memset(rsa_c,0,sizeof(rsa_c));
f5d7a031 824#endif
d02b48c6 825#ifndef SIGALRM
cf1b7d96 826#ifndef OPENSSL_NO_DES
d02b48c6
RE
827 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
828 count=10;
829 do {
830 long i;
831 count*=2;
4e74239c 832 Time_F(START,usertime);
d02b48c6 833 for (i=count; i; i--)
12ba413c
BM
834 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
835 &(sch[0]),DES_ENCRYPT);
4e74239c 836 d=Time_F(STOP,usertime);
d02b48c6 837 } while (d <3);
646d5695 838 save_count=count;
d02b48c6
RE
839 c[D_MD2][0]=count/10;
840 c[D_MDC2][0]=count/10;
3009458e 841 c[D_MD4][0]=count;
d02b48c6 842 c[D_MD5][0]=count;
58964a49 843 c[D_HMAC][0]=count;
d02b48c6 844 c[D_SHA1][0]=count;
58964a49 845 c[D_RMD160][0]=count;
d02b48c6
RE
846 c[D_RC4][0]=count*5;
847 c[D_CBC_DES][0]=count;
848 c[D_EDE3_DES][0]=count/3;
849 c[D_CBC_IDEA][0]=count;
850 c[D_CBC_RC2][0]=count;
58964a49 851 c[D_CBC_RC5][0]=count;
d02b48c6 852 c[D_CBC_BF][0]=count;
58964a49 853 c[D_CBC_CAST][0]=count;
d02b48c6
RE
854
855 for (i=1; i<SIZE_NUM; i++)
856 {
857 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
858 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
3009458e 859 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
d02b48c6 860 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
58964a49 861 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
d02b48c6 862 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
58964a49 863 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
d02b48c6
RE
864 }
865 for (i=1; i<SIZE_NUM; i++)
866 {
867 long l0,l1;
868
869 l0=(long)lengths[i-1];
870 l1=(long)lengths[i];
871 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
872 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
873 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
874 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
875 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
58964a49 876 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
d02b48c6 877 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
58964a49 878 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
d02b48c6 879 }
cf1b7d96 880#ifndef OPENSSL_NO_RSA
d02b48c6
RE
881 rsa_c[R_RSA_512][0]=count/2000;
882 rsa_c[R_RSA_512][1]=count/400;
883 for (i=1; i<RSA_NUM; i++)
884 {
885 rsa_c[i][0]=rsa_c[i-1][0]/8;
886 rsa_c[i][1]=rsa_c[i-1][1]/4;
887 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
888 rsa_doit[i]=0;
889 else
890 {
dfeab068 891 if (rsa_c[i][0] == 0)
d02b48c6
RE
892 {
893 rsa_c[i][0]=1;
894 rsa_c[i][1]=20;
895 }
896 }
897 }
f5d7a031 898#endif
d02b48c6
RE
899
900 dsa_c[R_DSA_512][0]=count/1000;
901 dsa_c[R_DSA_512][1]=count/1000/2;
902 for (i=1; i<DSA_NUM; i++)
903 {
904 dsa_c[i][0]=dsa_c[i-1][0]/4;
905 dsa_c[i][1]=dsa_c[i-1][1]/4;
906 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
907 dsa_doit[i]=0;
908 else
909 {
910 if (dsa_c[i] == 0)
911 {
912 dsa_c[i][0]=1;
913 dsa_c[i][1]=1;
914 }
915 }
916 }
917
58964a49 918#define COND(d) (count < (d))
d02b48c6
RE
919#define COUNT(d) (d)
920#else
63da21c0
BM
921/* not worth fixing */
922# error "You cannot disable DES on systems without SIGALRM."
cf1b7d96 923#endif /* OPENSSL_NO_DES */
63da21c0 924#else
d02b48c6
RE
925#define COND(c) (run)
926#define COUNT(d) (count)
927 signal(SIGALRM,sig_done);
63da21c0 928#endif /* SIGALRM */
d02b48c6 929
cf1b7d96 930#ifndef OPENSSL_NO_MD2
d02b48c6
RE
931 if (doit[D_MD2])
932 {
933 for (j=0; j<SIZE_NUM; j++)
934 {
935 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
4e74239c 936 Time_F(START,usertime);
d02b48c6
RE
937 for (count=0,run=1; COND(c[D_MD2][j]); count++)
938 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
4e74239c 939 d=Time_F(STOP,usertime);
d02b48c6
RE
940 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
941 count,names[D_MD2],d);
942 results[D_MD2][j]=((double)count)/d*lengths[j];
943 }
944 }
945#endif
cf1b7d96 946#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
947 if (doit[D_MDC2])
948 {
949 for (j=0; j<SIZE_NUM; j++)
950 {
951 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
4e74239c 952 Time_F(START,usertime);
d02b48c6
RE
953 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
954 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
4e74239c 955 d=Time_F(STOP,usertime);
d02b48c6
RE
956 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
957 count,names[D_MDC2],d);
958 results[D_MDC2][j]=((double)count)/d*lengths[j];
959 }
960 }
961#endif
962
cf1b7d96 963#ifndef OPENSSL_NO_MD4
3009458e
RL
964 if (doit[D_MD4])
965 {
966 for (j=0; j<SIZE_NUM; j++)
967 {
968 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
969 Time_F(START,usertime);
970 for (count=0,run=1; COND(c[D_MD4][j]); count++)
971 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
972 d=Time_F(STOP,usertime);
973 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
974 count,names[D_MD4],d);
975 results[D_MD4][j]=((double)count)/d*lengths[j];
976 }
977 }
978#endif
979
cf1b7d96 980#ifndef OPENSSL_NO_MD5
d02b48c6
RE
981 if (doit[D_MD5])
982 {
983 for (j=0; j<SIZE_NUM; j++)
984 {
985 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
4e74239c 986 Time_F(START,usertime);
d02b48c6 987 for (count=0,run=1; COND(c[D_MD5][j]); count++)
58964a49 988 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
4e74239c 989 d=Time_F(STOP,usertime);
d02b48c6
RE
990 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
991 count,names[D_MD5],d);
992 results[D_MD5][j]=((double)count)/d*lengths[j];
993 }
994 }
995#endif
996
cf1b7d96 997#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
58964a49 998 if (doit[D_HMAC])
d02b48c6 999 {
58964a49
RE
1000 HMAC_CTX hctx;
1001 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
1002 16,EVP_md5());
1003
d02b48c6
RE
1004 for (j=0; j<SIZE_NUM; j++)
1005 {
58964a49 1006 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
4e74239c 1007 Time_F(START,usertime);
58964a49
RE
1008 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1009 {
1010 HMAC_Init(&hctx,NULL,0,NULL);
1011 HMAC_Update(&hctx,buf,lengths[j]);
1012 HMAC_Final(&hctx,&(hmac[0]),NULL);
1013 }
4e74239c 1014 d=Time_F(STOP,usertime);
d02b48c6 1015 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
58964a49
RE
1016 count,names[D_HMAC],d);
1017 results[D_HMAC][j]=((double)count)/d*lengths[j];
d02b48c6
RE
1018 }
1019 }
1020#endif
cf1b7d96 1021#ifndef OPENSSL_NO_SHA
d02b48c6
RE
1022 if (doit[D_SHA1])
1023 {
1024 for (j=0; j<SIZE_NUM; j++)
1025 {
1026 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
4e74239c 1027 Time_F(START,usertime);
d02b48c6
RE
1028 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
1029 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
4e74239c 1030 d=Time_F(STOP,usertime);
d02b48c6
RE
1031 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1032 count,names[D_SHA1],d);
1033 results[D_SHA1][j]=((double)count)/d*lengths[j];
1034 }
1035 }
1036#endif
cf1b7d96 1037#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
1038 if (doit[D_RMD160])
1039 {
1040 for (j=0; j<SIZE_NUM; j++)
1041 {
1042 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
4e74239c 1043 Time_F(START,usertime);
58964a49
RE
1044 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1045 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
4e74239c 1046 d=Time_F(STOP,usertime);
58964a49
RE
1047 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1048 count,names[D_RMD160],d);
1049 results[D_RMD160][j]=((double)count)/d*lengths[j];
1050 }
1051 }
1052#endif
cf1b7d96 1053#ifndef OPENSSL_NO_RC4
d02b48c6
RE
1054 if (doit[D_RC4])
1055 {
1056 for (j=0; j<SIZE_NUM; j++)
1057 {
1058 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
4e74239c 1059 Time_F(START,usertime);
d02b48c6
RE
1060 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1061 RC4(&rc4_ks,(unsigned int)lengths[j],
1062 buf,buf);
4e74239c 1063 d=Time_F(STOP,usertime);
d02b48c6
RE
1064 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1065 count,names[D_RC4],d);
1066 results[D_RC4][j]=((double)count)/d*lengths[j];
1067 }
1068 }
1069#endif
cf1b7d96 1070#ifndef OPENSSL_NO_DES
d02b48c6
RE
1071 if (doit[D_CBC_DES])
1072 {
1073 for (j=0; j<SIZE_NUM; j++)
1074 {
1075 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
4e74239c 1076 Time_F(START,usertime);
d02b48c6 1077 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
4e31df2c 1078 des_ncbc_encrypt(buf,buf,lengths[j],sch,
edf0bfb5 1079 &iv,DES_ENCRYPT);
4e74239c 1080 d=Time_F(STOP,usertime);
d02b48c6
RE
1081 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1082 count,names[D_CBC_DES],d);
1083 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1084 }
1085 }
1086
1087 if (doit[D_EDE3_DES])
1088 {
1089 for (j=0; j<SIZE_NUM; j++)
1090 {
1091 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
4e74239c 1092 Time_F(START,usertime);
d02b48c6 1093 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
4e31df2c
BL
1094 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1095 sch,sch2,sch3,
edf0bfb5 1096 &iv,DES_ENCRYPT);
4e74239c 1097 d=Time_F(STOP,usertime);
d02b48c6
RE
1098 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1099 count,names[D_EDE3_DES],d);
1100 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1101 }
1102 }
1103#endif
cf1b7d96 1104#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
1105 if (doit[D_CBC_IDEA])
1106 {
1107 for (j=0; j<SIZE_NUM; j++)
1108 {
1109 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
4e74239c 1110 Time_F(START,usertime);
d02b48c6
RE
1111 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1112 idea_cbc_encrypt(buf,buf,
1113 (unsigned long)lengths[j],&idea_ks,
12ba413c 1114 iv,IDEA_ENCRYPT);
4e74239c 1115 d=Time_F(STOP,usertime);
d02b48c6
RE
1116 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1117 count,names[D_CBC_IDEA],d);
1118 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1119 }
1120 }
1121#endif
cf1b7d96 1122#ifndef OPENSSL_NO_RC2
d02b48c6
RE
1123 if (doit[D_CBC_RC2])
1124 {
1125 for (j=0; j<SIZE_NUM; j++)
1126 {
1127 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
4e74239c 1128 Time_F(START,usertime);
d02b48c6
RE
1129 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1130 RC2_cbc_encrypt(buf,buf,
1131 (unsigned long)lengths[j],&rc2_ks,
12ba413c 1132 iv,RC2_ENCRYPT);
4e74239c 1133 d=Time_F(STOP,usertime);
d02b48c6
RE
1134 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1135 count,names[D_CBC_RC2],d);
1136 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1137 }
1138 }
1139#endif
cf1b7d96 1140#ifndef OPENSSL_NO_RC5
58964a49
RE
1141 if (doit[D_CBC_RC5])
1142 {
1143 for (j=0; j<SIZE_NUM; j++)
1144 {
1145 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
4e74239c 1146 Time_F(START,usertime);
58964a49
RE
1147 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1148 RC5_32_cbc_encrypt(buf,buf,
1149 (unsigned long)lengths[j],&rc5_ks,
12ba413c 1150 iv,RC5_ENCRYPT);
4e74239c 1151 d=Time_F(STOP,usertime);
58964a49
RE
1152 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1153 count,names[D_CBC_RC5],d);
1154 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1155 }
1156 }
1157#endif
cf1b7d96 1158#ifndef OPENSSL_NO_BF
d02b48c6
RE
1159 if (doit[D_CBC_BF])
1160 {
1161 for (j=0; j<SIZE_NUM; j++)
1162 {
1163 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
4e74239c 1164 Time_F(START,usertime);
d02b48c6
RE
1165 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1166 BF_cbc_encrypt(buf,buf,
1167 (unsigned long)lengths[j],&bf_ks,
12ba413c 1168 iv,BF_ENCRYPT);
4e74239c 1169 d=Time_F(STOP,usertime);
d02b48c6
RE
1170 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1171 count,names[D_CBC_BF],d);
1172 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1173 }
1174 }
1175#endif
cf1b7d96 1176#ifndef OPENSSL_NO_CAST
58964a49
RE
1177 if (doit[D_CBC_CAST])
1178 {
1179 for (j=0; j<SIZE_NUM; j++)
1180 {
1181 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
4e74239c 1182 Time_F(START,usertime);
58964a49
RE
1183 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1184 CAST_cbc_encrypt(buf,buf,
1185 (unsigned long)lengths[j],&cast_ks,
12ba413c 1186 iv,CAST_ENCRYPT);
4e74239c 1187 d=Time_F(STOP,usertime);
58964a49
RE
1188 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1189 count,names[D_CBC_CAST],d);
1190 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1191 }
1192 }
1193#endif
d02b48c6 1194
646d5695
BL
1195 if (doit[D_EVP])
1196 {
1197 for (j=0; j<SIZE_NUM; j++)
1198 {
1199 EVP_CIPHER_CTX ctx;
1200 int outl;
1201
1202 names[D_EVP]=OBJ_nid2ln(evp->nid);
1203 print_message(names[D_EVP],save_count,
1204 lengths[j]);
1205 EVP_EncryptInit(&ctx,evp,key16,iv);
1206 Time_F(START,usertime);
1207 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1208 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1209 EVP_EncryptFinal(&ctx,buf,&outl);
1210 d=Time_F(STOP,usertime);
1211 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1212 count,names[D_EVP],d);
1213 results[D_EVP][j]=((double)count)/d*lengths[j];
1214 }
1215 }
1216
373b575f 1217 RAND_pseudo_bytes(buf,36);
cf1b7d96 1218#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1219 for (j=0; j<RSA_NUM; j++)
1220 {
c91e1259 1221 int ret;
d02b48c6 1222 if (!rsa_doit[j]) continue;
c91e1259 1223 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
03ea28c9
RL
1224 if (ret == 0)
1225 {
1226 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1227 ERR_print_errors(bio_err);
1228 rsa_count=1;
1229 }
1230 else
d02b48c6 1231 {
03ea28c9
RL
1232 pkey_print_message("private","rsa",
1233 rsa_c[j][0],rsa_bits[j],
1234 RSA_SECONDS);
1235/* RSA_blinding_on(rsa_key[j],NULL); */
1236 Time_F(START,usertime);
1237 for (count=0,run=1; COND(rsa_c[j][0]); count++)
d02b48c6 1238 {
03ea28c9
RL
1239 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1240 &rsa_num, rsa_key[j]);
1241 if (ret == 0)
1242 {
1243 BIO_printf(bio_err,
1244 "RSA sign failure\n");
1245 ERR_print_errors(bio_err);
1246 count=1;
1247 break;
1248 }
d02b48c6 1249 }
03ea28c9
RL
1250 d=Time_F(STOP,usertime);
1251 BIO_printf(bio_err,
1252 "%ld %d bit private RSA's in %.2fs\n",
1253 count,rsa_bits[j],d);
1254 rsa_results[j][0]=d/(double)count;
1255 rsa_count=count;
d02b48c6 1256 }
d02b48c6 1257
58964a49 1258#if 1
c91e1259 1259 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
03ea28c9 1260 if (ret <= 0)
d02b48c6 1261 {
03ea28c9
RL
1262 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1263 ERR_print_errors(bio_err);
51740b12 1264 rsa_doit[j] = 0;
03ea28c9
RL
1265 }
1266 else
1267 {
1268 pkey_print_message("public","rsa",
1269 rsa_c[j][1],rsa_bits[j],
1270 RSA_SECONDS);
1271 Time_F(START,usertime);
1272 for (count=0,run=1; COND(rsa_c[j][1]); count++)
d02b48c6 1273 {
03ea28c9
RL
1274 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1275 rsa_num, rsa_key[j]);
1276 if (ret == 0)
1277 {
1278 BIO_printf(bio_err,
1279 "RSA verify failure\n");
1280 ERR_print_errors(bio_err);
1281 count=1;
1282 break;
1283 }
d02b48c6 1284 }
03ea28c9
RL
1285 d=Time_F(STOP,usertime);
1286 BIO_printf(bio_err,
1287 "%ld %d bit public RSA's in %.2fs\n",
1288 count,rsa_bits[j],d);
1289 rsa_results[j][1]=d/(double)count;
d02b48c6 1290 }
58964a49 1291#endif
d02b48c6
RE
1292
1293 if (rsa_count <= 1)
1294 {
1295 /* if longer than 10s, don't do any more */
1296 for (j++; j<RSA_NUM; j++)
1297 rsa_doit[j]=0;
1298 }
1299 }
1300#endif
1301
373b575f 1302 RAND_pseudo_bytes(buf,20);
cf1b7d96 1303#ifndef OPENSSL_NO_DSA
99a97051
UM
1304 if (RAND_status() != 1)
1305 {
1306 RAND_seed(rnd_seed, sizeof rnd_seed);
1307 rnd_fake = 1;
1308 }
d02b48c6
RE
1309 for (j=0; j<DSA_NUM; j++)
1310 {
58964a49 1311 unsigned int kk;
03ea28c9 1312 int ret;
58964a49 1313
d02b48c6
RE
1314 if (!dsa_doit[j]) continue;
1315 DSA_generate_key(dsa_key[j]);
1316/* DSA_sign_setup(dsa_key[j],NULL); */
03ea28c9 1317 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1318 &kk,dsa_key[j]);
03ea28c9
RL
1319 if (ret == 0)
1320 {
1321 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1322 ERR_print_errors(bio_err);
1323 rsa_count=1;
1324 }
1325 else
d02b48c6 1326 {
03ea28c9
RL
1327 pkey_print_message("sign","dsa",
1328 dsa_c[j][0],dsa_bits[j],
1329 DSA_SECONDS);
1330 Time_F(START,usertime);
1331 for (count=0,run=1; COND(dsa_c[j][0]); count++)
d02b48c6 1332 {
03ea28c9
RL
1333 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1334 &kk,dsa_key[j]);
1335 if (ret == 0)
1336 {
1337 BIO_printf(bio_err,
1338 "DSA sign failure\n");
1339 ERR_print_errors(bio_err);
1340 count=1;
1341 break;
1342 }
d02b48c6 1343 }
03ea28c9
RL
1344 d=Time_F(STOP,usertime);
1345 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1346 count,dsa_bits[j],d);
1347 dsa_results[j][0]=d/(double)count;
1348 rsa_count=count;
d02b48c6 1349 }
d02b48c6 1350
03ea28c9 1351 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1352 kk,dsa_key[j]);
03ea28c9
RL
1353 if (ret <= 0)
1354 {
1355 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1356 ERR_print_errors(bio_err);
1357 dsa_doit[j] = 0;
1358 }
1359 else
d02b48c6 1360 {
03ea28c9
RL
1361 pkey_print_message("verify","dsa",
1362 dsa_c[j][1],dsa_bits[j],
1363 DSA_SECONDS);
1364 Time_F(START,usertime);
1365 for (count=0,run=1; COND(dsa_c[j][1]); count++)
d02b48c6 1366 {
03ea28c9
RL
1367 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1368 kk,dsa_key[j]);
1369 if (ret <= 0)
1370 {
1371 BIO_printf(bio_err,
1372 "DSA verify failure\n");
1373 ERR_print_errors(bio_err);
1374 count=1;
1375 break;
1376 }
d02b48c6 1377 }
03ea28c9
RL
1378 d=Time_F(STOP,usertime);
1379 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1380 count,dsa_bits[j],d);
1381 dsa_results[j][1]=d/(double)count;
d02b48c6 1382 }
d02b48c6
RE
1383
1384 if (rsa_count <= 1)
1385 {
1386 /* if longer than 10s, don't do any more */
1387 for (j++; j<DSA_NUM; j++)
1388 dsa_doit[j]=0;
1389 }
1390 }
99a97051 1391 if (rnd_fake) RAND_cleanup();
d02b48c6
RE
1392#endif
1393
1394 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1395 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1396 printf("options:");
1397 printf("%s ",BN_options());
cf1b7d96 1398#ifndef OPENSSL_NO_MD2
d02b48c6
RE
1399 printf("%s ",MD2_options());
1400#endif
cf1b7d96 1401#ifndef OPENSSL_NO_RC4
d02b48c6
RE
1402 printf("%s ",RC4_options());
1403#endif
cf1b7d96 1404#ifndef OPENSSL_NO_DES
d02b48c6
RE
1405 printf("%s ",des_options());
1406#endif
cf1b7d96 1407#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
1408 printf("%s ",idea_options());
1409#endif
cf1b7d96 1410#ifndef OPENSSL_NO_BF
d02b48c6
RE
1411 printf("%s ",BF_options());
1412#endif
58964a49 1413 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
d02b48c6
RE
1414
1415 if (pr_header)
1416 {
1417 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1418 fprintf(stdout,"type ");
1419 for (j=0; j<SIZE_NUM; j++)
1420 fprintf(stdout,"%7d bytes",lengths[j]);
1421 fprintf(stdout,"\n");
1422 }
1423
1424 for (k=0; k<ALGOR_NUM; k++)
1425 {
1426 if (!doit[k]) continue;
58964a49 1427 fprintf(stdout,"%-13s",names[k]);
d02b48c6
RE
1428 for (j=0; j<SIZE_NUM; j++)
1429 {
1430 if (results[k][j] > 10000)
1431 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1432 else
1433 fprintf(stdout," %11.2f ",results[k][j]);
1434 }
1435 fprintf(stdout,"\n");
1436 }
cf1b7d96 1437#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1438 j=1;
1439 for (k=0; k<RSA_NUM; k++)
1440 {
1441 if (!rsa_doit[k]) continue;
58964a49
RE
1442 if (j)
1443 {
1444 printf("%18ssign verify sign/s verify/s\n"," ");
1445 j=0;
1446 }
d58d092b 1447 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
58964a49
RE
1448 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1449 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
d02b48c6
RE
1450 fprintf(stdout,"\n");
1451 }
1452#endif
cf1b7d96 1453#ifndef OPENSSL_NO_DSA
d02b48c6
RE
1454 j=1;
1455 for (k=0; k<DSA_NUM; k++)
1456 {
1457 if (!dsa_doit[k]) continue;
58964a49
RE
1458 if (j) {
1459 printf("%18ssign verify sign/s verify/s\n"," ");
1460 j=0;
1461 }
d58d092b 1462 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
58964a49
RE
1463 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1464 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
d02b48c6
RE
1465 fprintf(stdout,"\n");
1466 }
1467#endif
18c77bf2 1468 mret=0;
d02b48c6 1469end:
5270e702 1470 ERR_print_errors(bio_err);
26a3a48d
RL
1471 if (buf != NULL) OPENSSL_free(buf);
1472 if (buf2 != NULL) OPENSSL_free(buf2);
cf1b7d96 1473#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1474 for (i=0; i<RSA_NUM; i++)
1475 if (rsa_key[i] != NULL)
1476 RSA_free(rsa_key[i]);
1477#endif
cf1b7d96 1478#ifndef OPENSSL_NO_DSA
d02b48c6
RE
1479 for (i=0; i<DSA_NUM; i++)
1480 if (dsa_key[i] != NULL)
1481 DSA_free(dsa_key[i]);
1482#endif
18c77bf2 1483 EXIT(mret);
d02b48c6
RE
1484 }
1485
646d5695 1486static void print_message(const char *s, long num, int length)
d02b48c6
RE
1487 {
1488#ifdef SIGALRM
1489 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
d58d092b 1490 (void)BIO_flush(bio_err);
d02b48c6
RE
1491 alarm(SECONDS);
1492#else
1493 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
d58d092b 1494 (void)BIO_flush(bio_err);
d02b48c6
RE
1495#endif
1496#ifdef LINT
1497 num=num;
1498#endif
1499 }
1500
6b691a5c
UM
1501static void pkey_print_message(char *str, char *str2, long num, int bits,
1502 int tm)
d02b48c6
RE
1503 {
1504#ifdef SIGALRM
1505 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
d58d092b 1506 (void)BIO_flush(bio_err);
d02b48c6
RE
1507 alarm(RSA_SECONDS);
1508#else
1509 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
d58d092b 1510 (void)BIO_flush(bio_err);
d02b48c6
RE
1511#endif
1512#ifdef LINT
1513 num=num;
1514#endif
1515 }
58964a49 1516