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