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