]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bearssl/test/test_crypto.c
MFV r353143 (phillip):
[FreeBSD/FreeBSD.git] / contrib / bearssl / test / test_crypto.c
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 }