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