Crypto: add test vectors for P256

This commit is contained in:
Vincent Bernardoff 2018-06-14 01:56:11 +02:00 committed by Benjamin Canou
parent 0addf499c5
commit 68330036a1
4 changed files with 355 additions and 1 deletions

View File

@ -2,14 +2,27 @@
(executable (executable
((name test) ((name test)
(modules (Test))
(public_name test-uecc) (public_name test-uecc)
(libraries (alcotest uecc)))) (libraries (alcotest uecc))))
(executable
((name test_vectors)
(modules (Vectors Test_vectors))
(public_name test-uecc-vectors)
(libraries (cstruct hex alcotest uecc))))
(alias (alias
((name runtest-uecc) ((name runtest-uecc)
(deps (test.exe)) (deps (test.exe))
(action (run ${<})))) (action (run ${<}))))
(alias
((name runtest-uecc-vectors)
(deps (test_vectors.exe))
(action (run ${<}))))
(alias (alias
((name runtest) ((name runtest)
(deps ((alias runtest-uecc))))) (deps ((alias runtest-uecc)
(alias runtest-uecc-vectors)))))

151
vendors/ocaml-uecc/test/test_vectors.c vendored Normal file
View File

@ -0,0 +1,151 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/obj_mac.h>
#include <openssl/bn.h>
#include <openssl/ec.h>
#include <openssl/sha.h>
#include <openssl/opensslv.h>
#define CURVE_P256 NID_X9_62_prime256v1
BIO* err_bio;
unsigned char msg[10][32];
const unsigned char seed[] = "Tadam!!";
const char sks[][65] =
{ "D63FF7D5D8FB7334287CB397F824B3567178BB635CD2FAA8A34D0B1BC65FDAF2",
"9D585160C3AD171D7F4925F359C2B4C8992730DBAEE4D4D10B1E0E489CCA3404",
"62FAA069EE7286D027747656EC736F29D20E5BF827F1D531B1A9DE215AF876F3",
"2FE21C081FFA7CBD631E6F20B05B870D64A252A3B7E1A125C3D07E7B6BBFF41B",
"BC8CB5B05C306B5561CCBAAFE3777C267A8CDEFA6D00B5CE2E65578DEA030F3C",
"610B1C48263CFEA3AEF9C3EF7DE9D39899155BAD1EC66F50165453429032ED9C",
"36149C23680AD42DE8C516DE685A52411086EB9556244A83393FC10CEE12F7C5",
"0866AD7FBCE585B740799D508824A547E877CC5F7D64E121FF13016AAF74B734",
"8D05026AF08E9FFDDB2C485E1A0F1D093C34C5D77962BF31F1437CF0D44CE9D5",
"B495924045946A563F436F5408A68FA21B9782DFC56F44ED90B12130CF9D926A"
};
const char pks[][67] =
{ "02CA5364C4302C38E93F8A4850E61A8FE6C27E386D4541B898F4E74BE5E6DD0256",
"03D6008C2A656DD414C6869558A1E262F38BD5A142039FE84E750335C543B376B9",
"03812447C00050CA921B05A6097C3F29F4ADFF23C4DD6062CBB114DD5B917D1995",
"03BBF4A1B5DF7E66E1FFC67AD2778F5E3A78717027FEBFB940C0C3CFC73F052583",
"0276285EE239631F904401C2C2A22CEFDF7590546ED3AA4E2B2759F16DD7709D6B",
"03BD396999184DBCA1CBA0596A9BA2E973BFA1AF610F8458A1280DDCB9EAE9EA0E",
"023F35281E1AC1EA0589BA9D7FE7C21BA331D2A7A12B3EF2EFE20BEC6639283769",
"0345FFE8A13964727E2D27FD5471D8899CB3C3EE6EDDE81F2C8E19E2EA1FE98160",
"03DF08C9BE891DA811A86914C58B0BE798769FC756A2BD80878B33D9E7373D99A3",
"02823ACE5698ABE2F45C6C9BCB6920AA5183D0ECE663B6B93C213A02F4766CE6A5"
};
void init_msgs() {
SHA256(seed, 32, msg[0]);
for (int i=1; i<10; i++) {
SHA256(msg[i-1], 32, msg[i]);
}
}
void test_encoding() {
char* hex;
EC_GROUP *g = EC_GROUP_new_by_curve_name(CURVE_P256);
EC_KEY *k = EC_KEY_new_by_curve_name(CURVE_P256);
if (!EC_KEY_generate_key(k)) goto error;
const EC_POINT *pk = EC_KEY_get0_public_key(k);
EC_POINT *pk2 = EC_POINT_new(g);
hex = EC_POINT_point2hex(g, pk, POINT_CONVERSION_COMPRESSED, NULL);
printf("Test: %s\n", hex);
if (hex == NULL) goto error;
if (EC_POINT_hex2point(g, hex, pk2, NULL) == NULL) goto error;
OPENSSL_free(hex);
if (EC_POINT_cmp(g, pk, pk2, NULL)) goto error;
return;
error:
ERR_print_errors(err_bio);
exit(EXIT_FAILURE);
}
void vectors_of_key(EC_GROUP *g, EC_KEY *k) {
const BIGNUM *sk = EC_KEY_get0_private_key(k);
const EC_POINT *pk = EC_KEY_get0_public_key(k);
if (sk == NULL) goto error;
if (pk == NULL) goto error;
char *sk_hex = BN_bn2hex(sk);
if (sk_hex == NULL) goto error;
char *pk_hex = EC_POINT_point2hex(g, pk, POINT_CONVERSION_COMPRESSED, NULL);
if (pk_hex == NULL) goto error;
printf("\"%s\", \"%s\";\n\n", sk_hex, pk_hex);
ECDSA_SIG *sig;
const BIGNUM *r, *s;
int valid;
for (int i=0; i<10; i++) {
sig = ECDSA_do_sign(msg[i], 32, k);
valid = ECDSA_do_verify(msg[i], 32, sig, k);
if (valid == -1) goto error;
assert(valid);
if (sig == NULL || r == NULL || s == NULL) goto error;
ECDSA_SIG_get0(sig, &r, &s);
printf("\"%s\", \"%s\";\n", BN_bn2hex(r), BN_bn2hex(s));
}
printf("\n");
OPENSSL_free(sk_hex);
OPENSSL_free(pk_hex);
return;
error:
ERR_print_errors(err_bio);
exit(EXIT_FAILURE);
}
int main(int argc, char** argv) {
EC_GROUP *group;
BIGNUM *sk;
EC_POINT *pk;
EC_KEY *k;
OPENSSL_init();
err_bio = BIO_new_fd(STDERR_FILENO, false);
/* for (int i=0; i<10; i++) test_encoding(); */
init_msgs();
for (int i=0; i<10; i++) {
printf("\"");
for (int j=0; j<32; j++)
printf("%02x", msg[i][j]);
printf("\";\n");
}
group = EC_GROUP_new_by_curve_name(CURVE_P256);
if (group == NULL) goto error;
k = EC_KEY_new_by_curve_name(CURVE_P256);
if (k == NULL) goto error;
for (int i=0; i<sizeof(sks)/sizeof(sks[0]); i++) {
/* if (!EC_KEY_generate_key(k)) goto error; */
sk = BN_new();
pk = EC_POINT_new(group);
if (sk == NULL) goto error;
if (!BN_hex2bn(&sk, sks[i])) goto error;
if (EC_POINT_hex2point(group, pks[i], pk, NULL) == NULL) goto error;
if (!EC_KEY_set_private_key(k, sk)) goto error;
if (!EC_KEY_set_public_key(k, pk)) goto error;
if (!EC_KEY_check_key(k)) goto error;
vectors_of_key(group, k);
}
return EXIT_SUCCESS;
error:
ERR_print_errors(err_bio);
return EXIT_FAILURE;
}

