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