]> git.ipfire.org Git - thirdparty/openssl.git/blame - apps/speed.c
apps_startup() needs a corresponding apps_shutdown().
[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
c3bdbcf6 88#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || 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 }
531d630b
RL
508 e = setup_engine(bio_err, *argv, 0);
509 /* j will be increased again further down. We just
5270e702
RL
510 don't want speed to confuse an engine with an
511 algorithm, especially when none is given (which
512 means all of them should be run) */
513 j--;
514 }
515 else
cf1b7d96 516#ifndef OPENSSL_NO_MD2
d02b48c6
RE
517 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
518 else
519#endif
cf1b7d96 520#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
521 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
522 else
523#endif
cf1b7d96 524#ifndef OPENSSL_NO_MD4
3009458e
RL
525 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
526 else
527#endif
cf1b7d96 528#ifndef OPENSSL_NO_MD5
d02b48c6
RE
529 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
530 else
531#endif
cf1b7d96 532#ifndef OPENSSL_NO_MD5
58964a49 533 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
d02b48c6
RE
534 else
535#endif
cf1b7d96 536#ifndef OPENSSL_NO_SHA
d02b48c6
RE
537 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
538 else
58964a49
RE
539 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
540 else
541#endif
cf1b7d96 542#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
543 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
544 else
545 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
546 else
547 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
548 else
d02b48c6 549#endif
cf1b7d96 550#ifndef OPENSSL_NO_RC4
d02b48c6
RE
551 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
552 else
553#endif
cf1b7d96 554#ifndef OPENSSL_NO_DES
d02b48c6
RE
555 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
556 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
557 else
558#endif
cf1b7d96 559#ifndef OPENSSL_NO_RSA
ccb9643f 560#if 0 /* was: #ifdef RSAref */
d02b48c6
RE
561 if (strcmp(*argv,"rsaref") == 0)
562 {
5270e702 563 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
d02b48c6
RE
564 j--;
565 }
566 else
567#endif
c1cd88a0 568#ifndef RSA_NULL
e170a5c0 569 if (strcmp(*argv,"openssl") == 0)
d02b48c6 570 {
5270e702 571 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
d02b48c6
RE
572 j--;
573 }
574 else
c1cd88a0 575#endif
cf1b7d96 576#endif /* !OPENSSL_NO_RSA */
d02b48c6
RE
577 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
578 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
579 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
580 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
581 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
582 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
583 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
584 else
cf1b7d96 585#ifndef OPENSSL_NO_RC2
d02b48c6
RE
586 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
587 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
588 else
589#endif
cf1b7d96 590#ifndef OPENSSL_NO_RC5
58964a49
RE
591 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
592 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
593 else
594#endif
cf1b7d96 595#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
596 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
597 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
598 else
599#endif
cf1b7d96 600#ifndef OPENSSL_NO_BF
d02b48c6
RE
601 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
602 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
58964a49
RE
603 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
604 else
605#endif
cf1b7d96 606#ifndef OPENSSL_NO_CAST
58964a49
RE
607 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
608 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
609 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
d02b48c6
RE
610 else
611#endif
cf1b7d96 612#ifndef OPENSSL_NO_DES
d02b48c6
RE
613 if (strcmp(*argv,"des") == 0)
614 {
615 doit[D_CBC_DES]=1;
616 doit[D_EDE3_DES]=1;
617 }
618 else
619#endif
cf1b7d96 620#ifndef OPENSSL_NO_RSA
d02b48c6
RE
621 if (strcmp(*argv,"rsa") == 0)
622 {
623 rsa_doit[R_RSA_512]=1;
624 rsa_doit[R_RSA_1024]=1;
625 rsa_doit[R_RSA_2048]=1;
626 rsa_doit[R_RSA_4096]=1;
627 }
628 else
629#endif
cf1b7d96 630#ifndef OPENSSL_NO_DSA
d02b48c6
RE
631 if (strcmp(*argv,"dsa") == 0)
632 {
633 dsa_doit[R_DSA_512]=1;
634 dsa_doit[R_DSA_1024]=1;
635 }
636 else
637#endif
638 {
3009458e
RL
639 BIO_printf(bio_err,"Error: bad option or value\n");
640 BIO_printf(bio_err,"\n");
641 BIO_printf(bio_err,"Available values:\n");
cf1b7d96 642#ifndef OPENSSL_NO_MD2
3009458e
RL
643 BIO_printf(bio_err,"md2 ");
644#endif
cf1b7d96 645#ifndef OPENSSL_NO_MDC2
3009458e
RL
646 BIO_printf(bio_err,"mdc2 ");
647#endif
cf1b7d96 648#ifndef OPENSSL_NO_MD4
3009458e
RL
649 BIO_printf(bio_err,"md4 ");
650#endif
cf1b7d96 651#ifndef OPENSSL_NO_MD5
3009458e 652 BIO_printf(bio_err,"md5 ");
cf1b7d96 653#ifndef OPENSSL_NO_HMAC
3009458e
RL
654 BIO_printf(bio_err,"hmac ");
655#endif
656#endif
cf1b7d96 657#ifndef OPENSSL_NO_SHA1
3009458e
RL
658 BIO_printf(bio_err,"sha1 ");
659#endif
cf1b7d96 660#ifndef OPENSSL_NO_RIPEMD160
3009458e
RL
661 BIO_printf(bio_err,"rmd160");
662#endif
cf1b7d96
RL
663#if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
664 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
665 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
3009458e
RL
666 BIO_printf(bio_err,"\n");
667#endif
668
cf1b7d96 669#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
670 BIO_printf(bio_err,"idea-cbc ");
671#endif
cf1b7d96 672#ifndef OPENSSL_NO_RC2
d02b48c6
RE
673 BIO_printf(bio_err,"rc2-cbc ");
674#endif
cf1b7d96 675#ifndef OPENSSL_NO_RC5
58964a49
RE
676 BIO_printf(bio_err,"rc5-cbc ");
677#endif
cf1b7d96 678#ifndef OPENSSL_NO_BF
d02b48c6
RE
679 BIO_printf(bio_err,"bf-cbc");
680#endif
cf1b7d96
RL
681#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
682 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
d02b48c6
RE
683 BIO_printf(bio_err,"\n");
684#endif
3009458e 685
d02b48c6 686 BIO_printf(bio_err,"des-cbc des-ede3 ");
cf1b7d96 687#ifndef OPENSSL_NO_RC4
d02b48c6
RE
688 BIO_printf(bio_err,"rc4");
689#endif
3009458e
RL
690 BIO_printf(bio_err,"\n");
691
cf1b7d96 692#ifndef OPENSSL_NO_RSA
3009458e 693 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
d02b48c6 694#endif
3009458e 695
cf1b7d96 696#ifndef OPENSSL_NO_DSA
3009458e
RL
697 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
698#endif
699
cf1b7d96 700#ifndef OPENSSL_NO_IDEA
3009458e
RL
701 BIO_printf(bio_err,"idea ");
702#endif
cf1b7d96 703#ifndef OPENSSL_NO_RC2
3009458e
RL
704 BIO_printf(bio_err,"rc2 ");
705#endif
cf1b7d96 706#ifndef OPENSSL_NO_DES
3009458e 707 BIO_printf(bio_err,"des ");
d02b48c6 708#endif
cf1b7d96 709#ifndef OPENSSL_NO_RSA
3009458e
RL
710 BIO_printf(bio_err,"rsa ");
711#endif
cf1b7d96 712#ifndef OPENSSL_NO_BF
3009458e
RL
713 BIO_printf(bio_err,"blowfish");
714#endif
cf1b7d96
RL
715#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
716 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
717 !defined(OPENSSL_NO_BF)
4e74239c 718 BIO_printf(bio_err,"\n");
3009458e
RL
719#endif
720
4e74239c 721 BIO_printf(bio_err,"\n");
3009458e 722 BIO_printf(bio_err,"Available options:\n");
5270e702 723#ifdef TIMES
4e74239c 724 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
3132e196 725#endif
5270e702 726 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
d02b48c6
RE
727 goto end;
728 }
729 argc--;
730 argv++;
731 j++;
732 }
733
734 if (j == 0)
735 {
736 for (i=0; i<ALGOR_NUM; i++)
53d28679
BM
737 {
738 if (i != D_EVP)
739 doit[i]=1;
740 }
d02b48c6
RE
741 for (i=0; i<RSA_NUM; i++)
742 rsa_doit[i]=1;
743 for (i=0; i<DSA_NUM; i++)
744 dsa_doit[i]=1;
745 }
746 for (i=0; i<ALGOR_NUM; i++)
747 if (doit[i]) pr_header++;
748
4e74239c
RL
749 if (usertime == 0)
750 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
751 if (usertime <= 0)
752 {
753 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
754 BIO_printf(bio_err,"program when this computer is idle.\n");
755 }
d02b48c6 756
cf1b7d96 757#ifndef OPENSSL_NO_RSA
d02b48c6
RE
758 for (i=0; i<RSA_NUM; i++)
759 {
5e4ca422 760 const unsigned char *p;
d02b48c6
RE
761
762 p=rsa_data[i];
763 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
764 if (rsa_key[i] == NULL)
765 {
766 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
767 goto end;
768 }
58964a49
RE
769#if 0
770 else
771 {
772 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
773 BN_print(bio_err,rsa_key[i]->e);
774 BIO_printf(bio_err,"\n");
775 }
776#endif
d02b48c6
RE
777 }
778#endif
779
cf1b7d96 780#ifndef OPENSSL_NO_DSA
d02b48c6
RE
781 dsa_key[0]=get_dsa512();
782 dsa_key[1]=get_dsa1024();
783 dsa_key[2]=get_dsa2048();
784#endif
785
cf1b7d96 786#ifndef OPENSSL_NO_DES
cddfe788
BM
787 des_set_key_unchecked(&key,sch);
788 des_set_key_unchecked(&key2,sch2);
789 des_set_key_unchecked(&key3,sch3);
d02b48c6 790#endif
cf1b7d96 791#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
792 idea_set_encrypt_key(key16,&idea_ks);
793#endif
cf1b7d96 794#ifndef OPENSSL_NO_RC4
d02b48c6
RE
795 RC4_set_key(&rc4_ks,16,key16);
796#endif
cf1b7d96 797#ifndef OPENSSL_NO_RC2
d02b48c6
RE
798 RC2_set_key(&rc2_ks,16,key16,128);
799#endif
cf1b7d96 800#ifndef OPENSSL_NO_RC5
58964a49
RE
801 RC5_32_set_key(&rc5_ks,16,key16,12);
802#endif
cf1b7d96 803#ifndef OPENSSL_NO_BF
d02b48c6
RE
804 BF_set_key(&bf_ks,16,key16);
805#endif
cf1b7d96 806#ifndef OPENSSL_NO_CAST
58964a49
RE
807 CAST_set_key(&cast_ks,16,key16);
808#endif
cf1b7d96 809#ifndef OPENSSL_NO_RSA
d02b48c6 810 memset(rsa_c,0,sizeof(rsa_c));
f5d7a031 811#endif
d02b48c6 812#ifndef SIGALRM
cf1b7d96 813#ifndef OPENSSL_NO_DES
d02b48c6
RE
814 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
815 count=10;
816 do {
817 long i;
818 count*=2;
4e74239c 819 Time_F(START,usertime);
d02b48c6 820 for (i=count; i; i--)
12ba413c
BM
821 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
822 &(sch[0]),DES_ENCRYPT);
4e74239c 823 d=Time_F(STOP,usertime);
d02b48c6 824 } while (d <3);
646d5695 825 save_count=count;
d02b48c6
RE
826 c[D_MD2][0]=count/10;
827 c[D_MDC2][0]=count/10;
3009458e 828 c[D_MD4][0]=count;
d02b48c6 829 c[D_MD5][0]=count;
58964a49 830 c[D_HMAC][0]=count;
d02b48c6 831 c[D_SHA1][0]=count;
58964a49 832 c[D_RMD160][0]=count;
d02b48c6
RE
833 c[D_RC4][0]=count*5;
834 c[D_CBC_DES][0]=count;
835 c[D_EDE3_DES][0]=count/3;
836 c[D_CBC_IDEA][0]=count;
837 c[D_CBC_RC2][0]=count;
58964a49 838 c[D_CBC_RC5][0]=count;
d02b48c6 839 c[D_CBC_BF][0]=count;
58964a49 840 c[D_CBC_CAST][0]=count;
d02b48c6
RE
841
842 for (i=1; i<SIZE_NUM; i++)
843 {
844 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
845 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
3009458e 846 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
d02b48c6 847 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
58964a49 848 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
d02b48c6 849 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
58964a49 850 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
d02b48c6
RE
851 }
852 for (i=1; i<SIZE_NUM; i++)
853 {
854 long l0,l1;
855
856 l0=(long)lengths[i-1];
857 l1=(long)lengths[i];
858 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
859 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
860 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
861 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
862 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
58964a49 863 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
d02b48c6 864 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
58964a49 865 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
d02b48c6 866 }
cf1b7d96 867#ifndef OPENSSL_NO_RSA
d02b48c6
RE
868 rsa_c[R_RSA_512][0]=count/2000;
869 rsa_c[R_RSA_512][1]=count/400;
870 for (i=1; i<RSA_NUM; i++)
871 {
872 rsa_c[i][0]=rsa_c[i-1][0]/8;
873 rsa_c[i][1]=rsa_c[i-1][1]/4;
874 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
875 rsa_doit[i]=0;
876 else
877 {
dfeab068 878 if (rsa_c[i][0] == 0)
d02b48c6
RE
879 {
880 rsa_c[i][0]=1;
881 rsa_c[i][1]=20;
882 }
883 }
884 }
f5d7a031 885#endif
d02b48c6 886
f89aebb1 887#ifndef OPENSSL_NO_DSA
d02b48c6
RE
888 dsa_c[R_DSA_512][0]=count/1000;
889 dsa_c[R_DSA_512][1]=count/1000/2;
890 for (i=1; i<DSA_NUM; i++)
891 {
892 dsa_c[i][0]=dsa_c[i-1][0]/4;
893 dsa_c[i][1]=dsa_c[i-1][1]/4;
894 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
895 dsa_doit[i]=0;
896 else
897 {
898 if (dsa_c[i] == 0)
899 {
900 dsa_c[i][0]=1;
901 dsa_c[i][1]=1;
902 }
903 }
904 }
f89aebb1 905#endif
d02b48c6 906
58964a49 907#define COND(d) (count < (d))
d02b48c6
RE
908#define COUNT(d) (d)
909#else
63da21c0
BM
910/* not worth fixing */
911# error "You cannot disable DES on systems without SIGALRM."
cf1b7d96 912#endif /* OPENSSL_NO_DES */
63da21c0 913#else
d02b48c6
RE
914#define COND(c) (run)
915#define COUNT(d) (count)
916 signal(SIGALRM,sig_done);
63da21c0 917#endif /* SIGALRM */
d02b48c6 918
cf1b7d96 919#ifndef OPENSSL_NO_MD2
d02b48c6
RE
920 if (doit[D_MD2])
921 {
922 for (j=0; j<SIZE_NUM; j++)
923 {
924 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
4e74239c 925 Time_F(START,usertime);
d02b48c6 926 for (count=0,run=1; COND(c[D_MD2][j]); count++)
323f289c 927 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2());
4e74239c 928 d=Time_F(STOP,usertime);
d02b48c6
RE
929 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
930 count,names[D_MD2],d);
931 results[D_MD2][j]=((double)count)/d*lengths[j];
932 }
933 }
934#endif
cf1b7d96 935#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
936 if (doit[D_MDC2])
937 {
938 for (j=0; j<SIZE_NUM; j++)
939 {
940 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
4e74239c 941 Time_F(START,usertime);
d02b48c6 942 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
323f289c 943 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2());
4e74239c 944 d=Time_F(STOP,usertime);
d02b48c6
RE
945 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
946 count,names[D_MDC2],d);
947 results[D_MDC2][j]=((double)count)/d*lengths[j];
948 }
949 }
950#endif
951
cf1b7d96 952#ifndef OPENSSL_NO_MD4
3009458e
RL
953 if (doit[D_MD4])
954 {
955 for (j=0; j<SIZE_NUM; j++)
956 {
957 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
958 Time_F(START,usertime);
959 for (count=0,run=1; COND(c[D_MD4][j]); count++)
323f289c 960 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4());
3009458e
RL
961 d=Time_F(STOP,usertime);
962 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
963 count,names[D_MD4],d);
964 results[D_MD4][j]=((double)count)/d*lengths[j];
965 }
966 }
967#endif
968
cf1b7d96 969#ifndef OPENSSL_NO_MD5
d02b48c6
RE
970 if (doit[D_MD5])
971 {
972 for (j=0; j<SIZE_NUM; j++)
973 {
974 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
4e74239c 975 Time_F(START,usertime);
d02b48c6 976 for (count=0,run=1; COND(c[D_MD5][j]); count++)
323f289c 977 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_md5());
4e74239c 978 d=Time_F(STOP,usertime);
d02b48c6
RE
979 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
980 count,names[D_MD5],d);
981 results[D_MD5][j]=((double)count)/d*lengths[j];
982 }
983 }
984#endif
985
cf1b7d96 986#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
58964a49 987 if (doit[D_HMAC])
d02b48c6 988 {
58964a49
RE
989 HMAC_CTX hctx;
990 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
991 16,EVP_md5());
992
d02b48c6
RE
993 for (j=0; j<SIZE_NUM; j++)
994 {
58964a49 995 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
4e74239c 996 Time_F(START,usertime);
58964a49
RE
997 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
998 {
999 HMAC_Init(&hctx,NULL,0,NULL);
1000 HMAC_Update(&hctx,buf,lengths[j]);
1001 HMAC_Final(&hctx,&(hmac[0]),NULL);
1002 }
4e74239c 1003 d=Time_F(STOP,usertime);
d02b48c6 1004 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
58964a49
RE
1005 count,names[D_HMAC],d);
1006 results[D_HMAC][j]=((double)count)/d*lengths[j];
d02b48c6 1007 }
323f289c 1008 HMAC_cleanup(&hctx);
d02b48c6
RE
1009 }
1010#endif
cf1b7d96 1011#ifndef OPENSSL_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 1018 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
323f289c 1019 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1());
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
cf1b7d96 1027#ifndef OPENSSL_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 1034 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
323f289c 1035 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160());
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
cf1b7d96 1043#ifndef OPENSSL_NO_RC4
d02b48c6
RE
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
cf1b7d96 1060#ifndef OPENSSL_NO_DES
d02b48c6
RE
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
cf1b7d96 1094#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
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
cf1b7d96 1112#ifndef OPENSSL_NO_RC2
d02b48c6
RE
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
cf1b7d96 1130#ifndef OPENSSL_NO_RC5
58964a49
RE
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
cf1b7d96 1148#ifndef OPENSSL_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
cf1b7d96 1166#ifndef OPENSSL_NO_CAST
58964a49
RE
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);
cf1b7d96 1208#ifndef OPENSSL_NO_RSA
d02b48c6
RE
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);
51740b12 1254 rsa_doit[j] = 0;
03ea28c9
RL
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);
cf1b7d96 1293#ifndef OPENSSL_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());
cf1b7d96 1388#ifndef OPENSSL_NO_MD2
d02b48c6
RE
1389 printf("%s ",MD2_options());
1390#endif
cf1b7d96 1391#ifndef OPENSSL_NO_RC4
d02b48c6
RE
1392 printf("%s ",RC4_options());
1393#endif
cf1b7d96 1394#ifndef OPENSSL_NO_DES
d02b48c6
RE
1395 printf("%s ",des_options());
1396#endif
cf1b7d96 1397#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
1398 printf("%s ",idea_options());
1399#endif
cf1b7d96 1400#ifndef OPENSSL_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 }
cf1b7d96 1427#ifndef OPENSSL_NO_RSA
d02b48c6
RE
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
cf1b7d96 1443#ifndef OPENSSL_NO_DSA
d02b48c6
RE
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);
cf1b7d96 1463#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1464 for (i=0; i<RSA_NUM; i++)
1465 if (rsa_key[i] != NULL)
1466 RSA_free(rsa_key[i]);
1467#endif
cf1b7d96 1468#ifndef OPENSSL_NO_DSA
d02b48c6
RE
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