Skip to content

Commit

Permalink
Added 2-Level LMS Variants. Updated test vector format per code revie…
Browse files Browse the repository at this point in the history
…w comments. Updated tests accordingly.
  • Loading branch information
ashman-p committed Dec 8, 2023
1 parent af5485f commit d82cfd7
Show file tree
Hide file tree
Showing 9 changed files with 280 additions and 959 deletions.
82 changes: 82 additions & 0 deletions src/sig_stfl/lms/sig_stfl_lms.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
26 changes: 25 additions & 1 deletion src/sig_stfl/lms/sig_stfl_lms.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand Down
7 changes: 7 additions & 0 deletions src/sig_stfl/lms/sig_stfl_lms_functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
11 changes: 9 additions & 2 deletions src/sig_stfl/sig_stfl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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)) {
Expand Down
5 changes: 4 additions & 1 deletion src/sig_stfl/sig_stfl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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 */
Expand Down
15 changes: 15 additions & 0 deletions tests/KATs/sig_stfl/lms/LMS_SHA256_H10_W4_H5_W8_verify.req
Original file line number Diff line number Diff line change
@@ -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

Loading

0 comments on commit d82cfd7

Please sign in to comment.