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