diff --git a/src/sig_stfl/lms/sig_stfl_lms.c b/src/sig_stfl/lms/sig_stfl_lms.c index 5d9c8281b2..96fdd4e14f 100644 --- a/src/sig_stfl/lms/sig_stfl_lms.c +++ b/src/sig_stfl/lms/sig_stfl_lms.c @@ -1921,6 +1921,88 @@ OQS_SIG_STFL_SECRET_KEY *OQS_SECRET_KEY_LMS_SHA256_H10_W2_H10_W2_new(void) { return sk; } +// ======================== LMS-SHA256 H10/W4, H5/W8 ======================== // + +OQS_API OQS_STATUS OQS_SIG_STFL_alg_lms_sha256_h10_w4_h5_w8_keypair(uint8_t *public_key, OQS_SIG_STFL_SECRET_KEY *secret_key) { + if (secret_key == NULL || public_key == NULL) { + return OQS_ERROR; + } + + if (oqs_sig_stfl_lms_keypair(public_key, secret_key, (const uint32_t)OQS_LMS_ID_sha256_n32_h10_w4_h5_w8) != 0) { + return OQS_ERROR; + } + return OQS_SUCCESS; +} + +OQS_SIG_STFL *OQS_SIG_STFL_alg_lms_sha256_h10_w4_h5_w8_new(void) { + + OQS_SIG_STFL *sig = (OQS_SIG_STFL *)malloc(sizeof(OQS_SIG_STFL)); + if (sig == NULL) { + return NULL; + } + memset(sig, 0, sizeof(OQS_SIG_STFL)); + + sig->oid = OQS_LMS_ID_sha256_n32_h10_w4_h5_w8; + sig->method_name = OQS_SIG_STFL_alg_lms_sha256_n32_h10_w4_h5_w8; + sig->alg_version = "https://datatracker.ietf.org/doc/html/rfc8554"; + sig->euf_cma = true; + + sig->length_public_key = OQS_SIG_STFL_alg_lms_length_public_key; + sig->length_signature = OQS_SIG_STFL_alg_lms_sha256_h10_w4_h5_w8_length_signature; + sig->length_secret_key = OQS_SIG_STFL_alg_lms_length_private_key; + + sig->keypair = OQS_SIG_STFL_alg_lms_sha256_h10_w4_h5_w8_keypair; + sig->sign = OQS_SIG_STFL_alg_lms_sign; + sig->verify = OQS_SIG_STFL_alg_lms_verify; + + sig->sigs_remaining = OQS_SIG_STFL_lms_sigs_left; + sig->sigs_total = OQS_SIG_STFL_lms_sigs_total; + + return sig; +} + +OQS_SIG_STFL_SECRET_KEY *OQS_SECRET_KEY_LMS_SHA256_H10_W4_H5_W8_new(void) { + + // Initialize the secret key in the heap with adequate memory + OQS_SIG_STFL_SECRET_KEY *sk = malloc(sizeof(OQS_SIG_STFL_SECRET_KEY)); + if (sk == NULL) { + return NULL; + } + memset(sk, 0, sizeof(OQS_SIG_STFL_SECRET_KEY)); + + // Initialize the key with length_secret_key amount of bytes. + sk->length_secret_key = OQS_SIG_STFL_alg_lms_length_private_key; + + /* + * Secret Key retrieval Function + */ + sk->serialize_key = OQS_SECRET_KEY_LMS_serialize_key; + + /* + * set Secret Key to internal structure Function + */ + sk->deserialize_key = OQS_SECRET_KEY_LMS_deserialize_key; + + /* + * Set Secret Key Locking Function + */ + sk->lock_key = NULL; + + /* + * Set Secret Key Saving Function + */ + sk->secure_store_scrt_key = NULL; + + /* + * Set Secret Key free function + */ + sk->free_key = OQS_SECRET_KEY_LMS_free; + + sk->set_scrt_key_store_cb = OQS_SECRET_KEY_LMS_set_store_cb; + + return sk; +} + // ======================== LMS-SHA256 H10/W4, H10/W4 ======================== // OQS_API OQS_STATUS OQS_SIG_STFL_alg_lms_sha256_h10_w4_h10_w4_keypair(uint8_t *public_key, OQS_SIG_STFL_SECRET_KEY *secret_key) { diff --git a/src/sig_stfl/lms/sig_stfl_lms.h b/src/sig_stfl/lms/sig_stfl_lms.h index ee1a379e40..fab424270e 100644 --- a/src/sig_stfl/lms/sig_stfl_lms.h +++ b/src/sig_stfl/lms/sig_stfl_lms.h @@ -27,7 +27,20 @@ * e.g. * OQS_LMS_ID_sha256_n32_h5_w1 -- "5/1" ----- 0x0151 * "5/1,5/2" ----- 0x025152 - 0x0LHS0H0W + * Number of levels L {1, 2, 3, ..., 8} + * 0x0LH(l1))W(l1)H(l2)W(l2) + * e.g + * For OQS_LMS_ID_sha256_n32_h5_w1 the oid is 0x0151 + * Number of levels is.....0x01 + * H5 ID is.........5 + * W1 ID is..........1 + * +* For OQS_LMS_ID_sha256_n32_h10_w4_h5_w8 the is 0x026354 + * Number of levels is.......0x02 + * Level 1 H10 ID is...........6 + * Level 1 W4 ID is............3 + * Level 2 H5 ID is.............5 + * Level 2 W8 ID is..............4 */ #define OQS_LMS_ID_sha256_n32_h5_w1 0x0151 //"5/1" #define OQS_LMS_ID_sha256_n32_h5_w2 0x0152 //"5/2" @@ -55,8 +68,13 @@ #define OQS_LMS_ID_sha256_n32_h25_w8 0x0194 //"25/8" //2-Level LMS + +//RFC 8554 example #define OQS_LMS_ID_sha256_n32_h5_w8_h5_w8 0x025454 //"5/8,5/8" +//RFC 8554 example +#define OQS_LMS_ID_sha256_n32_h10_w4_h5_w8 0x026354 //"10/4,5/8" + //Wolf #define OQS_LMS_ID_sha256_n32_h10_w2_h10_w2 0x026262 //"10/2,10/2" #define OQS_LMS_ID_sha256_n32_h10_w4_h10_w4 0x026363 //"10/4,10/4" @@ -246,6 +264,8 @@ void OQS_SECRET_KEY_LMS_free(OQS_SIG_STFL_SECRET_KEY *sk); #define OQS_SIG_STFL_alg_lms_sha256_h10_w8_h5_w8_length_signature 2804 +#define OQS_SIG_STFL_alg_lms_sha256_h10_w4_h5_w8_length_signature 3860 + #define OQS_SIG_STFL_alg_lms_sha256_h10_w2_h10_w2_length_signature 9300 #define OQS_SIG_STFL_alg_lms_sha256_h10_w4_h10_w4_length_signature 5076 #define OQS_SIG_STFL_alg_lms_sha256_h10_w8_h10_w8_length_signature 2964 @@ -263,6 +283,10 @@ OQS_API OQS_STATUS OQS_SIG_STFL_alg_lms_sha256_h5_w8_h5_w8_keypair(uint8_t *publ OQS_SIG_STFL_SECRET_KEY *OQS_SECRET_KEY_LMS_SHA256_H5_W8_H5_W8_new(void); OQS_SIG_STFL *OQS_SIG_STFL_alg_lms_sha256_h5_w8_h5_w8_new(void); +OQS_API OQS_STATUS OQS_SIG_STFL_alg_lms_sha256_h10_w4_h5_w8_keypair(uint8_t *public_key, OQS_SIG_STFL_SECRET_KEY *secret_key); +OQS_SIG_STFL_SECRET_KEY *OQS_SECRET_KEY_LMS_SHA256_H10_W4_H5_W8_new(void); +OQS_SIG_STFL *OQS_SIG_STFL_alg_lms_sha256_h10_w4_h5_w8_new(void); + OQS_API OQS_STATUS OQS_SIG_STFL_alg_lms_sha256_h10_w8_h5_w8_keypair(uint8_t *public_key, OQS_SIG_STFL_SECRET_KEY *secret_key); OQS_SIG_STFL_SECRET_KEY *OQS_SECRET_KEY_LMS_SHA256_H10_W8_H5_W8_new(void); OQS_SIG_STFL *OQS_SIG_STFL_alg_lms_sha256_h10_w8_h5_w8_new(void); diff --git a/src/sig_stfl/lms/sig_stfl_lms_functions.c b/src/sig_stfl/lms/sig_stfl_lms_functions.c index 88c48c532f..35f896c54b 100644 --- a/src/sig_stfl/lms/sig_stfl_lms_functions.c +++ b/src/sig_stfl/lms/sig_stfl_lms_functions.c @@ -381,6 +381,13 @@ int oqs_sig_stfl_lms_keypair(uint8_t *pk, OQS_SIG_STFL_SECRET_KEY *sk, const uin oqs_key_data->lm_type[1] = LMS_SHA256_N32_H10; oqs_key_data->lm_ots_type[1] = LMOTS_SHA256_N32_W2; break; + case OQS_LMS_ID_sha256_n32_h10_w4_h5_w8: + oqs_key_data->levels = 2; + oqs_key_data->lm_type[0] = LMS_SHA256_N32_H10; + oqs_key_data->lm_ots_type[0] = LMOTS_SHA256_N32_W4; + oqs_key_data->lm_type[1] = LMS_SHA256_N32_H5; + oqs_key_data->lm_ots_type[1] = LMOTS_SHA256_N32_W8; + break; case OQS_LMS_ID_sha256_n32_h10_w4_h10_w4: oqs_key_data->levels = 2; oqs_key_data->lm_type[0] = LMS_SHA256_N32_H10; diff --git a/src/sig_stfl/sig_stfl.c b/src/sig_stfl/sig_stfl.c index 6d6fe86c79..da23d72db9 100644 --- a/src/sig_stfl/sig_stfl.c +++ b/src/sig_stfl/sig_stfl.c @@ -71,6 +71,7 @@ OQS_API const char *OQS_SIG_STFL_alg_identifier(size_t i) { //2-Level LMS OQS_SIG_STFL_alg_lms_sha256_n32_h5_w8_h5_w8, + OQS_SIG_STFL_alg_lms_sha256_n32_h10_w4_h5_w8, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w8_h5_w8, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w2_h10_w2, @@ -323,6 +324,8 @@ OQS_API int OQS_SIG_STFL_alg_is_enabled(const char *method_name) { //2-Level LMS else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h5_w8_h5_w8)) { return 1; + } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w4_h5_w8)) { + return 1; } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w8_h5_w8)) { return 1; } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w2_h10_w2)) { @@ -571,6 +574,8 @@ OQS_API OQS_SIG_STFL *OQS_SIG_STFL_new(const char *method_name) { //2-Level LMS else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h5_w8_h5_w8)) { return OQS_SIG_STFL_alg_lms_sha256_h5_w8_h5_w8_new(); + } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w4_h5_w8)) { + return OQS_SIG_STFL_alg_lms_sha256_h10_w4_h5_w8_new(); } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w8_h5_w8)) { return OQS_SIG_STFL_alg_lms_sha256_h10_w8_h5_w8_new(); } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w2_h10_w2)) { @@ -869,10 +874,12 @@ OQS_API OQS_SIG_STFL_SECRET_KEY *OQS_SIG_STFL_SECRET_KEY_new(const char *method_ return OQS_SECRET_KEY_LMS_SHA256_H5_W8_H5_W8_new(); } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w8_h5_w8)) { return OQS_SECRET_KEY_LMS_SHA256_H10_W8_H5_W8_new(); - } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w2_h10_w2)) { + } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w2_h10_w2)) { return OQS_SECRET_KEY_LMS_SHA256_H10_W2_H10_W2_new(); - } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w4_h10_w4)) { + } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w4_h10_w4)) { return OQS_SECRET_KEY_LMS_SHA256_H10_W4_H10_W4_new(); + } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w4_h5_w8)) { + return OQS_SECRET_KEY_LMS_SHA256_H10_W4_H5_W8_new(); } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h10_w8_h10_w8)) { return OQS_SECRET_KEY_LMS_SHA256_H10_W8_H10_W8_new(); } else if (0 == strcasecmp(method_name, OQS_SIG_STFL_alg_lms_sha256_n32_h15_w8_h5_w8)) { diff --git a/src/sig_stfl/sig_stfl.h b/src/sig_stfl/sig_stfl.h index 48b017fe8e..42baaab8b0 100644 --- a/src/sig_stfl/sig_stfl.h +++ b/src/sig_stfl/sig_stfl.h @@ -101,6 +101,9 @@ extern "C" { //2-Level LMS #define OQS_SIG_STFL_alg_lms_sha256_n32_h5_w8_h5_w8 "LMS_SHA256_H5_W8_H5_W8" //"5/8, 5/8" +//RFC 6554 +#define OQS_SIG_STFL_alg_lms_sha256_n32_h10_w4_h5_w8 "LMS_SHA256_H10_W4_H5_W8" //"10/4, 5/8" + #define OQS_SIG_STFL_alg_lms_sha256_n32_h10_w8_h5_w8 "LMS_SHA256_H10_W8_H5_W8" //"10/8, 5/8" #define OQS_SIG_STFL_alg_lms_sha256_n32_h10_w2_h10_w2 "LMS_SHA256_H10_W2_H10_W2" //"10/2, 10/2" #define OQS_SIG_STFL_alg_lms_sha256_n32_h10_w4_h10_w4 "LMS_SHA256_H10_W4_H10_W4" //"10/4, 10/4" @@ -115,7 +118,7 @@ extern "C" { #define OQS_SIG_STFL_alg_lms_sha256_n32_h20_w8_h15_w8 "LMS_SHA256_H20_W8_H15_W8" //"20/8, 15/8" #define OQS_SIG_STFL_alg_lms_sha256_n32_h20_w8_h20_w8 "LMS_SHA256_H20_W8_H20_W8" //"20/8, 20/8" -#define OQS_SIG_STFL_algs_length 60 +#define OQS_SIG_STFL_algs_length 61 /* Defined LM parameter identifiers */ /* Algorithm identifier for LMS-SHA256_N32_H5 */ diff --git a/tests/KATs/sig_stfl/lms/LMS_SHA256_H10_W4_H5_W8_verify.req b/tests/KATs/sig_stfl/lms/LMS_SHA256_H10_W4_H5_W8_verify.req new file mode 100644 index 0000000000..a2f2cef21f --- /dev/null +++ b/tests/KATs/sig_stfl/lms/LMS_SHA256_H10_W4_H5_W8_verify.req @@ -0,0 +1,15 @@ +# LMS_SHA256_H10_W4_H5_W8 + +mlen = 131 +pk = 000000020000000600000003d08fabd4a2091ff0a8cb4ed834e7453432a58885cd9ba0431235466bff9651c6c92124404d45fa53cf161c28f1ad5a8e +msg = 54686520656e756d65726174696f6e20696e2074686520436f6e737469747574696f6e2c206f66206365727461696e207269676874732c207368616c6c206e6f7420626520636f6e73747275656420746f2064656e79206f7220646973706172616765206f74686572732072657461696e6564206279207468652070656f706c652e0a +sm = 0000000100000003000000033d46bee8660f8f215d3f96408a7a64cf1c4da02b63a55f62c666ef5707a914ce0674e8cb7a55f0c48d484f31f3aa4af9719a74f22cf823b94431d01c926e2a76bb71226d279700ec81c9e95fb11a0d10d065279a5796e265ae17737c44eb8c594508e126a9a7870bf4360820bdeb9a01d9693779e416828e75bddd7d8c70d50a0ac8ba39810909d445f44cb5bb58de737e60cb4345302786ef2c6b14af212ca19edeaa3bfcfe8baa6621ce88480df2371dd37add732c9de4ea2ce0dffa53c92649a18d39a50788f4652987f226a1d48168205df6ae7c58e049a25d4907edc1aa90da8aa5e5f7671773e941d8055360215c6b60dd35463cf2240a9c06d694e9cb54e7b1e1bf494d0d1a28c0d31acc75161f4f485dfd3cb9578e836ec2dc722f37ed30872e07f2b8bd0374eb57d22c614e09150f6c0d8774a39a6e168211035dc52988ab46eaca9ec597fb18b4936e66ef2f0df26e8d1e34da28cbb3af752313720c7b345434f72d65314328bbb030d0f0f6d5e47b28ea91008fb11b05017705a8be3b2adb83c60a54f9d1d1b2f476f9e393eb5695203d2ba6ad815e6a111ea293dcc21033f9453d49c8e5a6387f588b1ea4f706217c151e05f55a6eb7997be09d56a326a32f9cba1fbe1c07bb49fa04cecf9df1a1b815483c75d7a27cc88ad1b1238e5ea986b53e087045723ce16187eda22e33b2c70709e53251025abde8939645fc8c0693e97763928f00b2e3c75af3942d8ddaee81b59a6f1f67efda0ef81d11873b59137f67800b35e81b01563d187c4a1575a1acb92d087b517a8833383f05d357ef4678de0c57ff9f1b2da61dfde5d88318bcdde4d9061cc75c2de3cd4740dd7739ca3ef66f1930026f47d9ebaa713b07176f76f953e1c2e7f8f271a6ca375dbfb83d719b1635a7d8a13891957944b1c29bb101913e166e11bd5f34186fa6c0a555c9026b256a6860f4866bd6d0b5bf90627086c6149133f8282ce6c9b3622442443d5eca959d6c14ca8389d12c4068b503e4e3c39b635bea245d9d05a2558f249c9661c0427d2e489ca5b5dde220a90333f4862aec793223c781997da98266c12c50ea28b2c438e7a379eb106eca0c7fd6006e9bf612f3ea0a454ba3bdb76e8027992e60de01e9094fddeb3349883914fb17a9621ab929d970d101e45f8278c14b032bcab02bd15692d21b6c5c204abbf077d465553bd6eda645e6c3065d33b10d518a61e15ed0f092c32226281a29c8a0f50cde0a8c66236e29c2f310a375cebda1dc6bb9a1a01dae6c7aba8ebedc6371a7d52aacb955f83bd6e4f84d2949dcc198fb77c7e5cdf6040b0f84faf82808bf985577f0a2acf2ec7ed7c0b0ae8a270e951743ff23e0b2dd12e9c3c828fb5598a22461af94d568f29240ba2820c4591f71c088f96e095dd98beae456579ebbba36f6d9ca2613d1c26eee4d8c73217ac5962b5f3147b492e8831597fd89b64aa7fde82e1974d2f6779504dc21435eb3109350756b9fdabe1c6f368081bd40b27ebcb9819a75d7df8bb07bb05db1bab705a4b7e37125186339464ad8faaa4f052cc1272919fde3e025bb64aa8e0eb1fcbfcc25acb5f718ce4f7c2182fb393a1814b0e942490e52d3bca817b2b26e90d4c9b0cc38608a6cef5eb153af0858acc867c9922aed43bb67d7b33acc519313d28d41a5c6fe6cf3595dd5ee63f0a4c4065a083590b275788bee7ad875a7f88dd73720708c6c6c0ecf1f43bbaadae6f208557fdc07bd4ed91f88ce4c0de842761c70c186bfdafafc444834bd3418be4253a71eaf41d718753ad07754ca3effd5960b0336981795721426803599ed5b2b7516920efcbe32ada4bcf6c73bd29e3fa152d9adeca36020fdeeee1b739521d3ea8c0da497003df1513897b0f54794a873670b8d93bcca2ae47e64424b7423e1f078d9554bb5232cc6de8aae9b83fa5b9510beb39ccf4b4e1d9c0f19d5e17f58e5b8705d9a6837a7d9bf99cd13387af256a8491671f1f2f22af253bcff54b673199bdb7d05d81064ef05f80f0153d0be7919684b23da8d42ff3effdb7ca0985033f389181f47659138003d712b5ec0a614d31cc7487f52de8664916af79c98456b2c94a8038083db55391e3475862250274a1de2584fec975fb09536792cfbfcf6192856cc76eb5b13dc4709e2f7301ddff26ec1b23de2d188c999166c74e1e14bbc15f457cf4e471ae13dcbdd9c50f4d646fc6278e8fe7eb6cb5c94100fa870187380b777ed19d7868fd8ca7ceb7fa7d5cc861c5bdac98e7495eb0a2ceec1924ae979f44c5390ebedddc65d6ec11287d978b8df064219bc5679f7d7b264a76ff272b2ac9f2f7cfc9fdcfb6a51428240027afd9d52a79b647c90c2709e060ed70f87299dd798d68f4fadd3da6c51d839f851f98f67840b964ebe73f8cec41572538ec6bc131034ca2894eb736b3bda93d9f5f6fa6f6c0f03ce43362b8414940355fb54d3dfdd03633ae108f3de3ebc85a3ff51efeea3bc2cf27e1658f1789ee612c83d0f5fd56f7cd071930e2946beeecaa04dccea9f97786001475e0294bc2852f62eb5d39bb9fbeef75916efe44a662ecae37ede27e9d6eadfdeb8f8b2b2dbccbf96fa6dbaf7321fb0e701f4d429c2f4dcd153a2742574126e5eaccc77686acf6e3ee48f423766e0fc466810a905ff5453ec99897b56bc55dd49b991142f65043f2d744eeb935ba7f4ef23cf80cc5a8a335d3619d781e7454826df720eec82e06034c44699b5f0c44a8787752e057fa3419b5bb0e25d30981e41cb1361322dba8f69931cf42fad3f3bce6ded5b8bfc3d20a2148861b2afc14562ddd27f12897abf0685288dcc5c4982f826026846a24bf77e383c7aacab1ab692b29ed8c018a65f3dc2b87ff619a633c41b4fadb1c78725c1f8f922f6009787b1964247df0136b1bc614ab575c59a16d089917bd4a8b6f04d95c581279a139be09fcf6e98a470a0bceca191fce476f9370021cbc05518a7efd35d89d8577c990a5e19961ba16203c959c91829ba7497cffcbb4b294546454fa5388a23a22e805a5ca35f956598848bda678615fec28afd5da61a00000006b326493313053ced3876db9d237148181b7173bc7d042cefb4dbe94d2e58cd21a769db4657a103279ba8ef3a629ca84ee836172a9c50e51f45581741cf8083150b491cb4ecbbabec128e7c81a46e62a67b57640a0a78be1cbf7dd9d419a10cd8686d16621a80816bfdb5bdc56211d72ca70b81f1117d129529a7570cf79cf52a7028a48538ecdd3b38d3d5d62d26246595c4fb73a525a5ed2c30524ebb1d8cc82e0c19bc4977c6898ff95fd3d310b0bae71696cef93c6a552456bf96e9d075e383bb7543c675842bafbfc7cdb88483b3276c29d4f0a341c2d406e40d4653b7e4d045851acf6a0a0ea9c710b805cced4635ee8c107362f0fc8d80c14d0ac49c516703d26d14752f34c1c0d2c4247581c18c2cf4de48e9ce949be7c888e9caebe4a415e291fd107d21dc1f084b1158208249f28f4f7c7e931ba7b3bd0d824a45700000000500000004215f83b7ccb9acbcd08db97b0d04dc2ba1cd035833e0e90059603f26e07ad2aad152338e7a5e5984bcd5f7bb4eba40b700000004000000040eb1ed54a2460d512388cad533138d240534e97b1e82d33bd927d201dfc24ebb11b3649023696f85150b189e50c00e98850ac343a77b3638319c347d7310269d3b7714fa406b8c35b021d54d4fdada7b9ce5d4ba5b06719e72aaf58c5aae7aca057aa0e2e74e7dcfd17a0823429db62965b7d563c57b4cec942cc865e29c1dad83cac8b4d61aacc457f336e6a10b66323f5887bf3523dfcadee158503bfaa89dc6bf59daa82afd2b5ebb2a9ca6572a6067cee7c327e9039b3b6ea6a1edc7fdc3df927aade10c1c9f2d5ff446450d2a3998d0f9f6202b5e07c3f97d2458c69d3c8190643978d7a7f4d64e97e3f1c4a08a7c5bc03fd55682c017e2907eab07e5bb2f190143475a6043d5e6d5263471f4eecf6e2575fbc6ff37edfa249d6cda1a09f797fd5a3cd53a066700f45863f04b6c8a58cfd341241e002d0d2c0217472bf18b636ae547c1771368d9f317835c9b0ef430b3df4034f6af00d0da44f4af7800bc7a5cf8a5abdb12dc718b559b74cab9090e33cc58a955300981c420c4da8ffd67df540890a062fe40dba8b2c1c548ced22473219c534911d48ccaabfb71bc71862f4a24ebd376d288fd4e6fb06ed8705787c5fedc813cd2697e5b1aac1ced45767b14ce88409eaebb601a93559aae893e143d1c395bc326da821d79a9ed41dcfbe549147f71c092f4f3ac522b5cc57290706650487bae9bb5671ecc9ccc2ce51ead87ac01985268521222fb9057df7ed41810b5ef0d4f7cc67368c90f573b1ac2ce956c365ed38e893ce7b2fae15d3685a3df2fa3d4cc098fa57dd60d2c9754a8ade980ad0f93f6787075c3f680a2ba1936a8c61d1af52ab7e21f416be09d2a8d64c3d3d8582968c2839902229f85aee297e717c094c8df4a23bb5db658dd377bf0f4ff3ffd8fba5e383a48574802ed545bbe7a6b4753533353d73706067640135a7ce517279cd683039747d218647c86e097b0daa2872d54b8f3e5085987629547b830d8118161b65079fe7bc59a99e9c3c7380e3e70b7138fe5d9be2551502b698d09ae193972f27d40f38dea264a0126e637d74ae4c92a6249fa103436d3eb0d4029ac712bfc7a5eacbdd7518d6d4fe903a5ae65527cd65bb0d4e9925ca24fd7214dc617c150544e423f450c99ce51ac8005d33acd74f1bed3b17b7266a4a3bb86da7eba80b101e15cb79de9a207852cf91249ef480619ff2af8cabca83125d1faa94cbb0a03a906f683b3f47a97c871fd513e510a7a25f283b196075778496152a91c2bf9da76ebe089f4654877f2d586ae7149c406e663eadeb2b5c7e82429b9e8cb4834c83464f079995332e4b3c8f5a72bb4b8c6f74b0d45dc6c1f79952c0b7420df525e37c15377b5f0984319c3993921e5ccd97e097592064530d33de3afad5733cbe7703c5296263f77342efbf5a04755b0b3c997c4328463e84caa2de3ffdcd297baaaacd7ae646e44b5c0f16044df38fabd296a47b3a838a913982fb2e370c078edb042c84db34ce36b46ccb76460a690cc86c302457dd1cde197ec8075e82b393d542075134e2a17ee70a5e187075d03ae3c853cff60729ba4000000054de1f6965bdabc676c5a4dc7c35f97f82cb0e31c68d04f1dad96314ff09e6b3de96aeee300d1f68bf1bca9fc58e4032336cd819aaf578744e50d1357a0e4286704d341aa0a337b19fe4bc43c2e79964d4f351089f2e0e41c7c43ae0d49e7f404b0f75be80ea3af098c9752420a8ac0ea2bbb1f4eeba05238aef0d8ce63f0c6e5e4041d95398a6f7f3e0ee97cc1591849d4ed236338b147abde9f51ef9fd4e1c1 + +sk = + +count = +seed = + +smlen = 3860 +expected = 1 + diff --git a/tests/KATs/sig_stfl/lms/LMS_SHA256_H5_W8_H5_W8_verify.req b/tests/KATs/sig_stfl/lms/LMS_SHA256_H5_W8_H5_W8_verify.req new file mode 100644 index 0000000000..578822b263 --- /dev/null +++ b/tests/KATs/sig_stfl/lms/LMS_SHA256_H5_W8_H5_W8_verify.req @@ -0,0 +1,19 @@ +# LMS_SHA256_M32_H5_W8_H5_W8 Verify + +mlen = 162 + +msg = 54686520706f77657273206e6f742064656c65676174656420746f2074686520556e69746564205374617465732062792074686520436f6e737469747574696f6e2c206e6f722070726f6869626974656420627920697420746f20746865205374617465732c2061726520726573657276656420746f207468652053746174657320726573706563746976656c792c206f7220746f207468652070656f706c652e0a + +sm = 000000010000000500000004d32b56671d7eb98833c49b433c272586bc4a1c8a8970528ffa04b966f9426eb9965a25bfd37f196b9073f3d4a232feb69128ec45146f86292f9dff9610a7bf95a64c7f60f6261a62043f86c70324b7707f5b4a8a6e19c114c7be866d488778a0e05fd5c6509a6e61d559cf1a77a970de927d60c70d3de31a7fa0100994e162a2582e8ff1b10cd99d4e8e413ef469559f7d7ed12c838342f9b9c96b83a4943d1681d84b15357ff48ca579f19f5e71f18466f2bbef4bf660c2518eb20de2f66e3b14784269d7d876f5d35d3fbfc7039a462c716bb9f6891a7f41ad133e9e1f6d9560b960e7777c52f060492f2d7c660e1471e07e72655562035abc9a701b473ecbc3943c6b9c4f2405a3cb8bf8a691ca51d3f6ad2f428bab6f3a30f55dd9625563f0a75ee390e385e3ae0b906961ecf41ae073a0590c2eb6204f44831c26dd768c35b167b28ce8dc988a3748255230cef99ebf14e730632f27414489808afab1d1e783ed04516de012498682212b07810579b250365941bcc98142da13609e9768aaf65de7620dabec29eb82a17fde35af15ad238c73f81bdb8dec2fc0e7f932701099762b37f43c4a3c20010a3d72e2f606be108d310e639f09ce7286800d9ef8a1a40281cc5a7ea98d2adc7c7400c2fe5a101552df4e3cccfd0cbf2ddf5dc6779cbbc68fee0c3efe4ec22b83a2caa3e48e0809a0a750b73ccdcf3c79e6580c154f8a58f7f24335eec5c5eb5e0cf01dcf4439424095fceb077f66ded5bec73b27c5b9f64a2a9af2f07c05e99e5cf80f00252e39db32f6c19674f190c9fbc506d826857713afd2ca6bb85cd8c107347552f30575a5417816ab4db3f603f2df56fbc413e7d0acd8bdd81352b2471fc1bc4f1ef296fea1220403466b1afe78b94f7ecf7cc62fb92be14f18c2192384ebceaf8801afdf947f698ce9c6ceb696ed70e9e87b0144417e8d7baf25eb5f70f09f016fc925b4db048ab8d8cb2a661ce3b57ada67571f5dd546fc22cb1f97e0ebd1a65926b1234fd04f171cf469c76b884cf3115cce6f792cc84e36da58960c5f1d760f32c12faef477e94c92eb75625b6a371efc72d60ca5e908b3a7dd69fef0249150e3eebdfed39cbdc3ce9704882a2072c75e13527b7a581a556168783dc1e97545e31865ddc46b3c957835da252bb7328d3ee2062445dfb85ef8c35f8e1f3371af34023cef626e0af1e0bc017351aae2ab8f5c612ead0b729a1d059d02bfe18efa971b7300e882360a93b025ff97e9e0eec0f3f3f13039a17f88b0cf808f488431606cb13f9241f40f44e537d302c64a4f1f4ab949b9feefadcb71ab50ef27d6d6ca8510f150c85fb525bf25703df7209b6066f09c37280d59128d2f0f637c7d7d7fad4ed1c1ea04e628d221e3d8db77b7c878c9411cafc5071a34a00f4cf07738912753dfce48f07576f0d4f94f42c6d76f7ce973e9367095ba7e9a3649b7f461d9f9ac1332a4d1044c96aefee67676401b64457c54d65fef6500c59cdfb69af7b6dddfcb0f086278dd8ad0686078dfb0f3f79cd893d314168648499898fbc0ced5f95b74e8ff14d735cdea968bee7400000005d8b8112f9200a5e50c4a262165bd342cd800b8496810bc716277435ac376728d129ac6eda839a6f357b5a04387c5ce97382a78f2a4372917eefcbf93f63bb59112f5dbe400bd49e4501e859f885bf0736e90a509b30a26bfac8c17b5991c157eb5971115aa39efd8d564a6b90282c3168af2d30ef89d51bf14654510a12b8a144cca1848cf7da59cc2b3d9d0692dd2a20ba3863480e25b1b85ee860c62bf51360000000500000004d2f14ff6346af964569f7d6cb880a1b66c5004917da6eafe4d9ef6c6407b3db0e5485b122d9ebe15cda93cfec582d7ab0000000a000000040703c491e7558b35011ece3592eaa5da4d918786771233e8353bc4f62323185c95cae05b899e35dffd717054706209988ebfdf6e37960bb5c38d7657e8bffeef9bc042da4b4525650485c66d0ce19b317587c6ba4bffcc428e25d08931e72dfb6a120c5612344258b85efdb7db1db9e1865a73caf96557eb39ed3e3f426933ac9eeddb03a1d2374af7bf77185577456237f9de2d60113c23f846df26fa942008a698994c0827d90e86d43e0df7f4bfcdb09b86a373b98288b7094ad81a0185ac100e4f2c5fc38c003c1ab6fea479eb2f5ebe48f584d7159b8ada03586e65ad9c969f6aecbfe44cf356888a7b15a3ff074f771760b26f9c04884ee1faa329fbf4e61af23aee7fa5d4d9a5dfcf43c4c26ce8aea2ce8a2990d7ba7b57108b47dabfbeadb2b25b3cacc1ac0cef346cbb90fb044beee4fac2603a442bdf7e507243b7319c9944b1586e899d431c7f91bcccc8690dbf59b28386b2315f3d36ef2eaa3cf30b2b51f48b71b003dfb08249484201043f65f5a3ef6bbd61ddfee81aca9ce60081262a00000480dcbc9a3da6fbef5c1c0a55e48a0e729f9184fcb1407c31529db268f6fe50032a363c9801306837fafabdf957fd97eafc80dbd165e435d0e2dfd836a28b354023924b6fb7e48bc0b3ed95eea64c2d402f4d734c8dc26f3ac591825daef01eae3c38e3328d00a77dc657034f287ccb0f0e1c9a7cbdc828f627205e4737b84b58376551d44c12c3c215c812a0970789c83de51d6ad787271963327f0a5fbb6b5907dec02c9a90934af5a1c63b72c82653605d1dcce51596b3c2b45696689f2eb382007497557692caac4d57b5de9f5569bc2ad0137fd47fb47e664fcb6db4971f5b3e07aceda9ac130e9f38182de994cff192ec0e82fd6d4cb7f3fe00812589b7a7ce515440456433016b84a59bec6619a1c6c0b37dd1450ed4f2d8b584410ceda8025f5d2d8dd0d2176fc1cf2cc06fa8c82bed4d944e71339ece780fd025bd41ec34ebff9d4270a3224e019fcb444474d482fd2dbe75efb20389cc10cd600abb54c47ede93e08c114edb04117d714dc1d525e11bed8756192f929d15462b939ff3f52f2252da2ed64d8fae88818b1efa2c7b08c8794fb1b214aa233db3162833141ea4383f1a6f120be1db82ce3630b3429114463157a64e91234d475e2f79cbf05e4db6a9407d72c6bff7d1198b5c4d6aad2831db61274993715a0182c7dc8089e32c8531deed4f7431c07c02195eba2ef91efb5613c37af7ae0c066babc69369700e1dd26eddc0d216c781d56e4ce47e3303fa73007ff7b949ef23be2aa4dbf25206fe45c20dd888395b2526391a724996a44156beac808212858792bf8e74cba49dee5e8812e019da87454bff9e847ed83db07af313743082f880a278f682c2bd0ad6887cb59f652e155987d61bbf6a88d36ee93b6072e6656d9ccbaae3d655852e38deb3a2dcf8058dc9fb6f2ab3d3b3539eb77b248a661091d05eb6e2f297774fe6053598457cc61908318de4b826f0fc86d4bb117d33e865aa805009cc2918d9c2f840c4da43a703ad9f5b5806163d7161696b5a0adc00000005d5c0d1bebb06048ed6fe2ef2c6cef305b3ed633941ebc8b3bec9738754cddd60e1920ada52f43d055b5031cee6192520d6a5115514851ce7fd448d4a39fae2ab2335b525f484e9b40d6a4a969394843bdcf6d14c48e8015e08ab92662c05c6e9f90b65a7a6201689999f32bfd368e5e3ec9cb70ac7b8399003f175c40885081a09ab3034911fe125631051df0408b3946b0bde790911e8978ba07dd56c73e7ee + +pk = 00000002000000050000000461a5d57d37f5e46bfb7520806b07a1b850650e3b31fe4a773ea29a07f09cf2ea30e579f0df58ef8e298da0434cb2b878 + +sk = + +smlen = 2644 + +count = +seed = +remain = +max = +expect = 1 diff --git a/tests/kat_sig_stfl.c b/tests/kat_sig_stfl.c index 112003db59..22181183aa 100644 --- a/tests/kat_sig_stfl.c +++ b/tests/kat_sig_stfl.c @@ -69,11 +69,29 @@ int FindMarker(FILE *infile, const char *marker) { // // ALLOW TO READ HEXADECIMAL ENTRY (KEYS, DATA, TEXT, etc.) // -int ReadHex(FILE *infile, unsigned char *a, unsigned long Length, const char *str) { +size_t ReadHex(FILE *infile, unsigned char *a, unsigned long Length, const char *str) { int ch, started; unsigned long i; unsigned char ich; + /* + * Caller is just trying to get the length target data + */ + if ((Length == 0) && (a == NULL)) { + i = 0; + if (FindMarker(infile, str)) { + while ((ch = fgetc(infile)) != EOF) { + if (!isxdigit(ch)) { + if (ch == '\n') { + break; + } + } + i += 1; + } + } + return (i / 2); + } + if (Length == 0) { a[0] = 0x00; return 1; @@ -291,7 +309,102 @@ OQS_STATUS sig_stfl_kat(const char *method_name, const char *katfile) { return ret; } +/* + * LMS Test Vector + */ +static OQS_STATUS test_lms_kat(const char *method_name, const char *katfile) { + OQS_STATUS rc = OQS_ERROR; + OQS_SIG_STFL *sig = NULL; + uint8_t *public_key = NULL; + uint8_t *msg = NULL; + size_t msg_len = 0; + uint8_t *sm = NULL; + + OQS_STATUS ret = OQS_ERROR; + FILE *fp_rsp = NULL; + + if ((fp_rsp = fopen(katfile, "r")) == NULL) { + fprintf(stderr, "Couldn't open <%s> for read\n", katfile); + goto err; + } + + //Allocate a OQS stateful signature struct + sig = OQS_SIG_STFL_new(method_name); + if (sig == NULL) { + fprintf(stderr, "ERROR: Failed to create signature object for %s\n", method_name); + goto err; + } + + /* + * Get the message length + */ + msg_len = ReadHex(fp_rsp, 0, 0, "msg = "); + if (!(msg_len > 0)) { + fprintf(stderr, "ERROR: unable to read 'msg_len' from <%s>\n", katfile); + goto err; + } + + fclose(fp_rsp); + if ((fp_rsp = fopen(katfile, "r")) == NULL) { + fprintf(stderr, "Couldn't open <%s> for read\n", katfile); + goto err; + } + + public_key = malloc(sig->length_public_key); + sm = malloc(sig->length_signature); + msg = malloc((unsigned long)msg_len); + + if ((!msg || !sm || !public_key)) { + fprintf(stderr, "ERROR: unable to allocate memory.\n"); + goto err; + } + + /* + * Read signature and public key, msg and signature data from KAT file + */ + if (!ReadHex(fp_rsp, public_key, sig->length_public_key, "pk = ")) { + fprintf(stderr, "ERROR: unable to read 'pk' from <%s>\n", katfile); + goto err; + } + fclose(fp_rsp); + if ((fp_rsp = fopen(katfile, "r")) == NULL) { + fprintf(stderr, "Couldn't open <%s> for read\n", katfile); + goto err; + } + + if (!ReadHex(fp_rsp, msg, msg_len, "msg = ")) { + fprintf(stderr, "ERROR: unable to read 'msg' from <%s>\n", katfile); + goto err; + } + fclose(fp_rsp); + if ((fp_rsp = fopen(katfile, "r")) == NULL) { + fprintf(stderr, "Couldn't open <%s> for read\n", katfile); + goto err; + } + + if (!ReadHex(fp_rsp, sm, sig->length_signature, "sm = ")) { + fprintf(stderr, "ERROR: unable to read 'sm' from <%s>\n", katfile); + goto err; + } + + //Verify KAT + rc = OQS_SIG_STFL_verify(sig, msg, msg_len, sm, sig->length_signature, public_key); + if (rc != OQS_SUCCESS) { + fprintf(stderr, "ERROR: Verify test vector failed: %s\n", method_name); + } +err: + OQS_SIG_STFL_free(sig); + OQS_MEM_insecure_free(sm); + OQS_MEM_insecure_free(public_key); + OQS_MEM_insecure_free(msg); + if (fp_rsp) { + fclose(fp_rsp); + } + return rc; +} + int main(int argc, char **argv) { + OQS_STATUS rc; OQS_init(); if (argc != 3) { @@ -312,7 +425,11 @@ int main(int argc, char **argv) { char *alg_name = argv[1]; char *katfile = argv[2]; - OQS_STATUS rc = sig_stfl_kat(alg_name, katfile); + if (strncmp(alg_name, "LMS", 3) != 0) { + rc = sig_stfl_kat(alg_name, katfile); + } else { + rc = test_lms_kat(alg_name, katfile); + } if (rc != OQS_SUCCESS) { OQS_destroy(); return EXIT_FAILURE; diff --git a/tests/test_sig_stfl.c b/tests/test_sig_stfl.c index abdfeb6461..55ba104d56 100644 --- a/tests/test_sig_stfl.c +++ b/tests/test_sig_stfl.c @@ -915,947 +915,6 @@ static OQS_STATUS sig_stfl_test_secret_key_lock(const char *method_name, const c return OQS_ERROR; } -/* - * LMS Test Vector - */ -static OQS_STATUS test_testvector_1(void) { - OQS_STATUS rc = OQS_ERROR; - - /* This is test case 1 */ - static const unsigned char public_key[] = { - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x04, 0x61, 0xa5, 0xd5, 0x7d, - 0x37, 0xf5, 0xe4, 0x6b, 0xfb, 0x75, 0x20, 0x80, - 0x6b, 0x07, 0xa1, 0xb8, 0x50, 0x65, 0x0e, 0x3b, - 0x31, 0xfe, 0x4a, 0x77, 0x3e, 0xa2, 0x9a, 0x07, - 0xf0, 0x9c, 0xf2, 0xea, 0x30, 0xe5, 0x79, 0xf0, - 0xdf, 0x58, 0xef, 0x8e, 0x29, 0x8d, 0xa0, 0x43, - 0x4c, 0xb2, 0xb8, 0x78, - }; - - static const unsigned char message[] = { - 0x54, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x77, 0x65, - 0x72, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x6e, - 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x2c, 0x20, 0x6e, 0x6f, 0x72, 0x20, 0x70, - 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, 0x65, - 0x64, 0x20, 0x62, 0x79, 0x20, 0x69, 0x74, 0x20, - 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x2c, 0x20, - 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, - 0x2e, 0x0a, - }; - - static const unsigned char signature[] = { - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x04, 0xd3, 0x2b, 0x56, 0x67, - 0x1d, 0x7e, 0xb9, 0x88, 0x33, 0xc4, 0x9b, 0x43, - 0x3c, 0x27, 0x25, 0x86, 0xbc, 0x4a, 0x1c, 0x8a, - 0x89, 0x70, 0x52, 0x8f, 0xfa, 0x04, 0xb9, 0x66, - 0xf9, 0x42, 0x6e, 0xb9, 0x96, 0x5a, 0x25, 0xbf, - 0xd3, 0x7f, 0x19, 0x6b, 0x90, 0x73, 0xf3, 0xd4, - 0xa2, 0x32, 0xfe, 0xb6, 0x91, 0x28, 0xec, 0x45, - 0x14, 0x6f, 0x86, 0x29, 0x2f, 0x9d, 0xff, 0x96, - 0x10, 0xa7, 0xbf, 0x95, 0xa6, 0x4c, 0x7f, 0x60, - 0xf6, 0x26, 0x1a, 0x62, 0x04, 0x3f, 0x86, 0xc7, - 0x03, 0x24, 0xb7, 0x70, 0x7f, 0x5b, 0x4a, 0x8a, - 0x6e, 0x19, 0xc1, 0x14, 0xc7, 0xbe, 0x86, 0x6d, - 0x48, 0x87, 0x78, 0xa0, 0xe0, 0x5f, 0xd5, 0xc6, - 0x50, 0x9a, 0x6e, 0x61, 0xd5, 0x59, 0xcf, 0x1a, - 0x77, 0xa9, 0x70, 0xde, 0x92, 0x7d, 0x60, 0xc7, - 0x0d, 0x3d, 0xe3, 0x1a, 0x7f, 0xa0, 0x10, 0x09, - 0x94, 0xe1, 0x62, 0xa2, 0x58, 0x2e, 0x8f, 0xf1, - 0xb1, 0x0c, 0xd9, 0x9d, 0x4e, 0x8e, 0x41, 0x3e, - 0xf4, 0x69, 0x55, 0x9f, 0x7d, 0x7e, 0xd1, 0x2c, - 0x83, 0x83, 0x42, 0xf9, 0xb9, 0xc9, 0x6b, 0x83, - 0xa4, 0x94, 0x3d, 0x16, 0x81, 0xd8, 0x4b, 0x15, - 0x35, 0x7f, 0xf4, 0x8c, 0xa5, 0x79, 0xf1, 0x9f, - 0x5e, 0x71, 0xf1, 0x84, 0x66, 0xf2, 0xbb, 0xef, - 0x4b, 0xf6, 0x60, 0xc2, 0x51, 0x8e, 0xb2, 0x0d, - 0xe2, 0xf6, 0x6e, 0x3b, 0x14, 0x78, 0x42, 0x69, - 0xd7, 0xd8, 0x76, 0xf5, 0xd3, 0x5d, 0x3f, 0xbf, - 0xc7, 0x03, 0x9a, 0x46, 0x2c, 0x71, 0x6b, 0xb9, - 0xf6, 0x89, 0x1a, 0x7f, 0x41, 0xad, 0x13, 0x3e, - 0x9e, 0x1f, 0x6d, 0x95, 0x60, 0xb9, 0x60, 0xe7, - 0x77, 0x7c, 0x52, 0xf0, 0x60, 0x49, 0x2f, 0x2d, - 0x7c, 0x66, 0x0e, 0x14, 0x71, 0xe0, 0x7e, 0x72, - 0x65, 0x55, 0x62, 0x03, 0x5a, 0xbc, 0x9a, 0x70, - 0x1b, 0x47, 0x3e, 0xcb, 0xc3, 0x94, 0x3c, 0x6b, - 0x9c, 0x4f, 0x24, 0x05, 0xa3, 0xcb, 0x8b, 0xf8, - 0xa6, 0x91, 0xca, 0x51, 0xd3, 0xf6, 0xad, 0x2f, - 0x42, 0x8b, 0xab, 0x6f, 0x3a, 0x30, 0xf5, 0x5d, - 0xd9, 0x62, 0x55, 0x63, 0xf0, 0xa7, 0x5e, 0xe3, - 0x90, 0xe3, 0x85, 0xe3, 0xae, 0x0b, 0x90, 0x69, - 0x61, 0xec, 0xf4, 0x1a, 0xe0, 0x73, 0xa0, 0x59, - 0x0c, 0x2e, 0xb6, 0x20, 0x4f, 0x44, 0x83, 0x1c, - 0x26, 0xdd, 0x76, 0x8c, 0x35, 0xb1, 0x67, 0xb2, - 0x8c, 0xe8, 0xdc, 0x98, 0x8a, 0x37, 0x48, 0x25, - 0x52, 0x30, 0xce, 0xf9, 0x9e, 0xbf, 0x14, 0xe7, - 0x30, 0x63, 0x2f, 0x27, 0x41, 0x44, 0x89, 0x80, - 0x8a, 0xfa, 0xb1, 0xd1, 0xe7, 0x83, 0xed, 0x04, - 0x51, 0x6d, 0xe0, 0x12, 0x49, 0x86, 0x82, 0x21, - 0x2b, 0x07, 0x81, 0x05, 0x79, 0xb2, 0x50, 0x36, - 0x59, 0x41, 0xbc, 0xc9, 0x81, 0x42, 0xda, 0x13, - 0x60, 0x9e, 0x97, 0x68, 0xaa, 0xf6, 0x5d, 0xe7, - 0x62, 0x0d, 0xab, 0xec, 0x29, 0xeb, 0x82, 0xa1, - 0x7f, 0xde, 0x35, 0xaf, 0x15, 0xad, 0x23, 0x8c, - 0x73, 0xf8, 0x1b, 0xdb, 0x8d, 0xec, 0x2f, 0xc0, - 0xe7, 0xf9, 0x32, 0x70, 0x10, 0x99, 0x76, 0x2b, - 0x37, 0xf4, 0x3c, 0x4a, 0x3c, 0x20, 0x01, 0x0a, - 0x3d, 0x72, 0xe2, 0xf6, 0x06, 0xbe, 0x10, 0x8d, - 0x31, 0x0e, 0x63, 0x9f, 0x09, 0xce, 0x72, 0x86, - 0x80, 0x0d, 0x9e, 0xf8, 0xa1, 0xa4, 0x02, 0x81, - 0xcc, 0x5a, 0x7e, 0xa9, 0x8d, 0x2a, 0xdc, 0x7c, - 0x74, 0x00, 0xc2, 0xfe, 0x5a, 0x10, 0x15, 0x52, - 0xdf, 0x4e, 0x3c, 0xcc, 0xfd, 0x0c, 0xbf, 0x2d, - 0xdf, 0x5d, 0xc6, 0x77, 0x9c, 0xbb, 0xc6, 0x8f, - 0xee, 0x0c, 0x3e, 0xfe, 0x4e, 0xc2, 0x2b, 0x83, - 0xa2, 0xca, 0xa3, 0xe4, 0x8e, 0x08, 0x09, 0xa0, - 0xa7, 0x50, 0xb7, 0x3c, 0xcd, 0xcf, 0x3c, 0x79, - 0xe6, 0x58, 0x0c, 0x15, 0x4f, 0x8a, 0x58, 0xf7, - 0xf2, 0x43, 0x35, 0xee, 0xc5, 0xc5, 0xeb, 0x5e, - 0x0c, 0xf0, 0x1d, 0xcf, 0x44, 0x39, 0x42, 0x40, - 0x95, 0xfc, 0xeb, 0x07, 0x7f, 0x66, 0xde, 0xd5, - 0xbe, 0xc7, 0x3b, 0x27, 0xc5, 0xb9, 0xf6, 0x4a, - 0x2a, 0x9a, 0xf2, 0xf0, 0x7c, 0x05, 0xe9, 0x9e, - 0x5c, 0xf8, 0x0f, 0x00, 0x25, 0x2e, 0x39, 0xdb, - 0x32, 0xf6, 0xc1, 0x96, 0x74, 0xf1, 0x90, 0xc9, - 0xfb, 0xc5, 0x06, 0xd8, 0x26, 0x85, 0x77, 0x13, - 0xaf, 0xd2, 0xca, 0x6b, 0xb8, 0x5c, 0xd8, 0xc1, - 0x07, 0x34, 0x75, 0x52, 0xf3, 0x05, 0x75, 0xa5, - 0x41, 0x78, 0x16, 0xab, 0x4d, 0xb3, 0xf6, 0x03, - 0xf2, 0xdf, 0x56, 0xfb, 0xc4, 0x13, 0xe7, 0xd0, - 0xac, 0xd8, 0xbd, 0xd8, 0x13, 0x52, 0xb2, 0x47, - 0x1f, 0xc1, 0xbc, 0x4f, 0x1e, 0xf2, 0x96, 0xfe, - 0xa1, 0x22, 0x04, 0x03, 0x46, 0x6b, 0x1a, 0xfe, - 0x78, 0xb9, 0x4f, 0x7e, 0xcf, 0x7c, 0xc6, 0x2f, - 0xb9, 0x2b, 0xe1, 0x4f, 0x18, 0xc2, 0x19, 0x23, - 0x84, 0xeb, 0xce, 0xaf, 0x88, 0x01, 0xaf, 0xdf, - 0x94, 0x7f, 0x69, 0x8c, 0xe9, 0xc6, 0xce, 0xb6, - 0x96, 0xed, 0x70, 0xe9, 0xe8, 0x7b, 0x01, 0x44, - 0x41, 0x7e, 0x8d, 0x7b, 0xaf, 0x25, 0xeb, 0x5f, - 0x70, 0xf0, 0x9f, 0x01, 0x6f, 0xc9, 0x25, 0xb4, - 0xdb, 0x04, 0x8a, 0xb8, 0xd8, 0xcb, 0x2a, 0x66, - 0x1c, 0xe3, 0xb5, 0x7a, 0xda, 0x67, 0x57, 0x1f, - 0x5d, 0xd5, 0x46, 0xfc, 0x22, 0xcb, 0x1f, 0x97, - 0xe0, 0xeb, 0xd1, 0xa6, 0x59, 0x26, 0xb1, 0x23, - 0x4f, 0xd0, 0x4f, 0x17, 0x1c, 0xf4, 0x69, 0xc7, - 0x6b, 0x88, 0x4c, 0xf3, 0x11, 0x5c, 0xce, 0x6f, - 0x79, 0x2c, 0xc8, 0x4e, 0x36, 0xda, 0x58, 0x96, - 0x0c, 0x5f, 0x1d, 0x76, 0x0f, 0x32, 0xc1, 0x2f, - 0xae, 0xf4, 0x77, 0xe9, 0x4c, 0x92, 0xeb, 0x75, - 0x62, 0x5b, 0x6a, 0x37, 0x1e, 0xfc, 0x72, 0xd6, - 0x0c, 0xa5, 0xe9, 0x08, 0xb3, 0xa7, 0xdd, 0x69, - 0xfe, 0xf0, 0x24, 0x91, 0x50, 0xe3, 0xee, 0xbd, - 0xfe, 0xd3, 0x9c, 0xbd, 0xc3, 0xce, 0x97, 0x04, - 0x88, 0x2a, 0x20, 0x72, 0xc7, 0x5e, 0x13, 0x52, - 0x7b, 0x7a, 0x58, 0x1a, 0x55, 0x61, 0x68, 0x78, - 0x3d, 0xc1, 0xe9, 0x75, 0x45, 0xe3, 0x18, 0x65, - 0xdd, 0xc4, 0x6b, 0x3c, 0x95, 0x78, 0x35, 0xda, - 0x25, 0x2b, 0xb7, 0x32, 0x8d, 0x3e, 0xe2, 0x06, - 0x24, 0x45, 0xdf, 0xb8, 0x5e, 0xf8, 0xc3, 0x5f, - 0x8e, 0x1f, 0x33, 0x71, 0xaf, 0x34, 0x02, 0x3c, - 0xef, 0x62, 0x6e, 0x0a, 0xf1, 0xe0, 0xbc, 0x01, - 0x73, 0x51, 0xaa, 0xe2, 0xab, 0x8f, 0x5c, 0x61, - 0x2e, 0xad, 0x0b, 0x72, 0x9a, 0x1d, 0x05, 0x9d, - 0x02, 0xbf, 0xe1, 0x8e, 0xfa, 0x97, 0x1b, 0x73, - 0x00, 0xe8, 0x82, 0x36, 0x0a, 0x93, 0xb0, 0x25, - 0xff, 0x97, 0xe9, 0xe0, 0xee, 0xc0, 0xf3, 0xf3, - 0xf1, 0x30, 0x39, 0xa1, 0x7f, 0x88, 0xb0, 0xcf, - 0x80, 0x8f, 0x48, 0x84, 0x31, 0x60, 0x6c, 0xb1, - 0x3f, 0x92, 0x41, 0xf4, 0x0f, 0x44, 0xe5, 0x37, - 0xd3, 0x02, 0xc6, 0x4a, 0x4f, 0x1f, 0x4a, 0xb9, - 0x49, 0xb9, 0xfe, 0xef, 0xad, 0xcb, 0x71, 0xab, - 0x50, 0xef, 0x27, 0xd6, 0xd6, 0xca, 0x85, 0x10, - 0xf1, 0x50, 0xc8, 0x5f, 0xb5, 0x25, 0xbf, 0x25, - 0x70, 0x3d, 0xf7, 0x20, 0x9b, 0x60, 0x66, 0xf0, - 0x9c, 0x37, 0x28, 0x0d, 0x59, 0x12, 0x8d, 0x2f, - 0x0f, 0x63, 0x7c, 0x7d, 0x7d, 0x7f, 0xad, 0x4e, - 0xd1, 0xc1, 0xea, 0x04, 0xe6, 0x28, 0xd2, 0x21, - 0xe3, 0xd8, 0xdb, 0x77, 0xb7, 0xc8, 0x78, 0xc9, - 0x41, 0x1c, 0xaf, 0xc5, 0x07, 0x1a, 0x34, 0xa0, - 0x0f, 0x4c, 0xf0, 0x77, 0x38, 0x91, 0x27, 0x53, - 0xdf, 0xce, 0x48, 0xf0, 0x75, 0x76, 0xf0, 0xd4, - 0xf9, 0x4f, 0x42, 0xc6, 0xd7, 0x6f, 0x7c, 0xe9, - 0x73, 0xe9, 0x36, 0x70, 0x95, 0xba, 0x7e, 0x9a, - 0x36, 0x49, 0xb7, 0xf4, 0x61, 0xd9, 0xf9, 0xac, - 0x13, 0x32, 0xa4, 0xd1, 0x04, 0x4c, 0x96, 0xae, - 0xfe, 0xe6, 0x76, 0x76, 0x40, 0x1b, 0x64, 0x45, - 0x7c, 0x54, 0xd6, 0x5f, 0xef, 0x65, 0x00, 0xc5, - 0x9c, 0xdf, 0xb6, 0x9a, 0xf7, 0xb6, 0xdd, 0xdf, - 0xcb, 0x0f, 0x08, 0x62, 0x78, 0xdd, 0x8a, 0xd0, - 0x68, 0x60, 0x78, 0xdf, 0xb0, 0xf3, 0xf7, 0x9c, - 0xd8, 0x93, 0xd3, 0x14, 0x16, 0x86, 0x48, 0x49, - 0x98, 0x98, 0xfb, 0xc0, 0xce, 0xd5, 0xf9, 0x5b, - 0x74, 0xe8, 0xff, 0x14, 0xd7, 0x35, 0xcd, 0xea, - 0x96, 0x8b, 0xee, 0x74, 0x00, 0x00, 0x00, 0x05, - 0xd8, 0xb8, 0x11, 0x2f, 0x92, 0x00, 0xa5, 0xe5, - 0x0c, 0x4a, 0x26, 0x21, 0x65, 0xbd, 0x34, 0x2c, - 0xd8, 0x00, 0xb8, 0x49, 0x68, 0x10, 0xbc, 0x71, - 0x62, 0x77, 0x43, 0x5a, 0xc3, 0x76, 0x72, 0x8d, - 0x12, 0x9a, 0xc6, 0xed, 0xa8, 0x39, 0xa6, 0xf3, - 0x57, 0xb5, 0xa0, 0x43, 0x87, 0xc5, 0xce, 0x97, - 0x38, 0x2a, 0x78, 0xf2, 0xa4, 0x37, 0x29, 0x17, - 0xee, 0xfc, 0xbf, 0x93, 0xf6, 0x3b, 0xb5, 0x91, - 0x12, 0xf5, 0xdb, 0xe4, 0x00, 0xbd, 0x49, 0xe4, - 0x50, 0x1e, 0x85, 0x9f, 0x88, 0x5b, 0xf0, 0x73, - 0x6e, 0x90, 0xa5, 0x09, 0xb3, 0x0a, 0x26, 0xbf, - 0xac, 0x8c, 0x17, 0xb5, 0x99, 0x1c, 0x15, 0x7e, - 0xb5, 0x97, 0x11, 0x15, 0xaa, 0x39, 0xef, 0xd8, - 0xd5, 0x64, 0xa6, 0xb9, 0x02, 0x82, 0xc3, 0x16, - 0x8a, 0xf2, 0xd3, 0x0e, 0xf8, 0x9d, 0x51, 0xbf, - 0x14, 0x65, 0x45, 0x10, 0xa1, 0x2b, 0x8a, 0x14, - 0x4c, 0xca, 0x18, 0x48, 0xcf, 0x7d, 0xa5, 0x9c, - 0xc2, 0xb3, 0xd9, 0xd0, 0x69, 0x2d, 0xd2, 0xa2, - 0x0b, 0xa3, 0x86, 0x34, 0x80, 0xe2, 0x5b, 0x1b, - 0x85, 0xee, 0x86, 0x0c, 0x62, 0xbf, 0x51, 0x36, - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, - 0xd2, 0xf1, 0x4f, 0xf6, 0x34, 0x6a, 0xf9, 0x64, - 0x56, 0x9f, 0x7d, 0x6c, 0xb8, 0x80, 0xa1, 0xb6, - 0x6c, 0x50, 0x04, 0x91, 0x7d, 0xa6, 0xea, 0xfe, - 0x4d, 0x9e, 0xf6, 0xc6, 0x40, 0x7b, 0x3d, 0xb0, - 0xe5, 0x48, 0x5b, 0x12, 0x2d, 0x9e, 0xbe, 0x15, - 0xcd, 0xa9, 0x3c, 0xfe, 0xc5, 0x82, 0xd7, 0xab, - 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x04, - 0x07, 0x03, 0xc4, 0x91, 0xe7, 0x55, 0x8b, 0x35, - 0x01, 0x1e, 0xce, 0x35, 0x92, 0xea, 0xa5, 0xda, - 0x4d, 0x91, 0x87, 0x86, 0x77, 0x12, 0x33, 0xe8, - 0x35, 0x3b, 0xc4, 0xf6, 0x23, 0x23, 0x18, 0x5c, - 0x95, 0xca, 0xe0, 0x5b, 0x89, 0x9e, 0x35, 0xdf, - 0xfd, 0x71, 0x70, 0x54, 0x70, 0x62, 0x09, 0x98, - 0x8e, 0xbf, 0xdf, 0x6e, 0x37, 0x96, 0x0b, 0xb5, - 0xc3, 0x8d, 0x76, 0x57, 0xe8, 0xbf, 0xfe, 0xef, - 0x9b, 0xc0, 0x42, 0xda, 0x4b, 0x45, 0x25, 0x65, - 0x04, 0x85, 0xc6, 0x6d, 0x0c, 0xe1, 0x9b, 0x31, - 0x75, 0x87, 0xc6, 0xba, 0x4b, 0xff, 0xcc, 0x42, - 0x8e, 0x25, 0xd0, 0x89, 0x31, 0xe7, 0x2d, 0xfb, - 0x6a, 0x12, 0x0c, 0x56, 0x12, 0x34, 0x42, 0x58, - 0xb8, 0x5e, 0xfd, 0xb7, 0xdb, 0x1d, 0xb9, 0xe1, - 0x86, 0x5a, 0x73, 0xca, 0xf9, 0x65, 0x57, 0xeb, - 0x39, 0xed, 0x3e, 0x3f, 0x42, 0x69, 0x33, 0xac, - 0x9e, 0xed, 0xdb, 0x03, 0xa1, 0xd2, 0x37, 0x4a, - 0xf7, 0xbf, 0x77, 0x18, 0x55, 0x77, 0x45, 0x62, - 0x37, 0xf9, 0xde, 0x2d, 0x60, 0x11, 0x3c, 0x23, - 0xf8, 0x46, 0xdf, 0x26, 0xfa, 0x94, 0x20, 0x08, - 0xa6, 0x98, 0x99, 0x4c, 0x08, 0x27, 0xd9, 0x0e, - 0x86, 0xd4, 0x3e, 0x0d, 0xf7, 0xf4, 0xbf, 0xcd, - 0xb0, 0x9b, 0x86, 0xa3, 0x73, 0xb9, 0x82, 0x88, - 0xb7, 0x09, 0x4a, 0xd8, 0x1a, 0x01, 0x85, 0xac, - 0x10, 0x0e, 0x4f, 0x2c, 0x5f, 0xc3, 0x8c, 0x00, - 0x3c, 0x1a, 0xb6, 0xfe, 0xa4, 0x79, 0xeb, 0x2f, - 0x5e, 0xbe, 0x48, 0xf5, 0x84, 0xd7, 0x15, 0x9b, - 0x8a, 0xda, 0x03, 0x58, 0x6e, 0x65, 0xad, 0x9c, - 0x96, 0x9f, 0x6a, 0xec, 0xbf, 0xe4, 0x4c, 0xf3, - 0x56, 0x88, 0x8a, 0x7b, 0x15, 0xa3, 0xff, 0x07, - 0x4f, 0x77, 0x17, 0x60, 0xb2, 0x6f, 0x9c, 0x04, - 0x88, 0x4e, 0xe1, 0xfa, 0xa3, 0x29, 0xfb, 0xf4, - 0xe6, 0x1a, 0xf2, 0x3a, 0xee, 0x7f, 0xa5, 0xd4, - 0xd9, 0xa5, 0xdf, 0xcf, 0x43, 0xc4, 0xc2, 0x6c, - 0xe8, 0xae, 0xa2, 0xce, 0x8a, 0x29, 0x90, 0xd7, - 0xba, 0x7b, 0x57, 0x10, 0x8b, 0x47, 0xda, 0xbf, - 0xbe, 0xad, 0xb2, 0xb2, 0x5b, 0x3c, 0xac, 0xc1, - 0xac, 0x0c, 0xef, 0x34, 0x6c, 0xbb, 0x90, 0xfb, - 0x04, 0x4b, 0xee, 0xe4, 0xfa, 0xc2, 0x60, 0x3a, - 0x44, 0x2b, 0xdf, 0x7e, 0x50, 0x72, 0x43, 0xb7, - 0x31, 0x9c, 0x99, 0x44, 0xb1, 0x58, 0x6e, 0x89, - 0x9d, 0x43, 0x1c, 0x7f, 0x91, 0xbc, 0xcc, 0xc8, - 0x69, 0x0d, 0xbf, 0x59, 0xb2, 0x83, 0x86, 0xb2, - 0x31, 0x5f, 0x3d, 0x36, 0xef, 0x2e, 0xaa, 0x3c, - 0xf3, 0x0b, 0x2b, 0x51, 0xf4, 0x8b, 0x71, 0xb0, - 0x03, 0xdf, 0xb0, 0x82, 0x49, 0x48, 0x42, 0x01, - 0x04, 0x3f, 0x65, 0xf5, 0xa3, 0xef, 0x6b, 0xbd, - 0x61, 0xdd, 0xfe, 0xe8, 0x1a, 0xca, 0x9c, 0xe6, - 0x00, 0x81, 0x26, 0x2a, 0x00, 0x00, 0x04, 0x80, - 0xdc, 0xbc, 0x9a, 0x3d, 0xa6, 0xfb, 0xef, 0x5c, - 0x1c, 0x0a, 0x55, 0xe4, 0x8a, 0x0e, 0x72, 0x9f, - 0x91, 0x84, 0xfc, 0xb1, 0x40, 0x7c, 0x31, 0x52, - 0x9d, 0xb2, 0x68, 0xf6, 0xfe, 0x50, 0x03, 0x2a, - 0x36, 0x3c, 0x98, 0x01, 0x30, 0x68, 0x37, 0xfa, - 0xfa, 0xbd, 0xf9, 0x57, 0xfd, 0x97, 0xea, 0xfc, - 0x80, 0xdb, 0xd1, 0x65, 0xe4, 0x35, 0xd0, 0xe2, - 0xdf, 0xd8, 0x36, 0xa2, 0x8b, 0x35, 0x40, 0x23, - 0x92, 0x4b, 0x6f, 0xb7, 0xe4, 0x8b, 0xc0, 0xb3, - 0xed, 0x95, 0xee, 0xa6, 0x4c, 0x2d, 0x40, 0x2f, - 0x4d, 0x73, 0x4c, 0x8d, 0xc2, 0x6f, 0x3a, 0xc5, - 0x91, 0x82, 0x5d, 0xae, 0xf0, 0x1e, 0xae, 0x3c, - 0x38, 0xe3, 0x32, 0x8d, 0x00, 0xa7, 0x7d, 0xc6, - 0x57, 0x03, 0x4f, 0x28, 0x7c, 0xcb, 0x0f, 0x0e, - 0x1c, 0x9a, 0x7c, 0xbd, 0xc8, 0x28, 0xf6, 0x27, - 0x20, 0x5e, 0x47, 0x37, 0xb8, 0x4b, 0x58, 0x37, - 0x65, 0x51, 0xd4, 0x4c, 0x12, 0xc3, 0xc2, 0x15, - 0xc8, 0x12, 0xa0, 0x97, 0x07, 0x89, 0xc8, 0x3d, - 0xe5, 0x1d, 0x6a, 0xd7, 0x87, 0x27, 0x19, 0x63, - 0x32, 0x7f, 0x0a, 0x5f, 0xbb, 0x6b, 0x59, 0x07, - 0xde, 0xc0, 0x2c, 0x9a, 0x90, 0x93, 0x4a, 0xf5, - 0xa1, 0xc6, 0x3b, 0x72, 0xc8, 0x26, 0x53, 0x60, - 0x5d, 0x1d, 0xcc, 0xe5, 0x15, 0x96, 0xb3, 0xc2, - 0xb4, 0x56, 0x96, 0x68, 0x9f, 0x2e, 0xb3, 0x82, - 0x00, 0x74, 0x97, 0x55, 0x76, 0x92, 0xca, 0xac, - 0x4d, 0x57, 0xb5, 0xde, 0x9f, 0x55, 0x69, 0xbc, - 0x2a, 0xd0, 0x13, 0x7f, 0xd4, 0x7f, 0xb4, 0x7e, - 0x66, 0x4f, 0xcb, 0x6d, 0xb4, 0x97, 0x1f, 0x5b, - 0x3e, 0x07, 0xac, 0xed, 0xa9, 0xac, 0x13, 0x0e, - 0x9f, 0x38, 0x18, 0x2d, 0xe9, 0x94, 0xcf, 0xf1, - 0x92, 0xec, 0x0e, 0x82, 0xfd, 0x6d, 0x4c, 0xb7, - 0xf3, 0xfe, 0x00, 0x81, 0x25, 0x89, 0xb7, 0xa7, - 0xce, 0x51, 0x54, 0x40, 0x45, 0x64, 0x33, 0x01, - 0x6b, 0x84, 0xa5, 0x9b, 0xec, 0x66, 0x19, 0xa1, - 0xc6, 0xc0, 0xb3, 0x7d, 0xd1, 0x45, 0x0e, 0xd4, - 0xf2, 0xd8, 0xb5, 0x84, 0x41, 0x0c, 0xed, 0xa8, - 0x02, 0x5f, 0x5d, 0x2d, 0x8d, 0xd0, 0xd2, 0x17, - 0x6f, 0xc1, 0xcf, 0x2c, 0xc0, 0x6f, 0xa8, 0xc8, - 0x2b, 0xed, 0x4d, 0x94, 0x4e, 0x71, 0x33, 0x9e, - 0xce, 0x78, 0x0f, 0xd0, 0x25, 0xbd, 0x41, 0xec, - 0x34, 0xeb, 0xff, 0x9d, 0x42, 0x70, 0xa3, 0x22, - 0x4e, 0x01, 0x9f, 0xcb, 0x44, 0x44, 0x74, 0xd4, - 0x82, 0xfd, 0x2d, 0xbe, 0x75, 0xef, 0xb2, 0x03, - 0x89, 0xcc, 0x10, 0xcd, 0x60, 0x0a, 0xbb, 0x54, - 0xc4, 0x7e, 0xde, 0x93, 0xe0, 0x8c, 0x11, 0x4e, - 0xdb, 0x04, 0x11, 0x7d, 0x71, 0x4d, 0xc1, 0xd5, - 0x25, 0xe1, 0x1b, 0xed, 0x87, 0x56, 0x19, 0x2f, - 0x92, 0x9d, 0x15, 0x46, 0x2b, 0x93, 0x9f, 0xf3, - 0xf5, 0x2f, 0x22, 0x52, 0xda, 0x2e, 0xd6, 0x4d, - 0x8f, 0xae, 0x88, 0x81, 0x8b, 0x1e, 0xfa, 0x2c, - 0x7b, 0x08, 0xc8, 0x79, 0x4f, 0xb1, 0xb2, 0x14, - 0xaa, 0x23, 0x3d, 0xb3, 0x16, 0x28, 0x33, 0x14, - 0x1e, 0xa4, 0x38, 0x3f, 0x1a, 0x6f, 0x12, 0x0b, - 0xe1, 0xdb, 0x82, 0xce, 0x36, 0x30, 0xb3, 0x42, - 0x91, 0x14, 0x46, 0x31, 0x57, 0xa6, 0x4e, 0x91, - 0x23, 0x4d, 0x47, 0x5e, 0x2f, 0x79, 0xcb, 0xf0, - 0x5e, 0x4d, 0xb6, 0xa9, 0x40, 0x7d, 0x72, 0xc6, - 0xbf, 0xf7, 0xd1, 0x19, 0x8b, 0x5c, 0x4d, 0x6a, - 0xad, 0x28, 0x31, 0xdb, 0x61, 0x27, 0x49, 0x93, - 0x71, 0x5a, 0x01, 0x82, 0xc7, 0xdc, 0x80, 0x89, - 0xe3, 0x2c, 0x85, 0x31, 0xde, 0xed, 0x4f, 0x74, - 0x31, 0xc0, 0x7c, 0x02, 0x19, 0x5e, 0xba, 0x2e, - 0xf9, 0x1e, 0xfb, 0x56, 0x13, 0xc3, 0x7a, 0xf7, - 0xae, 0x0c, 0x06, 0x6b, 0xab, 0xc6, 0x93, 0x69, - 0x70, 0x0e, 0x1d, 0xd2, 0x6e, 0xdd, 0xc0, 0xd2, - 0x16, 0xc7, 0x81, 0xd5, 0x6e, 0x4c, 0xe4, 0x7e, - 0x33, 0x03, 0xfa, 0x73, 0x00, 0x7f, 0xf7, 0xb9, - 0x49, 0xef, 0x23, 0xbe, 0x2a, 0xa4, 0xdb, 0xf2, - 0x52, 0x06, 0xfe, 0x45, 0xc2, 0x0d, 0xd8, 0x88, - 0x39, 0x5b, 0x25, 0x26, 0x39, 0x1a, 0x72, 0x49, - 0x96, 0xa4, 0x41, 0x56, 0xbe, 0xac, 0x80, 0x82, - 0x12, 0x85, 0x87, 0x92, 0xbf, 0x8e, 0x74, 0xcb, - 0xa4, 0x9d, 0xee, 0x5e, 0x88, 0x12, 0xe0, 0x19, - 0xda, 0x87, 0x45, 0x4b, 0xff, 0x9e, 0x84, 0x7e, - 0xd8, 0x3d, 0xb0, 0x7a, 0xf3, 0x13, 0x74, 0x30, - 0x82, 0xf8, 0x80, 0xa2, 0x78, 0xf6, 0x82, 0xc2, - 0xbd, 0x0a, 0xd6, 0x88, 0x7c, 0xb5, 0x9f, 0x65, - 0x2e, 0x15, 0x59, 0x87, 0xd6, 0x1b, 0xbf, 0x6a, - 0x88, 0xd3, 0x6e, 0xe9, 0x3b, 0x60, 0x72, 0xe6, - 0x65, 0x6d, 0x9c, 0xcb, 0xaa, 0xe3, 0xd6, 0x55, - 0x85, 0x2e, 0x38, 0xde, 0xb3, 0xa2, 0xdc, 0xf8, - 0x05, 0x8d, 0xc9, 0xfb, 0x6f, 0x2a, 0xb3, 0xd3, - 0xb3, 0x53, 0x9e, 0xb7, 0x7b, 0x24, 0x8a, 0x66, - 0x10, 0x91, 0xd0, 0x5e, 0xb6, 0xe2, 0xf2, 0x97, - 0x77, 0x4f, 0xe6, 0x05, 0x35, 0x98, 0x45, 0x7c, - 0xc6, 0x19, 0x08, 0x31, 0x8d, 0xe4, 0xb8, 0x26, - 0xf0, 0xfc, 0x86, 0xd4, 0xbb, 0x11, 0x7d, 0x33, - 0xe8, 0x65, 0xaa, 0x80, 0x50, 0x09, 0xcc, 0x29, - 0x18, 0xd9, 0xc2, 0xf8, 0x40, 0xc4, 0xda, 0x43, - 0xa7, 0x03, 0xad, 0x9f, 0x5b, 0x58, 0x06, 0x16, - 0x3d, 0x71, 0x61, 0x69, 0x6b, 0x5a, 0x0a, 0xdc, - 0x00, 0x00, 0x00, 0x05, 0xd5, 0xc0, 0xd1, 0xbe, - 0xbb, 0x06, 0x04, 0x8e, 0xd6, 0xfe, 0x2e, 0xf2, - 0xc6, 0xce, 0xf3, 0x05, 0xb3, 0xed, 0x63, 0x39, - 0x41, 0xeb, 0xc8, 0xb3, 0xbe, 0xc9, 0x73, 0x87, - 0x54, 0xcd, 0xdd, 0x60, 0xe1, 0x92, 0x0a, 0xda, - 0x52, 0xf4, 0x3d, 0x05, 0x5b, 0x50, 0x31, 0xce, - 0xe6, 0x19, 0x25, 0x20, 0xd6, 0xa5, 0x11, 0x55, - 0x14, 0x85, 0x1c, 0xe7, 0xfd, 0x44, 0x8d, 0x4a, - 0x39, 0xfa, 0xe2, 0xab, 0x23, 0x35, 0xb5, 0x25, - 0xf4, 0x84, 0xe9, 0xb4, 0x0d, 0x6a, 0x4a, 0x96, - 0x93, 0x94, 0x84, 0x3b, 0xdc, 0xf6, 0xd1, 0x4c, - 0x48, 0xe8, 0x01, 0x5e, 0x08, 0xab, 0x92, 0x66, - 0x2c, 0x05, 0xc6, 0xe9, 0xf9, 0x0b, 0x65, 0xa7, - 0xa6, 0x20, 0x16, 0x89, 0x99, 0x9f, 0x32, 0xbf, - 0xd3, 0x68, 0xe5, 0xe3, 0xec, 0x9c, 0xb7, 0x0a, - 0xc7, 0xb8, 0x39, 0x90, 0x03, 0xf1, 0x75, 0xc4, - 0x08, 0x85, 0x08, 0x1a, 0x09, 0xab, 0x30, 0x34, - 0x91, 0x1f, 0xe1, 0x25, 0x63, 0x10, 0x51, 0xdf, - 0x04, 0x08, 0xb3, 0x94, 0x6b, 0x0b, 0xde, 0x79, - 0x09, 0x11, 0xe8, 0x97, 0x8b, 0xa0, 0x7d, 0xd5, - 0x6c, 0x73, 0xe7, 0xee, - }; - - OQS_SIG_STFL *sig = NULL; - sig = OQS_SIG_STFL_new("LMS_SHA256_H5_W8"); - if (sig == NULL) { - fprintf(stderr, "ERROR: OQS_SIG_STFL_new failed, Test vector 1.\n"); - goto err; - } - - rc = OQS_SIG_STFL_verify(sig, message, sizeof(message), signature, sizeof (signature), public_key); - if (rc != OQS_SUCCESS) { - fprintf(stderr, "ERROR: Test Vector 1 Verify failed\n"); - } -err: - OQS_SIG_STFL_free(sig); - return rc; -} - -static OQS_STATUS test_testvector_2(void) { - - OQS_STATUS rc = OQS_ERROR; - - /* This is test case 2 */ - static const unsigned char public_key[] = { - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x03, 0xd0, 0x8f, 0xab, 0xd4, - 0xa2, 0x09, 0x1f, 0xf0, 0xa8, 0xcb, 0x4e, 0xd8, - 0x34, 0xe7, 0x45, 0x34, 0x32, 0xa5, 0x88, 0x85, - 0xcd, 0x9b, 0xa0, 0x43, 0x12, 0x35, 0x46, 0x6b, - 0xff, 0x96, 0x51, 0xc6, 0xc9, 0x21, 0x24, 0x40, - 0x4d, 0x45, 0xfa, 0x53, 0xcf, 0x16, 0x1c, 0x28, - 0xf1, 0xad, 0x5a, 0x8e, - }; - static const unsigned char message[] = { - 0x54, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x75, 0x6d, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, - 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x66, 0x20, - 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, - 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x65, 0x64, 0x20, 0x74, - 0x6f, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x20, 0x6f, - 0x72, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x72, - 0x61, 0x67, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x73, 0x20, 0x72, 0x65, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, - 0x65, 0x2e, 0x0a, - }; - - static const unsigned char signature[] = { - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x03, 0x3d, 0x46, 0xbe, 0xe8, - 0x66, 0x0f, 0x8f, 0x21, 0x5d, 0x3f, 0x96, 0x40, - 0x8a, 0x7a, 0x64, 0xcf, 0x1c, 0x4d, 0xa0, 0x2b, - 0x63, 0xa5, 0x5f, 0x62, 0xc6, 0x66, 0xef, 0x57, - 0x07, 0xa9, 0x14, 0xce, 0x06, 0x74, 0xe8, 0xcb, - 0x7a, 0x55, 0xf0, 0xc4, 0x8d, 0x48, 0x4f, 0x31, - 0xf3, 0xaa, 0x4a, 0xf9, 0x71, 0x9a, 0x74, 0xf2, - 0x2c, 0xf8, 0x23, 0xb9, 0x44, 0x31, 0xd0, 0x1c, - 0x92, 0x6e, 0x2a, 0x76, 0xbb, 0x71, 0x22, 0x6d, - 0x27, 0x97, 0x00, 0xec, 0x81, 0xc9, 0xe9, 0x5f, - 0xb1, 0x1a, 0x0d, 0x10, 0xd0, 0x65, 0x27, 0x9a, - 0x57, 0x96, 0xe2, 0x65, 0xae, 0x17, 0x73, 0x7c, - 0x44, 0xeb, 0x8c, 0x59, 0x45, 0x08, 0xe1, 0x26, - 0xa9, 0xa7, 0x87, 0x0b, 0xf4, 0x36, 0x08, 0x20, - 0xbd, 0xeb, 0x9a, 0x01, 0xd9, 0x69, 0x37, 0x79, - 0xe4, 0x16, 0x82, 0x8e, 0x75, 0xbd, 0xdd, 0x7d, - 0x8c, 0x70, 0xd5, 0x0a, 0x0a, 0xc8, 0xba, 0x39, - 0x81, 0x09, 0x09, 0xd4, 0x45, 0xf4, 0x4c, 0xb5, - 0xbb, 0x58, 0xde, 0x73, 0x7e, 0x60, 0xcb, 0x43, - 0x45, 0x30, 0x27, 0x86, 0xef, 0x2c, 0x6b, 0x14, - 0xaf, 0x21, 0x2c, 0xa1, 0x9e, 0xde, 0xaa, 0x3b, - 0xfc, 0xfe, 0x8b, 0xaa, 0x66, 0x21, 0xce, 0x88, - 0x48, 0x0d, 0xf2, 0x37, 0x1d, 0xd3, 0x7a, 0xdd, - 0x73, 0x2c, 0x9d, 0xe4, 0xea, 0x2c, 0xe0, 0xdf, - 0xfa, 0x53, 0xc9, 0x26, 0x49, 0xa1, 0x8d, 0x39, - 0xa5, 0x07, 0x88, 0xf4, 0x65, 0x29, 0x87, 0xf2, - 0x26, 0xa1, 0xd4, 0x81, 0x68, 0x20, 0x5d, 0xf6, - 0xae, 0x7c, 0x58, 0xe0, 0x49, 0xa2, 0x5d, 0x49, - 0x07, 0xed, 0xc1, 0xaa, 0x90, 0xda, 0x8a, 0xa5, - 0xe5, 0xf7, 0x67, 0x17, 0x73, 0xe9, 0x41, 0xd8, - 0x05, 0x53, 0x60, 0x21, 0x5c, 0x6b, 0x60, 0xdd, - 0x35, 0x46, 0x3c, 0xf2, 0x24, 0x0a, 0x9c, 0x06, - 0xd6, 0x94, 0xe9, 0xcb, 0x54, 0xe7, 0xb1, 0xe1, - 0xbf, 0x49, 0x4d, 0x0d, 0x1a, 0x28, 0xc0, 0xd3, - 0x1a, 0xcc, 0x75, 0x16, 0x1f, 0x4f, 0x48, 0x5d, - 0xfd, 0x3c, 0xb9, 0x57, 0x8e, 0x83, 0x6e, 0xc2, - 0xdc, 0x72, 0x2f, 0x37, 0xed, 0x30, 0x87, 0x2e, - 0x07, 0xf2, 0xb8, 0xbd, 0x03, 0x74, 0xeb, 0x57, - 0xd2, 0x2c, 0x61, 0x4e, 0x09, 0x15, 0x0f, 0x6c, - 0x0d, 0x87, 0x74, 0xa3, 0x9a, 0x6e, 0x16, 0x82, - 0x11, 0x03, 0x5d, 0xc5, 0x29, 0x88, 0xab, 0x46, - 0xea, 0xca, 0x9e, 0xc5, 0x97, 0xfb, 0x18, 0xb4, - 0x93, 0x6e, 0x66, 0xef, 0x2f, 0x0d, 0xf2, 0x6e, - 0x8d, 0x1e, 0x34, 0xda, 0x28, 0xcb, 0xb3, 0xaf, - 0x75, 0x23, 0x13, 0x72, 0x0c, 0x7b, 0x34, 0x54, - 0x34, 0xf7, 0x2d, 0x65, 0x31, 0x43, 0x28, 0xbb, - 0xb0, 0x30, 0xd0, 0xf0, 0xf6, 0xd5, 0xe4, 0x7b, - 0x28, 0xea, 0x91, 0x00, 0x8f, 0xb1, 0x1b, 0x05, - 0x01, 0x77, 0x05, 0xa8, 0xbe, 0x3b, 0x2a, 0xdb, - 0x83, 0xc6, 0x0a, 0x54, 0xf9, 0xd1, 0xd1, 0xb2, - 0xf4, 0x76, 0xf9, 0xe3, 0x93, 0xeb, 0x56, 0x95, - 0x20, 0x3d, 0x2b, 0xa6, 0xad, 0x81, 0x5e, 0x6a, - 0x11, 0x1e, 0xa2, 0x93, 0xdc, 0xc2, 0x10, 0x33, - 0xf9, 0x45, 0x3d, 0x49, 0xc8, 0xe5, 0xa6, 0x38, - 0x7f, 0x58, 0x8b, 0x1e, 0xa4, 0xf7, 0x06, 0x21, - 0x7c, 0x15, 0x1e, 0x05, 0xf5, 0x5a, 0x6e, 0xb7, - 0x99, 0x7b, 0xe0, 0x9d, 0x56, 0xa3, 0x26, 0xa3, - 0x2f, 0x9c, 0xba, 0x1f, 0xbe, 0x1c, 0x07, 0xbb, - 0x49, 0xfa, 0x04, 0xce, 0xcf, 0x9d, 0xf1, 0xa1, - 0xb8, 0x15, 0x48, 0x3c, 0x75, 0xd7, 0xa2, 0x7c, - 0xc8, 0x8a, 0xd1, 0xb1, 0x23, 0x8e, 0x5e, 0xa9, - 0x86, 0xb5, 0x3e, 0x08, 0x70, 0x45, 0x72, 0x3c, - 0xe1, 0x61, 0x87, 0xed, 0xa2, 0x2e, 0x33, 0xb2, - 0xc7, 0x07, 0x09, 0xe5, 0x32, 0x51, 0x02, 0x5a, - 0xbd, 0xe8, 0x93, 0x96, 0x45, 0xfc, 0x8c, 0x06, - 0x93, 0xe9, 0x77, 0x63, 0x92, 0x8f, 0x00, 0xb2, - 0xe3, 0xc7, 0x5a, 0xf3, 0x94, 0x2d, 0x8d, 0xda, - 0xee, 0x81, 0xb5, 0x9a, 0x6f, 0x1f, 0x67, 0xef, - 0xda, 0x0e, 0xf8, 0x1d, 0x11, 0x87, 0x3b, 0x59, - 0x13, 0x7f, 0x67, 0x80, 0x0b, 0x35, 0xe8, 0x1b, - 0x01, 0x56, 0x3d, 0x18, 0x7c, 0x4a, 0x15, 0x75, - 0xa1, 0xac, 0xb9, 0x2d, 0x08, 0x7b, 0x51, 0x7a, - 0x88, 0x33, 0x38, 0x3f, 0x05, 0xd3, 0x57, 0xef, - 0x46, 0x78, 0xde, 0x0c, 0x57, 0xff, 0x9f, 0x1b, - 0x2d, 0xa6, 0x1d, 0xfd, 0xe5, 0xd8, 0x83, 0x18, - 0xbc, 0xdd, 0xe4, 0xd9, 0x06, 0x1c, 0xc7, 0x5c, - 0x2d, 0xe3, 0xcd, 0x47, 0x40, 0xdd, 0x77, 0x39, - 0xca, 0x3e, 0xf6, 0x6f, 0x19, 0x30, 0x02, 0x6f, - 0x47, 0xd9, 0xeb, 0xaa, 0x71, 0x3b, 0x07, 0x17, - 0x6f, 0x76, 0xf9, 0x53, 0xe1, 0xc2, 0xe7, 0xf8, - 0xf2, 0x71, 0xa6, 0xca, 0x37, 0x5d, 0xbf, 0xb8, - 0x3d, 0x71, 0x9b, 0x16, 0x35, 0xa7, 0xd8, 0xa1, - 0x38, 0x91, 0x95, 0x79, 0x44, 0xb1, 0xc2, 0x9b, - 0xb1, 0x01, 0x91, 0x3e, 0x16, 0x6e, 0x11, 0xbd, - 0x5f, 0x34, 0x18, 0x6f, 0xa6, 0xc0, 0xa5, 0x55, - 0xc9, 0x02, 0x6b, 0x25, 0x6a, 0x68, 0x60, 0xf4, - 0x86, 0x6b, 0xd6, 0xd0, 0xb5, 0xbf, 0x90, 0x62, - 0x70, 0x86, 0xc6, 0x14, 0x91, 0x33, 0xf8, 0x28, - 0x2c, 0xe6, 0xc9, 0xb3, 0x62, 0x24, 0x42, 0x44, - 0x3d, 0x5e, 0xca, 0x95, 0x9d, 0x6c, 0x14, 0xca, - 0x83, 0x89, 0xd1, 0x2c, 0x40, 0x68, 0xb5, 0x03, - 0xe4, 0xe3, 0xc3, 0x9b, 0x63, 0x5b, 0xea, 0x24, - 0x5d, 0x9d, 0x05, 0xa2, 0x55, 0x8f, 0x24, 0x9c, - 0x96, 0x61, 0xc0, 0x42, 0x7d, 0x2e, 0x48, 0x9c, - 0xa5, 0xb5, 0xdd, 0xe2, 0x20, 0xa9, 0x03, 0x33, - 0xf4, 0x86, 0x2a, 0xec, 0x79, 0x32, 0x23, 0xc7, - 0x81, 0x99, 0x7d, 0xa9, 0x82, 0x66, 0xc1, 0x2c, - 0x50, 0xea, 0x28, 0xb2, 0xc4, 0x38, 0xe7, 0xa3, - 0x79, 0xeb, 0x10, 0x6e, 0xca, 0x0c, 0x7f, 0xd6, - 0x00, 0x6e, 0x9b, 0xf6, 0x12, 0xf3, 0xea, 0x0a, - 0x45, 0x4b, 0xa3, 0xbd, 0xb7, 0x6e, 0x80, 0x27, - 0x99, 0x2e, 0x60, 0xde, 0x01, 0xe9, 0x09, 0x4f, - 0xdd, 0xeb, 0x33, 0x49, 0x88, 0x39, 0x14, 0xfb, - 0x17, 0xa9, 0x62, 0x1a, 0xb9, 0x29, 0xd9, 0x70, - 0xd1, 0x01, 0xe4, 0x5f, 0x82, 0x78, 0xc1, 0x4b, - 0x03, 0x2b, 0xca, 0xb0, 0x2b, 0xd1, 0x56, 0x92, - 0xd2, 0x1b, 0x6c, 0x5c, 0x20, 0x4a, 0xbb, 0xf0, - 0x77, 0xd4, 0x65, 0x55, 0x3b, 0xd6, 0xed, 0xa6, - 0x45, 0xe6, 0xc3, 0x06, 0x5d, 0x33, 0xb1, 0x0d, - 0x51, 0x8a, 0x61, 0xe1, 0x5e, 0xd0, 0xf0, 0x92, - 0xc3, 0x22, 0x26, 0x28, 0x1a, 0x29, 0xc8, 0xa0, - 0xf5, 0x0c, 0xde, 0x0a, 0x8c, 0x66, 0x23, 0x6e, - 0x29, 0xc2, 0xf3, 0x10, 0xa3, 0x75, 0xce, 0xbd, - 0xa1, 0xdc, 0x6b, 0xb9, 0xa1, 0xa0, 0x1d, 0xae, - 0x6c, 0x7a, 0xba, 0x8e, 0xbe, 0xdc, 0x63, 0x71, - 0xa7, 0xd5, 0x2a, 0xac, 0xb9, 0x55, 0xf8, 0x3b, - 0xd6, 0xe4, 0xf8, 0x4d, 0x29, 0x49, 0xdc, 0xc1, - 0x98, 0xfb, 0x77, 0xc7, 0xe5, 0xcd, 0xf6, 0x04, - 0x0b, 0x0f, 0x84, 0xfa, 0xf8, 0x28, 0x08, 0xbf, - 0x98, 0x55, 0x77, 0xf0, 0xa2, 0xac, 0xf2, 0xec, - 0x7e, 0xd7, 0xc0, 0xb0, 0xae, 0x8a, 0x27, 0x0e, - 0x95, 0x17, 0x43, 0xff, 0x23, 0xe0, 0xb2, 0xdd, - 0x12, 0xe9, 0xc3, 0xc8, 0x28, 0xfb, 0x55, 0x98, - 0xa2, 0x24, 0x61, 0xaf, 0x94, 0xd5, 0x68, 0xf2, - 0x92, 0x40, 0xba, 0x28, 0x20, 0xc4, 0x59, 0x1f, - 0x71, 0xc0, 0x88, 0xf9, 0x6e, 0x09, 0x5d, 0xd9, - 0x8b, 0xea, 0xe4, 0x56, 0x57, 0x9e, 0xbb, 0xba, - 0x36, 0xf6, 0xd9, 0xca, 0x26, 0x13, 0xd1, 0xc2, - 0x6e, 0xee, 0x4d, 0x8c, 0x73, 0x21, 0x7a, 0xc5, - 0x96, 0x2b, 0x5f, 0x31, 0x47, 0xb4, 0x92, 0xe8, - 0x83, 0x15, 0x97, 0xfd, 0x89, 0xb6, 0x4a, 0xa7, - 0xfd, 0xe8, 0x2e, 0x19, 0x74, 0xd2, 0xf6, 0x77, - 0x95, 0x04, 0xdc, 0x21, 0x43, 0x5e, 0xb3, 0x10, - 0x93, 0x50, 0x75, 0x6b, 0x9f, 0xda, 0xbe, 0x1c, - 0x6f, 0x36, 0x80, 0x81, 0xbd, 0x40, 0xb2, 0x7e, - 0xbc, 0xb9, 0x81, 0x9a, 0x75, 0xd7, 0xdf, 0x8b, - 0xb0, 0x7b, 0xb0, 0x5d, 0xb1, 0xba, 0xb7, 0x05, - 0xa4, 0xb7, 0xe3, 0x71, 0x25, 0x18, 0x63, 0x39, - 0x46, 0x4a, 0xd8, 0xfa, 0xaa, 0x4f, 0x05, 0x2c, - 0xc1, 0x27, 0x29, 0x19, 0xfd, 0xe3, 0xe0, 0x25, - 0xbb, 0x64, 0xaa, 0x8e, 0x0e, 0xb1, 0xfc, 0xbf, - 0xcc, 0x25, 0xac, 0xb5, 0xf7, 0x18, 0xce, 0x4f, - 0x7c, 0x21, 0x82, 0xfb, 0x39, 0x3a, 0x18, 0x14, - 0xb0, 0xe9, 0x42, 0x49, 0x0e, 0x52, 0xd3, 0xbc, - 0xa8, 0x17, 0xb2, 0xb2, 0x6e, 0x90, 0xd4, 0xc9, - 0xb0, 0xcc, 0x38, 0x60, 0x8a, 0x6c, 0xef, 0x5e, - 0xb1, 0x53, 0xaf, 0x08, 0x58, 0xac, 0xc8, 0x67, - 0xc9, 0x92, 0x2a, 0xed, 0x43, 0xbb, 0x67, 0xd7, - 0xb3, 0x3a, 0xcc, 0x51, 0x93, 0x13, 0xd2, 0x8d, - 0x41, 0xa5, 0xc6, 0xfe, 0x6c, 0xf3, 0x59, 0x5d, - 0xd5, 0xee, 0x63, 0xf0, 0xa4, 0xc4, 0x06, 0x5a, - 0x08, 0x35, 0x90, 0xb2, 0x75, 0x78, 0x8b, 0xee, - 0x7a, 0xd8, 0x75, 0xa7, 0xf8, 0x8d, 0xd7, 0x37, - 0x20, 0x70, 0x8c, 0x6c, 0x6c, 0x0e, 0xcf, 0x1f, - 0x43, 0xbb, 0xaa, 0xda, 0xe6, 0xf2, 0x08, 0x55, - 0x7f, 0xdc, 0x07, 0xbd, 0x4e, 0xd9, 0x1f, 0x88, - 0xce, 0x4c, 0x0d, 0xe8, 0x42, 0x76, 0x1c, 0x70, - 0xc1, 0x86, 0xbf, 0xda, 0xfa, 0xfc, 0x44, 0x48, - 0x34, 0xbd, 0x34, 0x18, 0xbe, 0x42, 0x53, 0xa7, - 0x1e, 0xaf, 0x41, 0xd7, 0x18, 0x75, 0x3a, 0xd0, - 0x77, 0x54, 0xca, 0x3e, 0xff, 0xd5, 0x96, 0x0b, - 0x03, 0x36, 0x98, 0x17, 0x95, 0x72, 0x14, 0x26, - 0x80, 0x35, 0x99, 0xed, 0x5b, 0x2b, 0x75, 0x16, - 0x92, 0x0e, 0xfc, 0xbe, 0x32, 0xad, 0xa4, 0xbc, - 0xf6, 0xc7, 0x3b, 0xd2, 0x9e, 0x3f, 0xa1, 0x52, - 0xd9, 0xad, 0xec, 0xa3, 0x60, 0x20, 0xfd, 0xee, - 0xee, 0x1b, 0x73, 0x95, 0x21, 0xd3, 0xea, 0x8c, - 0x0d, 0xa4, 0x97, 0x00, 0x3d, 0xf1, 0x51, 0x38, - 0x97, 0xb0, 0xf5, 0x47, 0x94, 0xa8, 0x73, 0x67, - 0x0b, 0x8d, 0x93, 0xbc, 0xca, 0x2a, 0xe4, 0x7e, - 0x64, 0x42, 0x4b, 0x74, 0x23, 0xe1, 0xf0, 0x78, - 0xd9, 0x55, 0x4b, 0xb5, 0x23, 0x2c, 0xc6, 0xde, - 0x8a, 0xae, 0x9b, 0x83, 0xfa, 0x5b, 0x95, 0x10, - 0xbe, 0xb3, 0x9c, 0xcf, 0x4b, 0x4e, 0x1d, 0x9c, - 0x0f, 0x19, 0xd5, 0xe1, 0x7f, 0x58, 0xe5, 0xb8, - 0x70, 0x5d, 0x9a, 0x68, 0x37, 0xa7, 0xd9, 0xbf, - 0x99, 0xcd, 0x13, 0x38, 0x7a, 0xf2, 0x56, 0xa8, - 0x49, 0x16, 0x71, 0xf1, 0xf2, 0xf2, 0x2a, 0xf2, - 0x53, 0xbc, 0xff, 0x54, 0xb6, 0x73, 0x19, 0x9b, - 0xdb, 0x7d, 0x05, 0xd8, 0x10, 0x64, 0xef, 0x05, - 0xf8, 0x0f, 0x01, 0x53, 0xd0, 0xbe, 0x79, 0x19, - 0x68, 0x4b, 0x23, 0xda, 0x8d, 0x42, 0xff, 0x3e, - 0xff, 0xdb, 0x7c, 0xa0, 0x98, 0x50, 0x33, 0xf3, - 0x89, 0x18, 0x1f, 0x47, 0x65, 0x91, 0x38, 0x00, - 0x3d, 0x71, 0x2b, 0x5e, 0xc0, 0xa6, 0x14, 0xd3, - 0x1c, 0xc7, 0x48, 0x7f, 0x52, 0xde, 0x86, 0x64, - 0x91, 0x6a, 0xf7, 0x9c, 0x98, 0x45, 0x6b, 0x2c, - 0x94, 0xa8, 0x03, 0x80, 0x83, 0xdb, 0x55, 0x39, - 0x1e, 0x34, 0x75, 0x86, 0x22, 0x50, 0x27, 0x4a, - 0x1d, 0xe2, 0x58, 0x4f, 0xec, 0x97, 0x5f, 0xb0, - 0x95, 0x36, 0x79, 0x2c, 0xfb, 0xfc, 0xf6, 0x19, - 0x28, 0x56, 0xcc, 0x76, 0xeb, 0x5b, 0x13, 0xdc, - 0x47, 0x09, 0xe2, 0xf7, 0x30, 0x1d, 0xdf, 0xf2, - 0x6e, 0xc1, 0xb2, 0x3d, 0xe2, 0xd1, 0x88, 0xc9, - 0x99, 0x16, 0x6c, 0x74, 0xe1, 0xe1, 0x4b, 0xbc, - 0x15, 0xf4, 0x57, 0xcf, 0x4e, 0x47, 0x1a, 0xe1, - 0x3d, 0xcb, 0xdd, 0x9c, 0x50, 0xf4, 0xd6, 0x46, - 0xfc, 0x62, 0x78, 0xe8, 0xfe, 0x7e, 0xb6, 0xcb, - 0x5c, 0x94, 0x10, 0x0f, 0xa8, 0x70, 0x18, 0x73, - 0x80, 0xb7, 0x77, 0xed, 0x19, 0xd7, 0x86, 0x8f, - 0xd8, 0xca, 0x7c, 0xeb, 0x7f, 0xa7, 0xd5, 0xcc, - 0x86, 0x1c, 0x5b, 0xda, 0xc9, 0x8e, 0x74, 0x95, - 0xeb, 0x0a, 0x2c, 0xee, 0xc1, 0x92, 0x4a, 0xe9, - 0x79, 0xf4, 0x4c, 0x53, 0x90, 0xeb, 0xed, 0xdd, - 0xc6, 0x5d, 0x6e, 0xc1, 0x12, 0x87, 0xd9, 0x78, - 0xb8, 0xdf, 0x06, 0x42, 0x19, 0xbc, 0x56, 0x79, - 0xf7, 0xd7, 0xb2, 0x64, 0xa7, 0x6f, 0xf2, 0x72, - 0xb2, 0xac, 0x9f, 0x2f, 0x7c, 0xfc, 0x9f, 0xdc, - 0xfb, 0x6a, 0x51, 0x42, 0x82, 0x40, 0x02, 0x7a, - 0xfd, 0x9d, 0x52, 0xa7, 0x9b, 0x64, 0x7c, 0x90, - 0xc2, 0x70, 0x9e, 0x06, 0x0e, 0xd7, 0x0f, 0x87, - 0x29, 0x9d, 0xd7, 0x98, 0xd6, 0x8f, 0x4f, 0xad, - 0xd3, 0xda, 0x6c, 0x51, 0xd8, 0x39, 0xf8, 0x51, - 0xf9, 0x8f, 0x67, 0x84, 0x0b, 0x96, 0x4e, 0xbe, - 0x73, 0xf8, 0xce, 0xc4, 0x15, 0x72, 0x53, 0x8e, - 0xc6, 0xbc, 0x13, 0x10, 0x34, 0xca, 0x28, 0x94, - 0xeb, 0x73, 0x6b, 0x3b, 0xda, 0x93, 0xd9, 0xf5, - 0xf6, 0xfa, 0x6f, 0x6c, 0x0f, 0x03, 0xce, 0x43, - 0x36, 0x2b, 0x84, 0x14, 0x94, 0x03, 0x55, 0xfb, - 0x54, 0xd3, 0xdf, 0xdd, 0x03, 0x63, 0x3a, 0xe1, - 0x08, 0xf3, 0xde, 0x3e, 0xbc, 0x85, 0xa3, 0xff, - 0x51, 0xef, 0xee, 0xa3, 0xbc, 0x2c, 0xf2, 0x7e, - 0x16, 0x58, 0xf1, 0x78, 0x9e, 0xe6, 0x12, 0xc8, - 0x3d, 0x0f, 0x5f, 0xd5, 0x6f, 0x7c, 0xd0, 0x71, - 0x93, 0x0e, 0x29, 0x46, 0xbe, 0xee, 0xca, 0xa0, - 0x4d, 0xcc, 0xea, 0x9f, 0x97, 0x78, 0x60, 0x01, - 0x47, 0x5e, 0x02, 0x94, 0xbc, 0x28, 0x52, 0xf6, - 0x2e, 0xb5, 0xd3, 0x9b, 0xb9, 0xfb, 0xee, 0xf7, - 0x59, 0x16, 0xef, 0xe4, 0x4a, 0x66, 0x2e, 0xca, - 0xe3, 0x7e, 0xde, 0x27, 0xe9, 0xd6, 0xea, 0xdf, - 0xde, 0xb8, 0xf8, 0xb2, 0xb2, 0xdb, 0xcc, 0xbf, - 0x96, 0xfa, 0x6d, 0xba, 0xf7, 0x32, 0x1f, 0xb0, - 0xe7, 0x01, 0xf4, 0xd4, 0x29, 0xc2, 0xf4, 0xdc, - 0xd1, 0x53, 0xa2, 0x74, 0x25, 0x74, 0x12, 0x6e, - 0x5e, 0xac, 0xcc, 0x77, 0x68, 0x6a, 0xcf, 0x6e, - 0x3e, 0xe4, 0x8f, 0x42, 0x37, 0x66, 0xe0, 0xfc, - 0x46, 0x68, 0x10, 0xa9, 0x05, 0xff, 0x54, 0x53, - 0xec, 0x99, 0x89, 0x7b, 0x56, 0xbc, 0x55, 0xdd, - 0x49, 0xb9, 0x91, 0x14, 0x2f, 0x65, 0x04, 0x3f, - 0x2d, 0x74, 0x4e, 0xeb, 0x93, 0x5b, 0xa7, 0xf4, - 0xef, 0x23, 0xcf, 0x80, 0xcc, 0x5a, 0x8a, 0x33, - 0x5d, 0x36, 0x19, 0xd7, 0x81, 0xe7, 0x45, 0x48, - 0x26, 0xdf, 0x72, 0x0e, 0xec, 0x82, 0xe0, 0x60, - 0x34, 0xc4, 0x46, 0x99, 0xb5, 0xf0, 0xc4, 0x4a, - 0x87, 0x87, 0x75, 0x2e, 0x05, 0x7f, 0xa3, 0x41, - 0x9b, 0x5b, 0xb0, 0xe2, 0x5d, 0x30, 0x98, 0x1e, - 0x41, 0xcb, 0x13, 0x61, 0x32, 0x2d, 0xba, 0x8f, - 0x69, 0x93, 0x1c, 0xf4, 0x2f, 0xad, 0x3f, 0x3b, - 0xce, 0x6d, 0xed, 0x5b, 0x8b, 0xfc, 0x3d, 0x20, - 0xa2, 0x14, 0x88, 0x61, 0xb2, 0xaf, 0xc1, 0x45, - 0x62, 0xdd, 0xd2, 0x7f, 0x12, 0x89, 0x7a, 0xbf, - 0x06, 0x85, 0x28, 0x8d, 0xcc, 0x5c, 0x49, 0x82, - 0xf8, 0x26, 0x02, 0x68, 0x46, 0xa2, 0x4b, 0xf7, - 0x7e, 0x38, 0x3c, 0x7a, 0xac, 0xab, 0x1a, 0xb6, - 0x92, 0xb2, 0x9e, 0xd8, 0xc0, 0x18, 0xa6, 0x5f, - 0x3d, 0xc2, 0xb8, 0x7f, 0xf6, 0x19, 0xa6, 0x33, - 0xc4, 0x1b, 0x4f, 0xad, 0xb1, 0xc7, 0x87, 0x25, - 0xc1, 0xf8, 0xf9, 0x22, 0xf6, 0x00, 0x97, 0x87, - 0xb1, 0x96, 0x42, 0x47, 0xdf, 0x01, 0x36, 0xb1, - 0xbc, 0x61, 0x4a, 0xb5, 0x75, 0xc5, 0x9a, 0x16, - 0xd0, 0x89, 0x91, 0x7b, 0xd4, 0xa8, 0xb6, 0xf0, - 0x4d, 0x95, 0xc5, 0x81, 0x27, 0x9a, 0x13, 0x9b, - 0xe0, 0x9f, 0xcf, 0x6e, 0x98, 0xa4, 0x70, 0xa0, - 0xbc, 0xec, 0xa1, 0x91, 0xfc, 0xe4, 0x76, 0xf9, - 0x37, 0x00, 0x21, 0xcb, 0xc0, 0x55, 0x18, 0xa7, - 0xef, 0xd3, 0x5d, 0x89, 0xd8, 0x57, 0x7c, 0x99, - 0x0a, 0x5e, 0x19, 0x96, 0x1b, 0xa1, 0x62, 0x03, - 0xc9, 0x59, 0xc9, 0x18, 0x29, 0xba, 0x74, 0x97, - 0xcf, 0xfc, 0xbb, 0x4b, 0x29, 0x45, 0x46, 0x45, - 0x4f, 0xa5, 0x38, 0x8a, 0x23, 0xa2, 0x2e, 0x80, - 0x5a, 0x5c, 0xa3, 0x5f, 0x95, 0x65, 0x98, 0x84, - 0x8b, 0xda, 0x67, 0x86, 0x15, 0xfe, 0xc2, 0x8a, - 0xfd, 0x5d, 0xa6, 0x1a, 0x00, 0x00, 0x00, 0x06, - 0xb3, 0x26, 0x49, 0x33, 0x13, 0x05, 0x3c, 0xed, - 0x38, 0x76, 0xdb, 0x9d, 0x23, 0x71, 0x48, 0x18, - 0x1b, 0x71, 0x73, 0xbc, 0x7d, 0x04, 0x2c, 0xef, - 0xb4, 0xdb, 0xe9, 0x4d, 0x2e, 0x58, 0xcd, 0x21, - 0xa7, 0x69, 0xdb, 0x46, 0x57, 0xa1, 0x03, 0x27, - 0x9b, 0xa8, 0xef, 0x3a, 0x62, 0x9c, 0xa8, 0x4e, - 0xe8, 0x36, 0x17, 0x2a, 0x9c, 0x50, 0xe5, 0x1f, - 0x45, 0x58, 0x17, 0x41, 0xcf, 0x80, 0x83, 0x15, - 0x0b, 0x49, 0x1c, 0xb4, 0xec, 0xbb, 0xab, 0xec, - 0x12, 0x8e, 0x7c, 0x81, 0xa4, 0x6e, 0x62, 0xa6, - 0x7b, 0x57, 0x64, 0x0a, 0x0a, 0x78, 0xbe, 0x1c, - 0xbf, 0x7d, 0xd9, 0xd4, 0x19, 0xa1, 0x0c, 0xd8, - 0x68, 0x6d, 0x16, 0x62, 0x1a, 0x80, 0x81, 0x6b, - 0xfd, 0xb5, 0xbd, 0xc5, 0x62, 0x11, 0xd7, 0x2c, - 0xa7, 0x0b, 0x81, 0xf1, 0x11, 0x7d, 0x12, 0x95, - 0x29, 0xa7, 0x57, 0x0c, 0xf7, 0x9c, 0xf5, 0x2a, - 0x70, 0x28, 0xa4, 0x85, 0x38, 0xec, 0xdd, 0x3b, - 0x38, 0xd3, 0xd5, 0xd6, 0x2d, 0x26, 0x24, 0x65, - 0x95, 0xc4, 0xfb, 0x73, 0xa5, 0x25, 0xa5, 0xed, - 0x2c, 0x30, 0x52, 0x4e, 0xbb, 0x1d, 0x8c, 0xc8, - 0x2e, 0x0c, 0x19, 0xbc, 0x49, 0x77, 0xc6, 0x89, - 0x8f, 0xf9, 0x5f, 0xd3, 0xd3, 0x10, 0xb0, 0xba, - 0xe7, 0x16, 0x96, 0xce, 0xf9, 0x3c, 0x6a, 0x55, - 0x24, 0x56, 0xbf, 0x96, 0xe9, 0xd0, 0x75, 0xe3, - 0x83, 0xbb, 0x75, 0x43, 0xc6, 0x75, 0x84, 0x2b, - 0xaf, 0xbf, 0xc7, 0xcd, 0xb8, 0x84, 0x83, 0xb3, - 0x27, 0x6c, 0x29, 0xd4, 0xf0, 0xa3, 0x41, 0xc2, - 0xd4, 0x06, 0xe4, 0x0d, 0x46, 0x53, 0xb7, 0xe4, - 0xd0, 0x45, 0x85, 0x1a, 0xcf, 0x6a, 0x0a, 0x0e, - 0xa9, 0xc7, 0x10, 0xb8, 0x05, 0xcc, 0xed, 0x46, - 0x35, 0xee, 0x8c, 0x10, 0x73, 0x62, 0xf0, 0xfc, - 0x8d, 0x80, 0xc1, 0x4d, 0x0a, 0xc4, 0x9c, 0x51, - 0x67, 0x03, 0xd2, 0x6d, 0x14, 0x75, 0x2f, 0x34, - 0xc1, 0xc0, 0xd2, 0xc4, 0x24, 0x75, 0x81, 0xc1, - 0x8c, 0x2c, 0xf4, 0xde, 0x48, 0xe9, 0xce, 0x94, - 0x9b, 0xe7, 0xc8, 0x88, 0xe9, 0xca, 0xeb, 0xe4, - 0xa4, 0x15, 0xe2, 0x91, 0xfd, 0x10, 0x7d, 0x21, - 0xdc, 0x1f, 0x08, 0x4b, 0x11, 0x58, 0x20, 0x82, - 0x49, 0xf2, 0x8f, 0x4f, 0x7c, 0x7e, 0x93, 0x1b, - 0xa7, 0xb3, 0xbd, 0x0d, 0x82, 0x4a, 0x45, 0x70, - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, - 0x21, 0x5f, 0x83, 0xb7, 0xcc, 0xb9, 0xac, 0xbc, - 0xd0, 0x8d, 0xb9, 0x7b, 0x0d, 0x04, 0xdc, 0x2b, - 0xa1, 0xcd, 0x03, 0x58, 0x33, 0xe0, 0xe9, 0x00, - 0x59, 0x60, 0x3f, 0x26, 0xe0, 0x7a, 0xd2, 0xaa, - 0xd1, 0x52, 0x33, 0x8e, 0x7a, 0x5e, 0x59, 0x84, - 0xbc, 0xd5, 0xf7, 0xbb, 0x4e, 0xba, 0x40, 0xb7, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, - 0x0e, 0xb1, 0xed, 0x54, 0xa2, 0x46, 0x0d, 0x51, - 0x23, 0x88, 0xca, 0xd5, 0x33, 0x13, 0x8d, 0x24, - 0x05, 0x34, 0xe9, 0x7b, 0x1e, 0x82, 0xd3, 0x3b, - 0xd9, 0x27, 0xd2, 0x01, 0xdf, 0xc2, 0x4e, 0xbb, - 0x11, 0xb3, 0x64, 0x90, 0x23, 0x69, 0x6f, 0x85, - 0x15, 0x0b, 0x18, 0x9e, 0x50, 0xc0, 0x0e, 0x98, - 0x85, 0x0a, 0xc3, 0x43, 0xa7, 0x7b, 0x36, 0x38, - 0x31, 0x9c, 0x34, 0x7d, 0x73, 0x10, 0x26, 0x9d, - 0x3b, 0x77, 0x14, 0xfa, 0x40, 0x6b, 0x8c, 0x35, - 0xb0, 0x21, 0xd5, 0x4d, 0x4f, 0xda, 0xda, 0x7b, - 0x9c, 0xe5, 0xd4, 0xba, 0x5b, 0x06, 0x71, 0x9e, - 0x72, 0xaa, 0xf5, 0x8c, 0x5a, 0xae, 0x7a, 0xca, - 0x05, 0x7a, 0xa0, 0xe2, 0xe7, 0x4e, 0x7d, 0xcf, - 0xd1, 0x7a, 0x08, 0x23, 0x42, 0x9d, 0xb6, 0x29, - 0x65, 0xb7, 0xd5, 0x63, 0xc5, 0x7b, 0x4c, 0xec, - 0x94, 0x2c, 0xc8, 0x65, 0xe2, 0x9c, 0x1d, 0xad, - 0x83, 0xca, 0xc8, 0xb4, 0xd6, 0x1a, 0xac, 0xc4, - 0x57, 0xf3, 0x36, 0xe6, 0xa1, 0x0b, 0x66, 0x32, - 0x3f, 0x58, 0x87, 0xbf, 0x35, 0x23, 0xdf, 0xca, - 0xde, 0xe1, 0x58, 0x50, 0x3b, 0xfa, 0xa8, 0x9d, - 0xc6, 0xbf, 0x59, 0xda, 0xa8, 0x2a, 0xfd, 0x2b, - 0x5e, 0xbb, 0x2a, 0x9c, 0xa6, 0x57, 0x2a, 0x60, - 0x67, 0xce, 0xe7, 0xc3, 0x27, 0xe9, 0x03, 0x9b, - 0x3b, 0x6e, 0xa6, 0xa1, 0xed, 0xc7, 0xfd, 0xc3, - 0xdf, 0x92, 0x7a, 0xad, 0xe1, 0x0c, 0x1c, 0x9f, - 0x2d, 0x5f, 0xf4, 0x46, 0x45, 0x0d, 0x2a, 0x39, - 0x98, 0xd0, 0xf9, 0xf6, 0x20, 0x2b, 0x5e, 0x07, - 0xc3, 0xf9, 0x7d, 0x24, 0x58, 0xc6, 0x9d, 0x3c, - 0x81, 0x90, 0x64, 0x39, 0x78, 0xd7, 0xa7, 0xf4, - 0xd6, 0x4e, 0x97, 0xe3, 0xf1, 0xc4, 0xa0, 0x8a, - 0x7c, 0x5b, 0xc0, 0x3f, 0xd5, 0x56, 0x82, 0xc0, - 0x17, 0xe2, 0x90, 0x7e, 0xab, 0x07, 0xe5, 0xbb, - 0x2f, 0x19, 0x01, 0x43, 0x47, 0x5a, 0x60, 0x43, - 0xd5, 0xe6, 0xd5, 0x26, 0x34, 0x71, 0xf4, 0xee, - 0xcf, 0x6e, 0x25, 0x75, 0xfb, 0xc6, 0xff, 0x37, - 0xed, 0xfa, 0x24, 0x9d, 0x6c, 0xda, 0x1a, 0x09, - 0xf7, 0x97, 0xfd, 0x5a, 0x3c, 0xd5, 0x3a, 0x06, - 0x67, 0x00, 0xf4, 0x58, 0x63, 0xf0, 0x4b, 0x6c, - 0x8a, 0x58, 0xcf, 0xd3, 0x41, 0x24, 0x1e, 0x00, - 0x2d, 0x0d, 0x2c, 0x02, 0x17, 0x47, 0x2b, 0xf1, - 0x8b, 0x63, 0x6a, 0xe5, 0x47, 0xc1, 0x77, 0x13, - 0x68, 0xd9, 0xf3, 0x17, 0x83, 0x5c, 0x9b, 0x0e, - 0xf4, 0x30, 0xb3, 0xdf, 0x40, 0x34, 0xf6, 0xaf, - 0x00, 0xd0, 0xda, 0x44, 0xf4, 0xaf, 0x78, 0x00, - 0xbc, 0x7a, 0x5c, 0xf8, 0xa5, 0xab, 0xdb, 0x12, - 0xdc, 0x71, 0x8b, 0x55, 0x9b, 0x74, 0xca, 0xb9, - 0x09, 0x0e, 0x33, 0xcc, 0x58, 0xa9, 0x55, 0x30, - 0x09, 0x81, 0xc4, 0x20, 0xc4, 0xda, 0x8f, 0xfd, - 0x67, 0xdf, 0x54, 0x08, 0x90, 0xa0, 0x62, 0xfe, - 0x40, 0xdb, 0xa8, 0xb2, 0xc1, 0xc5, 0x48, 0xce, - 0xd2, 0x24, 0x73, 0x21, 0x9c, 0x53, 0x49, 0x11, - 0xd4, 0x8c, 0xca, 0xab, 0xfb, 0x71, 0xbc, 0x71, - 0x86, 0x2f, 0x4a, 0x24, 0xeb, 0xd3, 0x76, 0xd2, - 0x88, 0xfd, 0x4e, 0x6f, 0xb0, 0x6e, 0xd8, 0x70, - 0x57, 0x87, 0xc5, 0xfe, 0xdc, 0x81, 0x3c, 0xd2, - 0x69, 0x7e, 0x5b, 0x1a, 0xac, 0x1c, 0xed, 0x45, - 0x76, 0x7b, 0x14, 0xce, 0x88, 0x40, 0x9e, 0xae, - 0xbb, 0x60, 0x1a, 0x93, 0x55, 0x9a, 0xae, 0x89, - 0x3e, 0x14, 0x3d, 0x1c, 0x39, 0x5b, 0xc3, 0x26, - 0xda, 0x82, 0x1d, 0x79, 0xa9, 0xed, 0x41, 0xdc, - 0xfb, 0xe5, 0x49, 0x14, 0x7f, 0x71, 0xc0, 0x92, - 0xf4, 0xf3, 0xac, 0x52, 0x2b, 0x5c, 0xc5, 0x72, - 0x90, 0x70, 0x66, 0x50, 0x48, 0x7b, 0xae, 0x9b, - 0xb5, 0x67, 0x1e, 0xcc, 0x9c, 0xcc, 0x2c, 0xe5, - 0x1e, 0xad, 0x87, 0xac, 0x01, 0x98, 0x52, 0x68, - 0x52, 0x12, 0x22, 0xfb, 0x90, 0x57, 0xdf, 0x7e, - 0xd4, 0x18, 0x10, 0xb5, 0xef, 0x0d, 0x4f, 0x7c, - 0xc6, 0x73, 0x68, 0xc9, 0x0f, 0x57, 0x3b, 0x1a, - 0xc2, 0xce, 0x95, 0x6c, 0x36, 0x5e, 0xd3, 0x8e, - 0x89, 0x3c, 0xe7, 0xb2, 0xfa, 0xe1, 0x5d, 0x36, - 0x85, 0xa3, 0xdf, 0x2f, 0xa3, 0xd4, 0xcc, 0x09, - 0x8f, 0xa5, 0x7d, 0xd6, 0x0d, 0x2c, 0x97, 0x54, - 0xa8, 0xad, 0xe9, 0x80, 0xad, 0x0f, 0x93, 0xf6, - 0x78, 0x70, 0x75, 0xc3, 0xf6, 0x80, 0xa2, 0xba, - 0x19, 0x36, 0xa8, 0xc6, 0x1d, 0x1a, 0xf5, 0x2a, - 0xb7, 0xe2, 0x1f, 0x41, 0x6b, 0xe0, 0x9d, 0x2a, - 0x8d, 0x64, 0xc3, 0xd3, 0xd8, 0x58, 0x29, 0x68, - 0xc2, 0x83, 0x99, 0x02, 0x22, 0x9f, 0x85, 0xae, - 0xe2, 0x97, 0xe7, 0x17, 0xc0, 0x94, 0xc8, 0xdf, - 0x4a, 0x23, 0xbb, 0x5d, 0xb6, 0x58, 0xdd, 0x37, - 0x7b, 0xf0, 0xf4, 0xff, 0x3f, 0xfd, 0x8f, 0xba, - 0x5e, 0x38, 0x3a, 0x48, 0x57, 0x48, 0x02, 0xed, - 0x54, 0x5b, 0xbe, 0x7a, 0x6b, 0x47, 0x53, 0x53, - 0x33, 0x53, 0xd7, 0x37, 0x06, 0x06, 0x76, 0x40, - 0x13, 0x5a, 0x7c, 0xe5, 0x17, 0x27, 0x9c, 0xd6, - 0x83, 0x03, 0x97, 0x47, 0xd2, 0x18, 0x64, 0x7c, - 0x86, 0xe0, 0x97, 0xb0, 0xda, 0xa2, 0x87, 0x2d, - 0x54, 0xb8, 0xf3, 0xe5, 0x08, 0x59, 0x87, 0x62, - 0x95, 0x47, 0xb8, 0x30, 0xd8, 0x11, 0x81, 0x61, - 0xb6, 0x50, 0x79, 0xfe, 0x7b, 0xc5, 0x9a, 0x99, - 0xe9, 0xc3, 0xc7, 0x38, 0x0e, 0x3e, 0x70, 0xb7, - 0x13, 0x8f, 0xe5, 0xd9, 0xbe, 0x25, 0x51, 0x50, - 0x2b, 0x69, 0x8d, 0x09, 0xae, 0x19, 0x39, 0x72, - 0xf2, 0x7d, 0x40, 0xf3, 0x8d, 0xea, 0x26, 0x4a, - 0x01, 0x26, 0xe6, 0x37, 0xd7, 0x4a, 0xe4, 0xc9, - 0x2a, 0x62, 0x49, 0xfa, 0x10, 0x34, 0x36, 0xd3, - 0xeb, 0x0d, 0x40, 0x29, 0xac, 0x71, 0x2b, 0xfc, - 0x7a, 0x5e, 0xac, 0xbd, 0xd7, 0x51, 0x8d, 0x6d, - 0x4f, 0xe9, 0x03, 0xa5, 0xae, 0x65, 0x52, 0x7c, - 0xd6, 0x5b, 0xb0, 0xd4, 0xe9, 0x92, 0x5c, 0xa2, - 0x4f, 0xd7, 0x21, 0x4d, 0xc6, 0x17, 0xc1, 0x50, - 0x54, 0x4e, 0x42, 0x3f, 0x45, 0x0c, 0x99, 0xce, - 0x51, 0xac, 0x80, 0x05, 0xd3, 0x3a, 0xcd, 0x74, - 0xf1, 0xbe, 0xd3, 0xb1, 0x7b, 0x72, 0x66, 0xa4, - 0xa3, 0xbb, 0x86, 0xda, 0x7e, 0xba, 0x80, 0xb1, - 0x01, 0xe1, 0x5c, 0xb7, 0x9d, 0xe9, 0xa2, 0x07, - 0x85, 0x2c, 0xf9, 0x12, 0x49, 0xef, 0x48, 0x06, - 0x19, 0xff, 0x2a, 0xf8, 0xca, 0xbc, 0xa8, 0x31, - 0x25, 0xd1, 0xfa, 0xa9, 0x4c, 0xbb, 0x0a, 0x03, - 0xa9, 0x06, 0xf6, 0x83, 0xb3, 0xf4, 0x7a, 0x97, - 0xc8, 0x71, 0xfd, 0x51, 0x3e, 0x51, 0x0a, 0x7a, - 0x25, 0xf2, 0x83, 0xb1, 0x96, 0x07, 0x57, 0x78, - 0x49, 0x61, 0x52, 0xa9, 0x1c, 0x2b, 0xf9, 0xda, - 0x76, 0xeb, 0xe0, 0x89, 0xf4, 0x65, 0x48, 0x77, - 0xf2, 0xd5, 0x86, 0xae, 0x71, 0x49, 0xc4, 0x06, - 0xe6, 0x63, 0xea, 0xde, 0xb2, 0xb5, 0xc7, 0xe8, - 0x24, 0x29, 0xb9, 0xe8, 0xcb, 0x48, 0x34, 0xc8, - 0x34, 0x64, 0xf0, 0x79, 0x99, 0x53, 0x32, 0xe4, - 0xb3, 0xc8, 0xf5, 0xa7, 0x2b, 0xb4, 0xb8, 0xc6, - 0xf7, 0x4b, 0x0d, 0x45, 0xdc, 0x6c, 0x1f, 0x79, - 0x95, 0x2c, 0x0b, 0x74, 0x20, 0xdf, 0x52, 0x5e, - 0x37, 0xc1, 0x53, 0x77, 0xb5, 0xf0, 0x98, 0x43, - 0x19, 0xc3, 0x99, 0x39, 0x21, 0xe5, 0xcc, 0xd9, - 0x7e, 0x09, 0x75, 0x92, 0x06, 0x45, 0x30, 0xd3, - 0x3d, 0xe3, 0xaf, 0xad, 0x57, 0x33, 0xcb, 0xe7, - 0x70, 0x3c, 0x52, 0x96, 0x26, 0x3f, 0x77, 0x34, - 0x2e, 0xfb, 0xf5, 0xa0, 0x47, 0x55, 0xb0, 0xb3, - 0xc9, 0x97, 0xc4, 0x32, 0x84, 0x63, 0xe8, 0x4c, - 0xaa, 0x2d, 0xe3, 0xff, 0xdc, 0xd2, 0x97, 0xba, - 0xaa, 0xac, 0xd7, 0xae, 0x64, 0x6e, 0x44, 0xb5, - 0xc0, 0xf1, 0x60, 0x44, 0xdf, 0x38, 0xfa, 0xbd, - 0x29, 0x6a, 0x47, 0xb3, 0xa8, 0x38, 0xa9, 0x13, - 0x98, 0x2f, 0xb2, 0xe3, 0x70, 0xc0, 0x78, 0xed, - 0xb0, 0x42, 0xc8, 0x4d, 0xb3, 0x4c, 0xe3, 0x6b, - 0x46, 0xcc, 0xb7, 0x64, 0x60, 0xa6, 0x90, 0xcc, - 0x86, 0xc3, 0x02, 0x45, 0x7d, 0xd1, 0xcd, 0xe1, - 0x97, 0xec, 0x80, 0x75, 0xe8, 0x2b, 0x39, 0x3d, - 0x54, 0x20, 0x75, 0x13, 0x4e, 0x2a, 0x17, 0xee, - 0x70, 0xa5, 0xe1, 0x87, 0x07, 0x5d, 0x03, 0xae, - 0x3c, 0x85, 0x3c, 0xff, 0x60, 0x72, 0x9b, 0xa4, - 0x00, 0x00, 0x00, 0x05, 0x4d, 0xe1, 0xf6, 0x96, - 0x5b, 0xda, 0xbc, 0x67, 0x6c, 0x5a, 0x4d, 0xc7, - 0xc3, 0x5f, 0x97, 0xf8, 0x2c, 0xb0, 0xe3, 0x1c, - 0x68, 0xd0, 0x4f, 0x1d, 0xad, 0x96, 0x31, 0x4f, - 0xf0, 0x9e, 0x6b, 0x3d, 0xe9, 0x6a, 0xee, 0xe3, - 0x00, 0xd1, 0xf6, 0x8b, 0xf1, 0xbc, 0xa9, 0xfc, - 0x58, 0xe4, 0x03, 0x23, 0x36, 0xcd, 0x81, 0x9a, - 0xaf, 0x57, 0x87, 0x44, 0xe5, 0x0d, 0x13, 0x57, - 0xa0, 0xe4, 0x28, 0x67, 0x04, 0xd3, 0x41, 0xaa, - 0x0a, 0x33, 0x7b, 0x19, 0xfe, 0x4b, 0xc4, 0x3c, - 0x2e, 0x79, 0x96, 0x4d, 0x4f, 0x35, 0x10, 0x89, - 0xf2, 0xe0, 0xe4, 0x1c, 0x7c, 0x43, 0xae, 0x0d, - 0x49, 0xe7, 0xf4, 0x04, 0xb0, 0xf7, 0x5b, 0xe8, - 0x0e, 0xa3, 0xaf, 0x09, 0x8c, 0x97, 0x52, 0x42, - 0x0a, 0x8a, 0xc0, 0xea, 0x2b, 0xbb, 0x1f, 0x4e, - 0xeb, 0xa0, 0x52, 0x38, 0xae, 0xf0, 0xd8, 0xce, - 0x63, 0xf0, 0xc6, 0xe5, 0xe4, 0x04, 0x1d, 0x95, - 0x39, 0x8a, 0x6f, 0x7f, 0x3e, 0x0e, 0xe9, 0x7c, - 0xc1, 0x59, 0x18, 0x49, 0xd4, 0xed, 0x23, 0x63, - 0x38, 0xb1, 0x47, 0xab, 0xde, 0x9f, 0x51, 0xef, - 0x9f, 0xd4, 0xe1, 0xc1, - }; - - OQS_SIG_STFL *sig = NULL; - sig = OQS_SIG_STFL_new("LMS_SHA256_H10_W4"); - if (sig == NULL) { - fprintf(stderr, "ERROR: OQS_SIG_STFL_new failed, Test vector 2.\n"); - goto err; - } - - rc = OQS_SIG_STFL_verify(sig, message, sizeof(message), signature, sizeof (signature), public_key); - if (rc != OQS_SUCCESS) { - fprintf(stderr, "ERROR: Test Vector 2 Verify failed\n"); - } -err: - OQS_SIG_STFL_free(sig); - return rc; -} - - -static OQS_STATUS test_testvector(void) { - OQS_STATUS rc, rc_1; - rc = test_testvector_1(); - rc_1 = test_testvector_2(); - if ((rc != OQS_SUCCESS) || (rc_1 != OQS_SUCCESS)) { - fprintf(stderr, "ERROR: Test Vector 2 Verify failed\n"); - return OQS_ERROR; - } - return rc; -} - #ifdef OQS_ENABLE_TEST_CONSTANT_TIME static void TEST_SIG_STFL_randombytes(uint8_t *random_array, size_t bytes_to_read) { // We can't make direct calls to the system randombytes on some platforms, @@ -1943,18 +1002,6 @@ int main(int argc, char **argv) { const char *alg_name = argv[1]; const char *katfile = argv[2]; - if (0 == strcasecmp(alg_name, "lms_test_vector")) { - OQS_STATUS rc = test_testvector(); - OQS_destroy(); - if (rc != OQS_SUCCESS) { - printf("Stateful signature algorithm vector test FAILED!\n"); - return EXIT_FAILURE; - } else { - printf("Stateful signature algorithm vector test passed!\n"); - return EXIT_SUCCESS; - } - } - if (!OQS_SIG_STFL_alg_is_enabled(alg_name)) { printf("Stateful signature algorithm %s not enabled!\n", alg_name); OQS_destroy();