33
vendors/ocaml-uecc/test/test_vectors.ml vendored Normal file
View File

@ -0,0 +1,33 @@
open Uecc
open Vectors
let bigstring_of_hex hex_str =
Cstruct.(to_bigarray (of_hex hex_str))
let msgs =
List.map bigstring_of_hex msgs
let keys =
List.map begin fun (sk, pk) ->
match
sk_of_bytes secp256r1 (bigstring_of_hex sk),
pk_of_bytes secp256r1 (bigstring_of_hex pk) with
| Some (sk, pk), Some pk' when pk = pk' -> sk, pk
| _ -> failwith "invalid key"
end keys
let sigs =
List.map begin fun block ->
List.map begin fun (r, s) ->
let r = bigstring_of_hex r in
let s = bigstring_of_hex s in
Bigstring.concat "" [r; s]
end block
end sigs
let () =
List.iter2 begin fun (_sk, pk) sigs ->
List.iter2 begin fun msg signature ->
assert (verify pk ~msg ~signature)
end msgs sigs
end keys sigs

157
vendors/ocaml-uecc/test/vectors.ml vendored Normal file
View File

@ -0,0 +1,157 @@
let msgs = [
"c9bd5b35d48f71b48656c39e395e4d138a45df54b7c03fad7330f5fa3f42a44d";
"c2a49dc5141afdf02480dc2e9d7ec3f602ccc6cf322a0a9b481c80d37170713c";
"72e8b038fd5cbe8a3f2bb8e9ffc8f48f39143279210e8bfa0131445da9d76b93";
"6aeee423a44030de1632b7d4e42afc04473f9de218a11358016cd04a3dcc8593";
"ba52a5eb037ceecd38bad63d2f004a46bd3ab7f6632d5aa72fe7ee1275e8a704";
"bf49613ff391a12081cfca9ef682784aeeeb4c7774d8259627544e71b14ed15b";
"582f18a35c36b2403ea78d8b78515dbb8aef4e666ae1ef68795f0969a84e3f28";
"201b2e9fd3eac2e8c2ec737789551c052db59c9d8c90817c8af044a4de10c694";
"20ec8437edc2d7b208b281997199da0362c3b619c77853f4330d00a366cbceff";
"b404a9e26011d26f85e1ab3f327b90e582be990f664fc4af3924c9226b908828";
]
let keys = [
"D63FF7D5D8FB7334287CB397F824B3567178BB635CD2FAA8A34D0B1BC65FDAF2", "02CA5364C4302C38E93F8A4850E61A8FE6C27E386D4541B898F4E74BE5E6DD0256";
"9D585160C3AD171D7F4925F359C2B4C8992730DBAEE4D4D10B1E0E489CCA3404", "03D6008C2A656DD414C6869558A1E262F38BD5A142039FE84E750335C543B376B9";
"62FAA069EE7286D027747656EC736F29D20E5BF827F1D531B1A9DE215AF876F3", "03812447C00050CA921B05A6097C3F29F4ADFF23C4DD6062CBB114DD5B917D1995";
"2FE21C081FFA7CBD631E6F20B05B870D64A252A3B7E1A125C3D07E7B6BBFF41B", "03BBF4A1B5DF7E66E1FFC67AD2778F5E3A78717027FEBFB940C0C3CFC73F052583";
"BC8CB5B05C306B5561CCBAAFE3777C267A8CDEFA6D00B5CE2E65578DEA030F3C", "0276285EE239631F904401C2C2A22CEFDF7590546ED3AA4E2B2759F16DD7709D6B";
"610B1C48263CFEA3AEF9C3EF7DE9D39899155BAD1EC66F50165453429032ED9C", "03BD396999184DBCA1CBA0596A9BA2E973BFA1AF610F8458A1280DDCB9EAE9EA0E";
"36149C23680AD42DE8C516DE685A52411086EB9556244A83393FC10CEE12F7C5", "023F35281E1AC1EA0589BA9D7FE7C21BA331D2A7A12B3EF2EFE20BEC6639283769";
"0866AD7FBCE585B740799D508824A547E877CC5F7D64E121FF13016AAF74B734", "0345FFE8A13964727E2D27FD5471D8899CB3C3EE6EDDE81F2C8E19E2EA1FE98160";
"8D05026AF08E9FFDDB2C485E1A0F1D093C34C5D77962BF31F1437CF0D44CE9D5", "03DF08C9BE891DA811A86914C58B0BE798769FC756A2BD80878B33D9E7373D99A3";
"B495924045946A563F436F5408A68FA21B9782DFC56F44ED90B12130CF9D926A", "02823ACE5698ABE2F45C6C9BCB6920AA5183D0ECE663B6B93C213A02F4766CE6A5";
]
let sigs = [
[
"2993E89EF2190B133449447C014A358E44618224E52C27AC83B3468D615FC390", "7A398C8E09359F54E1E5301F0A70DA61BCA0EFC15F037A0A745B78D25F6ABD8F";
"6F89D730F8F95BA32776E7FA1363177615B5955405017AEF0DD7C2474850764E", "681DF8E9541892B165E350689246918B9713D9E4FF038C3689BC46375CFCB7B7";
"2FBE99E3C49C82B539885D522A8D3FA452C91D71D5221873C1402CBF659B5810", "48E56A7360224DC094BD396C4C25D626A21C932320A0DB0427FDBE14FAE20D72";
"0365BF5DDDE6D76843E2BA6AB9000A9E67F1B1FD844ACE78619FD19B22C06D8F", "640F70EA7D40E096D1EF5E5ECC93AE3E8494A671FA61BBAADE7CDE410DF73B23";
"F8CA27D6C8661F452E0A942646F9457EBBB611304E11449B4EB55CDEE5E13E5E", "E19853B34B666E4470C94BAE4C460CACA29DF19D3ADE3B4CB5E3E6B87353F348";
"97835322DE8AE0696FC3B589F022053260098BB3802316A10499DF256B4BF6B9", "329149ACE513F7DD5EFDE1109FC35F190EC164BFE128E1F4A21A13C731251AA2";
"93150473204DF1C253E9F9CF89B955B5C9A2772FD090283EA31E01CCB298C1F2", "4784653C85F5E9FA903F39074965C9EAD54924DCEA74399FDB47CA4E15D73789";
"4F4FD87427A8C38126F17AA48A24B4E0E6EE42B15F97C43186B67263082BC445", "771797C887D528E82459C8FF1AC44776D1ECC4405F06A01B823F8C51323A2F03";
"44DBE56BE142276D1511E358D0EE11758DA23A23AA1C22B5E24FED5EB4F4B020", "5347E75C9A51E0587E41B3753622FE477269989F2D148453DE600C8CD4B61481";
"D7090A223AAB6D9C78766BF7EE6DAABB1339E39081C8AA9DE01FA88A3E1D0C95", "82E0670D9EBFC897FFC64085F750D4AA0EA9CE0060B6CC7BD814BB3D3DBD45F3";
];
[
"3E820E2D38508721A2C306453FCB4876C871EFF458B4D67A331B62E3D35F319C", "7F4DD16617A34FBD129E8559B54E6EB1B98966E3E7F1E16D4E98AD19D0C65101";
"A03A20058473B0A4FC2442EB9269FCA1B7925CCE81877D793AC103EF6CE16B9D", "8E4CD4B5BC3238579BDAD6C0A13922DE457157E1EA226F4A07EE214272FCD44E";
"3E0BB9EFD944C658EB65B5A00D729972982E1F8E49D0007B4F7B3481A137EF54", "27C564A6B4337DB8A39F188073CC3E5B5AE00E487228B4340C0FC5739F7C09A6";
"BCB837DB845BACE2C282D547D0338EB417603DD07E0CBB35E370183451057B74", "6236A33D34AD6A06BAD7D0CAF910A7B992225C63F1977ECABDC20F49F10CCD97";
"AB62075658B7D19A9752D7639FA5063E6D7BA08DE72E00A0C691DC352C9AD962", "53CBF8A896208D7A9D7A56CE57B08F2B00FEE748DF29A9F69B8AB61049DD3A8D";
"0B703E9133978DC668B2C9A6B30E5C12F3446557C6E68769C6B383D754A64D8E", "9DD1FCFA3566A53F76CDDFDFA525667E8057C84741B20E18261F36FA5FF4D3CA";
"A03EC5801603A87178421E778A835A9D1D7BFB985B06E308CE182B49930DC362", "C3FA50430B83CD0EF61B284F4526F29DEC8C239F00657DB6F5FC0660FC7D5314";
"41A7C97D65B52DB132B126689D0626776EC8B5C74BF9D95391CE0659FD04FDEF", "5A9EDA4E725A230B866DEFF2A97D8E29DE293CFC2083770DF66E80062268681D";
"4D86C9C9DAB4F772245602ED8A61CF29122F62012D2910818A057FA0C35D74E8", "5DD4E4349D55D5BC5A23D6B27150E2B31C4A0C5D4A62ED9FA3A48128CDBA6935";
"3D28C32230F49BC145C28D26DE67E52C5F77AC3D99E01374AC0CD5C19E0F650A", "BD6919C7223F762CA8EDF6A7B34D63BC443E55964ADF4D379A13AD2339D57BAD";
];
[
"507397351356C48A03F5089F29F0DA00B18A5EBD8932BEB3840A79CAB9CAA6BE", "25AEBDE6E3376096A799B93C14A27A679DDE80EA6D465329D9DD3015EC2ADAA5";
"D0FF19A923126F55455749F7D2E9EAAB1EE9D0706FC3B08D91B41CF46C84A79E", "557AF9B6F31E429220E8530570FE0F53DF520EC126BCF707F058A74059878E26";
"BD5A17D5D54C538D0BFAF7D215BB1F3A18E6CA6802C13CF7CFB93401BE6F96A4", "D9435EB188209C731405B849CA6A1DC967106E3515DF3601D9EA183909737033";
"F9089078FF8984C3303E4ACEA87B634EDF3155AA3937B32B93C44CFB3DB37F49", "F7F2C39F9AA2D5AEC858C5DCB32CC7DE9C48561BA12BABAEAF567D279AAE93A3";
"9CF5D1F80AEC5BFB1A7F6323D2DC0CB752532B42B4BBA7711C50020018EC7A91", "5368DE5375DA38461C56FCBD39361A24F5AA5236B7026637B615B243FBBF8CED";
"5C978424C73A16A626F6D39C93DB9C4FFE0593CAF7FCC1BDB6C665D5884716E1", "549F39C22FB2C7C11FD4E5E5C935B5B3E00F9250AC2FD7C902682FDC9BEB2AF6";
"4A2D401DCFE0045E1482E55DFF978ECF8F092B9E2B17923ECB53DFFB9E4D6845", "D7B90591A06C0E15BB6B1F94BB46668FEA9AC408164CFB19DBFE63A93F0DF925";
"078ECDE5B62D62EE0A2197D416B992B3FD72551C1F297BE8BC490761F98A6753", "304756BA0880F4BF4AD0EBCED85F1B1A3056CB76FD2A725A00ADA58B9DAD3B81";
"819D67D2F813D0D0C7199DF4FDAF3907A0EFA2AEA1433F37F76914DB3D10D8D4", "52ECE5C1A4036AE515B9D7673EB5D7E2519039CBAB89AE65459E1634FC94E7F7";
"C513BA09A835EA0372460475BB230E3CE9FBA741E59457E6D6E7B860D5146429", "CAD294FFD63C5435E937C4646E92DA4A3B7415B9DF939FC41657A79544C6F563";
];
[
"07EE2738ACD0E5DBF81CD1995A2C25E244A5E4B13BCEEB262319D45A1A7D25F0", "5B9535A7E2F6C7E715693902487594814E913DA664932907AC72141B2F13C0C1";
"7CF0D1E8706D799A504B709671E05B63FA2EEB97B4B28FB35DA285750EEC1F42", "DF3D1DF8BDF59857AB24793EA32439918C115CE06A830ABFE7B6320526543FAC";
"D0750F538A7BA5AFDE00C6B0635A669B5A665BAB5BD8EE268C22AEC860225F65", "6A3B718FB63972A47FA1BBE26842AA794C3E3CFDA29D0024B77897E844F66081";
"C543BEC86E4A0C941BED9EFE8B5C135A607D85A36B1354C715CEFEF46BB9A213", "9F94BC36487CC5A4FB2F3CAD6C4D20C36AEB467BC200E7F48064A240ADA8506F";
"F0D17C82EB1988899D50E36E08F26570C1E3DC097F823D6BC59C9D036CC8F494", "7031F03277228B4F18CECF5E41C8775DDD1B9D101257F5C06DF31EAF6A085B75";
"BF562B53CE096A96A76722E5276221754B3DE59C45B54E355F45E2F7B5D67A64", "85EE44C510A3D82F26036430289382463528FE67233E99F4AD3B52CF73D3E899";
"7136A26AD8BD50ADCDBE0D37E539ECB86E0BA04994AA394ACB466A8EB6A5EA99", "CC7B1F5A6139CA3A066538A4DFEC3A23FC4A5DB945928AAE3066D62F23594646";
"BF4BD3907E148D1CC5186C724DF00C089C2673FCC656B49D8FB04E41FF2A22FE", "D113D4133C649981EEBE54141244ABB5F144ABFF9CABC65AEF7EC181647B6761";
"94BF66B58F9635313967F1E2E8804061115C4055AED47E14017791C89F9EF451", "A0AA94298113085492DE2BEE64D240FF37E37FF31109AEF6DE5DE68694CC2C20";
"E6F108A5B5BB293EC37A83E9853C7DEB568748B462C3F90C1794340B374884B5", "975E5CE59081B057A2CAE2E551BDF5D940E3956C5D488C87DE30B0EDDFC9FFE7";
];
[
"87AE66069ECE659874289C9F69EC172312C772EF692F50E8F10F9D1B80D706CE", "78B78757B9F23226E80B05D19EA4C3310DC55D22660457A84745BD654B5A5F6C";
"24ECEF6DDF05940AFB3D70CF88AD36458E6B6471315BD24C8679D8556CD8F618", "A83F0CBC0C6F0A902128780826028700765C38B8D912019E0BBA6588D47E6EAE";
"D0120B7384D80823C9BB7B201BC68A57493FB2DEE79205BFBCCF710ADADAE0BF", "B265B4D0F5B8D7A79789D97DE44C36CC79EE6E4A50F378784CFD0F8B9E13D4CD";
"CA8D7FF035A76E529002E61F0C40F9B288C930AE9A26C7E54082E4EFBA30702D", "8355D27C2B6DD9EE8E87CEF2CD409C057E9E5C963C9F489A6A7D1174D5687B89";
"7200EC9AC9866B3D0F91AE84F9F3CFD0240245B69B646FB797048B4189EE3B99", "DA34A221D2FD0DFA3C59525BFB08452DDED99DC3D917365681F0FE9BB659CC5B";
"EA5F8CA89E36D5AA0388733879F200518E37D14F2079D679A7F27870B82D6ED2", "8C3BEE0E463FCE7E5FB00550F31833E375B99AD7B93B4A6163B83A2C6BE635DF";
"CE3F5E660300555F80EF2BB599892170E0A647BDF8A908558817B9516394816C", "DA04E455428BABCC8A3F4EDD0E8BF2ECB8F93BEEBED571CF9327BF90609E1F97";
"B001141256BF0EBAC21E850C6FD0E987C0820D46C4149FB73FF3FD6AA38ACBE7", "030C7F191EB70A456681ECA6774462F791CF1056F8E3636FC73C8FBA79CA9357";
"DB6026D84FB431FEB8A298A3D9D3288026685849C557187E9031C8D48781DB3D", "BEDA43577F7EEF2C246A744532E4D4CACBBA9C8CF39E8FB2D408CAC8D5CAF022";
"8EC3FCBFDFA4754A46710761798A1CCB7DC7CF05A888D24BE39F10C7A3BA95D9", "6C6FBF49299663E4F4FA7CDB5BB2FFCA8C0A8B7F1FF432295E685670500D7A68";
];
[
"C9B0DC51E678802F5DB12323D905E50B2AFB675E1D369C4827F906FBDF0D8949", "FD0EA9C356841E20F6404CB519AE7418F06413DC40346A64DDEC030CD6819648";
"BE73D8437105C6794B4EA52F245FB43B94E3AA7D866DE70225F95B0F31B045F7", "DBA6025C481A050F1028B7F16394B74ABDA295EA2DAFC12853992763E912BCA0";
"9E94DD39A0DABCD4D663E35DB91614E6CE80F4538E13950C64C01450F73DF17E", "A6CE7E4483D190AC7EAE12847AD6960A3C3C4A46D094F3B65DB6C91EC81B46AC";
"0C6CBE5D4093A307CC80948530E7993C2862A4FCAEB12291BEBB5050C6FD5C4E", "2A360057D9DEA3925672AE80C2DE3142856A45816F0D3459795B13DBB916FD82";
"7CF8A3B24334C98B261FD24754DB6150C7B6CC2CAB813253794DB34AAF6EB904", "C83FE889C70BD1D6F40B731C6794DBD1B88EBB0BD38C8C2D5EE0159E59E456C8";
"F5AC1083FA8DDA8F49F55EF11D103F4D5FA505A8E4DDDC9749A4DD270F320EDF", "7F6D18478A22AFFEE623020918E6E015F559296382BA333A2F3CB75FAFEC3D5E";
"23606BC51E67726A31E9711251F263163D61CAF44A6A8E3EC512A02CCA2A6B54", "2D04CC1E0FA9C036404536B04BFDF2A4B479F33B271BD3566D1A8DFC10A3811D";
"E97CC9407250EC79A8FD6DC9891D6862FEB6A5FEBDC98707D886784BE466B99D", "9BF45C29A9A737620C49FD3FE8DD563C66B1C89BD62DB1A514B68D9F08181475";
"8E4360EDE2A78AD86C5935C642EE129760F6C624259254AFDAD768AF58DBF1B2", "B8AB363775C7FC1CA935E82B6EB36128AB80A382889CC4393E62DBE6DF85B634";
"4DD37756E5F88605C4076D5C248514D9596B188F648B1095CBE4F471799E9ADB", "305886FB73BD2EFEC718C0922A53CFC0A7FE72D8A7341B72917278F705B2D146";
];
[
"31548B4A01E9D18718DF760ECB31BAC5D74B26AA7A1584683BD9E14F3C150536", "57A4EFA6D545729770CF5EC6F8B9E5E8C00EB7A0A1E8989C3D3360FDD3F3A4E6";
"80E0BCC128735B3A34BB856F451A4DBA0E12DE7548CC228C255A1E45C29BCB50", "276DC10527F4DB8012ED993B051F36595AC306EB0D03756E26FA5A32DE8BADE6";
"91923E8F82A7F35520F2329877C779999B5E863EE1272FD7C0B07F9E9E357662", "A14421CD51A3FF5D226AA926FFC8610905C647283369F23EFCA0F74A9BAAEEB3";
"97B98135A092CD240420CBEFFA6CFACD1F27A7A0E780A16B819E7A2C8FD50D42", "A3675BFB5AF37B1F425B3AB9E49EC81330FCB2E762E76D575C956F83FDE98C35";
"9329AA31B749C2AD2A115D8C0413A5AD73277D33C8E1D74ECE5C619EAF4CE790", "881974CCA20FD68962EB906887B8112C99A2A516CF00A69668AC3C33F538937A";
"F1348E6C8D926A8B8EE8B270DE7BB176AE2E2C6AF9E35C9F6376398CFEBA0197", "0FF1E07819D76525518CDA34E8FA5887EE9C482C754660C649AA15ED9B282C9C";
"89F7E0826E6915E62E2CA5430827336103528DA7BE5D0C35517487FDF9FF2C07", "C810C80E82377008002446E8B8A2ADC6E1E2B091CB7FA4A762360F52EA0C4A01";
"53EFDB5EBF7605CA27AD917AA349E99FEA897583320780332D2D98ED746AAB7D", "2066D45C10C439B5D14855D633254B1D65A42745049345E7B3AC1D703EC556A4";
"90CF973EB2B15D45C19CB8BB29ED012CBDAD29CF35E8327F9948AF2293D58BF4", "58C9DDC28DA7CDD301E2AF3880B375A0F3671E77E569963292B21F3F4F8B1E16";
"A9AC7DAFA5DE5714B927986DC000B0C1CCDFEB40D222E3634ED06DB6AEC7F08F", "1848C7185F95E887A791C19ED5264071BEBCF4804328AA14435A06BE9EB55787";
];
[
"878067F0A2458A197B6847E206109066EDE8FEC99697C9E4A784AB6657423721", "5C573EA8C9074F1BDC69893B0CA279FAFE22A56BBCA509CBB723265B80966923";
"2A09D9485CACC0BC7AB9A3A9060157DD94B76B3621D6EFF3EFD05971B83FEEA7", "88B9F0A77224E52D8F96258E6D177D834809B25BED401E1AB59A134307D286B1";
"3ECDA0DF6FF61A2AE3BDE7A3F8248CDCDA2A5DA6C9FF96D5C6EF2092AF082D34", "25A0E4935A2393FF2BE43A56E29D85C4B5583FE25F0BB9DCFE334C07AB0B8833";
"F780F7D3173D2F1796B0D1E20D89538B9BDB5046B7D94BDDB59F8F62BA11E804", "1F18785D7ED86C99F4DFC4DD0CC40EA1751881A659FBBEC5CB8CD298FE2CE5A7";
"F8FE0D9EFC1BC6781CA589979D28E0954C59FBA552DB641B6BA64EF501E5B71C", "09E34950D82BC4119E5D981E178EF1D63FAFBB80F0FE3E4B65F3F4F8DB6D46A5";
"46E2E2C12600E037EFD5CB884D7FF42B9C9F532DF5AC543B2E094B9423FE3EEE", "D2160CB8A9BE9348C5A47096553CD204F0F92A2F4E6FB64FABC5A7534C398414";
"90354579D0AC6E2EEA75D0A8BB09023142486BAC05E6C807E250139971A913C1", "54FF19E0D425B217E3EF490347B89A63D5B035455BC5A85C50B2795C7EA2471F";
"B52F2CC6B52CC6DF95C5277988FE221590C518B5445F57D0B9F3CFC83ACDD9CB", "2E1908340B89545A98C91CB78C0E743B07545D2ED1CCC952324FA630C67D9C6A";
"067BC3BE6660BA58A8512F0F3443E9F25C6FFA94698F827B9A95F8C098376EC2", "F0791A6254EFB6B2CD795F35699E42FA509A9204CC75F6F85047514110919A81";
"E3C2D7C2FFEA9B41E55982BDFBF48CE6FE77A415592E5F29B13B2F64A965C60A", "B270F9BBEA95956481D43FA076B4B4C1617C8251AEF4044C5EACA662CE5F1334";
];
[
"1B014A18DFA49E768727825E757411D1E82EF2C53E3D8F264D0DED8929F097B8", "1A6953E71828514B2166F97FE5734BE9C45134A29DEEBF6435D9C977D4F3C065";
"0BC3BC37FC3146E76C0F7E27DA82286F86FF242DA9A361FFCCCF324144F5A61F", "8675179AA1E9C73AA296154C32CA51FC233414F83BD6A3332F7A1B100324FEDA";
"DA338DD14FA1316D4DFAEA85A7DD1C88E82240549F13E8437EDB9F1CC50642C2", "494E0B77E4E457BD1210D4D5A335589A8184473A453CDF60A800AC646EAA8E01";
"6463B9FAD5442512D48D54287413868F88C4976DAF770ECC32AB8246D3E4640D", "CDEA7D4E5F41FC4573E4E4CA1F8E8A69228D1CE70FBF0E058342E4B9CDDF4633";
"104A62A41AAA0F0BD8A9D1C16755C7CF13301CEDCEB9AABBE798B025FEDADCB4", "A68C528A453826F91DEDDBA195D0827C2DFF29CEF29A14AF6382827BFCBA883A";
"E583D91345F7E83E16E41B504DD7FD98558115A2F4021270B79317F07D1638E0", "1DA80828D384A17DB98EA2B976C514E86252076600C53D4E4978EF81874C95F3";
"AC8401515A9B5A5279EB71FAF379AE75230B0FDFA62CF57F01344372C004141C", "9DFFDF966DE197CB477FF818C2B39EE7ACEB017E528B7A7F6F6D98110DE71D5C";
"5CB89E053B3E0AC2EC4748D79D4A58550979E7641599611E3797E72654DFC491", "A6C3F6ED9CFC58CD6B76BA0D7E98FB5F905AB046ECFC70C50394A47B90859093";
"2DBD7FAAA92098766A06E1F24BD2D5AB8159AF24E22475C8FAE186D663E7E9E6", "BEDE654EC3844FCBB6CD15656118F172DD84ECE7D49F5D1263AC82E323D98C3D";
"A1F2FF766E8B53DE806E7A91A7AF490BD686269407E6F0D0FFDF93A9106D492C", "32F3780CC6D036222FC6CC2D5FA4709EBA196ACCDD7F1BF3160948576AE6D243";
];
[
"F9C8200774C89174BC27F0E57973BBB883209858E8691FA953A0ED72298529F6", "E9642C624DAE2D39706B5771FBA3BE086F3D122DA05D7A418DA5FD08B47424DC";
"BDF9D6491CE56BE82FBA49BDE718969AA76A4625487BB3320C3414E88FBFEBC0", "8ECA982E184B8F480E6F6829BF009438BC50213E98E8CEC6F417FF111373A415";
"B8DC0289B3BB3053371BD01A378DF38B988DB7D2222619C54017E442CEEDC565", "DAA13E54F28EFE8DAEE7FFD39C6C156CAE4BCE542C17554A374B5C33126E6986";
"DCB0EAFE2B3AF6D2AAC927287FA6C2C3A634987EBEE92D05939C4D4CFDE5A0BD", "BBC289E1E59001237ED6116D9FB461816BDF17630BB5721BED7D881C6DA6E120";
"2DFE4059218CFD3BAD9A6DE6971519A83CE3856947E311A2DEC7EE310BAE4422", "5D8ABE63135C857B82FD49FC8B50E2BCFC9814500254E0CC2449ABAC5862A91A";
"4B3C3880B54B8201B0DC0E9F5608108A6EC3F28361DAFDA0819E9C075DF7F4C9", "E11224AD07E2DD2F724BDFEC63F3CA556B82C3C12ADD3DBBC58D7EA5BE0FCC4B";
"6B6795E354C247D01E8D9C5FD8223BFBC995D1C74C3A7A62532BEC1E328FF5AF", "771495A2204745D6129EBAB34EF707D61F28293E522A5CE1119A7EE279FBCFD4";
"EB524D039CC8EAFD7622952B83CB898CDEE43D71A0F79F02DC1F2600E5A5D207", "4275CEAF79D008173D906D8D58086A6E7B25F5744F72D8B7A593947736215144";
"92C1E9B91918D5BE76E81B05CFF9D444A192B9FA8ED09858F426BF6A0DF6297F", "E3CA3CF73B15C938A6A306BA790B1B39FE26FD9575A44303B2EA8CFE81A73B3A";
"1D510BC16CD4C978CD6498E716BAE437F11B519E5240F974C1C0B04F8176C728", "AD7FB5F7E80177416AA5CF1E80E082B326A574A4D523D90AEA45FED80134BA80";
];
]