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