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