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[32]; 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[65], k[1]; 8320 size_t plen, qlen; 8321 8322 plen = hextobin(P, sP); 8323 qlen = hextobin(Q, sQ); 8324 if (plen != sizeof P || qlen != sizeof P) { 8325 fprintf(stderr, "KAT is incorrect\n"); 8326 exit(EXIT_FAILURE); 8327 } 8328 k[0] = 0x10; 8329 if (impl->mul(P, plen, k, 1, BR_EC_secp256r1) != 1) { 8330 fprintf(stderr, "P-256 multiplication failed\n"); 8331 exit(EXIT_FAILURE); 8332 } 8333 check_equals("P256_carry", P, Q, plen); 8334 printf("."); 8335 fflush(stdout); 8336 } 8337 8338 static void 8339 test_EC_P256_carry(const br_ec_impl *impl) 8340 { 8341 test_EC_P256_carry_inner(impl, 8342 "0435BAA24B2B6E1B3C88E22A383BD88CC4B9A3166E7BCF94FF6591663AE066B33B821EBA1B4FC8EA609A87EB9A9C9A1CCD5C9F42FA1365306F64D7CAA718B8C978", 8343 "0447752A76CA890328D34E675C4971EC629132D1FC4863EDB61219B72C4E58DC5E9D51E7B293488CFD913C3CF20E438BB65C2BA66A7D09EABB45B55E804260C5EB"); 8344 test_EC_P256_carry_inner(impl, 8345 "04DCAE9D9CE211223602024A6933BD42F77B6BF4EAB9C8915F058C149419FADD2CC9FC0707B270A1B5362BA4D249AFC8AC3DA1EFCA8270176EEACA525B49EE19E6", 8346 "048DAC7B0BE9B3206FCE8B24B6B4AEB122F2A67D13E536B390B6585CA193427E63F222388B5F51D744D6F5D47536D89EEEC89552BCB269E7828019C4410DFE980A"); 8347 } 8348 8349 static void 8350 test_EC_KAT(const char *name, const br_ec_impl *impl, uint32_t curve_mask) 8351 { 8352 printf("Test %s: ", name); 8353 fflush(stdout); 8354 8355 if (curve_mask & ((uint32_t)1 << BR_EC_secp256r1)) { 8356 test_EC_inner( 8357 "C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721", 8358 "0460FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB67903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299", 8359 impl, BR_EC_secp256r1); 8360 test_EC_P256_carry(impl); 8361 } 8362 if (curve_mask & ((uint32_t)1 << BR_EC_secp384r1)) { 8363 test_EC_inner( 8364 "6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5", 8365 "04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720", 8366 impl, BR_EC_secp384r1); 8367 } 8368 if (curve_mask & ((uint32_t)1 << BR_EC_secp521r1)) { 8369 test_EC_inner( 8370 "00FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538", 8371 "0401894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD371123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F5023A400493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A28A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDFCF5", 8372 impl, BR_EC_secp521r1); 8373 } 8374 8375 printf(" done.\n"); 8376 fflush(stdout); 8377 } 8378 8379 static void 8380 test_EC_keygen(const char *name, const br_ec_impl *impl, uint32_t curves) 8381 { 8382 int curve; 8383 br_hmac_drbg_context rng; 8384 8385 printf("Test %s keygen: ", name); 8386 fflush(stdout); 8387 8388 br_hmac_drbg_init(&rng, &br_sha256_vtable, "seed for EC keygen", 18); 8389 br_hmac_drbg_update(&rng, name, strlen(name)); 8390 8391 for (curve = -1; curve <= 35; curve ++) { 8392 br_ec_private_key sk; 8393 br_ec_public_key pk; 8394 unsigned char kbuf_priv[BR_EC_KBUF_PRIV_MAX_SIZE]; 8395 unsigned char kbuf_pub[BR_EC_KBUF_PUB_MAX_SIZE]; 8396 8397 if (curve < 0 || curve >= 32 || ((curves >> curve) & 1) == 0) { 8398 if (br_ec_keygen(&rng.vtable, impl, 8399 &sk, kbuf_priv, curve) != 0) 8400 { 8401 fprintf(stderr, "br_ec_keygen() did not" 8402 " reject unsupported curve %d\n", 8403 curve); 8404 exit(EXIT_FAILURE); 8405 } 8406 sk.curve = curve; 8407 if (br_ec_compute_pub(impl, NULL, NULL, &sk) != 0) { 8408 fprintf(stderr, "br_ec_keygen() did not" 8409 " reject unsupported curve %d\n", 8410 curve); 8411 exit(EXIT_FAILURE); 8412 } 8413 } else { 8414 size_t len, u; 8415 unsigned char tmp_priv[sizeof kbuf_priv]; 8416 unsigned char tmp_pub[sizeof kbuf_pub]; 8417 unsigned z; 8418 8419 len = br_ec_keygen(&rng.vtable, impl, 8420 NULL, NULL, curve); 8421 if (len == 0) { 8422 fprintf(stderr, "br_ec_keygen() rejects" 8423 " supported curve %d\n", curve); 8424 exit(EXIT_FAILURE); 8425 } 8426 if (len > sizeof kbuf_priv) { 8427 fprintf(stderr, "oversized kbuf_priv\n"); 8428 exit(EXIT_FAILURE); 8429 } 8430 memset(kbuf_priv, 0, sizeof kbuf_priv); 8431 if (br_ec_keygen(&rng.vtable, impl, 8432 NULL, kbuf_priv, curve) != len) 8433 { 8434 fprintf(stderr, "kbuf_priv length mismatch\n"); 8435 exit(EXIT_FAILURE); 8436 } 8437 z = 0; 8438 for (u = 0; u < len; u ++) { 8439 z |= kbuf_priv[u]; 8440 } 8441 if (z == 0) { 8442 fprintf(stderr, "kbuf_priv not initialized\n"); 8443 exit(EXIT_FAILURE); 8444 } 8445 for (u = len; u < sizeof kbuf_priv; u ++) { 8446 if (kbuf_priv[u] != 0) { 8447 fprintf(stderr, "kbuf_priv overflow\n"); 8448 exit(EXIT_FAILURE); 8449 } 8450 } 8451 if (br_ec_keygen(&rng.vtable, impl, 8452 NULL, tmp_priv, curve) != len) 8453 { 8454 fprintf(stderr, "tmp_priv length mismatch\n"); 8455 exit(EXIT_FAILURE); 8456 } 8457 if (memcmp(kbuf_priv, tmp_priv, len) == 0) { 8458 fprintf(stderr, "keygen stutter\n"); 8459 exit(EXIT_FAILURE); 8460 } 8461 memset(&sk, 0, sizeof sk); 8462 if (br_ec_keygen(&rng.vtable, impl, 8463 &sk, kbuf_priv, curve) != len) 8464 { 8465 fprintf(stderr, 8466 "kbuf_priv length mismatch (2)\n"); 8467 exit(EXIT_FAILURE); 8468 } 8469 if (sk.curve != curve || sk.x != kbuf_priv 8470 || sk.xlen != len) 8471 { 8472 fprintf(stderr, "sk not initialized\n"); 8473 exit(EXIT_FAILURE); 8474 } 8475 8476 len = br_ec_compute_pub(impl, NULL, NULL, &sk); 8477 if (len > sizeof kbuf_pub) { 8478 fprintf(stderr, "oversized kbuf_pub\n"); 8479 exit(EXIT_FAILURE); 8480 } 8481 memset(kbuf_pub, 0, sizeof kbuf_pub); 8482 if (br_ec_compute_pub(impl, NULL, 8483 kbuf_pub, &sk) != len) 8484 { 8485 fprintf(stderr, "kbuf_pub length mismatch\n"); 8486 exit(EXIT_FAILURE); 8487 } 8488 for (u = len; u < sizeof kbuf_pub; u ++) { 8489 if (kbuf_pub[u] != 0) { 8490 fprintf(stderr, "kbuf_pub overflow\n"); 8491 exit(EXIT_FAILURE); 8492 } 8493 } 8494 memset(&pk, 0, sizeof pk); 8495 if (br_ec_compute_pub(impl, &pk, 8496 tmp_pub, &sk) != len) 8497 { 8498 fprintf(stderr, "tmp_pub length mismatch\n"); 8499 exit(EXIT_FAILURE); 8500 } 8501 if (memcmp(kbuf_pub, tmp_pub, len) != 0) { 8502 fprintf(stderr, "pubkey mismatch\n"); 8503 exit(EXIT_FAILURE); 8504 } 8505 if (pk.curve != curve || pk.q != tmp_pub 8506 || pk.qlen != len) 8507 { 8508 fprintf(stderr, "pk not initialized\n"); 8509 exit(EXIT_FAILURE); 8510 } 8511 8512 if (impl->mulgen(kbuf_pub, 8513 sk.x, sk.xlen, curve) != len 8514 || memcmp(pk.q, kbuf_pub, len) != 0) 8515 { 8516 fprintf(stderr, "wrong pubkey\n"); 8517 exit(EXIT_FAILURE); 8518 } 8519 } 8520 printf("."); 8521 fflush(stdout); 8522 } 8523 8524 printf(" done.\n"); 8525 fflush(stdout); 8526 } 8527 8528 static void 8529 test_EC_prime_i15(void) 8530 { 8531 test_EC_KAT("EC_prime_i15", &br_ec_prime_i15, 8532 (uint32_t)1 << BR_EC_secp256r1 8533 | (uint32_t)1 << BR_EC_secp384r1 8534 | (uint32_t)1 << BR_EC_secp521r1); 8535 test_EC_keygen("EC_prime_i15", &br_ec_prime_i15, 8536 (uint32_t)1 << BR_EC_secp256r1 8537 | (uint32_t)1 << BR_EC_secp384r1 8538 | (uint32_t)1 << BR_EC_secp521r1); 8539 } 8540 8541 static void 8542 test_EC_prime_i31(void) 8543 { 8544 test_EC_KAT("EC_prime_i31", &br_ec_prime_i31, 8545 (uint32_t)1 << BR_EC_secp256r1 8546 | (uint32_t)1 << BR_EC_secp384r1 8547 | (uint32_t)1 << BR_EC_secp521r1); 8548 test_EC_keygen("EC_prime_i31", &br_ec_prime_i31, 8549 (uint32_t)1 << BR_EC_secp256r1 8550 | (uint32_t)1 << BR_EC_secp384r1 8551 | (uint32_t)1 << BR_EC_secp521r1); 8552 } 8553 8554 static void 8555 test_EC_p256_m15(void) 8556 { 8557 test_EC_KAT("EC_p256_m15", &br_ec_p256_m15, 8558 (uint32_t)1 << BR_EC_secp256r1); 8559 test_EC_keygen("EC_p256_m15", &br_ec_p256_m15, 8560 (uint32_t)1 << BR_EC_secp256r1); 8561 } 8562 8563 static void 8564 test_EC_p256_m31(void) 8565 { 8566 test_EC_KAT("EC_p256_m31", &br_ec_p256_m31, 8567 (uint32_t)1 << BR_EC_secp256r1); 8568 test_EC_keygen("EC_p256_m31", &br_ec_p256_m31, 8569 (uint32_t)1 << BR_EC_secp256r1); 8570 } 8571 8572 static void 8573 test_EC_p256_m62(void) 8574 { 8575 const br_ec_impl *ec; 8576 8577 ec = br_ec_p256_m62_get(); 8578 if (ec != NULL) { 8579 test_EC_KAT("EC_p256_m62", ec, 8580 (uint32_t)1 << BR_EC_secp256r1); 8581 test_EC_keygen("EC_p256_m62", ec, 8582 (uint32_t)1 << BR_EC_secp256r1); 8583 } else { 8584 printf("Test EC_p256_m62: UNAVAILABLE\n"); 8585 printf("Test EC_p256_m62 keygen: UNAVAILABLE\n"); 8586 } 8587 } 8588 8589 static void 8590 test_EC_p256_m64(void) 8591 { 8592 const br_ec_impl *ec; 8593 8594 ec = br_ec_p256_m64_get(); 8595 if (ec != NULL) { 8596 test_EC_KAT("EC_p256_m64", ec, 8597 (uint32_t)1 << BR_EC_secp256r1); 8598 test_EC_keygen("EC_p256_m64", ec, 8599 (uint32_t)1 << BR_EC_secp256r1); 8600 } else { 8601 printf("Test EC_p256_m64: UNAVAILABLE\n"); 8602 printf("Test EC_p256_m64 keygen: UNAVAILABLE\n"); 8603 } 8604 } 8605 8606 const struct { 8607 const char *scalar_le; 8608 const char *u_in; 8609 const char *u_out; 8610 } C25519_KAT[] = { 8611 { "A546E36BF0527C9D3B16154B82465EDD62144C0AC1FC5A18506A2244BA449AC4", 8612 "E6DB6867583030DB3594C1A424B15F7C726624EC26B3353B10A903A6D0AB1C4C", 8613 "C3DA55379DE9C6908E94EA4DF28D084F32ECCF03491C71F754B4075577A28552" }, 8614 { "4B66E9D4D1B4673C5AD22691957D6AF5C11B6421E0EA01D42CA4169E7918BA0D", 8615 "E5210F12786811D3F4B7959D0538AE2C31DBE7106FC03C3EFC4CD549C715A493", 8616 "95CBDE9476E8907D7AADE45CB4B873F88B595A68799FA152E6F8F7647AAC7957" }, 8617 { 0, 0, 0 } 8618 }; 8619 8620 static void 8621 revbytes(unsigned char *buf, size_t len) 8622 { 8623 size_t u; 8624 8625 for (u = 0; u < (len >> 1); u ++) { 8626 unsigned t; 8627 8628 t = buf[u]; 8629 buf[u] = buf[len - 1 - u]; 8630 buf[len - 1 - u] = t; 8631 } 8632 } 8633 8634 static void 8635 test_EC_c25519(const char *name, const br_ec_impl *iec) 8636 { 8637 unsigned char bu[32], bk[32], br[32]; 8638 size_t v; 8639 int i; 8640 8641 printf("Test %s: ", name); 8642 fflush(stdout); 8643 for (v = 0; C25519_KAT[v].scalar_le; v ++) { 8644 hextobin(bk, C25519_KAT[v].scalar_le); 8645 revbytes(bk, sizeof bk); 8646 hextobin(bu, C25519_KAT[v].u_in); 8647 hextobin(br, C25519_KAT[v].u_out); 8648 if (!iec->mul(bu, sizeof bu, bk, sizeof bk, BR_EC_curve25519)) { 8649 fprintf(stderr, "Curve25519 multiplication failed\n"); 8650 exit(EXIT_FAILURE); 8651 } 8652 if (memcmp(bu, br, sizeof bu) != 0) { 8653 fprintf(stderr, "Curve25519 failed KAT\n"); 8654 exit(EXIT_FAILURE); 8655 } 8656 printf("."); 8657 fflush(stdout); 8658 } 8659 printf(" "); 8660 fflush(stdout); 8661 8662 memset(bu, 0, sizeof bu); 8663 bu[0] = 0x09; 8664 memcpy(bk, bu, sizeof bu); 8665 for (i = 1; i <= 1000; i ++) { 8666 revbytes(bk, sizeof bk); 8667 if (!iec->mul(bu, sizeof bu, bk, sizeof bk, BR_EC_curve25519)) { 8668 fprintf(stderr, "Curve25519 multiplication failed" 8669 " (iter=%d)\n", i); 8670 exit(EXIT_FAILURE); 8671 } 8672 revbytes(bk, sizeof bk); 8673 for (v = 0; v < sizeof bu; v ++) { 8674 unsigned t; 8675 8676 t = bu[v]; 8677 bu[v] = bk[v]; 8678 bk[v] = t; 8679 } 8680 if (i == 1 || i == 1000) { 8681 const char *sref; 8682 8683 sref = (i == 1) 8684 ? "422C8E7A6227D7BCA1350B3E2BB7279F7897B87BB6854B783C60E80311AE3079" 8685 : "684CF59BA83309552800EF566F2F4D3C1C3887C49360E3875F2EB94D99532C51"; 8686 hextobin(br, sref); 8687 if (memcmp(bk, br, sizeof bk) != 0) { 8688 fprintf(stderr, 8689 "Curve25519 failed KAT (iter=%d)\n", i); 8690 exit(EXIT_FAILURE); 8691 } 8692 } 8693 if (i % 100 == 0) { 8694 printf("."); 8695 fflush(stdout); 8696 } 8697 } 8698 8699 printf(" done.\n"); 8700 fflush(stdout); 8701 } 8702 8703 static void 8704 test_EC_c25519_i15(void) 8705 { 8706 test_EC_c25519("EC_c25519_i15", &br_ec_c25519_i15); 8707 test_EC_keygen("EC_c25519_i15", &br_ec_c25519_i15, 8708 (uint32_t)1 << BR_EC_curve25519); 8709 } 8710 8711 static void 8712 test_EC_c25519_i31(void) 8713 { 8714 test_EC_c25519("EC_c25519_i31", &br_ec_c25519_i31); 8715 test_EC_keygen("EC_c25519_i31", &br_ec_c25519_i31, 8716 (uint32_t)1 << BR_EC_curve25519); 8717 } 8718 8719 static void 8720 test_EC_c25519_m15(void) 8721 { 8722 test_EC_c25519("EC_c25519_m15", &br_ec_c25519_m15); 8723 test_EC_keygen("EC_c25519_m15", &br_ec_c25519_m15, 8724 (uint32_t)1 << BR_EC_curve25519); 8725 } 8726 8727 static void 8728 test_EC_c25519_m31(void) 8729 { 8730 test_EC_c25519("EC_c25519_m31", &br_ec_c25519_m31); 8731 test_EC_keygen("EC_c25519_m31", &br_ec_c25519_m31, 8732 (uint32_t)1 << BR_EC_curve25519); 8733 } 8734 8735 static void 8736 test_EC_c25519_m62(void) 8737 { 8738 const br_ec_impl *ec; 8739 8740 ec = br_ec_c25519_m62_get(); 8741 if (ec != NULL) { 8742 test_EC_c25519("EC_c25519_m62", ec); 8743 test_EC_keygen("EC_c25519_m62", ec, 8744 (uint32_t)1 << BR_EC_curve25519); 8745 } else { 8746 printf("Test EC_c25519_m62: UNAVAILABLE\n"); 8747 printf("Test EC_c25519_m62 keygen: UNAVAILABLE\n"); 8748 } 8749 } 8750 8751 static void 8752 test_EC_c25519_m64(void) 8753 { 8754 const br_ec_impl *ec; 8755 8756 ec = br_ec_c25519_m64_get(); 8757 if (ec != NULL) { 8758 test_EC_c25519("EC_c25519_m64", ec); 8759 test_EC_keygen("EC_c25519_m64", ec, 8760 (uint32_t)1 << BR_EC_curve25519); 8761 } else { 8762 printf("Test EC_c25519_m64: UNAVAILABLE\n"); 8763 printf("Test EC_c25519_m64 keygen: UNAVAILABLE\n"); 8764 } 8765 } 8766 8767 static const unsigned char EC_P256_PUB_POINT[] = { 8768 0x04, 0x60, 0xFE, 0xD4, 0xBA, 0x25, 0x5A, 0x9D, 8769 0x31, 0xC9, 0x61, 0xEB, 0x74, 0xC6, 0x35, 0x6D, 8770 0x68, 0xC0, 0x49, 0xB8, 0x92, 0x3B, 0x61, 0xFA, 8771 0x6C, 0xE6, 0x69, 0x62, 0x2E, 0x60, 0xF2, 0x9F, 8772 0xB6, 0x79, 0x03, 0xFE, 0x10, 0x08, 0xB8, 0xBC, 8773 0x99, 0xA4, 0x1A, 0xE9, 0xE9, 0x56, 0x28, 0xBC, 8774 0x64, 0xF2, 0xF1, 0xB2, 0x0C, 0x2D, 0x7E, 0x9F, 8775 0x51, 0x77, 0xA3, 0xC2, 0x94, 0xD4, 0x46, 0x22, 8776 0x99 8777 }; 8778 8779 static const unsigned char EC_P256_PRIV_X[] = { 8780 0xC9, 0xAF, 0xA9, 0xD8, 0x45, 0xBA, 0x75, 0x16, 8781 0x6B, 0x5C, 0x21, 0x57, 0x67, 0xB1, 0xD6, 0x93, 8782 0x4E, 0x50, 0xC3, 0xDB, 0x36, 0xE8, 0x9B, 0x12, 8783 0x7B, 0x8A, 0x62, 0x2B, 0x12, 0x0F, 0x67, 0x21 8784 }; 8785 8786 static const br_ec_public_key EC_P256_PUB = { 8787 BR_EC_secp256r1, 8788 (unsigned char *)EC_P256_PUB_POINT, sizeof EC_P256_PUB_POINT 8789 }; 8790 8791 static const br_ec_private_key EC_P256_PRIV = { 8792 BR_EC_secp256r1, 8793 (unsigned char *)EC_P256_PRIV_X, sizeof EC_P256_PRIV_X 8794 }; 8795 8796 static const unsigned char EC_P384_PUB_POINT[] = { 8797 0x04, 0xEC, 0x3A, 0x4E, 0x41, 0x5B, 0x4E, 0x19, 8798 0xA4, 0x56, 0x86, 0x18, 0x02, 0x9F, 0x42, 0x7F, 8799 0xA5, 0xDA, 0x9A, 0x8B, 0xC4, 0xAE, 0x92, 0xE0, 8800 0x2E, 0x06, 0xAA, 0xE5, 0x28, 0x6B, 0x30, 0x0C, 8801 0x64, 0xDE, 0xF8, 0xF0, 0xEA, 0x90, 0x55, 0x86, 8802 0x60, 0x64, 0xA2, 0x54, 0x51, 0x54, 0x80, 0xBC, 8803 0x13, 0x80, 0x15, 0xD9, 0xB7, 0x2D, 0x7D, 0x57, 8804 0x24, 0x4E, 0xA8, 0xEF, 0x9A, 0xC0, 0xC6, 0x21, 8805 0x89, 0x67, 0x08, 0xA5, 0x93, 0x67, 0xF9, 0xDF, 8806 0xB9, 0xF5, 0x4C, 0xA8, 0x4B, 0x3F, 0x1C, 0x9D, 8807 0xB1, 0x28, 0x8B, 0x23, 0x1C, 0x3A, 0xE0, 0xD4, 8808 0xFE, 0x73, 0x44, 0xFD, 0x25, 0x33, 0x26, 0x47, 8809 0x20 8810 }; 8811 8812 static const unsigned char EC_P384_PRIV_X[] = { 8813 0x6B, 0x9D, 0x3D, 0xAD, 0x2E, 0x1B, 0x8C, 0x1C, 8814 0x05, 0xB1, 0x98, 0x75, 0xB6, 0x65, 0x9F, 0x4D, 8815 0xE2, 0x3C, 0x3B, 0x66, 0x7B, 0xF2, 0x97, 0xBA, 8816 0x9A, 0xA4, 0x77, 0x40, 0x78, 0x71, 0x37, 0xD8, 8817 0x96, 0xD5, 0x72, 0x4E, 0x4C, 0x70, 0xA8, 0x25, 8818 0xF8, 0x72, 0xC9, 0xEA, 0x60, 0xD2, 0xED, 0xF5 8819 }; 8820 8821 static const br_ec_public_key EC_P384_PUB = { 8822 BR_EC_secp384r1, 8823 (unsigned char *)EC_P384_PUB_POINT, sizeof EC_P384_PUB_POINT 8824 }; 8825 8826 static const br_ec_private_key EC_P384_PRIV = { 8827 BR_EC_secp384r1, 8828 (unsigned char *)EC_P384_PRIV_X, sizeof EC_P384_PRIV_X 8829 }; 8830 8831 static const unsigned char EC_P521_PUB_POINT[] = { 8832 0x04, 0x01, 0x89, 0x45, 0x50, 0xD0, 0x78, 0x59, 8833 0x32, 0xE0, 0x0E, 0xAA, 0x23, 0xB6, 0x94, 0xF2, 8834 0x13, 0xF8, 0xC3, 0x12, 0x1F, 0x86, 0xDC, 0x97, 8835 0xA0, 0x4E, 0x5A, 0x71, 0x67, 0xDB, 0x4E, 0x5B, 8836 0xCD, 0x37, 0x11, 0x23, 0xD4, 0x6E, 0x45, 0xDB, 8837 0x6B, 0x5D, 0x53, 0x70, 0xA7, 0xF2, 0x0F, 0xB6, 8838 0x33, 0x15, 0x5D, 0x38, 0xFF, 0xA1, 0x6D, 0x2B, 8839 0xD7, 0x61, 0xDC, 0xAC, 0x47, 0x4B, 0x9A, 0x2F, 8840 0x50, 0x23, 0xA4, 0x00, 0x49, 0x31, 0x01, 0xC9, 8841 0x62, 0xCD, 0x4D, 0x2F, 0xDD, 0xF7, 0x82, 0x28, 8842 0x5E, 0x64, 0x58, 0x41, 0x39, 0xC2, 0xF9, 0x1B, 8843 0x47, 0xF8, 0x7F, 0xF8, 0x23, 0x54, 0xD6, 0x63, 8844 0x0F, 0x74, 0x6A, 0x28, 0xA0, 0xDB, 0x25, 0x74, 8845 0x1B, 0x5B, 0x34, 0xA8, 0x28, 0x00, 0x8B, 0x22, 8846 0xAC, 0xC2, 0x3F, 0x92, 0x4F, 0xAA, 0xFB, 0xD4, 8847 0xD3, 0x3F, 0x81, 0xEA, 0x66, 0x95, 0x6D, 0xFE, 8848 0xAA, 0x2B, 0xFD, 0xFC, 0xF5 8849 }; 8850 8851 static const unsigned char EC_P521_PRIV_X[] = { 8852 0x00, 0xFA, 0xD0, 0x6D, 0xAA, 0x62, 0xBA, 0x3B, 8853 0x25, 0xD2, 0xFB, 0x40, 0x13, 0x3D, 0xA7, 0x57, 8854 0x20, 0x5D, 0xE6, 0x7F, 0x5B, 0xB0, 0x01, 0x8F, 8855 0xEE, 0x8C, 0x86, 0xE1, 0xB6, 0x8C, 0x7E, 0x75, 8856 0xCA, 0xA8, 0x96, 0xEB, 0x32, 0xF1, 0xF4, 0x7C, 8857 0x70, 0x85, 0x58, 0x36, 0xA6, 0xD1, 0x6F, 0xCC, 8858 0x14, 0x66, 0xF6, 0xD8, 0xFB, 0xEC, 0x67, 0xDB, 8859 0x89, 0xEC, 0x0C, 0x08, 0xB0, 0xE9, 0x96, 0xB8, 8860 0x35, 0x38 8861 }; 8862 8863 static const br_ec_public_key EC_P521_PUB = { 8864 BR_EC_secp521r1, 8865 (unsigned char *)EC_P521_PUB_POINT, sizeof EC_P521_PUB_POINT 8866 }; 8867 8868 static const br_ec_private_key EC_P521_PRIV = { 8869 BR_EC_secp521r1, 8870 (unsigned char *)EC_P521_PRIV_X, sizeof EC_P521_PRIV_X 8871 }; 8872 8873 typedef struct { 8874 const br_ec_public_key *pub; 8875 const br_ec_private_key *priv; 8876 const br_hash_class *hf; 8877 const char *msg; 8878 const char *sk; 8879 const char *sraw; 8880 const char *sasn1; 8881 } ecdsa_kat_vector; 8882 8883 const ecdsa_kat_vector ECDSA_KAT[] = { 8884 8885 /* Test vectors for P-256, from RFC 6979. */ 8886 { 8887 &EC_P256_PUB, 8888 &EC_P256_PRIV, 8889 &br_sha1_vtable, "sample", 8890 "882905F1227FD620FBF2ABF21244F0BA83D0DC3A9103DBBEE43A1FB858109DB4", 8891 "61340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D326D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB", 8892 "3044022061340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D3202206D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB" 8893 }, 8894 { 8895 &EC_P256_PUB, 8896 &EC_P256_PRIV, 8897 &br_sha224_vtable, "sample", 8898 "103F90EE9DC52E5E7FB5132B7033C63066D194321491862059967C715985D473", 8899 "53B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3FB9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C", 8900 "3045022053B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3F022100B9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C" 8901 }, 8902 { 8903 &EC_P256_PUB, 8904 &EC_P256_PRIV, 8905 &br_sha256_vtable, "sample", 8906 "A6E3C57DD01ABE90086538398355DD4C3B17AA873382B0F24D6129493D8AAD60", 8907 "EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8", 8908 "3046022100EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716022100F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8" 8909 }, 8910 { 8911 &EC_P256_PUB, 8912 &EC_P256_PRIV, 8913 &br_sha384_vtable, "sample", 8914 "09F634B188CEFD98E7EC88B1AA9852D734D0BC272F7D2A47DECC6EBEB375AAD4", 8915 "0EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF77194861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954", 8916 "304402200EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF771902204861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954" 8917 }, 8918 { 8919 &EC_P256_PUB, 8920 &EC_P256_PRIV, 8921 &br_sha512_vtable, "sample", 8922 "5FA81C63109BADB88C1F367B47DA606DA28CAD69AA22C4FE6AD7DF73A7173AA5", 8923 "8496A60B5E9B47C825488827E0495B0E3FA109EC4568FD3F8D1097678EB97F002362AB1ADBE2B8ADF9CB9EDAB740EA6049C028114F2460F96554F61FAE3302FE", 8924 "30450221008496A60B5E9B47C825488827E0495B0E3FA109EC4568FD3F8D1097678EB97F0002202362AB1ADBE2B8ADF9CB9EDAB740EA6049C028114F2460F96554F61FAE3302FE" 8925 }, 8926 { 8927 &EC_P256_PUB, 8928 &EC_P256_PRIV, 8929 &br_sha1_vtable, "test", 8930 "8C9520267C55D6B980DF741E56B4ADEE114D84FBFA2E62137954164028632A2E", 8931 "0CBCC86FD6ABD1D99E703E1EC50069EE5C0B4BA4B9AC60E409E8EC5910D81A8901B9D7B73DFAA60D5651EC4591A0136F87653E0FD780C3B1BC872FFDEAE479B1", 8932 "304402200CBCC86FD6ABD1D99E703E1EC50069EE5C0B4BA4B9AC60E409E8EC5910D81A89022001B9D7B73DFAA60D5651EC4591A0136F87653E0FD780C3B1BC872FFDEAE479B1" 8933 }, 8934 { 8935 &EC_P256_PUB, 8936 &EC_P256_PRIV, 8937 &br_sha224_vtable, "test", 8938 "669F4426F2688B8BE0DB3A6BD1989BDAEFFF84B649EEB84F3DD26080F667FAA7", 8939 "C37EDB6F0AE79D47C3C27E962FA269BB4F441770357E114EE511F662EC34A692C820053A05791E521FCAAD6042D40AEA1D6B1A540138558F47D0719800E18F2D", 8940 "3046022100C37EDB6F0AE79D47C3C27E962FA269BB4F441770357E114EE511F662EC34A692022100C820053A05791E521FCAAD6042D40AEA1D6B1A540138558F47D0719800E18F2D" 8941 }, 8942 { 8943 &EC_P256_PUB, 8944 &EC_P256_PRIV, 8945 &br_sha256_vtable, "test", 8946 "D16B6AE827F17175E040871A1C7EC3500192C4C92677336EC2537ACAEE0008E0", 8947 "F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083", 8948 "3045022100F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D383670220019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083" 8949 }, 8950 { 8951 &EC_P256_PUB, 8952 &EC_P256_PRIV, 8953 &br_sha384_vtable, "test", 8954 "16AEFFA357260B04B1DD199693960740066C1A8F3E8EDD79070AA914D361B3B8", 8955 "83910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB68DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C", 8956 "304602210083910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB60221008DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C" 8957 }, 8958 { 8959 &EC_P256_PUB, 8960 &EC_P256_PRIV, 8961 &br_sha512_vtable, "test", 8962 "6915D11632ACA3C40D5D51C08DAF9C555933819548784480E93499000D9F0B7F", 8963 "461D93F31B6540894788FD206C07CFA0CC35F46FA3C91816FFF1040AD1581A0439AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55", 8964 "30440220461D93F31B6540894788FD206C07CFA0CC35F46FA3C91816FFF1040AD1581A04022039AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55" 8965 }, 8966 8967 /* Test vectors for P-384, from RFC 6979. */ 8968 { 8969 &EC_P384_PUB, 8970 &EC_P384_PRIV, 8971 &br_sha1_vtable, "sample", 8972 "4471EF7518BB2C7C20F62EAE1C387AD0C5E8E470995DB4ACF694466E6AB096630F29E5938D25106C3C340045A2DB01A7", 8973 "EC748D839243D6FBEF4FC5C4859A7DFFD7F3ABDDF72014540C16D73309834FA37B9BA002899F6FDA3A4A9386790D4EB2A3BCFA947BEEF4732BF247AC17F71676CB31A847B9FF0CBC9C9ED4C1A5B3FACF26F49CA031D4857570CCB5CA4424A443", 8974 "3066023100EC748D839243D6FBEF4FC5C4859A7DFFD7F3ABDDF72014540C16D73309834FA37B9BA002899F6FDA3A4A9386790D4EB2023100A3BCFA947BEEF4732BF247AC17F71676CB31A847B9FF0CBC9C9ED4C1A5B3FACF26F49CA031D4857570CCB5CA4424A443" 8975 }, 8976 8977 { 8978 &EC_P384_PUB, 8979 &EC_P384_PRIV, 8980 &br_sha224_vtable, "sample", 8981 "A4E4D2F0E729EB786B31FC20AD5D849E304450E0AE8E3E341134A5C1AFA03CAB8083EE4E3C45B06A5899EA56C51B5879", 8982 "42356E76B55A6D9B4631C865445DBE54E056D3B3431766D0509244793C3F9366450F76EE3DE43F5A125333A6BE0601229DA0C81787064021E78DF658F2FBB0B042BF304665DB721F077A4298B095E4834C082C03D83028EFBF93A3C23940CA8D", 8983 "3065023042356E76B55A6D9B4631C865445DBE54E056D3B3431766D0509244793C3F9366450F76EE3DE43F5A125333A6BE0601220231009DA0C81787064021E78DF658F2FBB0B042BF304665DB721F077A4298B095E4834C082C03D83028EFBF93A3C23940CA8D" 8984 }, 8985 { 8986 &EC_P384_PUB, 8987 &EC_P384_PRIV, 8988 &br_sha256_vtable, "sample", 8989 "180AE9F9AEC5438A44BC159A1FCB277C7BE54FA20E7CF404B490650A8ACC414E375572342863C899F9F2EDF9747A9B60", 8990 "21B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33BDE1E888E63355D92FA2B3C36D8FB2CDF3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEBEFDC63ECCD1AC42EC0CB8668A4FA0AB0", 8991 "3065023021B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33BDE1E888E63355D92FA2B3C36D8FB2CD023100F3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEBEFDC63ECCD1AC42EC0CB8668A4FA0AB0" 8992 }, 8993 { 8994 &EC_P384_PUB, 8995 &EC_P384_PRIV, 8996 &br_sha384_vtable, "sample", 8997 "94ED910D1A099DAD3254E9242AE85ABDE4BA15168EAF0CA87A555FD56D10FBCA2907E3E83BA95368623B8C4686915CF9", 8998 "94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE4699EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8", 8999 "306602310094EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE4602310099EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8" 9000 }, 9001 { 9002 &EC_P384_PUB, 9003 &EC_P384_PRIV, 9004 &br_sha512_vtable, "sample", 9005 "92FC3C7183A883E24216D1141F1A8976C5B0DD797DFA597E3D7B32198BD35331A4E966532593A52980D0E3AAA5E10EC3", 9006 "ED0959D5880AB2D869AE7F6C2915C6D60F96507F9CB3E047C0046861DA4A799CFE30F35CC900056D7C99CD7882433709512C8CCEEE3890A84058CE1E22DBC2198F42323CE8ACA9135329F03C068E5112DC7CC3EF3446DEFCEB01A45C2667FDD5", 9007 "3065023100ED0959D5880AB2D869AE7F6C2915C6D60F96507F9CB3E047C0046861DA4A799CFE30F35CC900056D7C99CD78824337090230512C8CCEEE3890A84058CE1E22DBC2198F42323CE8ACA9135329F03C068E5112DC7CC3EF3446DEFCEB01A45C2667FDD5" 9008 }, 9009 { 9010 &EC_P384_PUB, 9011 &EC_P384_PRIV, 9012 &br_sha1_vtable, "test", 9013 "66CC2C8F4D303FC962E5FF6A27BD79F84EC812DDAE58CF5243B64A4AD8094D47EC3727F3A3C186C15054492E30698497", 9014 "4BC35D3A50EF4E30576F58CD96CE6BF638025EE624004A1F7789A8B8E43D0678ACD9D29876DAF46638645F7F404B11C7D5A6326C494ED3FF614703878961C0FDE7B2C278F9A65FD8C4B7186201A2991695BA1C84541327E966FA7B50F7382282", 9015 "306502304BC35D3A50EF4E30576F58CD96CE6BF638025EE624004A1F7789A8B8E43D0678ACD9D29876DAF46638645F7F404B11C7023100D5A6326C494ED3FF614703878961C0FDE7B2C278F9A65FD8C4B7186201A2991695BA1C84541327E966FA7B50F7382282" 9016 }, 9017 { 9018 &EC_P384_PUB, 9019 &EC_P384_PRIV, 9020 &br_sha224_vtable, "test", 9021 "18FA39DB95AA5F561F30FA3591DC59C0FA3653A80DAFFA0B48D1A4C6DFCBFF6E3D33BE4DC5EB8886A8ECD093F2935726", 9022 "E8C9D0B6EA72A0E7837FEA1D14A1A9557F29FAA45D3E7EE888FC5BF954B5E62464A9A817C47FF78B8C11066B24080E7207041D4A7A0379AC7232FF72E6F77B6DDB8F09B16CCE0EC3286B2BD43FA8C6141C53EA5ABEF0D8231077A04540A96B66", 9023 "3065023100E8C9D0B6EA72A0E7837FEA1D14A1A9557F29FAA45D3E7EE888FC5BF954B5E62464A9A817C47FF78B8C11066B24080E72023007041D4A7A0379AC7232FF72E6F77B6DDB8F09B16CCE0EC3286B2BD43FA8C6141C53EA5ABEF0D8231077A04540A96B66" 9024 }, 9025 { 9026 &EC_P384_PUB, 9027 &EC_P384_PRIV, 9028 &br_sha256_vtable, "test", 9029 "0CFAC37587532347DC3389FDC98286BBA8C73807285B184C83E62E26C401C0FAA48DD070BA79921A3457ABFF2D630AD7", 9030 "6D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559F918EEDAF2293BE5B475CC8F0188636B2D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D51AB373F9845C0514EEFB14024787265", 9031 "306402306D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559F918EEDAF2293BE5B475CC8F0188636B02302D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D51AB373F9845C0514EEFB14024787265" 9032 }, 9033 { 9034 &EC_P384_PUB, 9035 &EC_P384_PRIV, 9036 &br_sha384_vtable, "test", 9037 "015EE46A5BF88773ED9123A5AB0807962D193719503C527B031B4C2D225092ADA71F4A459BC0DA98ADB95837DB8312EA", 9038 "8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DBDDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5", 9039 "30660231008203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB023100DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5" 9040 }, 9041 { 9042 &EC_P384_PUB, 9043 &EC_P384_PRIV, 9044 &br_sha512_vtable, "test", 9045 "3780C4F67CB15518B6ACAE34C9F83568D2E12E47DEAB6C50A4E4EE5319D1E8CE0E2CC8A136036DC4B9C00E6888F66B6C", 9046 "A0D5D090C9980FAF3C2CE57B7AE951D31977DD11C775D314AF55F76C676447D06FB6495CD21B4B6E340FC236584FB277976984E59B4C77B0E8E4460DCA3D9F20E07B9BB1F63BEEFAF576F6B2E8B224634A2092CD3792E0159AD9CEE37659C736", 9047 "3066023100A0D5D090C9980FAF3C2CE57B7AE951D31977DD11C775D314AF55F76C676447D06FB6495CD21B4B6E340FC236584FB277023100976984E59B4C77B0E8E4460DCA3D9F20E07B9BB1F63BEEFAF576F6B2E8B224634A2092CD3792E0159AD9CEE37659C736" 9048 }, 9049 9050 /* Test vectors for P-521, from RFC 6979. */ 9051 { 9052 &EC_P521_PUB, 9053 &EC_P521_PRIV, 9054 &br_sha1_vtable, "sample", 9055 "0089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D0F9", 9056 "00343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D75D00E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5D16", 9057 "3081870241343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D75D024200E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5D16" 9058 }, 9059 { 9060 &EC_P521_PUB, 9061 &EC_P521_PRIV, 9062 &br_sha224_vtable, "sample", 9063 "0121415EC2CD7726330A61F7F3FA5DE14BE9436019C4DB8CB4041F3B54CF31BE0493EE3F427FB906393D895A19C9523F3A1D54BB8702BD4AA9C99DAB2597B92113F3", 9064 "01776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A30715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2ED2E0050CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17BA41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B41F", 9065 "308187024201776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A30715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2ED2E024150CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17BA41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B41F" 9066 }, 9067 { 9068 &EC_P521_PUB, 9069 &EC_P521_PRIV, 9070 &br_sha256_vtable, "sample", 9071 "00EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C32575761793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E1A0", 9072 "01511BB4D675114FE266FC4372B87682BAECC01D3CC62CF2303C92B3526012659D16876E25C7C1E57648F23B73564D67F61C6F14D527D54972810421E7D87589E1A7004A171143A83163D6DF460AAF61522695F207A58B95C0644D87E52AA1A347916E4F7A72930B1BC06DBE22CE3F58264AFD23704CBB63B29B931F7DE6C9D949A7ECFC", 9073 "308187024201511BB4D675114FE266FC4372B87682BAECC01D3CC62CF2303C92B3526012659D16876E25C7C1E57648F23B73564D67F61C6F14D527D54972810421E7D87589E1A702414A171143A83163D6DF460AAF61522695F207A58B95C0644D87E52AA1A347916E4F7A72930B1BC06DBE22CE3F58264AFD23704CBB63B29B931F7DE6C9D949A7ECFC" 9074 }, 9075 { 9076 &EC_P521_PUB, 9077 &EC_P521_PRIV, 9078 &br_sha384_vtable, "sample", 9079 "01546A108BC23A15D6F21872F7DED661FA8431DDBD922D0DCDB77CC878C8553FFAD064C95A920A750AC9137E527390D2D92F153E66196966EA554D9ADFCB109C4211", 9080 "01EA842A0E17D2DE4F92C15315C63DDF72685C18195C2BB95E572B9C5136CA4B4B576AD712A52BE9730627D16054BA40CC0B8D3FF035B12AE75168397F5D50C6745101F21A3CEE066E1961025FB048BD5FE2B7924D0CD797BABE0A83B66F1E35EEAF5FDE143FA85DC394A7DEE766523393784484BDF3E00114A1C857CDE1AA203DB65D61", 9081 "308188024201EA842A0E17D2DE4F92C15315C63DDF72685C18195C2BB95E572B9C5136CA4B4B576AD712A52BE9730627D16054BA40CC0B8D3FF035B12AE75168397F5D50C67451024201F21A3CEE066E1961025FB048BD5FE2B7924D0CD797BABE0A83B66F1E35EEAF5FDE143FA85DC394A7DEE766523393784484BDF3E00114A1C857CDE1AA203DB65D61" 9082 }, 9083 { 9084 &EC_P521_PUB, 9085 &EC_P521_PRIV, 9086 &br_sha512_vtable, "sample", 9087 "01DAE2EA071F8110DC26882D4D5EAE0621A3256FC8847FB9022E2B7D28E6F10198B1574FDD03A9053C08A1854A168AA5A57470EC97DD5CE090124EF52A2F7ECBFFD3", 9088 "00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A", 9089 "308187024200C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA0241617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A" 9090 }, 9091 { 9092 &EC_P521_PUB, 9093 &EC_P521_PRIV, 9094 &br_sha1_vtable, "test", 9095 "00BB9F2BF4FE1038CCF4DABD7139A56F6FD8BB1386561BD3C6A4FC818B20DF5DDBA80795A947107A1AB9D12DAA615B1ADE4F7A9DC05E8E6311150F47F5C57CE8B222", 9096 "013BAD9F29ABE20DE37EBEB823C252CA0F63361284015A3BF430A46AAA80B87B0693F0694BD88AFE4E661FC33B094CD3B7963BED5A727ED8BD6A3A202ABE009D036701E9BB81FF7944CA409AD138DBBEE228E1AFCC0C890FC78EC8604639CB0DBDC90F717A99EAD9D272855D00162EE9527567DD6A92CBD629805C0445282BBC916797FF", 9097 "3081880242013BAD9F29ABE20DE37EBEB823C252CA0F63361284015A3BF430A46AAA80B87B0693F0694BD88AFE4E661FC33B094CD3B7963BED5A727ED8BD6A3A202ABE009D0367024201E9BB81FF7944CA409AD138DBBEE228E1AFCC0C890FC78EC8604639CB0DBDC90F717A99EAD9D272855D00162EE9527567DD6A92CBD629805C0445282BBC916797FF" 9098 }, 9099 { 9100 &EC_P521_PUB, 9101 &EC_P521_PRIV, 9102 &br_sha224_vtable, "test", 9103 "0040D09FCF3C8A5F62CF4FB223CBBB2B9937F6B0577C27020A99602C25A01136987E452988781484EDBBCF1C47E554E7FC901BC3085E5206D9F619CFF07E73D6F706", 9104 "01C7ED902E123E6815546065A2C4AF977B22AA8EADDB68B2C1110E7EA44D42086BFE4A34B67DDC0E17E96536E358219B23A706C6A6E16BA77B65E1C595D43CAE17FB0177336676304FCB343CE028B38E7B4FBA76C1C1B277DA18CAD2A8478B2A9A9F5BEC0F3BA04F35DB3E4263569EC6AADE8C92746E4C82F8299AE1B8F1739F8FD519A4", 9105 "308188024201C7ED902E123E6815546065A2C4AF977B22AA8EADDB68B2C1110E7EA44D42086BFE4A34B67DDC0E17E96536E358219B23A706C6A6E16BA77B65E1C595D43CAE17FB02420177336676304FCB343CE028B38E7B4FBA76C1C1B277DA18CAD2A8478B2A9A9F5BEC0F3BA04F35DB3E4263569EC6AADE8C92746E4C82F8299AE1B8F1739F8FD519A4" 9106 }, 9107 { 9108 &EC_P521_PUB, 9109 &EC_P521_PRIV, 9110 &br_sha256_vtable, "test", 9111 "001DE74955EFAABC4C4F17F8E84D881D1310B5392D7700275F82F145C61E843841AF09035BF7A6210F5A431A6A9E81C9323354A9E69135D44EBD2FCAA7731B909258", 9112 "000E871C4A14F993C6C7369501900C4BC1E9C7B0B4BA44E04868B30B41D8071042EB28C4C250411D0CE08CD197E4188EA4876F279F90B3D8D74A3C76E6F1E4656AA800CD52DBAA33B063C3A6CD8058A1FB0A46A4754B034FCC644766CA14DA8CA5CA9FDE00E88C1AD60CCBA759025299079D7A427EC3CC5B619BFBC828E7769BCD694E86", 9113 "30818702410E871C4A14F993C6C7369501900C4BC1E9C7B0B4BA44E04868B30B41D8071042EB28C4C250411D0CE08CD197E4188EA4876F279F90B3D8D74A3C76E6F1E4656AA8024200CD52DBAA33B063C3A6CD8058A1FB0A46A4754B034FCC644766CA14DA8CA5CA9FDE00E88C1AD60CCBA759025299079D7A427EC3CC5B619BFBC828E7769BCD694E86" 9114 }, 9115 { 9116 &EC_P521_PUB, 9117 &EC_P521_PRIV, 9118 &br_sha384_vtable, "test", 9119 "01F1FC4A349A7DA9A9E116BFDD055DC08E78252FF8E23AC276AC88B1770AE0B5DCEB1ED14A4916B769A523CE1E90BA22846AF11DF8B300C38818F713DADD85DE0C88", 9120 "014BEE21A18B6D8B3C93FAB08D43E739707953244FDBE924FA926D76669E7AC8C89DF62ED8975C2D8397A65A49DCC09F6B0AC62272741924D479354D74FF6075578C0133330865C067A0EAF72362A65E2D7BC4E461E8C8995C3B6226A21BD1AA78F0ED94FE536A0DCA35534F0CD1510C41525D163FE9D74D134881E35141ED5E8E95B979", 9121 "3081880242014BEE21A18B6D8B3C93FAB08D43E739707953244FDBE924FA926D76669E7AC8C89DF62ED8975C2D8397A65A49DCC09F6B0AC62272741924D479354D74FF6075578C02420133330865C067A0EAF72362A65E2D7BC4E461E8C8995C3B6226A21BD1AA78F0ED94FE536A0DCA35534F0CD1510C41525D163FE9D74D134881E35141ED5E8E95B979" 9122 }, 9123 { 9124 &EC_P521_PUB, 9125 &EC_P521_PRIV, 9126 &br_sha512_vtable, "test", 9127 "016200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC56D", 9128 "013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3", 9129 "3081880242013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D024201FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3" 9130 }, 9131 9132 /* Terminator for list of test vectors. */ 9133 { 9134 0, 0, 0, 0, 0, 0, 0 9135 } 9136 }; 9137 9138 static void 9139 test_ECDSA_KAT(const br_ec_impl *iec, 9140 br_ecdsa_sign sign, br_ecdsa_vrfy vrfy, int asn1) 9141 { 9142 size_t u; 9143 9144 for (u = 0;; u ++) { 9145 const ecdsa_kat_vector *kv; 9146 unsigned char hash[64]; 9147 size_t hash_len; 9148 unsigned char sig[150], sig2[150]; 9149 size_t sig_len, sig2_len; 9150 br_hash_compat_context hc; 9151 9152 kv = &ECDSA_KAT[u]; 9153 if (kv->pub == 0) { 9154 break; 9155 } 9156 kv->hf->init(&hc.vtable); 9157 kv->hf->update(&hc.vtable, kv->msg, strlen(kv->msg)); 9158 kv->hf->out(&hc.vtable, hash); 9159 hash_len = (kv->hf->desc >> BR_HASHDESC_OUT_OFF) 9160 & BR_HASHDESC_OUT_MASK; 9161 if (asn1) { 9162 sig_len = hextobin(sig, kv->sasn1); 9163 } else { 9164 sig_len = hextobin(sig, kv->sraw); 9165 } 9166 9167 if (vrfy(iec, hash, hash_len, 9168 kv->pub, sig, sig_len) != 1) 9169 { 9170 fprintf(stderr, "ECDSA KAT verify failed (1)\n"); 9171 exit(EXIT_FAILURE); 9172 } 9173 hash[0] ^= 0x80; 9174 if (vrfy(iec, hash, hash_len, 9175 kv->pub, sig, sig_len) != 0) 9176 { 9177 fprintf(stderr, "ECDSA KAT verify shoud have failed\n"); 9178 exit(EXIT_FAILURE); 9179 } 9180 hash[0] ^= 0x80; 9181 if (vrfy(iec, hash, hash_len, 9182 kv->pub, sig, sig_len) != 1) 9183 { 9184 fprintf(stderr, "ECDSA KAT verify failed (2)\n"); 9185 exit(EXIT_FAILURE); 9186 } 9187 9188 sig2_len = sign(iec, kv->hf, hash, kv->priv, sig2); 9189 if (sig2_len == 0) { 9190 fprintf(stderr, "ECDSA KAT sign failed\n"); 9191 exit(EXIT_FAILURE); 9192 } 9193 if (sig2_len != sig_len || memcmp(sig, sig2, sig_len) != 0) { 9194 fprintf(stderr, "ECDSA KAT wrong signature value\n"); 9195 exit(EXIT_FAILURE); 9196 } 9197 9198 printf("."); 9199 fflush(stdout); 9200 } 9201 } 9202 9203 static void 9204 test_ECDSA_i31(void) 9205 { 9206 printf("Test ECDSA/i31: "); 9207 fflush(stdout); 9208 printf("[raw]"); 9209 fflush(stdout); 9210 test_ECDSA_KAT(&br_ec_prime_i31, 9211 &br_ecdsa_i31_sign_raw, &br_ecdsa_i31_vrfy_raw, 0); 9212 printf(" [asn1]"); 9213 fflush(stdout); 9214 test_ECDSA_KAT(&br_ec_prime_i31, 9215 &br_ecdsa_i31_sign_asn1, &br_ecdsa_i31_vrfy_asn1, 1); 9216 printf(" done.\n"); 9217 fflush(stdout); 9218 } 9219 9220 static void 9221 test_ECDSA_i15(void) 9222 { 9223 printf("Test ECDSA/i15: "); 9224 fflush(stdout); 9225 printf("[raw]"); 9226 fflush(stdout); 9227 test_ECDSA_KAT(&br_ec_prime_i15, 9228 &br_ecdsa_i15_sign_raw, &br_ecdsa_i15_vrfy_raw, 0); 9229 printf(" [asn1]"); 9230 fflush(stdout); 9231 test_ECDSA_KAT(&br_ec_prime_i31, 9232 &br_ecdsa_i15_sign_asn1, &br_ecdsa_i15_vrfy_asn1, 1); 9233 printf(" done.\n"); 9234 fflush(stdout); 9235 } 9236 9237 static void 9238 test_modpow_i31(void) 9239 { 9240 br_hmac_drbg_context hc; 9241 int k; 9242 9243 printf("Test ModPow/i31: "); 9244 9245 br_hmac_drbg_init(&hc, &br_sha256_vtable, "seed modpow", 11); 9246 for (k = 10; k <= 500; k ++) { 9247 size_t blen; 9248 unsigned char bm[128], bx[128], bx1[128], bx2[128]; 9249 unsigned char be[128]; 9250 unsigned mask; 9251 uint32_t x1[35], m1[35]; 9252 uint16_t x2[70], m2[70]; 9253 uint32_t tmp1[1000]; 9254 uint16_t tmp2[2000]; 9255 9256 blen = (k + 7) >> 3; 9257 br_hmac_drbg_generate(&hc, bm, blen); 9258 br_hmac_drbg_generate(&hc, bx, blen); 9259 br_hmac_drbg_generate(&hc, be, blen); 9260 bm[blen - 1] |= 0x01; 9261 mask = 0xFF >> ((int)(blen << 3) - k); 9262 bm[0] &= mask; 9263 bm[0] |= (mask - (mask >> 1)); 9264 bx[0] &= (mask >> 1); 9265 9266 br_i31_decode(m1, bm, blen); 9267 br_i31_decode_mod(x1, bx, blen, m1); 9268 br_i31_modpow_opt(x1, be, blen, m1, br_i31_ninv31(m1[1]), 9269 tmp1, (sizeof tmp1) / (sizeof tmp1[0])); 9270 br_i31_encode(bx1, blen, x1); 9271 9272 br_i15_decode(m2, bm, blen); 9273 br_i15_decode_mod(x2, bx, blen, m2); 9274 br_i15_modpow_opt(x2, be, blen, m2, br_i15_ninv15(m2[1]), 9275 tmp2, (sizeof tmp2) / (sizeof tmp2[0])); 9276 br_i15_encode(bx2, blen, x2); 9277 9278 check_equals("ModPow i31/i15", bx1, bx2, blen); 9279 9280 printf("."); 9281 fflush(stdout); 9282 } 9283 9284 printf(" done.\n"); 9285 fflush(stdout); 9286 } 9287 9288 static void 9289 test_modpow_i62(void) 9290 { 9291 br_hmac_drbg_context hc; 9292 int k; 9293 9294 printf("Test ModPow/i62: "); 9295 9296 br_hmac_drbg_init(&hc, &br_sha256_vtable, "seed modpow", 11); 9297 for (k = 10; k <= 500; k ++) { 9298 size_t blen; 9299 unsigned char bm[128], bx[128], bx1[128], bx2[128]; 9300 unsigned char be[128]; 9301 unsigned mask; 9302 uint32_t x1[35], m1[35]; 9303 uint16_t x2[70], m2[70]; 9304 uint64_t tmp1[500]; 9305 uint16_t tmp2[2000]; 9306 9307 blen = (k + 7) >> 3; 9308 br_hmac_drbg_generate(&hc, bm, blen); 9309 br_hmac_drbg_generate(&hc, bx, blen); 9310 br_hmac_drbg_generate(&hc, be, blen); 9311 bm[blen - 1] |= 0x01; 9312 mask = 0xFF >> ((int)(blen << 3) - k); 9313 bm[0] &= mask; 9314 bm[0] |= (mask - (mask >> 1)); 9315 bx[0] &= (mask >> 1); 9316 9317 br_i31_decode(m1, bm, blen); 9318 br_i31_decode_mod(x1, bx, blen, m1); 9319 br_i62_modpow_opt(x1, be, blen, m1, br_i31_ninv31(m1[1]), 9320 tmp1, (sizeof tmp1) / (sizeof tmp1[0])); 9321 br_i31_encode(bx1, blen, x1); 9322 9323 br_i15_decode(m2, bm, blen); 9324 br_i15_decode_mod(x2, bx, blen, m2); 9325 br_i15_modpow_opt(x2, be, blen, m2, br_i15_ninv15(m2[1]), 9326 tmp2, (sizeof tmp2) / (sizeof tmp2[0])); 9327 br_i15_encode(bx2, blen, x2); 9328 9329 check_equals("ModPow i62/i15", bx1, bx2, blen); 9330 9331 printf("."); 9332 fflush(stdout); 9333 } 9334 9335 printf(" done.\n"); 9336 fflush(stdout); 9337 } 9338 9339 static int 9340 eq_name(const char *s1, const char *s2) 9341 { 9342 for (;;) { 9343 int c1, c2; 9344 9345 for (;;) { 9346 c1 = *s1 ++; 9347 if (c1 >= 'A' && c1 <= 'Z') { 9348 c1 += 'a' - 'A'; 9349 } else { 9350 switch (c1) { 9351 case '-': case '_': case '.': case ' ': 9352 continue; 9353 } 9354 } 9355 break; 9356 } 9357 for (;;) { 9358 c2 = *s2 ++; 9359 if (c2 >= 'A' && c2 <= 'Z') { 9360 c2 += 'a' - 'A'; 9361 } else { 9362 switch (c2) { 9363 case '-': case '_': case '.': case ' ': 9364 continue; 9365 } 9366 } 9367 break; 9368 } 9369 if (c1 != c2) { 9370 return 0; 9371 } 9372 if (c1 == 0) { 9373 return 1; 9374 } 9375 } 9376 } 9377 9378 #define STU(x) { &test_ ## x, #x } 9379 9380 static const struct { 9381 void (*fn)(void); 9382 const char *name; 9383 } tfns[] = { 9384 STU(MD5), 9385 STU(SHA1), 9386 STU(SHA224), 9387 STU(SHA256), 9388 STU(SHA384), 9389 STU(SHA512), 9390 STU(MD5_SHA1), 9391 STU(multihash), 9392 STU(HMAC), 9393 STU(HKDF), 9394 STU(SHAKE), 9395 STU(HMAC_DRBG), 9396 STU(AESCTR_DRBG), 9397 STU(PRF), 9398 STU(AES_big), 9399 STU(AES_small), 9400 STU(AES_ct), 9401 STU(AES_ct64), 9402 STU(AES_pwr8), 9403 STU(AES_x86ni), 9404 STU(AES_CTRCBC_big), 9405 STU(AES_CTRCBC_small), 9406 STU(AES_CTRCBC_ct), 9407 STU(AES_CTRCBC_ct64), 9408 STU(AES_CTRCBC_x86ni), 9409 STU(AES_CTRCBC_pwr8), 9410 STU(DES_tab), 9411 STU(DES_ct), 9412 STU(ChaCha20_ct), 9413 STU(ChaCha20_sse2), 9414 STU(Poly1305_ctmul), 9415 STU(Poly1305_ctmul32), 9416 STU(Poly1305_ctmulq), 9417 STU(Poly1305_i15), 9418 STU(RSA_i15), 9419 STU(RSA_i31), 9420 STU(RSA_i32), 9421 STU(RSA_i62), 9422 STU(GHASH_ctmul), 9423 STU(GHASH_ctmul32), 9424 STU(GHASH_ctmul64), 9425 STU(GHASH_pclmul), 9426 STU(GHASH_pwr8), 9427 STU(CCM), 9428 STU(EAX), 9429 STU(GCM), 9430 STU(EC_prime_i15), 9431 STU(EC_prime_i31), 9432 STU(EC_p256_m15), 9433 STU(EC_p256_m31), 9434 STU(EC_p256_m62), 9435 STU(EC_p256_m64), 9436 STU(EC_c25519_i15), 9437 STU(EC_c25519_i31), 9438 STU(EC_c25519_m15), 9439 STU(EC_c25519_m31), 9440 STU(EC_c25519_m62), 9441 STU(EC_c25519_m64), 9442 STU(ECDSA_i15), 9443 STU(ECDSA_i31), 9444 STU(modpow_i31), 9445 STU(modpow_i62), 9446 { 0, 0 } 9447 }; 9448 9449 int 9450 main(int argc, char *argv[]) 9451 { 9452 size_t u; 9453 9454 if (argc <= 1) { 9455 printf("usage: testcrypto all | name...\n"); 9456 printf("individual test names:\n"); 9457 for (u = 0; tfns[u].name; u ++) { 9458 printf(" %s\n", tfns[u].name); 9459 } 9460 } else { 9461 for (u = 0; tfns[u].name; u ++) { 9462 int i; 9463 9464 for (i = 1; i < argc; i ++) { 9465 if (eq_name(argv[i], tfns[u].name) 9466 || eq_name(argv[i], "all")) 9467 { 9468 tfns[u].fn(); 9469 break; 9470 } 9471 } 9472 } 9473 } 9474 return 0; 9475 } 9476