]> git.ipfire.org Git - thirdparty/openssl.git/blame - apps/speed.c
fix #include position
[thirdparty/openssl.git] / apps / speed.c
CommitLineData
7876e448 1/* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
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>
f559f31b 86#if !defined(OPENSSL_SYS_MSDOS)
a4a8f7b3 87#include OPENSSL_UNISTD
f559f31b 88#endif
d02b48c6 89
c3bdbcf6 90#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
2bfb4dbc 91# define USE_TOD
3e83e686 92#elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
2bfb4dbc 93# define TIMES
d02b48c6 94#endif
3e83e686 95#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) && !defined(OPENSSL_SYS_VXWORKS) /* FIXME */
3132e196
RL
96# define TIMEB
97#endif
d02b48c6 98
d02b48c6 99#ifndef _IRIX
2bfb4dbc 100# include <time.h>
d02b48c6
RE
101#endif
102#ifdef TIMES
2bfb4dbc
BL
103# include <sys/types.h>
104# include <sys/times.h>
105#endif
106#ifdef USE_TOD
107# include <sys/time.h>
108# include <sys/resource.h>
d02b48c6 109#endif
7d7d2cbc
UM
110
111/* Depending on the VMS version, the tms structure is perhaps defined.
112 The __TMS macro will show if it was. If it wasn't defined, we should
113 undefine TIMES, since that tells the rest of the program how things
114 should be handled. -- Richard Levitte */
bc36ee62 115#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
7d7d2cbc 116#undef TIMES
d02b48c6 117#endif
7d7d2cbc 118
3132e196 119#ifdef TIMEB
d02b48c6 120#include <sys/timeb.h>
3132e196
RL
121#endif
122
3e83e686 123#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
3132e196
RL
124#error "It seems neither struct tms nor struct timeb is supported in this platform!"
125#endif
d02b48c6 126
dfeab068
RE
127#if defined(sun) || defined(__ultrix)
128#define _POSIX_SOURCE
d02b48c6
RE
129#include <limits.h>
130#include <sys/param.h>
131#endif
132
cf1b7d96 133#ifndef OPENSSL_NO_DES
c2e4f17c 134#include <openssl/des_old.h>
d02b48c6 135#endif
ba1b8883
RL
136#ifndef OPENSSL_NO_AES
137#include <openssl/aes.h>
138#endif
cf1b7d96 139#ifndef OPENSSL_NO_MD2
ec577822 140#include <openssl/md2.h>
d02b48c6 141#endif
cf1b7d96 142#ifndef OPENSSL_NO_MDC2
ec577822 143#include <openssl/mdc2.h>
d02b48c6 144#endif
cf1b7d96 145#ifndef OPENSSL_NO_MD4
3009458e
RL
146#include <openssl/md4.h>
147#endif
cf1b7d96 148#ifndef OPENSSL_NO_MD5
ec577822 149#include <openssl/md5.h>
5271ebd9 150#endif
cf1b7d96 151#ifndef OPENSSL_NO_HMAC
ec577822 152#include <openssl/hmac.h>
d02b48c6 153#endif
5271ebd9 154#include <openssl/evp.h>
cf1b7d96 155#ifndef OPENSSL_NO_SHA
ec577822 156#include <openssl/sha.h>
d02b48c6 157#endif
cf1b7d96 158#ifndef OPENSSL_NO_RIPEMD
ec577822 159#include <openssl/ripemd.h>
58964a49 160#endif
cf1b7d96 161#ifndef OPENSSL_NO_RC4
ec577822 162#include <openssl/rc4.h>
d02b48c6 163#endif
cf1b7d96 164#ifndef OPENSSL_NO_RC5
ec577822 165#include <openssl/rc5.h>
58964a49 166#endif
cf1b7d96 167#ifndef OPENSSL_NO_RC2
ec577822 168#include <openssl/rc2.h>
d02b48c6 169#endif
cf1b7d96 170#ifndef OPENSSL_NO_IDEA
ec577822 171#include <openssl/idea.h>
d02b48c6 172#endif
cf1b7d96 173#ifndef OPENSSL_NO_BF
ec577822 174#include <openssl/blowfish.h>
d02b48c6 175#endif
cf1b7d96 176#ifndef OPENSSL_NO_CAST
ec577822 177#include <openssl/cast.h>
58964a49 178#endif
cf1b7d96 179#ifndef OPENSSL_NO_RSA
ec577822 180#include <openssl/rsa.h>
f5d7a031 181#include "./testrsa.h"
d02b48c6 182#endif
ec577822 183#include <openssl/x509.h>
cf1b7d96 184#ifndef OPENSSL_NO_DSA
d02b48c6
RE
185#include "./testdsa.h"
186#endif
187
188/* The following if from times(3) man page. It may need to be changed */
189#ifndef HZ
a4a8f7b3
RL
190# ifdef _SC_CLK_TCK
191# define HZ ((double)sysconf(_SC_CLK_TCK))
192# else
193# ifndef CLK_TCK
194# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
195# define HZ 100.0
196# else /* _BSD_CLK_TCK_ */
197# define HZ ((double)_BSD_CLK_TCK_)
198# endif
199# else /* CLK_TCK */
7876e448
RL
200# define HZ ((double)CLK_TCK)
201# endif
d02b48c6
RE
202# endif
203#endif
204
66d3e748
RL
205#if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
206# define HAVE_FORK 1
207#endif
208
d02b48c6 209#undef BUFSIZE
58964a49 210#define BUFSIZE ((long)1024*8+1)
d02b48c6
RE
211int run=0;
212
7876e448 213static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
0e211563
BL
214static int mr=0;
215static int usertime=1;
7876e448 216
0e211563 217static double Time_F(int s);
646d5695 218static void print_message(const char *s,long num,int length);
d02b48c6 219static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
0e211563 220static void print_result(int alg,int run_no,int count,double time_used);
66d3e748 221#ifdef HAVE_FORK
0e211563 222static int do_multi(int multi);
66d3e748 223#endif
d02b48c6 224
ba1b8883 225#define ALGOR_NUM 19
0e211563
BL
226#define SIZE_NUM 5
227#define RSA_NUM 4
228#define DSA_NUM 3
229static const char *names[ALGOR_NUM]={
230 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
231 "des cbc","des ede3","idea cbc",
ba1b8883
RL
232 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
233 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
0e211563 234static double results[ALGOR_NUM][SIZE_NUM];
ba1b8883 235static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
0e211563
BL
236static double rsa_results[RSA_NUM][2];
237static double dsa_results[DSA_NUM][2];
238
b83eddc5
DSH
239#ifdef SIGALRM
240#if defined(__STDC__) || defined(sgi) || defined(_AIX)
241#define SIGRETTYPE void
242#else
243#define SIGRETTYPE int
244#endif
245
d02b48c6 246static SIGRETTYPE sig_done(int sig);
6b691a5c 247static SIGRETTYPE sig_done(int sig)
d02b48c6
RE
248 {
249 signal(SIGALRM,sig_done);
250 run=0;
251#ifdef LINT
252 sig=sig;
253#endif
254 }
255#endif
256
257#define START 0
258#define STOP 1
259
0e211563 260static double Time_F(int s)
d02b48c6
RE
261 {
262 double ret;
2bfb4dbc
BL
263
264#ifdef USE_TOD
265 if(usertime)
266 {
267 static struct rusage tstart,tend;
268
7876e448 269 getrusage_used = 1;
2bfb4dbc
BL
270 if (s == START)
271 {
272 getrusage(RUSAGE_SELF,&tstart);
273 return(0);
274 }
275 else
276 {
277 long i;
278
279 getrusage(RUSAGE_SELF,&tend);
280 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
281 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
282 +((double)i)/1000000.0;
283 return((ret < 0.001)?0.001:ret);
284 }
285 }
286 else
287 {
288 static struct timeval tstart,tend;
289 long i;
290
7876e448 291 gettimeofday_used = 1;
2bfb4dbc
BL
292 if (s == START)
293 {
294 gettimeofday(&tstart,NULL);
295 return(0);
296 }
297 else
298 {
299 gettimeofday(&tend,NULL);
300 i=(long)tend.tv_usec-(long)tstart.tv_usec;
301 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
302 return((ret < 0.001)?0.001:ret);
303 }
304 }
305#else /* ndef USE_TOD */
306
307# ifdef TIMES
4e74239c 308 if (usertime)
d02b48c6 309 {
4e74239c 310 static struct tms tstart,tend;
d02b48c6 311
7876e448 312 times_used = 1;
4e74239c
RL
313 if (s == START)
314 {
315 times(&tstart);
316 return(0);
317 }
318 else
319 {
320 times(&tend);
321 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
322 return((ret < 1e-3)?1e-3:ret);
323 }
d02b48c6 324 }
2bfb4dbc 325# endif /* times() */
3132e196
RL
326# if defined(TIMES) && defined(TIMEB)
327 else
328# endif
3e83e686
RL
329# ifdef OPENSSL_SYS_VXWORKS
330 {
331 static unsigned long tick_start, tick_end;
332
333 if( s == START )
334 {
335 tick_start = tickGet();
336 return 0;
337 }
338 else
339 {
340 tick_end = tickGet();
341 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
342 return((ret < 0.001)?0.001:ret);
343 }
344 }
345# elif defined(TIMEB)
d02b48c6 346 {
4e74239c
RL
347 static struct timeb tstart,tend;
348 long i;
349
7876e448 350 ftime_used = 1;
4e74239c
RL
351 if (s == START)
352 {
353 ftime(&tstart);
354 return(0);
355 }
356 else
357 {
358 ftime(&tend);
359 i=(long)tend.millitm-(long)tstart.millitm;
360 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
361 return((ret < 0.001)?0.001:ret);
362 }
d02b48c6 363 }
3132e196 364# endif
2bfb4dbc 365#endif
d02b48c6
RE
366 }
367
667ac4ec
RE
368int MAIN(int, char **);
369
6b691a5c 370int MAIN(int argc, char **argv)
d02b48c6 371 {
1199e2d8 372 ENGINE *e = NULL;
d02b48c6 373 unsigned char *buf=NULL,*buf2=NULL;
18c77bf2 374 int mret=1;
690ecff7 375 long count=0,save_count=0, rsa_count;
18c77bf2 376 int i,j,k;
cf1b7d96 377#ifndef OPENSSL_NO_RSA
5614bb91 378 unsigned rsa_num;
b2293b1e 379#endif
83c40e7f 380 unsigned char md[EVP_MAX_MD_SIZE];
cf1b7d96 381#ifndef OPENSSL_NO_MD2
d02b48c6
RE
382 unsigned char md2[MD2_DIGEST_LENGTH];
383#endif
cf1b7d96 384#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
385 unsigned char mdc2[MDC2_DIGEST_LENGTH];
386#endif
cf1b7d96 387#ifndef OPENSSL_NO_MD4
3009458e
RL
388 unsigned char md4[MD4_DIGEST_LENGTH];
389#endif
cf1b7d96 390#ifndef OPENSSL_NO_MD5
d02b48c6 391 unsigned char md5[MD5_DIGEST_LENGTH];
58964a49 392 unsigned char hmac[MD5_DIGEST_LENGTH];
d02b48c6 393#endif
cf1b7d96 394#ifndef OPENSSL_NO_SHA
d02b48c6
RE
395 unsigned char sha[SHA_DIGEST_LENGTH];
396#endif
cf1b7d96 397#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
398 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
399#endif
cf1b7d96 400#ifndef OPENSSL_NO_RC4
d02b48c6
RE
401 RC4_KEY rc4_ks;
402#endif
cf1b7d96 403#ifndef OPENSSL_NO_RC5
58964a49
RE
404 RC5_32_KEY rc5_ks;
405#endif
cf1b7d96 406#ifndef OPENSSL_NO_RC2
d02b48c6
RE
407 RC2_KEY rc2_ks;
408#endif
cf1b7d96 409#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
410 IDEA_KEY_SCHEDULE idea_ks;
411#endif
cf1b7d96 412#ifndef OPENSSL_NO_BF
d02b48c6 413 BF_KEY bf_ks;
58964a49 414#endif
cf1b7d96 415#ifndef OPENSSL_NO_CAST
58964a49 416 CAST_KEY cast_ks;
d02b48c6 417#endif
ba1b8883 418 static const unsigned char key16[16]=
d02b48c6
RE
419 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
420 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
ba1b8883
RL
421 static const unsigned char key24[24]=
422 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
423 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
424 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
425 static const unsigned char key32[32]=
426 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
427 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
428 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
429 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
430#ifndef OPENSSL_NO_AES
431#define MAX_BLOCK_SIZE 128
432#else
433#define MAX_BLOCK_SIZE 64
434#endif
435 unsigned char DES_iv[8];
436 unsigned char iv[MAX_BLOCK_SIZE/8];
cf1b7d96 437#ifndef OPENSSL_NO_DES
c2e4f17c 438 DES_cblock *buf_as_des_cblock = NULL;
d02b48c6
RE
439 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
440 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
441 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
c2e4f17c
RL
442 DES_key_schedule sch;
443 DES_key_schedule sch2;
444 DES_key_schedule sch3;
d02b48c6 445#endif
ba1b8883
RL
446#ifndef OPENSSL_NO_AES
447 AES_KEY aes_ks1, aes_ks2, aes_ks3;
448#endif
d02b48c6
RE
449#define D_MD2 0
450#define D_MDC2 1
3009458e
RL
451#define D_MD4 2
452#define D_MD5 3
453#define D_HMAC 4
454#define D_SHA1 5
455#define D_RMD160 6
456#define D_RC4 7
457#define D_CBC_DES 8
458#define D_EDE3_DES 9
459#define D_CBC_IDEA 10
460#define D_CBC_RC2 11
461#define D_CBC_RC5 12
462#define D_CBC_BF 13
463#define D_CBC_CAST 14
ba1b8883
RL
464#define D_CBC_128_AES 15
465#define D_CBC_192_AES 16
466#define D_CBC_256_AES 17
467#define D_EVP 18
468 double d=0.0;
d02b48c6 469 long c[ALGOR_NUM][SIZE_NUM];
d02b48c6
RE
470#define R_DSA_512 0
471#define R_DSA_1024 1
472#define R_DSA_2048 2
473#define R_RSA_512 0
474#define R_RSA_1024 1
475#define R_RSA_2048 2
476#define R_RSA_4096 3
cf1b7d96 477#ifndef OPENSSL_NO_RSA
d02b48c6 478 RSA *rsa_key[RSA_NUM];
d02b48c6 479 long rsa_c[RSA_NUM][2];
d02b48c6 480 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
d02b48c6
RE
481 static unsigned char *rsa_data[RSA_NUM]=
482 {test512,test1024,test2048,test4096};
483 static int rsa_data_length[RSA_NUM]={
484 sizeof(test512),sizeof(test1024),
485 sizeof(test2048),sizeof(test4096)};
58964a49 486#endif
cf1b7d96 487#ifndef OPENSSL_NO_DSA
58964a49
RE
488 DSA *dsa_key[DSA_NUM];
489 long dsa_c[DSA_NUM][2];
58964a49
RE
490 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
491#endif
d02b48c6
RE
492 int rsa_doit[RSA_NUM];
493 int dsa_doit[DSA_NUM];
58964a49 494 int doit[ALGOR_NUM];
d02b48c6 495 int pr_header=0;
83c40e7f
RL
496 const EVP_CIPHER *evp_cipher=NULL;
497 const EVP_MD *evp_md=NULL;
3f37e73b 498 int decrypt=0;
66d3e748 499#ifdef HAVE_FORK
0e211563 500 int multi=0;
66d3e748 501#endif
4e74239c
RL
502
503#ifndef TIMES
504 usertime=-1;
505#endif
d02b48c6
RE
506
507 apps_startup();
396f6314 508 memset(results, 0, sizeof(results));
cf1b7d96 509#ifndef OPENSSL_NO_DSA
dfeab068
RE
510 memset(dsa_key,0,sizeof(dsa_key));
511#endif
d02b48c6
RE
512
513 if (bio_err == NULL)
514 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
58964a49 515 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
d02b48c6 516
3647bee2
DSH
517 if (!load_config(bio_err, NULL))
518 goto end;
519
cf1b7d96 520#ifndef OPENSSL_NO_RSA
dfeab068 521 memset(rsa_key,0,sizeof(rsa_key));
d02b48c6
RE
522 for (i=0; i<RSA_NUM; i++)
523 rsa_key[i]=NULL;
dfeab068 524#endif
d02b48c6 525
26a3a48d 526 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
527 {
528 BIO_printf(bio_err,"out of memory\n");
529 goto end;
530 }
cf1b7d96 531#ifndef OPENSSL_NO_DES
12ba413c 532 buf_as_des_cblock = (des_cblock *)buf;
5676d8cb 533#endif
26a3a48d 534 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
535 {
536 BIO_printf(bio_err,"out of memory\n");
537 goto end;
538 }
539
540 memset(c,0,sizeof(c));
ba1b8883 541 memset(DES_iv,0,sizeof(DES_iv));
d02b48c6
RE
542 memset(iv,0,sizeof(iv));
543
544 for (i=0; i<ALGOR_NUM; i++)
545 doit[i]=0;
546 for (i=0; i<RSA_NUM; i++)
547 rsa_doit[i]=0;
548 for (i=0; i<DSA_NUM; i++)
549 dsa_doit[i]=0;
550
551 j=0;
552 argc--;
553 argv++;
554 while (argc)
555 {
4e74239c 556 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
7876e448 557 {
4e74239c 558 usertime = 0;
7876e448
RL
559 j--; /* Otherwise, -elapsed gets confused with
560 an algorithm. */
561 }
646d5695
BL
562 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
563 {
564 argc--;
565 argv++;
566 if(argc == 0)
567 {
568 BIO_printf(bio_err,"no EVP given\n");
569 goto end;
570 }
83c40e7f
RL
571 evp_cipher=EVP_get_cipherbyname(*argv);
572 if(!evp_cipher)
646d5695 573 {
83c40e7f
RL
574 evp_md=EVP_get_digestbyname(*argv);
575 }
576 if(!evp_cipher && !evp_md)
577 {
578 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
646d5695
BL
579 goto end;
580 }
581 doit[D_EVP]=1;
582 }
7876e448
RL
583 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
584 {
3f37e73b 585 decrypt=1;
7876e448
RL
586 j--; /* Otherwise, -elapsed gets confused with
587 an algorithm. */
588 }
589 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
5270e702
RL
590 {
591 argc--;
592 argv++;
593 if(argc == 0)
594 {
595 BIO_printf(bio_err,"no engine given\n");
596 goto end;
597 }
531d630b
RL
598 e = setup_engine(bio_err, *argv, 0);
599 /* j will be increased again further down. We just
5270e702
RL
600 don't want speed to confuse an engine with an
601 algorithm, especially when none is given (which
602 means all of them should be run) */
603 j--;
604 }
66d3e748 605#ifdef HAVE_FORK
0e211563
BL
606 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
607 {
608 argc--;
609 argv++;
610 if(argc == 0)
611 {
612 BIO_printf(bio_err,"no multi count given\n");
613 goto end;
614 }
615 multi=atoi(argv[0]);
616 if(multi <= 0)
617 {
618 BIO_printf(bio_err,"bad multi count\n");
619 goto end;
620 }
66d3e748
RL
621 j--; /* Otherwise, -mr gets confused with
622 an algorithm. */
0e211563 623 }
66d3e748 624#endif
0e211563
BL
625 else if (argc > 0 && !strcmp(*argv,"-mr"))
626 {
627 mr=1;
628 j--; /* Otherwise, -mr gets confused with
629 an algorithm. */
630 }
5270e702 631 else
cf1b7d96 632#ifndef OPENSSL_NO_MD2
d02b48c6
RE
633 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
634 else
635#endif
cf1b7d96 636#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
637 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
638 else
639#endif
cf1b7d96 640#ifndef OPENSSL_NO_MD4
3009458e
RL
641 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
642 else
643#endif
cf1b7d96 644#ifndef OPENSSL_NO_MD5
d02b48c6
RE
645 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
646 else
647#endif
cf1b7d96 648#ifndef OPENSSL_NO_MD5
58964a49 649 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
d02b48c6
RE
650 else
651#endif
cf1b7d96 652#ifndef OPENSSL_NO_SHA
d02b48c6
RE
653 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
654 else
58964a49
RE
655 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
656 else
657#endif
cf1b7d96 658#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
659 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
660 else
661 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
662 else
663 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
664 else
d02b48c6 665#endif
cf1b7d96 666#ifndef OPENSSL_NO_RC4
d02b48c6
RE
667 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
668 else
669#endif
cf1b7d96 670#ifndef OPENSSL_NO_DES
d02b48c6
RE
671 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
672 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
673 else
674#endif
ba1b8883
RL
675#ifndef OPENSSL_NO_AES
676 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
677 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
678 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
679 else
680#endif
cf1b7d96 681#ifndef OPENSSL_NO_RSA
ccb9643f 682#if 0 /* was: #ifdef RSAref */
d02b48c6
RE
683 if (strcmp(*argv,"rsaref") == 0)
684 {
5270e702 685 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
d02b48c6
RE
686 j--;
687 }
688 else
689#endif
c1cd88a0 690#ifndef RSA_NULL
e170a5c0 691 if (strcmp(*argv,"openssl") == 0)
d02b48c6 692 {
6dc5d570 693 RSA_set_default_method(RSA_PKCS1_SSLeay());
d02b48c6
RE
694 j--;
695 }
696 else
c1cd88a0 697#endif
cf1b7d96 698#endif /* !OPENSSL_NO_RSA */
d02b48c6
RE
699 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
700 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
701 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
702 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
703 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
704 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
705 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
706 else
cf1b7d96 707#ifndef OPENSSL_NO_RC2
d02b48c6
RE
708 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
709 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
710 else
711#endif
cf1b7d96 712#ifndef OPENSSL_NO_RC5
58964a49
RE
713 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
714 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
715 else
716#endif
cf1b7d96 717#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
718 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
719 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
720 else
721#endif
cf1b7d96 722#ifndef OPENSSL_NO_BF
d02b48c6
RE
723 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
724 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
58964a49
RE
725 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
726 else
727#endif
cf1b7d96 728#ifndef OPENSSL_NO_CAST
58964a49
RE
729 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
730 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
731 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
d02b48c6
RE
732 else
733#endif
cf1b7d96 734#ifndef OPENSSL_NO_DES
d02b48c6
RE
735 if (strcmp(*argv,"des") == 0)
736 {
737 doit[D_CBC_DES]=1;
738 doit[D_EDE3_DES]=1;
739 }
740 else
741#endif
ba1b8883
RL
742#ifndef OPENSSL_NO_AES
743 if (strcmp(*argv,"aes") == 0)
744 {
745 doit[D_CBC_128_AES]=1;
746 doit[D_CBC_192_AES]=1;
747 doit[D_CBC_256_AES]=1;
748 }
749 else
750#endif
cf1b7d96 751#ifndef OPENSSL_NO_RSA
d02b48c6
RE
752 if (strcmp(*argv,"rsa") == 0)
753 {
754 rsa_doit[R_RSA_512]=1;
755 rsa_doit[R_RSA_1024]=1;
756 rsa_doit[R_RSA_2048]=1;
757 rsa_doit[R_RSA_4096]=1;
758 }
759 else
760#endif
cf1b7d96 761#ifndef OPENSSL_NO_DSA
d02b48c6
RE
762 if (strcmp(*argv,"dsa") == 0)
763 {
764 dsa_doit[R_DSA_512]=1;
765 dsa_doit[R_DSA_1024]=1;
766 }
767 else
768#endif
769 {
3009458e
RL
770 BIO_printf(bio_err,"Error: bad option or value\n");
771 BIO_printf(bio_err,"\n");
772 BIO_printf(bio_err,"Available values:\n");
cf1b7d96 773#ifndef OPENSSL_NO_MD2
3009458e
RL
774 BIO_printf(bio_err,"md2 ");
775#endif
cf1b7d96 776#ifndef OPENSSL_NO_MDC2
3009458e
RL
777 BIO_printf(bio_err,"mdc2 ");
778#endif
cf1b7d96 779#ifndef OPENSSL_NO_MD4
3009458e
RL
780 BIO_printf(bio_err,"md4 ");
781#endif
cf1b7d96 782#ifndef OPENSSL_NO_MD5
3009458e 783 BIO_printf(bio_err,"md5 ");
cf1b7d96 784#ifndef OPENSSL_NO_HMAC
3009458e
RL
785 BIO_printf(bio_err,"hmac ");
786#endif
787#endif
cf1b7d96 788#ifndef OPENSSL_NO_SHA1
3009458e
RL
789 BIO_printf(bio_err,"sha1 ");
790#endif
cf1b7d96 791#ifndef OPENSSL_NO_RIPEMD160
3009458e
RL
792 BIO_printf(bio_err,"rmd160");
793#endif
cf1b7d96
RL
794#if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
795 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
796 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
3009458e
RL
797 BIO_printf(bio_err,"\n");
798#endif
799
cf1b7d96 800#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
801 BIO_printf(bio_err,"idea-cbc ");
802#endif
cf1b7d96 803#ifndef OPENSSL_NO_RC2
d02b48c6
RE
804 BIO_printf(bio_err,"rc2-cbc ");
805#endif
cf1b7d96 806#ifndef OPENSSL_NO_RC5
58964a49
RE
807 BIO_printf(bio_err,"rc5-cbc ");
808#endif
cf1b7d96 809#ifndef OPENSSL_NO_BF
d02b48c6
RE
810 BIO_printf(bio_err,"bf-cbc");
811#endif
cf1b7d96
RL
812#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
813 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
d02b48c6
RE
814 BIO_printf(bio_err,"\n");
815#endif
ba1b8883 816#ifndef OPENSSL_NO_DES
d02b48c6 817 BIO_printf(bio_err,"des-cbc des-ede3 ");
ba1b8883
RL
818#endif
819#ifndef OPENSSL_NO_AES
820 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
821#endif
cf1b7d96 822#ifndef OPENSSL_NO_RC4
d02b48c6
RE
823 BIO_printf(bio_err,"rc4");
824#endif
3009458e
RL
825 BIO_printf(bio_err,"\n");
826
cf1b7d96 827#ifndef OPENSSL_NO_RSA
3009458e 828 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
d02b48c6 829#endif
3009458e 830
cf1b7d96 831#ifndef OPENSSL_NO_DSA
3009458e
RL
832 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
833#endif
834
cf1b7d96 835#ifndef OPENSSL_NO_IDEA
3009458e
RL
836 BIO_printf(bio_err,"idea ");
837#endif
cf1b7d96 838#ifndef OPENSSL_NO_RC2
3009458e
RL
839 BIO_printf(bio_err,"rc2 ");
840#endif
cf1b7d96 841#ifndef OPENSSL_NO_DES
3009458e 842 BIO_printf(bio_err,"des ");
d02b48c6 843#endif
ba1b8883
RL
844#ifndef OPENSSL_NO_AES
845 BIO_printf(bio_err,"aes ");
846#endif
cf1b7d96 847#ifndef OPENSSL_NO_RSA
3009458e
RL
848 BIO_printf(bio_err,"rsa ");
849#endif
cf1b7d96 850#ifndef OPENSSL_NO_BF
3009458e
RL
851 BIO_printf(bio_err,"blowfish");
852#endif
cf1b7d96
RL
853#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
854 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
ba1b8883 855 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
4e74239c 856 BIO_printf(bio_err,"\n");
3009458e
RL
857#endif
858
4e74239c 859 BIO_printf(bio_err,"\n");
3009458e 860 BIO_printf(bio_err,"Available options:\n");
5270e702 861#ifdef TIMES
4e74239c 862 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
3132e196 863#endif
5270e702 864 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
0e211563
BL
865 BIO_printf(bio_err,"-evp e use EVP e.\n");
866 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
867 BIO_printf(bio_err,"-mr produce machine readable output.\n");
66d3e748 868#ifdef HAVE_FORK
0e211563 869 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
66d3e748 870#endif
d02b48c6
RE
871 goto end;
872 }
873 argc--;
874 argv++;
875 j++;
876 }
877
66d3e748 878#ifdef HAVE_FORK
0e211563
BL
879 if(multi && do_multi(multi))
880 goto show_res;
66d3e748 881#endif
0e211563 882
d02b48c6
RE
883 if (j == 0)
884 {
885 for (i=0; i<ALGOR_NUM; i++)
53d28679
BM
886 {
887 if (i != D_EVP)
888 doit[i]=1;
889 }
d02b48c6
RE
890 for (i=0; i<RSA_NUM; i++)
891 rsa_doit[i]=1;
892 for (i=0; i<DSA_NUM; i++)
893 dsa_doit[i]=1;
894 }
895 for (i=0; i<ALGOR_NUM; i++)
896 if (doit[i]) pr_header++;
897
0e211563 898 if (usertime == 0 && !mr)
4e74239c 899 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
0e211563 900 if (usertime <= 0 && !mr)
4e74239c
RL
901 {
902 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
903 BIO_printf(bio_err,"program when this computer is idle.\n");
904 }
d02b48c6 905
cf1b7d96 906#ifndef OPENSSL_NO_RSA
d02b48c6
RE
907 for (i=0; i<RSA_NUM; i++)
908 {
5e4ca422 909 const unsigned char *p;
d02b48c6
RE
910
911 p=rsa_data[i];
912 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
913 if (rsa_key[i] == NULL)
914 {
915 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
916 goto end;
917 }
58964a49
RE
918#if 0
919 else
920 {
0e211563
BL
921 BIO_printf(bio_err,mr ? "+RK:%d:"
922 : "Loaded RSA key, %d bit modulus and e= 0x",
923 BN_num_bits(rsa_key[i]->n));
58964a49
RE
924 BN_print(bio_err,rsa_key[i]->e);
925 BIO_printf(bio_err,"\n");
926 }
927#endif
d02b48c6
RE
928 }
929#endif
930
cf1b7d96 931#ifndef OPENSSL_NO_DSA
d02b48c6
RE
932 dsa_key[0]=get_dsa512();
933 dsa_key[1]=get_dsa1024();
934 dsa_key[2]=get_dsa2048();
935#endif
936
cf1b7d96 937#ifndef OPENSSL_NO_DES
c2e4f17c
RL
938 DES_set_key_unchecked(&key,&sch);
939 DES_set_key_unchecked(&key2,&sch2);
940 DES_set_key_unchecked(&key3,&sch3);
d02b48c6 941#endif
ba1b8883
RL
942#ifndef OPENSSL_NO_AES
943 AES_set_encrypt_key(key16,128,&aes_ks1);
944 AES_set_encrypt_key(key24,192,&aes_ks2);
945 AES_set_encrypt_key(key32,256,&aes_ks3);
946#endif
cf1b7d96 947#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
948 idea_set_encrypt_key(key16,&idea_ks);
949#endif
cf1b7d96 950#ifndef OPENSSL_NO_RC4
d02b48c6
RE
951 RC4_set_key(&rc4_ks,16,key16);
952#endif
cf1b7d96 953#ifndef OPENSSL_NO_RC2
d02b48c6
RE
954 RC2_set_key(&rc2_ks,16,key16,128);
955#endif
cf1b7d96 956#ifndef OPENSSL_NO_RC5
58964a49
RE
957 RC5_32_set_key(&rc5_ks,16,key16,12);
958#endif
cf1b7d96 959#ifndef OPENSSL_NO_BF
d02b48c6
RE
960 BF_set_key(&bf_ks,16,key16);
961#endif
cf1b7d96 962#ifndef OPENSSL_NO_CAST
58964a49
RE
963 CAST_set_key(&cast_ks,16,key16);
964#endif
cf1b7d96 965#ifndef OPENSSL_NO_RSA
d02b48c6 966 memset(rsa_c,0,sizeof(rsa_c));
f5d7a031 967#endif
d02b48c6 968#ifndef SIGALRM
cf1b7d96 969#ifndef OPENSSL_NO_DES
d02b48c6
RE
970 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
971 count=10;
972 do {
973 long i;
974 count*=2;
b83eddc5 975 Time_F(START);
d02b48c6 976 for (i=count; i; i--)
b83eddc5 977 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
3d90a324 978 &sch,DES_ENCRYPT);
0e211563 979 d=Time_F(STOP);
d02b48c6 980 } while (d <3);
646d5695 981 save_count=count;
d02b48c6
RE
982 c[D_MD2][0]=count/10;
983 c[D_MDC2][0]=count/10;
3009458e 984 c[D_MD4][0]=count;
d02b48c6 985 c[D_MD5][0]=count;
58964a49 986 c[D_HMAC][0]=count;
d02b48c6 987 c[D_SHA1][0]=count;
58964a49 988 c[D_RMD160][0]=count;
d02b48c6
RE
989 c[D_RC4][0]=count*5;
990 c[D_CBC_DES][0]=count;
991 c[D_EDE3_DES][0]=count/3;
992 c[D_CBC_IDEA][0]=count;
993 c[D_CBC_RC2][0]=count;
58964a49 994 c[D_CBC_RC5][0]=count;
d02b48c6 995 c[D_CBC_BF][0]=count;
58964a49 996 c[D_CBC_CAST][0]=count;
d02b48c6
RE
997
998 for (i=1; i<SIZE_NUM; i++)
999 {
1000 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1001 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
3009458e 1002 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
d02b48c6 1003 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
58964a49 1004 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
d02b48c6 1005 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
58964a49 1006 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
d02b48c6
RE
1007 }
1008 for (i=1; i<SIZE_NUM; i++)
1009 {
1010 long l0,l1;
1011
1012 l0=(long)lengths[i-1];
1013 l1=(long)lengths[i];
1014 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1015 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1016 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1017 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1018 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
58964a49 1019 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
d02b48c6 1020 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
58964a49 1021 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
d02b48c6 1022 }
cf1b7d96 1023#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1024 rsa_c[R_RSA_512][0]=count/2000;
1025 rsa_c[R_RSA_512][1]=count/400;
1026 for (i=1; i<RSA_NUM; i++)
1027 {
1028 rsa_c[i][0]=rsa_c[i-1][0]/8;
1029 rsa_c[i][1]=rsa_c[i-1][1]/4;
1030 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1031 rsa_doit[i]=0;
1032 else
1033 {
dfeab068 1034 if (rsa_c[i][0] == 0)
d02b48c6
RE
1035 {
1036 rsa_c[i][0]=1;
1037 rsa_c[i][1]=20;
1038 }
1039 }
1040 }
f5d7a031 1041#endif
d02b48c6 1042
f89aebb1 1043#ifndef OPENSSL_NO_DSA
d02b48c6
RE
1044 dsa_c[R_DSA_512][0]=count/1000;
1045 dsa_c[R_DSA_512][1]=count/1000/2;
1046 for (i=1; i<DSA_NUM; i++)
1047 {
1048 dsa_c[i][0]=dsa_c[i-1][0]/4;
1049 dsa_c[i][1]=dsa_c[i-1][1]/4;
1050 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1051 dsa_doit[i]=0;
1052 else
1053 {
1054 if (dsa_c[i] == 0)
1055 {
1056 dsa_c[i][0]=1;
1057 dsa_c[i][1]=1;
1058 }
1059 }
1060 }
f89aebb1 1061#endif
d02b48c6 1062
58964a49 1063#define COND(d) (count < (d))
d02b48c6
RE
1064#define COUNT(d) (d)
1065#else
63da21c0
BM
1066/* not worth fixing */
1067# error "You cannot disable DES on systems without SIGALRM."
cf1b7d96 1068#endif /* OPENSSL_NO_DES */
63da21c0 1069#else
d02b48c6
RE
1070#define COND(c) (run)
1071#define COUNT(d) (count)
1072 signal(SIGALRM,sig_done);
63da21c0 1073#endif /* SIGALRM */
d02b48c6 1074
cf1b7d96 1075#ifndef OPENSSL_NO_MD2
d02b48c6
RE
1076 if (doit[D_MD2])
1077 {
1078 for (j=0; j<SIZE_NUM; j++)
1079 {
1080 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
0e211563 1081 Time_F(START);
d02b48c6 1082 for (count=0,run=1; COND(c[D_MD2][j]); count++)
0e211563
BL
1083 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1084 d=Time_F(STOP);
1085 print_result(D_MD2,j,count,d);
d02b48c6
RE
1086 }
1087 }
1088#endif
cf1b7d96 1089#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
1090 if (doit[D_MDC2])
1091 {
1092 for (j=0; j<SIZE_NUM; j++)
1093 {
1094 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
0e211563 1095 Time_F(START);
d02b48c6 1096 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
0e211563
BL
1097 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1098 d=Time_F(STOP);
1099 print_result(D_MDC2,j,count,d);
d02b48c6
RE
1100 }
1101 }
1102#endif
1103
cf1b7d96 1104#ifndef OPENSSL_NO_MD4
3009458e
RL
1105 if (doit[D_MD4])
1106 {
1107 for (j=0; j<SIZE_NUM; j++)
1108 {
1109 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
0e211563 1110 Time_F(START);
3009458e 1111 for (count=0,run=1; COND(c[D_MD4][j]); count++)
0e211563
BL
1112 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1113 d=Time_F(STOP);
1114 print_result(D_MD4,j,count,d);
3009458e
RL
1115 }
1116 }
1117#endif
1118
cf1b7d96 1119#ifndef OPENSSL_NO_MD5
d02b48c6
RE
1120 if (doit[D_MD5])
1121 {
1122 for (j=0; j<SIZE_NUM; j++)
1123 {
1124 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
0e211563 1125 Time_F(START);
d02b48c6 1126 for (count=0,run=1; COND(c[D_MD5][j]); count++)
0e211563
BL
1127 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1128 d=Time_F(STOP);
1129 print_result(D_MD5,j,count,d);
d02b48c6
RE
1130 }
1131 }
1132#endif
1133
cf1b7d96 1134#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
58964a49 1135 if (doit[D_HMAC])
d02b48c6 1136 {
58964a49 1137 HMAC_CTX hctx;
dbad1690
BL
1138
1139 HMAC_CTX_init(&hctx);
ff3fa48f 1140 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
de941e28 1141 16,EVP_md5(), NULL);
58964a49 1142
d02b48c6
RE
1143 for (j=0; j<SIZE_NUM; j++)
1144 {
58964a49 1145 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
0e211563 1146 Time_F(START);
58964a49
RE
1147 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1148 {
de941e28
DSH
1149 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1150 HMAC_Update(&hctx,buf,lengths[j]);
1151 HMAC_Final(&hctx,&(hmac[0]),NULL);
58964a49 1152 }
0e211563
BL
1153 d=Time_F(STOP);
1154 print_result(D_HMAC,j,count,d);
d02b48c6 1155 }
dbad1690 1156 HMAC_CTX_cleanup(&hctx);
d02b48c6
RE
1157 }
1158#endif
cf1b7d96 1159#ifndef OPENSSL_NO_SHA
d02b48c6
RE
1160 if (doit[D_SHA1])
1161 {
1162 for (j=0; j<SIZE_NUM; j++)
1163 {
1164 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
0e211563 1165 Time_F(START);
d02b48c6 1166 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
0e211563
BL
1167 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1168 d=Time_F(STOP);
1169 print_result(D_SHA1,j,count,d);
d02b48c6
RE
1170 }
1171 }
1172#endif
cf1b7d96 1173#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
1174 if (doit[D_RMD160])
1175 {
1176 for (j=0; j<SIZE_NUM; j++)
1177 {
1178 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
0e211563 1179 Time_F(START);
58964a49 1180 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
0e211563
BL
1181 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1182 d=Time_F(STOP);
1183 print_result(D_RMD160,j,count,d);
58964a49
RE
1184 }
1185 }
1186#endif
cf1b7d96 1187#ifndef OPENSSL_NO_RC4
d02b48c6
RE
1188 if (doit[D_RC4])
1189 {
1190 for (j=0; j<SIZE_NUM; j++)
1191 {
1192 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
0e211563 1193 Time_F(START);
d02b48c6
RE
1194 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1195 RC4(&rc4_ks,(unsigned int)lengths[j],
1196 buf,buf);
0e211563
BL
1197 d=Time_F(STOP);
1198 print_result(D_RC4,j,count,d);
d02b48c6
RE
1199 }
1200 }
1201#endif
cf1b7d96 1202#ifndef OPENSSL_NO_DES
d02b48c6
RE
1203 if (doit[D_CBC_DES])
1204 {
1205 for (j=0; j<SIZE_NUM; j++)
1206 {
1207 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
0e211563 1208 Time_F(START);
d02b48c6 1209 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
c2e4f17c 1210 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
ba1b8883 1211 &DES_iv,DES_ENCRYPT);
0e211563
BL
1212 d=Time_F(STOP);
1213 print_result(D_CBC_DES,j,count,d);
d02b48c6
RE
1214 }
1215 }
1216
1217 if (doit[D_EDE3_DES])
1218 {
1219 for (j=0; j<SIZE_NUM; j++)
1220 {
1221 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
0e211563 1222 Time_F(START);
d02b48c6 1223 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
c2e4f17c 1224 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
dbad1690 1225 &sch,&sch2,&sch3,
ba1b8883 1226 &DES_iv,DES_ENCRYPT);
0e211563
BL
1227 d=Time_F(STOP);
1228 print_result(D_EDE3_DES,j,count,d);
d02b48c6
RE
1229 }
1230 }
1231#endif
ba1b8883
RL
1232#ifndef OPENSSL_NO_AES
1233 if (doit[D_CBC_128_AES])
1234 {
1235 for (j=0; j<SIZE_NUM; j++)
1236 {
1237 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1238 Time_F(START);
1239 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1240 AES_cbc_encrypt(buf,buf,
1241 (unsigned long)lengths[j],&aes_ks1,
1242 iv,AES_ENCRYPT);
1243 d=Time_F(STOP);
1244 print_result(D_CBC_128_AES,j,count,d);
1245 }
1246 }
1247 if (doit[D_CBC_192_AES])
1248 {
1249 for (j=0; j<SIZE_NUM; j++)
1250 {
1251 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1252 Time_F(START);
1253 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1254 AES_cbc_encrypt(buf,buf,
1255 (unsigned long)lengths[j],&aes_ks2,
1256 iv,AES_ENCRYPT);
1257 d=Time_F(STOP);
1258 print_result(D_CBC_192_AES,j,count,d);
1259 }
1260 }
1261 if (doit[D_CBC_256_AES])
1262 {
1263 for (j=0; j<SIZE_NUM; j++)
1264 {
1265 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1266 Time_F(START);
1267 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1268 AES_cbc_encrypt(buf,buf,
1269 (unsigned long)lengths[j],&aes_ks3,
1270 iv,AES_ENCRYPT);
1271 d=Time_F(STOP);
1272 print_result(D_CBC_256_AES,j,count,d);
1273 }
1274 }
1275
1276#endif
cf1b7d96 1277#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
1278 if (doit[D_CBC_IDEA])
1279 {
1280 for (j=0; j<SIZE_NUM; j++)
1281 {
1282 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
0e211563 1283 Time_F(START);
d02b48c6
RE
1284 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1285 idea_cbc_encrypt(buf,buf,
1286 (unsigned long)lengths[j],&idea_ks,
12ba413c 1287 iv,IDEA_ENCRYPT);
0e211563
BL
1288 d=Time_F(STOP);
1289 print_result(D_CBC_IDEA,j,count,d);
d02b48c6
RE
1290 }
1291 }
1292#endif
cf1b7d96 1293#ifndef OPENSSL_NO_RC2
d02b48c6
RE
1294 if (doit[D_CBC_RC2])
1295 {
1296 for (j=0; j<SIZE_NUM; j++)
1297 {
1298 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
0e211563 1299 Time_F(START);
d02b48c6
RE
1300 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1301 RC2_cbc_encrypt(buf,buf,
1302 (unsigned long)lengths[j],&rc2_ks,
12ba413c 1303 iv,RC2_ENCRYPT);
0e211563
BL
1304 d=Time_F(STOP);
1305 print_result(D_CBC_RC2,j,count,d);
d02b48c6
RE
1306 }
1307 }
1308#endif
cf1b7d96 1309#ifndef OPENSSL_NO_RC5
58964a49
RE
1310 if (doit[D_CBC_RC5])
1311 {
1312 for (j=0; j<SIZE_NUM; j++)
1313 {
1314 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
0e211563 1315 Time_F(START);
58964a49
RE
1316 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1317 RC5_32_cbc_encrypt(buf,buf,
1318 (unsigned long)lengths[j],&rc5_ks,
12ba413c 1319 iv,RC5_ENCRYPT);
0e211563
BL
1320 d=Time_F(STOP);
1321 print_result(D_CBC_RC5,j,count,d);
58964a49
RE
1322 }
1323 }
1324#endif
cf1b7d96 1325#ifndef OPENSSL_NO_BF
d02b48c6
RE
1326 if (doit[D_CBC_BF])
1327 {
1328 for (j=0; j<SIZE_NUM; j++)
1329 {
1330 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
0e211563 1331 Time_F(START);
d02b48c6
RE
1332 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1333 BF_cbc_encrypt(buf,buf,
1334 (unsigned long)lengths[j],&bf_ks,
12ba413c 1335 iv,BF_ENCRYPT);
0e211563
BL
1336 d=Time_F(STOP);
1337 print_result(D_CBC_BF,j,count,d);
d02b48c6
RE
1338 }
1339 }
1340#endif
cf1b7d96 1341#ifndef OPENSSL_NO_CAST
58964a49
RE
1342 if (doit[D_CBC_CAST])
1343 {
1344 for (j=0; j<SIZE_NUM; j++)
1345 {
1346 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
0e211563 1347 Time_F(START);
58964a49
RE
1348 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1349 CAST_cbc_encrypt(buf,buf,
1350 (unsigned long)lengths[j],&cast_ks,
12ba413c 1351 iv,CAST_ENCRYPT);
0e211563
BL
1352 d=Time_F(STOP);
1353 print_result(D_CBC_CAST,j,count,d);
58964a49
RE
1354 }
1355 }
1356#endif
d02b48c6 1357
646d5695
BL
1358 if (doit[D_EVP])
1359 {
1360 for (j=0; j<SIZE_NUM; j++)
1361 {
83c40e7f
RL
1362 if (evp_cipher)
1363 {
1364 EVP_CIPHER_CTX ctx;
1365 int outl;
1366
1367 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
ba1b8883
RL
1368 /* -O3 -fschedule-insns messes up an
1369 * optimization here! names[D_EVP]
1370 * somehow becomes NULL */
83c40e7f
RL
1371 print_message(names[D_EVP],save_count,
1372 lengths[j]);
1373
1374 EVP_CIPHER_CTX_init(&ctx);
1375 if(decrypt)
1376 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1377 else
1378 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1379
1380 Time_F(START);
1381 if(decrypt)
1382 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1383 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1384 else
1385 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1386 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1387 if(decrypt)
1388 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1389 else
1390 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1391 d=Time_F(STOP);
1392 }
1393 if (evp_md)
1394 {
1395 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1396 print_message(names[D_EVP],save_count,
1397 lengths[j]);
1398
1399 Time_F(START);
3f37e73b 1400 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
83c40e7f
RL
1401 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1402
1403 d=Time_F(STOP);
1404 }
0e211563 1405 print_result(D_EVP,j,count,d);
646d5695
BL
1406 }
1407 }
1408
373b575f 1409 RAND_pseudo_bytes(buf,36);
cf1b7d96 1410#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1411 for (j=0; j<RSA_NUM; j++)
1412 {
c91e1259 1413 int ret;
d02b48c6 1414 if (!rsa_doit[j]) continue;
c91e1259 1415 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
03ea28c9
RL
1416 if (ret == 0)
1417 {
1418 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1419 ERR_print_errors(bio_err);
1420 rsa_count=1;
1421 }
1422 else
d02b48c6 1423 {
03ea28c9
RL
1424 pkey_print_message("private","rsa",
1425 rsa_c[j][0],rsa_bits[j],
1426 RSA_SECONDS);
1427/* RSA_blinding_on(rsa_key[j],NULL); */
0e211563 1428 Time_F(START);
03ea28c9 1429 for (count=0,run=1; COND(rsa_c[j][0]); count++)
d02b48c6 1430 {
03ea28c9
RL
1431 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1432 &rsa_num, rsa_key[j]);
1433 if (ret == 0)
1434 {
1435 BIO_printf(bio_err,
1436 "RSA sign failure\n");
1437 ERR_print_errors(bio_err);
1438 count=1;
1439 break;
1440 }
d02b48c6 1441 }
0e211563
BL
1442 d=Time_F(STOP);
1443 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1444 : "%ld %d bit private RSA's in %.2fs\n",
1445 count,rsa_bits[j],d);
03ea28c9
RL
1446 rsa_results[j][0]=d/(double)count;
1447 rsa_count=count;
d02b48c6 1448 }
d02b48c6 1449
58964a49 1450#if 1
c91e1259 1451 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
03ea28c9 1452 if (ret <= 0)
d02b48c6 1453 {
03ea28c9
RL
1454 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1455 ERR_print_errors(bio_err);
51740b12 1456 rsa_doit[j] = 0;
03ea28c9
RL
1457 }
1458 else
1459 {
1460 pkey_print_message("public","rsa",
1461 rsa_c[j][1],rsa_bits[j],
1462 RSA_SECONDS);
0e211563 1463 Time_F(START);
03ea28c9 1464 for (count=0,run=1; COND(rsa_c[j][1]); count++)
d02b48c6 1465 {
03ea28c9
RL
1466 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1467 rsa_num, rsa_key[j]);
1468 if (ret == 0)
1469 {
1470 BIO_printf(bio_err,
1471 "RSA verify failure\n");
1472 ERR_print_errors(bio_err);
1473 count=1;
1474 break;
1475 }
d02b48c6 1476 }
0e211563
BL
1477 d=Time_F(STOP);
1478 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1479 : "%ld %d bit public RSA's in %.2fs\n",
1480 count,rsa_bits[j],d);
03ea28c9 1481 rsa_results[j][1]=d/(double)count;
d02b48c6 1482 }
58964a49 1483#endif
d02b48c6
RE
1484
1485 if (rsa_count <= 1)
1486 {
1487 /* if longer than 10s, don't do any more */
1488 for (j++; j<RSA_NUM; j++)
1489 rsa_doit[j]=0;
1490 }
1491 }
1492#endif
1493
373b575f 1494 RAND_pseudo_bytes(buf,20);
cf1b7d96 1495#ifndef OPENSSL_NO_DSA
99a97051
UM
1496 if (RAND_status() != 1)
1497 {
1498 RAND_seed(rnd_seed, sizeof rnd_seed);
1499 rnd_fake = 1;
1500 }
d02b48c6
RE
1501 for (j=0; j<DSA_NUM; j++)
1502 {
58964a49 1503 unsigned int kk;
03ea28c9 1504 int ret;
58964a49 1505
d02b48c6 1506 if (!dsa_doit[j]) continue;
af436bc1 1507/* DSA_generate_key(dsa_key[j]); */
d02b48c6 1508/* DSA_sign_setup(dsa_key[j],NULL); */
03ea28c9 1509 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1510 &kk,dsa_key[j]);
03ea28c9
RL
1511 if (ret == 0)
1512 {
1513 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1514 ERR_print_errors(bio_err);
1515 rsa_count=1;
1516 }
1517 else
d02b48c6 1518 {
03ea28c9
RL
1519 pkey_print_message("sign","dsa",
1520 dsa_c[j][0],dsa_bits[j],
1521 DSA_SECONDS);
0e211563 1522 Time_F(START);
03ea28c9 1523 for (count=0,run=1; COND(dsa_c[j][0]); count++)
d02b48c6 1524 {
03ea28c9
RL
1525 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1526 &kk,dsa_key[j]);
1527 if (ret == 0)
1528 {
1529 BIO_printf(bio_err,
1530 "DSA sign failure\n");
1531 ERR_print_errors(bio_err);
1532 count=1;
1533 break;
1534 }
d02b48c6 1535 }
0e211563
BL
1536 d=Time_F(STOP);
1537 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1538 : "%ld %d bit DSA signs in %.2fs\n",
1539 count,dsa_bits[j],d);
03ea28c9
RL
1540 dsa_results[j][0]=d/(double)count;
1541 rsa_count=count;
d02b48c6 1542 }
d02b48c6 1543
03ea28c9 1544 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1545 kk,dsa_key[j]);
03ea28c9
RL
1546 if (ret <= 0)
1547 {
1548 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1549 ERR_print_errors(bio_err);
1550 dsa_doit[j] = 0;
1551 }
1552 else
d02b48c6 1553 {
03ea28c9
RL
1554 pkey_print_message("verify","dsa",
1555 dsa_c[j][1],dsa_bits[j],
1556 DSA_SECONDS);
0e211563 1557 Time_F(START);
03ea28c9 1558 for (count=0,run=1; COND(dsa_c[j][1]); count++)
d02b48c6 1559 {
03ea28c9
RL
1560 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1561 kk,dsa_key[j]);
1562 if (ret <= 0)
1563 {
1564 BIO_printf(bio_err,
1565 "DSA verify failure\n");
1566 ERR_print_errors(bio_err);
1567 count=1;
1568 break;
1569 }
d02b48c6 1570 }
0e211563
BL
1571 d=Time_F(STOP);
1572 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1573 : "%ld %d bit DSA verify in %.2fs\n",
1574 count,dsa_bits[j],d);
03ea28c9 1575 dsa_results[j][1]=d/(double)count;
d02b48c6 1576 }
d02b48c6
RE
1577
1578 if (rsa_count <= 1)
1579 {
1580 /* if longer than 10s, don't do any more */
1581 for (j++; j<DSA_NUM; j++)
1582 dsa_doit[j]=0;
1583 }
1584 }
99a97051 1585 if (rnd_fake) RAND_cleanup();
d02b48c6 1586#endif
b83eddc5 1587#ifdef HAVE_FORK
0e211563 1588show_res:
b83eddc5 1589#endif
0e211563
BL
1590 if(!mr)
1591 {
1592 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
d02b48c6 1593 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
0e211563
BL
1594 printf("options:");
1595 printf("%s ",BN_options());
cf1b7d96 1596#ifndef OPENSSL_NO_MD2
0e211563 1597 printf("%s ",MD2_options());
d02b48c6 1598#endif
cf1b7d96 1599#ifndef OPENSSL_NO_RC4
0e211563 1600 printf("%s ",RC4_options());
d02b48c6 1601#endif
cf1b7d96 1602#ifndef OPENSSL_NO_DES
0e211563 1603 printf("%s ",des_options());
d02b48c6 1604#endif
ba1b8883
RL
1605#ifndef OPENSSL_NO_AES
1606 printf("%s ",AES_options());
1607#endif
cf1b7d96 1608#ifndef OPENSSL_NO_IDEA
0e211563 1609 printf("%s ",idea_options());
d02b48c6 1610#endif
cf1b7d96 1611#ifndef OPENSSL_NO_BF
0e211563 1612 printf("%s ",BF_options());
d02b48c6 1613#endif
0e211563
BL
1614 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
1615 printf("available timing options: ");
7876e448 1616#ifdef TIMES
0e211563 1617 printf("TIMES ");
7876e448
RL
1618#endif
1619#ifdef TIMEB
0e211563 1620 printf("TIMEB ");
7876e448
RL
1621#endif
1622#ifdef USE_TOD
0e211563 1623 printf("USE_TOD ");
7876e448
RL
1624#endif
1625#ifdef HZ
1626#define as_string(s) (#s)
87a4b4d1 1627 printf("HZ=%g", (double)HZ);
a4a8f7b3 1628# ifdef _SC_CLK_TCK
0e211563 1629 printf(" [sysconf value]");
a4a8f7b3 1630# endif
7876e448 1631#endif
0e211563
BL
1632 printf("\n");
1633 printf("timing function used: %s%s%s%s%s%s%s\n",
1634 (ftime_used ? "ftime" : ""),
1635 (ftime_used + times_used > 1 ? "," : ""),
1636 (times_used ? "times" : ""),
1637 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
1638 (gettimeofday_used ? "gettimeofday" : ""),
1639 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
1640 (getrusage_used ? "getrusage" : ""));
1641 }
d02b48c6
RE
1642
1643 if (pr_header)
1644 {
0e211563
BL
1645 if(mr)
1646 fprintf(stdout,"+H");
1647 else
1648 {
1649 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
1650 fprintf(stdout,"type ");
1651 }
d02b48c6 1652 for (j=0; j<SIZE_NUM; j++)
0e211563 1653 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
d02b48c6
RE
1654 fprintf(stdout,"\n");
1655 }
1656
1657 for (k=0; k<ALGOR_NUM; k++)
1658 {
1659 if (!doit[k]) continue;
0e211563
BL
1660 if(mr)
1661 fprintf(stdout,"+F:%d:%s",k,names[k]);
1662 else
1663 fprintf(stdout,"%-13s",names[k]);
d02b48c6
RE
1664 for (j=0; j<SIZE_NUM; j++)
1665 {
0e211563 1666 if (results[k][j] > 10000 && !mr)
d02b48c6
RE
1667 fprintf(stdout," %11.2fk",results[k][j]/1e3);
1668 else
0e211563 1669 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
d02b48c6
RE
1670 }
1671 fprintf(stdout,"\n");
1672 }
cf1b7d96 1673#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1674 j=1;
1675 for (k=0; k<RSA_NUM; k++)
1676 {
1677 if (!rsa_doit[k]) continue;
0e211563 1678 if (j && !mr)
58964a49
RE
1679 {
1680 printf("%18ssign verify sign/s verify/s\n"," ");
1681 j=0;
1682 }
0e211563
BL
1683 if(mr)
1684 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
1685 k,rsa_bits[k],rsa_results[k][0],
1686 rsa_results[k][1]);
1687 else
1688 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1689 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
1690 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
d02b48c6
RE
1691 }
1692#endif
cf1b7d96 1693#ifndef OPENSSL_NO_DSA
d02b48c6
RE
1694 j=1;
1695 for (k=0; k<DSA_NUM; k++)
1696 {
1697 if (!dsa_doit[k]) continue;
0e211563
BL
1698 if (j && !mr)
1699 {
58964a49
RE
1700 printf("%18ssign verify sign/s verify/s\n"," ");
1701 j=0;
1702 }
0e211563
BL
1703 if(mr)
1704 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
1705 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
1706 else
1707 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
1708 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
1709 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
d02b48c6
RE
1710 }
1711#endif
18c77bf2 1712 mret=0;
d02b48c6 1713end:
5270e702 1714 ERR_print_errors(bio_err);
26a3a48d
RL
1715 if (buf != NULL) OPENSSL_free(buf);
1716 if (buf2 != NULL) OPENSSL_free(buf2);
cf1b7d96 1717#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1718 for (i=0; i<RSA_NUM; i++)
1719 if (rsa_key[i] != NULL)
1720 RSA_free(rsa_key[i]);
1721#endif
cf1b7d96 1722#ifndef OPENSSL_NO_DSA
d02b48c6
RE
1723 for (i=0; i<DSA_NUM; i++)
1724 if (dsa_key[i] != NULL)
1725 DSA_free(dsa_key[i]);
1726#endif
c04f8cf4 1727 apps_shutdown();
18c77bf2 1728 EXIT(mret);
d02b48c6
RE
1729 }
1730
646d5695 1731static void print_message(const char *s, long num, int length)
d02b48c6
RE
1732 {
1733#ifdef SIGALRM
0e211563
BL
1734 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
1735 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
d58d092b 1736 (void)BIO_flush(bio_err);
d02b48c6
RE
1737 alarm(SECONDS);
1738#else
0e211563
BL
1739 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
1740 : "Doing %s %ld times on %d size blocks: ",s,num,length);
d58d092b 1741 (void)BIO_flush(bio_err);
d02b48c6
RE
1742#endif
1743#ifdef LINT
1744 num=num;
1745#endif
1746 }
1747
6b691a5c
UM
1748static void pkey_print_message(char *str, char *str2, long num, int bits,
1749 int tm)
d02b48c6
RE
1750 {
1751#ifdef SIGALRM
0e211563
BL
1752 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
1753 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
d58d092b 1754 (void)BIO_flush(bio_err);
d02b48c6
RE
1755 alarm(RSA_SECONDS);
1756#else
0e211563
BL
1757 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
1758 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
d58d092b 1759 (void)BIO_flush(bio_err);
d02b48c6
RE
1760#endif
1761#ifdef LINT
1762 num=num;
1763#endif
1764 }
58964a49 1765
0e211563
BL
1766static void print_result(int alg,int run_no,int count,double time_used)
1767 {
1768 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
1769 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
1770 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
1771 }
1772
1773static char *sstrsep(char **string, const char *delim)
1774 {
1775 char isdelim[256];
1776 char *token = *string;
1777
1778 if (**string == 0)
1779 return NULL;
1780
1781 memset(isdelim, 0, 256);
1782 isdelim[0] = 1;
1783
1784 while (*delim)
1785 {
1786 isdelim[(unsigned char)(*delim)] = 1;
1787 delim++;
1788 }
1789
1790 while (!isdelim[(unsigned char)(**string)])
1791 {
1792 (*string)++;
1793 }
1794
1795 if (**string)
1796 {
1797 **string = 0;
1798 (*string)++;
1799 }
1800
1801 return token;
1802 }
1803
66d3e748 1804#ifdef HAVE_FORK
0e211563
BL
1805static int do_multi(int multi)
1806 {
1807 int n;
1808 int fd[2];
1809 int *fds;
1810 static char sep[]=":";
1811
1812 fds=malloc(multi*sizeof *fds);
1813 for(n=0 ; n < multi ; ++n)
1814 {
1815 pipe(fd);
1816 if(fork())
1817 {
1818 close(fd[1]);
1819 fds[n]=fd[0];
1820 }
1821 else
1822 {
1823 close(fd[0]);
1824 close(1);
1825 dup(fd[1]);
1826 close(fd[1]);
1827 mr=1;
1828 usertime=0;
1829 return 0;
1830 }
1831 printf("Forked child %d\n",n);
1832 }
1833
1834 /* for now, assume the pipe is long enough to take all the output */
1835 for(n=0 ; n < multi ; ++n)
1836 {
1837 FILE *f;
1838 char buf[1024];
1839 char *p;
1840
1841 f=fdopen(fds[n],"r");
1842 while(fgets(buf,sizeof buf,f))
1843 {
1844 p=strchr(buf,'\n');
1845 if(p)
1846 *p='\0';
1847 if(buf[0] != '+')
1848 {
1849 fprintf(stderr,"Don't understand line '%s' from child %d\n",
1850 buf,n);
1851 continue;
1852 }
1853 printf("Got: %s from %d\n",buf,n);
1854 if(!strncmp(buf,"+F:",3))
1855 {
1856 int alg;
1857 int j;
1858
1859 p=buf+3;
1860 alg=atoi(sstrsep(&p,sep));
1861 sstrsep(&p,sep);
1862 for(j=0 ; j < SIZE_NUM ; ++j)
1863 results[alg][j]+=atof(sstrsep(&p,sep));
1864 }
1865 else if(!strncmp(buf,"+F2:",4))
1866 {
1867 int k;
1868 double d;
1869
1870 p=buf+4;
1871 k=atoi(sstrsep(&p,sep));
1872 sstrsep(&p,sep);
1873
1874 d=atof(sstrsep(&p,sep));
1875 if(n)
1876 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1877 else
1878 rsa_results[k][0]=d;
1879
1880 d=atof(sstrsep(&p,sep));
1881 if(n)
1882 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1883 else
1884 rsa_results[k][1]=d;
1885 }
1886 else if(!strncmp(buf,"+F2:",4))
1887 {
1888 int k;
1889 double d;
1890
1891 p=buf+4;
1892 k=atoi(sstrsep(&p,sep));
1893 sstrsep(&p,sep);
1894
1895 d=atof(sstrsep(&p,sep));
1896 if(n)
1897 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
1898 else
1899 rsa_results[k][0]=d;
1900
1901 d=atof(sstrsep(&p,sep));
1902 if(n)
1903 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
1904 else
1905 rsa_results[k][1]=d;
1906 }
1907 else if(!strncmp(buf,"+F3:",4))
1908 {
1909 int k;
1910 double d;
1911
1912 p=buf+4;
1913 k=atoi(sstrsep(&p,sep));
1914 sstrsep(&p,sep);
1915
1916 d=atof(sstrsep(&p,sep));
1917 if(n)
1918 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
1919 else
1920 dsa_results[k][0]=d;
1921
1922 d=atof(sstrsep(&p,sep));
1923 if(n)
1924 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
1925 else
1926 dsa_results[k][1]=d;
1927 }
1928 else if(!strncmp(buf,"+H:",3))
1929 {
1930 }
1931 else
1932 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
1933 }
1934 }
1935 return 1;
1936 }
66d3e748 1937#endif