From 68330036a10dbcc913f418a6f45222a3a7557812 Mon Sep 17 00:00:00 2001 From: Vincent Bernardoff Date: Thu, 14 Jun 2018 01:56:11 +0200 Subject: [PATCH] Crypto: add test vectors for P256 --- vendors/ocaml-uecc/test/jbuild | 15 ++- vendors/ocaml-uecc/test/test_vectors.c | 151 +++++++++++++++++++++++ vendors/ocaml-uecc/test/test_vectors.ml | 33 +++++ vendors/ocaml-uecc/test/vectors.ml | 157 ++++++++++++++++++++++++ 4 files changed, 355 insertions(+), 1 deletion(-) create mode 100644 vendors/ocaml-uecc/test/test_vectors.c create mode 100644 vendors/ocaml-uecc/test/test_vectors.ml create mode 100644 vendors/ocaml-uecc/test/vectors.ml diff --git a/vendors/ocaml-uecc/test/jbuild b/vendors/ocaml-uecc/test/jbuild index e42ac6e85..f60ace3ea 100644 --- a/vendors/ocaml-uecc/test/jbuild +++ b/vendors/ocaml-uecc/test/jbuild @@ -2,14 +2,27 @@ (executable ((name test) + (modules (Test)) (public_name test-uecc) (libraries (alcotest uecc)))) +(executable + ((name test_vectors) + (modules (Vectors Test_vectors)) + (public_name test-uecc-vectors) + (libraries (cstruct hex alcotest uecc)))) + (alias ((name runtest-uecc) (deps (test.exe)) (action (run ${<})))) +(alias + ((name runtest-uecc-vectors) + (deps (test_vectors.exe)) + (action (run ${<})))) + (alias ((name runtest) - (deps ((alias runtest-uecc))))) + (deps ((alias runtest-uecc) + (alias runtest-uecc-vectors))))) diff --git a/vendors/ocaml-uecc/test/test_vectors.c b/vendors/ocaml-uecc/test/test_vectors.c new file mode 100644 index 000000000..3eca7169b --- /dev/null +++ b/vendors/ocaml-uecc/test/test_vectors.c @@ -0,0 +1,151 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 + 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 diff --git a/vendors/ocaml-uecc/test/vectors.ml b/vendors/ocaml-uecc/test/vectors.ml new file mode 100644 index 000000000..d60cf2d6e --- /dev/null +++ b/vendors/ocaml-uecc/test/vectors.ml @@ -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"; + ]; +]