]> git.ipfire.org Git - thirdparty/openssl.git/blame - apps/speed.c
Apparently, Linux is identified with __linux__ as well.
[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>
646d5695
BL
84#include <openssl/evp.h>
85#include <openssl/objects.h>
d02b48c6 86
c3bdbcf6 87#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
2bfb4dbc 88# define USE_TOD
bc36ee62 89#elif !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
2bfb4dbc 90# define TIMES
d02b48c6 91#endif
cf1b7d96 92#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) /* FIXME */
3132e196
RL
93# define TIMEB
94#endif
d02b48c6 95
d02b48c6 96#ifndef _IRIX
2bfb4dbc 97# include <time.h>
d02b48c6
RE
98#endif
99#ifdef TIMES
2bfb4dbc
BL
100# include <sys/types.h>
101# include <sys/times.h>
102#endif
103#ifdef USE_TOD
104# include <sys/time.h>
105# include <sys/resource.h>
d02b48c6 106#endif
7d7d2cbc
UM
107
108/* Depending on the VMS version, the tms structure is perhaps defined.
109 The __TMS macro will show if it was. If it wasn't defined, we should
110 undefine TIMES, since that tells the rest of the program how things
111 should be handled. -- Richard Levitte */
bc36ee62 112#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
7d7d2cbc 113#undef TIMES
d02b48c6 114#endif
7d7d2cbc 115
3132e196 116#ifdef TIMEB
d02b48c6 117#include <sys/timeb.h>
3132e196
RL
118#endif
119
1cbb729f 120#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
3132e196
RL
121#error "It seems neither struct tms nor struct timeb is supported in this platform!"
122#endif
d02b48c6 123
dfeab068
RE
124#if defined(sun) || defined(__ultrix)
125#define _POSIX_SOURCE
d02b48c6
RE
126#include <limits.h>
127#include <sys/param.h>
128#endif
129
cf1b7d96 130#ifndef OPENSSL_NO_DES
ec577822 131#include <openssl/des.h>
d02b48c6 132#endif
cf1b7d96 133#ifndef OPENSSL_NO_MD2
ec577822 134#include <openssl/md2.h>
d02b48c6 135#endif
cf1b7d96 136#ifndef OPENSSL_NO_MDC2
ec577822 137#include <openssl/mdc2.h>
d02b48c6 138#endif
cf1b7d96 139#ifndef OPENSSL_NO_MD4
3009458e
RL
140#include <openssl/md4.h>
141#endif
cf1b7d96 142#ifndef OPENSSL_NO_MD5
ec577822 143#include <openssl/md5.h>
5271ebd9 144#endif
cf1b7d96 145#ifndef OPENSSL_NO_HMAC
ec577822 146#include <openssl/hmac.h>
d02b48c6 147#endif
5271ebd9 148#include <openssl/evp.h>
cf1b7d96 149#ifndef OPENSSL_NO_SHA
ec577822 150#include <openssl/sha.h>
d02b48c6 151#endif
cf1b7d96 152#ifndef OPENSSL_NO_RIPEMD
ec577822 153#include <openssl/ripemd.h>
58964a49 154#endif
cf1b7d96 155#ifndef OPENSSL_NO_RC4
ec577822 156#include <openssl/rc4.h>
d02b48c6 157#endif
cf1b7d96 158#ifndef OPENSSL_NO_RC5
ec577822 159#include <openssl/rc5.h>
58964a49 160#endif
cf1b7d96 161#ifndef OPENSSL_NO_RC2
ec577822 162#include <openssl/rc2.h>
d02b48c6 163#endif
cf1b7d96 164#ifndef OPENSSL_NO_IDEA
ec577822 165#include <openssl/idea.h>
d02b48c6 166#endif
cf1b7d96 167#ifndef OPENSSL_NO_BF
ec577822 168#include <openssl/blowfish.h>
d02b48c6 169#endif
cf1b7d96 170#ifndef OPENSSL_NO_CAST
ec577822 171#include <openssl/cast.h>
58964a49 172#endif
cf1b7d96 173#ifndef OPENSSL_NO_RSA
ec577822 174#include <openssl/rsa.h>
f5d7a031 175#include "./testrsa.h"
d02b48c6 176#endif
ec577822 177#include <openssl/x509.h>
cf1b7d96 178#ifndef OPENSSL_NO_DSA
d02b48c6
RE
179#include "./testdsa.h"
180#endif
181
182/* The following if from times(3) man page. It may need to be changed */
183#ifndef HZ
184# ifndef CLK_TCK
185# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
5c83b4c9 186# define HZ 100.0
d02b48c6
RE
187# else /* _BSD_CLK_TCK_ */
188# define HZ ((double)_BSD_CLK_TCK_)
189# endif
190# else /* CLK_TCK */
191# define HZ ((double)CLK_TCK)
192# endif
193#endif
194
195#undef BUFSIZE
58964a49 196#define BUFSIZE ((long)1024*8+1)
d02b48c6
RE
197int run=0;
198
4e74239c 199static double Time_F(int s, int usertime);
646d5695 200static void print_message(const char *s,long num,int length);
d02b48c6 201static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
d02b48c6
RE
202#ifdef SIGALRM
203#if defined(__STDC__) || defined(sgi) || defined(_AIX)
204#define SIGRETTYPE void
205#else
206#define SIGRETTYPE int
207#endif
208
d02b48c6 209static SIGRETTYPE sig_done(int sig);
6b691a5c 210static SIGRETTYPE sig_done(int sig)
d02b48c6
RE
211 {
212 signal(SIGALRM,sig_done);
213 run=0;
214#ifdef LINT
215 sig=sig;
216#endif
217 }
218#endif
219
220#define START 0
221#define STOP 1
222
4e74239c 223static double Time_F(int s, int usertime)
d02b48c6
RE
224 {
225 double ret;
2bfb4dbc
BL
226
227#ifdef USE_TOD
228 if(usertime)
229 {
230 static struct rusage tstart,tend;
231
232 if (s == START)
233 {
234 getrusage(RUSAGE_SELF,&tstart);
235 return(0);
236 }
237 else
238 {
239 long i;
240
241 getrusage(RUSAGE_SELF,&tend);
242 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
243 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
244 +((double)i)/1000000.0;
245 return((ret < 0.001)?0.001:ret);
246 }
247 }
248 else
249 {
250 static struct timeval tstart,tend;
251 long i;
252
253 if (s == START)
254 {
255 gettimeofday(&tstart,NULL);
256 return(0);
257 }
258 else
259 {
260 gettimeofday(&tend,NULL);
261 i=(long)tend.tv_usec-(long)tstart.tv_usec;
262 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
263 return((ret < 0.001)?0.001:ret);
264 }
265 }
266#else /* ndef USE_TOD */
267
268# ifdef TIMES
4e74239c 269 if (usertime)
d02b48c6 270 {
4e74239c 271 static struct tms tstart,tend;
d02b48c6 272
4e74239c
RL
273 if (s == START)
274 {
275 times(&tstart);
276 return(0);
277 }
278 else
279 {
280 times(&tend);
281 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
282 return((ret < 1e-3)?1e-3:ret);
283 }
d02b48c6 284 }
2bfb4dbc 285# endif /* times() */
3132e196
RL
286# if defined(TIMES) && defined(TIMEB)
287 else
288# endif
289# ifdef TIMEB
d02b48c6 290 {
4e74239c
RL
291 static struct timeb tstart,tend;
292 long i;
293
294 if (s == START)
295 {
296 ftime(&tstart);
297 return(0);
298 }
299 else
300 {
301 ftime(&tend);
302 i=(long)tend.millitm-(long)tstart.millitm;
303 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
304 return((ret < 0.001)?0.001:ret);
305 }
d02b48c6 306 }
3132e196 307# endif
2bfb4dbc 308#endif
d02b48c6
RE
309 }
310
667ac4ec
RE
311int MAIN(int, char **);
312
6b691a5c 313int MAIN(int argc, char **argv)
d02b48c6 314 {
5270e702 315 ENGINE *e;
d02b48c6 316 unsigned char *buf=NULL,*buf2=NULL;
18c77bf2 317 int mret=1;
646d5695 318#define ALGOR_NUM 16
d02b48c6
RE
319#define SIZE_NUM 5
320#define RSA_NUM 4
321#define DSA_NUM 3
646d5695 322 long count,rsa_count,save_count=0;
18c77bf2 323 int i,j,k;
cf1b7d96 324#ifndef OPENSSL_NO_RSA
5614bb91 325 unsigned rsa_num;
b2293b1e 326#endif
cf1b7d96 327#ifndef OPENSSL_NO_MD2
d02b48c6
RE
328 unsigned char md2[MD2_DIGEST_LENGTH];
329#endif
cf1b7d96 330#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
331 unsigned char mdc2[MDC2_DIGEST_LENGTH];
332#endif
cf1b7d96 333#ifndef OPENSSL_NO_MD4
3009458e
RL
334 unsigned char md4[MD4_DIGEST_LENGTH];
335#endif
cf1b7d96 336#ifndef OPENSSL_NO_MD5
d02b48c6 337 unsigned char md5[MD5_DIGEST_LENGTH];
58964a49 338 unsigned char hmac[MD5_DIGEST_LENGTH];
d02b48c6 339#endif
cf1b7d96 340#ifndef OPENSSL_NO_SHA
d02b48c6
RE
341 unsigned char sha[SHA_DIGEST_LENGTH];
342#endif
cf1b7d96 343#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
344 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
345#endif
cf1b7d96 346#ifndef OPENSSL_NO_RC4
d02b48c6
RE
347 RC4_KEY rc4_ks;
348#endif
cf1b7d96 349#ifndef OPENSSL_NO_RC5
58964a49
RE
350 RC5_32_KEY rc5_ks;
351#endif
cf1b7d96 352#ifndef OPENSSL_NO_RC2
d02b48c6
RE
353 RC2_KEY rc2_ks;
354#endif
cf1b7d96 355#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
356 IDEA_KEY_SCHEDULE idea_ks;
357#endif
cf1b7d96 358#ifndef OPENSSL_NO_BF
d02b48c6 359 BF_KEY bf_ks;
58964a49 360#endif
cf1b7d96 361#ifndef OPENSSL_NO_CAST
58964a49 362 CAST_KEY cast_ks;
d02b48c6
RE
363#endif
364 static unsigned char key16[16]=
365 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
366 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
367 unsigned char iv[8];
cf1b7d96 368#ifndef OPENSSL_NO_DES
5676d8cb 369 des_cblock *buf_as_des_cblock = NULL;
d02b48c6
RE
370 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
371 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
372 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
373 des_key_schedule sch,sch2,sch3;
374#endif
375#define D_MD2 0
376#define D_MDC2 1
3009458e
RL
377#define D_MD4 2
378#define D_MD5 3
379#define D_HMAC 4
380#define D_SHA1 5
381#define D_RMD160 6
382#define D_RC4 7
383#define D_CBC_DES 8
384#define D_EDE3_DES 9
385#define D_CBC_IDEA 10
386#define D_CBC_RC2 11
387#define D_CBC_RC5 12
388#define D_CBC_BF 13
389#define D_CBC_CAST 14
646d5695 390#define D_EVP 15
d02b48c6
RE
391 double d,results[ALGOR_NUM][SIZE_NUM];
392 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
393 long c[ALGOR_NUM][SIZE_NUM];
646d5695 394 static const char *names[ALGOR_NUM]={
3009458e 395 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
d02b48c6 396 "des cbc","des ede3","idea cbc",
58964a49 397 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
d02b48c6
RE
398#define R_DSA_512 0
399#define R_DSA_1024 1
400#define R_DSA_2048 2
401#define R_RSA_512 0
402#define R_RSA_1024 1
403#define R_RSA_2048 2
404#define R_RSA_4096 3
cf1b7d96 405#ifndef OPENSSL_NO_RSA
d02b48c6 406 RSA *rsa_key[RSA_NUM];
d02b48c6 407 long rsa_c[RSA_NUM][2];
d02b48c6 408 double rsa_results[RSA_NUM][2];
d02b48c6 409 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
d02b48c6
RE
410 static unsigned char *rsa_data[RSA_NUM]=
411 {test512,test1024,test2048,test4096};
412 static int rsa_data_length[RSA_NUM]={
413 sizeof(test512),sizeof(test1024),
414 sizeof(test2048),sizeof(test4096)};
58964a49 415#endif
cf1b7d96 416#ifndef OPENSSL_NO_DSA
58964a49
RE
417 DSA *dsa_key[DSA_NUM];
418 long dsa_c[DSA_NUM][2];
419 double dsa_results[DSA_NUM][2];
420 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
421#endif
d02b48c6
RE
422 int rsa_doit[RSA_NUM];
423 int dsa_doit[DSA_NUM];
58964a49 424 int doit[ALGOR_NUM];
d02b48c6 425 int pr_header=0;
4e74239c 426 int usertime=1;
646d5695 427 const EVP_CIPHER *evp=NULL;
3f37e73b 428 int decrypt=0;
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 }
3f37e73b 498 else if(argc > 0 && !strcmp(*argv,"-decrypt"))
3f37e73b 499 decrypt=1;
5270e702
RL
500 else
501 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
502 {
503 argc--;
504 argv++;
505 if(argc == 0)
506 {
507 BIO_printf(bio_err,"no engine given\n");
508 goto end;
509 }
531d630b
RL
510 e = setup_engine(bio_err, *argv, 0);
511 /* j will be increased again further down. We just
5270e702
RL
512 don't want speed to confuse an engine with an
513 algorithm, especially when none is given (which
514 means all of them should be run) */
515 j--;
516 }
517 else
cf1b7d96 518#ifndef OPENSSL_NO_MD2
d02b48c6
RE
519 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
520 else
521#endif
cf1b7d96 522#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
523 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
524 else
525#endif
cf1b7d96 526#ifndef OPENSSL_NO_MD4
3009458e
RL
527 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
528 else
529#endif
cf1b7d96 530#ifndef OPENSSL_NO_MD5
d02b48c6
RE
531 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
532 else
533#endif
cf1b7d96 534#ifndef OPENSSL_NO_MD5
58964a49 535 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
d02b48c6
RE
536 else
537#endif
cf1b7d96 538#ifndef OPENSSL_NO_SHA
d02b48c6
RE
539 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
540 else
58964a49
RE
541 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
542 else
543#endif
cf1b7d96 544#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
545 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
546 else
547 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
548 else
549 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
550 else
d02b48c6 551#endif
cf1b7d96 552#ifndef OPENSSL_NO_RC4
d02b48c6
RE
553 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
554 else
555#endif
cf1b7d96 556#ifndef OPENSSL_NO_DES
d02b48c6
RE
557 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
558 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
559 else
560#endif
cf1b7d96 561#ifndef OPENSSL_NO_RSA
ccb9643f 562#if 0 /* was: #ifdef RSAref */
d02b48c6
RE
563 if (strcmp(*argv,"rsaref") == 0)
564 {
5270e702 565 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
d02b48c6
RE
566 j--;
567 }
568 else
569#endif
c1cd88a0 570#ifndef RSA_NULL
e170a5c0 571 if (strcmp(*argv,"openssl") == 0)
d02b48c6 572 {
6dc5d570 573 RSA_set_default_method(RSA_PKCS1_SSLeay());
d02b48c6
RE
574 j--;
575 }
576 else
c1cd88a0 577#endif
cf1b7d96 578#endif /* !OPENSSL_NO_RSA */
d02b48c6
RE
579 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
580 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
581 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
582 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
583 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
584 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
585 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
586 else
cf1b7d96 587#ifndef OPENSSL_NO_RC2
d02b48c6
RE
588 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
589 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
590 else
591#endif
cf1b7d96 592#ifndef OPENSSL_NO_RC5
58964a49
RE
593 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
594 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
595 else
596#endif
cf1b7d96 597#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
598 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
599 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
600 else
601#endif
cf1b7d96 602#ifndef OPENSSL_NO_BF
d02b48c6
RE
603 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
604 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
58964a49
RE
605 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
606 else
607#endif
cf1b7d96 608#ifndef OPENSSL_NO_CAST
58964a49
RE
609 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
610 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
611 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
d02b48c6
RE
612 else
613#endif
cf1b7d96 614#ifndef OPENSSL_NO_DES
d02b48c6
RE
615 if (strcmp(*argv,"des") == 0)
616 {
617 doit[D_CBC_DES]=1;
618 doit[D_EDE3_DES]=1;
619 }
620 else
621#endif
cf1b7d96 622#ifndef OPENSSL_NO_RSA
d02b48c6
RE
623 if (strcmp(*argv,"rsa") == 0)
624 {
625 rsa_doit[R_RSA_512]=1;
626 rsa_doit[R_RSA_1024]=1;
627 rsa_doit[R_RSA_2048]=1;
628 rsa_doit[R_RSA_4096]=1;
629 }
630 else
631#endif
cf1b7d96 632#ifndef OPENSSL_NO_DSA
d02b48c6
RE
633 if (strcmp(*argv,"dsa") == 0)
634 {
635 dsa_doit[R_DSA_512]=1;
636 dsa_doit[R_DSA_1024]=1;
637 }
638 else
639#endif
640 {
3009458e
RL
641 BIO_printf(bio_err,"Error: bad option or value\n");
642 BIO_printf(bio_err,"\n");
643 BIO_printf(bio_err,"Available values:\n");
cf1b7d96 644#ifndef OPENSSL_NO_MD2
3009458e
RL
645 BIO_printf(bio_err,"md2 ");
646#endif
cf1b7d96 647#ifndef OPENSSL_NO_MDC2
3009458e
RL
648 BIO_printf(bio_err,"mdc2 ");
649#endif
cf1b7d96 650#ifndef OPENSSL_NO_MD4
3009458e
RL
651 BIO_printf(bio_err,"md4 ");
652#endif
cf1b7d96 653#ifndef OPENSSL_NO_MD5
3009458e 654 BIO_printf(bio_err,"md5 ");
cf1b7d96 655#ifndef OPENSSL_NO_HMAC
3009458e
RL
656 BIO_printf(bio_err,"hmac ");
657#endif
658#endif
cf1b7d96 659#ifndef OPENSSL_NO_SHA1
3009458e
RL
660 BIO_printf(bio_err,"sha1 ");
661#endif
cf1b7d96 662#ifndef OPENSSL_NO_RIPEMD160
3009458e
RL
663 BIO_printf(bio_err,"rmd160");
664#endif
cf1b7d96
RL
665#if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
666 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
667 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
3009458e
RL
668 BIO_printf(bio_err,"\n");
669#endif
670
cf1b7d96 671#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
672 BIO_printf(bio_err,"idea-cbc ");
673#endif
cf1b7d96 674#ifndef OPENSSL_NO_RC2
d02b48c6
RE
675 BIO_printf(bio_err,"rc2-cbc ");
676#endif
cf1b7d96 677#ifndef OPENSSL_NO_RC5
58964a49
RE
678 BIO_printf(bio_err,"rc5-cbc ");
679#endif
cf1b7d96 680#ifndef OPENSSL_NO_BF
d02b48c6
RE
681 BIO_printf(bio_err,"bf-cbc");
682#endif
cf1b7d96
RL
683#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
684 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
d02b48c6
RE
685 BIO_printf(bio_err,"\n");
686#endif
3009458e 687
d02b48c6 688 BIO_printf(bio_err,"des-cbc des-ede3 ");
cf1b7d96 689#ifndef OPENSSL_NO_RC4
d02b48c6
RE
690 BIO_printf(bio_err,"rc4");
691#endif
3009458e
RL
692 BIO_printf(bio_err,"\n");
693
cf1b7d96 694#ifndef OPENSSL_NO_RSA
3009458e 695 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
d02b48c6 696#endif
3009458e 697
cf1b7d96 698#ifndef OPENSSL_NO_DSA
3009458e
RL
699 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
700#endif
701
cf1b7d96 702#ifndef OPENSSL_NO_IDEA
3009458e
RL
703 BIO_printf(bio_err,"idea ");
704#endif
cf1b7d96 705#ifndef OPENSSL_NO_RC2
3009458e
RL
706 BIO_printf(bio_err,"rc2 ");
707#endif
cf1b7d96 708#ifndef OPENSSL_NO_DES
3009458e 709 BIO_printf(bio_err,"des ");
d02b48c6 710#endif
cf1b7d96 711#ifndef OPENSSL_NO_RSA
3009458e
RL
712 BIO_printf(bio_err,"rsa ");
713#endif
cf1b7d96 714#ifndef OPENSSL_NO_BF
3009458e
RL
715 BIO_printf(bio_err,"blowfish");
716#endif
cf1b7d96
RL
717#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
718 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
719 !defined(OPENSSL_NO_BF)
4e74239c 720 BIO_printf(bio_err,"\n");
3009458e
RL
721#endif
722
4e74239c 723 BIO_printf(bio_err,"\n");
3009458e 724 BIO_printf(bio_err,"Available options:\n");
5270e702 725#ifdef TIMES
4e74239c 726 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
3132e196 727#endif
5270e702 728 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
d02b48c6
RE
729 goto end;
730 }
731 argc--;
732 argv++;
733 j++;
734 }
735
736 if (j == 0)
737 {
738 for (i=0; i<ALGOR_NUM; i++)
53d28679
BM
739 {
740 if (i != D_EVP)
741 doit[i]=1;
742 }
d02b48c6
RE
743 for (i=0; i<RSA_NUM; i++)
744 rsa_doit[i]=1;
745 for (i=0; i<DSA_NUM; i++)
746 dsa_doit[i]=1;
747 }
748 for (i=0; i<ALGOR_NUM; i++)
749 if (doit[i]) pr_header++;
750
4e74239c
RL
751 if (usertime == 0)
752 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
753 if (usertime <= 0)
754 {
755 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
756 BIO_printf(bio_err,"program when this computer is idle.\n");
757 }
d02b48c6 758
cf1b7d96 759#ifndef OPENSSL_NO_RSA
d02b48c6
RE
760 for (i=0; i<RSA_NUM; i++)
761 {
5e4ca422 762 const unsigned char *p;
d02b48c6
RE
763
764 p=rsa_data[i];
765 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
766 if (rsa_key[i] == NULL)
767 {
768 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
769 goto end;
770 }
58964a49
RE
771#if 0
772 else
773 {
774 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
775 BN_print(bio_err,rsa_key[i]->e);
776 BIO_printf(bio_err,"\n");
777 }
778#endif
d02b48c6
RE
779 }
780#endif
781
cf1b7d96 782#ifndef OPENSSL_NO_DSA
d02b48c6
RE
783 dsa_key[0]=get_dsa512();
784 dsa_key[1]=get_dsa1024();
785 dsa_key[2]=get_dsa2048();
786#endif
787
cf1b7d96 788#ifndef OPENSSL_NO_DES
dbad1690
BL
789 des_set_key_unchecked(&key,&sch);
790 des_set_key_unchecked(&key2,&sch2);
791 des_set_key_unchecked(&key3,&sch3);
d02b48c6 792#endif
cf1b7d96 793#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
794 idea_set_encrypt_key(key16,&idea_ks);
795#endif
cf1b7d96 796#ifndef OPENSSL_NO_RC4
d02b48c6
RE
797 RC4_set_key(&rc4_ks,16,key16);
798#endif
cf1b7d96 799#ifndef OPENSSL_NO_RC2
d02b48c6
RE
800 RC2_set_key(&rc2_ks,16,key16,128);
801#endif
cf1b7d96 802#ifndef OPENSSL_NO_RC5
58964a49
RE
803 RC5_32_set_key(&rc5_ks,16,key16,12);
804#endif
cf1b7d96 805#ifndef OPENSSL_NO_BF
d02b48c6
RE
806 BF_set_key(&bf_ks,16,key16);
807#endif
cf1b7d96 808#ifndef OPENSSL_NO_CAST
58964a49
RE
809 CAST_set_key(&cast_ks,16,key16);
810#endif
cf1b7d96 811#ifndef OPENSSL_NO_RSA
d02b48c6 812 memset(rsa_c,0,sizeof(rsa_c));
f5d7a031 813#endif
d02b48c6 814#ifndef SIGALRM
cf1b7d96 815#ifndef OPENSSL_NO_DES
d02b48c6
RE
816 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
817 count=10;
818 do {
819 long i;
820 count*=2;
4e74239c 821 Time_F(START,usertime);
d02b48c6 822 for (i=count; i; i--)
12ba413c
BM
823 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
824 &(sch[0]),DES_ENCRYPT);
4e74239c 825 d=Time_F(STOP,usertime);
d02b48c6 826 } while (d <3);
646d5695 827 save_count=count;
d02b48c6
RE
828 c[D_MD2][0]=count/10;
829 c[D_MDC2][0]=count/10;
3009458e 830 c[D_MD4][0]=count;
d02b48c6 831 c[D_MD5][0]=count;
58964a49 832 c[D_HMAC][0]=count;
d02b48c6 833 c[D_SHA1][0]=count;
58964a49 834 c[D_RMD160][0]=count;
d02b48c6
RE
835 c[D_RC4][0]=count*5;
836 c[D_CBC_DES][0]=count;
837 c[D_EDE3_DES][0]=count/3;
838 c[D_CBC_IDEA][0]=count;
839 c[D_CBC_RC2][0]=count;
58964a49 840 c[D_CBC_RC5][0]=count;
d02b48c6 841 c[D_CBC_BF][0]=count;
58964a49 842 c[D_CBC_CAST][0]=count;
d02b48c6
RE
843
844 for (i=1; i<SIZE_NUM; i++)
845 {
846 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
847 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
3009458e 848 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
d02b48c6 849 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
58964a49 850 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
d02b48c6 851 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
58964a49 852 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
d02b48c6
RE
853 }
854 for (i=1; i<SIZE_NUM; i++)
855 {
856 long l0,l1;
857
858 l0=(long)lengths[i-1];
859 l1=(long)lengths[i];
860 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
861 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
862 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
863 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
864 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
58964a49 865 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
d02b48c6 866 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
58964a49 867 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
d02b48c6 868 }
cf1b7d96 869#ifndef OPENSSL_NO_RSA
d02b48c6
RE
870 rsa_c[R_RSA_512][0]=count/2000;
871 rsa_c[R_RSA_512][1]=count/400;
872 for (i=1; i<RSA_NUM; i++)
873 {
874 rsa_c[i][0]=rsa_c[i-1][0]/8;
875 rsa_c[i][1]=rsa_c[i-1][1]/4;
876 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
877 rsa_doit[i]=0;
878 else
879 {
dfeab068 880 if (rsa_c[i][0] == 0)
d02b48c6
RE
881 {
882 rsa_c[i][0]=1;
883 rsa_c[i][1]=20;
884 }
885 }
886 }
f5d7a031 887#endif
d02b48c6 888
f89aebb1 889#ifndef OPENSSL_NO_DSA
d02b48c6
RE
890 dsa_c[R_DSA_512][0]=count/1000;
891 dsa_c[R_DSA_512][1]=count/1000/2;
892 for (i=1; i<DSA_NUM; i++)
893 {
894 dsa_c[i][0]=dsa_c[i-1][0]/4;
895 dsa_c[i][1]=dsa_c[i-1][1]/4;
896 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
897 dsa_doit[i]=0;
898 else
899 {
900 if (dsa_c[i] == 0)
901 {
902 dsa_c[i][0]=1;
903 dsa_c[i][1]=1;
904 }
905 }
906 }
f89aebb1 907#endif
d02b48c6 908
58964a49 909#define COND(d) (count < (d))
d02b48c6
RE
910#define COUNT(d) (d)
911#else
63da21c0
BM
912/* not worth fixing */
913# error "You cannot disable DES on systems without SIGALRM."
cf1b7d96 914#endif /* OPENSSL_NO_DES */
63da21c0 915#else
d02b48c6
RE
916#define COND(c) (run)
917#define COUNT(d) (count)
918 signal(SIGALRM,sig_done);
63da21c0 919#endif /* SIGALRM */
d02b48c6 920
cf1b7d96 921#ifndef OPENSSL_NO_MD2
d02b48c6
RE
922 if (doit[D_MD2])
923 {
924 for (j=0; j<SIZE_NUM; j++)
925 {
926 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
4e74239c 927 Time_F(START,usertime);
d02b48c6 928 for (count=0,run=1; COND(c[D_MD2][j]); count++)
323f289c 929 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2());
4e74239c 930 d=Time_F(STOP,usertime);
d02b48c6
RE
931 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
932 count,names[D_MD2],d);
933 results[D_MD2][j]=((double)count)/d*lengths[j];
934 }
935 }
936#endif
cf1b7d96 937#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
938 if (doit[D_MDC2])
939 {
940 for (j=0; j<SIZE_NUM; j++)
941 {
942 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
4e74239c 943 Time_F(START,usertime);
d02b48c6 944 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
323f289c 945 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2());
4e74239c 946 d=Time_F(STOP,usertime);
d02b48c6
RE
947 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
948 count,names[D_MDC2],d);
949 results[D_MDC2][j]=((double)count)/d*lengths[j];
950 }
951 }
952#endif
953
cf1b7d96 954#ifndef OPENSSL_NO_MD4
3009458e
RL
955 if (doit[D_MD4])
956 {
957 for (j=0; j<SIZE_NUM; j++)
958 {
959 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
960 Time_F(START,usertime);
961 for (count=0,run=1; COND(c[D_MD4][j]); count++)
323f289c 962 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4());
3009458e
RL
963 d=Time_F(STOP,usertime);
964 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
965 count,names[D_MD4],d);
966 results[D_MD4][j]=((double)count)/d*lengths[j];
967 }
968 }
969#endif
970
cf1b7d96 971#ifndef OPENSSL_NO_MD5
d02b48c6
RE
972 if (doit[D_MD5])
973 {
974 for (j=0; j<SIZE_NUM; j++)
975 {
976 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
4e74239c 977 Time_F(START,usertime);
d02b48c6 978 for (count=0,run=1; COND(c[D_MD5][j]); count++)
7d344704 979 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"));
4e74239c 980 d=Time_F(STOP,usertime);
d02b48c6
RE
981 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
982 count,names[D_MD5],d);
983 results[D_MD5][j]=((double)count)/d*lengths[j];
984 }
985 }
986#endif
987
cf1b7d96 988#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
58964a49 989 if (doit[D_HMAC])
d02b48c6 990 {
58964a49 991 HMAC_CTX hctx;
dbad1690
BL
992
993 HMAC_CTX_init(&hctx);
58964a49
RE
994 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
995 16,EVP_md5());
996
d02b48c6
RE
997 for (j=0; j<SIZE_NUM; j++)
998 {
58964a49 999 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
4e74239c 1000 Time_F(START,usertime);
58964a49
RE
1001 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1002 {
1003 HMAC_Init(&hctx,NULL,0,NULL);
1004 HMAC_Update(&hctx,buf,lengths[j]);
1005 HMAC_Final(&hctx,&(hmac[0]),NULL);
1006 }
4e74239c 1007 d=Time_F(STOP,usertime);
d02b48c6 1008 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
58964a49
RE
1009 count,names[D_HMAC],d);
1010 results[D_HMAC][j]=((double)count)/d*lengths[j];
d02b48c6 1011 }
dbad1690 1012 HMAC_CTX_cleanup(&hctx);
d02b48c6
RE
1013 }
1014#endif
cf1b7d96 1015#ifndef OPENSSL_NO_SHA
d02b48c6
RE
1016 if (doit[D_SHA1])
1017 {
1018 for (j=0; j<SIZE_NUM; j++)
1019 {
1020 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
4e74239c 1021 Time_F(START,usertime);
d02b48c6 1022 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
323f289c 1023 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1());
4e74239c 1024 d=Time_F(STOP,usertime);
d02b48c6
RE
1025 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1026 count,names[D_SHA1],d);
1027 results[D_SHA1][j]=((double)count)/d*lengths[j];
1028 }
1029 }
1030#endif
cf1b7d96 1031#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
1032 if (doit[D_RMD160])
1033 {
1034 for (j=0; j<SIZE_NUM; j++)
1035 {
1036 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
4e74239c 1037 Time_F(START,usertime);
58964a49 1038 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
323f289c 1039 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160());
4e74239c 1040 d=Time_F(STOP,usertime);
58964a49
RE
1041 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1042 count,names[D_RMD160],d);
1043 results[D_RMD160][j]=((double)count)/d*lengths[j];
1044 }
1045 }
1046#endif
cf1b7d96 1047#ifndef OPENSSL_NO_RC4
d02b48c6
RE
1048 if (doit[D_RC4])
1049 {
1050 for (j=0; j<SIZE_NUM; j++)
1051 {
1052 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
4e74239c 1053 Time_F(START,usertime);
d02b48c6
RE
1054 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1055 RC4(&rc4_ks,(unsigned int)lengths[j],
1056 buf,buf);
4e74239c 1057 d=Time_F(STOP,usertime);
d02b48c6
RE
1058 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1059 count,names[D_RC4],d);
1060 results[D_RC4][j]=((double)count)/d*lengths[j];
1061 }
1062 }
1063#endif
cf1b7d96 1064#ifndef OPENSSL_NO_DES
d02b48c6
RE
1065 if (doit[D_CBC_DES])
1066 {
1067 for (j=0; j<SIZE_NUM; j++)
1068 {
1069 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
4e74239c 1070 Time_F(START,usertime);
d02b48c6 1071 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
dbad1690 1072 des_ncbc_encrypt(buf,buf,lengths[j],&sch,
edf0bfb5 1073 &iv,DES_ENCRYPT);
4e74239c 1074 d=Time_F(STOP,usertime);
d02b48c6 1075 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
dbad1690 1076 count,names[D_CBC_DES],d);
d02b48c6
RE
1077 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1078 }
1079 }
1080
1081 if (doit[D_EDE3_DES])
1082 {
1083 for (j=0; j<SIZE_NUM; j++)
1084 {
1085 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
4e74239c 1086 Time_F(START,usertime);
d02b48c6 1087 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
4e31df2c 1088 des_ede3_cbc_encrypt(buf,buf,lengths[j],
dbad1690 1089 &sch,&sch2,&sch3,
edf0bfb5 1090 &iv,DES_ENCRYPT);
4e74239c 1091 d=Time_F(STOP,usertime);
d02b48c6
RE
1092 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1093 count,names[D_EDE3_DES],d);
1094 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1095 }
1096 }
1097#endif
cf1b7d96 1098#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
1099 if (doit[D_CBC_IDEA])
1100 {
1101 for (j=0; j<SIZE_NUM; j++)
1102 {
1103 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
4e74239c 1104 Time_F(START,usertime);
d02b48c6
RE
1105 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1106 idea_cbc_encrypt(buf,buf,
1107 (unsigned long)lengths[j],&idea_ks,
12ba413c 1108 iv,IDEA_ENCRYPT);
4e74239c 1109 d=Time_F(STOP,usertime);
d02b48c6
RE
1110 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1111 count,names[D_CBC_IDEA],d);
1112 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1113 }
1114 }
1115#endif
cf1b7d96 1116#ifndef OPENSSL_NO_RC2
d02b48c6
RE
1117 if (doit[D_CBC_RC2])
1118 {
1119 for (j=0; j<SIZE_NUM; j++)
1120 {
1121 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
4e74239c 1122 Time_F(START,usertime);
d02b48c6
RE
1123 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1124 RC2_cbc_encrypt(buf,buf,
1125 (unsigned long)lengths[j],&rc2_ks,
12ba413c 1126 iv,RC2_ENCRYPT);
4e74239c 1127 d=Time_F(STOP,usertime);
d02b48c6
RE
1128 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1129 count,names[D_CBC_RC2],d);
1130 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1131 }
1132 }
1133#endif
cf1b7d96 1134#ifndef OPENSSL_NO_RC5
58964a49
RE
1135 if (doit[D_CBC_RC5])
1136 {
1137 for (j=0; j<SIZE_NUM; j++)
1138 {
1139 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
4e74239c 1140 Time_F(START,usertime);
58964a49
RE
1141 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1142 RC5_32_cbc_encrypt(buf,buf,
1143 (unsigned long)lengths[j],&rc5_ks,
12ba413c 1144 iv,RC5_ENCRYPT);
4e74239c 1145 d=Time_F(STOP,usertime);
58964a49
RE
1146 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1147 count,names[D_CBC_RC5],d);
1148 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1149 }
1150 }
1151#endif
cf1b7d96 1152#ifndef OPENSSL_NO_BF
d02b48c6
RE
1153 if (doit[D_CBC_BF])
1154 {
1155 for (j=0; j<SIZE_NUM; j++)
1156 {
1157 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
4e74239c 1158 Time_F(START,usertime);
d02b48c6
RE
1159 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1160 BF_cbc_encrypt(buf,buf,
1161 (unsigned long)lengths[j],&bf_ks,
12ba413c 1162 iv,BF_ENCRYPT);
4e74239c 1163 d=Time_F(STOP,usertime);
d02b48c6
RE
1164 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1165 count,names[D_CBC_BF],d);
1166 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1167 }
1168 }
1169#endif
cf1b7d96 1170#ifndef OPENSSL_NO_CAST
58964a49
RE
1171 if (doit[D_CBC_CAST])
1172 {
1173 for (j=0; j<SIZE_NUM; j++)
1174 {
1175 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
4e74239c 1176 Time_F(START,usertime);
58964a49
RE
1177 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1178 CAST_cbc_encrypt(buf,buf,
1179 (unsigned long)lengths[j],&cast_ks,
12ba413c 1180 iv,CAST_ENCRYPT);
4e74239c 1181 d=Time_F(STOP,usertime);
58964a49
RE
1182 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1183 count,names[D_CBC_CAST],d);
1184 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1185 }
1186 }
1187#endif
d02b48c6 1188
646d5695
BL
1189 if (doit[D_EVP])
1190 {
1191 for (j=0; j<SIZE_NUM; j++)
1192 {
1193 EVP_CIPHER_CTX ctx;
1194 int outl;
1195
1196 names[D_EVP]=OBJ_nid2ln(evp->nid);
1197 print_message(names[D_EVP],save_count,
1198 lengths[j]);
3f37e73b
BL
1199 if(decrypt)
1200 EVP_DecryptInit(&ctx,evp,key16,iv);
1201 else
1202 EVP_EncryptInit(&ctx,evp,key16,iv);
1203
646d5695 1204 Time_F(START,usertime);
3f37e73b
BL
1205 if(decrypt)
1206 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1207 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1208 else
1209 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1210 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1211 if(decrypt)
1212 EVP_DecryptFinal(&ctx,buf,&outl);
1213 else
1214 EVP_EncryptFinal(&ctx,buf,&outl);
646d5695
BL
1215 d=Time_F(STOP,usertime);
1216 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1217 count,names[D_EVP],d);
1218 results[D_EVP][j]=((double)count)/d*lengths[j];
1219 }
1220 }
1221
373b575f 1222 RAND_pseudo_bytes(buf,36);
cf1b7d96 1223#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1224 for (j=0; j<RSA_NUM; j++)
1225 {
c91e1259 1226 int ret;
d02b48c6 1227 if (!rsa_doit[j]) continue;
c91e1259 1228 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
03ea28c9
RL
1229 if (ret == 0)
1230 {
1231 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1232 ERR_print_errors(bio_err);
1233 rsa_count=1;
1234 }
1235 else
d02b48c6 1236 {
03ea28c9
RL
1237 pkey_print_message("private","rsa",
1238 rsa_c[j][0],rsa_bits[j],
1239 RSA_SECONDS);
1240/* RSA_blinding_on(rsa_key[j],NULL); */
1241 Time_F(START,usertime);
1242 for (count=0,run=1; COND(rsa_c[j][0]); count++)
d02b48c6 1243 {
03ea28c9
RL
1244 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1245 &rsa_num, rsa_key[j]);
1246 if (ret == 0)
1247 {
1248 BIO_printf(bio_err,
1249 "RSA sign failure\n");
1250 ERR_print_errors(bio_err);
1251 count=1;
1252 break;
1253 }
d02b48c6 1254 }
03ea28c9
RL
1255 d=Time_F(STOP,usertime);
1256 BIO_printf(bio_err,
1257 "%ld %d bit private RSA's in %.2fs\n",
1258 count,rsa_bits[j],d);
1259 rsa_results[j][0]=d/(double)count;
1260 rsa_count=count;
d02b48c6 1261 }
d02b48c6 1262
58964a49 1263#if 1
c91e1259 1264 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
03ea28c9 1265 if (ret <= 0)
d02b48c6 1266 {
03ea28c9
RL
1267 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1268 ERR_print_errors(bio_err);
51740b12 1269 rsa_doit[j] = 0;
03ea28c9
RL
1270 }
1271 else
1272 {
1273 pkey_print_message("public","rsa",
1274 rsa_c[j][1],rsa_bits[j],
1275 RSA_SECONDS);
1276 Time_F(START,usertime);
1277 for (count=0,run=1; COND(rsa_c[j][1]); count++)
d02b48c6 1278 {
03ea28c9
RL
1279 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1280 rsa_num, rsa_key[j]);
1281 if (ret == 0)
1282 {
1283 BIO_printf(bio_err,
1284 "RSA verify failure\n");
1285 ERR_print_errors(bio_err);
1286 count=1;
1287 break;
1288 }
d02b48c6 1289 }
03ea28c9
RL
1290 d=Time_F(STOP,usertime);
1291 BIO_printf(bio_err,
1292 "%ld %d bit public RSA's in %.2fs\n",
1293 count,rsa_bits[j],d);
1294 rsa_results[j][1]=d/(double)count;
d02b48c6 1295 }
58964a49 1296#endif
d02b48c6
RE
1297
1298 if (rsa_count <= 1)
1299 {
1300 /* if longer than 10s, don't do any more */
1301 for (j++; j<RSA_NUM; j++)
1302 rsa_doit[j]=0;
1303 }
1304 }
1305#endif
1306
373b575f 1307 RAND_pseudo_bytes(buf,20);
cf1b7d96 1308#ifndef OPENSSL_NO_DSA
99a97051
UM
1309 if (RAND_status() != 1)
1310 {
1311 RAND_seed(rnd_seed, sizeof rnd_seed);
1312 rnd_fake = 1;
1313 }
d02b48c6
RE
1314 for (j=0; j<DSA_NUM; j++)
1315 {
58964a49 1316 unsigned int kk;
03ea28c9 1317 int ret;
58964a49 1318
d02b48c6 1319 if (!dsa_doit[j]) continue;
af436bc1 1320/* DSA_generate_key(dsa_key[j]); */
d02b48c6 1321/* DSA_sign_setup(dsa_key[j],NULL); */
03ea28c9 1322 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1323 &kk,dsa_key[j]);
03ea28c9
RL
1324 if (ret == 0)
1325 {
1326 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1327 ERR_print_errors(bio_err);
1328 rsa_count=1;
1329 }
1330 else
d02b48c6 1331 {
03ea28c9
RL
1332 pkey_print_message("sign","dsa",
1333 dsa_c[j][0],dsa_bits[j],
1334 DSA_SECONDS);
1335 Time_F(START,usertime);
1336 for (count=0,run=1; COND(dsa_c[j][0]); count++)
d02b48c6 1337 {
03ea28c9
RL
1338 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1339 &kk,dsa_key[j]);
1340 if (ret == 0)
1341 {
1342 BIO_printf(bio_err,
1343 "DSA sign failure\n");
1344 ERR_print_errors(bio_err);
1345 count=1;
1346 break;
1347 }
d02b48c6 1348 }
03ea28c9
RL
1349 d=Time_F(STOP,usertime);
1350 BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
1351 count,dsa_bits[j],d);
1352 dsa_results[j][0]=d/(double)count;
1353 rsa_count=count;
d02b48c6 1354 }
d02b48c6 1355
03ea28c9 1356 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1357 kk,dsa_key[j]);
03ea28c9
RL
1358 if (ret <= 0)
1359 {
1360 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1361 ERR_print_errors(bio_err);
1362 dsa_doit[j] = 0;
1363 }
1364 else
d02b48c6 1365 {
03ea28c9
RL
1366 pkey_print_message("verify","dsa",
1367 dsa_c[j][1],dsa_bits[j],
1368 DSA_SECONDS);
1369 Time_F(START,usertime);
1370 for (count=0,run=1; COND(dsa_c[j][1]); count++)
d02b48c6 1371 {
03ea28c9
RL
1372 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1373 kk,dsa_key[j]);
1374 if (ret <= 0)
1375 {
1376 BIO_printf(bio_err,
1377 "DSA verify failure\n");
1378 ERR_print_errors(bio_err);
1379 count=1;
1380 break;
1381 }
d02b48c6 1382 }
03ea28c9
RL
1383 d=Time_F(STOP,usertime);
1384 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1385 count,dsa_bits[j],d);
1386 dsa_results[j][1]=d/(double)count;
d02b48c6 1387 }
d02b48c6
RE
1388
1389 if (rsa_count <= 1)
1390 {
1391 /* if longer than 10s, don't do any more */
1392 for (j++; j<DSA_NUM; j++)
1393 dsa_doit[j]=0;
1394 }
1395 }
99a97051 1396 if (rnd_fake) RAND_cleanup();
d02b48c6
RE
1397#endif
1398
1399 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1400 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1401 printf("options:");
1402 printf("%s ",BN_options());
cf1b7d96 1403#ifndef OPENSSL_NO_MD2
d02b48c6
RE
1404 printf("%s ",MD2_options());
1405#endif
cf1b7d96 1406#ifndef OPENSSL_NO_RC4
d02b48c6
RE
1407 printf("%s ",RC4_options());
1408#endif
cf1b7d96 1409#ifndef OPENSSL_NO_DES
d02b48c6
RE
1410 printf("%s ",des_options());
1411#endif
cf1b7d96 1412#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
1413 printf("%s ",idea_options());
1414#endif
cf1b7d96 1415#ifndef OPENSSL_NO_BF
d02b48c6
RE
1416 printf("%s ",BF_options());
1417#endif
58964a49 1418 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
d02b48c6
RE
1419
1420 if (pr_header)
1421 {
1422 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1423 fprintf(stdout,"type ");
1424 for (j=0; j<SIZE_NUM; j++)
1425 fprintf(stdout,"%7d bytes",lengths[j]);
1426 fprintf(stdout,"\n");
1427 }
1428
1429 for (k=0; k<ALGOR_NUM; k++)
1430 {
1431 if (!doit[k]) continue;
58964a49 1432 fprintf(stdout,"%-13s",names[k]);
d02b48c6
RE
1433 for (j=0; j<SIZE_NUM; j++)
1434 {
1435 if (results[k][j] > 10000)
1436 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1437 else
1438 fprintf(stdout," %11.2f ",results[k][j]);
1439 }
1440 fprintf(stdout,"\n");
1441 }
cf1b7d96 1442#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1443 j=1;
1444 for (k=0; k<RSA_NUM; k++)
1445 {
1446 if (!rsa_doit[k]) continue;
58964a49
RE
1447 if (j)
1448 {
1449 printf("%18ssign verify sign/s verify/s\n"," ");
1450 j=0;
1451 }
d58d092b 1452 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
58964a49
RE
1453 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1454 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
d02b48c6
RE
1455 fprintf(stdout,"\n");
1456 }
1457#endif
cf1b7d96 1458#ifndef OPENSSL_NO_DSA
d02b48c6
RE
1459 j=1;
1460 for (k=0; k<DSA_NUM; k++)
1461 {
1462 if (!dsa_doit[k]) continue;
58964a49
RE
1463 if (j) {
1464 printf("%18ssign verify sign/s verify/s\n"," ");
1465 j=0;
1466 }
d58d092b 1467 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
58964a49
RE
1468 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1469 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
d02b48c6
RE
1470 fprintf(stdout,"\n");
1471 }
1472#endif
18c77bf2 1473 mret=0;
d02b48c6 1474end:
5270e702 1475 ERR_print_errors(bio_err);
26a3a48d
RL
1476 if (buf != NULL) OPENSSL_free(buf);
1477 if (buf2 != NULL) OPENSSL_free(buf2);
cf1b7d96 1478#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1479 for (i=0; i<RSA_NUM; i++)
1480 if (rsa_key[i] != NULL)
1481 RSA_free(rsa_key[i]);
1482#endif
cf1b7d96 1483#ifndef OPENSSL_NO_DSA
d02b48c6
RE
1484 for (i=0; i<DSA_NUM; i++)
1485 if (dsa_key[i] != NULL)
1486 DSA_free(dsa_key[i]);
1487#endif
c04f8cf4 1488 apps_shutdown();
18c77bf2 1489 EXIT(mret);
d02b48c6
RE
1490 }
1491
646d5695 1492static void print_message(const char *s, long num, int length)
d02b48c6
RE
1493 {
1494#ifdef SIGALRM
1495 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
d58d092b 1496 (void)BIO_flush(bio_err);
d02b48c6
RE
1497 alarm(SECONDS);
1498#else
1499 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
d58d092b 1500 (void)BIO_flush(bio_err);
d02b48c6
RE
1501#endif
1502#ifdef LINT
1503 num=num;
1504#endif
1505 }
1506
6b691a5c
UM
1507static void pkey_print_message(char *str, char *str2, long num, int bits,
1508 int tm)
d02b48c6
RE
1509 {
1510#ifdef SIGALRM
1511 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
d58d092b 1512 (void)BIO_flush(bio_err);
d02b48c6
RE
1513 alarm(RSA_SECONDS);
1514#else
1515 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
d58d092b 1516 (void)BIO_flush(bio_err);
d02b48c6
RE
1517#endif
1518#ifdef LINT
1519 num=num;
1520#endif
1521 }
58964a49 1522