]> git.ipfire.org Git - thirdparty/openssl.git/blame - apps/speed.c
Constify the RSAref glue code.
[thirdparty/openssl.git] / apps / speed.c
CommitLineData
d02b48c6 1/* apps/speed.c */
58964a49 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
d02b48c6
RE
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59/* most of this code has been pilfered from my libdes speed.c program */
60
61#undef SECONDS
62#define SECONDS 3
dfeab068
RE
63#define RSA_SECONDS 10
64#define DSA_SECONDS 10
d02b48c6
RE
65
66/* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
67/* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
68
69#undef PROG
70#define PROG speed_main
71
72#include <stdio.h>
73#include <stdlib.h>
74#include <signal.h>
75#include <string.h>
58964a49 76#include <math.h>
d02b48c6 77#include "apps.h"
58964a49 78#ifdef NO_STDIO
d02b48c6
RE
79#define APPS_WIN16
80#endif
ec577822
BM
81#include <openssl/crypto.h>
82#include <openssl/rand.h>
83#include <openssl/err.h>
5270e702 84#include <openssl/engine.h>
d02b48c6 85
2bfb4dbc
BL
86#if defined(__FreeBSD__)
87# define USE_TOD
88#elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
89# define TIMES
d02b48c6 90#endif
5660eb48 91#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE) && !defined(__NetBSD__)
3132e196
RL
92# define TIMEB
93#endif
d02b48c6 94
d02b48c6 95#ifndef _IRIX
2bfb4dbc 96# include <time.h>
d02b48c6
RE
97#endif
98#ifdef TIMES
2bfb4dbc
BL
99# include <sys/types.h>
100# include <sys/times.h>
101#endif
102#ifdef USE_TOD
103# include <sys/time.h>
104# include <sys/resource.h>
d02b48c6 105#endif
7d7d2cbc
UM
106
107/* Depending on the VMS version, the tms structure is perhaps defined.
108 The __TMS macro will show if it was. If it wasn't defined, we should
109 undefine TIMES, since that tells the rest of the program how things
110 should be handled. -- Richard Levitte */
111#if defined(VMS) && defined(__DECC) && !defined(__TMS)
112#undef TIMES
d02b48c6 113#endif
7d7d2cbc 114
3132e196 115#ifdef TIMEB
d02b48c6 116#include <sys/timeb.h>
3132e196
RL
117#endif
118
1cbb729f 119#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
3132e196
RL
120#error "It seems neither struct tms nor struct timeb is supported in this platform!"
121#endif
d02b48c6 122
dfeab068
RE
123#if defined(sun) || defined(__ultrix)
124#define _POSIX_SOURCE
d02b48c6
RE
125#include <limits.h>
126#include <sys/param.h>
127#endif
128
129#ifndef NO_DES
ec577822 130#include <openssl/des.h>
d02b48c6
RE
131#endif
132#ifndef NO_MD2
ec577822 133#include <openssl/md2.h>
d02b48c6
RE
134#endif
135#ifndef NO_MDC2
ec577822 136#include <openssl/mdc2.h>
d02b48c6 137#endif
3009458e
RL
138#ifndef NO_MD4
139#include <openssl/md4.h>
140#endif
d02b48c6 141#ifndef NO_MD5
ec577822 142#include <openssl/md5.h>
5271ebd9
UM
143#endif
144#ifndef NO_HMAC
ec577822 145#include <openssl/hmac.h>
d02b48c6 146#endif
5271ebd9 147#include <openssl/evp.h>
f5d7a031 148#ifndef NO_SHA
ec577822 149#include <openssl/sha.h>
d02b48c6 150#endif
f5d7a031 151#ifndef NO_RIPEMD
ec577822 152#include <openssl/ripemd.h>
58964a49 153#endif
d02b48c6 154#ifndef NO_RC4
ec577822 155#include <openssl/rc4.h>
d02b48c6 156#endif
58964a49 157#ifndef NO_RC5
ec577822 158#include <openssl/rc5.h>
58964a49 159#endif
d02b48c6 160#ifndef NO_RC2
ec577822 161#include <openssl/rc2.h>
d02b48c6
RE
162#endif
163#ifndef NO_IDEA
ec577822 164#include <openssl/idea.h>
d02b48c6 165#endif
f5d7a031 166#ifndef NO_BF
ec577822 167#include <openssl/blowfish.h>
d02b48c6 168#endif
58964a49 169#ifndef NO_CAST
ec577822 170#include <openssl/cast.h>
58964a49 171#endif
d02b48c6 172#ifndef NO_RSA
ec577822 173#include <openssl/rsa.h>
f5d7a031 174#include "./testrsa.h"
d02b48c6 175#endif
ec577822 176#include <openssl/x509.h>
d02b48c6
RE
177#ifndef NO_DSA
178#include "./testdsa.h"
179#endif
180
181/* The following if from times(3) man page. It may need to be changed */
182#ifndef HZ
183# ifndef CLK_TCK
184# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
5c83b4c9 185# define HZ 100.0
d02b48c6
RE
186# else /* _BSD_CLK_TCK_ */
187# define HZ ((double)_BSD_CLK_TCK_)
188# endif
189# else /* CLK_TCK */
190# define HZ ((double)CLK_TCK)
191# endif
192#endif
193
194#undef BUFSIZE
58964a49 195#define BUFSIZE ((long)1024*8+1)
d02b48c6
RE
196int run=0;
197
4e74239c 198static double Time_F(int s, int usertime);
d02b48c6
RE
199static void print_message(char *s,long num,int length);
200static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
d02b48c6
RE
201#ifdef SIGALRM
202#if defined(__STDC__) || defined(sgi) || defined(_AIX)
203#define SIGRETTYPE void
204#else
205#define SIGRETTYPE int
206#endif
207
d02b48c6 208static SIGRETTYPE sig_done(int sig);
6b691a5c 209static SIGRETTYPE sig_done(int sig)
d02b48c6
RE
210 {
211 signal(SIGALRM,sig_done);
212 run=0;
213#ifdef LINT
214 sig=sig;
215#endif
216 }
217#endif
218
219#define START 0
220#define STOP 1
221
4e74239c 222static double Time_F(int s, int usertime)
d02b48c6
RE
223 {
224 double ret;
2bfb4dbc
BL
225
226#ifdef USE_TOD
227 if(usertime)
228 {
229 static struct rusage tstart,tend;
230
231 if (s == START)
232 {
233 getrusage(RUSAGE_SELF,&tstart);
234 return(0);
235 }
236 else
237 {
238 long i;
239
240 getrusage(RUSAGE_SELF,&tend);
241 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
242 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
243 +((double)i)/1000000.0;
244 return((ret < 0.001)?0.001:ret);
245 }
246 }
247 else
248 {
249 static struct timeval tstart,tend;
250 long i;
251
252 if (s == START)
253 {
254 gettimeofday(&tstart,NULL);
255 return(0);
256 }
257 else
258 {
259 gettimeofday(&tend,NULL);
260 i=(long)tend.tv_usec-(long)tstart.tv_usec;
261 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
262 return((ret < 0.001)?0.001:ret);
263 }
264 }
265#else /* ndef USE_TOD */
266
267# ifdef TIMES
4e74239c 268 if (usertime)
d02b48c6 269 {
4e74239c 270 static struct tms tstart,tend;
d02b48c6 271
4e74239c
RL
272 if (s == START)
273 {
274 times(&tstart);
275 return(0);
276 }
277 else
278 {
279 times(&tend);
280 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
281 return((ret < 1e-3)?1e-3:ret);
282 }
d02b48c6 283 }
2bfb4dbc 284# endif /* times() */
3132e196
RL
285# if defined(TIMES) && defined(TIMEB)
286 else
287# endif
288# ifdef TIMEB
d02b48c6 289 {
4e74239c
RL
290 static struct timeb tstart,tend;
291 long i;
292
293 if (s == START)
294 {
295 ftime(&tstart);
296 return(0);
297 }
298 else
299 {
300 ftime(&tend);
301 i=(long)tend.millitm-(long)tstart.millitm;
302 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
303 return((ret < 0.001)?0.001:ret);
304 }
d02b48c6 305 }
3132e196 306# endif
2bfb4dbc 307#endif
d02b48c6
RE
308 }
309
667ac4ec
RE
310int MAIN(int, char **);
311
6b691a5c 312int MAIN(int argc, char **argv)
d02b48c6 313 {
5270e702 314 ENGINE *e;
d02b48c6 315 unsigned char *buf=NULL,*buf2=NULL;
18c77bf2 316 int mret=1;
3009458e 317#define ALGOR_NUM 15
d02b48c6
RE
318#define SIZE_NUM 5
319#define RSA_NUM 4
320#define DSA_NUM 3
321 long count,rsa_count;
18c77bf2 322 int i,j,k;
5614bb91 323 unsigned rsa_num;
d02b48c6
RE
324#ifndef NO_MD2
325 unsigned char md2[MD2_DIGEST_LENGTH];
326#endif
327#ifndef NO_MDC2
328 unsigned char mdc2[MDC2_DIGEST_LENGTH];
329#endif
3009458e
RL
330#ifndef NO_MD4
331 unsigned char md4[MD4_DIGEST_LENGTH];
332#endif
d02b48c6
RE
333#ifndef NO_MD5
334 unsigned char md5[MD5_DIGEST_LENGTH];
58964a49 335 unsigned char hmac[MD5_DIGEST_LENGTH];
d02b48c6 336#endif
f5d7a031 337#ifndef NO_SHA
d02b48c6
RE
338 unsigned char sha[SHA_DIGEST_LENGTH];
339#endif
f5d7a031 340#ifndef NO_RIPEMD
58964a49
RE
341 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
342#endif
d02b48c6
RE
343#ifndef NO_RC4
344 RC4_KEY rc4_ks;
345#endif
58964a49
RE
346#ifndef NO_RC5
347 RC5_32_KEY rc5_ks;
348#endif
d02b48c6
RE
349#ifndef NO_RC2
350 RC2_KEY rc2_ks;
351#endif
352#ifndef NO_IDEA
353 IDEA_KEY_SCHEDULE idea_ks;
354#endif
f5d7a031 355#ifndef NO_BF
d02b48c6 356 BF_KEY bf_ks;
58964a49
RE
357#endif
358#ifndef NO_CAST
359 CAST_KEY cast_ks;
d02b48c6
RE
360#endif
361 static unsigned char key16[16]=
362 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
363 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
364 unsigned char iv[8];
365#ifndef NO_DES
5676d8cb 366 des_cblock *buf_as_des_cblock = NULL;
d02b48c6
RE
367 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
368 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
369 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
370 des_key_schedule sch,sch2,sch3;
371#endif
372#define D_MD2 0
373#define D_MDC2 1
3009458e
RL
374#define D_MD4 2
375#define D_MD5 3
376#define D_HMAC 4
377#define D_SHA1 5
378#define D_RMD160 6
379#define D_RC4 7
380#define D_CBC_DES 8
381#define D_EDE3_DES 9
382#define D_CBC_IDEA 10
383#define D_CBC_RC2 11
384#define D_CBC_RC5 12
385#define D_CBC_BF 13
386#define D_CBC_CAST 14
d02b48c6
RE
387 double d,results[ALGOR_NUM][SIZE_NUM];
388 static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
389 long c[ALGOR_NUM][SIZE_NUM];
390 static char *names[ALGOR_NUM]={
3009458e 391 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
d02b48c6 392 "des cbc","des ede3","idea cbc",
58964a49 393 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
d02b48c6
RE
394#define R_DSA_512 0
395#define R_DSA_1024 1
396#define R_DSA_2048 2
397#define R_RSA_512 0
398#define R_RSA_1024 1
399#define R_RSA_2048 2
400#define R_RSA_4096 3
f5d7a031 401#ifndef NO_RSA
d02b48c6 402 RSA *rsa_key[RSA_NUM];
d02b48c6 403 long rsa_c[RSA_NUM][2];
d02b48c6 404 double rsa_results[RSA_NUM][2];
d02b48c6 405 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
d02b48c6
RE
406 static unsigned char *rsa_data[RSA_NUM]=
407 {test512,test1024,test2048,test4096};
408 static int rsa_data_length[RSA_NUM]={
409 sizeof(test512),sizeof(test1024),
410 sizeof(test2048),sizeof(test4096)};
58964a49
RE
411#endif
412#ifndef NO_DSA
413 DSA *dsa_key[DSA_NUM];
414 long dsa_c[DSA_NUM][2];
415 double dsa_results[DSA_NUM][2];
416 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
417#endif
d02b48c6
RE
418 int rsa_doit[RSA_NUM];
419 int dsa_doit[DSA_NUM];
58964a49 420 int doit[ALGOR_NUM];
d02b48c6 421 int pr_header=0;
4e74239c
RL
422 int usertime=1;
423
424#ifndef TIMES
425 usertime=-1;
426#endif
d02b48c6
RE
427
428 apps_startup();
396f6314 429 memset(results, 0, sizeof(results));
f5d7a031 430#ifndef NO_DSA
dfeab068
RE
431 memset(dsa_key,0,sizeof(dsa_key));
432#endif
d02b48c6
RE
433
434 if (bio_err == NULL)
435 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
58964a49 436 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
d02b48c6 437
dfeab068
RE
438#ifndef NO_RSA
439 memset(rsa_key,0,sizeof(rsa_key));
d02b48c6
RE
440 for (i=0; i<RSA_NUM; i++)
441 rsa_key[i]=NULL;
dfeab068 442#endif
d02b48c6 443
26a3a48d 444 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
445 {
446 BIO_printf(bio_err,"out of memory\n");
447 goto end;
448 }
5676d8cb 449#ifndef NO_DES
12ba413c 450 buf_as_des_cblock = (des_cblock *)buf;
5676d8cb 451#endif
26a3a48d 452 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
453 {
454 BIO_printf(bio_err,"out of memory\n");
455 goto end;
456 }
457
458 memset(c,0,sizeof(c));
459 memset(iv,0,sizeof(iv));
460
461 for (i=0; i<ALGOR_NUM; i++)
462 doit[i]=0;
463 for (i=0; i<RSA_NUM; i++)
464 rsa_doit[i]=0;
465 for (i=0; i<DSA_NUM; i++)
466 dsa_doit[i]=0;
467
468 j=0;
469 argc--;
470 argv++;
471 while (argc)
472 {
4e74239c
RL
473 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
474 usertime = 0;
5270e702
RL
475 else
476 if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
477 {
478 argc--;
479 argv++;
480 if(argc == 0)
481 {
482 BIO_printf(bio_err,"no engine given\n");
483 goto end;
484 }
485 if((e = ENGINE_by_id(*argv)) == NULL)
486 {
487 BIO_printf(bio_err,"invalid engine \"%s\"\n",
488 *argv);
489 goto end;
490 }
491 if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
492 {
493 BIO_printf(bio_err,"can't use that engine\n");
494 goto end;
495 }
496 BIO_printf(bio_err,"engine \"%s\" set.\n", *argv);
497 /* Free our "structural" reference. */
498 ENGINE_free(e);
499 /* It will be increased again further down. We just
500 don't want speed to confuse an engine with an
501 algorithm, especially when none is given (which
502 means all of them should be run) */
503 j--;
504 }
505 else
d02b48c6
RE
506#ifndef NO_MD2
507 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
508 else
509#endif
510#ifndef NO_MDC2
511 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
512 else
513#endif
3009458e
RL
514#ifndef NO_MD4
515 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
516 else
517#endif
d02b48c6
RE
518#ifndef NO_MD5
519 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
520 else
521#endif
58964a49
RE
522#ifndef NO_MD5
523 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
d02b48c6
RE
524 else
525#endif
f5d7a031 526#ifndef NO_SHA
d02b48c6
RE
527 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
528 else
58964a49
RE
529 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
530 else
531#endif
f5d7a031 532#ifndef NO_RIPEMD
58964a49
RE
533 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
534 else
535 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
536 else
537 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
538 else
d02b48c6
RE
539#endif
540#ifndef NO_RC4
541 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
542 else
543#endif
f4e723f3 544#ifndef NO_DES
d02b48c6
RE
545 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
546 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
547 else
548#endif
549#ifndef NO_RSA
550#ifdef RSAref
551 if (strcmp(*argv,"rsaref") == 0)
552 {
5270e702 553 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
d02b48c6
RE
554 j--;
555 }
556 else
557#endif
c1cd88a0 558#ifndef RSA_NULL
e170a5c0 559 if (strcmp(*argv,"openssl") == 0)
d02b48c6 560 {
5270e702 561 RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
d02b48c6
RE
562 j--;
563 }
564 else
c1cd88a0 565#endif
d02b48c6
RE
566#endif /* !NO_RSA */
567 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
568 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
569 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
570 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
571 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
572 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
573 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
574 else
575#ifndef NO_RC2
576 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
577 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
578 else
579#endif
58964a49
RE
580#ifndef NO_RC5
581 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
582 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
583 else
584#endif
d02b48c6
RE
585#ifndef NO_IDEA
586 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
587 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
588 else
589#endif
f5d7a031 590#ifndef NO_BF
d02b48c6
RE
591 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
592 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
58964a49
RE
593 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
594 else
595#endif
596#ifndef NO_CAST
597 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
598 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
599 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
d02b48c6
RE
600 else
601#endif
602#ifndef NO_DES
603 if (strcmp(*argv,"des") == 0)
604 {
605 doit[D_CBC_DES]=1;
606 doit[D_EDE3_DES]=1;
607 }
608 else
609#endif
610#ifndef NO_RSA
611 if (strcmp(*argv,"rsa") == 0)
612 {
613 rsa_doit[R_RSA_512]=1;
614 rsa_doit[R_RSA_1024]=1;
615 rsa_doit[R_RSA_2048]=1;
616 rsa_doit[R_RSA_4096]=1;
617 }
618 else
619#endif
620#ifndef NO_DSA
621 if (strcmp(*argv,"dsa") == 0)
622 {
623 dsa_doit[R_DSA_512]=1;
624 dsa_doit[R_DSA_1024]=1;
625 }
626 else
627#endif
628 {
3009458e
RL
629 BIO_printf(bio_err,"Error: bad option or value\n");
630 BIO_printf(bio_err,"\n");
631 BIO_printf(bio_err,"Available values:\n");
632#ifndef NO_MD2
633 BIO_printf(bio_err,"md2 ");
634#endif
635#ifndef NO_MDC2
636 BIO_printf(bio_err,"mdc2 ");
637#endif
638#ifndef NO_MD4
639 BIO_printf(bio_err,"md4 ");
640#endif
641#ifndef NO_MD5
642 BIO_printf(bio_err,"md5 ");
643#ifndef NO_HMAC
644 BIO_printf(bio_err,"hmac ");
645#endif
646#endif
647#ifndef NO_SHA1
648 BIO_printf(bio_err,"sha1 ");
649#endif
650#ifndef NO_RIPEMD160
651 BIO_printf(bio_err,"rmd160");
652#endif
653#if !defined(NO_MD2) || !defined(NO_MDC2) || !defined(NO_MD4) || !defined(NO_MD5) || !defined(NO_SHA1) || !defined(NO_RIPEMD160)
654 BIO_printf(bio_err,"\n");
655#endif
656
d02b48c6
RE
657#ifndef NO_IDEA
658 BIO_printf(bio_err,"idea-cbc ");
659#endif
660#ifndef NO_RC2
661 BIO_printf(bio_err,"rc2-cbc ");
662#endif
58964a49
RE
663#ifndef NO_RC5
664 BIO_printf(bio_err,"rc5-cbc ");
665#endif
f5d7a031 666#ifndef NO_BF
d02b48c6
RE
667 BIO_printf(bio_err,"bf-cbc");
668#endif
3009458e 669#if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_BF) || !defined(NO_RC5)
d02b48c6
RE
670 BIO_printf(bio_err,"\n");
671#endif
3009458e 672
d02b48c6
RE
673 BIO_printf(bio_err,"des-cbc des-ede3 ");
674#ifndef NO_RC4
675 BIO_printf(bio_err,"rc4");
676#endif
3009458e
RL
677 BIO_printf(bio_err,"\n");
678
d02b48c6 679#ifndef NO_RSA
3009458e 680 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
d02b48c6 681#endif
3009458e 682
d02b48c6 683#ifndef NO_DSA
3009458e
RL
684 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
685#endif
686
687#ifndef NO_IDEA
688 BIO_printf(bio_err,"idea ");
689#endif
690#ifndef NO_RC2
691 BIO_printf(bio_err,"rc2 ");
692#endif
693#ifndef NO_DES
694 BIO_printf(bio_err,"des ");
d02b48c6 695#endif
3009458e
RL
696#ifndef NO_RSA
697 BIO_printf(bio_err,"rsa ");
698#endif
699#ifndef NO_BF
700 BIO_printf(bio_err,"blowfish");
701#endif
702#if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_DES) || !defined(NO_RSA) || !defined(NO_BF)
4e74239c 703 BIO_printf(bio_err,"\n");
3009458e
RL
704#endif
705
4e74239c 706 BIO_printf(bio_err,"\n");
3009458e 707 BIO_printf(bio_err,"Available options:\n");
5270e702 708#ifdef TIMES
4e74239c 709 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
3132e196 710#endif
5270e702 711 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
d02b48c6
RE
712 goto end;
713 }
714 argc--;
715 argv++;
716 j++;
717 }
718
719 if (j == 0)
720 {
721 for (i=0; i<ALGOR_NUM; i++)
722 doit[i]=1;
723 for (i=0; i<RSA_NUM; i++)
724 rsa_doit[i]=1;
725 for (i=0; i<DSA_NUM; i++)
726 dsa_doit[i]=1;
727 }
728 for (i=0; i<ALGOR_NUM; i++)
729 if (doit[i]) pr_header++;
730
4e74239c
RL
731 if (usertime == 0)
732 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
733 if (usertime <= 0)
734 {
735 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
736 BIO_printf(bio_err,"program when this computer is idle.\n");
737 }
d02b48c6
RE
738
739#ifndef NO_RSA
740 for (i=0; i<RSA_NUM; i++)
741 {
742 unsigned char *p;
743
744 p=rsa_data[i];
745 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
746 if (rsa_key[i] == NULL)
747 {
748 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
749 goto end;
750 }
58964a49
RE
751#if 0
752 else
753 {
754 BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
755 BN_print(bio_err,rsa_key[i]->e);
756 BIO_printf(bio_err,"\n");
757 }
758#endif
d02b48c6
RE
759 }
760#endif
761
762#ifndef NO_DSA
763 dsa_key[0]=get_dsa512();
764 dsa_key[1]=get_dsa1024();
765 dsa_key[2]=get_dsa2048();
766#endif
767
768#ifndef NO_DES
cddfe788
BM
769 des_set_key_unchecked(&key,sch);
770 des_set_key_unchecked(&key2,sch2);
771 des_set_key_unchecked(&key3,sch3);
d02b48c6
RE
772#endif
773#ifndef NO_IDEA
774 idea_set_encrypt_key(key16,&idea_ks);
775#endif
776#ifndef NO_RC4
777 RC4_set_key(&rc4_ks,16,key16);
778#endif
779#ifndef NO_RC2
780 RC2_set_key(&rc2_ks,16,key16,128);
781#endif
58964a49
RE
782#ifndef NO_RC5
783 RC5_32_set_key(&rc5_ks,16,key16,12);
784#endif
f5d7a031 785#ifndef NO_BF
d02b48c6
RE
786 BF_set_key(&bf_ks,16,key16);
787#endif
58964a49
RE
788#ifndef NO_CAST
789 CAST_set_key(&cast_ks,16,key16);
790#endif
f5d7a031 791#ifndef NO_RSA
d02b48c6 792 memset(rsa_c,0,sizeof(rsa_c));
f5d7a031 793#endif
d02b48c6 794#ifndef SIGALRM
63da21c0 795#ifndef NO_DES
d02b48c6
RE
796 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
797 count=10;
798 do {
799 long i;
800 count*=2;
4e74239c 801 Time_F(START,usertime);
d02b48c6 802 for (i=count; i; i--)
12ba413c
BM
803 des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
804 &(sch[0]),DES_ENCRYPT);
4e74239c 805 d=Time_F(STOP,usertime);
d02b48c6
RE
806 } while (d <3);
807 c[D_MD2][0]=count/10;
808 c[D_MDC2][0]=count/10;
3009458e 809 c[D_MD4][0]=count;
d02b48c6 810 c[D_MD5][0]=count;
58964a49 811 c[D_HMAC][0]=count;
d02b48c6 812 c[D_SHA1][0]=count;
58964a49 813 c[D_RMD160][0]=count;
d02b48c6
RE
814 c[D_RC4][0]=count*5;
815 c[D_CBC_DES][0]=count;
816 c[D_EDE3_DES][0]=count/3;
817 c[D_CBC_IDEA][0]=count;
818 c[D_CBC_RC2][0]=count;
58964a49 819 c[D_CBC_RC5][0]=count;
d02b48c6 820 c[D_CBC_BF][0]=count;
58964a49 821 c[D_CBC_CAST][0]=count;
d02b48c6
RE
822
823 for (i=1; i<SIZE_NUM; i++)
824 {
825 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
826 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
3009458e 827 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
d02b48c6 828 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
58964a49 829 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
d02b48c6 830 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
58964a49 831 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
d02b48c6
RE
832 }
833 for (i=1; i<SIZE_NUM; i++)
834 {
835 long l0,l1;
836
837 l0=(long)lengths[i-1];
838 l1=(long)lengths[i];
839 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
840 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
841 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
842 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
843 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
58964a49 844 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
d02b48c6 845 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
58964a49 846 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
d02b48c6 847 }
f5d7a031 848#ifndef NO_RSA
d02b48c6
RE
849 rsa_c[R_RSA_512][0]=count/2000;
850 rsa_c[R_RSA_512][1]=count/400;
851 for (i=1; i<RSA_NUM; i++)
852 {
853 rsa_c[i][0]=rsa_c[i-1][0]/8;
854 rsa_c[i][1]=rsa_c[i-1][1]/4;
855 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
856 rsa_doit[i]=0;
857 else
858 {
dfeab068 859 if (rsa_c[i][0] == 0)
d02b48c6
RE
860 {
861 rsa_c[i][0]=1;
862 rsa_c[i][1]=20;
863 }
864 }
865 }
f5d7a031 866#endif
d02b48c6
RE
867
868 dsa_c[R_DSA_512][0]=count/1000;
869 dsa_c[R_DSA_512][1]=count/1000/2;
870 for (i=1; i<DSA_NUM; i++)
871 {
872 dsa_c[i][0]=dsa_c[i-1][0]/4;
873 dsa_c[i][1]=dsa_c[i-1][1]/4;
874 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
875 dsa_doit[i]=0;
876 else
877 {
878 if (dsa_c[i] == 0)
879 {
880 dsa_c[i][0]=1;
881 dsa_c[i][1]=1;
882 }
883 }
884 }
885
58964a49 886#define COND(d) (count < (d))
d02b48c6
RE
887#define COUNT(d) (d)
888#else
63da21c0
BM
889/* not worth fixing */
890# error "You cannot disable DES on systems without SIGALRM."
891#endif /* NO_DES */
892#else
d02b48c6
RE
893#define COND(c) (run)
894#define COUNT(d) (count)
895 signal(SIGALRM,sig_done);
63da21c0 896#endif /* SIGALRM */
d02b48c6
RE
897
898#ifndef NO_MD2
899 if (doit[D_MD2])
900 {
901 for (j=0; j<SIZE_NUM; j++)
902 {
903 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
4e74239c 904 Time_F(START,usertime);
d02b48c6
RE
905 for (count=0,run=1; COND(c[D_MD2][j]); count++)
906 MD2(buf,(unsigned long)lengths[j],&(md2[0]));
4e74239c 907 d=Time_F(STOP,usertime);
d02b48c6
RE
908 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
909 count,names[D_MD2],d);
910 results[D_MD2][j]=((double)count)/d*lengths[j];
911 }
912 }
913#endif
914#ifndef NO_MDC2
915 if (doit[D_MDC2])
916 {
917 for (j=0; j<SIZE_NUM; j++)
918 {
919 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
4e74239c 920 Time_F(START,usertime);
d02b48c6
RE
921 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
922 MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
4e74239c 923 d=Time_F(STOP,usertime);
d02b48c6
RE
924 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
925 count,names[D_MDC2],d);
926 results[D_MDC2][j]=((double)count)/d*lengths[j];
927 }
928 }
929#endif
930
3009458e
RL
931#ifndef NO_MD4
932 if (doit[D_MD4])
933 {
934 for (j=0; j<SIZE_NUM; j++)
935 {
936 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
937 Time_F(START,usertime);
938 for (count=0,run=1; COND(c[D_MD4][j]); count++)
939 MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
940 d=Time_F(STOP,usertime);
941 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
942 count,names[D_MD4],d);
943 results[D_MD4][j]=((double)count)/d*lengths[j];
944 }
945 }
946#endif
947
d02b48c6
RE
948#ifndef NO_MD5
949 if (doit[D_MD5])
950 {
951 for (j=0; j<SIZE_NUM; j++)
952 {
953 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
4e74239c 954 Time_F(START,usertime);
d02b48c6 955 for (count=0,run=1; COND(c[D_MD5][j]); count++)
58964a49 956 MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
4e74239c 957 d=Time_F(STOP,usertime);
d02b48c6
RE
958 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
959 count,names[D_MD5],d);
960 results[D_MD5][j]=((double)count)/d*lengths[j];
961 }
962 }
963#endif
964
5271ebd9 965#if !defined(NO_MD5) && !defined(NO_HMAC)
58964a49 966 if (doit[D_HMAC])
d02b48c6 967 {
58964a49
RE
968 HMAC_CTX hctx;
969 HMAC_Init(&hctx,(unsigned char *)"This is a key...",
970 16,EVP_md5());
971
d02b48c6
RE
972 for (j=0; j<SIZE_NUM; j++)
973 {
58964a49 974 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
4e74239c 975 Time_F(START,usertime);
58964a49
RE
976 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
977 {
978 HMAC_Init(&hctx,NULL,0,NULL);
979 HMAC_Update(&hctx,buf,lengths[j]);
980 HMAC_Final(&hctx,&(hmac[0]),NULL);
981 }
4e74239c 982 d=Time_F(STOP,usertime);
d02b48c6 983 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
58964a49
RE
984 count,names[D_HMAC],d);
985 results[D_HMAC][j]=((double)count)/d*lengths[j];
d02b48c6
RE
986 }
987 }
988#endif
f5d7a031 989#ifndef NO_SHA
d02b48c6
RE
990 if (doit[D_SHA1])
991 {
992 for (j=0; j<SIZE_NUM; j++)
993 {
994 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
4e74239c 995 Time_F(START,usertime);
d02b48c6
RE
996 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
997 SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
4e74239c 998 d=Time_F(STOP,usertime);
d02b48c6
RE
999 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1000 count,names[D_SHA1],d);
1001 results[D_SHA1][j]=((double)count)/d*lengths[j];
1002 }
1003 }
1004#endif
f5d7a031 1005#ifndef NO_RIPEMD
58964a49
RE
1006 if (doit[D_RMD160])
1007 {
1008 for (j=0; j<SIZE_NUM; j++)
1009 {
1010 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
4e74239c 1011 Time_F(START,usertime);
58964a49
RE
1012 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
1013 RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
4e74239c 1014 d=Time_F(STOP,usertime);
58964a49
RE
1015 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1016 count,names[D_RMD160],d);
1017 results[D_RMD160][j]=((double)count)/d*lengths[j];
1018 }
1019 }
1020#endif
d02b48c6
RE
1021#ifndef NO_RC4
1022 if (doit[D_RC4])
1023 {
1024 for (j=0; j<SIZE_NUM; j++)
1025 {
1026 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
4e74239c 1027 Time_F(START,usertime);
d02b48c6
RE
1028 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1029 RC4(&rc4_ks,(unsigned int)lengths[j],
1030 buf,buf);
4e74239c 1031 d=Time_F(STOP,usertime);
d02b48c6
RE
1032 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1033 count,names[D_RC4],d);
1034 results[D_RC4][j]=((double)count)/d*lengths[j];
1035 }
1036 }
1037#endif
1038#ifndef NO_DES
1039 if (doit[D_CBC_DES])
1040 {
1041 for (j=0; j<SIZE_NUM; j++)
1042 {
1043 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
4e74239c 1044 Time_F(START,usertime);
d02b48c6 1045 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
4e31df2c 1046 des_ncbc_encrypt(buf,buf,lengths[j],sch,
edf0bfb5 1047 &iv,DES_ENCRYPT);
4e74239c 1048 d=Time_F(STOP,usertime);
d02b48c6
RE
1049 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1050 count,names[D_CBC_DES],d);
1051 results[D_CBC_DES][j]=((double)count)/d*lengths[j];
1052 }
1053 }
1054
1055 if (doit[D_EDE3_DES])
1056 {
1057 for (j=0; j<SIZE_NUM; j++)
1058 {
1059 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
4e74239c 1060 Time_F(START,usertime);
d02b48c6 1061 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
4e31df2c
BL
1062 des_ede3_cbc_encrypt(buf,buf,lengths[j],
1063 sch,sch2,sch3,
edf0bfb5 1064 &iv,DES_ENCRYPT);
4e74239c 1065 d=Time_F(STOP,usertime);
d02b48c6
RE
1066 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1067 count,names[D_EDE3_DES],d);
1068 results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
1069 }
1070 }
1071#endif
1072#ifndef NO_IDEA
1073 if (doit[D_CBC_IDEA])
1074 {
1075 for (j=0; j<SIZE_NUM; j++)
1076 {
1077 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
4e74239c 1078 Time_F(START,usertime);
d02b48c6
RE
1079 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1080 idea_cbc_encrypt(buf,buf,
1081 (unsigned long)lengths[j],&idea_ks,
12ba413c 1082 iv,IDEA_ENCRYPT);
4e74239c 1083 d=Time_F(STOP,usertime);
d02b48c6
RE
1084 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1085 count,names[D_CBC_IDEA],d);
1086 results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
1087 }
1088 }
1089#endif
1090#ifndef NO_RC2
1091 if (doit[D_CBC_RC2])
1092 {
1093 for (j=0; j<SIZE_NUM; j++)
1094 {
1095 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
4e74239c 1096 Time_F(START,usertime);
d02b48c6
RE
1097 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1098 RC2_cbc_encrypt(buf,buf,
1099 (unsigned long)lengths[j],&rc2_ks,
12ba413c 1100 iv,RC2_ENCRYPT);
4e74239c 1101 d=Time_F(STOP,usertime);
d02b48c6
RE
1102 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1103 count,names[D_CBC_RC2],d);
1104 results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
1105 }
1106 }
1107#endif
58964a49
RE
1108#ifndef NO_RC5
1109 if (doit[D_CBC_RC5])
1110 {
1111 for (j=0; j<SIZE_NUM; j++)
1112 {
1113 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
4e74239c 1114 Time_F(START,usertime);
58964a49
RE
1115 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1116 RC5_32_cbc_encrypt(buf,buf,
1117 (unsigned long)lengths[j],&rc5_ks,
12ba413c 1118 iv,RC5_ENCRYPT);
4e74239c 1119 d=Time_F(STOP,usertime);
58964a49
RE
1120 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1121 count,names[D_CBC_RC5],d);
1122 results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
1123 }
1124 }
1125#endif
f5d7a031 1126#ifndef NO_BF
d02b48c6
RE
1127 if (doit[D_CBC_BF])
1128 {
1129 for (j=0; j<SIZE_NUM; j++)
1130 {
1131 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
4e74239c 1132 Time_F(START,usertime);
d02b48c6
RE
1133 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1134 BF_cbc_encrypt(buf,buf,
1135 (unsigned long)lengths[j],&bf_ks,
12ba413c 1136 iv,BF_ENCRYPT);
4e74239c 1137 d=Time_F(STOP,usertime);
d02b48c6
RE
1138 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1139 count,names[D_CBC_BF],d);
1140 results[D_CBC_BF][j]=((double)count)/d*lengths[j];
1141 }
1142 }
1143#endif
58964a49
RE
1144#ifndef NO_CAST
1145 if (doit[D_CBC_CAST])
1146 {
1147 for (j=0; j<SIZE_NUM; j++)
1148 {
1149 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
4e74239c 1150 Time_F(START,usertime);
58964a49
RE
1151 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1152 CAST_cbc_encrypt(buf,buf,
1153 (unsigned long)lengths[j],&cast_ks,
12ba413c 1154 iv,CAST_ENCRYPT);
4e74239c 1155 d=Time_F(STOP,usertime);
58964a49
RE
1156 BIO_printf(bio_err,"%ld %s's in %.2fs\n",
1157 count,names[D_CBC_CAST],d);
1158 results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
1159 }
1160 }
1161#endif
d02b48c6 1162
373b575f 1163 RAND_pseudo_bytes(buf,36);
d02b48c6
RE
1164#ifndef NO_RSA
1165 for (j=0; j<RSA_NUM; j++)
1166 {
c91e1259 1167 int ret;
d02b48c6 1168 if (!rsa_doit[j]) continue;
c91e1259 1169 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
03ea28c9
RL
1170 if (ret == 0)
1171 {
1172 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1173 ERR_print_errors(bio_err);
1174 rsa_count=1;
1175 }
1176 else
d02b48c6 1177 {
03ea28c9
RL
1178 pkey_print_message("private","rsa",
1179 rsa_c[j][0],rsa_bits[j],
1180 RSA_SECONDS);
1181/* RSA_blinding_on(rsa_key[j],NULL); */
1182 Time_F(START,usertime);
1183 for (count=0,run=1; COND(rsa_c[j][0]); count++)
d02b48c6 1184 {
03ea28c9
RL
1185 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1186 &rsa_num, rsa_key[j]);
1187 if (ret == 0)
1188 {
1189 BIO_printf(bio_err,
1190 "RSA sign failure\n");
1191 ERR_print_errors(bio_err);
1192 count=1;
1193 break;
1194 }
d02b48c6 1195 }
03ea28c9
RL
1196 d=Time_F(STOP,usertime);
1197 BIO_printf(bio_err,
1198 "%ld %d bit private RSA's in %.2fs\n",
1199 count,rsa_bits[j],d);
1200 rsa_results[j][0]=d/(double)count;
1201 rsa_count=count;
d02b48c6 1202 }
d02b48c6 1203
58964a49 1204#if 1
c91e1259 1205 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
03ea28c9 1206 if (ret <= 0)
d02b48c6 1207 {
03ea28c9
RL
1208 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1209 ERR_print_errors(bio_err);
1210 dsa_doit[j] = 0;
1211 }
1212 else
1213 {
1214 pkey_print_message("public","rsa",
1215 rsa_c[j][1],rsa_bits[j],
1216 RSA_SECONDS);
1217 Time_F(START,usertime);
1218 for (count=0,run=1; COND(rsa_c[j][1]); count++)
d02b48c6 1219 {
03ea28c9
RL
1220 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1221 rsa_num, rsa_key[j]);
1222 if (ret == 0)
1223 {
1224 BIO_printf(bio_err,
1225 "RSA verify failure\n");
1226 ERR_print_errors(bio_err);
1227 count=1;
1228 break;
1229 }
d02b48c6 1230 }
03ea28c9
RL
1231 d=Time_F(STOP,usertime);
1232 BIO_printf(bio_err,
1233 "%ld %d bit public RSA's in %.2fs\n",
1234 count,rsa_bits[j],d);
1235 rsa_results[j][1]=d/(double)count;
d02b48c6 1236 }
58964a49 1237#endif
d02b48c6
RE
1238
1239 if (rsa_count <= 1)
1240 {
1241 /* if longer than 10s, don't do any more */
1242 for (j++; j<RSA_NUM; j++)
1243 rsa_doit[j]=0;
1244 }
1245 }
1246#endif
1247
373b575f 1248 RAND_pseudo_bytes(buf,20);
d02b48c6 1249#ifndef NO_DSA
99a97051
UM
1250 if (RAND_status() != 1)
1251 {
1252 RAND_seed(rnd_seed, sizeof rnd_seed);
1253 rnd_fake = 1;
1254 }
d02b48c6
RE
1255 for (j=0; j<DSA_NUM; j++)
1256 {
58964a49 1257 unsigned int kk;
03ea28c9 1258 int ret;
58964a49 1259
d02b48c6
RE
1260 if (!dsa_doit[j]) continue;
1261 DSA_generate_key(dsa_key[j]);
1262/* DSA_sign_setup(dsa_key[j],NULL); */
03ea28c9 1263 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1264 &kk,dsa_key[j]);
03ea28c9
RL
1265 if (ret == 0)
1266 {
1267 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1268 ERR_print_errors(bio_err);
1269 rsa_count=1;
1270 }
1271 else
d02b48c6 1272 {
03ea28c9
RL
1273 pkey_print_message("sign","dsa",
1274 dsa_c[j][0],dsa_bits[j],
1275 DSA_SECONDS);
1276 Time_F(START,usertime);
1277 for (count=0,run=1; COND(dsa_c[j][0]); count++)
d02b48c6 1278 {
03ea28c9
RL
1279 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1280 &kk,dsa_key[j]);
1281 if (ret == 0)
1282 {
1283 BIO_printf(bio_err,
1284 "DSA sign 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,"%ld %d bit DSA signs in %.2fs\n",
1292 count,dsa_bits[j],d);
1293 dsa_results[j][0]=d/(double)count;
1294 rsa_count=count;
d02b48c6 1295 }
d02b48c6 1296
03ea28c9 1297 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1298 kk,dsa_key[j]);
03ea28c9
RL
1299 if (ret <= 0)
1300 {
1301 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1302 ERR_print_errors(bio_err);
1303 dsa_doit[j] = 0;
1304 }
1305 else
d02b48c6 1306 {
03ea28c9
RL
1307 pkey_print_message("verify","dsa",
1308 dsa_c[j][1],dsa_bits[j],
1309 DSA_SECONDS);
1310 Time_F(START,usertime);
1311 for (count=0,run=1; COND(dsa_c[j][1]); count++)
d02b48c6 1312 {
03ea28c9
RL
1313 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1314 kk,dsa_key[j]);
1315 if (ret <= 0)
1316 {
1317 BIO_printf(bio_err,
1318 "DSA verify failure\n");
1319 ERR_print_errors(bio_err);
1320 count=1;
1321 break;
1322 }
d02b48c6 1323 }
03ea28c9
RL
1324 d=Time_F(STOP,usertime);
1325 BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
1326 count,dsa_bits[j],d);
1327 dsa_results[j][1]=d/(double)count;
d02b48c6 1328 }
d02b48c6
RE
1329
1330 if (rsa_count <= 1)
1331 {
1332 /* if longer than 10s, don't do any more */
1333 for (j++; j<DSA_NUM; j++)
1334 dsa_doit[j]=0;
1335 }
1336 }
99a97051 1337 if (rnd_fake) RAND_cleanup();
d02b48c6
RE
1338#endif
1339
1340 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
1341 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
1342 printf("options:");
1343 printf("%s ",BN_options());
1344#ifndef NO_MD2
1345 printf("%s ",MD2_options());
1346#endif
1347#ifndef NO_RC4
1348 printf("%s ",RC4_options());
1349#endif
1350#ifndef NO_DES
1351 printf("%s ",des_options());
1352#endif
1353#ifndef NO_IDEA
1354 printf("%s ",idea_options());
1355#endif
f5d7a031 1356#ifndef NO_BF
d02b48c6
RE
1357 printf("%s ",BF_options());
1358#endif
58964a49 1359 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
d02b48c6
RE
1360
1361 if (pr_header)
1362 {
1363 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1364 fprintf(stdout,"type ");
1365 for (j=0; j<SIZE_NUM; j++)
1366 fprintf(stdout,"%7d bytes",lengths[j]);
1367 fprintf(stdout,"\n");
1368 }
1369
1370 for (k=0; k<ALGOR_NUM; k++)
1371 {
1372 if (!doit[k]) continue;
58964a49 1373 fprintf(stdout,"%-13s",names[k]);
d02b48c6
RE
1374 for (j=0; j<SIZE_NUM; j++)
1375 {
1376 if (results[k][j] > 10000)
1377 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1378 else
1379 fprintf(stdout," %11.2f ",results[k][j]);
1380 }
1381 fprintf(stdout,"\n");
1382 }
1383#ifndef NO_RSA
1384 j=1;
1385 for (k=0; k<RSA_NUM; k++)
1386 {
1387 if (!rsa_doit[k]) continue;
58964a49
RE
1388 if (j)
1389 {
1390 printf("%18ssign verify sign/s verify/s\n"," ");
1391 j=0;
1392 }
d58d092b 1393 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
58964a49
RE
1394 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1395 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
d02b48c6
RE
1396 fprintf(stdout,"\n");
1397 }
1398#endif
1399#ifndef NO_DSA
1400 j=1;
1401 for (k=0; k<DSA_NUM; k++)
1402 {
1403 if (!dsa_doit[k]) continue;
58964a49
RE
1404 if (j) {
1405 printf("%18ssign verify sign/s verify/s\n"," ");
1406 j=0;
1407 }
d58d092b 1408 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
58964a49
RE
1409 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1410 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
d02b48c6
RE
1411 fprintf(stdout,"\n");
1412 }
1413#endif
18c77bf2 1414 mret=0;
d02b48c6 1415end:
5270e702 1416 ERR_print_errors(bio_err);
26a3a48d
RL
1417 if (buf != NULL) OPENSSL_free(buf);
1418 if (buf2 != NULL) OPENSSL_free(buf2);
d02b48c6
RE
1419#ifndef NO_RSA
1420 for (i=0; i<RSA_NUM; i++)
1421 if (rsa_key[i] != NULL)
1422 RSA_free(rsa_key[i]);
1423#endif
1424#ifndef NO_DSA
1425 for (i=0; i<DSA_NUM; i++)
1426 if (dsa_key[i] != NULL)
1427 DSA_free(dsa_key[i]);
1428#endif
18c77bf2 1429 EXIT(mret);
d02b48c6
RE
1430 }
1431
6b691a5c 1432static void print_message(char *s, long num, int length)
d02b48c6
RE
1433 {
1434#ifdef SIGALRM
1435 BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
d58d092b 1436 (void)BIO_flush(bio_err);
d02b48c6
RE
1437 alarm(SECONDS);
1438#else
1439 BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
d58d092b 1440 (void)BIO_flush(bio_err);
d02b48c6
RE
1441#endif
1442#ifdef LINT
1443 num=num;
1444#endif
1445 }
1446
6b691a5c
UM
1447static void pkey_print_message(char *str, char *str2, long num, int bits,
1448 int tm)
d02b48c6
RE
1449 {
1450#ifdef SIGALRM
1451 BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
d58d092b 1452 (void)BIO_flush(bio_err);
d02b48c6
RE
1453 alarm(RSA_SECONDS);
1454#else
1455 BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
d58d092b 1456 (void)BIO_flush(bio_err);
d02b48c6
RE
1457#endif
1458#ifdef LINT
1459 num=num;
1460#endif
1461 }
58964a49 1462