1 /* $OpenBSD: speed.c,v 1.41 2025/01/02 13:37:43 tb Exp $ */
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 #define SECONDS 3
77 #define RSA_SECONDS 10
78 #define DSA_SECONDS 10
79 #define ECDSA_SECONDS 10
80 #define ECDH_SECONDS 10
81
82 #define MAX_UNALIGN 16
83
84 #include <math.h>
85 #include <signal.h>
86 #include <stdio.h>
87 #include <stdlib.h>
88 #include <limits.h>
89 #include <string.h>
90 #include <unistd.h>
91
92 #include "apps.h"
93
94 #include <openssl/bn.h>
95 #include <openssl/crypto.h>
96 #include <openssl/err.h>
97 #include <openssl/evp.h>
98 #include <openssl/modes.h>
99 #include <openssl/objects.h>
100 #include <openssl/x509.h>
101
102 #ifndef OPENSSL_NO_AES
103 #include <openssl/aes.h>
104 #endif
105 #ifndef OPENSSL_NO_BF
106 #include <openssl/blowfish.h>
107 #endif
108 #ifndef OPENSSL_NO_CAST
109 #include <openssl/cast.h>
110 #endif
111 #ifndef OPENSSL_NO_CAMELLIA
112 #include <openssl/camellia.h>
113 #endif
114 #ifndef OPENSSL_NO_DES
115 #include <openssl/des.h>
116 #endif
117 #include <openssl/dsa.h>
118 #include <openssl/ecdh.h>
119 #include <openssl/ecdsa.h>
120 #ifndef OPENSSL_NO_HMAC
121 #include <openssl/hmac.h>
122 #endif
123 #ifndef OPENSSL_NO_IDEA
124 #include <openssl/idea.h>
125 #endif
126 #ifndef OPENSSL_NO_MD4
127 #include <openssl/md4.h>
128 #endif
129 #ifndef OPENSSL_NO_MD5
130 #include <openssl/md5.h>
131 #endif
132 #ifndef OPENSSL_NO_RC2
133 #include <openssl/rc2.h>
134 #endif
135 #ifndef OPENSSL_NO_RC4
136 #include <openssl/rc4.h>
137 #endif
138 #include <openssl/rsa.h>
139 #ifndef OPENSSL_NO_RIPEMD
140 #include <openssl/ripemd.h>
141 #endif
142 #ifndef OPENSSL_NO_SHA
143 #include <openssl/sha.h>
144 #endif
145 #ifndef OPENSSL_NO_WHIRLPOOL
146 #include <openssl/whrlpool.h>
147 #endif
148
149 #define BUFSIZE (1024*8+64)
150 volatile sig_atomic_t run;
151
152 static int mr = 0;
153 static int usertime = 1;
154
155 static double Time_F(int s);
156 static void print_message(const char *s, long num, int length);
157 static void
158 pkey_print_message(const char *str, const char *str2,
159 long num, int bits, int sec);
160 static void print_result(int alg, int run_no, int count, double time_used);
161 static int do_multi(int multi);
162
163 #define ALGOR_NUM 32
164 #define SIZE_NUM 5
165 #define RSA_NUM 4
166 #define DSA_NUM 3
167
168 #define EC_NUM 4
169 #define MAX_ECDH_SIZE 256
170
171 static const char *names[ALGOR_NUM] = {
172 "md2", "md4", "md5", "hmac(md5)", "sha1", "rmd160",
173 "rc4", "des cbc", "des ede3", "idea cbc", "seed cbc",
174 "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc",
175 "aes-128 cbc", "aes-192 cbc", "aes-256 cbc",
176 "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc",
177 "evp", "sha256", "sha512", "whirlpool",
178 "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash",
179 "aes-128 gcm", "aes-256 gcm", "chacha20 poly1305",
180 };
181 static double results[ALGOR_NUM][SIZE_NUM];
182 static int lengths[SIZE_NUM] = {16, 64, 256, 1024, 8 * 1024};
183 static double rsa_results[RSA_NUM][2];
184 static double dsa_results[DSA_NUM][2];
185 static double ecdsa_results[EC_NUM][2];
186 static double ecdh_results[EC_NUM][1];
187
188 static void sig_done(int sig);
189
190 static DSA *
get_dsa(const unsigned char * priv,size_t priv_size,const unsigned char * pub,size_t pub_size,const unsigned char * p_char,size_t p_size,const unsigned char * q_char,size_t q_size,const unsigned char * g_char,size_t g_size)191 get_dsa(const unsigned char *priv, size_t priv_size,
192 const unsigned char *pub, size_t pub_size,
193 const unsigned char *p_char, size_t p_size,
194 const unsigned char *q_char, size_t q_size,
195 const unsigned char *g_char, size_t g_size)
196 {
197 DSA *dsa;
198 BIGNUM *priv_key = NULL, *pub_key = NULL;
199 BIGNUM *p = NULL, *q = NULL, *g = NULL;
200
201 if ((dsa = DSA_new()) == NULL)
202 return (NULL);
203
204 priv_key = BN_bin2bn(priv, priv_size, NULL);
205 pub_key = BN_bin2bn(pub, pub_size, NULL);
206 if (priv_key == NULL || pub_key == NULL)
207 goto err;
208
209 if (!DSA_set0_key(dsa, pub_key, priv_key))
210 goto err;
211 pub_key = NULL;
212 priv_key = NULL;
213
214 p = BN_bin2bn(p_char, p_size, NULL);
215 q = BN_bin2bn(q_char, q_size, NULL);
216 g = BN_bin2bn(g_char, g_size, NULL);
217 if (p == NULL || q == NULL || g == NULL)
218 goto err;
219
220 if (!DSA_set0_pqg(dsa, p, q, g))
221 goto err;
222 p = NULL;
223 q = NULL;
224 g = NULL;
225
226 return dsa;
227
228 err:
229 DSA_free(dsa);
230 BN_free(priv_key);
231 BN_free(pub_key);
232 BN_free(p);
233 BN_free(q);
234 BN_free(g);
235
236 return NULL;
237 }
238
239
240 static const unsigned char dsa512_priv[] = {
241 0x65, 0xe5, 0xc7, 0x38, 0x60, 0x24, 0xb5, 0x89, 0xd4, 0x9c, 0xeb, 0x4c,
242 0x9c, 0x1d, 0x7a, 0x22, 0xbd, 0xd1, 0xc2, 0xd2,
243 };
244
245 static const unsigned char dsa512_pub[] = {
246 0x00, 0x95, 0xa7, 0x0d, 0xec, 0x93, 0x68, 0xba, 0x5f, 0xf7, 0x5f, 0x07,
247 0xf2, 0x3b, 0xad, 0x6b, 0x01, 0xdc, 0xbe, 0xec, 0xde, 0x04, 0x7a, 0x3a,
248 0x27, 0xb3, 0xec, 0x49, 0xfd, 0x08, 0x43, 0x3d, 0x7e, 0xa8, 0x2c, 0x5e,
249 0x7b, 0xbb, 0xfc, 0xf4, 0x6e, 0xeb, 0x6c, 0xb0, 0x6e, 0xf8, 0x02, 0x12,
250 0x8c, 0x38, 0x5d, 0x83, 0x56, 0x7d, 0xee, 0x53, 0x05, 0x3e, 0x24, 0x84,
251 0xbe, 0xba, 0x0a, 0x6b, 0xc8,
252 };
253
254 static const unsigned char dsa512_p[] = {
255 0x9D, 0x1B, 0x69, 0x8E, 0x26, 0xDB, 0xF2, 0x2B, 0x11, 0x70, 0x19, 0x86,
256 0xF6, 0x19, 0xC8, 0xF8, 0x19, 0xF2, 0x18, 0x53, 0x94, 0x46, 0x06, 0xD0,
257 0x62, 0x50, 0x33, 0x4B, 0x02, 0x3C, 0x52, 0x30, 0x03, 0x8B, 0x3B, 0xF9,
258 0x5F, 0xD1, 0x24, 0x06, 0x4F, 0x7B, 0x4C, 0xBA, 0xAA, 0x40, 0x9B, 0xFD,
259 0x96, 0xE4, 0x37, 0x33, 0xBB, 0x2D, 0x5A, 0xD7, 0x5A, 0x11, 0x40, 0x66,
260 0xA2, 0x76, 0x7D, 0x31,
261 };
262
263 static const unsigned char dsa512_q[] = {
264 0xFB, 0x53, 0xEF, 0x50, 0xB4, 0x40, 0x92, 0x31, 0x56, 0x86, 0x53, 0x7A,
265 0xE8, 0x8B, 0x22, 0x9A, 0x49, 0xFB, 0x71, 0x8F,
266 };
267
268 static const unsigned char dsa512_g[] = {
269 0x83, 0x3E, 0x88, 0xE5, 0xC5, 0x89, 0x73, 0xCE, 0x3B, 0x6C, 0x01, 0x49,
270 0xBF, 0xB3, 0xC7, 0x9F, 0x0A, 0xEA, 0x44, 0x91, 0xE5, 0x30, 0xAA, 0xD9,
271 0xBE, 0x5B, 0x5F, 0xB7, 0x10, 0xD7, 0x89, 0xB7, 0x8E, 0x74, 0xFB, 0xCF,
272 0x29, 0x1E, 0xEB, 0xA8, 0x2C, 0x54, 0x51, 0xB8, 0x10, 0xDE, 0xA0, 0xCE,
273 0x2F, 0xCC, 0x24, 0x6B, 0x90, 0x77, 0xDE, 0xA2, 0x68, 0xA6, 0x52, 0x12,
274 0xA2, 0x03, 0x9D, 0x20,
275 };
276
277 static DSA *
get_dsa512(void)278 get_dsa512(void)
279 {
280 return get_dsa(dsa512_priv, sizeof(dsa512_priv),
281 dsa512_pub, sizeof(dsa512_pub), dsa512_p, sizeof(dsa512_p),
282 dsa512_q, sizeof(dsa512_q), dsa512_g, sizeof(dsa512_g));
283 }
284
285 static const unsigned char dsa1024_priv[] = {
286 0x7d, 0x21, 0xda, 0xbb, 0x62, 0x15, 0x47, 0x36, 0x07, 0x67, 0x12, 0xe8,
287 0x8c, 0xaa, 0x1c, 0xcd, 0x38, 0x12, 0x61, 0x18,
288 };
289
290 static const unsigned char dsa1024_pub[] = {
291 0x3c, 0x4e, 0x9c, 0x2a, 0x7f, 0x16, 0xc1, 0x25, 0xeb, 0xac, 0x78, 0x63,
292 0x90, 0x14, 0x8c, 0x8b, 0xf4, 0x68, 0x43, 0x3c, 0x2d, 0xee, 0x65, 0x50,
293 0x7d, 0x9c, 0x8f, 0x8c, 0x8a, 0x51, 0xd6, 0x11, 0x2b, 0x99, 0xaf, 0x1e,
294 0x90, 0x97, 0xb5, 0xd3, 0xa6, 0x20, 0x25, 0xd6, 0xfe, 0x43, 0x02, 0xd5,
295 0x91, 0x7d, 0xa7, 0x8c, 0xdb, 0xc9, 0x85, 0xa3, 0x36, 0x48, 0xf7, 0x68,
296 0xaa, 0x60, 0xb1, 0xf7, 0x05, 0x68, 0x3a, 0xa3, 0x3f, 0xd3, 0x19, 0x82,
297 0xd8, 0x82, 0x7a, 0x77, 0xfb, 0xef, 0xf4, 0x15, 0x0a, 0xeb, 0x06, 0x04,
298 0x7f, 0x53, 0x07, 0x0c, 0xbc, 0xcb, 0x2d, 0x83, 0xdb, 0x3e, 0xd1, 0x28,
299 0xa5, 0xa1, 0x31, 0xe0, 0x67, 0xfa, 0x50, 0xde, 0x9b, 0x07, 0x83, 0x7e,
300 0x2c, 0x0b, 0xc3, 0x13, 0x50, 0x61, 0xe5, 0xad, 0xbd, 0x36, 0xb8, 0x97,
301 0x4e, 0x40, 0x7d, 0xe8, 0x83, 0x0d, 0xbc, 0x4b
302 };
303
304 static const unsigned char dsa1024_p[] = {
305 0xA7, 0x3F, 0x6E, 0x85, 0xBF, 0x41, 0x6A, 0x29, 0x7D, 0xF0, 0x9F, 0x47,
306 0x19, 0x30, 0x90, 0x9A, 0x09, 0x1D, 0xDA, 0x6A, 0x33, 0x1E, 0xC5, 0x3D,
307 0x86, 0x96, 0xB3, 0x15, 0xE0, 0x53, 0x2E, 0x8F, 0xE0, 0x59, 0x82, 0x73,
308 0x90, 0x3E, 0x75, 0x31, 0x99, 0x47, 0x7A, 0x52, 0xFB, 0x85, 0xE4, 0xD9,
309 0xA6, 0x7B, 0x38, 0x9B, 0x68, 0x8A, 0x84, 0x9B, 0x87, 0xC6, 0x1E, 0xB5,
310 0x7E, 0x86, 0x4B, 0x53, 0x5B, 0x59, 0xCF, 0x71, 0x65, 0x19, 0x88, 0x6E,
311 0xCE, 0x66, 0xAE, 0x6B, 0x88, 0x36, 0xFB, 0xEC, 0x28, 0xDC, 0xC2, 0xD7,
312 0xA5, 0xBB, 0xE5, 0x2C, 0x39, 0x26, 0x4B, 0xDA, 0x9A, 0x70, 0x18, 0x95,
313 0x37, 0x95, 0x10, 0x56, 0x23, 0xF6, 0x15, 0xED, 0xBA, 0x04, 0x5E, 0xDE,
314 0x39, 0x4F, 0xFD, 0xB7, 0x43, 0x1F, 0xB5, 0xA4, 0x65, 0x6F, 0xCD, 0x80,
315 0x11, 0xE4, 0x70, 0x95, 0x5B, 0x50, 0xCD, 0x49,
316 };
317
318 static const unsigned char dsa1024_q[] = {
319 0xF7, 0x07, 0x31, 0xED, 0xFA, 0x6C, 0x06, 0x03, 0xD5, 0x85, 0x8A, 0x1C,
320 0xAC, 0x9C, 0x65, 0xE7, 0x50, 0x66, 0x65, 0x6F,
321 };
322
323 static const unsigned char dsa1024_g[] = {
324 0x4D, 0xDF, 0x4C, 0x03, 0xA6, 0x91, 0x8A, 0xF5, 0x19, 0x6F, 0x50, 0x46,
325 0x25, 0x99, 0xE5, 0x68, 0x6F, 0x30, 0xE3, 0x69, 0xE1, 0xE5, 0xB3, 0x5D,
326 0x98, 0xBB, 0x28, 0x86, 0x48, 0xFC, 0xDE, 0x99, 0x04, 0x3F, 0x5F, 0x88,
327 0x0C, 0x9C, 0x73, 0x24, 0x0D, 0x20, 0x5D, 0xB9, 0x2A, 0x9A, 0x3F, 0x18,
328 0x96, 0x27, 0xE4, 0x62, 0x87, 0xC1, 0x7B, 0x74, 0x62, 0x53, 0xFC, 0x61,
329 0x27, 0xA8, 0x7A, 0x91, 0x09, 0x9D, 0xB6, 0xF1, 0x4D, 0x9C, 0x54, 0x0F,
330 0x58, 0x06, 0xEE, 0x49, 0x74, 0x07, 0xCE, 0x55, 0x7E, 0x23, 0xCE, 0x16,
331 0xF6, 0xCA, 0xDC, 0x5A, 0x61, 0x01, 0x7E, 0xC9, 0x71, 0xB5, 0x4D, 0xF6,
332 0xDC, 0x34, 0x29, 0x87, 0x68, 0xF6, 0x5E, 0x20, 0x93, 0xB3, 0xDB, 0xF5,
333 0xE4, 0x09, 0x6C, 0x41, 0x17, 0x95, 0x92, 0xEB, 0x01, 0xB5, 0x73, 0xA5,
334 0x6A, 0x7E, 0xD8, 0x32, 0xED, 0x0E, 0x02, 0xB8,
335 };
336
337 static DSA *
get_dsa1024(void)338 get_dsa1024(void)
339 {
340 return get_dsa(dsa1024_priv, sizeof(dsa1024_priv),
341 dsa1024_pub, sizeof(dsa1024_pub), dsa1024_p, sizeof(dsa1024_p),
342 dsa1024_q, sizeof(dsa1024_q), dsa1024_g, sizeof(dsa1024_g));
343 }
344
345 static const unsigned char dsa2048_priv[] = {
346 0x32, 0x67, 0x92, 0xf6, 0xc4, 0xe2, 0xe2, 0xe8, 0xa0, 0x8b, 0x6b, 0x45,
347 0x0c, 0x8a, 0x76, 0xb0, 0xee, 0xcf, 0x91, 0xa7,
348 };
349
350 static const unsigned char dsa2048_pub[] = {
351 0x17, 0x8f, 0xa8, 0x11, 0x84, 0x92, 0xec, 0x83, 0x47, 0xc7, 0x6a, 0xb0,
352 0x92, 0xaf, 0x5a, 0x20, 0x37, 0xa3, 0x64, 0x79, 0xd2, 0xd0, 0x3d, 0xcd,
353 0xe0, 0x61, 0x88, 0x88, 0x21, 0xcc, 0x74, 0x5d, 0xce, 0x4c, 0x51, 0x47,
354 0xf0, 0xc5, 0x5c, 0x4c, 0x82, 0x7a, 0xaf, 0x72, 0xad, 0xb9, 0xe0, 0x53,
355 0xf2, 0x78, 0xb7, 0xf0, 0xb5, 0x48, 0x7f, 0x8a, 0x3a, 0x18, 0xd1, 0x9f,
356 0x8b, 0x7d, 0xa5, 0x47, 0xb7, 0x95, 0xab, 0x98, 0xf8, 0x7b, 0x74, 0x50,
357 0x56, 0x8e, 0x57, 0xf0, 0xee, 0xf5, 0xb7, 0xba, 0xab, 0x85, 0x86, 0xf9,
358 0x2b, 0xef, 0x41, 0x56, 0xa0, 0xa4, 0x9f, 0xb7, 0x38, 0x00, 0x46, 0x0a,
359 0xa6, 0xf1, 0xfc, 0x1f, 0xd8, 0x4e, 0x85, 0x44, 0x92, 0x43, 0x21, 0x5d,
360 0x6e, 0xcc, 0xc2, 0xcb, 0x26, 0x31, 0x0d, 0x21, 0xc4, 0xbd, 0x8d, 0x24,
361 0xbc, 0xd9, 0x18, 0x19, 0xd7, 0xdc, 0xf1, 0xe7, 0x93, 0x50, 0x48, 0x03,
362 0x2c, 0xae, 0x2e, 0xe7, 0x49, 0x88, 0x5f, 0x93, 0x57, 0x27, 0x99, 0x36,
363 0xb4, 0x20, 0xab, 0xfc, 0xa7, 0x2b, 0xf2, 0xd9, 0x98, 0xd7, 0xd4, 0x34,
364 0x9d, 0x96, 0x50, 0x58, 0x9a, 0xea, 0x54, 0xf3, 0xee, 0xf5, 0x63, 0x14,
365 0xee, 0x85, 0x83, 0x74, 0x76, 0xe1, 0x52, 0x95, 0xc3, 0xf7, 0xeb, 0x04,
366 0x04, 0x7b, 0xa7, 0x28, 0x1b, 0xcc, 0xea, 0x4a, 0x4e, 0x84, 0xda, 0xd8,
367 0x9c, 0x79, 0xd8, 0x9b, 0x66, 0x89, 0x2f, 0xcf, 0xac, 0xd7, 0x79, 0xf9,
368 0xa9, 0xd8, 0x45, 0x13, 0x78, 0xb9, 0x00, 0x14, 0xc9, 0x7e, 0x22, 0x51,
369 0x86, 0x67, 0xb0, 0x9f, 0x26, 0x11, 0x23, 0xc8, 0x38, 0xd7, 0x70, 0x1d,
370 0x15, 0x8e, 0x4d, 0x4f, 0x95, 0x97, 0x40, 0xa1, 0xc2, 0x7e, 0x01, 0x18,
371 0x72, 0xf4, 0x10, 0xe6, 0x8d, 0x52, 0x16, 0x7f, 0xf2, 0xc9, 0xf8, 0x33,
372 0x8b, 0x33, 0xb7, 0xce,
373 };
374
375 static const unsigned char dsa2048_p[] = {
376 0xA0, 0x25, 0xFA, 0xAD, 0xF4, 0x8E, 0xB9, 0xE5, 0x99, 0xF3, 0x5D, 0x6F,
377 0x4F, 0x83, 0x34, 0xE2, 0x7E, 0xCF, 0x6F, 0xBF, 0x30, 0xAF, 0x6F, 0x81,
378 0xEB, 0xF8, 0xC4, 0x13, 0xD9, 0xA0, 0x5D, 0x8B, 0x5C, 0x8E, 0xDC, 0xC2,
379 0x1D, 0x0B, 0x41, 0x32, 0xB0, 0x1F, 0xFE, 0xEF, 0x0C, 0xC2, 0xA2, 0x7E,
380 0x68, 0x5C, 0x28, 0x21, 0xE9, 0xF5, 0xB1, 0x58, 0x12, 0x63, 0x4C, 0x19,
381 0x4E, 0xFF, 0x02, 0x4B, 0x92, 0xED, 0xD2, 0x07, 0x11, 0x4D, 0x8C, 0x58,
382 0x16, 0x5C, 0x55, 0x8E, 0xAD, 0xA3, 0x67, 0x7D, 0xB9, 0x86, 0x6E, 0x0B,
383 0xE6, 0x54, 0x6F, 0x40, 0xAE, 0x0E, 0x67, 0x4C, 0xF9, 0x12, 0x5B, 0x3C,
384 0x08, 0x7A, 0xF7, 0xFC, 0x67, 0x86, 0x69, 0xE7, 0x0A, 0x94, 0x40, 0xBF,
385 0x8B, 0x76, 0xFE, 0x26, 0xD1, 0xF2, 0xA1, 0x1A, 0x84, 0xA1, 0x43, 0x56,
386 0x28, 0xBC, 0x9A, 0x5F, 0xD7, 0x3B, 0x69, 0x89, 0x8A, 0x36, 0x2C, 0x51,
387 0xDF, 0x12, 0x77, 0x2F, 0x57, 0x7B, 0xA0, 0xAA, 0xDD, 0x7F, 0xA1, 0x62,
388 0x3B, 0x40, 0x7B, 0x68, 0x1A, 0x8F, 0x0D, 0x38, 0xBB, 0x21, 0x5D, 0x18,
389 0xFC, 0x0F, 0x46, 0xF7, 0xA3, 0xB0, 0x1D, 0x23, 0xC3, 0xD2, 0xC7, 0x72,
390 0x51, 0x18, 0xDF, 0x46, 0x95, 0x79, 0xD9, 0xBD, 0xB5, 0x19, 0x02, 0x2C,
391 0x87, 0xDC, 0xE7, 0x57, 0x82, 0x7E, 0xF1, 0x8B, 0x06, 0x3D, 0x00, 0xA5,
392 0x7B, 0x6B, 0x26, 0x27, 0x91, 0x0F, 0x6A, 0x77, 0xE4, 0xD5, 0x04, 0xE4,
393 0x12, 0x2C, 0x42, 0xFF, 0xD2, 0x88, 0xBB, 0xD3, 0x92, 0xA0, 0xF9, 0xC8,
394 0x51, 0x64, 0x14, 0x5C, 0xD8, 0xF9, 0x6C, 0x47, 0x82, 0xB4, 0x1C, 0x7F,
395 0x09, 0xB8, 0xF0, 0x25, 0x83, 0x1D, 0x3F, 0x3F, 0x05, 0xB3, 0x21, 0x0A,
396 0x5D, 0xA7, 0xD8, 0x54, 0xC3, 0x65, 0x7D, 0xC3, 0xB0, 0x1D, 0xBF, 0xAE,
397 0xF8, 0x68, 0xCF, 0x9B,
398 };
399
400 static const unsigned char dsa2048_q[] = {
401 0x97, 0xE7, 0x33, 0x4D, 0xD3, 0x94, 0x3E, 0x0B, 0xDB, 0x62, 0x74, 0xC6,
402 0xA1, 0x08, 0xDD, 0x19, 0xA3, 0x75, 0x17, 0x1B,
403 };
404
405 static const unsigned char dsa2048_g[] = {
406 0x2C, 0x78, 0x16, 0x59, 0x34, 0x63, 0xF4, 0xF3, 0x92, 0xFC, 0xB5, 0xA5,
407 0x4F, 0x13, 0xDE, 0x2F, 0x1C, 0xA4, 0x3C, 0xAE, 0xAD, 0x38, 0x3F, 0x7E,
408 0x90, 0xBF, 0x96, 0xA6, 0xAE, 0x25, 0x90, 0x72, 0xF5, 0x8E, 0x80, 0x0C,
409 0x39, 0x1C, 0xD9, 0xEC, 0xBA, 0x90, 0x5B, 0x3A, 0xE8, 0x58, 0x6C, 0x9E,
410 0x30, 0x42, 0x37, 0x02, 0x31, 0x82, 0xBC, 0x6A, 0xDF, 0x6A, 0x09, 0x29,
411 0xE3, 0xC0, 0x46, 0xD1, 0xCB, 0x85, 0xEC, 0x0C, 0x30, 0x5E, 0xEA, 0xC8,
412 0x39, 0x8E, 0x22, 0x9F, 0x22, 0x10, 0xD2, 0x34, 0x61, 0x68, 0x37, 0x3D,
413 0x2E, 0x4A, 0x5B, 0x9A, 0xF5, 0xC1, 0x48, 0xC6, 0xF6, 0xDC, 0x63, 0x1A,
414 0xD3, 0x96, 0x64, 0xBA, 0x34, 0xC9, 0xD1, 0xA0, 0xD1, 0xAE, 0x6C, 0x2F,
415 0x48, 0x17, 0x93, 0x14, 0x43, 0xED, 0xF0, 0x21, 0x30, 0x19, 0xC3, 0x1B,
416 0x5F, 0xDE, 0xA3, 0xF0, 0x70, 0x78, 0x18, 0xE1, 0xA8, 0xE4, 0xEE, 0x2E,
417 0x00, 0xA5, 0xE4, 0xB3, 0x17, 0xC8, 0x0C, 0x7D, 0x6E, 0x42, 0xDC, 0xB7,
418 0x46, 0x00, 0x36, 0x4D, 0xD4, 0x46, 0xAA, 0x3D, 0x3C, 0x46, 0x89, 0x40,
419 0xBF, 0x1D, 0x84, 0x77, 0x0A, 0x75, 0xF3, 0x87, 0x1D, 0x08, 0x4C, 0xA6,
420 0xD1, 0xA9, 0x1C, 0x1E, 0x12, 0x1E, 0xE1, 0xC7, 0x30, 0x28, 0x76, 0xA5,
421 0x7F, 0x6C, 0x85, 0x96, 0x2B, 0x6F, 0xDB, 0x80, 0x66, 0x26, 0xAE, 0xF5,
422 0x93, 0xC7, 0x8E, 0xAE, 0x9A, 0xED, 0xE4, 0xCA, 0x04, 0xEA, 0x3B, 0x72,
423 0xEF, 0xDC, 0x87, 0xED, 0x0D, 0xA5, 0x4C, 0x4A, 0xDD, 0x71, 0x22, 0x64,
424 0x59, 0x69, 0x4E, 0x8E, 0xBF, 0x43, 0xDC, 0xAB, 0x8E, 0x66, 0xBB, 0x01,
425 0xB6, 0xF4, 0xE7, 0xFD, 0xD2, 0xAD, 0x9F, 0x36, 0xC1, 0xA0, 0x29, 0x99,
426 0xD1, 0x96, 0x70, 0x59, 0x06, 0x78, 0x35, 0xBD, 0x65, 0x55, 0x52, 0x9E,
427 0xF8, 0xB2, 0xE5, 0x38,
428 };
429
430 static DSA *
get_dsa2048(void)431 get_dsa2048(void)
432 {
433 return get_dsa(dsa2048_priv, sizeof(dsa2048_priv),
434 dsa2048_pub, sizeof(dsa2048_pub), dsa2048_p, sizeof(dsa2048_p),
435 dsa2048_q, sizeof(dsa2048_q), dsa2048_g, sizeof(dsa2048_g));
436 }
437
438 static const unsigned char test512[] = {
439 0x30, 0x82, 0x01, 0x3a, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
440 0xd6, 0x33, 0xb9, 0xc8, 0xfb, 0x4f, 0x3c, 0x7d, 0xc0, 0x01,
441 0x86, 0xd0, 0xe7, 0xa0, 0x55, 0xf2, 0x95, 0x93, 0xcc, 0x4f,
442 0xb7, 0x5b, 0x67, 0x5b, 0x94, 0x68, 0xc9, 0x34, 0x15, 0xde,
443 0xa5, 0x2e, 0x1c, 0x33, 0xc2, 0x6e, 0xfc, 0x34, 0x5e, 0x71,
444 0x13, 0xb7, 0xd6, 0xee, 0xd8, 0xa5, 0x65, 0x05, 0x72, 0x87,
445 0xa8, 0xb0, 0x77, 0xfe, 0x57, 0xf5, 0xfc, 0x5f, 0x55, 0x83,
446 0x87, 0xdd, 0x57, 0x49, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
447 0x41, 0x00, 0xa7, 0xf7, 0x91, 0xc5, 0x0f, 0x84, 0x57, 0xdc,
448 0x07, 0xf7, 0x6a, 0x7f, 0x60, 0x52, 0xb3, 0x72, 0xf1, 0x66,
449 0x1f, 0x7d, 0x97, 0x3b, 0x9e, 0xb6, 0x0a, 0x8f, 0x8c, 0xcf,
450 0x42, 0x23, 0x00, 0x04, 0xd4, 0x28, 0x0e, 0x1c, 0x90, 0xc4,
451 0x11, 0x25, 0x25, 0xa5, 0x93, 0xa5, 0x2f, 0x70, 0x02, 0xdf,
452 0x81, 0x9c, 0x49, 0x03, 0xa0, 0xf8, 0x6d, 0x54, 0x2e, 0x26,
453 0xde, 0xaa, 0x85, 0x59, 0xa8, 0x31, 0x02, 0x21, 0x00, 0xeb,
454 0x47, 0xd7, 0x3b, 0xf6, 0xc3, 0xdd, 0x5a, 0x46, 0xc5, 0xb9,
455 0x2b, 0x9a, 0xa0, 0x09, 0x8f, 0xa6, 0xfb, 0xf3, 0x78, 0x7a,
456 0x33, 0x70, 0x9d, 0x0f, 0x42, 0x6b, 0x13, 0x68, 0x24, 0xd3,
457 0x15, 0x02, 0x21, 0x00, 0xe9, 0x10, 0xb0, 0xb3, 0x0d, 0xe2,
458 0x82, 0x68, 0x77, 0x8a, 0x6e, 0x7c, 0xda, 0xbc, 0x3e, 0x53,
459 0x83, 0xfb, 0xd6, 0x22, 0xe7, 0xb5, 0xae, 0x6e, 0x80, 0xda,
460 0x00, 0x55, 0x97, 0xc1, 0xd0, 0x65, 0x02, 0x20, 0x4c, 0xf8,
461 0x73, 0xb1, 0x6a, 0x49, 0x29, 0x61, 0x1f, 0x46, 0x10, 0x0d,
462 0xf3, 0xc7, 0xe7, 0x58, 0xd7, 0x88, 0x15, 0x5e, 0x94, 0x9b,
463 0xbf, 0x7b, 0xa2, 0x42, 0x58, 0x45, 0x41, 0x0c, 0xcb, 0x01,
464 0x02, 0x20, 0x12, 0x11, 0xba, 0x31, 0x57, 0x9d, 0x3d, 0x11,
465 0x0e, 0x5b, 0x8c, 0x2f, 0x5f, 0xe2, 0x02, 0x4f, 0x05, 0x47,
466 0x8c, 0x15, 0x8e, 0xb3, 0x56, 0x3f, 0xb8, 0xfb, 0xad, 0xd4,
467 0xf4, 0xfc, 0x10, 0xc5, 0x02, 0x20, 0x18, 0xa1, 0x29, 0x99,
468 0x5b, 0xd9, 0xc8, 0xd4, 0xfc, 0x49, 0x7a, 0x2a, 0x21, 0x2c,
469 0x49, 0xe4, 0x4f, 0xeb, 0xef, 0x51, 0xf1, 0xab, 0x6d, 0xfb,
470 0x4b, 0x14, 0xe9, 0x4b, 0x52, 0xb5, 0x82, 0x2c,
471 };
472
473 static const unsigned char test1024[] = {
474 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
475 0x00, 0xdc, 0x98, 0x43, 0xe8, 0x3d, 0x43, 0x5b, 0xe4, 0x05,
476 0xcd, 0xd0, 0xa9, 0x3e, 0xcb, 0x83, 0x75, 0xf6, 0xb5, 0xa5,
477 0x9f, 0x6b, 0xe9, 0x34, 0x41, 0x29, 0x18, 0xfa, 0x6a, 0x55,
478 0x4d, 0x70, 0xfc, 0xec, 0xae, 0x87, 0x38, 0x0a, 0x20, 0xa9,
479 0xc0, 0x45, 0x77, 0x6e, 0x57, 0x60, 0x57, 0xf4, 0xed, 0x96,
480 0x22, 0xcb, 0x8f, 0xe1, 0x33, 0x3a, 0x17, 0x1f, 0xed, 0x37,
481 0xa5, 0x6f, 0xeb, 0xa6, 0xbc, 0x12, 0x80, 0x1d, 0x53, 0xbd,
482 0x70, 0xeb, 0x21, 0x76, 0x3e, 0xc9, 0x2f, 0x1a, 0x45, 0x24,
483 0x82, 0xff, 0xcd, 0x59, 0x32, 0x06, 0x2e, 0x12, 0x3b, 0x23,
484 0x78, 0xed, 0x12, 0x3d, 0xe0, 0x8d, 0xf9, 0x67, 0x4f, 0x37,
485 0x4e, 0x47, 0x02, 0x4c, 0x2d, 0xc0, 0x4f, 0x1f, 0xb3, 0x94,
486 0xe1, 0x41, 0x2e, 0x2d, 0x90, 0x10, 0xfc, 0x82, 0x91, 0x8b,
487 0x0f, 0x22, 0xd4, 0xf2, 0xfc, 0x2c, 0xab, 0x53, 0x55, 0x02,
488 0x03, 0x01, 0x00, 0x01, 0x02, 0x81, 0x80, 0x2b, 0xcc, 0x3f,
489 0x8f, 0x58, 0xba, 0x8b, 0x00, 0x16, 0xf6, 0xea, 0x3a, 0xf0,
490 0x30, 0xd0, 0x05, 0x17, 0xda, 0xb0, 0xeb, 0x9a, 0x2d, 0x4f,
491 0x26, 0xb0, 0xd6, 0x38, 0xc1, 0xeb, 0xf5, 0xd8, 0x3d, 0x1f,
492 0x70, 0xf7, 0x7f, 0xf4, 0xe2, 0xcf, 0x51, 0x51, 0x79, 0x88,
493 0xfa, 0xe8, 0x32, 0x0e, 0x7b, 0x2d, 0x97, 0xf2, 0xfa, 0xba,
494 0x27, 0xc5, 0x9c, 0xd9, 0xc5, 0xeb, 0x8a, 0x79, 0x52, 0x3c,
495 0x64, 0x34, 0x7d, 0xc2, 0xcf, 0x28, 0xc7, 0x4e, 0xd5, 0x43,
496 0x0b, 0xd1, 0xa6, 0xca, 0x6d, 0x03, 0x2d, 0x72, 0x23, 0xbc,
497 0x6d, 0x05, 0xfa, 0x16, 0x09, 0x2f, 0x2e, 0x5c, 0xb6, 0xee,
498 0x74, 0xdd, 0xd2, 0x48, 0x8e, 0x36, 0x0c, 0x06, 0x3d, 0x4d,
499 0xe5, 0x10, 0x82, 0xeb, 0x6a, 0xf3, 0x4b, 0x9f, 0xd6, 0xed,
500 0x11, 0xb1, 0x6e, 0xec, 0xf4, 0xfe, 0x8e, 0x75, 0x94, 0x20,
501 0x2f, 0xcb, 0xac, 0x46, 0xf1, 0x02, 0x41, 0x00, 0xf9, 0x8c,
502 0xa3, 0x85, 0xb1, 0xdd, 0x29, 0xaf, 0x65, 0xc1, 0x33, 0xf3,
503 0x95, 0xc5, 0x52, 0x68, 0x0b, 0xd4, 0xf1, 0xe5, 0x0e, 0x02,
504 0x9f, 0x4f, 0xfa, 0x77, 0xdc, 0x46, 0x9e, 0xc7, 0xa6, 0xe4,
505 0x16, 0x29, 0xda, 0xb0, 0x07, 0xcf, 0x5b, 0xa9, 0x12, 0x8a,
506 0xdd, 0x63, 0x0a, 0xde, 0x2e, 0x8c, 0x66, 0x8b, 0x8c, 0xdc,
507 0x19, 0xa3, 0x7e, 0xf4, 0x3b, 0xd0, 0x1a, 0x8c, 0xa4, 0xc2,
508 0xe1, 0xd3, 0x02, 0x41, 0x00, 0xe2, 0x4c, 0x05, 0xf2, 0x04,
509 0x86, 0x4e, 0x61, 0x43, 0xdb, 0xb0, 0xb9, 0x96, 0x86, 0x52,
510 0x2c, 0xca, 0x8d, 0x7b, 0xab, 0x0b, 0x13, 0x0d, 0x7e, 0x38,
511 0x5b, 0xe2, 0x2e, 0x7b, 0x0e, 0xe7, 0x19, 0x99, 0x38, 0xe7,
512 0xf2, 0x21, 0xbd, 0x85, 0x85, 0xe3, 0xfd, 0x28, 0x77, 0x20,
513 0x31, 0x71, 0x2c, 0xd0, 0xff, 0xfb, 0x2e, 0xaf, 0x85, 0xb4,
514 0x86, 0xca, 0xf3, 0xbb, 0xca, 0xaa, 0x0f, 0x95, 0x37, 0x02,
515 0x40, 0x0e, 0x41, 0x9a, 0x95, 0xe8, 0xb3, 0x59, 0xce, 0x4b,
516 0x61, 0xde, 0x35, 0xec, 0x38, 0x79, 0x9c, 0xb8, 0x10, 0x52,
517 0x41, 0x63, 0xab, 0x82, 0xae, 0x6f, 0x00, 0xa9, 0xf4, 0xde,
518 0xdd, 0x49, 0x0b, 0x7e, 0xb8, 0xa5, 0x65, 0xa9, 0x0c, 0x8f,
519 0x8f, 0xf9, 0x1f, 0x35, 0xc6, 0x92, 0xb8, 0x5e, 0xb0, 0x66,
520 0xab, 0x52, 0x40, 0xc0, 0xb6, 0x36, 0x6a, 0x7d, 0x80, 0x46,
521 0x04, 0x02, 0xe5, 0x9f, 0x41, 0x02, 0x41, 0x00, 0xc0, 0xad,
522 0xcc, 0x4e, 0x21, 0xee, 0x1d, 0x24, 0x91, 0xfb, 0xa7, 0x80,
523 0x8d, 0x9a, 0xb6, 0xb3, 0x2e, 0x8f, 0xc2, 0xe1, 0x82, 0xdf,
524 0x69, 0x18, 0xb4, 0x71, 0xff, 0xa6, 0x65, 0xde, 0xed, 0x84,
525 0x8d, 0x42, 0xb7, 0xb3, 0x21, 0x69, 0x56, 0x1c, 0x07, 0x60,
526 0x51, 0x29, 0x04, 0xff, 0x34, 0x06, 0xdd, 0xb9, 0x67, 0x2c,
527 0x7c, 0x04, 0x93, 0x0e, 0x46, 0x15, 0xbb, 0x2a, 0xb7, 0x1b,
528 0xe7, 0x87, 0x02, 0x40, 0x78, 0xda, 0x5d, 0x07, 0x51, 0x0c,
529 0x16, 0x7a, 0x9f, 0x29, 0x20, 0x84, 0x0d, 0x42, 0xfa, 0xd7,
530 0x00, 0xd8, 0x77, 0x7e, 0xb0, 0xb0, 0x6b, 0xd6, 0x5b, 0x53,
531 0xb8, 0x9b, 0x7a, 0xcd, 0xc7, 0x2b, 0xb8, 0x6a, 0x63, 0xa9,
532 0xfb, 0x6f, 0xa4, 0x72, 0xbf, 0x4c, 0x5d, 0x00, 0x14, 0xba,
533 0xfa, 0x59, 0x88, 0xed, 0xe4, 0xe0, 0x8c, 0xa2, 0xec, 0x14,
534 0x7e, 0x2d, 0xe2, 0xf0, 0x46, 0x49, 0x95, 0x45,
535 };
536
537 static const unsigned char test2048[] = {
538 0x30, 0x82, 0x04, 0xa3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01,
539 0x01, 0x00, 0xc0, 0xc0, 0xce, 0x3e, 0x3c, 0x53, 0x67, 0x3f,
540 0x4f, 0xc5, 0x2f, 0xa4, 0xc2, 0x5a, 0x2f, 0x58, 0xfd, 0x27,
541 0x52, 0x6a, 0xe8, 0xcf, 0x4a, 0x73, 0x47, 0x8d, 0x25, 0x0f,
542 0x5f, 0x03, 0x26, 0x78, 0xef, 0xf0, 0x22, 0x12, 0xd3, 0xde,
543 0x47, 0xb2, 0x1c, 0x0b, 0x38, 0x63, 0x1a, 0x6c, 0x85, 0x7a,
544 0x80, 0xc6, 0x8f, 0xa0, 0x41, 0xaf, 0x62, 0xc4, 0x67, 0x32,
545 0x88, 0xf8, 0xa6, 0x9c, 0xf5, 0x23, 0x1d, 0xe4, 0xac, 0x3f,
546 0x29, 0xf9, 0xec, 0xe1, 0x8b, 0x26, 0x03, 0x2c, 0xb2, 0xab,
547 0xf3, 0x7d, 0xb5, 0xca, 0x49, 0xc0, 0x8f, 0x1c, 0xdf, 0x33,
548 0x3a, 0x60, 0xda, 0x3c, 0xb0, 0x16, 0xf8, 0xa9, 0x12, 0x8f,
549 0x64, 0xac, 0x23, 0x0c, 0x69, 0x64, 0x97, 0x5d, 0x99, 0xd4,
550 0x09, 0x83, 0x9b, 0x61, 0xd3, 0xac, 0xf0, 0xde, 0xdd, 0x5e,
551 0x9f, 0x44, 0x94, 0xdb, 0x3a, 0x4d, 0x97, 0xe8, 0x52, 0x29,
552 0xf7, 0xdb, 0x94, 0x07, 0x45, 0x90, 0x78, 0x1e, 0x31, 0x0b,
553 0x80, 0xf7, 0x57, 0xad, 0x1c, 0x79, 0xc5, 0xcb, 0x32, 0xb0,
554 0xce, 0xcd, 0x74, 0xb3, 0xe2, 0x94, 0xc5, 0x78, 0x2f, 0x34,
555 0x1a, 0x45, 0xf7, 0x8c, 0x52, 0xa5, 0xbc, 0x8d, 0xec, 0xd1,
556 0x2f, 0x31, 0x3b, 0xf0, 0x49, 0x59, 0x5e, 0x88, 0x9d, 0x15,
557 0x92, 0x35, 0x32, 0xc1, 0xe7, 0x61, 0xec, 0x50, 0x48, 0x7c,
558 0xba, 0x05, 0xf9, 0xf8, 0xf8, 0xa7, 0x8c, 0x83, 0xe8, 0x66,
559 0x5b, 0xeb, 0xfe, 0xd8, 0x4f, 0xdd, 0x6d, 0x36, 0xc0, 0xb2,
560 0x90, 0x0f, 0xb8, 0x52, 0xf9, 0x04, 0x9b, 0x40, 0x2c, 0x27,
561 0xd6, 0x36, 0x8e, 0xc2, 0x1b, 0x44, 0xf3, 0x92, 0xd5, 0x15,
562 0x9e, 0x9a, 0xbc, 0xf3, 0x7d, 0x03, 0xd7, 0x02, 0x14, 0x20,
563 0xe9, 0x10, 0x92, 0xfd, 0xf9, 0xfc, 0x8f, 0xe5, 0x18, 0xe1,
564 0x95, 0xcc, 0x9e, 0x60, 0xa6, 0xfa, 0x38, 0x4d, 0x02, 0x03,
565 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x00, 0xc3, 0xc3,
566 0x0d, 0xb4, 0x27, 0x90, 0x8d, 0x4b, 0xbf, 0xb8, 0x84, 0xaa,
567 0xd0, 0xb8, 0xc7, 0x5d, 0x99, 0xbe, 0x55, 0xf6, 0x3e, 0x7c,
568 0x49, 0x20, 0xcb, 0x8a, 0x8e, 0x19, 0x0e, 0x66, 0x24, 0xac,
569 0xaf, 0x03, 0x33, 0x97, 0xeb, 0x95, 0xd5, 0x3b, 0x0f, 0x40,
570 0x56, 0x04, 0x50, 0xd1, 0xe6, 0xbe, 0x84, 0x0b, 0x25, 0xd3,
571 0x9c, 0xe2, 0x83, 0x6c, 0xf5, 0x62, 0x5d, 0xba, 0x2b, 0x7d,
572 0x3d, 0x7a, 0x6c, 0xe1, 0xd2, 0x0e, 0x54, 0x93, 0x80, 0x01,
573 0x91, 0x51, 0x09, 0xe8, 0x5b, 0x8e, 0x47, 0xbd, 0x64, 0xe4,
574 0x0e, 0x03, 0x83, 0x55, 0xcf, 0x5a, 0x37, 0xf0, 0x25, 0xb5,
575 0x7d, 0x21, 0xd7, 0x69, 0xdf, 0x6f, 0xc2, 0xcf, 0x10, 0xc9,
576 0x8a, 0x40, 0x9f, 0x7a, 0x70, 0xc0, 0xe8, 0xe8, 0xc0, 0xe6,
577 0x9a, 0x15, 0x0a, 0x8d, 0x4e, 0x46, 0xcb, 0x7a, 0xdb, 0xb3,
578 0xcb, 0x83, 0x02, 0xc4, 0xf0, 0xab, 0xeb, 0x02, 0x01, 0x0e,
579 0x23, 0xfc, 0x1d, 0xc4, 0xbd, 0xd4, 0xaa, 0x5d, 0x31, 0x46,
580 0x99, 0xce, 0x9e, 0xf8, 0x04, 0x75, 0x10, 0x67, 0xc4, 0x53,
581 0x47, 0x44, 0xfa, 0xc2, 0x25, 0x73, 0x7e, 0xd0, 0x8e, 0x59,
582 0xd1, 0xb2, 0x5a, 0xf4, 0xc7, 0x18, 0x92, 0x2f, 0x39, 0xab,
583 0xcd, 0xa3, 0xb5, 0xc2, 0xb9, 0xc7, 0xb9, 0x1b, 0x9f, 0x48,
584 0xfa, 0x13, 0xc6, 0x98, 0x4d, 0xca, 0x84, 0x9c, 0x06, 0xca,
585 0xe7, 0x89, 0x01, 0x04, 0xc4, 0x6c, 0xfd, 0x29, 0x59, 0x35,
586 0xe7, 0xf3, 0xdd, 0xce, 0x64, 0x59, 0xbf, 0x21, 0x13, 0xa9,
587 0x9f, 0x0e, 0xc5, 0xff, 0xbd, 0x33, 0x00, 0xec, 0xac, 0x6b,
588 0x11, 0xef, 0x51, 0x5e, 0xad, 0x07, 0x15, 0xde, 0xb8, 0x5f,
589 0xc6, 0xb9, 0xa3, 0x22, 0x65, 0x46, 0x83, 0x14, 0xdf, 0xd0,
590 0xf1, 0x44, 0x8a, 0xe1, 0x9c, 0x23, 0x33, 0xb4, 0x97, 0x33,
591 0xe6, 0x6b, 0x81, 0x02, 0x81, 0x81, 0x00, 0xec, 0x12, 0xa7,
592 0x59, 0x74, 0x6a, 0xde, 0x3e, 0xad, 0xd8, 0x36, 0x80, 0x50,
593 0xa2, 0xd5, 0x21, 0x81, 0x07, 0xf1, 0xd0, 0x91, 0xf2, 0x6c,
594 0x12, 0x2f, 0x9d, 0x1a, 0x26, 0xf8, 0x30, 0x65, 0xdf, 0xe8,
595 0xc0, 0x9b, 0x6a, 0x30, 0x98, 0x82, 0x87, 0xec, 0xa2, 0x56,
596 0x87, 0x62, 0x6f, 0xe7, 0x9f, 0xf6, 0x56, 0xe6, 0x71, 0x8f,
597 0x49, 0x86, 0x93, 0x5a, 0x4d, 0x34, 0x58, 0xfe, 0xd9, 0x04,
598 0x13, 0xaf, 0x79, 0xb7, 0xad, 0x11, 0xd1, 0x30, 0x9a, 0x14,
599 0x06, 0xa0, 0xfa, 0xb7, 0x55, 0xdc, 0x6c, 0x5a, 0x4c, 0x2c,
600 0x59, 0x56, 0xf6, 0xe8, 0x9d, 0xaf, 0x0a, 0x78, 0x99, 0x06,
601 0x06, 0x9e, 0xe7, 0x9c, 0x51, 0x55, 0x43, 0xfc, 0x3b, 0x6c,
602 0x0b, 0xbf, 0x2d, 0x41, 0xa7, 0xaf, 0xb7, 0xe0, 0xe8, 0x28,
603 0x18, 0xb4, 0x13, 0xd1, 0xe6, 0x97, 0xd0, 0x9f, 0x6a, 0x80,
604 0xca, 0xdd, 0x1a, 0x7e, 0x15, 0x02, 0x81, 0x81, 0x00, 0xd1,
605 0x06, 0x0c, 0x1f, 0xe3, 0xd0, 0xab, 0xd6, 0xca, 0x7c, 0xbc,
606 0x7d, 0x13, 0x35, 0xce, 0x27, 0xcd, 0xd8, 0x49, 0x51, 0x63,
607 0x64, 0x0f, 0xca, 0x06, 0x12, 0xfc, 0x07, 0x3e, 0xaf, 0x61,
608 0x6d, 0xe2, 0x53, 0x39, 0x27, 0xae, 0xc3, 0x11, 0x9e, 0x94,
609 0x01, 0x4f, 0xe3, 0xf3, 0x67, 0xf9, 0x77, 0xf9, 0xe7, 0x95,
610 0x3a, 0x6f, 0xe2, 0x20, 0x73, 0x3e, 0xa4, 0x7a, 0x28, 0xd4,
611 0x61, 0x97, 0xf6, 0x17, 0xa0, 0x23, 0x10, 0x2b, 0xce, 0x84,
612 0x57, 0x7e, 0x25, 0x1f, 0xf4, 0xa8, 0x54, 0xd2, 0x65, 0x94,
613 0xcc, 0x95, 0x0a, 0xab, 0x30, 0xc1, 0x59, 0x1f, 0x61, 0x8e,
614 0xb9, 0x6b, 0xd7, 0x4e, 0xb9, 0x83, 0x43, 0x79, 0x85, 0x11,
615 0xbc, 0x0f, 0xae, 0x25, 0x20, 0x05, 0xbc, 0xd2, 0x48, 0xa1,
616 0x68, 0x09, 0x84, 0xf6, 0x12, 0x9a, 0x66, 0xb9, 0x2b, 0xbb,
617 0x76, 0x03, 0x17, 0x46, 0x4e, 0x97, 0x59, 0x02, 0x81, 0x80,
618 0x09, 0x4c, 0xfa, 0xd6, 0xe5, 0x65, 0x48, 0x78, 0x43, 0xb5,
619 0x1f, 0x00, 0x93, 0x2c, 0xb7, 0x24, 0xe8, 0xc6, 0x7d, 0x5a,
620 0x70, 0x45, 0x92, 0xc8, 0x6c, 0xa3, 0xcd, 0xe1, 0xf7, 0x29,
621 0x40, 0xfa, 0x3f, 0x5b, 0x47, 0x44, 0x39, 0xc1, 0xe8, 0x72,
622 0x9e, 0x7a, 0x0e, 0xda, 0xaa, 0xa0, 0x2a, 0x09, 0xfd, 0x54,
623 0x93, 0x23, 0xaa, 0x37, 0x85, 0x5b, 0xcc, 0xd4, 0xf9, 0xd8,
624 0xff, 0xc1, 0x61, 0x0d, 0xbd, 0x7e, 0x18, 0x24, 0x73, 0x6d,
625 0x40, 0x72, 0xf1, 0x93, 0x09, 0x48, 0x97, 0x6c, 0x84, 0x90,
626 0xa8, 0x46, 0x14, 0x01, 0x39, 0x11, 0xe5, 0x3c, 0x41, 0x27,
627 0x32, 0x75, 0x24, 0xed, 0xa1, 0xd9, 0x12, 0x29, 0x8a, 0x28,
628 0x71, 0x89, 0x8d, 0xca, 0x30, 0xb0, 0x01, 0xc4, 0x2f, 0x82,
629 0x19, 0x14, 0x4c, 0x70, 0x1c, 0xb8, 0x23, 0x2e, 0xe8, 0x90,
630 0x49, 0x97, 0x92, 0x97, 0x6b, 0x7a, 0x9d, 0xb9, 0x02, 0x81,
631 0x80, 0x0f, 0x0e, 0xa1, 0x76, 0xf6, 0xa1, 0x44, 0x8f, 0xaf,
632 0x7c, 0x76, 0xd3, 0x87, 0xbb, 0xbb, 0x83, 0x10, 0x88, 0x01,
633 0x18, 0x14, 0xd1, 0xd3, 0x75, 0x59, 0x24, 0xaa, 0xf5, 0x16,
634 0xa5, 0xe9, 0x9d, 0xd1, 0xcc, 0xee, 0xf4, 0x15, 0xd9, 0xc5,
635 0x7e, 0x27, 0xe9, 0x44, 0x49, 0x06, 0x72, 0xb9, 0xfc, 0xd3,
636 0x8a, 0xc4, 0x2c, 0x36, 0x7d, 0x12, 0x9b, 0x5a, 0xaa, 0xdc,
637 0x85, 0xee, 0x6e, 0xad, 0x54, 0xb3, 0xf4, 0xfc, 0x31, 0xa1,
638 0x06, 0x3a, 0x70, 0x57, 0x0c, 0xf3, 0x95, 0x5b, 0x3e, 0xe8,
639 0xfd, 0x1a, 0x4f, 0xf6, 0x78, 0x93, 0x46, 0x6a, 0xd7, 0x31,
640 0xb4, 0x84, 0x64, 0x85, 0x09, 0x38, 0x89, 0x92, 0x94, 0x1c,
641 0xbf, 0xe2, 0x3c, 0x2a, 0xe0, 0xff, 0x99, 0xa3, 0xf0, 0x2b,
642 0x31, 0xc2, 0x36, 0xcd, 0x60, 0xbf, 0x9d, 0x2d, 0x74, 0x32,
643 0xe8, 0x9c, 0x93, 0x6e, 0xbb, 0x91, 0x7b, 0xfd, 0xd9, 0x02,
644 0x81, 0x81, 0x00, 0xa2, 0x71, 0x25, 0x38, 0xeb, 0x2a, 0xe9,
645 0x37, 0xcd, 0xfe, 0x44, 0xce, 0x90, 0x3f, 0x52, 0x87, 0x84,
646 0x52, 0x1b, 0xae, 0x8d, 0x22, 0x94, 0xce, 0x38, 0xe6, 0x04,
647 0x88, 0x76, 0x85, 0x9a, 0xd3, 0x14, 0x09, 0xe5, 0x69, 0x9a,
648 0xff, 0x58, 0x92, 0x02, 0x6a, 0x7d, 0x7c, 0x1e, 0x2c, 0xfd,
649 0xa8, 0xca, 0x32, 0x14, 0x4f, 0x0d, 0x84, 0x0d, 0x37, 0x43,
650 0xbf, 0xe4, 0x5d, 0x12, 0xc8, 0x24, 0x91, 0x27, 0x8d, 0x46,
651 0xd9, 0x54, 0x53, 0xe7, 0x62, 0x71, 0xa8, 0x2b, 0x71, 0x41,
652 0x8d, 0x75, 0xf8, 0x3a, 0xa0, 0x61, 0x29, 0x46, 0xa6, 0xe5,
653 0x82, 0xfa, 0x3a, 0xd9, 0x08, 0xfa, 0xfc, 0x63, 0xfd, 0x6b,
654 0x30, 0xbc, 0xf4, 0x4e, 0x9e, 0x8c, 0x25, 0x0c, 0xb6, 0x55,
655 0xe7, 0x3c, 0xd4, 0x4e, 0x0b, 0xfd, 0x8b, 0xc3, 0x0e, 0x1d,
656 0x9c, 0x44, 0x57, 0x8f, 0x1f, 0x86, 0xf7, 0xd5, 0x1b, 0xe4,
657 0x95,
658 };
659
660 static const unsigned char test4096[] = {
661 0x30, 0x82, 0x09, 0x29, 0x02, 0x01, 0x00, 0x02, 0x82, 0x02,
662 0x01, 0x00, 0xc0, 0x71, 0xac, 0x1a, 0x13, 0x88, 0x82, 0x43,
663 0x3b, 0x51, 0x57, 0x71, 0x8d, 0xb6, 0x2b, 0x82, 0x65, 0x21,
664 0x53, 0x5f, 0x28, 0x29, 0x4f, 0x8d, 0x7c, 0x8a, 0xb9, 0x44,
665 0xb3, 0x28, 0x41, 0x4f, 0xd3, 0xfa, 0x6a, 0xf8, 0xb9, 0x28,
666 0x50, 0x39, 0x67, 0x53, 0x2c, 0x3c, 0xd7, 0xcb, 0x96, 0x41,
667 0x40, 0x32, 0xbb, 0xeb, 0x70, 0xae, 0x1f, 0xb0, 0x65, 0xf7,
668 0x3a, 0xd9, 0x22, 0xfd, 0x10, 0xae, 0xbd, 0x02, 0xe2, 0xdd,
669 0xf3, 0xc2, 0x79, 0x3c, 0xc6, 0xfc, 0x75, 0xbb, 0xaf, 0x4e,
670 0x3a, 0x36, 0xc2, 0x4f, 0xea, 0x25, 0xdf, 0x13, 0x16, 0x4b,
671 0x20, 0xfe, 0x4b, 0x69, 0x16, 0xc4, 0x7f, 0x1a, 0x43, 0xa6,
672 0x17, 0x1b, 0xb9, 0x0a, 0xf3, 0x09, 0x86, 0x28, 0x89, 0xcf,
673 0x2c, 0xd0, 0xd4, 0x81, 0xaf, 0xc6, 0x6d, 0xe6, 0x21, 0x8d,
674 0xee, 0xef, 0xea, 0xdc, 0xb7, 0xc6, 0x3b, 0x63, 0x9f, 0x0e,
675 0xad, 0x89, 0x78, 0x23, 0x18, 0xbf, 0x70, 0x7e, 0x84, 0xe0,
676 0x37, 0xec, 0xdb, 0x8e, 0x9c, 0x3e, 0x6a, 0x19, 0xcc, 0x99,
677 0x72, 0xe6, 0xb5, 0x7d, 0x6d, 0xfa, 0xe5, 0xd3, 0xe4, 0x90,
678 0xb5, 0xb2, 0xb2, 0x12, 0x70, 0x4e, 0xca, 0xf8, 0x10, 0xf8,
679 0xa3, 0x14, 0xc2, 0x48, 0x19, 0xeb, 0x60, 0x99, 0xbb, 0x2a,
680 0x1f, 0xb1, 0x7a, 0xb1, 0x3d, 0x24, 0xfb, 0xa0, 0x29, 0xda,
681 0xbd, 0x1b, 0xd7, 0xa4, 0xbf, 0xef, 0x60, 0x2d, 0x22, 0xca,
682 0x65, 0x98, 0xf1, 0xc4, 0xe1, 0xc9, 0x02, 0x6b, 0x16, 0x28,
683 0x2f, 0xa1, 0xaa, 0x79, 0x00, 0xda, 0xdc, 0x7c, 0x43, 0xf7,
684 0x42, 0x3c, 0xa0, 0xef, 0x68, 0xf7, 0xdf, 0xb9, 0x69, 0xfb,
685 0x8e, 0x01, 0xed, 0x01, 0x42, 0xb5, 0x4e, 0x57, 0xa6, 0x26,
686 0xb8, 0xd0, 0x7b, 0x56, 0x6d, 0x03, 0xc6, 0x40, 0x8c, 0x8c,
687 0x2a, 0x55, 0xd7, 0x9c, 0x35, 0x00, 0x94, 0x93, 0xec, 0x03,
688 0xeb, 0x22, 0xef, 0x77, 0xbb, 0x79, 0x13, 0x3f, 0x15, 0xa1,
689 0x8f, 0xca, 0xdf, 0xfd, 0xd3, 0xb8, 0xe1, 0xd4, 0xcc, 0x09,
690 0x3f, 0x3c, 0x2c, 0xdb, 0xd1, 0x49, 0x7f, 0x38, 0x07, 0x83,
691 0x6d, 0xeb, 0x08, 0x66, 0xe9, 0x06, 0x44, 0x12, 0xac, 0x95,
692 0x22, 0x90, 0x23, 0x67, 0xd4, 0x08, 0xcc, 0xf4, 0xb7, 0xdc,
693 0xcc, 0x87, 0xd4, 0xac, 0x69, 0x35, 0x4c, 0xb5, 0x39, 0x36,
694 0xcd, 0xa4, 0xd2, 0x95, 0xca, 0x0d, 0xc5, 0xda, 0xc2, 0xc5,
695 0x22, 0x32, 0x28, 0x08, 0xe3, 0xd2, 0x8b, 0x38, 0x30, 0xdc,
696 0x8c, 0x75, 0x4f, 0x6a, 0xec, 0x7a, 0xac, 0x16, 0x3e, 0xa8,
697 0xd4, 0x6a, 0x45, 0xe1, 0xa8, 0x4f, 0x2e, 0x80, 0x34, 0xaa,
698 0x54, 0x1b, 0x02, 0x95, 0x7d, 0x8a, 0x6d, 0xcc, 0x79, 0xca,
699 0xf2, 0xa4, 0x2e, 0x8d, 0xfb, 0xfe, 0x15, 0x51, 0x10, 0x0e,
700 0x4d, 0x88, 0xb1, 0xc7, 0xf4, 0x79, 0xdb, 0xf0, 0xb4, 0x56,
701 0x44, 0x37, 0xca, 0x5a, 0xc1, 0x8c, 0x48, 0xac, 0xae, 0x48,
702 0x80, 0x83, 0x01, 0x3f, 0xde, 0xd9, 0xd3, 0x2c, 0x51, 0x46,
703 0xb1, 0x41, 0xb6, 0xc6, 0x91, 0x72, 0xf9, 0x83, 0x55, 0x1b,
704 0x8c, 0xba, 0xf3, 0x73, 0xe5, 0x2c, 0x74, 0x50, 0x3a, 0xbe,
705 0xc5, 0x2f, 0xa7, 0xb2, 0x6d, 0x8c, 0x9e, 0x13, 0x77, 0xa3,
706 0x13, 0xcd, 0x6d, 0x8c, 0x45, 0xe1, 0xfc, 0x0b, 0xb7, 0x69,
707 0xe9, 0x27, 0xbc, 0x65, 0xc3, 0xfa, 0x9b, 0xd0, 0xef, 0xfe,
708 0xe8, 0x1f, 0xb3, 0x5e, 0x34, 0xf4, 0x8c, 0xea, 0xfc, 0xd3,
709 0x81, 0xbf, 0x3d, 0x30, 0xb2, 0xb4, 0x01, 0xe8, 0x43, 0x0f,
710 0xba, 0x02, 0x23, 0x42, 0x76, 0x82, 0x31, 0x73, 0x91, 0xed,
711 0x07, 0x46, 0x61, 0x0d, 0x39, 0x83, 0x40, 0xce, 0x7a, 0xd4,
712 0xdb, 0x80, 0x2c, 0x1f, 0x0d, 0xd1, 0x34, 0xd4, 0x92, 0xe3,
713 0xd4, 0xf1, 0xc2, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
714 0x82, 0x02, 0x01, 0x00, 0x97, 0x6c, 0xda, 0x6e, 0xea, 0x4f,
715 0xcf, 0xaf, 0xf7, 0x4c, 0xd9, 0xf1, 0x90, 0x00, 0x77, 0xdb,
716 0xf2, 0x97, 0x76, 0x72, 0xb9, 0xb7, 0x47, 0xd1, 0x9c, 0xdd,
717 0xcb, 0x4a, 0x33, 0x6e, 0xc9, 0x75, 0x76, 0xe6, 0xe4, 0xa5,
718 0x31, 0x8c, 0x77, 0x13, 0xb4, 0x29, 0xcd, 0xf5, 0x52, 0x17,
719 0xef, 0xf3, 0x08, 0x00, 0xe3, 0xbd, 0x2e, 0xbc, 0xd4, 0x52,
720 0x88, 0xe9, 0x30, 0x75, 0x0b, 0x02, 0xf5, 0xcd, 0x89, 0x0c,
721 0x6c, 0x57, 0x19, 0x27, 0x3d, 0x1e, 0x85, 0xb4, 0xc1, 0x2f,
722 0x1d, 0x92, 0x00, 0x5c, 0x76, 0x29, 0x4b, 0xa4, 0xe1, 0x12,
723 0xb3, 0xc8, 0x09, 0xfe, 0x0e, 0x78, 0x72, 0x61, 0xcb, 0x61,
724 0x6f, 0x39, 0x91, 0x95, 0x4e, 0xd5, 0x3e, 0xc7, 0x8f, 0xb8,
725 0xf6, 0x36, 0xfe, 0x9c, 0x93, 0x9a, 0x38, 0x25, 0x7a, 0xf4,
726 0x4a, 0x12, 0xd4, 0xa0, 0x13, 0xbd, 0xf9, 0x1d, 0x12, 0x3e,
727 0x21, 0x39, 0xfb, 0x72, 0xe0, 0x05, 0x3d, 0xc3, 0xe5, 0x50,
728 0xa8, 0x5d, 0x85, 0xa3, 0xea, 0x5f, 0x1c, 0xb2, 0x3f, 0xea,
729 0x6d, 0x03, 0x91, 0x55, 0xd8, 0x19, 0x0a, 0x21, 0x12, 0x16,
730 0xd9, 0x12, 0xc4, 0xe6, 0x07, 0x18, 0x5b, 0x26, 0xa4, 0xae,
731 0xed, 0x2b, 0xb7, 0xa6, 0xed, 0xf8, 0xad, 0xec, 0x77, 0xe6,
732 0x7f, 0x4f, 0x76, 0x00, 0xc0, 0xfa, 0x15, 0x92, 0xb4, 0x2c,
733 0x22, 0xc2, 0xeb, 0x6a, 0xad, 0x14, 0x05, 0xb2, 0xe5, 0x8a,
734 0x9e, 0x85, 0x83, 0xcc, 0x04, 0xf1, 0x56, 0x78, 0x44, 0x5e,
735 0xde, 0xe0, 0x60, 0x1a, 0x65, 0x79, 0x31, 0x23, 0x05, 0xbb,
736 0x01, 0xff, 0xdd, 0x2e, 0xb7, 0xb3, 0xaa, 0x74, 0xe0, 0xa5,
737 0x94, 0xaf, 0x4b, 0xde, 0x58, 0x0f, 0x55, 0xde, 0x33, 0xf6,
738 0xe3, 0xd6, 0x34, 0x36, 0x57, 0xd6, 0x79, 0x91, 0x2e, 0xbe,
739 0x3b, 0xd9, 0x4e, 0xb6, 0x9d, 0x21, 0x5c, 0xd3, 0x48, 0x14,
740 0x7f, 0x4a, 0xc4, 0x60, 0xa9, 0x29, 0xf8, 0x53, 0x7f, 0x88,
741 0x11, 0x2d, 0xb5, 0xc5, 0x2d, 0x6f, 0xee, 0x85, 0x0b, 0xf7,
742 0x8d, 0x9a, 0xbe, 0xb0, 0x42, 0xf2, 0x2e, 0x71, 0xaf, 0x19,
743 0x31, 0x6d, 0xec, 0xcd, 0x6f, 0x2b, 0x23, 0xdf, 0xb4, 0x40,
744 0xaf, 0x2c, 0x0a, 0xc3, 0x1b, 0x7d, 0x7d, 0x03, 0x1d, 0x4b,
745 0xf3, 0xb5, 0xe0, 0x85, 0xd8, 0xdf, 0x91, 0x6b, 0x0a, 0x69,
746 0xf7, 0xf2, 0x69, 0x66, 0x5b, 0xf1, 0xcf, 0x46, 0x7d, 0xe9,
747 0x70, 0xfa, 0x6d, 0x7e, 0x75, 0x4e, 0xa9, 0x77, 0xe6, 0x8c,
748 0x02, 0xf7, 0x14, 0x4d, 0xa5, 0x41, 0x8f, 0x3f, 0xc1, 0x62,
749 0x1e, 0x71, 0x5e, 0x38, 0xb4, 0xd6, 0xe6, 0xe1, 0x4b, 0xc2,
750 0x2c, 0x30, 0x83, 0x81, 0x6f, 0x49, 0x2e, 0x96, 0xe6, 0xc9,
751 0x9a, 0xf7, 0x5d, 0x09, 0xa0, 0x55, 0x02, 0xa5, 0x3a, 0x25,
752 0x23, 0xd0, 0x92, 0xc3, 0xa3, 0xe3, 0x0e, 0x12, 0x2f, 0x4d,
753 0xef, 0xf3, 0x55, 0x5a, 0xbe, 0xe6, 0x19, 0x86, 0x31, 0xab,
754 0x75, 0x9a, 0xd3, 0xf0, 0x2c, 0xc5, 0x41, 0x92, 0xd9, 0x1f,
755 0x5f, 0x11, 0x8c, 0x75, 0x1c, 0x63, 0xd0, 0x02, 0x80, 0x2c,
756 0x68, 0xcb, 0x93, 0xfb, 0x51, 0x73, 0x49, 0xb4, 0x60, 0xda,
757 0xe2, 0x26, 0xaf, 0xa9, 0x46, 0x12, 0xb8, 0xec, 0x50, 0xdd,
758 0x12, 0x06, 0x5f, 0xce, 0x59, 0xe6, 0xf6, 0x1c, 0xe0, 0x54,
759 0x10, 0xad, 0xf6, 0xcd, 0x98, 0xcc, 0x0f, 0xfb, 0xcb, 0x41,
760 0x14, 0x9d, 0xed, 0xe4, 0xb4, 0x74, 0x5f, 0x09, 0x60, 0xc7,
761 0x12, 0xf6, 0x7b, 0x3c, 0x8f, 0xa7, 0x20, 0xbc, 0xe4, 0xb1,
762 0xef, 0xeb, 0xa4, 0x93, 0xc5, 0x06, 0xca, 0x9a, 0x27, 0x9d,
763 0x87, 0xf3, 0xde, 0xca, 0xe5, 0xe7, 0xf6, 0x1c, 0x01, 0x65,
764 0x5b, 0xfb, 0x19, 0x79, 0x6e, 0x08, 0x26, 0xc5, 0xc8, 0x28,
765 0x0e, 0xb6, 0x3b, 0x07, 0x08, 0xc1, 0x02, 0x82, 0x01, 0x01,
766 0x00, 0xe8, 0x1c, 0x73, 0xa6, 0xb8, 0xe0, 0x0e, 0x6d, 0x8d,
767 0x1b, 0xb9, 0x53, 0xed, 0x58, 0x94, 0xe6, 0x1d, 0x60, 0x14,
768 0x5c, 0x76, 0x43, 0xc4, 0x58, 0x19, 0xc4, 0x24, 0xe8, 0xbc,
769 0x1b, 0x3b, 0x0b, 0x13, 0x24, 0x45, 0x54, 0x0e, 0xcc, 0x37,
770 0xf0, 0xe0, 0x63, 0x7d, 0xc3, 0xf7, 0xfb, 0x81, 0x74, 0x81,
771 0xc4, 0x0f, 0x1a, 0x21, 0x48, 0xaf, 0xce, 0xc1, 0xc4, 0x94,
772 0x18, 0x06, 0x44, 0x8d, 0xd3, 0xd2, 0x22, 0x2d, 0x2d, 0x3e,
773 0x5a, 0x31, 0xdc, 0x95, 0x8e, 0xf4, 0x41, 0xfc, 0x58, 0xc9,
774 0x40, 0x92, 0x17, 0x5f, 0xe3, 0xda, 0xac, 0x9e, 0x3f, 0x1c,
775 0x2a, 0x6b, 0x58, 0x5f, 0x48, 0x78, 0x20, 0xb1, 0xaf, 0x24,
776 0x9b, 0x3c, 0x20, 0x8b, 0x93, 0x25, 0x9e, 0xe6, 0x6b, 0xbc,
777 0x13, 0x42, 0x14, 0x6c, 0x36, 0x31, 0xff, 0x7a, 0xd1, 0xc1,
778 0x1a, 0x26, 0x14, 0x7f, 0xa9, 0x76, 0xa7, 0x0c, 0xf8, 0xcc,
779 0xed, 0x07, 0x6a, 0xd2, 0xdf, 0x62, 0xee, 0x0a, 0x7c, 0x84,
780 0xcb, 0x49, 0x90, 0xb2, 0x03, 0x0d, 0xa2, 0x82, 0x06, 0x77,
781 0xf1, 0xcd, 0x67, 0xf2, 0x47, 0x21, 0x02, 0x3f, 0x43, 0x21,
782 0xf0, 0x46, 0x30, 0x62, 0x51, 0x72, 0xb1, 0xe7, 0x48, 0xc6,
783 0x67, 0x12, 0xcd, 0x9e, 0xd6, 0x15, 0xe5, 0x21, 0xed, 0xfa,
784 0x8f, 0x30, 0xa6, 0x41, 0xfe, 0xb6, 0xfa, 0x8f, 0x34, 0x14,
785 0x19, 0xe8, 0x11, 0xf7, 0xa5, 0x77, 0x3e, 0xb7, 0xf9, 0x39,
786 0x07, 0x8c, 0x67, 0x2a, 0xab, 0x7b, 0x08, 0xf8, 0xb0, 0x06,
787 0xa8, 0xea, 0x2f, 0x8f, 0xfa, 0xcc, 0xcc, 0x40, 0xce, 0xf3,
788 0x70, 0x4f, 0x3f, 0x7f, 0xe2, 0x0c, 0xea, 0x76, 0x4a, 0x35,
789 0x4e, 0x47, 0xad, 0x2b, 0xa7, 0x97, 0x5d, 0x74, 0x43, 0x97,
790 0x90, 0xd2, 0xfb, 0xd9, 0xf9, 0x96, 0x01, 0x33, 0x05, 0xed,
791 0x7b, 0x03, 0x05, 0xad, 0xf8, 0x49, 0x03, 0x02, 0x82, 0x01,
792 0x01, 0x00, 0xd4, 0x40, 0x17, 0x66, 0x10, 0x92, 0x95, 0xc8,
793 0xec, 0x62, 0xa9, 0x7a, 0xcb, 0x93, 0x8e, 0xe6, 0x53, 0xd4,
794 0x80, 0x48, 0x27, 0x4b, 0x41, 0xce, 0x61, 0xdf, 0xbf, 0x94,
795 0xa4, 0x3d, 0x71, 0x03, 0x0b, 0xed, 0x25, 0x71, 0x98, 0xa4,
796 0xd6, 0xd5, 0x4a, 0x57, 0xf5, 0x6c, 0x1b, 0xda, 0x21, 0x7d,
797 0x35, 0x45, 0xb3, 0xf3, 0x6a, 0xd9, 0xd3, 0x43, 0xe8, 0x5c,
798 0x54, 0x1c, 0x83, 0x1b, 0xb4, 0x5f, 0xf2, 0x97, 0x24, 0x2e,
799 0xdc, 0x40, 0xde, 0x92, 0x23, 0x59, 0x8e, 0xbc, 0xd2, 0xa1,
800 0xf2, 0xe0, 0x4c, 0xdd, 0x0b, 0xd1, 0xe7, 0xae, 0x65, 0xbc,
801 0xb5, 0xf5, 0x5b, 0x98, 0xe9, 0xd7, 0xc2, 0xb7, 0x0e, 0x55,
802 0x71, 0x0e, 0x3c, 0x0a, 0x24, 0x6b, 0xa6, 0xe6, 0x14, 0x61,
803 0x11, 0xfd, 0x33, 0x42, 0x99, 0x2b, 0x84, 0x77, 0x74, 0x92,
804 0x91, 0xf5, 0x79, 0x79, 0xcf, 0xad, 0x8e, 0x04, 0xef, 0x80,
805 0x1e, 0x57, 0xf4, 0x14, 0xf5, 0x35, 0x09, 0x74, 0xb2, 0x13,
806 0x71, 0x58, 0x6b, 0xea, 0x32, 0x5d, 0xf3, 0xd3, 0x76, 0x48,
807 0x39, 0x10, 0x23, 0x84, 0x9d, 0xbe, 0x92, 0x77, 0x4a, 0xed,
808 0x70, 0x3e, 0x1a, 0xa2, 0x6c, 0xb3, 0x81, 0x00, 0xc3, 0xc9,
809 0xe4, 0x52, 0xc8, 0x24, 0x88, 0x0c, 0x41, 0xad, 0x87, 0x5a,
810 0xea, 0xa3, 0x7a, 0x85, 0x1c, 0x5e, 0x31, 0x7f, 0xc3, 0x35,
811 0xc6, 0xfa, 0x10, 0xc8, 0x75, 0x10, 0xc4, 0x96, 0x99, 0xe7,
812 0xfe, 0x01, 0xb4, 0x74, 0xdb, 0xb4, 0x11, 0xc3, 0xc8, 0x8c,
813 0xf6, 0xf7, 0x3b, 0x66, 0x50, 0xfc, 0xdb, 0xeb, 0xca, 0x47,
814 0x85, 0x89, 0xe1, 0x65, 0xd9, 0x62, 0x34, 0x3c, 0x70, 0xd8,
815 0x2e, 0xb4, 0x2f, 0x65, 0x3c, 0x4a, 0xa6, 0x2a, 0xe7, 0xc7,
816 0xd8, 0x41, 0x8f, 0x8a, 0x43, 0xbf, 0x42, 0xf2, 0x4d, 0xbc,
817 0xfc, 0x9e, 0x27, 0x95, 0xfb, 0x75, 0xff, 0xab, 0x02, 0x82,
818 0x01, 0x00, 0x41, 0x2f, 0x44, 0x57, 0x6d, 0x12, 0x17, 0x5b,
819 0x32, 0xc6, 0xb7, 0x6c, 0x57, 0x7a, 0x8a, 0x0e, 0x79, 0xef,
820 0x72, 0xa8, 0x68, 0xda, 0x2d, 0x38, 0xe4, 0xbb, 0x8d, 0xf6,
821 0x02, 0x65, 0xcf, 0x56, 0x13, 0xe1, 0x1a, 0xcb, 0x39, 0x80,
822 0xa6, 0xb1, 0x32, 0x03, 0x1e, 0xdd, 0xbb, 0x35, 0xd9, 0xac,
823 0x43, 0x89, 0x31, 0x08, 0x90, 0x92, 0x5e, 0x35, 0x3d, 0x7b,
824 0x9c, 0x6f, 0x86, 0xcb, 0x17, 0xdd, 0x85, 0xe4, 0xed, 0x35,
825 0x08, 0x8e, 0xc1, 0xf4, 0x05, 0xd8, 0x68, 0xc6, 0x63, 0x3c,
826 0xf7, 0xff, 0xf7, 0x47, 0x33, 0x39, 0xc5, 0x3e, 0xb7, 0x0e,
827 0x58, 0x35, 0x9d, 0x81, 0xea, 0xf8, 0x6a, 0x2c, 0x1c, 0x5a,
828 0x68, 0x78, 0x64, 0x11, 0x6b, 0xc1, 0x3e, 0x4e, 0x7a, 0xbd,
829 0x84, 0xcb, 0x0f, 0xc2, 0xb6, 0x85, 0x1d, 0xd3, 0x76, 0xc5,
830 0x93, 0x6a, 0x69, 0x89, 0x56, 0x34, 0xdc, 0x4a, 0x9b, 0xbc,
831 0xff, 0xa8, 0x0d, 0x6e, 0x35, 0x9c, 0x60, 0xa7, 0x23, 0x30,
832 0xc7, 0x06, 0x64, 0x39, 0x8b, 0x94, 0x89, 0xee, 0xba, 0x7f,
833 0x60, 0x8d, 0xfa, 0xb6, 0x97, 0x76, 0xdc, 0x51, 0x4a, 0x3c,
834 0xeb, 0x3a, 0x14, 0x2c, 0x20, 0x60, 0x69, 0x4a, 0x86, 0xfe,
835 0x8c, 0x21, 0x84, 0x49, 0x54, 0xb3, 0x20, 0xe1, 0x01, 0x7f,
836 0x58, 0xdf, 0x7f, 0xb5, 0x21, 0x51, 0x8c, 0x47, 0x9f, 0x91,
837 0xeb, 0x97, 0x3e, 0xf2, 0x54, 0xcf, 0x16, 0x46, 0xf9, 0xd9,
838 0xb6, 0xe7, 0x64, 0xc9, 0xd0, 0x54, 0xea, 0x2f, 0xa1, 0xcf,
839 0xa5, 0x7f, 0x28, 0x8d, 0x84, 0xec, 0xd5, 0x39, 0x03, 0x76,
840 0x5b, 0x2d, 0x8e, 0x43, 0xf2, 0x01, 0x24, 0xc9, 0x6f, 0xc0,
841 0xf5, 0x69, 0x6f, 0x7d, 0xb5, 0x85, 0xd2, 0x5f, 0x7f, 0x78,
842 0x40, 0x07, 0x7f, 0x09, 0x15, 0xb5, 0x1f, 0x28, 0x65, 0x10,
843 0xe4, 0x19, 0xa8, 0xc6, 0x9e, 0x8d, 0xdc, 0xcb, 0x02, 0x82,
844 0x01, 0x00, 0x13, 0x01, 0xee, 0x56, 0x80, 0x93, 0x70, 0x00,
845 0x7f, 0x52, 0xd2, 0x94, 0xa1, 0x98, 0x84, 0x4a, 0x92, 0x25,
846 0x4c, 0x9b, 0xa9, 0x91, 0x2e, 0xc2, 0x79, 0xb7, 0x5c, 0xe3,
847 0xc5, 0xd5, 0x8e, 0xc2, 0x54, 0x16, 0x17, 0xad, 0x55, 0x9b,
848 0x25, 0x76, 0x12, 0x63, 0x50, 0x22, 0x2f, 0x58, 0x58, 0x79,
849 0x6b, 0x04, 0xe3, 0xf9, 0x9f, 0x8f, 0x04, 0x41, 0x67, 0x94,
850 0xa5, 0x1f, 0xac, 0x8a, 0x15, 0x9c, 0x26, 0x10, 0x6c, 0xf8,
851 0x19, 0x57, 0x61, 0xd7, 0x3a, 0x7d, 0x31, 0xb0, 0x2d, 0x38,
852 0xbd, 0x94, 0x62, 0xad, 0xc4, 0xfa, 0x36, 0x42, 0x42, 0xf0,
853 0x24, 0x67, 0x65, 0x9d, 0x8b, 0x0b, 0x7c, 0x6f, 0x82, 0x44,
854 0x1a, 0x8c, 0xc8, 0xc9, 0xab, 0xbb, 0x4c, 0x45, 0xfc, 0x7b,
855 0x38, 0xee, 0x30, 0xe1, 0xfc, 0xef, 0x8d, 0xbc, 0x58, 0xdf,
856 0x2b, 0x5d, 0x0d, 0x54, 0xe0, 0x49, 0x4d, 0x97, 0x99, 0x8f,
857 0x22, 0xa8, 0x83, 0xbe, 0x40, 0xbb, 0x50, 0x2e, 0x78, 0x28,
858 0x0f, 0x95, 0x78, 0x8c, 0x8f, 0x98, 0x24, 0x56, 0xc2, 0x97,
859 0xf3, 0x2c, 0x43, 0xd2, 0x03, 0x82, 0x66, 0x81, 0x72, 0x5f,
860 0x53, 0x16, 0xec, 0xb1, 0xb1, 0x04, 0x5e, 0x40, 0x20, 0x48,
861 0x7b, 0x3f, 0x02, 0x97, 0x6a, 0xeb, 0x96, 0x12, 0x21, 0x35,
862 0xfe, 0x1f, 0x47, 0xc0, 0x95, 0xea, 0xc5, 0x8a, 0x08, 0x84,
863 0x4f, 0x5e, 0x63, 0x94, 0x60, 0x0f, 0x71, 0x5b, 0x7f, 0x4a,
864 0xec, 0x4f, 0x60, 0xc6, 0xba, 0x4a, 0x24, 0xf1, 0x20, 0x8b,
865 0xa7, 0x2e, 0x3a, 0xce, 0x8d, 0xe0, 0x27, 0x1d, 0xb5, 0x8e,
866 0xb4, 0x21, 0xc5, 0xe2, 0xa6, 0x16, 0x0a, 0x51, 0x83, 0x55,
867 0x88, 0xd1, 0x30, 0x11, 0x63, 0xd5, 0xd7, 0x8d, 0xae, 0x16,
868 0x12, 0x82, 0xc4, 0x85, 0x00, 0x4e, 0x27, 0x83, 0xa5, 0x7c,
869 0x90, 0x2e, 0xe5, 0xa2, 0xa3, 0xd3, 0x4c, 0x63, 0x02, 0x82,
870 0x01, 0x01, 0x00, 0x86, 0x08, 0x98, 0x98, 0xa5, 0x00, 0x05,
871 0x39, 0x77, 0xd9, 0x66, 0xb3, 0xcf, 0xca, 0xa0, 0x71, 0xb3,
872 0x50, 0xce, 0x3d, 0xb1, 0x93, 0x95, 0x35, 0xc4, 0xd4, 0x2e,
873 0x90, 0xdf, 0x0f, 0xfc, 0x60, 0xc1, 0x94, 0x68, 0x61, 0x43,
874 0xca, 0x9a, 0x23, 0x4a, 0x1e, 0x45, 0x72, 0x99, 0xb5, 0x1e,
875 0x61, 0x8d, 0x77, 0x0f, 0xa0, 0xbb, 0xd7, 0x77, 0xb4, 0x2a,
876 0x15, 0x11, 0x88, 0x2d, 0xb3, 0x56, 0x61, 0x5e, 0x6a, 0xed,
877 0xa4, 0x46, 0x4a, 0x3f, 0x50, 0x11, 0xd6, 0xba, 0xb6, 0xd7,
878 0x95, 0x65, 0x53, 0xc3, 0xa1, 0x8f, 0xe0, 0xa3, 0xf5, 0x1c,
879 0xfd, 0xaf, 0x6e, 0x43, 0xd7, 0x17, 0xa7, 0xd3, 0x81, 0x1b,
880 0xa4, 0xdf, 0xe0, 0x97, 0x8a, 0x46, 0x03, 0xd3, 0x46, 0x0e,
881 0x83, 0x48, 0x4e, 0xd2, 0x02, 0xcb, 0xc0, 0xad, 0x79, 0x95,
882 0x8c, 0x96, 0xba, 0x40, 0x34, 0x11, 0x71, 0x5e, 0xe9, 0x11,
883 0xf9, 0xc5, 0x4a, 0x5e, 0x91, 0x9d, 0xf5, 0x92, 0x4f, 0xeb,
884 0xc6, 0x70, 0x02, 0x2d, 0x3d, 0x04, 0xaa, 0xe9, 0x3a, 0x8e,
885 0xd5, 0xa8, 0xad, 0xf7, 0xce, 0x0d, 0x16, 0xb2, 0xec, 0x0a,
886 0x9c, 0xf5, 0x94, 0x39, 0xb9, 0x8a, 0xfc, 0x1e, 0xf9, 0xcc,
887 0xf2, 0x5f, 0x21, 0x31, 0x74, 0x72, 0x6b, 0x64, 0xae, 0x35,
888 0x61, 0x8d, 0x0d, 0xcb, 0xe7, 0xda, 0x39, 0xca, 0xf3, 0x21,
889 0x66, 0x0b, 0x95, 0xd7, 0x0a, 0x7c, 0xca, 0xa1, 0xa9, 0x5a,
890 0xe8, 0xac, 0xe0, 0x71, 0x54, 0xaf, 0x28, 0xcf, 0xd5, 0x70,
891 0x89, 0xe0, 0xf3, 0x9e, 0x43, 0x6c, 0x8d, 0x7b, 0x99, 0x01,
892 0x68, 0x4d, 0xa1, 0x45, 0x46, 0x0c, 0x43, 0xbc, 0xcc, 0x2c,
893 0xdd, 0xc5, 0x46, 0xc8, 0x4e, 0x0e, 0xbe, 0xed, 0xb9, 0x26,
894 0xab, 0x2e, 0xdb, 0xeb, 0x8f, 0xff, 0xdb, 0xb0, 0xc6, 0x55,
895 0xaf, 0xf8, 0x2a, 0x91, 0x9d, 0x50, 0x44, 0x21, 0x17,
896 };
897
898 static void
sig_done(int sig)899 sig_done(int sig)
900 {
901 run = 0;
902 }
903
904 #define START TM_RESET
905 #define STOP TM_GET
906
907
908 static double
Time_F(int s)909 Time_F(int s)
910 {
911 if (usertime)
912 return app_timer_user(s);
913 else
914 return app_timer_real(s);
915 }
916
917
918 static const int KDF1_SHA1_len = 20;
919 static void *
KDF1_SHA1(const void * in,size_t inlen,void * out,size_t * outlen)920 KDF1_SHA1(const void *in, size_t inlen, void *out, size_t * outlen)
921 {
922 #ifndef OPENSSL_NO_SHA
923 if (*outlen < SHA_DIGEST_LENGTH)
924 return NULL;
925 else
926 *outlen = SHA_DIGEST_LENGTH;
927 return SHA1(in, inlen, out);
928 #else
929 return NULL;
930 #endif /* OPENSSL_NO_SHA */
931 }
932
933 int
speed_main(int argc,char ** argv)934 speed_main(int argc, char **argv)
935 {
936 unsigned char *real_buf = NULL, *real_buf2 = NULL;
937 unsigned char *buf = NULL, *buf2 = NULL;
938 size_t unaligned = 0;
939 int mret = 1;
940 long count = 0, save_count = 0;
941 int i, j, k;
942 long rsa_count;
943 unsigned rsa_num;
944 unsigned char md[EVP_MAX_MD_SIZE];
945 #ifndef OPENSSL_NO_MD4
946 unsigned char md4[MD4_DIGEST_LENGTH];
947 #endif
948 #ifndef OPENSSL_NO_MD5
949 unsigned char md5[MD5_DIGEST_LENGTH];
950 unsigned char hmac[MD5_DIGEST_LENGTH];
951 #endif
952 #ifndef OPENSSL_NO_SHA
953 unsigned char sha[SHA_DIGEST_LENGTH];
954 #ifndef OPENSSL_NO_SHA256
955 unsigned char sha256[SHA256_DIGEST_LENGTH];
956 #endif
957 #ifndef OPENSSL_NO_SHA512
958 unsigned char sha512[SHA512_DIGEST_LENGTH];
959 #endif
960 #endif
961 #ifndef OPENSSL_NO_WHIRLPOOL
962 unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
963 #endif
964 #ifndef OPENSSL_NO_RIPEMD
965 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
966 #endif
967 #ifndef OPENSSL_NO_RC4
968 RC4_KEY rc4_ks;
969 #endif
970 #ifndef OPENSSL_NO_RC2
971 RC2_KEY rc2_ks;
972 #endif
973 #ifndef OPENSSL_NO_IDEA
974 IDEA_KEY_SCHEDULE idea_ks;
975 #endif
976 #ifndef OPENSSL_NO_BF
977 BF_KEY bf_ks;
978 #endif
979 #ifndef OPENSSL_NO_CAST
980 CAST_KEY cast_ks;
981 #endif
982 static const unsigned char key16[16] =
983 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
984 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12};
985 #ifndef OPENSSL_NO_AES
986 static const unsigned char key24[24] =
987 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
988 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
989 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34};
990 static const unsigned char key32[32] =
991 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
992 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
993 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
994 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56};
995 #endif
996 #ifndef OPENSSL_NO_CAMELLIA
997 static const unsigned char ckey24[24] =
998 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
999 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1000 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34};
1001 static const unsigned char ckey32[32] =
1002 {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
1003 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
1004 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
1005 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56};
1006 #endif
1007 #ifndef OPENSSL_NO_AES
1008 #define MAX_BLOCK_SIZE 128
1009 #else
1010 #define MAX_BLOCK_SIZE 64
1011 #endif
1012 unsigned char DES_iv[8];
1013 unsigned char iv[2 * MAX_BLOCK_SIZE / 8];
1014 #ifndef OPENSSL_NO_DES
1015 static DES_cblock key = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0};
1016 static DES_cblock key2 = {0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12};
1017 static DES_cblock key3 = {0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34};
1018 DES_key_schedule sch;
1019 DES_key_schedule sch2;
1020 DES_key_schedule sch3;
1021 #endif
1022 #ifndef OPENSSL_NO_AES
1023 AES_KEY aes_ks1, aes_ks2, aes_ks3;
1024 #endif
1025 #ifndef OPENSSL_NO_CAMELLIA
1026 CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3;
1027 #endif
1028 #define D_MD2 0
1029 #define D_MD4 1
1030 #define D_MD5 2
1031 #define D_HMAC 3
1032 #define D_SHA1 4
1033 #define D_RMD160 5
1034 #define D_RC4 6
1035 #define D_CBC_DES 7
1036 #define D_EDE3_DES 8
1037 #define D_CBC_IDEA 9
1038 #define D_CBC_SEED 10
1039 #define D_CBC_RC2 11
1040 #define D_CBC_RC5 12
1041 #define D_CBC_BF 13
1042 #define D_CBC_CAST 14
1043 #define D_CBC_128_AES 15
1044 #define D_CBC_192_AES 16
1045 #define D_CBC_256_AES 17
1046 #define D_CBC_128_CML 18
1047 #define D_CBC_192_CML 19
1048 #define D_CBC_256_CML 20
1049 #define D_EVP 21
1050 #define D_SHA256 22
1051 #define D_SHA512 23
1052 #define D_WHIRLPOOL 24
1053 #define D_IGE_128_AES 25
1054 #define D_IGE_192_AES 26
1055 #define D_IGE_256_AES 27
1056 #define D_GHASH 28
1057 #define D_AES_128_GCM 29
1058 #define D_AES_256_GCM 30
1059 #define D_CHACHA20_POLY1305 31
1060 double d = 0.0;
1061 long c[ALGOR_NUM][SIZE_NUM];
1062 #define R_DSA_512 0
1063 #define R_DSA_1024 1
1064 #define R_DSA_2048 2
1065 #define R_RSA_512 0
1066 #define R_RSA_1024 1
1067 #define R_RSA_2048 2
1068 #define R_RSA_4096 3
1069
1070 #define R_EC_P224 0
1071 #define R_EC_P256 1
1072 #define R_EC_P384 2
1073 #define R_EC_P521 3
1074
1075 RSA *rsa_key[RSA_NUM];
1076 long rsa_c[RSA_NUM][2];
1077 static unsigned int rsa_bits[RSA_NUM] = {512, 1024, 2048, 4096};
1078 static const unsigned char *rsa_data[RSA_NUM] =
1079 {test512, test1024, test2048, test4096};
1080 static int rsa_data_length[RSA_NUM] = {
1081 sizeof(test512), sizeof(test1024),
1082 sizeof(test2048), sizeof(test4096)};
1083 DSA *dsa_key[DSA_NUM];
1084 long dsa_c[DSA_NUM][2];
1085 static unsigned int dsa_bits[DSA_NUM] = {512, 1024, 2048};
1086 #ifndef OPENSSL_NO_EC
1087 /*
1088 * We only test over the following curves as they are representative,
1089 * To add tests over more curves, simply add the curve NID and curve
1090 * name to the following arrays and increase the EC_NUM value
1091 * accordingly.
1092 */
1093 static unsigned int test_curves[EC_NUM] = {
1094 NID_secp224r1,
1095 NID_X9_62_prime256v1,
1096 NID_secp384r1,
1097 NID_secp521r1,
1098 };
1099 static const char *test_curves_names[EC_NUM] = {
1100 "nistp224",
1101 "nistp256",
1102 "nistp384",
1103 "nistp521",
1104 };
1105 static int test_curves_bits[EC_NUM] = {
1106 224, 256, 384, 521,
1107 };
1108
1109 #endif
1110
1111 unsigned char ecdsasig[256];
1112 unsigned int ecdsasiglen;
1113 EC_KEY *ecdsa[EC_NUM];
1114 long ecdsa_c[EC_NUM][2];
1115
1116 EC_KEY *ecdh_a[EC_NUM], *ecdh_b[EC_NUM];
1117 unsigned char secret_a[MAX_ECDH_SIZE], secret_b[MAX_ECDH_SIZE];
1118 int secret_size_a, secret_size_b;
1119 int ecdh_checks = 0;
1120 int secret_idx = 0;
1121 long ecdh_c[EC_NUM][2];
1122
1123 int rsa_doit[RSA_NUM];
1124 int dsa_doit[DSA_NUM];
1125 int ecdsa_doit[EC_NUM];
1126 int ecdh_doit[EC_NUM];
1127 int doit[ALGOR_NUM];
1128 int pr_header = 0;
1129 const EVP_CIPHER *evp_cipher = NULL;
1130 const EVP_MD *evp_md = NULL;
1131 int decrypt = 0;
1132 int multi = 0;
1133 struct sigaction sa;
1134 const char *errstr = NULL;
1135
1136 if (pledge("stdio proc", NULL) == -1) {
1137 perror("pledge");
1138 exit(1);
1139 }
1140
1141 usertime = -1;
1142
1143 memset(results, 0, sizeof(results));
1144 memset(dsa_key, 0, sizeof(dsa_key));
1145 for (i = 0; i < EC_NUM; i++)
1146 ecdsa[i] = NULL;
1147 for (i = 0; i < EC_NUM; i++) {
1148 ecdh_a[i] = NULL;
1149 ecdh_b[i] = NULL;
1150 }
1151
1152 memset(rsa_key, 0, sizeof(rsa_key));
1153 for (i = 0; i < RSA_NUM; i++)
1154 rsa_key[i] = NULL;
1155
1156 if ((buf = real_buf = malloc(BUFSIZE + MAX_UNALIGN)) == NULL) {
1157 BIO_printf(bio_err, "out of memory\n");
1158 goto end;
1159 }
1160 if ((buf2 = real_buf2 = malloc(BUFSIZE + MAX_UNALIGN)) == NULL) {
1161 BIO_printf(bio_err, "out of memory\n");
1162 goto end;
1163 }
1164 memset(c, 0, sizeof(c));
1165 memset(DES_iv, 0, sizeof(DES_iv));
1166 memset(iv, 0, sizeof(iv));
1167
1168 for (i = 0; i < ALGOR_NUM; i++)
1169 doit[i] = 0;
1170 for (i = 0; i < RSA_NUM; i++)
1171 rsa_doit[i] = 0;
1172 for (i = 0; i < DSA_NUM; i++)
1173 dsa_doit[i] = 0;
1174 for (i = 0; i < EC_NUM; i++)
1175 ecdsa_doit[i] = 0;
1176 for (i = 0; i < EC_NUM; i++)
1177 ecdh_doit[i] = 0;
1178
1179
1180 j = 0;
1181 argc--;
1182 argv++;
1183 while (argc) {
1184 if (argc > 0 && strcmp(*argv, "-elapsed") == 0) {
1185 usertime = 0;
1186 j--; /* Otherwise, -elapsed gets confused with an
1187 * algorithm. */
1188 } else if (argc > 0 && strcmp(*argv, "-evp") == 0) {
1189 argc--;
1190 argv++;
1191 if (argc == 0) {
1192 BIO_printf(bio_err, "no EVP given\n");
1193 goto end;
1194 }
1195 evp_cipher = EVP_get_cipherbyname(*argv);
1196 if (!evp_cipher) {
1197 evp_md = EVP_get_digestbyname(*argv);
1198 }
1199 if (!evp_cipher && !evp_md) {
1200 BIO_printf(bio_err, "%s is an unknown cipher or digest\n", *argv);
1201 goto end;
1202 }
1203 doit[D_EVP] = 1;
1204 } else if (argc > 0 && strcmp(*argv, "-decrypt") == 0) {
1205 decrypt = 1;
1206 j--; /* Otherwise, -decrypt gets confused with an
1207 * algorithm. */
1208 } else if (argc > 0 && strcmp(*argv, "-multi") == 0) {
1209 argc--;
1210 argv++;
1211 if (argc == 0) {
1212 BIO_printf(bio_err, "no multi count given\n");
1213 goto end;
1214 }
1215 multi = strtonum(argv[0], 1, INT_MAX, &errstr);
1216 if (errstr) {
1217 BIO_printf(bio_err, "bad multi count: %s", errstr);
1218 goto end;
1219 }
1220 j--; /* Otherwise, -multi gets confused with an
1221 * algorithm. */
1222 } else if (argc > 0 && strcmp(*argv, "-unaligned") == 0) {
1223 argc--;
1224 argv++;
1225 if (argc == 0) {
1226 BIO_printf(bio_err, "no alignment offset given\n");
1227 goto end;
1228 }
1229 unaligned = strtonum(argv[0], 0, MAX_UNALIGN, &errstr);
1230 if (errstr) {
1231 BIO_printf(bio_err, "bad alignment offset: %s",
1232 errstr);
1233 goto end;
1234 }
1235 buf = real_buf + unaligned;
1236 buf2 = real_buf2 + unaligned;
1237 j--; /* Otherwise, -unaligned gets confused with an
1238 * algorithm. */
1239 } else if (argc > 0 && strcmp(*argv, "-mr") == 0) {
1240 mr = 1;
1241 j--; /* Otherwise, -mr gets confused with an
1242 * algorithm. */
1243 } else
1244 #ifndef OPENSSL_NO_MD4
1245 if (strcmp(*argv, "md4") == 0)
1246 doit[D_MD4] = 1;
1247 else
1248 #endif
1249 #ifndef OPENSSL_NO_MD5
1250 if (strcmp(*argv, "md5") == 0)
1251 doit[D_MD5] = 1;
1252 else
1253 #endif
1254 #ifndef OPENSSL_NO_MD5
1255 if (strcmp(*argv, "hmac") == 0)
1256 doit[D_HMAC] = 1;
1257 else
1258 #endif
1259 #ifndef OPENSSL_NO_SHA
1260 if (strcmp(*argv, "sha1") == 0)
1261 doit[D_SHA1] = 1;
1262 else if (strcmp(*argv, "sha") == 0)
1263 doit[D_SHA1] = 1,
1264 doit[D_SHA256] = 1,
1265 doit[D_SHA512] = 1;
1266 else
1267 #ifndef OPENSSL_NO_SHA256
1268 if (strcmp(*argv, "sha256") == 0)
1269 doit[D_SHA256] = 1;
1270 else
1271 #endif
1272 #ifndef OPENSSL_NO_SHA512
1273 if (strcmp(*argv, "sha512") == 0)
1274 doit[D_SHA512] = 1;
1275 else
1276 #endif
1277 #endif
1278 #ifndef OPENSSL_NO_WHIRLPOOL
1279 if (strcmp(*argv, "whirlpool") == 0)
1280 doit[D_WHIRLPOOL] = 1;
1281 else
1282 #endif
1283 #ifndef OPENSSL_NO_RIPEMD
1284 if (strcmp(*argv, "ripemd") == 0)
1285 doit[D_RMD160] = 1;
1286 else if (strcmp(*argv, "rmd160") == 0)
1287 doit[D_RMD160] = 1;
1288 else if (strcmp(*argv, "ripemd160") == 0)
1289 doit[D_RMD160] = 1;
1290 else
1291 #endif
1292 #ifndef OPENSSL_NO_RC4
1293 if (strcmp(*argv, "rc4") == 0)
1294 doit[D_RC4] = 1;
1295 else
1296 #endif
1297 #ifndef OPENSSL_NO_DES
1298 if (strcmp(*argv, "des-cbc") == 0)
1299 doit[D_CBC_DES] = 1;
1300 else if (strcmp(*argv, "des-ede3") == 0)
1301 doit[D_EDE3_DES] = 1;
1302 else
1303 #endif
1304 #ifndef OPENSSL_NO_AES
1305 if (strcmp(*argv, "aes-128-cbc") == 0)
1306 doit[D_CBC_128_AES] = 1;
1307 else if (strcmp(*argv, "aes-192-cbc") == 0)
1308 doit[D_CBC_192_AES] = 1;
1309 else if (strcmp(*argv, "aes-256-cbc") == 0)
1310 doit[D_CBC_256_AES] = 1;
1311 else if (strcmp(*argv, "aes-128-ige") == 0)
1312 doit[D_IGE_128_AES] = 1;
1313 else if (strcmp(*argv, "aes-192-ige") == 0)
1314 doit[D_IGE_192_AES] = 1;
1315 else if (strcmp(*argv, "aes-256-ige") == 0)
1316 doit[D_IGE_256_AES] = 1;
1317 else
1318 #endif
1319 #ifndef OPENSSL_NO_CAMELLIA
1320 if (strcmp(*argv, "camellia-128-cbc") == 0)
1321 doit[D_CBC_128_CML] = 1;
1322 else if (strcmp(*argv, "camellia-192-cbc") == 0)
1323 doit[D_CBC_192_CML] = 1;
1324 else if (strcmp(*argv, "camellia-256-cbc") == 0)
1325 doit[D_CBC_256_CML] = 1;
1326 else
1327 #endif
1328 #ifndef RSA_NULL
1329 if (strcmp(*argv, "openssl") == 0) {
1330 RSA_set_default_method(RSA_PKCS1_SSLeay());
1331 j--;
1332 } else
1333 #endif
1334 if (strcmp(*argv, "dsa512") == 0)
1335 dsa_doit[R_DSA_512] = 2;
1336 else if (strcmp(*argv, "dsa1024") == 0)
1337 dsa_doit[R_DSA_1024] = 2;
1338 else if (strcmp(*argv, "dsa2048") == 0)
1339 dsa_doit[R_DSA_2048] = 2;
1340 else if (strcmp(*argv, "rsa512") == 0)
1341 rsa_doit[R_RSA_512] = 2;
1342 else if (strcmp(*argv, "rsa1024") == 0)
1343 rsa_doit[R_RSA_1024] = 2;
1344 else if (strcmp(*argv, "rsa2048") == 0)
1345 rsa_doit[R_RSA_2048] = 2;
1346 else if (strcmp(*argv, "rsa4096") == 0)
1347 rsa_doit[R_RSA_4096] = 2;
1348 else
1349 #ifndef OPENSSL_NO_RC2
1350 if (strcmp(*argv, "rc2-cbc") == 0)
1351 doit[D_CBC_RC2] = 1;
1352 else if (strcmp(*argv, "rc2") == 0)
1353 doit[D_CBC_RC2] = 1;
1354 else
1355 #endif
1356 #ifndef OPENSSL_NO_IDEA
1357 if (strcmp(*argv, "idea-cbc") == 0)
1358 doit[D_CBC_IDEA] = 1;
1359 else if (strcmp(*argv, "idea") == 0)
1360 doit[D_CBC_IDEA] = 1;
1361 else
1362 #endif
1363 #ifndef OPENSSL_NO_BF
1364 if (strcmp(*argv, "bf-cbc") == 0)
1365 doit[D_CBC_BF] = 1;
1366 else if (strcmp(*argv, "blowfish") == 0)
1367 doit[D_CBC_BF] = 1;
1368 else if (strcmp(*argv, "bf") == 0)
1369 doit[D_CBC_BF] = 1;
1370 else
1371 #endif
1372 #ifndef OPENSSL_NO_CAST
1373 if (strcmp(*argv, "cast-cbc") == 0)
1374 doit[D_CBC_CAST] = 1;
1375 else if (strcmp(*argv, "cast") == 0)
1376 doit[D_CBC_CAST] = 1;
1377 else if (strcmp(*argv, "cast5") == 0)
1378 doit[D_CBC_CAST] = 1;
1379 else
1380 #endif
1381 #ifndef OPENSSL_NO_DES
1382 if (strcmp(*argv, "des") == 0) {
1383 doit[D_CBC_DES] = 1;
1384 doit[D_EDE3_DES] = 1;
1385 } else
1386 #endif
1387 #ifndef OPENSSL_NO_AES
1388 if (strcmp(*argv, "aes") == 0) {
1389 doit[D_CBC_128_AES] = 1;
1390 doit[D_CBC_192_AES] = 1;
1391 doit[D_CBC_256_AES] = 1;
1392 } else if (strcmp(*argv, "ghash") == 0)
1393 doit[D_GHASH] = 1;
1394 else if (strcmp(*argv,"aes-128-gcm") == 0)
1395 doit[D_AES_128_GCM]=1;
1396 else if (strcmp(*argv,"aes-256-gcm") == 0)
1397 doit[D_AES_256_GCM]=1;
1398 else
1399 #endif
1400 #ifndef OPENSSL_NO_CAMELLIA
1401 if (strcmp(*argv, "camellia") == 0) {
1402 doit[D_CBC_128_CML] = 1;
1403 doit[D_CBC_192_CML] = 1;
1404 doit[D_CBC_256_CML] = 1;
1405 } else
1406 #endif
1407 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
1408 if (strcmp(*argv,"chacha20-poly1305") == 0)
1409 doit[D_CHACHA20_POLY1305]=1;
1410 else
1411 #endif
1412 if (strcmp(*argv, "rsa") == 0) {
1413 rsa_doit[R_RSA_512] = 1;
1414 rsa_doit[R_RSA_1024] = 1;
1415 rsa_doit[R_RSA_2048] = 1;
1416 rsa_doit[R_RSA_4096] = 1;
1417 } else if (strcmp(*argv, "dsa") == 0) {
1418 dsa_doit[R_DSA_512] = 1;
1419 dsa_doit[R_DSA_1024] = 1;
1420 dsa_doit[R_DSA_2048] = 1;
1421 } else if (strcmp(*argv, "ecdsap224") == 0)
1422 ecdsa_doit[R_EC_P224] = 2;
1423 else if (strcmp(*argv, "ecdsap256") == 0)
1424 ecdsa_doit[R_EC_P256] = 2;
1425 else if (strcmp(*argv, "ecdsap384") == 0)
1426 ecdsa_doit[R_EC_P384] = 2;
1427 else if (strcmp(*argv, "ecdsap521") == 0)
1428 ecdsa_doit[R_EC_P521] = 2;
1429 else if (strcmp(*argv, "ecdsa") == 0) {
1430 for (i = 0; i < EC_NUM; i++)
1431 ecdsa_doit[i] = 1;
1432 } else if (strcmp(*argv, "ecdhp224") == 0)
1433 ecdh_doit[R_EC_P224] = 2;
1434 else if (strcmp(*argv, "ecdhp256") == 0)
1435 ecdh_doit[R_EC_P256] = 2;
1436 else if (strcmp(*argv, "ecdhp384") == 0)
1437 ecdh_doit[R_EC_P384] = 2;
1438 else if (strcmp(*argv, "ecdhp521") == 0)
1439 ecdh_doit[R_EC_P521] = 2;
1440 else if (strcmp(*argv, "ecdh") == 0) {
1441 for (i = 0; i < EC_NUM; i++)
1442 ecdh_doit[i] = 1;
1443 } else {
1444 BIO_printf(bio_err, "Error: bad option or value\n");
1445 BIO_printf(bio_err, "\n");
1446 BIO_printf(bio_err, "Available values:\n");
1447 #ifndef OPENSSL_NO_MD4
1448 BIO_printf(bio_err, "md4 ");
1449 #endif
1450 #ifndef OPENSSL_NO_MD5
1451 BIO_printf(bio_err, "md5 ");
1452 #ifndef OPENSSL_NO_HMAC
1453 BIO_printf(bio_err, "hmac ");
1454 #endif
1455 #endif
1456 #ifndef OPENSSL_NO_SHA1
1457 BIO_printf(bio_err, "sha1 ");
1458 #endif
1459 #ifndef OPENSSL_NO_SHA256
1460 BIO_printf(bio_err, "sha256 ");
1461 #endif
1462 #ifndef OPENSSL_NO_SHA512
1463 BIO_printf(bio_err, "sha512 ");
1464 #endif
1465 #ifndef OPENSSL_NO_WHIRLPOOL
1466 BIO_printf(bio_err, "whirlpool");
1467 #endif
1468 #ifndef OPENSSL_NO_RIPEMD160
1469 BIO_printf(bio_err, "rmd160");
1470 #endif
1471 #if !defined(OPENSSL_NO_MD2) || \
1472 !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
1473 !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) || \
1474 !defined(OPENSSL_NO_WHIRLPOOL)
1475 BIO_printf(bio_err, "\n");
1476 #endif
1477
1478 #ifndef OPENSSL_NO_IDEA
1479 BIO_printf(bio_err, "idea-cbc ");
1480 #endif
1481 #ifndef OPENSSL_NO_RC2
1482 BIO_printf(bio_err, "rc2-cbc ");
1483 #endif
1484 #ifndef OPENSSL_NO_BF
1485 BIO_printf(bio_err, "bf-cbc ");
1486 #endif
1487 #ifndef OPENSSL_NO_DES
1488 BIO_printf(bio_err, "des-cbc des-ede3\n");
1489 #endif
1490 #ifndef OPENSSL_NO_AES
1491 BIO_printf(bio_err, "aes-128-cbc aes-192-cbc aes-256-cbc ");
1492 BIO_printf(bio_err, "aes-128-ige aes-192-ige aes-256-ige\n");
1493 BIO_printf(bio_err, "aes-128-gcm aes-256-gcm ");
1494 #endif
1495 #ifndef OPENSSL_NO_CAMELLIA
1496 BIO_printf(bio_err, "\n");
1497 BIO_printf(bio_err, "camellia-128-cbc camellia-192-cbc camellia-256-cbc ");
1498 #endif
1499 #ifndef OPENSSL_NO_RC4
1500 BIO_printf(bio_err, "rc4");
1501 #endif
1502 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
1503 BIO_printf(bio_err," chacha20-poly1305");
1504 #endif
1505 BIO_printf(bio_err, "\n");
1506
1507 BIO_printf(bio_err, "rsa512 rsa1024 rsa2048 rsa4096\n");
1508
1509 BIO_printf(bio_err, "dsa512 dsa1024 dsa2048\n");
1510 BIO_printf(bio_err, "ecdsap224 ecdsap256 ecdsap384 ecdsap521\n");
1511 BIO_printf(bio_err, "ecdhp224 ecdhp256 ecdhp384 ecdhp521\n");
1512
1513 #ifndef OPENSSL_NO_IDEA
1514 BIO_printf(bio_err, "idea ");
1515 #endif
1516 #ifndef OPENSSL_NO_RC2
1517 BIO_printf(bio_err, "rc2 ");
1518 #endif
1519 #ifndef OPENSSL_NO_DES
1520 BIO_printf(bio_err, "des ");
1521 #endif
1522 #ifndef OPENSSL_NO_AES
1523 BIO_printf(bio_err, "aes ");
1524 #endif
1525 #ifndef OPENSSL_NO_CAMELLIA
1526 BIO_printf(bio_err, "camellia ");
1527 #endif
1528 BIO_printf(bio_err, "rsa ");
1529 #ifndef OPENSSL_NO_BF
1530 BIO_printf(bio_err, "blowfish");
1531 #endif
1532 #if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_SEED) || \
1533 !defined(OPENSSL_NO_RC2) || !defined(OPENSSL_NO_DES) || \
1534 !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_BF) || \
1535 !defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA)
1536 BIO_printf(bio_err, "\n");
1537 #endif
1538
1539 BIO_printf(bio_err, "\n");
1540 BIO_printf(bio_err, "Available options:\n");
1541 BIO_printf(bio_err, "-elapsed measure time in real time instead of CPU user time.\n");
1542 BIO_printf(bio_err, "-evp e use EVP e.\n");
1543 BIO_printf(bio_err, "-decrypt time decryption instead of encryption (only EVP).\n");
1544 BIO_printf(bio_err, "-mr produce machine readable output.\n");
1545 BIO_printf(bio_err, "-multi n run n benchmarks in parallel.\n");
1546 BIO_printf(bio_err, "-unaligned n use buffers with offset n from proper alignment.\n");
1547 goto end;
1548 }
1549 argc--;
1550 argv++;
1551 j++;
1552 }
1553
1554 if (multi && do_multi(multi))
1555 goto show_res;
1556
1557 if (j == 0) {
1558 for (i = 0; i < ALGOR_NUM; i++) {
1559 if (i != D_EVP)
1560 doit[i] = 1;
1561 }
1562 for (i = 0; i < RSA_NUM; i++)
1563 rsa_doit[i] = 1;
1564 for (i = 0; i < DSA_NUM; i++)
1565 dsa_doit[i] = 1;
1566 for (i = 0; i < EC_NUM; i++)
1567 ecdsa_doit[i] = 1;
1568 for (i = 0; i < EC_NUM; i++)
1569 ecdh_doit[i] = 1;
1570 }
1571 for (i = 0; i < ALGOR_NUM; i++)
1572 if (doit[i])
1573 pr_header++;
1574
1575 if (usertime == 0 && !mr)
1576 BIO_printf(bio_err, "You have chosen to measure elapsed time instead of user CPU time.\n");
1577
1578 for (i = 0; i < RSA_NUM; i++) {
1579 const unsigned char *p;
1580
1581 p = rsa_data[i];
1582 rsa_key[i] = d2i_RSAPrivateKey(NULL, &p, rsa_data_length[i]);
1583 if (rsa_key[i] == NULL) {
1584 BIO_printf(bio_err, "internal error loading RSA key number %d\n", i);
1585 goto end;
1586 }
1587 }
1588
1589 dsa_key[0] = get_dsa512();
1590 dsa_key[1] = get_dsa1024();
1591 dsa_key[2] = get_dsa2048();
1592
1593 #ifndef OPENSSL_NO_DES
1594 DES_set_key_unchecked(&key, &sch);
1595 DES_set_key_unchecked(&key2, &sch2);
1596 DES_set_key_unchecked(&key3, &sch3);
1597 #endif
1598 #ifndef OPENSSL_NO_AES
1599 AES_set_encrypt_key(key16, 128, &aes_ks1);
1600 AES_set_encrypt_key(key24, 192, &aes_ks2);
1601 AES_set_encrypt_key(key32, 256, &aes_ks3);
1602 #endif
1603 #ifndef OPENSSL_NO_CAMELLIA
1604 Camellia_set_key(key16, 128, &camellia_ks1);
1605 Camellia_set_key(ckey24, 192, &camellia_ks2);
1606 Camellia_set_key(ckey32, 256, &camellia_ks3);
1607 #endif
1608 #ifndef OPENSSL_NO_IDEA
1609 idea_set_encrypt_key(key16, &idea_ks);
1610 #endif
1611 #ifndef OPENSSL_NO_RC4
1612 RC4_set_key(&rc4_ks, 16, key16);
1613 #endif
1614 #ifndef OPENSSL_NO_RC2
1615 RC2_set_key(&rc2_ks, 16, key16, 128);
1616 #endif
1617 #ifndef OPENSSL_NO_BF
1618 BF_set_key(&bf_ks, 16, key16);
1619 #endif
1620 #ifndef OPENSSL_NO_CAST
1621 CAST_set_key(&cast_ks, 16, key16);
1622 #endif
1623 memset(rsa_c, 0, sizeof(rsa_c));
1624 #define COND(c) (run && count<0x7fffffff)
1625 #define COUNT(d) (count)
1626
1627 memset(&sa, 0, sizeof(sa));
1628 sigemptyset(&sa.sa_mask);
1629 sa.sa_flags = SA_RESTART;
1630 sa.sa_handler = sig_done;
1631 sigaction(SIGALRM, &sa, NULL);
1632
1633 #ifndef OPENSSL_NO_MD4
1634 if (doit[D_MD4]) {
1635 for (j = 0; j < SIZE_NUM; j++) {
1636 print_message(names[D_MD4], c[D_MD4][j], lengths[j]);
1637 Time_F(START);
1638 for (count = 0, run = 1; COND(c[D_MD4][j]); count++)
1639 EVP_Digest(&(buf[0]), (unsigned long) lengths[j], &(md4[0]), NULL, EVP_md4(), NULL);
1640 d = Time_F(STOP);
1641 print_result(D_MD4, j, count, d);
1642 }
1643 }
1644 #endif
1645
1646 #ifndef OPENSSL_NO_MD5
1647 if (doit[D_MD5]) {
1648 for (j = 0; j < SIZE_NUM; j++) {
1649 print_message(names[D_MD5], c[D_MD5][j], lengths[j]);
1650 Time_F(START);
1651 for (count = 0, run = 1; COND(c[D_MD5][j]); count++)
1652 EVP_Digest(&(buf[0]), (unsigned long) lengths[j], &(md5[0]), NULL, EVP_get_digestbyname("md5"), NULL);
1653 d = Time_F(STOP);
1654 print_result(D_MD5, j, count, d);
1655 }
1656 }
1657 #endif
1658
1659 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
1660 if (doit[D_HMAC]) {
1661 HMAC_CTX *hctx;
1662
1663 if ((hctx = HMAC_CTX_new()) == NULL) {
1664 BIO_printf(bio_err, "Failed to allocate HMAC context.\n");
1665 goto end;
1666 }
1667
1668 HMAC_Init_ex(hctx, (unsigned char *) "This is a key...",
1669 16, EVP_md5(), NULL);
1670
1671 for (j = 0; j < SIZE_NUM; j++) {
1672 print_message(names[D_HMAC], c[D_HMAC][j], lengths[j]);
1673 Time_F(START);
1674 for (count = 0, run = 1; COND(c[D_HMAC][j]); count++) {
1675 if (!HMAC_Init_ex(hctx, NULL, 0, NULL, NULL)) {
1676 HMAC_CTX_free(hctx);
1677 goto end;
1678 }
1679 if (!HMAC_Update(hctx, buf, lengths[j])) {
1680 HMAC_CTX_free(hctx);
1681 goto end;
1682 }
1683 if (!HMAC_Final(hctx, &(hmac[0]), NULL)) {
1684 HMAC_CTX_free(hctx);
1685 goto end;
1686 }
1687 }
1688 d = Time_F(STOP);
1689 print_result(D_HMAC, j, count, d);
1690 }
1691 HMAC_CTX_free(hctx);
1692 }
1693 #endif
1694 #ifndef OPENSSL_NO_SHA
1695 if (doit[D_SHA1]) {
1696 for (j = 0; j < SIZE_NUM; j++) {
1697 print_message(names[D_SHA1], c[D_SHA1][j], lengths[j]);
1698 Time_F(START);
1699 for (count = 0, run = 1; COND(c[D_SHA1][j]); count++)
1700 EVP_Digest(buf, (unsigned long) lengths[j], &(sha[0]), NULL, EVP_sha1(), NULL);
1701 d = Time_F(STOP);
1702 print_result(D_SHA1, j, count, d);
1703 }
1704 }
1705 #ifndef OPENSSL_NO_SHA256
1706 if (doit[D_SHA256]) {
1707 for (j = 0; j < SIZE_NUM; j++) {
1708 print_message(names[D_SHA256], c[D_SHA256][j], lengths[j]);
1709 Time_F(START);
1710 for (count = 0, run = 1; COND(c[D_SHA256][j]); count++)
1711 SHA256(buf, lengths[j], sha256);
1712 d = Time_F(STOP);
1713 print_result(D_SHA256, j, count, d);
1714 }
1715 }
1716 #endif
1717
1718 #ifndef OPENSSL_NO_SHA512
1719 if (doit[D_SHA512]) {
1720 for (j = 0; j < SIZE_NUM; j++) {
1721 print_message(names[D_SHA512], c[D_SHA512][j], lengths[j]);
1722 Time_F(START);
1723 for (count = 0, run = 1; COND(c[D_SHA512][j]); count++)
1724 SHA512(buf, lengths[j], sha512);
1725 d = Time_F(STOP);
1726 print_result(D_SHA512, j, count, d);
1727 }
1728 }
1729 #endif
1730 #endif
1731
1732 #ifndef OPENSSL_NO_WHIRLPOOL
1733 if (doit[D_WHIRLPOOL]) {
1734 for (j = 0; j < SIZE_NUM; j++) {
1735 print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][j], lengths[j]);
1736 Time_F(START);
1737 for (count = 0, run = 1; COND(c[D_WHIRLPOOL][j]); count++)
1738 WHIRLPOOL(buf, lengths[j], whirlpool);
1739 d = Time_F(STOP);
1740 print_result(D_WHIRLPOOL, j, count, d);
1741 }
1742 }
1743 #endif
1744
1745 #ifndef OPENSSL_NO_RIPEMD
1746 if (doit[D_RMD160]) {
1747 for (j = 0; j < SIZE_NUM; j++) {
1748 print_message(names[D_RMD160], c[D_RMD160][j], lengths[j]);
1749 Time_F(START);
1750 for (count = 0, run = 1; COND(c[D_RMD160][j]); count++)
1751 EVP_Digest(buf, (unsigned long) lengths[j], &(rmd160[0]), NULL, EVP_ripemd160(), NULL);
1752 d = Time_F(STOP);
1753 print_result(D_RMD160, j, count, d);
1754 }
1755 }
1756 #endif
1757 #ifndef OPENSSL_NO_RC4
1758 if (doit[D_RC4]) {
1759 for (j = 0; j < SIZE_NUM; j++) {
1760 print_message(names[D_RC4], c[D_RC4][j], lengths[j]);
1761 Time_F(START);
1762 for (count = 0, run = 1; COND(c[D_RC4][j]); count++)
1763 RC4(&rc4_ks, (unsigned int) lengths[j],
1764 buf, buf);
1765 d = Time_F(STOP);
1766 print_result(D_RC4, j, count, d);
1767 }
1768 }
1769 #endif
1770 #ifndef OPENSSL_NO_DES
1771 if (doit[D_CBC_DES]) {
1772 for (j = 0; j < SIZE_NUM; j++) {
1773 print_message(names[D_CBC_DES], c[D_CBC_DES][j], lengths[j]);
1774 Time_F(START);
1775 for (count = 0, run = 1; COND(c[D_CBC_DES][j]); count++)
1776 DES_ncbc_encrypt(buf, buf, lengths[j], &sch,
1777 &DES_iv, DES_ENCRYPT);
1778 d = Time_F(STOP);
1779 print_result(D_CBC_DES, j, count, d);
1780 }
1781 }
1782 if (doit[D_EDE3_DES]) {
1783 for (j = 0; j < SIZE_NUM; j++) {
1784 print_message(names[D_EDE3_DES], c[D_EDE3_DES][j], lengths[j]);
1785 Time_F(START);
1786 for (count = 0, run = 1; COND(c[D_EDE3_DES][j]); count++)
1787 DES_ede3_cbc_encrypt(buf, buf, lengths[j],
1788 &sch, &sch2, &sch3,
1789 &DES_iv, DES_ENCRYPT);
1790 d = Time_F(STOP);
1791 print_result(D_EDE3_DES, j, count, d);
1792 }
1793 }
1794 #endif
1795 #ifndef OPENSSL_NO_AES
1796 if (doit[D_CBC_128_AES]) {
1797 for (j = 0; j < SIZE_NUM; j++) {
1798 print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][j], lengths[j]);
1799 Time_F(START);
1800 for (count = 0, run = 1; COND(c[D_CBC_128_AES][j]); count++)
1801 AES_cbc_encrypt(buf, buf,
1802 (unsigned long) lengths[j], &aes_ks1,
1803 iv, AES_ENCRYPT);
1804 d = Time_F(STOP);
1805 print_result(D_CBC_128_AES, j, count, d);
1806 }
1807 }
1808 if (doit[D_CBC_192_AES]) {
1809 for (j = 0; j < SIZE_NUM; j++) {
1810 print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][j], lengths[j]);
1811 Time_F(START);
1812 for (count = 0, run = 1; COND(c[D_CBC_192_AES][j]); count++)
1813 AES_cbc_encrypt(buf, buf,
1814 (unsigned long) lengths[j], &aes_ks2,
1815 iv, AES_ENCRYPT);
1816 d = Time_F(STOP);
1817 print_result(D_CBC_192_AES, j, count, d);
1818 }
1819 }
1820 if (doit[D_CBC_256_AES]) {
1821 for (j = 0; j < SIZE_NUM; j++) {
1822 print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][j], lengths[j]);
1823 Time_F(START);
1824 for (count = 0, run = 1; COND(c[D_CBC_256_AES][j]); count++)
1825 AES_cbc_encrypt(buf, buf,
1826 (unsigned long) lengths[j], &aes_ks3,
1827 iv, AES_ENCRYPT);
1828 d = Time_F(STOP);
1829 print_result(D_CBC_256_AES, j, count, d);
1830 }
1831 }
1832 if (doit[D_IGE_128_AES]) {
1833 for (j = 0; j < SIZE_NUM; j++) {
1834 print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][j], lengths[j]);
1835 Time_F(START);
1836 for (count = 0, run = 1; COND(c[D_IGE_128_AES][j]); count++)
1837 AES_ige_encrypt(buf, buf2,
1838 (unsigned long) lengths[j], &aes_ks1,
1839 iv, AES_ENCRYPT);
1840 d = Time_F(STOP);
1841 print_result(D_IGE_128_AES, j, count, d);
1842 }
1843 }
1844 if (doit[D_IGE_192_AES]) {
1845 for (j = 0; j < SIZE_NUM; j++) {
1846 print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][j], lengths[j]);
1847 Time_F(START);
1848 for (count = 0, run = 1; COND(c[D_IGE_192_AES][j]); count++)
1849 AES_ige_encrypt(buf, buf2,
1850 (unsigned long) lengths[j], &aes_ks2,
1851 iv, AES_ENCRYPT);
1852 d = Time_F(STOP);
1853 print_result(D_IGE_192_AES, j, count, d);
1854 }
1855 }
1856 if (doit[D_IGE_256_AES]) {
1857 for (j = 0; j < SIZE_NUM; j++) {
1858 print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][j], lengths[j]);
1859 Time_F(START);
1860 for (count = 0, run = 1; COND(c[D_IGE_256_AES][j]); count++)
1861 AES_ige_encrypt(buf, buf2,
1862 (unsigned long) lengths[j], &aes_ks3,
1863 iv, AES_ENCRYPT);
1864 d = Time_F(STOP);
1865 print_result(D_IGE_256_AES, j, count, d);
1866 }
1867 }
1868 if (doit[D_GHASH]) {
1869 GCM128_CONTEXT *ctx = CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt);
1870 CRYPTO_gcm128_setiv(ctx, (unsigned char *) "0123456789ab", 12);
1871
1872 for (j = 0; j < SIZE_NUM; j++) {
1873 print_message(names[D_GHASH], c[D_GHASH][j], lengths[j]);
1874 Time_F(START);
1875 for (count = 0, run = 1; COND(c[D_GHASH][j]); count++)
1876 CRYPTO_gcm128_aad(ctx, buf, lengths[j]);
1877 d = Time_F(STOP);
1878 print_result(D_GHASH, j, count, d);
1879 }
1880 CRYPTO_gcm128_release(ctx);
1881 }
1882 if (doit[D_AES_128_GCM]) {
1883 const EVP_AEAD *aead = EVP_aead_aes_128_gcm();
1884 static const unsigned char nonce[32] = {0};
1885 size_t buf_len, nonce_len;
1886 EVP_AEAD_CTX *ctx;
1887
1888 if ((ctx = EVP_AEAD_CTX_new()) == NULL) {
1889 BIO_printf(bio_err,
1890 "Failed to allocate aead context.\n");
1891 goto end;
1892 }
1893
1894 EVP_AEAD_CTX_init(ctx, aead, key32, EVP_AEAD_key_length(aead),
1895 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL);
1896 nonce_len = EVP_AEAD_nonce_length(aead);
1897
1898 for (j = 0; j < SIZE_NUM; j++) {
1899 print_message(names[D_AES_128_GCM],c[D_AES_128_GCM][j],lengths[j]);
1900 Time_F(START);
1901 for (count = 0, run = 1; COND(c[D_AES_128_GCM][j]); count++)
1902 EVP_AEAD_CTX_seal(ctx, buf, &buf_len, BUFSIZE, nonce,
1903 nonce_len, buf, lengths[j], NULL, 0);
1904 d=Time_F(STOP);
1905 print_result(D_AES_128_GCM,j,count,d);
1906 }
1907 EVP_AEAD_CTX_free(ctx);
1908 }
1909
1910 if (doit[D_AES_256_GCM]) {
1911 const EVP_AEAD *aead = EVP_aead_aes_256_gcm();
1912 static const unsigned char nonce[32] = {0};
1913 size_t buf_len, nonce_len;
1914 EVP_AEAD_CTX *ctx;
1915
1916 if ((ctx = EVP_AEAD_CTX_new()) == NULL) {
1917 BIO_printf(bio_err,
1918 "Failed to allocate aead context.\n");
1919 goto end;
1920 }
1921
1922 EVP_AEAD_CTX_init(ctx, aead, key32, EVP_AEAD_key_length(aead),
1923 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL);
1924 nonce_len = EVP_AEAD_nonce_length(aead);
1925
1926 for (j = 0; j < SIZE_NUM; j++) {
1927 print_message(names[D_AES_256_GCM],c[D_AES_256_GCM][j],lengths[j]);
1928 Time_F(START);
1929 for (count = 0, run = 1; COND(c[D_AES_256_GCM][j]); count++)
1930 EVP_AEAD_CTX_seal(ctx, buf, &buf_len, BUFSIZE, nonce,
1931 nonce_len, buf, lengths[j], NULL, 0);
1932 d=Time_F(STOP);
1933 print_result(D_AES_256_GCM, j, count, d);
1934 }
1935 EVP_AEAD_CTX_free(ctx);
1936 }
1937 #endif
1938 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
1939 if (doit[D_CHACHA20_POLY1305]) {
1940 const EVP_AEAD *aead = EVP_aead_chacha20_poly1305();
1941 static const unsigned char nonce[32] = {0};
1942 size_t buf_len, nonce_len;
1943 EVP_AEAD_CTX *ctx;
1944
1945 if ((ctx = EVP_AEAD_CTX_new()) == NULL) {
1946 BIO_printf(bio_err,
1947 "Failed to allocate aead context.\n");
1948 goto end;
1949 }
1950
1951 EVP_AEAD_CTX_init(ctx, aead, key32, EVP_AEAD_key_length(aead),
1952 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL);
1953 nonce_len = EVP_AEAD_nonce_length(aead);
1954
1955 for (j = 0; j < SIZE_NUM; j++) {
1956 print_message(names[D_CHACHA20_POLY1305],
1957 c[D_CHACHA20_POLY1305][j], lengths[j]);
1958 Time_F(START);
1959 for (count = 0, run = 1; COND(c[D_CHACHA20_POLY1305][j]); count++)
1960 EVP_AEAD_CTX_seal(ctx, buf, &buf_len, BUFSIZE, nonce,
1961 nonce_len, buf, lengths[j], NULL, 0);
1962 d=Time_F(STOP);
1963 print_result(D_CHACHA20_POLY1305, j, count, d);
1964 }
1965 EVP_AEAD_CTX_free(ctx);
1966 }
1967 #endif
1968 #ifndef OPENSSL_NO_CAMELLIA
1969 if (doit[D_CBC_128_CML]) {
1970 for (j = 0; j < SIZE_NUM; j++) {
1971 print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][j], lengths[j]);
1972 Time_F(START);
1973 for (count = 0, run = 1; COND(c[D_CBC_128_CML][j]); count++)
1974 Camellia_cbc_encrypt(buf, buf,
1975 (unsigned long) lengths[j], &camellia_ks1,
1976 iv, CAMELLIA_ENCRYPT);
1977 d = Time_F(STOP);
1978 print_result(D_CBC_128_CML, j, count, d);
1979 }
1980 }
1981 if (doit[D_CBC_192_CML]) {
1982 for (j = 0; j < SIZE_NUM; j++) {
1983 print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][j], lengths[j]);
1984 Time_F(START);
1985 for (count = 0, run = 1; COND(c[D_CBC_192_CML][j]); count++)
1986 Camellia_cbc_encrypt(buf, buf,
1987 (unsigned long) lengths[j], &camellia_ks2,
1988 iv, CAMELLIA_ENCRYPT);
1989 d = Time_F(STOP);
1990 print_result(D_CBC_192_CML, j, count, d);
1991 }
1992 }
1993 if (doit[D_CBC_256_CML]) {
1994 for (j = 0; j < SIZE_NUM; j++) {
1995 print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][j], lengths[j]);
1996 Time_F(START);
1997 for (count = 0, run = 1; COND(c[D_CBC_256_CML][j]); count++)
1998 Camellia_cbc_encrypt(buf, buf,
1999 (unsigned long) lengths[j], &camellia_ks3,
2000 iv, CAMELLIA_ENCRYPT);
2001 d = Time_F(STOP);
2002 print_result(D_CBC_256_CML, j, count, d);
2003 }
2004 }
2005 #endif
2006 #ifndef OPENSSL_NO_IDEA
2007 if (doit[D_CBC_IDEA]) {
2008 for (j = 0; j < SIZE_NUM; j++) {
2009 print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][j], lengths[j]);
2010 Time_F(START);
2011 for (count = 0, run = 1; COND(c[D_CBC_IDEA][j]); count++)
2012 idea_cbc_encrypt(buf, buf,
2013 (unsigned long) lengths[j], &idea_ks,
2014 iv, IDEA_ENCRYPT);
2015 d = Time_F(STOP);
2016 print_result(D_CBC_IDEA, j, count, d);
2017 }
2018 }
2019 #endif
2020 #ifndef OPENSSL_NO_RC2
2021 if (doit[D_CBC_RC2]) {
2022 for (j = 0; j < SIZE_NUM; j++) {
2023 print_message(names[D_CBC_RC2], c[D_CBC_RC2][j], lengths[j]);
2024 Time_F(START);
2025 for (count = 0, run = 1; COND(c[D_CBC_RC2][j]); count++)
2026 RC2_cbc_encrypt(buf, buf,
2027 (unsigned long) lengths[j], &rc2_ks,
2028 iv, RC2_ENCRYPT);
2029 d = Time_F(STOP);
2030 print_result(D_CBC_RC2, j, count, d);
2031 }
2032 }
2033 #endif
2034 #ifndef OPENSSL_NO_BF
2035 if (doit[D_CBC_BF]) {
2036 for (j = 0; j < SIZE_NUM; j++) {
2037 print_message(names[D_CBC_BF], c[D_CBC_BF][j], lengths[j]);
2038 Time_F(START);
2039 for (count = 0, run = 1; COND(c[D_CBC_BF][j]); count++)
2040 BF_cbc_encrypt(buf, buf,
2041 (unsigned long) lengths[j], &bf_ks,
2042 iv, BF_ENCRYPT);
2043 d = Time_F(STOP);
2044 print_result(D_CBC_BF, j, count, d);
2045 }
2046 }
2047 #endif
2048 #ifndef OPENSSL_NO_CAST
2049 if (doit[D_CBC_CAST]) {
2050 for (j = 0; j < SIZE_NUM; j++) {
2051 print_message(names[D_CBC_CAST], c[D_CBC_CAST][j], lengths[j]);
2052 Time_F(START);
2053 for (count = 0, run = 1; COND(c[D_CBC_CAST][j]); count++)
2054 CAST_cbc_encrypt(buf, buf,
2055 (unsigned long) lengths[j], &cast_ks,
2056 iv, CAST_ENCRYPT);
2057 d = Time_F(STOP);
2058 print_result(D_CBC_CAST, j, count, d);
2059 }
2060 }
2061 #endif
2062
2063 if (doit[D_EVP]) {
2064 for (j = 0; j < SIZE_NUM; j++) {
2065 if (evp_cipher) {
2066 EVP_CIPHER_CTX *ctx;
2067 int outl;
2068
2069 names[D_EVP] =
2070 OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
2071 /*
2072 * -O3 -fschedule-insns messes up an
2073 * optimization here! names[D_EVP] somehow
2074 * becomes NULL
2075 */
2076 print_message(names[D_EVP], save_count,
2077 lengths[j]);
2078
2079 if ((ctx = EVP_CIPHER_CTX_new()) == NULL) {
2080 BIO_printf(bio_err, "Failed to "
2081 "allocate cipher context.\n");
2082 goto end;
2083 }
2084 if (decrypt)
2085 EVP_DecryptInit_ex(ctx, evp_cipher, NULL, key16, iv);
2086 else
2087 EVP_EncryptInit_ex(ctx, evp_cipher, NULL, key16, iv);
2088 EVP_CIPHER_CTX_set_padding(ctx, 0);
2089
2090 Time_F(START);
2091 if (decrypt)
2092 for (count = 0, run = 1; COND(save_count * 4 * lengths[0] / lengths[j]); count++)
2093 EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[j]);
2094 else
2095 for (count = 0, run = 1; COND(save_count * 4 * lengths[0] / lengths[j]); count++)
2096 EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[j]);
2097 if (decrypt)
2098 EVP_DecryptFinal_ex(ctx, buf, &outl);
2099 else
2100 EVP_EncryptFinal_ex(ctx, buf, &outl);
2101 d = Time_F(STOP);
2102 EVP_CIPHER_CTX_free(ctx);
2103 }
2104 if (evp_md) {
2105 names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
2106 print_message(names[D_EVP], save_count,
2107 lengths[j]);
2108
2109 Time_F(START);
2110 for (count = 0, run = 1; COND(save_count * 4 * lengths[0] / lengths[j]); count++)
2111 EVP_Digest(buf, lengths[j], &(md[0]), NULL, evp_md, NULL);
2112
2113 d = Time_F(STOP);
2114 }
2115 print_result(D_EVP, j, count, d);
2116 }
2117 }
2118 arc4random_buf(buf, 36);
2119 for (j = 0; j < RSA_NUM; j++) {
2120 int ret;
2121 if (!rsa_doit[j])
2122 continue;
2123 ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, &rsa_num, rsa_key[j]);
2124 if (ret == 0) {
2125 BIO_printf(bio_err, "RSA sign failure. No RSA sign will be done.\n");
2126 ERR_print_errors(bio_err);
2127 rsa_count = 1;
2128 } else {
2129 pkey_print_message("private", "rsa",
2130 rsa_c[j][0], rsa_bits[j],
2131 RSA_SECONDS);
2132 /* RSA_blinding_on(rsa_key[j],NULL); */
2133 Time_F(START);
2134 for (count = 0, run = 1; COND(rsa_c[j][0]); count++) {
2135 ret = RSA_sign(NID_md5_sha1, buf, 36, buf2,
2136 &rsa_num, rsa_key[j]);
2137 if (ret == 0) {
2138 BIO_printf(bio_err,
2139 "RSA sign failure\n");
2140 ERR_print_errors(bio_err);
2141 count = 1;
2142 break;
2143 }
2144 }
2145 d = Time_F(STOP);
2146 BIO_printf(bio_err, mr ? "+R1:%ld:%d:%.2f\n"
2147 : "%ld %d bit private RSA in %.2fs\n",
2148 count, rsa_bits[j], d);
2149 rsa_results[j][0] = d / (double) count;
2150 rsa_count = count;
2151 }
2152
2153 ret = RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[j]);
2154 if (ret <= 0) {
2155 BIO_printf(bio_err, "RSA verify failure. No RSA verify will be done.\n");
2156 ERR_print_errors(bio_err);
2157 rsa_doit[j] = 0;
2158 } else {
2159 pkey_print_message("public", "rsa",
2160 rsa_c[j][1], rsa_bits[j],
2161 RSA_SECONDS);
2162 Time_F(START);
2163 for (count = 0, run = 1; COND(rsa_c[j][1]); count++) {
2164 ret = RSA_verify(NID_md5_sha1, buf, 36, buf2,
2165 rsa_num, rsa_key[j]);
2166 if (ret <= 0) {
2167 BIO_printf(bio_err,
2168 "RSA verify failure\n");
2169 ERR_print_errors(bio_err);
2170 count = 1;
2171 break;
2172 }
2173 }
2174 d = Time_F(STOP);
2175 BIO_printf(bio_err, mr ? "+R2:%ld:%d:%.2f\n"
2176 : "%ld %d bit public RSA in %.2fs\n",
2177 count, rsa_bits[j], d);
2178 rsa_results[j][1] = d / (double) count;
2179 }
2180
2181 if (rsa_count <= 1) {
2182 /* if longer than 10s, don't do any more */
2183 for (j++; j < RSA_NUM; j++)
2184 rsa_doit[j] = 0;
2185 }
2186 }
2187
2188 arc4random_buf(buf, 20);
2189 for (j = 0; j < DSA_NUM; j++) {
2190 unsigned int kk;
2191 int ret;
2192
2193 if (!dsa_doit[j])
2194 continue;
2195 /* DSA_generate_key(dsa_key[j]); */
2196 /* DSA_sign_setup(dsa_key[j],NULL); */
2197 ret = DSA_sign(EVP_PKEY_DSA, buf, 20, buf2,
2198 &kk, dsa_key[j]);
2199 if (ret == 0) {
2200 BIO_printf(bio_err, "DSA sign failure. No DSA sign will be done.\n");
2201 ERR_print_errors(bio_err);
2202 rsa_count = 1;
2203 } else {
2204 pkey_print_message("sign", "dsa",
2205 dsa_c[j][0], dsa_bits[j],
2206 DSA_SECONDS);
2207 Time_F(START);
2208 for (count = 0, run = 1; COND(dsa_c[j][0]); count++) {
2209 ret = DSA_sign(EVP_PKEY_DSA, buf, 20, buf2,
2210 &kk, dsa_key[j]);
2211 if (ret == 0) {
2212 BIO_printf(bio_err,
2213 "DSA sign failure\n");
2214 ERR_print_errors(bio_err);
2215 count = 1;
2216 break;
2217 }
2218 }
2219 d = Time_F(STOP);
2220 BIO_printf(bio_err, mr ? "+R3:%ld:%d:%.2f\n"
2221 : "%ld %d bit DSA signs in %.2fs\n",
2222 count, dsa_bits[j], d);
2223 dsa_results[j][0] = d / (double) count;
2224 rsa_count = count;
2225 }
2226
2227 ret = DSA_verify(EVP_PKEY_DSA, buf, 20, buf2,
2228 kk, dsa_key[j]);
2229 if (ret <= 0) {
2230 BIO_printf(bio_err, "DSA verify failure. No DSA verify will be done.\n");
2231 ERR_print_errors(bio_err);
2232 dsa_doit[j] = 0;
2233 } else {
2234 pkey_print_message("verify", "dsa",
2235 dsa_c[j][1], dsa_bits[j],
2236 DSA_SECONDS);
2237 Time_F(START);
2238 for (count = 0, run = 1; COND(dsa_c[j][1]); count++) {
2239 ret = DSA_verify(EVP_PKEY_DSA, buf, 20, buf2,
2240 kk, dsa_key[j]);
2241 if (ret <= 0) {
2242 BIO_printf(bio_err,
2243 "DSA verify failure\n");
2244 ERR_print_errors(bio_err);
2245 count = 1;
2246 break;
2247 }
2248 }
2249 d = Time_F(STOP);
2250 BIO_printf(bio_err, mr ? "+R4:%ld:%d:%.2f\n"
2251 : "%ld %d bit DSA verify in %.2fs\n",
2252 count, dsa_bits[j], d);
2253 dsa_results[j][1] = d / (double) count;
2254 }
2255
2256 if (rsa_count <= 1) {
2257 /* if longer than 10s, don't do any more */
2258 for (j++; j < DSA_NUM; j++)
2259 dsa_doit[j] = 0;
2260 }
2261 }
2262
2263 for (j = 0; j < EC_NUM; j++) {
2264 int ret;
2265
2266 if (!ecdsa_doit[j])
2267 continue; /* Ignore Curve */
2268 ecdsa[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2269 if (ecdsa[j] == NULL) {
2270 BIO_printf(bio_err, "ECDSA failure.\n");
2271 ERR_print_errors(bio_err);
2272 rsa_count = 1;
2273 } else {
2274 EC_KEY_precompute_mult(ecdsa[j], NULL);
2275
2276 /* Perform ECDSA signature test */
2277 EC_KEY_generate_key(ecdsa[j]);
2278 ret = ECDSA_sign(0, buf, 20, ecdsasig,
2279 &ecdsasiglen, ecdsa[j]);
2280 if (ret == 0) {
2281 BIO_printf(bio_err, "ECDSA sign failure. No ECDSA sign will be done.\n");
2282 ERR_print_errors(bio_err);
2283 rsa_count = 1;
2284 } else {
2285 pkey_print_message("sign", "ecdsa",
2286 ecdsa_c[j][0],
2287 test_curves_bits[j],
2288 ECDSA_SECONDS);
2289
2290 Time_F(START);
2291 for (count = 0, run = 1; COND(ecdsa_c[j][0]);
2292 count++) {
2293 ret = ECDSA_sign(0, buf, 20,
2294 ecdsasig, &ecdsasiglen,
2295 ecdsa[j]);
2296 if (ret == 0) {
2297 BIO_printf(bio_err, "ECDSA sign failure\n");
2298 ERR_print_errors(bio_err);
2299 count = 1;
2300 break;
2301 }
2302 }
2303 d = Time_F(STOP);
2304
2305 BIO_printf(bio_err, mr ? "+R5:%ld:%d:%.2f\n" :
2306 "%ld %d bit ECDSA signs in %.2fs \n",
2307 count, test_curves_bits[j], d);
2308 ecdsa_results[j][0] = d / (double) count;
2309 rsa_count = count;
2310 }
2311
2312 /* Perform ECDSA verification test */
2313 ret = ECDSA_verify(0, buf, 20, ecdsasig,
2314 ecdsasiglen, ecdsa[j]);
2315 if (ret != 1) {
2316 BIO_printf(bio_err, "ECDSA verify failure. No ECDSA verify will be done.\n");
2317 ERR_print_errors(bio_err);
2318 ecdsa_doit[j] = 0;
2319 } else {
2320 pkey_print_message("verify", "ecdsa",
2321 ecdsa_c[j][1],
2322 test_curves_bits[j],
2323 ECDSA_SECONDS);
2324 Time_F(START);
2325 for (count = 0, run = 1; COND(ecdsa_c[j][1]); count++) {
2326 ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[j]);
2327 if (ret != 1) {
2328 BIO_printf(bio_err, "ECDSA verify failure\n");
2329 ERR_print_errors(bio_err);
2330 count = 1;
2331 break;
2332 }
2333 }
2334 d = Time_F(STOP);
2335 BIO_printf(bio_err, mr ? "+R6:%ld:%d:%.2f\n"
2336 : "%ld %d bit ECDSA verify in %.2fs\n",
2337 count, test_curves_bits[j], d);
2338 ecdsa_results[j][1] = d / (double) count;
2339 }
2340
2341 if (rsa_count <= 1) {
2342 /* if longer than 10s, don't do any more */
2343 for (j++; j < EC_NUM; j++)
2344 ecdsa_doit[j] = 0;
2345 }
2346 }
2347 }
2348
2349 for (j = 0; j < EC_NUM; j++) {
2350 if (!ecdh_doit[j])
2351 continue;
2352 ecdh_a[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2353 ecdh_b[j] = EC_KEY_new_by_curve_name(test_curves[j]);
2354 if ((ecdh_a[j] == NULL) || (ecdh_b[j] == NULL)) {
2355 BIO_printf(bio_err, "ECDH failure.\n");
2356 ERR_print_errors(bio_err);
2357 rsa_count = 1;
2358 } else {
2359 /* generate two ECDH key pairs */
2360 if (!EC_KEY_generate_key(ecdh_a[j]) ||
2361 !EC_KEY_generate_key(ecdh_b[j])) {
2362 BIO_printf(bio_err, "ECDH key generation failure.\n");
2363 ERR_print_errors(bio_err);
2364 rsa_count = 1;
2365 } else {
2366 /*
2367 * If field size is not more than 24 octets,
2368 * then use SHA-1 hash of result; otherwise,
2369 * use result (see section 4.8 of
2370 * draft-ietf-tls-ecc-03.txt).
2371 */
2372 int field_size, outlen;
2373 void *(*kdf) (const void *in, size_t inlen, void *out, size_t * xoutlen);
2374 field_size = EC_GROUP_get_degree(EC_KEY_get0_group(ecdh_a[j]));
2375 if (field_size <= 24 * 8) {
2376 outlen = KDF1_SHA1_len;
2377 kdf = KDF1_SHA1;
2378 } else {
2379 outlen = (field_size + 7) / 8;
2380 kdf = NULL;
2381 }
2382 secret_size_a = ECDH_compute_key(secret_a, outlen,
2383 EC_KEY_get0_public_key(ecdh_b[j]),
2384 ecdh_a[j], kdf);
2385 secret_size_b = ECDH_compute_key(secret_b, outlen,
2386 EC_KEY_get0_public_key(ecdh_a[j]),
2387 ecdh_b[j], kdf);
2388 if (secret_size_a != secret_size_b)
2389 ecdh_checks = 0;
2390 else
2391 ecdh_checks = 1;
2392
2393 for (secret_idx = 0;
2394 (secret_idx < secret_size_a)
2395 && (ecdh_checks == 1);
2396 secret_idx++) {
2397 if (secret_a[secret_idx] != secret_b[secret_idx])
2398 ecdh_checks = 0;
2399 }
2400
2401 if (ecdh_checks == 0) {
2402 BIO_printf(bio_err,
2403 "ECDH computations don't match.\n");
2404 ERR_print_errors(bio_err);
2405 rsa_count = 1;
2406 } else {
2407 pkey_print_message("", "ecdh",
2408 ecdh_c[j][0],
2409 test_curves_bits[j],
2410 ECDH_SECONDS);
2411 Time_F(START);
2412 for (count = 0, run = 1;
2413 COND(ecdh_c[j][0]); count++) {
2414 ECDH_compute_key(secret_a,
2415 outlen,
2416 EC_KEY_get0_public_key(ecdh_b[j]),
2417 ecdh_a[j], kdf);
2418 }
2419 d = Time_F(STOP);
2420 BIO_printf(bio_err, mr
2421 ? "+R7:%ld:%d:%.2f\n"
2422 : "%ld %d-bit ECDH ops in %.2fs\n",
2423 count, test_curves_bits[j], d);
2424 ecdh_results[j][0] = d / (double) count;
2425 rsa_count = count;
2426 }
2427 }
2428 }
2429
2430
2431 if (rsa_count <= 1) {
2432 /* if longer than 10s, don't do any more */
2433 for (j++; j < EC_NUM; j++)
2434 ecdh_doit[j] = 0;
2435 }
2436 }
2437 show_res:
2438 if (!mr) {
2439 fprintf(stdout, "%s\n", SSLeay_version(SSLEAY_VERSION));
2440 fprintf(stdout, "%s\n", SSLeay_version(SSLEAY_BUILT_ON));
2441 fprintf(stdout, "%s\n", SSLeay_version(SSLEAY_CFLAGS));
2442 }
2443 if (pr_header) {
2444 if (mr)
2445 fprintf(stdout, "+H");
2446 else {
2447 fprintf(stdout, "The 'numbers' are in 1000s of bytes per second processed.\n");
2448 fprintf(stdout, "type ");
2449 }
2450 for (j = 0; j < SIZE_NUM; j++)
2451 fprintf(stdout, mr ? ":%d" : "%7d bytes", lengths[j]);
2452 fprintf(stdout, "\n");
2453 }
2454 for (k = 0; k < ALGOR_NUM; k++) {
2455 if (!doit[k])
2456 continue;
2457 if (mr)
2458 fprintf(stdout, "+F:%d:%s", k, names[k]);
2459 else
2460 fprintf(stdout, "%-13s", names[k]);
2461 for (j = 0; j < SIZE_NUM; j++) {
2462 if (results[k][j] > 10000 && !mr)
2463 fprintf(stdout, " %11.2fk", results[k][j] / 1e3);
2464 else
2465 fprintf(stdout, mr ? ":%.2f" : " %11.2f ", results[k][j]);
2466 }
2467 fprintf(stdout, "\n");
2468 }
2469 j = 1;
2470 for (k = 0; k < RSA_NUM; k++) {
2471 if (!rsa_doit[k])
2472 continue;
2473 if (j && !mr) {
2474 printf("%18ssign verify sign/s verify/s\n", " ");
2475 j = 0;
2476 }
2477 if (mr)
2478 fprintf(stdout, "+F2:%u:%u:%f:%f\n",
2479 k, rsa_bits[k], rsa_results[k][0],
2480 rsa_results[k][1]);
2481 else
2482 fprintf(stdout, "rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2483 rsa_bits[k], rsa_results[k][0], rsa_results[k][1],
2484 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1]);
2485 }
2486 j = 1;
2487 for (k = 0; k < DSA_NUM; k++) {
2488 if (!dsa_doit[k])
2489 continue;
2490 if (j && !mr) {
2491 printf("%18ssign verify sign/s verify/s\n", " ");
2492 j = 0;
2493 }
2494 if (mr)
2495 fprintf(stdout, "+F3:%u:%u:%f:%f\n",
2496 k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]);
2497 else
2498 fprintf(stdout, "dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",
2499 dsa_bits[k], dsa_results[k][0], dsa_results[k][1],
2500 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1]);
2501 }
2502 j = 1;
2503 for (k = 0; k < EC_NUM; k++) {
2504 if (!ecdsa_doit[k])
2505 continue;
2506 if (j && !mr) {
2507 printf("%30ssign verify sign/s verify/s\n", " ");
2508 j = 0;
2509 }
2510 if (mr)
2511 fprintf(stdout, "+F4:%u:%u:%f:%f\n",
2512 k, test_curves_bits[k],
2513 ecdsa_results[k][0], ecdsa_results[k][1]);
2514 else
2515 fprintf(stdout,
2516 "%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n",
2517 test_curves_bits[k],
2518 test_curves_names[k],
2519 ecdsa_results[k][0], ecdsa_results[k][1],
2520 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1]);
2521 }
2522
2523
2524 j = 1;
2525 for (k = 0; k < EC_NUM; k++) {
2526 if (!ecdh_doit[k])
2527 continue;
2528 if (j && !mr) {
2529 printf("%30sop op/s\n", " ");
2530 j = 0;
2531 }
2532 if (mr)
2533 fprintf(stdout, "+F5:%u:%u:%f:%f\n",
2534 k, test_curves_bits[k],
2535 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2536
2537 else
2538 fprintf(stdout, "%4u bit ecdh (%s) %8.4fs %8.1f\n",
2539 test_curves_bits[k],
2540 test_curves_names[k],
2541 ecdh_results[k][0], 1.0 / ecdh_results[k][0]);
2542 }
2543
2544 mret = 0;
2545
2546 end:
2547 ERR_print_errors(bio_err);
2548 free(real_buf);
2549 free(real_buf2);
2550 for (i = 0; i < RSA_NUM; i++)
2551 if (rsa_key[i] != NULL)
2552 RSA_free(rsa_key[i]);
2553 for (i = 0; i < DSA_NUM; i++)
2554 if (dsa_key[i] != NULL)
2555 DSA_free(dsa_key[i]);
2556
2557 for (i = 0; i < EC_NUM; i++)
2558 if (ecdsa[i] != NULL)
2559 EC_KEY_free(ecdsa[i]);
2560 for (i = 0; i < EC_NUM; i++) {
2561 if (ecdh_a[i] != NULL)
2562 EC_KEY_free(ecdh_a[i]);
2563 if (ecdh_b[i] != NULL)
2564 EC_KEY_free(ecdh_b[i]);
2565 }
2566
2567
2568 return (mret);
2569 }
2570
2571 static void
print_message(const char * s,long num,int length)2572 print_message(const char *s, long num, int length)
2573 {
2574 BIO_printf(bio_err, mr ? "+DT:%s:%d:%d\n"
2575 : "Doing %s for %ds on %d size blocks: ", s, SECONDS, length);
2576 (void) BIO_flush(bio_err);
2577 alarm(SECONDS);
2578 }
2579
2580 static void
pkey_print_message(const char * str,const char * str2,long num,int bits,int tm)2581 pkey_print_message(const char *str, const char *str2, long num,
2582 int bits, int tm)
2583 {
2584 BIO_printf(bio_err, mr ? "+DTP:%d:%s:%s:%d\n"
2585 : "Doing %d bit %s %s for %ds: ", bits, str, str2, tm);
2586 (void) BIO_flush(bio_err);
2587 alarm(tm);
2588 }
2589
2590 static void
print_result(int alg,int run_no,int count,double time_used)2591 print_result(int alg, int run_no, int count, double time_used)
2592 {
2593 BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n"
2594 : "%d %s in %.2fs\n", count, names[alg], time_used);
2595 results[alg][run_no] = ((double) count) / time_used * lengths[run_no];
2596 }
2597
2598 static char *
sstrsep(char ** string,const char * delim)2599 sstrsep(char **string, const char *delim)
2600 {
2601 char isdelim[256];
2602 char *token = *string;
2603
2604 if (**string == 0)
2605 return NULL;
2606
2607 memset(isdelim, 0, sizeof isdelim);
2608 isdelim[0] = 1;
2609
2610 while (*delim) {
2611 isdelim[(unsigned char) (*delim)] = 1;
2612 delim++;
2613 }
2614
2615 while (!isdelim[(unsigned char) (**string)]) {
2616 (*string)++;
2617 }
2618
2619 if (**string) {
2620 **string = 0;
2621 (*string)++;
2622 }
2623 return token;
2624 }
2625
2626 static int
do_multi(int multi)2627 do_multi(int multi)
2628 {
2629 int n;
2630 int fd[2];
2631 int *fds;
2632 static char sep[] = ":";
2633 const char *errstr = NULL;
2634
2635 fds = reallocarray(NULL, multi, sizeof *fds);
2636 if (fds == NULL) {
2637 fprintf(stderr, "reallocarray failure\n");
2638 exit(1);
2639 }
2640 for (n = 0; n < multi; ++n) {
2641 if (pipe(fd) == -1) {
2642 fprintf(stderr, "pipe failure\n");
2643 exit(1);
2644 }
2645 fflush(stdout);
2646 fflush(stderr);
2647 if (fork()) {
2648 close(fd[1]);
2649 fds[n] = fd[0];
2650 } else {
2651 close(fd[0]);
2652 close(1);
2653 if (dup(fd[1]) == -1) {
2654 fprintf(stderr, "dup failed\n");
2655 exit(1);
2656 }
2657 close(fd[1]);
2658 mr = 1;
2659 usertime = 0;
2660 free(fds);
2661 return 0;
2662 }
2663 printf("Forked child %d\n", n);
2664 }
2665
2666 /* for now, assume the pipe is long enough to take all the output */
2667 for (n = 0; n < multi; ++n) {
2668 FILE *f;
2669 char buf[1024];
2670 char *p;
2671
2672 f = fdopen(fds[n], "r");
2673 while (fgets(buf, sizeof buf, f)) {
2674 p = strchr(buf, '\n');
2675 if (p)
2676 *p = '\0';
2677 if (buf[0] != '+') {
2678 fprintf(stderr, "Don't understand line '%s' from child %d\n",
2679 buf, n);
2680 continue;
2681 }
2682 printf("Got: %s from %d\n", buf, n);
2683 if (!strncmp(buf, "+F:", 3)) {
2684 int alg;
2685 int j;
2686
2687 p = buf + 3;
2688 alg = strtonum(sstrsep(&p, sep),
2689 0, ALGOR_NUM - 1, &errstr);
2690 sstrsep(&p, sep);
2691 for (j = 0; j < SIZE_NUM; ++j)
2692 results[alg][j] += atof(sstrsep(&p, sep));
2693 } else if (!strncmp(buf, "+F2:", 4)) {
2694 int k;
2695 double d;
2696
2697 p = buf + 4;
2698 k = strtonum(sstrsep(&p, sep),
2699 0, ALGOR_NUM - 1, &errstr);
2700 sstrsep(&p, sep);
2701
2702 d = atof(sstrsep(&p, sep));
2703 if (n)
2704 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d);
2705 else
2706 rsa_results[k][0] = d;
2707
2708 d = atof(sstrsep(&p, sep));
2709 if (n)
2710 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d);
2711 else
2712 rsa_results[k][1] = d;
2713 } else if (!strncmp(buf, "+F2:", 4)) {
2714 int k;
2715 double d;
2716
2717 p = buf + 4;
2718 k = strtonum(sstrsep(&p, sep),
2719 0, ALGOR_NUM - 1, &errstr);
2720 sstrsep(&p, sep);
2721
2722 d = atof(sstrsep(&p, sep));
2723 if (n)
2724 rsa_results[k][0] = 1 / (1 / rsa_results[k][0] + 1 / d);
2725 else
2726 rsa_results[k][0] = d;
2727
2728 d = atof(sstrsep(&p, sep));
2729 if (n)
2730 rsa_results[k][1] = 1 / (1 / rsa_results[k][1] + 1 / d);
2731 else
2732 rsa_results[k][1] = d;
2733 } else if (!strncmp(buf, "+F3:", 4)) {
2734 int k;
2735 double d;
2736
2737 p = buf + 4;
2738 k = strtonum(sstrsep(&p, sep),
2739 0, ALGOR_NUM - 1, &errstr);
2740 sstrsep(&p, sep);
2741
2742 d = atof(sstrsep(&p, sep));
2743 if (n)
2744 dsa_results[k][0] = 1 / (1 / dsa_results[k][0] + 1 / d);
2745 else
2746 dsa_results[k][0] = d;
2747
2748 d = atof(sstrsep(&p, sep));
2749 if (n)
2750 dsa_results[k][1] = 1 / (1 / dsa_results[k][1] + 1 / d);
2751 else
2752 dsa_results[k][1] = d;
2753 } else if (!strncmp(buf, "+F4:", 4)) {
2754 int k;
2755 double d;
2756
2757 p = buf + 4;
2758 k = strtonum(sstrsep(&p, sep),
2759 0, ALGOR_NUM - 1, &errstr);
2760 sstrsep(&p, sep);
2761
2762 d = atof(sstrsep(&p, sep));
2763 if (n)
2764 ecdsa_results[k][0] = 1 / (1 / ecdsa_results[k][0] + 1 / d);
2765 else
2766 ecdsa_results[k][0] = d;
2767
2768 d = atof(sstrsep(&p, sep));
2769 if (n)
2770 ecdsa_results[k][1] = 1 / (1 / ecdsa_results[k][1] + 1 / d);
2771 else
2772 ecdsa_results[k][1] = d;
2773 } else if (!strncmp(buf, "+F5:", 4)) {
2774 int k;
2775 double d;
2776
2777 p = buf + 4;
2778 k = strtonum(sstrsep(&p, sep),
2779 0, ALGOR_NUM - 1, &errstr);
2780 sstrsep(&p, sep);
2781
2782 d = atof(sstrsep(&p, sep));
2783 if (n)
2784 ecdh_results[k][0] = 1 / (1 / ecdh_results[k][0] + 1 / d);
2785 else
2786 ecdh_results[k][0] = d;
2787
2788 } else if (!strncmp(buf, "+H:", 3)) {
2789 } else
2790 fprintf(stderr, "Unknown type '%s' from child %d\n", buf, n);
2791 }
2792
2793 fclose(f);
2794 }
2795 free(fds);
2796 return 1;
2797 }
2798
2799 #endif /* OPENSSL_NO_SPEED */
2800