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