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