]> git.ipfire.org Git - thirdparty/openssl.git/blame - apps/speed.c
When build as dynamic engines, the loading functions should be defined
[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 */
e172d60d
BM
58/* ====================================================================
59 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60 *
61 * Portions of the attached software ("Contribution") are developed by
62 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
63 *
64 * The Contribution is licensed pursuant to the OpenSSL open source
65 * license provided above.
66 *
e172d60d
BM
67 * The ECDH and ECDSA speed test software is originally written by
68 * Sumit Gupta of Sun Microsystems Laboratories.
69 *
70 */
d02b48c6
RE
71
72/* most of this code has been pilfered from my libdes speed.c program */
73
74#undef SECONDS
75#define SECONDS 3
dfeab068
RE
76#define RSA_SECONDS 10
77#define DSA_SECONDS 10
e172d60d
BM
78#define ECDSA_SECONDS 10
79#define ECDH_SECONDS 10
d02b48c6
RE
80
81/* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
82/* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
83
84#undef PROG
85#define PROG speed_main
86
87#include <stdio.h>
88#include <stdlib.h>
89#include <signal.h>
90#include <string.h>
58964a49 91#include <math.h>
d02b48c6 92#include "apps.h"
cf1b7d96 93#ifdef OPENSSL_NO_STDIO
d02b48c6
RE
94#define APPS_WIN16
95#endif
ec577822
BM
96#include <openssl/crypto.h>
97#include <openssl/rand.h>
98#include <openssl/err.h>
646d5695
BL
99#include <openssl/evp.h>
100#include <openssl/objects.h>
f559f31b 101#if !defined(OPENSSL_SYS_MSDOS)
a4a8f7b3 102#include OPENSSL_UNISTD
f559f31b 103#endif
d02b48c6 104
c3bdbcf6 105#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
2bfb4dbc 106# define USE_TOD
3e83e686 107#elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
2bfb4dbc 108# define TIMES
d02b48c6 109#endif
3e83e686 110#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
111# define TIMEB
112#endif
d02b48c6 113
d02b48c6 114#ifndef _IRIX
2bfb4dbc 115# include <time.h>
d02b48c6
RE
116#endif
117#ifdef TIMES
2bfb4dbc
BL
118# include <sys/types.h>
119# include <sys/times.h>
120#endif
121#ifdef USE_TOD
122# include <sys/time.h>
123# include <sys/resource.h>
d02b48c6 124#endif
7d7d2cbc
UM
125
126/* Depending on the VMS version, the tms structure is perhaps defined.
127 The __TMS macro will show if it was. If it wasn't defined, we should
128 undefine TIMES, since that tells the rest of the program how things
129 should be handled. -- Richard Levitte */
bc36ee62 130#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
7d7d2cbc 131#undef TIMES
d02b48c6 132#endif
7d7d2cbc 133
3132e196 134#ifdef TIMEB
d02b48c6 135#include <sys/timeb.h>
3132e196
RL
136#endif
137
3e83e686 138#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
3132e196
RL
139#error "It seems neither struct tms nor struct timeb is supported in this platform!"
140#endif
d02b48c6 141
dfeab068
RE
142#if defined(sun) || defined(__ultrix)
143#define _POSIX_SOURCE
d02b48c6
RE
144#include <limits.h>
145#include <sys/param.h>
146#endif
147
cf1b7d96 148#ifndef OPENSSL_NO_DES
125cc35b 149#include <openssl/des.h>
d02b48c6 150#endif
ba1b8883
RL
151#ifndef OPENSSL_NO_AES
152#include <openssl/aes.h>
153#endif
cf1b7d96 154#ifndef OPENSSL_NO_MD2
ec577822 155#include <openssl/md2.h>
d02b48c6 156#endif
cf1b7d96 157#ifndef OPENSSL_NO_MDC2
ec577822 158#include <openssl/mdc2.h>
d02b48c6 159#endif
cf1b7d96 160#ifndef OPENSSL_NO_MD4
3009458e
RL
161#include <openssl/md4.h>
162#endif
cf1b7d96 163#ifndef OPENSSL_NO_MD5
ec577822 164#include <openssl/md5.h>
5271ebd9 165#endif
cf1b7d96 166#ifndef OPENSSL_NO_HMAC
ec577822 167#include <openssl/hmac.h>
d02b48c6 168#endif
5271ebd9 169#include <openssl/evp.h>
cf1b7d96 170#ifndef OPENSSL_NO_SHA
ec577822 171#include <openssl/sha.h>
d02b48c6 172#endif
cf1b7d96 173#ifndef OPENSSL_NO_RIPEMD
ec577822 174#include <openssl/ripemd.h>
58964a49 175#endif
cf1b7d96 176#ifndef OPENSSL_NO_RC4
ec577822 177#include <openssl/rc4.h>
d02b48c6 178#endif
cf1b7d96 179#ifndef OPENSSL_NO_RC5
ec577822 180#include <openssl/rc5.h>
58964a49 181#endif
cf1b7d96 182#ifndef OPENSSL_NO_RC2
ec577822 183#include <openssl/rc2.h>
d02b48c6 184#endif
cf1b7d96 185#ifndef OPENSSL_NO_IDEA
ec577822 186#include <openssl/idea.h>
d02b48c6 187#endif
cf1b7d96 188#ifndef OPENSSL_NO_BF
ec577822 189#include <openssl/blowfish.h>
d02b48c6 190#endif
cf1b7d96 191#ifndef OPENSSL_NO_CAST
ec577822 192#include <openssl/cast.h>
58964a49 193#endif
cf1b7d96 194#ifndef OPENSSL_NO_RSA
ec577822 195#include <openssl/rsa.h>
f5d7a031 196#include "./testrsa.h"
d02b48c6 197#endif
ec577822 198#include <openssl/x509.h>
cf1b7d96 199#ifndef OPENSSL_NO_DSA
d02b48c6
RE
200#include "./testdsa.h"
201#endif
e172d60d
BM
202#ifndef OPENSSL_NO_ECDSA
203#include <openssl/ecdsa.h>
204#endif
205#ifndef OPENSSL_NO_ECDH
206#include <openssl/ecdh.h>
207#endif
d02b48c6
RE
208
209/* The following if from times(3) man page. It may need to be changed */
210#ifndef HZ
a4a8f7b3
RL
211# ifdef _SC_CLK_TCK
212# define HZ ((double)sysconf(_SC_CLK_TCK))
213# else
214# ifndef CLK_TCK
215# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
216# define HZ 100.0
217# else /* _BSD_CLK_TCK_ */
218# define HZ ((double)_BSD_CLK_TCK_)
219# endif
220# else /* CLK_TCK */
7876e448
RL
221# define HZ ((double)CLK_TCK)
222# endif
d02b48c6
RE
223# endif
224#endif
225
66d3e748
RL
226#if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
227# define HAVE_FORK 1
228#endif
229
d02b48c6 230#undef BUFSIZE
58964a49 231#define BUFSIZE ((long)1024*8+1)
d02b48c6
RE
232int run=0;
233
7876e448 234static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
0e211563
BL
235static int mr=0;
236static int usertime=1;
7876e448 237
0e211563 238static double Time_F(int s);
646d5695 239static void print_message(const char *s,long num,int length);
d02b48c6 240static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
0e211563 241static void print_result(int alg,int run_no,int count,double time_used);
66d3e748 242#ifdef HAVE_FORK
0e211563 243static int do_multi(int multi);
66d3e748 244#endif
d02b48c6 245
ba1b8883 246#define ALGOR_NUM 19
0e211563
BL
247#define SIZE_NUM 5
248#define RSA_NUM 4
249#define DSA_NUM 3
e172d60d 250
5c6bf031 251#define EC_NUM 16
e172d60d
BM
252#define MAX_ECDH_SIZE 256
253
0e211563
BL
254static const char *names[ALGOR_NUM]={
255 "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
256 "des cbc","des ede3","idea cbc",
ba1b8883
RL
257 "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
258 "aes-128 cbc","aes-192 cbc","aes-256 cbc"};
0e211563 259static double results[ALGOR_NUM][SIZE_NUM];
ba1b8883 260static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
0e211563
BL
261static double rsa_results[RSA_NUM][2];
262static double dsa_results[DSA_NUM][2];
e172d60d
BM
263static double ecdsa_results[EC_NUM][2];
264static double ecdh_results[EC_NUM][1];
265
0e211563 266
b83eddc5
DSH
267#ifdef SIGALRM
268#if defined(__STDC__) || defined(sgi) || defined(_AIX)
269#define SIGRETTYPE void
270#else
271#define SIGRETTYPE int
272#endif
273
d02b48c6 274static SIGRETTYPE sig_done(int sig);
6b691a5c 275static SIGRETTYPE sig_done(int sig)
d02b48c6
RE
276 {
277 signal(SIGALRM,sig_done);
278 run=0;
279#ifdef LINT
280 sig=sig;
281#endif
282 }
283#endif
284
285#define START 0
286#define STOP 1
287
0e211563 288static double Time_F(int s)
d02b48c6
RE
289 {
290 double ret;
2bfb4dbc
BL
291
292#ifdef USE_TOD
293 if(usertime)
294 {
295 static struct rusage tstart,tend;
296
7876e448 297 getrusage_used = 1;
2bfb4dbc
BL
298 if (s == START)
299 {
300 getrusage(RUSAGE_SELF,&tstart);
301 return(0);
302 }
303 else
304 {
305 long i;
306
307 getrusage(RUSAGE_SELF,&tend);
308 i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
309 ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
310 +((double)i)/1000000.0;
311 return((ret < 0.001)?0.001:ret);
312 }
313 }
314 else
315 {
316 static struct timeval tstart,tend;
317 long i;
318
7876e448 319 gettimeofday_used = 1;
2bfb4dbc
BL
320 if (s == START)
321 {
322 gettimeofday(&tstart,NULL);
323 return(0);
324 }
325 else
326 {
327 gettimeofday(&tend,NULL);
328 i=(long)tend.tv_usec-(long)tstart.tv_usec;
329 ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
330 return((ret < 0.001)?0.001:ret);
331 }
332 }
333#else /* ndef USE_TOD */
334
335# ifdef TIMES
4e74239c 336 if (usertime)
d02b48c6 337 {
4e74239c 338 static struct tms tstart,tend;
d02b48c6 339
7876e448 340 times_used = 1;
4e74239c
RL
341 if (s == START)
342 {
343 times(&tstart);
344 return(0);
345 }
346 else
347 {
348 times(&tend);
349 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
350 return((ret < 1e-3)?1e-3:ret);
351 }
d02b48c6 352 }
2bfb4dbc 353# endif /* times() */
3132e196
RL
354# if defined(TIMES) && defined(TIMEB)
355 else
356# endif
3e83e686
RL
357# ifdef OPENSSL_SYS_VXWORKS
358 {
359 static unsigned long tick_start, tick_end;
360
361 if( s == START )
362 {
363 tick_start = tickGet();
364 return 0;
365 }
366 else
367 {
368 tick_end = tickGet();
369 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
370 return((ret < 0.001)?0.001:ret);
371 }
372 }
373# elif defined(TIMEB)
d02b48c6 374 {
4e74239c
RL
375 static struct timeb tstart,tend;
376 long i;
377
7876e448 378 ftime_used = 1;
4e74239c
RL
379 if (s == START)
380 {
381 ftime(&tstart);
382 return(0);
383 }
384 else
385 {
386 ftime(&tend);
387 i=(long)tend.millitm-(long)tstart.millitm;
388 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
389 return((ret < 0.001)?0.001:ret);
390 }
d02b48c6 391 }
3132e196 392# endif
2bfb4dbc 393#endif
d02b48c6
RE
394 }
395
667ac4ec
RE
396int MAIN(int, char **);
397
6b691a5c 398int MAIN(int argc, char **argv)
d02b48c6 399 {
1199e2d8 400 ENGINE *e = NULL;
d02b48c6 401 unsigned char *buf=NULL,*buf2=NULL;
18c77bf2 402 int mret=1;
af28dd6c 403 long count=0,save_count=0;
18c77bf2 404 int i,j,k;
af28dd6c
BM
405#if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
406 long rsa_count;
407#endif
cf1b7d96 408#ifndef OPENSSL_NO_RSA
5614bb91 409 unsigned rsa_num;
b2293b1e 410#endif
83c40e7f 411 unsigned char md[EVP_MAX_MD_SIZE];
cf1b7d96 412#ifndef OPENSSL_NO_MD2
d02b48c6
RE
413 unsigned char md2[MD2_DIGEST_LENGTH];
414#endif
cf1b7d96 415#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
416 unsigned char mdc2[MDC2_DIGEST_LENGTH];
417#endif
cf1b7d96 418#ifndef OPENSSL_NO_MD4
3009458e
RL
419 unsigned char md4[MD4_DIGEST_LENGTH];
420#endif
cf1b7d96 421#ifndef OPENSSL_NO_MD5
d02b48c6 422 unsigned char md5[MD5_DIGEST_LENGTH];
58964a49 423 unsigned char hmac[MD5_DIGEST_LENGTH];
d02b48c6 424#endif
cf1b7d96 425#ifndef OPENSSL_NO_SHA
d02b48c6
RE
426 unsigned char sha[SHA_DIGEST_LENGTH];
427#endif
cf1b7d96 428#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
429 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
430#endif
cf1b7d96 431#ifndef OPENSSL_NO_RC4
d02b48c6
RE
432 RC4_KEY rc4_ks;
433#endif
cf1b7d96 434#ifndef OPENSSL_NO_RC5
58964a49
RE
435 RC5_32_KEY rc5_ks;
436#endif
cf1b7d96 437#ifndef OPENSSL_NO_RC2
d02b48c6
RE
438 RC2_KEY rc2_ks;
439#endif
cf1b7d96 440#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
441 IDEA_KEY_SCHEDULE idea_ks;
442#endif
cf1b7d96 443#ifndef OPENSSL_NO_BF
d02b48c6 444 BF_KEY bf_ks;
58964a49 445#endif
cf1b7d96 446#ifndef OPENSSL_NO_CAST
58964a49 447 CAST_KEY cast_ks;
d02b48c6 448#endif
ba1b8883 449 static const unsigned char key16[16]=
d02b48c6
RE
450 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
451 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
ba1b8883
RL
452 static const unsigned char key24[24]=
453 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
454 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
455 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
456 static const unsigned char key32[32]=
457 {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
458 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,
459 0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,
460 0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56};
461#ifndef OPENSSL_NO_AES
462#define MAX_BLOCK_SIZE 128
463#else
464#define MAX_BLOCK_SIZE 64
465#endif
466 unsigned char DES_iv[8];
467 unsigned char iv[MAX_BLOCK_SIZE/8];
cf1b7d96 468#ifndef OPENSSL_NO_DES
c2e4f17c 469 DES_cblock *buf_as_des_cblock = NULL;
125cc35b
RL
470 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
471 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
472 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
c2e4f17c
RL
473 DES_key_schedule sch;
474 DES_key_schedule sch2;
475 DES_key_schedule sch3;
d02b48c6 476#endif
ba1b8883
RL
477#ifndef OPENSSL_NO_AES
478 AES_KEY aes_ks1, aes_ks2, aes_ks3;
479#endif
d02b48c6
RE
480#define D_MD2 0
481#define D_MDC2 1
3009458e
RL
482#define D_MD4 2
483#define D_MD5 3
484#define D_HMAC 4
485#define D_SHA1 5
486#define D_RMD160 6
487#define D_RC4 7
488#define D_CBC_DES 8
489#define D_EDE3_DES 9
490#define D_CBC_IDEA 10
491#define D_CBC_RC2 11
492#define D_CBC_RC5 12
493#define D_CBC_BF 13
494#define D_CBC_CAST 14
ba1b8883
RL
495#define D_CBC_128_AES 15
496#define D_CBC_192_AES 16
497#define D_CBC_256_AES 17
498#define D_EVP 18
499 double d=0.0;
d02b48c6 500 long c[ALGOR_NUM][SIZE_NUM];
d02b48c6
RE
501#define R_DSA_512 0
502#define R_DSA_1024 1
503#define R_DSA_2048 2
504#define R_RSA_512 0
505#define R_RSA_1024 1
506#define R_RSA_2048 2
507#define R_RSA_4096 3
e172d60d
BM
508
509#define R_EC_P160 0
5c6bf031
BM
510#define R_EC_P192 1
511#define R_EC_P224 2
512#define R_EC_P256 3
513#define R_EC_P384 4
514#define R_EC_P521 5
515#define R_EC_K163 6
516#define R_EC_K233 7
517#define R_EC_K283 8
518#define R_EC_K409 9
519#define R_EC_K571 10
520#define R_EC_B163 11
521#define R_EC_B233 12
522#define R_EC_B283 13
523#define R_EC_B409 14
524#define R_EC_B571 15
e172d60d 525
cf1b7d96 526#ifndef OPENSSL_NO_RSA
d02b48c6 527 RSA *rsa_key[RSA_NUM];
d02b48c6 528 long rsa_c[RSA_NUM][2];
d02b48c6 529 static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
d02b48c6
RE
530 static unsigned char *rsa_data[RSA_NUM]=
531 {test512,test1024,test2048,test4096};
532 static int rsa_data_length[RSA_NUM]={
533 sizeof(test512),sizeof(test1024),
534 sizeof(test2048),sizeof(test4096)};
58964a49 535#endif
cf1b7d96 536#ifndef OPENSSL_NO_DSA
58964a49
RE
537 DSA *dsa_key[DSA_NUM];
538 long dsa_c[DSA_NUM][2];
58964a49
RE
539 static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
540#endif
e172d60d
BM
541#ifndef OPENSSL_NO_EC
542 /* We only test over the following curves as they are representative,
543 * To add tests over more curves, simply add the curve NID
544 * and curve name to the following arrays and increase the
545 * EC_NUM value accordingly.
546 */
547 static unsigned int test_curves[EC_NUM] =
548 {
549 /* Prime Curves */
7eb18f12 550 NID_secp160r1,
5c6bf031 551 NID_X9_62_prime192v1,
7eb18f12
BM
552 NID_secp224r1,
553 NID_X9_62_prime256v1,
554 NID_secp384r1,
555 NID_secp521r1,
e172d60d 556 /* Binary Curves */
7eb18f12
BM
557 NID_sect163k1,
558 NID_sect233k1,
559 NID_sect283k1,
560 NID_sect409k1,
561 NID_sect571k1,
562 NID_sect163r2,
563 NID_sect233r1,
564 NID_sect283r1,
565 NID_sect409r1,
566 NID_sect571r1
e172d60d
BM
567 };
568 static char * test_curves_names[EC_NUM] =
569 {
570 /* Prime Curves */
571 "secp160r1",
5c6bf031 572 "nistp192",
e172d60d
BM
573 "nistp224",
574 "nistp256",
575 "nistp384",
576 "nistp521",
577 /* Binary Curves */
578 "nistk163",
579 "nistk233",
580 "nistk283",
581 "nistk409",
582 "nistk571",
583 "nistb163",
584 "nistb233",
585 "nistb283",
586 "nistb409",
587 "nistb571"
588 };
589 static int test_curves_bits[EC_NUM] =
590 {
5c6bf031 591 160, 192, 224, 256, 384, 521,
e172d60d
BM
592 163, 233, 283, 409, 571,
593 163, 233, 283, 409, 571
594 };
595
596#endif
597
598#ifndef OPENSSL_NO_ECDSA
599 unsigned char ecdsasig[256];
600 unsigned int ecdsasiglen;
601 EC_KEY *ecdsa[EC_NUM];
602 long ecdsa_c[EC_NUM][2];
603#endif
604
605#ifndef OPENSSL_NO_ECDH
606 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
607 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
608 int secret_size_a, secret_size_b;
41fdcfa7 609 int ecdh_checks = 0;
e172d60d
BM
610 int secret_idx = 0;
611 long ecdh_c[EC_NUM][2];
612#endif
613
d02b48c6
RE
614 int rsa_doit[RSA_NUM];
615 int dsa_doit[DSA_NUM];
e172d60d
BM
616 int ecdsa_doit[EC_NUM];
617 int ecdh_doit[EC_NUM];
58964a49 618 int doit[ALGOR_NUM];
d02b48c6 619 int pr_header=0;
83c40e7f
RL
620 const EVP_CIPHER *evp_cipher=NULL;
621 const EVP_MD *evp_md=NULL;
3f37e73b 622 int decrypt=0;
66d3e748 623#ifdef HAVE_FORK
0e211563 624 int multi=0;
66d3e748 625#endif
4e74239c
RL
626
627#ifndef TIMES
628 usertime=-1;
629#endif
d02b48c6
RE
630
631 apps_startup();
396f6314 632 memset(results, 0, sizeof(results));
cf1b7d96 633#ifndef OPENSSL_NO_DSA
dfeab068
RE
634 memset(dsa_key,0,sizeof(dsa_key));
635#endif
e172d60d
BM
636#ifndef OPENSSL_NO_ECDSA
637 for (i=0; i<EC_NUM; i++) ecdsa[i] = NULL;
638#endif
639#ifndef OPENSSL_NO_ECDH
640 for (i=0; i<EC_NUM; i++)
641 {
642 ecdh_a[i] = NULL;
643 ecdh_b[i] = NULL;
644 }
645#endif
646
d02b48c6
RE
647
648 if (bio_err == NULL)
649 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
58964a49 650 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
d02b48c6 651
3647bee2
DSH
652 if (!load_config(bio_err, NULL))
653 goto end;
654
cf1b7d96 655#ifndef OPENSSL_NO_RSA
dfeab068 656 memset(rsa_key,0,sizeof(rsa_key));
d02b48c6
RE
657 for (i=0; i<RSA_NUM; i++)
658 rsa_key[i]=NULL;
dfeab068 659#endif
d02b48c6 660
26a3a48d 661 if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
662 {
663 BIO_printf(bio_err,"out of memory\n");
664 goto end;
665 }
cf1b7d96 666#ifndef OPENSSL_NO_DES
125cc35b 667 buf_as_des_cblock = (DES_cblock *)buf;
5676d8cb 668#endif
26a3a48d 669 if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
d02b48c6
RE
670 {
671 BIO_printf(bio_err,"out of memory\n");
672 goto end;
673 }
674
675 memset(c,0,sizeof(c));
ba1b8883 676 memset(DES_iv,0,sizeof(DES_iv));
d02b48c6
RE
677 memset(iv,0,sizeof(iv));
678
679 for (i=0; i<ALGOR_NUM; i++)
680 doit[i]=0;
681 for (i=0; i<RSA_NUM; i++)
682 rsa_doit[i]=0;
683 for (i=0; i<DSA_NUM; i++)
684 dsa_doit[i]=0;
e172d60d
BM
685#ifndef OPENSSL_NO_ECDSA
686 for (i=0; i<EC_NUM; i++)
687 ecdsa_doit[i]=0;
688#endif
689#ifndef OPENSSL_NO_ECDH
690 for (i=0; i<EC_NUM; i++)
691 ecdh_doit[i]=0;
692#endif
693
d02b48c6
RE
694
695 j=0;
696 argc--;
697 argv++;
698 while (argc)
699 {
4e74239c 700 if ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
7876e448 701 {
4e74239c 702 usertime = 0;
7876e448
RL
703 j--; /* Otherwise, -elapsed gets confused with
704 an algorithm. */
705 }
646d5695
BL
706 else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
707 {
708 argc--;
709 argv++;
710 if(argc == 0)
711 {
712 BIO_printf(bio_err,"no EVP given\n");
713 goto end;
714 }
83c40e7f
RL
715 evp_cipher=EVP_get_cipherbyname(*argv);
716 if(!evp_cipher)
646d5695 717 {
83c40e7f
RL
718 evp_md=EVP_get_digestbyname(*argv);
719 }
720 if(!evp_cipher && !evp_md)
721 {
722 BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
646d5695
BL
723 goto end;
724 }
725 doit[D_EVP]=1;
726 }
7876e448
RL
727 else if (argc > 0 && !strcmp(*argv,"-decrypt"))
728 {
3f37e73b 729 decrypt=1;
7876e448
RL
730 j--; /* Otherwise, -elapsed gets confused with
731 an algorithm. */
732 }
733 else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
5270e702
RL
734 {
735 argc--;
736 argv++;
737 if(argc == 0)
738 {
739 BIO_printf(bio_err,"no engine given\n");
740 goto end;
741 }
531d630b
RL
742 e = setup_engine(bio_err, *argv, 0);
743 /* j will be increased again further down. We just
5270e702
RL
744 don't want speed to confuse an engine with an
745 algorithm, especially when none is given (which
746 means all of them should be run) */
747 j--;
748 }
66d3e748 749#ifdef HAVE_FORK
0e211563
BL
750 else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
751 {
752 argc--;
753 argv++;
754 if(argc == 0)
755 {
756 BIO_printf(bio_err,"no multi count given\n");
757 goto end;
758 }
759 multi=atoi(argv[0]);
760 if(multi <= 0)
761 {
762 BIO_printf(bio_err,"bad multi count\n");
763 goto end;
764 }
66d3e748
RL
765 j--; /* Otherwise, -mr gets confused with
766 an algorithm. */
0e211563 767 }
66d3e748 768#endif
0e211563
BL
769 else if (argc > 0 && !strcmp(*argv,"-mr"))
770 {
771 mr=1;
772 j--; /* Otherwise, -mr gets confused with
773 an algorithm. */
774 }
5270e702 775 else
cf1b7d96 776#ifndef OPENSSL_NO_MD2
d02b48c6
RE
777 if (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
778 else
779#endif
cf1b7d96 780#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
781 if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
782 else
783#endif
cf1b7d96 784#ifndef OPENSSL_NO_MD4
3009458e
RL
785 if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
786 else
787#endif
cf1b7d96 788#ifndef OPENSSL_NO_MD5
d02b48c6
RE
789 if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
790 else
791#endif
cf1b7d96 792#ifndef OPENSSL_NO_MD5
58964a49 793 if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
d02b48c6
RE
794 else
795#endif
cf1b7d96 796#ifndef OPENSSL_NO_SHA
d02b48c6
RE
797 if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
798 else
58964a49
RE
799 if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
800 else
801#endif
cf1b7d96 802#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
803 if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
804 else
805 if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
806 else
807 if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
808 else
d02b48c6 809#endif
cf1b7d96 810#ifndef OPENSSL_NO_RC4
d02b48c6
RE
811 if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
812 else
813#endif
cf1b7d96 814#ifndef OPENSSL_NO_DES
d02b48c6
RE
815 if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
816 else if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
817 else
818#endif
ba1b8883
RL
819#ifndef OPENSSL_NO_AES
820 if (strcmp(*argv,"aes-128-cbc") == 0) doit[D_CBC_128_AES]=1;
821 else if (strcmp(*argv,"aes-192-cbc") == 0) doit[D_CBC_192_AES]=1;
822 else if (strcmp(*argv,"aes-256-cbc") == 0) doit[D_CBC_256_AES]=1;
823 else
824#endif
cf1b7d96 825#ifndef OPENSSL_NO_RSA
ccb9643f 826#if 0 /* was: #ifdef RSAref */
d02b48c6
RE
827 if (strcmp(*argv,"rsaref") == 0)
828 {
5270e702 829 RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
d02b48c6
RE
830 j--;
831 }
832 else
833#endif
c1cd88a0 834#ifndef RSA_NULL
e170a5c0 835 if (strcmp(*argv,"openssl") == 0)
d02b48c6 836 {
6dc5d570 837 RSA_set_default_method(RSA_PKCS1_SSLeay());
d02b48c6
RE
838 j--;
839 }
840 else
c1cd88a0 841#endif
cf1b7d96 842#endif /* !OPENSSL_NO_RSA */
d02b48c6
RE
843 if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
844 else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
845 else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
846 else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
847 else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
848 else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
849 else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
850 else
cf1b7d96 851#ifndef OPENSSL_NO_RC2
d02b48c6
RE
852 if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
853 else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
854 else
855#endif
cf1b7d96 856#ifndef OPENSSL_NO_RC5
58964a49
RE
857 if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
858 else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
859 else
860#endif
cf1b7d96 861#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
862 if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
863 else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
864 else
865#endif
cf1b7d96 866#ifndef OPENSSL_NO_BF
d02b48c6
RE
867 if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
868 else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
58964a49
RE
869 else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
870 else
871#endif
cf1b7d96 872#ifndef OPENSSL_NO_CAST
58964a49
RE
873 if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
874 else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
875 else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
d02b48c6
RE
876 else
877#endif
cf1b7d96 878#ifndef OPENSSL_NO_DES
d02b48c6
RE
879 if (strcmp(*argv,"des") == 0)
880 {
881 doit[D_CBC_DES]=1;
882 doit[D_EDE3_DES]=1;
883 }
884 else
885#endif
ba1b8883
RL
886#ifndef OPENSSL_NO_AES
887 if (strcmp(*argv,"aes") == 0)
888 {
889 doit[D_CBC_128_AES]=1;
890 doit[D_CBC_192_AES]=1;
891 doit[D_CBC_256_AES]=1;
892 }
893 else
894#endif
cf1b7d96 895#ifndef OPENSSL_NO_RSA
d02b48c6
RE
896 if (strcmp(*argv,"rsa") == 0)
897 {
898 rsa_doit[R_RSA_512]=1;
899 rsa_doit[R_RSA_1024]=1;
900 rsa_doit[R_RSA_2048]=1;
901 rsa_doit[R_RSA_4096]=1;
902 }
903 else
904#endif
cf1b7d96 905#ifndef OPENSSL_NO_DSA
d02b48c6
RE
906 if (strcmp(*argv,"dsa") == 0)
907 {
908 dsa_doit[R_DSA_512]=1;
909 dsa_doit[R_DSA_1024]=1;
910 }
911 else
e172d60d
BM
912#endif
913#ifndef OPENSSL_NO_ECDSA
914 if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2;
915 else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2;
916 else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2;
917 else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2;
918 else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2;
919 else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2;
920 else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2;
921 else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2;
922 else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2;
923 else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2;
924 else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2;
925 else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2;
926 else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2;
927 else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2;
928 else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2;
929 else if (strcmp(*argv,"ecdsa") == 0)
930 {
931 for (i=0; i < EC_NUM; i++)
932 ecdsa_doit[i]=1;
933 }
934 else
935#endif
936#ifndef OPENSSL_NO_ECDH
937 if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2;
938 else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2;
939 else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2;
940 else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2;
941 else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2;
942 else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2;
943 else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2;
944 else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2;
945 else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2;
946 else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2;
947 else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2;
948 else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2;
949 else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2;
950 else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2;
951 else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2;
952 else if (strcmp(*argv,"ecdh") == 0)
953 {
954 for (i=0; i < EC_NUM; i++)
955 ecdh_doit[i]=1;
956 }
957 else
d02b48c6
RE
958#endif
959 {
3009458e
RL
960 BIO_printf(bio_err,"Error: bad option or value\n");
961 BIO_printf(bio_err,"\n");
962 BIO_printf(bio_err,"Available values:\n");
cf1b7d96 963#ifndef OPENSSL_NO_MD2
3009458e
RL
964 BIO_printf(bio_err,"md2 ");
965#endif
cf1b7d96 966#ifndef OPENSSL_NO_MDC2
3009458e
RL
967 BIO_printf(bio_err,"mdc2 ");
968#endif
cf1b7d96 969#ifndef OPENSSL_NO_MD4
3009458e
RL
970 BIO_printf(bio_err,"md4 ");
971#endif
cf1b7d96 972#ifndef OPENSSL_NO_MD5
3009458e 973 BIO_printf(bio_err,"md5 ");
cf1b7d96 974#ifndef OPENSSL_NO_HMAC
3009458e
RL
975 BIO_printf(bio_err,"hmac ");
976#endif
977#endif
cf1b7d96 978#ifndef OPENSSL_NO_SHA1
3009458e
RL
979 BIO_printf(bio_err,"sha1 ");
980#endif
cf1b7d96 981#ifndef OPENSSL_NO_RIPEMD160
3009458e
RL
982 BIO_printf(bio_err,"rmd160");
983#endif
cf1b7d96
RL
984#if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
985 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
986 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
3009458e
RL
987 BIO_printf(bio_err,"\n");
988#endif
989
cf1b7d96 990#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
991 BIO_printf(bio_err,"idea-cbc ");
992#endif
cf1b7d96 993#ifndef OPENSSL_NO_RC2
d02b48c6
RE
994 BIO_printf(bio_err,"rc2-cbc ");
995#endif
cf1b7d96 996#ifndef OPENSSL_NO_RC5
58964a49
RE
997 BIO_printf(bio_err,"rc5-cbc ");
998#endif
cf1b7d96 999#ifndef OPENSSL_NO_BF
d02b48c6
RE
1000 BIO_printf(bio_err,"bf-cbc");
1001#endif
cf1b7d96
RL
1002#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1003 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
d02b48c6
RE
1004 BIO_printf(bio_err,"\n");
1005#endif
ba1b8883 1006#ifndef OPENSSL_NO_DES
d02b48c6 1007 BIO_printf(bio_err,"des-cbc des-ede3 ");
ba1b8883
RL
1008#endif
1009#ifndef OPENSSL_NO_AES
1010 BIO_printf(bio_err,"aes-128-cbc aes-192-cbc aes-256-cbc ");
1011#endif
cf1b7d96 1012#ifndef OPENSSL_NO_RC4
d02b48c6
RE
1013 BIO_printf(bio_err,"rc4");
1014#endif
3009458e
RL
1015 BIO_printf(bio_err,"\n");
1016
cf1b7d96 1017#ifndef OPENSSL_NO_RSA
3009458e 1018 BIO_printf(bio_err,"rsa512 rsa1024 rsa2048 rsa4096\n");
d02b48c6 1019#endif
3009458e 1020
cf1b7d96 1021#ifndef OPENSSL_NO_DSA
3009458e
RL
1022 BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n");
1023#endif
e172d60d
BM
1024#ifndef OPENSSL_NO_ECDSA
1025 BIO_printf(bio_err,"ecdsap160 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1026 BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n");
1027 BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n");
1028 BIO_printf(bio_err,"ecdsa\n");
1029#endif
1030#ifndef OPENSSL_NO_ECDH
1031 BIO_printf(bio_err,"ecdhp160 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1032 BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n");
1033 BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n");
1034 BIO_printf(bio_err,"ecdh\n");
1035#endif
3009458e 1036
cf1b7d96 1037#ifndef OPENSSL_NO_IDEA
3009458e
RL
1038 BIO_printf(bio_err,"idea ");
1039#endif
cf1b7d96 1040#ifndef OPENSSL_NO_RC2
3009458e
RL
1041 BIO_printf(bio_err,"rc2 ");
1042#endif
cf1b7d96 1043#ifndef OPENSSL_NO_DES
3009458e 1044 BIO_printf(bio_err,"des ");
d02b48c6 1045#endif
ba1b8883
RL
1046#ifndef OPENSSL_NO_AES
1047 BIO_printf(bio_err,"aes ");
1048#endif
cf1b7d96 1049#ifndef OPENSSL_NO_RSA
3009458e
RL
1050 BIO_printf(bio_err,"rsa ");
1051#endif
cf1b7d96 1052#ifndef OPENSSL_NO_BF
3009458e
RL
1053 BIO_printf(bio_err,"blowfish");
1054#endif
cf1b7d96
RL
1055#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
1056 !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
ba1b8883 1057 !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_AES)
4e74239c 1058 BIO_printf(bio_err,"\n");
3009458e
RL
1059#endif
1060
4e74239c 1061 BIO_printf(bio_err,"\n");
3009458e 1062 BIO_printf(bio_err,"Available options:\n");
5d9470ff 1063#if defined(TIMES) || defined(USE_TOD)
4e74239c 1064 BIO_printf(bio_err,"-elapsed measure time in real time instead of CPU user time.\n");
3132e196 1065#endif
5270e702 1066 BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
0e211563
BL
1067 BIO_printf(bio_err,"-evp e use EVP e.\n");
1068 BIO_printf(bio_err,"-decrypt time decryption instead of encryption (only EVP).\n");
1069 BIO_printf(bio_err,"-mr produce machine readable output.\n");
66d3e748 1070#ifdef HAVE_FORK
0e211563 1071 BIO_printf(bio_err,"-multi n run n benchmarks in parallel.\n");
66d3e748 1072#endif
d02b48c6
RE
1073 goto end;
1074 }
1075 argc--;
1076 argv++;
1077 j++;
1078 }
1079
66d3e748 1080#ifdef HAVE_FORK
0e211563
BL
1081 if(multi && do_multi(multi))
1082 goto show_res;
66d3e748 1083#endif
0e211563 1084
d02b48c6
RE
1085 if (j == 0)
1086 {
1087 for (i=0; i<ALGOR_NUM; i++)
53d28679
BM
1088 {
1089 if (i != D_EVP)
1090 doit[i]=1;
1091 }
d02b48c6
RE
1092 for (i=0; i<RSA_NUM; i++)
1093 rsa_doit[i]=1;
1094 for (i=0; i<DSA_NUM; i++)
1095 dsa_doit[i]=1;
1096 }
1097 for (i=0; i<ALGOR_NUM; i++)
1098 if (doit[i]) pr_header++;
1099
0e211563 1100 if (usertime == 0 && !mr)
4e74239c 1101 BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
0e211563 1102 if (usertime <= 0 && !mr)
4e74239c
RL
1103 {
1104 BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
1105 BIO_printf(bio_err,"program when this computer is idle.\n");
1106 }
d02b48c6 1107
cf1b7d96 1108#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1109 for (i=0; i<RSA_NUM; i++)
1110 {
5e4ca422 1111 const unsigned char *p;
d02b48c6
RE
1112
1113 p=rsa_data[i];
1114 rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
1115 if (rsa_key[i] == NULL)
1116 {
1117 BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
1118 goto end;
1119 }
58964a49
RE
1120#if 0
1121 else
1122 {
0e211563
BL
1123 BIO_printf(bio_err,mr ? "+RK:%d:"
1124 : "Loaded RSA key, %d bit modulus and e= 0x",
1125 BN_num_bits(rsa_key[i]->n));
58964a49
RE
1126 BN_print(bio_err,rsa_key[i]->e);
1127 BIO_printf(bio_err,"\n");
1128 }
1129#endif
d02b48c6
RE
1130 }
1131#endif
1132
cf1b7d96 1133#ifndef OPENSSL_NO_DSA
d02b48c6
RE
1134 dsa_key[0]=get_dsa512();
1135 dsa_key[1]=get_dsa1024();
1136 dsa_key[2]=get_dsa2048();
1137#endif
1138
cf1b7d96 1139#ifndef OPENSSL_NO_DES
c2e4f17c
RL
1140 DES_set_key_unchecked(&key,&sch);
1141 DES_set_key_unchecked(&key2,&sch2);
1142 DES_set_key_unchecked(&key3,&sch3);
d02b48c6 1143#endif
ba1b8883
RL
1144#ifndef OPENSSL_NO_AES
1145 AES_set_encrypt_key(key16,128,&aes_ks1);
1146 AES_set_encrypt_key(key24,192,&aes_ks2);
1147 AES_set_encrypt_key(key32,256,&aes_ks3);
1148#endif
cf1b7d96 1149#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
1150 idea_set_encrypt_key(key16,&idea_ks);
1151#endif
cf1b7d96 1152#ifndef OPENSSL_NO_RC4
d02b48c6
RE
1153 RC4_set_key(&rc4_ks,16,key16);
1154#endif
cf1b7d96 1155#ifndef OPENSSL_NO_RC2
d02b48c6
RE
1156 RC2_set_key(&rc2_ks,16,key16,128);
1157#endif
cf1b7d96 1158#ifndef OPENSSL_NO_RC5
58964a49
RE
1159 RC5_32_set_key(&rc5_ks,16,key16,12);
1160#endif
cf1b7d96 1161#ifndef OPENSSL_NO_BF
d02b48c6
RE
1162 BF_set_key(&bf_ks,16,key16);
1163#endif
cf1b7d96 1164#ifndef OPENSSL_NO_CAST
58964a49
RE
1165 CAST_set_key(&cast_ks,16,key16);
1166#endif
cf1b7d96 1167#ifndef OPENSSL_NO_RSA
d02b48c6 1168 memset(rsa_c,0,sizeof(rsa_c));
f5d7a031 1169#endif
d02b48c6 1170#ifndef SIGALRM
cf1b7d96 1171#ifndef OPENSSL_NO_DES
d02b48c6
RE
1172 BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
1173 count=10;
1174 do {
1175 long i;
1176 count*=2;
b83eddc5 1177 Time_F(START);
d02b48c6 1178 for (i=count; i; i--)
b83eddc5 1179 DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
3d90a324 1180 &sch,DES_ENCRYPT);
0e211563 1181 d=Time_F(STOP);
d02b48c6 1182 } while (d <3);
646d5695 1183 save_count=count;
d02b48c6
RE
1184 c[D_MD2][0]=count/10;
1185 c[D_MDC2][0]=count/10;
3009458e 1186 c[D_MD4][0]=count;
d02b48c6 1187 c[D_MD5][0]=count;
58964a49 1188 c[D_HMAC][0]=count;
d02b48c6 1189 c[D_SHA1][0]=count;
58964a49 1190 c[D_RMD160][0]=count;
d02b48c6
RE
1191 c[D_RC4][0]=count*5;
1192 c[D_CBC_DES][0]=count;
1193 c[D_EDE3_DES][0]=count/3;
1194 c[D_CBC_IDEA][0]=count;
1195 c[D_CBC_RC2][0]=count;
58964a49 1196 c[D_CBC_RC5][0]=count;
d02b48c6 1197 c[D_CBC_BF][0]=count;
58964a49 1198 c[D_CBC_CAST][0]=count;
d02b48c6
RE
1199
1200 for (i=1; i<SIZE_NUM; i++)
1201 {
1202 c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
1203 c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
3009458e 1204 c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
d02b48c6 1205 c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
58964a49 1206 c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
d02b48c6 1207 c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
58964a49 1208 c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
d02b48c6
RE
1209 }
1210 for (i=1; i<SIZE_NUM; i++)
1211 {
1212 long l0,l1;
1213
1214 l0=(long)lengths[i-1];
1215 l1=(long)lengths[i];
1216 c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
1217 c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
1218 c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
1219 c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
1220 c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
58964a49 1221 c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
d02b48c6 1222 c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
58964a49 1223 c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
d02b48c6 1224 }
cf1b7d96 1225#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1226 rsa_c[R_RSA_512][0]=count/2000;
1227 rsa_c[R_RSA_512][1]=count/400;
1228 for (i=1; i<RSA_NUM; i++)
1229 {
1230 rsa_c[i][0]=rsa_c[i-1][0]/8;
1231 rsa_c[i][1]=rsa_c[i-1][1]/4;
1232 if ((rsa_doit[i] <= 1) && (rsa_c[i][0] == 0))
1233 rsa_doit[i]=0;
1234 else
1235 {
dfeab068 1236 if (rsa_c[i][0] == 0)
d02b48c6
RE
1237 {
1238 rsa_c[i][0]=1;
1239 rsa_c[i][1]=20;
1240 }
1241 }
1242 }
f5d7a031 1243#endif
d02b48c6 1244
f89aebb1 1245#ifndef OPENSSL_NO_DSA
d02b48c6
RE
1246 dsa_c[R_DSA_512][0]=count/1000;
1247 dsa_c[R_DSA_512][1]=count/1000/2;
1248 for (i=1; i<DSA_NUM; i++)
1249 {
1250 dsa_c[i][0]=dsa_c[i-1][0]/4;
1251 dsa_c[i][1]=dsa_c[i-1][1]/4;
1252 if ((dsa_doit[i] <= 1) && (dsa_c[i][0] == 0))
1253 dsa_doit[i]=0;
1254 else
1255 {
1256 if (dsa_c[i] == 0)
1257 {
1258 dsa_c[i][0]=1;
1259 dsa_c[i][1]=1;
1260 }
1261 }
1262 }
f89aebb1 1263#endif
d02b48c6 1264
e172d60d
BM
1265#ifndef OPENSSL_NO_ECDSA
1266 ecdsa_c[R_EC_P160][0]=count/1000;
1267 ecdsa_c[R_EC_P160][1]=count/1000/2;
1268 for (i=R_EC_P224; i<=R_EC_P521; i++)
1269 {
1270 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1271 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1272 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1273 ecdsa_doit[i]=0;
1274 else
1275 {
1276 if (ecdsa_c[i] == 0)
1277 {
1278 ecdsa_c[i][0]=1;
1279 ecdsa_c[i][1]=1;
1280 }
1281 }
1282 }
1283 ecdsa_c[R_EC_K163][0]=count/1000;
1284 ecdsa_c[R_EC_K163][1]=count/1000/2;
1285 for (i=R_EC_K233; i<=R_EC_K571; i++)
1286 {
1287 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1288 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1289 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1290 ecdsa_doit[i]=0;
1291 else
1292 {
1293 if (ecdsa_c[i] == 0)
1294 {
1295 ecdsa_c[i][0]=1;
1296 ecdsa_c[i][1]=1;
1297 }
1298 }
1299 }
1300 ecdsa_c[R_EC_B163][0]=count/1000;
1301 ecdsa_c[R_EC_B163][1]=count/1000/2;
1302 for (i=R_EC_B233; i<=R_EC_B571; i++)
1303 {
1304 ecdsa_c[i][0]=ecdsa_c[i-1][0]/2;
1305 ecdsa_c[i][1]=ecdsa_c[i-1][1]/2;
1306 if ((ecdsa_doit[i] <= 1) && (ecdsa_c[i][0] == 0))
1307 ecdsa_doit[i]=0;
1308 else
1309 {
1310 if (ecdsa_c[i] == 0)
1311 {
1312 ecdsa_c[i][0]=1;
1313 ecdsa_c[i][1]=1;
1314 }
1315 }
1316 }
1317#endif
1318
1319#ifndef OPENSSL_NO_ECDH
1320 ecdh_c[R_EC_P160][0]=count/1000;
1321 ecdh_c[R_EC_P160][1]=count/1000;
1322 for (i=R_EC_P224; i<=R_EC_P521; i++)
1323 {
1324 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1325 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1326 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1327 ecdh_doit[i]=0;
1328 else
1329 {
1330 if (ecdh_c[i] == 0)
1331 {
1332 ecdh_c[i][0]=1;
1333 ecdh_c[i][1]=1;
1334 }
1335 }
1336 }
1337 ecdh_c[R_EC_K163][0]=count/1000;
1338 ecdh_c[R_EC_K163][1]=count/1000;
1339 for (i=R_EC_K233; i<=R_EC_K571; i++)
1340 {
1341 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1342 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1343 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1344 ecdh_doit[i]=0;
1345 else
1346 {
1347 if (ecdh_c[i] == 0)
1348 {
1349 ecdh_c[i][0]=1;
1350 ecdh_c[i][1]=1;
1351 }
1352 }
1353 }
1354 ecdh_c[R_EC_B163][0]=count/1000;
1355 ecdh_c[R_EC_B163][1]=count/1000;
1356 for (i=R_EC_B233; i<=R_EC_B571; i++)
1357 {
1358 ecdh_c[i][0]=ecdh_c[i-1][0]/2;
1359 ecdh_c[i][1]=ecdh_c[i-1][1]/2;
1360 if ((ecdh_doit[i] <= 1) && (ecdh_c[i][0] == 0))
1361 ecdh_doit[i]=0;
1362 else
1363 {
1364 if (ecdh_c[i] == 0)
1365 {
1366 ecdh_c[i][0]=1;
1367 ecdh_c[i][1]=1;
1368 }
1369 }
1370 }
1371#endif
1372
58964a49 1373#define COND(d) (count < (d))
d02b48c6
RE
1374#define COUNT(d) (d)
1375#else
63da21c0
BM
1376/* not worth fixing */
1377# error "You cannot disable DES on systems without SIGALRM."
cf1b7d96 1378#endif /* OPENSSL_NO_DES */
63da21c0 1379#else
d02b48c6
RE
1380#define COND(c) (run)
1381#define COUNT(d) (count)
1382 signal(SIGALRM,sig_done);
63da21c0 1383#endif /* SIGALRM */
d02b48c6 1384
cf1b7d96 1385#ifndef OPENSSL_NO_MD2
d02b48c6
RE
1386 if (doit[D_MD2])
1387 {
1388 for (j=0; j<SIZE_NUM; j++)
1389 {
1390 print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
0e211563 1391 Time_F(START);
d02b48c6 1392 for (count=0,run=1; COND(c[D_MD2][j]); count++)
0e211563
BL
1393 EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
1394 d=Time_F(STOP);
1395 print_result(D_MD2,j,count,d);
d02b48c6
RE
1396 }
1397 }
1398#endif
cf1b7d96 1399#ifndef OPENSSL_NO_MDC2
d02b48c6
RE
1400 if (doit[D_MDC2])
1401 {
1402 for (j=0; j<SIZE_NUM; j++)
1403 {
1404 print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
0e211563 1405 Time_F(START);
d02b48c6 1406 for (count=0,run=1; COND(c[D_MDC2][j]); count++)
0e211563
BL
1407 EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
1408 d=Time_F(STOP);
1409 print_result(D_MDC2,j,count,d);
d02b48c6
RE
1410 }
1411 }
1412#endif
1413
cf1b7d96 1414#ifndef OPENSSL_NO_MD4
3009458e
RL
1415 if (doit[D_MD4])
1416 {
1417 for (j=0; j<SIZE_NUM; j++)
1418 {
1419 print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
0e211563 1420 Time_F(START);
3009458e 1421 for (count=0,run=1; COND(c[D_MD4][j]); count++)
0e211563
BL
1422 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
1423 d=Time_F(STOP);
1424 print_result(D_MD4,j,count,d);
3009458e
RL
1425 }
1426 }
1427#endif
1428
cf1b7d96 1429#ifndef OPENSSL_NO_MD5
d02b48c6
RE
1430 if (doit[D_MD5])
1431 {
1432 for (j=0; j<SIZE_NUM; j++)
1433 {
1434 print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
0e211563 1435 Time_F(START);
d02b48c6 1436 for (count=0,run=1; COND(c[D_MD5][j]); count++)
0e211563
BL
1437 EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
1438 d=Time_F(STOP);
1439 print_result(D_MD5,j,count,d);
d02b48c6
RE
1440 }
1441 }
1442#endif
1443
cf1b7d96 1444#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
58964a49 1445 if (doit[D_HMAC])
d02b48c6 1446 {
58964a49 1447 HMAC_CTX hctx;
dbad1690
BL
1448
1449 HMAC_CTX_init(&hctx);
ff3fa48f 1450 HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
de941e28 1451 16,EVP_md5(), NULL);
58964a49 1452
d02b48c6
RE
1453 for (j=0; j<SIZE_NUM; j++)
1454 {
58964a49 1455 print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
0e211563 1456 Time_F(START);
58964a49
RE
1457 for (count=0,run=1; COND(c[D_HMAC][j]); count++)
1458 {
de941e28
DSH
1459 HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
1460 HMAC_Update(&hctx,buf,lengths[j]);
1461 HMAC_Final(&hctx,&(hmac[0]),NULL);
58964a49 1462 }
0e211563
BL
1463 d=Time_F(STOP);
1464 print_result(D_HMAC,j,count,d);
d02b48c6 1465 }
dbad1690 1466 HMAC_CTX_cleanup(&hctx);
d02b48c6
RE
1467 }
1468#endif
cf1b7d96 1469#ifndef OPENSSL_NO_SHA
d02b48c6
RE
1470 if (doit[D_SHA1])
1471 {
1472 for (j=0; j<SIZE_NUM; j++)
1473 {
1474 print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
0e211563 1475 Time_F(START);
d02b48c6 1476 for (count=0,run=1; COND(c[D_SHA1][j]); count++)
0e211563
BL
1477 EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
1478 d=Time_F(STOP);
1479 print_result(D_SHA1,j,count,d);
d02b48c6
RE
1480 }
1481 }
1482#endif
cf1b7d96 1483#ifndef OPENSSL_NO_RIPEMD
58964a49
RE
1484 if (doit[D_RMD160])
1485 {
1486 for (j=0; j<SIZE_NUM; j++)
1487 {
1488 print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
0e211563 1489 Time_F(START);
58964a49 1490 for (count=0,run=1; COND(c[D_RMD160][j]); count++)
0e211563
BL
1491 EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
1492 d=Time_F(STOP);
1493 print_result(D_RMD160,j,count,d);
58964a49
RE
1494 }
1495 }
1496#endif
cf1b7d96 1497#ifndef OPENSSL_NO_RC4
d02b48c6
RE
1498 if (doit[D_RC4])
1499 {
1500 for (j=0; j<SIZE_NUM; j++)
1501 {
1502 print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
0e211563 1503 Time_F(START);
d02b48c6
RE
1504 for (count=0,run=1; COND(c[D_RC4][j]); count++)
1505 RC4(&rc4_ks,(unsigned int)lengths[j],
1506 buf,buf);
0e211563
BL
1507 d=Time_F(STOP);
1508 print_result(D_RC4,j,count,d);
d02b48c6
RE
1509 }
1510 }
1511#endif
cf1b7d96 1512#ifndef OPENSSL_NO_DES
d02b48c6
RE
1513 if (doit[D_CBC_DES])
1514 {
1515 for (j=0; j<SIZE_NUM; j++)
1516 {
1517 print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
0e211563 1518 Time_F(START);
d02b48c6 1519 for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
c2e4f17c 1520 DES_ncbc_encrypt(buf,buf,lengths[j],&sch,
ba1b8883 1521 &DES_iv,DES_ENCRYPT);
0e211563
BL
1522 d=Time_F(STOP);
1523 print_result(D_CBC_DES,j,count,d);
d02b48c6
RE
1524 }
1525 }
1526
1527 if (doit[D_EDE3_DES])
1528 {
1529 for (j=0; j<SIZE_NUM; j++)
1530 {
1531 print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
0e211563 1532 Time_F(START);
d02b48c6 1533 for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
c2e4f17c 1534 DES_ede3_cbc_encrypt(buf,buf,lengths[j],
dbad1690 1535 &sch,&sch2,&sch3,
ba1b8883 1536 &DES_iv,DES_ENCRYPT);
0e211563
BL
1537 d=Time_F(STOP);
1538 print_result(D_EDE3_DES,j,count,d);
d02b48c6
RE
1539 }
1540 }
1541#endif
ba1b8883
RL
1542#ifndef OPENSSL_NO_AES
1543 if (doit[D_CBC_128_AES])
1544 {
1545 for (j=0; j<SIZE_NUM; j++)
1546 {
1547 print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
1548 Time_F(START);
1549 for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
1550 AES_cbc_encrypt(buf,buf,
1551 (unsigned long)lengths[j],&aes_ks1,
1552 iv,AES_ENCRYPT);
1553 d=Time_F(STOP);
1554 print_result(D_CBC_128_AES,j,count,d);
1555 }
1556 }
1557 if (doit[D_CBC_192_AES])
1558 {
1559 for (j=0; j<SIZE_NUM; j++)
1560 {
1561 print_message(names[D_CBC_192_AES],c[D_CBC_192_AES][j],lengths[j]);
1562 Time_F(START);
1563 for (count=0,run=1; COND(c[D_CBC_192_AES][j]); count++)
1564 AES_cbc_encrypt(buf,buf,
1565 (unsigned long)lengths[j],&aes_ks2,
1566 iv,AES_ENCRYPT);
1567 d=Time_F(STOP);
1568 print_result(D_CBC_192_AES,j,count,d);
1569 }
1570 }
1571 if (doit[D_CBC_256_AES])
1572 {
1573 for (j=0; j<SIZE_NUM; j++)
1574 {
1575 print_message(names[D_CBC_256_AES],c[D_CBC_256_AES][j],lengths[j]);
1576 Time_F(START);
1577 for (count=0,run=1; COND(c[D_CBC_256_AES][j]); count++)
1578 AES_cbc_encrypt(buf,buf,
1579 (unsigned long)lengths[j],&aes_ks3,
1580 iv,AES_ENCRYPT);
1581 d=Time_F(STOP);
1582 print_result(D_CBC_256_AES,j,count,d);
1583 }
1584 }
1585
1586#endif
cf1b7d96 1587#ifndef OPENSSL_NO_IDEA
d02b48c6
RE
1588 if (doit[D_CBC_IDEA])
1589 {
1590 for (j=0; j<SIZE_NUM; j++)
1591 {
1592 print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
0e211563 1593 Time_F(START);
d02b48c6
RE
1594 for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
1595 idea_cbc_encrypt(buf,buf,
1596 (unsigned long)lengths[j],&idea_ks,
12ba413c 1597 iv,IDEA_ENCRYPT);
0e211563
BL
1598 d=Time_F(STOP);
1599 print_result(D_CBC_IDEA,j,count,d);
d02b48c6
RE
1600 }
1601 }
1602#endif
cf1b7d96 1603#ifndef OPENSSL_NO_RC2
d02b48c6
RE
1604 if (doit[D_CBC_RC2])
1605 {
1606 for (j=0; j<SIZE_NUM; j++)
1607 {
1608 print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
0e211563 1609 Time_F(START);
d02b48c6
RE
1610 for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
1611 RC2_cbc_encrypt(buf,buf,
1612 (unsigned long)lengths[j],&rc2_ks,
12ba413c 1613 iv,RC2_ENCRYPT);
0e211563
BL
1614 d=Time_F(STOP);
1615 print_result(D_CBC_RC2,j,count,d);
d02b48c6
RE
1616 }
1617 }
1618#endif
cf1b7d96 1619#ifndef OPENSSL_NO_RC5
58964a49
RE
1620 if (doit[D_CBC_RC5])
1621 {
1622 for (j=0; j<SIZE_NUM; j++)
1623 {
1624 print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
0e211563 1625 Time_F(START);
58964a49
RE
1626 for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
1627 RC5_32_cbc_encrypt(buf,buf,
1628 (unsigned long)lengths[j],&rc5_ks,
12ba413c 1629 iv,RC5_ENCRYPT);
0e211563
BL
1630 d=Time_F(STOP);
1631 print_result(D_CBC_RC5,j,count,d);
58964a49
RE
1632 }
1633 }
1634#endif
cf1b7d96 1635#ifndef OPENSSL_NO_BF
d02b48c6
RE
1636 if (doit[D_CBC_BF])
1637 {
1638 for (j=0; j<SIZE_NUM; j++)
1639 {
1640 print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
0e211563 1641 Time_F(START);
d02b48c6
RE
1642 for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
1643 BF_cbc_encrypt(buf,buf,
1644 (unsigned long)lengths[j],&bf_ks,
12ba413c 1645 iv,BF_ENCRYPT);
0e211563
BL
1646 d=Time_F(STOP);
1647 print_result(D_CBC_BF,j,count,d);
d02b48c6
RE
1648 }
1649 }
1650#endif
cf1b7d96 1651#ifndef OPENSSL_NO_CAST
58964a49
RE
1652 if (doit[D_CBC_CAST])
1653 {
1654 for (j=0; j<SIZE_NUM; j++)
1655 {
1656 print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
0e211563 1657 Time_F(START);
58964a49
RE
1658 for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
1659 CAST_cbc_encrypt(buf,buf,
1660 (unsigned long)lengths[j],&cast_ks,
12ba413c 1661 iv,CAST_ENCRYPT);
0e211563
BL
1662 d=Time_F(STOP);
1663 print_result(D_CBC_CAST,j,count,d);
58964a49
RE
1664 }
1665 }
1666#endif
d02b48c6 1667
646d5695
BL
1668 if (doit[D_EVP])
1669 {
1670 for (j=0; j<SIZE_NUM; j++)
1671 {
83c40e7f
RL
1672 if (evp_cipher)
1673 {
1674 EVP_CIPHER_CTX ctx;
1675 int outl;
1676
1677 names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
ba1b8883
RL
1678 /* -O3 -fschedule-insns messes up an
1679 * optimization here! names[D_EVP]
1680 * somehow becomes NULL */
83c40e7f
RL
1681 print_message(names[D_EVP],save_count,
1682 lengths[j]);
1683
1684 EVP_CIPHER_CTX_init(&ctx);
1685 if(decrypt)
1686 EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1687 else
1688 EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
1689
1690 Time_F(START);
1691 if(decrypt)
1692 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1693 EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1694 else
1695 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
1696 EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
1697 if(decrypt)
1698 EVP_DecryptFinal_ex(&ctx,buf,&outl);
1699 else
1700 EVP_EncryptFinal_ex(&ctx,buf,&outl);
1701 d=Time_F(STOP);
1702 }
1703 if (evp_md)
1704 {
1705 names[D_EVP]=OBJ_nid2ln(evp_md->type);
1706 print_message(names[D_EVP],save_count,
1707 lengths[j]);
1708
1709 Time_F(START);
3f37e73b 1710 for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
83c40e7f
RL
1711 EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
1712
1713 d=Time_F(STOP);
1714 }
0e211563 1715 print_result(D_EVP,j,count,d);
646d5695
BL
1716 }
1717 }
1718
373b575f 1719 RAND_pseudo_bytes(buf,36);
cf1b7d96 1720#ifndef OPENSSL_NO_RSA
d02b48c6
RE
1721 for (j=0; j<RSA_NUM; j++)
1722 {
c91e1259 1723 int ret;
d02b48c6 1724 if (!rsa_doit[j]) continue;
c91e1259 1725 ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
03ea28c9
RL
1726 if (ret == 0)
1727 {
1728 BIO_printf(bio_err,"RSA sign failure. No RSA sign will be done.\n");
1729 ERR_print_errors(bio_err);
1730 rsa_count=1;
1731 }
1732 else
d02b48c6 1733 {
03ea28c9
RL
1734 pkey_print_message("private","rsa",
1735 rsa_c[j][0],rsa_bits[j],
1736 RSA_SECONDS);
1737/* RSA_blinding_on(rsa_key[j],NULL); */
0e211563 1738 Time_F(START);
03ea28c9 1739 for (count=0,run=1; COND(rsa_c[j][0]); count++)
d02b48c6 1740 {
03ea28c9
RL
1741 ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
1742 &rsa_num, rsa_key[j]);
1743 if (ret == 0)
1744 {
1745 BIO_printf(bio_err,
1746 "RSA sign failure\n");
1747 ERR_print_errors(bio_err);
1748 count=1;
1749 break;
1750 }
d02b48c6 1751 }
0e211563
BL
1752 d=Time_F(STOP);
1753 BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n"
1754 : "%ld %d bit private RSA's in %.2fs\n",
1755 count,rsa_bits[j],d);
03ea28c9
RL
1756 rsa_results[j][0]=d/(double)count;
1757 rsa_count=count;
d02b48c6 1758 }
d02b48c6 1759
58964a49 1760#if 1
c91e1259 1761 ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
03ea28c9 1762 if (ret <= 0)
d02b48c6 1763 {
03ea28c9
RL
1764 BIO_printf(bio_err,"RSA verify failure. No RSA verify will be done.\n");
1765 ERR_print_errors(bio_err);
51740b12 1766 rsa_doit[j] = 0;
03ea28c9
RL
1767 }
1768 else
1769 {
1770 pkey_print_message("public","rsa",
1771 rsa_c[j][1],rsa_bits[j],
1772 RSA_SECONDS);
0e211563 1773 Time_F(START);
03ea28c9 1774 for (count=0,run=1; COND(rsa_c[j][1]); count++)
d02b48c6 1775 {
03ea28c9
RL
1776 ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
1777 rsa_num, rsa_key[j]);
1778 if (ret == 0)
1779 {
1780 BIO_printf(bio_err,
1781 "RSA verify failure\n");
1782 ERR_print_errors(bio_err);
1783 count=1;
1784 break;
1785 }
d02b48c6 1786 }
0e211563
BL
1787 d=Time_F(STOP);
1788 BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n"
1789 : "%ld %d bit public RSA's in %.2fs\n",
1790 count,rsa_bits[j],d);
03ea28c9 1791 rsa_results[j][1]=d/(double)count;
d02b48c6 1792 }
58964a49 1793#endif
d02b48c6
RE
1794
1795 if (rsa_count <= 1)
1796 {
1797 /* if longer than 10s, don't do any more */
1798 for (j++; j<RSA_NUM; j++)
1799 rsa_doit[j]=0;
1800 }
1801 }
1802#endif
1803
373b575f 1804 RAND_pseudo_bytes(buf,20);
cf1b7d96 1805#ifndef OPENSSL_NO_DSA
99a97051
UM
1806 if (RAND_status() != 1)
1807 {
1808 RAND_seed(rnd_seed, sizeof rnd_seed);
1809 rnd_fake = 1;
1810 }
d02b48c6
RE
1811 for (j=0; j<DSA_NUM; j++)
1812 {
58964a49 1813 unsigned int kk;
03ea28c9 1814 int ret;
58964a49 1815
d02b48c6 1816 if (!dsa_doit[j]) continue;
af436bc1 1817/* DSA_generate_key(dsa_key[j]); */
d02b48c6 1818/* DSA_sign_setup(dsa_key[j],NULL); */
03ea28c9 1819 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1820 &kk,dsa_key[j]);
03ea28c9
RL
1821 if (ret == 0)
1822 {
1823 BIO_printf(bio_err,"DSA sign failure. No DSA sign will be done.\n");
1824 ERR_print_errors(bio_err);
1825 rsa_count=1;
1826 }
1827 else
d02b48c6 1828 {
03ea28c9
RL
1829 pkey_print_message("sign","dsa",
1830 dsa_c[j][0],dsa_bits[j],
1831 DSA_SECONDS);
0e211563 1832 Time_F(START);
03ea28c9 1833 for (count=0,run=1; COND(dsa_c[j][0]); count++)
d02b48c6 1834 {
03ea28c9
RL
1835 ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
1836 &kk,dsa_key[j]);
1837 if (ret == 0)
1838 {
1839 BIO_printf(bio_err,
1840 "DSA sign failure\n");
1841 ERR_print_errors(bio_err);
1842 count=1;
1843 break;
1844 }
d02b48c6 1845 }
0e211563
BL
1846 d=Time_F(STOP);
1847 BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n"
1848 : "%ld %d bit DSA signs in %.2fs\n",
1849 count,dsa_bits[j],d);
03ea28c9
RL
1850 dsa_results[j][0]=d/(double)count;
1851 rsa_count=count;
d02b48c6 1852 }
d02b48c6 1853
03ea28c9 1854 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
dfeab068 1855 kk,dsa_key[j]);
03ea28c9
RL
1856 if (ret <= 0)
1857 {
1858 BIO_printf(bio_err,"DSA verify failure. No DSA verify will be done.\n");
1859 ERR_print_errors(bio_err);
1860 dsa_doit[j] = 0;
1861 }
1862 else
d02b48c6 1863 {
03ea28c9
RL
1864 pkey_print_message("verify","dsa",
1865 dsa_c[j][1],dsa_bits[j],
1866 DSA_SECONDS);
0e211563 1867 Time_F(START);
03ea28c9 1868 for (count=0,run=1; COND(dsa_c[j][1]); count++)
d02b48c6 1869 {
03ea28c9
RL
1870 ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
1871 kk,dsa_key[j]);
1872 if (ret <= 0)
1873 {
1874 BIO_printf(bio_err,
1875 "DSA verify failure\n");
1876 ERR_print_errors(bio_err);
1877 count=1;
1878 break;
1879 }
d02b48c6 1880 }
0e211563
BL
1881 d=Time_F(STOP);
1882 BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n"
1883 : "%ld %d bit DSA verify in %.2fs\n",
1884 count,dsa_bits[j],d);
03ea28c9 1885 dsa_results[j][1]=d/(double)count;
d02b48c6 1886 }
d02b48c6
RE
1887
1888 if (rsa_count <= 1)
1889 {
1890 /* if longer than 10s, don't do any more */
1891 for (j++; j<DSA_NUM; j++)
1892 dsa_doit[j]=0;
1893 }
1894 }
99a97051 1895 if (rnd_fake) RAND_cleanup();
d02b48c6 1896#endif
e172d60d
BM
1897
1898#ifndef OPENSSL_NO_ECDSA
1899 if (RAND_status() != 1)
1900 {
1901 RAND_seed(rnd_seed, sizeof rnd_seed);
1902 rnd_fake = 1;
1903 }
1904 for (j=0; j<EC_NUM; j++)
1905 {
1906 int ret;
1907
1908 if (!ecdsa_doit[j]) continue; /* Ignore Curve */
1909 ecdsa[j] = EC_KEY_new();
1910 if (ecdsa[j] == NULL)
1911 {
1912 BIO_printf(bio_err,"ECDSA failure.\n");
1913 ERR_print_errors(bio_err);
1914 rsa_count=1;
1915 }
1916 else
1917 {
1918 ecdsa[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
1919 /* Could not obtain group information */
1920 if (ecdsa[j]->group == NULL)
1921 {
1922 BIO_printf(bio_err,"ECDSA failure.Could not obtain group information\n");
1923 ERR_print_errors(bio_err);
1924 rsa_count=1;
1925 }
1926 else
1927 {
1928 /* Perform ECDSA signature test */
1929 EC_KEY_generate_key(ecdsa[j]);
5488bb61 1930 ret = ECDSA_sign(0, buf, 20, ecdsasig,
e172d60d
BM
1931 &ecdsasiglen, ecdsa[j]);
1932 if (ret == 0)
1933 {
1934 BIO_printf(bio_err,"ECDSA sign failure. No ECDSA sign will be done.\n");
1935 ERR_print_errors(bio_err);
1936 rsa_count=1;
1937 }
1938 else
1939 {
1940 pkey_print_message("sign","ecdsa",
1941 ecdsa_c[j][0],
1942 test_curves_bits[j],
1943 ECDSA_SECONDS);
1944
1945 Time_F(START);
5488bb61
BM
1946 for (count=0,run=1; COND(ecdsa_c[j][0]);
1947 count++)
e172d60d 1948 {
5488bb61
BM
1949 ret=ECDSA_sign(0, buf, 20,
1950 ecdsasig, &ecdsasiglen,
1951 ecdsa[j]);
e172d60d
BM
1952 if (ret == 0)
1953 {
1954 BIO_printf(bio_err, "ECDSA sign failure\n");
1955 ERR_print_errors(bio_err);
1956 count=1;
1957 break;
1958 }
1959 }
1960 d=Time_F(STOP);
1961
1962 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
1963 "%ld %d bit ECDSA signs in %.2fs \n",
1964 count, test_curves_bits[j], d);
1965 ecdsa_results[j][0]=d/(double)count;
1966 rsa_count=count;
1967 }
1968
1969 /* Perform ECDSA verification test */
5488bb61
BM
1970 ret=ECDSA_verify(0, buf, 20, ecdsasig,
1971 ecdsasiglen, ecdsa[j]);
e172d60d
BM
1972 if (ret != 1)
1973 {
1974 BIO_printf(bio_err,"ECDSA verify failure. No ECDSA verify will be done.\n");
1975 ERR_print_errors(bio_err);
1976 ecdsa_doit[j] = 0;
1977 }
1978 else
1979 {
1980 pkey_print_message("verify","ecdsa",
1981 ecdsa_c[j][1],
1982 test_curves_bits[j],
1983 ECDSA_SECONDS);
1984 Time_F(START);
1985 for (count=0,run=1; COND(ecdsa_c[j][1]); count++)
1986 {
1987 ret=ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
1988 if (ret != 1)
1989 {
1990 BIO_printf(bio_err, "ECDSA verify failure\n");
1991 ERR_print_errors(bio_err);
1992 count=1;
1993 break;
1994 }
1995 }
1996 d=Time_F(STOP);
1997 BIO_printf(bio_err, mr? "+R6:%ld:%d:%.2f\n"
1998 : "%ld %d bit ECDSA verify in %.2fs\n",
1999 count, test_curves_bits[j], d);
2000 ecdsa_results[j][1]=d/(double)count;
2001 }
2002
2003 if (rsa_count <= 1)
2004 {
2005 /* if longer than 10s, don't do any more */
2006 for (j++; j<EC_NUM; j++)
2007 ecdsa_doit[j]=0;
2008 }
2009 }
2010 }
2011 }
2012 if (rnd_fake) RAND_cleanup();
2013#endif
2014
2015#ifndef OPENSSL_NO_ECDH
2016 if (RAND_status() != 1)
2017 {
2018 RAND_seed(rnd_seed, sizeof rnd_seed);
2019 rnd_fake = 1;
2020 }
2021 for (j=0; j<EC_NUM; j++)
2022 {
2023 if (!ecdh_doit[j]) continue;
2024 ecdh_a[j] = EC_KEY_new();
2025 ecdh_b[j] = EC_KEY_new();
2026 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL))
2027 {
2028 BIO_printf(bio_err,"ECDH failure.\n");
2029 ERR_print_errors(bio_err);
2030 rsa_count=1;
2031 }
2032 else
2033 {
2034 ecdh_a[j]->group = EC_GROUP_new_by_nid(test_curves[j]);
2035 if (ecdh_a[j]->group == NULL)
2036 {
2037 BIO_printf(bio_err,"ECDH failure.\n");
2038 ERR_print_errors(bio_err);
2039 rsa_count=1;
2040 }
2041 else
2042 {
2043 ecdh_b[j]->group = ecdh_a[j]->group;
2044
2045 /* generate two ECDH key pairs */
2046 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2047 !EC_KEY_generate_key(ecdh_b[j]))
2048 {
2049 BIO_printf(bio_err,"ECDH key generation failure.\n");
2050 ERR_print_errors(bio_err);
2051 rsa_count=1;
2052 }
2053 else
2054 {
2055 secret_size_a = ECDH_compute_key(secret_a,
2056 ecdh_b[j]->pub_key,
2057 ecdh_a[j]);
2058 secret_size_b = ECDH_compute_key(secret_b,
2059 ecdh_a[j]->pub_key,
2060 ecdh_b[j]);
2061 if (secret_size_a != secret_size_b)
41fdcfa7 2062 ecdh_checks = 0;
e172d60d 2063 else
41fdcfa7 2064 ecdh_checks = 1;
e172d60d
BM
2065
2066 for (secret_idx = 0;
41fdcfa7
BM
2067 (secret_idx < secret_size_a)
2068 && (ecdh_checks == 1);
e172d60d
BM
2069 secret_idx++)
2070 {
2071 if (secret_a[secret_idx] != secret_b[secret_idx])
41fdcfa7 2072 ecdh_checks = 0;
e172d60d
BM
2073 }
2074
41fdcfa7 2075 if (ecdh_checks == 0)
e172d60d
BM
2076 {
2077 BIO_printf(bio_err,"ECDH computations don't match.\n");
2078 ERR_print_errors(bio_err);
2079 rsa_count=1;
2080 }
2081
2082 pkey_print_message("","ecdh",
2083 ecdh_c[j][0],
2084 test_curves_bits[j],
2085 ECDH_SECONDS);
2086 Time_F(START);
2087 for (count=0,run=1; COND(ecdh_c[j][0]); count++)
2088 {
2089 ECDH_compute_key(secret_a,
2090 ecdh_b[j]->pub_key,
2091 ecdh_a[j]);
2092 }
2093 d=Time_F(STOP);
2094 BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
2095 count, test_curves_bits[j], d);
2096 ecdh_results[j][0]=d/(double)count;
2097 rsa_count=count;
2098 }
2099 }
2100 }
2101
2102 if (rsa_count <= 1)
2103 {
2104 /* if longer than 10s, don't do any more */
2105 for (j++; j<EC_NUM; j++)
2106 ecdh_doit[j]=0;
2107 }
2108 }
2109 if (rnd_fake) RAND_cleanup();
2110#endif
b83eddc5 2111#ifdef HAVE_FORK
0e211563 2112show_res:
b83eddc5 2113#endif
0e211563
BL
2114 if(!mr)
2115 {
2116 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
d02b48c6 2117 fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
0e211563
BL
2118 printf("options:");
2119 printf("%s ",BN_options());
cf1b7d96 2120#ifndef OPENSSL_NO_MD2
0e211563 2121 printf("%s ",MD2_options());
d02b48c6 2122#endif
cf1b7d96 2123#ifndef OPENSSL_NO_RC4
0e211563 2124 printf("%s ",RC4_options());
d02b48c6 2125#endif
cf1b7d96 2126#ifndef OPENSSL_NO_DES
125cc35b 2127 printf("%s ",DES_options());
d02b48c6 2128#endif
ba1b8883
RL
2129#ifndef OPENSSL_NO_AES
2130 printf("%s ",AES_options());
2131#endif
cf1b7d96 2132#ifndef OPENSSL_NO_IDEA
0e211563 2133 printf("%s ",idea_options());
d02b48c6 2134#endif
cf1b7d96 2135#ifndef OPENSSL_NO_BF
0e211563 2136 printf("%s ",BF_options());
d02b48c6 2137#endif
0e211563
BL
2138 fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
2139 printf("available timing options: ");
7876e448 2140#ifdef TIMES
0e211563 2141 printf("TIMES ");
7876e448
RL
2142#endif
2143#ifdef TIMEB
0e211563 2144 printf("TIMEB ");
7876e448
RL
2145#endif
2146#ifdef USE_TOD
0e211563 2147 printf("USE_TOD ");
7876e448
RL
2148#endif
2149#ifdef HZ
2150#define as_string(s) (#s)
87a4b4d1 2151 printf("HZ=%g", (double)HZ);
a4a8f7b3 2152# ifdef _SC_CLK_TCK
0e211563 2153 printf(" [sysconf value]");
a4a8f7b3 2154# endif
7876e448 2155#endif
0e211563
BL
2156 printf("\n");
2157 printf("timing function used: %s%s%s%s%s%s%s\n",
2158 (ftime_used ? "ftime" : ""),
2159 (ftime_used + times_used > 1 ? "," : ""),
2160 (times_used ? "times" : ""),
2161 (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
2162 (gettimeofday_used ? "gettimeofday" : ""),
2163 (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
2164 (getrusage_used ? "getrusage" : ""));
2165 }
d02b48c6
RE
2166
2167 if (pr_header)
2168 {
0e211563
BL
2169 if(mr)
2170 fprintf(stdout,"+H");
2171 else
2172 {
2173 fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");
2174 fprintf(stdout,"type ");
2175 }
d02b48c6 2176 for (j=0; j<SIZE_NUM; j++)
0e211563 2177 fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);
d02b48c6
RE
2178 fprintf(stdout,"\n");
2179 }
2180
2181 for (k=0; k<ALGOR_NUM; k++)
2182 {
2183 if (!doit[k]) continue;
0e211563
BL
2184 if(mr)
2185 fprintf(stdout,"+F:%d:%s",k,names[k]);
2186 else
2187 fprintf(stdout,"%-13s",names[k]);
d02b48c6
RE
2188 for (j=0; j<SIZE_NUM; j++)
2189 {
0e211563 2190 if (results[k][j] > 10000 && !mr)
d02b48c6
RE
2191 fprintf(stdout," %11.2fk",results[k][j]/1e3);
2192 else
0e211563 2193 fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);
d02b48c6
RE
2194 }
2195 fprintf(stdout,"\n");
2196 }
cf1b7d96 2197#ifndef OPENSSL_NO_RSA
d02b48c6
RE
2198 j=1;
2199 for (k=0; k<RSA_NUM; k++)
2200 {
2201 if (!rsa_doit[k]) continue;
0e211563 2202 if (j && !mr)
58964a49
RE
2203 {
2204 printf("%18ssign verify sign/s verify/s\n"," ");
2205 j=0;
2206 }
0e211563
BL
2207 if(mr)
2208 fprintf(stdout,"+F2:%u:%u:%f:%f\n",
2209 k,rsa_bits[k],rsa_results[k][0],
2210 rsa_results[k][1]);
2211 else
2212 fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2213 rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
2214 1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
d02b48c6
RE
2215 }
2216#endif
cf1b7d96 2217#ifndef OPENSSL_NO_DSA
d02b48c6
RE
2218 j=1;
2219 for (k=0; k<DSA_NUM; k++)
2220 {
2221 if (!dsa_doit[k]) continue;
0e211563
BL
2222 if (j && !mr)
2223 {
58964a49
RE
2224 printf("%18ssign verify sign/s verify/s\n"," ");
2225 j=0;
2226 }
0e211563
BL
2227 if(mr)
2228 fprintf(stdout,"+F3:%u:%u:%f:%f\n",
2229 k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
2230 else
2231 fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f\n",
2232 dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
2233 1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
d02b48c6
RE
2234 }
2235#endif
e172d60d
BM
2236#ifndef OPENSSL_NO_ECDSA
2237 j=1;
2238 for (k=0; k<EC_NUM; k++)
2239 {
2240 if (!ecdsa_doit[k]) continue;
2241 if (j && !mr)
2242 {
2243 printf("%30ssign verify sign/s verify/s\n"," ");
2244 j=0;
2245 }
2246
2247 if (mr)
2248 fprintf(stdout,"+F4:%u:%u:%f:%f\n",
2249 k, test_curves_bits[k],
2250 ecdsa_results[k][0],ecdsa_results[k][1]);
2251 else
2252 fprintf(stdout,
2253 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2254 test_curves_bits[k],
2255 test_curves_names[k],
2256 ecdsa_results[k][0],ecdsa_results[k][1],
2257 1.0/ecdsa_results[k][0],1.0/ecdsa_results[k][1]);
2258 }
2259#endif
2260
2261
2262#ifndef OPENSSL_NO_ECDH
2263 j=1;
2264 for (k=0; k<EC_NUM; k++)
2265 {
2266 if (!ecdh_doit[k]) continue;
2267 if (j && !mr)
2268 {
2269 printf("%30sop op/s\n"," ");
2270 j=0;
2271 }
2272 if (mr)
2273 fprintf(stdout,"+F5:%u:%u:%f:%f\n",
2274 k, test_curves_bits[k],
2275 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2276
2277 else
2278 fprintf(stdout,"%4u bit ecdh (%s) %8.4fs %8.1f\n",
2279 test_curves_bits[k],
2280 test_curves_names[k],
2281 ecdh_results[k][0], 1.0/ecdh_results[k][0]);
2282 }
2283#endif
2284
18c77bf2 2285 mret=0;
e172d60d 2286
d02b48c6 2287end:
5270e702 2288 ERR_print_errors(bio_err);
26a3a48d
RL
2289 if (buf != NULL) OPENSSL_free(buf);
2290 if (buf2 != NULL) OPENSSL_free(buf2);
cf1b7d96 2291#ifndef OPENSSL_NO_RSA
d02b48c6
RE
2292 for (i=0; i<RSA_NUM; i++)
2293 if (rsa_key[i] != NULL)
2294 RSA_free(rsa_key[i]);
2295#endif
cf1b7d96 2296#ifndef OPENSSL_NO_DSA
d02b48c6
RE
2297 for (i=0; i<DSA_NUM; i++)
2298 if (dsa_key[i] != NULL)
2299 DSA_free(dsa_key[i]);
2300#endif
e172d60d
BM
2301
2302#ifndef OPENSSL_NO_ECDSA
2303 for (i=0; i<EC_NUM; i++)
2304 if (ecdsa[i] != NULL)
2305 EC_KEY_free(ecdsa[i]);
2306#endif
2307#ifndef OPENSSL_NO_ECDH
2308 for (i=0; i<EC_NUM; i++)
2309 {
2310 if (ecdh_a[i] != NULL)
2311 EC_KEY_free(ecdh_a[i]);
2312 if (ecdh_b[i] != NULL)
2313 EC_KEY_free(ecdh_b[i]);
2314 }
2315#endif
2316
c04f8cf4 2317 apps_shutdown();
18c77bf2 2318 EXIT(mret);
d02b48c6
RE
2319 }
2320
646d5695 2321static void print_message(const char *s, long num, int length)
d02b48c6
RE
2322 {
2323#ifdef SIGALRM
0e211563
BL
2324 BIO_printf(bio_err,mr ? "+DT:%s:%d:%d\n"
2325 : "Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
d58d092b 2326 (void)BIO_flush(bio_err);
d02b48c6
RE
2327 alarm(SECONDS);
2328#else
0e211563
BL
2329 BIO_printf(bio_err,mr ? "+DN:%s:%ld:%d\n"
2330 : "Doing %s %ld times on %d size blocks: ",s,num,length);
d58d092b 2331 (void)BIO_flush(bio_err);
d02b48c6
RE
2332#endif
2333#ifdef LINT
2334 num=num;
2335#endif
2336 }
2337
6b691a5c
UM
2338static void pkey_print_message(char *str, char *str2, long num, int bits,
2339 int tm)
d02b48c6
RE
2340 {
2341#ifdef SIGALRM
0e211563
BL
2342 BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
2343 : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
d58d092b 2344 (void)BIO_flush(bio_err);
d02b48c6
RE
2345 alarm(RSA_SECONDS);
2346#else
0e211563
BL
2347 BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
2348 : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
d58d092b 2349 (void)BIO_flush(bio_err);
d02b48c6
RE
2350#endif
2351#ifdef LINT
2352 num=num;
2353#endif
2354 }
58964a49 2355
0e211563
BL
2356static void print_result(int alg,int run_no,int count,double time_used)
2357 {
2358 BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
2359 : "%ld %s's in %.2fs\n",count,names[alg],time_used);
2360 results[alg][run_no]=((double)count)/time_used*lengths[run_no];
2361 }
2362
2363static char *sstrsep(char **string, const char *delim)
2364 {
2365 char isdelim[256];
2366 char *token = *string;
2367
2368 if (**string == 0)
2369 return NULL;
2370
2371 memset(isdelim, 0, 256);
2372 isdelim[0] = 1;
2373
2374 while (*delim)
2375 {
2376 isdelim[(unsigned char)(*delim)] = 1;
2377 delim++;
2378 }
2379
2380 while (!isdelim[(unsigned char)(**string)])
2381 {
2382 (*string)++;
2383 }
2384
2385 if (**string)
2386 {
2387 **string = 0;
2388 (*string)++;
2389 }
2390
2391 return token;
2392 }
2393
66d3e748 2394#ifdef HAVE_FORK
0e211563
BL
2395static int do_multi(int multi)
2396 {
2397 int n;
2398 int fd[2];
2399 int *fds;
2400 static char sep[]=":";
2401
2402 fds=malloc(multi*sizeof *fds);
2403 for(n=0 ; n < multi ; ++n)
2404 {
2405 pipe(fd);
2406 if(fork())
2407 {
2408 close(fd[1]);
2409 fds[n]=fd[0];
2410 }
2411 else
2412 {
2413 close(fd[0]);
2414 close(1);
2415 dup(fd[1]);
2416 close(fd[1]);
2417 mr=1;
2418 usertime=0;
2419 return 0;
2420 }
2421 printf("Forked child %d\n",n);
2422 }
2423
2424 /* for now, assume the pipe is long enough to take all the output */
2425 for(n=0 ; n < multi ; ++n)
2426 {
2427 FILE *f;
2428 char buf[1024];
2429 char *p;
2430
2431 f=fdopen(fds[n],"r");
2432 while(fgets(buf,sizeof buf,f))
2433 {
2434 p=strchr(buf,'\n');
2435 if(p)
2436 *p='\0';
2437 if(buf[0] != '+')
2438 {
2439 fprintf(stderr,"Don't understand line '%s' from child %d\n",
2440 buf,n);
2441 continue;
2442 }
2443 printf("Got: %s from %d\n",buf,n);
2444 if(!strncmp(buf,"+F:",3))
2445 {
2446 int alg;
2447 int j;
2448
2449 p=buf+3;
2450 alg=atoi(sstrsep(&p,sep));
2451 sstrsep(&p,sep);
2452 for(j=0 ; j < SIZE_NUM ; ++j)
2453 results[alg][j]+=atof(sstrsep(&p,sep));
2454 }
2455 else if(!strncmp(buf,"+F2:",4))
2456 {
2457 int k;
2458 double d;
2459
2460 p=buf+4;
2461 k=atoi(sstrsep(&p,sep));
2462 sstrsep(&p,sep);
2463
2464 d=atof(sstrsep(&p,sep));
2465 if(n)
2466 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2467 else
2468 rsa_results[k][0]=d;
2469
2470 d=atof(sstrsep(&p,sep));
2471 if(n)
2472 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2473 else
2474 rsa_results[k][1]=d;
2475 }
2476 else if(!strncmp(buf,"+F2:",4))
2477 {
2478 int k;
2479 double d;
2480
2481 p=buf+4;
2482 k=atoi(sstrsep(&p,sep));
2483 sstrsep(&p,sep);
2484
2485 d=atof(sstrsep(&p,sep));
2486 if(n)
2487 rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
2488 else
2489 rsa_results[k][0]=d;
2490
2491 d=atof(sstrsep(&p,sep));
2492 if(n)
2493 rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
2494 else
2495 rsa_results[k][1]=d;
2496 }
2497 else if(!strncmp(buf,"+F3:",4))
2498 {
2499 int k;
2500 double d;
2501
2502 p=buf+4;
2503 k=atoi(sstrsep(&p,sep));
2504 sstrsep(&p,sep);
2505
2506 d=atof(sstrsep(&p,sep));
2507 if(n)
2508 dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d);
2509 else
2510 dsa_results[k][0]=d;
2511
2512 d=atof(sstrsep(&p,sep));
2513 if(n)
2514 dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);
2515 else
2516 dsa_results[k][1]=d;
2517 }
e172d60d
BM
2518#ifndef OPENSSL_NO_ECDSA
2519 else if(!strncmp(buf,"+F4:",4))
2520 {
2521 int k;
2522 double d;
2523
2524 p=buf+4;
2525 k=atoi(sstrsep(&p,sep));
2526 sstrsep(&p,sep);
2527
2528 d=atof(sstrsep(&p,sep));
2529 if(n)
2530 ecdsa_results[k][0]=1/(1/ecdsa_results[k][0]+1/d);
2531 else
2532 ecdsa_results[k][0]=d;
2533
2534 d=atof(sstrsep(&p,sep));
2535 if(n)
2536 ecdsa_results[k][1]=1/(1/ecdsa_results[k][1]+1/d);
2537 else
2538 ecdsa_results[k][1]=d;
2539 }
2540#endif
2541
2542#ifndef OPENSSL_NO_ECDH
2543 else if(!strncmp(buf,"+F5:",4))
2544 {
2545 int k;
2546 double d;
2547
2548 p=buf+4;
2549 k=atoi(sstrsep(&p,sep));
2550 sstrsep(&p,sep);
2551
2552 d=atof(sstrsep(&p,sep));
2553 if(n)
2554 ecdh_results[k][0]=1/(1/ecdh_results[k][0]+1/d);
2555 else
2556 ecdh_results[k][0]=d;
2557
2558 }
2559#endif
2560
0e211563
BL
2561 else if(!strncmp(buf,"+H:",3))
2562 {
2563 }
2564 else
2565 fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
2566 }
2567 }
2568 return 1;
2569 }
66d3e748 2570#endif