xref: /freebsd/contrib/bearssl/test/test_crypto.c (revision b9f654b163bce26de79705e77b872427c9f2afa1)
1 /*
2  * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include "bearssl.h"
29 #include "inner.h"
30 
31 /*
32  * Decode an hexadecimal string. Returned value is the number of decoded
33  * bytes.
34  */
35 static size_t
36 hextobin(unsigned char *dst, const char *src)
37 {
38 	size_t num;
39 	unsigned acc;
40 	int z;
41 
42 	num = 0;
43 	z = 0;
44 	acc = 0;
45 	while (*src != 0) {
46 		int c = *src ++;
47 		if (c >= '0' && c <= '9') {
48 			c -= '0';
49 		} else if (c >= 'A' && c <= 'F') {
50 			c -= ('A' - 10);
51 		} else if (c >= 'a' && c <= 'f') {
52 			c -= ('a' - 10);
53 		} else {
54 			continue;
55 		}
56 		if (z) {
57 			*dst ++ = (acc << 4) + c;
58 			num ++;
59 		} else {
60 			acc = c;
61 		}
62 		z = !z;
63 	}
64 	return num;
65 }
66 
67 static void
68 check_equals(const char *banner, const void *v1, const void *v2, size_t len)
69 {
70 	size_t u;
71 	const unsigned char *b;
72 
73 	if (memcmp(v1, v2, len) == 0) {
74 		return;
75 	}
76 	fprintf(stderr, "\n%s failed\n", banner);
77 	fprintf(stderr, "v1: ");
78 	for (u = 0, b = v1; u < len; u ++) {
79 		fprintf(stderr, "%02X", b[u]);
80 	}
81 	fprintf(stderr, "\nv2: ");
82 	for (u = 0, b = v2; u < len; u ++) {
83 		fprintf(stderr, "%02X", b[u]);
84 	}
85 	fprintf(stderr, "\n");
86 	exit(EXIT_FAILURE);
87 }
88 
89 #define HASH_SIZE(cname)   br_ ## cname ## _SIZE
90 
91 #define TEST_HASH(Name, cname) \
92 static void \
93 test_ ## cname ## _internal(char *data, char *refres) \
94 { \
95 	br_ ## cname ## _context mc; \
96 	unsigned char res[HASH_SIZE(cname)], ref[HASH_SIZE(cname)]; \
97 	size_t u, n; \
98  \
99 	hextobin(ref, refres); \
100 	n = strlen(data); \
101 	br_ ## cname ## _init(&mc); \
102 	br_ ## cname ## _update(&mc, data, n); \
103 	br_ ## cname ## _out(&mc, res); \
104 	check_equals("KAT " #Name " 1", res, ref, HASH_SIZE(cname)); \
105 	br_ ## cname ## _init(&mc); \
106 	for (u = 0; u < n; u ++) { \
107 		br_ ## cname ## _update(&mc, data + u, 1); \
108 	} \
109 	br_ ## cname ## _out(&mc, res); \
110 	check_equals("KAT " #Name " 2", res, ref, HASH_SIZE(cname)); \
111 	for (u = 0; u < n; u ++) { \
112 		br_ ## cname ## _context mc2; \
113 		br_ ## cname ## _init(&mc); \
114 		br_ ## cname ## _update(&mc, data, u); \
115 		mc2 = mc; \
116 		br_ ## cname ## _update(&mc, data + u, n - u); \
117 		br_ ## cname ## _out(&mc, res); \
118 		check_equals("KAT " #Name " 3", res, ref, HASH_SIZE(cname)); \
119 		br_ ## cname ## _update(&mc2, data + u, n - u); \
120 		br_ ## cname ## _out(&mc2, res); \
121 		check_equals("KAT " #Name " 4", res, ref, HASH_SIZE(cname)); \
122 	} \
123 	memset(&mc, 0, sizeof mc); \
124 	memset(res, 0, sizeof res); \
125 	br_ ## cname ## _vtable.init(&mc.vtable); \
126 	mc.vtable->update(&mc.vtable, data, n); \
127 	mc.vtable->out(&mc.vtable, res); \
128 	check_equals("KAT " #Name " 5", res, ref, HASH_SIZE(cname)); \
129 	memset(res, 0, sizeof res); \
130 	mc.vtable->init(&mc.vtable); \
131 	mc.vtable->update(&mc.vtable, data, n); \
132 	mc.vtable->out(&mc.vtable, res); \
133 	check_equals("KAT " #Name " 6", res, ref, HASH_SIZE(cname)); \
134 }
135 
136 #define KAT_MILLION_A(Name, cname, refres)   do { \
137 		br_ ## cname ## _context mc; \
138 		unsigned char buf[1000]; \
139 		unsigned char res[HASH_SIZE(cname)], ref[HASH_SIZE(cname)]; \
140 		int i; \
141  \
142 		hextobin(ref, refres); \
143 		memset(buf, 'a', sizeof buf); \
144 		br_ ## cname ## _init(&mc); \
145 		for (i = 0; i < 1000; i ++) { \
146 			br_ ## cname ## _update(&mc, buf, sizeof buf); \
147 		} \
148 		br_ ## cname ## _out(&mc, res); \
149 		check_equals("KAT " #Name " 5", res, ref, HASH_SIZE(cname)); \
150 	} while (0)
151 
152 TEST_HASH(MD5, md5)
153 TEST_HASH(SHA-1, sha1)
154 TEST_HASH(SHA-224, sha224)
155 TEST_HASH(SHA-256, sha256)
156 TEST_HASH(SHA-384, sha384)
157 TEST_HASH(SHA-512, sha512)
158 
159 static void
160 test_MD5(void)
161 {
162 	printf("Test MD5: ");
163 	fflush(stdout);
164 	test_md5_internal("", "d41d8cd98f00b204e9800998ecf8427e");
165 	test_md5_internal("a", "0cc175b9c0f1b6a831c399e269772661");
166 	test_md5_internal("abc", "900150983cd24fb0d6963f7d28e17f72");
167 	test_md5_internal("message digest", "f96b697d7cb7938d525a2f31aaf161d0");
168 	test_md5_internal("abcdefghijklmnopqrstuvwxyz",
169 		"c3fcd3d76192e4007dfb496cca67e13b");
170 	test_md5_internal("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu"
171 		"vwxyz0123456789", "d174ab98d277d9f5a5611c2c9f419d9f");
172 	test_md5_internal("1234567890123456789012345678901234567890123456789"
173 		"0123456789012345678901234567890",
174 		"57edf4a22be3c955ac49da2e2107b67a");
175 	KAT_MILLION_A(MD5, md5,
176 		"7707d6ae4e027c70eea2a935c2296f21");
177 	printf("done.\n");
178 	fflush(stdout);
179 }
180 
181 static void
182 test_SHA1(void)
183 {
184 	printf("Test SHA-1: ");
185 	fflush(stdout);
186 	test_sha1_internal("abc", "a9993e364706816aba3e25717850c26c9cd0d89d");
187 	test_sha1_internal("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlm"
188 		"nomnopnopq", "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
189 
190 	KAT_MILLION_A(SHA-1, sha1,
191 		"34aa973cd4c4daa4f61eeb2bdbad27316534016f");
192 	printf("done.\n");
193 	fflush(stdout);
194 }
195 
196 static void
197 test_SHA224(void)
198 {
199 	printf("Test SHA-224: ");
200 	fflush(stdout);
201 	test_sha224_internal("abc",
202    "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7");
203 	test_sha224_internal("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlm"
204 		"nomnopnopq",
205    "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525");
206 
207 	KAT_MILLION_A(SHA-224, sha224,
208 		"20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67");
209 	printf("done.\n");
210 	fflush(stdout);
211 }
212 
213 static void
214 test_SHA256(void)
215 {
216 	printf("Test SHA-256: ");
217 	fflush(stdout);
218 	test_sha256_internal("abc",
219    "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
220 	test_sha256_internal("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlm"
221 		"nomnopnopq",
222    "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1");
223 
224 	KAT_MILLION_A(SHA-256, sha256,
225    "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0");
226 	printf("done.\n");
227 	fflush(stdout);
228 }
229 
230 static void
231 test_SHA384(void)
232 {
233 	printf("Test SHA-384: ");
234 	fflush(stdout);
235 	test_sha384_internal("abc",
236 		"cb00753f45a35e8bb5a03d699ac65007272c32ab0eded163"
237 		"1a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7");
238 	test_sha384_internal(
239 		"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
240 		"hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
241 		"09330c33f71147e83d192fc782cd1b4753111b173b3b05d2"
242 		"2fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039");
243 
244 	KAT_MILLION_A(SHA-384, sha384,
245 		"9d0e1809716474cb086e834e310a4a1ced149e9c00f24852"
246 		"7972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985");
247 	printf("done.\n");
248 	fflush(stdout);
249 }
250 
251 static void
252 test_SHA512(void)
253 {
254 	printf("Test SHA-512: ");
255 	fflush(stdout);
256 	test_sha512_internal("abc",
257    "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"
258    "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f");
259 	test_sha512_internal(
260 		"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
261 		"hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
262    "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018"
263    "501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909");
264 
265 	KAT_MILLION_A(SHA-512, sha512,
266    "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973eb"
267    "de0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b");
268 	printf("done.\n");
269 	fflush(stdout);
270 }
271 
272 static void
273 test_MD5_SHA1(void)
274 {
275 	unsigned char buf[500], out[36], outM[16], outS[20];
276 	unsigned char seed[1];
277 	br_hmac_drbg_context rc;
278 	br_md5_context mc;
279 	br_sha1_context sc;
280 	br_md5sha1_context cc;
281 	size_t u;
282 
283 	printf("Test MD5+SHA-1: ");
284 	fflush(stdout);
285 
286 	seed[0] = 0;
287 	br_hmac_drbg_init(&rc, &br_sha256_vtable, seed, sizeof seed);
288 	for (u = 0; u < sizeof buf; u ++) {
289 		size_t v;
290 
291 		br_hmac_drbg_generate(&rc, buf, u);
292 		br_md5_init(&mc);
293 		br_md5_update(&mc, buf, u);
294 		br_md5_out(&mc, outM);
295 		br_sha1_init(&sc);
296 		br_sha1_update(&sc, buf, u);
297 		br_sha1_out(&sc, outS);
298 		br_md5sha1_init(&cc);
299 		br_md5sha1_update(&cc, buf, u);
300 		br_md5sha1_out(&cc, out);
301 		check_equals("MD5+SHA-1 [1]", out, outM, 16);
302 		check_equals("MD5+SHA-1 [2]", out + 16, outS, 20);
303 		br_md5sha1_init(&cc);
304 		for (v = 0; v < u; v ++) {
305 			br_md5sha1_update(&cc, buf + v, 1);
306 		}
307 		br_md5sha1_out(&cc, out);
308 		check_equals("MD5+SHA-1 [3]", out, outM, 16);
309 		check_equals("MD5+SHA-1 [4]", out + 16, outS, 20);
310 	}
311 
312 	printf("done.\n");
313 	fflush(stdout);
314 }
315 
316 /*
317  * Compute a hash function, on some data, by ID. Returned value is
318  * hash output length.
319  */
320 static size_t
321 do_hash(int id, const void *data, size_t len, void *out)
322 {
323 	br_md5_context cmd5;
324 	br_sha1_context csha1;
325 	br_sha224_context csha224;
326 	br_sha256_context csha256;
327 	br_sha384_context csha384;
328 	br_sha512_context csha512;
329 
330 	switch (id) {
331 	case br_md5_ID:
332 		br_md5_init(&cmd5);
333 		br_md5_update(&cmd5, data, len);
334 		br_md5_out(&cmd5, out);
335 		return 16;
336 	case br_sha1_ID:
337 		br_sha1_init(&csha1);
338 		br_sha1_update(&csha1, data, len);
339 		br_sha1_out(&csha1, out);
340 		return 20;
341 	case br_sha224_ID:
342 		br_sha224_init(&csha224);
343 		br_sha224_update(&csha224, data, len);
344 		br_sha224_out(&csha224, out);
345 		return 28;
346 	case br_sha256_ID:
347 		br_sha256_init(&csha256);
348 		br_sha256_update(&csha256, data, len);
349 		br_sha256_out(&csha256, out);
350 		return 32;
351 	case br_sha384_ID:
352 		br_sha384_init(&csha384);
353 		br_sha384_update(&csha384, data, len);
354 		br_sha384_out(&csha384, out);
355 		return 48;
356 	case br_sha512_ID:
357 		br_sha512_init(&csha512);
358 		br_sha512_update(&csha512, data, len);
359 		br_sha512_out(&csha512, out);
360 		return 64;
361 	default:
362 		fprintf(stderr, "Uknown hash function: %d\n", id);
363 		exit(EXIT_FAILURE);
364 		return 0;
365 	}
366 }
367 
368 /*
369  * Tests for a multihash. Returned value should be 258 multiplied by the
370  * number of hash functions implemented by the context.
371  */
372 static int
373 test_multihash_inner(br_multihash_context *mc)
374 {
375 	/*
376 	 * Try hashing messages for all lengths from 0 to 257 bytes
377 	 * (inclusive). Each attempt is done twice, with data input
378 	 * either in one go, or byte by byte. In the byte by byte
379 	 * test, intermediate result are obtained and checked.
380 	 */
381 	size_t len;
382 	unsigned char buf[258];
383 	int i;
384 	int tcount;
385 
386 	tcount = 0;
387 	for (len = 0; len < sizeof buf; len ++) {
388 		br_sha1_context sc;
389 		unsigned char tmp[20];
390 
391 		br_sha1_init(&sc);
392 		br_sha1_update(&sc, buf, len);
393 		br_sha1_out(&sc, tmp);
394 		buf[len] = tmp[0];
395 	}
396 	for (len = 0; len <= 257; len ++) {
397 		size_t u;
398 
399 		br_multihash_init(mc);
400 		br_multihash_update(mc, buf, len);
401 		for (i = 1; i <= 6; i ++) {
402 			unsigned char tmp[64], tmp2[64];
403 			size_t olen, olen2;
404 
405 			olen = br_multihash_out(mc, i, tmp);
406 			if (olen == 0) {
407 				continue;
408 			}
409 			olen2 = do_hash(i, buf, len, tmp2);
410 			if (olen != olen2) {
411 				fprintf(stderr,
412 					"Bad hash output length: %u / %u\n",
413 					(unsigned)olen, (unsigned)olen2);
414 				exit(EXIT_FAILURE);
415 			}
416 			check_equals("Hash output", tmp, tmp2, olen);
417 			tcount ++;
418 		}
419 
420 		br_multihash_init(mc);
421 		for (u = 0; u < len; u ++) {
422 			br_multihash_update(mc, buf + u, 1);
423 			for (i = 1; i <= 6; i ++) {
424 				unsigned char tmp[64], tmp2[64];
425 				size_t olen, olen2;
426 
427 				olen = br_multihash_out(mc, i, tmp);
428 				if (olen == 0) {
429 					continue;
430 				}
431 				olen2 = do_hash(i, buf, u + 1, tmp2);
432 				if (olen != olen2) {
433 					fprintf(stderr, "Bad hash output"
434 						" length: %u / %u\n",
435 						(unsigned)olen,
436 						(unsigned)olen2);
437 					exit(EXIT_FAILURE);
438 				}
439 				check_equals("Hash output", tmp, tmp2, olen);
440 			}
441 		}
442 	}
443 	return tcount;
444 }
445 
446 static void
447 test_multihash(void)
448 {
449 	br_multihash_context mc;
450 
451 	printf("Test MultiHash: ");
452 	fflush(stdout);
453 
454 	br_multihash_zero(&mc);
455 	br_multihash_setimpl(&mc, br_md5_ID, &br_md5_vtable);
456 	if (test_multihash_inner(&mc) != 258) {
457 		fprintf(stderr, "Failed test count\n");
458 	}
459 	printf(".");
460 	fflush(stdout);
461 
462 	br_multihash_zero(&mc);
463 	br_multihash_setimpl(&mc, br_sha1_ID, &br_sha1_vtable);
464 	if (test_multihash_inner(&mc) != 258) {
465 		fprintf(stderr, "Failed test count\n");
466 	}
467 	printf(".");
468 	fflush(stdout);
469 
470 	br_multihash_zero(&mc);
471 	br_multihash_setimpl(&mc, br_sha224_ID, &br_sha224_vtable);
472 	if (test_multihash_inner(&mc) != 258) {
473 		fprintf(stderr, "Failed test count\n");
474 	}
475 	printf(".");
476 	fflush(stdout);
477 
478 	br_multihash_zero(&mc);
479 	br_multihash_setimpl(&mc, br_sha256_ID, &br_sha256_vtable);
480 	if (test_multihash_inner(&mc) != 258) {
481 		fprintf(stderr, "Failed test count\n");
482 	}
483 	printf(".");
484 	fflush(stdout);
485 
486 	br_multihash_zero(&mc);
487 	br_multihash_setimpl(&mc, br_sha384_ID, &br_sha384_vtable);
488 	if (test_multihash_inner(&mc) != 258) {
489 		fprintf(stderr, "Failed test count\n");
490 	}
491 	printf(".");
492 	fflush(stdout);
493 
494 	br_multihash_zero(&mc);
495 	br_multihash_setimpl(&mc, br_sha512_ID, &br_sha512_vtable);
496 	if (test_multihash_inner(&mc) != 258) {
497 		fprintf(stderr, "Failed test count\n");
498 	}
499 	printf(".");
500 	fflush(stdout);
501 
502 	br_multihash_zero(&mc);
503 	br_multihash_setimpl(&mc, br_md5_ID, &br_md5_vtable);
504 	br_multihash_setimpl(&mc, br_sha1_ID, &br_sha1_vtable);
505 	br_multihash_setimpl(&mc, br_sha224_ID, &br_sha224_vtable);
506 	br_multihash_setimpl(&mc, br_sha256_ID, &br_sha256_vtable);
507 	br_multihash_setimpl(&mc, br_sha384_ID, &br_sha384_vtable);
508 	br_multihash_setimpl(&mc, br_sha512_ID, &br_sha512_vtable);
509 	if (test_multihash_inner(&mc) != 258 * 6) {
510 		fprintf(stderr, "Failed test count\n");
511 	}
512 	printf(".");
513 	fflush(stdout);
514 
515 	printf("done.\n");
516 	fflush(stdout);
517 }
518 
519 static void
520 do_KAT_HMAC_bin_bin(const br_hash_class *digest_class,
521 	const void *key, size_t key_len,
522 	const void *data, size_t data_len, const char *href)
523 {
524 	br_hmac_key_context kc;
525 	br_hmac_context ctx;
526 	unsigned char tmp[64], ref[64];
527 	size_t u, len;
528 
529 	len = hextobin(ref, href);
530 	br_hmac_key_init(&kc, digest_class, key, key_len);
531 	br_hmac_init(&ctx, &kc, 0);
532 	br_hmac_update(&ctx, data, data_len);
533 	br_hmac_out(&ctx, tmp);
534 	check_equals("KAT HMAC 1", tmp, ref, len);
535 
536 	br_hmac_init(&ctx, &kc, 0);
537 	for (u = 0; u < data_len; u ++) {
538 		br_hmac_update(&ctx, (const unsigned char *)data + u, 1);
539 	}
540 	br_hmac_out(&ctx, tmp);
541 	check_equals("KAT HMAC 2", tmp, ref, len);
542 
543 	for (u = 0; u < data_len; u ++) {
544 		br_hmac_init(&ctx, &kc, 0);
545 		br_hmac_update(&ctx, data, u);
546 		br_hmac_out(&ctx, tmp);
547 		br_hmac_update(&ctx,
548 			(const unsigned char *)data + u, data_len - u);
549 		br_hmac_out(&ctx, tmp);
550 		check_equals("KAT HMAC 3", tmp, ref, len);
551 	}
552 }
553 
554 static void
555 do_KAT_HMAC_str_str(const br_hash_class *digest_class, const char *key,
556 	const char *data, const char *href)
557 {
558 	do_KAT_HMAC_bin_bin(digest_class, key, strlen(key),
559 		data, strlen(data), href);
560 }
561 
562 static void
563 do_KAT_HMAC_hex_hex(const br_hash_class *digest_class, const char *skey,
564 	const char *sdata, const char *href)
565 {
566 	unsigned char key[1024];
567 	unsigned char data[1024];
568 
569 	do_KAT_HMAC_bin_bin(digest_class, key, hextobin(key, skey),
570 		data, hextobin(data, sdata), href);
571 }
572 
573 static void
574 do_KAT_HMAC_hex_str(const br_hash_class *digest_class,
575 	const char *skey, const char *data, const char *href)
576 {
577 	unsigned char key[1024];
578 
579 	do_KAT_HMAC_bin_bin(digest_class, key, hextobin(key, skey),
580 		data, strlen(data), href);
581 }
582 
583 static void
584 test_HMAC_CT(const br_hash_class *digest_class,
585 	const void *key, size_t key_len, const void *data)
586 {
587 	br_hmac_key_context kc;
588 	br_hmac_context hc1, hc2;
589 	unsigned char buf1[64], buf2[64];
590 	size_t u, v;
591 
592 	br_hmac_key_init(&kc, digest_class, key, key_len);
593 
594 	for (u = 0; u < 2; u ++) {
595 		for (v = 0; v < 130; v ++) {
596 			size_t min_len, max_len;
597 			size_t w;
598 
599 			min_len = v;
600 			max_len = v + 256;
601 			for (w = min_len; w <= max_len; w ++) {
602 				char tmp[30];
603 				size_t hlen1, hlen2;
604 
605 				br_hmac_init(&hc1, &kc, 0);
606 				br_hmac_update(&hc1, data, u + w);
607 				hlen1 = br_hmac_out(&hc1, buf1);
608 				br_hmac_init(&hc2, &kc, 0);
609 				br_hmac_update(&hc2, data, u);
610 				hlen2 = br_hmac_outCT(&hc2,
611 					(const unsigned char *)data + u, w,
612 					min_len, max_len, buf2);
613 				if (hlen1 != hlen2) {
614 					fprintf(stderr, "HMAC length mismatch:"
615 						" %u / %u\n", (unsigned)hlen1,
616 						(unsigned)hlen2);
617 					exit(EXIT_FAILURE);
618 				}
619 				sprintf(tmp, "HMAC CT %u,%u,%u",
620 					(unsigned)u, (unsigned)v, (unsigned)w);
621 				check_equals(tmp, buf1, buf2, hlen1);
622 			}
623 		}
624 		printf(".");
625 		fflush(stdout);
626 	}
627 	printf(" ");
628 	fflush(stdout);
629 }
630 
631 static void
632 test_HMAC(void)
633 {
634 	unsigned char data[1000];
635 	unsigned x;
636 	size_t u;
637 	const char key[] = "test HMAC key";
638 
639 	printf("Test HMAC: ");
640 	fflush(stdout);
641 	do_KAT_HMAC_hex_str(&br_md5_vtable,
642 		"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
643 		"Hi There",
644 		"9294727a3638bb1c13f48ef8158bfc9d");
645 	do_KAT_HMAC_str_str(&br_md5_vtable,
646 		"Jefe",
647 		"what do ya want for nothing?",
648 		"750c783e6ab0b503eaa86e310a5db738");
649 	do_KAT_HMAC_hex_hex(&br_md5_vtable,
650 		"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
651 		"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD",
652 		"56be34521d144c88dbb8c733f0e8b3f6");
653 	do_KAT_HMAC_hex_hex(&br_md5_vtable,
654 		"0102030405060708090a0b0c0d0e0f10111213141516171819",
655 		"CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD",
656 		"697eaf0aca3a3aea3a75164746ffaa79");
657 	do_KAT_HMAC_hex_str(&br_md5_vtable,
658 		"0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c",
659 		"Test With Truncation",
660 		"56461ef2342edc00f9bab995690efd4c");
661 	do_KAT_HMAC_hex_str(&br_md5_vtable,
662 		"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
663 		"Test Using Larger Than Block-Size Key - Hash Key First",
664 		"6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd");
665 	do_KAT_HMAC_hex_str(&br_md5_vtable,
666 		"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
667 		"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
668 		"6f630fad67cda0ee1fb1f562db3aa53e");
669 
670 	do_KAT_HMAC_hex_str(&br_sha1_vtable,
671 		"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
672 		"Hi There",
673 		"b617318655057264e28bc0b6fb378c8ef146be00");
674 	do_KAT_HMAC_str_str(&br_sha1_vtable,
675 		"Jefe",
676 		"what do ya want for nothing?",
677 		"effcdf6ae5eb2fa2d27416d5f184df9c259a7c79");
678 	do_KAT_HMAC_hex_hex(&br_sha1_vtable,
679 		"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
680 		"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD",
681 		"125d7342b9ac11cd91a39af48aa17b4f63f175d3");
682 	do_KAT_HMAC_hex_hex(&br_sha1_vtable,
683 		"0102030405060708090a0b0c0d0e0f10111213141516171819",
684 		"CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD",
685 		"4c9007f4026250c6bc8414f9bf50c86c2d7235da");
686 	do_KAT_HMAC_hex_str(&br_sha1_vtable,
687 		"0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c",
688 		"Test With Truncation",
689 		"4c1a03424b55e07fe7f27be1d58bb9324a9a5a04");
690 	do_KAT_HMAC_hex_str(&br_sha1_vtable,
691 		"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
692 		"Test Using Larger Than Block-Size Key - Hash Key First",
693 		"aa4ae5e15272d00e95705637ce8a3b55ed402112");
694 	do_KAT_HMAC_hex_str(&br_sha1_vtable,
695 		"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
696 		"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
697 		"e8e99d0f45237d786d6bbaa7965c7808bbff1a91");
698 
699 	/* From RFC 4231 */
700 
701 	do_KAT_HMAC_hex_hex(&br_sha224_vtable,
702 		"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
703 		"4869205468657265",
704 		"896fb1128abbdf196832107cd49df33f"
705 		"47b4b1169912ba4f53684b22");
706 
707 	do_KAT_HMAC_hex_hex(&br_sha256_vtable,
708 		"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
709 		"4869205468657265",
710 		"b0344c61d8db38535ca8afceaf0bf12b"
711 		"881dc200c9833da726e9376c2e32cff7");
712 
713 	do_KAT_HMAC_hex_hex(&br_sha384_vtable,
714 		"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
715 		"4869205468657265",
716 		"afd03944d84895626b0825f4ab46907f"
717 		"15f9dadbe4101ec682aa034c7cebc59c"
718 		"faea9ea9076ede7f4af152e8b2fa9cb6");
719 
720 	do_KAT_HMAC_hex_hex(&br_sha512_vtable,
721 		"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
722 		"4869205468657265",
723 		"87aa7cdea5ef619d4ff0b4241a1d6cb0"
724 		"2379f4e2ce4ec2787ad0b30545e17cde"
725 		"daa833b7d6b8a702038b274eaea3f4e4"
726 		"be9d914eeb61f1702e696c203a126854");
727 
728 	do_KAT_HMAC_hex_hex(&br_sha224_vtable,
729 		"4a656665",
730 		"7768617420646f2079612077616e7420"
731 		"666f72206e6f7468696e673f",
732 		"a30e01098bc6dbbf45690f3a7e9e6d0f"
733 		"8bbea2a39e6148008fd05e44");
734 
735 	do_KAT_HMAC_hex_hex(&br_sha256_vtable,
736 		"4a656665",
737 		"7768617420646f2079612077616e7420"
738 		"666f72206e6f7468696e673f",
739 		"5bdcc146bf60754e6a042426089575c7"
740 		"5a003f089d2739839dec58b964ec3843");
741 
742 	do_KAT_HMAC_hex_hex(&br_sha384_vtable,
743 		"4a656665",
744 		"7768617420646f2079612077616e7420"
745 		"666f72206e6f7468696e673f",
746 		"af45d2e376484031617f78d2b58a6b1b"
747 		"9c7ef464f5a01b47e42ec3736322445e"
748 		"8e2240ca5e69e2c78b3239ecfab21649");
749 
750 	do_KAT_HMAC_hex_hex(&br_sha512_vtable,
751 		"4a656665",
752 		"7768617420646f2079612077616e7420"
753 		"666f72206e6f7468696e673f",
754 		"164b7a7bfcf819e2e395fbe73b56e0a3"
755 		"87bd64222e831fd610270cd7ea250554"
756 		"9758bf75c05a994a6d034f65f8f0e6fd"
757 		"caeab1a34d4a6b4b636e070a38bce737");
758 
759 	do_KAT_HMAC_hex_hex(&br_sha224_vtable,
760 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
761 		"aaaaaaaa",
762 		"dddddddddddddddddddddddddddddddd"
763 		"dddddddddddddddddddddddddddddddd"
764 		"dddddddddddddddddddddddddddddddd"
765 		"dddd",
766 		"7fb3cb3588c6c1f6ffa9694d7d6ad264"
767 		"9365b0c1f65d69d1ec8333ea");
768 
769 	do_KAT_HMAC_hex_hex(&br_sha256_vtable,
770 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
771 		"aaaaaaaa",
772 		"dddddddddddddddddddddddddddddddd"
773 		"dddddddddddddddddddddddddddddddd"
774 		"dddddddddddddddddddddddddddddddd"
775 		"dddd",
776 		"773ea91e36800e46854db8ebd09181a7"
777 		"2959098b3ef8c122d9635514ced565fe");
778 
779 	do_KAT_HMAC_hex_hex(&br_sha384_vtable,
780 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
781 		"aaaaaaaa",
782 		"dddddddddddddddddddddddddddddddd"
783 		"dddddddddddddddddddddddddddddddd"
784 		"dddddddddddddddddddddddddddddddd"
785 		"dddd",
786 		"88062608d3e6ad8a0aa2ace014c8a86f"
787 		"0aa635d947ac9febe83ef4e55966144b"
788 		"2a5ab39dc13814b94e3ab6e101a34f27");
789 
790 	do_KAT_HMAC_hex_hex(&br_sha512_vtable,
791 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
792 		"aaaaaaaa",
793 		"dddddddddddddddddddddddddddddddd"
794 		"dddddddddddddddddddddddddddddddd"
795 		"dddddddddddddddddddddddddddddddd"
796 		"dddd",
797 		"fa73b0089d56a284efb0f0756c890be9"
798 		"b1b5dbdd8ee81a3655f83e33b2279d39"
799 		"bf3e848279a722c806b485a47e67c807"
800 		"b946a337bee8942674278859e13292fb");
801 
802 	do_KAT_HMAC_hex_hex(&br_sha224_vtable,
803 		"0102030405060708090a0b0c0d0e0f10"
804 		"111213141516171819",
805 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
806 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
807 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
808 		"cdcd",
809 		"6c11506874013cac6a2abc1bb382627c"
810 		"ec6a90d86efc012de7afec5a");
811 
812 	do_KAT_HMAC_hex_hex(&br_sha256_vtable,
813 		"0102030405060708090a0b0c0d0e0f10"
814 		"111213141516171819",
815 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
816 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
817 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
818 		"cdcd",
819 		"82558a389a443c0ea4cc819899f2083a"
820 		"85f0faa3e578f8077a2e3ff46729665b");
821 
822 	do_KAT_HMAC_hex_hex(&br_sha384_vtable,
823 		"0102030405060708090a0b0c0d0e0f10"
824 		"111213141516171819",
825 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
826 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
827 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
828 		"cdcd",
829 		"3e8a69b7783c25851933ab6290af6ca7"
830 		"7a9981480850009cc5577c6e1f573b4e"
831 		"6801dd23c4a7d679ccf8a386c674cffb");
832 
833 	do_KAT_HMAC_hex_hex(&br_sha512_vtable,
834 		"0102030405060708090a0b0c0d0e0f10"
835 		"111213141516171819",
836 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
837 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
838 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
839 		"cdcd",
840 		"b0ba465637458c6990e5a8c5f61d4af7"
841 		"e576d97ff94b872de76f8050361ee3db"
842 		"a91ca5c11aa25eb4d679275cc5788063"
843 		"a5f19741120c4f2de2adebeb10a298dd");
844 
845 	do_KAT_HMAC_hex_hex(&br_sha224_vtable,
846 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
847 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
848 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
849 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
850 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
851 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
852 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
853 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
854 		"aaaaaa",
855 		"54657374205573696e67204c61726765"
856 		"72205468616e20426c6f636b2d53697a"
857 		"65204b6579202d2048617368204b6579"
858 		"204669727374",
859 		"95e9a0db962095adaebe9b2d6f0dbce2"
860 		"d499f112f2d2b7273fa6870e");
861 
862 	do_KAT_HMAC_hex_hex(&br_sha256_vtable,
863 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
864 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
865 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
866 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
867 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
868 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
869 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
870 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
871 		"aaaaaa",
872 		"54657374205573696e67204c61726765"
873 		"72205468616e20426c6f636b2d53697a"
874 		"65204b6579202d2048617368204b6579"
875 		"204669727374",
876 		"60e431591ee0b67f0d8a26aacbf5b77f"
877 		"8e0bc6213728c5140546040f0ee37f54");
878 
879 	do_KAT_HMAC_hex_hex(&br_sha384_vtable,
880 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
881 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
882 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
883 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
884 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
885 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
886 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
887 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
888 		"aaaaaa",
889 		"54657374205573696e67204c61726765"
890 		"72205468616e20426c6f636b2d53697a"
891 		"65204b6579202d2048617368204b6579"
892 		"204669727374",
893 		"4ece084485813e9088d2c63a041bc5b4"
894 		"4f9ef1012a2b588f3cd11f05033ac4c6"
895 		"0c2ef6ab4030fe8296248df163f44952");
896 
897 	do_KAT_HMAC_hex_hex(&br_sha512_vtable,
898 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
899 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
900 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
901 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
902 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
903 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
904 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
905 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
906 		"aaaaaa",
907 		"54657374205573696e67204c61726765"
908 		"72205468616e20426c6f636b2d53697a"
909 		"65204b6579202d2048617368204b6579"
910 		"204669727374",
911 		"80b24263c7c1a3ebb71493c1dd7be8b4"
912 		"9b46d1f41b4aeec1121b013783f8f352"
913 		"6b56d037e05f2598bd0fd2215d6a1e52"
914 		"95e64f73f63f0aec8b915a985d786598");
915 
916 	do_KAT_HMAC_hex_hex(&br_sha224_vtable,
917 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
918 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
919 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
920 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
921 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
922 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
923 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
924 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
925 		"aaaaaa",
926 		"54686973206973206120746573742075"
927 		"73696e672061206c6172676572207468"
928 		"616e20626c6f636b2d73697a65206b65"
929 		"7920616e642061206c61726765722074"
930 		"68616e20626c6f636b2d73697a652064"
931 		"6174612e20546865206b6579206e6565"
932 		"647320746f2062652068617368656420"
933 		"6265666f7265206265696e6720757365"
934 		"642062792074686520484d414320616c"
935 		"676f726974686d2e",
936 		"3a854166ac5d9f023f54d517d0b39dbd"
937 		"946770db9c2b95c9f6f565d1");
938 
939 	do_KAT_HMAC_hex_hex(&br_sha256_vtable,
940 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
941 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
942 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
943 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
944 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
945 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
946 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
947 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
948 		"aaaaaa",
949 		"54686973206973206120746573742075"
950 		"73696e672061206c6172676572207468"
951 		"616e20626c6f636b2d73697a65206b65"
952 		"7920616e642061206c61726765722074"
953 		"68616e20626c6f636b2d73697a652064"
954 		"6174612e20546865206b6579206e6565"
955 		"647320746f2062652068617368656420"
956 		"6265666f7265206265696e6720757365"
957 		"642062792074686520484d414320616c"
958 		"676f726974686d2e",
959 		"9b09ffa71b942fcb27635fbcd5b0e944"
960 		"bfdc63644f0713938a7f51535c3a35e2");
961 
962 	do_KAT_HMAC_hex_hex(&br_sha384_vtable,
963 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
964 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
965 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
966 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
967 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
968 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
969 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
970 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
971 		"aaaaaa",
972 		"54686973206973206120746573742075"
973 		"73696e672061206c6172676572207468"
974 		"616e20626c6f636b2d73697a65206b65"
975 		"7920616e642061206c61726765722074"
976 		"68616e20626c6f636b2d73697a652064"
977 		"6174612e20546865206b6579206e6565"
978 		"647320746f2062652068617368656420"
979 		"6265666f7265206265696e6720757365"
980 		"642062792074686520484d414320616c"
981 		"676f726974686d2e",
982 		"6617178e941f020d351e2f254e8fd32c"
983 		"602420feb0b8fb9adccebb82461e99c5"
984 		"a678cc31e799176d3860e6110c46523e");
985 
986 	do_KAT_HMAC_hex_hex(&br_sha512_vtable,
987 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
988 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
989 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
990 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
991 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
992 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
993 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
994 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
995 		"aaaaaa",
996 		"54686973206973206120746573742075"
997 		"73696e672061206c6172676572207468"
998 		"616e20626c6f636b2d73697a65206b65"
999 		"7920616e642061206c61726765722074"
1000 		"68616e20626c6f636b2d73697a652064"
1001 		"6174612e20546865206b6579206e6565"
1002 		"647320746f2062652068617368656420"
1003 		"6265666f7265206265696e6720757365"
1004 		"642062792074686520484d414320616c"
1005 		"676f726974686d2e",
1006 		"e37b6a775dc87dbaa4dfa9f96e5e3ffd"
1007 		"debd71f8867289865df5a32d20cdc944"
1008 		"b6022cac3c4982b10d5eeb55c3e4de15"
1009 		"134676fb6de0446065c97440fa8c6a58");
1010 
1011 	for (x = 1, u = 0; u < sizeof data; u ++) {
1012 		data[u] = x;
1013 		x = (x * 45) % 257;
1014 	}
1015 	printf("(MD5) ");
1016 	test_HMAC_CT(&br_md5_vtable, key, sizeof key, data);
1017 	printf("(SHA-1) ");
1018 	test_HMAC_CT(&br_sha1_vtable, key, sizeof key, data);
1019 	printf("(SHA-224) ");
1020 	test_HMAC_CT(&br_sha224_vtable, key, sizeof key, data);
1021 	printf("(SHA-256) ");
1022 	test_HMAC_CT(&br_sha256_vtable, key, sizeof key, data);
1023 	printf("(SHA-384) ");
1024 	test_HMAC_CT(&br_sha384_vtable, key, sizeof key, data);
1025 	printf("(SHA-512) ");
1026 	test_HMAC_CT(&br_sha512_vtable, key, sizeof key, data);
1027 
1028 	printf("done.\n");
1029 	fflush(stdout);
1030 }
1031 
1032 static void
1033 test_HKDF_inner(const br_hash_class *dig, const char *ikmhex,
1034 	const char *salthex, const char *infohex, const char *okmhex)
1035 {
1036 	unsigned char ikm[100], saltbuf[100], info[100], okm[100], tmp[107];
1037 	const unsigned char *salt;
1038 	size_t ikm_len, salt_len, info_len, okm_len;
1039 	br_hkdf_context hc;
1040 	size_t u;
1041 
1042 	ikm_len = hextobin(ikm, ikmhex);
1043 	if (salthex == NULL) {
1044 		salt = BR_HKDF_NO_SALT;
1045 		salt_len = 0;
1046 	} else {
1047 		salt = saltbuf;
1048 		salt_len = hextobin(saltbuf, salthex);
1049 	}
1050 	info_len = hextobin(info, infohex);
1051 	okm_len = hextobin(okm, okmhex);
1052 
1053 	br_hkdf_init(&hc, dig, salt, salt_len);
1054 	br_hkdf_inject(&hc, ikm, ikm_len);
1055 	br_hkdf_flip(&hc);
1056 	br_hkdf_produce(&hc, info, info_len, tmp, okm_len);
1057 	check_equals("KAT HKDF 1", tmp, okm, okm_len);
1058 
1059 	br_hkdf_init(&hc, dig, salt, salt_len);
1060 	for (u = 0; u < ikm_len; u ++) {
1061 		br_hkdf_inject(&hc, &ikm[u], 1);
1062 	}
1063 	br_hkdf_flip(&hc);
1064 	for (u = 0; u < okm_len; u ++) {
1065 		br_hkdf_produce(&hc, info, info_len, &tmp[u], 1);
1066 	}
1067 	check_equals("KAT HKDF 2", tmp, okm, okm_len);
1068 
1069 	br_hkdf_init(&hc, dig, salt, salt_len);
1070 	br_hkdf_inject(&hc, ikm, ikm_len);
1071 	br_hkdf_flip(&hc);
1072 	for (u = 0; u < okm_len; u += 7) {
1073 		br_hkdf_produce(&hc, info, info_len, &tmp[u], 7);
1074 	}
1075 	check_equals("KAT HKDF 3", tmp, okm, okm_len);
1076 
1077 	printf(".");
1078 	fflush(stdout);
1079 }
1080 
1081 static void
1082 test_HKDF(void)
1083 {
1084 	printf("Test HKDF: ");
1085 	fflush(stdout);
1086 
1087 	test_HKDF_inner(&br_sha256_vtable,
1088 		"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
1089 		"000102030405060708090a0b0c",
1090 		"f0f1f2f3f4f5f6f7f8f9",
1091 		"3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865");
1092 
1093 	test_HKDF_inner(&br_sha256_vtable,
1094 		"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
1095 		"606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
1096 		"b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1097 		"b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87");
1098 
1099 	test_HKDF_inner(&br_sha256_vtable,
1100 		"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
1101 		"",
1102 		"",
1103 		"8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8");
1104 
1105 	test_HKDF_inner(&br_sha1_vtable,
1106 		"0b0b0b0b0b0b0b0b0b0b0b",
1107 		"000102030405060708090a0b0c",
1108 		"f0f1f2f3f4f5f6f7f8f9",
1109 		"085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896");
1110 
1111 	test_HKDF_inner(&br_sha1_vtable,
1112 		"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
1113 		"606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
1114 		"b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1115 		"0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4");
1116 
1117 	test_HKDF_inner(&br_sha1_vtable,
1118 		"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
1119 		"",
1120 		"",
1121 		"0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea00033de03984d34918");
1122 
1123 	test_HKDF_inner(&br_sha1_vtable,
1124 		"0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c",
1125 		NULL,
1126 		"",
1127 		"2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48");
1128 
1129 	printf(" done.\n");
1130 	fflush(stdout);
1131 }
1132 
1133 /*
1134  * Known-answer test vectors for SHAKE128, from the NIST validation test
1135  * suite. Each vector is a pair (input,output).
1136  */
1137 static const char *const KAT_SHAKE128[] = {
1138 
1139 	"e4e932fc9907620ebebffd32b10fda7890a5bc20e5f41d5589882a18c2960e7aafd8730ee697469e5b0abb1d84de92ddba169802e31570374ef9939fde2b960e6b34ac7a65d36bacba4cd33bfa028cbbba486f32367548cb3a36dacf422924d0e0a7e3285ee158a2a42e4b765da3507b56e54998263b2c7b14e7078e35b74127d5d7220018e995e6e1572db5f3e8678357922f1cfd90a5afa6b420c600fd737b136c70e9dd14",
1140 	"459ce4fa824ee1910a678abc77c1f769",
1141 
1142 	"18636f702f216b1b9302e59d82192f4e002f82d526c3f04cbd4f9b9f0bcd2535ed7a67d326da66bdf7fc821ef0fff1a905d56c81e4472856863908d104301133ad111e39552cd542ef78d9b35f20419b893f4a93aee848e9f86ae3fd53d27fea7fb1fc69631fa0f3a5ff51267785086ab4f682d42baf394b3b6992e9a0bb58a38ce0692df9bbaf183e18523ee1352c5fad817e0c04a3e1c476be7f5e92f482a6fb29cd4bbf09ea",
1143 	"b7b9db481898f888e5ee4ed629859844",
1144 
1145 	"5d9ff9fe63c328ddbe0c865ac6ba605c52a14ee8e4870ba320ce849283532f2551959e74cf1a54c8b30ed75dd92e076637e4ad5213b3574e73d6640bd6245bc121378174dccdaa769e6e4f2dc650e1166c775d0a982021c0b160fe9438098e86b6cdc786f2a6d1ef68751551f7e99773daa28598d9961002c0b47ab511c8707df69f9b32796b723bf7685251d2c0d08567ad4e8540ddcc1b8a1a01f6c92aaaadcaf42301d9e53463",
1146 	"f50af2684408915871948779a14c147c",
1147 
1148 	"38c0be76e7b60f262f1499e328e0519f864bbb9d134d00345d8942d0ab762c3936c0cd1896eca6b77b3c01089dd285e9f61708a62e5ea4bf57c50decda5c215fb18ac149d7ace09ffdfed91e7fbf068d96908e42cf1e7ee7bc001c7ee9e378a311e44311923de4681f24c92eb5f0fb13d07ef679ded3b733f402168dc050568dbf97fb79afe8db994874783e27ad8d040ba8e75343c6762c6793a42247eee5a6216b908817f5edbbdf",
1149 	"e4786ad8f2ea9c8e420a6f50b5feec9a",
1150 
1151 	"ec586d52ad2ced1f96bd9458a5a1f64bc1b4cce1fa52517513c9ebe63d0d0eeb26ae5da73208137e08baa22651599a01bc65cbaa467baeceb8cd013d71d0b2406534fe2e6619da3aa380928f6effb09f42ba1fb7048e90d7898f1dc259b52c51b2d2970cd0c70afb6cf8acba83fd01cc589b0f31bcf2bf3b8df7879d7d2546c514706f6cf97b6a6b6d0a37d018ba553108f0e240f70f03a0ccee86f76589c64594f6cf74679bc330ad9f",
1152 	"191a3710c72d11da7a2410bc73ba9d9f",
1153 
1154 	"c201dfe59e03574476e3c220c971c1685ea96ea137daed2ac10845c54d8e6e53c307acdf956f1bdef3868ab53e758c7cbeb4cd02972ba311f998e5f3983000345c8947aa59b78bb301b6ecbe9808ee0de99ed0b938fc19f677997398bd84bcd6f34d5b4ed123d04a093a8f42c1700fa2472f1ecc00957761a2d296bda3d2cbc0f21d8ed4e4fb122b71db1d49a0f516c3402f6046d93de6dae20df7683462557abfbf88437c8678dfa2613b",
1155 	"464121895e5c9d85190bcee0437453dd",
1156 
1157 	"bd34acd613e0e0da6bebc45ba73fefa0bd8aa8ebba34040a07944f29eb63adea527101b8cd960e58d9ecddc0643b5e2d8db55170ace4678892e0a57612c50a4dc0647189f839b9a1229e22e0353dfa707acb7ab893f4ebe8bb910cd14f21b8fb8e77c4f19db027e0cd685d60212e0d920b34e96b774bd54f0a0f4ce2ac5f001b4411c19ac2e3a03b63b454eb30f4ddbac959673260d370e708c32d5030682ad56a99322972ba6eda6be9d027",
1158 	"8e167ceae101ea0b3b98175f66e46b0e",
1159 
1160 	"166b4fec6967c2a25f80c0075379978124833b84894c3cb3a538f649dcee08b8e41707901f6273a128cce964ac1e9b977bb7fe28de8bc2542c6c07109889cea84d34ada6bde8c8f5358afc46b5ef5db3009fe3a2efd860ed0ad6b540595246c27849abf7eafea9e5af42607519f3c51ddbc353bc633afec56aff69a0c953584d8ede684b4faefeb8be7d7db97e32bc1c35abb73ce3ba8425726d89f98e93ed93b67b4c6993ffafb789c1bbda8d",
1161 	"eb2fa0e8e04e698ca511d6abf7de84fb",
1162 
1163 	"62c625d31a400c5ff092d6fd638f1ea911ad912f2aabffea2377b1d2af4efeb6eb2519c5d8482d530f41acdab0fbe43f9c27d357e4df3caa8189fa7745ff95f811ed13e6497a1040852a1149890216d078ee6eb34461cfa6693ba631dbefacf83ce5ba3f531ddeadba16ae50d6eedce20cca0b4b3278e16644535e0859676c3fd5d6b7d7df7bbe2316cc2bfa7f055fffc2835225976d9a737b9ac905a7affc544288b1b7d6dad92901162f4c6d90",
1164 	"bb0acc4423c1d8cfc788e748ade8d5fd",
1165 
1166 	"8af63bbe701b84ff9b0c9d2fd830e28b7d557af3fcf4874bb7b69f2116388090d70bff64a600427eeea22f7bee0324900fbce9b8752fe312d40f8a8485231da5d94694daadb3d6bf3e7f2cc83f67f52829cc9cf1d3fcc87d42b3d20ec2e27cb135aee068acbca68734ac7a5ff3e3bd1a738e7be63de39e56aaaa6104f6fd077c964ccc55cba41ca1783003883100e52f94096fdfdc6dcd63b3fd1db148fc24cda22640eb34f19ed4b113ad8a2144d3",
1167 	"4a824cae0f236eab147bd6ebf66eafc2",
1168 
1169 	"a8c0f0e4afcda47e02afaaa2357c589e6b94168a6f6f142b019938186efa5b1b645bb4da032694b7376d54f4462e8c1ba5d6869d1003f3b9d98edc9f81c9dbd685058adb7a583c0b5c9debc224bb72c5982bfcdd67b4bdc57579e0467436c0a1b4c75a2d3cea034119455654f6ab7163ed9b61949d09da187d612b556fca724599a80c1970645023156f7df2e584f0bf4c2e9b08d98bb27a984fa7149c0b598adbb089e73f4f8d77f92248e419d0599f",
1170 	"4800f8f5e598a26ee05a0ea141f849d0",
1171 
1172 	"a035c12af3fb705602540bd0f4a00395e1625edf2d44af4a145b463585aba46b34ee3203eb9132842000f54dcd234e347c28486ea18414af2d3445916049403adfa3ed3906fdb3b27f2aa4bb149df405c12fb0bf0e1dacb79c50bec3fde2295fc8dd5c97ed46dd28475a80e27017dc50d9feff9b1a1861ac86371791037e49221923e6e44874962d9f18f1898a98ee5dec1e9eca6d7c1ad4166fbac41b2587caf7fef3e7be90c80aafed5f7a0928127321",
1173 	"2d124d81a4a45ad9c0b91cca23cc2991",
1174 
1175 	"d41739834414a0792470d53dee0f3f6c5a197314d3a14d75278440048294eab69df6eb7a33c9f807b5082bd93eb29d76c92837f6a2d6c5c21a154c9c7f509ee04b662b099c501a76e404996fe2997163d1abdd73df019c35e06d45b144f4dbb0462fa13767f12f4e1b2bc605c20ce1b9d96c0c94726af953e154d14cb9c8c8aff719f40c7cf45f15c1445ba6c65215024b316d60435905a686929874c6148e64c4eccd90c3a1d1553d18ff57d6b536c58ec3",
1176 	"551fc7eceeee151523be716538258e2e",
1177 
1178 	"5bbb333460ffac345e4d2bc2dba303ef75b85c57233590fabd22d547bf9e1d7a4ad43a286b2a4618a0bb42559808fd813bea376ceacc07e608167ad1b9ec7d7ae919fd2991464cf63570c7dfb299b61836bd73a29007cf1faa45b1e5539a00514272c35d58bb877526530187afbcf55a6f1757209c50af4eab96c2ab160e6ea75dc8d6ef4bf2bf3e7a4b3a7619db84efede22a0f960e701b14f0f44c89b18f2640017c05ef51bcf93942b8d3775d2980b80435",
1179 	"2c98dce5b1ec5f1f23554a755fac7700",
1180 
1181 	"8040a7296d7553886e5b25c7cf1f64a6a0a143185a83abf5c5813bef18008ec762e9bcc12ab7235552cf67274210b73942ac525f26364af431fc88cc34961169f6bf8872d864f360b9fbc27b18160d0578381db509e72e678402731157555bf9026b1325c1a34c136b863eab9a58ec720cedaa0049bfddb4863d03a6ca65f3dd4f9465c32b9db4d52f19e39f10ffdfe8c475032a2fe5e145ff524073d5ed617fa5e387325f7ab50fcf5cba40c2326bcf6a753019",
1182 	"c0bb8427ef0ca4e457d2887878d91310",
1183 
1184 	"cbaceb762e6c2f5f96052d4a681b899b84de459d198b3624bd35b471bdc59655b1405e9a5448b09e93e60941e486ad01d943e164f5655b97be28f75413c0ab08c099bd3650e33316234e8c83c012ad146b331e88fb037667e6e814e69e5f100b20417113c946a1116cc71ed7a3c87119623564d0d26c70dd5cfc75ef03acaea6f8c0e3f96877e0d599d8270635aee25be6d21b0522a82f4149ec8037edaf6b21709c7aafd580daaad00a0fd91fcfe6211d90abef95",
1185 	"626bd9eb0982b6db884d38e8c234854e",
1186 
1187 	"1bbee570394bc18d0f8713c7149cabb84e0567dd184510e922d97f5fb96b045f494808c02014f06074bd45b8a8ad12b4cb448ec16285fb27670fce99914f100ad6f504c32fa40ab39beec306667f76f9ab98b3ec18c036b8f1b60d4457a9fe53cbab23a0ee64d72d8a03d6d8d67a9f2ff6eb1d85c25d8746c8b4858794e094e12f54ab80e5ba1f774be5c456810755ffb52415b5e8c6b776f5f37b8bcf5c9b5d0ad7e58a9d0fa938e67ad5aaee8c5f11ef2be3a41362",
1188 	"a489ab3eb43f65ffbd4d4c34169ee762",
1189 
1190 	"aeacffca0e87bfdb2e6e74bfb67c9c90a8b6fb918b9be164cafcab7d570d8cd693bd8ee47243d3cbdaf921ce4d6e9e09c8b6d762eb0507bd597d976f6243e1f5e0d839e75ea72e2780da0d5e9f72a7a9b397548f762c3837c6a7c5d74b2081705ba70ab91adb5758e6b94058f2b141d830ff7b007538fb3ad8233f9e5bcbf6adcdd20843ee08d6c7d53cc3a58f53f3fe0997539e2f51d92e56990daad76dc816fd013b6d225634db140e9d2bbe7f45830406e44fee9d59",
1191 	"4eaa27b085d08fc6a7473e672ea2ca1b",
1192 
1193 	"a22314d2173ca4d53897924c4b395f0ae52c7fff4880525cee9055f866879af35f22759903b779898676a216feefd4ed75d484f83c00b58383b9279e2732cbc2cb5479b72abee5b4ab0bd0c937537b7a47f461ad419225c6045cca10c191225f0e4389f3355cd3a0d2de822c9d6f3cf984147de3fd3d8a6c9a02a617ddac87114f770b16cc96289321782108d94a00b153bd40651809cabe6c32237a2389e321b67769e89676cdd6c060162592ecadebdd7512fa3bfece04",
1194 	"eea88229becc3608df892998b80cf57b",
1195 
1196 	"f99bba3e3b14c8de38c8edecd9c983aa641320a251130f45596a00d2cfeefe7933f1a2c105c78627d782fd07a60001c06a286d14ec706dcdd8a232a613e1ea684ee7ef54dc903ec1c09c2c060bb0549a659fd47ae9e8b9cb3680b7c1c2d11ebf720209c06879d8f51d9ee1afafe263807c01bb9def83db879a89f7eb85c681c6c6cc58cc52893d0b131186cc3b9e16bad7d48c46a74abb492d475beb04c9fdc573cc454242c8534bcc7c822356ea558f9fa3ae3bb844415916",
1197 	"5109746cb7a61482e6e28de02db1a4a5",
1198 
1199 	"564da8460dc0c3d20b1fda3628349a399ba52446b5d3626fd0039ab282bc437b166f186b3c5e6c58ffb6bd95f8fe8b73c1b56a07ad37572eb6e148cfb7750760dcc03fac567ad7d3536d80922dda8ac4e118fc29c47ee3677183ea4e06242b6090864591c3ddaf4bef8c4cb52f8e3f35e4140034616faf21e831a9b8d68f5a841a0a52a2eb4f9ac9bb5b488766e251cdb0f29faeeed463640333ad948e7f3ad362948c68379740539f219d8f3ba069952efa0021d273a738aad0",
1200 	"f43552da8b2623a130196e70a770230d",
1201 
1202 	"8a54e8bf30eeb2e098955f2eef10af3c0a32391656fdff82120e4785bb35a629c8635e7e98c9eadfa93ed6760ae1d40313000dd85339b528cadfe28258a09e9976643a462477e6d022eb7f6a6338a8fdbf261c28e8ed43869f9a032f28b4d881fb202720bc42cf3b6d650211e35d53b4766a0f0dfd60d121fa05519211bb7d69bf5fcb124870cda8f17406747097fcb0a1968e907adb888341ea75b6fcfbb4d92ae8ce27b04a07a016df3399f330cb77a67040b847a68f33de0f16",
1203 	"c51c6e34cef091a05dfcf30d45b21536",
1204 
1205 	"2a64753a74d768b82c5638a0b24ef0da181bc7d6e2c4ffdb0ae50d9c48ecfa0d90880974db5f9ac32a004e25c8186cd7d0e88439f0f652256c03e47f663eff0d5cb7c089f2167ff5f28df82f910badc5f4b3860af28cbb6a1c7af3fafa6dae5398d8e0a14165def78be77ee6948f7a4d8a64167271ed0352203082368de1cd874bd3b2e351b28170fdf42871590d9d179ce27c99f481f287820fd95ba60124517e907e78a9662e09519e3ef868ebdcca311700a603b04fae4afe4090",
1206 	"2d2ee67938422ae12f8cfa8b2e744577",
1207 
1208 	"a7d645b70f27f01617e76abc2ae514164f18d6fd4f3464e71a7fc05a67e101a79b3b52d4ecfa3ddac6ec2a116d5222e8e536d9d90fffec9c1442679b06db8aa7c53dcde92006211b3dd779f83b6289f015c4cd21ca16ce83bb3ea162540bb012ee82bddef4722341454f5f59da3cd098a96abbbdc9a19202d61c7697979afa50deb22a9bb067ccb4a6fce51c930a7f4767cfaa9454c9c1832f83ee2318b0f0c95d761c079c0ca2dc28871229aef11f64199ca290b2b5e26d8c1c12ec1f",
1209 	"ec989e0290fc737952de37dd1ebc01c6",
1210 
1211 	"3436fe321f2a41478164b8b408a7a8f54ff2a79cb2020bf36118a2e3b3fca414bd42e55624cc4f402f909016209b10f0c55626194a098bb6519d0fa844a68ab3eaa116df39797b1e6c51eb30557df0c4f3d1a2e0471f1d8264fb3288c6c15dcde4daf795083aad2b5f2d31c84c542fb702ea83b7524ca9a1c1b9754ade5604abd375f23f3916cdad31aecaa7b028b7121a2a316713991759925f3fb8366c6795defa6ea77416c4ed095c1f9527026f1d621815b8310d4ff3fc76f798760b",
1212 	"bb5e48212442ad7ae83697092024c22b",
1213 
1214 	"01bdb4f89f84b728a9d6b3a03f60709900571c1a2a0f912702cad73677ceeae202babde3d0197e3e23381cb9f6350792e05937703aa76f9a84b5c36705bb58f6b2ea6b1e51ff94a8de174cbc2ec5ae9ad2627a8b3ea45f162b727a7639f71a4cd9f6c6926a5d81d0a21c4c923037ed199f1aef517e2eea03bea9044c5baab84e3f85d625635bcb1c37ef232144b44c770f2b9dab416b96c906016acfb3fbba62ab40a4c08323fcf66437d953b164541cea3a8c81d186eed0cb23b3e98813a9",
1215 	"8bb7ffa4572616f3bc7c33bd70bbcd59",
1216 
1217 	"9ae51ed483306c9a5a6db027f03cd4472cf3a71df5f1e11852306123d01ab81c259eeb88128275858efb8cff207ba5278dca3a21b358cbfdb5d223e958f3dca5ad9d2537f128c3dfb1fa564d3157de120f7b7d5524e67fc7abf897d9a5bd6b2c7c0a5348e6c95e920c919778ec7a86effb2ff91f0f44045c7dca46597e216e98d80efe25ba0d4f84e7e9d5e81689a5a6990d34e83e1a62a67371b7d2adc7ecd30ad1ad35359e9d9f8a299b057a2f441e313eb819770fa18cd41572adf856edc4",
1218 	"e7f66f49f70d506a9b5508cc50f65cf2",
1219 
1220 	"899c81ea1162514ea7a2d3487d0efcc4648a3067f891131918d59cc19a266b4f3c955c00ddd95cddedf27b86220c432d6ca548e52cf2011da17fd667a2177a7f93e37b8892d51898f1485277e9e046a48cb8b999fcbcf550db53d40602421a3f76cd070a971e2d869beb80a53b54ac30ac0aab0cd1b696bbaf99bb25216ff199cd9a280f567c44b0d4252c98812e1ddab4e445c414aa8d650598b64d6768a7948093051e36b7051c823c7ed6213743a98d8eaf4b2b5e8157c699ea053cf4e53877",
1221 	"52173b139c76a744b7a4d2221d4178c4",
1222 
1223 	"e50422869373abac1c26e738fb3ccb577b65975a7998ba096b04ef3aa148ada2cbe6beeabcf52d056d1766c245ab999d97445fdb6d59a0d6843eb4959752c89fe07b8411ddcfebef509482b8896bb43de7c875b29da52606b278b8704c62154b2da9bb237e68aa10cb85814250e4e4de73da200991e51241fd9a45f446de5a4bb959ad4727283510e9d2ac8a207ef0284163aa05d27f2d316e8ca1480f30604a8d74a0a661775398af644bb584a1a2c55c4959d0e7dd3f7c0c3614962fbeefeeafe0",
1224 	"f4c517a82c850c3c4c96d23a8f3106b8",
1225 
1226 	"066febbe205ea342cde69fd4c72889442e14a5977d886252bdbc2ff5f8dd8fc5f1f870ce121ab929a6b6227b484648be9b3501443cfdecf8f58d4de834ed1800bb244c18985a8232583ac6fc789aa59d1c5e87ad03994085bbf6e1ba1157d4e4ccbb28a49b6529e54b3b34613d6cc9671855e2dcbba6838176c093737962eaf88c85ab780184d4cae78013b28103dca7f7e3b8d94a6ae0728db30a1c535783c4644a7e9eb4ffac6a95d30cf52ba805e220d0b2aa9a2e7de26a97efbd877ec6d1bad148",
1227 	"bac7162dc8328911fa639f26ba952ab0",
1228 
1229 	"ccf92b17b9cf0d8577c1f3db9c19d3c86f16bab4058611f6aa97204783ebd07671eab55e375c4b16e03780675bb5738369aa7cf3b9156cd250f516392f5e0efa30cbb09132b66457756621f947093029e10233938c846513086023252d1bac9dd3442598f004e0b200f7dd79aa3a9122a0c6e77bc7fc8521988050f3c64b32c620fc1b5bba6f458e4791bdcfca731fd66e9da093b1a45264c8ffa48b3f1628dfe19c9ac1d71f1d5214ddc7e4f0da60ae122f67c394a55645628228d5e3a3174fdccbaab4",
1230 	"19a9eadf9c7c000fe340603f27bd830b",
1231 
1232 	"a37dcfab50a317e6a7cc51524b5d611a53652b59fc7df0229af3dac4d527d54c1134a14b2ed325d9727d07d9c3d0797f1a34561034be6de98b551dc384132235eaedae7a9b97bb7581a2a0f2c4e8e32f3e294f9b30f646dd33ce58187188146e14f01dc3ffb581c3bc834726b66c4732a98c3f8256ed22077ba8b34c024d53fe798517abc2f61eca0c6722fc02254c9141a54d4e106aaa6d4b2957e6a12c88ed00f4c4bc4c223b92579859fc0edb9b53f0bba286c53786198c9b6c6eb5eb5b4490844b7d06",
1233 	"b9e1455d06233d14b8d3020441351a76",
1234 
1235 	"0248b909e1f31ee855a03b6c81366757aa3732d2eca0b06a2b1015584c2d8205a4431fcdb02f6a03077ccf368ecb78b3eb78664b3c7ac157088b6cf9758adda4bc1d2cdedb9a69448a2833cf6f21865795bbd5551be859ed297aa82c288b898e331c07c3c8fcc4b2c4ec90bf8e003a499248a677f1b020357625f079cdf92fcbef89d904e11d23569e0f0e8c52303c93c867023a269bc036d8d36d69ca9c7664daacc92a8dc42c3600dbd4c02278333d216011252271def835ce4783883c0760dbcc00bc33bb",
1236 	"ea4606777e21f27d4ae860b3c25283b7",
1237 
1238 	"ce283768aa91488c75c71ee80a4df9495377b6a9ae3351a5962aa8317f08818a0117cf6c391331866d3abc2beea2fa4a43cf32a08385ea2c03dbabe3319104a6c0a3d171061ebed5a23306a8618a81fb63d9dd4c79b42bfdd2a79e05d78290e653f4c6dfd75bf5625ddb85c82bad9444faba3e1558691c004bb50afe37822e320131361d7572e015e559c0f313b53e0d529dde64e74bc41eb52e77361a3ae5721483a795a80a87d684d63f92e347843eb1a8439fef032b3d5a396b154751bd8ed211a3ae37cbf0",
1239 	"dca4d5f9f9b7f8011f4c2f547ce42847",
1240 
1241 	"19265f48c1ea240990847dc15d8198785d55ea6243ef7012ac903beabbdc2bd60032fb3a9f397d28aebb27d7deb7cf505eb1b36bfc4dbcfa8e1c044490b695b50e0974d3c5f0de748508d12ed9bfce10eaadde8fa128d3c30c12d0d403f60baf0b53d2fd7a38cc55dc1182b096c11d1ec9f171b879a73bd6ef1aa7825bc5162cbeba1d9f0739d1337c8142445ce645e4c32477cdcdf37e99fedb9236e24a3d94f0e45ea0b41a74762efe19d27555cdc89feef5b6e533237603fe98d8deae084f69799deac9043e86",
1242 	"688e532e15bde53b0b652291edfb7681",
1243 
1244 	"1080391fa810c50c7437ec058459d3a8cd23c33071c187474151151c809871b6eaf4cf88f592f84557e1eef5c847d3490912072b25b1919af724c0b5ecb111150bd95460328a0b1ba29613c0bd6486110fe6dfab8cca5fde18f5b0bc4d2dc970781511d2e45fc7385c3da18eeb18b3a9e68593d82c75bbbcadab2e5a29745f6f3a924e039579f4418dbee186d9cc24b896d96bd990186bdcbd3082b70aee9bb95a36531ecc405ae13d011bd10fe69fe728c8aed73d1d38e5506bf4fa770347f7e0eb6749121cc0be75",
1245 	"cbf8ee5d477630dac9457a9a0659497d",
1246 
1247 	"0a13ad2c7a239b4ba73ea6592ae84ea9",
1248 	"5feaf99c15f48851943ff9baa6e5055d8377f0dd347aa4dbece51ad3a6d9ce0c01aee9fe2260b80a4673a909b532adcdd1e421c32d6460535b5fe392a58d2634979a5a104d6c470aa3306c400b061db91c463b2848297bca2bc26d1864ba49d7ff949ebca50fbf79a5e63716dc82b600bd52ca7437ed774d169f6bf02e46487956fba2230f34cd2a0485484d",
1249 
1250 	NULL
1251 };
1252 
1253 /*
1254  * Known-answer test vectors for SHAKE256, from the NIST validation test
1255  * suite. Each vector is a pair (input,output).
1256  */
1257 static const char *const KAT_SHAKE256[] = {
1258 	"389fe2a4eecdab928818c1aa6f14fabd41b8ff1a246247b05b1b4672171ce1008f922683529f3ad8dca192f268b66679068063b7ed25a1b5129ad4a1fa22c673cc1105d1aad6d82f4138783a9fe07d77451897277ed27e6fefec2cb56eb2494d18a5e7559d7b6fdddf66db4cbc9926fe270901327e70c8241798b4761dd652d49ad434d8d4",
1259 	"50717d9da0d528c3da799a3307ec74fc086a7d45acfb157774ac28e01ecc74f7",
1260 
1261 	"719effd45ed3a8394bf6c49b43f35879176a598601bd6f598867f966a38f512d21dc51b1488c162cbdc00301a41a09f2078a26937c652cfe02b8c4c92ddbb23583495ba825ae845eb2425c5b6856bda48c2cafae0c0c2e1764942d94be50da2b5d8b24a23b647a37f124d691d8cefbf76ef8fbc0fbdafb0a74a53aaf9f165075784ab485d4d4",
1262 	"6881babbb48e9eea72eeb3524db56e4efc323f3350b6be3cdb1f9c6826e359da",
1263 
1264 	"362f1eb00b37a9613b1ae82b90452579d42f8b1f9ede95f86badc6cdf04c9b79af08be4bc94d7cac136979026b92a2d44d2b642ea1431b47d75fce61367919f171486a007cc271d19de0d1c4c6a11c7a2251fe3aee0bb8938a7dd043d0eb0758a4768c95cc9f6f1703075839487879b47c29c10b2c3e5326ac8f363c65aa4ef76f1b8bd363eb60",
1265 	"c6ce60c1852ea780ed845aac4ca6a30e09f5c0064c9675865178717cfeb1dc97",
1266 
1267 	"d8f12b97f81d47aebbfb7314ff04172cf2be71c3778e238bcccdeecb691fbd542b00e5b7b1a0abb507f107f781fea700ea7e375fdea9e029754a0ea62216774bda3c59e8783d022360fe9625621c0d93e27f7bc03632942150716f019d048a752ccc0f93139c55df0f4aaa066a0550cf22e8c54e47d0475ba56b9842a392ffbc6bd98f1e4b64abd1",
1268 	"e2e1c432dd07c2ee89a78f31211c92eeb5306c4fa4db93c4e5cd43080d6079e4",
1269 
1270 	"a10d05d7e51e75dc150f640ec4722837220b86df2a3580ca1c826ec22ea250977e8663634cc4f212663e6f22e3ffc2a81465e194b885a1356fcbcc0072e1738d80d285e21c70a1f4f5f3296ba6e298a69f3715ff63be4850f5be6cb68cdba5948e3b94dbbce82989aa75b97073e55139aac849a894a71c2294a2776ce6588fb59007b8d796f434da6e",
1271 	"02f17bf86dc7b7f9c3fb96e4b3a10ca574cd0f8dedda50f3dda8008ce9e8fec9",
1272 
1273 	"152009657b680243c03af091d05cce6d1e0c3220a1f178ae1c521daba386694f5bab51cd819b9be1ae1c43a859571eb59d8cbd613c039462e5465ba0b28db544f57a10113406ccf772bc9fe5b02538e0b483225209c1eca447ab870e955befae6bf30dd89d92ddae9580ccf0dfac6415ec592a9a0f14c79acce9679f52d65fb8468012cbc225152d9ed2",
1274 	"b341f4114eee547eddeb2e7363b11d1e31d5e1eb5c18ea702b9d96b404938bad",
1275 
1276 	"eaf4249b5347c2395104a96d39fbf5322c9af2f8ec6a8c45efdc06a2b246efb5502952ab53b52ed9ca8f25a29cd1789b1b5333eddc29a5fbc76c13456a3eae8c9208c1381d062ff60a061da5d26cec73fb7a6a43eace4953f92cd01bc97ed078da19da095842afd938f1f83f84d53703f397fec2bd635f94ada5a3eb78103ebf4de503e8ad7295cb7dd91e",
1277 	"d14c7422c0832687786f1722f69c81fbe25b5889886bf85c7c7271bf7575517b",
1278 
1279 	"a03e55ee76150a6498634099ae418184228320bc838dbfe8276913761516ec9021226f4b597ba622a0823ca499618169c79eb44af2f182d1cc53caefd458a3ed7bbea0a5854653f2b3c20f659f70f23ae786238a8d0e59c29ef49d53125e50abf43b6f65c31f16bc174e43468717dddfcb63f5e21e8d4ba0e674140a97cffab1d5c165f1d9aef968154c60ad",
1280 	"fa889888d3b984c1577fe7c38ca86f0df859291502fe0b2f6e82c778babff377",
1281 
1282 	"2fb4178a0af42b155a739e2910b004e0781c1bca697ca479bf8e71430aefc043883cc7a151779013d2ad07a47cd652b5bdfd604130a1c565115ac51ff3c0ae56b5886c1ab2f0572e385e4fc33c430b874b46aedec49f9b6f45c08be3633bdde99ee02d7e9325276b74cc9d0fb6bfd85e093f2c2a8d3dcfa24308ec18c229f2072b8b32545ee0a9d46e3f1a0f53",
1283 	"254a115343d0ebd865e5d3ff6c61c3f9b65fe96ea92865a5681b1f1f0d1b00e9",
1284 
1285 	"dd344dd531f415a590a9c1838f242af8605bc0c29c1a71283ff5cd8af581683c94c48095e9e9e042b73804e0fd467ecb78699930696f3b6a9890108b99a0e4384e8a51bbadf99b53c358d8cef9fd545a97a13399861458f35a2e86309009c546136d086f058c0c7fbdf083750cb17250c5ebd8247c6f906c8db978a26123d30dec58ecdb7a0afd6face84efcbdca",
1286 	"2d56bef53fde76ef9849f97be2ed22d3c3d10f23b049eca2a8aba0d1fec33119",
1287 
1288 	"353111e447fee6f0bd05d562f30626ab9fb06384a620c49034a5eb3c0bc6d1eb1b86015053e6041ab8ac1cd7b4633512b0a318bfe592e2da6eabb44aa2bead0ba238158c2ea5db56bd7342efccf9d7fe76b8a6af45e0ad594816915f65749054f1d1b7627e4355ecf4e3af72e4d0f5b51877751c6f110f57e86ce942fcef640c31d94e98ecc959238683cb28a3f178",
1289 	"11b27034db724b46882a3086815a835947d19322885e08595be271c511ef783d",
1290 
1291 	"c4e5a5afa1c7d2edd5a21db8b4891ed53c926131f82c69d323b3f410114281fecbc9102bfa5f298e06d91fbd7e9b9661bbae43e7c013f3796557cf2db568de7c94a7cbf5a53ee9326ab4740cadbf1a0b1f59b92040156b977eb4c047a1f34a0c66a85f776a0d1ac34a5ca30b099cb0bbb2ba4c453edbd815b7f14fc69e8cce968bf453171374c428eef8342459db6359",
1292 	"f1ebe75725c26b82ffb59c5a577edaa2f24e49c9070cb9ca007e65938f33dae4",
1293 
1294 	"3b79da982ac5f2a0646374472826361c9d2d2e481414db678e67e0967e5cf3cdd0c1f570293362207191ecd78fb063347350d8135a4f02614d1de12feb70a0046939c078d7d673fea589460265290334d217d6231274ae0d3891e6f50da725f710c983d9bb16ede20833caef34f9dec3c36a6f9fc4eaa71256ac3a136b6a494dcc5985ba5e5c9773a377c0c78387bc8a4d",
1295 	"1fc7c4802141e2db7a9199c747d885a72d8f068262863843c9f4cbb19db38994",
1296 
1297 	"cf9552db2edd8947fd7fbbb2f7189a578343e742891ae6fb85fa0f64da8706e468f0cdc5607539db5726a2679aeddf3ac2ce711e886eff71dad203132e6ac283164e814414c7f686b011fd02c95f8c262920e9725c811a22c1339e0de16e5acd0036d620f2dda98e30c9324c2b778961e0c0b507ad5b205463a448199c9bb60b4f303420a1be3b3cfed5ab0d693cbe331036",
1298 	"b51adb0c2375c9d302ba61859040fa4bfa0091275eec1053fc13950aae706c25",
1299 
1300 	"4ebc9225da5f168c07ef62f621d742cd7c71bbd063269f5e51d65ef164791fe90e070f8b0e96f9499ec21843ee52290fd219c3b5b719ebfedcefe4efbf6b4490d57e4df27d59796f37d35734110b96fd634f5f20bc3de9cd1c28479464be84270ae7f16211f0be8839e8c8d0734ab22097dd371859d9be527a4b2fe83bba0637170ba6e3b1a2ef1c0cca121ffa57a4ffd78af2",
1301 	"54a3fd90ae00dfc77644ca16b4964c3b32a4641c5305704ee25d9f8fdbfb5c7f",
1302 
1303 	"a83f74dcbb48d679db402433020e33dacfa2c37f1e39b2d9dcdc70e81a2ab3d75f586c274376f90a39f49c0dad642cfa4f810afdae7157050847646d60cc6adcd27f7c6a24dab9049dd7c6111ab37c555ef2dd16aaa34d7e8de5ff41feaaad80a8bb8cec85fd7f2eaef28a8772828ab3a5fc24143a58fc0c15bf27ab1a4de28a8a1584f68f65b151154cd1b6dc5ac0dccba7c73d",
1304 	"5d084841c35b1cd9c43082746960ff5bb2d3de78f9bfdd80dc9ca4f5eae2a66d",
1305 
1306 	"734f872c431ab145706b7517e496a3be98bca885fca0105a99b54980f47caa84b60cb3720bf29748483cf7abd0d1f1d9380459dfa968460c86e5d1a54f0b19dac6a78bf9509460e29dd466bb8bdf04e5483b782eb74d6448166f897add43d295e946942ad9a814fab95b4aaede6ae4c8108c8edaeff971f58f7cf96566c9dc9b6812586b70d5bc78e2f829ec8e179a6cd81d224b16",
1307 	"14ec5a3c2ad919aa0f0492f206710347e742e7a58d6fdfd4b2c93dc2183b7b6f",
1308 
1309 	"10112498600da6e925d54d3e8cb0cdc90d0488b243d404b9fb879d1c8beb77bb6579b77aebdbf3e785abe61df17e69e8db219f29ae226f7ca9923719350abef876ec6b3920ebb5c28ccedb2a0b70d5d67a0c8a6116b74341922e60a867d24aa96cf1a89ca647d6c361c5922e7f91f9db114db322249c6a50dde28093c94c01166e11d66c26f73c322d1875f0f8e6bd41c86d803480d8",
1310 	"c9a88a3f221a857cc994a858f7cb4567979ada7834a265278e55de04c1fe496a",
1311 
1312 	"6969a27ad5d0aae6479b2b044bb4b043642375ff503ccb538e17be2f1e41f6aa88b1db991ffefd6087cfb20875920192b671be8b7381f7e1b33d8ff5213429f110fe475cbc74b3ecd2211f9b33f308fcf536e0d0abc36bd5e7756adefddd7728093730ec339c97313179b9e40e3f8e2a2a5c21f5836bf0d632a7961239a6a7f77b44dc700cdd70d8abbfc90c8dde5bc45dcaca2380df4e",
1313 	"bcdec7a8776380df27a4613cb50b7221995d3f752fa55691798ac2dfa0b15599",
1314 
1315 	"163cf8e89b260a81a3d6e4787587a304b35eab8b84faebcef14c626290a9e15f601d135cf503bc9ad5d23e7f213a6146787053f618c6ee90467e3a8df1e03387928acc375608339f7fa45788077fa82f87e11d3c58ce7cf3f8dad6aeaf3e508b722a2a62075df9fa6af4377c707ffe27aa5a11468c3b1c5fce073dae13eac2d1c9a635c5502b96115e69e741a262ee96a78336fcfc34573c",
1316 	"181d10fa5a58ca57077be52eda53910135087312ca7711084e4a5213c81cb4a2",
1317 
1318 	"3a023141ab4db8b08c5cb6792ad97abdf0116d512ea8f4141a8b987f1527657d2fd98f7deca55cc6492a3d0bfad53e40f656a1ac3550c63eb8554f24cb11819a87c5ec009af84e304b69b50eb847e46162a4f8e1ec284b902002994e332461a84ab08ef23cad57959aff64a9ed9632c73ee5b818dc964bb2597cbf25d6c9cf508081be7a5b2e3f9e3fd69305202af11a92002a7b8b038d4c6b",
1319 	"b75b698857675f8aff2b482ac437925af3ea86198484cbc87b60e6dacb13e7e8",
1320 
1321 	"2fd7ed70c6946b11c819775fd45bc0924c02e131ab6d4a3618f67e6d3b77801d4f0d87ea781bf9fa57929757dc70f5945c872eb4e480d547cc1f2fd68fc99f81da4361e7e2bc7b46fb0ef1e3674139ad6b50ee1da830c960a90fccb8b9dac020f701e22fac7eda3edb14eccd1ad47223a1e68a35a1860cc9d74dbfdb60b2cc40cfd072897d6afc2a202cf0dc9f338a3f25d068c4758987ca7d61",
1322 	"85c9275ec610ffbcd7f785c0ad24b7700b32ee352e6720f1ea2305bdb7f45277",
1323 
1324 	"cecb838187223873bab25205a54dadb1ab5a633958cbef3aa04f930467c8f7a947ff12548d964ddc843fe699f72c9377f1c76948c7a2fb5f58b1c65a94b7cd3f3bfe80cbe74be2064d11eb1bc0e52b67f732b1d00f2e2b58d30c4ff13c7479943430958d9f283f199c9029320860bdaa450404773955c74e99c9f47367e642cfb9fd1843bd14ac3cfa246887d885916763a62ae54c011668304e7e",
1325 	"3a5dd05e009e7f985a2668885dd0ea30c5502a1b5c575db6a4c1149c2e6229c1",
1326 
1327 	"283dfdb2e1dc081e3c2b377ba5bc6491cc4af08c40fbfa5e3fe2d45fcdc8b736032cb5fdaa88f0a008d60a86fa53dc7443836bae2475175f2d48163a52ee216241306d87f3f2dd5281b976043a6a135af2555ab39c71ee741ce9e6ac56d87ff48b510d9ae5a338fe50db643b8c8a710a80c8a5e4d278e667b4ce2dfb010f37b588987e7ca822676a1d44bd7419395e4e96e43489eb1167ff9efed170",
1328 	"5643c4252210fd45a2a67cd0a97d37e80d1b4a3c2fc86b0c3a3b4d3c1723b9ec",
1329 
1330 	"f32d2e50e8d5df7ce59a9d60255a19f48bffe790e3b1e0ba6b4bc53d920b257bff8d8003d5faac66367d784706f690b2f1f3a0afafdcbc16866d00a41169734f418d31d7a1c3ca9ede99e5b986f1294710fa5d011d5fcd13fdbef02b755b49cfbf168bf3d39a00cbe5d82bde2fb4ad5cf0fd65b1b5a3db5ad724dff745486da2830ed480f3e61795542094dd88a5e3989ae501e5ff10ae921c89133309",
1331 	"1ead94e30440b647d4cb4d7b3ed6b87ac07e8d72b3e5f28352bf14a78232ff1d",
1332 
1333 	"8bbc18eab6bcd9a3d6b90ec56d3be949e02a8866d69c7808e1ec787e600c7f72a41c001f513b6cbe079df94142dda2447f956e41a12df60392f0215d2d65331b5cdc06397d4796530b4bc45d7a975394627537b4e09e0f6c3a53f00fc1a9648cfc25b2a00288604a28ecf780dc100620d1f169295d9acb2b1f3c6afce4811aadcb1e8dbca8a8d18ba7a81a1132f1c2d014318e07dec7332889d4198c5e95",
1334 	"429f15c653f92734bfe4d1749e84da8c28861b70c5158bf59809ece810221774",
1335 
1336 	"a3d0eecfeff88df1cdd1e86df7bd2ec3ba60bcedfc9c42ef7dc021b05dfc1808df19201a6c6694e4dbf69514ef08ad1d21c7b28ba034ee9397607cefaedef5e9d3784db53a21f703a22b50d5dbba3a8e8579074c1a8b9a782fc5c89cf61a047408563c476110fe77acd9df58c2ba1d3e6dde83da718b8dc6cd57cd5e3e988dd2051cb679ea1af16881690b44acf09e54615eeedaad1b11a4f97e53de8d40d8",
1337 	"afccfd3b18f6d292d2e125884b721b3e3099c4dac8aef05ab0fba26799043d02",
1338 
1339 	"2ecb657808b29574b020545fb7f94071406047ef4de20c003cf08cbd91930187f55b079d7f99fded33cdae2bc8623021af990d4650c4a19197b4c38faf74a8b40d3803efb1907180a8e1150ed6167ff4f293d3ddd26a2790e9d22c0d0ed511d87e48a4952500bbd51943d230687df5941334e1dc5a3e66a43a320f5c351c059c517531b76352a1938ddb2db806ff5aa619667e6c71a7257693bcb4a7acb34ca8",
1340 	"c994acd17e08e8efd3ba83915245781e3727bac445672c44e6335e4f7deaf90b",
1341 
1342 	"e649888592d192c5fb59f10560f5f5a7b0ac21739c35dd80f1fe6b5825731c572f7cc4549c476b84e049459aea7fe533fbfaad72b79a89e77d1addb6f44cbbf5e6a65a5552fec305bc92ced3c84b4d95074387c71184e875d413f65c2b2d874cb3d031d0da7d0311383d72f823e296937d8f97bad17a62f29ef1a091f39be8233c01330d5c4c9170fc501b5022ca29f605e6c59220055f2585bcc29e742046432c",
1343 	"88a9aa4b4ffac981d1ef0e8b233cb309695f89211cd4e94d50760909e3cb919c",
1344 
1345 	"816b0bffd99b0f7821e6093ef152723a9cb45f7a082ef8d6bdf72cd33b5aa3c79102f43e2b74199decdd20057d0e227ae4c57945582e2e9653a9b16eeacecdbc5aaedac7e35c35cbd9adede7f83bbf36f8b0453d61416a85a17821885b3757d203fa2560a85c4b4c10dddaac0ae230b700fd2929cc6f94e9ccebe4e9399d284eb46b3ed2227b4366baf54d1b5c0a5d4225358fd240c0940bff8b62592a092a7b978b",
1346 	"c593f3d663c48426ce892f22584d49a3335cce3456194b7b5ee4814fab477fcb",
1347 
1348 	"a10918880cf31a8551af80bcb0d1a6ed71ca42c71e533967ef0fb71c866b7e6ddcca7e5d7cdfa6edef59fbe377c6e7ca00b1d33a530ef8598dd971a2cff995e5386a858f109b012c4615802a1d5e7fe0221d19cf617ed827d8d8cb8d2c8ed81b9b3354a832f1d14a402b371a0a611737c0543b0eb06b82d8ba56eb6304f1ef16ef6b143049a7bf50c4e2493aa69756d8c39f627fa89d9d741a99f9afbfeb81de1a5bec",
1349 	"d557aed03eb7c4c4c8091efdee992c9ad7f8d2e79e9296b40a08acae37868d48",
1350 
1351 	"de7ba70e45c879ad6c90ada6fda071c2b692840f7893eeca9b69ef8285b4357b7b735151b6cb6cddba04365ce3d520ce41e1cb9da681c07ffcc4619ddcb420f55ddbeefd2a06f689d8498cee7643606865a3f8b96aeb5d1301751438f4b34fe02dba655bc80280776d6795a4dd749a56cae1f3abec5a2d4e5183ee9bf5382c0492199eb3b946707022673bc641f0346119a3a4bb555698f895f6d90e06cc1e2835ff814d",
1352 	"06cfdd9cd7ce04abcdbf3121a9ba379505dbbb52f148c9d28ad9b50facf573ab",
1353 
1354 	"6e9a5752ff8ae7c385b088e651ef2543daae1624562052f787c9e0f5d83e8f01a82ce7d3e69b5f55de74d14d52412a3dcd356687346cbcd59e7315b8650bc3907e2a70ab054354b11cc7ac3ff6ec67d22fad22e75f125660eeb1d02a2a75621d969ed92385092e9de8b20102657742c9a91f328afe9a8a60208af9914c03d4719b8f0a838e7656e2ea3cb8dfc66a25ece2927eb93a8dbf9cdb077936f63e82543306ea1347",
1355 	"cb1e8082bb94629f162f20d815bcf3b212007bc049951a29ddb18a1f556bf3d1",
1356 
1357 	"b05007119789d382fa750d2087dde79b37a5459c24522b649ac976b07059cbdf99fcce56f6da94246e0f5ae241ae77dd99068f7863240acb5c99c4906f7d06403eb3b679ff6fcaa389f602d3aea5d7efcc35af149f3d523459f8a104f5498615c8fc2740594f5f4872b16ebb77c9ef19f7ba0b3881a6ede7b97175d2aac731a65e608975ac82395b52c805624423a7a3431e0daeb066c12ca389a9c338fef03a296644dea211",
1358 	"9021fefc1a020cd0c579e3dd67a66dacfabedde9cd36ddfc7d5c5c7c47be2721",
1359 
1360 	"a19909e14ddf9b3c470df6bb604604ad767c38c83b2b747937472b791173c3a10a733dffcae417295f2a71d183ab709a1d3be02a0bd61d811f95338967db44eeb2cf2a2f4f105ef618a418a5b031b831086f653328ddf43c2cb30b698c188638a196199a65cb374a7b61335c6f40a6193e01100a19a6c2536689fb4308935128e0ae5268937d6ccd8e4a0a21484000fbc7da29d8669b4e6dd5004a3c61b36c6676011dc0628ec3",
1361 	"7dcbf4dd9c27fd8340f51c553898502cec53d3bc83198352fc58465625c076a2",
1362 
1363 	"b0dffe4a5f64f612359397e4e070a8fa01296c1d8cee25177104d76a7c154e4279cb62a99d9d7afa21e84f983041f3df030a115b4b437638cfa3d0fa56e7b66fc76be9e18ff7da8f43db6c5f863efacd2eb39c27a20da6fc867572d29bb96017e0e71a5afe1b1dbbe29575a0ac0ec7aac84c95e85af5be4ae0a14458133252230d687e7cb1b04b65483df2c5685a62601aff85053ba2c509234fcff585fb967c96169bb0725f6d75",
1364 	"8e7023d18902a9184a0191f1c7a2b79030e833800baeeb33e2d0673500245dfa",
1365 
1366 	"dda3625c78f733c7df0b5f4987cd30d7207afa40ca07f3b686c0458aea2f62371a3f98a2f3a1e5a0896f0cb9d40fe82ca65b0132e0fe5d87e621992750483855e3763ae2bf98f0acd9201065acf105962c7b88e3fc277490e0f5d6447563440d209271a544a4fef4b86892d578392c1d9a23b8da8448e1d85d82276ac14a3166b9d96472ea8cb47e0c8dba929eb007cad89bb99fe22a4c674312b21f9cc4a56996943cd1191abc54bf",
1367 	"ad83957a387225aad811b0737f582dbe7eb616187a8ba8e09b00db5d0bee4a7b",
1368 
1369 	"5cd623be5b6bf6d1bcb414c826d0f4ce60793791b6d82dae9f9e9b699e50bba266e2850541882d80b2c9edfa59d504421818ff45740f37853e5b9bc67214af0a5f5fd5c00843cc39cbb8765b4001de99643c7923f738ac5922868f865dd3f1cb90759c597843d9e34daa3754a2fd89bd8c0d2e9106fa95149448ff11273587cb414a603759315f6881c6b94b46700d94d8b2a5f86bfdf99ddcc974cf98e47bf4ba09acc273b463afaf35",
1370 	"f754a71e3439760aec2d763751e160d05d3de0809dd4fd6aeef588da8b86a517",
1371 
1372 	"42c0a452e83840ae858c094c044961d5f2195ddb34a21cd1f5ab575be3803ac99b9872dd617688d515cd6da562e756853947c9ab7e8ef85a019b4f1baff6494b0a6f87d5d602234115fe42ee3667e89b8a98112cf72cfdabf01fcb8ea4314938768b0bc2aea5bafa6e67aface78fc021cc525ae60746d1ceac7ff33a2bf8e398c935252a5127f5090650dd69dd28861ee9becf6017a21ccb1b03f0a9aa15bf74eab5fd9727507b75c701f3",
1373 	"d5980482d666dde4f2c3a99b45e523fd6410be999a96ba8c5df397c950605e70",
1374 
1375 	"fece673103322483b85340e991e478c2c15e2d795a98adb5b697b4cf17a733898aaa4ffd11b1add300c9edb7a818740a33286fd8cf82140b0f7f2bde8d5bce94d58b6d697e5015c99a8df1c051d611b2c8c96a4c48a11eba9c08fe1aba2d4d31a617c75d9439e2cb4d4654ead346d52048ea26bb0c1c522a26db346de54639cac6f668c299919f43e09c1f1f78914abd7b32ac0f641c39c3749fd5be55cd1ac6fed1557ed683d1981c395946",
1376 	"17f4b2f60cb364da5e8a62db58e07eb1c44b888c433adc1e62461879cd271463",
1377 
1378 	"a542b2bdf8e04ec2a004cccd2f89e7bfd17ace1ad285c91360ac20e9913e3976a806000494c28b61b9d7ff36f342ad94d8d281d03e949d91fe8f4127f7b2ee1e550bcb13133a47c7be2400727cece45a4e1f95a3922e1269cc22950ca58bb7cb34b9da957d2fc81b3755982ad36dd238b9c8d33dd53a72c452cbe341a5afdca5ce79f730da8b5886add18f06feafbf57a33700430fa003c919f3f56dff08a5d3aab1e88c33353d30a700adad07",
1379 	"50cf700b5b6c802e20da4c1f9b75bd0a6632678212bd0e2418201f3a10389994",
1380 
1381 	"8fa67f49db80f22bc267a70e5636dfbc8a21c83d9691fe4b9c3051068b3fc9e94430e7fdfb712e4ce086e299ff5a104e65d7ceb685b4c46cda8eeb14cd3b9548d85baed5ec2f412810af3d034cd67a75c541f70829f8663c4d8cea3415621fb0954e5b3b756333a69a0a41b402522517f087ca9b4a06eba23f4fd5d02c5c6e07c132769660b50dadc5c07515ec751a1d2fd2cfd8b0855b85f602344fdbd28a37a52e874e73ccd627dbf9628cd1e8",
1382 	"3379265620eb781d6b59e331cc525e60e8c063e19f96cfabb2fda9aa83cdeba5",
1383 
1384 	"23ae9cd31da25c0187c0247be19e089872742d772f73d0efde5889c97b40d12ddbbec35b8f2b1f9c0b3d947708db3f2726306f4dd6ffabe37736f671bfc551835db0825adc6314e2cb479fe41b92497dc8638dcfbc0e3bf6f0b4c03dd418a892f1ad6138ccf442bc0e04cb2ae36a2f80a0340f63a849891190fc719781e0de44dedde95d2783b1121e9fa3b1280cf81af5cc7e7363579c1da03390e68fc5fc806e67a132b5bb6acd413eace2b120ac",
1385 	"a17a00ac106c0af50c4f449d3cdcc2cdbb9848d2d85a36ff434099162e25606c",
1386 
1387 	"3bfa57a5f9f60203059defd501977628908ee42116e4674dc0a52a32c5bac02aeb60c6714cd9c47c5a61558c21648884ccee85f76b637486f3709a698641c54bf5f5eb5b844f0ea0edae628ca73fb2d567710080e8a96c3fe83857fc738ac7b6639f0d8c28bfa617c56a60fd1b8fbdc36afe9ce3151e161fa5e3a71411fb8e123d48762bc093558aea7f950706bb72f8dc7ca3497a2b3ccf345ad3d9eafde10889d76c61d432e3a165d34ad0ee2d9619",
1388 	"1a2cfebf3483c33a5eba84121737d892cf8bd6c3ba324fd4ae4c2db42872e54f",
1389 
1390 	"e9b9525afd5634cf8d16df4ae7e12e8ae206c6ed6e7d4dd96f6fd75accf7a10cc22b023c7f569e4aec88dd51ca519c0a00c922ee33d3559b98a32d79067e6a9d50c182eed125de864841455be751991ea635c163ddbde6031223e2be0fd9f5253885bab81c4b5a4b4a4a00ae66698d8c7c538c9493c068d786f7dc710f90ac6c257f93e1884e7c609aaaf5927021e01d292a6bc87e6643e09b2505da2d2cf639bdb6f3b33cb8ab8fdf690b512d02fa9956",
1391 	"3ff47b4bf4f908aace95b0468a54b7e6644fe07df69ae327c0ff2e45325b97b9",
1392 
1393 	"13ec10c6b27a6ce6fdd5e2314e8626a28a69f313ec62f29b044cde1aff32e61228c252b9affe6a4ca93593a55932bc10aeb3f85b0c1d6c2c506d6c970e72e1f01c3aeede55cad3b1971111f60e1fcf48b5937c691952b691617f6a058ba73decf83b2b5e2b446ebfce52a24bf5b526f1a7f0c5659b6b96713f68208cfe38c2adc3af5361b9d5051c56de8fcc975d8bb48db41c7818cfd574f312d652f08f38dc857dac0e88e55e70379f20a37b7dc4396ec6",
1394 	"9703a69f279ef15b843b355f86b3f7098a46eafcad625920d93e0e3fb136fc5f",
1395 
1396 	"3d8263a177af8c5beabc76a4388e0816ab1bf1f5856e985791f15688feebe4ac6d480fa64999b339575be66d8e7c7435281b8c4ef990b86a00ac128e3c41b6b9c0e573c60af4c69391d408639d7de6815b38122731a6389d4f0534a587af82175ee3f5c963c8acb1bfaf434e0e9946436df9eb46d4bb0038a7842295873c300f6ecaff76fb1e4fdb0a75fef588d87cc486e67f738bd4f8832fb24526e5f0a8e91920f8967bfd96599aada321b4437049cc8836",
1397 	"e82d636a61c7657029699374a2da3dfabfae366e7708c7e4ba2dacd8b786a36f",
1398 
1399 	"01f793fa05548645f644a64ee1b5ff7fd38eaa233f874cd59f3ddf385e86b5e9f601b9b256f2f901864d61988d11c98593d7335543ab4d85731a3e39078c9e3012d5c6f83f064b5e7089c529a46dd5081efe66c8c49932cac5be88b57e674d689f98423389388446fb1f5969ee7029eebd29cbe489f8038edc5148148cbdca77e375b3cafc2fada07038a5c133c3cf21b881eb125c71c6b801fa03bdf9371b472792a3276094ce5417fb32973a0dcf87572d4db8",
1400 	"98bf0fd777137c94300ab5b1bff7b3f487a03a788e6bb96c715ba6f10ba1922b",
1401 
1402 	"71a986d2f662bf36dcbadbba0657f4e2797b569610e2d82271ee6d813f01f6db922a5a4ca405d9e7cddc9dfbb1129294b8c27845bea337250c2f721887045e50288ad513acd6a6be8dce300a308e2f8e600bd585fbf61dd2ebe45c4158ab18101c0f1eae789ecfc205d8bb6fed9371d65a9e94dd2fa5322ff75452851abfcc2357025ea56e24fbfb1d4266b34ee900768fc3dfd6c2761f4716c97d6a36092192c0abbc81f832d372be535b5dbd578576e6c2dbf61d",
1403 	"27255d504a38296857b8d382dc8ad4f1ca03ef3a8d1983e54bc01ef97b04e581",
1404 
1405 	"69ee06f5f53f74c76674751f8fa80efb42f43e71132ae0fc5ec6d2148c21570191e8baf0b9cd3547a57c103690d10d8ed84804d7b9b5cb9d5b35580a0f642abad5d0e5ca23ae3c32e1cc1355b8c7e5d78c7e64af47c6607dd960ea1d7d28b97c3d8ecdaab84a5131234cc6a68ef25e7d687ea62146c76845e02fd0745cd4cdf0d00bbab9020a3eec72e4714e9abb4029743012573d1fac9c798a513937d22ebd962df61f8854ca0ad67c5b7864885282b77df076b436",
1406 	"600b41954a9398ee66ea0e603c8c80d936fbc8be98c74f44ae13b0aa4b50b8d5",
1407 
1408 	"2a74e9800ce49aac07af3df2e451f245d4ffa5304c318574135eb7f39a064bcc8bf66fc8a4c8e2f5c6a9ac90495f0d28938ab301e9292fb78461aa23e87ad482712b1ed42f172983f4977e45aaba7f43ea8a9e7bcb91cc63f89c34cf06bf2a1404995e6e53d9569fb8011bd9af6b32de0289cd669b7043c19698bebd9bdd33ca6bca985cb81751913a70eb14ff790c41030eaa8a00cf7c1987dcaeb650ddd9eccf46326707d902a1a36c56be43ecf7b414a29caea3b55f",
1409 	"4e549f206099a8b3183fa3b86af220b1b6554ac3d8d52c54d093e68f60597256",
1410 
1411 	"5b2e2f2fd3ecc733a6198d34e5d143c176b60c3cc3dac6deafdf99fbce5cd088d583e8da4f01e7b09226f074f24613be345f691a46fb610b2d5855503ec761659152744db3a1a78f9b1fce7fdf584dbe28a52e04e40c701d3a62a13243b2af4a77e3fb106594afd7a84b52db16cf99ca3ad2808305d39a1dc043a52b45e7623e6f7da4accfa2a690a0f3a112fd739ee9522d891e111a8812a6448bc2ac2c234a616997a8579335c36d5fe6acfe0b052358fd715d70a7e104",
1412 	"24a3de94be98126ce95cfd3140754230b6880c71cfe4ec215c3f451bdc8bb690",
1413 
1414 	"013944b7958b6b3686b14bdb042f2f5b42768edc20fdd6a90894692b15f6e5157b9da9de23da95749524102f1bb150032343d6fbe64537e247162243fea59f95f53e95aff2a38f82775fbf06e7574475e9a2a8b8119aad1ebe3349543e8cef9239c410124c0fe2c6f409604aae4a92185c3a0efbeb26bfc63394e5451ed45d740dd823ef774615aad3caf9e2b9b1c25344b40facba11f5406fe1fefee6a571a33a22d42ebc6fb094de4c94b650b55c9068b7b3b3c783d7f53a",
1415 	"009661924d01ad811d4c598580eb954362b8554c5e9cd13686acbe41ac8c3940",
1416 
1417 	"72c2880163482bbe822cf72ff0e02be7081d271b366fd94c0cf37926925f76a9de44b086e590e7cc915773c314d336187ba9d03b866d1106b769b49fa99a4a9fa3fc74746d085504627a4792c757cde65b2fcaa82f9ff00eb81b7ab723ea1ed6e8723d92a2b65ead1e1dda64b275d897d0377c2ada0d5cab38913435a958da94d62f74a92da4e810ecc994017c344074014a50892fbe3e265f5448e2e2eb662295ba7f81b5dadc76f504dd31ce9debc517efad8cd5ba7fc754eb",
1418 	"77cf32d62a3d0622cd90f7c858ce1ae3bda60f9edc9cf50f7ecc9d7253d8d18d",
1419 
1420 	"c6dad2ff2cba3ed8873955178068b5704cbccf1e8c62eed472d275f726a7670a68ae2d6a763d943b30c616a27aab5a34e254feaf838093e828d8e905b5ca8decc39491fc8b9f8bfa050fe04e5198436f5593789ca8515ecdaeaf2ce905eafb3920b5851d32892cfd4e3d3e83ccd67707eea0c74bc47e56694c7ec609deb0b8d7c739913535a37e2c5377b5a9b40efee6f5a472269eae83a54a6d3dcf08c4ccb000473dac5a9489705be6cf28d1e7e1f2b2c60293008aee6aefa61b",
1421 	"8708b77ac39005607b179857c037f64860540e80ed7c7a4240e09ae62c88f87e",
1422 
1423 	"02553a2117e654ac28d948a6f67a83daf2089a95ff6631ff78131baa755cc36c4ad0ca6a51f5f176ea393a9bbf2b4af54deb12c6a0dfaec75da88dbc0655d34b7ad6fb0ebbb3c1e7f4fe3f94bb865683934d4fe7b53cc20b1016b7e68eab0cf1994e1735de888ba8500ea0b970f16e2acc159a1ec6e435739743e15194c53603af1f640640dd19600653a53368d55c92012b3b935c3fcfa6fc195325a00d192cc5332baa6b1831b81cb3952a2b9be6643a777a70feb5584d477f5489",
1424 	"376b551c1e8f908d7e1979efa436ab69013d2e85c34430dc826179b4f94480ae",
1425 
1426 	"9945c4f0e067b943986b6841b8fd21109e91d2f2549c711a11039abf03d37a6e4b34eba44a98e09c1b38046660c19e39424ab80ab38a805df648ee5c6212a72663322269c1de093325afe205d955ee2acf885146e5417432672ba807d5540c79e729b067cfa1faafbeb84947a91fd98a4d32e7cf712a15406b940feae5026f10e100dec5fb497cbaee3b83545a892701c530c0cddfac2a300a6b6c2a19829992589ff4accd3e57f9be20d65374f99f393e6a2467b82e7da94c9807f2fa",
1427 	"a4ab2e8f96b69097d84596b628e7bb76f460c001043ce5fa6e379fd29d1eabba",
1428 
1429 	"a4d7897eaf5c49979b361c39a67f47e26c2f75e5ffe0645539d4de245138eb8cadaa45aef7fa0c7a732dbbce90c85be2bd4bf6e37dfb4fdebee4d0e0671fc45c3051c6ccb674799bcfda7a431a6e93b3db3e32f30636190a9a2e5620302876e0d4d2f6201353fac4554341df6efb591c6f100f5dc21a2aa176ba592bd7db69e14237bbf2371df6bbb072f9ecb1f714e621c97768d82eea6bf98ebf4a82c005262188ff894a5dd549866f88b00ee82bd99872515d71fac230ccb472c55a60",
1430 	"9510ff5231813a865918badd0011f05915364165492ef17b85929a63e4951589",
1431 
1432 	"22813ee9edc5c2a90d8b3f07b48d9534e60f08312dc296d68fe78719bdb7478d8d037129aa182c4b8ae5bafca1604e76d5251ee43160ba68ddee9c624ebf00f0ba7ff6b1cf75b5cfa4ab323cf04ff13b7a591b23d06ed25f3c04c1baf4c8f7da913cf509c2a5053c4224ce4d0723268cbdf2277672b285c493731ea81799d353fa8497baed70c59a4c99b7b950a39470863a69667ff67c9ec981ddb41ffb3d63dd9d034bb79d9df1a95214083199e4efbd770a7a5f005ef5c877236674b6dd",
1433 	"44f8a8b05fc643566f1f53a93a122f7902d2cab68bb02267c0479339371a7304",
1434 
1435 	"eebfa2629596f61a926c4cd472ecb03eb2ecaf7f7650b12f7d2b8aa755284b7ccb295e46a62dd2a69577f38765ed1ea377bed34972470c5e3538cda310f2fd353334745a66f7557afb969e6c0132fdf4bb55e68951d5e25bc4fc2a9427e574de0d290d263ebc28a0ae11760caf85f63765fa0fc47ac2dc2c14c0c70404c9597f415050339443f2209430a2eed5acb1765df5768457d6a1db0ccbcc7a0e66531eb6f16608d1555c00973b4a9add70d5b88b8e44504fd9da709367627fad840bc5",
1436 	"9949d3ac3c05b4a08b85fa371811fd3f0b50c71950fef50acbb59c450ab1c587",
1437 
1438 	"ddf38f51b732aea3fdf1fe4c756d17961262163d737f407fad17e9724a19959a92425cbb099193ec38fca8edb0614eba4dbfda60b8a6ed102fec547289a22c3b74464a02023ada50647545f6f57959a37a85a4b5a70b2050e66416ad55c33cb50d6820cfaa16caf608c69d0e4a9d7f78211c3ae44b97216659e8f6cdb6640b30e50ea8c90a0bad06ac5678deb9b50962caec6494a930377b11debd77b46de2d382a2a8992902c9aad88d9e0d49a93f88fe5dec6dcbbfacb794b0335558c609c66e",
1439 	"954473b4965a57c4cbb20e199b8730487eb621f5fd694a1eb1667940da0d6728",
1440 
1441 	"184e1b9ccec71f837dca25838db073d51cacc26246fda091a468135d12e67faab69ac9d93e05bd9a687dad01c8db5bddc6751a45e64c2f734c867dd67f1e62626ddadc2baf7df0320f3e4c7e477a2b6f0ca679504b87372bb3a522e173fd8f7945f69ab9ab967ff378f6482293f3a936f82728abff188060e1ae48a778ebd09846d64cacb9b83487ad8bea1433b09ed791e06f7f8a65d2bbdf8a384f1550eb677962392b624bd593b6e77a7daf17d1fddfb995f472d8f5e4b41f3a02d394a98de583",
1442 	"0a7506e1b6cc43acdb4f2ec456e069e6e4b7608deb70dbe7ccb88578658be9da",
1443 
1444 	"c436d19f05550b6979bdc69bfd27ea4cd80c1a60f00a8b093e89178c7f9e8d492c304cf6ad59102bca0e0b23620338c15fc9ecd1e939ae91da16486f72ee1e154d41bfa391e6ba3b6ca9b3c3be39b5e61242ca5cd3d6c96cbd1170af91fdb2160db3522e1bc3b1a349d6e50479920ac5d9bedd8a16a787a3cdc2b6d24392f25555cc2f20b2ba9e6b47ddc96cfbd6df669d874ce21a758d3cf4704362ef7786d90ed67b01bd91299950058885accddbcf44e340ed4807864218653ee7ff7215aa1e1761",
1445 	"206be726fc681367387ff0a15303533058070f9655438ad8142cf39a0523b2ce",
1446 
1447 	"daf7c7526cdb85127df59220fbcb67dc5069ef58dc069a18a2e4ad164178dc0927cb1ae70120b0a975d78c4e1491dc228a95dc401873ec5645e7e6a8d0ffae58e8800be49f87b5f09d6caf4611ebd61bee86bb945325ae884a001b88b6be1a1c87de41503057bc6f5b7ba00fdb217d4de203335a746506371bf8f4bcddfd45df6bad65339bd9efaf18ce0ab1587bf842cfd6ec9c637b1cea1f96184e2b045a28fcb51e96c85574373d2b9335724170821ec58f6108af1929bea430458a1a7f80a2be1580",
1448 	"742389244ad26d7a16d1f2b01e9c83e987a283bbf3aa2907a556746fe8c98c38",
1449 
1450 	"597dadb776945e01c564f17eed4b5c1bbb34eebb13bce37d2d93363efe24b660f3785cc9e557dc2e4ab17a91a83d1f085060acc148508e43897993f66a20fbe65d46d3c4d9cf7e2e97e3952f0195f10ae8c20533753c719f6228d53d69a5e3c5fdafb9b039426d8716c2e961e09af9a8eb24a21b82c9b6192069a51ce3fc96843d7ab696edf9d0c42d151f2e2d95606ac14c2a80563c82392b02ab9abe6e3bab8471747ddc3cd06a46a6de9fd0ce4dd8d202466bdbe00088ebbb8ebfe341fbc2395a986df0",
1451 	"892985bdf2379f8ae138aac016894ee23408955d627cfa699fa5fa1439340a91",
1452 
1453 	"0efc14917a94f5320eb734c2b9e45f659d06c9f5c454deff0e76b30f6ee9e22e56a494a870fcdf138fc5538ce5bacf44761f993ccca4ae4ced8d576a8a10fd2979fe3e8066a641cdc5f746190ae4819e1d0d2886089bcbf6f36be44b5370afa45e523ba0c25bc169969436f1912b1c7b7a189d5edf00da050a5a813b31d09da5ede8b390ede30aeeece64a9ae05749e4758a2149b99d868219a056c18cf972370e07cdd95006c264ae33ab9e6130afdff6a9dbd1fe38747408868c65ccb4d45fa9f9b102528c",
1454 	"73088e0551c89477bcb675245c5c6347b4230390285832c7d723bf668c8061fb",
1455 
1456 	"9ac34ec974d28b18b7bcf6982eac60ebc670b0674e2acd697b49bfeb2fb81159fa5579a1e2a5bb8a5fc6ca46aaa5304a3771b15d804f2bef054fc1ad919e3852befea1c0bb74394f4d408d651412e247107bd32e64a23c9e593857f3a5ae253deea5104d8aa6ce108913881cf55d3c89587860027f8cc81b7eeec9e5f44e9fc190320c71d4a3427519250394d4ed07b9174f9e005b7696117c575fad05e76d86ae8cde5423d25d25076046f4392a0a7e56e8d6517fc66f265c5d617060e258354f9dce1dfe9de6",
1457 	"17cba68f47a0615b3513d28a44feda6ad36b6e6eb1ead7232f4e2a4e1a64bf50",
1458 
1459 	"d00df64c4bb9e2fd16fb6f9ca746d6cf162015ec7326e41a5d51e9b3d0792fed3f17d5bae34f03ec522e229d53304dcef105024ece941edeba410892846b2c7a1039ab82aa9750979a7bc70bf96d093bc3461b6f2d38f801380eccc286b562996cfce06d4a98b245176bc4ae4006f45eb36cc71636185acdfe429c0a7d5fbb927be7dc43685a0f40f185824ed102f57eeafe6d0d943e2d883564e233126f1eac648207ccafe651ce4f5169b35369f3e48f84771aedb2577b04fd0506ecef72305055cacfc4435e38",
1460 	"67302648e0082254d8d342b4eb8070ef9a44e0fc55c3d9a3f20613e4824aff21",
1461 
1462 	"fff5deb2bc7f43bd2db44ceff874e9c3b7c1a2f54cc6889f74186ca2a03d5047006b1b26e0919147379c81887df3403ebe43571fed8279607a2eb81a26d6f8f217dca3f927799ed182017c127069f2eb6f068b0d85979dc4d4867c676f6bedf36cd2def33b3e54a3366ea45478dee612f391a785bd0ede15aba921512103199228d434dbc1e899047a6861183e5b04fb716c11503dee2399261d10a0e5a76317736b0d7b6480573e76791b246ae734ee12203336ac3f539a6e6cb01c625eb3c9741dd199ca0d759753",
1463 	"bf64c9ab7042245fb2d8054edd699086dbe27a1ce904174d28bc0831ed9acf97",
1464 
1465 	"8d8001e2c096f1b88e7c9224a086efd4797fbf74a8033a2d422a2b6b8f6747e4",
1466 	"2e975f6a8a14f0704d51b13667d8195c219f71e6345696c49fa4b9d08e9225d3d39393425152c97e71dd24601c11abcfa0f12f53c680bd3ae757b8134a9c10d429615869217fdd5885c4db174985703a6d6de94a667eac3023443a8337ae1bc601b76d7d38ec3c34463105f0d3949d78e562a039e4469548b609395de5a4fd43c46ca9fd6ee29ada5efc07d84d553249450dab4a49c483ded250c9338f85cd937ae66bb436f3b4026e859fda1ca571432f3bfc09e7c03ca4d183b741111ca0483d0edabc03feb23b17ee48e844ba2408d9dcfd0139d2e8c7310125aee801c61ab7900d1efc47c078281766f361c5e6111346235e1dc38325666c",
1467 
1468 	NULL
1469 };
1470 
1471 static void
1472 test_SHAKE_KAT(int security_level, const char *const *kat)
1473 {
1474 	size_t u;
1475 
1476 	for (u = 0; kat[u] != NULL; u += 2) {
1477 		unsigned char msg[250], out[250], ref[250];
1478 		size_t msg_len, out_len, v;
1479 		br_shake_context sc;
1480 
1481 		msg_len = hextobin(msg, kat[u]);
1482 		out_len = hextobin(ref, kat[u + 1]);
1483 		br_shake_init(&sc, security_level);
1484 		br_shake_inject(&sc, msg, msg_len);
1485 		br_shake_flip(&sc);
1486 		br_shake_produce(&sc, out, out_len);
1487 		check_equals("KAT 1", out, ref, out_len);
1488 
1489 		br_shake_init(&sc, security_level);
1490 		for (v = 0; v < msg_len; v ++) {
1491 			br_shake_inject(&sc, msg + v, 1);
1492 		}
1493 		br_shake_flip(&sc);
1494 		br_shake_produce(&sc, out, out_len);
1495 		check_equals("KAT 2", out, ref, out_len);
1496 
1497 		br_shake_init(&sc, security_level);
1498 		br_shake_inject(&sc, msg, msg_len);
1499 		br_shake_flip(&sc);
1500 		for (v = 0; v < out_len; v ++) {
1501 			unsigned char x;
1502 
1503 			br_shake_produce(&sc, &x, 1);
1504 			if (x != ref[v]) {
1505 				fprintf(stderr, "KAT 3 (byte %u)\n",
1506 					(unsigned)v);
1507 				exit(EXIT_FAILURE);
1508 			}
1509 		}
1510 
1511 		printf(".");
1512 		fflush(stdout);
1513 	}
1514 }
1515 
1516 static void
1517 test_SHAKE_MonteCarlo(int security_level,
1518 	size_t minoutlen, size_t maxoutlen, const char *smsg, const char *sref)
1519 {
1520 	unsigned char out[250], ref[250];
1521 	size_t len, rlen, outlen, range;
1522 	int i, j;
1523 
1524 	hextobin(out, smsg);
1525 	outlen = maxoutlen;
1526 	range = maxoutlen - minoutlen + 1;
1527 	for (j = 0; j < 100; j ++) {
1528 		for (i = 1; i < 1001; i ++) {
1529 			br_shake_context sc;
1530 
1531 			len = outlen;
1532 			br_shake_init(&sc, security_level);
1533 			br_shake_inject(&sc, out, 16);
1534 			br_shake_flip(&sc);
1535 			br_shake_produce(&sc, out, len);
1536 			if (len < 16) {
1537 				memset(out + len, 0, 16 - len);
1538 			}
1539 			outlen = minoutlen
1540 				+ (br_dec16be(out + len - 2) % range);
1541 		}
1542 		printf(".");
1543 		fflush(stdout);
1544 	}
1545 	rlen = hextobin(ref, sref);
1546 	if (rlen != len) {
1547 		fprintf(stderr, "MC: bad length (%u vs %u)\n",
1548 			(unsigned)len, (unsigned)rlen);
1549 		exit(EXIT_FAILURE);
1550 	}
1551 	check_equals("KAT MC", out, ref, len);
1552 }
1553 
1554 static void
1555 test_SHAKE(void)
1556 {
1557 	printf("Test SHAKE: ");
1558 	fflush(stdout);
1559 
1560 	test_SHAKE_KAT(128, KAT_SHAKE128);
1561 
1562 	printf(" ");
1563 	fflush(stdout);
1564 
1565 	test_SHAKE_MonteCarlo(128, 16, 140,
1566 		"c8b310cb97efa3855434998fa81c7674",
1567 		"4aa371f0099b04a909f9b1680e8b52a21c6510ea2640137d501ffa114bf84717b1f725d64bae4ae5d87a");
1568 
1569 	printf(" ");
1570 	fflush(stdout);
1571 
1572 	test_SHAKE_KAT(256, KAT_SHAKE256);
1573 
1574 	printf(" ");
1575 	fflush(stdout);
1576 
1577 	test_SHAKE_MonteCarlo(256, 2, 250,
1578 		"48a0321b3653e4e86446d00f6a036efd",
1579 		"d4c8c26ded38cca426d8d1c8f8aedb5c543541333839deca8713cfd8684480fe923f57c3a5c89cb61427c220c7");
1580 
1581 	printf(" done.\n");
1582 	fflush(stdout);
1583 }
1584 
1585 static void
1586 test_HMAC_DRBG(void)
1587 {
1588 	br_hmac_drbg_context ctx;
1589 	unsigned char seed[42], tmp[30];
1590 	unsigned char ref1[30], ref2[30], ref3[30];
1591 	size_t seed_len;
1592 
1593 	printf("Test HMAC_DRBG: ");
1594 	fflush(stdout);
1595 
1596 	seed_len = hextobin(seed,
1597 		"009A4D6792295A7F730FC3F2B49CBC0F62E862272F"
1598 		"01795EDF0D54DB760F156D0DAC04C0322B3A204224");
1599 	hextobin(ref1,
1600 		"9305A46DE7FF8EB107194DEBD3FD48AA"
1601 		"20D5E7656CBE0EA69D2A8D4E7C67");
1602 	hextobin(ref2,
1603 		"C70C78608A3B5BE9289BE90EF6E81A9E"
1604 		"2C1516D5751D2F75F50033E45F73");
1605 	hextobin(ref3,
1606 		"475E80E992140567FCC3A50DAB90FE84"
1607 		"BCD7BB03638E9C4656A06F37F650");
1608 	br_hmac_drbg_init(&ctx, &br_sha256_vtable, seed, seed_len);
1609 	br_hmac_drbg_generate(&ctx, tmp, sizeof tmp);
1610 	check_equals("KAT HMAC_DRBG 1", tmp, ref1, sizeof tmp);
1611 	br_hmac_drbg_generate(&ctx, tmp, sizeof tmp);
1612 	check_equals("KAT HMAC_DRBG 2", tmp, ref2, sizeof tmp);
1613 	br_hmac_drbg_generate(&ctx, tmp, sizeof tmp);
1614 	check_equals("KAT HMAC_DRBG 3", tmp, ref3, sizeof tmp);
1615 
1616 	memset(&ctx, 0, sizeof ctx);
1617 	br_hmac_drbg_vtable.init(&ctx.vtable,
1618 		&br_sha256_vtable, seed, seed_len);
1619 	ctx.vtable->generate(&ctx.vtable, tmp, sizeof tmp);
1620 	check_equals("KAT HMAC_DRBG 4", tmp, ref1, sizeof tmp);
1621 	ctx.vtable->generate(&ctx.vtable, tmp, sizeof tmp);
1622 	check_equals("KAT HMAC_DRBG 5", tmp, ref2, sizeof tmp);
1623 	ctx.vtable->generate(&ctx.vtable, tmp, sizeof tmp);
1624 	check_equals("KAT HMAC_DRBG 6", tmp, ref3, sizeof tmp);
1625 
1626 	printf("done.\n");
1627 	fflush(stdout);
1628 }
1629 
1630 static void
1631 test_AESCTR_DRBG(void)
1632 {
1633 	br_aesctr_drbg_context ctx;
1634 	const br_block_ctr_class *ictr;
1635 	unsigned char tmp1[64], tmp2[64];
1636 
1637 	printf("Test AESCTR_DRBG: ");
1638 	fflush(stdout);
1639 
1640 	ictr = br_aes_x86ni_ctr_get_vtable();
1641 	if (ictr == NULL) {
1642 		ictr = br_aes_pwr8_ctr_get_vtable();
1643 		if (ictr == NULL) {
1644 #if BR_64
1645 			ictr = &br_aes_ct64_ctr_vtable;
1646 #else
1647 			ictr = &br_aes_ct_ctr_vtable;
1648 #endif
1649 		}
1650 	}
1651 	br_aesctr_drbg_init(&ctx, ictr, NULL, 0);
1652 	ctx.vtable->generate(&ctx.vtable, tmp1, sizeof tmp1);
1653 	ctx.vtable->update(&ctx.vtable, "new seed", 8);
1654 	ctx.vtable->generate(&ctx.vtable, tmp2, sizeof tmp2);
1655 
1656 	if (memcmp(tmp1, tmp2, sizeof tmp1) == 0) {
1657 		fprintf(stderr, "AESCTR_DRBG failure\n");
1658 		exit(EXIT_FAILURE);
1659 	}
1660 
1661 	printf("done.\n");
1662 	fflush(stdout);
1663 }
1664 
1665 static void
1666 do_KAT_PRF(br_tls_prf_impl prf,
1667 	const char *ssecret, const char *label, const char *sseed,
1668 	const char *sref)
1669 {
1670 	unsigned char secret[100], seed[100], ref[500], out[500];
1671 	size_t secret_len, seed_len, ref_len;
1672 	br_tls_prf_seed_chunk chunks[2];
1673 
1674 	secret_len = hextobin(secret, ssecret);
1675 	seed_len = hextobin(seed, sseed);
1676 	ref_len = hextobin(ref, sref);
1677 
1678 	chunks[0].data = seed;
1679 	chunks[0].len = seed_len;
1680 	prf(out, ref_len, secret, secret_len, label, 1, chunks);
1681 	check_equals("TLS PRF KAT 1", out, ref, ref_len);
1682 
1683 	chunks[0].data = seed;
1684 	chunks[0].len = seed_len;
1685 	chunks[1].data = NULL;
1686 	chunks[1].len = 0;
1687 	prf(out, ref_len, secret, secret_len, label, 2, chunks);
1688 	check_equals("TLS PRF KAT 2", out, ref, ref_len);
1689 
1690 	chunks[0].data = NULL;
1691 	chunks[0].len = 0;
1692 	chunks[1].data = seed;
1693 	chunks[1].len = seed_len;
1694 	prf(out, ref_len, secret, secret_len, label, 2, chunks);
1695 	check_equals("TLS PRF KAT 3", out, ref, ref_len);
1696 
1697 	chunks[0].data = seed;
1698 	chunks[0].len = seed_len >> 1;
1699 	chunks[1].data = seed + chunks[0].len;
1700 	chunks[1].len = seed_len - chunks[0].len;
1701 	prf(out, ref_len, secret, secret_len, label, 2, chunks);
1702 	check_equals("TLS PRF KAT 4", out, ref, ref_len);
1703 }
1704 
1705 static void
1706 test_PRF(void)
1707 {
1708 	printf("Test TLS PRF: ");
1709 	fflush(stdout);
1710 
1711 	/*
1712 	 * Test vector taken from an email that was on:
1713 	 * http://www.imc.org/ietf-tls/mail-archive/msg01589.html
1714 	 * but no longer exists there; a version archived in 2008
1715 	 * can be found on http://www.archive.org/
1716 	 */
1717 	do_KAT_PRF(&br_tls10_prf,
1718 		"abababababababababababababababababababababababababababababababababababababababababababababababab",
1719 		"PRF Testvector",
1720 		"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
1721 		"d3d4d1e349b5d515044666d51de32bab258cb521b6b053463e354832fd976754443bcf9a296519bc289abcbc1187e4ebd31e602353776c408aafb74cbc85eff69255f9788faa184cbb957a9819d84a5d7eb006eb459d3ae8de9810454b8b2d8f1afbc655a8c9a013");
1722 
1723 	/*
1724 	 * Test vectors are taken from:
1725 	 * https://www.ietf.org/mail-archive/web/tls/current/msg03416.html
1726 	 */
1727 	do_KAT_PRF(&br_tls12_sha256_prf,
1728 		"9bbe436ba940f017b17652849a71db35",
1729 		"test label",
1730 		"a0ba9f936cda311827a6f796ffd5198c",
1731 		"e3f229ba727be17b8d122620557cd453c2aab21d07c3d495329b52d4e61edb5a6b301791e90d35c9c9a46b4e14baf9af0fa022f7077def17abfd3797c0564bab4fbc91666e9def9b97fce34f796789baa48082d122ee42c5a72e5a5110fff70187347b66");
1732 	do_KAT_PRF(&br_tls12_sha384_prf,
1733 		"b80b733d6ceefcdc71566ea48e5567df",
1734 		"test label",
1735 		"cd665cf6a8447dd6ff8b27555edb7465",
1736 		"7b0c18e9ced410ed1804f2cfa34a336a1c14dffb4900bb5fd7942107e81c83cde9ca0faa60be9fe34f82b1233c9146a0e534cb400fed2700884f9dc236f80edd8bfa961144c9e8d792eca722a7b32fc3d416d473ebc2c5fd4abfdad05d9184259b5bf8cd4d90fa0d31e2dec479e4f1a26066f2eea9a69236a3e52655c9e9aee691c8f3a26854308d5eaa3be85e0990703d73e56f");
1737 
1738 	printf("done.\n");
1739 	fflush(stdout);
1740 }
1741 
1742 /*
1743  * AES known-answer tests. Order: key, plaintext, ciphertext.
1744  */
1745 static const char *const KAT_AES[] = {
1746 	/*
1747 	 * From FIPS-197.
1748 	 */
1749 	"000102030405060708090a0b0c0d0e0f",
1750 	"00112233445566778899aabbccddeeff",
1751 	"69c4e0d86a7b0430d8cdb78070b4c55a",
1752 
1753 	"000102030405060708090a0b0c0d0e0f1011121314151617",
1754 	"00112233445566778899aabbccddeeff",
1755 	"dda97ca4864cdfe06eaf70a0ec0d7191",
1756 
1757 	"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
1758 	"00112233445566778899aabbccddeeff",
1759 	"8ea2b7ca516745bfeafc49904b496089",
1760 
1761 	/*
1762 	 * From NIST validation suite (ECBVarTxt128.rsp).
1763 	 */
1764 	"00000000000000000000000000000000",
1765 	"80000000000000000000000000000000",
1766 	"3ad78e726c1ec02b7ebfe92b23d9ec34",
1767 
1768 	"00000000000000000000000000000000",
1769 	"c0000000000000000000000000000000",
1770 	"aae5939c8efdf2f04e60b9fe7117b2c2",
1771 
1772 	"00000000000000000000000000000000",
1773 	"e0000000000000000000000000000000",
1774 	"f031d4d74f5dcbf39daaf8ca3af6e527",
1775 
1776 	"00000000000000000000000000000000",
1777 	"f0000000000000000000000000000000",
1778 	"96d9fd5cc4f07441727df0f33e401a36",
1779 
1780 	"00000000000000000000000000000000",
1781 	"f8000000000000000000000000000000",
1782 	"30ccdb044646d7e1f3ccea3dca08b8c0",
1783 
1784 	"00000000000000000000000000000000",
1785 	"fc000000000000000000000000000000",
1786 	"16ae4ce5042a67ee8e177b7c587ecc82",
1787 
1788 	"00000000000000000000000000000000",
1789 	"fe000000000000000000000000000000",
1790 	"b6da0bb11a23855d9c5cb1b4c6412e0a",
1791 
1792 	"00000000000000000000000000000000",
1793 	"ff000000000000000000000000000000",
1794 	"db4f1aa530967d6732ce4715eb0ee24b",
1795 
1796 	"00000000000000000000000000000000",
1797 	"ff800000000000000000000000000000",
1798 	"a81738252621dd180a34f3455b4baa2f",
1799 
1800 	"00000000000000000000000000000000",
1801 	"ffc00000000000000000000000000000",
1802 	"77e2b508db7fd89234caf7939ee5621a",
1803 
1804 	"00000000000000000000000000000000",
1805 	"ffe00000000000000000000000000000",
1806 	"b8499c251f8442ee13f0933b688fcd19",
1807 
1808 	"00000000000000000000000000000000",
1809 	"fff00000000000000000000000000000",
1810 	"965135f8a81f25c9d630b17502f68e53",
1811 
1812 	"00000000000000000000000000000000",
1813 	"fff80000000000000000000000000000",
1814 	"8b87145a01ad1c6cede995ea3670454f",
1815 
1816 	"00000000000000000000000000000000",
1817 	"fffc0000000000000000000000000000",
1818 	"8eae3b10a0c8ca6d1d3b0fa61e56b0b2",
1819 
1820 	"00000000000000000000000000000000",
1821 	"fffe0000000000000000000000000000",
1822 	"64b4d629810fda6bafdf08f3b0d8d2c5",
1823 
1824 	"00000000000000000000000000000000",
1825 	"ffff0000000000000000000000000000",
1826 	"d7e5dbd3324595f8fdc7d7c571da6c2a",
1827 
1828 	"00000000000000000000000000000000",
1829 	"ffff8000000000000000000000000000",
1830 	"f3f72375264e167fca9de2c1527d9606",
1831 
1832 	"00000000000000000000000000000000",
1833 	"ffffc000000000000000000000000000",
1834 	"8ee79dd4f401ff9b7ea945d86666c13b",
1835 
1836 	"00000000000000000000000000000000",
1837 	"ffffe000000000000000000000000000",
1838 	"dd35cea2799940b40db3f819cb94c08b",
1839 
1840 	"00000000000000000000000000000000",
1841 	"fffff000000000000000000000000000",
1842 	"6941cb6b3e08c2b7afa581ebdd607b87",
1843 
1844 	"00000000000000000000000000000000",
1845 	"fffff800000000000000000000000000",
1846 	"2c20f439f6bb097b29b8bd6d99aad799",
1847 
1848 	"00000000000000000000000000000000",
1849 	"fffffc00000000000000000000000000",
1850 	"625d01f058e565f77ae86378bd2c49b3",
1851 
1852 	"00000000000000000000000000000000",
1853 	"fffffe00000000000000000000000000",
1854 	"c0b5fd98190ef45fbb4301438d095950",
1855 
1856 	"00000000000000000000000000000000",
1857 	"ffffff00000000000000000000000000",
1858 	"13001ff5d99806efd25da34f56be854b",
1859 
1860 	"00000000000000000000000000000000",
1861 	"ffffff80000000000000000000000000",
1862 	"3b594c60f5c8277a5113677f94208d82",
1863 
1864 	"00000000000000000000000000000000",
1865 	"ffffffc0000000000000000000000000",
1866 	"e9c0fc1818e4aa46bd2e39d638f89e05",
1867 
1868 	"00000000000000000000000000000000",
1869 	"ffffffe0000000000000000000000000",
1870 	"f8023ee9c3fdc45a019b4e985c7e1a54",
1871 
1872 	"00000000000000000000000000000000",
1873 	"fffffff0000000000000000000000000",
1874 	"35f40182ab4662f3023baec1ee796b57",
1875 
1876 	"00000000000000000000000000000000",
1877 	"fffffff8000000000000000000000000",
1878 	"3aebbad7303649b4194a6945c6cc3694",
1879 
1880 	"00000000000000000000000000000000",
1881 	"fffffffc000000000000000000000000",
1882 	"a2124bea53ec2834279bed7f7eb0f938",
1883 
1884 	"00000000000000000000000000000000",
1885 	"fffffffe000000000000000000000000",
1886 	"b9fb4399fa4facc7309e14ec98360b0a",
1887 
1888 	"00000000000000000000000000000000",
1889 	"ffffffff000000000000000000000000",
1890 	"c26277437420c5d634f715aea81a9132",
1891 
1892 	"00000000000000000000000000000000",
1893 	"ffffffff800000000000000000000000",
1894 	"171a0e1b2dd424f0e089af2c4c10f32f",
1895 
1896 	"00000000000000000000000000000000",
1897 	"ffffffffc00000000000000000000000",
1898 	"7cadbe402d1b208fe735edce00aee7ce",
1899 
1900 	"00000000000000000000000000000000",
1901 	"ffffffffe00000000000000000000000",
1902 	"43b02ff929a1485af6f5c6d6558baa0f",
1903 
1904 	"00000000000000000000000000000000",
1905 	"fffffffff00000000000000000000000",
1906 	"092faacc9bf43508bf8fa8613ca75dea",
1907 
1908 	"00000000000000000000000000000000",
1909 	"fffffffff80000000000000000000000",
1910 	"cb2bf8280f3f9742c7ed513fe802629c",
1911 
1912 	"00000000000000000000000000000000",
1913 	"fffffffffc0000000000000000000000",
1914 	"215a41ee442fa992a6e323986ded3f68",
1915 
1916 	"00000000000000000000000000000000",
1917 	"fffffffffe0000000000000000000000",
1918 	"f21e99cf4f0f77cea836e11a2fe75fb1",
1919 
1920 	"00000000000000000000000000000000",
1921 	"ffffffffff0000000000000000000000",
1922 	"95e3a0ca9079e646331df8b4e70d2cd6",
1923 
1924 	"00000000000000000000000000000000",
1925 	"ffffffffff8000000000000000000000",
1926 	"4afe7f120ce7613f74fc12a01a828073",
1927 
1928 	"00000000000000000000000000000000",
1929 	"ffffffffffc000000000000000000000",
1930 	"827f000e75e2c8b9d479beed913fe678",
1931 
1932 	"00000000000000000000000000000000",
1933 	"ffffffffffe000000000000000000000",
1934 	"35830c8e7aaefe2d30310ef381cbf691",
1935 
1936 	"00000000000000000000000000000000",
1937 	"fffffffffff000000000000000000000",
1938 	"191aa0f2c8570144f38657ea4085ebe5",
1939 
1940 	"00000000000000000000000000000000",
1941 	"fffffffffff800000000000000000000",
1942 	"85062c2c909f15d9269b6c18ce99c4f0",
1943 
1944 	"00000000000000000000000000000000",
1945 	"fffffffffffc00000000000000000000",
1946 	"678034dc9e41b5a560ed239eeab1bc78",
1947 
1948 	"00000000000000000000000000000000",
1949 	"fffffffffffe00000000000000000000",
1950 	"c2f93a4ce5ab6d5d56f1b93cf19911c1",
1951 
1952 	"00000000000000000000000000000000",
1953 	"ffffffffffff00000000000000000000",
1954 	"1c3112bcb0c1dcc749d799743691bf82",
1955 
1956 	"00000000000000000000000000000000",
1957 	"ffffffffffff80000000000000000000",
1958 	"00c55bd75c7f9c881989d3ec1911c0d4",
1959 
1960 	"00000000000000000000000000000000",
1961 	"ffffffffffffc0000000000000000000",
1962 	"ea2e6b5ef182b7dff3629abd6a12045f",
1963 
1964 	"00000000000000000000000000000000",
1965 	"ffffffffffffe0000000000000000000",
1966 	"22322327e01780b17397f24087f8cc6f",
1967 
1968 	"00000000000000000000000000000000",
1969 	"fffffffffffff0000000000000000000",
1970 	"c9cacb5cd11692c373b2411768149ee7",
1971 
1972 	"00000000000000000000000000000000",
1973 	"fffffffffffff8000000000000000000",
1974 	"a18e3dbbca577860dab6b80da3139256",
1975 
1976 	"00000000000000000000000000000000",
1977 	"fffffffffffffc000000000000000000",
1978 	"79b61c37bf328ecca8d743265a3d425c",
1979 
1980 	"00000000000000000000000000000000",
1981 	"fffffffffffffe000000000000000000",
1982 	"d2d99c6bcc1f06fda8e27e8ae3f1ccc7",
1983 
1984 	"00000000000000000000000000000000",
1985 	"ffffffffffffff000000000000000000",
1986 	"1bfd4b91c701fd6b61b7f997829d663b",
1987 
1988 	"00000000000000000000000000000000",
1989 	"ffffffffffffff800000000000000000",
1990 	"11005d52f25f16bdc9545a876a63490a",
1991 
1992 	"00000000000000000000000000000000",
1993 	"ffffffffffffffc00000000000000000",
1994 	"3a4d354f02bb5a5e47d39666867f246a",
1995 
1996 	"00000000000000000000000000000000",
1997 	"ffffffffffffffe00000000000000000",
1998 	"d451b8d6e1e1a0ebb155fbbf6e7b7dc3",
1999 
2000 	"00000000000000000000000000000000",
2001 	"fffffffffffffff00000000000000000",
2002 	"6898d4f42fa7ba6a10ac05e87b9f2080",
2003 
2004 	"00000000000000000000000000000000",
2005 	"fffffffffffffff80000000000000000",
2006 	"b611295e739ca7d9b50f8e4c0e754a3f",
2007 
2008 	"00000000000000000000000000000000",
2009 	"fffffffffffffffc0000000000000000",
2010 	"7d33fc7d8abe3ca1936759f8f5deaf20",
2011 
2012 	"00000000000000000000000000000000",
2013 	"fffffffffffffffe0000000000000000",
2014 	"3b5e0f566dc96c298f0c12637539b25c",
2015 
2016 	"00000000000000000000000000000000",
2017 	"ffffffffffffffff0000000000000000",
2018 	"f807c3e7985fe0f5a50e2cdb25c5109e",
2019 
2020 	"00000000000000000000000000000000",
2021 	"ffffffffffffffff8000000000000000",
2022 	"41f992a856fb278b389a62f5d274d7e9",
2023 
2024 	"00000000000000000000000000000000",
2025 	"ffffffffffffffffc000000000000000",
2026 	"10d3ed7a6fe15ab4d91acbc7d0767ab1",
2027 
2028 	"00000000000000000000000000000000",
2029 	"ffffffffffffffffe000000000000000",
2030 	"21feecd45b2e675973ac33bf0c5424fc",
2031 
2032 	"00000000000000000000000000000000",
2033 	"fffffffffffffffff000000000000000",
2034 	"1480cb3955ba62d09eea668f7c708817",
2035 
2036 	"00000000000000000000000000000000",
2037 	"fffffffffffffffff800000000000000",
2038 	"66404033d6b72b609354d5496e7eb511",
2039 
2040 	"00000000000000000000000000000000",
2041 	"fffffffffffffffffc00000000000000",
2042 	"1c317a220a7d700da2b1e075b00266e1",
2043 
2044 	"00000000000000000000000000000000",
2045 	"fffffffffffffffffe00000000000000",
2046 	"ab3b89542233f1271bf8fd0c0f403545",
2047 
2048 	"00000000000000000000000000000000",
2049 	"ffffffffffffffffff00000000000000",
2050 	"d93eae966fac46dca927d6b114fa3f9e",
2051 
2052 	"00000000000000000000000000000000",
2053 	"ffffffffffffffffff80000000000000",
2054 	"1bdec521316503d9d5ee65df3ea94ddf",
2055 
2056 	"00000000000000000000000000000000",
2057 	"ffffffffffffffffffc0000000000000",
2058 	"eef456431dea8b4acf83bdae3717f75f",
2059 
2060 	"00000000000000000000000000000000",
2061 	"ffffffffffffffffffe0000000000000",
2062 	"06f2519a2fafaa596bfef5cfa15c21b9",
2063 
2064 	"00000000000000000000000000000000",
2065 	"fffffffffffffffffff0000000000000",
2066 	"251a7eac7e2fe809e4aa8d0d7012531a",
2067 
2068 	"00000000000000000000000000000000",
2069 	"fffffffffffffffffff8000000000000",
2070 	"3bffc16e4c49b268a20f8d96a60b4058",
2071 
2072 	"00000000000000000000000000000000",
2073 	"fffffffffffffffffffc000000000000",
2074 	"e886f9281999c5bb3b3e8862e2f7c988",
2075 
2076 	"00000000000000000000000000000000",
2077 	"fffffffffffffffffffe000000000000",
2078 	"563bf90d61beef39f48dd625fcef1361",
2079 
2080 	"00000000000000000000000000000000",
2081 	"ffffffffffffffffffff000000000000",
2082 	"4d37c850644563c69fd0acd9a049325b",
2083 
2084 	"00000000000000000000000000000000",
2085 	"ffffffffffffffffffff800000000000",
2086 	"b87c921b91829ef3b13ca541ee1130a6",
2087 
2088 	"00000000000000000000000000000000",
2089 	"ffffffffffffffffffffc00000000000",
2090 	"2e65eb6b6ea383e109accce8326b0393",
2091 
2092 	"00000000000000000000000000000000",
2093 	"ffffffffffffffffffffe00000000000",
2094 	"9ca547f7439edc3e255c0f4d49aa8990",
2095 
2096 	"00000000000000000000000000000000",
2097 	"fffffffffffffffffffff00000000000",
2098 	"a5e652614c9300f37816b1f9fd0c87f9",
2099 
2100 	"00000000000000000000000000000000",
2101 	"fffffffffffffffffffff80000000000",
2102 	"14954f0b4697776f44494fe458d814ed",
2103 
2104 	"00000000000000000000000000000000",
2105 	"fffffffffffffffffffffc0000000000",
2106 	"7c8d9ab6c2761723fe42f8bb506cbcf7",
2107 
2108 	"00000000000000000000000000000000",
2109 	"fffffffffffffffffffffe0000000000",
2110 	"db7e1932679fdd99742aab04aa0d5a80",
2111 
2112 	"00000000000000000000000000000000",
2113 	"ffffffffffffffffffffff0000000000",
2114 	"4c6a1c83e568cd10f27c2d73ded19c28",
2115 
2116 	"00000000000000000000000000000000",
2117 	"ffffffffffffffffffffff8000000000",
2118 	"90ecbe6177e674c98de412413f7ac915",
2119 
2120 	"00000000000000000000000000000000",
2121 	"ffffffffffffffffffffffc000000000",
2122 	"90684a2ac55fe1ec2b8ebd5622520b73",
2123 
2124 	"00000000000000000000000000000000",
2125 	"ffffffffffffffffffffffe000000000",
2126 	"7472f9a7988607ca79707795991035e6",
2127 
2128 	"00000000000000000000000000000000",
2129 	"fffffffffffffffffffffff000000000",
2130 	"56aff089878bf3352f8df172a3ae47d8",
2131 
2132 	"00000000000000000000000000000000",
2133 	"fffffffffffffffffffffff800000000",
2134 	"65c0526cbe40161b8019a2a3171abd23",
2135 
2136 	"00000000000000000000000000000000",
2137 	"fffffffffffffffffffffffc00000000",
2138 	"377be0be33b4e3e310b4aabda173f84f",
2139 
2140 	"00000000000000000000000000000000",
2141 	"fffffffffffffffffffffffe00000000",
2142 	"9402e9aa6f69de6504da8d20c4fcaa2f",
2143 
2144 	"00000000000000000000000000000000",
2145 	"ffffffffffffffffffffffff00000000",
2146 	"123c1f4af313ad8c2ce648b2e71fb6e1",
2147 
2148 	"00000000000000000000000000000000",
2149 	"ffffffffffffffffffffffff80000000",
2150 	"1ffc626d30203dcdb0019fb80f726cf4",
2151 
2152 	"00000000000000000000000000000000",
2153 	"ffffffffffffffffffffffffc0000000",
2154 	"76da1fbe3a50728c50fd2e621b5ad885",
2155 
2156 	"00000000000000000000000000000000",
2157 	"ffffffffffffffffffffffffe0000000",
2158 	"082eb8be35f442fb52668e16a591d1d6",
2159 
2160 	"00000000000000000000000000000000",
2161 	"fffffffffffffffffffffffff0000000",
2162 	"e656f9ecf5fe27ec3e4a73d00c282fb3",
2163 
2164 	"00000000000000000000000000000000",
2165 	"fffffffffffffffffffffffff8000000",
2166 	"2ca8209d63274cd9a29bb74bcd77683a",
2167 
2168 	"00000000000000000000000000000000",
2169 	"fffffffffffffffffffffffffc000000",
2170 	"79bf5dce14bb7dd73a8e3611de7ce026",
2171 
2172 	"00000000000000000000000000000000",
2173 	"fffffffffffffffffffffffffe000000",
2174 	"3c849939a5d29399f344c4a0eca8a576",
2175 
2176 	"00000000000000000000000000000000",
2177 	"ffffffffffffffffffffffffff000000",
2178 	"ed3c0a94d59bece98835da7aa4f07ca2",
2179 
2180 	"00000000000000000000000000000000",
2181 	"ffffffffffffffffffffffffff800000",
2182 	"63919ed4ce10196438b6ad09d99cd795",
2183 
2184 	"00000000000000000000000000000000",
2185 	"ffffffffffffffffffffffffffc00000",
2186 	"7678f3a833f19fea95f3c6029e2bc610",
2187 
2188 	"00000000000000000000000000000000",
2189 	"ffffffffffffffffffffffffffe00000",
2190 	"3aa426831067d36b92be7c5f81c13c56",
2191 
2192 	"00000000000000000000000000000000",
2193 	"fffffffffffffffffffffffffff00000",
2194 	"9272e2d2cdd11050998c845077a30ea0",
2195 
2196 	"00000000000000000000000000000000",
2197 	"fffffffffffffffffffffffffff80000",
2198 	"088c4b53f5ec0ff814c19adae7f6246c",
2199 
2200 	"00000000000000000000000000000000",
2201 	"fffffffffffffffffffffffffffc0000",
2202 	"4010a5e401fdf0a0354ddbcc0d012b17",
2203 
2204 	"00000000000000000000000000000000",
2205 	"fffffffffffffffffffffffffffe0000",
2206 	"a87a385736c0a6189bd6589bd8445a93",
2207 
2208 	"00000000000000000000000000000000",
2209 	"ffffffffffffffffffffffffffff0000",
2210 	"545f2b83d9616dccf60fa9830e9cd287",
2211 
2212 	"00000000000000000000000000000000",
2213 	"ffffffffffffffffffffffffffff8000",
2214 	"4b706f7f92406352394037a6d4f4688d",
2215 
2216 	"00000000000000000000000000000000",
2217 	"ffffffffffffffffffffffffffffc000",
2218 	"b7972b3941c44b90afa7b264bfba7387",
2219 
2220 	"00000000000000000000000000000000",
2221 	"ffffffffffffffffffffffffffffe000",
2222 	"6f45732cf10881546f0fd23896d2bb60",
2223 
2224 	"00000000000000000000000000000000",
2225 	"fffffffffffffffffffffffffffff000",
2226 	"2e3579ca15af27f64b3c955a5bfc30ba",
2227 
2228 	"00000000000000000000000000000000",
2229 	"fffffffffffffffffffffffffffff800",
2230 	"34a2c5a91ae2aec99b7d1b5fa6780447",
2231 
2232 	"00000000000000000000000000000000",
2233 	"fffffffffffffffffffffffffffffc00",
2234 	"a4d6616bd04f87335b0e53351227a9ee",
2235 
2236 	"00000000000000000000000000000000",
2237 	"fffffffffffffffffffffffffffffe00",
2238 	"7f692b03945867d16179a8cefc83ea3f",
2239 
2240 	"00000000000000000000000000000000",
2241 	"ffffffffffffffffffffffffffffff00",
2242 	"3bd141ee84a0e6414a26e7a4f281f8a2",
2243 
2244 	"00000000000000000000000000000000",
2245 	"ffffffffffffffffffffffffffffff80",
2246 	"d1788f572d98b2b16ec5d5f3922b99bc",
2247 
2248 	"00000000000000000000000000000000",
2249 	"ffffffffffffffffffffffffffffffc0",
2250 	"0833ff6f61d98a57b288e8c3586b85a6",
2251 
2252 	"00000000000000000000000000000000",
2253 	"ffffffffffffffffffffffffffffffe0",
2254 	"8568261797de176bf0b43becc6285afb",
2255 
2256 	"00000000000000000000000000000000",
2257 	"fffffffffffffffffffffffffffffff0",
2258 	"f9b0fda0c4a898f5b9e6f661c4ce4d07",
2259 
2260 	"00000000000000000000000000000000",
2261 	"fffffffffffffffffffffffffffffff8",
2262 	"8ade895913685c67c5269f8aae42983e",
2263 
2264 	"00000000000000000000000000000000",
2265 	"fffffffffffffffffffffffffffffffc",
2266 	"39bde67d5c8ed8a8b1c37eb8fa9f5ac0",
2267 
2268 	"00000000000000000000000000000000",
2269 	"fffffffffffffffffffffffffffffffe",
2270 	"5c005e72c1418c44f569f2ea33ba54f3",
2271 
2272 	"00000000000000000000000000000000",
2273 	"ffffffffffffffffffffffffffffffff",
2274 	"3f5b8cc9ea855a0afa7347d23e8d664e",
2275 
2276 	/*
2277 	 * From NIST validation suite (ECBVarTxt192.rsp).
2278 	 */
2279 	"000000000000000000000000000000000000000000000000",
2280 	"80000000000000000000000000000000",
2281 	"6cd02513e8d4dc986b4afe087a60bd0c",
2282 
2283 	"000000000000000000000000000000000000000000000000",
2284 	"c0000000000000000000000000000000",
2285 	"2ce1f8b7e30627c1c4519eada44bc436",
2286 
2287 	"000000000000000000000000000000000000000000000000",
2288 	"e0000000000000000000000000000000",
2289 	"9946b5f87af446f5796c1fee63a2da24",
2290 
2291 	"000000000000000000000000000000000000000000000000",
2292 	"f0000000000000000000000000000000",
2293 	"2a560364ce529efc21788779568d5555",
2294 
2295 	"000000000000000000000000000000000000000000000000",
2296 	"f8000000000000000000000000000000",
2297 	"35c1471837af446153bce55d5ba72a0a",
2298 
2299 	"000000000000000000000000000000000000000000000000",
2300 	"fc000000000000000000000000000000",
2301 	"ce60bc52386234f158f84341e534cd9e",
2302 
2303 	"000000000000000000000000000000000000000000000000",
2304 	"fe000000000000000000000000000000",
2305 	"8c7c27ff32bcf8dc2dc57c90c2903961",
2306 
2307 	"000000000000000000000000000000000000000000000000",
2308 	"ff000000000000000000000000000000",
2309 	"32bb6a7ec84499e166f936003d55a5bb",
2310 
2311 	"000000000000000000000000000000000000000000000000",
2312 	"ff800000000000000000000000000000",
2313 	"a5c772e5c62631ef660ee1d5877f6d1b",
2314 
2315 	"000000000000000000000000000000000000000000000000",
2316 	"ffc00000000000000000000000000000",
2317 	"030d7e5b64f380a7e4ea5387b5cd7f49",
2318 
2319 	"000000000000000000000000000000000000000000000000",
2320 	"ffe00000000000000000000000000000",
2321 	"0dc9a2610037009b698f11bb7e86c83e",
2322 
2323 	"000000000000000000000000000000000000000000000000",
2324 	"fff00000000000000000000000000000",
2325 	"0046612c766d1840c226364f1fa7ed72",
2326 
2327 	"000000000000000000000000000000000000000000000000",
2328 	"fff80000000000000000000000000000",
2329 	"4880c7e08f27befe78590743c05e698b",
2330 
2331 	"000000000000000000000000000000000000000000000000",
2332 	"fffc0000000000000000000000000000",
2333 	"2520ce829a26577f0f4822c4ecc87401",
2334 
2335 	"000000000000000000000000000000000000000000000000",
2336 	"fffe0000000000000000000000000000",
2337 	"8765e8acc169758319cb46dc7bcf3dca",
2338 
2339 	"000000000000000000000000000000000000000000000000",
2340 	"ffff0000000000000000000000000000",
2341 	"e98f4ba4f073df4baa116d011dc24a28",
2342 
2343 	"000000000000000000000000000000000000000000000000",
2344 	"ffff8000000000000000000000000000",
2345 	"f378f68c5dbf59e211b3a659a7317d94",
2346 
2347 	"000000000000000000000000000000000000000000000000",
2348 	"ffffc000000000000000000000000000",
2349 	"283d3b069d8eb9fb432d74b96ca762b4",
2350 
2351 	"000000000000000000000000000000000000000000000000",
2352 	"ffffe000000000000000000000000000",
2353 	"a7e1842e8a87861c221a500883245c51",
2354 
2355 	"000000000000000000000000000000000000000000000000",
2356 	"fffff000000000000000000000000000",
2357 	"77aa270471881be070fb52c7067ce732",
2358 
2359 	"000000000000000000000000000000000000000000000000",
2360 	"fffff800000000000000000000000000",
2361 	"01b0f476d484f43f1aeb6efa9361a8ac",
2362 
2363 	"000000000000000000000000000000000000000000000000",
2364 	"fffffc00000000000000000000000000",
2365 	"1c3a94f1c052c55c2d8359aff2163b4f",
2366 
2367 	"000000000000000000000000000000000000000000000000",
2368 	"fffffe00000000000000000000000000",
2369 	"e8a067b604d5373d8b0f2e05a03b341b",
2370 
2371 	"000000000000000000000000000000000000000000000000",
2372 	"ffffff00000000000000000000000000",
2373 	"a7876ec87f5a09bfea42c77da30fd50e",
2374 
2375 	"000000000000000000000000000000000000000000000000",
2376 	"ffffff80000000000000000000000000",
2377 	"0cf3e9d3a42be5b854ca65b13f35f48d",
2378 
2379 	"000000000000000000000000000000000000000000000000",
2380 	"ffffffc0000000000000000000000000",
2381 	"6c62f6bbcab7c3e821c9290f08892dda",
2382 
2383 	"000000000000000000000000000000000000000000000000",
2384 	"ffffffe0000000000000000000000000",
2385 	"7f5e05bd2068738196fee79ace7e3aec",
2386 
2387 	"000000000000000000000000000000000000000000000000",
2388 	"fffffff0000000000000000000000000",
2389 	"440e0d733255cda92fb46e842fe58054",
2390 
2391 	"000000000000000000000000000000000000000000000000",
2392 	"fffffff8000000000000000000000000",
2393 	"aa5d5b1c4ea1b7a22e5583ac2e9ed8a7",
2394 
2395 	"000000000000000000000000000000000000000000000000",
2396 	"fffffffc000000000000000000000000",
2397 	"77e537e89e8491e8662aae3bc809421d",
2398 
2399 	"000000000000000000000000000000000000000000000000",
2400 	"fffffffe000000000000000000000000",
2401 	"997dd3e9f1598bfa73f75973f7e93b76",
2402 
2403 	"000000000000000000000000000000000000000000000000",
2404 	"ffffffff000000000000000000000000",
2405 	"1b38d4f7452afefcb7fc721244e4b72e",
2406 
2407 	"000000000000000000000000000000000000000000000000",
2408 	"ffffffff800000000000000000000000",
2409 	"0be2b18252e774dda30cdda02c6906e3",
2410 
2411 	"000000000000000000000000000000000000000000000000",
2412 	"ffffffffc00000000000000000000000",
2413 	"d2695e59c20361d82652d7d58b6f11b2",
2414 
2415 	"000000000000000000000000000000000000000000000000",
2416 	"ffffffffe00000000000000000000000",
2417 	"902d88d13eae52089abd6143cfe394e9",
2418 
2419 	"000000000000000000000000000000000000000000000000",
2420 	"fffffffff00000000000000000000000",
2421 	"d49bceb3b823fedd602c305345734bd2",
2422 
2423 	"000000000000000000000000000000000000000000000000",
2424 	"fffffffff80000000000000000000000",
2425 	"707b1dbb0ffa40ef7d95def421233fae",
2426 
2427 	"000000000000000000000000000000000000000000000000",
2428 	"fffffffffc0000000000000000000000",
2429 	"7ca0c1d93356d9eb8aa952084d75f913",
2430 
2431 	"000000000000000000000000000000000000000000000000",
2432 	"fffffffffe0000000000000000000000",
2433 	"f2cbf9cb186e270dd7bdb0c28febc57d",
2434 
2435 	"000000000000000000000000000000000000000000000000",
2436 	"ffffffffff0000000000000000000000",
2437 	"c94337c37c4e790ab45780bd9c3674a0",
2438 
2439 	"000000000000000000000000000000000000000000000000",
2440 	"ffffffffff8000000000000000000000",
2441 	"8e3558c135252fb9c9f367ed609467a1",
2442 
2443 	"000000000000000000000000000000000000000000000000",
2444 	"ffffffffffc000000000000000000000",
2445 	"1b72eeaee4899b443914e5b3a57fba92",
2446 
2447 	"000000000000000000000000000000000000000000000000",
2448 	"ffffffffffe000000000000000000000",
2449 	"011865f91bc56868d051e52c9efd59b7",
2450 
2451 	"000000000000000000000000000000000000000000000000",
2452 	"fffffffffff000000000000000000000",
2453 	"e4771318ad7a63dd680f6e583b7747ea",
2454 
2455 	"000000000000000000000000000000000000000000000000",
2456 	"fffffffffff800000000000000000000",
2457 	"61e3d194088dc8d97e9e6db37457eac5",
2458 
2459 	"000000000000000000000000000000000000000000000000",
2460 	"fffffffffffc00000000000000000000",
2461 	"36ff1ec9ccfbc349e5d356d063693ad6",
2462 
2463 	"000000000000000000000000000000000000000000000000",
2464 	"fffffffffffe00000000000000000000",
2465 	"3cc9e9a9be8cc3f6fb2ea24088e9bb19",
2466 
2467 	"000000000000000000000000000000000000000000000000",
2468 	"ffffffffffff00000000000000000000",
2469 	"1ee5ab003dc8722e74905d9a8fe3d350",
2470 
2471 	"000000000000000000000000000000000000000000000000",
2472 	"ffffffffffff80000000000000000000",
2473 	"245339319584b0a412412869d6c2eada",
2474 
2475 	"000000000000000000000000000000000000000000000000",
2476 	"ffffffffffffc0000000000000000000",
2477 	"7bd496918115d14ed5380852716c8814",
2478 
2479 	"000000000000000000000000000000000000000000000000",
2480 	"ffffffffffffe0000000000000000000",
2481 	"273ab2f2b4a366a57d582a339313c8b1",
2482 
2483 	"000000000000000000000000000000000000000000000000",
2484 	"fffffffffffff0000000000000000000",
2485 	"113365a9ffbe3b0ca61e98507554168b",
2486 
2487 	"000000000000000000000000000000000000000000000000",
2488 	"fffffffffffff8000000000000000000",
2489 	"afa99c997ac478a0dea4119c9e45f8b1",
2490 
2491 	"000000000000000000000000000000000000000000000000",
2492 	"fffffffffffffc000000000000000000",
2493 	"9216309a7842430b83ffb98638011512",
2494 
2495 	"000000000000000000000000000000000000000000000000",
2496 	"fffffffffffffe000000000000000000",
2497 	"62abc792288258492a7cb45145f4b759",
2498 
2499 	"000000000000000000000000000000000000000000000000",
2500 	"ffffffffffffff000000000000000000",
2501 	"534923c169d504d7519c15d30e756c50",
2502 
2503 	"000000000000000000000000000000000000000000000000",
2504 	"ffffffffffffff800000000000000000",
2505 	"fa75e05bcdc7e00c273fa33f6ee441d2",
2506 
2507 	"000000000000000000000000000000000000000000000000",
2508 	"ffffffffffffffc00000000000000000",
2509 	"7d350fa6057080f1086a56b17ec240db",
2510 
2511 	"000000000000000000000000000000000000000000000000",
2512 	"ffffffffffffffe00000000000000000",
2513 	"f34e4a6324ea4a5c39a661c8fe5ada8f",
2514 
2515 	"000000000000000000000000000000000000000000000000",
2516 	"fffffffffffffff00000000000000000",
2517 	"0882a16f44088d42447a29ac090ec17e",
2518 
2519 	"000000000000000000000000000000000000000000000000",
2520 	"fffffffffffffff80000000000000000",
2521 	"3a3c15bfc11a9537c130687004e136ee",
2522 
2523 	"000000000000000000000000000000000000000000000000",
2524 	"fffffffffffffffc0000000000000000",
2525 	"22c0a7678dc6d8cf5c8a6d5a9960767c",
2526 
2527 	"000000000000000000000000000000000000000000000000",
2528 	"fffffffffffffffe0000000000000000",
2529 	"b46b09809d68b9a456432a79bdc2e38c",
2530 
2531 	"000000000000000000000000000000000000000000000000",
2532 	"ffffffffffffffff0000000000000000",
2533 	"93baaffb35fbe739c17c6ac22eecf18f",
2534 
2535 	"000000000000000000000000000000000000000000000000",
2536 	"ffffffffffffffff8000000000000000",
2537 	"c8aa80a7850675bc007c46df06b49868",
2538 
2539 	"000000000000000000000000000000000000000000000000",
2540 	"ffffffffffffffffc000000000000000",
2541 	"12c6f3877af421a918a84b775858021d",
2542 
2543 	"000000000000000000000000000000000000000000000000",
2544 	"ffffffffffffffffe000000000000000",
2545 	"33f123282c5d633924f7d5ba3f3cab11",
2546 
2547 	"000000000000000000000000000000000000000000000000",
2548 	"fffffffffffffffff000000000000000",
2549 	"a8f161002733e93ca4527d22c1a0c5bb",
2550 
2551 	"000000000000000000000000000000000000000000000000",
2552 	"fffffffffffffffff800000000000000",
2553 	"b72f70ebf3e3fda23f508eec76b42c02",
2554 
2555 	"000000000000000000000000000000000000000000000000",
2556 	"fffffffffffffffffc00000000000000",
2557 	"6a9d965e6274143f25afdcfc88ffd77c",
2558 
2559 	"000000000000000000000000000000000000000000000000",
2560 	"fffffffffffffffffe00000000000000",
2561 	"a0c74fd0b9361764ce91c5200b095357",
2562 
2563 	"000000000000000000000000000000000000000000000000",
2564 	"ffffffffffffffffff00000000000000",
2565 	"091d1fdc2bd2c346cd5046a8c6209146",
2566 
2567 	"000000000000000000000000000000000000000000000000",
2568 	"ffffffffffffffffff80000000000000",
2569 	"e2a37580116cfb71856254496ab0aca8",
2570 
2571 	"000000000000000000000000000000000000000000000000",
2572 	"ffffffffffffffffffc0000000000000",
2573 	"e0b3a00785917c7efc9adba322813571",
2574 
2575 	"000000000000000000000000000000000000000000000000",
2576 	"ffffffffffffffffffe0000000000000",
2577 	"733d41f4727b5ef0df4af4cf3cffa0cb",
2578 
2579 	"000000000000000000000000000000000000000000000000",
2580 	"fffffffffffffffffff0000000000000",
2581 	"a99ebb030260826f981ad3e64490aa4f",
2582 
2583 	"000000000000000000000000000000000000000000000000",
2584 	"fffffffffffffffffff8000000000000",
2585 	"73f34c7d3eae5e80082c1647524308ee",
2586 
2587 	"000000000000000000000000000000000000000000000000",
2588 	"fffffffffffffffffffc000000000000",
2589 	"40ebd5ad082345b7a2097ccd3464da02",
2590 
2591 	"000000000000000000000000000000000000000000000000",
2592 	"fffffffffffffffffffe000000000000",
2593 	"7cc4ae9a424b2cec90c97153c2457ec5",
2594 
2595 	"000000000000000000000000000000000000000000000000",
2596 	"ffffffffffffffffffff000000000000",
2597 	"54d632d03aba0bd0f91877ebdd4d09cb",
2598 
2599 	"000000000000000000000000000000000000000000000000",
2600 	"ffffffffffffffffffff800000000000",
2601 	"d3427be7e4d27cd54f5fe37b03cf0897",
2602 
2603 	"000000000000000000000000000000000000000000000000",
2604 	"ffffffffffffffffffffc00000000000",
2605 	"b2099795e88cc158fd75ea133d7e7fbe",
2606 
2607 	"000000000000000000000000000000000000000000000000",
2608 	"ffffffffffffffffffffe00000000000",
2609 	"a6cae46fb6fadfe7a2c302a34242817b",
2610 
2611 	"000000000000000000000000000000000000000000000000",
2612 	"fffffffffffffffffffff00000000000",
2613 	"026a7024d6a902e0b3ffccbaa910cc3f",
2614 
2615 	"000000000000000000000000000000000000000000000000",
2616 	"fffffffffffffffffffff80000000000",
2617 	"156f07767a85a4312321f63968338a01",
2618 
2619 	"000000000000000000000000000000000000000000000000",
2620 	"fffffffffffffffffffffc0000000000",
2621 	"15eec9ebf42b9ca76897d2cd6c5a12e2",
2622 
2623 	"000000000000000000000000000000000000000000000000",
2624 	"fffffffffffffffffffffe0000000000",
2625 	"db0d3a6fdcc13f915e2b302ceeb70fd8",
2626 
2627 	"000000000000000000000000000000000000000000000000",
2628 	"ffffffffffffffffffffff0000000000",
2629 	"71dbf37e87a2e34d15b20e8f10e48924",
2630 
2631 	"000000000000000000000000000000000000000000000000",
2632 	"ffffffffffffffffffffff8000000000",
2633 	"c745c451e96ff3c045e4367c833e3b54",
2634 
2635 	"000000000000000000000000000000000000000000000000",
2636 	"ffffffffffffffffffffffc000000000",
2637 	"340da09c2dd11c3b679d08ccd27dd595",
2638 
2639 	"000000000000000000000000000000000000000000000000",
2640 	"ffffffffffffffffffffffe000000000",
2641 	"8279f7c0c2a03ee660c6d392db025d18",
2642 
2643 	"000000000000000000000000000000000000000000000000",
2644 	"fffffffffffffffffffffff000000000",
2645 	"a4b2c7d8eba531ff47c5041a55fbd1ec",
2646 
2647 	"000000000000000000000000000000000000000000000000",
2648 	"fffffffffffffffffffffff800000000",
2649 	"74569a2ca5a7bd5131ce8dc7cbfbf72f",
2650 
2651 	"000000000000000000000000000000000000000000000000",
2652 	"fffffffffffffffffffffffc00000000",
2653 	"3713da0c0219b63454035613b5a403dd",
2654 
2655 	"000000000000000000000000000000000000000000000000",
2656 	"fffffffffffffffffffffffe00000000",
2657 	"8827551ddcc9df23fa72a3de4e9f0b07",
2658 
2659 	"000000000000000000000000000000000000000000000000",
2660 	"ffffffffffffffffffffffff00000000",
2661 	"2e3febfd625bfcd0a2c06eb460da1732",
2662 
2663 	"000000000000000000000000000000000000000000000000",
2664 	"ffffffffffffffffffffffff80000000",
2665 	"ee82e6ba488156f76496311da6941deb",
2666 
2667 	"000000000000000000000000000000000000000000000000",
2668 	"ffffffffffffffffffffffffc0000000",
2669 	"4770446f01d1f391256e85a1b30d89d3",
2670 
2671 	"000000000000000000000000000000000000000000000000",
2672 	"ffffffffffffffffffffffffe0000000",
2673 	"af04b68f104f21ef2afb4767cf74143c",
2674 
2675 	"000000000000000000000000000000000000000000000000",
2676 	"fffffffffffffffffffffffff0000000",
2677 	"cf3579a9ba38c8e43653173e14f3a4c6",
2678 
2679 	"000000000000000000000000000000000000000000000000",
2680 	"fffffffffffffffffffffffff8000000",
2681 	"b3bba904f4953e09b54800af2f62e7d4",
2682 
2683 	"000000000000000000000000000000000000000000000000",
2684 	"fffffffffffffffffffffffffc000000",
2685 	"fc4249656e14b29eb9c44829b4c59a46",
2686 
2687 	"000000000000000000000000000000000000000000000000",
2688 	"fffffffffffffffffffffffffe000000",
2689 	"9b31568febe81cfc2e65af1c86d1a308",
2690 
2691 	"000000000000000000000000000000000000000000000000",
2692 	"ffffffffffffffffffffffffff000000",
2693 	"9ca09c25f273a766db98a480ce8dfedc",
2694 
2695 	"000000000000000000000000000000000000000000000000",
2696 	"ffffffffffffffffffffffffff800000",
2697 	"b909925786f34c3c92d971883c9fbedf",
2698 
2699 	"000000000000000000000000000000000000000000000000",
2700 	"ffffffffffffffffffffffffffc00000",
2701 	"82647f1332fe570a9d4d92b2ee771d3b",
2702 
2703 	"000000000000000000000000000000000000000000000000",
2704 	"ffffffffffffffffffffffffffe00000",
2705 	"3604a7e80832b3a99954bca6f5b9f501",
2706 
2707 	"000000000000000000000000000000000000000000000000",
2708 	"fffffffffffffffffffffffffff00000",
2709 	"884607b128c5de3ab39a529a1ef51bef",
2710 
2711 	"000000000000000000000000000000000000000000000000",
2712 	"fffffffffffffffffffffffffff80000",
2713 	"670cfa093d1dbdb2317041404102435e",
2714 
2715 	"000000000000000000000000000000000000000000000000",
2716 	"fffffffffffffffffffffffffffc0000",
2717 	"7a867195f3ce8769cbd336502fbb5130",
2718 
2719 	"000000000000000000000000000000000000000000000000",
2720 	"fffffffffffffffffffffffffffe0000",
2721 	"52efcf64c72b2f7ca5b3c836b1078c15",
2722 
2723 	"000000000000000000000000000000000000000000000000",
2724 	"ffffffffffffffffffffffffffff0000",
2725 	"4019250f6eefb2ac5ccbcae044e75c7e",
2726 
2727 	"000000000000000000000000000000000000000000000000",
2728 	"ffffffffffffffffffffffffffff8000",
2729 	"022c4f6f5a017d292785627667ddef24",
2730 
2731 	"000000000000000000000000000000000000000000000000",
2732 	"ffffffffffffffffffffffffffffc000",
2733 	"e9c21078a2eb7e03250f71000fa9e3ed",
2734 
2735 	"000000000000000000000000000000000000000000000000",
2736 	"ffffffffffffffffffffffffffffe000",
2737 	"a13eaeeb9cd391da4e2b09490b3e7fad",
2738 
2739 	"000000000000000000000000000000000000000000000000",
2740 	"fffffffffffffffffffffffffffff000",
2741 	"c958a171dca1d4ed53e1af1d380803a9",
2742 
2743 	"000000000000000000000000000000000000000000000000",
2744 	"fffffffffffffffffffffffffffff800",
2745 	"21442e07a110667f2583eaeeee44dc8c",
2746 
2747 	"000000000000000000000000000000000000000000000000",
2748 	"fffffffffffffffffffffffffffffc00",
2749 	"59bbb353cf1dd867a6e33737af655e99",
2750 
2751 	"000000000000000000000000000000000000000000000000",
2752 	"fffffffffffffffffffffffffffffe00",
2753 	"43cd3b25375d0ce41087ff9fe2829639",
2754 
2755 	"000000000000000000000000000000000000000000000000",
2756 	"ffffffffffffffffffffffffffffff00",
2757 	"6b98b17e80d1118e3516bd768b285a84",
2758 
2759 	"000000000000000000000000000000000000000000000000",
2760 	"ffffffffffffffffffffffffffffff80",
2761 	"ae47ed3676ca0c08deea02d95b81db58",
2762 
2763 	"000000000000000000000000000000000000000000000000",
2764 	"ffffffffffffffffffffffffffffffc0",
2765 	"34ec40dc20413795ed53628ea748720b",
2766 
2767 	"000000000000000000000000000000000000000000000000",
2768 	"ffffffffffffffffffffffffffffffe0",
2769 	"4dc68163f8e9835473253542c8a65d46",
2770 
2771 	"000000000000000000000000000000000000000000000000",
2772 	"fffffffffffffffffffffffffffffff0",
2773 	"2aabb999f43693175af65c6c612c46fb",
2774 
2775 	"000000000000000000000000000000000000000000000000",
2776 	"fffffffffffffffffffffffffffffff8",
2777 	"e01f94499dac3547515c5b1d756f0f58",
2778 
2779 	"000000000000000000000000000000000000000000000000",
2780 	"fffffffffffffffffffffffffffffffc",
2781 	"9d12435a46480ce00ea349f71799df9a",
2782 
2783 	"000000000000000000000000000000000000000000000000",
2784 	"fffffffffffffffffffffffffffffffe",
2785 	"cef41d16d266bdfe46938ad7884cc0cf",
2786 
2787 	"000000000000000000000000000000000000000000000000",
2788 	"ffffffffffffffffffffffffffffffff",
2789 	"b13db4da1f718bc6904797c82bcf2d32",
2790 
2791 	/*
2792 	 * From NIST validation suite (ECBVarTxt256.rsp).
2793 	 */
2794 	"0000000000000000000000000000000000000000000000000000000000000000",
2795 	"80000000000000000000000000000000",
2796 	"ddc6bf790c15760d8d9aeb6f9a75fd4e",
2797 
2798 	"0000000000000000000000000000000000000000000000000000000000000000",
2799 	"c0000000000000000000000000000000",
2800 	"0a6bdc6d4c1e6280301fd8e97ddbe601",
2801 
2802 	"0000000000000000000000000000000000000000000000000000000000000000",
2803 	"e0000000000000000000000000000000",
2804 	"9b80eefb7ebe2d2b16247aa0efc72f5d",
2805 
2806 	"0000000000000000000000000000000000000000000000000000000000000000",
2807 	"f0000000000000000000000000000000",
2808 	"7f2c5ece07a98d8bee13c51177395ff7",
2809 
2810 	"0000000000000000000000000000000000000000000000000000000000000000",
2811 	"f8000000000000000000000000000000",
2812 	"7818d800dcf6f4be1e0e94f403d1e4c2",
2813 
2814 	"0000000000000000000000000000000000000000000000000000000000000000",
2815 	"fc000000000000000000000000000000",
2816 	"e74cd1c92f0919c35a0324123d6177d3",
2817 
2818 	"0000000000000000000000000000000000000000000000000000000000000000",
2819 	"fe000000000000000000000000000000",
2820 	"8092a4dcf2da7e77e93bdd371dfed82e",
2821 
2822 	"0000000000000000000000000000000000000000000000000000000000000000",
2823 	"ff000000000000000000000000000000",
2824 	"49af6b372135acef10132e548f217b17",
2825 
2826 	"0000000000000000000000000000000000000000000000000000000000000000",
2827 	"ff800000000000000000000000000000",
2828 	"8bcd40f94ebb63b9f7909676e667f1e7",
2829 
2830 	"0000000000000000000000000000000000000000000000000000000000000000",
2831 	"ffc00000000000000000000000000000",
2832 	"fe1cffb83f45dcfb38b29be438dbd3ab",
2833 
2834 	"0000000000000000000000000000000000000000000000000000000000000000",
2835 	"ffe00000000000000000000000000000",
2836 	"0dc58a8d886623705aec15cb1e70dc0e",
2837 
2838 	"0000000000000000000000000000000000000000000000000000000000000000",
2839 	"fff00000000000000000000000000000",
2840 	"c218faa16056bd0774c3e8d79c35a5e4",
2841 
2842 	"0000000000000000000000000000000000000000000000000000000000000000",
2843 	"fff80000000000000000000000000000",
2844 	"047bba83f7aa841731504e012208fc9e",
2845 
2846 	"0000000000000000000000000000000000000000000000000000000000000000",
2847 	"fffc0000000000000000000000000000",
2848 	"dc8f0e4915fd81ba70a331310882f6da",
2849 
2850 	"0000000000000000000000000000000000000000000000000000000000000000",
2851 	"fffe0000000000000000000000000000",
2852 	"1569859ea6b7206c30bf4fd0cbfac33c",
2853 
2854 	"0000000000000000000000000000000000000000000000000000000000000000",
2855 	"ffff0000000000000000000000000000",
2856 	"300ade92f88f48fa2df730ec16ef44cd",
2857 
2858 	"0000000000000000000000000000000000000000000000000000000000000000",
2859 	"ffff8000000000000000000000000000",
2860 	"1fe6cc3c05965dc08eb0590c95ac71d0",
2861 
2862 	"0000000000000000000000000000000000000000000000000000000000000000",
2863 	"ffffc000000000000000000000000000",
2864 	"59e858eaaa97fec38111275b6cf5abc0",
2865 
2866 	"0000000000000000000000000000000000000000000000000000000000000000",
2867 	"ffffe000000000000000000000000000",
2868 	"2239455e7afe3b0616100288cc5a723b",
2869 
2870 	"0000000000000000000000000000000000000000000000000000000000000000",
2871 	"fffff000000000000000000000000000",
2872 	"3ee500c5c8d63479717163e55c5c4522",
2873 
2874 	"0000000000000000000000000000000000000000000000000000000000000000",
2875 	"fffff800000000000000000000000000",
2876 	"d5e38bf15f16d90e3e214041d774daa8",
2877 
2878 	"0000000000000000000000000000000000000000000000000000000000000000",
2879 	"fffffc00000000000000000000000000",
2880 	"b1f4066e6f4f187dfe5f2ad1b17819d0",
2881 
2882 	"0000000000000000000000000000000000000000000000000000000000000000",
2883 	"fffffe00000000000000000000000000",
2884 	"6ef4cc4de49b11065d7af2909854794a",
2885 
2886 	"0000000000000000000000000000000000000000000000000000000000000000",
2887 	"ffffff00000000000000000000000000",
2888 	"ac86bc606b6640c309e782f232bf367f",
2889 
2890 	"0000000000000000000000000000000000000000000000000000000000000000",
2891 	"ffffff80000000000000000000000000",
2892 	"36aff0ef7bf3280772cf4cac80a0d2b2",
2893 
2894 	"0000000000000000000000000000000000000000000000000000000000000000",
2895 	"ffffffc0000000000000000000000000",
2896 	"1f8eedea0f62a1406d58cfc3ecea72cf",
2897 
2898 	"0000000000000000000000000000000000000000000000000000000000000000",
2899 	"ffffffe0000000000000000000000000",
2900 	"abf4154a3375a1d3e6b1d454438f95a6",
2901 
2902 	"0000000000000000000000000000000000000000000000000000000000000000",
2903 	"fffffff0000000000000000000000000",
2904 	"96f96e9d607f6615fc192061ee648b07",
2905 
2906 	"0000000000000000000000000000000000000000000000000000000000000000",
2907 	"fffffff8000000000000000000000000",
2908 	"cf37cdaaa0d2d536c71857634c792064",
2909 
2910 	"0000000000000000000000000000000000000000000000000000000000000000",
2911 	"fffffffc000000000000000000000000",
2912 	"fbd6640c80245c2b805373f130703127",
2913 
2914 	"0000000000000000000000000000000000000000000000000000000000000000",
2915 	"fffffffe000000000000000000000000",
2916 	"8d6a8afe55a6e481badae0d146f436db",
2917 
2918 	"0000000000000000000000000000000000000000000000000000000000000000",
2919 	"ffffffff000000000000000000000000",
2920 	"6a4981f2915e3e68af6c22385dd06756",
2921 
2922 	"0000000000000000000000000000000000000000000000000000000000000000",
2923 	"ffffffff800000000000000000000000",
2924 	"42a1136e5f8d8d21d3101998642d573b",
2925 
2926 	"0000000000000000000000000000000000000000000000000000000000000000",
2927 	"ffffffffc00000000000000000000000",
2928 	"9b471596dc69ae1586cee6158b0b0181",
2929 
2930 	"0000000000000000000000000000000000000000000000000000000000000000",
2931 	"ffffffffe00000000000000000000000",
2932 	"753665c4af1eff33aa8b628bf8741cfd",
2933 
2934 	"0000000000000000000000000000000000000000000000000000000000000000",
2935 	"fffffffff00000000000000000000000",
2936 	"9a682acf40be01f5b2a4193c9a82404d",
2937 
2938 	"0000000000000000000000000000000000000000000000000000000000000000",
2939 	"fffffffff80000000000000000000000",
2940 	"54fafe26e4287f17d1935f87eb9ade01",
2941 
2942 	"0000000000000000000000000000000000000000000000000000000000000000",
2943 	"fffffffffc0000000000000000000000",
2944 	"49d541b2e74cfe73e6a8e8225f7bd449",
2945 
2946 	"0000000000000000000000000000000000000000000000000000000000000000",
2947 	"fffffffffe0000000000000000000000",
2948 	"11a45530f624ff6f76a1b3826626ff7b",
2949 
2950 	"0000000000000000000000000000000000000000000000000000000000000000",
2951 	"ffffffffff0000000000000000000000",
2952 	"f96b0c4a8bc6c86130289f60b43b8fba",
2953 
2954 	"0000000000000000000000000000000000000000000000000000000000000000",
2955 	"ffffffffff8000000000000000000000",
2956 	"48c7d0e80834ebdc35b6735f76b46c8b",
2957 
2958 	"0000000000000000000000000000000000000000000000000000000000000000",
2959 	"ffffffffffc000000000000000000000",
2960 	"2463531ab54d66955e73edc4cb8eaa45",
2961 
2962 	"0000000000000000000000000000000000000000000000000000000000000000",
2963 	"ffffffffffe000000000000000000000",
2964 	"ac9bd8e2530469134b9d5b065d4f565b",
2965 
2966 	"0000000000000000000000000000000000000000000000000000000000000000",
2967 	"fffffffffff000000000000000000000",
2968 	"3f5f9106d0e52f973d4890e6f37e8a00",
2969 
2970 	"0000000000000000000000000000000000000000000000000000000000000000",
2971 	"fffffffffff800000000000000000000",
2972 	"20ebc86f1304d272e2e207e59db639f0",
2973 
2974 	"0000000000000000000000000000000000000000000000000000000000000000",
2975 	"fffffffffffc00000000000000000000",
2976 	"e67ae6426bf9526c972cff072b52252c",
2977 
2978 	"0000000000000000000000000000000000000000000000000000000000000000",
2979 	"fffffffffffe00000000000000000000",
2980 	"1a518dddaf9efa0d002cc58d107edfc8",
2981 
2982 	"0000000000000000000000000000000000000000000000000000000000000000",
2983 	"ffffffffffff00000000000000000000",
2984 	"ead731af4d3a2fe3b34bed047942a49f",
2985 
2986 	"0000000000000000000000000000000000000000000000000000000000000000",
2987 	"ffffffffffff80000000000000000000",
2988 	"b1d4efe40242f83e93b6c8d7efb5eae9",
2989 
2990 	"0000000000000000000000000000000000000000000000000000000000000000",
2991 	"ffffffffffffc0000000000000000000",
2992 	"cd2b1fec11fd906c5c7630099443610a",
2993 
2994 	"0000000000000000000000000000000000000000000000000000000000000000",
2995 	"ffffffffffffe0000000000000000000",
2996 	"a1853fe47fe29289d153161d06387d21",
2997 
2998 	"0000000000000000000000000000000000000000000000000000000000000000",
2999 	"fffffffffffff0000000000000000000",
3000 	"4632154179a555c17ea604d0889fab14",
3001 
3002 	"0000000000000000000000000000000000000000000000000000000000000000",
3003 	"fffffffffffff8000000000000000000",
3004 	"dd27cac6401a022e8f38f9f93e774417",
3005 
3006 	"0000000000000000000000000000000000000000000000000000000000000000",
3007 	"fffffffffffffc000000000000000000",
3008 	"c090313eb98674f35f3123385fb95d4d",
3009 
3010 	"0000000000000000000000000000000000000000000000000000000000000000",
3011 	"fffffffffffffe000000000000000000",
3012 	"cc3526262b92f02edce548f716b9f45c",
3013 
3014 	"0000000000000000000000000000000000000000000000000000000000000000",
3015 	"ffffffffffffff000000000000000000",
3016 	"c0838d1a2b16a7c7f0dfcc433c399c33",
3017 
3018 	"0000000000000000000000000000000000000000000000000000000000000000",
3019 	"ffffffffffffff800000000000000000",
3020 	"0d9ac756eb297695eed4d382eb126d26",
3021 
3022 	"0000000000000000000000000000000000000000000000000000000000000000",
3023 	"ffffffffffffffc00000000000000000",
3024 	"56ede9dda3f6f141bff1757fa689c3e1",
3025 
3026 	"0000000000000000000000000000000000000000000000000000000000000000",
3027 	"ffffffffffffffe00000000000000000",
3028 	"768f520efe0f23e61d3ec8ad9ce91774",
3029 
3030 	"0000000000000000000000000000000000000000000000000000000000000000",
3031 	"fffffffffffffff00000000000000000",
3032 	"b1144ddfa75755213390e7c596660490",
3033 
3034 	"0000000000000000000000000000000000000000000000000000000000000000",
3035 	"fffffffffffffff80000000000000000",
3036 	"1d7c0c4040b355b9d107a99325e3b050",
3037 
3038 	"0000000000000000000000000000000000000000000000000000000000000000",
3039 	"fffffffffffffffc0000000000000000",
3040 	"d8e2bb1ae8ee3dcf5bf7d6c38da82a1a",
3041 
3042 	"0000000000000000000000000000000000000000000000000000000000000000",
3043 	"fffffffffffffffe0000000000000000",
3044 	"faf82d178af25a9886a47e7f789b98d7",
3045 
3046 	"0000000000000000000000000000000000000000000000000000000000000000",
3047 	"ffffffffffffffff0000000000000000",
3048 	"9b58dbfd77fe5aca9cfc190cd1b82d19",
3049 
3050 	"0000000000000000000000000000000000000000000000000000000000000000",
3051 	"ffffffffffffffff8000000000000000",
3052 	"77f392089042e478ac16c0c86a0b5db5",
3053 
3054 	"0000000000000000000000000000000000000000000000000000000000000000",
3055 	"ffffffffffffffffc000000000000000",
3056 	"19f08e3420ee69b477ca1420281c4782",
3057 
3058 	"0000000000000000000000000000000000000000000000000000000000000000",
3059 	"ffffffffffffffffe000000000000000",
3060 	"a1b19beee4e117139f74b3c53fdcb875",
3061 
3062 	"0000000000000000000000000000000000000000000000000000000000000000",
3063 	"fffffffffffffffff000000000000000",
3064 	"a37a5869b218a9f3a0868d19aea0ad6a",
3065 
3066 	"0000000000000000000000000000000000000000000000000000000000000000",
3067 	"fffffffffffffffff800000000000000",
3068 	"bc3594e865bcd0261b13202731f33580",
3069 
3070 	"0000000000000000000000000000000000000000000000000000000000000000",
3071 	"fffffffffffffffffc00000000000000",
3072 	"811441ce1d309eee7185e8c752c07557",
3073 
3074 	"0000000000000000000000000000000000000000000000000000000000000000",
3075 	"fffffffffffffffffe00000000000000",
3076 	"959971ce4134190563518e700b9874d1",
3077 
3078 	"0000000000000000000000000000000000000000000000000000000000000000",
3079 	"ffffffffffffffffff00000000000000",
3080 	"76b5614a042707c98e2132e2e805fe63",
3081 
3082 	"0000000000000000000000000000000000000000000000000000000000000000",
3083 	"ffffffffffffffffff80000000000000",
3084 	"7d9fa6a57530d0f036fec31c230b0cc6",
3085 
3086 	"0000000000000000000000000000000000000000000000000000000000000000",
3087 	"ffffffffffffffffffc0000000000000",
3088 	"964153a83bf6989a4ba80daa91c3e081",
3089 
3090 	"0000000000000000000000000000000000000000000000000000000000000000",
3091 	"ffffffffffffffffffe0000000000000",
3092 	"a013014d4ce8054cf2591d06f6f2f176",
3093 
3094 	"0000000000000000000000000000000000000000000000000000000000000000",
3095 	"fffffffffffffffffff0000000000000",
3096 	"d1c5f6399bf382502e385eee1474a869",
3097 
3098 	"0000000000000000000000000000000000000000000000000000000000000000",
3099 	"fffffffffffffffffff8000000000000",
3100 	"0007e20b8298ec354f0f5fe7470f36bd",
3101 
3102 	"0000000000000000000000000000000000000000000000000000000000000000",
3103 	"fffffffffffffffffffc000000000000",
3104 	"b95ba05b332da61ef63a2b31fcad9879",
3105 
3106 	"0000000000000000000000000000000000000000000000000000000000000000",
3107 	"fffffffffffffffffffe000000000000",
3108 	"4620a49bd967491561669ab25dce45f4",
3109 
3110 	"0000000000000000000000000000000000000000000000000000000000000000",
3111 	"ffffffffffffffffffff000000000000",
3112 	"12e71214ae8e04f0bb63d7425c6f14d5",
3113 
3114 	"0000000000000000000000000000000000000000000000000000000000000000",
3115 	"ffffffffffffffffffff800000000000",
3116 	"4cc42fc1407b008fe350907c092e80ac",
3117 
3118 	"0000000000000000000000000000000000000000000000000000000000000000",
3119 	"ffffffffffffffffffffc00000000000",
3120 	"08b244ce7cbc8ee97fbba808cb146fda",
3121 
3122 	"0000000000000000000000000000000000000000000000000000000000000000",
3123 	"ffffffffffffffffffffe00000000000",
3124 	"39b333e8694f21546ad1edd9d87ed95b",
3125 
3126 	"0000000000000000000000000000000000000000000000000000000000000000",
3127 	"fffffffffffffffffffff00000000000",
3128 	"3b271f8ab2e6e4a20ba8090f43ba78f3",
3129 
3130 	"0000000000000000000000000000000000000000000000000000000000000000",
3131 	"fffffffffffffffffffff80000000000",
3132 	"9ad983f3bf651cd0393f0a73cccdea50",
3133 
3134 	"0000000000000000000000000000000000000000000000000000000000000000",
3135 	"fffffffffffffffffffffc0000000000",
3136 	"8f476cbff75c1f725ce18e4bbcd19b32",
3137 
3138 	"0000000000000000000000000000000000000000000000000000000000000000",
3139 	"fffffffffffffffffffffe0000000000",
3140 	"905b6267f1d6ab5320835a133f096f2a",
3141 
3142 	"0000000000000000000000000000000000000000000000000000000000000000",
3143 	"ffffffffffffffffffffff0000000000",
3144 	"145b60d6d0193c23f4221848a892d61a",
3145 
3146 	"0000000000000000000000000000000000000000000000000000000000000000",
3147 	"ffffffffffffffffffffff8000000000",
3148 	"55cfb3fb6d75cad0445bbc8dafa25b0f",
3149 
3150 	"0000000000000000000000000000000000000000000000000000000000000000",
3151 	"ffffffffffffffffffffffc000000000",
3152 	"7b8e7098e357ef71237d46d8b075b0f5",
3153 
3154 	"0000000000000000000000000000000000000000000000000000000000000000",
3155 	"ffffffffffffffffffffffe000000000",
3156 	"2bf27229901eb40f2df9d8398d1505ae",
3157 
3158 	"0000000000000000000000000000000000000000000000000000000000000000",
3159 	"fffffffffffffffffffffff000000000",
3160 	"83a63402a77f9ad5c1e931a931ecd706",
3161 
3162 	"0000000000000000000000000000000000000000000000000000000000000000",
3163 	"fffffffffffffffffffffff800000000",
3164 	"6f8ba6521152d31f2bada1843e26b973",
3165 
3166 	"0000000000000000000000000000000000000000000000000000000000000000",
3167 	"fffffffffffffffffffffffc00000000",
3168 	"e5c3b8e30fd2d8e6239b17b44bd23bbd",
3169 
3170 	"0000000000000000000000000000000000000000000000000000000000000000",
3171 	"fffffffffffffffffffffffe00000000",
3172 	"1ac1f7102c59933e8b2ddc3f14e94baa",
3173 
3174 	"0000000000000000000000000000000000000000000000000000000000000000",
3175 	"ffffffffffffffffffffffff00000000",
3176 	"21d9ba49f276b45f11af8fc71a088e3d",
3177 
3178 	"0000000000000000000000000000000000000000000000000000000000000000",
3179 	"ffffffffffffffffffffffff80000000",
3180 	"649f1cddc3792b4638635a392bc9bade",
3181 
3182 	"0000000000000000000000000000000000000000000000000000000000000000",
3183 	"ffffffffffffffffffffffffc0000000",
3184 	"e2775e4b59c1bc2e31a2078c11b5a08c",
3185 
3186 	"0000000000000000000000000000000000000000000000000000000000000000",
3187 	"ffffffffffffffffffffffffe0000000",
3188 	"2be1fae5048a25582a679ca10905eb80",
3189 
3190 	"0000000000000000000000000000000000000000000000000000000000000000",
3191 	"fffffffffffffffffffffffff0000000",
3192 	"da86f292c6f41ea34fb2068df75ecc29",
3193 
3194 	"0000000000000000000000000000000000000000000000000000000000000000",
3195 	"fffffffffffffffffffffffff8000000",
3196 	"220df19f85d69b1b562fa69a3c5beca5",
3197 
3198 	"0000000000000000000000000000000000000000000000000000000000000000",
3199 	"fffffffffffffffffffffffffc000000",
3200 	"1f11d5d0355e0b556ccdb6c7f5083b4d",
3201 
3202 	"0000000000000000000000000000000000000000000000000000000000000000",
3203 	"fffffffffffffffffffffffffe000000",
3204 	"62526b78be79cb384633c91f83b4151b",
3205 
3206 	"0000000000000000000000000000000000000000000000000000000000000000",
3207 	"ffffffffffffffffffffffffff000000",
3208 	"90ddbcb950843592dd47bbef00fdc876",
3209 
3210 	"0000000000000000000000000000000000000000000000000000000000000000",
3211 	"ffffffffffffffffffffffffff800000",
3212 	"2fd0e41c5b8402277354a7391d2618e2",
3213 
3214 	"0000000000000000000000000000000000000000000000000000000000000000",
3215 	"ffffffffffffffffffffffffffc00000",
3216 	"3cdf13e72dee4c581bafec70b85f9660",
3217 
3218 	"0000000000000000000000000000000000000000000000000000000000000000",
3219 	"ffffffffffffffffffffffffffe00000",
3220 	"afa2ffc137577092e2b654fa199d2c43",
3221 
3222 	"0000000000000000000000000000000000000000000000000000000000000000",
3223 	"fffffffffffffffffffffffffff00000",
3224 	"8d683ee63e60d208e343ce48dbc44cac",
3225 
3226 	"0000000000000000000000000000000000000000000000000000000000000000",
3227 	"fffffffffffffffffffffffffff80000",
3228 	"705a4ef8ba2133729c20185c3d3a4763",
3229 
3230 	"0000000000000000000000000000000000000000000000000000000000000000",
3231 	"fffffffffffffffffffffffffffc0000",
3232 	"0861a861c3db4e94194211b77ed761b9",
3233 
3234 	"0000000000000000000000000000000000000000000000000000000000000000",
3235 	"fffffffffffffffffffffffffffe0000",
3236 	"4b00c27e8b26da7eab9d3a88dec8b031",
3237 
3238 	"0000000000000000000000000000000000000000000000000000000000000000",
3239 	"ffffffffffffffffffffffffffff0000",
3240 	"5f397bf03084820cc8810d52e5b666e9",
3241 
3242 	"0000000000000000000000000000000000000000000000000000000000000000",
3243 	"ffffffffffffffffffffffffffff8000",
3244 	"63fafabb72c07bfbd3ddc9b1203104b8",
3245 
3246 	"0000000000000000000000000000000000000000000000000000000000000000",
3247 	"ffffffffffffffffffffffffffffc000",
3248 	"683e2140585b18452dd4ffbb93c95df9",
3249 
3250 	"0000000000000000000000000000000000000000000000000000000000000000",
3251 	"ffffffffffffffffffffffffffffe000",
3252 	"286894e48e537f8763b56707d7d155c8",
3253 
3254 	"0000000000000000000000000000000000000000000000000000000000000000",
3255 	"fffffffffffffffffffffffffffff000",
3256 	"a423deabc173dcf7e2c4c53e77d37cd1",
3257 
3258 	"0000000000000000000000000000000000000000000000000000000000000000",
3259 	"fffffffffffffffffffffffffffff800",
3260 	"eb8168313e1cfdfdb5e986d5429cf172",
3261 
3262 	"0000000000000000000000000000000000000000000000000000000000000000",
3263 	"fffffffffffffffffffffffffffffc00",
3264 	"27127daafc9accd2fb334ec3eba52323",
3265 
3266 	"0000000000000000000000000000000000000000000000000000000000000000",
3267 	"fffffffffffffffffffffffffffffe00",
3268 	"ee0715b96f72e3f7a22a5064fc592f4c",
3269 
3270 	"0000000000000000000000000000000000000000000000000000000000000000",
3271 	"ffffffffffffffffffffffffffffff00",
3272 	"29ee526770f2a11dcfa989d1ce88830f",
3273 
3274 	"0000000000000000000000000000000000000000000000000000000000000000",
3275 	"ffffffffffffffffffffffffffffff80",
3276 	"0493370e054b09871130fe49af730a5a",
3277 
3278 	"0000000000000000000000000000000000000000000000000000000000000000",
3279 	"ffffffffffffffffffffffffffffffc0",
3280 	"9b7b940f6c509f9e44a4ee140448ee46",
3281 
3282 	"0000000000000000000000000000000000000000000000000000000000000000",
3283 	"ffffffffffffffffffffffffffffffe0",
3284 	"2915be4a1ecfdcbe3e023811a12bb6c7",
3285 
3286 	"0000000000000000000000000000000000000000000000000000000000000000",
3287 	"fffffffffffffffffffffffffffffff0",
3288 	"7240e524bc51d8c4d440b1be55d1062c",
3289 
3290 	"0000000000000000000000000000000000000000000000000000000000000000",
3291 	"fffffffffffffffffffffffffffffff8",
3292 	"da63039d38cb4612b2dc36ba26684b93",
3293 
3294 	"0000000000000000000000000000000000000000000000000000000000000000",
3295 	"fffffffffffffffffffffffffffffffc",
3296 	"0f59cb5a4b522e2ac56c1a64f558ad9a",
3297 
3298 	"0000000000000000000000000000000000000000000000000000000000000000",
3299 	"fffffffffffffffffffffffffffffffe",
3300 	"7bfe9d876c6d63c1d035da8fe21c409d",
3301 
3302 	"0000000000000000000000000000000000000000000000000000000000000000",
3303 	"ffffffffffffffffffffffffffffffff",
3304 	"acdace8078a32b1a182bfa4987ca1347",
3305 
3306 	/*
3307 	 * Table end marker.
3308 	 */
3309 	NULL
3310 };
3311 
3312 /*
3313  * AES known-answer tests for CBC. Order: key, IV, plaintext, ciphertext.
3314  */
3315 static const char *const KAT_AES_CBC[] = {
3316 	/*
3317 	 * From NIST validation suite "Multiblock Message Test"
3318 	 * (cbcmmt128.rsp).
3319 	 */
3320 	"1f8e4973953f3fb0bd6b16662e9a3c17",
3321 	"2fe2b333ceda8f98f4a99b40d2cd34a8",
3322 	"45cf12964fc824ab76616ae2f4bf0822",
3323 	"0f61c4d44c5147c03c195ad7e2cc12b2",
3324 
3325 	"0700d603a1c514e46b6191ba430a3a0c",
3326 	"aad1583cd91365e3bb2f0c3430d065bb",
3327 	"068b25c7bfb1f8bdd4cfc908f69dffc5ddc726a197f0e5f720f730393279be91",
3328 	"c4dc61d9725967a3020104a9738f23868527ce839aab1752fd8bdb95a82c4d00",
3329 
3330 	"3348aa51e9a45c2dbe33ccc47f96e8de",
3331 	"19153c673160df2b1d38c28060e59b96",
3332 	"9b7cee827a26575afdbb7c7a329f887238052e3601a7917456ba61251c214763d5e1847a6ad5d54127a399ab07ee3599",
3333 	"d5aed6c9622ec451a15db12819952b6752501cf05cdbf8cda34a457726ded97818e1f127a28d72db5652749f0c6afee5",
3334 
3335 	"b7f3c9576e12dd0db63e8f8fac2b9a39",
3336 	"c80f095d8bb1a060699f7c19974a1aa0",
3337 	"9ac19954ce1319b354d3220460f71c1e373f1cd336240881160cfde46ebfed2e791e8d5a1a136ebd1dc469dec00c4187722b841cdabcb22c1be8a14657da200e",
3338 	"19b9609772c63f338608bf6eb52ca10be65097f89c1e0905c42401fd47791ae2c5440b2d473116ca78bd9ff2fb6015cfd316524eae7dcb95ae738ebeae84a467",
3339 
3340 	"b6f9afbfe5a1562bba1368fc72ac9d9c",
3341 	"3f9d5ebe250ee7ce384b0d00ee849322",
3342 	"db397ec22718dbffb9c9d13de0efcd4611bf792be4fce0dc5f25d4f577ed8cdbd4eb9208d593dda3d4653954ab64f05676caa3ce9bfa795b08b67ceebc923fdc89a8c431188e9e482d8553982cf304d1",
3343 	"10ea27b19e16b93af169c4a88e06e35c99d8b420980b058e34b4b8f132b13766f72728202b089f428fecdb41c79f8aa0d0ef68f5786481cca29e2126f69bc14160f1ae2187878ba5c49cf3961e1b7ee9",
3344 
3345 	"bbe7b7ba07124ff1ae7c3416fe8b465e",
3346 	"7f65b5ee3630bed6b84202d97fb97a1e",
3347 	"2aad0c2c4306568bad7447460fd3dac054346d26feddbc9abd9110914011b4794be2a9a00a519a51a5b5124014f4ed2735480db21b434e99a911bb0b60fe0253763725b628d5739a5117b7ee3aefafc5b4c1bf446467e7bf5f78f31ff7caf187",
3348 	"3b8611bfc4973c5cd8e982b073b33184cd26110159172e44988eb5ff5661a1e16fad67258fcbfee55469267a12dc374893b4e3533d36f5634c3095583596f135aa8cd1138dc898bc5651ee35a92ebf89ab6aeb5366653bc60a70e0074fc11efe",
3349 
3350 	"89a553730433f7e6d67d16d373bd5360",
3351 	"f724558db3433a523f4e51a5bea70497",
3352 	"807bc4ea684eedcfdcca30180680b0f1ae2814f35f36d053c5aea6595a386c1442770f4d7297d8b91825ee7237241da8925dd594ccf676aecd46ca2068e8d37a3a0ec8a7d5185a201e663b5ff36ae197110188a23503763b8218826d23ced74b31e9f6e2d7fbfa6cb43420c7807a8625",
3353 	"406af1429a478c3d07e555c5287a60500d37fc39b68e5bbb9bafd6ddb223828561d6171a308d5b1a4551e8a5e7d572918d25c968d3871848d2f16635caa9847f38590b1df58ab5efb985f2c66cfaf86f61b3f9c0afad6c963c49cee9b8bc81a2ddb06c967f325515a4849eec37ce721a",
3354 
3355 	"c491ca31f91708458e29a925ec558d78",
3356 	"9ef934946e5cd0ae97bd58532cb49381",
3357 	"cb6a787e0dec56f9a165957f81af336ca6b40785d9e94093c6190e5152649f882e874d79ac5e167bd2a74ce5ae088d2ee854f6539e0a94796b1e1bd4c9fcdbc79acbef4d01eeb89776d18af71ae2a4fc47dd66df6c4dbe1d1850e466549a47b636bcc7c2b3a62495b56bb67b6d455f1eebd9bfefecbca6c7f335cfce9b45cb9d",
3358 	"7b2931f5855f717145e00f152a9f4794359b1ffcb3e55f594e33098b51c23a6c74a06c1d94fded7fd2ae42c7db7acaef5844cb33aeddc6852585ed0020a6699d2cb53809cefd169148ce42292afab063443978306c582c18b9ce0da3d084ce4d3c482cfd8fcf1a85084e89fb88b40a084d5e972466d07666126fb761f84078f2",
3359 
3360 	"f6e87d71b0104d6eb06a68dc6a71f498",
3361 	"1c245f26195b76ebebc2edcac412a2f8",
3362 	"f82bef3c73a6f7f80db285726d691db6bf55eec25a859d3ba0e0445f26b9bb3b16a3161ed1866e4dd8f2e5f8ecb4e46d74a7a78c20cdfc7bcc9e479ba7a0caba9438238ad0c01651d5d98de37f03ddce6e6b4bd4ab03cf9e8ed818aedfa1cf963b932067b97d776dce1087196e7e913f7448e38244509f0caf36bd8217e15336d35c149fd4e41707893fdb84014f8729",
3363 	"b09512f3eff9ed0d85890983a73dadbb7c3678d52581be64a8a8fc586f490f2521297a478a0598040ebd0f5509fafb0969f9d9e600eaef33b1b93eed99687b167f89a5065aac439ce46f3b8d22d30865e64e45ef8cd30b6984353a844a11c8cd60dba0e8866b3ee30d24b3fa8a643b328353e06010fa8273c8fd54ef0a2b6930e5520aae5cd5902f9b86a33592ca4365",
3364 
3365 	"2c14413751c31e2730570ba3361c786b",
3366 	"1dbbeb2f19abb448af849796244a19d7",
3367 	"40d930f9a05334d9816fe204999c3f82a03f6a0457a8c475c94553d1d116693adc618049f0a769a2eed6a6cb14c0143ec5cccdbc8dec4ce560cfd206225709326d4de7948e54d603d01b12d7fed752fb23f1aa4494fbb00130e9ded4e77e37c079042d828040c325b1a5efd15fc842e44014ca4374bf38f3c3fc3ee327733b0c8aee1abcd055772f18dc04603f7b2c1ea69ff662361f2be0a171bbdcea1e5d3f",
3368 	"6be8a12800455a320538853e0cba31bd2d80ea0c85164a4c5c261ae485417d93effe2ebc0d0a0b51d6ea18633d210cf63c0c4ddbc27607f2e81ed9113191ef86d56f3b99be6c415a4150299fb846ce7160b40b63baf1179d19275a2e83698376d28b92548c68e06e6d994e2c1501ed297014e702cdefee2f656447706009614d801de1caaf73f8b7fa56cf1ba94b631933bbe577624380850f117435a0355b2b",
3369 
3370 	/*
3371 	 * From NIST validation suite "Multiblock Message Test"
3372 	 * (cbcmmt192.rsp).
3373 	 */
3374 	"ba75f4d1d9d7cf7f551445d56cc1a8ab2a078e15e049dc2c",
3375 	"531ce78176401666aa30db94ec4a30eb",
3376 	"c51fc276774dad94bcdc1d2891ec8668",
3377 	"70dd95a14ee975e239df36ff4aee1d5d",
3378 
3379 	"eab3b19c581aa873e1981c83ab8d83bbf8025111fb2e6b21",
3380 	"f3d6667e8d4d791e60f7505ba383eb05",
3381 	"9d4e4cccd1682321856df069e3f1c6fa391a083a9fb02d59db74c14081b3acc4",
3382 	"51d44779f90d40a80048276c035cb49ca2a47bcb9b9cf7270b9144793787d53f",
3383 
3384 	"16c93bb398f1fc0cf6d68fc7a5673cdf431fa147852b4a2d",
3385 	"eaaeca2e07ddedf562f94df63f0a650f",
3386 	"c5ce958613bf741718c17444484ebaf1050ddcacb59b9590178cbe69d7ad7919608cb03af13bbe04f3506b718a301ea0",
3387 	"ed6a50e0c6921d52d6647f75d67b4fd56ace1fedb8b5a6a997b4d131640547d22c5d884a75e6752b5846b5b33a5181f4",
3388 
3389 	"067bb17b4df785697eaccf961f98e212cb75e6797ce935cb",
3390 	"8b59c9209c529ca8391c9fc0ce033c38",
3391 	"db3785a889b4bd387754da222f0e4c2d2bfe0d79e05bc910fba941beea30f1239eacf0068f4619ec01c368e986fca6b7c58e490579d29611bd10087986eff54f",
3392 	"d5f5589760bf9c762228fde236de1fa2dd2dad448db3fa9be0c4196efd46a35c84dd1ac77d9db58c95918cb317a6430a08d2fb6a8e8b0f1c9b72c7a344dc349f",
3393 
3394 	"0fd39de83e0be77a79c8a4a612e3dd9c8aae2ce35e7a2bf8",
3395 	"7e1d629b84f93b079be51f9a5f5cb23c",
3396 	"38fbda37e28fa86d9d83a4345e419dea95d28c7818ff25925db6ac3aedaf0a86154e20a4dfcc5b1b4192895393e5eb5846c88bdbd41ecf7af3104f410eaee470f5d9017ed460475f626953035a13db1f",
3397 	"edadae2f9a45ff3473e02d904c94d94a30a4d92da4deb6bcb4b0774472694571842039f21c496ef93fd658842c735f8a81fcd0aa578442ab893b18f606aed1bab11f81452dd45e9b56adf2eccf4ea095",
3398 
3399 	"e3fecc75f0075a09b383dfd389a3d33cc9b854b3b254c0f4",
3400 	"36eab883afef936cc38f63284619cd19",
3401 	"931b2f5f3a5820d53a6beaaa6431083a3488f4eb03b0f5b57ef838e1579623103bd6e6800377538b2e51ef708f3c4956432e8a8ee6a34e190642b26ad8bdae6c2af9a6c7996f3b6004d2671e41f1c9f40ee03d1c4a52b0a0654a331f15f34dce",
3402 	"75395974bd32b3665654a6c8e396b88ae34b123575872a7ab687d8e76b46df911a8a590cd01d2f5c330be3a6626e9dd3aa5e10ed14e8ff829811b6fed50f3f533ca4385a1cbca78f5c4744e50f2f8359165c2485d1324e76c3eae76a0ccac629",
3403 
3404 	"f9c27565eb07947c8cb51b79248430f7b1066c3d2fdc3d13",
3405 	"2bd67cc89ab7948d644a49672843cbd9",
3406 	"6abcc270173cf114d44847e911a050db57ba7a2e2c161c6f37ccb6aaa4677bddcaf50cad0b5f8758fcf7c0ebc650ceb5cd52cafb8f8dd3edcece55d9f1f08b9fa8f54365cf56e28b9596a7e1dd1d3418e4444a7724add4cf79d527b183ec88de4be4eeff29c80a97e54f85351cb189ee",
3407 	"ca282924a61187feb40520979106e5cc861957f23828dcb7285e0eaac8a0ca2a6b60503d63d6039f4693dba32fa1f73ae2e709ca94911f28a5edd1f30eaddd54680c43acc9c74cd90d8bb648b4e544275f47e514daa20697f66c738eb30337f017fca1a26da4d1a0cc0a0e98e2463070",
3408 
3409 	"fb09cf9e00dbf883689d079c920077c0073c31890b55bab5",
3410 	"e3c89bd097c3abddf64f4881db6dbfe2",
3411 	"c1a37683fb289467dd1b2c89efba16bbd2ee24cf18d19d44596ded2682c79a2f711c7a32bf6a24badd32a4ee637c73b7a41da6258635650f91fb9ffa45bdfc3cb122136241b3deced8996aa51ea8d3e81c9d70e006a44bc0571ed48623a0d622a93fa9da290baaedf5d9e876c94620945ff8ecc83f27379ed55cf490c5790f27",
3412 	"8158e21420f25b59d6ae943fa1cbf21f02e979f419dab0126a721b7eef55bee9ad97f5ccff7d239057bbc19a8c378142f7672f1d5e7e17d7bebcb0070e8355cace6660171a53b61816ae824a6ef69ce470b6ffd3b5bb4b438874d91d27854d3b6f25860d3868958de3307d62b1339bdddb8a318c0ce0f33c17caf0e9f6040820",
3413 
3414 	"bca6fa3c67fd294e958f66fe8bd64f45f428f5bc8e9733a7",
3415 	"92a47f2833f1450d1da41717bdc6e83c",
3416 	"5becbc31d8bead6d36ae014a5863d14a431e6b55d29ea6baaa417271716db3a33b2e506b452086dfe690834ac2de30bc41254ec5401ec47d064237c7792fdcd7914d8af20eb114756642d519021a8c75a92f6bc53d326ae9a5b7e1b10a9756574692934d9939fc399e0c203f7edf8e7e6482eadd31a0400770e897b48c6bca2b404593045080e93377358c42a0f4dede",
3417 	"926db248cc1ba20f0c57631a7c8aef094f791937b905949e3460240e8bfa6fa483115a1b310b6e4369caebc5262888377b1ddaa5800ea496a2bdff0f9a1031e7129c9a20e35621e7f0b8baca0d87030f2ae7ca8593c8599677a06fd4b26009ead08fecac24caa9cf2cad3b470c8227415a7b1e0f2eab3fad96d70a209c8bb26c627677e2531b9435ca6e3c444d195b5f",
3418 
3419 	"162ad50ee64a0702aa551f571dedc16b2c1b6a1e4d4b5eee",
3420 	"24408038161a2ccae07b029bb66355c1",
3421 	"be8abf00901363987a82cc77d0ec91697ba3857f9e4f84bd79406c138d02698f003276d0449120bef4578d78fecabe8e070e11710b3f0a2744bd52434ec70015884c181ebdfd51c604a71c52e4c0e110bc408cd462b248a80b8a8ac06bb952ac1d7faed144807f1a731b7febcaf7835762defe92eccfc7a9944e1c702cffe6bc86733ed321423121085ac02df8962bcbc1937092eebf0e90a8b20e3dd8c244ae",
3422 	"c82cf2c476dea8cb6a6e607a40d2f0391be82ea9ec84a537a6820f9afb997b76397d005424faa6a74dc4e8c7aa4a8900690f894b6d1dca80675393d2243adac762f159301e357e98b724762310cd5a7bafe1c2a030dba46fd93a9fdb89cc132ca9c17dc72031ec6822ee5a9d99dbca66c784c01b0885cbb62e29d97801927ec415a5d215158d325f9ee689437ad1b7684ad33c0d92739451ac87f39ff8c31b84",
3423 
3424 	/*
3425 	 * From NIST validation suite "Multiblock Message Test"
3426 	 * (cbcmmt256.rsp).
3427 	 */
3428 	"6ed76d2d97c69fd1339589523931f2a6cff554b15f738f21ec72dd97a7330907",
3429 	"851e8764776e6796aab722dbb644ace8",
3430 	"6282b8c05c5c1530b97d4816ca434762",
3431 	"6acc04142e100a65f51b97adf5172c41",
3432 
3433 	"dce26c6b4cfb286510da4eecd2cffe6cdf430f33db9b5f77b460679bd49d13ae",
3434 	"fdeaa134c8d7379d457175fd1a57d3fc",
3435 	"50e9eee1ac528009e8cbcd356975881f957254b13f91d7c6662d10312052eb00",
3436 	"2fa0df722a9fd3b64cb18fb2b3db55ff2267422757289413f8f657507412a64c",
3437 
3438 	"fe8901fecd3ccd2ec5fdc7c7a0b50519c245b42d611a5ef9e90268d59f3edf33",
3439 	"bd416cb3b9892228d8f1df575692e4d0",
3440 	"8d3aa196ec3d7c9b5bb122e7fe77fb1295a6da75abe5d3a510194d3a8a4157d5c89d40619716619859da3ec9b247ced9",
3441 	"608e82c7ab04007adb22e389a44797fed7de090c8c03ca8a2c5acd9e84df37fbc58ce8edb293e98f02b640d6d1d72464",
3442 
3443 	"0493ff637108af6a5b8e90ac1fdf035a3d4bafd1afb573be7ade9e8682e663e5",
3444 	"c0cd2bebccbb6c49920bd5482ac756e8",
3445 	"8b37f9148df4bb25956be6310c73c8dc58ea9714ff49b643107b34c9bff096a94fedd6823526abc27a8e0b16616eee254ab4567dd68e8ccd4c38ac563b13639c",
3446 	"05d5c77729421b08b737e41119fa4438d1f570cc772a4d6c3df7ffeda0384ef84288ce37fc4c4c7d1125a499b051364c389fd639bdda647daa3bdadab2eb5594",
3447 
3448 	"9adc8fbd506e032af7fa20cf5343719de6d1288c158c63d6878aaf64ce26ca85",
3449 	"11958dc6ab81e1c7f01631e9944e620f",
3450 	"c7917f84f747cd8c4b4fedc2219bdbc5f4d07588389d8248854cf2c2f89667a2d7bcf53e73d32684535f42318e24cd45793950b3825e5d5c5c8fcd3e5dda4ce9246d18337ef3052d8b21c5561c8b660e",
3451 	"9c99e68236bb2e929db1089c7750f1b356d39ab9d0c40c3e2f05108ae9d0c30b04832ccdbdc08ebfa426b7f5efde986ed05784ce368193bb3699bc691065ac62e258b9aa4cc557e2b45b49ce05511e65",
3452 
3453 	"73b8faf00b3302ac99855cf6f9e9e48518690a5906a4869d4dcf48d282faae2a",
3454 	"b3cb97a80a539912b8c21f450d3b9395",
3455 	"3adea6e06e42c4f041021491f2775ef6378cb08824165edc4f6448e232175b60d0345b9f9c78df6596ec9d22b7b9e76e8f3c76b32d5d67273f1d83fe7a6fc3dd3c49139170fa5701b3beac61b490f0a9e13f844640c4500f9ad3087adfb0ae10",
3456 	"ac3d6dbafe2e0f740632fd9e820bf6044cd5b1551cbb9cc03c0b25c39ccb7f33b83aacfca40a3265f2bbff879153448acacb88fcfb3bb7b10fe463a68c0109f028382e3e557b1adf02ed648ab6bb895df0205d26ebbfa9a5fd8cebd8e4bee3dc",
3457 
3458 	"9ddf3745896504ff360a51a3eb49c01b79fccebc71c3abcb94a949408b05b2c9",
3459 	"e79026639d4aa230b5ccffb0b29d79bc",
3460 	"cf52e5c3954c51b94c9e38acb8c9a7c76aebdaa9943eae0a1ce155a2efdb4d46985d935511471452d9ee64d2461cb2991d59fc0060697f9a671672163230f367fed1422316e52d29eceacb8768f56d9b80f6d278093c9a8acd3cfd7edd8ebd5c293859f64d2f8486ae1bd593c65bc014",
3461 	"34df561bd2cfebbcb7af3b4b8d21ca5258312e7e2e4e538e35ad2490b6112f0d7f148f6aa8d522a7f3c61d785bd667db0e1dc4606c318ea4f26af4fe7d11d4dcff0456511b4aed1a0d91ba4a1fd6cd9029187bc5881a5a07fe02049d39368e83139b12825bae2c7be81e6f12c61bb5c5",
3462 
3463 	"458b67bf212d20f3a57fce392065582dcefbf381aa22949f8338ab9052260e1d",
3464 	"4c12effc5963d40459602675153e9649",
3465 	"256fd73ce35ae3ea9c25dd2a9454493e96d8633fe633b56176dce8785ce5dbbb84dbf2c8a2eeb1e96b51899605e4f13bbc11b93bf6f39b3469be14858b5b720d4a522d36feed7a329c9b1e852c9280c47db8039c17c4921571a07d1864128330e09c308ddea1694e95c84500f1a61e614197e86a30ecc28df64ccb3ccf5437aa",
3466 	"90b7b9630a2378f53f501ab7beff039155008071bc8438e789932cfd3eb1299195465e6633849463fdb44375278e2fdb1310821e6492cf80ff15cb772509fb426f3aeee27bd4938882fd2ae6b5bd9d91fa4a43b17bb439ebbe59c042310163a82a5fe5388796eee35a181a1271f00be29b852d8fa759bad01ff4678f010594cd",
3467 
3468 	"d2412db0845d84e5732b8bbd642957473b81fb99ca8bff70e7920d16c1dbec89",
3469 	"51c619fcf0b23f0c7925f400a6cacb6d",
3470 	"026006c4a71a180c9929824d9d095b8faaa86fc4fa25ecac61d85ff6de92dfa8702688c02a282c1b8af4449707f22d75e91991015db22374c95f8f195d5bb0afeb03040ff8965e0e1339dba5653e174f8aa5a1b39fe3ac839ce307a4e44b4f8f1b0063f738ec18acdbff2ebfe07383e734558723e741f0a1836dafdf9de82210a9248bc113b3c1bc8b4e252ca01bd803",
3471 	"0254b23463bcabec5a395eb74c8fb0eb137a07bc6f5e9f61ec0b057de305714f8fa294221c91a159c315939b81e300ee902192ec5f15254428d8772f79324ec43298ca21c00b370273ee5e5ed90e43efa1e05a5d171209fe34f9f29237dba2a6726650fd3b1321747d1208863c6c3c6b3e2d879ab5f25782f08ba8f2abbe63e0bedb4a227e81afb36bb6645508356d34",
3472 
3473 	"48be597e632c16772324c8d3fa1d9c5a9ecd010f14ec5d110d3bfec376c5532b",
3474 	"d6d581b8cf04ebd3b6eaa1b53f047ee1",
3475 	"0c63d413d3864570e70bb6618bf8a4b9585586688c32bba0a5ecc1362fada74ada32c52acfd1aa7444ba567b4e7daaecf7cc1cb29182af164ae5232b002868695635599807a9a7f07a1f137e97b1e1c9dabc89b6a5e4afa9db5855edaa575056a8f4f8242216242bb0c256310d9d329826ac353d715fa39f80cec144d6424558f9f70b98c920096e0f2c855d594885a00625880e9dfb734163cecef72cf030b8",
3476 	"fc5873e50de8faf4c6b84ba707b0854e9db9ab2e9f7d707fbba338c6843a18fc6facebaf663d26296fb329b4d26f18494c79e09e779647f9bafa87489630d79f4301610c2300c19dbf3148b7cac8c4f4944102754f332e92b6f7c5e75bc6179eb877a078d4719009021744c14f13fd2a55a2b9c44d18000685a845a4f632c7c56a77306efa66a24d05d088dcd7c13fe24fc447275965db9e4d37fbc9304448cd",
3477 
3478 	/*
3479 	 * End-of-table marker.
3480 	 */
3481 	NULL
3482 };
3483 
3484 /*
3485  * AES known-answer tests for CTR. Order: key, IV, plaintext, ciphertext.
3486  */
3487 static const char *const KAT_AES_CTR[] = {
3488 	/*
3489 	 * From RFC 3686.
3490 	 */
3491 	"ae6852f8121067cc4bf7a5765577f39e",
3492 	"000000300000000000000000",
3493 	"53696e676c6520626c6f636b206d7367",
3494 	"e4095d4fb7a7b3792d6175a3261311b8",
3495 
3496 	"7e24067817fae0d743d6ce1f32539163",
3497 	"006cb6dbc0543b59da48d90b",
3498 	"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
3499 	"5104a106168a72d9790d41ee8edad388eb2e1efc46da57c8fce630df9141be28",
3500 
3501 	"7691be035e5020a8ac6e618529f9a0dc",
3502 	"00e0017b27777f3f4a1786f0",
3503 	"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223",
3504 	"c1cf48a89f2ffdd9cf4652e9efdb72d74540a42bde6d7836d59a5ceaaef3105325b2072f",
3505 
3506 	"16af5b145fc9f579c175f93e3bfb0eed863d06ccfdb78515",
3507 	"0000004836733c147d6d93cb",
3508 	"53696e676c6520626c6f636b206d7367",
3509 	"4b55384fe259c9c84e7935a003cbe928",
3510 
3511 	"7c5cb2401b3dc33c19e7340819e0f69c678c3db8e6f6a91a",
3512 	"0096b03b020c6eadc2cb500d",
3513 	"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
3514 	"453243fc609b23327edfaafa7131cd9f8490701c5ad4a79cfc1fe0ff42f4fb00",
3515 
3516 	"02bf391ee8ecb159b959617b0965279bf59b60a786d3e0fe",
3517 	"0007bdfd5cbd60278dcc0912",
3518 	"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223",
3519 	"96893fc55e5c722f540b7dd1ddf7e758d288bc95c69165884536c811662f2188abee0935",
3520 
3521 	"776beff2851db06f4c8a0542c8696f6c6a81af1eec96b4d37fc1d689e6c1c104",
3522 	"00000060db5672c97aa8f0b2",
3523 	"53696e676c6520626c6f636b206d7367",
3524 	"145ad01dbf824ec7560863dc71e3e0c0",
3525 
3526 	"f6d66d6bd52d59bb0796365879eff886c66dd51a5b6a99744b50590c87a23884",
3527 	"00faac24c1585ef15a43d875",
3528 	"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
3529 	"f05e231b3894612c49ee000b804eb2a9b8306b508f839d6a5530831d9344af1c",
3530 
3531 	"ff7a617ce69148e4f1726e2f43581de2aa62d9f805532edff1eed687fb54153d",
3532 	"001cc5b751a51d70a1c11148",
3533 	"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223",
3534 	"eb6c52821d0bbbf7ce7594462aca4faab407df866569fd07f48cc0b583d6071f1ec0e6b8",
3535 
3536 	/*
3537 	 * End-of-table marker.
3538 	 */
3539 	NULL
3540 };
3541 
3542 static void
3543 monte_carlo_AES_encrypt(const br_block_cbcenc_class *ve,
3544 	char *skey, char *splain, char *scipher)
3545 {
3546 	unsigned char key[32];
3547 	unsigned char buf[16];
3548 	unsigned char pbuf[16];
3549 	unsigned char cipher[16];
3550 	size_t key_len;
3551 	int i, j, k;
3552 	br_aes_gen_cbcenc_keys v_ec;
3553 	const br_block_cbcenc_class **ec;
3554 
3555 	ec = &v_ec.vtable;
3556 	key_len = hextobin(key, skey);
3557 	hextobin(buf, splain);
3558 	hextobin(cipher, scipher);
3559 	for (i = 0; i < 100; i ++) {
3560 		ve->init(ec, key, key_len);
3561 		for (j = 0; j < 1000; j ++) {
3562 			unsigned char iv[16];
3563 
3564 			memcpy(pbuf, buf, sizeof buf);
3565 			memset(iv, 0, sizeof iv);
3566 			ve->run(ec, iv, buf, sizeof buf);
3567 		}
3568 		switch (key_len) {
3569 		case 16:
3570 			for (k = 0; k < 16; k ++) {
3571 				key[k] ^= buf[k];
3572 			}
3573 			break;
3574 		case 24:
3575 			for (k = 0; k < 8; k ++) {
3576 				key[k] ^= pbuf[8 + k];
3577 			}
3578 			for (k = 0; k < 16; k ++) {
3579 				key[8 + k] ^= buf[k];
3580 			}
3581 			break;
3582 		default:
3583 			for (k = 0; k < 16; k ++) {
3584 				key[k] ^= pbuf[k];
3585 				key[16 + k] ^= buf[k];
3586 			}
3587 			break;
3588 		}
3589 		printf(".");
3590 		fflush(stdout);
3591 	}
3592 	printf(" ");
3593 	fflush(stdout);
3594 	check_equals("MC AES encrypt", buf, cipher, sizeof buf);
3595 }
3596 
3597 static void
3598 monte_carlo_AES_decrypt(const br_block_cbcdec_class *vd,
3599 	char *skey, char *scipher, char *splain)
3600 {
3601 	unsigned char key[32];
3602 	unsigned char buf[16];
3603 	unsigned char pbuf[16];
3604 	unsigned char plain[16];
3605 	size_t key_len;
3606 	int i, j, k;
3607 	br_aes_gen_cbcdec_keys v_dc;
3608 	const br_block_cbcdec_class **dc;
3609 
3610 	dc = &v_dc.vtable;
3611 	key_len = hextobin(key, skey);
3612 	hextobin(buf, scipher);
3613 	hextobin(plain, splain);
3614 	for (i = 0; i < 100; i ++) {
3615 		vd->init(dc, key, key_len);
3616 		for (j = 0; j < 1000; j ++) {
3617 			unsigned char iv[16];
3618 
3619 			memcpy(pbuf, buf, sizeof buf);
3620 			memset(iv, 0, sizeof iv);
3621 			vd->run(dc, iv, buf, sizeof buf);
3622 		}
3623 		switch (key_len) {
3624 		case 16:
3625 			for (k = 0; k < 16; k ++) {
3626 				key[k] ^= buf[k];
3627 			}
3628 			break;
3629 		case 24:
3630 			for (k = 0; k < 8; k ++) {
3631 				key[k] ^= pbuf[8 + k];
3632 			}
3633 			for (k = 0; k < 16; k ++) {
3634 				key[8 + k] ^= buf[k];
3635 			}
3636 			break;
3637 		default:
3638 			for (k = 0; k < 16; k ++) {
3639 				key[k] ^= pbuf[k];
3640 				key[16 + k] ^= buf[k];
3641 			}
3642 			break;
3643 		}
3644 		printf(".");
3645 		fflush(stdout);
3646 	}
3647 	printf(" ");
3648 	fflush(stdout);
3649 	check_equals("MC AES decrypt", buf, plain, sizeof buf);
3650 }
3651 
3652 static void
3653 test_AES_generic(char *name,
3654 	const br_block_cbcenc_class *ve,
3655 	const br_block_cbcdec_class *vd,
3656 	const br_block_ctr_class *vc,
3657 	int with_MC, int with_CBC)
3658 {
3659 	size_t u;
3660 
3661 	printf("Test %s: ", name);
3662 	fflush(stdout);
3663 
3664 	if (ve->block_size != 16 || vd->block_size != 16
3665 		|| ve->log_block_size != 4 || vd->log_block_size != 4)
3666 	{
3667 		fprintf(stderr, "%s failed: wrong block size\n", name);
3668 		exit(EXIT_FAILURE);
3669 	}
3670 
3671 	for (u = 0; KAT_AES[u]; u += 3) {
3672 		unsigned char key[32];
3673 		unsigned char plain[16];
3674 		unsigned char cipher[16];
3675 		unsigned char buf[16];
3676 		unsigned char iv[16];
3677 		size_t key_len;
3678 		br_aes_gen_cbcenc_keys v_ec;
3679 		br_aes_gen_cbcdec_keys v_dc;
3680 		const br_block_cbcenc_class **ec;
3681 		const br_block_cbcdec_class **dc;
3682 
3683 		ec = &v_ec.vtable;
3684 		dc = &v_dc.vtable;
3685 		key_len = hextobin(key, KAT_AES[u]);
3686 		hextobin(plain, KAT_AES[u + 1]);
3687 		hextobin(cipher, KAT_AES[u + 2]);
3688 		ve->init(ec, key, key_len);
3689 		memcpy(buf, plain, sizeof plain);
3690 		memset(iv, 0, sizeof iv);
3691 		ve->run(ec, iv, buf, sizeof buf);
3692 		check_equals("KAT AES encrypt", buf, cipher, sizeof cipher);
3693 		vd->init(dc, key, key_len);
3694 		memset(iv, 0, sizeof iv);
3695 		vd->run(dc, iv, buf, sizeof buf);
3696 		check_equals("KAT AES decrypt", buf, plain, sizeof plain);
3697 	}
3698 
3699 	if (with_CBC) {
3700 		for (u = 0; KAT_AES_CBC[u]; u += 4) {
3701 			unsigned char key[32];
3702 			unsigned char ivref[16];
3703 			unsigned char plain[200];
3704 			unsigned char cipher[200];
3705 			unsigned char buf[200];
3706 			unsigned char iv[16];
3707 			size_t key_len, data_len, v;
3708 			br_aes_gen_cbcenc_keys v_ec;
3709 			br_aes_gen_cbcdec_keys v_dc;
3710 			const br_block_cbcenc_class **ec;
3711 			const br_block_cbcdec_class **dc;
3712 
3713 			ec = &v_ec.vtable;
3714 			dc = &v_dc.vtable;
3715 			key_len = hextobin(key, KAT_AES_CBC[u]);
3716 			hextobin(ivref, KAT_AES_CBC[u + 1]);
3717 			data_len = hextobin(plain, KAT_AES_CBC[u + 2]);
3718 			hextobin(cipher, KAT_AES_CBC[u + 3]);
3719 			ve->init(ec, key, key_len);
3720 
3721 			memcpy(buf, plain, data_len);
3722 			memcpy(iv, ivref, 16);
3723 			ve->run(ec, iv, buf, data_len);
3724 			check_equals("KAT CBC AES encrypt",
3725 				buf, cipher, data_len);
3726 			vd->init(dc, key, key_len);
3727 			memcpy(iv, ivref, 16);
3728 			vd->run(dc, iv, buf, data_len);
3729 			check_equals("KAT CBC AES decrypt",
3730 				buf, plain, data_len);
3731 
3732 			memcpy(buf, plain, data_len);
3733 			memcpy(iv, ivref, 16);
3734 			for (v = 0; v < data_len; v += 16) {
3735 				ve->run(ec, iv, buf + v, 16);
3736 			}
3737 			check_equals("KAT CBC AES encrypt (2)",
3738 				buf, cipher, data_len);
3739 			memcpy(iv, ivref, 16);
3740 			for (v = 0; v < data_len; v += 16) {
3741 				vd->run(dc, iv, buf + v, 16);
3742 			}
3743 			check_equals("KAT CBC AES decrypt (2)",
3744 				buf, plain, data_len);
3745 		}
3746 
3747 		/*
3748 		 * We want to check proper IV management for CBC:
3749 		 * encryption and decryption must properly copy the _last_
3750 		 * encrypted block as new IV, for all sizes.
3751 		 */
3752 		for (u = 1; u <= 35; u ++) {
3753 			br_hmac_drbg_context rng;
3754 			unsigned char x;
3755 			size_t key_len, data_len;
3756 			size_t v;
3757 
3758 			br_hmac_drbg_init(&rng, &br_sha256_vtable,
3759 				"seed for AES/CBC", 16);
3760 			x = u;
3761 			br_hmac_drbg_update(&rng, &x, 1);
3762 			data_len = u << 4;
3763 			for (key_len = 16; key_len <= 32; key_len += 16) {
3764 				unsigned char key[32];
3765 				unsigned char iv[16], iv1[16], iv2[16];
3766 				unsigned char plain[35 * 16];
3767 				unsigned char tmp1[sizeof plain];
3768 				unsigned char tmp2[sizeof plain];
3769 				br_aes_gen_cbcenc_keys v_ec;
3770 				br_aes_gen_cbcdec_keys v_dc;
3771 				const br_block_cbcenc_class **ec;
3772 				const br_block_cbcdec_class **dc;
3773 
3774 				br_hmac_drbg_generate(&rng, key, key_len);
3775 				br_hmac_drbg_generate(&rng, iv, sizeof iv);
3776 				br_hmac_drbg_generate(&rng, plain, data_len);
3777 
3778 				ec = &v_ec.vtable;
3779 				ve->init(ec, key, key_len);
3780 				memcpy(iv1, iv, sizeof iv);
3781 				memcpy(tmp1, plain, data_len);
3782 				ve->run(ec, iv1, tmp1, data_len);
3783 				check_equals("IV CBC AES (1)",
3784 					tmp1 + data_len - 16, iv1, 16);
3785 				memcpy(iv2, iv, sizeof iv);
3786 				memcpy(tmp2, plain, data_len);
3787 				for (v = 0; v < data_len; v += 16) {
3788 					ve->run(ec, iv2, tmp2 + v, 16);
3789 				}
3790 				check_equals("IV CBC AES (2)",
3791 					tmp2 + data_len - 16, iv2, 16);
3792 				check_equals("IV CBC AES (3)",
3793 					tmp1, tmp2, data_len);
3794 
3795 				dc = &v_dc.vtable;
3796 				vd->init(dc, key, key_len);
3797 				memcpy(iv1, iv, sizeof iv);
3798 				vd->run(dc, iv1, tmp1, data_len);
3799 				check_equals("IV CBC AES (4)", iv1, iv2, 16);
3800 				check_equals("IV CBC AES (5)",
3801 					tmp1, plain, data_len);
3802 				memcpy(iv2, iv, sizeof iv);
3803 				for (v = 0; v < data_len; v += 16) {
3804 					vd->run(dc, iv2, tmp2 + v, 16);
3805 				}
3806 				check_equals("IV CBC AES (6)", iv1, iv2, 16);
3807 				check_equals("IV CBC AES (7)",
3808 					tmp2, plain, data_len);
3809 			}
3810 		}
3811 	}
3812 
3813 	if (vc != NULL) {
3814 		if (vc->block_size != 16 || vc->log_block_size != 4) {
3815 			fprintf(stderr, "%s failed: wrong block size\n", name);
3816 			exit(EXIT_FAILURE);
3817 		}
3818 		for (u = 0; KAT_AES_CTR[u]; u += 4) {
3819 			unsigned char key[32];
3820 			unsigned char iv[12];
3821 			unsigned char plain[200];
3822 			unsigned char cipher[200];
3823 			unsigned char buf[200];
3824 			size_t key_len, data_len, v;
3825 			uint32_t c;
3826 			br_aes_gen_ctr_keys v_xc;
3827 			const br_block_ctr_class **xc;
3828 
3829 			xc = &v_xc.vtable;
3830 			key_len = hextobin(key, KAT_AES_CTR[u]);
3831 			hextobin(iv, KAT_AES_CTR[u + 1]);
3832 			data_len = hextobin(plain, KAT_AES_CTR[u + 2]);
3833 			hextobin(cipher, KAT_AES_CTR[u + 3]);
3834 			vc->init(xc, key, key_len);
3835 			memcpy(buf, plain, data_len);
3836 			vc->run(xc, iv, 1, buf, data_len);
3837 			check_equals("KAT CTR AES (1)", buf, cipher, data_len);
3838 			vc->run(xc, iv, 1, buf, data_len);
3839 			check_equals("KAT CTR AES (2)", buf, plain, data_len);
3840 
3841 			memcpy(buf, plain, data_len);
3842 			c = 1;
3843 			for (v = 0; v < data_len; v += 32) {
3844 				size_t clen;
3845 
3846 				clen = data_len - v;
3847 				if (clen > 32) {
3848 					clen = 32;
3849 				}
3850 				c = vc->run(xc, iv, c, buf + v, clen);
3851 			}
3852 			check_equals("KAT CTR AES (3)", buf, cipher, data_len);
3853 
3854 			memcpy(buf, plain, data_len);
3855 			c = 1;
3856 			for (v = 0; v < data_len; v += 16) {
3857 				size_t clen;
3858 
3859 				clen = data_len - v;
3860 				if (clen > 16) {
3861 					clen = 16;
3862 				}
3863 				c = vc->run(xc, iv, c, buf + v, clen);
3864 			}
3865 			check_equals("KAT CTR AES (4)", buf, cipher, data_len);
3866 		}
3867 	}
3868 
3869 	if (with_MC) {
3870 		monte_carlo_AES_encrypt(
3871 			ve,
3872 			"139a35422f1d61de3c91787fe0507afd",
3873 			"b9145a768b7dc489a096b546f43b231f",
3874 			"fb2649694783b551eacd9d5db6126d47");
3875 		monte_carlo_AES_decrypt(
3876 			vd,
3877 			"0c60e7bf20ada9baa9e1ddf0d1540726",
3878 			"b08a29b11a500ea3aca42c36675b9785",
3879 			"d1d2bfdc58ffcad2341b095bce55221e");
3880 
3881 		monte_carlo_AES_encrypt(
3882 			ve,
3883 			"b9a63e09e1dfc42e93a90d9bad739e5967aef672eedd5da9",
3884 			"85a1f7a58167b389cddc8a9ff175ee26",
3885 			"5d1196da8f184975e240949a25104554");
3886 		monte_carlo_AES_decrypt(
3887 			vd,
3888 			"4b97585701c03fbebdfa8555024f589f1482c58a00fdd9fd",
3889 			"d0bd0e02ded155e4516be83f42d347a4",
3890 			"b63ef1b79507a62eba3dafcec54a6328");
3891 
3892 		monte_carlo_AES_encrypt(
3893 			ve,
3894 			"f9e8389f5b80712e3886cc1fa2d28a3b8c9cd88a2d4a54c6aa86ce0fef944be0",
3895 			"b379777f9050e2a818f2940cbbd9aba4",
3896 			"c5d2cb3d5b7ff0e23e308967ee074825");
3897 		monte_carlo_AES_decrypt(
3898 			vd,
3899 			"2b09ba39b834062b9e93f48373b8dd018dedf1e5ba1b8af831ebbacbc92a2643",
3900 			"89649bd0115f30bd878567610223a59d",
3901 			"e3d3868f578caf34e36445bf14cefc68");
3902 	}
3903 
3904 	printf("done.\n");
3905 	fflush(stdout);
3906 }
3907 
3908 static void
3909 test_AES_big(void)
3910 {
3911 	test_AES_generic("AES_big",
3912 		&br_aes_big_cbcenc_vtable,
3913 		&br_aes_big_cbcdec_vtable,
3914 		&br_aes_big_ctr_vtable,
3915 		1, 1);
3916 }
3917 
3918 static void
3919 test_AES_small(void)
3920 {
3921 	test_AES_generic("AES_small",
3922 		&br_aes_small_cbcenc_vtable,
3923 		&br_aes_small_cbcdec_vtable,
3924 		&br_aes_small_ctr_vtable,
3925 		1, 1);
3926 }
3927 
3928 static void
3929 test_AES_ct(void)
3930 {
3931 	test_AES_generic("AES_ct",
3932 		&br_aes_ct_cbcenc_vtable,
3933 		&br_aes_ct_cbcdec_vtable,
3934 		&br_aes_ct_ctr_vtable,
3935 		1, 1);
3936 }
3937 
3938 static void
3939 test_AES_ct64(void)
3940 {
3941 	test_AES_generic("AES_ct64",
3942 		&br_aes_ct64_cbcenc_vtable,
3943 		&br_aes_ct64_cbcdec_vtable,
3944 		&br_aes_ct64_ctr_vtable,
3945 		1, 1);
3946 }
3947 
3948 static void
3949 test_AES_x86ni(void)
3950 {
3951 	const br_block_cbcenc_class *x_cbcenc;
3952 	const br_block_cbcdec_class *x_cbcdec;
3953 	const br_block_ctr_class *x_ctr;
3954 	int hcbcenc, hcbcdec, hctr;
3955 
3956 	x_cbcenc = br_aes_x86ni_cbcenc_get_vtable();
3957 	x_cbcdec = br_aes_x86ni_cbcdec_get_vtable();
3958 	x_ctr = br_aes_x86ni_ctr_get_vtable();
3959 	hcbcenc = (x_cbcenc != NULL);
3960 	hcbcdec = (x_cbcdec != NULL);
3961 	hctr = (x_ctr != NULL);
3962 	if (hcbcenc != hctr || hcbcdec != hctr) {
3963 		fprintf(stderr, "AES_x86ni availability mismatch (%d/%d/%d)\n",
3964 			hcbcenc, hcbcdec, hctr);
3965 		exit(EXIT_FAILURE);
3966 	}
3967 	if (hctr) {
3968 		test_AES_generic("AES_x86ni",
3969 			x_cbcenc, x_cbcdec, x_ctr, 1, 1);
3970 	} else {
3971 		printf("Test AES_x86ni: UNAVAILABLE\n");
3972 	}
3973 }
3974 
3975 static void
3976 test_AES_pwr8(void)
3977 {
3978 	const br_block_cbcenc_class *x_cbcenc;
3979 	const br_block_cbcdec_class *x_cbcdec;
3980 	const br_block_ctr_class *x_ctr;
3981 	int hcbcenc, hcbcdec, hctr;
3982 
3983 	x_cbcenc = br_aes_pwr8_cbcenc_get_vtable();
3984 	x_cbcdec = br_aes_pwr8_cbcdec_get_vtable();
3985 	x_ctr = br_aes_pwr8_ctr_get_vtable();
3986 	hcbcenc = (x_cbcenc != NULL);
3987 	hcbcdec = (x_cbcdec != NULL);
3988 	hctr = (x_ctr != NULL);
3989 	if (hcbcenc != hctr || hcbcdec != hctr) {
3990 		fprintf(stderr, "AES_pwr8 availability mismatch (%d/%d/%d)\n",
3991 			hcbcenc, hcbcdec, hctr);
3992 		exit(EXIT_FAILURE);
3993 	}
3994 	if (hctr) {
3995 		test_AES_generic("AES_pwr8",
3996 			x_cbcenc, x_cbcdec, x_ctr, 1, 1);
3997 	} else {
3998 		printf("Test AES_pwr8: UNAVAILABLE\n");
3999 	}
4000 }
4001 
4002 /*
4003  * Custom CTR + CBC-MAC AES implementation. Can also do CTR-only, and
4004  * CBC-MAC-only. The 'aes_big' implementation (CTR) is used. This is
4005  * meant for comparisons.
4006  *
4007  * If 'ctr' is NULL then no encryption/decryption is done; otherwise,
4008  * CTR encryption/decryption is performed (full-block counter) and the
4009  * 'ctr' array is updated with the new counter value.
4010  *
4011  * If 'cbcmac' is NULL then no CBC-MAC is done; otherwise, CBC-MAC is
4012  * applied on the encrypted data, with 'cbcmac' as IV and destination
4013  * buffer for the output. If 'ctr' is not NULL and 'encrypt' is non-zero,
4014  * then CBC-MAC is computed over the result of CTR processing; otherwise,
4015  * CBC-MAC is computed over the input data itself.
4016  */
4017 static void
4018 do_aes_ctrcbc(const void *key, size_t key_len, int encrypt,
4019 	void *ctr, void *cbcmac, unsigned char *data, size_t len)
4020 {
4021 	br_aes_big_ctr_keys bc;
4022 	int i;
4023 
4024 	br_aes_big_ctr_init(&bc, key, key_len);
4025 	for (i = 0; i < 2; i ++) {
4026 		/*
4027 		 * CBC-MAC is computed on the encrypted data, so in
4028 		 * first pass if decrypting, second pass if encrypting.
4029 		 */
4030 		if (cbcmac != NULL
4031 			&& ((encrypt && i == 1) || (!encrypt && i == 0)))
4032 		{
4033 			unsigned char zz[16];
4034 			size_t u;
4035 
4036 			memcpy(zz, cbcmac, sizeof zz);
4037 			for (u = 0; u < len; u += 16) {
4038 				unsigned char tmp[16];
4039 				size_t v;
4040 
4041 				for (v = 0; v < 16; v ++) {
4042 					tmp[v] = zz[v] ^ data[u + v];
4043 				}
4044 				memset(zz, 0, sizeof zz);
4045 				br_aes_big_ctr_run(&bc,
4046 					tmp, br_dec32be(tmp + 12), zz, 16);
4047 			}
4048 			memcpy(cbcmac, zz, sizeof zz);
4049 		}
4050 
4051 		/*
4052 		 * CTR encryption/decryption is done only in the first pass.
4053 		 * We process data block per block, because the CTR-only
4054 		 * class uses a 32-bit counter, while the CTR+CBC-MAC
4055 		 * class uses a 128-bit counter.
4056 		 */
4057 		if (ctr != NULL && i == 0) {
4058 			unsigned char zz[16];
4059 			size_t u;
4060 
4061 			memcpy(zz, ctr, sizeof zz);
4062 			for (u = 0; u < len; u += 16) {
4063 				int i;
4064 
4065 				br_aes_big_ctr_run(&bc,
4066 					zz, br_dec32be(zz + 12), data + u, 16);
4067 				for (i = 15; i >= 0; i --) {
4068 					zz[i] = (zz[i] + 1) & 0xFF;
4069 					if (zz[i] != 0) {
4070 						break;
4071 					}
4072 				}
4073 			}
4074 			memcpy(ctr, zz, sizeof zz);
4075 		}
4076 	}
4077 }
4078 
4079 static void
4080 test_AES_CTRCBC_inner(const char *name, const br_block_ctrcbc_class *vt)
4081 {
4082 	br_hmac_drbg_context rng;
4083 	size_t key_len;
4084 
4085 	printf("Test AES CTR/CBC-MAC %s: ", name);
4086 	fflush(stdout);
4087 
4088 	br_hmac_drbg_init(&rng, &br_sha256_vtable, name, strlen(name));
4089 	for (key_len = 16; key_len <= 32; key_len += 8) {
4090 		br_aes_gen_ctrcbc_keys bc;
4091 		unsigned char key[32];
4092 		size_t data_len;
4093 
4094 		br_hmac_drbg_generate(&rng, key, key_len);
4095 		vt->init(&bc.vtable, key, key_len);
4096 		for (data_len = 0; data_len <= 512; data_len += 16) {
4097 			unsigned char plain[512];
4098 			unsigned char data1[sizeof plain];
4099 			unsigned char data2[sizeof plain];
4100 			unsigned char ctr[16], cbcmac[16];
4101 			unsigned char ctr1[16], cbcmac1[16];
4102 			unsigned char ctr2[16], cbcmac2[16];
4103 			int i;
4104 
4105 			br_hmac_drbg_generate(&rng, plain, data_len);
4106 
4107 			for (i = 0; i <= 16; i ++) {
4108 				if (i == 0) {
4109 					br_hmac_drbg_generate(&rng, ctr, 16);
4110 				} else {
4111 					memset(ctr, 0, i - 1);
4112 					memset(ctr + i - 1, 0xFF, 17 - i);
4113 				}
4114 				br_hmac_drbg_generate(&rng, cbcmac, 16);
4115 
4116 				memcpy(data1, plain, data_len);
4117 				memcpy(ctr1, ctr, 16);
4118 				vt->ctr(&bc.vtable, ctr1, data1, data_len);
4119 				memcpy(data2, plain, data_len);
4120 				memcpy(ctr2, ctr, 16);
4121 				do_aes_ctrcbc(key, key_len, 1,
4122 					ctr2, NULL, data2, data_len);
4123 				check_equals("CTR-only data",
4124 					data1, data2, data_len);
4125 				check_equals("CTR-only counter",
4126 					ctr1, ctr2, 16);
4127 
4128 				memcpy(data1, plain, data_len);
4129 				memcpy(cbcmac1, cbcmac, 16);
4130 				vt->mac(&bc.vtable, cbcmac1, data1, data_len);
4131 				memcpy(data2, plain, data_len);
4132 				memcpy(cbcmac2, cbcmac, 16);
4133 				do_aes_ctrcbc(key, key_len, 1,
4134 					NULL, cbcmac2, data2, data_len);
4135 				check_equals("CBC-MAC-only",
4136 					cbcmac1, cbcmac2, 16);
4137 
4138 				memcpy(data1, plain, data_len);
4139 				memcpy(ctr1, ctr, 16);
4140 				memcpy(cbcmac1, cbcmac, 16);
4141 				vt->encrypt(&bc.vtable,
4142 					ctr1, cbcmac1, data1, data_len);
4143 				memcpy(data2, plain, data_len);
4144 				memcpy(ctr2, ctr, 16);
4145 				memcpy(cbcmac2, cbcmac, 16);
4146 				do_aes_ctrcbc(key, key_len, 1,
4147 					ctr2, cbcmac2, data2, data_len);
4148 				check_equals("encrypt: combined data",
4149 					data1, data2, data_len);
4150 				check_equals("encrypt: combined counter",
4151 					ctr1, ctr2, 16);
4152 				check_equals("encrypt: combined CBC-MAC",
4153 					cbcmac1, cbcmac2, 16);
4154 
4155 				memcpy(ctr1, ctr, 16);
4156 				memcpy(cbcmac1, cbcmac, 16);
4157 				vt->decrypt(&bc.vtable,
4158 					ctr1, cbcmac1, data1, data_len);
4159 				memcpy(ctr2, ctr, 16);
4160 				memcpy(cbcmac2, cbcmac, 16);
4161 				do_aes_ctrcbc(key, key_len, 0,
4162 					ctr2, cbcmac2, data2, data_len);
4163 				check_equals("decrypt: combined data",
4164 					data1, data2, data_len);
4165 				check_equals("decrypt: combined counter",
4166 					ctr1, ctr2, 16);
4167 				check_equals("decrypt: combined CBC-MAC",
4168 					cbcmac1, cbcmac2, 16);
4169 			}
4170 
4171 			printf(".");
4172 			fflush(stdout);
4173 		}
4174 
4175 		printf(" ");
4176 		fflush(stdout);
4177 	}
4178 
4179 	printf("done.\n");
4180 	fflush(stdout);
4181 }
4182 
4183 static void
4184 test_AES_CTRCBC_big(void)
4185 {
4186 	test_AES_CTRCBC_inner("big", &br_aes_big_ctrcbc_vtable);
4187 }
4188 
4189 static void
4190 test_AES_CTRCBC_small(void)
4191 {
4192 	test_AES_CTRCBC_inner("small", &br_aes_small_ctrcbc_vtable);
4193 }
4194 
4195 static void
4196 test_AES_CTRCBC_ct(void)
4197 {
4198 	test_AES_CTRCBC_inner("ct", &br_aes_ct_ctrcbc_vtable);
4199 }
4200 
4201 static void
4202 test_AES_CTRCBC_ct64(void)
4203 {
4204 	test_AES_CTRCBC_inner("ct64", &br_aes_ct64_ctrcbc_vtable);
4205 }
4206 
4207 static void
4208 test_AES_CTRCBC_x86ni(void)
4209 {
4210 	const br_block_ctrcbc_class *vt;
4211 
4212 	vt = br_aes_x86ni_ctrcbc_get_vtable();
4213 	if (vt != NULL) {
4214 		test_AES_CTRCBC_inner("x86ni", vt);
4215 	} else {
4216 		printf("Test AES CTR/CBC-MAC x86ni: UNAVAILABLE\n");
4217 	}
4218 }
4219 
4220 static void
4221 test_AES_CTRCBC_pwr8(void)
4222 {
4223 	const br_block_ctrcbc_class *vt;
4224 
4225 	vt = br_aes_pwr8_ctrcbc_get_vtable();
4226 	if (vt != NULL) {
4227 		test_AES_CTRCBC_inner("pwr8", vt);
4228 	} else {
4229 		printf("Test AES CTR/CBC-MAC pwr8: UNAVAILABLE\n");
4230 	}
4231 }
4232 
4233 /*
4234  * DES known-answer tests. Order: plaintext, key, ciphertext.
4235  * (mostly from NIST SP 800-20).
4236  */
4237 static const char *const KAT_DES[] = {
4238 	"10316E028C8F3B4A", "0000000000000000", "82DCBAFBDEAB6602",
4239 	"8000000000000000", "0000000000000000", "95A8D72813DAA94D",
4240 	"4000000000000000", "0000000000000000", "0EEC1487DD8C26D5",
4241 	"2000000000000000", "0000000000000000", "7AD16FFB79C45926",
4242 	"1000000000000000", "0000000000000000", "D3746294CA6A6CF3",
4243 	"0800000000000000", "0000000000000000", "809F5F873C1FD761",
4244 	"0400000000000000", "0000000000000000", "C02FAFFEC989D1FC",
4245 	"0200000000000000", "0000000000000000", "4615AA1D33E72F10",
4246 	"0100000000000000", "0000000000000000", "8CA64DE9C1B123A7",
4247 	"0080000000000000", "0000000000000000", "2055123350C00858",
4248 	"0040000000000000", "0000000000000000", "DF3B99D6577397C8",
4249 	"0020000000000000", "0000000000000000", "31FE17369B5288C9",
4250 	"0010000000000000", "0000000000000000", "DFDD3CC64DAE1642",
4251 	"0008000000000000", "0000000000000000", "178C83CE2B399D94",
4252 	"0004000000000000", "0000000000000000", "50F636324A9B7F80",
4253 	"0002000000000000", "0000000000000000", "A8468EE3BC18F06D",
4254 	"0001000000000000", "0000000000000000", "8CA64DE9C1B123A7",
4255 	"0000800000000000", "0000000000000000", "A2DC9E92FD3CDE92",
4256 	"0000400000000000", "0000000000000000", "CAC09F797D031287",
4257 	"0000200000000000", "0000000000000000", "90BA680B22AEB525",
4258 	"0000100000000000", "0000000000000000", "CE7A24F350E280B6",
4259 	"0000080000000000", "0000000000000000", "882BFF0AA01A0B87",
4260 	"0000040000000000", "0000000000000000", "25610288924511C2",
4261 	"0000020000000000", "0000000000000000", "C71516C29C75D170",
4262 	"0000010000000000", "0000000000000000", "8CA64DE9C1B123A7",
4263 	"0000008000000000", "0000000000000000", "5199C29A52C9F059",
4264 	"0000004000000000", "0000000000000000", "C22F0A294A71F29F",
4265 	"0000002000000000", "0000000000000000", "EE371483714C02EA",
4266 	"0000001000000000", "0000000000000000", "A81FBD448F9E522F",
4267 	"0000000800000000", "0000000000000000", "4F644C92E192DFED",
4268 	"0000000400000000", "0000000000000000", "1AFA9A66A6DF92AE",
4269 	"0000000200000000", "0000000000000000", "B3C1CC715CB879D8",
4270 	"0000000100000000", "0000000000000000", "8CA64DE9C1B123A7",
4271 	"0000000080000000", "0000000000000000", "19D032E64AB0BD8B",
4272 	"0000000040000000", "0000000000000000", "3CFAA7A7DC8720DC",
4273 	"0000000020000000", "0000000000000000", "B7265F7F447AC6F3",
4274 	"0000000010000000", "0000000000000000", "9DB73B3C0D163F54",
4275 	"0000000008000000", "0000000000000000", "8181B65BABF4A975",
4276 	"0000000004000000", "0000000000000000", "93C9B64042EAA240",
4277 	"0000000002000000", "0000000000000000", "5570530829705592",
4278 	"0000000001000000", "0000000000000000", "8CA64DE9C1B123A7",
4279 	"0000000000800000", "0000000000000000", "8638809E878787A0",
4280 	"0000000000400000", "0000000000000000", "41B9A79AF79AC208",
4281 	"0000000000200000", "0000000000000000", "7A9BE42F2009A892",
4282 	"0000000000100000", "0000000000000000", "29038D56BA6D2745",
4283 	"0000000000080000", "0000000000000000", "5495C6ABF1E5DF51",
4284 	"0000000000040000", "0000000000000000", "AE13DBD561488933",
4285 	"0000000000020000", "0000000000000000", "024D1FFA8904E389",
4286 	"0000000000010000", "0000000000000000", "8CA64DE9C1B123A7",
4287 	"0000000000008000", "0000000000000000", "D1399712F99BF02E",
4288 	"0000000000004000", "0000000000000000", "14C1D7C1CFFEC79E",
4289 	"0000000000002000", "0000000000000000", "1DE5279DAE3BED6F",
4290 	"0000000000001000", "0000000000000000", "E941A33F85501303",
4291 	"0000000000000800", "0000000000000000", "DA99DBBC9A03F379",
4292 	"0000000000000400", "0000000000000000", "B7FC92F91D8E92E9",
4293 	"0000000000000200", "0000000000000000", "AE8E5CAA3CA04E85",
4294 	"0000000000000100", "0000000000000000", "8CA64DE9C1B123A7",
4295 	"0000000000000080", "0000000000000000", "9CC62DF43B6EED74",
4296 	"0000000000000040", "0000000000000000", "D863DBB5C59A91A0",
4297 	"0000000000000020", "0000000000000000", "A1AB2190545B91D7",
4298 	"0000000000000010", "0000000000000000", "0875041E64C570F7",
4299 	"0000000000000008", "0000000000000000", "5A594528BEBEF1CC",
4300 	"0000000000000004", "0000000000000000", "FCDB3291DE21F0C0",
4301 	"0000000000000002", "0000000000000000", "869EFD7F9F265A09",
4302 	"0000000000000001", "0000000000000000", "8CA64DE9C1B123A7",
4303 	"0000000000000000", "8000000000000000", "95F8A5E5DD31D900",
4304 	"0000000000000000", "4000000000000000", "DD7F121CA5015619",
4305 	"0000000000000000", "2000000000000000", "2E8653104F3834EA",
4306 	"0000000000000000", "1000000000000000", "4BD388FF6CD81D4F",
4307 	"0000000000000000", "0800000000000000", "20B9E767B2FB1456",
4308 	"0000000000000000", "0400000000000000", "55579380D77138EF",
4309 	"0000000000000000", "0200000000000000", "6CC5DEFAAF04512F",
4310 	"0000000000000000", "0100000000000000", "0D9F279BA5D87260",
4311 	"0000000000000000", "0080000000000000", "D9031B0271BD5A0A",
4312 	"0000000000000000", "0040000000000000", "424250B37C3DD951",
4313 	"0000000000000000", "0020000000000000", "B8061B7ECD9A21E5",
4314 	"0000000000000000", "0010000000000000", "F15D0F286B65BD28",
4315 	"0000000000000000", "0008000000000000", "ADD0CC8D6E5DEBA1",
4316 	"0000000000000000", "0004000000000000", "E6D5F82752AD63D1",
4317 	"0000000000000000", "0002000000000000", "ECBFE3BD3F591A5E",
4318 	"0000000000000000", "0001000000000000", "F356834379D165CD",
4319 	"0000000000000000", "0000800000000000", "2B9F982F20037FA9",
4320 	"0000000000000000", "0000400000000000", "889DE068A16F0BE6",
4321 	"0000000000000000", "0000200000000000", "E19E275D846A1298",
4322 	"0000000000000000", "0000100000000000", "329A8ED523D71AEC",
4323 	"0000000000000000", "0000080000000000", "E7FCE22557D23C97",
4324 	"0000000000000000", "0000040000000000", "12A9F5817FF2D65D",
4325 	"0000000000000000", "0000020000000000", "A484C3AD38DC9C19",
4326 	"0000000000000000", "0000010000000000", "FBE00A8A1EF8AD72",
4327 	"0000000000000000", "0000008000000000", "750D079407521363",
4328 	"0000000000000000", "0000004000000000", "64FEED9C724C2FAF",
4329 	"0000000000000000", "0000002000000000", "F02B263B328E2B60",
4330 	"0000000000000000", "0000001000000000", "9D64555A9A10B852",
4331 	"0000000000000000", "0000000800000000", "D106FF0BED5255D7",
4332 	"0000000000000000", "0000000400000000", "E1652C6B138C64A5",
4333 	"0000000000000000", "0000000200000000", "E428581186EC8F46",
4334 	"0000000000000000", "0000000100000000", "AEB5F5EDE22D1A36",
4335 	"0000000000000000", "0000000080000000", "E943D7568AEC0C5C",
4336 	"0000000000000000", "0000000040000000", "DF98C8276F54B04B",
4337 	"0000000000000000", "0000000020000000", "B160E4680F6C696F",
4338 	"0000000000000000", "0000000010000000", "FA0752B07D9C4AB8",
4339 	"0000000000000000", "0000000008000000", "CA3A2B036DBC8502",
4340 	"0000000000000000", "0000000004000000", "5E0905517BB59BCF",
4341 	"0000000000000000", "0000000002000000", "814EEB3B91D90726",
4342 	"0000000000000000", "0000000001000000", "4D49DB1532919C9F",
4343 	"0000000000000000", "0000000000800000", "25EB5FC3F8CF0621",
4344 	"0000000000000000", "0000000000400000", "AB6A20C0620D1C6F",
4345 	"0000000000000000", "0000000000200000", "79E90DBC98F92CCA",
4346 	"0000000000000000", "0000000000100000", "866ECEDD8072BB0E",
4347 	"0000000000000000", "0000000000080000", "8B54536F2F3E64A8",
4348 	"0000000000000000", "0000000000040000", "EA51D3975595B86B",
4349 	"0000000000000000", "0000000000020000", "CAFFC6AC4542DE31",
4350 	"0000000000000000", "0000000000010000", "8DD45A2DDF90796C",
4351 	"0000000000000000", "0000000000008000", "1029D55E880EC2D0",
4352 	"0000000000000000", "0000000000004000", "5D86CB23639DBEA9",
4353 	"0000000000000000", "0000000000002000", "1D1CA853AE7C0C5F",
4354 	"0000000000000000", "0000000000001000", "CE332329248F3228",
4355 	"0000000000000000", "0000000000000800", "8405D1ABE24FB942",
4356 	"0000000000000000", "0000000000000400", "E643D78090CA4207",
4357 	"0000000000000000", "0000000000000200", "48221B9937748A23",
4358 	"0000000000000000", "0000000000000100", "DD7C0BBD61FAFD54",
4359 	"0000000000000000", "0000000000000080", "2FBC291A570DB5C4",
4360 	"0000000000000000", "0000000000000040", "E07C30D7E4E26E12",
4361 	"0000000000000000", "0000000000000020", "0953E2258E8E90A1",
4362 	"0000000000000000", "0000000000000010", "5B711BC4CEEBF2EE",
4363 	"0000000000000000", "0000000000000008", "CC083F1E6D9E85F6",
4364 	"0000000000000000", "0000000000000004", "D2FD8867D50D2DFE",
4365 	"0000000000000000", "0000000000000002", "06E7EA22CE92708F",
4366 	"0000000000000000", "0000000000000001", "166B40B44ABA4BD6",
4367 	"0000000000000000", "0000000000000000", "8CA64DE9C1B123A7",
4368 	"0101010101010101", "0101010101010101", "994D4DC157B96C52",
4369 	"0202020202020202", "0202020202020202", "E127C2B61D98E6E2",
4370 	"0303030303030303", "0303030303030303", "984C91D78A269CE3",
4371 	"0404040404040404", "0404040404040404", "1F4570BB77550683",
4372 	"0505050505050505", "0505050505050505", "3990ABF98D672B16",
4373 	"0606060606060606", "0606060606060606", "3F5150BBA081D585",
4374 	"0707070707070707", "0707070707070707", "C65242248C9CF6F2",
4375 	"0808080808080808", "0808080808080808", "10772D40FAD24257",
4376 	"0909090909090909", "0909090909090909", "F0139440647A6E7B",
4377 	"0A0A0A0A0A0A0A0A", "0A0A0A0A0A0A0A0A", "0A288603044D740C",
4378 	"0B0B0B0B0B0B0B0B", "0B0B0B0B0B0B0B0B", "6359916942F7438F",
4379 	"0C0C0C0C0C0C0C0C", "0C0C0C0C0C0C0C0C", "934316AE443CF08B",
4380 	"0D0D0D0D0D0D0D0D", "0D0D0D0D0D0D0D0D", "E3F56D7F1130A2B7",
4381 	"0E0E0E0E0E0E0E0E", "0E0E0E0E0E0E0E0E", "A2E4705087C6B6B4",
4382 	"0F0F0F0F0F0F0F0F", "0F0F0F0F0F0F0F0F", "D5D76E09A447E8C3",
4383 	"1010101010101010", "1010101010101010", "DD7515F2BFC17F85",
4384 	"1111111111111111", "1111111111111111", "F40379AB9E0EC533",
4385 	"1212121212121212", "1212121212121212", "96CD27784D1563E5",
4386 	"1313131313131313", "1313131313131313", "2911CF5E94D33FE1",
4387 	"1414141414141414", "1414141414141414", "377B7F7CA3E5BBB3",
4388 	"1515151515151515", "1515151515151515", "701AA63832905A92",
4389 	"1616161616161616", "1616161616161616", "2006E716C4252D6D",
4390 	"1717171717171717", "1717171717171717", "452C1197422469F8",
4391 	"1818181818181818", "1818181818181818", "C33FD1EB49CB64DA",
4392 	"1919191919191919", "1919191919191919", "7572278F364EB50D",
4393 	"1A1A1A1A1A1A1A1A", "1A1A1A1A1A1A1A1A", "69E51488403EF4C3",
4394 	"1B1B1B1B1B1B1B1B", "1B1B1B1B1B1B1B1B", "FF847E0ADF192825",
4395 	"1C1C1C1C1C1C1C1C", "1C1C1C1C1C1C1C1C", "521B7FB3B41BB791",
4396 	"1D1D1D1D1D1D1D1D", "1D1D1D1D1D1D1D1D", "26059A6A0F3F6B35",
4397 	"1E1E1E1E1E1E1E1E", "1E1E1E1E1E1E1E1E", "F24A8D2231C77538",
4398 	"1F1F1F1F1F1F1F1F", "1F1F1F1F1F1F1F1F", "4FD96EC0D3304EF6",
4399 	"2020202020202020", "2020202020202020", "18A9D580A900B699",
4400 	"2121212121212121", "2121212121212121", "88586E1D755B9B5A",
4401 	"2222222222222222", "2222222222222222", "0F8ADFFB11DC2784",
4402 	"2323232323232323", "2323232323232323", "2F30446C8312404A",
4403 	"2424242424242424", "2424242424242424", "0BA03D9E6C196511",
4404 	"2525252525252525", "2525252525252525", "3E55E997611E4B7D",
4405 	"2626262626262626", "2626262626262626", "B2522FB5F158F0DF",
4406 	"2727272727272727", "2727272727272727", "2109425935406AB8",
4407 	"2828282828282828", "2828282828282828", "11A16028F310FF16",
4408 	"2929292929292929", "2929292929292929", "73F0C45F379FE67F",
4409 	"2A2A2A2A2A2A2A2A", "2A2A2A2A2A2A2A2A", "DCAD4338F7523816",
4410 	"2B2B2B2B2B2B2B2B", "2B2B2B2B2B2B2B2B", "B81634C1CEAB298C",
4411 	"2C2C2C2C2C2C2C2C", "2C2C2C2C2C2C2C2C", "DD2CCB29B6C4C349",
4412 	"2D2D2D2D2D2D2D2D", "2D2D2D2D2D2D2D2D", "7D07A77A2ABD50A7",
4413 	"2E2E2E2E2E2E2E2E", "2E2E2E2E2E2E2E2E", "30C1B0C1FD91D371",
4414 	"2F2F2F2F2F2F2F2F", "2F2F2F2F2F2F2F2F", "C4427B31AC61973B",
4415 	"3030303030303030", "3030303030303030", "F47BB46273B15EB5",
4416 	"3131313131313131", "3131313131313131", "655EA628CF62585F",
4417 	"3232323232323232", "3232323232323232", "AC978C247863388F",
4418 	"3333333333333333", "3333333333333333", "0432ED386F2DE328",
4419 	"3434343434343434", "3434343434343434", "D254014CB986B3C2",
4420 	"3535353535353535", "3535353535353535", "B256E34BEDB49801",
4421 	"3636363636363636", "3636363636363636", "37F8759EB77E7BFC",
4422 	"3737373737373737", "3737373737373737", "5013CA4F62C9CEA0",
4423 	"3838383838383838", "3838383838383838", "8940F7B3EACA5939",
4424 	"3939393939393939", "3939393939393939", "E22B19A55086774B",
4425 	"3A3A3A3A3A3A3A3A", "3A3A3A3A3A3A3A3A", "B04A2AAC925ABB0B",
4426 	"3B3B3B3B3B3B3B3B", "3B3B3B3B3B3B3B3B", "8D250D58361597FC",
4427 	"3C3C3C3C3C3C3C3C", "3C3C3C3C3C3C3C3C", "51F0114FB6A6CD37",
4428 	"3D3D3D3D3D3D3D3D", "3D3D3D3D3D3D3D3D", "9D0BB4DB830ECB73",
4429 	"3E3E3E3E3E3E3E3E", "3E3E3E3E3E3E3E3E", "E96089D6368F3E1A",
4430 	"3F3F3F3F3F3F3F3F", "3F3F3F3F3F3F3F3F", "5C4CA877A4E1E92D",
4431 	"4040404040404040", "4040404040404040", "6D55DDBC8DEA95FF",
4432 	"4141414141414141", "4141414141414141", "19DF84AC95551003",
4433 	"4242424242424242", "4242424242424242", "724E7332696D08A7",
4434 	"4343434343434343", "4343434343434343", "B91810B8CDC58FE2",
4435 	"4444444444444444", "4444444444444444", "06E23526EDCCD0C4",
4436 	"4545454545454545", "4545454545454545", "EF52491D5468D441",
4437 	"4646464646464646", "4646464646464646", "48019C59E39B90C5",
4438 	"4747474747474747", "4747474747474747", "0544083FB902D8C0",
4439 	"4848484848484848", "4848484848484848", "63B15CADA668CE12",
4440 	"4949494949494949", "4949494949494949", "EACC0C1264171071",
4441 	"4A4A4A4A4A4A4A4A", "4A4A4A4A4A4A4A4A", "9D2B8C0AC605F274",
4442 	"4B4B4B4B4B4B4B4B", "4B4B4B4B4B4B4B4B", "C90F2F4C98A8FB2A",
4443 	"4C4C4C4C4C4C4C4C", "4C4C4C4C4C4C4C4C", "03481B4828FD1D04",
4444 	"4D4D4D4D4D4D4D4D", "4D4D4D4D4D4D4D4D", "C78FC45A1DCEA2E2",
4445 	"4E4E4E4E4E4E4E4E", "4E4E4E4E4E4E4E4E", "DB96D88C3460D801",
4446 	"4F4F4F4F4F4F4F4F", "4F4F4F4F4F4F4F4F", "6C69E720F5105518",
4447 	"5050505050505050", "5050505050505050", "0D262E418BC893F3",
4448 	"5151515151515151", "5151515151515151", "6AD84FD7848A0A5C",
4449 	"5252525252525252", "5252525252525252", "C365CB35B34B6114",
4450 	"5353535353535353", "5353535353535353", "1155392E877F42A9",
4451 	"5454545454545454", "5454545454545454", "531BE5F9405DA715",
4452 	"5555555555555555", "5555555555555555", "3BCDD41E6165A5E8",
4453 	"5656565656565656", "5656565656565656", "2B1FF5610A19270C",
4454 	"5757575757575757", "5757575757575757", "D90772CF3F047CFD",
4455 	"5858585858585858", "5858585858585858", "1BEA27FFB72457B7",
4456 	"5959595959595959", "5959595959595959", "85C3E0C429F34C27",
4457 	"5A5A5A5A5A5A5A5A", "5A5A5A5A5A5A5A5A", "F9038021E37C7618",
4458 	"5B5B5B5B5B5B5B5B", "5B5B5B5B5B5B5B5B", "35BC6FF838DBA32F",
4459 	"5C5C5C5C5C5C5C5C", "5C5C5C5C5C5C5C5C", "4927ACC8CE45ECE7",
4460 	"5D5D5D5D5D5D5D5D", "5D5D5D5D5D5D5D5D", "E812EE6E3572985C",
4461 	"5E5E5E5E5E5E5E5E", "5E5E5E5E5E5E5E5E", "9BB93A89627BF65F",
4462 	"5F5F5F5F5F5F5F5F", "5F5F5F5F5F5F5F5F", "EF12476884CB74CA",
4463 	"6060606060606060", "6060606060606060", "1BF17E00C09E7CBF",
4464 	"6161616161616161", "6161616161616161", "29932350C098DB5D",
4465 	"6262626262626262", "6262626262626262", "B476E6499842AC54",
4466 	"6363636363636363", "6363636363636363", "5C662C29C1E96056",
4467 	"6464646464646464", "6464646464646464", "3AF1703D76442789",
4468 	"6565656565656565", "6565656565656565", "86405D9B425A8C8C",
4469 	"6666666666666666", "6666666666666666", "EBBF4810619C2C55",
4470 	"6767676767676767", "6767676767676767", "F8D1CD7367B21B5D",
4471 	"6868686868686868", "6868686868686868", "9EE703142BF8D7E2",
4472 	"6969696969696969", "6969696969696969", "5FDFFFC3AAAB0CB3",
4473 	"6A6A6A6A6A6A6A6A", "6A6A6A6A6A6A6A6A", "26C940AB13574231",
4474 	"6B6B6B6B6B6B6B6B", "6B6B6B6B6B6B6B6B", "1E2DC77E36A84693",
4475 	"6C6C6C6C6C6C6C6C", "6C6C6C6C6C6C6C6C", "0F4FF4D9BC7E2244",
4476 	"6D6D6D6D6D6D6D6D", "6D6D6D6D6D6D6D6D", "A4C9A0D04D3280CD",
4477 	"6E6E6E6E6E6E6E6E", "6E6E6E6E6E6E6E6E", "9FAF2C96FE84919D",
4478 	"6F6F6F6F6F6F6F6F", "6F6F6F6F6F6F6F6F", "115DBC965E6096C8",
4479 	"7070707070707070", "7070707070707070", "AF531E9520994017",
4480 	"7171717171717171", "7171717171717171", "B971ADE70E5C89EE",
4481 	"7272727272727272", "7272727272727272", "415D81C86AF9C376",
4482 	"7373737373737373", "7373737373737373", "8DFB864FDB3C6811",
4483 	"7474747474747474", "7474747474747474", "10B1C170E3398F91",
4484 	"7575757575757575", "7575757575757575", "CFEF7A1C0218DB1E",
4485 	"7676767676767676", "7676767676767676", "DBAC30A2A40B1B9C",
4486 	"7777777777777777", "7777777777777777", "89D3BF37052162E9",
4487 	"7878787878787878", "7878787878787878", "80D9230BDAEB67DC",
4488 	"7979797979797979", "7979797979797979", "3440911019AD68D7",
4489 	"7A7A7A7A7A7A7A7A", "7A7A7A7A7A7A7A7A", "9626FE57596E199E",
4490 	"7B7B7B7B7B7B7B7B", "7B7B7B7B7B7B7B7B", "DEA0B796624BB5BA",
4491 	"7C7C7C7C7C7C7C7C", "7C7C7C7C7C7C7C7C", "E9E40542BDDB3E9D",
4492 	"7D7D7D7D7D7D7D7D", "7D7D7D7D7D7D7D7D", "8AD99914B354B911",
4493 	"7E7E7E7E7E7E7E7E", "7E7E7E7E7E7E7E7E", "6F85B98DD12CB13B",
4494 	"7F7F7F7F7F7F7F7F", "7F7F7F7F7F7F7F7F", "10130DA3C3A23924",
4495 	"8080808080808080", "8080808080808080", "EFECF25C3C5DC6DB",
4496 	"8181818181818181", "8181818181818181", "907A46722ED34EC4",
4497 	"8282828282828282", "8282828282828282", "752666EB4CAB46EE",
4498 	"8383838383838383", "8383838383838383", "161BFABD4224C162",
4499 	"8484848484848484", "8484848484848484", "215F48699DB44A45",
4500 	"8585858585858585", "8585858585858585", "69D901A8A691E661",
4501 	"8686868686868686", "8686868686868686", "CBBF6EEFE6529728",
4502 	"8787878787878787", "8787878787878787", "7F26DCF425149823",
4503 	"8888888888888888", "8888888888888888", "762C40C8FADE9D16",
4504 	"8989898989898989", "8989898989898989", "2453CF5D5BF4E463",
4505 	"8A8A8A8A8A8A8A8A", "8A8A8A8A8A8A8A8A", "301085E3FDE724E1",
4506 	"8B8B8B8B8B8B8B8B", "8B8B8B8B8B8B8B8B", "EF4E3E8F1CC6706E",
4507 	"8C8C8C8C8C8C8C8C", "8C8C8C8C8C8C8C8C", "720479B024C397EE",
4508 	"8D8D8D8D8D8D8D8D", "8D8D8D8D8D8D8D8D", "BEA27E3795063C89",
4509 	"8E8E8E8E8E8E8E8E", "8E8E8E8E8E8E8E8E", "468E5218F1A37611",
4510 	"8F8F8F8F8F8F8F8F", "8F8F8F8F8F8F8F8F", "50ACE16ADF66BFE8",
4511 	"9090909090909090", "9090909090909090", "EEA24369A19F6937",
4512 	"9191919191919191", "9191919191919191", "6050D369017B6E62",
4513 	"9292929292929292", "9292929292929292", "5B365F2FB2CD7F32",
4514 	"9393939393939393", "9393939393939393", "F0B00B264381DDBB",
4515 	"9494949494949494", "9494949494949494", "E1D23881C957B96C",
4516 	"9595959595959595", "9595959595959595", "D936BF54ECA8BDCE",
4517 	"9696969696969696", "9696969696969696", "A020003C5554F34C",
4518 	"9797979797979797", "9797979797979797", "6118FCEBD407281D",
4519 	"9898989898989898", "9898989898989898", "072E328C984DE4A2",
4520 	"9999999999999999", "9999999999999999", "1440B7EF9E63D3AA",
4521 	"9A9A9A9A9A9A9A9A", "9A9A9A9A9A9A9A9A", "79BFA264BDA57373",
4522 	"9B9B9B9B9B9B9B9B", "9B9B9B9B9B9B9B9B", "C50E8FC289BBD876",
4523 	"9C9C9C9C9C9C9C9C", "9C9C9C9C9C9C9C9C", "A399D3D63E169FA9",
4524 	"9D9D9D9D9D9D9D9D", "9D9D9D9D9D9D9D9D", "4B8919B667BD53AB",
4525 	"9E9E9E9E9E9E9E9E", "9E9E9E9E9E9E9E9E", "D66CDCAF3F6724A2",
4526 	"9F9F9F9F9F9F9F9F", "9F9F9F9F9F9F9F9F", "E40E81FF3F618340",
4527 	"A0A0A0A0A0A0A0A0", "A0A0A0A0A0A0A0A0", "10EDB8977B348B35",
4528 	"A1A1A1A1A1A1A1A1", "A1A1A1A1A1A1A1A1", "6446C5769D8409A0",
4529 	"A2A2A2A2A2A2A2A2", "A2A2A2A2A2A2A2A2", "17ED1191CA8D67A3",
4530 	"A3A3A3A3A3A3A3A3", "A3A3A3A3A3A3A3A3", "B6D8533731BA1318",
4531 	"A4A4A4A4A4A4A4A4", "A4A4A4A4A4A4A4A4", "CA439007C7245CD0",
4532 	"A5A5A5A5A5A5A5A5", "A5A5A5A5A5A5A5A5", "06FC7FDE1C8389E7",
4533 	"A6A6A6A6A6A6A6A6", "A6A6A6A6A6A6A6A6", "7A3C1F3BD60CB3D8",
4534 	"A7A7A7A7A7A7A7A7", "A7A7A7A7A7A7A7A7", "E415D80048DBA848",
4535 	"A8A8A8A8A8A8A8A8", "A8A8A8A8A8A8A8A8", "26F88D30C0FB8302",
4536 	"A9A9A9A9A9A9A9A9", "A9A9A9A9A9A9A9A9", "D4E00A9EF5E6D8F3",
4537 	"AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "C4322BE19E9A5A17",
4538 	"ABABABABABABABAB", "ABABABABABABABAB", "ACE41A06BFA258EA",
4539 	"ACACACACACACACAC", "ACACACACACACACAC", "EEAAC6D17880BD56",
4540 	"ADADADADADADADAD", "ADADADADADADADAD", "3C9A34CA4CB49EEB",
4541 	"AEAEAEAEAEAEAEAE", "AEAEAEAEAEAEAEAE", "9527B0287B75F5A3",
4542 	"AFAFAFAFAFAFAFAF", "AFAFAFAFAFAFAFAF", "F2D9D1BE74376C0C",
4543 	"B0B0B0B0B0B0B0B0", "B0B0B0B0B0B0B0B0", "939618DF0AEFAAE7",
4544 	"B1B1B1B1B1B1B1B1", "B1B1B1B1B1B1B1B1", "24692773CB9F27FE",
4545 	"B2B2B2B2B2B2B2B2", "B2B2B2B2B2B2B2B2", "38703BA5E2315D1D",
4546 	"B3B3B3B3B3B3B3B3", "B3B3B3B3B3B3B3B3", "FCB7E4B7D702E2FB",
4547 	"B4B4B4B4B4B4B4B4", "B4B4B4B4B4B4B4B4", "36F0D0B3675704D5",
4548 	"B5B5B5B5B5B5B5B5", "B5B5B5B5B5B5B5B5", "62D473F539FA0D8B",
4549 	"B6B6B6B6B6B6B6B6", "B6B6B6B6B6B6B6B6", "1533F3ED9BE8EF8E",
4550 	"B7B7B7B7B7B7B7B7", "B7B7B7B7B7B7B7B7", "9C4EA352599731ED",
4551 	"B8B8B8B8B8B8B8B8", "B8B8B8B8B8B8B8B8", "FABBF7C046FD273F",
4552 	"B9B9B9B9B9B9B9B9", "B9B9B9B9B9B9B9B9", "B7FE63A61C646F3A",
4553 	"BABABABABABABABA", "BABABABABABABABA", "10ADB6E2AB972BBE",
4554 	"BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "F91DCAD912332F3B",
4555 	"BCBCBCBCBCBCBCBC", "BCBCBCBCBCBCBCBC", "46E7EF47323A701D",
4556 	"BDBDBDBDBDBDBDBD", "BDBDBDBDBDBDBDBD", "8DB18CCD9692F758",
4557 	"BEBEBEBEBEBEBEBE", "BEBEBEBEBEBEBEBE", "E6207B536AAAEFFC",
4558 	"BFBFBFBFBFBFBFBF", "BFBFBFBFBFBFBFBF", "92AA224372156A00",
4559 	"C0C0C0C0C0C0C0C0", "C0C0C0C0C0C0C0C0", "A3B357885B1E16D2",
4560 	"C1C1C1C1C1C1C1C1", "C1C1C1C1C1C1C1C1", "169F7629C970C1E5",
4561 	"C2C2C2C2C2C2C2C2", "C2C2C2C2C2C2C2C2", "62F44B247CF1348C",
4562 	"C3C3C3C3C3C3C3C3", "C3C3C3C3C3C3C3C3", "AE0FEEB0495932C8",
4563 	"C4C4C4C4C4C4C4C4", "C4C4C4C4C4C4C4C4", "72DAF2A7C9EA6803",
4564 	"C5C5C5C5C5C5C5C5", "C5C5C5C5C5C5C5C5", "4FB5D5536DA544F4",
4565 	"C6C6C6C6C6C6C6C6", "C6C6C6C6C6C6C6C6", "1DD4E65AAF7988B4",
4566 	"C7C7C7C7C7C7C7C7", "C7C7C7C7C7C7C7C7", "76BF084C1535A6C6",
4567 	"C8C8C8C8C8C8C8C8", "C8C8C8C8C8C8C8C8", "AFEC35B09D36315F",
4568 	"C9C9C9C9C9C9C9C9", "C9C9C9C9C9C9C9C9", "C8078A6148818403",
4569 	"CACACACACACACACA", "CACACACACACACACA", "4DA91CB4124B67FE",
4570 	"CBCBCBCBCBCBCBCB", "CBCBCBCBCBCBCBCB", "2DABFEB346794C3D",
4571 	"CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", "FBCD12C790D21CD7",
4572 	"CDCDCDCDCDCDCDCD", "CDCDCDCDCDCDCDCD", "536873DB879CC770",
4573 	"CECECECECECECECE", "CECECECECECECECE", "9AA159D7309DA7A0",
4574 	"CFCFCFCFCFCFCFCF", "CFCFCFCFCFCFCFCF", "0B844B9D8C4EA14A",
4575 	"D0D0D0D0D0D0D0D0", "D0D0D0D0D0D0D0D0", "3BBD84CE539E68C4",
4576 	"D1D1D1D1D1D1D1D1", "D1D1D1D1D1D1D1D1", "CF3E4F3E026E2C8E",
4577 	"D2D2D2D2D2D2D2D2", "D2D2D2D2D2D2D2D2", "82F85885D542AF58",
4578 	"D3D3D3D3D3D3D3D3", "D3D3D3D3D3D3D3D3", "22D334D6493B3CB6",
4579 	"D4D4D4D4D4D4D4D4", "D4D4D4D4D4D4D4D4", "47E9CB3E3154D673",
4580 	"D5D5D5D5D5D5D5D5", "D5D5D5D5D5D5D5D5", "2352BCC708ADC7E9",
4581 	"D6D6D6D6D6D6D6D6", "D6D6D6D6D6D6D6D6", "8C0F3BA0C8601980",
4582 	"D7D7D7D7D7D7D7D7", "D7D7D7D7D7D7D7D7", "EE5E9FD70CEF00E9",
4583 	"D8D8D8D8D8D8D8D8", "D8D8D8D8D8D8D8D8", "DEF6BDA6CABF9547",
4584 	"D9D9D9D9D9D9D9D9", "D9D9D9D9D9D9D9D9", "4DADD04A0EA70F20",
4585 	"DADADADADADADADA", "DADADADADADADADA", "C1AA16689EE1B482",
4586 	"DBDBDBDBDBDBDBDB", "DBDBDBDBDBDBDBDB", "F45FC26193E69AEE",
4587 	"DCDCDCDCDCDCDCDC", "DCDCDCDCDCDCDCDC", "D0CFBB937CEDBFB5",
4588 	"DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "F0752004EE23D87B",
4589 	"DEDEDEDEDEDEDEDE", "DEDEDEDEDEDEDEDE", "77A791E28AA464A5",
4590 	"DFDFDFDFDFDFDFDF", "DFDFDFDFDFDFDFDF", "E7562A7F56FF4966",
4591 	"E0E0E0E0E0E0E0E0", "E0E0E0E0E0E0E0E0", "B026913F2CCFB109",
4592 	"E1E1E1E1E1E1E1E1", "E1E1E1E1E1E1E1E1", "0DB572DDCE388AC7",
4593 	"E2E2E2E2E2E2E2E2", "E2E2E2E2E2E2E2E2", "D9FA6595F0C094CA",
4594 	"E3E3E3E3E3E3E3E3", "E3E3E3E3E3E3E3E3", "ADE4804C4BE4486E",
4595 	"E4E4E4E4E4E4E4E4", "E4E4E4E4E4E4E4E4", "007B81F520E6D7DA",
4596 	"E5E5E5E5E5E5E5E5", "E5E5E5E5E5E5E5E5", "961AEB77BFC10B3C",
4597 	"E6E6E6E6E6E6E6E6", "E6E6E6E6E6E6E6E6", "8A8DD870C9B14AF2",
4598 	"E7E7E7E7E7E7E7E7", "E7E7E7E7E7E7E7E7", "3CC02E14B6349B25",
4599 	"E8E8E8E8E8E8E8E8", "E8E8E8E8E8E8E8E8", "BAD3EE68BDDB9607",
4600 	"E9E9E9E9E9E9E9E9", "E9E9E9E9E9E9E9E9", "DFF918E93BDAD292",
4601 	"EAEAEAEAEAEAEAEA", "EAEAEAEAEAEAEAEA", "8FE559C7CD6FA56D",
4602 	"EBEBEBEBEBEBEBEB", "EBEBEBEBEBEBEBEB", "C88480835C1A444C",
4603 	"ECECECECECECECEC", "ECECECECECECECEC", "D6EE30A16B2CC01E",
4604 	"EDEDEDEDEDEDEDED", "EDEDEDEDEDEDEDED", "6932D887B2EA9C1A",
4605 	"EEEEEEEEEEEEEEEE", "EEEEEEEEEEEEEEEE", "0BFC865461F13ACC",
4606 	"EFEFEFEFEFEFEFEF", "EFEFEFEFEFEFEFEF", "228AEA0D403E807A",
4607 	"F0F0F0F0F0F0F0F0", "F0F0F0F0F0F0F0F0", "2A2891F65BB8173C",
4608 	"F1F1F1F1F1F1F1F1", "F1F1F1F1F1F1F1F1", "5D1B8FAF7839494B",
4609 	"F2F2F2F2F2F2F2F2", "F2F2F2F2F2F2F2F2", "1C0A9280EECF5D48",
4610 	"F3F3F3F3F3F3F3F3", "F3F3F3F3F3F3F3F3", "6CBCE951BBC30F74",
4611 	"F4F4F4F4F4F4F4F4", "F4F4F4F4F4F4F4F4", "9CA66E96BD08BC70",
4612 	"F5F5F5F5F5F5F5F5", "F5F5F5F5F5F5F5F5", "F5D779FCFBB28BF3",
4613 	"F6F6F6F6F6F6F6F6", "F6F6F6F6F6F6F6F6", "0FEC6BBF9B859184",
4614 	"F7F7F7F7F7F7F7F7", "F7F7F7F7F7F7F7F7", "EF88D2BF052DBDA8",
4615 	"F8F8F8F8F8F8F8F8", "F8F8F8F8F8F8F8F8", "39ADBDDB7363090D",
4616 	"F9F9F9F9F9F9F9F9", "F9F9F9F9F9F9F9F9", "C0AEAF445F7E2A7A",
4617 	"FAFAFAFAFAFAFAFA", "FAFAFAFAFAFAFAFA", "C66F54067298D4E9",
4618 	"FBFBFBFBFBFBFBFB", "FBFBFBFBFBFBFBFB", "E0BA8F4488AAF97C",
4619 	"FCFCFCFCFCFCFCFC", "FCFCFCFCFCFCFCFC", "67B36E2875D9631C",
4620 	"FDFDFDFDFDFDFDFD", "FDFDFDFDFDFDFDFD", "1ED83D49E267191D",
4621 	"FEFEFEFEFEFEFEFE", "FEFEFEFEFEFEFEFE", "66B2B23EA84693AD",
4622 	"FFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFF", "7359B2163E4EDC58",
4623 	"0001020304050607", "0011223344556677", "3EF0A891CF8ED990",
4624 	"2BD6459F82C5B300", "EA024714AD5C4D84", "126EFE8ED312190A",
4625 
4626 	NULL
4627 };
4628 
4629 /*
4630  * Known-answer tests for DES/3DES in CBC mode. Order: key, IV,
4631  * plaintext, ciphertext.
4632  */
4633 static const char *const KAT_DES_CBC[] = {
4634 	/*
4635 	 * From NIST validation suite (tdesmmt.zip).
4636 	 */
4637 	"34a41a8c293176c1b30732ecfe38ae8a34a41a8c293176c1",
4638 	"f55b4855228bd0b4",
4639 	"7dd880d2a9ab411c",
4640 	"c91892948b6cadb4",
4641 
4642 	"70a88fa1dfb9942fa77f40157ffef2ad70a88fa1dfb9942f",
4643 	"ece08ce2fdc6ce80",
4644 	"bc225304d5a3a5c9918fc5006cbc40cc",
4645 	"27f67dc87af7ddb4b68f63fa7c2d454a",
4646 
4647 	"e091790be55be0bc0780153861a84adce091790be55be0bc",
4648 	"fd7d430f86fbbffe",
4649 	"03c7fffd7f36499c703dedc9df4de4a92dd4382e576d6ae9",
4650 	"053aeba85dd3a23bfbe8440a432f9578f312be60fb9f0035",
4651 
4652 	"857feacd16157c58e5347a70e56e578a857feacd16157c58",
4653 	"002dcb6d46ef0969",
4654 	"1f13701c7f0d7385307507a18e89843ebd295bd5e239ef109347a6898c6d3fd5",
4655 	"a0e4edde34f05bd8397ce279e49853e9387ba04be562f5fa19c3289c3f5a3391",
4656 
4657 	"a173545b265875ba852331fbb95b49a8a173545b265875ba",
4658 	"ab385756391d364c",
4659 	"d08894c565608d9ae51dda63b85b3b33b1703bb5e4f1abcbb8794e743da5d6f3bf630f2e9b6d5b54",
4660 	"370b47acf89ac6bdbb13c9a7336787dc41e1ad8beead32281d0609fb54968404bdf2894892590658",
4661 
4662 	"26376bcb2f23df1083cd684fe00ed3c726376bcb2f23df10",
4663 	"33acfb0f3d240ea6",
4664 	"903a1911da1e6877f23c1985a9b61786ef438e0ce1240885035ad60fc916b18e5d71a1fb9c5d1eff61db75c0076f6efb",
4665 	"7a4f7510f6ec0b93e2495d21a8355684d303a770ebda2e0e51ff33d72b20cb73e58e2e3de2ef6b2e12c504c0f181ba63",
4666 
4667 	"3e1f98135d027cec752f67765408a7913e1f98135d027cec",
4668 	"11f5f2304b28f68b",
4669 	"7c022f5af24f7925d323d4d0e20a2ce49272c5e764b22c806f4b6ddc406d864fe5bd1c3f45556d3eb30c8676c2f8b54a5a32423a0bd95a07",
4670 	"2bb4b131fa4ae0b4f0378a2cdb68556af6eee837613016d7ea936f3931f25f8b3ae351d5e9d00be665676e2400408b5db9892d95421e7f1a",
4671 
4672 	"13b9d549cd136ec7bf9e9810ef2cdcbf13b9d549cd136ec7",
4673 	"a82c1b1057badcc8",
4674 	"1fff1563bc1645b55cb23ea34a0049dfc06607150614b621dedcb07f20433402a2d869c95ac4a070c7a3da838c928a385f899c5d21ecb58f4e5cbdad98d39b8c",
4675 	"75f804d4a2c542a31703e23df26cc38861a0729090e6eae5672c1db8c0b09fba9b125bbca7d6c7d330b3859e6725c6d26de21c4e3af7f5ea94df3cde2349ce37",
4676 
4677 	"20320dfdad579bb57c6e4acd769dbadf20320dfdad579bb5",
4678 	"879201b5857ccdea",
4679 	"0431283cc8bb4dc7750a9d5c68578486932091632a12d0a79f2c54e3d122130881fff727050f317a40fcd1a8d13793458b99fc98254ba6a233e3d95b55cf5a3faff78809999ea4bf",
4680 	"85d17840eb2af5fc727027336bfd71a2b31bd14a1d9eb64f8a08bfc4f56eaa9ca7654a5ae698287869cc27324813730de4f1384e0b8cfbc472ff5470e3c5e4bd8ceb23dc2d91988c",
4681 
4682 	"23abb073a2df34cb3d1fdce6b092582c23abb073a2df34cb",
4683 	"7d7fbf19e8562d32",
4684 	"31e718fd95e6d7ca4f94763191add2674ab07c909d88c486916c16d60a048a0cf8cdb631cebec791362cd0c202eb61e166b65c1f65d0047c8aec57d3d84b9e17032442dce148e1191b06a12c284cc41e",
4685 	"c9a3f75ab6a7cd08a7fd53ca540aafe731d257ee1c379fadcc4cc1a06e7c12bddbeb7562c436d1da849ed072629e82a97b56d9becc25ff4f16f21c5f2a01911604f0b5c49df96cb641faee662ca8aa68",
4686 
4687 	"b5cb1504802326c73df186e3e352a20de643b0d63ee30e37",
4688 	"43f791134c5647ba",
4689 	"dcc153cef81d6f24",
4690 	"92538bd8af18d3ba",
4691 
4692 	"a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f7358",
4693 	"c2e999cb6249023c",
4694 	"c689aee38a301bb316da75db36f110b5",
4695 	"e9afaba5ec75ea1bbe65506655bb4ecb",
4696 
4697 	"1a5d4c0825072a15a8ad9dfdaeda8c048adffb85bc4fced0",
4698 	"7fcfa736f7548b6f",
4699 	"983c3edacd939406010e1bc6ff9e12320ac5008117fa8f84",
4700 	"d84fa24f38cf451ca2c9adc960120bd8ff9871584fe31cee",
4701 
4702 	"d98aadc76d4a3716158c32866efbb9ce834af2297379a49d",
4703 	"3c5220327c502b44",
4704 	"6174079dda53ca723ebf00a66837f8d5ce648c08acaa5ee45ffe62210ef79d3e",
4705 	"f5bd4d600bed77bec78409e3530ebda1d815506ed53103015b87e371ae000958",
4706 
4707 	"ef6d3e54266d978ffb0b8ce6689d803e2cd34cc802fd0252",
4708 	"38bae5bce06d0ad9",
4709 	"c4f228b537223cd01c0debb5d9d4e12ba71656618d119b2f8f0af29d23efa3a9e43c4c458a1b79a0",
4710 	"9e3289fb18379f55aa4e45a7e0e6df160b33b75f8627ad0954f8fdcb78cee55a4664caeda1000fe5",
4711 
4712 	"625bc19b19df83abfb2f5bec9d4f2062017525a75bc26e70",
4713 	"bd0cff364ff69a91",
4714 	"8152d2ab876c3c8201403a5a406d3feaf27319dbea6ad01e24f4d18203704b86de70da6bbb6d638e5aba3ff576b79b28",
4715 	"706fe7a973fac40e25b2b4499ce527078944c70e976d017b6af86a3a7a6b52943a72ba18a58000d2b61fdc3bfef2bc4a",
4716 
4717 	"b6383176046e6880a1023bf45768b5bf5119022fe054bfe5",
4718 	"ec13ca541c43401e",
4719 	"cd5a886e9af011346c4dba36a424f96a78a1ddf28aaa4188bf65451f4efaffc7179a6dd237c0ae35d9b672314e5cb032612597f7e462c6f3",
4720 	"b030f976f46277ee211c4a324d5c87555d1084513a1223d3b84416b52bbc28f4b77f3a9d8d0d91dc37d3dbe8af8be98f74674b02f9a38527",
4721 
4722 	"3d8cf273d343b9aedccddacb91ad86206737adc86b4a49a7",
4723 	"bb3a9a0c71c62ef0",
4724 	"1fde3991c32ce220b5b6666a9234f2fd7bd24b921829fd9cdc6eb4218be9eac9faa9c2351777349128086b6d58776bc86ff2f76ee1b3b2850a318462b8983fa1",
4725 	"422ce705a46bb52ad928dab6c863166d617c6fc24003633120d91918314bbf464cea7345c3c35f2042f2d6929735d74d7728f22fea618a0b9cf5b1281acb13fb",
4726 
4727 	"fbceb5cb646b925be0b92f7f6b493d5e5b16e9159732732a",
4728 	"2e17b3c7025ae86b",
4729 	"4c309bc8e1e464fdd2a2b8978645d668d455f7526bd8d7b6716a722f6a900b815c4a73cc30e788065c1dfca7bf5958a6cc5440a5ebe7f8691c20278cde95db764ff8ce8994ece89c",
4730 	"c02129bdf4bbbd75e71605a00b12c80db6b4e05308e916615011f09147ed915dd1bc67f27f9e027e4e13df36b55464a31c11b4d1fe3d855d89df492e1a7201b995c1ba16a8dbabee",
4731 
4732 	"9b162a0df8ad9b61c88676e3d586434570b902f12a2046e0",
4733 	"ebd6fefe029ad54b",
4734 	"f4c1c918e77355c8156f0fd778da52bff121ae5f2f44eaf4d2754946d0e10d1f18ce3a0176e69c18b7d20b6e0d0bee5eb5edfe4bd60e4d92adcd86bce72e76f94ee5cbcaa8b01cfddcea2ade575e66ac",
4735 	"1ff3c8709f403a8eff291aedf50c010df5c5ff64a8b205f1fce68564798897a390db16ee0d053856b75898009731da290fcc119dad987277aacef694872e880c4bb41471063fae05c89f25e4bd0cad6a",
4736 
4737 	NULL
4738 };
4739 
4740 static void
4741 xor_buf(unsigned char *dst, const unsigned char *src, size_t len)
4742 {
4743 	while (len -- > 0) {
4744 		*dst ++ ^= *src ++;
4745 	}
4746 }
4747 
4748 static void
4749 monte_carlo_DES_encrypt(const br_block_cbcenc_class *ve)
4750 {
4751 	unsigned char k1[8], k2[8], k3[8];
4752 	unsigned char buf[8];
4753 	unsigned char cipher[8];
4754 	int i, j;
4755 	br_des_gen_cbcenc_keys v_ec;
4756 	void *ec;
4757 
4758 	ec = &v_ec;
4759 	hextobin(k1, "9ec2372c86379df4");
4760 	hextobin(k2, "ad7ac4464f73805d");
4761 	hextobin(k3, "20c4f87564527c91");
4762 	hextobin(buf, "b624d6bd41783ab1");
4763 	hextobin(cipher, "eafd97b190b167fe");
4764 	for (i = 0; i < 400; i ++) {
4765 		unsigned char key[24];
4766 
4767 		memcpy(key, k1, 8);
4768 		memcpy(key + 8, k2, 8);
4769 		memcpy(key + 16, k3, 8);
4770 		ve->init(ec, key, sizeof key);
4771 		for (j = 0; j < 10000; j ++) {
4772 			unsigned char iv[8];
4773 
4774 			memset(iv, 0, sizeof iv);
4775 			ve->run(ec, iv, buf, sizeof buf);
4776 			switch (j) {
4777 			case 9997: xor_buf(k3, buf, 8); break;
4778 			case 9998: xor_buf(k2, buf, 8); break;
4779 			case 9999: xor_buf(k1, buf, 8); break;
4780 			}
4781 		}
4782 		printf(".");
4783 		fflush(stdout);
4784 	}
4785 	printf(" ");
4786 	fflush(stdout);
4787 	check_equals("MC DES encrypt", buf, cipher, sizeof buf);
4788 }
4789 
4790 static void
4791 monte_carlo_DES_decrypt(const br_block_cbcdec_class *vd)
4792 {
4793 	unsigned char k1[8], k2[8], k3[8];
4794 	unsigned char buf[8];
4795 	unsigned char plain[8];
4796 	int i, j;
4797 	br_des_gen_cbcdec_keys v_dc;
4798 	void *dc;
4799 
4800 	dc = &v_dc;
4801 	hextobin(k1, "79b63486e0ce37e0");
4802 	hextobin(k2, "08e65231abae3710");
4803 	hextobin(k3, "1f5eb69e925ef185");
4804 	hextobin(buf, "2783aa729432fe96");
4805 	hextobin(plain, "44937ca532cdbf98");
4806 	for (i = 0; i < 400; i ++) {
4807 		unsigned char key[24];
4808 
4809 		memcpy(key, k1, 8);
4810 		memcpy(key + 8, k2, 8);
4811 		memcpy(key + 16, k3, 8);
4812 		vd->init(dc, key, sizeof key);
4813 		for (j = 0; j < 10000; j ++) {
4814 			unsigned char iv[8];
4815 
4816 			memset(iv, 0, sizeof iv);
4817 			vd->run(dc, iv, buf, sizeof buf);
4818 			switch (j) {
4819 			case 9997: xor_buf(k3, buf, 8); break;
4820 			case 9998: xor_buf(k2, buf, 8); break;
4821 			case 9999: xor_buf(k1, buf, 8); break;
4822 			}
4823 		}
4824 		printf(".");
4825 		fflush(stdout);
4826 	}
4827 	printf(" ");
4828 	fflush(stdout);
4829 	check_equals("MC DES decrypt", buf, plain, sizeof buf);
4830 }
4831 
4832 static void
4833 test_DES_generic(char *name,
4834 	const br_block_cbcenc_class *ve,
4835 	const br_block_cbcdec_class *vd,
4836 	int with_MC, int with_CBC)
4837 {
4838 	size_t u;
4839 
4840 	printf("Test %s: ", name);
4841 	fflush(stdout);
4842 
4843 	if (ve->block_size != 8 || vd->block_size != 8) {
4844 		fprintf(stderr, "%s failed: wrong block size\n", name);
4845 		exit(EXIT_FAILURE);
4846 	}
4847 
4848 	for (u = 0; KAT_DES[u]; u += 3) {
4849 		unsigned char key[24];
4850 		unsigned char plain[8];
4851 		unsigned char cipher[8];
4852 		unsigned char buf[8];
4853 		unsigned char iv[8];
4854 		size_t key_len;
4855 		br_des_gen_cbcenc_keys v_ec;
4856 		br_des_gen_cbcdec_keys v_dc;
4857 		const br_block_cbcenc_class **ec;
4858 		const br_block_cbcdec_class **dc;
4859 
4860 		ec = &v_ec.vtable;
4861 		dc = &v_dc.vtable;
4862 		key_len = hextobin(key, KAT_DES[u]);
4863 		hextobin(plain, KAT_DES[u + 1]);
4864 		hextobin(cipher, KAT_DES[u + 2]);
4865 		ve->init(ec, key, key_len);
4866 		memcpy(buf, plain, sizeof plain);
4867 		memset(iv, 0, sizeof iv);
4868 		ve->run(ec, iv, buf, sizeof buf);
4869 		check_equals("KAT DES encrypt", buf, cipher, sizeof cipher);
4870 		vd->init(dc, key, key_len);
4871 		memset(iv, 0, sizeof iv);
4872 		vd->run(dc, iv, buf, sizeof buf);
4873 		check_equals("KAT DES decrypt", buf, plain, sizeof plain);
4874 
4875 		if (key_len == 8) {
4876 			memcpy(key + 8, key, 8);
4877 			memcpy(key + 16, key, 8);
4878 			ve->init(ec, key, 24);
4879 			memcpy(buf, plain, sizeof plain);
4880 			memset(iv, 0, sizeof iv);
4881 			ve->run(ec, iv, buf, sizeof buf);
4882 			check_equals("KAT DES->3 encrypt",
4883 				buf, cipher, sizeof cipher);
4884 			vd->init(dc, key, 24);
4885 			memset(iv, 0, sizeof iv);
4886 			vd->run(dc, iv, buf, sizeof buf);
4887 			check_equals("KAT DES->3 decrypt",
4888 				buf, plain, sizeof plain);
4889 		}
4890 	}
4891 
4892 	if (with_CBC) {
4893 		for (u = 0; KAT_DES_CBC[u]; u += 4) {
4894 			unsigned char key[24];
4895 			unsigned char ivref[8];
4896 			unsigned char plain[200];
4897 			unsigned char cipher[200];
4898 			unsigned char buf[200];
4899 			unsigned char iv[8];
4900 			size_t key_len, data_len, v;
4901 			br_des_gen_cbcenc_keys v_ec;
4902 			br_des_gen_cbcdec_keys v_dc;
4903 			const br_block_cbcenc_class **ec;
4904 			const br_block_cbcdec_class **dc;
4905 
4906 			ec = &v_ec.vtable;
4907 			dc = &v_dc.vtable;
4908 			key_len = hextobin(key, KAT_DES_CBC[u]);
4909 			hextobin(ivref, KAT_DES_CBC[u + 1]);
4910 			data_len = hextobin(plain, KAT_DES_CBC[u + 2]);
4911 			hextobin(cipher, KAT_DES_CBC[u + 3]);
4912 			ve->init(ec, key, key_len);
4913 
4914 			memcpy(buf, plain, data_len);
4915 			memcpy(iv, ivref, 8);
4916 			ve->run(ec, iv, buf, data_len);
4917 			check_equals("KAT CBC DES encrypt",
4918 				buf, cipher, data_len);
4919 			vd->init(dc, key, key_len);
4920 			memcpy(iv, ivref, 8);
4921 			vd->run(dc, iv, buf, data_len);
4922 			check_equals("KAT CBC DES decrypt",
4923 				buf, plain, data_len);
4924 
4925 			memcpy(buf, plain, data_len);
4926 			memcpy(iv, ivref, 8);
4927 			for (v = 0; v < data_len; v += 8) {
4928 				ve->run(ec, iv, buf + v, 8);
4929 			}
4930 			check_equals("KAT CBC DES encrypt (2)",
4931 				buf, cipher, data_len);
4932 			memcpy(iv, ivref, 8);
4933 			for (v = 0; v < data_len; v += 8) {
4934 				vd->run(dc, iv, buf + v, 8);
4935 			}
4936 			check_equals("KAT CBC DES decrypt (2)",
4937 				buf, plain, data_len);
4938 		}
4939 	}
4940 
4941 	if (with_MC) {
4942 		monte_carlo_DES_encrypt(ve);
4943 		monte_carlo_DES_decrypt(vd);
4944 	}
4945 
4946 	printf("done.\n");
4947 	fflush(stdout);
4948 }
4949 
4950 static void
4951 test_DES_tab(void)
4952 {
4953 	test_DES_generic("DES_tab",
4954 		&br_des_tab_cbcenc_vtable,
4955 		&br_des_tab_cbcdec_vtable,
4956 		1, 1);
4957 }
4958 
4959 static void
4960 test_DES_ct(void)
4961 {
4962 	test_DES_generic("DES_ct",
4963 		&br_des_ct_cbcenc_vtable,
4964 		&br_des_ct_cbcdec_vtable,
4965 		1, 1);
4966 }
4967 
4968 static const struct {
4969 	const char *skey;
4970 	const char *snonce;
4971 	uint32_t counter;
4972 	const char *splain;
4973 	const char *scipher;
4974 } KAT_CHACHA20[] = {
4975 	{
4976 		"0000000000000000000000000000000000000000000000000000000000000000",
4977 		"000000000000000000000000",
4978 		0,
4979 		"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
4980 		"76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586"
4981 	},
4982 	{
4983 		"0000000000000000000000000000000000000000000000000000000000000001",
4984 		"000000000000000000000002",
4985 		1,
4986 		"416e79207375626d697373696f6e20746f20746865204945544620696e74656e6465642062792074686520436f6e7472696275746f7220666f72207075626c69636174696f6e20617320616c6c206f722070617274206f6620616e204945544620496e7465726e65742d4472616674206f722052464320616e6420616e792073746174656d656e74206d6164652077697468696e2074686520636f6e74657874206f6620616e204945544620616374697669747920697320636f6e7369646572656420616e20224945544620436f6e747269627574696f6e222e20537563682073746174656d656e747320696e636c756465206f72616c2073746174656d656e747320696e20494554462073657373696f6e732c2061732077656c6c206173207772697474656e20616e6420656c656374726f6e696320636f6d6d756e69636174696f6e73206d61646520617420616e792074696d65206f7220706c6163652c207768696368206172652061646472657373656420746f",
4987 		"a3fbf07df3fa2fde4f376ca23e82737041605d9f4f4f57bd8cff2c1d4b7955ec2a97948bd3722915c8f3d337f7d370050e9e96d647b7c39f56e031ca5eb6250d4042e02785ececfa4b4bb5e8ead0440e20b6e8db09d881a7c6132f420e52795042bdfa7773d8a9051447b3291ce1411c680465552aa6c405b7764d5e87bea85ad00f8449ed8f72d0d662ab052691ca66424bc86d2df80ea41f43abf937d3259dc4b2d0dfb48a6c9139ddd7f76966e928e635553ba76c5c879d7b35d49eb2e62b0871cdac638939e25e8a1e0ef9d5280fa8ca328b351c3c765989cbcf3daa8b6ccc3aaf9f3979c92b3720fc88dc95ed84a1be059c6499b9fda236e7e818b04b0bc39c1e876b193bfe5569753f88128cc08aaa9b63d1a16f80ef2554d7189c411f5869ca52c5b83fa36ff216b9c1d30062bebcfd2dc5bce0911934fda79a86f6e698ced759c3ff9b6477338f3da4f9cd8514ea9982ccafb341b2384dd902f3d1ab7ac61dd29c6f21ba5b862f3730e37cfdc4fd806c22f221"
4988 	},
4989 	{
4990 		"1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0",
4991 		"000000000000000000000002",
4992 		42,
4993 		"2754776173206272696c6c69672c20616e642074686520736c6974687920746f7665730a446964206779726520616e642067696d626c6520696e2074686520776162653a0a416c6c206d696d737920776572652074686520626f726f676f7665732c0a416e6420746865206d6f6d65207261746873206f757467726162652e",
4994 		"62e6347f95ed87a45ffae7426f27a1df5fb69110044c0d73118effa95b01e5cf166d3df2d721caf9b21e5fb14c616871fd84c54f9d65b283196c7fe4f60553ebf39c6402c42234e32a356b3e764312a61a5532055716ead6962568f87d3f3f7704c6a8d1bcd1bf4d50d6154b6da731b187b58dfd728afa36757a797ac188d1"
4995 	},
4996 	{ 0, 0, 0, 0, 0 }
4997 };
4998 
4999 static void
5000 test_ChaCha20_generic(const char *name, br_chacha20_run cr)
5001 {
5002 	size_t u;
5003 
5004 	printf("Test %s: ", name);
5005 	fflush(stdout);
5006 	if (cr == 0) {
5007 		printf("UNAVAILABLE\n");
5008 		return;
5009 	}
5010 
5011 	for (u = 0; KAT_CHACHA20[u].skey; u ++) {
5012 		unsigned char key[32], nonce[12], plain[400], cipher[400];
5013 		uint32_t cc;
5014 		size_t v, len;
5015 
5016 		hextobin(key, KAT_CHACHA20[u].skey);
5017 		hextobin(nonce, KAT_CHACHA20[u].snonce);
5018 		cc = KAT_CHACHA20[u].counter;
5019 		len = hextobin(plain, KAT_CHACHA20[u].splain);
5020 		hextobin(cipher, KAT_CHACHA20[u].scipher);
5021 
5022 		for (v = 0; v < len; v ++) {
5023 			unsigned char tmp[400];
5024 			size_t w;
5025 			uint32_t cc2;
5026 
5027 			memset(tmp, 0, sizeof tmp);
5028 			memcpy(tmp, plain, v);
5029 			if (cr(key, nonce, cc, tmp, v)
5030 				!= cc + (uint32_t)((v + 63) >> 6))
5031 			{
5032 				fprintf(stderr, "ChaCha20: wrong counter\n");
5033 				exit(EXIT_FAILURE);
5034 			}
5035 			if (memcmp(tmp, cipher, v) != 0) {
5036 				fprintf(stderr, "ChaCha20 KAT fail (1)\n");
5037 				exit(EXIT_FAILURE);
5038 			}
5039 			for (w = v; w < sizeof tmp; w ++) {
5040 				if (tmp[w] != 0) {
5041 					fprintf(stderr, "ChaCha20: overrun\n");
5042 					exit(EXIT_FAILURE);
5043 				}
5044 			}
5045 			for (w = 0, cc2 = cc; w < v; w += 64, cc2 ++) {
5046 				size_t x;
5047 
5048 				x = v - w;
5049 				if (x > 64) {
5050 					x = 64;
5051 				}
5052 				if (cr(key, nonce, cc2, tmp + w, x)
5053 					!= (cc2 + 1))
5054 				{
5055 					fprintf(stderr, "ChaCha20:"
5056 						" wrong counter (2)\n");
5057 					exit(EXIT_FAILURE);
5058 				}
5059 			}
5060 			if (memcmp(tmp, plain, v) != 0) {
5061 				fprintf(stderr, "ChaCha20 KAT fail (2)\n");
5062 				exit(EXIT_FAILURE);
5063 			}
5064 		}
5065 
5066 		printf(".");
5067 		fflush(stdout);
5068 	}
5069 
5070 	printf(" done.\n");
5071 	fflush(stdout);
5072 }
5073 
5074 static void
5075 test_ChaCha20_ct(void)
5076 {
5077 	test_ChaCha20_generic("ChaCha20_ct", &br_chacha20_ct_run);
5078 }
5079 
5080 static void
5081 test_ChaCha20_sse2(void)
5082 {
5083 	test_ChaCha20_generic("ChaCha20_sse2", br_chacha20_sse2_get());
5084 }
5085 
5086 static const struct {
5087 	const char *splain;
5088 	const char *saad;
5089 	const char *skey;
5090 	const char *snonce;
5091 	const char *scipher;
5092 	const char *stag;
5093 } KAT_POLY1305[] = {
5094 	{
5095 		"4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e",
5096 		"50515253c0c1c2c3c4c5c6c7",
5097 		"808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
5098 		"070000004041424344454647",
5099 		"d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116",
5100 		"1ae10b594f09e26a7e902ecbd0600691"
5101 	},
5102 	{ 0, 0, 0, 0, 0, 0 }
5103 };
5104 
5105 static void
5106 test_Poly1305_inner(const char *name, br_poly1305_run ipoly,
5107 	br_poly1305_run iref)
5108 {
5109 	size_t u;
5110 	br_hmac_drbg_context rng;
5111 
5112 	printf("Test %s: ", name);
5113 	fflush(stdout);
5114 
5115 	for (u = 0; KAT_POLY1305[u].skey; u ++) {
5116 		unsigned char key[32], nonce[12], plain[400], cipher[400];
5117 		unsigned char aad[400], tag[16], data[400], tmp[16];
5118 		size_t len, aad_len;
5119 
5120 		len = hextobin(plain, KAT_POLY1305[u].splain);
5121 		aad_len = hextobin(aad, KAT_POLY1305[u].saad);
5122 		hextobin(key, KAT_POLY1305[u].skey);
5123 		hextobin(nonce, KAT_POLY1305[u].snonce);
5124 		hextobin(cipher, KAT_POLY1305[u].scipher);
5125 		hextobin(tag, KAT_POLY1305[u].stag);
5126 
5127 		memcpy(data, plain, len);
5128 		ipoly(key, nonce, data, len,
5129 			aad, aad_len, tmp, br_chacha20_ct_run, 1);
5130 		check_equals("ChaCha20+Poly1305 KAT (1)", data, cipher, len);
5131 		check_equals("ChaCha20+Poly1305 KAT (2)", tmp, tag, 16);
5132 		ipoly(key, nonce, data, len,
5133 			aad, aad_len, tmp, br_chacha20_ct_run, 0);
5134 		check_equals("ChaCha20+Poly1305 KAT (3)", data, plain, len);
5135 		check_equals("ChaCha20+Poly1305 KAT (4)", tmp, tag, 16);
5136 
5137 		printf(".");
5138 		fflush(stdout);
5139 	}
5140 
5141 	printf(" ");
5142 	fflush(stdout);
5143 
5144 	/*
5145 	 * We compare the "ipoly" and "iref" implementations together on
5146 	 * a bunch of pseudo-random messages.
5147 	 */
5148 	br_hmac_drbg_init(&rng, &br_sha256_vtable, "seed for Poly1305", 17);
5149 	for (u = 0; u < 100; u ++) {
5150 		unsigned char plain[100], aad[100], tmp[100];
5151 		unsigned char key[32], iv[12], tag1[16], tag2[16];
5152 
5153 		br_hmac_drbg_generate(&rng, key, sizeof key);
5154 		br_hmac_drbg_generate(&rng, iv, sizeof iv);
5155 		br_hmac_drbg_generate(&rng, plain, u);
5156 		br_hmac_drbg_generate(&rng, aad, u);
5157 		memcpy(tmp, plain, u);
5158 		memset(tmp + u, 0xFF, (sizeof tmp) - u);
5159 		ipoly(key, iv, tmp, u, aad, u, tag1,
5160 			&br_chacha20_ct_run, 1);
5161 		memset(tmp + u, 0x00, (sizeof tmp) - u);
5162 		iref(key, iv, tmp, u, aad, u, tag2,
5163 			&br_chacha20_ct_run, 0);
5164 		if (memcmp(tmp, plain, u) != 0) {
5165 			fprintf(stderr, "cross enc/dec failed\n");
5166 			exit(EXIT_FAILURE);
5167 		}
5168 		if (memcmp(tag1, tag2, sizeof tag1) != 0) {
5169 			fprintf(stderr, "cross MAC failed\n");
5170 			exit(EXIT_FAILURE);
5171 		}
5172 		printf(".");
5173 		fflush(stdout);
5174 	}
5175 
5176 	printf(" done.\n");
5177 	fflush(stdout);
5178 }
5179 
5180 static void
5181 test_Poly1305_ctmul(void)
5182 {
5183 	test_Poly1305_inner("Poly1305_ctmul", &br_poly1305_ctmul_run,
5184 		&br_poly1305_i15_run);
5185 }
5186 
5187 static void
5188 test_Poly1305_ctmul32(void)
5189 {
5190 	test_Poly1305_inner("Poly1305_ctmul32", &br_poly1305_ctmul32_run,
5191 		&br_poly1305_i15_run);
5192 }
5193 
5194 static void
5195 test_Poly1305_i15(void)
5196 {
5197 	test_Poly1305_inner("Poly1305_i15", &br_poly1305_i15_run,
5198 		&br_poly1305_ctmul_run);
5199 }
5200 
5201 static void
5202 test_Poly1305_ctmulq(void)
5203 {
5204 	br_poly1305_run bp;
5205 
5206 	bp = br_poly1305_ctmulq_get();
5207 	if (bp == 0) {
5208 		printf("Test Poly1305_ctmulq: UNAVAILABLE\n");
5209 	} else {
5210 		test_Poly1305_inner("Poly1305_ctmulq", bp,
5211 			&br_poly1305_ctmul_run);
5212 	}
5213 }
5214 
5215 /*
5216  * A 1024-bit RSA key, generated with OpenSSL.
5217  */
5218 static const unsigned char RSA_N[] = {
5219 	0xBF, 0xB4, 0xA6, 0x2E, 0x87, 0x3F, 0x9C, 0x8D,
5220 	0xA0, 0xC4, 0x2E, 0x7B, 0x59, 0x36, 0x0F, 0xB0,
5221 	0xFF, 0xE1, 0x25, 0x49, 0xE5, 0xE6, 0x36, 0xB0,
5222 	0x48, 0xC2, 0x08, 0x6B, 0x77, 0xA7, 0xC0, 0x51,
5223 	0x66, 0x35, 0x06, 0xA9, 0x59, 0xDF, 0x17, 0x7F,
5224 	0x15, 0xF6, 0xB4, 0xE5, 0x44, 0xEE, 0x72, 0x3C,
5225 	0x53, 0x11, 0x52, 0xC9, 0xC9, 0x61, 0x4F, 0x92,
5226 	0x33, 0x64, 0x70, 0x43, 0x07, 0xF1, 0x3F, 0x7F,
5227 	0x15, 0xAC, 0xF0, 0xC1, 0x54, 0x7D, 0x55, 0xC0,
5228 	0x29, 0xDC, 0x9E, 0xCC, 0xE4, 0x1D, 0x11, 0x72,
5229 	0x45, 0xF4, 0xD2, 0x70, 0xFC, 0x34, 0xB2, 0x1F,
5230 	0xF3, 0xAD, 0x6A, 0xF0, 0xE5, 0x56, 0x11, 0xF8,
5231 	0x0C, 0x3A, 0x8B, 0x04, 0x46, 0x7C, 0x77, 0xD9,
5232 	0x41, 0x1F, 0x40, 0xBE, 0x93, 0x80, 0x9D, 0x23,
5233 	0x75, 0x80, 0x12, 0x26, 0x5A, 0x72, 0x1C, 0xDD,
5234 	0x47, 0xB3, 0x2A, 0x33, 0xD8, 0x19, 0x61, 0xE3
5235 };
5236 static const unsigned char RSA_E[] = {
5237 	0x01, 0x00, 0x01
5238 };
5239 /* unused
5240 static const unsigned char RSA_D[] = {
5241 	0xAE, 0x56, 0x0B, 0x56, 0x7E, 0xDA, 0x83, 0x75,
5242 	0x6C, 0xC1, 0x5C, 0x00, 0x02, 0x96, 0x1E, 0x58,
5243 	0xF9, 0xA9, 0xF7, 0x2E, 0x27, 0xEB, 0x5E, 0xCA,
5244 	0x9B, 0xB0, 0x10, 0xD6, 0x22, 0x7F, 0xA4, 0x6E,
5245 	0xA2, 0x03, 0x10, 0xE6, 0xCB, 0x7B, 0x0D, 0x34,
5246 	0x1E, 0x76, 0x37, 0xF5, 0xD3, 0xE5, 0x00, 0x70,
5247 	0x09, 0x9E, 0xD4, 0x69, 0xFB, 0x40, 0x0A, 0x8B,
5248 	0xCB, 0x3E, 0xC8, 0xB4, 0xBC, 0xB1, 0x50, 0xEA,
5249 	0x9D, 0xD9, 0x89, 0x8A, 0x98, 0x40, 0x79, 0xD1,
5250 	0x07, 0x66, 0xA7, 0x90, 0x63, 0x82, 0xB1, 0xE0,
5251 	0x24, 0xD0, 0x89, 0x6A, 0xEC, 0xC5, 0xF3, 0x21,
5252 	0x7D, 0xB8, 0xA5, 0x45, 0x3A, 0x3B, 0x34, 0x42,
5253 	0xC2, 0x82, 0x3C, 0x8D, 0xFA, 0x5D, 0xA0, 0xA8,
5254 	0x24, 0xC8, 0x40, 0x22, 0x19, 0xCB, 0xB5, 0x85,
5255 	0x67, 0x69, 0x60, 0xE4, 0xD0, 0x7E, 0xA3, 0x3B,
5256 	0xF7, 0x70, 0x50, 0xC9, 0x5C, 0x97, 0x29, 0x49
5257 };
5258 */
5259 static const unsigned char RSA_P[] = {
5260 	0xF2, 0xE7, 0x6F, 0x66, 0x2E, 0xC4, 0x03, 0xD4,
5261 	0x89, 0x24, 0xCC, 0xE1, 0xCD, 0x3F, 0x01, 0x82,
5262 	0xC1, 0xFB, 0xAF, 0x44, 0xFA, 0xCC, 0x0E, 0xAA,
5263 	0x9D, 0x74, 0xA9, 0x65, 0xEF, 0xED, 0x4C, 0x87,
5264 	0xF0, 0xB3, 0xC6, 0xEA, 0x61, 0x85, 0xDE, 0x4E,
5265 	0x66, 0xB2, 0x5A, 0x9F, 0x7A, 0x41, 0xC5, 0x66,
5266 	0x57, 0xDF, 0x88, 0xF0, 0xB5, 0xF2, 0xC7, 0x7E,
5267 	0xE6, 0x55, 0x21, 0x96, 0x83, 0xD8, 0xAB, 0x57
5268 };
5269 static const unsigned char RSA_Q[] = {
5270 	0xCA, 0x0A, 0x92, 0xBF, 0x58, 0xB0, 0x2E, 0xF6,
5271 	0x66, 0x50, 0xB1, 0x48, 0x29, 0x42, 0x86, 0x6C,
5272 	0x98, 0x06, 0x7E, 0xB8, 0xB5, 0x4F, 0xFB, 0xC4,
5273 	0xF3, 0xC3, 0x36, 0x91, 0x07, 0xB6, 0xDB, 0xE9,
5274 	0x56, 0x3C, 0x51, 0x7D, 0xB5, 0xEC, 0x0A, 0xA9,
5275 	0x7C, 0x66, 0xF9, 0xD8, 0x25, 0xDE, 0xD2, 0x94,
5276 	0x5A, 0x58, 0xF1, 0x93, 0xE4, 0xF0, 0x5F, 0x27,
5277 	0xBD, 0x83, 0xC7, 0xCA, 0x48, 0x6A, 0xB2, 0x55
5278 };
5279 static const unsigned char RSA_DP[] = {
5280 	0xAF, 0x97, 0xBE, 0x60, 0x0F, 0xCE, 0x83, 0x36,
5281 	0x51, 0x2D, 0xD9, 0x2E, 0x22, 0x41, 0x39, 0xC6,
5282 	0x5C, 0x94, 0xA4, 0xCF, 0x28, 0xBD, 0xFA, 0x9C,
5283 	0x3B, 0xD6, 0xE9, 0xDE, 0x56, 0xE3, 0x24, 0x3F,
5284 	0xE1, 0x31, 0x14, 0xCA, 0xBA, 0x55, 0x1B, 0xAF,
5285 	0x71, 0x6D, 0xDD, 0x35, 0x0C, 0x1C, 0x1F, 0xA7,
5286 	0x2C, 0x3E, 0xDB, 0xAF, 0xA6, 0xD8, 0x2A, 0x7F,
5287 	0x01, 0xE2, 0xE8, 0xB4, 0xF5, 0xFA, 0xDB, 0x61
5288 };
5289 static const unsigned char RSA_DQ[] = {
5290 	0x29, 0xC0, 0x4B, 0x98, 0xFD, 0x13, 0xD3, 0x70,
5291 	0x99, 0xAE, 0x1D, 0x24, 0x83, 0x5A, 0x3A, 0xFB,
5292 	0x1F, 0xE3, 0x5F, 0xB6, 0x7D, 0xC9, 0x5C, 0x86,
5293 	0xD3, 0xB4, 0xC8, 0x86, 0xE9, 0xE8, 0x30, 0xC3,
5294 	0xA4, 0x4D, 0x6C, 0xAD, 0xA4, 0xB5, 0x75, 0x72,
5295 	0x96, 0xC1, 0x94, 0xE9, 0xC4, 0xD1, 0xAA, 0x04,
5296 	0x7C, 0x33, 0x1B, 0x20, 0xEB, 0xD3, 0x7C, 0x66,
5297 	0x72, 0xF4, 0x53, 0x8A, 0x0A, 0xB2, 0xF9, 0xCD
5298 };
5299 static const unsigned char RSA_IQ[] = {
5300 	0xE8, 0xEB, 0x04, 0x79, 0xA5, 0xC1, 0x79, 0xDE,
5301 	0xD5, 0x49, 0xA1, 0x0B, 0x48, 0xB9, 0x0E, 0x55,
5302 	0x74, 0x2C, 0x54, 0xEE, 0xA8, 0xB0, 0x01, 0xC2,
5303 	0xD2, 0x3C, 0x3E, 0x47, 0x3A, 0x7C, 0xC8, 0x3D,
5304 	0x2E, 0x33, 0x54, 0x4D, 0x40, 0x29, 0x41, 0x74,
5305 	0xBA, 0xE1, 0x93, 0x09, 0xEC, 0xE0, 0x1B, 0x4D,
5306 	0x1F, 0x2A, 0xCA, 0x4A, 0x0B, 0x5F, 0xE6, 0xBE,
5307 	0x59, 0x0A, 0xC4, 0xC9, 0xD9, 0x82, 0xAC, 0xE1
5308 };
5309 
5310 static const br_rsa_public_key RSA_PK = {
5311 	(void *)RSA_N, sizeof RSA_N,
5312 	(void *)RSA_E, sizeof RSA_E
5313 };
5314 
5315 static const br_rsa_private_key RSA_SK = {
5316 	1024,
5317 	(void *)RSA_P, sizeof RSA_P,
5318 	(void *)RSA_Q, sizeof RSA_Q,
5319 	(void *)RSA_DP, sizeof RSA_DP,
5320 	(void *)RSA_DQ, sizeof RSA_DQ,
5321 	(void *)RSA_IQ, sizeof RSA_IQ
5322 };
5323 
5324 /*
5325  * A 2048-bit RSA key, generated with OpenSSL.
5326  */
5327 static const unsigned char RSA2048_N[] = {
5328 	0xEA, 0xB1, 0xB0, 0x87, 0x60, 0xE2, 0x69, 0xF5,
5329 	0xC9, 0x3F, 0xCB, 0x4F, 0x9E, 0x7D, 0xD0, 0x56,
5330 	0x54, 0x8F, 0xF5, 0x59, 0x97, 0x04, 0x3F, 0x30,
5331 	0xE1, 0xFB, 0x7B, 0xF5, 0xA0, 0xEB, 0xA7, 0x7B,
5332 	0x29, 0x96, 0x7B, 0x32, 0x48, 0x48, 0xA4, 0x99,
5333 	0x90, 0x92, 0x48, 0xFB, 0xDC, 0xEC, 0x8A, 0x3B,
5334 	0xE0, 0x57, 0x6E, 0xED, 0x1C, 0x5B, 0x78, 0xCF,
5335 	0x07, 0x41, 0x96, 0x4C, 0x2F, 0xA2, 0xD1, 0xC8,
5336 	0xA0, 0x5F, 0xFC, 0x2A, 0x5B, 0x3F, 0xBC, 0xD7,
5337 	0xE6, 0x91, 0xF1, 0x44, 0xD6, 0xD8, 0x41, 0x66,
5338 	0x3E, 0x80, 0xEE, 0x98, 0x73, 0xD5, 0x32, 0x60,
5339 	0x7F, 0xDF, 0xBF, 0xB2, 0x0B, 0xA5, 0xCA, 0x11,
5340 	0x88, 0x1A, 0x0E, 0xA1, 0x61, 0x4C, 0x5A, 0x70,
5341 	0xCE, 0x12, 0xC0, 0x61, 0xF5, 0x50, 0x0E, 0xF6,
5342 	0xC1, 0xC2, 0x88, 0x8B, 0xE5, 0xCE, 0xAE, 0x90,
5343 	0x65, 0x23, 0xA7, 0xAD, 0xCB, 0x04, 0x17, 0x00,
5344 	0xA2, 0xDB, 0xB0, 0x21, 0x49, 0xDD, 0x3C, 0x2E,
5345 	0x8C, 0x47, 0x27, 0xF2, 0x84, 0x51, 0x63, 0xEB,
5346 	0xF8, 0xAF, 0x63, 0xA7, 0x89, 0xE1, 0xF0, 0x2F,
5347 	0xF9, 0x9C, 0x0A, 0x8A, 0xBC, 0x57, 0x05, 0xB0,
5348 	0xEF, 0xA0, 0xDA, 0x67, 0x70, 0xAF, 0x3F, 0xA4,
5349 	0x92, 0xFC, 0x4A, 0xAC, 0xEF, 0x89, 0x41, 0x58,
5350 	0x57, 0x63, 0x0F, 0x6A, 0x89, 0x68, 0x45, 0x4C,
5351 	0x20, 0xF9, 0x7F, 0x50, 0x9D, 0x8C, 0x52, 0xC4,
5352 	0xC1, 0x33, 0xCD, 0x42, 0x35, 0x12, 0xEC, 0x82,
5353 	0xF9, 0xC1, 0xB7, 0x60, 0x7B, 0x52, 0x61, 0xD0,
5354 	0xAE, 0xFD, 0x4B, 0x68, 0xB1, 0x55, 0x0E, 0xAB,
5355 	0x99, 0x24, 0x52, 0x60, 0x8E, 0xDB, 0x90, 0x34,
5356 	0x61, 0xE3, 0x95, 0x7C, 0x34, 0x64, 0x06, 0xCB,
5357 	0x44, 0x17, 0x70, 0x78, 0xC1, 0x1B, 0x87, 0x8F,
5358 	0xCF, 0xB0, 0x7D, 0x93, 0x59, 0x84, 0x49, 0xF5,
5359 	0x55, 0xBB, 0x48, 0xCA, 0xD3, 0x76, 0x1E, 0x7F
5360 };
5361 static const unsigned char RSA2048_E[] = {
5362 	0x01, 0x00, 0x01
5363 };
5364 static const unsigned char RSA2048_P[] = {
5365 	0xF9, 0xA7, 0xB5, 0xC4, 0xE8, 0x52, 0xEC, 0xB1,
5366 	0x33, 0x6A, 0x68, 0x32, 0x63, 0x2D, 0xBA, 0xE5,
5367 	0x61, 0x14, 0x69, 0x82, 0xC8, 0x31, 0x14, 0xD5,
5368 	0xC2, 0x6C, 0x1A, 0xBE, 0xA0, 0x68, 0xA6, 0xC5,
5369 	0xEA, 0x40, 0x59, 0xFB, 0x0A, 0x30, 0x3D, 0xD5,
5370 	0xDD, 0x94, 0xAE, 0x0C, 0x9F, 0xEE, 0x19, 0x0C,
5371 	0xA8, 0xF2, 0x85, 0x27, 0x60, 0xAA, 0xD5, 0x7C,
5372 	0x59, 0x91, 0x1F, 0xAF, 0x5E, 0x00, 0xC8, 0x2D,
5373 	0xCA, 0xB4, 0x70, 0xA1, 0xF8, 0x8C, 0x0A, 0xB3,
5374 	0x08, 0x95, 0x03, 0x9E, 0xA4, 0x6B, 0x9D, 0x55,
5375 	0x47, 0xE0, 0xEC, 0xB3, 0x21, 0x7C, 0xE4, 0x16,
5376 	0x91, 0xE3, 0xD7, 0x1B, 0x3D, 0x81, 0xF1, 0xED,
5377 	0x16, 0xF9, 0x05, 0x0E, 0xA6, 0x9F, 0x37, 0x73,
5378 	0x18, 0x1B, 0x9C, 0x9D, 0x33, 0xAD, 0x25, 0xEF,
5379 	0x3A, 0xC0, 0x4B, 0x34, 0x24, 0xF5, 0xFD, 0x59,
5380 	0xF5, 0x65, 0xE6, 0x92, 0x2A, 0x04, 0x06, 0x3D
5381 };
5382 static const unsigned char RSA2048_Q[] = {
5383 	0xF0, 0xA8, 0xA4, 0x20, 0xDD, 0xF3, 0x99, 0xE6,
5384 	0x1C, 0xB1, 0x21, 0xE8, 0x66, 0x68, 0x48, 0x00,
5385 	0x04, 0xE3, 0x21, 0xA3, 0xE8, 0xC5, 0xFD, 0x85,
5386 	0x6D, 0x2C, 0x98, 0xE3, 0x36, 0x39, 0x3E, 0x80,
5387 	0xB7, 0x36, 0xA5, 0xA9, 0xBB, 0xEB, 0x1E, 0xB8,
5388 	0xEB, 0x44, 0x65, 0xE8, 0x81, 0x7D, 0xE0, 0x87,
5389 	0xC1, 0x08, 0x94, 0xDD, 0x92, 0x40, 0xF4, 0x8B,
5390 	0x3C, 0xB5, 0xC1, 0xAD, 0x9D, 0x4C, 0x14, 0xCD,
5391 	0xD9, 0x2D, 0xB6, 0xE4, 0x99, 0xB3, 0x71, 0x63,
5392 	0x64, 0xE1, 0x31, 0x7E, 0x34, 0x95, 0x96, 0x52,
5393 	0x85, 0x27, 0xBE, 0x40, 0x10, 0x0A, 0x9E, 0x01,
5394 	0x1C, 0xBB, 0xB2, 0x5B, 0x40, 0x85, 0x65, 0x6E,
5395 	0xA0, 0x88, 0x73, 0xF6, 0x22, 0xCC, 0x23, 0x26,
5396 	0x62, 0xAD, 0x92, 0x57, 0x57, 0xF4, 0xD4, 0xDF,
5397 	0xD9, 0x7C, 0xDE, 0xAD, 0xD2, 0x1F, 0x32, 0x29,
5398 	0xBA, 0xE7, 0xE2, 0x32, 0xA1, 0xA0, 0xBF, 0x6B
5399 };
5400 static const unsigned char RSA2048_DP[] = {
5401 	0xB2, 0xF9, 0xD7, 0x66, 0xC5, 0x83, 0x05, 0x6A,
5402 	0x77, 0xC8, 0xB5, 0xD0, 0x41, 0xA7, 0xBC, 0x0F,
5403 	0xCB, 0x4B, 0xFD, 0xE4, 0x23, 0x2E, 0x84, 0x98,
5404 	0x46, 0x1C, 0x88, 0x03, 0xD7, 0x2D, 0x8F, 0x39,
5405 	0xDD, 0x98, 0xAA, 0xA9, 0x3D, 0x01, 0x9E, 0xA2,
5406 	0xDE, 0x8A, 0x43, 0x48, 0x8B, 0xB2, 0xFE, 0xC4,
5407 	0x43, 0xAE, 0x31, 0x65, 0x2C, 0x78, 0xEC, 0x39,
5408 	0x8C, 0x60, 0x6C, 0xCD, 0xA4, 0xDF, 0x7C, 0xA2,
5409 	0xCF, 0x6A, 0x12, 0x41, 0x1B, 0xD5, 0x11, 0xAA,
5410 	0x8D, 0xE1, 0x7E, 0x49, 0xD1, 0xE7, 0xD0, 0x50,
5411 	0x1E, 0x0A, 0x92, 0xC6, 0x4C, 0xA0, 0xA3, 0x47,
5412 	0xC6, 0xE9, 0x07, 0x01, 0xE1, 0x53, 0x72, 0x23,
5413 	0x9D, 0x4F, 0x82, 0x9F, 0xA1, 0x36, 0x0D, 0x63,
5414 	0x76, 0x89, 0xFC, 0xF9, 0xF9, 0xDD, 0x0C, 0x8F,
5415 	0xF7, 0x97, 0x79, 0x92, 0x75, 0x58, 0xE0, 0x7B,
5416 	0x08, 0x61, 0x38, 0x2D, 0xDA, 0xEF, 0x2D, 0xA5
5417 };
5418 static const unsigned char RSA2048_DQ[] = {
5419 	0x8B, 0x69, 0x56, 0x33, 0x08, 0x00, 0x8F, 0x3D,
5420 	0xC3, 0x8F, 0x45, 0x52, 0x48, 0xC8, 0xCE, 0x34,
5421 	0xDC, 0x9F, 0xEB, 0x23, 0xF5, 0xBB, 0x84, 0x62,
5422 	0xDF, 0xDC, 0xBE, 0xF0, 0x98, 0xBF, 0xCE, 0x9A,
5423 	0x68, 0x08, 0x4B, 0x2D, 0xA9, 0x83, 0xC9, 0xF7,
5424 	0x5B, 0xAA, 0xF2, 0xD2, 0x1E, 0xF9, 0x99, 0xB1,
5425 	0x6A, 0xBC, 0x9A, 0xE8, 0x44, 0x4A, 0x46, 0x9F,
5426 	0xC6, 0x5A, 0x90, 0x49, 0x0F, 0xDF, 0x3C, 0x0A,
5427 	0x07, 0x6E, 0xB9, 0x0D, 0x72, 0x90, 0x85, 0xF6,
5428 	0x0B, 0x41, 0x7D, 0x17, 0x5C, 0x44, 0xEF, 0xA0,
5429 	0xFC, 0x2C, 0x0A, 0xC5, 0x37, 0xC5, 0xBE, 0xC4,
5430 	0x6C, 0x2D, 0xBB, 0x63, 0xAB, 0x5B, 0xDB, 0x67,
5431 	0x9B, 0xAD, 0x90, 0x67, 0x9C, 0xBE, 0xDE, 0xF9,
5432 	0xE4, 0x9E, 0x22, 0x31, 0x60, 0xED, 0x9E, 0xC7,
5433 	0xD2, 0x48, 0xC9, 0x02, 0xAE, 0xBF, 0x8D, 0xA2,
5434 	0xA8, 0xF8, 0x9D, 0x8B, 0xB1, 0x1F, 0xDA, 0xE3
5435 };
5436 static const unsigned char RSA2048_IQ[] = {
5437 	0xB5, 0x48, 0xD4, 0x48, 0x5A, 0x33, 0xCD, 0x13,
5438 	0xFE, 0xC6, 0xF7, 0x01, 0x0A, 0x3E, 0x40, 0xA3,
5439 	0x45, 0x94, 0x6F, 0x85, 0xE4, 0x68, 0x66, 0xEC,
5440 	0x69, 0x6A, 0x3E, 0xE0, 0x62, 0x3F, 0x0C, 0xEF,
5441 	0x21, 0xCC, 0xDA, 0xAD, 0x75, 0x98, 0x12, 0xCA,
5442 	0x9E, 0x31, 0xDD, 0x95, 0x0D, 0xBD, 0x55, 0xEB,
5443 	0x92, 0xF7, 0x9E, 0xBD, 0xFC, 0x28, 0x35, 0x96,
5444 	0x31, 0xDC, 0x53, 0x80, 0xA3, 0x57, 0x89, 0x3C,
5445 	0x4A, 0xEC, 0x40, 0x75, 0x13, 0xAC, 0x4F, 0x36,
5446 	0x3A, 0x86, 0x9A, 0xA6, 0x58, 0xC9, 0xED, 0xCB,
5447 	0xD6, 0xBB, 0xB2, 0xD9, 0xAA, 0x04, 0xC4, 0xE8,
5448 	0x47, 0x3E, 0xBD, 0x14, 0x9B, 0x8F, 0x61, 0x70,
5449 	0x69, 0x66, 0x23, 0x62, 0x18, 0xE3, 0x52, 0x98,
5450 	0xE3, 0x22, 0xE9, 0x6F, 0xDA, 0x28, 0x68, 0x08,
5451 	0xB8, 0xB9, 0x8B, 0x97, 0x8B, 0x77, 0x3F, 0xCA,
5452 	0x9D, 0x9D, 0xBE, 0xD5, 0x2D, 0x3E, 0xC2, 0x11
5453 };
5454 
5455 static const br_rsa_public_key RSA2048_PK = {
5456 	(void *)RSA2048_N, sizeof RSA2048_N,
5457 	(void *)RSA2048_E, sizeof RSA2048_E
5458 };
5459 
5460 static const br_rsa_private_key RSA2048_SK = {
5461 	2048,
5462 	(void *)RSA2048_P, sizeof RSA2048_P,
5463 	(void *)RSA2048_Q, sizeof RSA2048_Q,
5464 	(void *)RSA2048_DP, sizeof RSA2048_DP,
5465 	(void *)RSA2048_DQ, sizeof RSA2048_DQ,
5466 	(void *)RSA2048_IQ, sizeof RSA2048_IQ
5467 };
5468 
5469 /*
5470  * A 4096-bit RSA key, generated with OpenSSL.
5471  */
5472 static const unsigned char RSA4096_N[] = {
5473 	0xAA, 0x17, 0x71, 0xBC, 0x92, 0x3E, 0xB5, 0xBD,
5474 	0x3E, 0x64, 0xCF, 0x03, 0x9B, 0x24, 0x65, 0x33,
5475 	0x5F, 0xB4, 0x47, 0x89, 0xE5, 0x63, 0xE4, 0xA0,
5476 	0x5A, 0x51, 0x95, 0x07, 0x73, 0xEE, 0x00, 0xF6,
5477 	0x3E, 0x31, 0x0E, 0xDA, 0x15, 0xC3, 0xAA, 0x21,
5478 	0x6A, 0xCD, 0xFF, 0x46, 0x6B, 0xDF, 0x0A, 0x7F,
5479 	0x8A, 0xC2, 0x25, 0x19, 0x47, 0x44, 0xD8, 0x52,
5480 	0xC1, 0x56, 0x25, 0x6A, 0xE0, 0xD2, 0x61, 0x11,
5481 	0x2C, 0xF7, 0x73, 0x9F, 0x5F, 0x74, 0xAA, 0xDD,
5482 	0xDE, 0xAF, 0x81, 0xF6, 0x0C, 0x1A, 0x3A, 0xF9,
5483 	0xC5, 0x47, 0x82, 0x75, 0x1D, 0x41, 0xF0, 0xB2,
5484 	0xFD, 0xBA, 0xE2, 0xA4, 0xA1, 0xB8, 0x32, 0x48,
5485 	0x06, 0x0D, 0x29, 0x2F, 0x44, 0x14, 0xF5, 0xAC,
5486 	0x54, 0x83, 0xC4, 0xB6, 0x85, 0x85, 0x9B, 0x1C,
5487 	0x05, 0x61, 0x28, 0x62, 0x24, 0xA8, 0xF0, 0xE6,
5488 	0x80, 0xA7, 0x91, 0xE8, 0xC7, 0x8E, 0x52, 0x17,
5489 	0xBE, 0xAF, 0xC6, 0x0A, 0xA3, 0xFB, 0xD1, 0x04,
5490 	0x15, 0x3B, 0x14, 0x35, 0xA5, 0x41, 0xF5, 0x30,
5491 	0xFE, 0xEF, 0x53, 0xA7, 0x89, 0x91, 0x78, 0x30,
5492 	0xBE, 0x3A, 0xB1, 0x4B, 0x2E, 0x4A, 0x0E, 0x25,
5493 	0x1D, 0xCF, 0x51, 0x54, 0x52, 0xF1, 0x88, 0x85,
5494 	0x36, 0x23, 0xDE, 0xBA, 0x66, 0x25, 0x60, 0x8D,
5495 	0x45, 0xD7, 0xD8, 0x10, 0x41, 0x64, 0xC7, 0x4B,
5496 	0xCE, 0x72, 0x13, 0xD7, 0x20, 0xF8, 0x2A, 0x74,
5497 	0xA5, 0x05, 0xF4, 0x5A, 0x90, 0xF4, 0x9C, 0xE7,
5498 	0xC9, 0xCF, 0x1E, 0xD5, 0x9C, 0xAC, 0xE5, 0x00,
5499 	0x83, 0x73, 0x9F, 0xE7, 0xC6, 0x93, 0xC0, 0x06,
5500 	0xA7, 0xB8, 0xF8, 0x46, 0x90, 0xC8, 0x78, 0x27,
5501 	0x2E, 0xCC, 0xC0, 0x2A, 0x20, 0xC5, 0xFC, 0x63,
5502 	0x22, 0xA1, 0xD6, 0x16, 0xAD, 0x9C, 0xD6, 0xFC,
5503 	0x7A, 0x6E, 0x9C, 0x98, 0x51, 0xEE, 0x6B, 0x6D,
5504 	0x8F, 0xEF, 0xCE, 0x7C, 0x5D, 0x16, 0xB0, 0xCE,
5505 	0x9C, 0xEE, 0x92, 0xCF, 0xB7, 0xEB, 0x41, 0x36,
5506 	0x3A, 0x6C, 0xF2, 0x0D, 0x26, 0x11, 0x2F, 0x6C,
5507 	0x27, 0x62, 0xA2, 0xCC, 0x63, 0x53, 0xBD, 0xFC,
5508 	0x9F, 0xBE, 0x9B, 0xBD, 0xE5, 0xA7, 0xDA, 0xD4,
5509 	0xF8, 0xED, 0x5E, 0x59, 0x2D, 0xAC, 0xCD, 0x13,
5510 	0xEB, 0xE5, 0x9E, 0x39, 0x82, 0x8B, 0xFD, 0xA8,
5511 	0xFB, 0xCB, 0x86, 0x27, 0xC7, 0x4B, 0x4C, 0xD0,
5512 	0xBA, 0x12, 0xD0, 0x76, 0x1A, 0xDB, 0x30, 0xC5,
5513 	0xB3, 0x2C, 0x4C, 0xC5, 0x32, 0x03, 0x05, 0x67,
5514 	0x8D, 0xD0, 0x14, 0x37, 0x59, 0x2B, 0xE3, 0x1C,
5515 	0x25, 0x3E, 0xA5, 0xE4, 0xF1, 0x0D, 0x34, 0xBB,
5516 	0xD5, 0xF6, 0x76, 0x45, 0x5B, 0x0F, 0x1E, 0x07,
5517 	0x0A, 0xBA, 0x9D, 0x71, 0x87, 0xDE, 0x45, 0x50,
5518 	0xE5, 0x0F, 0x32, 0xBB, 0x5C, 0x32, 0x2D, 0x40,
5519 	0xCD, 0x19, 0x95, 0x4E, 0xC5, 0x54, 0x3A, 0x9A,
5520 	0x46, 0x9B, 0x85, 0xFE, 0x53, 0xB7, 0xD8, 0x65,
5521 	0x6D, 0x68, 0x0C, 0xBB, 0xE3, 0x3D, 0x8E, 0x64,
5522 	0xBE, 0x27, 0x15, 0xAB, 0x12, 0x20, 0xD9, 0x84,
5523 	0xF5, 0x02, 0xE4, 0xBB, 0xDD, 0xAB, 0x59, 0x51,
5524 	0xF4, 0xE1, 0x79, 0xBE, 0xB8, 0xA3, 0x8E, 0xD1,
5525 	0x1C, 0xB0, 0xFA, 0x48, 0x76, 0xC2, 0x9D, 0x7A,
5526 	0x01, 0xA5, 0xAF, 0x8C, 0xBA, 0xAA, 0x4C, 0x06,
5527 	0x2B, 0x0A, 0x62, 0xF0, 0x79, 0x5B, 0x42, 0xFC,
5528 	0xF8, 0xBF, 0xD4, 0xDD, 0x62, 0x32, 0xE3, 0xCE,
5529 	0xF1, 0x2C, 0xE6, 0xED, 0xA8, 0x8A, 0x41, 0xA3,
5530 	0xC1, 0x1E, 0x07, 0xB6, 0x43, 0x10, 0x80, 0xB7,
5531 	0xF3, 0xD0, 0x53, 0x2A, 0x9A, 0x98, 0xA7, 0x4F,
5532 	0x9E, 0xA3, 0x3E, 0x1B, 0xDA, 0x93, 0x15, 0xF2,
5533 	0xF4, 0x20, 0xA5, 0xA8, 0x4F, 0x8A, 0xBA, 0xED,
5534 	0xB1, 0x17, 0x6C, 0x0F, 0xD9, 0x8F, 0x38, 0x11,
5535 	0xF3, 0xD9, 0x5E, 0x88, 0xA1, 0xA1, 0x82, 0x8B,
5536 	0x30, 0xD7, 0xC6, 0xCE, 0x4E, 0x30, 0x55, 0x57
5537 };
5538 static const unsigned char RSA4096_E[] = {
5539 	0x01, 0x00, 0x01
5540 };
5541 static const unsigned char RSA4096_P[] = {
5542 	0xD3, 0x7A, 0x22, 0xD8, 0x9B, 0xBF, 0x42, 0xB4,
5543 	0x53, 0x04, 0x10, 0x6A, 0x84, 0xFD, 0x7C, 0x1D,
5544 	0xF6, 0xF4, 0x10, 0x65, 0xAA, 0xE5, 0xE1, 0x4E,
5545 	0xB4, 0x37, 0xF7, 0xAC, 0xF7, 0xD3, 0xB2, 0x3B,
5546 	0xFE, 0xE7, 0x63, 0x42, 0xE9, 0xF0, 0x3C, 0xE0,
5547 	0x42, 0xB4, 0xBB, 0x09, 0xD0, 0xB2, 0x7C, 0x70,
5548 	0xA4, 0x11, 0x97, 0x90, 0x01, 0xD0, 0x0E, 0x7B,
5549 	0xAF, 0x7D, 0x30, 0x4E, 0x6B, 0x3A, 0xCC, 0x50,
5550 	0x4E, 0xAF, 0x2F, 0xC3, 0xC2, 0x4F, 0x7E, 0xC5,
5551 	0xB3, 0x76, 0x33, 0xFB, 0xA7, 0xB1, 0x96, 0xA5,
5552 	0x46, 0x41, 0xC6, 0xDA, 0x5A, 0xFD, 0x17, 0x0A,
5553 	0x6A, 0x86, 0x54, 0x83, 0xE1, 0x57, 0xE7, 0xAF,
5554 	0x8C, 0x42, 0xE5, 0x39, 0xF2, 0xC7, 0xFC, 0x4A,
5555 	0x3D, 0x3C, 0x94, 0x89, 0xC2, 0xC6, 0x2D, 0x0A,
5556 	0x5F, 0xD0, 0x21, 0x23, 0x5C, 0xC9, 0xC8, 0x44,
5557 	0x8A, 0x96, 0x72, 0x4D, 0x96, 0xC6, 0x17, 0x0C,
5558 	0x36, 0x43, 0x7F, 0xD8, 0xA0, 0x7A, 0x31, 0x7E,
5559 	0xCE, 0x13, 0xE3, 0x13, 0x2E, 0xE0, 0x91, 0xC2,
5560 	0x61, 0x13, 0x16, 0x8D, 0x99, 0xCB, 0xA9, 0x2C,
5561 	0x4D, 0x9D, 0xDD, 0x1D, 0x03, 0xE7, 0xA7, 0x50,
5562 	0xF4, 0x16, 0x43, 0xB1, 0x7F, 0x99, 0x61, 0x3F,
5563 	0xA5, 0x59, 0x91, 0x16, 0xC3, 0x06, 0x63, 0x59,
5564 	0xE9, 0xDA, 0xB5, 0x06, 0x2E, 0x0C, 0xD9, 0xAB,
5565 	0x93, 0x89, 0x12, 0x82, 0xFB, 0x90, 0xD9, 0x30,
5566 	0x60, 0xF7, 0x35, 0x2D, 0x18, 0x78, 0xEB, 0x2B,
5567 	0xA1, 0x06, 0x67, 0x37, 0xDE, 0x72, 0x20, 0xD2,
5568 	0x80, 0xE5, 0x2C, 0xD7, 0x5E, 0xC7, 0x67, 0x2D,
5569 	0x40, 0xE7, 0x7A, 0xCF, 0x4A, 0x69, 0x9D, 0xA7,
5570 	0x90, 0x9F, 0x3B, 0xDF, 0x07, 0x97, 0x64, 0x69,
5571 	0x06, 0x4F, 0xBA, 0xF4, 0xE5, 0xBD, 0x71, 0x60,
5572 	0x36, 0xB7, 0xA3, 0xDE, 0x76, 0xC5, 0x38, 0xD7,
5573 	0x1D, 0x9A, 0xFC, 0x36, 0x3D, 0x3B, 0xDC, 0xCF
5574 };
5575 static const unsigned char RSA4096_Q[] = {
5576 	0xCD, 0xE6, 0xC6, 0xA6, 0x42, 0x4C, 0x45, 0x65,
5577 	0x8B, 0x85, 0x76, 0xFC, 0x21, 0xB6, 0x57, 0x79,
5578 	0x3C, 0xE4, 0xE3, 0x85, 0x55, 0x2F, 0x59, 0xD3,
5579 	0x3F, 0x74, 0xAF, 0x9F, 0x11, 0x04, 0x10, 0x8B,
5580 	0xF9, 0x5F, 0x4D, 0x25, 0xEE, 0x20, 0xF9, 0x69,
5581 	0x3B, 0x02, 0xB6, 0x43, 0x0D, 0x0C, 0xED, 0x30,
5582 	0x31, 0x57, 0xE7, 0x9A, 0x57, 0x24, 0x6B, 0x4A,
5583 	0x5E, 0xA2, 0xBF, 0xD4, 0x47, 0x7D, 0xFA, 0x78,
5584 	0x51, 0x86, 0x80, 0x68, 0x85, 0x7C, 0x7B, 0x08,
5585 	0x4A, 0x35, 0x24, 0x4F, 0x8B, 0x24, 0x49, 0xF8,
5586 	0x16, 0x06, 0x9C, 0x57, 0x4E, 0x94, 0x4C, 0xBD,
5587 	0x6E, 0x53, 0x52, 0xC9, 0xC1, 0x64, 0x43, 0x22,
5588 	0x1E, 0xDD, 0xEB, 0xAC, 0x90, 0x58, 0xCA, 0xBA,
5589 	0x9C, 0xAC, 0xCF, 0xDD, 0x08, 0x6D, 0xB7, 0x31,
5590 	0xDB, 0x0D, 0x83, 0xE6, 0x50, 0xA6, 0x69, 0xB1,
5591 	0x1C, 0x68, 0x92, 0xB4, 0xB5, 0x76, 0xDE, 0xBD,
5592 	0x4F, 0xA5, 0x30, 0xED, 0x23, 0xFF, 0xE5, 0x80,
5593 	0x21, 0xAB, 0xED, 0xE6, 0xDC, 0x32, 0x3D, 0xF7,
5594 	0x45, 0xB8, 0x19, 0x3D, 0x8E, 0x15, 0x7C, 0xE5,
5595 	0x0D, 0xC8, 0x9B, 0x7D, 0x1F, 0x7C, 0x14, 0x14,
5596 	0x41, 0x09, 0xA7, 0xEB, 0xFB, 0xD9, 0x5F, 0x9A,
5597 	0x94, 0xB6, 0xD5, 0xA0, 0x2C, 0xAF, 0xB5, 0xEF,
5598 	0x5C, 0x5A, 0x8E, 0x34, 0xA1, 0x8F, 0xEB, 0x38,
5599 	0x0F, 0x31, 0x6E, 0x45, 0x21, 0x7A, 0xAA, 0xAF,
5600 	0x6C, 0xB1, 0x8E, 0xB2, 0xB9, 0xD4, 0x1E, 0xEF,
5601 	0x66, 0xD8, 0x4E, 0x3D, 0xF2, 0x0C, 0xF1, 0xBA,
5602 	0xFB, 0xA9, 0x27, 0xD2, 0x45, 0x54, 0x83, 0x4B,
5603 	0x10, 0xC4, 0x9A, 0x32, 0x9C, 0xC7, 0x9A, 0xCF,
5604 	0x4E, 0xBF, 0x07, 0xFC, 0x27, 0xB7, 0x96, 0x1D,
5605 	0xDE, 0x9D, 0xE4, 0x84, 0x68, 0x00, 0x9A, 0x9F,
5606 	0x3D, 0xE6, 0xC7, 0x26, 0x11, 0x48, 0x79, 0xFA,
5607 	0x09, 0x76, 0xC8, 0x25, 0x3A, 0xE4, 0x70, 0xF9
5608 };
5609 static const unsigned char RSA4096_DP[] = {
5610 	0x5C, 0xE3, 0x3E, 0xBF, 0x09, 0xD9, 0xFE, 0x80,
5611 	0x9A, 0x1E, 0x24, 0xDF, 0xC4, 0xBE, 0x5A, 0x70,
5612 	0x06, 0xF2, 0xB8, 0xE9, 0x0F, 0x21, 0x9D, 0xCF,
5613 	0x26, 0x15, 0x97, 0x32, 0x60, 0x40, 0x99, 0xFF,
5614 	0x04, 0x3D, 0xBA, 0x39, 0xBF, 0xEB, 0x87, 0xB1,
5615 	0xB1, 0x5B, 0x14, 0xF4, 0x80, 0xB8, 0x85, 0x34,
5616 	0x2C, 0xBC, 0x95, 0x67, 0xE9, 0x83, 0xEB, 0x78,
5617 	0xA4, 0x62, 0x46, 0x7F, 0x8B, 0x55, 0xEE, 0x3C,
5618 	0x2F, 0xF3, 0x7E, 0xF5, 0x6B, 0x39, 0xE3, 0xA3,
5619 	0x0E, 0xEA, 0x92, 0x76, 0xAC, 0xF7, 0xB2, 0x05,
5620 	0xB2, 0x50, 0x5D, 0xF9, 0xB7, 0x11, 0x87, 0xB7,
5621 	0x49, 0x86, 0xEB, 0x44, 0x6A, 0x0C, 0x64, 0x75,
5622 	0x95, 0x14, 0x24, 0xFF, 0x49, 0x06, 0x52, 0x68,
5623 	0x81, 0x71, 0x44, 0x85, 0x26, 0x0A, 0x49, 0xEA,
5624 	0x4E, 0x9F, 0x6A, 0x8E, 0xCF, 0xC8, 0xC9, 0xB0,
5625 	0x61, 0x77, 0x27, 0x89, 0xB0, 0xFA, 0x1D, 0x51,
5626 	0x7D, 0xDC, 0x34, 0x21, 0x80, 0x8B, 0x6B, 0x86,
5627 	0x19, 0x1A, 0x5F, 0x19, 0x23, 0xF3, 0xFB, 0xD1,
5628 	0xF7, 0x35, 0x9D, 0x28, 0x61, 0x2F, 0x35, 0x85,
5629 	0x82, 0x2A, 0x1E, 0xDF, 0x09, 0xC2, 0x0C, 0x99,
5630 	0xE0, 0x3C, 0x8F, 0x4B, 0x3D, 0x92, 0xAF, 0x46,
5631 	0x77, 0x68, 0x59, 0xF4, 0x37, 0x81, 0x6C, 0xCE,
5632 	0x27, 0x8B, 0xAB, 0x0B, 0xA5, 0xDA, 0x7B, 0x19,
5633 	0x83, 0xDA, 0x27, 0x49, 0x65, 0x1A, 0x00, 0x6B,
5634 	0xE1, 0x8B, 0x73, 0xCD, 0xF4, 0xFB, 0xD7, 0xBF,
5635 	0xF8, 0x20, 0x89, 0xE1, 0xDE, 0x51, 0x1E, 0xDD,
5636 	0x97, 0x44, 0x12, 0x68, 0x1E, 0xF7, 0x52, 0xF8,
5637 	0x6B, 0x93, 0xC1, 0x3B, 0x9F, 0xA1, 0xB8, 0x5F,
5638 	0xCB, 0x84, 0x45, 0x95, 0xF7, 0x0D, 0xA6, 0x4B,
5639 	0x03, 0x3C, 0xAE, 0x0F, 0xB7, 0x81, 0x78, 0x75,
5640 	0x1C, 0x53, 0x99, 0x24, 0xB3, 0xE2, 0x78, 0xCE,
5641 	0xF3, 0xF0, 0x09, 0x6C, 0x01, 0x85, 0x73, 0xBD
5642 };
5643 static const unsigned char RSA4096_DQ[] = {
5644 	0xCD, 0x88, 0xAC, 0x8B, 0x92, 0x6A, 0xA8, 0x6B,
5645 	0x71, 0x16, 0xCD, 0x6B, 0x6A, 0x0B, 0xA6, 0xCD,
5646 	0xF3, 0x27, 0x58, 0xA6, 0xE4, 0x1D, 0xDC, 0x40,
5647 	0xAF, 0x7B, 0x3F, 0x44, 0x3D, 0xAC, 0x1D, 0x08,
5648 	0x5C, 0xE9, 0xF1, 0x0D, 0x07, 0xE4, 0x0A, 0x94,
5649 	0x2C, 0xBF, 0xCC, 0x48, 0xAA, 0x62, 0x58, 0xF2,
5650 	0x5E, 0x8F, 0x2D, 0x36, 0x37, 0xFE, 0xB6, 0xCB,
5651 	0x0A, 0x24, 0xD3, 0xF0, 0x87, 0x5D, 0x0E, 0x05,
5652 	0xC4, 0xFB, 0xCA, 0x7A, 0x8B, 0xA5, 0x72, 0xFB,
5653 	0x17, 0x78, 0x6C, 0xC2, 0xAA, 0x56, 0x93, 0x2F,
5654 	0xFE, 0x6C, 0xA2, 0xEB, 0xD4, 0x18, 0xDD, 0x71,
5655 	0xCB, 0x0B, 0x89, 0xFC, 0xB3, 0xFB, 0xED, 0xB7,
5656 	0xC5, 0xB0, 0x29, 0x6D, 0x9C, 0xB9, 0xC5, 0xC4,
5657 	0xFA, 0x58, 0xD7, 0x36, 0x01, 0x0F, 0xE4, 0x6A,
5658 	0xF4, 0x0B, 0x4D, 0xBB, 0x3E, 0x8E, 0x9F, 0xBA,
5659 	0x98, 0x6D, 0x1A, 0xE5, 0x20, 0xAF, 0x84, 0x30,
5660 	0xDD, 0xAC, 0x3C, 0x66, 0xBC, 0x24, 0xD9, 0x67,
5661 	0x4A, 0x35, 0x61, 0xC9, 0xAD, 0xCC, 0xC9, 0x66,
5662 	0x68, 0x46, 0x19, 0x8C, 0x04, 0xA5, 0x16, 0x83,
5663 	0x5F, 0x7A, 0xFD, 0x1B, 0xAD, 0xAE, 0x22, 0x2D,
5664 	0x05, 0xAF, 0x29, 0xDC, 0xBB, 0x0E, 0x86, 0x0C,
5665 	0xBC, 0x9E, 0xB6, 0x28, 0xA9, 0xF2, 0xCC, 0x5E,
5666 	0x1F, 0x86, 0x95, 0xA5, 0x9C, 0x11, 0x19, 0xF0,
5667 	0x5F, 0xDA, 0x2C, 0x04, 0xFE, 0x22, 0x80, 0xF7,
5668 	0x94, 0x3C, 0xBA, 0x01, 0x56, 0xD6, 0x93, 0xFA,
5669 	0xCE, 0x62, 0xE5, 0xD7, 0x98, 0x23, 0xAB, 0xB9,
5670 	0xC7, 0x35, 0x57, 0xF6, 0xE2, 0x16, 0x36, 0xE9,
5671 	0x5B, 0xD7, 0xA5, 0x45, 0x18, 0x93, 0x77, 0xC9,
5672 	0xB1, 0x05, 0xA8, 0x66, 0xE1, 0x0E, 0xB5, 0xDF,
5673 	0x23, 0x35, 0xE1, 0xC2, 0xFA, 0x3E, 0x80, 0x1A,
5674 	0xAD, 0xA4, 0x0C, 0xEF, 0xC7, 0x18, 0xDE, 0x09,
5675 	0xE6, 0x20, 0x98, 0x31, 0xF1, 0xD3, 0xCF, 0xA1
5676 };
5677 static const unsigned char RSA4096_IQ[] = {
5678 	0x76, 0xD7, 0x75, 0xDF, 0xA3, 0x0C, 0x9D, 0x64,
5679 	0x6E, 0x00, 0x82, 0x2E, 0x5C, 0x5E, 0x43, 0xC4,
5680 	0xD2, 0x28, 0xB0, 0xB1, 0xA8, 0xD8, 0x26, 0x91,
5681 	0xA0, 0xF5, 0xC8, 0x69, 0xFF, 0x24, 0x33, 0xAB,
5682 	0x67, 0xC7, 0xA3, 0xAE, 0xBB, 0x17, 0x27, 0x5B,
5683 	0x5A, 0xCD, 0x67, 0xA3, 0x70, 0x91, 0x9E, 0xD5,
5684 	0xF1, 0x97, 0x00, 0x0A, 0x30, 0x64, 0x3D, 0x9B,
5685 	0xBF, 0xB5, 0x8C, 0xAC, 0xC7, 0x20, 0x0A, 0xD2,
5686 	0x76, 0x36, 0x36, 0x5D, 0xE4, 0xAC, 0x5D, 0xBC,
5687 	0x44, 0x32, 0xB0, 0x76, 0x33, 0x40, 0xDD, 0x29,
5688 	0x22, 0xE0, 0xFF, 0x55, 0x4C, 0xCE, 0x3F, 0x43,
5689 	0x34, 0x95, 0x94, 0x7C, 0x22, 0x0D, 0xAB, 0x20,
5690 	0x38, 0x70, 0xC3, 0x4A, 0x19, 0xCF, 0x81, 0xCE,
5691 	0x79, 0x28, 0x6C, 0xC2, 0xA3, 0xB3, 0x48, 0x20,
5692 	0x2D, 0x3E, 0x74, 0x45, 0x2C, 0xAA, 0x9F, 0xA5,
5693 	0xC2, 0xE3, 0x2D, 0x41, 0x95, 0xBD, 0x78, 0xAB,
5694 	0x6A, 0xA8, 0x7A, 0x45, 0x52, 0xE2, 0x66, 0xE7,
5695 	0x6C, 0x38, 0x03, 0xA5, 0xDA, 0xAD, 0x94, 0x3C,
5696 	0x6A, 0xA1, 0xA2, 0xD5, 0xCD, 0xDE, 0x05, 0xCC,
5697 	0x6E, 0x3D, 0x8A, 0xF6, 0x9A, 0xA5, 0x0F, 0xA9,
5698 	0x18, 0xC4, 0xF9, 0x9C, 0x2F, 0xB3, 0xF1, 0x30,
5699 	0x38, 0x60, 0x69, 0x09, 0x67, 0x2C, 0xE9, 0x42,
5700 	0x68, 0x3C, 0x70, 0x32, 0x1A, 0x44, 0x32, 0x02,
5701 	0x82, 0x9F, 0x60, 0xE8, 0xA4, 0x42, 0x74, 0xA2,
5702 	0xA2, 0x5A, 0x99, 0xDC, 0xC8, 0xCA, 0x15, 0x4D,
5703 	0xFF, 0xF1, 0x8A, 0x23, 0xD8, 0xD3, 0xB1, 0x9A,
5704 	0xB4, 0x0B, 0xBB, 0xE8, 0x38, 0x74, 0x0C, 0x52,
5705 	0xC7, 0x8B, 0x63, 0x4C, 0xEA, 0x7D, 0x5F, 0x58,
5706 	0x34, 0x53, 0x3E, 0x23, 0x10, 0xBB, 0x60, 0x6B,
5707 	0x52, 0x9D, 0x89, 0x9F, 0xF0, 0x5F, 0xCE, 0xB3,
5708 	0x9C, 0x0E, 0x75, 0x0F, 0x87, 0xF6, 0x66, 0xA5,
5709 	0x4C, 0x94, 0x84, 0xFE, 0x94, 0xB9, 0x04, 0xB7
5710 };
5711 
5712 static const br_rsa_public_key RSA4096_PK = {
5713 	(void *)RSA4096_N, sizeof RSA4096_N,
5714 	(void *)RSA4096_E, sizeof RSA4096_E
5715 };
5716 
5717 static const br_rsa_private_key RSA4096_SK = {
5718 	4096,
5719 	(void *)RSA4096_P, sizeof RSA4096_P,
5720 	(void *)RSA4096_Q, sizeof RSA4096_Q,
5721 	(void *)RSA4096_DP, sizeof RSA4096_DP,
5722 	(void *)RSA4096_DQ, sizeof RSA4096_DQ,
5723 	(void *)RSA4096_IQ, sizeof RSA4096_IQ
5724 };
5725 
5726 static void
5727 test_RSA_core(const char *name, br_rsa_public fpub, br_rsa_private fpriv)
5728 {
5729 	unsigned char t1[512], t2[512], t3[512];
5730 	size_t len;
5731 
5732 	printf("Test %s: ", name);
5733 	fflush(stdout);
5734 
5735 	/*
5736 	 * A KAT test (computed with OpenSSL).
5737 	 */
5738 	len = hextobin(t1, "45A3DC6A106BCD3BD0E48FB579643AA3FF801E5903E80AA9B43A695A8E7F454E93FA208B69995FF7A6D5617C2FEB8E546375A664977A48931842AAE796B5A0D64393DCA35F3490FC157F5BD83B9D58C2F7926E6AE648A2BD96CAB8FCCD3D35BB11424AD47D973FF6D69CA774841AEC45DFAE99CCF79893E7047FDE6CB00AA76D");
5739 	hextobin(t2, "0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003021300906052B0E03021A05000414A94A8FE5CCB19BA61C4C0873D391E987982FBBD3");
5740 	memcpy(t3, t1, len);
5741 	if (!fpub(t3, len, &RSA_PK)) {
5742 		fprintf(stderr, "RSA public operation failed (1)\n");
5743 		exit(EXIT_FAILURE);
5744 	}
5745 	check_equals("KAT RSA pub", t2, t3, len);
5746 	if (!fpriv(t3, &RSA_SK)) {
5747 		fprintf(stderr, "RSA private operation failed (1)\n");
5748 		exit(EXIT_FAILURE);
5749 	}
5750 	check_equals("KAT RSA priv (1)", t1, t3, len);
5751 
5752 	/*
5753 	 * Another KAT test, with a (fake) hash value slightly different
5754 	 * (last byte is 0xD9 instead of 0xD3).
5755 	 */
5756 	len = hextobin(t1, "32C2DB8B2C73BBCA9960CB3F11FEDEE7B699359EF2EEC3A632E56B7FF3DE2F371E5179BAB03F17E0BB20D2891ACAB679F95DA9B43A01DAAD192FADD25D8ACCF1498EC80F5BBCAC88EA59D60E3BC9D3CE27743981DE42385FFFFF04DD2D716E1A46C04A28ECAF6CD200DAB81083A830D61538D69BB39A183107BD50302AA6BC28");
5757 	hextobin(t2, "0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003021300906052B0E03021A05000414A94A8FE5CCB19BA61C4C0873D391E987982FBBD9");
5758 	memcpy(t3, t1, len);
5759 	if (!fpub(t3, len, &RSA_PK)) {
5760 		fprintf(stderr, "RSA public operation failed (2)\n");
5761 		exit(EXIT_FAILURE);
5762 	}
5763 	check_equals("KAT RSA pub", t2, t3, len);
5764 	if (!fpriv(t3, &RSA_SK)) {
5765 		fprintf(stderr, "RSA private operation failed (2)\n");
5766 		exit(EXIT_FAILURE);
5767 	}
5768 	check_equals("KAT RSA priv (2)", t1, t3, len);
5769 
5770 	/*
5771 	 * Third KAT vector is invalid, because the encrypted value is
5772 	 * out of range: instead of x, value is x+n (where n is the
5773 	 * modulus). Mathematically, this still works, but implementations
5774 	 * are supposed to reject such cases.
5775 	 */
5776 	len = hextobin(t1, "F27781B9B3B358583A24F9BA6B34EE98B67A5AE8D8D4FA567BA773EB6B85EF88848680640A1E2F5FD117876E5FB928B64C6EFC7E03632A3F4C941E15657C0C705F3BB8D0B03A0249143674DB1FE6E5406D690BF2DA76EA7FF3AC6FCE12C7801252FAD52D332BE4AB41F9F8CF1728CDF98AB8E8C20E0C350E4F707A6402C01E0B");
5777 	hextobin(t2, "BFB6A62E873F9C8DA0C42E7B59360FB0FFE12549E5E636B048C2086B77A7C051663506A959DF177F15F6B4E544EE723C531152C9C9614F923364704307F13F7F15ACF0C1547D55C029DC9ECCE41D117245F4D270FC34B21FF3AD6AEFE58633281540902F547F79F3461F44D33CCB2D094231ADCC76BE25511B4513BB70491DBC");
5778 	memcpy(t3, t1, len);
5779 	if (fpub(t3, len, &RSA_PK)) {
5780 		size_t u;
5781 		fprintf(stderr, "RSA public operation should have failed"
5782 			" (value out of range)\n");
5783 		fprintf(stderr, "x = ");
5784 		for (u = 0; u < len; u ++) {
5785 			fprintf(stderr, "%02X", t3[u]);
5786 		}
5787 		fprintf(stderr, "\n");
5788 		exit(EXIT_FAILURE);
5789 	}
5790 	memcpy(t3, t2, len);
5791 	if (fpriv(t3, &RSA_SK)) {
5792 		size_t u;
5793 		fprintf(stderr, "RSA private operation should have failed"
5794 			" (value out of range)\n");
5795 		fprintf(stderr, "x = ");
5796 		for (u = 0; u < len; u ++) {
5797 			fprintf(stderr, "%02X", t3[u]);
5798 		}
5799 		fprintf(stderr, "\n");
5800 		exit(EXIT_FAILURE);
5801 	}
5802 
5803 	/*
5804 	 * RSA-2048 test vector.
5805 	 */
5806 	len = hextobin(t1, "B188ED4EF173A30AED3889926E3CF1CE03FE3BAA7AB122B119A8CD529062F235A7B321008FB898894A624B3E6C8C5374950E78FAC86651345FE2ABA0791968284F23B0D794F8DCDDA924518854822CB7FF2AA9F205AACD909BB5EA541534CC00DBC2EF7727B9FE1BAFE6241B931E8BD01E13632E5AF9E94F4A335772B61F24D6F6AA642AEABB173E36F546CB02B19A1E5D4E27E3EB67F2E986E9F084D4BD266543800B1DC96088A05DFA9AFA595398E9A766D41DD8DA4F74F36C9D74867F0BF7BFA8622EE43C79DA0CEAC14B5D39DE074BDB89D84145BC19D8B2D0EA74DBF2DC29E907BF7C7506A2603CD8BC25EFE955D0125EDB2685EF158B020C9FC539242A");
5807 	hextobin(t2, "0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003031300D060960864801650304020105000420A5A0A792A09438811584A68E240C6C89F1FB1C53C0C86E270B942635F4F6B24A");
5808 	memcpy(t3, t1, len);
5809 	if (!fpub(t3, len, &RSA2048_PK)) {
5810 		fprintf(stderr, "RSA public operation failed (2048)\n");
5811 		exit(EXIT_FAILURE);
5812 	}
5813 	check_equals("KAT RSA pub", t2, t3, len);
5814 	if (!fpriv(t3, &RSA2048_SK)) {
5815 		fprintf(stderr, "RSA private operation failed (2048)\n");
5816 		exit(EXIT_FAILURE);
5817 	}
5818 	check_equals("KAT RSA priv (2048)", t1, t3, len);
5819 
5820 	/*
5821 	 * RSA-4096 test vector.
5822 	 */
5823 	len = hextobin(t1, "7D35B6B4D85252D08A2658C0B04126CC617B0E56B2A782A5FA2722AD05BD49538111682C12DA2C5FA1B9C30FB1AB8DA2C6A49EB4226A4D32290CF091FBB22EC499C7B18192C230B29F957DAF551F1EAD1917BA9E03D757100BD1F96B829708A6188A3927436113BB21E175D436BBB7A90E20162203FFB8F675313DFB21EFDA3EA0C7CC9B605AE7FB47E2DD2A9C4D5F124D7DE1B690AF9ADFEDC6055E0F9D2C9A891FB2501F3055D6DA7E94D51672BA1E86AEB782E4B020F70E0DF5399262909FC5B4770B987F2826EF2099A15F3CD5A0D6FE82E0C85FBA2C53C77305F534A7B0C7EA0D5244E37F1C1318EEF7079995F0642E4AB80EB0ED60DB4955FB652ED372DAC787581054A827C37A25C7B4DE7AE7EF3D099D47D6682ADF02BCC4DE04DDF2920F7124CF5B4955705E4BDB97A0BF341B584797878B4D3795134A9469FB391E4E4988F0AA451027CBC2ED6121FC23B26BF593E3C51DEDD53B62E23050D5B41CA34204679916A87AF1B17873A0867924D0C303942ADA478B769487FCEF861D4B20DCEE6942CCB84184833CDB258167258631C796BC1977D001354E2EE168ABE3B45FC969EA7F22B8E133C57A10FBB25ED19694E89C399CF7723B3C0DF0CC9F57A8ED0959EFC392FB31B8ADAEA969E2DEE8282CB245E5677368F00CCE4BA52C07C16BE7F9889D57191D5B2FE552D72B3415C64C09EE622457766EC809344A1EFE");
5824 	hextobin(t2, "0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003031300D0609608648016503040201050004205B60DD5AD5B3C62E0DA25FD0D8CB26325E1CE32CC9ED234B288235BCCF6ED2C8");
5825 	memcpy(t3, t1, len);
5826 	if (!fpub(t3, len, &RSA4096_PK)) {
5827 		fprintf(stderr, "RSA public operation failed (4096)\n");
5828 		exit(EXIT_FAILURE);
5829 	}
5830 	check_equals("KAT RSA pub", t2, t3, len);
5831 	if (!fpriv(t3, &RSA4096_SK)) {
5832 		fprintf(stderr, "RSA private operation failed (4096)\n");
5833 		exit(EXIT_FAILURE);
5834 	}
5835 	check_equals("KAT RSA priv (4096)", t1, t3, len);
5836 
5837 	printf("done.\n");
5838 	fflush(stdout);
5839 }
5840 
5841 static const unsigned char SHA1_OID[] = {
5842 	0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A
5843 };
5844 
5845 static void
5846 test_RSA_sign(const char *name, br_rsa_private fpriv,
5847 	br_rsa_pkcs1_sign fsign, br_rsa_pkcs1_vrfy fvrfy)
5848 {
5849 	unsigned char t1[128], t2[128];
5850 	unsigned char hv[20], tmp[20];
5851 	unsigned char rsa_n[128], rsa_e[3], rsa_p[64], rsa_q[64];
5852 	unsigned char rsa_dp[64], rsa_dq[64], rsa_iq[64];
5853 	br_rsa_public_key rsa_pk;
5854 	br_rsa_private_key rsa_sk;
5855 	unsigned char hv2[64], tmp2[64], sig[128];
5856 	br_sha1_context hc;
5857 	size_t u;
5858 
5859 	printf("Test %s: ", name);
5860 	fflush(stdout);
5861 
5862 	/*
5863 	 * Verify the KAT test (computed with OpenSSL).
5864 	 */
5865 	hextobin(t1, "45A3DC6A106BCD3BD0E48FB579643AA3FF801E5903E80AA9B43A695A8E7F454E93FA208B69995FF7A6D5617C2FEB8E546375A664977A48931842AAE796B5A0D64393DCA35F3490FC157F5BD83B9D58C2F7926E6AE648A2BD96CAB8FCCD3D35BB11424AD47D973FF6D69CA774841AEC45DFAE99CCF79893E7047FDE6CB00AA76D");
5866 	br_sha1_init(&hc);
5867 	br_sha1_update(&hc, "test", 4);
5868 	br_sha1_out(&hc, hv);
5869 	if (!fvrfy(t1, sizeof t1, SHA1_OID, sizeof tmp, &RSA_PK, tmp)) {
5870 		fprintf(stderr, "Signature verification failed\n");
5871 		exit(EXIT_FAILURE);
5872 	}
5873 	check_equals("Extracted hash value", hv, tmp, sizeof tmp);
5874 
5875 	/*
5876 	 * Regenerate the signature. This should yield the same value as
5877 	 * the KAT test, since PKCS#1 v1.5 signatures are deterministic
5878 	 * (except the usual detail about hash function parameter
5879 	 * encoding, but OpenSSL uses the same convention as BearSSL).
5880 	 */
5881 	if (!fsign(SHA1_OID, hv, 20, &RSA_SK, t2)) {
5882 		fprintf(stderr, "Signature generation failed\n");
5883 		exit(EXIT_FAILURE);
5884 	}
5885 	check_equals("Regenerated signature", t1, t2, sizeof t1);
5886 
5887 	/*
5888 	 * Use the raw private core to generate fake signatures, where
5889 	 * one byte of the padded hash value is altered. They should all be
5890 	 * rejected.
5891 	 */
5892 	hextobin(t2, "0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003021300906052B0E03021A05000414A94A8FE5CCB19BA61C4C0873D391E987982FBBD3");
5893 	for (u = 0; u < (sizeof t2) - 20; u ++) {
5894 		memcpy(t1, t2, sizeof t2);
5895 		t1[u] ^= 0x01;
5896 		if (!fpriv(t1, &RSA_SK)) {
5897 			fprintf(stderr, "RSA private key operation failed\n");
5898 			exit(EXIT_FAILURE);
5899 		}
5900 		if (fvrfy(t1, sizeof t1, SHA1_OID, sizeof tmp, &RSA_PK, tmp)) {
5901 			fprintf(stderr,
5902 				"Signature verification should have failed\n");
5903 			exit(EXIT_FAILURE);
5904 		}
5905 		printf(".");
5906 		fflush(stdout);
5907 	}
5908 
5909 	/*
5910 	 * Another KAT test, which historically showed a bug.
5911 	 */
5912 	rsa_pk.n = rsa_n;
5913 	rsa_pk.nlen = hextobin(rsa_n, "E65DAEF196D22C300B3DAE1CE5157EDF821BB6038E419D8D363A8B2DA84A1321042330E6F87A8BD8FE6BA1D2A17031955ED2315CC5FD2397197E238A5E0D2D0AFD25717E814EC4D2BBA887327A3C5B3A450FD8D547BDFCBB0F73B997CA13DD5E7572C4D5BAA764A349BAB2F868ACF4574AE2C7AEC94B77D2EE00A21B6CB175BB");
5914 	rsa_pk.e = rsa_e;
5915 	rsa_pk.elen = hextobin(rsa_e, "010001");
5916 
5917 	rsa_sk.n_bitlen = 1024;
5918 	rsa_sk.p = rsa_p;
5919 	rsa_sk.plen = hextobin(rsa_p, "FF58513DBA4F3F42DFDFD3E6AFB6BD62DE27E06BA3C9D9F9B542CB21228C2AAE67936514161C8FDC1A248A50195CAF22ADC50DA89BFED1B9EEFBB37304241357");
5920 	rsa_sk.q = rsa_q;
5921 	rsa_sk.qlen = hextobin(rsa_q, "E6F4F66818B7442297DDEB45E9B3D438E5B57BB5EF86EFF2462AD6B9C10F383517CDD2E7E36EAD4BEBCC57CFE8AA985F7E7B38B96D30FFBE9ED9FE21B1CFB63D");
5922 	rsa_sk.dp = rsa_dp;
5923 	rsa_sk.dplen = hextobin(rsa_dp, "6F89517B682D83919F9EF2BDBA955526A1A9C382E139A3A84AC01160B8E9871F458901C7035D988D6931FAE4C01F57350BB89E9DBEFE50F829E6F25CD43B39E3");
5924 	rsa_sk.dq = rsa_dq;
5925 	rsa_sk.dqlen = hextobin(rsa_dq, "409E08D2D7176F58BE64B88EB6F4394C31F8B4C412600E821A5FA1F416AFCB6A0F5EE6C33A3E9CFDC0DB4B3640427A9F3D23FC9AE491F0FBC435F98433DB8981");
5926 	rsa_sk.iq = rsa_iq;
5927 	rsa_sk.iqlen = hextobin(rsa_iq, "CF333D6AD66D02B4D11C8C23CA669D14D71803ADC3943BE03B1E48F52F385BCFDDFD0F85AD02A984E504FC6612549D4E7867B7D09DD13196BFC3FAA4B57393A9");
5928 	hextobin(sig, "CFB84D161E6DB130736FC6212EBE575571AF341CEF5757C19952A5364C90E3C47549E520E26253DAE70F645F31FA8B5DA9AE282741D3CA4B1CC365B7BD75D6D61D4CFD9AD9EDD17D23E0BA7D9775138DBABC7FF2A57587FE1EA1B51E8F3C68326E26FF89D8CF92BDD4C787D04857DFC3266E6B33B92AA08809929C72642F35C2");
5929 
5930 	hextobin(hv2, "F66C62B38E1CC69C378C0E16574AE5C6443FDFA3E85C6205C00B3231CAA3074EC1481BDC22AB575E6CF3CCD9EDA6B39F83923FC0E6475C799D257545F77233B4");
5931 	if (!fsign(BR_HASH_OID_SHA512, hv2, 64, &rsa_sk, t2)) {
5932 		fprintf(stderr, "Signature generation failed (2)\n");
5933 		exit(EXIT_FAILURE);
5934 	}
5935 	check_equals("Regenerated signature (2)", t2, sig, sizeof t2);
5936 	if (!fvrfy(t2, sizeof t2, BR_HASH_OID_SHA512,
5937 		sizeof tmp2, &rsa_pk, tmp2))
5938 	{
5939 		fprintf(stderr, "Signature verification failed (2)\n");
5940 		exit(EXIT_FAILURE);
5941 	}
5942 	check_equals("Extracted hash value (2)", hv2, tmp2, sizeof tmp2);
5943 
5944 	printf(" done.\n");
5945 	fflush(stdout);
5946 }
5947 
5948 /*
5949  * Fake RNG that returns exactly the provided bytes.
5950  */
5951 typedef struct {
5952 	const br_prng_class *vtable;
5953 	unsigned char buf[128];
5954 	size_t ptr, len;
5955 } rng_fake_ctx;
5956 
5957 static void rng_fake_init(rng_fake_ctx *cc,
5958 	const void *params, const void *seed, size_t len);
5959 static void rng_fake_generate(rng_fake_ctx *cc, void *dst, size_t len);
5960 static void rng_fake_update(rng_fake_ctx *cc, const void *src, size_t len);
5961 
5962 static const br_prng_class rng_fake_vtable = {
5963 	sizeof(rng_fake_ctx),
5964 	(void (*)(const br_prng_class **,
5965 		const void *, const void *, size_t))&rng_fake_init,
5966 	(void (*)(const br_prng_class **,
5967 		void *, size_t))&rng_fake_generate,
5968 	(void (*)(const br_prng_class **,
5969 		const void *, size_t))&rng_fake_update
5970 };
5971 
5972 static void
5973 rng_fake_init(rng_fake_ctx *cc, const void *params,
5974 	const void *seed, size_t len)
5975 {
5976 	(void)params;
5977 	if (len > sizeof cc->buf) {
5978 		fprintf(stderr, "seed is too large (%lu bytes)\n",
5979 			(unsigned long)len);
5980 		exit(EXIT_FAILURE);
5981 	}
5982 	cc->vtable = &rng_fake_vtable;
5983 	memcpy(cc->buf, seed, len);
5984 	cc->ptr = 0;
5985 	cc->len = len;
5986 }
5987 
5988 static void
5989 rng_fake_generate(rng_fake_ctx *cc, void *dst, size_t len)
5990 {
5991 	if (len > (cc->len - cc->ptr)) {
5992 		fprintf(stderr, "asking for more data than expected\n");
5993 		exit(EXIT_FAILURE);
5994 	}
5995 	memcpy(dst, cc->buf + cc->ptr, len);
5996 	cc->ptr += len;
5997 }
5998 
5999 static void
6000 rng_fake_update(rng_fake_ctx *cc, const void *src, size_t len)
6001 {
6002 	(void)cc;
6003 	(void)src;
6004 	(void)len;
6005 	fprintf(stderr, "unexpected update\n");
6006 	exit(EXIT_FAILURE);
6007 }
6008 
6009 /*
6010  * Test vectors from pkcs-1v2-1d2-vec.zip (originally from ftp.rsa.com).
6011  * There are ten RSA keys, and for each RSA key, there are 6 messages,
6012  * each with an explicit salt.
6013  *
6014  * Field order:
6015  *    modulus (n)
6016  *    public exponent (e)
6017  *    first factor (p)
6018  *    second factor (q)
6019  *    first private exponent (dp)
6020  *    second private exponent (dq)
6021  *    CRT coefficient (iq)
6022  *    message 1
6023  *    salt 1 (20-byte random value)
6024  *    signature 1
6025  *    message 2
6026  *    salt 2 (20-byte random value)
6027  *    signature 2
6028  *    ...
6029  *    message 6
6030  *    salt 6 (20-byte random value)
6031  *    signature 6
6032  *
6033  * This pattern is repeated for all keys. The array stops on a NULL.
6034  */
6035 static const char *KAT_RSA_PSS[] = {
6036 
6037 	/* 1024-bit key */
6038 	"a56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991d8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1dfd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f105acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137",
6039 	"010001",
6040 	"33a5042a90b27d4f5451ca9bbbd0b44771a101af884340aef9885f2a4bbe92e894a724ac3c568c8f97853ad07c0266c8c6a3ca0929f1e8f11231884429fc4d9ae55fee896a10ce707c3ed7e734e44727a39574501a532683109c2abacaba283c31b4bd2f53c3ee37e352cee34f9e503bd80c0622ad79c6dcee883547c6a3b325",
6041 	"e7e8942720a877517273a356053ea2a1bc0c94aa72d55c6e86296b2dfc967948c0a72cbccca7eacb35706e09a1df55a1535bd9b3cc34160b3b6dcd3eda8e6443",
6042 	"b69dca1cf7d4d7ec81e75b90fcca874abcde123fd2700180aa90479b6e48de8d67ed24f9f19d85ba275874f542cd20dc723e6963364a1f9425452b269a6799fd",
6043 	"28fa13938655be1f8a159cbaca5a72ea190c30089e19cd274a556f36c4f6e19f554b34c077790427bbdd8dd3ede2448328f385d81b30e8e43b2fffa027861979",
6044 	"1a8b38f398fa712049898d7fb79ee0a77668791299cdfa09efc0e507acb21ed74301ef5bfd48be455eaeb6e1678255827580a8e4e8e14151d1510a82a3f2e729",
6045 	"27156aba4126d24a81f3a528cbfb27f56886f840a9f6e86e17a44b94fe9319584b8e22fdde1e5a2e3bd8aa5ba8d8584194eb2190acf832b847f13a3d24a79f4d",
6046 
6047 	"cdc87da223d786df3b45e0bbbc721326d1ee2af806cc315475cc6f0d9c66e1b62371d45ce2392e1ac92844c310102f156a0d8d52c1f4c40ba3aa65095786cb769757a6563ba958fed0bcc984e8b517a3d5f515b23b8a41e74aa867693f90dfb061a6e86dfaaee64472c00e5f20945729cbebe77f06ce78e08f4098fba41f9d6193c0317e8b60d4b6084acb42d29e3808a3bc372d85e331170fcbf7cc72d0b71c296648b3a4d10f416295d0807aa625cab2744fd9ea8fd223c42537029828bd16be02546f130fd2e33b936d2676e08aed1b73318b750a0167d0",
6048 	"dee959c7e06411361420ff80185ed57f3e6776af",
6049 	"9074308fb598e9701b2294388e52f971faac2b60a5145af185df5287b5ed2887e57ce7fd44dc8634e407c8e0e4360bc226f3ec227f9d9e54638e8d31f5051215df6ebb9c2f9579aa77598a38f914b5b9c1bd83c4e2f9f382a0d0aa3542ffee65984a601bc69eb28deb27dca12c82c2d4c3f66cd500f1ff2b994d8a4e30cbb33c",
6050 
6051 	"851384cdfe819c22ed6c4ccb30daeb5cf059bc8e1166b7e3530c4c233e2b5f8f71a1cca582d43ecc72b1bca16dfc7013226b9e",
6052 	"ef2869fa40c346cb183dab3d7bffc98fd56df42d",
6053 	"3ef7f46e831bf92b32274142a585ffcefbdca7b32ae90d10fb0f0c729984f04ef29a9df0780775ce43739b97838390db0a5505e63de927028d9d29b219ca2c4517832558a55d694a6d25b9dab66003c4cccd907802193be5170d26147d37b93590241be51c25055f47ef62752cfbe21418fafe98c22c4d4d47724fdb5669e843",
6054 
6055 	"a4b159941761c40c6a82f2b80d1b94f5aa2654fd17e12d588864679b54cd04ef8bd03012be8dc37f4b83af7963faff0dfa225477437c48017ff2be8191cf3955fc07356eab3f322f7f620e21d254e5db4324279fe067e0910e2e81ca2cab31c745e67a54058eb50d993cdb9ed0b4d029c06d21a94ca661c3ce27fae1d6cb20f4564d66ce4767583d0e5f060215b59017be85ea848939127bd8c9c4d47b51056c031cf336f17c9980f3b8f5b9b6878e8b797aa43b882684333e17893fe9caa6aa299f7ed1a18ee2c54864b7b2b99b72618fb02574d139ef50f019c9eef416971338e7d470",
6056 	"710b9c4747d800d4de87f12afdce6df18107cc77",
6057 	"666026fba71bd3e7cf13157cc2c51a8e4aa684af9778f91849f34335d141c00154c4197621f9624a675b5abc22ee7d5baaffaae1c9baca2cc373b3f33e78e6143c395a91aa7faca664eb733afd14d8827259d99a7550faca501ef2b04e33c23aa51f4b9e8282efdb728cc0ab09405a91607c6369961bc8270d2d4f39fce612b1",
6058 
6059 	"bc656747fa9eafb3f0",
6060 	"056f00985de14d8ef5cea9e82f8c27bef720335e",
6061 	"4609793b23e9d09362dc21bb47da0b4f3a7622649a47d464019b9aeafe53359c178c91cd58ba6bcb78be0346a7bc637f4b873d4bab38ee661f199634c547a1ad8442e03da015b136e543f7ab07c0c13e4225b8de8cce25d4f6eb8400f81f7e1833b7ee6e334d370964ca79fdb872b4d75223b5eeb08101591fb532d155a6de87",
6062 
6063 	"b45581547e5427770c768e8b82b75564e0ea4e9c32594d6bff706544de0a8776c7a80b4576550eee1b2acabc7e8b7d3ef7bb5b03e462c11047eadd00629ae575480ac1470fe046f13a2bf5af17921dc4b0aa8b02bee6334911651d7f8525d10f32b51d33be520d3ddf5a709955a3dfe78283b9e0ab54046d150c177f037fdccc5be4ea5f68b5e5a38c9d7edcccc4975f455a6909b4",
6064 	"80e70ff86a08de3ec60972b39b4fbfdcea67ae8e",
6065 	"1d2aad221ca4d31ddf13509239019398e3d14b32dc34dc5af4aeaea3c095af73479cf0a45e5629635a53a018377615b16cb9b13b3e09d671eb71e387b8545c5960da5a64776e768e82b2c93583bf104c3fdb23512b7b4e89f633dd0063a530db4524b01c3f384c09310e315a79dcd3d684022a7f31c865a664e316978b759fad",
6066 
6067 	"10aae9a0ab0b595d0841207b700d48d75faedde3b775cd6b4cc88ae06e4694ec74ba18f8520d4f5ea69cbbe7cc2beba43efdc10215ac4eb32dc302a1f53dc6c4352267e7936cfebf7c8d67035784a3909fa859c7b7b59b8e39c5c2349f1886b705a30267d402f7486ab4f58cad5d69adb17ab8cd0ce1caf5025af4ae24b1fb8794c6070cc09a51e2f9911311e3877d0044c71c57a993395008806b723ac38373d395481818528c1e7053739282053529510e935cd0fa77b8fa53cc2d474bd4fb3cc5c672d6ffdc90a00f9848712c4bcfe46c60573659b11e6457e861f0f604b6138d144f8ce4e2da73",
6068 	"a8ab69dd801f0074c2a1fc60649836c616d99681",
6069 	"2a34f6125e1f6b0bf971e84fbd41c632be8f2c2ace7de8b6926e31ff93e9af987fbc06e51e9be14f5198f91f3f953bd67da60a9df59764c3dc0fe08e1cbef0b75f868d10ad3fba749fef59fb6dac46a0d6e504369331586f58e4628f39aa278982543bc0eeb537dc61958019b394fb273f215858a0a01ac4d650b955c67f4c58",
6070 
6071 	/* 1025-bit key */
6072 	"01d40c1bcf97a68ae7cdbd8a7bf3e34fa19dcca4ef75a47454375f94514d88fed006fb829f8419ff87d6315da68a1ff3a0938e9abb3464011c303ad99199cf0c7c7a8b477dce829e8844f625b115e5e9c4a59cf8f8113b6834336a2fd2689b472cbb5e5cabe674350c59b6c17e176874fb42f8fc3d176a017edc61fd326c4b33c9",
6073 	"010001",
6074 	"027d147e4673057377fd1ea201565772176a7dc38358d376045685a2e787c23c15576bc16b9f444402d6bfc5d98a3e88ea13ef67c353eca0c0ddba9255bd7b8bb50a644afdfd1dd51695b252d22e7318d1b6687a1c10ff75545f3db0fe602d5f2b7f294e3601eab7b9d1cecd767f64692e3e536ca2846cb0c2dd486a39fa75b1",
6075 	"016601e926a0f8c9e26ecab769ea65a5e7c52cc9e080ef519457c644da6891c5a104d3ea7955929a22e7c68a7af9fcad777c3ccc2b9e3d3650bce404399b7e59d1",
6076 	"014eafa1d4d0184da7e31f877d1281ddda625664869e8379e67ad3b75eae74a580e9827abd6eb7a002cb5411f5266797768fb8e95ae40e3e8a01f35ff89e56c079",
6077 	"e247cce504939b8f0a36090de200938755e2444b29539a7da7a902f6056835c0db7b52559497cfe2c61a8086d0213c472c78851800b171f6401de2e9c2756f31",
6078 	"b12fba757855e586e46f64c38a70c68b3f548d93d787b399999d4c8f0bbd2581c21e19ed0018a6d5d3df86424b3abcad40199d31495b61309f27c1bf55d487c1",
6079 	"564b1e1fa003bda91e89090425aac05b91da9ee25061e7628d5f51304a84992fdc33762bd378a59f030a334d532bd0dae8f298ea9ed844636ad5fb8cbdc03cad",
6080 
6081 	"daba032066263faedb659848115278a52c44faa3a76f37515ed336321072c40a9d9b53bc05014078adf520875146aae70ff060226dcb7b1f1fc27e9360",
6082 	"57bf160bcb02bb1dc7280cf0458530b7d2832ff7",
6083 	"014c5ba5338328ccc6e7a90bf1c0ab3fd606ff4796d3c12e4b639ed9136a5fec6c16d8884bdd99cfdc521456b0742b736868cf90de099adb8d5ffd1deff39ba4007ab746cefdb22d7df0e225f54627dc65466131721b90af445363a8358b9f607642f78fab0ab0f43b7168d64bae70d8827848d8ef1e421c5754ddf42c2589b5b3",
6084 
6085 	"e4f8601a8a6da1be34447c0959c058570c3668cfd51dd5f9ccd6ad4411fe8213486d78a6c49f93efc2ca2288cebc2b9b60bd04b1e220d86e3d4848d709d032d1e8c6a070c6af9a499fcf95354b14ba6127c739de1bb0fd16431e46938aec0cf8ad9eb72e832a7035de9b7807bdc0ed8b68eb0f5ac2216be40ce920c0db0eddd3860ed788efaccaca502d8f2bd6d1a7c1f41ff46f1681c8f1f818e9c4f6d91a0c7803ccc63d76a6544d843e084e363b8acc55aa531733edb5dee5b5196e9f03e8b731b3776428d9e457fe3fbcb3db7274442d785890e9cb0854b6444dace791d7273de1889719338a77fe",
6086 	"7f6dd359e604e60870e898e47b19bf2e5a7b2a90",
6087 	"010991656cca182b7f29d2dbc007e7ae0fec158eb6759cb9c45c5ff87c7635dd46d150882f4de1e9ae65e7f7d9018f6836954a47c0a81a8a6b6f83f2944d6081b1aa7c759b254b2c34b691da67cc0226e20b2f18b42212761dcd4b908a62b371b5918c5742af4b537e296917674fb914194761621cc19a41f6fb953fbcbb649dea",
6088 
6089 	"52a1d96c8ac39e41e455809801b927a5b445c10d902a0dcd3850d22a66d2bb0703e67d5867114595aabf5a7aeb5a8f87034bbb30e13cfd4817a9be76230023606d0286a3faf8a4d22b728ec518079f9e64526e3a0cc7941aa338c437997c680ccac67c66bfa1",
6090 	"fca862068bce2246724b708a0519da17e648688c",
6091 	"007f0030018f53cdc71f23d03659fde54d4241f758a750b42f185f87578520c30742afd84359b6e6e8d3ed959dc6fe486bedc8e2cf001f63a7abe16256a1b84df0d249fc05d3194ce5f0912742dbbf80dd174f6c51f6bad7f16cf3364eba095a06267dc3793803ac7526aebe0a475d38b8c2247ab51c4898df7047dc6adf52c6c4",
6092 
6093 	"a7182c83ac18be6570a106aa9d5c4e3dbbd4afaeb0c60c4a23e1969d79ff",
6094 	"8070ef2de945c02387684ba0d33096732235d440",
6095 	"009cd2f4edbe23e12346ae8c76dd9ad3230a62076141f16c152ba18513a48ef6f010e0e37fd3df10a1ec629a0cb5a3b5d2893007298c30936a95903b6ba85555d9ec3673a06108fd62a2fda56d1ce2e85c4db6b24a81ca3b496c36d4fd06eb7c9166d8e94877c42bea622b3bfe9251fdc21d8d5371badad78a488214796335b40b",
6096 
6097 	"86a83d4a72ee932a4f5630af6579a386b78fe88999e0abd2d49034a4bfc854dd94f1094e2e8cd7a179d19588e4aefc1b1bd25e95e3dd461f",
6098 	"17639a4e88d722c4fca24d079a8b29c32433b0c9",
6099 	"00ec430824931ebd3baa43034dae98ba646b8c36013d1671c3cf1cf8260c374b19f8e1cc8d965012405e7e9bf7378612dfcc85fce12cda11f950bd0ba8876740436c1d2595a64a1b32efcfb74a21c873b3cc33aaf4e3dc3953de67f0674c0453b4fd9f604406d441b816098cb106fe3472bc251f815f59db2e4378a3addc181ecf",
6100 
6101 	"049f9154d871ac4a7c7ab45325ba7545a1ed08f70525b2667cf1",
6102 	"37810def1055ed922b063df798de5d0aabf886ee",
6103 	"00475b1648f814a8dc0abdc37b5527f543b666bb6e39d30e5b49d3b876dccc58eac14e32a2d55c2616014456ad2f246fc8e3d560da3ddf379a1c0bd200f10221df078c219a151bc8d4ec9d2fc2564467811014ef15d8ea01c2ebbff8c2c8efab38096e55fcbe3285c7aa558851254faffa92c1c72b78758663ef4582843139d7a6",
6104 
6105 	/* 1026-bit key */
6106 	"02f246ef451ed3eebb9a310200cc25859c048e4be798302991112eb68ce6db674e280da21feded1ae74880ca522b18db249385012827c515f0e466a1ffa691d98170574e9d0eadb087586ca48933da3cc953d95bd0ed50de10ddcb6736107d6c831c7f663e833ca4c097e700ce0fb945f88fb85fe8e5a773172565b914a471a443",
6107 	"010001",
6108 	"651451733b56de5ac0a689a4aeb6e6894a69014e076c88dd7a667eab3232bbccd2fc44ba2fa9c31db46f21edd1fdb23c5c128a5da5bab91e7f952b67759c7cff705415ac9fa0907c7ca6178f668fb948d869da4cc3b7356f4008dfd5449d32ee02d9a477eb69fc29266e5d9070512375a50fbbcc27e238ad98425f6ebbf88991",
6109 	"01bd36e18ece4b0fdb2e9c9d548bd1a7d6e2c21c6fdc35074a1d05b1c6c8b3d558ea2639c9a9a421680169317252558bd148ad215aac550e2dcf12a82d0ebfe853",
6110 	"01b1b656ad86d8e19d5dc86292b3a192fdf6e0dd37877bad14822fa00190cab265f90d3f02057b6f54d6ecb14491e5adeacebc48bf0ebd2a2ad26d402e54f61651",
6111 	"1f2779fd2e3e5e6bae05539518fba0cd0ead1aa4513a7cba18f1cf10e3f68195693d278a0f0ee72f89f9bc760d80e2f9d0261d516501c6ae39f14a476ce2ccf5",
6112 	"011a0d36794b04a854aab4b2462d439a5046c91d940b2bc6f75b62956fef35a2a6e63c5309817f307bbff9d59e7e331bd363f6d66849b18346adea169f0ae9aec1",
6113 	"0b30f0ecf558752fb3a6ce4ba2b8c675f659eba6c376585a1b39712d038ae3d2b46fcb418ae15d0905da6440e1513a30b9b7d6668fbc5e88e5ab7a175e73ba35",
6114 
6115 	"594b37333bbb2c84524a87c1a01f75fcec0e3256f108e38dca36d70d0057",
6116 	"f31ad6c8cf89df78ed77feacbcc2f8b0a8e4cfaa",
6117 	"0088b135fb1794b6b96c4a3e678197f8cac52b64b2fe907d6f27de761124964a99a01a882740ecfaed6c01a47464bb05182313c01338a8cd097214cd68ca103bd57d3bc9e816213e61d784f182467abf8a01cf253e99a156eaa8e3e1f90e3c6e4e3aa2d83ed0345b89fafc9c26077c14b6ac51454fa26e446e3a2f153b2b16797f",
6118 
6119 	"8b769528884a0d1ffd090cf102993e796dadcfbddd38e44ff6324ca451",
6120 	"fcf9f0e1f199a3d1d0da681c5b8606fc642939f7",
6121 	"02a5f0a858a0864a4f65017a7d69454f3f973a2999839b7bbc48bf78641169179556f595fa41f6ff18e286c2783079bc0910ee9cc34f49ba681124f923dfa88f426141a368a5f5a930c628c2c3c200e18a7644721a0cbec6dd3f6279bde3e8f2be5e2d4ee56f97e7ceaf33054be7042bd91a63bb09f897bd41e81197dee99b11af",
6122 
6123 	"1abdba489c5ada2f995ed16f19d5a94d9e6ec34a8d84f84557d26e5ef9b02b22887e3f9a4b690ad1149209c20c61431f0c017c36c2657b35d7b07d3f5ad8708507a9c1b831df835a56f831071814ea5d3d8d8f6ade40cba38b42db7a2d3d7a29c8f0a79a7838cf58a9757fa2fe4c40df9baa193bfc6f92b123ad57b07ace3e6ac068c9f106afd9eeb03b4f37c25dbfbcfb3071f6f9771766d072f3bb070af6605532973ae25051",
6124 	"986e7c43dbb671bd41b9a7f4b6afc80e805f2423",
6125 	"0244bcd1c8c16955736c803be401272e18cb990811b14f72db964124d5fa760649cbb57afb8755dbb62bf51f466cf23a0a1607576e983d778fceffa92df7548aea8ea4ecad2c29dd9f95bc07fe91ecf8bee255bfe8762fd7690aa9bfa4fa0849ef728c2c42c4532364522df2ab7f9f8a03b63f7a499175828668f5ef5a29e3802c",
6126 
6127 	"8fb431f5ee792b6c2ac7db53cc428655aeb32d03f4e889c5c25de683c461b53acf89f9f8d3aabdf6b9f0c2a1de12e15b49edb3919a652fe9491c25a7fce1f722c2543608b69dc375ec",
6128 	"f8312d9c8eea13ec0a4c7b98120c87509087c478",
6129 	"0196f12a005b98129c8df13c4cb16f8aa887d3c40d96df3a88e7532ef39cd992f273abc370bc1be6f097cfebbf0118fd9ef4b927155f3df22b904d90702d1f7ba7a52bed8b8942f412cd7bd676c9d18e170391dcd345c06a730964b3f30bcce0bb20ba106f9ab0eeb39cf8a6607f75c0347f0af79f16afa081d2c92d1ee6f836b8",
6130 
6131 	"fef4161dfaaf9c5295051dfc1ff3810c8c9ec2e866f7075422c8ec4216a9c4ff49427d483cae10c8534a41b2fd15fee06960ec6fb3f7a7e94a2f8a2e3e43dc4a40576c3097ac953b1de86f0b4ed36d644f23ae14425529622464ca0cbf0b1741347238157fab59e4de5524096d62baec63ac64",
6132 	"50327efec6292f98019fc67a2a6638563e9b6e2d",
6133 	"021eca3ab4892264ec22411a752d92221076d4e01c0e6f0dde9afd26ba5acf6d739ef987545d16683e5674c9e70f1de649d7e61d48d0caeb4fb4d8b24fba84a6e3108fee7d0705973266ac524b4ad280f7ae17dc59d96d3351586b5a3bdb895d1e1f7820ac6135d8753480998382ba32b7349559608c38745290a85ef4e9f9bd83",
6134 
6135 	"efd237bb098a443aeeb2bf6c3f8c81b8c01b7fcb3feb",
6136 	"b0de3fc25b65f5af96b1d5cc3b27d0c6053087b3",
6137 	"012fafec862f56e9e92f60ab0c77824f4299a0ca734ed26e0644d5d222c7f0bde03964f8e70a5cb65ed44e44d56ae0edf1ff86ca032cc5dd4404dbb76ab854586c44eed8336d08d457ce6c03693b45c0f1efef93624b95b8ec169c616d20e5538ebc0b6737a6f82b4bc0570924fc6b35759a3348426279f8b3d7744e2d222426ce",
6138 
6139 	/* 1027-bit key */
6140 	"054adb7886447efe6f57e0368f06cf52b0a3370760d161cef126b91be7f89c421b62a6ec1da3c311d75ed50e0ab5fff3fd338acc3aa8a4e77ee26369acb81ba900fa83f5300cf9bb6c53ad1dc8a178b815db4235a9a9da0c06de4e615ea1277ce559e9c108de58c14a81aa77f5a6f8d1335494498848c8b95940740be7bf7c3705",
6141 	"010001",
6142 	"fa041f8cd9697ceed38ec8caa275523b4dd72b09a301d3541d72f5d31c05cbce2d6983b36183af10690bd46c46131e35789431a556771dd0049b57461bf060c1f68472e8a67c25f357e5b6b4738fa541a730346b4a07649a2dfa806a69c975b6aba64678acc7f5913e89c622f2d8abb1e3e32554e39df94ba60c002e387d9011",
6143 	"029232336d2838945dba9dd7723f4e624a05f7375b927a87abe6a893a1658fd49f47f6c7b0fa596c65fa68a23f0ab432962d18d4343bd6fd671a5ea8d148413995",
6144 	"020ef5efe7c5394aed2272f7e81a74f4c02d145894cb1b3cab23a9a0710a2afc7e3329acbb743d01f680c4d02afb4c8fde7e20930811bb2b995788b5e872c20bb1",
6145 	"026e7e28010ecf2412d9523ad704647fb4fe9b66b1a681581b0e15553a89b1542828898f27243ebab45ff5e1acb9d4df1b051fbc62824dbc6f6c93261a78b9a759",
6146 	"012ddcc86ef655998c39ddae11718669e5e46cf1495b07e13b1014cd69b3af68304ad2a6b64321e78bf3bbca9bb494e91d451717e2d97564c6549465d0205cf421",
6147 	"010600c4c21847459fe576703e2ebecae8a5094ee63f536bf4ac68d3c13e5e4f12ac5cc10ab6a2d05a199214d1824747d551909636b774c22cac0b837599abcc75",
6148 
6149 	"9fb03b827c8217d9",
6150 	"ed7c98c95f30974fbe4fbddcf0f28d6021c0e91d",
6151 	"0323d5b7bf20ba4539289ae452ae4297080feff4518423ff4811a817837e7d82f1836cdfab54514ff0887bddeebf40bf99b047abc3ecfa6a37a3ef00f4a0c4a88aae0904b745c846c4107e8797723e8ac810d9e3d95dfa30ff4966f4d75d13768d20857f2b1406f264cfe75e27d7652f4b5ed3575f28a702f8c4ed9cf9b2d44948",
6152 
6153 	"0ca2ad77797ece86de5bf768750ddb5ed6a3116ad99bbd17edf7f782f0db1cd05b0f677468c5ea420dc116b10e80d110de2b0461ea14a38be68620392e7e893cb4ea9393fb886c20ff790642305bf302003892e54df9f667509dc53920df583f50a3dd61abb6fab75d600377e383e6aca6710eeea27156e06752c94ce25ae99fcbf8592dbe2d7e27453cb44de07100ebb1a2a19811a478adbeab270f94e8fe369d90b3ca612f9f",
6154 	"22d71d54363a4217aa55113f059b3384e3e57e44",
6155 	"049d0185845a264d28feb1e69edaec090609e8e46d93abb38371ce51f4aa65a599bdaaa81d24fba66a08a116cb644f3f1e653d95c89db8bbd5daac2709c8984000178410a7c6aa8667ddc38c741f710ec8665aa9052be929d4e3b16782c1662114c5414bb0353455c392fc28f3db59054b5f365c49e1d156f876ee10cb4fd70598",
6156 
6157 	"288062afc08fcdb7c5f8650b29837300461dd5676c17a20a3c8fb5148949e3f73d66b3ae82c7240e27c5b3ec4328ee7d6ddf6a6a0c9b5b15bcda196a9d0c76b119d534d85abd123962d583b76ce9d180bce1ca",
6158 	"4af870fbc6516012ca916c70ba862ac7e8243617",
6159 	"03fbc410a2ced59500fb99f9e2af2781ada74e13145624602782e2994813eefca0519ecd253b855fb626a90d771eae028b0c47a199cbd9f8e3269734af4163599090713a3fa910fa0960652721432b971036a7181a2bc0cab43b0b598bc6217461d7db305ff7e954c5b5bb231c39e791af6bcfa76b147b081321f72641482a2aad",
6160 
6161 	"6f4f9ab9501199cef55c6cf408fe7b36c557c49d420a4763d2463c8ad44b3cfc5be2742c0e7d9b0f6608f08c7f47b693ee",
6162 	"40d2e180fae1eac439c190b56c2c0e14ddf9a226",
6163 	"0486644bc66bf75d28335a6179b10851f43f09bded9fac1af33252bb9953ba4298cd6466b27539a70adaa3f89b3db3c74ab635d122f4ee7ce557a61e59b82ffb786630e5f9db53c77d9a0c12fab5958d4c2ce7daa807cd89ba2cc7fcd02ff470ca67b229fcce814c852c73cc93bea35be68459ce478e9d4655d121c8472f371d4f",
6164 
6165 	"e17d20385d501955823c3f666254c1d3dd36ad5168b8f18d286fdcf67a7dad94097085fab7ed86fe2142a28771717997ef1a7a08884efc39356d76077aaf82459a7fad45848875f2819b098937fe923bcc9dc442d72d754d812025090c9bc03db3080c138dd63b355d0b4b85d6688ac19f4de15084a0ba4e373b93ef4a555096691915dc23c00e954cdeb20a47cd55d16c3d8681d46ed7f2ed5ea42795be17baed25f0f4d113b3636addd585f16a8b5aec0c8fa9c5f03cbf3b9b73",
6166 	"2497dc2b4615dfae5a663d49ffd56bf7efc11304",
6167 	"022a80045353904cb30cbb542d7d4990421a6eec16a8029a8422adfd22d6aff8c4cc0294af110a0c067ec86a7d364134459bb1ae8ff836d5a8a2579840996b320b19f13a13fad378d931a65625dae2739f0c53670b35d9d3cbac08e733e4ec2b83af4b9196d63e7c4ff1ddeae2a122791a125bfea8deb0de8ccf1f4ffaf6e6fb0a",
6168 
6169 	"afbc19d479249018fdf4e09f618726440495de11ddeee38872d775fcea74a23896b5343c9c38d46af0dba224d047580cc60a65e9391cf9b59b36a860598d4e8216722f993b91cfae87bc255af89a6a199bca4a391eadbc3a24903c0bd667368f6be78e3feabfb4ffd463122763740ffbbefeab9a25564bc5d1c24c93e422f75073e2ad72bf45b10df00b52a147128e73fee33fa3f0577d77f80fbc2df1bed313290c12777f50",
6170 	"a334db6faebf11081a04f87c2d621cdec7930b9b",
6171 	"00938dcb6d583046065f69c78da7a1f1757066a7fa75125a9d2929f0b79a60b627b082f11f5b196f28eb9daa6f21c05e5140f6aef1737d2023075c05ecf04a028c686a2ab3e7d5a0664f295ce12995e890908b6ad21f0839eb65b70393a7b5afd9871de0caa0cedec5b819626756209d13ab1e7bb9546a26ff37e9a51af9fd562e",
6172 
6173 	/* 1028-bit key */
6174 	"0d10f661f29940f5ed39aa260966deb47843679d2b6fb25b3de370f3ac7c19916391fd25fb527ebfa6a4b4df45a1759d996c4bb4ebd18828c44fc52d0191871740525f47a4b0cc8da325ed8aa676b0d0f626e0a77f07692170acac8082f42faa7dc7cd123e730e31a87985204cabcbe6670d43a2dd2b2ddef5e05392fc213bc507",
6175 	"010001",
6176 	"03ce08b104fff396a979bd3e4e46925b6319ddb63acbcfd819f17d16b8077b3a87101ff34b77fe48b8b205a96e9151ba8ecea64d0cce7b23c3e6a6b83058bc49dae816ae736db5a4708e2ad435232b567f9096ce59ff28061e79ab1c02d717e6b23cea6db8eb5192fa7c1eab227dba74621c45601896eef13792c8440beb15aac1",
6177 	"03f2f331f4142d4f24b43aa10279a89652d4e7537221a1a7b2a25deb551e5de9ac497411c227a94e45f91c2d1c13cc046cf4ce14e32d058734210d44a87ee1b73f",
6178 	"034f090d73b55803030cf0361a5d8081bfb79f851523feac0a2124d08d4013ff08487771a870d0479dc0686c62f7718dfecf024b17c9267678059171339cc00839",
6179 	"02aa663adbf51ab887a018cb426e78bc2fe182dcb2f7bcb50441d17fdf0f06798b5071c6e2f5feb4d54ad8182311c1ef62d4c49f18d1f51f54b2d2cffba4da1be5",
6180 	"02bbe706078b5c0b391512d411db1b199b5a5664b84042ead37fe994ae72b9532dfbfb3e9e6981a0fbb806513141b7c2163fe56c395e4bfaee57e3833f9b918df9",
6181 	"0242b6cd00d30a767aee9a898ead453c8eaea63d500b7d1e00713edae51ce36b23b664df26e63e266ec8f76e6e63ed1ba41eb033b120f7ea5212ae21a98fbc16",
6182 
6183 	"30c7d557458b436decfdc14d06cb7b96b06718c48d7de57482a868ae7f065870a6216506d11b779323dfdf046cf5775129134b4d5689e4d9c0ce1e12d7d4b06cb5fc5820decfa41baf59bf257b32f025b7679b445b9499c92555145885992f1b76f84891ee4d3be0f5150fd5901e3a4c8ed43fd36b61d022e65ad5008dbf33293c22bfbfd07321f0f1d5fa9fdf0014c2fcb0358aad0e354b0d29",
6184 	"081b233b43567750bd6e78f396a88b9f6a445151",
6185 	"0ba373f76e0921b70a8fbfe622f0bf77b28a3db98e361051c3d7cb92ad0452915a4de9c01722f6823eeb6adf7e0ca8290f5de3e549890ac2a3c5950ab217ba58590894952de96f8df111b2575215da6c161590c745be612476ee578ed384ab33e3ece97481a252f5c79a98b5532ae00cdd62f2ecc0cd1baefe80d80b962193ec1d",
6186 
6187 	"e7b32e1556ea1b2795046ac69739d22ac8966bf11c116f614b166740e96b90653e5750945fcf772186c03790a07fda323e1a61916b06ee2157db3dff80d67d5e39a53ae268c8f09ed99a732005b0bc6a04af4e08d57a00e7201b3060efaadb73113bfc087fd837093aa25235b8c149f56215f031c24ad5bde7f29960df7d524070f7449c6f785084be1a0f733047f336f9154738674547db02a9f44dfc6e60301081e1ce99847f3b5b601ff06b4d5776a9740b9aa0d34058fd3b906e4f7859dfb07d7173e5e6f6350adac21f27b2307469",
6188 	"bd0ce19549d0700120cbe51077dbbbb00a8d8b09",
6189 	"08180de825e4b8b014a32da8ba761555921204f2f90d5f24b712908ff84f3e220ad17997c0dd6e706630ba3e84add4d5e7ab004e58074b549709565d43ad9e97b5a7a1a29e85b9f90f4aafcdf58321de8c5974ef9abf2d526f33c0f2f82e95d158ea6b81f1736db8d1af3d6ac6a83b32d18bae0ff1b2fe27de4c76ed8c7980a34e",
6190 
6191 	"8d8396e36507fe1ef6a19017548e0c716674c2fec233adb2f775665ec41f2bd0ba396b061a9daa7e866f7c23fd3531954300a342f924535ea1498c48f6c879932865fc02000c528723b7ad0335745b51209a0afed932af8f0887c219004d2abd894ea92559ee3198af3a734fe9b9638c263a728ad95a5ae8ce3eb15839f3aa7852bb390706e7760e43a71291a2e3f827237deda851874c517665f545f27238df86557f375d09ccd8bd15d8ccf61f5d78ca5c7f5cde782e6bf5d0057056d4bad98b3d2f9575e824ab7a33ff57b0ac100ab0d6ead7aa0b50f6e4d3e5ec0b966b",
6192 	"815779a91b3a8bd049bf2aeb920142772222c9ca",
6193 	"05e0fdbdf6f756ef733185ccfa8ced2eb6d029d9d56e35561b5db8e70257ee6fd019d2f0bbf669fe9b9821e78df6d41e31608d58280f318ee34f559941c8df13287574bac000b7e58dc4f414ba49fb127f9d0f8936638c76e85356c994f79750f7fa3cf4fd482df75e3fb9978cd061f7abb17572e6e63e0bde12cbdcf18c68b979",
6194 
6195 	"328c659e0a6437433cceb73c14",
6196 	"9aec4a7480d5bbc42920d7ca235db674989c9aac",
6197 	"0bc989853bc2ea86873271ce183a923ab65e8a53100e6df5d87a24c4194eb797813ee2a187c097dd872d591da60c568605dd7e742d5af4e33b11678ccb63903204a3d080b0902c89aba8868f009c0f1c0cb85810bbdd29121abb8471ff2d39e49fd92d56c655c8e037ad18fafbdc92c95863f7f61ea9efa28fea401369d19daea1",
6198 
6199 	"f37b962379a47d415a376eec8973150bcb34edd5ab654041b61430560c2144582ba133c867d852d6b8e23321901302ecb45b09ec88b1527178fa043263f3067d9ffe973032a99f4cb08ad2c7e0a2456cdd57a7df56fe6053527a5aeb67d7e552063c1ca97b1beffa7b39e997caf27878ea0f62cbebc8c21df4c889a202851e949088490c249b6e9acf1d8063f5be2343989bf95c4da01a2be78b4ab6b378015bc37957f76948b5e58e440c28453d40d7cfd57e7d690600474ab5e75973b1ea0c5f1e45d14190afe2f4eb6d3bdf71f1d2f8bb156a1c295d04aaeb9d689dce79ed62bc443e",
6200 	"e20c1e9878512c39970f58375e1549a68b64f31d",
6201 	"0aefa943b698b9609edf898ad22744ac28dc239497cea369cbbd84f65c95c0ad776b594740164b59a739c6ff7c2f07c7c077a86d95238fe51e1fcf33574a4ae0684b42a3f6bf677d91820ca89874467b2c23add77969c80717430d0efc1d3695892ce855cb7f7011630f4df26def8ddf36fc23905f57fa6243a485c770d5681fcd",
6202 
6203 	"c6103c330c1ef718c141e47b8fa859be4d5b96259e7d142070ecd485839dba5a8369c17c1114035e532d195c74f44a0476a2d3e8a4da210016caced0e367cb867710a4b5aa2df2b8e5daf5fdc647807d4d5ebb6c56b9763ccdae4dea3308eb0ac2a89501cb209d2639fa5bf87ce790747d3cb2d295e84564f2f637824f0c13028129b0aa4a422d162282",
6204 	"23291e4a3307e8bbb776623ab34e4a5f4cc8a8db",
6205 	"02802dccfa8dfaf5279bf0b4a29ba1b157611faeaaf419b8919d15941900c1339e7e92e6fae562c53e6cc8e84104b110bce03ad18525e3c49a0eadad5d3f28f244a8ed89edbafbb686277cfa8ae909714d6b28f4bf8e293aa04c41efe7c0a81266d5c061e2575be032aa464674ff71626219bd74cc45f0e7ed4e3ff96eee758e8f",
6206 
6207 	/* 1029-bit key */
6208 	"164ca31cff609f3a0e7101b039f2e4fe6dd37519ab98598d179e174996598071f47d3a04559158d7be373cf1aa53f0aa6ef09039e5678c2a4c63900514c8c4f8aaed5de12a5f10b09c311af8c0ffb5b7a297f2efc63b8d6b0510931f0b98e48bf5fc6ec4e7b8db1ffaeb08c38e02adb8f03a48229c99e969431f61cb8c4dc698d1",
6209 	"010001",
6210 	"03b664ee3b7566723fc6eaf28abb430a3980f1126c81de8ad709eab39ac9dcd0b1550b3729d87068e952009df544534c1f50829a78f4591eb8fd57140426a6bb0405b6a6f51a57d9267b7bbc653391a699a2a90dac8ae226bcc60fa8cd934c73c7b03b1f6b818158631838a8612e6e6ea92be24f8324faf5b1fd8587225267ba6f",
6211 	"04f0548c9626ab1ebf1244934741d99a06220efa2a5856aa0e75730b2ec96adc86be894fa2803b53a5e85d276acbd29ab823f80a7391bb54a5051672fb04eeb543",
6212 	"0483e0ae47915587743ff345362b555d3962d98bb6f15f848b4c92b1771ca8ed107d8d3ee65ec44517dd0faa481a387e902f7a2e747c269e7ea44480bc538b8e5b",
6213 	"03a8e8aea9920c1aa3b2f0d846e4b850d81ca306a51c83544f949f64f90dcf3f8e2661f07e561220a180388fbe273e70e2e5dca83a0e1348dd6490c731d6ece1ab",
6214 	"0135bdcdb60bf2197c436ed34b32cd8b4fc77778832ba76703551fb242b301699593af77fd8fc394a8526ad23cc41a03806bd897fe4b0ea646558aaddcc99e8a25",
6215 	"0304c03d9c736503a984abbd9ba22301407c4a2ab1dd85766481b60d45401152e692be14f4121d9aa3fd6e0b4d1d3a973538a31d42ee6e1e5ef620231a2bbaf35f",
6216 
6217 	"0a20b774addc2fa51245ed7cb9da609e50cac6636a52543f97458eed7340f8d53ffc64918f949078ee03ef60d42b5fec246050bd5505cd8cb597bad3c4e713b0ef30644e76adabb0de01a1561efb255158c74fc801e6e919e581b46f0f0ddd08e4f34c7810b5ed8318f91d7c8c",
6218 	"5b4ea2ef629cc22f3b538e016904b47b1e40bfd5",
6219 	"04c0cfacec04e5badbece159a5a1103f69b3f32ba593cb4cc4b1b7ab455916a96a27cd2678ea0f46ba37f7fc9c86325f29733b389f1d97f43e7201c0f348fc45fe42892335362eee018b5b161f2f9393031225c713012a576bc88e23052489868d9010cbf033ecc568e8bc152bdc59d560e41291915d28565208e22aeec9ef85d1",
6220 
6221 	"2aaff6631f621ce615760a9ebce94bb333077ad86488c861d4b76d29c1f48746c611ae1e03ced4445d7cfa1fe5f62e1b3f08452bde3b6ef81973bafbb57f97bceef873985395b8260589aa88cb7db50ab469262e551bdcd9a56f275a0ac4fe484700c35f3dbf2b469ede864741b86fa59172a360ba95a02e139be50ddfb7cf0b42faeabbfbbaa86a4497699c4f2dfd5b08406af7e14144427c253ec0efa20eaf9a8be8cd49ce1f1bc4e93e619cf2aa8ed4fb39bc8590d0f7b96488f7317ac9abf7bee4e3a0e715",
6222 	"83146a9e782722c28b014f98b4267bda2ac9504f",
6223 	"0a2314250cf52b6e4e908de5b35646bcaa24361da8160fb0f9257590ab3ace42b0dc3e77ad2db7c203a20bd952fbb56b1567046ecfaa933d7b1000c3de9ff05b7d989ba46fd43bc4c2d0a3986b7ffa13471d37eb5b47d64707bd290cfd6a9f393ad08ec1e3bd71bb5792615035cdaf2d8929aed3be098379377e777ce79aaa4773",
6224 
6225 	"0f6195d04a6e6fc7e2c9600dbf840c39ea8d4d624fd53507016b0e26858a5e0aecd7ada543ae5c0ab3a62599cba0a54e6bf446e262f989978f9ddf5e9a41",
6226 	"a87b8aed07d7b8e2daf14ddca4ac68c4d0aabff8",
6227 	"086df6b500098c120f24ff8423f727d9c61a5c9007d3b6a31ce7cf8f3cbec1a26bb20e2bd4a046793299e03e37a21b40194fb045f90b18bf20a47992ccd799cf9c059c299c0526854954aade8a6ad9d97ec91a1145383f42468b231f4d72f23706d9853c3fa43ce8ace8bfe7484987a1ec6a16c8daf81f7c8bf42774707a9df456",
6228 
6229 	"337d25fe9810ebca0de4d4658d3ceb8e0fe4c066aba3bcc48b105d3bf7e0257d44fecea6596f4d0c59a08402833678f70620f9138dfeb7ded905e4a6d5f05c473d55936652e2a5df43c0cfda7bacaf3087f4524b06cf42157d01539739f7fddec9d58125df31a32eab06c19b71f1d5bf",
6230 	"a37932f8a7494a942d6f767438e724d6d0c0ef18",
6231 	"0b5b11ad549863ffa9c51a14a1106c2a72cc8b646e5c7262509786105a984776534ca9b54c1cc64bf2d5a44fd7e8a69db699d5ea52087a4748fd2abc1afed1e5d6f7c89025530bdaa2213d7e030fa55df6f34bcf1ce46d2edf4e3ae4f3b01891a068c9e3a44bbc43133edad6ecb9f35400c4252a5762d65744b99cb9f4c559329f",
6232 
6233 	"84ec502b072e8287789d8f9235829ea3b187afd4d4c785611bda5f9eb3cb96717efa7007227f1c08cbcb972e667235e0fb7d431a6570326d2ecce35adb373dc753b3be5f829b89175493193fab16badb41371b3aac0ae670076f24bef420c135add7cee8d35fbc944d79fafb9e307a13b0f556cb654a06f973ed22672330197ef5a748bf826a5db2383a25364b686b9372bb2339aeb1ac9e9889327d016f1670776db06201adbdcaf8a5e3b74e108b73",
6234 	"7b790c1d62f7b84e94df6af28917cf571018110e",
6235 	"02d71fa9b53e4654fefb7f08385cf6b0ae3a817942ebf66c35ac67f0b069952a3ce9c7e1f1b02e480a9500836de5d64cdb7ecde04542f7a79988787e24c2ba05f5fd482c023ed5c30e04839dc44bed2a3a3a4fee01113c891a47d32eb8025c28cb050b5cdb576c70fe76ef523405c08417faf350b037a43c379339fcb18d3a356b",
6236 
6237 	"9906d89f97a9fdedd3ccd824db687326f30f00aa25a7fca2afcb3b0f86cd41e73f0e8ff7d2d83f59e28ed31a5a0d551523374de22e4c7e8ff568b386ee3dc41163f10bf67bb006261c9082f9af90bf1d9049a6b9fae71c7f84fbe6e55f02789de774f230f115026a4b4e96c55b04a95da3aacbb2cece8f81764a1f1c99515411087cf7d34aeded0932c183",
6238 	"fbbe059025b69b89fb14ae2289e7aaafe60c0fcd",
6239 	"0a40a16e2fe2b38d1df90546167cf9469c9e3c3681a3442b4b2c2f581deb385ce99fc6188bb02a841d56e76d301891e24560550fcc2a26b55f4ccb26d837d350a154bcaca8392d98fa67959e9727b78cad03269f56968fc56b68bd679926d83cc9cb215550645ccda31c760ff35888943d2d8a1d351e81e5d07b86182e751081ef",
6240 
6241 	/* 1030-bit key */
6242 	"37c9da4a66c8c408b8da27d0c9d79f8ccb1eafc1d2fe48746d940b7c4ef5dee18ad12647cefaa0c4b3188b221c515386759b93f02024b25ab9242f8357d8f3fd49640ee5e643eaf6c64deefa7089727c8ff03993333915c6ef21bf5975b6e50d118b51008ec33e9f01a0a545a10a836a43ddbca9d8b5c5d3548022d7064ea29ab3",
6243 	"010001",
6244 	"3bed999052d957bc06d651eef6e3a98094b1621bd38b5449bd6c4aea3de7e084679a4484ded25be0f0826cf3377825414b14d4d61db14de626fbb80e5f4faec956f9a0a2d24f99576380f084eb62e46a57d554278b535626193ce02060575eb66c5798d36f6c5d40fb00d809b42a73102c1c74ee95bd71420fffef6318b52c29",
6245 	"07eefb424b0e3a40e4208ee5afb280b22317308114dde0b4b64f730184ec68da6ce2867a9f48ed7726d5e2614ed04a5410736c8c714ee702474298c6292af07535",
6246 	"070830dbf947eac0228de26314b59b66994cc60e8360e75d3876298f8f8a7d141da064e5ca026a973e28f254738cee669c721b034cb5f8e244dadd7cd1e159d547",
6247 	"0524d20c3d95cff75af2313483227d8702717aa576de155f960515501adb1d70e1c04de91b75b161dbf0398356127ededa7bbc19a32dc1621cc9f53c265d0ce331",
6248 	"05f984a1f23c938d6a0e89724bcf3dd93f9946926037fe7c6b13a29e5284855f89089591d440975627bf5c9e3a8b5ca79c772ad273e40d321af4a6c97dfded78d3",
6249 	"ddd918adada29dcab981ff9acba4257023c09a3801ccce098ce268f855d0df570cd6e7b9b14bd9a5a9254cbc315be6f8ba1e2546ddd569c5ea19eed8353bde5e",
6250 
6251 	"9ead0e01945640674eb41cad435e2374eaefa8ad7197d97913c44957d8d83f40d76ee60e39bf9c0f9eaf3021421a074d1ade962c6e9d3dc3bb174fe4dfe652b09115495b8fd2794174020a0602b5ca51848cfc96ce5eb57fc0a2adc1dda36a7cc452641a14911b37e45bfa11daa5c7ecdb74f6d0100d1d3e39e752800e203397de0233077b9a88855537fae927f924380d780f98e18dcff39c5ea741b17d6fdd1885bc9d581482d771ceb562d78a8bf88f0c75b11363e5e36cd479ceb0545f9da84203e0e6e508375cc9e844b88b7ac7a0a201ea0f1bee9a2c577920ca02c01b9d8320e974a56f4efb5763b96255abbf8037bf1802cf018f56379493e569a9",
6252 	"b7867a59958cb54328f8775e6546ec06d27eaa50",
6253 	"187f390723c8902591f0154bae6d4ecbffe067f0e8b795476ea4f4d51ccc810520bb3ca9bca7d0b1f2ea8a17d873fa27570acd642e3808561cb9e975ccfd80b23dc5771cdb3306a5f23159dacbd3aa2db93d46d766e09ed15d900ad897a8d274dc26b47e994a27e97e2268a766533ae4b5e42a2fcaf755c1c4794b294c60555823",
6254 
6255 	"8d80d2d08dbd19c154df3f14673a14bd03735231f24e86bf153d0e69e74cbff7b1836e664de83f680124370fc0f96c9b65c07a366b644c4ab3",
6256 	"0c09582266df086310821ba7e18df64dfee6de09",
6257 	"10fd89768a60a67788abb5856a787c8561f3edcf9a83e898f7dc87ab8cce79429b43e56906941a886194f137e591fe7c339555361fbbe1f24feb2d4bcdb80601f3096bc9132deea60ae13082f44f9ad41cd628936a4d51176e42fc59cb76db815ce5ab4db99a104aafea68f5d330329ebf258d4ede16064bd1d00393d5e1570eb8",
6258 
6259 	"808405cdfc1a58b9bb0397c720722a81fffb76278f335917ef9c473814b3e016ba2973cd2765f8f3f82d6cc38aa7f8551827fe8d1e3884b7e61c94683b8f82f1843bdae2257eeec9812ad4c2cf283c34e0b0ae0fe3cb990cf88f2ef9",
6260 	"28039dcfe106d3b8296611258c4a56651c9e92dd",
6261 	"2b31fde99859b977aa09586d8e274662b25a2a640640b457f594051cb1e7f7a911865455242926cf88fe80dfa3a75ba9689844a11e634a82b075afbd69c12a0df9d25f84ad4945df3dc8fe90c3cefdf26e95f0534304b5bdba20d3e5640a2ebfb898aac35ae40f26fce5563c2f9f24f3042af76f3c7072d687bbfb959a88460af1",
6262 
6263 	"f337b9bad937de22a1a052dff11134a8ce26976202981939b91e0715ae5e609649da1adfcef3f4cca59b238360e7d1e496c7bf4b204b5acff9bbd6166a1d87a36ef2247373751039f8a800b8399807b3a85f44893497c0d05fb7017b82228152de6f25e6116dcc7503c786c875c28f3aa607e94ab0f19863ab1b5073770b0cd5f533acde30c6fb953cf3da680264e30fc11bff9a19bffab4779b6223c3fb3fe0f71abade4eb7c09c41e24c22d23fa148e6a173feb63984d1bc6ee3a02d915b752ceaf92a3015eceb38ca586c6801b37c34cefb2cff25ea23c08662dcab26a7a93a285d05d3044c",
6264 	"a77821ebbbef24628e4e12e1d0ea96de398f7b0f",
6265 	"32c7ca38ff26949a15000c4ba04b2b13b35a3810e568184d7ecabaa166b7ffabddf2b6cf4ba07124923790f2e5b1a5be040aea36fe132ec130e1f10567982d17ac3e89b8d26c3094034e762d2e031264f01170beecb3d1439e05846f25458367a7d9c02060444672671e64e877864559ca19b2074d588a281b5804d23772fbbe19",
6266 
6267 	"45013cebafd960b255476a8e2598b9aa32efbe6dc1f34f4a498d8cf5a2b4548d08c55d5f95f7bcc9619163056f2d58b52fa032",
6268 	"9d5ad8eb452134b65dc3a98b6a73b5f741609cd6",
6269 	"07eb651d75f1b52bc263b2e198336e99fbebc4f332049a922a10815607ee2d989db3a4495b7dccd38f58a211fb7e193171a3d891132437ebca44f318b280509e52b5fa98fcce8205d9697c8ee4b7ff59d4c59c79038a1970bd2a0d451ecdc5ef11d9979c9d35f8c70a6163717607890d586a7c6dc01c79f86a8f28e85235f8c2f1",
6270 
6271 	"2358097086c899323e75d9c90d0c09f12d9d54edfbdf70a9c2eb5a04d8f36b9b2bdf2aabe0a5bda1968937f9d6ebd3b6b257efb3136d4131f9acb59b85e2602c2a3fcdc835494a1f4e5ec18b226c80232b36a75a45fdf09a7ea9e98efbde1450d1194bf12e15a4c5f9eb5c0bce5269e0c3b28cfab655d81a61a20b4be2f54459bb25a0db94c52218be109a7426de83014424789aaa90e5056e632a698115e282c1a56410f26c2072f193481a9dcd880572005e64f4082ecf",
6272 	"3f2efc595880a7d47fcf3cba04983ea54c4b73fb",
6273 	"18da3cdcfe79bfb77fd9c32f377ad399146f0a8e810620233271a6e3ed3248903f5cdc92dc79b55d3e11615aa056a795853792a3998c349ca5c457e8ca7d29d796aa24f83491709befcfb1510ea513c92829a3f00b104f655634f320752e130ec0ccf6754ff893db302932bb025eb60e87822598fc619e0e981737a9a4c4152d33",
6274 
6275 	/* 1031-bit key */
6276 	"495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f778a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e582de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a2b8efab0561b0810344739ada0733f",
6277 	"010001",
6278 	"6c66ffe98980c38fcdeab5159898836165f4b4b817c4f6a8d486ee4ea9130fe9b9092bd136d184f95f504a607eac565846d2fdd6597a8967c7396ef95a6eeebb4578a643966dca4d8ee3de842de63279c618159c1ab54a89437b6a6120e4930afb52a4ba6ced8a4947ac64b30a3497cbe701c2d6266d517219ad0ec6d347dbe9",
6279 	"08dad7f11363faa623d5d6d5e8a319328d82190d7127d2846c439b0ab72619b0a43a95320e4ec34fc3a9cea876422305bd76c5ba7be9e2f410c8060645a1d29edb",
6280 	"0847e732376fc7900f898ea82eb2b0fc418565fdae62f7d9ec4ce2217b97990dd272db157f99f63c0dcbb9fbacdbd4c4dadb6df67756358ca4174825b48f49706d",
6281 	"05c2a83c124b3621a2aa57ea2c3efe035eff4560f33ddebb7adab81fce69a0c8c2edc16520dda83d59a23be867963ac65f2cc710bbcfb96ee103deb771d105fd85",
6282 	"04cae8aa0d9faa165c87b682ec140b8ed3b50b24594b7a3b2c220b3669bb819f984f55310a1ae7823651d4a02e99447972595139363434e5e30a7e7d241551e1b9",
6283 	"07d3e47bf686600b11ac283ce88dbb3f6051e8efd04680e44c171ef531b80b2b7c39fc766320e2cf15d8d99820e96ff30dc69691839c4b40d7b06e45307dc91f3f",
6284 
6285 	"81332f4be62948415ea1d899792eeacf6c6e1db1da8be13b5cea41db2fed467092e1ff398914c714259775f595f8547f735692a575e6923af78f22c6997ddb90fb6f72d7bb0dd5744a31decd3dc3685849836ed34aec596304ad11843c4f88489f209735f5fb7fdaf7cec8addc5818168f880acbf490d51005b7a8e84e43e54287977571dd99eea4b161eb2df1f5108f12a4142a83322edb05a75487a3435c9a78ce53ed93bc550857d7a9fb",
6286 	"1d65491d79c864b373009be6f6f2467bac4c78fa",
6287 	"0262ac254bfa77f3c1aca22c5179f8f040422b3c5bafd40a8f21cf0fa5a667ccd5993d42dbafb409c520e25fce2b1ee1e716577f1efa17f3da28052f40f0419b23106d7845aaf01125b698e7a4dfe92d3967bb00c4d0d35ba3552ab9a8b3eef07c7fecdbc5424ac4db1e20cb37d0b2744769940ea907e17fbbca673b20522380c5",
6288 
6289 	"e2f96eaf0e05e7ba326ecca0ba7fd2f7c02356f3cede9d0faabf4fcc8e60a973e5595fd9ea08",
6290 	"435c098aa9909eb2377f1248b091b68987ff1838",
6291 	"2707b9ad5115c58c94e932e8ec0a280f56339e44a1b58d4ddcff2f312e5f34dcfe39e89c6a94dcee86dbbdae5b79ba4e0819a9e7bfd9d982e7ee6c86ee68396e8b3a14c9c8f34b178eb741f9d3f121109bf5c8172fada2e768f9ea1433032c004a8aa07eb990000a48dc94c8bac8aabe2b09b1aa46c0a2aa0e12f63fbba775ba7e",
6292 
6293 	"e35c6ed98f64a6d5a648fcab8adb16331db32e5d15c74a40edf94c3dc4a4de792d190889f20f1e24ed12054a6b28798fcb42d1c548769b734c96373142092aed277603f4738df4dc1446586d0ec64da4fb60536db2ae17fc7e3c04bbfbbbd907bf117c08636fa16f95f51a6216934d3e34f85030f17bbbc5ba69144058aff081e0b19cf03c17195c5e888ba58f6fe0a02e5c3bda9719a7",
6294 	"c6ebbe76df0c4aea32c474175b2f136862d04529",
6295 	"2ad20509d78cf26d1b6c406146086e4b0c91a91c2bd164c87b966b8faa42aa0ca446022323ba4b1a1b89706d7f4c3be57d7b69702d168ab5955ee290356b8c4a29ed467d547ec23cbadf286ccb5863c6679da467fc9324a151c7ec55aac6db4084f82726825cfe1aa421bc64049fb42f23148f9c25b2dc300437c38d428aa75f96",
6296 
6297 	"dbc5f750a7a14be2b93e838d18d14a8695e52e8add9c0ac733b8f56d2747e529a0cca532dd49b902aefed514447f9e81d16195c2853868cb9b30f7d0d495c69d01b5c5d50b27045db3866c2324a44a110b1717746de457d1c8c45c3cd2a92970c3d59632055d4c98a41d6e99e2a3ddd5f7f9979ab3cd18f37505d25141de2a1bff17b3a7dce9419ecc385cf11d72840f19953fd0509251f6cafde2893d0e75c781ba7a5012ca401a4fa99e04b3c3249f926d5afe82cc87dab22c3c1b105de48e34ace9c9124e59597ac7ebf8",
6298 	"021fdcc6ebb5e19b1cb16e9c67f27681657fe20a",
6299 	"1e24e6e58628e5175044a9eb6d837d48af1260b0520e87327de7897ee4d5b9f0df0be3e09ed4dea8c1454ff3423bb08e1793245a9df8bf6ab3968c8eddc3b5328571c77f091cc578576912dfebd164b9de5454fe0be1c1f6385b328360ce67ec7a05f6e30eb45c17c48ac70041d2cab67f0a2ae7aafdcc8d245ea3442a6300ccc7",
6300 
6301 	"04dc251be72e88e5723485b6383a637e2fefe07660c519a560b8bc18bdedb86eae2364ea53ba9dca6eb3d2e7d6b806af42b3e87f291b4a8881d5bf572cc9a85e19c86acb28f098f9da0383c566d3c0f58cfd8f395dcf602e5cd40e8c7183f714996e2297ef",
6302 	"c558d7167cbb4508ada042971e71b1377eea4269",
6303 	"33341ba3576a130a50e2a5cf8679224388d5693f5accc235ac95add68e5eb1eec31666d0ca7a1cda6f70a1aa762c05752a51950cdb8af3c5379f18cfe6b5bc55a4648226a15e912ef19ad77adeea911d67cfefd69ba43fa4119135ff642117ba985a7e0100325e9519f1ca6a9216bda055b5785015291125e90dcd07a2ca9673ee",
6304 
6305 	"0ea37df9a6fea4a8b610373c24cf390c20fa6e2135c400c8a34f5c183a7e8ea4c9ae090ed31759f42dc77719cca400ecdcc517acfc7ac6902675b2ef30c509665f3321482fc69a9fb570d15e01c845d0d8e50d2a24cbf1cf0e714975a5db7b18d9e9e9cb91b5cb16869060ed18b7b56245503f0caf90352b8de81cb5a1d9c6336092f0cd",
6306 	"76fd4e64fdc98eb927a0403e35a084e76ba9f92a",
6307 	"1ed1d848fb1edb44129bd9b354795af97a069a7a00d0151048593e0c72c3517ff9ff2a41d0cb5a0ac860d736a199704f7cb6a53986a88bbd8abcc0076a2ce847880031525d449da2ac78356374c536e343faa7cba42a5aaa6506087791c06a8e989335aed19bfab2d5e67e27fb0c2875af896c21b6e8e7309d04e4f6727e69463e",
6308 
6309 	/* 1536-bit key */
6310 	"e6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd06c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee315ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddbc2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8de3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6fd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b",
6311 	"010001",
6312 	"6a7fd84fb85fad073b34406db74f8d61a6abc12196a961dd79565e9da6e5187bce2d980250f7359575359270d91590bb0e427c71460b55d51410b191bcf309fea131a92c8e702738fa719f1e0041f52e40e91f229f4d96a1e6f172e15596b4510a6daec26105f2bebc53316b87bdf21311666070e8dfee69d52c71a976caae79c72b68d28580dc686d9f5129d225f82b3d615513a882b3db91416b48ce08888213e37eeb9af800d81cab328ce420689903c00c7b5fd31b75503a6d419684d629",
6313 	"f8eb97e98df12664eefdb761596a69ddcd0e76daece6ed4bf5a1b50ac086f7928a4d2f8726a77e515b74da41988f220b1cc87aa1fc810ce99a82f2d1ce821edced794c6941f42c7a1a0b8c4d28c75ec60b652279f6154a762aed165d47dee367",
6314 	"ed4d71d0a6e24b93c2e5f6b4bbe05f5fb0afa042d204fe3378d365c2f288b6a8dad7efe45d153eef40cacc7b81ff934002d108994b94a5e4728cd9c963375ae49965bda55cbf0efed8d6553b4027f2d86208a6e6b489c176128092d629e49d3d",
6315 	"2bb68bddfb0c4f56c8558bffaf892d8043037841e7fa81cfa61a38c5e39b901c8ee71122a5da2227bd6cdeeb481452c12ad3d61d5e4f776a0ab556591befe3e59e5a7fddb8345e1f2f35b9f4cee57c32414c086aec993e9353e480d9eec6289f",
6316 	"4ff897709fad079746494578e70fd8546130eeab5627c49b080f05ee4ad9f3e4b7cba9d6a5dff113a41c3409336833f190816d8a6bc42e9bec56b7567d0f3c9c696db619b245d901dd856db7c8092e77e9a1cccd56ee4dba42c5fdb61aec2669",
6317 	"77b9d1137b50404a982729316efafc7dfe66d34e5a182600d5f30a0a8512051c560d081d4d0a1835ec3d25a60f4e4d6aa948b2bf3dbb5b124cbbc3489255a3a948372f6978496745f943e1db4f18382ceaa505dfc65757bb3f857a58dce52156",
6318 
6319 	"a88e265855e9d7ca36c68795f0b31b591cd6587c71d060a0b3f7f3eaef43795922028bc2b6ad467cfc2d7f659c5385aa70ba3672cdde4cfe4970cc7904601b278872bf51321c4a972f3c95570f3445d4f57980e0f20df54846e6a52c668f1288c03f95006ea32f562d40d52af9feb32f0fa06db65b588a237b34e592d55cf979f903a642ef64d2ed542aa8c77dc1dd762f45a59303ed75e541ca271e2b60ca709e44fa0661131e8d5d4163fd8d398566ce26de8730e72f9cca737641c244159420637028df0a18079d6208ea8b4711a2c750f5",
6320 	"c0a425313df8d7564bd2434d311523d5257eed80",
6321 	"586107226c3ce013a7c8f04d1a6a2959bb4b8e205ba43a27b50f124111bc35ef589b039f5932187cb696d7d9a32c0c38300a5cdda4834b62d2eb240af33f79d13dfbf095bf599e0d9686948c1964747b67e89c9aba5cd85016236f566cc5802cb13ead51bc7ca6bef3b94dcbdbb1d570469771df0e00b1a8a06777472d2316279edae86474668d4e1efff95f1de61c6020da32ae92bbf16520fef3cf4d88f61121f24bbd9fe91b59caf1235b2a93ff81fc403addf4ebdea84934a9cdaf8e1a9e",
6322 
6323 	"c8c9c6af04acda414d227ef23e0820c3732c500dc87275e95b0d095413993c2658bc1d988581ba879c2d201f14cb88ced153a01969a7bf0a7be79c84c1486bc12b3fa6c59871b6827c8ce253ca5fefa8a8c690bf326e8e37cdb96d90a82ebab69f86350e1822e8bd536a2e",
6324 	"b307c43b4850a8dac2f15f32e37839ef8c5c0e91",
6325 	"80b6d643255209f0a456763897ac9ed259d459b49c2887e5882ecb4434cfd66dd7e1699375381e51cd7f554f2c271704b399d42b4be2540a0eca61951f55267f7c2878c122842dadb28b01bd5f8c025f7e228418a673c03d6bc0c736d0a29546bd67f786d9d692ccea778d71d98c2063b7a71092187a4d35af108111d83e83eae46c46aa34277e06044589903788f1d5e7cee25fb485e92949118814d6f2c3ee361489016f327fb5bc517eb50470bffa1afa5f4ce9aa0ce5b8ee19bf5501b958",
6326 
6327 	"0afad42ccd4fc60654a55002d228f52a4a5fe03b8bbb08ca82daca558b44dbe1266e50c0e745a36d9d2904e3408abcd1fd569994063f4a75cc72f2fee2a0cd893a43af1c5b8b487df0a71610024e4f6ddf9f28ad0813c1aab91bcb3c9064d5ff742deffea657094139369e5ea6f4a96319a5cc8224145b545062758fefd1fe3409ae169259c6cdfd6b5f2958e314faecbe69d2cace58ee55179ab9b3e6d1ecc14a557c5febe988595264fc5da1c571462eca798a18a1a4940cdab4a3e92009ccd42e1e947b1314e32238a2dece7d23a89b5b30c751fd0a4a430d2c548594",
6328 	"9a2b007e80978bbb192c354eb7da9aedfc74dbf5",
6329 	"484408f3898cd5f53483f80819efbf2708c34d27a8b2a6fae8b322f9240237f981817aca1846f1084daa6d7c0795f6e5bf1af59c38e1858437ce1f7ec419b98c8736adf6dd9a00b1806d2bd3ad0a73775e05f52dfef3a59ab4b08143f0df05cd1ad9d04bececa6daa4a2129803e200cbc77787caf4c1d0663a6c5987b605952019782caf2ec1426d68fb94ed1d4be816a7ed081b77e6ab330b3ffc073820fecde3727fcbe295ee61a050a343658637c3fd659cfb63736de32d9f90d3c2f63eca",
6330 
6331 	"1dfd43b46c93db82629bdae2bd0a12b882ea04c3b465f5cf93023f01059626dbbe99f26bb1be949dddd16dc7f3debb19a194627f0b224434df7d8700e9e98b06e360c12fdbe3d19f51c9684eb9089ecbb0a2f0450399d3f59eac7294085d044f5393c6ce737423d8b86c415370d389e30b9f0a3c02d25d0082e8ad6f3f1ef24a45c3cf82b383367063a4d4613e4264f01b2dac2e5aa42043f8fb5f69fa871d14fb273e767a531c40f02f343bc2fb45a0c7e0f6be2561923a77211d66a6e2dbb43c366350beae22da3ac2c1f5077096fcb5c4bf255f7574351ae0b1e1f03632817c0856d4a8ba97afbdc8b85855402bc56926fcec209f9ea8",
6332 	"70f382bddf4d5d2dd88b3bc7b7308be632b84045",
6333 	"84ebeb481be59845b46468bafb471c0112e02b235d84b5d911cbd1926ee5074ae0424495cb20e82308b8ebb65f419a03fb40e72b78981d88aad143053685172c97b29c8b7bf0ae73b5b2263c403da0ed2f80ff7450af7828eb8b86f0028bd2a8b176a4d228cccea18394f238b09ff758cc00bc04301152355742f282b54e663a919e709d8da24ade5500a7b9aa50226e0ca52923e6c2d860ec50ff480fa57477e82b0565f4379f79c772d5c2da80af9fbf325ece6fc20b00961614bee89a183e",
6334 
6335 	"1bdc6e7c98fb8cf54e9b097b66a831e9cfe52d9d4888448ee4b0978093ba1d7d73ae78b3a62ba4ad95cd289ccb9e005226bb3d178bccaa821fb044a4e21ee97696c14d0678c94c2dae93b0ad73922218553daa7e44ebe57725a7a45cc72b9b2138a6b17c8db411ce8279ee1241aff0a8bec6f77f87edb0c69cb27236e3435a800b192e4f11e519e3fe30fc30eaccca4fbb41769029bf708e817a9e683805be67fa100984683b74838e3bcffa79366eed1d481c76729118838f31ba8a048a93c1be4424598e8df6328b7a77880a3f9c7e2e8dfca8eb5a26fb86bdc556d42bbe01d9fa6ed80646491c9341",
6336 	"d689257a86effa68212c5e0c619eca295fb91b67",
6337 	"82102df8cb91e7179919a04d26d335d64fbc2f872c44833943241de8454810274cdf3db5f42d423db152af7135f701420e39b494a67cbfd19f9119da233a23da5c6439b5ba0d2bc373eee3507001378d4a4073856b7fe2aba0b5ee93b27f4afec7d4d120921c83f606765b02c19e4d6a1a3b95fa4c422951be4f52131077ef17179729cddfbdb56950dbaceefe78cb16640a099ea56d24389eef10f8fecb31ba3ea3b227c0a86698bb89e3e9363905bf22777b2a3aa521b65b4cef76d83bde4c",
6338 
6339 	"88c7a9f1360401d90e53b101b61c5325c3c75db1b411fbeb8e830b75e96b56670ad245404e16793544ee354bc613a90cc9848715a73db5893e7f6d279815c0c1de83ef8e2956e3a56ed26a888d7a9cdcd042f4b16b7fa51ef1a0573662d16a302d0ec5b285d2e03ad96529c87b3d374db372d95b2443d061b6b1a350ba87807ed083afd1eb05c3f52f4eba5ed2227714fdb50b9d9d9dd6814f62f6272fcd5cdbce7a9ef797",
6340 	"c25f13bf67d081671a0481a1f1820d613bba2276",
6341 	"a7fdb0d259165ca2c88d00bbf1028a867d337699d061193b17a9648e14ccbbaadeacaacdec815e7571294ebb8a117af205fa078b47b0712c199e3ad05135c504c24b81705115740802487992ffd511d4afc6b854491eb3f0dd523139542ff15c3101ee85543517c6a3c79417c67e2dd9aa741e9a29b06dcb593c2336b3670ae3afbac7c3e76e215473e866e338ca244de00b62624d6b9426822ceae9f8cc460895f41250073fd45c5a1e7b425c204a423a699159f6903e710b37a7bb2bc8049f",
6342 
6343 	/* 2048-bit key */
6344 	"a5dd867ac4cb02f90b9457d48c14a770ef991c56c39c0ec65fd11afa8937cea57b9be7ac73b45c0017615b82d622e318753b6027c0fd157be12f8090fee2a7adcd0eef759f88ba4997c7a42d58c9aa12cb99ae001fe521c13bb5431445a8d5ae4f5e4c7e948ac227d3604071f20e577e905fbeb15dfaf06d1de5ae6253d63a6a2120b31a5da5dabc9550600e20f27d3739e2627925fea3cc509f21dff04e6eea4549c540d6809ff9307eede91fff58733d8385a237d6d3705a33e391900992070df7adf1357cf7e3700ce3667de83f17b8df1778db381dce09cb4ad058a511001a738198ee27cf55a13b754539906582ec8b174bd58d5d1f3d767c613721ae05",
6345 	"010001",
6346 	"2d2ff567b3fe74e06191b7fded6de112290c670692430d5969184047da234c9693deed1673ed429539c969d372c04d6b47e0f5b8cee0843e5c22835dbd3b05a0997984ae6058b11bc4907cbf67ed84fa9ae252dfb0d0cd49e618e35dfdfe59bca3ddd66c33cebbc77ad441aa695e13e324b518f01c60f5a85c994ad179f2a6b5fbe93402b11767be01bf073444d6ba1dd2bca5bd074d4a5fae3531ad1303d84b30d897318cbbba04e03c2e66de6d91f82f96ea1d4bb54a5aae102d594657f5c9789553512b296dea29d8023196357e3e3a6e958f39e3c2344038ea604b31edc6f0f7ff6e7181a57c92826a268f86768e96f878562fc71d85d69e448612f7048f",
6347 	"cfd50283feeeb97f6f08d73cbc7b3836f82bbcd499479f5e6f76fdfcb8b38c4f71dc9e88bd6a6f76371afd65d2af1862b32afb34a95f71b8b132043ffebe3a952baf7592448148c03f9c69b1d68e4ce5cf32c86baf46fed301ca1ab403069b32f456b91f71898ab081cd8c4252ef5271915c9794b8f295851da7510f99cb73eb",
6348 	"cc4e90d2a1b3a065d3b2d1f5a8fce31b544475664eab561d2971b99fb7bef844e8ec1f360b8c2ac8359692971ea6a38f723fcc211f5dbcb177a0fdac5164a1d4ff7fbb4e829986353cb983659a148cdd420c7d31ba3822ea90a32be46c030e8c17e1fa0ad37859e06b0aa6fa3b216d9cbe6c0e22339769c0a615913e5da719cf",
6349 	"1c2d1fc32f6bc4004fd85dfde0fbbf9a4c38f9c7c4e41dea1aa88234a201cd92f3b7da526583a98ad85bb360fb983b711e23449d561d1778d7a515486bcbf47b46c9e9e1a3a1f77000efbeb09a8afe47e5b857cda99cb16d7fff9b712e3bd60ca96d9c7973d616d46934a9c050281c004399ceff1db7dda78766a8a9b9cb0873",
6350 	"cb3b3c04caa58c60be7d9b2debb3e39643f4f57397be08236a1e9eafaa706536e71c3acfe01cc651f23c9e05858fee13bb6a8afc47df4edc9a4ba30bcecb73d0157852327ee789015c2e8dee7b9f05a0f31ac94eb6173164740c5c95147cd5f3b5ae2cb4a83787f01d8ab31f27c2d0eea2dd8a11ab906aba207c43c6ee125331",
6351 	"12f6b2cf1374a736fad05616050f96ab4b61d1177c7f9d525a29f3d180e77667e99d99abf0525d0758660f3752655b0f25b8df8431d9a8ff77c16c12a0a5122a9f0bf7cfd5a266a35c159f991208b90316ff444f3e0b6bd0e93b8a7a2448e957e3dda6cfcf2266b106013ac46808d3b3887b3b00344baac9530b4ce708fc32b6",
6352 
6353 	"883177e5126b9be2d9a9680327d5370c6f26861f5820c43da67a3ad609",
6354 	"04e215ee6ff934b9da70d7730c8734abfcecde89",
6355 	"82c2b160093b8aa3c0f7522b19f87354066c77847abf2a9fce542d0e84e920c5afb49ffdfdace16560ee94a1369601148ebad7a0e151cf16331791a5727d05f21e74e7eb811440206935d744765a15e79f015cb66c532c87a6a05961c8bfad741a9a6657022894393e7223739796c02a77455d0f555b0ec01ddf259b6207fd0fd57614cef1a5573baaff4ec00069951659b85f24300a25160ca8522dc6e6727e57d019d7e63629b8fe5e89e25cc15beb3a647577559299280b9b28f79b0409000be25bbd96408ba3b43cc486184dd1c8e62553fa1af4040f60663de7f5e49c04388e257f1ce89c95dab48a315d9b66b1b7628233876ff2385230d070d07e1666",
6356 
6357 	"dd670a01465868adc93f26131957a50c52fb777cdbaa30892c9e12361164ec13979d43048118e4445db87bee58dd987b3425d02071d8dbae80708b039dbb64dbd1de5657d9fed0c118a54143742e0ff3c87f74e45857647af3f79eb0a14c9d75ea9a1a04b7cf478a897a708fd988f48e801edb0b7039df8c23bb3c56f4e821ac",
6358 	"8b2bdd4b40faf545c778ddf9bc1a49cb57f9b71b",
6359 	"14ae35d9dd06ba92f7f3b897978aed7cd4bf5ff0b585a40bd46ce1b42cd2703053bb9044d64e813d8f96db2dd7007d10118f6f8f8496097ad75e1ff692341b2892ad55a633a1c55e7f0a0ad59a0e203a5b8278aec54dd8622e2831d87174f8caff43ee6c46445345d84a59659bfb92ecd4c818668695f34706f66828a89959637f2bf3e3251c24bdba4d4b7649da0022218b119c84e79a6527ec5b8a5f861c159952e23ec05e1e717346faefe8b1686825bd2b262fb2531066c0de09acde2e4231690728b5d85e115a2f6b92b79c25abc9bd9399ff8bcf825a52ea1f56ea76dd26f43baafa18bfa92a504cbd35699e26d1dcc5a2887385f3c63232f06f3244c3",
6360 
6361 	"48b2b6a57a63c84cea859d65c668284b08d96bdcaabe252db0e4a96cb1bac6019341db6fbefb8d106b0e90eda6bcc6c6262f37e7ea9c7e5d226bd7df85ec5e71efff2f54c5db577ff729ff91b842491de2741d0c631607df586b905b23b91af13da12304bf83eca8a73e871ff9db",
6362 	"4e96fc1b398f92b44671010c0dc3efd6e20c2d73",
6363 	"6e3e4d7b6b15d2fb46013b8900aa5bbb3939cf2c095717987042026ee62c74c54cffd5d7d57efbbf950a0f5c574fa09d3fc1c9f513b05b4ff50dd8df7edfa20102854c35e592180119a70ce5b085182aa02d9ea2aa90d1df03f2daae885ba2f5d05afdac97476f06b93b5bc94a1a80aa9116c4d615f333b098892b25fface266f5db5a5a3bcc10a824ed55aad35b727834fb8c07da28fcf416a5d9b2224f1f8b442b36f91e456fdea2d7cfe3367268de0307a4c74e924159ed33393d5e0655531c77327b89821bdedf880161c78cd4196b5419f7acc3f13e5ebf161b6e7c6724716ca33b85c2e25640192ac2859651d50bde7eb976e51cec828b98b6563b86bb",
6364 
6365 	"0b8777c7f839baf0a64bbbdbc5ce79755c57a205b845c174e2d2e90546a089c4e6ec8adffa23a7ea97bae6b65d782b82db5d2b5a56d22a29a05e7c4433e2b82a621abba90add05ce393fc48a840542451a",
6366 	"c7cd698d84b65128d8835e3a8b1eb0e01cb541ec",
6367 	"34047ff96c4dc0dc90b2d4ff59a1a361a4754b255d2ee0af7d8bf87c9bc9e7ddeede33934c63ca1c0e3d262cb145ef932a1f2c0a997aa6a34f8eaee7477d82ccf09095a6b8acad38d4eec9fb7eab7ad02da1d11d8e54c1825e55bf58c2a23234b902be124f9e9038a8f68fa45dab72f66e0945bf1d8bacc9044c6f07098c9fcec58a3aab100c805178155f030a124c450e5acbda47d0e4f10b80a23f803e774d023b0015c20b9f9bbe7c91296338d5ecb471cafb032007b67a60be5f69504a9f01abb3cb467b260e2bce860be8d95bf92c0c8e1496ed1e528593a4abb6df462dde8a0968dffe4683116857a232f5ebf6c85be238745ad0f38f767a5fdbf486fb",
6368 
6369 	"f1036e008e71e964dadc9219ed30e17f06b4b68a955c16b312b1eddf028b74976bed6b3f6a63d4e77859243c9cccdc98016523abb02483b35591c33aad81213bb7c7bb1a470aabc10d44256c4d4559d916",
6370 	"efa8bff96212b2f4a3f371a10d574152655f5dfb",
6371 	"7e0935ea18f4d6c1d17ce82eb2b3836c55b384589ce19dfe743363ac9948d1f346b7bfddfe92efd78adb21faefc89ade42b10f374003fe122e67429a1cb8cbd1f8d9014564c44d120116f4990f1a6e38774c194bd1b8213286b077b0499d2e7b3f434ab12289c556684deed78131934bb3dd6537236f7c6f3dcb09d476be07721e37e1ceed9b2f7b406887bd53157305e1c8b4f84d733bc1e186fe06cc59b6edb8f4bd7ffefdf4f7ba9cfb9d570689b5a1a4109a746a690893db3799255a0cb9215d2d1cd490590e952e8c8786aa0011265252470c041dfbc3eec7c3cbf71c24869d115c0cb4a956f56d530b80ab589acfefc690751ddf36e8d383f83cedd2cc",
6372 
6373 	"25f10895a87716c137450bb9519dfaa1f207faa942ea88abf71e9c17980085b555aebab76264ae2a3ab93c2d12981191ddac6fb5949eb36aee3c5da940f00752c916d94608fa7d97ba6a2915b688f20323d4e9d96801d89a72ab5892dc2117c07434fcf972e058cf8c41ca4b4ff554f7d5068ad3155fced0f3125bc04f9193378a8f5c4c3b8cb4dd6d1cc69d30ecca6eaa51e36a05730e9e342e855baf099defb8afd7",
6374 	"ad8b1523703646224b660b550885917ca2d1df28",
6375 	"6d3b5b87f67ea657af21f75441977d2180f91b2c5f692de82955696a686730d9b9778d970758ccb26071c2209ffbd6125be2e96ea81b67cb9b9308239fda17f7b2b64ecda096b6b935640a5a1cb42a9155b1c9ef7a633a02c59f0d6ee59b852c43b35029e73c940ff0410e8f114eed46bbd0fae165e42be2528a401c3b28fd818ef3232dca9f4d2a0f5166ec59c42396d6c11dbc1215a56fa17169db9575343ef34f9de32a49cdc3174922f229c23e18e45df9353119ec4319cedce7a17c64088c1f6f52be29634100b3919d38f3d1ed94e6891e66a73b8fb849f5874df59459e298c7bbce2eee782a195aa66fe2d0732b25e595f57d3e061b1fc3e4063bf98f",
6376 
6377 	NULL
6378 };
6379 
6380 static void
6381 test_RSA_PSS(const char *name,
6382 	br_rsa_pss_sign sign, br_rsa_pss_vrfy vrfy)
6383 {
6384 	size_t u;
6385 
6386 	printf("Test %s: ", name);
6387 	fflush(stdout);
6388 
6389 	u = 0;
6390 	while (KAT_RSA_PSS[u] != NULL) {
6391 		unsigned char n[512];
6392 		unsigned char e[8];
6393 		unsigned char d[512];
6394 		unsigned char p[256];
6395 		unsigned char q[256];
6396 		unsigned char dp[256];
6397 		unsigned char dq[256];
6398 		unsigned char iq[256];
6399 		br_rsa_public_key pk;
6400 		br_rsa_private_key sk;
6401 		size_t v;
6402 
6403 		pk.n = n;
6404 		pk.nlen = hextobin(n, KAT_RSA_PSS[u ++]);
6405 		pk.e = e;
6406 		pk.elen = hextobin(e, KAT_RSA_PSS[u ++]);
6407 
6408 		/*
6409 		 * 'd' is in the test vectors, but we don't use it.
6410 		 */
6411 		hextobin(d, KAT_RSA_PSS[u ++]);
6412 
6413 		for (v = 0; n[v] == 0; v ++);
6414 		sk.n_bitlen = BIT_LENGTH(n[v]) + ((pk.nlen - 1 - v) << 3);
6415 		sk.p = p;
6416 		sk.plen = hextobin(p, KAT_RSA_PSS[u ++]);
6417 		sk.q = q;
6418 		sk.qlen = hextobin(q, KAT_RSA_PSS[u ++]);
6419 		sk.dp = dp;
6420 		sk.dplen = hextobin(dp, KAT_RSA_PSS[u ++]);
6421 		sk.dq = dq;
6422 		sk.dqlen = hextobin(dq, KAT_RSA_PSS[u ++]);
6423 		sk.iq = iq;
6424 		sk.iqlen = hextobin(iq, KAT_RSA_PSS[u ++]);
6425 
6426 		for (v = 0; v < 6; v ++) {
6427 			unsigned char plain[512], salt[128], sig[512];
6428 			size_t plain_len, salt_len, sig_len;
6429 			rng_fake_ctx rng;
6430 			unsigned char hash[20], tmp[513];
6431 			br_sha1_context sc;
6432 
6433 			plain_len = hextobin(plain, KAT_RSA_PSS[u ++]);
6434 			salt_len = hextobin(salt, KAT_RSA_PSS[u ++]);
6435 			sig_len = hextobin(sig, KAT_RSA_PSS[u ++]);
6436 
6437 			br_sha1_init(&sc);
6438 			br_sha1_update(&sc, plain, plain_len);
6439 			br_sha1_out(&sc, hash);
6440 			rng_fake_init(&rng, NULL, salt, salt_len);
6441 
6442 			memset(tmp, 0, sizeof tmp);
6443 			if (sign(&rng.vtable,
6444 				&br_sha1_vtable, &br_sha1_vtable,
6445 				hash, salt_len, &sk, tmp) != 1)
6446 			{
6447 				fprintf(stderr, "signature failed\n");
6448 			}
6449 			if (rng.ptr != rng.len) {
6450 				fprintf(stderr, "salt not fully consumed\n");
6451 				exit(EXIT_FAILURE);
6452 			}
6453 			check_equals("KAT RSA/PSS sign", tmp, sig, sig_len);
6454 
6455 			if (vrfy(sig, sig_len,
6456 				&br_sha1_vtable, &br_sha1_vtable,
6457 				hash, salt_len, &pk) != 1)
6458 			{
6459 				fprintf(stderr, "verification failed\n");
6460 				exit(EXIT_FAILURE);
6461 			}
6462 
6463 			sig[sig_len >> 1] ^= 0x01;
6464 			if (vrfy(sig, sig_len,
6465 				&br_sha1_vtable, &br_sha1_vtable,
6466 				hash, salt_len, &pk) != 0)
6467 			{
6468 				fprintf(stderr,
6469 					"verification should have failed\n");
6470 				exit(EXIT_FAILURE);
6471 			}
6472 
6473 			printf(".");
6474 			fflush(stdout);
6475 		}
6476 	}
6477 
6478 	printf(" done.\n");
6479 	fflush(stdout);
6480 }
6481 
6482 /*
6483  * Test vectors from pkcs-1v2-1d2-vec.zip (originally from ftp.rsa.com).
6484  * There are ten RSA keys, and for each RSA key, there are 6 messages,
6485  * each with an explicit seed.
6486  *
6487  * Field order:
6488  *    modulus (n)
6489  *    public exponent (e)
6490  *    first factor (p)
6491  *    second factor (q)
6492  *    first private exponent (dp)
6493  *    second private exponent (dq)
6494  *    CRT coefficient (iq)
6495  *    cleartext 1
6496  *    seed 1 (20-byte random value)
6497  *    ciphertext 1
6498  *    cleartext 2
6499  *    seed 2 (20-byte random value)
6500  *    ciphertext 2
6501  *    ...
6502  *    cleartext 6
6503  *    seed 6 (20-byte random value)
6504  *    ciphertext 6
6505  *
6506  * This pattern is repeated for all keys. The array stops on a NULL.
6507  */
6508 static const char *KAT_RSA_OAEP[] = {
6509 	/* 1024-bit key, from oeap-int.txt */
6510 	"BBF82F090682CE9C2338AC2B9DA871F7368D07EED41043A440D6B6F07454F51FB8DFBAAF035C02AB61EA48CEEB6FCD4876ED520D60E1EC4619719D8A5B8B807FAFB8E0A3DFC737723EE6B4B7D93A2584EE6A649D060953748834B2454598394EE0AAB12D7B61A51F527A9A41F6C1687FE2537298CA2A8F5946F8E5FD091DBDCB",
6511 	"11",
6512 	"EECFAE81B1B9B3C908810B10A1B5600199EB9F44AEF4FDA493B81A9E3D84F632124EF0236E5D1E3B7E28FAE7AA040A2D5B252176459D1F397541BA2A58FB6599",
6513 	"C97FB1F027F453F6341233EAAAD1D9353F6C42D08866B1D05A0F2035028B9D869840B41666B42E92EA0DA3B43204B5CFCE3352524D0416A5A441E700AF461503",
6514 	"54494CA63EBA0337E4E24023FCD69A5AEB07DDDC0183A4D0AC9B54B051F2B13ED9490975EAB77414FF59C1F7692E9A2E202B38FC910A474174ADC93C1F67C981",
6515 	"471E0290FF0AF0750351B7F878864CA961ADBD3A8A7E991C5C0556A94C3146A7F9803F8F6F8AE342E931FD8AE47A220D1B99A495849807FE39F9245A9836DA3D",
6516 	"B06C4FDABB6301198D265BDBAE9423B380F271F73453885093077FCD39E2119FC98632154F5883B167A967BF402B4E9E2E0F9656E698EA3666EDFB25798039F7",
6517 
6518 	/* oaep-int.txt contains only one message, so we repeat it six
6519 	   times to respect our array format. */
6520 	"D436E99569FD32A7C8A05BBC90D32C49",
6521 	"AAFD12F659CAE63489B479E5076DDEC2F06CB58F",
6522 	"1253E04DC0A5397BB44A7AB87E9BF2A039A33D1E996FC82A94CCD30074C95DF763722017069E5268DA5D1C0B4F872CF653C11DF82314A67968DFEAE28DEF04BB6D84B1C31D654A1970E5783BD6EB96A024C2CA2F4A90FE9F2EF5C9C140E5BB48DA9536AD8700C84FC9130ADEA74E558D51A74DDF85D8B50DE96838D6063E0955",
6523 
6524 	"D436E99569FD32A7C8A05BBC90D32C49",
6525 	"AAFD12F659CAE63489B479E5076DDEC2F06CB58F",
6526 	"1253E04DC0A5397BB44A7AB87E9BF2A039A33D1E996FC82A94CCD30074C95DF763722017069E5268DA5D1C0B4F872CF653C11DF82314A67968DFEAE28DEF04BB6D84B1C31D654A1970E5783BD6EB96A024C2CA2F4A90FE9F2EF5C9C140E5BB48DA9536AD8700C84FC9130ADEA74E558D51A74DDF85D8B50DE96838D6063E0955",
6527 
6528 	"D436E99569FD32A7C8A05BBC90D32C49",
6529 	"AAFD12F659CAE63489B479E5076DDEC2F06CB58F",
6530 	"1253E04DC0A5397BB44A7AB87E9BF2A039A33D1E996FC82A94CCD30074C95DF763722017069E5268DA5D1C0B4F872CF653C11DF82314A67968DFEAE28DEF04BB6D84B1C31D654A1970E5783BD6EB96A024C2CA2F4A90FE9F2EF5C9C140E5BB48DA9536AD8700C84FC9130ADEA74E558D51A74DDF85D8B50DE96838D6063E0955",
6531 
6532 	"D436E99569FD32A7C8A05BBC90D32C49",
6533 	"AAFD12F659CAE63489B479E5076DDEC2F06CB58F",
6534 	"1253E04DC0A5397BB44A7AB87E9BF2A039A33D1E996FC82A94CCD30074C95DF763722017069E5268DA5D1C0B4F872CF653C11DF82314A67968DFEAE28DEF04BB6D84B1C31D654A1970E5783BD6EB96A024C2CA2F4A90FE9F2EF5C9C140E5BB48DA9536AD8700C84FC9130ADEA74E558D51A74DDF85D8B50DE96838D6063E0955",
6535 
6536 	"D436E99569FD32A7C8A05BBC90D32C49",
6537 	"AAFD12F659CAE63489B479E5076DDEC2F06CB58F",
6538 	"1253E04DC0A5397BB44A7AB87E9BF2A039A33D1E996FC82A94CCD30074C95DF763722017069E5268DA5D1C0B4F872CF653C11DF82314A67968DFEAE28DEF04BB6D84B1C31D654A1970E5783BD6EB96A024C2CA2F4A90FE9F2EF5C9C140E5BB48DA9536AD8700C84FC9130ADEA74E558D51A74DDF85D8B50DE96838D6063E0955",
6539 
6540 	"D436E99569FD32A7C8A05BBC90D32C49",
6541 	"AAFD12F659CAE63489B479E5076DDEC2F06CB58F",
6542 	"1253E04DC0A5397BB44A7AB87E9BF2A039A33D1E996FC82A94CCD30074C95DF763722017069E5268DA5D1C0B4F872CF653C11DF82314A67968DFEAE28DEF04BB6D84B1C31D654A1970E5783BD6EB96A024C2CA2F4A90FE9F2EF5C9C140E5BB48DA9536AD8700C84FC9130ADEA74E558D51A74DDF85D8B50DE96838D6063E0955",
6543 
6544 	/* 1024-bit key */
6545 	"A8B3B284AF8EB50B387034A860F146C4919F318763CD6C5598C8AE4811A1E0ABC4C7E0B082D693A5E7FCED675CF4668512772C0CBC64A742C6C630F533C8CC72F62AE833C40BF25842E984BB78BDBF97C0107D55BDB662F5C4E0FAB9845CB5148EF7392DD3AAFF93AE1E6B667BB3D4247616D4F5BA10D4CFD226DE88D39F16FB",
6546 	"010001",
6547 	"D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30AF38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D",
6548 	"CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77",
6549 	"0E12BF1718E9CEF5599BA1C3882FE8046A90874EEFCE8F2CCC20E4F2741FB0A33A3848AEC9C9305FBECBD2D76819967D4671ACC6431E4037968DB37878E695C1",
6550 	"95297B0F95A2FA67D00707D609DFD4FC05C89DAFC2EF6D6EA55BEC771EA333734D9251E79082ECDA866EFEF13C459E1A631386B7E354C899F5F112CA85D71583",
6551 	"4F456C502493BDC0ED2AB756A3A6ED4D67352A697D4216E93212B127A63D5411CE6FA98D5DBEFD73263E3728142743818166ED7DD63687DD2A8CA1D2F4FBD8E1",
6552 
6553 	"6628194E12073DB03BA94CDA9EF9532397D50DBA79B987004AFEFE34",
6554 	"18B776EA21069D69776A33E96BAD48E1DDA0A5EF",
6555 	"354FE67B4A126D5D35FE36C777791A3F7BA13DEF484E2D3908AFF722FAD468FB21696DE95D0BE911C2D3174F8AFCC201035F7B6D8E69402DE5451618C21A535FA9D7BFC5B8DD9FC243F8CF927DB31322D6E881EAA91A996170E657A05A266426D98C88003F8477C1227094A0D9FA1E8C4024309CE1ECCCB5210035D47AC72E8A",
6556 
6557 	"750C4047F547E8E41411856523298AC9BAE245EFAF1397FBE56F9DD5",
6558 	"0CC742CE4A9B7F32F951BCB251EFD925FE4FE35F",
6559 	"640DB1ACC58E0568FE5407E5F9B701DFF8C3C91E716C536FC7FCEC6CB5B71C1165988D4A279E1577D730FC7A29932E3F00C81515236D8D8E31017A7A09DF4352D904CDEB79AA583ADCC31EA698A4C05283DABA9089BE5491F67C1A4EE48DC74BBBE6643AEF846679B4CB395A352D5ED115912DF696FFE0702932946D71492B44",
6560 
6561 	"D94AE0832E6445CE42331CB06D531A82B1DB4BAAD30F746DC916DF24D4E3C2451FFF59A6423EB0E1D02D4FE646CF699DFD818C6E97B051",
6562 	"2514DF4695755A67B288EAF4905C36EEC66FD2FD",
6563 	"423736ED035F6026AF276C35C0B3741B365E5F76CA091B4E8C29E2F0BEFEE603595AA8322D602D2E625E95EB81B2F1C9724E822ECA76DB8618CF09C5343503A4360835B5903BC637E3879FB05E0EF32685D5AEC5067CD7CC96FE4B2670B6EAC3066B1FCF5686B68589AAFB7D629B02D8F8625CA3833624D4800FB081B1CF94EB",
6564 
6565 	"52E650D98E7F2A048B4F86852153B97E01DD316F346A19F67A85",
6566 	"C4435A3E1A18A68B6820436290A37CEFB85DB3FB",
6567 	"45EAD4CA551E662C9800F1ACA8283B0525E6ABAE30BE4B4ABA762FA40FD3D38E22ABEFC69794F6EBBBC05DDBB11216247D2F412FD0FBA87C6E3ACD888813646FD0E48E785204F9C3F73D6D8239562722DDDD8771FEC48B83A31EE6F592C4CFD4BC88174F3B13A112AAE3B9F7B80E0FC6F7255BA880DC7D8021E22AD6A85F0755",
6568 
6569 	"8DA89FD9E5F974A29FEFFB462B49180F6CF9E802",
6570 	"B318C42DF3BE0F83FEA823F5A7B47ED5E425A3B5",
6571 	"36F6E34D94A8D34DAACBA33A2139D00AD85A9345A86051E73071620056B920E219005855A213A0F23897CDCD731B45257C777FE908202BEFDD0B58386B1244EA0CF539A05D5D10329DA44E13030FD760DCD644CFEF2094D1910D3F433E1C7C6DD18BC1F2DF7F643D662FB9DD37EAD9059190F4FA66CA39E869C4EB449CBDC439",
6572 
6573 	"26521050844271",
6574 	"E4EC0982C2336F3A677F6A356174EB0CE887ABC2",
6575 	"42CEE2617B1ECEA4DB3F4829386FBD61DAFBF038E180D837C96366DF24C097B4AB0FAC6BDF590D821C9F10642E681AD05B8D78B378C0F46CE2FAD63F74E0AD3DF06B075D7EB5F5636F8D403B9059CA761B5C62BB52AA45002EA70BAACE08DED243B9D8CBD62A68ADE265832B56564E43A6FA42ED199A099769742DF1539E8255",
6576 
6577 	/* 1025-bit key */
6578 	"01947C7FCE90425F47279E70851F25D5E62316FE8A1DF19371E3E628E260543E4901EF6081F68C0B8141190D2AE8DABA7D1250EC6DB636E944EC3722877C7C1D0A67F14B1694C5F0379451A43E49A32DDE83670B73DA91A1C99BC23B436A60055C610F0BAF99C1A079565B95A3F1526632D1D4DA60F20EDA25E653C4F002766F45",
6579 	"010001",
6580 	"0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B338AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43",
6581 	"012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46DB09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7",
6582 	"436EF508DE736519C2DA4C580D98C82CB7452A3FB5EFADC3B9C7789A1BC6584F795ADDBBD32439C74686552ECB6C2C307A4D3AF7F539EEC157248C7B31F1A255",
6583 	"012B15A89F3DFB2B39073E73F02BDD0C1A7B379DD435F05CDDE2EFF9E462948B7CEC62EE9050D5E0816E0785A856B49108DCB75F3683874D1CA6329A19013066FF",
6584 	"0270DB17D5914B018D76118B24389A7350EC836B0063A21721236FD8EDB6D89B51E7EEB87B611B7132CB7EA7356C23151C1E7751507C786D9EE1794170A8C8E8",
6585 
6586 	"8FF00CAA605C702830634D9A6C3D42C652B58CF1D92FEC570BEEE7",
6587 	"8C407B5EC2899E5099C53E8CE793BF94E71B1782",
6588 	"0181AF8922B9FCB4D79D92EBE19815992FC0C1439D8BCD491398A0F4AD3A329A5BD9385560DB532683C8B7DA04E4B12AED6AACDF471C34C9CDA891ADDCC2DF3456653AA6382E9AE59B54455257EB099D562BBE10453F2B6D13C59C02E10F1F8ABB5DA0D0570932DACF2D0901DB729D0FEFCC054E70968EA540C81B04BCAEFE720E",
6589 
6590 	"2D",
6591 	"B600CF3C2E506D7F16778C910D3A8B003EEE61D5",
6592 	"018759FF1DF63B2792410562314416A8AEAF2AC634B46F940AB82D64DBF165EEE33011DA749D4BAB6E2FCD18129C9E49277D8453112B429A222A8471B070993998E758861C4D3F6D749D91C4290D332C7A4AB3F7EA35FF3A07D497C955FF0FFC95006B62C6D296810D9BFAB024196C7934012C2DF978EF299ABA239940CBA10245",
6593 
6594 	"74FC88C51BC90F77AF9D5E9A4A70133D4B4E0B34DA3C37C7EF8E",
6595 	"A73768AEEAA91F9D8C1ED6F9D2B63467F07CCAE3",
6596 	"018802BAB04C60325E81C4962311F2BE7C2ADCE93041A00719C88F957575F2C79F1B7BC8CED115C706B311C08A2D986CA3B6A9336B147C29C6F229409DDEC651BD1FDD5A0B7F610C9937FDB4A3A762364B8B3206B4EA485FD098D08F63D4AA8BB2697D027B750C32D7F74EAF5180D2E9B66B17CB2FA55523BC280DA10D14BE2053",
6597 
6598 	"A7EB2A5036931D27D4E891326D99692FFADDA9BF7EFD3E34E622C4ADC085F721DFE885072C78A203B151739BE540FA8C153A10F00A",
6599 	"9A7B3B0E708BD96F8190ECAB4FB9B2B3805A8156",
6600 	"00A4578CBC176318A638FBA7D01DF15746AF44D4F6CD96D7E7C495CBF425B09C649D32BF886DA48FBAF989A2117187CAFB1FB580317690E3CCD446920B7AF82B31DB5804D87D01514ACBFA9156E782F867F6BED9449E0E9A2C09BCECC6AA087636965E34B3EC766F2FE2E43018A2FDDEB140616A0E9D82E5331024EE0652FC7641",
6601 
6602 	"2EF2B066F854C33F3BDCBB5994A435E73D6C6C",
6603 	"EB3CEBBC4ADC16BB48E88C8AEC0E34AF7F427FD3",
6604 	"00EBC5F5FDA77CFDAD3C83641A9025E77D72D8A6FB33A810F5950F8D74C73E8D931E8634D86AB1246256AE07B6005B71B7F2FB98351218331CE69B8FFBDC9DA08BBC9C704F876DEB9DF9FC2EC065CAD87F9090B07ACC17AA7F997B27ACA48806E897F771D95141FE4526D8A5301B678627EFAB707FD40FBEBD6E792A25613E7AEC",
6605 
6606 	"8A7FB344C8B6CB2CF2EF1F643F9A3218F6E19BBA89C0",
6607 	"4C45CF4D57C98E3D6D2095ADC51C489EB50DFF84",
6608 	"010839EC20C27B9052E55BEFB9B77E6FC26E9075D7A54378C646ABDF51E445BD5715DE81789F56F1803D9170764A9E93CB78798694023EE7393CE04BC5D8F8C5A52C171D43837E3ACA62F609EB0AA5FFB0960EF04198DD754F57F7FBE6ABF765CF118B4CA443B23B5AAB266F952326AC4581100644325F8B721ACD5D04FF14EF3A",
6609 
6610 	/* 2048-bit key */
6611 	"AE45ED5601CEC6B8CC05F803935C674DDBE0D75C4C09FD7951FC6B0CAEC313A8DF39970C518BFFBA5ED68F3F0D7F22A4029D413F1AE07E4EBE9E4177CE23E7F5404B569E4EE1BDCF3C1FB03EF113802D4F855EB9B5134B5A7C8085ADCAE6FA2FA1417EC3763BE171B0C62B760EDE23C12AD92B980884C641F5A8FAC26BDAD4A03381A22FE1B754885094C82506D4019A535A286AFEB271BB9BA592DE18DCF600C2AEEAE56E02F7CF79FC14CF3BDC7CD84FEBBBF950CA90304B2219A7AA063AEFA2C3C1980E560CD64AFE779585B6107657B957857EFDE6010988AB7DE417FC88D8F384C4E6E72C3F943E0C31C0C4A5CC36F879D8A3AC9D7D59860EAADA6B83BB",
6612 	"010001",
6613 	"ECF5AECD1E5515FFFACBD75A2816C6EBF49018CDFB4638E185D66A7396B6F8090F8018C7FD95CC34B857DC17F0CC6516BB1346AB4D582CADAD7B4103352387B70338D084047C9D9539B6496204B3DD6EA442499207BEC01F964287FF6336C3984658336846F56E46861881C10233D2176BF15A5E96DDC780BC868AA77D3CE769",
6614 	"BC46C464FC6AC4CA783B0EB08A3C841B772F7E9B2F28BABD588AE885E1A0C61E4858A0FB25AC299990F35BE85164C259BA1175CDD7192707135184992B6C29B746DD0D2CABE142835F7D148CC161524B4A09946D48B828473F1CE76B6CB6886C345C03E05F41D51B5C3A90A3F24073C7D74A4FE25D9CF21C75960F3FC3863183",
6615 	"C73564571D00FB15D08A3DE9957A50915D7126E9442DACF42BC82E862E5673FF6A008ED4D2E374617DF89F17A160B43B7FDA9CB6B6B74218609815F7D45CA263C159AA32D272D127FAF4BC8CA2D77378E8AEB19B0AD7DA3CB3DE0AE7314980F62B6D4B0A875D1DF03C1BAE39CCD833EF6CD7E2D9528BF084D1F969E794E9F6C1",
6616 	"2658B37F6DF9C1030BE1DB68117FA9D87E39EA2B693B7E6D3A2F70947413EEC6142E18FB8DFCB6AC545D7C86A0AD48F8457170F0EFB26BC48126C53EFD1D16920198DC2A1107DC282DB6A80CD3062360BA3FA13F70E4312FF1A6CD6B8FC4CD9C5C3DB17C6D6A57212F73AE29F619327BAD59B153858585BA4E28B60A62A45E49",
6617 	"6F38526B3925085534EF3E415A836EDE8B86158A2C7CBFECCB0BD834304FEC683BA8D4F479C433D43416E63269623CEA100776D85AFF401D3FFF610EE65411CE3B1363D63A9709EEDE42647CEA561493D54570A879C18682CD97710B96205EC31117D73B5F36223FADD6E8BA90DD7C0EE61D44E163251E20C7F66EB305117CB8",
6618 
6619 	"8BBA6BF82A6C0F86D5F1756E97956870B08953B06B4EB205BC1694EE",
6620 	"47E1AB7119FEE56C95EE5EAAD86F40D0AA63BD33",
6621 	"53EA5DC08CD260FB3B858567287FA91552C30B2FEBFBA213F0AE87702D068D19BAB07FE574523DFB42139D68C3C5AFEEE0BFE4CB7969CBF382B804D6E61396144E2D0E60741F8993C3014B58B9B1957A8BABCD23AF854F4C356FB1662AA72BFCC7E586559DC4280D160C126785A723EBEEBEFF71F11594440AAEF87D10793A8774A239D4A04C87FE1467B9DAF85208EC6C7255794A96CC29142F9A8BD418E3C1FD67344B0CD0829DF3B2BEC60253196293C6B34D3F75D32F213DD45C6273D505ADF4CCED1057CB758FC26AEEFA441255ED4E64C199EE075E7F16646182FDB464739B68AB5DAFF0E63E9552016824F054BF4D3C8C90A97BB6B6553284EB429FCC",
6622 
6623 	"E6AD181F053B58A904F2457510373E57",
6624 	"6D17F5B4C1FFAC351D195BF7B09D09F09A4079CF",
6625 	"A2B1A430A9D657E2FA1C2BB5ED43FFB25C05A308FE9093C01031795F5874400110828AE58FB9B581CE9DDDD3E549AE04A0985459BDE6C626594E7B05DC4278B2A1465C1368408823C85E96DC66C3A30983C639664FC4569A37FE21E5A195B5776EED2DF8D8D361AF686E750229BBD663F161868A50615E0C337BEC0CA35FEC0BB19C36EB2E0BBCC0582FA1D93AACDB061063F59F2CE1EE43605E5D89ECA183D2ACDFE9F81011022AD3B43A3DD417DAC94B4E11EA81B192966E966B182082E71964607B4F8002F36299844A11F2AE0FAEAC2EAE70F8F4F98088ACDCD0AC556E9FCCC511521908FAD26F04C64201450305778758B0538BF8B5BB144A828E629795",
6626 
6627 	"510A2CF60E866FA2340553C94EA39FBC256311E83E94454B4124",
6628 	"385387514DECCC7C740DD8CDF9DAEE49A1CBFD54",
6629 	"9886C3E6764A8B9A84E84148EBD8C3B1AA8050381A78F668714C16D9CFD2A6EDC56979C535D9DEE3B44B85C18BE8928992371711472216D95DDA98D2EE8347C9B14DFFDFF84AA48D25AC06F7D7E65398AC967B1CE90925F67DCE049B7F812DB0742997A74D44FE81DBE0E7A3FEAF2E5C40AF888D550DDBBE3BC20657A29543F8FC2913B9BD1A61B2AB2256EC409BBD7DC0D17717EA25C43F42ED27DF8738BF4AFC6766FF7AFF0859555EE283920F4C8A63C4A7340CBAFDDC339ECDB4B0515002F96C932B5B79167AF699C0AD3FCCFDF0F44E85A70262BF2E18FE34B850589975E867FF969D48EABF212271546CDC05A69ECB526E52870C836F307BD798780EDE",
6630 
6631 	"BCDD190DA3B7D300DF9A06E22CAAE2A75F10C91FF667B7C16BDE8B53064A2649A94045C9",
6632 	"5CACA6A0F764161A9684F85D92B6E0EF37CA8B65",
6633 	"6318E9FB5C0D05E5307E1683436E903293AC4642358AAA223D7163013ABA87E2DFDA8E60C6860E29A1E92686163EA0B9175F329CA3B131A1EDD3A77759A8B97BAD6A4F8F4396F28CF6F39CA58112E48160D6E203DAA5856F3ACA5FFED577AF499408E3DFD233E3E604DBE34A9C4C9082DE65527CAC6331D29DC80E0508A0FA7122E7F329F6CCA5CFA34D4D1DA417805457E008BEC549E478FF9E12A763C477D15BBB78F5B69BD57830FC2C4ED686D79BC72A95D85F88134C6B0AFE56A8CCFBC855828BB339BD17909CF1D70DE3335AE07039093E606D655365DE6550B872CD6DE1D440EE031B61945F629AD8A353B0D40939E96A3C450D2A8D5EEE9F678093C8",
6634 
6635 	"A7DD6C7DC24B46F9DD5F1E91ADA4C3B3DF947E877232A9",
6636 	"95BCA9E3859894B3DD869FA7ECD5BBC6401BF3E4",
6637 	"75290872CCFD4A4505660D651F56DA6DAA09CA1301D890632F6A992F3D565CEE464AFDED40ED3B5BE9356714EA5AA7655F4A1366C2F17C728F6F2C5A5D1F8E28429BC4E6F8F2CFF8DA8DC0E0A9808E45FD09EA2FA40CB2B6CE6FFFF5C0E159D11B68D90A85F7B84E103B09E682666480C657505C0929259468A314786D74EAB131573CF234BF57DB7D9E66CC6748192E002DC0DEEA930585F0831FDCD9BC33D51F79ED2FFC16BCF4D59812FCEBCAA3F9069B0E445686D644C25CCF63B456EE5FA6FFE96F19CDF751FED9EAF35957754DBF4BFEA5216AA1844DC507CB2D080E722EBA150308C2B5FF1193620F1766ECF4481BAFB943BD292877F2136CA494ABA0",
6638 
6639 	"EAF1A73A1B0C4609537DE69CD9228BBCFB9A8CA8C6C3EFAF056FE4A7F4634ED00B7C39EC6922D7B8EA2C04EBAC",
6640 	"9F47DDF42E97EEA856A9BDBC714EB3AC22F6EB32",
6641 	"2D207A73432A8FB4C03051B3F73B28A61764098DFA34C47A20995F8115AA6816679B557E82DBEE584908C6E69782D7DEB34DBD65AF063D57FCA76A5FD069492FD6068D9984D209350565A62E5C77F23038C12CB10C6634709B547C46F6B4A709BD85CA122D74465EF97762C29763E06DBC7A9E738C78BFCA0102DC5E79D65B973F28240CAAB2E161A78B57D262457ED8195D53E3C7AE9DA021883C6DB7C24AFDD2322EAC972AD3C354C5FCEF1E146C3A0290FB67ADF007066E00428D2CEC18CE58F9328698DEFEF4B2EB5EC76918FDE1C198CBB38B7AFC67626A9AEFEC4322BFD90D2563481C9A221F78C8272C82D1B62AB914E1C69F6AF6EF30CA5260DB4A46",
6642 
6643 	NULL
6644 };
6645 
6646 static void
6647 test_RSA_OAEP(const char *name,
6648 	br_rsa_oaep_encrypt menc, br_rsa_oaep_decrypt mdec)
6649 {
6650 	size_t u;
6651 
6652 	printf("Test %s: ", name);
6653 	fflush(stdout);
6654 
6655 	u = 0;
6656 	while (KAT_RSA_OAEP[u] != NULL) {
6657 		unsigned char n[512];
6658 		unsigned char e[8];
6659 		unsigned char p[256];
6660 		unsigned char q[256];
6661 		unsigned char dp[256];
6662 		unsigned char dq[256];
6663 		unsigned char iq[256];
6664 		br_rsa_public_key pk;
6665 		br_rsa_private_key sk;
6666 		size_t v;
6667 
6668 		pk.n = n;
6669 		pk.nlen = hextobin(n, KAT_RSA_OAEP[u ++]);
6670 		pk.e = e;
6671 		pk.elen = hextobin(e, KAT_RSA_OAEP[u ++]);
6672 
6673 		for (v = 0; n[v] == 0; v ++);
6674 		sk.n_bitlen = BIT_LENGTH(n[v]) + ((pk.nlen - 1 - v) << 3);
6675 		sk.p = p;
6676 		sk.plen = hextobin(p, KAT_RSA_OAEP[u ++]);
6677 		sk.q = q;
6678 		sk.qlen = hextobin(q, KAT_RSA_OAEP[u ++]);
6679 		sk.dp = dp;
6680 		sk.dplen = hextobin(dp, KAT_RSA_OAEP[u ++]);
6681 		sk.dq = dq;
6682 		sk.dqlen = hextobin(dq, KAT_RSA_OAEP[u ++]);
6683 		sk.iq = iq;
6684 		sk.iqlen = hextobin(iq, KAT_RSA_OAEP[u ++]);
6685 
6686 		for (v = 0; v < 6; v ++) {
6687 			unsigned char plain[512], seed[128], cipher[512];
6688 			size_t plain_len, seed_len, cipher_len;
6689 			rng_fake_ctx rng;
6690 			unsigned char tmp[513];
6691 			size_t len;
6692 
6693 			plain_len = hextobin(plain, KAT_RSA_OAEP[u ++]);
6694 			seed_len = hextobin(seed, KAT_RSA_OAEP[u ++]);
6695 			cipher_len = hextobin(cipher, KAT_RSA_OAEP[u ++]);
6696 			rng_fake_init(&rng, NULL, seed, seed_len);
6697 
6698 			len = menc(&rng.vtable, &br_sha1_vtable, NULL, 0, &pk,
6699 				tmp, sizeof tmp, plain, plain_len);
6700 			if (len != cipher_len) {
6701 				fprintf(stderr,
6702 					"wrong encrypted length: %lu vs %lu\n",
6703 					(unsigned long)len,
6704 					(unsigned long)cipher_len);
6705 			}
6706 			if (rng.ptr != rng.len) {
6707 				fprintf(stderr, "seed not fully consumed\n");
6708 				exit(EXIT_FAILURE);
6709 			}
6710 			check_equals("KAT RSA/OAEP encrypt", tmp, cipher, len);
6711 
6712 			if (mdec(&br_sha1_vtable, NULL, 0,
6713 				&sk, tmp, &len) != 1)
6714 			{
6715 				fprintf(stderr, "decryption failed\n");
6716 				exit(EXIT_FAILURE);
6717 			}
6718 			if (len != plain_len) {
6719 				fprintf(stderr,
6720 					"wrong decrypted length: %lu vs %lu\n",
6721 					(unsigned long)len,
6722 					(unsigned long)plain_len);
6723 			}
6724 			check_equals("KAT RSA/OAEP decrypt", tmp, plain, len);
6725 
6726 			/*
6727 			 * Try with a different label; it should fail.
6728 			 */
6729 			memcpy(tmp, cipher, cipher_len);
6730 			len = cipher_len;
6731 			if (mdec(&br_sha1_vtable, "T", 1,
6732 				&sk, tmp, &len) != 0)
6733 			{
6734 				fprintf(stderr, "decryption should have failed"
6735 					" (wrong label)\n");
6736 				exit(EXIT_FAILURE);
6737 			}
6738 
6739 			/*
6740 			 * Try with a the wrong length; it should fail.
6741 			 */
6742 			tmp[0] = 0x00;
6743 			memcpy(tmp + 1, cipher, cipher_len);
6744 			len = cipher_len + 1;
6745 			if (mdec(&br_sha1_vtable, "T", 1,
6746 				&sk, tmp, &len) != 0)
6747 			{
6748 				fprintf(stderr, "decryption should have failed"
6749 					" (wrong length)\n");
6750 				exit(EXIT_FAILURE);
6751 			}
6752 
6753 			printf(".");
6754 			fflush(stdout);
6755 		}
6756 	}
6757 
6758 	printf(" done.\n");
6759 	fflush(stdout);
6760 }
6761 
6762 static void
6763 test_RSA_keygen(const char *name, br_rsa_keygen kg, br_rsa_compute_modulus cm,
6764 	br_rsa_compute_pubexp ce, br_rsa_compute_privexp cd,
6765 	br_rsa_public pub, br_rsa_pkcs1_sign sign, br_rsa_pkcs1_vrfy vrfy)
6766 {
6767 	br_hmac_drbg_context rng;
6768 	int i;
6769 
6770 	printf("Test %s: ", name);
6771 	fflush(stdout);
6772 
6773 	br_hmac_drbg_init(&rng, &br_sha256_vtable, "seed for RSA keygen", 19);
6774 
6775 	for (i = 0; i <= 42; i ++) {
6776 		unsigned size;
6777 		uint32_t pubexp, z;
6778 		br_rsa_private_key sk;
6779 		br_rsa_public_key pk, pk2;
6780 		unsigned char kbuf_priv[BR_RSA_KBUF_PRIV_SIZE(2048)];
6781 		unsigned char kbuf_pub[BR_RSA_KBUF_PUB_SIZE(2048)];
6782 		unsigned char n2[256], d[256], msg1[256], msg2[256];
6783 		uint32_t mod[256];
6784 		uint32_t cc;
6785 		size_t u, v;
6786 		unsigned char sig[257], hv[32], hv2[sizeof hv];
6787 		unsigned mask1, mask2;
6788 		int j;
6789 
6790 		if (i <= 35) {
6791 			size = 1024 + i;
6792 			pubexp = 17;
6793 		} else if (i <= 40) {
6794 			size = 2048;
6795 			pubexp = (i << 1) - 69;
6796 		} else {
6797 			size = 2048;
6798 			pubexp = 0xFFFFFFFF;
6799 		}
6800 
6801 		if (!kg(&rng.vtable,
6802 			&sk, kbuf_priv, &pk, kbuf_pub, size, pubexp))
6803 		{
6804 			fprintf(stderr, "RSA key pair generation failure\n");
6805 			exit(EXIT_FAILURE);
6806 		}
6807 
6808 		z = pubexp;
6809 		for (u = pk.elen; u > 0; u --) {
6810 			if (pk.e[u - 1] != (z & 0xFF)) {
6811 				fprintf(stderr, "wrong public exponent\n");
6812 				exit(EXIT_FAILURE);
6813 			}
6814 			z >>= 8;
6815 		}
6816 		if (z != 0) {
6817 			fprintf(stderr, "truncated public exponent\n");
6818 			exit(EXIT_FAILURE);
6819 		}
6820 
6821 		memset(mod, 0, sizeof mod);
6822 		for (u = 0; u < sk.plen; u ++) {
6823 			for (v = 0; v < sk.qlen; v ++) {
6824 				mod[u + v] += (uint32_t)sk.p[sk.plen - 1 - u]
6825 					* (uint32_t)sk.q[sk.qlen - 1 - v];
6826 			}
6827 		}
6828 		cc = 0;
6829 		for (u = 0; u < sk.plen + sk.qlen; u ++) {
6830 			mod[u] += cc;
6831 			cc = mod[u] >> 8;
6832 			mod[u] &= 0xFF;
6833 		}
6834 		for (u = 0; u < pk.nlen; u ++) {
6835 			if (mod[pk.nlen - 1 - u] != pk.n[u]) {
6836 				fprintf(stderr, "wrong modulus\n");
6837 				exit(EXIT_FAILURE);
6838 			}
6839 		}
6840 		if (sk.n_bitlen != size) {
6841 			fprintf(stderr, "wrong key size\n");
6842 			exit(EXIT_FAILURE);
6843 		}
6844 		if (pk.nlen != (size + 7) >> 3) {
6845 			fprintf(stderr, "wrong modulus size (bytes)\n");
6846 			exit(EXIT_FAILURE);
6847 		}
6848 		mask1 = 0x01 << ((size + 7) & 7);
6849 		mask2 = 0xFF & -mask1;
6850 		if ((pk.n[0] & mask2) != mask1) {
6851 			fprintf(stderr, "wrong modulus size (bits)\n");
6852 			exit(EXIT_FAILURE);
6853 		}
6854 
6855 		if (cm(NULL, &sk) != pk.nlen) {
6856 			fprintf(stderr, "wrong recomputed modulus length\n");
6857 			exit(EXIT_FAILURE);
6858 		}
6859 		if (cm(n2, &sk) != pk.nlen || memcmp(pk.n, n2, pk.nlen) != 0) {
6860 			fprintf(stderr, "wrong recomputed modulus value\n");
6861 			exit(EXIT_FAILURE);
6862 		}
6863 
6864 		z = ce(&sk);
6865 		if (z != pubexp) {
6866 			fprintf(stderr,
6867 				"wrong recomputed pubexp: %lu (exp: %lu)\n",
6868 				(unsigned long)z, (unsigned long)pubexp);
6869 			exit(EXIT_FAILURE);
6870 		}
6871 
6872 		if (cd(NULL, &sk, pubexp) != pk.nlen) {
6873 			fprintf(stderr,
6874 				"wrong recomputed privexp length (1)\n");
6875 			exit(EXIT_FAILURE);
6876 		}
6877 		if (cd(d, &sk, pubexp) != pk.nlen) {
6878 			fprintf(stderr,
6879 				"wrong recomputed privexp length (2)\n");
6880 			exit(EXIT_FAILURE);
6881 		}
6882 		/*
6883 		 * To check that the private exponent is correct, we make
6884 		 * it into a _public_ key, and use the public-key operation
6885 		 * to perform the modular exponentiation.
6886 		 */
6887 		pk2 = pk;
6888 		pk2.e = d;
6889 		pk2.elen = pk.nlen;
6890 		rng.vtable->generate(&rng.vtable, msg1, pk.nlen);
6891 		msg1[0] = 0x00;
6892 		memcpy(msg2, msg1, pk.nlen);
6893 		if (!pub(msg2, pk.nlen, &pk2) || !pub(msg2, pk.nlen, &pk)) {
6894 			fprintf(stderr, "public-key operation error\n");
6895 			exit(EXIT_FAILURE);
6896 		}
6897 		if (memcmp(msg1, msg2, pk.nlen) != 0) {
6898 			fprintf(stderr, "wrong recomputed privexp\n");
6899 			exit(EXIT_FAILURE);
6900 		}
6901 
6902 		/*
6903 		 * We test the RSA operation over a some random messages.
6904 		 */
6905 		for (j = 0; j < 20; j ++) {
6906 			rng.vtable->generate(&rng.vtable, hv, sizeof hv);
6907 			memset(sig, 0, sizeof sig);
6908 			sig[pk.nlen] = 0x00;
6909 			if (!sign(BR_HASH_OID_SHA256,
6910 				hv, sizeof hv, &sk, sig))
6911 			{
6912 				fprintf(stderr,
6913 					"signature error (%d)\n", j);
6914 				exit(EXIT_FAILURE);
6915 			}
6916 			if (sig[pk.nlen] != 0x00) {
6917 				fprintf(stderr,
6918 					"signature length error (%d)\n", j);
6919 				exit(EXIT_FAILURE);
6920 			}
6921 			if (!vrfy(sig, pk.nlen, BR_HASH_OID_SHA256, sizeof hv,
6922 				&pk, hv2))
6923 			{
6924 				fprintf(stderr,
6925 					"signature verif error (%d)\n", j);
6926 				exit(EXIT_FAILURE);
6927 			}
6928 			if (memcmp(hv, hv2, sizeof hv) != 0) {
6929 				fprintf(stderr,
6930 					"signature extract error (%d)\n", j);
6931 				exit(EXIT_FAILURE);
6932 			}
6933 		}
6934 
6935 		printf(".");
6936 		fflush(stdout);
6937 	}
6938 
6939 	printf(" done.\n");
6940 	fflush(stdout);
6941 }
6942 
6943 static void
6944 test_RSA_i15(void)
6945 {
6946 	test_RSA_core("RSA i15 core", &br_rsa_i15_public, &br_rsa_i15_private);
6947 	test_RSA_sign("RSA i15 sign", &br_rsa_i15_private,
6948 		&br_rsa_i15_pkcs1_sign, &br_rsa_i15_pkcs1_vrfy);
6949 	test_RSA_OAEP("RSA i15 OAEP",
6950 		&br_rsa_i15_oaep_encrypt, &br_rsa_i15_oaep_decrypt);
6951 	test_RSA_PSS("RSA i15 PSS",
6952 		&br_rsa_i15_pss_sign, &br_rsa_i15_pss_vrfy);
6953 	test_RSA_keygen("RSA i15 keygen", &br_rsa_i15_keygen,
6954 		&br_rsa_i15_compute_modulus, &br_rsa_i15_compute_pubexp,
6955 		&br_rsa_i15_compute_privexp, &br_rsa_i15_public,
6956 		&br_rsa_i15_pkcs1_sign, &br_rsa_i15_pkcs1_vrfy);
6957 }
6958 
6959 static void
6960 test_RSA_i31(void)
6961 {
6962 	test_RSA_core("RSA i31 core", &br_rsa_i31_public, &br_rsa_i31_private);
6963 	test_RSA_sign("RSA i31 sign", &br_rsa_i31_private,
6964 		&br_rsa_i31_pkcs1_sign, &br_rsa_i31_pkcs1_vrfy);
6965 	test_RSA_OAEP("RSA i31 OAEP",
6966 		&br_rsa_i31_oaep_encrypt, &br_rsa_i31_oaep_decrypt);
6967 	test_RSA_PSS("RSA i31 PSS",
6968 		&br_rsa_i31_pss_sign, &br_rsa_i31_pss_vrfy);
6969 	test_RSA_keygen("RSA i31 keygen", &br_rsa_i31_keygen,
6970 		&br_rsa_i31_compute_modulus, &br_rsa_i31_compute_pubexp,
6971 		&br_rsa_i31_compute_privexp, &br_rsa_i31_public,
6972 		&br_rsa_i31_pkcs1_sign, &br_rsa_i31_pkcs1_vrfy);
6973 }
6974 
6975 static void
6976 test_RSA_i32(void)
6977 {
6978 	test_RSA_core("RSA i32 core", &br_rsa_i32_public, &br_rsa_i32_private);
6979 	test_RSA_sign("RSA i32 sign", &br_rsa_i32_private,
6980 		&br_rsa_i32_pkcs1_sign, &br_rsa_i32_pkcs1_vrfy);
6981 	test_RSA_OAEP("RSA i32 OAEP",
6982 		&br_rsa_i32_oaep_encrypt, &br_rsa_i32_oaep_decrypt);
6983 	test_RSA_PSS("RSA i32 PSS",
6984 		&br_rsa_i32_pss_sign, &br_rsa_i32_pss_vrfy);
6985 }
6986 
6987 static void
6988 test_RSA_i62(void)
6989 {
6990 	br_rsa_public pub;
6991 	br_rsa_private priv;
6992 	br_rsa_pkcs1_sign sign;
6993 	br_rsa_pkcs1_vrfy vrfy;
6994 	br_rsa_pss_sign pss_sign;
6995 	br_rsa_pss_vrfy pss_vrfy;
6996 	br_rsa_oaep_encrypt menc;
6997 	br_rsa_oaep_decrypt mdec;
6998 	br_rsa_keygen kgen;
6999 
7000 	pub = br_rsa_i62_public_get();
7001 	priv = br_rsa_i62_private_get();
7002 	sign = br_rsa_i62_pkcs1_sign_get();
7003 	vrfy = br_rsa_i62_pkcs1_vrfy_get();
7004 	pss_sign = br_rsa_i62_pss_sign_get();
7005 	pss_vrfy = br_rsa_i62_pss_vrfy_get();
7006 	menc = br_rsa_i62_oaep_encrypt_get();
7007 	mdec = br_rsa_i62_oaep_decrypt_get();
7008 	kgen = br_rsa_i62_keygen_get();
7009 	if (pub) {
7010 		if (!priv || !sign || !vrfy || !pss_sign || !pss_vrfy
7011 			|| !menc || !mdec || !kgen)
7012 		{
7013 			fprintf(stderr, "Inconsistent i62 availability\n");
7014 			exit(EXIT_FAILURE);
7015 		}
7016 		test_RSA_core("RSA i62 core", pub, priv);
7017 		test_RSA_sign("RSA i62 sign", priv, sign, vrfy);
7018 		test_RSA_OAEP("RSA i62 OAEP", menc, mdec);
7019 		test_RSA_PSS("RSA i62 PSS", pss_sign, pss_vrfy);
7020 		test_RSA_keygen("RSA i62 keygen", kgen,
7021 			&br_rsa_i31_compute_modulus, &br_rsa_i31_compute_pubexp,
7022 			&br_rsa_i31_compute_privexp, pub,
7023 			sign, vrfy);
7024 	} else {
7025 		if (priv || sign || vrfy || pss_sign || pss_vrfy
7026 			|| menc || mdec || kgen)
7027 		{
7028 			fprintf(stderr, "Inconsistent i62 availability\n");
7029 			exit(EXIT_FAILURE);
7030 		}
7031 		printf("Test RSA i62: UNAVAILABLE\n");
7032 	}
7033 }
7034 
7035 #if 0
7036 static void
7037 test_RSA_signatures(void)
7038 {
7039 	uint32_t n[40], e[2], p[20], q[20], dp[20], dq[20], iq[20], x[40];
7040 	unsigned char hv[20], sig[128];
7041 	unsigned char ref[128], tmp[128];
7042 	br_sha1_context hc;
7043 
7044 	printf("Test RSA signatures: ");
7045 	fflush(stdout);
7046 
7047 	/*
7048 	 * Decode RSA key elements.
7049 	 */
7050 	br_int_decode(n, sizeof n / sizeof n[0], RSA_N, sizeof RSA_N);
7051 	br_int_decode(e, sizeof e / sizeof e[0], RSA_E, sizeof RSA_E);
7052 	br_int_decode(p, sizeof p / sizeof p[0], RSA_P, sizeof RSA_P);
7053 	br_int_decode(q, sizeof q / sizeof q[0], RSA_Q, sizeof RSA_Q);
7054 	br_int_decode(dp, sizeof dp / sizeof dp[0], RSA_DP, sizeof RSA_DP);
7055 	br_int_decode(dq, sizeof dq / sizeof dq[0], RSA_DQ, sizeof RSA_DQ);
7056 	br_int_decode(iq, sizeof iq / sizeof iq[0], RSA_IQ, sizeof RSA_IQ);
7057 
7058 	/*
7059 	 * Decode reference signature (computed with OpenSSL).
7060 	 */
7061 	hextobin(ref, "45A3DC6A106BCD3BD0E48FB579643AA3FF801E5903E80AA9B43A695A8E7F454E93FA208B69995FF7A6D5617C2FEB8E546375A664977A48931842AAE796B5A0D64393DCA35F3490FC157F5BD83B9D58C2F7926E6AE648A2BD96CAB8FCCD3D35BB11424AD47D973FF6D69CA774841AEC45DFAE99CCF79893E7047FDE6CB00AA76D");
7062 
7063 	/*
7064 	 * Recompute signature. Since PKCS#1 v1.5 signatures are
7065 	 * deterministic, we should get the same as the reference signature.
7066 	 */
7067 	br_sha1_init(&hc);
7068 	br_sha1_update(&hc, "test", 4);
7069 	br_sha1_out(&hc, hv);
7070 	if (!br_rsa_sign(sig, sizeof sig, p, q, dp, dq, iq, br_sha1_ID, hv)) {
7071 		fprintf(stderr, "RSA-1024/SHA-1 sig generate failed\n");
7072 		exit(EXIT_FAILURE);
7073 	}
7074 	check_equals("KAT RSA-sign 1", sig, ref, sizeof sig);
7075 
7076 	/*
7077 	 * Verify signature.
7078 	 */
7079 	if (!br_rsa_verify(sig, sizeof sig, n, e, br_sha1_ID, hv)) {
7080 		fprintf(stderr, "RSA-1024/SHA-1 sig verify failed\n");
7081 		exit(EXIT_FAILURE);
7082 	}
7083 	hv[5] ^= 0x01;
7084 	if (br_rsa_verify(sig, sizeof sig, n, e, br_sha1_ID, hv)) {
7085 		fprintf(stderr, "RSA-1024/SHA-1 sig verify should have failed\n");
7086 		exit(EXIT_FAILURE);
7087 	}
7088 	hv[5] ^= 0x01;
7089 
7090 	/*
7091 	 * Generate a signature with the alternate encoding (no NULL) and
7092 	 * verify it.
7093 	 */
7094 	hextobin(tmp, "0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00301F300706052B0E03021A0414A94A8FE5CCB19BA61C4C0873D391E987982FBBD3");
7095 	br_int_decode(x, sizeof x / sizeof x[0], tmp, sizeof tmp);
7096 	x[0] = n[0];
7097 	br_rsa_private_core(x, p, q, dp, dq, iq);
7098 	br_int_encode(sig, sizeof sig, x);
7099 	if (!br_rsa_verify(sig, sizeof sig, n, e, br_sha1_ID, hv)) {
7100 		fprintf(stderr, "RSA-1024/SHA-1 sig verify (alt) failed\n");
7101 		exit(EXIT_FAILURE);
7102 	}
7103 	hv[5] ^= 0x01;
7104 	if (br_rsa_verify(sig, sizeof sig, n, e, br_sha1_ID, hv)) {
7105 		fprintf(stderr, "RSA-1024/SHA-1 sig verify (alt) should have failed\n");
7106 		exit(EXIT_FAILURE);
7107 	}
7108 	hv[5] ^= 0x01;
7109 
7110 	printf("done.\n");
7111 	fflush(stdout);
7112 }
7113 #endif
7114 
7115 /*
7116  * From: http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf
7117  */
7118 static const char *const KAT_GHASH[] = {
7119 
7120 	"66e94bd4ef8a2c3b884cfa59ca342b2e",
7121 	"",
7122 	"",
7123 	"00000000000000000000000000000000",
7124 
7125 	"66e94bd4ef8a2c3b884cfa59ca342b2e",
7126 	"",
7127 	"0388dace60b6a392f328c2b971b2fe78",
7128 	"f38cbb1ad69223dcc3457ae5b6b0f885",
7129 
7130 	"b83b533708bf535d0aa6e52980d53b78",
7131 	"",
7132 	"42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985",
7133 	"7f1b32b81b820d02614f8895ac1d4eac",
7134 
7135 	"b83b533708bf535d0aa6e52980d53b78",
7136 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7137 	"42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091",
7138 	"698e57f70e6ecc7fd9463b7260a9ae5f",
7139 
7140 	"b83b533708bf535d0aa6e52980d53b78",
7141 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7142 	"61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598",
7143 	"df586bb4c249b92cb6922877e444d37b",
7144 
7145 	"b83b533708bf535d0aa6e52980d53b78",
7146 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7147 	"8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5",
7148 	"1c5afe9760d3932f3c9a878aac3dc3de",
7149 
7150 	"aae06992acbf52a3e8f4a96ec9300bd7",
7151 	"",
7152 	"98e7247c07f0fe411c267e4384b0f600",
7153 	"e2c63f0ac44ad0e02efa05ab6743d4ce",
7154 
7155 	"466923ec9ae682214f2c082badb39249",
7156 	"",
7157 	"3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256",
7158 	"51110d40f6c8fff0eb1ae33445a889f0",
7159 
7160 	"466923ec9ae682214f2c082badb39249",
7161 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7162 	"3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710",
7163 	"ed2ce3062e4a8ec06db8b4c490e8a268",
7164 
7165 	"466923ec9ae682214f2c082badb39249",
7166 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7167 	"0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7",
7168 	"1e6a133806607858ee80eaf237064089",
7169 
7170 	"466923ec9ae682214f2c082badb39249",
7171 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7172 	"d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b",
7173 	"82567fb0b4cc371801eadec005968e94",
7174 
7175 	"dc95c078a2408989ad48a21492842087",
7176 	"",
7177 	"cea7403d4d606b6e074ec5d3baf39d18",
7178 	"83de425c5edc5d498f382c441041ca92",
7179 
7180 	"acbef20579b4b8ebce889bac8732dad7",
7181 	"",
7182 	"522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad",
7183 	"4db870d37cb75fcb46097c36230d1612",
7184 
7185 	"acbef20579b4b8ebce889bac8732dad7",
7186 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7187 	"522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662",
7188 	"8bd0c4d8aacd391e67cca447e8c38f65",
7189 
7190 	"acbef20579b4b8ebce889bac8732dad7",
7191 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7192 	"c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f",
7193 	"75a34288b8c68f811c52b2e9a2f97f63",
7194 
7195 	"acbef20579b4b8ebce889bac8732dad7",
7196 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7197 	"5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f",
7198 	"d5ffcf6fc5ac4d69722187421a7f170b",
7199 
7200 	NULL,
7201 };
7202 
7203 static void
7204 test_GHASH(const char *name, br_ghash gh)
7205 {
7206 	size_t u;
7207 
7208 	printf("Test %s: ", name);
7209 	fflush(stdout);
7210 
7211 	for (u = 0; KAT_GHASH[u]; u += 4) {
7212 		unsigned char h[16];
7213 		unsigned char a[100];
7214 		size_t a_len;
7215 		unsigned char c[100];
7216 		size_t c_len;
7217 		unsigned char p[16];
7218 		unsigned char y[16];
7219 		unsigned char ref[16];
7220 
7221 		hextobin(h, KAT_GHASH[u]);
7222 		a_len = hextobin(a, KAT_GHASH[u + 1]);
7223 		c_len = hextobin(c, KAT_GHASH[u + 2]);
7224 		hextobin(ref, KAT_GHASH[u + 3]);
7225 		memset(y, 0, sizeof y);
7226 		gh(y, h, a, a_len);
7227 		gh(y, h, c, c_len);
7228 		memset(p, 0, sizeof p);
7229 		br_enc32be(p + 4, (uint32_t)a_len << 3);
7230 		br_enc32be(p + 12, (uint32_t)c_len << 3);
7231 		gh(y, h, p, sizeof p);
7232 		check_equals("KAT GHASH", y, ref, sizeof ref);
7233 	}
7234 
7235 	for (u = 0; u <= 1024; u ++) {
7236 		unsigned char key[32], iv[12];
7237 		unsigned char buf[1024 + 32];
7238 		unsigned char y0[16], y1[16];
7239 		char tmp[100];
7240 
7241 		memset(key, 0, sizeof key);
7242 		memset(iv, 0, sizeof iv);
7243 		br_enc32be(key, u);
7244 		memset(buf, 0, sizeof buf);
7245 		br_chacha20_ct_run(key, iv, 1, buf, sizeof buf);
7246 
7247 		memcpy(y0, buf, 16);
7248 		br_ghash_ctmul32(y0, buf + 16, buf + 32, u);
7249 		memcpy(y1, buf, 16);
7250 		gh(y1, buf + 16, buf + 32, u);
7251 		sprintf(tmp, "XREF %s (len = %u)", name, (unsigned)u);
7252 		check_equals(tmp, y0, y1, 16);
7253 
7254 		if ((u & 31) == 0) {
7255 			printf(".");
7256 			fflush(stdout);
7257 		}
7258 	}
7259 
7260 	printf("done.\n");
7261 	fflush(stdout);
7262 }
7263 
7264 static void
7265 test_GHASH_ctmul(void)
7266 {
7267 	test_GHASH("GHASH_ctmul", br_ghash_ctmul);
7268 }
7269 
7270 static void
7271 test_GHASH_ctmul32(void)
7272 {
7273 	test_GHASH("GHASH_ctmul32", br_ghash_ctmul32);
7274 }
7275 
7276 static void
7277 test_GHASH_ctmul64(void)
7278 {
7279 	test_GHASH("GHASH_ctmul64", br_ghash_ctmul64);
7280 }
7281 
7282 static void
7283 test_GHASH_pclmul(void)
7284 {
7285 	br_ghash gh;
7286 
7287 	gh = br_ghash_pclmul_get();
7288 	if (gh == 0) {
7289 		printf("Test GHASH_pclmul: UNAVAILABLE\n");
7290 	} else {
7291 		test_GHASH("GHASH_pclmul", gh);
7292 	}
7293 }
7294 
7295 static void
7296 test_GHASH_pwr8(void)
7297 {
7298 	br_ghash gh;
7299 
7300 	gh = br_ghash_pwr8_get();
7301 	if (gh == 0) {
7302 		printf("Test GHASH_pwr8: UNAVAILABLE\n");
7303 	} else {
7304 		test_GHASH("GHASH_pwr8", gh);
7305 	}
7306 }
7307 
7308 /*
7309  * From: http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf
7310  *
7311  * Order: key, plaintext, AAD, IV, ciphertext, tag
7312  */
7313 static const char *const KAT_GCM[] = {
7314 	"00000000000000000000000000000000",
7315 	"",
7316 	"",
7317 	"000000000000000000000000",
7318 	"",
7319 	"58e2fccefa7e3061367f1d57a4e7455a",
7320 
7321 	"00000000000000000000000000000000",
7322 	"00000000000000000000000000000000",
7323 	"",
7324 	"000000000000000000000000",
7325 	"0388dace60b6a392f328c2b971b2fe78",
7326 	"ab6e47d42cec13bdf53a67b21257bddf",
7327 
7328 	"feffe9928665731c6d6a8f9467308308",
7329 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255",
7330 	"",
7331 	"cafebabefacedbaddecaf888",
7332 	"42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985",
7333 	"4d5c2af327cd64a62cf35abd2ba6fab4",
7334 
7335 	"feffe9928665731c6d6a8f9467308308",
7336 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
7337 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7338 	"cafebabefacedbaddecaf888",
7339 	"42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091",
7340 	"5bc94fbc3221a5db94fae95ae7121a47",
7341 
7342 	"feffe9928665731c6d6a8f9467308308",
7343 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
7344 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7345 	"cafebabefacedbad",
7346 	"61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598",
7347 	"3612d2e79e3b0785561be14aaca2fccb",
7348 
7349 	"feffe9928665731c6d6a8f9467308308",
7350 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
7351 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7352 	"9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b",
7353 	"8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5",
7354 	"619cc5aefffe0bfa462af43c1699d050",
7355 
7356 	"000000000000000000000000000000000000000000000000",
7357 	"",
7358 	"",
7359 	"000000000000000000000000",
7360 	"",
7361 	"cd33b28ac773f74ba00ed1f312572435",
7362 
7363 	"000000000000000000000000000000000000000000000000",
7364 	"00000000000000000000000000000000",
7365 	"",
7366 	"000000000000000000000000",
7367 	"98e7247c07f0fe411c267e4384b0f600",
7368 	"2ff58d80033927ab8ef4d4587514f0fb",
7369 
7370 	"feffe9928665731c6d6a8f9467308308feffe9928665731c",
7371 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255",
7372 	"",
7373 	"cafebabefacedbaddecaf888",
7374 	"3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256",
7375 	"9924a7c8587336bfb118024db8674a14",
7376 
7377 	"feffe9928665731c6d6a8f9467308308feffe9928665731c",
7378 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
7379 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7380 	"cafebabefacedbaddecaf888",
7381 	"3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710",
7382 	"2519498e80f1478f37ba55bd6d27618c",
7383 
7384 	"feffe9928665731c6d6a8f9467308308feffe9928665731c",
7385 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
7386 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7387 	"cafebabefacedbad",
7388 	"0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7",
7389 	"65dcc57fcf623a24094fcca40d3533f8",
7390 
7391 	"feffe9928665731c6d6a8f9467308308feffe9928665731c",
7392 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
7393 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7394 	"9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b",
7395 	"d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b",
7396 	"dcf566ff291c25bbb8568fc3d376a6d9",
7397 
7398 	"0000000000000000000000000000000000000000000000000000000000000000",
7399 	"",
7400 	"",
7401 	"000000000000000000000000",
7402 	"",
7403 	"530f8afbc74536b9a963b4f1c4cb738b",
7404 
7405 	"0000000000000000000000000000000000000000000000000000000000000000",
7406 	"00000000000000000000000000000000",
7407 	"",
7408 	"000000000000000000000000",
7409 	"cea7403d4d606b6e074ec5d3baf39d18",
7410 	"d0d1c8a799996bf0265b98b5d48ab919",
7411 
7412 	"feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308",
7413 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255",
7414 	"",
7415 	"cafebabefacedbaddecaf888",
7416 	"522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad",
7417 	"b094dac5d93471bdec1a502270e3cc6c",
7418 
7419 	"feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308",
7420 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
7421 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7422 	"cafebabefacedbaddecaf888",
7423 	"522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662",
7424 	"76fc6ece0f4e1768cddf8853bb2d551b",
7425 
7426 	"feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308",
7427 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
7428 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7429 	"cafebabefacedbad",
7430 	"c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f",
7431 	"3a337dbf46a792c45e454913fe2ea8f2",
7432 
7433 	"feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308",
7434 	"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
7435 	"feedfacedeadbeeffeedfacedeadbeefabaddad2",
7436 	"9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b",
7437 	"5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f",
7438 	"a44a8266ee1c8eb0c8b5d4cf5ae9f19a",
7439 
7440 	NULL
7441 };
7442 
7443 static void
7444 test_GCM(void)
7445 {
7446 	size_t u;
7447 
7448 	printf("Test GCM: ");
7449 	fflush(stdout);
7450 
7451 	for (u = 0; KAT_GCM[u]; u += 6) {
7452 		unsigned char key[32];
7453 		unsigned char plain[100];
7454 		unsigned char aad[100];
7455 		unsigned char iv[100];
7456 		unsigned char cipher[100];
7457 		unsigned char tag[100];
7458 		size_t key_len, plain_len, aad_len, iv_len;
7459 		br_aes_ct_ctr_keys bc;
7460 		br_gcm_context gc;
7461 		unsigned char tmp[100], out[16];
7462 		size_t v, tag_len;
7463 
7464 		key_len = hextobin(key, KAT_GCM[u]);
7465 		plain_len = hextobin(plain, KAT_GCM[u + 1]);
7466 		aad_len = hextobin(aad, KAT_GCM[u + 2]);
7467 		iv_len = hextobin(iv, KAT_GCM[u + 3]);
7468 		hextobin(cipher, KAT_GCM[u + 4]);
7469 		hextobin(tag, KAT_GCM[u + 5]);
7470 
7471 		br_aes_ct_ctr_init(&bc, key, key_len);
7472 		br_gcm_init(&gc, &bc.vtable, br_ghash_ctmul32);
7473 
7474 		memset(tmp, 0x54, sizeof tmp);
7475 
7476 		/*
7477 		 * Basic operation.
7478 		 */
7479 		memcpy(tmp, plain, plain_len);
7480 		br_gcm_reset(&gc, iv, iv_len);
7481 		br_gcm_aad_inject(&gc, aad, aad_len);
7482 		br_gcm_flip(&gc);
7483 		br_gcm_run(&gc, 1, tmp, plain_len);
7484 		br_gcm_get_tag(&gc, out);
7485 		check_equals("KAT GCM 1", tmp, cipher, plain_len);
7486 		check_equals("KAT GCM 2", out, tag, 16);
7487 
7488 		br_gcm_reset(&gc, iv, iv_len);
7489 		br_gcm_aad_inject(&gc, aad, aad_len);
7490 		br_gcm_flip(&gc);
7491 		br_gcm_run(&gc, 0, tmp, plain_len);
7492 		check_equals("KAT GCM 3", tmp, plain, plain_len);
7493 		if (!br_gcm_check_tag(&gc, tag)) {
7494 			fprintf(stderr, "Tag not verified (1)\n");
7495 			exit(EXIT_FAILURE);
7496 		}
7497 
7498 		for (v = plain_len; v < sizeof tmp; v ++) {
7499 			if (tmp[v] != 0x54) {
7500 				fprintf(stderr, "overflow on data\n");
7501 				exit(EXIT_FAILURE);
7502 			}
7503 		}
7504 
7505 		/*
7506 		 * Byte-by-byte injection.
7507 		 */
7508 		br_gcm_reset(&gc, iv, iv_len);
7509 		for (v = 0; v < aad_len; v ++) {
7510 			br_gcm_aad_inject(&gc, aad + v, 1);
7511 		}
7512 		br_gcm_flip(&gc);
7513 		for (v = 0; v < plain_len; v ++) {
7514 			br_gcm_run(&gc, 1, tmp + v, 1);
7515 		}
7516 		check_equals("KAT GCM 4", tmp, cipher, plain_len);
7517 		if (!br_gcm_check_tag(&gc, tag)) {
7518 			fprintf(stderr, "Tag not verified (2)\n");
7519 			exit(EXIT_FAILURE);
7520 		}
7521 
7522 		br_gcm_reset(&gc, iv, iv_len);
7523 		for (v = 0; v < aad_len; v ++) {
7524 			br_gcm_aad_inject(&gc, aad + v, 1);
7525 		}
7526 		br_gcm_flip(&gc);
7527 		for (v = 0; v < plain_len; v ++) {
7528 			br_gcm_run(&gc, 0, tmp + v, 1);
7529 		}
7530 		br_gcm_get_tag(&gc, out);
7531 		check_equals("KAT GCM 5", tmp, plain, plain_len);
7532 		check_equals("KAT GCM 6", out, tag, 16);
7533 
7534 		/*
7535 		 * Check that alterations are detected.
7536 		 */
7537 		for (v = 0; v < aad_len; v ++) {
7538 			memcpy(tmp, cipher, plain_len);
7539 			br_gcm_reset(&gc, iv, iv_len);
7540 			aad[v] ^= 0x04;
7541 			br_gcm_aad_inject(&gc, aad, aad_len);
7542 			aad[v] ^= 0x04;
7543 			br_gcm_flip(&gc);
7544 			br_gcm_run(&gc, 0, tmp, plain_len);
7545 			check_equals("KAT GCM 7", tmp, plain, plain_len);
7546 			if (br_gcm_check_tag(&gc, tag)) {
7547 				fprintf(stderr, "Tag should have changed\n");
7548 				exit(EXIT_FAILURE);
7549 			}
7550 		}
7551 
7552 		/*
7553 		 * Tag truncation.
7554 		 */
7555 		for (tag_len = 1; tag_len <= 16; tag_len ++) {
7556 			memset(out, 0x54, sizeof out);
7557 			memcpy(tmp, plain, plain_len);
7558 			br_gcm_reset(&gc, iv, iv_len);
7559 			br_gcm_aad_inject(&gc, aad, aad_len);
7560 			br_gcm_flip(&gc);
7561 			br_gcm_run(&gc, 1, tmp, plain_len);
7562 			br_gcm_get_tag_trunc(&gc, out, tag_len);
7563 			check_equals("KAT GCM 8", out, tag, tag_len);
7564 			for (v = tag_len; v < sizeof out; v ++) {
7565 				if (out[v] != 0x54) {
7566 					fprintf(stderr, "overflow on tag\n");
7567 					exit(EXIT_FAILURE);
7568 				}
7569 			}
7570 
7571 			memcpy(tmp, plain, plain_len);
7572 			br_gcm_reset(&gc, iv, iv_len);
7573 			br_gcm_aad_inject(&gc, aad, aad_len);
7574 			br_gcm_flip(&gc);
7575 			br_gcm_run(&gc, 1, tmp, plain_len);
7576 			if (!br_gcm_check_tag_trunc(&gc, out, tag_len)) {
7577 				fprintf(stderr, "Tag not verified (3)\n");
7578 				exit(EXIT_FAILURE);
7579 			}
7580 		}
7581 
7582 		printf(".");
7583 		fflush(stdout);
7584 	}
7585 
7586 	printf(" done.\n");
7587 	fflush(stdout);
7588 }
7589 
7590 /*
7591  * From "The EAX Mode of Operation (A Two-Pass Authenticated Encryption
7592  * Scheme Optimized for Simplicity and Efficiency)" (Bellare, Rogaway,
7593  * Wagner), presented at FSE 2004. Full article is available at:
7594  *   http://web.cs.ucdavis.edu/~rogaway/papers/eax.html
7595  *
7596  * EAX specification concatenates the authentication tag at the end of
7597  * the ciphertext; in our API and the vectors below, the tag is separate.
7598  *
7599  * Order is: plaintext, key, nonce, header, ciphertext, tag.
7600  */
7601 static const char *const KAT_EAX[] = {
7602 	"",
7603 	"233952dee4d5ed5f9b9c6d6ff80ff478",
7604 	"62ec67f9c3a4a407fcb2a8c49031a8b3",
7605 	"6bfb914fd07eae6b",
7606 	"",
7607 	"e037830e8389f27b025a2d6527e79d01",
7608 
7609 	"f7fb",
7610 	"91945d3f4dcbee0bf45ef52255f095a4",
7611 	"becaf043b0a23d843194ba972c66debd",
7612 	"fa3bfd4806eb53fa",
7613 	"19dd",
7614 	"5c4c9331049d0bdab0277408f67967e5",
7615 
7616 	"1a47cb4933",
7617 	"01f74ad64077f2e704c0f60ada3dd523",
7618 	"70c3db4f0d26368400a10ed05d2bff5e",
7619 	"234a3463c1264ac6",
7620 	"d851d5bae0",
7621 	"3a59f238a23e39199dc9266626c40f80",
7622 
7623 	"481c9e39b1",
7624 	"d07cf6cbb7f313bdde66b727afd3c5e8",
7625 	"8408dfff3c1a2b1292dc199e46b7d617",
7626 	"33cce2eabff5a79d",
7627 	"632a9d131a",
7628 	"d4c168a4225d8e1ff755939974a7bede",
7629 
7630 	"40d0c07da5e4",
7631 	"35b6d0580005bbc12b0587124557d2c2",
7632 	"fdb6b06676eedc5c61d74276e1f8e816",
7633 	"aeb96eaebe2970e9",
7634 	"071dfe16c675",
7635 	"cb0677e536f73afe6a14b74ee49844dd",
7636 
7637 	"4de3b35c3fc039245bd1fb7d",
7638 	"bd8e6e11475e60b268784c38c62feb22",
7639 	"6eac5c93072d8e8513f750935e46da1b",
7640 	"d4482d1ca78dce0f",
7641 	"835bb4f15d743e350e728414",
7642 	"abb8644fd6ccb86947c5e10590210a4f",
7643 
7644 	"8b0a79306c9ce7ed99dae4f87f8dd61636",
7645 	"7c77d6e813bed5ac98baa417477a2e7d",
7646 	"1a8c98dcd73d38393b2bf1569deefc19",
7647 	"65d2017990d62528",
7648 	"02083e3979da014812f59f11d52630da30",
7649 	"137327d10649b0aa6e1c181db617d7f2",
7650 
7651 	"1bda122bce8a8dbaf1877d962b8592dd2d56",
7652 	"5fff20cafab119ca2fc73549e20f5b0d",
7653 	"dde59b97d722156d4d9aff2bc7559826",
7654 	"54b9f04e6a09189a",
7655 	"2ec47b2c4954a489afc7ba4897edcdae8cc3",
7656 	"3b60450599bd02c96382902aef7f832a",
7657 
7658 	"6cf36720872b8513f6eab1a8a44438d5ef11",
7659 	"a4a4782bcffd3ec5e7ef6d8c34a56123",
7660 	"b781fcf2f75fa5a8de97a9ca48e522ec",
7661 	"899a175897561d7e",
7662 	"0de18fd0fdd91e7af19f1d8ee8733938b1e8",
7663 	"e7f6d2231618102fdb7fe55ff1991700",
7664 
7665 	"ca40d7446e545ffaed3bd12a740a659ffbbb3ceab7",
7666 	"8395fcf1e95bebd697bd010bc766aac3",
7667 	"22e7add93cfc6393c57ec0b3c17d6b44",
7668 	"126735fcc320d25a",
7669 	"cb8920f87a6c75cff39627b56e3ed197c552d295a7",
7670 	"cfc46afc253b4652b1af3795b124ab6e",
7671 
7672 	NULL
7673 };
7674 
7675 static void
7676 test_EAX_inner(const char *name, const br_block_ctrcbc_class *vt)
7677 {
7678 	size_t u;
7679 
7680 	printf("Test EAX %s: ", name);
7681 	fflush(stdout);
7682 
7683 	for (u = 0; KAT_EAX[u]; u += 6) {
7684 		unsigned char plain[100];
7685 		unsigned char key[32];
7686 		unsigned char nonce[100];
7687 		unsigned char aad[100];
7688 		unsigned char cipher[100];
7689 		unsigned char tag[100];
7690 		size_t plain_len, key_len, nonce_len, aad_len;
7691 		br_aes_gen_ctrcbc_keys bc;
7692 		br_eax_context ec;
7693 		br_eax_state st;
7694 		unsigned char tmp[100], out[16];
7695 		size_t v, tag_len;
7696 
7697 		plain_len = hextobin(plain, KAT_EAX[u]);
7698 		key_len = hextobin(key, KAT_EAX[u + 1]);
7699 		nonce_len = hextobin(nonce, KAT_EAX[u + 2]);
7700 		aad_len = hextobin(aad, KAT_EAX[u + 3]);
7701 		hextobin(cipher, KAT_EAX[u + 4]);
7702 		hextobin(tag, KAT_EAX[u + 5]);
7703 
7704 		vt->init(&bc.vtable, key, key_len);
7705 		br_eax_init(&ec, &bc.vtable);
7706 
7707 		memset(tmp, 0x54, sizeof tmp);
7708 
7709 		/*
7710 		 * Basic operation.
7711 		 */
7712 		memcpy(tmp, plain, plain_len);
7713 		br_eax_reset(&ec, nonce, nonce_len);
7714 		br_eax_aad_inject(&ec, aad, aad_len);
7715 		br_eax_flip(&ec);
7716 		br_eax_run(&ec, 1, tmp, plain_len);
7717 		br_eax_get_tag(&ec, out);
7718 		check_equals("KAT EAX 1", tmp, cipher, plain_len);
7719 		check_equals("KAT EAX 2", out, tag, 16);
7720 
7721 		br_eax_reset(&ec, nonce, nonce_len);
7722 		br_eax_aad_inject(&ec, aad, aad_len);
7723 		br_eax_flip(&ec);
7724 		br_eax_run(&ec, 0, tmp, plain_len);
7725 		check_equals("KAT EAX 3", tmp, plain, plain_len);
7726 		if (!br_eax_check_tag(&ec, tag)) {
7727 			fprintf(stderr, "Tag not verified (1)\n");
7728 			exit(EXIT_FAILURE);
7729 		}
7730 
7731 		for (v = plain_len; v < sizeof tmp; v ++) {
7732 			if (tmp[v] != 0x54) {
7733 				fprintf(stderr, "overflow on data\n");
7734 				exit(EXIT_FAILURE);
7735 			}
7736 		}
7737 
7738 		/*
7739 		 * Byte-by-byte injection.
7740 		 */
7741 		br_eax_reset(&ec, nonce, nonce_len);
7742 		for (v = 0; v < aad_len; v ++) {
7743 			br_eax_aad_inject(&ec, aad + v, 1);
7744 		}
7745 		br_eax_flip(&ec);
7746 		for (v = 0; v < plain_len; v ++) {
7747 			br_eax_run(&ec, 1, tmp + v, 1);
7748 		}
7749 		check_equals("KAT EAX 4", tmp, cipher, plain_len);
7750 		if (!br_eax_check_tag(&ec, tag)) {
7751 			fprintf(stderr, "Tag not verified (2)\n");
7752 			exit(EXIT_FAILURE);
7753 		}
7754 
7755 		br_eax_reset(&ec, nonce, nonce_len);
7756 		for (v = 0; v < aad_len; v ++) {
7757 			br_eax_aad_inject(&ec, aad + v, 1);
7758 		}
7759 		br_eax_flip(&ec);
7760 		for (v = 0; v < plain_len; v ++) {
7761 			br_eax_run(&ec, 0, tmp + v, 1);
7762 		}
7763 		br_eax_get_tag(&ec, out);
7764 		check_equals("KAT EAX 5", tmp, plain, plain_len);
7765 		check_equals("KAT EAX 6", out, tag, 16);
7766 
7767 		/*
7768 		 * Check that alterations are detected.
7769 		 */
7770 		for (v = 0; v < aad_len; v ++) {
7771 			memcpy(tmp, cipher, plain_len);
7772 			br_eax_reset(&ec, nonce, nonce_len);
7773 			aad[v] ^= 0x04;
7774 			br_eax_aad_inject(&ec, aad, aad_len);
7775 			aad[v] ^= 0x04;
7776 			br_eax_flip(&ec);
7777 			br_eax_run(&ec, 0, tmp, plain_len);
7778 			check_equals("KAT EAX 7", tmp, plain, plain_len);
7779 			if (br_eax_check_tag(&ec, tag)) {
7780 				fprintf(stderr, "Tag should have changed\n");
7781 				exit(EXIT_FAILURE);
7782 			}
7783 		}
7784 
7785 		/*
7786 		 * Tag truncation.
7787 		 */
7788 		for (tag_len = 1; tag_len <= 16; tag_len ++) {
7789 			memset(out, 0x54, sizeof out);
7790 			memcpy(tmp, plain, plain_len);
7791 			br_eax_reset(&ec, nonce, nonce_len);
7792 			br_eax_aad_inject(&ec, aad, aad_len);
7793 			br_eax_flip(&ec);
7794 			br_eax_run(&ec, 1, tmp, plain_len);
7795 			br_eax_get_tag_trunc(&ec, out, tag_len);
7796 			check_equals("KAT EAX 8", out, tag, tag_len);
7797 			for (v = tag_len; v < sizeof out; v ++) {
7798 				if (out[v] != 0x54) {
7799 					fprintf(stderr, "overflow on tag\n");
7800 					exit(EXIT_FAILURE);
7801 				}
7802 			}
7803 
7804 			memcpy(tmp, plain, plain_len);
7805 			br_eax_reset(&ec, nonce, nonce_len);
7806 			br_eax_aad_inject(&ec, aad, aad_len);
7807 			br_eax_flip(&ec);
7808 			br_eax_run(&ec, 1, tmp, plain_len);
7809 			if (!br_eax_check_tag_trunc(&ec, out, tag_len)) {
7810 				fprintf(stderr, "Tag not verified (3)\n");
7811 				exit(EXIT_FAILURE);
7812 			}
7813 		}
7814 
7815 		printf(".");
7816 		fflush(stdout);
7817 
7818 		/*
7819 		 * For capture tests, we need the message to be non-empty.
7820 		 */
7821 		if (plain_len == 0) {
7822 			continue;
7823 		}
7824 
7825 		/*
7826 		 * Captured state, pre-AAD. This requires the AAD and the
7827 		 * message to be non-empty.
7828 		 */
7829 		br_eax_capture(&ec, &st);
7830 
7831 		if (aad_len > 0) {
7832 			br_eax_reset_pre_aad(&ec, &st, nonce, nonce_len);
7833 			br_eax_aad_inject(&ec, aad, aad_len);
7834 			br_eax_flip(&ec);
7835 			memcpy(tmp, plain, plain_len);
7836 			br_eax_run(&ec, 1, tmp, plain_len);
7837 			br_eax_get_tag(&ec, out);
7838 			check_equals("KAT EAX 9", tmp, cipher, plain_len);
7839 			check_equals("KAT EAX 10", out, tag, 16);
7840 
7841 			br_eax_reset_pre_aad(&ec, &st, nonce, nonce_len);
7842 			br_eax_aad_inject(&ec, aad, aad_len);
7843 			br_eax_flip(&ec);
7844 			br_eax_run(&ec, 0, tmp, plain_len);
7845 			br_eax_get_tag(&ec, out);
7846 			check_equals("KAT EAX 11", tmp, plain, plain_len);
7847 			check_equals("KAT EAX 12", out, tag, 16);
7848 		}
7849 
7850 		/*
7851 		 * Captured state, post-AAD. This requires the message to
7852 		 * be non-empty.
7853 		 */
7854 		br_eax_reset(&ec, nonce, nonce_len);
7855 		br_eax_aad_inject(&ec, aad, aad_len);
7856 		br_eax_flip(&ec);
7857 		br_eax_get_aad_mac(&ec, &st);
7858 
7859 		br_eax_reset_post_aad(&ec, &st, nonce, nonce_len);
7860 		memcpy(tmp, plain, plain_len);
7861 		br_eax_run(&ec, 1, tmp, plain_len);
7862 		br_eax_get_tag(&ec, out);
7863 		check_equals("KAT EAX 13", tmp, cipher, plain_len);
7864 		check_equals("KAT EAX 14", out, tag, 16);
7865 
7866 		br_eax_reset_post_aad(&ec, &st, nonce, nonce_len);
7867 		br_eax_run(&ec, 0, tmp, plain_len);
7868 		br_eax_get_tag(&ec, out);
7869 		check_equals("KAT EAX 15", tmp, plain, plain_len);
7870 		check_equals("KAT EAX 16", out, tag, 16);
7871 
7872 		printf(".");
7873 		fflush(stdout);
7874 	}
7875 
7876 	printf(" done.\n");
7877 	fflush(stdout);
7878 }
7879 
7880 static void
7881 test_EAX(void)
7882 {
7883 	const br_block_ctrcbc_class *x_ctrcbc;
7884 
7885 	test_EAX_inner("aes_big", &br_aes_big_ctrcbc_vtable);
7886 	test_EAX_inner("aes_small", &br_aes_small_ctrcbc_vtable);
7887 	test_EAX_inner("aes_ct", &br_aes_ct_ctrcbc_vtable);
7888 	test_EAX_inner("aes_ct64", &br_aes_ct64_ctrcbc_vtable);
7889 
7890 	x_ctrcbc = br_aes_x86ni_ctrcbc_get_vtable();
7891 	if (x_ctrcbc != NULL) {
7892 		test_EAX_inner("aes_x86ni", x_ctrcbc);
7893 	} else {
7894 		printf("Test EAX aes_x86ni: UNAVAILABLE\n");
7895 	}
7896 
7897 	x_ctrcbc = br_aes_pwr8_ctrcbc_get_vtable();
7898 	if (x_ctrcbc != NULL) {
7899 		test_EAX_inner("aes_pwr8", x_ctrcbc);
7900 	} else {
7901 		printf("Test EAX aes_pwr8: UNAVAILABLE\n");
7902 	}
7903 }
7904 
7905 /*
7906  * From NIST SP 800-38C, appendix C.
7907  *
7908  * CCM specification concatenates the authentication tag at the end of
7909  * the ciphertext; in our API and the vectors below, the tag is separate.
7910  *
7911  * Order is: key, nonce, aad, plaintext, ciphertext, tag.
7912  */
7913 static const char *const KAT_CCM[] = {
7914 	"404142434445464748494a4b4c4d4e4f",
7915 	"10111213141516",
7916 	"0001020304050607",
7917 	"20212223",
7918 	"7162015b",
7919 	"4dac255d",
7920 
7921 	"404142434445464748494a4b4c4d4e4f",
7922 	"1011121314151617",
7923 	"000102030405060708090a0b0c0d0e0f",
7924 	"202122232425262728292a2b2c2d2e2f",
7925 	"d2a1f0e051ea5f62081a7792073d593d",
7926 	"1fc64fbfaccd",
7927 
7928 	"404142434445464748494a4b4c4d4e4f",
7929 	"101112131415161718191a1b",
7930 	"000102030405060708090a0b0c0d0e0f10111213",
7931 	"202122232425262728292a2b2c2d2e2f3031323334353637",
7932 	"e3b201a9f5b71a7a9b1ceaeccd97e70b6176aad9a4428aa5",
7933 	"484392fbc1b09951",
7934 
7935 	"404142434445464748494a4b4c4d4e4f",
7936 	"101112131415161718191a1b1c",
7937 	NULL,
7938 	"202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
7939 	"69915dad1e84c6376a68c2967e4dab615ae0fd1faec44cc484828529463ccf72",
7940 	"b4ac6bec93e8598e7f0dadbcea5b",
7941 
7942 	NULL
7943 };
7944 
7945 static void
7946 test_CCM_inner(const char *name, const br_block_ctrcbc_class *vt)
7947 {
7948 	size_t u;
7949 
7950 	printf("Test CCM %s: ", name);
7951 	fflush(stdout);
7952 
7953 	for (u = 0; KAT_CCM[u]; u += 6) {
7954 		unsigned char plain[100];
7955 		unsigned char key[32];
7956 		unsigned char nonce[100];
7957 		unsigned char aad_buf[100], *aad;
7958 		unsigned char cipher[100];
7959 		unsigned char tag[100];
7960 		size_t plain_len, key_len, nonce_len, aad_len, tag_len;
7961 		br_aes_gen_ctrcbc_keys bc;
7962 		br_ccm_context ec;
7963 		unsigned char tmp[100], out[16];
7964 		size_t v;
7965 
7966 		key_len = hextobin(key, KAT_CCM[u]);
7967 		nonce_len = hextobin(nonce, KAT_CCM[u + 1]);
7968 		if (KAT_CCM[u + 2] == NULL) {
7969 			aad_len = 65536;
7970 			aad = malloc(aad_len);
7971 			if (aad == NULL) {
7972 				fprintf(stderr, "OOM error\n");
7973 				exit(EXIT_FAILURE);
7974 			}
7975 			for (v = 0; v < 65536; v ++) {
7976 				aad[v] = (unsigned char)v;
7977 			}
7978 		} else {
7979 			aad = aad_buf;
7980 			aad_len = hextobin(aad, KAT_CCM[u + 2]);
7981 		}
7982 		plain_len = hextobin(plain, KAT_CCM[u + 3]);
7983 		hextobin(cipher, KAT_CCM[u + 4]);
7984 		tag_len = hextobin(tag, KAT_CCM[u + 5]);
7985 
7986 		vt->init(&bc.vtable, key, key_len);
7987 		br_ccm_init(&ec, &bc.vtable);
7988 
7989 		memset(tmp, 0x54, sizeof tmp);
7990 
7991 		/*
7992 		 * Basic operation.
7993 		 */
7994 		memcpy(tmp, plain, plain_len);
7995 		if (!br_ccm_reset(&ec, nonce, nonce_len,
7996 			aad_len, plain_len, tag_len))
7997 		{
7998 			fprintf(stderr, "CCM reset failed\n");
7999 			exit(EXIT_FAILURE);
8000 		}
8001 		br_ccm_aad_inject(&ec, aad, aad_len);
8002 		br_ccm_flip(&ec);
8003 		br_ccm_run(&ec, 1, tmp, plain_len);
8004 		if (br_ccm_get_tag(&ec, out) != tag_len) {
8005 			fprintf(stderr, "CCM returned wrong tag length\n");
8006 			exit(EXIT_FAILURE);
8007 		}
8008 		check_equals("KAT CCM 1", tmp, cipher, plain_len);
8009 		check_equals("KAT CCM 2", out, tag, tag_len);
8010 
8011 		br_ccm_reset(&ec, nonce, nonce_len,
8012 			aad_len, plain_len, tag_len);
8013 		br_ccm_aad_inject(&ec, aad, aad_len);
8014 		br_ccm_flip(&ec);
8015 		br_ccm_run(&ec, 0, tmp, plain_len);
8016 		check_equals("KAT CCM 3", tmp, plain, plain_len);
8017 		if (!br_ccm_check_tag(&ec, tag)) {
8018 			fprintf(stderr, "Tag not verified (1)\n");
8019 			exit(EXIT_FAILURE);
8020 		}
8021 
8022 		for (v = plain_len; v < sizeof tmp; v ++) {
8023 			if (tmp[v] != 0x54) {
8024 				fprintf(stderr, "overflow on data\n");
8025 				exit(EXIT_FAILURE);
8026 			}
8027 		}
8028 
8029 		/*
8030 		 * Byte-by-byte injection.
8031 		 */
8032 		br_ccm_reset(&ec, nonce, nonce_len,
8033 			aad_len, plain_len, tag_len);
8034 		for (v = 0; v < aad_len; v ++) {
8035 			br_ccm_aad_inject(&ec, aad + v, 1);
8036 		}
8037 		br_ccm_flip(&ec);
8038 		for (v = 0; v < plain_len; v ++) {
8039 			br_ccm_run(&ec, 1, tmp + v, 1);
8040 		}
8041 		check_equals("KAT CCM 4", tmp, cipher, plain_len);
8042 		if (!br_ccm_check_tag(&ec, tag)) {
8043 			fprintf(stderr, "Tag not verified (2)\n");
8044 			exit(EXIT_FAILURE);
8045 		}
8046 
8047 		br_ccm_reset(&ec, nonce, nonce_len,
8048 			aad_len, plain_len, tag_len);
8049 		for (v = 0; v < aad_len; v ++) {
8050 			br_ccm_aad_inject(&ec, aad + v, 1);
8051 		}
8052 		br_ccm_flip(&ec);
8053 		for (v = 0; v < plain_len; v ++) {
8054 			br_ccm_run(&ec, 0, tmp + v, 1);
8055 		}
8056 		br_ccm_get_tag(&ec, out);
8057 		check_equals("KAT CCM 5", tmp, plain, plain_len);
8058 		check_equals("KAT CCM 6", out, tag, tag_len);
8059 
8060 		/*
8061 		 * Check that alterations are detected.
8062 		 */
8063 		for (v = 0; v < aad_len; v ++) {
8064 			memcpy(tmp, cipher, plain_len);
8065 			br_ccm_reset(&ec, nonce, nonce_len,
8066 				aad_len, plain_len, tag_len);
8067 			aad[v] ^= 0x04;
8068 			br_ccm_aad_inject(&ec, aad, aad_len);
8069 			aad[v] ^= 0x04;
8070 			br_ccm_flip(&ec);
8071 			br_ccm_run(&ec, 0, tmp, plain_len);
8072 			check_equals("KAT CCM 7", tmp, plain, plain_len);
8073 			if (br_ccm_check_tag(&ec, tag)) {
8074 				fprintf(stderr, "Tag should have changed\n");
8075 				exit(EXIT_FAILURE);
8076 			}
8077 
8078 			/*
8079 			 * When the AAD is really big, we don't want to do
8080 			 * the complete quadratic operation.
8081 			 */
8082 			if (v >= 32) {
8083 				break;
8084 			}
8085 		}
8086 
8087 		if (aad != aad_buf) {
8088 			free(aad);
8089 		}
8090 
8091 		printf(".");
8092 		fflush(stdout);
8093 	}
8094 
8095 	printf(" done.\n");
8096 	fflush(stdout);
8097 }
8098 
8099 static void
8100 test_CCM(void)
8101 {
8102 	const br_block_ctrcbc_class *x_ctrcbc;
8103 
8104 	test_CCM_inner("aes_big", &br_aes_big_ctrcbc_vtable);
8105 	test_CCM_inner("aes_small", &br_aes_small_ctrcbc_vtable);
8106 	test_CCM_inner("aes_ct", &br_aes_ct_ctrcbc_vtable);
8107 	test_CCM_inner("aes_ct64", &br_aes_ct64_ctrcbc_vtable);
8108 
8109 	x_ctrcbc = br_aes_x86ni_ctrcbc_get_vtable();
8110 	if (x_ctrcbc != NULL) {
8111 		test_CCM_inner("aes_x86ni", x_ctrcbc);
8112 	} else {
8113 		printf("Test CCM aes_x86ni: UNAVAILABLE\n");
8114 	}
8115 
8116 	x_ctrcbc = br_aes_pwr8_ctrcbc_get_vtable();
8117 	if (x_ctrcbc != NULL) {
8118 		test_CCM_inner("aes_pwr8", x_ctrcbc);
8119 	} else {
8120 		printf("Test CCM aes_pwr8: UNAVAILABLE\n");
8121 	}
8122 }
8123 
8124 static void
8125 test_EC_inner(const char *sk, const char *sU,
8126 	const br_ec_impl *impl, int curve)
8127 {
8128 	unsigned char bk[70];
8129 	unsigned char eG[150], eU[150];
8130 	uint32_t n[22], n0i;
8131 	size_t klen, ulen, nlen;
8132 	const br_ec_curve_def *cd;
8133 	br_hmac_drbg_context rng;
8134 	int i;
8135 
8136 	klen = hextobin(bk, sk);
8137 	ulen = hextobin(eU, sU);
8138 	switch (curve) {
8139 	case BR_EC_secp256r1:
8140 		cd = &br_secp256r1;
8141 		break;
8142 	case BR_EC_secp384r1:
8143 		cd = &br_secp384r1;
8144 		break;
8145 	case BR_EC_secp521r1:
8146 		cd = &br_secp521r1;
8147 		break;
8148 	default:
8149 		fprintf(stderr, "Unknown curve: %d\n", curve);
8150 		exit(EXIT_FAILURE);
8151 		break;
8152 	}
8153 	if (ulen != cd->generator_len) {
8154 		fprintf(stderr, "KAT vector wrong (%lu / %lu)\n",
8155 			(unsigned long)ulen,
8156 			(unsigned long)cd->generator_len);
8157 	}
8158 	memcpy(eG, cd->generator, ulen);
8159 	if (impl->mul(eG, ulen, bk, klen, curve) != 1) {
8160 		fprintf(stderr, "KAT multiplication failed\n");
8161 		exit(EXIT_FAILURE);
8162 	}
8163 	if (memcmp(eG, eU, ulen) != 0) {
8164 		fprintf(stderr, "KAT mul: mismatch\n");
8165 		exit(EXIT_FAILURE);
8166 	}
8167 
8168 	/*
8169 	 * Test the two-point-mul function. We want to test the basic
8170 	 * functionality, and the following special cases:
8171 	 *   x = y
8172 	 *   x + y = curve order
8173 	 */
8174 	nlen = cd->order_len;
8175 	br_i31_decode(n, cd->order, nlen);
8176 	n0i = br_i31_ninv31(n[1]);
8177 	br_hmac_drbg_init(&rng, &br_sha256_vtable, "seed for EC", 11);
8178 	for (i = 0; i < 10; i ++) {
8179 		unsigned char ba[80], bb[80], bx[80], by[80], bz[80];
8180 		uint32_t a[22], b[22], x[22], y[22], z[22], t1[22], t2[22];
8181 		uint32_t r;
8182 		unsigned char eA[160], eB[160], eC[160], eD[160];
8183 
8184 		/*
8185 		 * Generate random a and b, and compute A = a*G and B = b*G.
8186 		 */
8187 		br_hmac_drbg_generate(&rng, ba, sizeof ba);
8188 		br_i31_decode_reduce(a, ba, sizeof ba, n);
8189 		br_i31_encode(ba, nlen, a);
8190 		br_hmac_drbg_generate(&rng, bb, sizeof bb);
8191 		br_i31_decode_reduce(b, bb, sizeof bb, n);
8192 		br_i31_encode(bb, nlen, b);
8193 		memcpy(eA, cd->generator, ulen);
8194 		impl->mul(eA, ulen, ba, nlen, cd->curve);
8195 		memcpy(eB, cd->generator, ulen);
8196 		impl->mul(eB, ulen, bb, nlen, cd->curve);
8197 
8198 		/*
8199 		 * Generate random x and y (modulo n).
8200 		 */
8201 		br_hmac_drbg_generate(&rng, bx, sizeof bx);
8202 		br_i31_decode_reduce(x, bx, sizeof bx, n);
8203 		br_i31_encode(bx, nlen, x);
8204 		br_hmac_drbg_generate(&rng, by, sizeof by);
8205 		br_i31_decode_reduce(y, by, sizeof by, n);
8206 		br_i31_encode(by, nlen, y);
8207 
8208 		/*
8209 		 * Compute z = a*x + b*y (mod n).
8210 		 */
8211 		memcpy(t1, x, sizeof x);
8212 		br_i31_to_monty(t1, n);
8213 		br_i31_montymul(z, a, t1, n, n0i);
8214 		memcpy(t1, y, sizeof y);
8215 		br_i31_to_monty(t1, n);
8216 		br_i31_montymul(t2, b, t1, n, n0i);
8217 		r = br_i31_add(z, t2, 1);
8218 		r |= br_i31_sub(z, n, 0) ^ 1;
8219 		br_i31_sub(z, n, r);
8220 		br_i31_encode(bz, nlen, z);
8221 
8222 		/*
8223 		 * Compute C = x*A + y*B with muladd(), and also
8224 		 * D = z*G with mul(). The two points must match.
8225 		 */
8226 		memcpy(eC, eA, ulen);
8227 		if (impl->muladd(eC, eB, ulen,
8228 			bx, nlen, by, nlen, cd->curve) != 1)
8229 		{
8230 			fprintf(stderr, "muladd() failed (1)\n");
8231 			exit(EXIT_FAILURE);
8232 		}
8233 		memcpy(eD, cd->generator, ulen);
8234 		if (impl->mul(eD, ulen, bz, nlen, cd->curve) != 1) {
8235 			fprintf(stderr, "mul() failed (1)\n");
8236 			exit(EXIT_FAILURE);
8237 		}
8238 		if (memcmp(eC, eD, nlen) != 0) {
8239 			fprintf(stderr, "mul() / muladd() mismatch\n");
8240 			exit(EXIT_FAILURE);
8241 		}
8242 
8243 		/*
8244 		 * Also recomputed D = z*G with mulgen(). This must
8245 		 * again match.
8246 		 */
8247 		memset(eD, 0, ulen);
8248 		if (impl->mulgen(eD, bz, nlen, cd->curve) != ulen) {
8249 			fprintf(stderr, "mulgen() failed: wrong length\n");
8250 			exit(EXIT_FAILURE);
8251 		}
8252 		if (memcmp(eC, eD, nlen) != 0) {
8253 			fprintf(stderr, "mulgen() / muladd() mismatch\n");
8254 			exit(EXIT_FAILURE);
8255 		}
8256 
8257 		/*
8258 		 * Check with x*A = y*B. We do so by setting b = x and y = a.
8259 		 */
8260 		memcpy(b, x, sizeof x);
8261 		br_i31_encode(bb, nlen, b);
8262 		memcpy(eB, cd->generator, ulen);
8263 		impl->mul(eB, ulen, bb, nlen, cd->curve);
8264 		memcpy(y, a, sizeof a);
8265 		br_i31_encode(by, nlen, y);
8266 
8267 		memcpy(t1, x, sizeof x);
8268 		br_i31_to_monty(t1, n);
8269 		br_i31_montymul(z, a, t1, n, n0i);
8270 		memcpy(t1, y, sizeof y);
8271 		br_i31_to_monty(t1, n);
8272 		br_i31_montymul(t2, b, t1, n, n0i);
8273 		r = br_i31_add(z, t2, 1);
8274 		r |= br_i31_sub(z, n, 0) ^ 1;
8275 		br_i31_sub(z, n, r);
8276 		br_i31_encode(bz, nlen, z);
8277 
8278 		memcpy(eC, eA, ulen);
8279 		if (impl->muladd(eC, eB, ulen,
8280 			bx, nlen, by, nlen, cd->curve) != 1)
8281 		{
8282 			fprintf(stderr, "muladd() failed (2)\n");
8283 			exit(EXIT_FAILURE);
8284 		}
8285 		memcpy(eD, cd->generator, ulen);
8286 		if (impl->mul(eD, ulen, bz, nlen, cd->curve) != 1) {
8287 			fprintf(stderr, "mul() failed (2)\n");
8288 			exit(EXIT_FAILURE);
8289 		}
8290 		if (memcmp(eC, eD, nlen) != 0) {
8291 			fprintf(stderr,
8292 				"mul() / muladd() mismatch (x*A=y*B)\n");
8293 			exit(EXIT_FAILURE);
8294 		}
8295 
8296 		/*
8297 		 * Check with x*A + y*B = 0. At that point, b = x, so we
8298 		 * just need to set y = -a (mod n).
8299 		 */
8300 		memcpy(y, n, sizeof n);
8301 		br_i31_sub(y, a, 1);
8302 		br_i31_encode(by, nlen, y);
8303 		memcpy(eC, eA, ulen);
8304 		if (impl->muladd(eC, eB, ulen,
8305 			bx, nlen, by, nlen, cd->curve) != 0)
8306 		{
8307 			fprintf(stderr, "muladd() should have failed\n");
8308 			exit(EXIT_FAILURE);
8309 		}
8310 	}
8311 
8312 	printf(".");
8313 	fflush(stdout);
8314 }
8315 
8316 static void
8317 test_EC_P256_carry_inner(const br_ec_impl *impl, const char *sP, const char *sQ)
8318 {
8319 	unsigned char P[65], Q[sizeof P], k[1];
8320 	size_t plen, qlen;
8321 
8322 	plen = hextobin(P, sP);
8323 	qlen = hextobin(Q, sQ);
8324 	if (plen != sizeof P || qlen != sizeof P) {
8325 		fprintf(stderr, "KAT is incorrect\n");
8326 		exit(EXIT_FAILURE);
8327 	}
8328 	k[0] = 0x10;
8329 	if (impl->mul(P, plen, k, 1, BR_EC_secp256r1) != 1) {
8330 		fprintf(stderr, "P-256 multiplication failed\n");
8331 		exit(EXIT_FAILURE);
8332 	}
8333 	check_equals("P256_carry", P, Q, plen);
8334 	printf(".");
8335 	fflush(stdout);
8336 }
8337 
8338 static void
8339 test_EC_P256_carry(const br_ec_impl *impl)
8340 {
8341 	test_EC_P256_carry_inner(impl,
8342 		"0435BAA24B2B6E1B3C88E22A383BD88CC4B9A3166E7BCF94FF6591663AE066B33B821EBA1B4FC8EA609A87EB9A9C9A1CCD5C9F42FA1365306F64D7CAA718B8C978",
8343 		"0447752A76CA890328D34E675C4971EC629132D1FC4863EDB61219B72C4E58DC5E9D51E7B293488CFD913C3CF20E438BB65C2BA66A7D09EABB45B55E804260C5EB");
8344 	test_EC_P256_carry_inner(impl,
8345 		"04DCAE9D9CE211223602024A6933BD42F77B6BF4EAB9C8915F058C149419FADD2CC9FC0707B270A1B5362BA4D249AFC8AC3DA1EFCA8270176EEACA525B49EE19E6",
8346 		"048DAC7B0BE9B3206FCE8B24B6B4AEB122F2A67D13E536B390B6585CA193427E63F222388B5F51D744D6F5D47536D89EEEC89552BCB269E7828019C4410DFE980A");
8347 }
8348 
8349 static void
8350 test_EC_KAT(const char *name, const br_ec_impl *impl, uint32_t curve_mask)
8351 {
8352 	printf("Test %s: ", name);
8353 	fflush(stdout);
8354 
8355 	if (curve_mask & ((uint32_t)1 << BR_EC_secp256r1)) {
8356 		test_EC_inner(
8357 			"C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721",
8358 			"0460FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB67903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299",
8359 			impl, BR_EC_secp256r1);
8360 		test_EC_P256_carry(impl);
8361 	}
8362 	if (curve_mask & ((uint32_t)1 << BR_EC_secp384r1)) {
8363 		test_EC_inner(
8364 			"6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5",
8365 			"04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720",
8366 			impl, BR_EC_secp384r1);
8367 	}
8368 	if (curve_mask & ((uint32_t)1 << BR_EC_secp521r1)) {
8369 		test_EC_inner(
8370 			"00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538",
8371 			"0401894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A400493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5",
8372 			impl, BR_EC_secp521r1);
8373 	}
8374 
8375 	printf(" done.\n");
8376 	fflush(stdout);
8377 }
8378 
8379 static void
8380 test_EC_keygen(const char *name, const br_ec_impl *impl, uint32_t curves)
8381 {
8382 	int curve;
8383 	br_hmac_drbg_context rng;
8384 
8385 	printf("Test %s keygen: ", name);
8386 	fflush(stdout);
8387 
8388 	br_hmac_drbg_init(&rng, &br_sha256_vtable, "seed for EC keygen", 18);
8389 	br_hmac_drbg_update(&rng, name, strlen(name));
8390 
8391 	for (curve = -1; curve <= 35; curve ++) {
8392 		br_ec_private_key sk;
8393 		br_ec_public_key pk;
8394 		unsigned char kbuf_priv[BR_EC_KBUF_PRIV_MAX_SIZE];
8395 		unsigned char kbuf_pub[BR_EC_KBUF_PUB_MAX_SIZE];
8396 
8397 		if (curve < 0 || curve >= 32 || ((curves >> curve) & 1) == 0) {
8398 			if (br_ec_keygen(&rng.vtable, impl,
8399 				&sk, kbuf_priv, curve) != 0)
8400 			{
8401 				fprintf(stderr, "br_ec_keygen() did not"
8402 					" reject unsupported curve %d\n",
8403 					curve);
8404 				exit(EXIT_FAILURE);
8405 			}
8406 			sk.curve = curve;
8407 			if (br_ec_compute_pub(impl, NULL, NULL, &sk) != 0) {
8408 				fprintf(stderr, "br_ec_keygen() did not"
8409 					" reject unsupported curve %d\n",
8410 					curve);
8411 				exit(EXIT_FAILURE);
8412 			}
8413 		} else {
8414 			size_t len, u;
8415 			unsigned char tmp_priv[sizeof kbuf_priv];
8416 			unsigned char tmp_pub[sizeof kbuf_pub];
8417 			unsigned z;
8418 
8419 			len = br_ec_keygen(&rng.vtable, impl,
8420 				NULL, NULL, curve);
8421 			if (len == 0) {
8422 				fprintf(stderr, "br_ec_keygen() rejects"
8423 					" supported curve %d\n", curve);
8424 				exit(EXIT_FAILURE);
8425 			}
8426 			if (len > sizeof kbuf_priv) {
8427 				fprintf(stderr, "oversized kbuf_priv\n");
8428 				exit(EXIT_FAILURE);
8429 			}
8430 			memset(kbuf_priv, 0, sizeof kbuf_priv);
8431 			if (br_ec_keygen(&rng.vtable, impl,
8432 				NULL, kbuf_priv, curve) != len)
8433 			{
8434 				fprintf(stderr, "kbuf_priv length mismatch\n");
8435 				exit(EXIT_FAILURE);
8436 			}
8437 			z = 0;
8438 			for (u = 0; u < len; u ++) {
8439 				z |= kbuf_priv[u];
8440 			}
8441 			if (z == 0) {
8442 				fprintf(stderr, "kbuf_priv not initialized\n");
8443 				exit(EXIT_FAILURE);
8444 			}
8445 			for (u = len; u < sizeof kbuf_priv; u ++) {
8446 				if (kbuf_priv[u] != 0) {
8447 					fprintf(stderr, "kbuf_priv overflow\n");
8448 					exit(EXIT_FAILURE);
8449 				}
8450 			}
8451 			if (br_ec_keygen(&rng.vtable, impl,
8452 				NULL, tmp_priv, curve) != len)
8453 			{
8454 				fprintf(stderr, "tmp_priv length mismatch\n");
8455 				exit(EXIT_FAILURE);
8456 			}
8457 			if (memcmp(kbuf_priv, tmp_priv, len) == 0) {
8458 				fprintf(stderr, "keygen stutter\n");
8459 				exit(EXIT_FAILURE);
8460 			}
8461 			memset(&sk, 0, sizeof sk);
8462 			if (br_ec_keygen(&rng.vtable, impl,
8463 				&sk, kbuf_priv, curve) != len)
8464 			{
8465 				fprintf(stderr,
8466 					"kbuf_priv length mismatch (2)\n");
8467 				exit(EXIT_FAILURE);
8468 			}
8469 			if (sk.curve != curve || sk.x != kbuf_priv
8470 				|| sk.xlen != len)
8471 			{
8472 				fprintf(stderr, "sk not initialized\n");
8473 				exit(EXIT_FAILURE);
8474 			}
8475 
8476 			len = br_ec_compute_pub(impl, NULL, NULL, &sk);
8477 			if (len > sizeof kbuf_pub) {
8478 				fprintf(stderr, "oversized kbuf_pub\n");
8479 				exit(EXIT_FAILURE);
8480 			}
8481 			memset(kbuf_pub, 0, sizeof kbuf_pub);
8482 			if (br_ec_compute_pub(impl, NULL,
8483 				kbuf_pub, &sk) != len)
8484 			{
8485 				fprintf(stderr, "kbuf_pub length mismatch\n");
8486 				exit(EXIT_FAILURE);
8487 			}
8488 			for (u = len; u < sizeof kbuf_pub; u ++) {
8489 				if (kbuf_pub[u] != 0) {
8490 					fprintf(stderr, "kbuf_pub overflow\n");
8491 					exit(EXIT_FAILURE);
8492 				}
8493 			}
8494 			memset(&pk, 0, sizeof pk);
8495 			if (br_ec_compute_pub(impl, &pk,
8496 				tmp_pub, &sk) != len)
8497 			{
8498 				fprintf(stderr, "tmp_pub length mismatch\n");
8499 				exit(EXIT_FAILURE);
8500 			}
8501 			if (memcmp(kbuf_pub, tmp_pub, len) != 0) {
8502 				fprintf(stderr, "pubkey mismatch\n");
8503 				exit(EXIT_FAILURE);
8504 			}
8505 			if (pk.curve != curve || pk.q != tmp_pub
8506 				|| pk.qlen != len)
8507 			{
8508 				fprintf(stderr, "pk not initialized\n");
8509 				exit(EXIT_FAILURE);
8510 			}
8511 
8512 			if (impl->mulgen(kbuf_pub,
8513 				sk.x, sk.xlen, curve) != len
8514 				|| memcmp(pk.q, kbuf_pub, len) != 0)
8515 			{
8516 				fprintf(stderr, "wrong pubkey\n");
8517 				exit(EXIT_FAILURE);
8518 			}
8519 		}
8520 		printf(".");
8521 		fflush(stdout);
8522 	}
8523 
8524 	printf(" done.\n");
8525 	fflush(stdout);
8526 }
8527 
8528 static void
8529 test_EC_prime_i15(void)
8530 {
8531 	test_EC_KAT("EC_prime_i15", &br_ec_prime_i15,
8532 		(uint32_t)1 << BR_EC_secp256r1
8533 		| (uint32_t)1 << BR_EC_secp384r1
8534 		| (uint32_t)1 << BR_EC_secp521r1);
8535 	test_EC_keygen("EC_prime_i15", &br_ec_prime_i15,
8536 		(uint32_t)1 << BR_EC_secp256r1
8537 		| (uint32_t)1 << BR_EC_secp384r1
8538 		| (uint32_t)1 << BR_EC_secp521r1);
8539 }
8540 
8541 static void
8542 test_EC_prime_i31(void)
8543 {
8544 	test_EC_KAT("EC_prime_i31", &br_ec_prime_i31,
8545 		(uint32_t)1 << BR_EC_secp256r1
8546 		| (uint32_t)1 << BR_EC_secp384r1
8547 		| (uint32_t)1 << BR_EC_secp521r1);
8548 	test_EC_keygen("EC_prime_i31", &br_ec_prime_i31,
8549 		(uint32_t)1 << BR_EC_secp256r1
8550 		| (uint32_t)1 << BR_EC_secp384r1
8551 		| (uint32_t)1 << BR_EC_secp521r1);
8552 }
8553 
8554 static void
8555 test_EC_p256_m15(void)
8556 {
8557 	test_EC_KAT("EC_p256_m15", &br_ec_p256_m15,
8558 		(uint32_t)1 << BR_EC_secp256r1);
8559 	test_EC_keygen("EC_p256_m15", &br_ec_p256_m15,
8560 		(uint32_t)1 << BR_EC_secp256r1);
8561 }
8562 
8563 static void
8564 test_EC_p256_m31(void)
8565 {
8566 	test_EC_KAT("EC_p256_m31", &br_ec_p256_m31,
8567 		(uint32_t)1 << BR_EC_secp256r1);
8568 	test_EC_keygen("EC_p256_m31", &br_ec_p256_m31,
8569 		(uint32_t)1 << BR_EC_secp256r1);
8570 }
8571 
8572 static void
8573 test_EC_p256_m62(void)
8574 {
8575 	const br_ec_impl *ec;
8576 
8577 	ec = br_ec_p256_m62_get();
8578 	if (ec != NULL) {
8579 		test_EC_KAT("EC_p256_m62", ec,
8580 			(uint32_t)1 << BR_EC_secp256r1);
8581 		test_EC_keygen("EC_p256_m62", ec,
8582 			(uint32_t)1 << BR_EC_secp256r1);
8583 	} else {
8584 		printf("Test EC_p256_m62: UNAVAILABLE\n");
8585 		printf("Test EC_p256_m62 keygen: UNAVAILABLE\n");
8586 	}
8587 }
8588 
8589 static void
8590 test_EC_p256_m64(void)
8591 {
8592 	const br_ec_impl *ec;
8593 
8594 	ec = br_ec_p256_m64_get();
8595 	if (ec != NULL) {
8596 		test_EC_KAT("EC_p256_m64", ec,
8597 			(uint32_t)1 << BR_EC_secp256r1);
8598 		test_EC_keygen("EC_p256_m64", ec,
8599 			(uint32_t)1 << BR_EC_secp256r1);
8600 	} else {
8601 		printf("Test EC_p256_m64: UNAVAILABLE\n");
8602 		printf("Test EC_p256_m64 keygen: UNAVAILABLE\n");
8603 	}
8604 }
8605 
8606 const struct {
8607 	const char *scalar_le;
8608 	const char *u_in;
8609 	const char *u_out;
8610 } C25519_KAT[] = {
8611 	{ "A546E36BF0527C9D3B16154B82465EDD62144C0AC1FC5A18506A2244BA449AC4",
8612 	  "E6DB6867583030DB3594C1A424B15F7C726624EC26B3353B10A903A6D0AB1C4C",
8613 	  "C3DA55379DE9C6908E94EA4DF28D084F32ECCF03491C71F754B4075577A28552" },
8614 	{ "4B66E9D4D1B4673C5AD22691957D6AF5C11B6421E0EA01D42CA4169E7918BA0D",
8615 	  "E5210F12786811D3F4B7959D0538AE2C31DBE7106FC03C3EFC4CD549C715A493",
8616 	  "95CBDE9476E8907D7AADE45CB4B873F88B595A68799FA152E6F8F7647AAC7957" },
8617 	{ 0, 0, 0 }
8618 };
8619 
8620 static void
8621 revbytes(unsigned char *buf, size_t len)
8622 {
8623 	size_t u;
8624 
8625 	for (u = 0; u < (len >> 1); u ++) {
8626 		unsigned t;
8627 
8628 		t = buf[u];
8629 		buf[u] = buf[len - 1 - u];
8630 		buf[len - 1 - u] = t;
8631 	}
8632 }
8633 
8634 static void
8635 test_EC_c25519(const char *name, const br_ec_impl *iec)
8636 {
8637 	unsigned char bu[32], bk[32], br[32];
8638 	size_t v;
8639 	int i;
8640 
8641 	printf("Test %s: ", name);
8642 	fflush(stdout);
8643 	for (v = 0; C25519_KAT[v].scalar_le; v ++) {
8644 		hextobin(bk, C25519_KAT[v].scalar_le);
8645 		revbytes(bk, sizeof bk);
8646 		hextobin(bu, C25519_KAT[v].u_in);
8647 		hextobin(br, C25519_KAT[v].u_out);
8648 		if (!iec->mul(bu, sizeof bu, bk, sizeof bk, BR_EC_curve25519)) {
8649 			fprintf(stderr, "Curve25519 multiplication failed\n");
8650 			exit(EXIT_FAILURE);
8651 		}
8652 		if (memcmp(bu, br, sizeof bu) != 0) {
8653 			fprintf(stderr, "Curve25519 failed KAT\n");
8654 			exit(EXIT_FAILURE);
8655 		}
8656 		printf(".");
8657 		fflush(stdout);
8658 	}
8659 	printf(" ");
8660 	fflush(stdout);
8661 
8662 	memset(bu, 0, sizeof bu);
8663 	bu[0] = 0x09;
8664 	memcpy(bk, bu, sizeof bu);
8665 	for (i = 1; i <= 1000; i ++) {
8666 		revbytes(bk, sizeof bk);
8667 		if (!iec->mul(bu, sizeof bu, bk, sizeof bk, BR_EC_curve25519)) {
8668 			fprintf(stderr, "Curve25519 multiplication failed"
8669 				" (iter=%d)\n", i);
8670 			exit(EXIT_FAILURE);
8671 		}
8672 		revbytes(bk, sizeof bk);
8673 		for (v = 0; v < sizeof bu; v ++) {
8674 			unsigned t;
8675 
8676 			t = bu[v];
8677 			bu[v] = bk[v];
8678 			bk[v] = t;
8679 		}
8680 		if (i == 1 || i == 1000) {
8681 			const char *sref;
8682 
8683 			sref = (i == 1)
8684 				? "422C8E7A6227D7BCA1350B3E2BB7279F7897B87BB6854B783C60E80311AE3079"
8685 				: "684CF59BA83309552800EF566F2F4D3C1C3887C49360E3875F2EB94D99532C51";
8686 			hextobin(br, sref);
8687 			if (memcmp(bk, br, sizeof bk) != 0) {
8688 				fprintf(stderr,
8689 					"Curve25519 failed KAT (iter=%d)\n", i);
8690 				exit(EXIT_FAILURE);
8691 			}
8692 		}
8693 		if (i % 100 == 0) {
8694 			printf(".");
8695 			fflush(stdout);
8696 		}
8697 	}
8698 
8699 	printf(" done.\n");
8700 	fflush(stdout);
8701 }
8702 
8703 static void
8704 test_EC_c25519_i15(void)
8705 {
8706 	test_EC_c25519("EC_c25519_i15", &br_ec_c25519_i15);
8707 	test_EC_keygen("EC_c25519_i15", &br_ec_c25519_i15,
8708 		(uint32_t)1 << BR_EC_curve25519);
8709 }
8710 
8711 static void
8712 test_EC_c25519_i31(void)
8713 {
8714 	test_EC_c25519("EC_c25519_i31", &br_ec_c25519_i31);
8715 	test_EC_keygen("EC_c25519_i31", &br_ec_c25519_i31,
8716 		(uint32_t)1 << BR_EC_curve25519);
8717 }
8718 
8719 static void
8720 test_EC_c25519_m15(void)
8721 {
8722 	test_EC_c25519("EC_c25519_m15", &br_ec_c25519_m15);
8723 	test_EC_keygen("EC_c25519_m15", &br_ec_c25519_m15,
8724 		(uint32_t)1 << BR_EC_curve25519);
8725 }
8726 
8727 static void
8728 test_EC_c25519_m31(void)
8729 {
8730 	test_EC_c25519("EC_c25519_m31", &br_ec_c25519_m31);
8731 	test_EC_keygen("EC_c25519_m31", &br_ec_c25519_m31,
8732 		(uint32_t)1 << BR_EC_curve25519);
8733 }
8734 
8735 static void
8736 test_EC_c25519_m62(void)
8737 {
8738 	const br_ec_impl *ec;
8739 
8740 	ec = br_ec_c25519_m62_get();
8741 	if (ec != NULL) {
8742 		test_EC_c25519("EC_c25519_m62", ec);
8743 		test_EC_keygen("EC_c25519_m62", ec,
8744 			(uint32_t)1 << BR_EC_curve25519);
8745 	} else {
8746 		printf("Test EC_c25519_m62: UNAVAILABLE\n");
8747 		printf("Test EC_c25519_m62 keygen: UNAVAILABLE\n");
8748 	}
8749 }
8750 
8751 static void
8752 test_EC_c25519_m64(void)
8753 {
8754 	const br_ec_impl *ec;
8755 
8756 	ec = br_ec_c25519_m64_get();
8757 	if (ec != NULL) {
8758 		test_EC_c25519("EC_c25519_m64", ec);
8759 		test_EC_keygen("EC_c25519_m64", ec,
8760 			(uint32_t)1 << BR_EC_curve25519);
8761 	} else {
8762 		printf("Test EC_c25519_m64: UNAVAILABLE\n");
8763 		printf("Test EC_c25519_m64 keygen: UNAVAILABLE\n");
8764 	}
8765 }
8766 
8767 static const unsigned char EC_P256_PUB_POINT[] = {
8768 	0x04, 0x60, 0xFE, 0xD4, 0xBA, 0x25, 0x5A, 0x9D,
8769 	0x31, 0xC9, 0x61, 0xEB, 0x74, 0xC6, 0x35, 0x6D,
8770 	0x68, 0xC0, 0x49, 0xB8, 0x92, 0x3B, 0x61, 0xFA,
8771 	0x6C, 0xE6, 0x69, 0x62, 0x2E, 0x60, 0xF2, 0x9F,
8772 	0xB6, 0x79, 0x03, 0xFE, 0x10, 0x08, 0xB8, 0xBC,
8773 	0x99, 0xA4, 0x1A, 0xE9, 0xE9, 0x56, 0x28, 0xBC,
8774 	0x64, 0xF2, 0xF1, 0xB2, 0x0C, 0x2D, 0x7E, 0x9F,
8775 	0x51, 0x77, 0xA3, 0xC2, 0x94, 0xD4, 0x46, 0x22,
8776 	0x99
8777 };
8778 
8779 static const unsigned char EC_P256_PRIV_X[] = {
8780 	0xC9, 0xAF, 0xA9, 0xD8, 0x45, 0xBA, 0x75, 0x16,
8781 	0x6B, 0x5C, 0x21, 0x57, 0x67, 0xB1, 0xD6, 0x93,
8782 	0x4E, 0x50, 0xC3, 0xDB, 0x36, 0xE8, 0x9B, 0x12,
8783 	0x7B, 0x8A, 0x62, 0x2B, 0x12, 0x0F, 0x67, 0x21
8784 };
8785 
8786 static const br_ec_public_key EC_P256_PUB = {
8787 	BR_EC_secp256r1,
8788 	(unsigned char *)EC_P256_PUB_POINT, sizeof EC_P256_PUB_POINT
8789 };
8790 
8791 static const br_ec_private_key EC_P256_PRIV = {
8792 	BR_EC_secp256r1,
8793 	(unsigned char *)EC_P256_PRIV_X, sizeof EC_P256_PRIV_X
8794 };
8795 
8796 static const unsigned char EC_P384_PUB_POINT[] = {
8797 	0x04, 0xEC, 0x3A, 0x4E, 0x41, 0x5B, 0x4E, 0x19,
8798 	0xA4, 0x56, 0x86, 0x18, 0x02, 0x9F, 0x42, 0x7F,
8799 	0xA5, 0xDA, 0x9A, 0x8B, 0xC4, 0xAE, 0x92, 0xE0,
8800 	0x2E, 0x06, 0xAA, 0xE5, 0x28, 0x6B, 0x30, 0x0C,
8801 	0x64, 0xDE, 0xF8, 0xF0, 0xEA, 0x90, 0x55, 0x86,
8802 	0x60, 0x64, 0xA2, 0x54, 0x51, 0x54, 0x80, 0xBC,
8803 	0x13, 0x80, 0x15, 0xD9, 0xB7, 0x2D, 0x7D, 0x57,
8804 	0x24, 0x4E, 0xA8, 0xEF, 0x9A, 0xC0, 0xC6, 0x21,
8805 	0x89, 0x67, 0x08, 0xA5, 0x93, 0x67, 0xF9, 0xDF,
8806 	0xB9, 0xF5, 0x4C, 0xA8, 0x4B, 0x3F, 0x1C, 0x9D,
8807 	0xB1, 0x28, 0x8B, 0x23, 0x1C, 0x3A, 0xE0, 0xD4,
8808 	0xFE, 0x73, 0x44, 0xFD, 0x25, 0x33, 0x26, 0x47,
8809 	0x20
8810 };
8811 
8812 static const unsigned char EC_P384_PRIV_X[] = {
8813 	0x6B, 0x9D, 0x3D, 0xAD, 0x2E, 0x1B, 0x8C, 0x1C,
8814 	0x05, 0xB1, 0x98, 0x75, 0xB6, 0x65, 0x9F, 0x4D,
8815 	0xE2, 0x3C, 0x3B, 0x66, 0x7B, 0xF2, 0x97, 0xBA,
8816 	0x9A, 0xA4, 0x77, 0x40, 0x78, 0x71, 0x37, 0xD8,
8817 	0x96, 0xD5, 0x72, 0x4E, 0x4C, 0x70, 0xA8, 0x25,
8818 	0xF8, 0x72, 0xC9, 0xEA, 0x60, 0xD2, 0xED, 0xF5
8819 };
8820 
8821 static const br_ec_public_key EC_P384_PUB = {
8822 	BR_EC_secp384r1,
8823 	(unsigned char *)EC_P384_PUB_POINT, sizeof EC_P384_PUB_POINT
8824 };
8825 
8826 static const br_ec_private_key EC_P384_PRIV = {
8827 	BR_EC_secp384r1,
8828 	(unsigned char *)EC_P384_PRIV_X, sizeof EC_P384_PRIV_X
8829 };
8830 
8831 static const unsigned char EC_P521_PUB_POINT[] = {
8832 	0x04, 0x01, 0x89, 0x45, 0x50, 0xD0, 0x78, 0x59,
8833 	0x32, 0xE0, 0x0E, 0xAA, 0x23, 0xB6, 0x94, 0xF2,
8834 	0x13, 0xF8, 0xC3, 0x12, 0x1F, 0x86, 0xDC, 0x97,
8835 	0xA0, 0x4E, 0x5A, 0x71, 0x67, 0xDB, 0x4E, 0x5B,
8836 	0xCD, 0x37, 0x11, 0x23, 0xD4, 0x6E, 0x45, 0xDB,
8837 	0x6B, 0x5D, 0x53, 0x70, 0xA7, 0xF2, 0x0F, 0xB6,
8838 	0x33, 0x15, 0x5D, 0x38, 0xFF, 0xA1, 0x6D, 0x2B,
8839 	0xD7, 0x61, 0xDC, 0xAC, 0x47, 0x4B, 0x9A, 0x2F,
8840 	0x50, 0x23, 0xA4, 0x00, 0x49, 0x31, 0x01, 0xC9,
8841 	0x62, 0xCD, 0x4D, 0x2F, 0xDD, 0xF7, 0x82, 0x28,
8842 	0x5E, 0x64, 0x58, 0x41, 0x39, 0xC2, 0xF9, 0x1B,
8843 	0x47, 0xF8, 0x7F, 0xF8, 0x23, 0x54, 0xD6, 0x63,
8844 	0x0F, 0x74, 0x6A, 0x28, 0xA0, 0xDB, 0x25, 0x74,
8845 	0x1B, 0x5B, 0x34, 0xA8, 0x28, 0x00, 0x8B, 0x22,
8846 	0xAC, 0xC2, 0x3F, 0x92, 0x4F, 0xAA, 0xFB, 0xD4,
8847 	0xD3, 0x3F, 0x81, 0xEA, 0x66, 0x95, 0x6D, 0xFE,
8848 	0xAA, 0x2B, 0xFD, 0xFC, 0xF5
8849 };
8850 
8851 static const unsigned char EC_P521_PRIV_X[] = {
8852 	0x00, 0xFA, 0xD0, 0x6D, 0xAA, 0x62, 0xBA, 0x3B,
8853 	0x25, 0xD2, 0xFB, 0x40, 0x13, 0x3D, 0xA7, 0x57,
8854 	0x20, 0x5D, 0xE6, 0x7F, 0x5B, 0xB0, 0x01, 0x8F,
8855 	0xEE, 0x8C, 0x86, 0xE1, 0xB6, 0x8C, 0x7E, 0x75,
8856 	0xCA, 0xA8, 0x96, 0xEB, 0x32, 0xF1, 0xF4, 0x7C,
8857 	0x70, 0x85, 0x58, 0x36, 0xA6, 0xD1, 0x6F, 0xCC,
8858 	0x14, 0x66, 0xF6, 0xD8, 0xFB, 0xEC, 0x67, 0xDB,
8859 	0x89, 0xEC, 0x0C, 0x08, 0xB0, 0xE9, 0x96, 0xB8,
8860 	0x35, 0x38
8861 };
8862 
8863 static const br_ec_public_key EC_P521_PUB = {
8864 	BR_EC_secp521r1,
8865 	(unsigned char *)EC_P521_PUB_POINT, sizeof EC_P521_PUB_POINT
8866 };
8867 
8868 static const br_ec_private_key EC_P521_PRIV = {
8869 	BR_EC_secp521r1,
8870 	(unsigned char *)EC_P521_PRIV_X, sizeof EC_P521_PRIV_X
8871 };
8872 
8873 typedef struct {
8874 	const br_ec_public_key *pub;
8875 	const br_ec_private_key *priv;
8876 	const br_hash_class *hf;
8877 	const char *msg;
8878 	const char *sk;
8879 	const char *sraw;
8880 	const char *sasn1;
8881 } ecdsa_kat_vector;
8882 
8883 const ecdsa_kat_vector ECDSA_KAT[] = {
8884 
8885 	/* Test vectors for P-256, from RFC 6979. */
8886 	{
8887 		&EC_P256_PUB,
8888 		&EC_P256_PRIV,
8889 		&br_sha1_vtable, "sample",
8890 		"882905F1227FD620FBF2ABF21244F0BA83D0DC3A9103DBBEE43A1FB858109DB4",
8891 		"61340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D326D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB",
8892 		"3044022061340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D3202206D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB"
8893 	},
8894 	{
8895 		&EC_P256_PUB,
8896 		&EC_P256_PRIV,
8897 		&br_sha224_vtable, "sample",
8898 		"103F90EE9DC52E5E7FB5132B7033C63066D194321491862059967C715985D473",
8899 		"53B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3FB9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C",
8900 		"3045022053B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3F022100B9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C"
8901 	},
8902 	{
8903 		&EC_P256_PUB,
8904 		&EC_P256_PRIV,
8905 		&br_sha256_vtable, "sample",
8906 		"A6E3C57DD01ABE90086538398355DD4C3B17AA873382B0F24D6129493D8AAD60",
8907 		"EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8",
8908 		"3046022100EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716022100F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8"
8909 	},
8910 	{
8911 		&EC_P256_PUB,
8912 		&EC_P256_PRIV,
8913 		&br_sha384_vtable, "sample",
8914 		"09F634B188CEFD98E7EC88B1AA9852D734D0BC272F7D2A47DECC6EBEB375AAD4",
8915 		"0EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF77194861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954",
8916 		"304402200EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF771902204861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954"
8917 	},
8918 	{
8919 		&EC_P256_PUB,
8920 		&EC_P256_PRIV,
8921 		&br_sha512_vtable, "sample",
8922 		"5FA81C63109BADB88C1F367B47DA606DA28CAD69AA22C4FE6AD7DF73A7173AA5",
8923 		"8496A60B5E9B47C825488827E0495B0E3FA109EC4568FD3F8D1097678EB97F002362AB1ADBE2B8ADF9CB9EDAB740EA6049C028114F2460F96554F61FAE3302FE",
8924 		"30450221008496A60B5E9B47C825488827E0495B0E3FA109EC4568FD3F8D1097678EB97F0002202362AB1ADBE2B8ADF9CB9EDAB740EA6049C028114F2460F96554F61FAE3302FE"
8925 	},
8926 	{
8927 		&EC_P256_PUB,
8928 		&EC_P256_PRIV,
8929 		&br_sha1_vtable, "test",
8930 		"8C9520267C55D6B980DF741E56B4ADEE114D84FBFA2E62137954164028632A2E",
8931 		"0CBCC86FD6ABD1D99E703E1EC50069EE5C0B4BA4B9AC60E409E8EC5910D81A8901B9D7B73DFAA60D5651EC4591A0136F87653E0FD780C3B1BC872FFDEAE479B1",
8932 		"304402200CBCC86FD6ABD1D99E703E1EC50069EE5C0B4BA4B9AC60E409E8EC5910D81A89022001B9D7B73DFAA60D5651EC4591A0136F87653E0FD780C3B1BC872FFDEAE479B1"
8933 	},
8934 	{
8935 		&EC_P256_PUB,
8936 		&EC_P256_PRIV,
8937 		&br_sha224_vtable, "test",
8938 		"669F4426F2688B8BE0DB3A6BD1989BDAEFFF84B649EEB84F3DD26080F667FAA7",
8939 		"C37EDB6F0AE79D47C3C27E962FA269BB4F441770357E114EE511F662EC34A692C820053A05791E521FCAAD6042D40AEA1D6B1A540138558F47D0719800E18F2D",
8940 		"3046022100C37EDB6F0AE79D47C3C27E962FA269BB4F441770357E114EE511F662EC34A692022100C820053A05791E521FCAAD6042D40AEA1D6B1A540138558F47D0719800E18F2D"
8941 	},
8942 	{
8943 		&EC_P256_PUB,
8944 		&EC_P256_PRIV,
8945 		&br_sha256_vtable, "test",
8946 		"D16B6AE827F17175E040871A1C7EC3500192C4C92677336EC2537ACAEE0008E0",
8947 		"F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083",
8948 		"3045022100F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D383670220019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083"
8949 	},
8950 	{
8951 		&EC_P256_PUB,
8952 		&EC_P256_PRIV,
8953 		&br_sha384_vtable, "test",
8954 		"16AEFFA357260B04B1DD199693960740066C1A8F3E8EDD79070AA914D361B3B8",
8955 		"83910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB68DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C",
8956 		"304602210083910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB60221008DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C"
8957 	},
8958 	{
8959 		&EC_P256_PUB,
8960 		&EC_P256_PRIV,
8961 		&br_sha512_vtable, "test",
8962 		"6915D11632ACA3C40D5D51C08DAF9C555933819548784480E93499000D9F0B7F",
8963 		"461D93F31B6540894788FD206C07CFA0CC35F46FA3C91816FFF1040AD1581A0439AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55",
8964 		"30440220461D93F31B6540894788FD206C07CFA0CC35F46FA3C91816FFF1040AD1581A04022039AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55"
8965 	},
8966 
8967 	/* Test vectors for P-384, from RFC 6979. */
8968 	{
8969 		&EC_P384_PUB,
8970 		&EC_P384_PRIV,
8971 		&br_sha1_vtable, "sample",
8972 		"4471EF7518BB2C7C20F62EAE1C387AD0C5E8E470995DB4ACF694466E6AB096630F29E5938D25106C3C340045A2DB01A7",
8973 		"EC748D839243D6FBEF4FC5C4859A7DFFD7F3ABDDF72014540C16D73309834FA37B9BA002899F6FDA3A4A9386790D4EB2A3BCFA947BEEF4732BF247AC17F71676CB31A847B9FF0CBC9C9ED4C1A5B3FACF26F49CA031D4857570CCB5CA4424A443",
8974 		"3066023100EC748D839243D6FBEF4FC5C4859A7DFFD7F3ABDDF72014540C16D73309834FA37B9BA002899F6FDA3A4A9386790D4EB2023100A3BCFA947BEEF4732BF247AC17F71676CB31A847B9FF0CBC9C9ED4C1A5B3FACF26F49CA031D4857570CCB5CA4424A443"
8975 	},
8976 
8977 	{
8978 		&EC_P384_PUB,
8979 		&EC_P384_PRIV,
8980 		&br_sha224_vtable, "sample",
8981 		"A4E4D2F0E729EB786B31FC20AD5D849E304450E0AE8E3E341134A5C1AFA03CAB8083EE4E3C45B06A5899EA56C51B5879",
8982 		"42356E76B55A6D9B4631C865445DBE54E056D3B3431766D0509244793C3F9366450F76EE3DE43F5A125333A6BE0601229DA0C81787064021E78DF658F2FBB0B042BF304665DB721F077A4298B095E4834C082C03D83028EFBF93A3C23940CA8D",
8983 		"3065023042356E76B55A6D9B4631C865445DBE54E056D3B3431766D0509244793C3F9366450F76EE3DE43F5A125333A6BE0601220231009DA0C81787064021E78DF658F2FBB0B042BF304665DB721F077A4298B095E4834C082C03D83028EFBF93A3C23940CA8D"
8984 	},
8985 	{
8986 		&EC_P384_PUB,
8987 		&EC_P384_PRIV,
8988 		&br_sha256_vtable, "sample",
8989 		"180AE9F9AEC5438A44BC159A1FCB277C7BE54FA20E7CF404B490650A8ACC414E375572342863C899F9F2EDF9747A9B60",
8990 		"21B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33BDE1E888E63355D92FA2B3C36D8FB2CDF3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEBEFDC63ECCD1AC42EC0CB8668A4FA0AB0",
8991 		"3065023021B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33BDE1E888E63355D92FA2B3C36D8FB2CD023100F3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEBEFDC63ECCD1AC42EC0CB8668A4FA0AB0"
8992 	},
8993 	{
8994 		&EC_P384_PUB,
8995 		&EC_P384_PRIV,
8996 		&br_sha384_vtable, "sample",
8997 		"94ED910D1A099DAD3254E9242AE85ABDE4BA15168EAF0CA87A555FD56D10FBCA2907E3E83BA95368623B8C4686915CF9",
8998 		"94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE4699EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8",
8999 		"306602310094EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE4602310099EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8"
9000 	},
9001 	{
9002 		&EC_P384_PUB,
9003 		&EC_P384_PRIV,
9004 		&br_sha512_vtable, "sample",
9005 		"92FC3C7183A883E24216D1141F1A8976C5B0DD797DFA597E3D7B32198BD35331A4E966532593A52980D0E3AAA5E10EC3",
9006 		"ED0959D5880AB2D869AE7F6C2915C6D60F96507F9CB3E047C0046861DA4A799CFE30F35CC900056D7C99CD7882433709512C8CCEEE3890A84058CE1E22DBC2198F42323CE8ACA9135329F03C068E5112DC7CC3EF3446DEFCEB01A45C2667FDD5",
9007 		"3065023100ED0959D5880AB2D869AE7F6C2915C6D60F96507F9CB3E047C0046861DA4A799CFE30F35CC900056D7C99CD78824337090230512C8CCEEE3890A84058CE1E22DBC2198F42323CE8ACA9135329F03C068E5112DC7CC3EF3446DEFCEB01A45C2667FDD5"
9008 	},
9009 	{
9010 		&EC_P384_PUB,
9011 		&EC_P384_PRIV,
9012 		&br_sha1_vtable, "test",
9013 		"66CC2C8F4D303FC962E5FF6A27BD79F84EC812DDAE58CF5243B64A4AD8094D47EC3727F3A3C186C15054492E30698497",
9014 		"4BC35D3A50EF4E30576F58CD96CE6BF638025EE624004A1F7789A8B8E43D0678ACD9D29876DAF46638645F7F404B11C7D5A6326C494ED3FF614703878961C0FDE7B2C278F9A65FD8C4B7186201A2991695BA1C84541327E966FA7B50F7382282",
9015 		"306502304BC35D3A50EF4E30576F58CD96CE6BF638025EE624004A1F7789A8B8E43D0678ACD9D29876DAF46638645F7F404B11C7023100D5A6326C494ED3FF614703878961C0FDE7B2C278F9A65FD8C4B7186201A2991695BA1C84541327E966FA7B50F7382282"
9016 	},
9017 	{
9018 		&EC_P384_PUB,
9019 		&EC_P384_PRIV,
9020 		&br_sha224_vtable, "test",
9021 		"18FA39DB95AA5F561F30FA3591DC59C0FA3653A80DAFFA0B48D1A4C6DFCBFF6E3D33BE4DC5EB8886A8ECD093F2935726",
9022 		"E8C9D0B6EA72A0E7837FEA1D14A1A9557F29FAA45D3E7EE888FC5BF954B5E62464A9A817C47FF78B8C11066B24080E7207041D4A7A0379AC7232FF72E6F77B6DDB8F09B16CCE0EC3286B2BD43FA8C6141C53EA5ABEF0D8231077A04540A96B66",
9023 		"3065023100E8C9D0B6EA72A0E7837FEA1D14A1A9557F29FAA45D3E7EE888FC5BF954B5E62464A9A817C47FF78B8C11066B24080E72023007041D4A7A0379AC7232FF72E6F77B6DDB8F09B16CCE0EC3286B2BD43FA8C6141C53EA5ABEF0D8231077A04540A96B66"
9024 	},
9025 	{
9026 		&EC_P384_PUB,
9027 		&EC_P384_PRIV,
9028 		&br_sha256_vtable, "test",
9029 		"0CFAC37587532347DC3389FDC98286BBA8C73807285B184C83E62E26C401C0FAA48DD070BA79921A3457ABFF2D630AD7",
9030 		"6D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559F918EEDAF2293BE5B475CC8F0188636B2D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D51AB373F9845C0514EEFB14024787265",
9031 		"306402306D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559F918EEDAF2293BE5B475CC8F0188636B02302D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D51AB373F9845C0514EEFB14024787265"
9032 	},
9033 	{
9034 		&EC_P384_PUB,
9035 		&EC_P384_PRIV,
9036 		&br_sha384_vtable, "test",
9037 		"015EE46A5BF88773ED9123A5AB0807962D193719503C527B031B4C2D225092ADA71F4A459BC0DA98ADB95837DB8312EA",
9038 		"8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DBDDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5",
9039 		"30660231008203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB023100DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5"
9040 	},
9041 	{
9042 		&EC_P384_PUB,
9043 		&EC_P384_PRIV,
9044 		&br_sha512_vtable, "test",
9045 		"3780C4F67CB15518B6ACAE34C9F83568D2E12E47DEAB6C50A4E4EE5319D1E8CE0E2CC8A136036DC4B9C00E6888F66B6C",
9046 		"A0D5D090C9980FAF3C2CE57B7AE951D31977DD11C775D314AF55F76C676447D06FB6495CD21B4B6E340FC236584FB277976984E59B4C77B0E8E4460DCA3D9F20E07B9BB1F63BEEFAF576F6B2E8B224634A2092CD3792E0159AD9CEE37659C736",
9047 		"3066023100A0D5D090C9980FAF3C2CE57B7AE951D31977DD11C775D314AF55F76C676447D06FB6495CD21B4B6E340FC236584FB277023100976984E59B4C77B0E8E4460DCA3D9F20E07B9BB1F63BEEFAF576F6B2E8B224634A2092CD3792E0159AD9CEE37659C736"
9048 	},
9049 
9050 	/* Test vectors for P-521, from RFC 6979. */
9051 	{
9052 		&EC_P521_PUB,
9053 		&EC_P521_PRIV,
9054 		&br_sha1_vtable, "sample",
9055 		"0089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D0F9",
9056 		"00343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D75D00E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5D16",
9057 		"3081870241343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D75D024200E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5D16"
9058 	},
9059 	{
9060 		&EC_P521_PUB,
9061 		&EC_P521_PRIV,
9062 		&br_sha224_vtable, "sample",
9063 		"0121415EC2CD7726330A61F7F3FA5DE14BE9436019C4DB8CB4041F3B54CF31BE0493EE3F427FB906393D895A19C9523F3A1D54BB8702BD4AA9C99DAB2597B92113F3",
9064 		"01776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A30715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2ED2E0050CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17BA41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B41F",
9065 		"308187024201776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A30715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2ED2E024150CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17BA41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B41F"
9066 	},
9067 	{
9068 		&EC_P521_PUB,
9069 		&EC_P521_PRIV,
9070 		&br_sha256_vtable, "sample",
9071 		"00EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C32575761793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E1A0",
9072 		"01511BB4D675114FE266FC4372B87682BAECC01D3CC62CF2303C92B3526012659D16876E25C7C1E57648F23B73564D67F61C6F14D527D54972810421E7D87589E1A7004A171143A83163D6DF460AAF61522695F207A58B95C0644D87E52AA1A347916E4F7A72930B1BC06DBE22CE3F58264AFD23704CBB63B29B931F7DE6C9D949A7ECFC",
9073 		"308187024201511BB4D675114FE266FC4372B87682BAECC01D3CC62CF2303C92B3526012659D16876E25C7C1E57648F23B73564D67F61C6F14D527D54972810421E7D87589E1A702414A171143A83163D6DF460AAF61522695F207A58B95C0644D87E52AA1A347916E4F7A72930B1BC06DBE22CE3F58264AFD23704CBB63B29B931F7DE6C9D949A7ECFC"
9074 	},
9075 	{
9076 		&EC_P521_PUB,
9077 		&EC_P521_PRIV,
9078 		&br_sha384_vtable, "sample",
9079 		"01546A108BC23A15D6F21872F7DED661FA8431DDBD922D0DCDB77CC878C8553FFAD064C95A920A750AC9137E527390D2D92F153E66196966EA554D9ADFCB109C4211",
9080 		"01EA842A0E17D2DE4F92C15315C63DDF72685C18195C2BB95E572B9C5136CA4B4B576AD712A52BE9730627D16054BA40CC0B8D3FF035B12AE75168397F5D50C6745101F21A3CEE066E1961025FB048BD5FE2B7924D0CD797BABE0A83B66F1E35EEAF5FDE143FA85DC394A7DEE766523393784484BDF3E00114A1C857CDE1AA203DB65D61",
9081 		"308188024201EA842A0E17D2DE4F92C15315C63DDF72685C18195C2BB95E572B9C5136CA4B4B576AD712A52BE9730627D16054BA40CC0B8D3FF035B12AE75168397F5D50C67451024201F21A3CEE066E1961025FB048BD5FE2B7924D0CD797BABE0A83B66F1E35EEAF5FDE143FA85DC394A7DEE766523393784484BDF3E00114A1C857CDE1AA203DB65D61"
9082 	},
9083 	{
9084 		&EC_P521_PUB,
9085 		&EC_P521_PRIV,
9086 		&br_sha512_vtable, "sample",
9087 		"01DAE2EA071F8110DC26882D4D5EAE0621A3256FC8847FB9022E2B7D28E6F10198B1574FDD03A9053C08A1854A168AA5A57470EC97DD5CE090124EF52A2F7ECBFFD3",
9088 		"00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A",
9089 		"308187024200C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA0241617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A"
9090 	},
9091 	{
9092 		&EC_P521_PUB,
9093 		&EC_P521_PRIV,
9094 		&br_sha1_vtable, "test",
9095 		"00BB9F2BF4FE1038CCF4DABD7139A56F6FD8BB1386561BD3C6A4FC818B20DF5DDBA80795A947107A1AB9D12DAA615B1ADE4F7A9DC05E8E6311150F47F5C57CE8B222",
9096 		"013BAD9F29ABE20DE37EBEB823C252CA0F63361284015A3BF430A46AAA80B87B0693F0694BD88AFE4E661FC33B094CD3B7963BED5A727ED8BD6A3A202ABE009D036701E9BB81FF7944CA409AD138DBBEE228E1AFCC0C890FC78EC8604639CB0DBDC90F717A99EAD9D272855D00162EE9527567DD6A92CBD629805C0445282BBC916797FF",
9097 		"3081880242013BAD9F29ABE20DE37EBEB823C252CA0F63361284015A3BF430A46AAA80B87B0693F0694BD88AFE4E661FC33B094CD3B7963BED5A727ED8BD6A3A202ABE009D0367024201E9BB81FF7944CA409AD138DBBEE228E1AFCC0C890FC78EC8604639CB0DBDC90F717A99EAD9D272855D00162EE9527567DD6A92CBD629805C0445282BBC916797FF"
9098 	},
9099 	{
9100 		&EC_P521_PUB,
9101 		&EC_P521_PRIV,
9102 		&br_sha224_vtable, "test",
9103 		"0040D09FCF3C8A5F62CF4FB223CBBB2B9937F6B0577C27020A99602C25A01136987E452988781484EDBBCF1C47E554E7FC901BC3085E5206D9F619CFF07E73D6F706",
9104 		"01C7ED902E123E6815546065A2C4AF977B22AA8EADDB68B2C1110E7EA44D42086BFE4A34B67DDC0E17E96536E358219B23A706C6A6E16BA77B65E1C595D43CAE17FB0177336676304FCB343CE028B38E7B4FBA76C1C1B277DA18CAD2A8478B2A9A9F5BEC0F3BA04F35DB3E4263569EC6AADE8C92746E4C82F8299AE1B8F1739F8FD519A4",
9105 		"308188024201C7ED902E123E6815546065A2C4AF977B22AA8EADDB68B2C1110E7EA44D42086BFE4A34B67DDC0E17E96536E358219B23A706C6A6E16BA77B65E1C595D43CAE17FB02420177336676304FCB343CE028B38E7B4FBA76C1C1B277DA18CAD2A8478B2A9A9F5BEC0F3BA04F35DB3E4263569EC6AADE8C92746E4C82F8299AE1B8F1739F8FD519A4"
9106 	},
9107 	{
9108 		&EC_P521_PUB,
9109 		&EC_P521_PRIV,
9110 		&br_sha256_vtable, "test",
9111 		"001DE74955EFAABC4C4F17F8E84D881D1310B5392D7700275F82F145C61E843841AF09035BF7A6210F5A431A6A9E81C9323354A9E69135D44EBD2FCAA7731B909258",
9112 		"000E871C4A14F993C6C7369501900C4BC1E9C7B0B4BA44E04868B30B41D8071042EB28C4C250411D0CE08CD197E4188EA4876F279F90B3D8D74A3C76E6F1E4656AA800CD52DBAA33B063C3A6CD8058A1FB0A46A4754B034FCC644766CA14DA8CA5CA9FDE00E88C1AD60CCBA759025299079D7A427EC3CC5B619BFBC828E7769BCD694E86",
9113 		"30818702410E871C4A14F993C6C7369501900C4BC1E9C7B0B4BA44E04868B30B41D8071042EB28C4C250411D0CE08CD197E4188EA4876F279F90B3D8D74A3C76E6F1E4656AA8024200CD52DBAA33B063C3A6CD8058A1FB0A46A4754B034FCC644766CA14DA8CA5CA9FDE00E88C1AD60CCBA759025299079D7A427EC3CC5B619BFBC828E7769BCD694E86"
9114 	},
9115 	{
9116 		&EC_P521_PUB,
9117 		&EC_P521_PRIV,
9118 		&br_sha384_vtable, "test",
9119 		"01F1FC4A349A7DA9A9E116BFDD055DC08E78252FF8E23AC276AC88B1770AE0B5DCEB1ED14A4916B769A523CE1E90BA22846AF11DF8B300C38818F713DADD85DE0C88",
9120 		"014BEE21A18B6D8B3C93FAB08D43E739707953244FDBE924FA926D76669E7AC8C89DF62ED8975C2D8397A65A49DCC09F6B0AC62272741924D479354D74FF6075578C0133330865C067A0EAF72362A65E2D7BC4E461E8C8995C3B6226A21BD1AA78F0ED94FE536A0DCA35534F0CD1510C41525D163FE9D74D134881E35141ED5E8E95B979",
9121 		"3081880242014BEE21A18B6D8B3C93FAB08D43E739707953244FDBE924FA926D76669E7AC8C89DF62ED8975C2D8397A65A49DCC09F6B0AC62272741924D479354D74FF6075578C02420133330865C067A0EAF72362A65E2D7BC4E461E8C8995C3B6226A21BD1AA78F0ED94FE536A0DCA35534F0CD1510C41525D163FE9D74D134881E35141ED5E8E95B979"
9122 	},
9123 	{
9124 		&EC_P521_PUB,
9125 		&EC_P521_PRIV,
9126 		&br_sha512_vtable, "test",
9127 		"016200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC56D",
9128 		"013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3",
9129 		"3081880242013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D024201FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3"
9130 	},
9131 
9132 	/* Terminator for list of test vectors. */
9133 	{
9134 		0, 0, 0, 0, 0, 0, 0
9135 	}
9136 };
9137 
9138 static void
9139 test_ECDSA_KAT(const br_ec_impl *iec,
9140 	br_ecdsa_sign sign, br_ecdsa_vrfy vrfy, int asn1)
9141 {
9142 	size_t u;
9143 
9144 	for (u = 0;; u ++) {
9145 		const ecdsa_kat_vector *kv;
9146 		unsigned char hash[64];
9147 		size_t hash_len;
9148 		unsigned char sig[150], sig2[150];
9149 		size_t sig_len, sig2_len;
9150 		br_hash_compat_context hc;
9151 
9152 		kv = &ECDSA_KAT[u];
9153 		if (kv->pub == 0) {
9154 			break;
9155 		}
9156 		kv->hf->init(&hc.vtable);
9157 		kv->hf->update(&hc.vtable, kv->msg, strlen(kv->msg));
9158 		kv->hf->out(&hc.vtable, hash);
9159 		hash_len = (kv->hf->desc >> BR_HASHDESC_OUT_OFF)
9160 			& BR_HASHDESC_OUT_MASK;
9161 		if (asn1) {
9162 			sig_len = hextobin(sig, kv->sasn1);
9163 		} else {
9164 			sig_len = hextobin(sig, kv->sraw);
9165 		}
9166 
9167 		if (vrfy(iec, hash, hash_len,
9168 			kv->pub, sig, sig_len) != 1)
9169 		{
9170 			fprintf(stderr, "ECDSA KAT verify failed (1)\n");
9171 			exit(EXIT_FAILURE);
9172 		}
9173 		hash[0] ^= 0x80;
9174 		if (vrfy(iec, hash, hash_len,
9175 			kv->pub, sig, sig_len) != 0)
9176 		{
9177 			fprintf(stderr, "ECDSA KAT verify shoud have failed\n");
9178 			exit(EXIT_FAILURE);
9179 		}
9180 		hash[0] ^= 0x80;
9181 		if (vrfy(iec, hash, hash_len,
9182 			kv->pub, sig, sig_len) != 1)
9183 		{
9184 			fprintf(stderr, "ECDSA KAT verify failed (2)\n");
9185 			exit(EXIT_FAILURE);
9186 		}
9187 
9188 		sig2_len = sign(iec, kv->hf, hash, kv->priv, sig2);
9189 		if (sig2_len == 0) {
9190 			fprintf(stderr, "ECDSA KAT sign failed\n");
9191 			exit(EXIT_FAILURE);
9192 		}
9193 		if (sig2_len != sig_len || memcmp(sig, sig2, sig_len) != 0) {
9194 			fprintf(stderr, "ECDSA KAT wrong signature value\n");
9195 			exit(EXIT_FAILURE);
9196 		}
9197 
9198 		printf(".");
9199 		fflush(stdout);
9200 	}
9201 }
9202 
9203 static void
9204 test_ECDSA_i31(void)
9205 {
9206 	printf("Test ECDSA/i31: ");
9207 	fflush(stdout);
9208 	printf("[raw]");
9209 	fflush(stdout);
9210 	test_ECDSA_KAT(&br_ec_prime_i31,
9211 		&br_ecdsa_i31_sign_raw, &br_ecdsa_i31_vrfy_raw, 0);
9212 	printf(" [asn1]");
9213 	fflush(stdout);
9214 	test_ECDSA_KAT(&br_ec_prime_i31,
9215 		&br_ecdsa_i31_sign_asn1, &br_ecdsa_i31_vrfy_asn1, 1);
9216 	printf(" done.\n");
9217 	fflush(stdout);
9218 }
9219 
9220 static void
9221 test_ECDSA_i15(void)
9222 {
9223 	printf("Test ECDSA/i15: ");
9224 	fflush(stdout);
9225 	printf("[raw]");
9226 	fflush(stdout);
9227 	test_ECDSA_KAT(&br_ec_prime_i15,
9228 		&br_ecdsa_i15_sign_raw, &br_ecdsa_i15_vrfy_raw, 0);
9229 	printf(" [asn1]");
9230 	fflush(stdout);
9231 	test_ECDSA_KAT(&br_ec_prime_i31,
9232 		&br_ecdsa_i15_sign_asn1, &br_ecdsa_i15_vrfy_asn1, 1);
9233 	printf(" done.\n");
9234 	fflush(stdout);
9235 }
9236 
9237 static void
9238 test_modpow_i31(void)
9239 {
9240 	br_hmac_drbg_context hc;
9241 	int k;
9242 
9243 	printf("Test ModPow/i31: ");
9244 
9245 	br_hmac_drbg_init(&hc, &br_sha256_vtable, "seed modpow", 11);
9246 	for (k = 10; k <= 500; k ++) {
9247 		size_t blen;
9248 		unsigned char bm[128], bx[128], bx1[128], bx2[128];
9249 		unsigned char be[128];
9250 		unsigned mask;
9251 		uint32_t x1[35], m1[35];
9252 		uint16_t x2[70], m2[70];
9253 		uint32_t tmp1[1000];
9254 		uint16_t tmp2[2000];
9255 
9256 		blen = (k + 7) >> 3;
9257 		br_hmac_drbg_generate(&hc, bm, blen);
9258 		br_hmac_drbg_generate(&hc, bx, blen);
9259 		br_hmac_drbg_generate(&hc, be, blen);
9260 		bm[blen - 1] |= 0x01;
9261 		mask = 0xFF >> ((int)(blen << 3) - k);
9262 		bm[0] &= mask;
9263 		bm[0] |= (mask - (mask >> 1));
9264 		bx[0] &= (mask >> 1);
9265 
9266 		br_i31_decode(m1, bm, blen);
9267 		br_i31_decode_mod(x1, bx, blen, m1);
9268 		br_i31_modpow_opt(x1, be, blen, m1, br_i31_ninv31(m1[1]),
9269 			tmp1, (sizeof tmp1) / (sizeof tmp1[0]));
9270 		br_i31_encode(bx1, blen, x1);
9271 
9272 		br_i15_decode(m2, bm, blen);
9273 		br_i15_decode_mod(x2, bx, blen, m2);
9274 		br_i15_modpow_opt(x2, be, blen, m2, br_i15_ninv15(m2[1]),
9275 			tmp2, (sizeof tmp2) / (sizeof tmp2[0]));
9276 		br_i15_encode(bx2, blen, x2);
9277 
9278 		check_equals("ModPow i31/i15", bx1, bx2, blen);
9279 
9280 		printf(".");
9281 		fflush(stdout);
9282 	}
9283 
9284 	printf(" done.\n");
9285 	fflush(stdout);
9286 }
9287 
9288 static void
9289 test_modpow_i62(void)
9290 {
9291 	br_hmac_drbg_context hc;
9292 	int k;
9293 
9294 	printf("Test ModPow/i62: ");
9295 
9296 	br_hmac_drbg_init(&hc, &br_sha256_vtable, "seed modpow", 11);
9297 	for (k = 10; k <= 500; k ++) {
9298 		size_t blen;
9299 		unsigned char bm[128], bx[128], bx1[128], bx2[128];
9300 		unsigned char be[128];
9301 		unsigned mask;
9302 		uint32_t x1[35], m1[35];
9303 		uint16_t x2[70], m2[70];
9304 		uint64_t tmp1[500];
9305 		uint16_t tmp2[2000];
9306 
9307 		blen = (k + 7) >> 3;
9308 		br_hmac_drbg_generate(&hc, bm, blen);
9309 		br_hmac_drbg_generate(&hc, bx, blen);
9310 		br_hmac_drbg_generate(&hc, be, blen);
9311 		bm[blen - 1] |= 0x01;
9312 		mask = 0xFF >> ((int)(blen << 3) - k);
9313 		bm[0] &= mask;
9314 		bm[0] |= (mask - (mask >> 1));
9315 		bx[0] &= (mask >> 1);
9316 
9317 		br_i31_decode(m1, bm, blen);
9318 		br_i31_decode_mod(x1, bx, blen, m1);
9319 		br_i62_modpow_opt(x1, be, blen, m1, br_i31_ninv31(m1[1]),
9320 			tmp1, (sizeof tmp1) / (sizeof tmp1[0]));
9321 		br_i31_encode(bx1, blen, x1);
9322 
9323 		br_i15_decode(m2, bm, blen);
9324 		br_i15_decode_mod(x2, bx, blen, m2);
9325 		br_i15_modpow_opt(x2, be, blen, m2, br_i15_ninv15(m2[1]),
9326 			tmp2, (sizeof tmp2) / (sizeof tmp2[0]));
9327 		br_i15_encode(bx2, blen, x2);
9328 
9329 		check_equals("ModPow i62/i15", bx1, bx2, blen);
9330 
9331 		printf(".");
9332 		fflush(stdout);
9333 	}
9334 
9335 	printf(" done.\n");
9336 	fflush(stdout);
9337 }
9338 
9339 static int
9340 eq_name(const char *s1, const char *s2)
9341 {
9342 	for (;;) {
9343 		int c1, c2;
9344 
9345 		for (;;) {
9346 			c1 = *s1 ++;
9347 			if (c1 >= 'A' && c1 <= 'Z') {
9348 				c1 += 'a' - 'A';
9349 			} else {
9350 				switch (c1) {
9351 				case '-': case '_': case '.': case ' ':
9352 					continue;
9353 				}
9354 			}
9355 			break;
9356 		}
9357 		for (;;) {
9358 			c2 = *s2 ++;
9359 			if (c2 >= 'A' && c2 <= 'Z') {
9360 				c2 += 'a' - 'A';
9361 			} else {
9362 				switch (c2) {
9363 				case '-': case '_': case '.': case ' ':
9364 					continue;
9365 				}
9366 			}
9367 			break;
9368 		}
9369 		if (c1 != c2) {
9370 			return 0;
9371 		}
9372 		if (c1 == 0) {
9373 			return 1;
9374 		}
9375 	}
9376 }
9377 
9378 #define STU(x)   { &test_ ## x, #x }
9379 
9380 static const struct {
9381 	void (*fn)(void);
9382 	const char *name;
9383 } tfns[] = {
9384 	STU(MD5),
9385 	STU(SHA1),
9386 	STU(SHA224),
9387 	STU(SHA256),
9388 	STU(SHA384),
9389 	STU(SHA512),
9390 	STU(MD5_SHA1),
9391 	STU(multihash),
9392 	STU(HMAC),
9393 	STU(HKDF),
9394 	STU(SHAKE),
9395 	STU(HMAC_DRBG),
9396 	STU(AESCTR_DRBG),
9397 	STU(PRF),
9398 	STU(AES_big),
9399 	STU(AES_small),
9400 	STU(AES_ct),
9401 	STU(AES_ct64),
9402 	STU(AES_pwr8),
9403 	STU(AES_x86ni),
9404 	STU(AES_CTRCBC_big),
9405 	STU(AES_CTRCBC_small),
9406 	STU(AES_CTRCBC_ct),
9407 	STU(AES_CTRCBC_ct64),
9408 	STU(AES_CTRCBC_x86ni),
9409 	STU(AES_CTRCBC_pwr8),
9410 	STU(DES_tab),
9411 	STU(DES_ct),
9412 	STU(ChaCha20_ct),
9413 	STU(ChaCha20_sse2),
9414 	STU(Poly1305_ctmul),
9415 	STU(Poly1305_ctmul32),
9416 	STU(Poly1305_ctmulq),
9417 	STU(Poly1305_i15),
9418 	STU(RSA_i15),
9419 	STU(RSA_i31),
9420 	STU(RSA_i32),
9421 	STU(RSA_i62),
9422 	STU(GHASH_ctmul),
9423 	STU(GHASH_ctmul32),
9424 	STU(GHASH_ctmul64),
9425 	STU(GHASH_pclmul),
9426 	STU(GHASH_pwr8),
9427 	STU(CCM),
9428 	STU(EAX),
9429 	STU(GCM),
9430 	STU(EC_prime_i15),
9431 	STU(EC_prime_i31),
9432 	STU(EC_p256_m15),
9433 	STU(EC_p256_m31),
9434 	STU(EC_p256_m62),
9435 	STU(EC_p256_m64),
9436 	STU(EC_c25519_i15),
9437 	STU(EC_c25519_i31),
9438 	STU(EC_c25519_m15),
9439 	STU(EC_c25519_m31),
9440 	STU(EC_c25519_m62),
9441 	STU(EC_c25519_m64),
9442 	STU(ECDSA_i15),
9443 	STU(ECDSA_i31),
9444 	STU(modpow_i31),
9445 	STU(modpow_i62),
9446 	{ 0, 0 }
9447 };
9448 
9449 int
9450 main(int argc, char *argv[])
9451 {
9452 	size_t u;
9453 
9454 	if (argc <= 1) {
9455 		printf("usage: testcrypto all | name...\n");
9456 		printf("individual test names:\n");
9457 		for (u = 0; tfns[u].name; u ++) {
9458 			printf("   %s\n", tfns[u].name);
9459 		}
9460 	} else {
9461 		for (u = 0; tfns[u].name; u ++) {
9462 			int i;
9463 
9464 			for (i = 1; i < argc; i ++) {
9465 				if (eq_name(argv[i], tfns[u].name)
9466 					|| eq_name(argv[i], "all"))
9467 				{
9468 					tfns[u].fn();
9469 					break;
9470 				}
9471 			}
9472 		}
9473 	}
9474 	return 0;
9475 }
9476