commit 30944b3aade937c10f3ece555c982a4f1fb85a34
parent 5c310fb56f6a605581274343714bb3fd9bf00cee
Author: Jared Tobin <jared@jtobin.io>
Date: Fri, 10 Jan 2025 14:55:28 +0400
test: add suite
Diffstat:
5 files changed, 2493 insertions(+), 2 deletions(-)
diff --git a/etc/hkdf_sha256_test.json b/etc/hkdf_sha256_test.json
@@ -0,0 +1,1201 @@
+{
+ "algorithm" : "HKDF-SHA-256",
+ "schema" : "hkdf_test_schema.json",
+ "generatorVersion" : "0.9",
+ "numberOfTests" : 86,
+ "header" : [
+ "Test vector of type HkdfTest are intended for the verification of HKDF."
+ ],
+ "notes" : {
+ "EmptySalt" : {
+ "bugType" : "FUNCTIONALITY",
+ "description" : "An empty salt is a valid input for HKDF. It is equivalent to a salt with n zero bytes, where n is the size of the underlying hash function."
+ },
+ "MaximalOutputSize" : {
+ "bugType" : "EDGE_CASE",
+ "description" : "The test vector contains an output with maximal output size."
+ },
+ "Normal" : {
+ "bugType" : "BASIC",
+ "description" : "The test vector contains a pseudorandomly generated, valid test case. Implementations are expected to pass this test."
+ },
+ "OutputCollision" : {
+ "bugType" : "FUNCTIONALITY",
+ "description" : "HKDF can generate identical output for distinct inputs. This happens because the underlying HMAC extends or hashes some inputs. This test vector contains some HKDF inputs that gives the same output as some other test vector.",
+ "effect" : "HKDF should not be used with variable length user defined salt."
+ },
+ "SizeTooLarge" : {
+ "bugType" : "MISSING_STEP",
+ "description" : "The output size of HKDF is limited to 255*size of the hash digest.",
+ "effect" : "Computing outputs with a size larger than the limit allows to find colliding outputs."
+ }
+ },
+ "testGroups" : [
+ {
+ "type" : "HkdfTest",
+ "keySize" : 176,
+ "tests" : [
+ {
+ "tcId" : 1,
+ "comment" : "RFC 5869",
+ "flags" : [],
+ "ikm" : "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
+ "salt" : "000102030405060708090a0b0c",
+ "info" : "f0f1f2f3f4f5f6f7f8f9",
+ "size" : 42,
+ "okm" : "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 2,
+ "comment" : "RFC 5869",
+ "flags" : [
+ "EmptySalt"
+ ],
+ "ikm" : "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
+ "salt" : "",
+ "info" : "",
+ "size" : 42,
+ "okm" : "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8",
+ "result" : "valid"
+ }
+ ]
+ },
+ {
+ "type" : "HkdfTest",
+ "keySize" : 640,
+ "tests" : [
+ {
+ "tcId" : 3,
+ "comment" : "RFC 5869",
+ "flags" : [],
+ "ikm" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
+ "salt" : "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
+ "info" : "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+ "size" : 82,
+ "okm" : "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87",
+ "result" : "valid"
+ }
+ ]
+ },
+ {
+ "type" : "HkdfTest",
+ "keySize" : 128,
+ "tests" : [
+ {
+ "tcId" : 4,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "24aeff2645e3e0f5494a9a102778c43a",
+ "salt" : "",
+ "info" : "",
+ "size" : 20,
+ "okm" : "d4cca5e416c3d9eb58bd562e922691daff76aa4d",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 5,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "a23632e18ec76b59b1c87008da3f8a7e",
+ "salt" : "",
+ "info" : "",
+ "size" : 42,
+ "okm" : "976d1590926ac35e28d7f1a29fe98a1f787703a71cee3cb2c10acb9cc1b56c0f21b55d5de37755a79b12",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 6,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "a4748031a14d3e6aafe42aa20c568f5f",
+ "salt" : "",
+ "info" : "",
+ "size" : 64,
+ "okm" : "03f5db41f4484ec9468648c9f2a7f73ec18386008691b0555a7eec165e2f8cc72a6e74fffafbfb1ead00a89ff80ba00a266a70fcac07364110c6f5707f5096aa",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 7,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "06eb26f8ccf28580c8f28d5b4dc47a49",
+ "salt" : "",
+ "info" : "d5f081e81e8cf9ded199f3ae43c80a2dfe3d9cf2",
+ "size" : 20,
+ "okm" : "ae538577a14df1ab170ec01a9ceceabcebdd584f",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 8,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "c181696a19ab1a32eb6e81b2925d8990",
+ "salt" : "",
+ "info" : "d8c8de92fe5422c9825996354db1821ba43a81ac",
+ "size" : 42,
+ "okm" : "151ee737f049d18cdeb3010a0fbb606461875b22ac76487874498808248cf607e1cf7f3fc52b3a28ac64",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 9,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "55fb6dcc7802354e55a45a6e41858c05",
+ "salt" : "",
+ "info" : "dcd590e418b259c64fb9e139b3a1280d5de8400b",
+ "size" : 64,
+ "okm" : "6ca91e1a6c0eb286d6fea277e9936f2486104c4c5d473a92872009f04aa545a61d03d83e14aa0965ba355551b93073ef91382c88afad091c62f6f65188f789e3",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 10,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "c27718560fae2515acb17a874991d357",
+ "salt" : "4487f538b65c9058625057b4bbdd93e7",
+ "info" : "",
+ "size" : 20,
+ "okm" : "19eb8ba1cc7e10498d8c3b3256f66d6ee6b2296f",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 11,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "be0df9811ad0bf3b08358a3dc4a05981",
+ "salt" : "c98618bfeb59295f8bf1dd3804b1bf2c",
+ "info" : "",
+ "size" : 42,
+ "okm" : "669feffebbdfaabc85fc006766c596a62a04a31ff959e1608e4aecb090126738bdaeae5997c4444fc4f3",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 12,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "529e91a61895f1c4ceb5b6994f48783b",
+ "salt" : "12e4ae515328983bab2d88da3cb32a95",
+ "info" : "",
+ "size" : 64,
+ "okm" : "76ced999f5f885f9df7d78a9cb0cefd09904bc90dfedd018441f30800a848140f6a4fa057170df6cf33e93aaaa10ccdb09bd114e6f4058ca45b3cb1e453804ad",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 13,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "c360e16084cfd13cb44b0dc02d8665de",
+ "salt" : "685ac7df93701d6c78babd847861bb3c",
+ "info" : "e0ddfaaaa7afb53f59a007a205c7149b5b5a72be",
+ "size" : 20,
+ "okm" : "506669208fcfd6d27336099b6551c683f4f2eba2",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 14,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "0cbd136d66d15a4ffefde1303b430821",
+ "salt" : "2614d80275b08a1cf90bae0eb607d4d5",
+ "info" : "ee991de21aeb6baa6a5f683dbb755e6f80db1c1d",
+ "size" : 42,
+ "okm" : "4d534f8c2193b375589e5223fe65b926359b285df968bf5c55d76f4a7cf9b0065687a40d58c820d7edc3",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 15,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "7a00817689a3d79001825a864c69c120",
+ "salt" : "08bc01c053a6406c7c4a667c9b9b3894",
+ "info" : "967ccd75395be6e96a67759f070487c9e2107791",
+ "size" : 64,
+ "okm" : "75f86fe05c43964bafd75bbfda18333abac649b8607e953826c2bad8d594621d9615521b2f4d56f63a185dd0670af7163fa96ea2dec620516158946ee83071b9",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 16,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "d003dd047181bd66420b529c78aaee1b",
+ "salt" : "5a2737f637eb905ba5a480d51a721c012f3ff9701d9c4fa1424f1f5f540f",
+ "info" : "",
+ "size" : 20,
+ "okm" : "97a651d4686f4ecc414b58bbd841a4ec99a5964c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 17,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "75d085427d397b263fb3c6c8e0c40b6f",
+ "salt" : "e2141b0dc65348632396a25c6d7b6ffabf55686532544c351860635b7c86",
+ "info" : "",
+ "size" : 42,
+ "okm" : "da0a91fe3a9fdf82a3461a78e09310ebb8908072b14b6abddbd3ef2517ebf5e513e31e3cea0728156674",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 18,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "63984079a2540d0bba5d2700642104c6",
+ "salt" : "70b2a476c9a80e52352b503901a7afea41c186bdc872d5053448769299e8",
+ "info" : "",
+ "size" : 64,
+ "okm" : "c2286fac021dfcc312b73a10c6d48207698a52d48d7be3acca409c258f06b26b1f183ab630f596df1af56e05638a8a98ec425ca6c74945ebc70fb5c7d2b983ab",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 19,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "ef7c6fecad5a8674b65b78c1d696d9a0",
+ "salt" : "ee9d00f7d448d4b3a206bd7e7fb8a9a6564ca80c9e0eb6ef61a4933c157c",
+ "info" : "35054b8177e4ee42e4e51bf60e91c3f56dcbaa12",
+ "size" : 20,
+ "okm" : "749f184d9abd79f6e598611f9b2ec99b0f93a7f6",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 20,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "f403b6c59bdb751b3f7b9c97fae5226f",
+ "salt" : "9139e549297ee26eae5afea7ee012e683cd7e59b5b8966f55f6d18ded11c",
+ "info" : "27d06c3a2fdb5c97de4506e1bc1311991660c5f5",
+ "size" : 42,
+ "okm" : "e2e5e996acd41c4e7f0a0caf8392f0fa591d2f0850f24a76e3413ac6d7c3728d964712406c0a500daba5",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 21,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "d515f58eed428b2bac233c8538580e2f",
+ "salt" : "c2a3ad9db6621fceb7498c0e6287522077acd2d47b55c09d52e114943b37",
+ "info" : "14de8cffd89e49275f69d2e1e6b43fa0c3775451",
+ "size" : 64,
+ "okm" : "91ca35a68bc0151a02c5c432f180d21f331cc4e9ba15d8b7475d775a5a30f6b3d9b8b22c318abdd07b93affad1ed61b8bb00af46cc0ef9dd750fc1919385bb4a",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 22,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "df27ab960ad87bfe2e173a4659e3546b",
+ "salt" : "1e7ec49981fd4b0b7c20dd4dd5bdfbf2195e707f4d0354611b4893b8a86f61467aca2cf726ccc3ef0b0b4f3240d945ce506197e2be00322b17b48209c312ef9f",
+ "info" : "",
+ "size" : 42,
+ "okm" : "c298d3a916ac11c05069b613748b6a7fcb8770bba0798e2bbb531359053f84fe191ac98c8af0b72c875e",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 23,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "24a37db03dbcffbe9e28d582d0d8c60a",
+ "salt" : "4c3d3b4f5436418713fbe2fbc4d647095ce5d5392dcfffd20327187e14fb68360b94c5122203292d8b648a754ab70f6d3d61e0650f06d55c4b5762cba0231e27",
+ "info" : "8cd9e7b786a74bd370bae434e31a559bdf75d65f",
+ "size" : 42,
+ "okm" : "c5c5feec3ad95581ce00a27f8c79783401d455b056196dc072ad2cfd389da72a06d87d431f56978a37c4",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 24,
+ "comment" : "maximal output size",
+ "flags" : [
+ "MaximalOutputSize"
+ ],
+ "ikm" : "91556a70e96dccb6a2fbee28250bdbd5",
+ "salt" : "ccdc54836e6046d5c851f917c37b0baeabd225e996b8f71d452cff5036345c3e",
+ "info" : "2b90f142b2310b23",
+ "size" : 8160,
+ "okm" : "02382e3c9b2e8010bc3b63c6bb4960afd90af438735320bec0a4c626c0d49165148cfa5a1ec6b3ba5179aa40f52221821df58fdc43d858f06364de72a5bdffa98239e1d4506c0188347561ad59e61fc8721705710c6b5b6de3d46842b8093ef97b23981b8bd38379d82228fd2c056e20d062cacad2f859d3f9ece350c35c23aeab1aae00c074d5ed885578ff8ddcd95409f9a692521d9b2119b38d3a88349ca405ccdc131528d7ecd8c32f81f5a1021dff2a4d6a1f99c3c0ef152ab12267895510b1c8d444971e6b300bbba402d56ab1f85b4144af990da2e91fb8d0f55039510c636ec56ebb66253b1fd0abd7487f2683e6670ea0ddd07a2631900d9cebf51ded064ea23f9a73c85f889eb2d5c3d3cc73583faeae826ce0173779c7dd3051b7f50d4bcf01895140492dabc27ff844ea1a08db8b46148f435d08af0bb680d2a4e9650a03400a0f66aaf2dab5a0c3685c465360ef02a24dfa3e4392d0153c21352ad39374575f417ac7eaab154603033b7ebde80d21af2a6edf90e70a7d0d9ec812a62e54b8fe502f514513f009b9457723881e5d4cd9e17bcbfbb4b522a76a8c59c47e409b747a10b8db9b727b1e05e98c335c68294e2ae9f9b28e7f1f54daace64175b8d33d897c100199e3b5f7572fd97c26fe16315a6af9fa171cd971beaacd56703396dcd442637c53f75667768c829776285372e7a800631d06e6e6073e144c9cb4badf08e4b496d8306e46e2703e79ee2b106fdb45e18cbb634de037261250a9c55f80ce79852322f08d1085bc6d122b87910868bf51b96aba68b8cab868d6e19744abd63453d591ea1b44ed968b30a113dcd833257d3069d16929643a317b6b715e73e7b127f6c24f3e9302624f4d9b86c46ea4ee4ad0a8b0c76429bc73cc979ab3931b1040bbb541db75043ea4aa1e01d5558482f14a3d637ca8510ab729fc2441d41b79f5a6576a05947cdacb61b7d2103259de2aebd32a8b0112c769dde97986e5daa5390b74a625389d56d9fed11f675ece43fc833539383a41bd1fae72183cf6097208b5fd227729a588d4a785632f78a69a06bdd53ffe99d3c2183469e5456014cba78c57635c12d1710d88552333a4ab49c0c36427a7dc689a2417e8622af72bb9bd94ce47c507b44927956c526bfd740e20d040e20a1fcc62a6dd91744ee2285b365447a57745edb10f245d736fbef5df3b03fdaff8ee2c8e314e73c96f886e7e161dc788c56b70bd48e5601f2646e8093acbd3d2c1032b00c4527b101a1bad126c8fc080e7a1ba8a5bff3b2d1e3637f0880a6419981ab06bd2f0f8096427fa1dd9dc58b8147d6b76174639a3d5ef81423cbefb5b729b15a621c8941dcd2d609e5e7ca6e4556d2d4c61816a7fd46875da38011be5b2e27ac0f4feec84a78b049701ca498205dbc97e31953e6432756b62bf2a3408a173bf38bb370e79327644c5842f6f91e29773069c2b504049187a95bf068261d29c66fbe9878826aadbbd773ed273e20a1eb9ed51081bc5f51fdcb4d75aaece54f8b2a3882a04377b1167c904355c1b97f2fc18a2c0b28f67a313885c92e22031dc9120850f70df7edd4481b2c6175a440c0a2edd78292376494e8155e3b37fe8888b90143dbb54abba6745031b8be366d3c43380f8319f30fc3505383d012a80eb1e818ac7cd59e0e2e19d50ffe2f6c5d75db18ba433d3345f1e42fa2cf4a8858580a0c3be11d72014fe2c02850204f62a49183741510d2dba9a717af10f259ed0e2f991382ddc93b03947e4cdaf4e84305b7e791cc17c97d2e14dc57a553546eea36c970ebf876c82585fcc0d35350b1a13b23722c27000d402f4a267ffa18f977b3fa63e43061bb672f5824f4ea7462df50aaf431b0e00ab7ce101ee0a37e4a3ea15834cd480efa0b19fd865094902d2f2fad24f9de307fe79b2a497117cbfb9cbe71ba8a7a7fb5fa4c6b81ffe03fc557ad29c1e9dbe3cadda4e948e1eddecaa9f364ad9f17a5cb33d5b6a1c6075b086c54dfda5c4a7edb7f7b57c7150540dd399bd3fc20ae5ff66462b37cee52a7577ebbb5ed75aba0b6a1708127907310345c609fa17596970342f618345678a32aea127a25b86effe0e574a849b92c780b38216fd2003a79cd596567eaeeed166cf6b1ce79e9197e7f5bc4c9acf2a6b02101d03fd5cb9c9fc129988d646cfad81680cf951635e5e40324569eaef11e14d30d38e36e112852fba785d8f3b8d9ba6fcb769cf61f66278b38771341376ca730c4a0bdc871804387a372aac95ae945b493b26e39dc0ea61a945969ce1958bcda069f3bc6c9a2541482a39b8370f428101890393c96167c1d3c600e9855885c672fb9f896212ec295d9658ae16f0afc16878be9c88d54d28f1fef808486712b9ca6cbe5b5f88e855c50813a560f97112a10549eb98cb7a9f65748bf7d782e5b911abfa54fcd1f83c4aad96dc9c3dc645f85466faf952bb6d7786db934fcf2cfc412c41829e20014ed41c5c6205b124ed3dadbbb34dcf2e98b9020e6b52d925df60e75d6a22027018abeddb08c6c270f67cfa0aea304992554403f27ee8f6736485aaa7bc559f05c5769d43f53b91690f3c7204ae1f5b5a02251000dd974a606e5901c80492a56a05aa47b785dbb4a08e22c17030aaa912df3598ee6c669eb5dd4a07a73147a0fcd626cad9c4f81ed8b5f509020ffd5e3acac0a5a32ee5c025b860de51ce2551daeddd93ffc6e63f0cd53f0f383637bb07960368cb65d1188cc08bfa7aab710b8ae0b95a6b875889a2cfb8ade278c086c4cf3531c162704e82b599b94e3c94bc76abd2a946d80fe088550fe3f7939e487dd23d3f375013e5d4dc75592906107f74b7e930a4acff7deda023b85f3c380e7426047d3d93db3bcd647acbc62deba385a88e84c8e800db4b7f937f3282b8bf948140bfe866495d87663a70378932f4c17a258cd34501beedd6171674e640b775f9b08afd9561995e46a8d38123232d7071c3ef87d75d2c2b6bccc203f81e3e8174332cccc48aa6543e7754fd8b5b5acf0e77c69b696681bbdb0d7e73995d5ded1b51f5b0f2dcc0b8edfe93f533b443df0a5b8ea5e78b23ebe6b8281877767795b61ad86b759f24d4c81734803e35d2df1cd526147b42234220134507cc1087fa577fe9287c4817e0d03bd6607decf083013d7dd9012b26bc4400722cb1211ddf5966ac338ea6028a7cfc60c738a9c5faa4783f599d575a288af3e34a943c220075140b85a365290399dbc8490fd88b51a620495e4fa7691e15de744e5c88c9e3aec95153b05d46c8f93e5fbd38a470d3ae6c9aaace2d9755abee3d942d86c9df2c8fa82b5a0de576f790aa653b05862a563a5477cc467d8cb19ef5eea82b9dd0ded0cb150cd081c0c0f564ee988c8c22ccdc1006875e64c41736240e2048514d5f67838549275b220349e1c9a9653c48d51ffcb523c04b5f4ca56b0c2798bee555f1c281318957ffad069c03c58e75eff4e36c3775c33b66d5898ebd48836766a4716761d87fdb8f0733a2a82ac869f949685b4cf82c363693a651e637e928f5f38a16c9a54632617c62be7b04f43eab0b304e7fcee0d4e61dc9155f26e35f632ae8d70b106914fe0bea6c85be1e36f9a839aa769a6eba44035000a69689f8e87656c2240eacace69b579784ff90fe8cb43910de14cb96572f1c8397ee66419e79b5d7f558902fe763ec021d97ec42795fe3442e7b821b1d6a4c0802777d82adbc7d2fa0e21bfa3011b98ba75d1dee8915eb6ea89ad4045879d40a6da786b9dd8285372e31debf85199fc7278aa312ed40de5db24671d01c428ffa1052236a4d7a1b220905c34bbfc8bf3541f743cfb115448b482f2612d3527c4f5d34a0aa1fbb70472fab837c013b0e83d4d32e74233a362226e166f53e78d4ddb241cc1b4e6077716ce087589821baa6a06455a23091a7cf20db11a2cade09bd6874dc13f6b09f73014f11daa989d0c0733851fc534fac90fd29f42583070b2af6a0e156dbf5111ce964f7b913b060691620f85d0dd12277a08d3a57dee07e9fe96d73b38df82ec439784ea64f23260347b77cf914c8a788fca4f818fce6857c7664439a50852244c4b75b1ecf6a8f831dc853a9c343fcccaad49aef231ff57c7a88ccca51730ff9d0586ea733c02e249e8d9495ef923aa733378529ba323d403adc34e2e9126e6fe209ce54dc7ce9bc0cf7775c595864ca492e585866acda45eccdae4cccde9d11c2eff9628dbfcf74e5c1956cb4a22874e07b510e7ae1886cc00a05f0f8a5aebbe1d4a265498e2cfa409f7b49ab5cdc115109a8a8260238a37bdef5d61ccab4df03bfc456b089e3c3565731c7a2364d482c3bebc3d397fc9637017c4153490ade8e60415878f933ddd55a792a1e3b8b39e8dd54057b4d5f3017771a3bb4f0ca2d888903d579af41da7ff6318f184f0e7d7335a9a6c0a3f19510d01221e1d91fecd9efbbc50e51f58d90bda49de14e595b2f4b41fecf3cf576669530d9f149a3ca586ddc08660a450da133298086dec6a170544117fba27726578dd6d83ebe2b6d4633965e738eb9595b7d1ac3e06689189ad8ffd561fb3ad8c5b4f2718770b4732b75dcc1abbe6fd8b3456e1cdf1e1ff15943da73354bc1e74bc4941ef78a5c9d6eec2fdb41658af215377488328b770919f24be34767e2daa245cc1944594d80732884a40a41377de2512ba90ed8796eecfa71cd57ee3dc6ff223601aad26bd693a41fb4d00062866bab3ab3f2c2ec0702b2049ffe32a74bfd5e3dca22870ac4768514a01e62767fb1ee3743cdfcc26e0106718d638f682b691b9f1eb9b53b3c0c06cddd126887f9849d298918b01e21da76f7161e2b0ad72fd00a84aa1ca64d7ce32120ac93c1c1ed2fde1d0dce0e6733aab7c0908dccd8fc65050d6059450a484b5d8c72b73b700093dced0ebb8d3acf151c3ca094821bf4ce987d530dccd8c823e881a9edb9368be0943d3afe338560493b9c5f674fe69a27e8a45992bf8af5386e3a7eb81caf9c0d3a45f72fa457ff29b5235f945307dda9acba65d6267408dcdc288c08653e6195ef98c7d532d49daf16e6008178a1539204a549a14d0a3fe5812b5b168ffe47dd9ca35f3b0d4e249a1bfc8f7f1a17b9515ab9ed1038de64098c5d960a7b32e4794711ea2e3e4a2bc81ec1dc05f829fd9e7903b0bf93eb4db42ca55cb26b41fec6af223c219ce88cf7d62b60063a2f842f79ad512f2874746e97f1b742dfa39e7df19b8c348747cd9c68fbaf010c3869500634371d8a8af6f039e902b7c90a356b4c4056d4e8b3098b69ecad5fc42155052b95dc8ac339b79dac22196220e5d96d5fa16213f8b072ec2c777678e898326680225c7014fdf174c75de61ddd6a28bf018e0ac1c6647956aa7cfea6d9d09a31a53906e9488a15182d55bc636c42f26ff51e5b3932d054be251a26db4fa8e9f6f8c34c9422d171a3a5bf82c7f09e2c7c246c0b75445e2a8463f12bfaaf7dfca3201889182f5f9e7e3758b5b1d54457c1688b59fce9dfdc28c0398fc624ccd6c3473d8367c177bc0281ea1b56ef3d9af546c9cb7a1c108169d701d3da593e97cb923da181fe57ba22fdb03570b6b9a8ac65ff81665b484810abe0ded0b4c394cfb122fbc240dbaa4fa9baeb761b2d563d916c563129e289a41cec25d1bfb2c1900a9916453dc3b8b69ddf998eef9f910a6efdb9614a655eb3aeaa8951e1ea968807a4e1d77fb2d2c4d3141e4718ca46865bf717767a5f4a891b3b69a4e9757c87b76e9bb886d03f693f3ebd1a9cd600e7180909312e6226dbb39917a1feab50dd1b03f87630c731ee30af7f590accdcff720aa5204ad8961d29a916ba394cd1f14d23d38352232ab7408058a7e3d9d4cdd96969fba8b3f616ec2b38cf55648a508bfb9616530501ab4eec82bdcaf7db22928d95d96f902e79d89c5ff535166123121d9fb0b547188be81a62346b34a48499b4713a2a6121a75bedf0946b52086ffc14f71cb4221e161f1c2ce9ed29394b07c3d6996066298e4d7094cd39c309c7db90981a816fea28abd5eff4df87e7c7ce3926d213046c3c62a050d59991e53c522fdb1e382fc8517e43088a12adfcfa6e62c86a23cdc5beb0f0f5311e77eb49e4fa36832e2cde0def6150ce1231439b377a7c47848594be9609c4af26b490d0d679c6032dcfbcd75b93b3fe9c41cf6f55b8a03a72f3b95a2b534cbb143b5c8a020d4637bf9671165169148c5027ec2999b0577f559dea5973c4e91b38a52e3dbbeb9ab1838b5719bb3ce4b063baab95155e7d3e0b93b4695fe83277b243792776205afb1df7f07914b3d6be86648fb4856662f792dda24a413c0c4d0d0a9b42faaf11fdf2294fd42c20cb56febdb0883620a7ac30c632f82e22d88eaa001ad9f6d47bcec18c70073deacf50ea289daafa794fb9730058ad3ff2e0d7e7a78d1bb2258cf23acde01f1ec9b820f0d77f7157c69e8d31859804eb65e352635416dd41879788282e55494cac7b26ad45f8be1c75bafe65847f914abcc1565ec876143ab46c829914a7d3ba1c3f4a10b51443e9fca59eb097f3f38d7ecfea7372f0cb29d6bb9f12d4dc0a4838a78fcb659cfd8b22a39067675ef5ddea48d180b6a0228fae606e9dd8403268c545c8c1c662755e428b622ecf4a7ce5e2def1d6babe5fce90108b615772b9738341ed25ee8d8544ee932289dfe28c38eac7a6c125d1aefb228c7aac93fee876541d6ea80cd262250cec3245e0dc4824544748146848c2c85527a22df973fce469ce922493d56e8c98df543d9b605c1dbac078672cb5f21d35cee06e378e8fc34637227f8c6f9a638047ab11b01edd4d381c8165ef9b805997cb87ef78b608d77b7a11d609781883e8d66e249a0e7bb769ad2fc455efa4338cb2b6fbcabe7cee7406db26ef403de76f21ad990bea3fc2bce220e3b50010c8c6d4f1bb66bb0afd3e1a6f245d08341a43fabf774e84b37c07448a7d5fda2f7a4cfe8ba21befc7f19286803c83bd5b6321023f9ac95fdd97671247666f2f7330f848dba95c3f025d30dbe4ec9741430a797c3c7f1ee7675eee7198b7eb6b9d87350d3b35d73ecfe4b1f119edc7cce1611476e31302d8a800cd2f2d9a21c6e50979a949552d886f75e47778664c7170d45d90689b94be41ea2eb9f226dadc9bbb1fd4d85f529b29e4d6d5b2622cf265b9f5d0f47faa4b1d27a652a533bff74d1e8f7a1b6a139a4ae6e600d2995ed4c2227d2f561f6390de943a167974e2202835536cdea8d61d2d72f0cd86283aaa8fa92d299dd82b6767aa02c79483817f6bb4ae2191da4f0ca03c2d1c05df735ea1fd1bde1cf34822ff2bde5d255ace9196aaee54e7c49923d25d81c5b820cba505bfa6d8bca7de0c2f3161f670ac1fc2e7ce869f9ca1629437c0306c0aadb88683409595be86682768a572f72870a98e32dba3f517ddeb1eb597035ab7cbd649a42f500aa313373986889ce6f0d99beee4d68dfd2ea2883c2c4b7871be58ce865808439d98b525e8d67636519955a76dbc17aa895c2c7a38fdddf02e7a97f03c888d3f5ecc7a5c32d7aefec850b910e07d624626109d83ba794ad1b8654dca6614b7bf43423ed376d1a5ed79d7e528751c6ed10cb5e542c5347aa46c4f4a7ff3aebe007a2b53d42ff12a922d6784a6a946dd52f6aafd0eab392975ca5d3be3d9bd582e58fcc16b8657152c68e028886da628ef9c744c697969764a64a05d0a0a8e55886b2960cb921c9d536c83c1680997003cbddab47a301ccacbd4289ca6eeb59bacea831f265d680bdded4016eb686fc3ea1fcf93db54c22b2abd5982c44a1fe4cad353a6bc0bb242089676718fd6b5cfa4bcafe7cce91bbcdeb12cf3c614a823fa59fc9903bc3eda1a8ad2ee8613e1e1c0582e1392738f5a19f0c0d55f985994494c96471358eb0f60ffaaa603d4f421fa1803e8a94a1cc5c24746833c3f5c881f9898f71cedc439c5febb4e27a84d936b9480c97ec2efa691e503dd67f6834a32cc40c3576b96864481add4559d1a12a0648d2b61bcb5dfd97666835ced314d604947ad68c6a50d058199606740567b4d48ba5770023efcf00aeb5529636c62171c851ac4744cd05cda373d09ee343783179476149624c4ad9ebbe4410410eb306c204a2b1a3523709dde477b541fc650dc0b243482bd85f7662819f46d38b7ed16dcd67ed916e05cbd1663920975ac0c94d53a4847d2b88d4852719f656952ce17264523804b916657a97313ef56913a0bbe7855824b64bbe122e163a7b9d1b97c9f89dbe30484636a54facceed2c1edaf340f84be482e0fd4e6313257ae4d20fe03bf27c5aed74849d3a66cb0b42ca9a31f0eaa19afeab5ece71d1fb0bd60cbfc631264fec2fb934db2dd804ad46e098ef56e743d102457f87b8a96c4bc3f2c6248b201b712e5bca6da36d45b1cc89b735059e5806f777e1c909db577265c0714e12bebc5c2d82d60a6e4a4117f835656c2057248d03c378795220b87cb356f53e8c04abe1a9e3b7efeb02013226a1be5209ab676e9a761a87bbee8eccc828981fe4f19340c004eb426302b0e08db57bf13cae8236715bdb6c46a60c55d6c6d88797d0d81a0e77afcecc64f6584381dda23bbc5769e0e562d3449bbd62cec123ec01fa631becd655b0f4d50cddf7d0fbedb1a5dfc88ea69946d760154a8ce86fe6eaaa6c01d80752d61f0f1408a86aec3781c6607d20f84c970cd19625b59e8722111cbede6a9e59b3aa4f003e33c10cf2e1653f8757119085255cb1cf99e8f5b8c5d3f7f8d13eed17ce5d25c58358514d13fc56ab745a11ef8d943ba3a491add9a13d32744db3834f4cf8b05ac5400f5bd5883ab00dbaa894c326a1974b62b130fc23301fb318e925c44e6fc2539a1faf8bd5061e6525b6e9303be34cc652b6e8bdf1976a579b6eeeb4167ed9123df33d0729ecdcd5750d31de128b0b22ee2797a99f21f7da5651e4a9948170864bf4066d3c23ef648f30d420d98259dc52440cf11bd178ae84288f99bcb4eb3e9a51b424d6fbf122ae8c3715092d449b910069545cc66d1fdf1e4d1792976aad5773c9ec6e41161c1a3b3d4fd0618f1223cb12693a837209964c5531d62008f8f7fa5b45889409fe978787bf85aa60ad9a4703ff214cc22e65f4518ee9bad3a2dc7edc2f529d2340e8ea154d464c79a5d7edf3fac8397f852060ca4592eeb2a30399b81744abfa36b297af97d29bbdff730f82fd8ad438254af8f67fbdd7a97e856f42f89518d5c2798a5f8959cdaab6e93010ccb77bcde40b532ce0cceaa6999aafed408fb9d7bbf1d898c9e022079a02cefe8721e7eced2707ed433704c327352079ad2370218c67432bd12c89caf44a3ec28400e87283cab3cc18b37804524a3a0b21dbec2acc8d4a0a722b6c993e1cbc3f889ff0a2fd31c4de3a7a755738e3b5b8147a6b4fc7baf7589c6dc0709803795790512bc606d4fe13e10d03a7a0802bcab7651d84a6826f7061f1a656951f1548c5b0e6ee051fb5fd8f4b21cc5737fc1787be02d28105350d3eb6c8228c6c7f78d9862614420d8ffaef6e04341bd973b7800a17ed6bc34df3dd1ca40ab366f7c7302fef9f3390c74206b7bdf6a375efed4958f3724e08d8cdf30ef6709d5d60b02c39ba30eab540da577abb059185f0f9a8d8a34ae6a33c335befcb9998d4637b78c3673d83f5bd667f8b9946294bbb9880c0d9e0b2333704dc8172fa4d937b059244fba76f1b033e3d73055fd6797219f92dc05122e7b429158d8c4e26bb34dfe668e832a5cabc15f891915f9ca1c6a0539b30e0e57003fa070f34c6fa574fef66d412ac3822953107cd6521e449ba252a6f31555c81077bd32536e742b4a3917b4c16f8356ea0b6ced917635431e57d675c1f259587650b7fb73fc37e5add6ade0268b210378485d7cf40f1aa3cf2e083cf49a2053fe5dfbcb2958d8742984b82354917e6fe70da6725110d2d5d3693812a9c04a0d01113923ba5261de255fee8a841f4231114995c637dcfa60d7bcc5fb2e65221990ad93e6dc9e8f855f7c679ec3f311c021a8437dfc5f36c225ffb412ea9763f52dece4e5d597831670a6079f99c3d09663a55a373bfd0aa16d70d0d6eef337d8783d94af865f5566601ae40eeac62bdfc03ee2382c33ab8d5362e0b445abdb5a649df4d65b247bef5c3a276159db889cc2a54e1b397be2c89a87f1ef73280506dd3fe87a8049471faa0e4732ab93400e706ebdf27a8e4be7c05808f908492af6d668c387ade51b3c81bf0cd545fa31677d26e9d89a746e73170e03c3aa536f9b94f05480dc6bee3003d8cff7cbefddabf76159f1300fc2cff71aa2fc8429ce7d8fb5e3c889108e9278d285b62ea86180d780f06252d5c8ba52d1f3b99b45b6da091b4dd6e6c0be0e43ff47a9707df738b977f7233f0ec40a385b022231ed2d7e8ec9c8bc51c7a72ba566d6a38c0023f97d71fac38c1c47a17fec60573df51bfd3d45dbc84b43aea76b4aa6cb04a3df182cc74e8b5260bc95b2ef4d6e5e8c80f0271cbe464c17d7ad2b2d96c18a606fe5aa72a322f4b3cb568eac98d95772b74495aac28976f45e86360c3751e018b7ec3cac42df6262d40fcf42a64de769c128c3acfe39e205982e04c40ec0f411f785e50935416eb408b3c35fc77b22a61c58e27b4008dfba8170261ead25b590abbee010573bce1637668d27ffa4eed7ff3e6324b3170f8e3eede3fd597cc53140c5c7e3da16e478179e67aabfa780f9c78c81ccd7f112e5680dcd875c4b741fe3a57e169611cccbe79f69ca7e900e5062f3b7b955bed7e889b557ad34eef1152082d6785a4ca339255cf26a0b2984ec929a3c431e3c9b0b060a939f6b218248b1a4369f12c89c1e59a2121b3753add685cba5b323fd7e024a672041e0d8fb8b8887c0ccbba33b1f036435fe0305e2eee475cb47d63bd623d3a8497146b08cee3181b6174fc234072a9eebd01d235de2451bfe40fd78181d00ae21262001ab0db0ba0728a591a6b4ad79ad461b7aed1fbefb2493c913f8ecb9a3dea57ca57a1c411a8e17767299a2583ca2558381ddd3f66f0f6008931a48d7d444b611d3a932f85505f3d57ee8d1433cb72fdb879a9bd24220cc7a8e9b0e50eb929c88ffb1f433ce1096b9050435163ba472f475a89cec4c52572ec765ddf24ad243339ed2c8feff9b697e7eca12a6d92df0afbf1aa2f354ee72d4d639a9135d4d8fc6a7f741d83427ff870fa2e8e364e5bfcb0df4ff82cb5e8cef9d525fabdced294ee8a082f2cee9e7decb2bdfc04f611641a928c3f92192afb21cc29c577e9b0e5797d630e563b4604eb50ef815577ceb627efba9df58c35e01a39f1dbd93cfa558c75c22d750ca5b6573284b33761bd2169f67a36f51eb04fbc72bc3506a3ee5dfc54feb77a3dd1a1a21204b247770e10bb1fab49aa8979655170604046713efc10dc0012f5245bbb3108732ed68bb906d6afdad8664ea8385d929b46cae8029b629383ca4c89a305a6fa73a43d04eace69fc16113418e7fc04efc4c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 25,
+ "comment" : "invalid output size",
+ "flags" : [
+ "SizeTooLarge"
+ ],
+ "ikm" : "db89f54af757f8c7e57248a1718105b1",
+ "salt" : "d5efc88adf3d5afc970284aab51690bdfedfa40be98e374efa3060ccf97fc650",
+ "info" : "134f085797b1ae2e",
+ "size" : 8161,
+ "okm" : "",
+ "result" : "invalid"
+ },
+ {
+ "tcId" : 26,
+ "comment" : "empty salt",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "d04f44faa4542b34f958d8a863801f2c",
+ "salt" : "",
+ "info" : "ff6b5b655cbf2421a66d2f28408395a2ce57264f76bd60befd51cbfd9474faa47a97a9aa0f0e4338635633023cb36da12a3051f1f369355b687304e74c5218b315",
+ "size" : 80,
+ "okm" : "aa235b487116b1c1e2f68c9a557b396a318ea2aa29c0e6a122645918ba693598e40e5b7c73c92f832530db888d4c53fbf73aff67d129a24263134335c9757da6ff7f386c77f830d1bac3409fb3b834be",
+ "result" : "valid"
+ }
+ ]
+ },
+ {
+ "type" : "HkdfTest",
+ "keySize" : 160,
+ "tests" : [
+ {
+ "tcId" : 27,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "fa4f94e9cdbf725c1ee98decddbe42ec06196116",
+ "salt" : "",
+ "info" : "",
+ "size" : 20,
+ "okm" : "f32a552257d372b16c5d8c46e6c07dc9c33be9bc",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 28,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "094db4e2eaae8fc9dca0d9bc14b29387fd476921",
+ "salt" : "",
+ "info" : "",
+ "size" : 42,
+ "okm" : "41ae65892c3359f808e906bbc91c701f7e067b548e685bc02d5badad2799221bf313964f8307670d76a8",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 29,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "bfbe4f1edace02b2a3afcaada5f319103996dec9",
+ "salt" : "",
+ "info" : "",
+ "size" : 64,
+ "okm" : "93c737cdce4fe225839614393bc5ff6fd14390dc436ad6f9e13a7714e8b8b2d66cb690fd9a213c0e297ac96fda5d27e002cfc344964b86e78ff23c260cbcc82e",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 30,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "71220f185f4f2d436fa88b61f7ddf4a10948385e",
+ "salt" : "",
+ "info" : "f392a656590cdd585a06ad4892d2381ad0616a99",
+ "size" : 20,
+ "okm" : "db44f61cc3538799665902ea761be6fea0c51e75",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 31,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "3a0c2c84ea46c152104d794261413412bad2e846",
+ "salt" : "",
+ "info" : "1cf4f37e0cab71a252100a2925a8703231292a7e",
+ "size" : 42,
+ "okm" : "1d4f606b55c6f6fc25d06eadcc86732afeaa281f7cc7acb3efb40eacfb4880d46daef24091045cb16baa",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 32,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "59b7fce05176a56f9b086b2e9e526b4491d05d27",
+ "salt" : "",
+ "info" : "d0e410792d888f355baaae8e17288e982032c231",
+ "size" : 64,
+ "okm" : "df10c40dae8f62e212775e5f19f9769f17ac32abe46aae106a5baa9af3d9c2305376ec0a6f86492219a7d448b518ed08fb6fd6eeb3f964949e164bf8caef03d3",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 33,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "e1dfecb28787a93133763ba4760a55a2c20ab407",
+ "salt" : "0b86a968f9d45bd38ffc2369a92bc66d",
+ "info" : "",
+ "size" : 20,
+ "okm" : "f41d88008ed2ef14699bd6d0bfb19bdade26106d",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 34,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "0941f7af65e6848cc218317a9ec1ecf26d21ae3f",
+ "salt" : "eacad2915534af8106c4abc66970ff0d",
+ "info" : "",
+ "size" : 42,
+ "okm" : "9d28cdd9fcb126c1a70986905403bd7a56b3a9f0d65dd937f2f88e197bc0b5b4ad5ae1ea03f3c3ae8620",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 35,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "1e242658cbd889dcc0096092311e9311b94c5bf6",
+ "salt" : "7318740eb205a76ee4ed0df45d0dac47",
+ "info" : "",
+ "size" : 64,
+ "okm" : "cf3eeeb3570161584596276f10c995b4ad6c5d49436081b2b463be2d57efe9fd9dd76d6f9b9251dfd13dd66ed0c393bcc82ba488b0de8bb4e1af7c51bfe62b39",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 36,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "163f690d4439dbdf6dc57042fecb79354bd3e7c4",
+ "salt" : "30ea55b5fdc7e509d001d710b3a032c9",
+ "info" : "6a05fa82515f27deb3d27c80fa63d2b6edcbb372",
+ "size" : 20,
+ "okm" : "46a07537e9468a5bfd1dd2d4aa64fe9b10a12328",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 37,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "f7ca016ff5fae1cc11628196efef8ad174c1dcb9",
+ "salt" : "e3519f32e44952385308db5455878cc4",
+ "info" : "53b94ea0d6e0da9145a0ffdb5cf708889b9747fc",
+ "size" : 42,
+ "okm" : "5bbec6f981e7aec6c5f49da0322777a5390c54926c65b3bcd4fcbc27250625939ccfcc11bc3cfabf9242",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 38,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "1c352e65590b2f763aee9f4404c801e7a04b2a8c",
+ "salt" : "ecd6a227d7ab14c068bb917c861c8ec0",
+ "info" : "3acb9582af1a9019126d09422e715519fd335032",
+ "size" : 64,
+ "okm" : "163d478f06a53bc1fdf0f30a2329c99e607ea9228ed7739a45b64e3ce29620067644bd047f8e0923bb00b249254d1ecd80eaf3be23c6f268b9d76c20e6286765",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 39,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "2e4a156988235208a93e4aef6143653b55e2ed41",
+ "salt" : "9d5b4c7c1b7537300d4dec31f0395e8da6eb826d7fe38a0abf4b762d696b",
+ "info" : "",
+ "size" : 20,
+ "okm" : "2a4d8eb6c85b0bf2cc72d464a09ebe7d159f6246",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 40,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "61a281d49fc0bd3012e1b7f5dc17e980cf611ea9",
+ "salt" : "80f768a758ec5e45c0f2e3fd349e432347be89d25e00817aaea4a1c510a9",
+ "info" : "",
+ "size" : 42,
+ "okm" : "bb04f31a0780e83945e29b85c949864c182014225f77aaf28b223fa09e6066aaada75df4cdc4f20b7c8e",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 41,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "e94ac367c6f7ce07a3e7f83a1ea4a0ea264ddcd8",
+ "salt" : "5c139fd7769291e5101cc8c1ba44a356b5c3fe3d13b0a68e69b6c09f28fe",
+ "info" : "",
+ "size" : 64,
+ "okm" : "831467261ace0e7b53fc0a1139e418b492ee8bc3a4e267abb5634cfbc7c422641a6672741f791ef9276eea9a1119c85d3ce6ded423319a21f9f08c2945f75046",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 42,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "f5d21e4aac89fa725632c707bd89d100b90e5288",
+ "salt" : "989b8b9b79ab82253703ce669a0540d3cfed69d754c902a9365e03c92236",
+ "info" : "b092e1dd4faff8177a97e86716de72f94beecc4f",
+ "size" : 20,
+ "okm" : "d17d93a9ee4906a029ab4347d72092d0c9448e96",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 43,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "0d3909b7c4593f4469ddc4484a2082ab2ee18be3",
+ "salt" : "9138ad17dacdd0a2a3a3a37fa782ec243258aec9ecd6b3fb5964b2b3dd91",
+ "info" : "6ee1df3a970b9506a3892b59f1acea5e3ca2cf47",
+ "size" : 42,
+ "okm" : "6c2f767ecc1b109344360dc1061704c856b23b13c585a87b6445211f3e78763b89e841f31e08019c0a8d",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 44,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "611710557b5f54c91ee635c38f16222b00a71533",
+ "salt" : "4f7e27c2efd4e2ae3774fd948d95e30d40a16ff799d31bad27b37eda9bc7",
+ "info" : "f3cfd0fe4090c2927217405f339b450553a51140",
+ "size" : 64,
+ "okm" : "ff01c3d44225f27f77af95c443640d83be29fcdc9722ec045de937327b563b349aa95b6899d9e2aac995e7ea5f4f0bf34f665fc9124ab9607a91c23ea104594a",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 45,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "8759ccbb7c28d95d8f6cd65c3f5fb517451f3768",
+ "salt" : "bd76fd163a2bea5c840730b4870d168d097cba61ab3aa060a38816a007117dbc245d288c671b6ae1d2d1182a6c6765b13ff2910565660f853d0d871d0baffda3",
+ "info" : "",
+ "size" : 42,
+ "okm" : "0dd07574313d5683a506a1c992ac1ff117e20080493e0f29eeca02ba6a8fed42cc021fbd612aad9ff6d9",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 46,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "3b9304bebc8547501091857b81f4e7701218901f",
+ "salt" : "d63f8caf65f43c2b4a5efc56b6f5860450e237cf172552b184b09820784e32967f5ba6400e14315c7e78182c1ed2f5d6964a239d92559c5ddbe16c8e27e62079",
+ "info" : "e239a9e88dad237d5557336ecbd72737122ab752",
+ "size" : 42,
+ "okm" : "77f370acace1db2e9f5bcfd2a46acbaea48af4d0da3643bb50d5798f9569a9f6e11a307ddbeaf22bc84c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 47,
+ "comment" : "maximal output size",
+ "flags" : [
+ "MaximalOutputSize"
+ ],
+ "ikm" : "e24d1b941ac46211874b5f19096a5699ac59fef7",
+ "salt" : "e7604b17f41722d9172d87956e7454d7bd88a4d550d6ab9bb4d65930da63edcf",
+ "info" : "aada4cd9650cdb86",
+ "size" : 8160,
+ "okm" : "0244073b674149d172a28f9029dc197a0d2f2934d5038c52c8c9598a2610261dd749b728bc5f656aaac16c56cf0a44a35a8835e253ef00558d6d30cda5e9a9926693b7412491b1cb76971c4221ff036e299a12ee38433290e3ad832b222a09108e55517664e7cf19ae6cdb58b8787b886a9a6d3e98781c9727dfc1eddba6ba24628a7a35fe5bdbfc207aeb30ce049e35f4aa8ba01d9318f6d8a1591c62c0824c23e3871ece2d0580c10455101f023f65c9c19eea28d52393cbd907829bef282be75b1470ef055e72a75b72a9c784c8672293ed31242b2b4a8f71d07db9490d8ee803ccfdff458c05fc6265ed8403e0a50f1106a972163f4760beba718e37f8cd5c0e95481f65ae2c59a54a7d2671acfa3e14b2cd8046f81b00ef4769cc9f6b5fa7af6f4597a57ecd65bb9bbdf26737dfaec9a19be475ef32269d84c6e8a331b4e7c8004e9124461bf64974b558fa5ffd66d2c5d8e9e6a80d855d1693c2548a92b95f763f95006964691f9e81f4bf0073e5e524f1070efdf118d8fa86c267c18429625bcd289770181e3144327bd999fd61c2b2c1fe3c779e571e3f0c89b82bfdcaf07ae8ea12e921205ffb203d50f35c02ec00edd116abc548f386aab0ccc9d9530a00f3c469ea481d1236ef23d0fc6b9be77ce25aaaaa1dc03631a426a4d00334b2c9e263efc324badf75ba866f1ace6b55092e2a4ecef93a92684606d74369807fe6af4c6471ab23cc7001a44a38cd8a6a6a83a293195ab6839dba126b16617e50814eff21002e2c8e60e07bb36c010fcf123e7522eb4a62b99fa603b81b7a1367f7fed40d7ab03571cefd65e9ccef3adc91cc6db43d543dca2fc7b136009bb0d9b8e726be9de006ccede9e8c641e6186e45656c1a40c3f518c94d9d3d51a77ca14a62c45f8ee79f48200570d0ef9aa68a074887b8fc2bceae041926768eca5cd60e777af2e456387be889f29c141bcb2390aea164008c8b98a440ca7c5a30565d8d1b5ca6558f6dd0fdc9aa212115c7b7369b7b29617c35e4909c6e062726c3cdaa3fe0885029bd078ad3ad9dd917ca683ca74c4df6cd78f4792b4bb214e55977d3c4e6065c19b8c0804f403cea9e4d66839bf529a58de05308c687619a16cae4740544368e0af677af1837743ea571fee1caccc4d87251a2ddb09560e7989a88f8c211b21b0853b951e098105a6c4e36ac8a526a10679a430cd4fafad56aa24787bb3c6120e1e393aa44eaf33c80a0fb23b8f6fcd504f8db03c43341587eb9968cf41f5018f036cb60e61dba85da5786c3f54a88be5322af6553fae527a09e6325698d716afe53fc820eae43c5d965e788ab90ec901f44bacfaf4989084cee8d304c82d92affc8e126be3c95ceeeff0851d4005050d504af3ec884cb7b807bf2835544edbd7647b3ebb4dbc5e2bd287721223d097c122b19b8878200ed5ba2c6cbd6418045081e95d314cec009f964d47faefbbab0f4c38e61e32e70d9dd888d90c97c3913e3095433ed608081c4c7810552870baa09ca02631eec480d37f24add7c0db9b57ee49fe71d9dbfc09ab3a28100463be880cec412def1c46b91d20329878f2d12f629f4a575e79904943713738dec6b87ba2c112ef265374a9f7be102b4d837a476acd09b2486cc422d8083bbb069e16f164490231e466a57f5e5a5531285317a54c10c193379db49f53011d48e1e470db227d57340be2f51526d007511508d02b6f817cc5c6f8466eed675c0120f5ab709320324401c87caf91cc11911e38dcdf572a6bb2bca3784f8ea85abefc1281c2745f9290d3a64f16898aa373e9b731c4fa806472655461acdb3ef42253058cde1ed491108654d08c9941a21c08c36220395aeb6cafc878e3ee26db0a2f7fbcda9233767d4b33711723aa61e6b518a83bb97d76e591e5158cab4e8cc8d68f8c4397abb83eb3c4b9a31c2d97b82d945b5968144e1f4165e933126cb408d8243fe6cee8d255d6d76062954ec0e97ecdd2edafd7b17416b23ce29c9b86f6fc53480a509c652e0b4b0659a56d02bbdd22ae21bf96d7080832943902e168cda18295559ed370b84282ad66b7f0452d2a607a25477da79d8f75ca3dfecb3dc3b5dc65f7149aeed57dcbbc3053c0add891d80f867ca77d9b86f76da65f9fe896ada6eaf7d3e820cc5c4f81849f07c250415d8c9b3903972f60938d9ddbad400d114211e015bf966bbbc3b126a96f0b82942c6f6eb0c5fc51d63e1bc4b0a969e026f3d8ee4d303bb5db60233cb5d3ee9987bfe8ad604fe330efbed33685719f3f98a260da9c76436e868208f3b59298efd5dc6c3e77cb6aa8fc7acd4efb39860e2c6490c2cd3c3e9be69433fc5a788c1e2eb6a6d4d7580664ddd0cadefaa2d883b8e8ae3093ba63455933f73aa9956477b35160c27e7757406fc2f815b8357f9900a71bc11478b0ec701de4768c9a37cb6b38e725bd4590e4dc824b5be46ab4afbb9b5aeed9a9b364bfb613ee99b36021306efbe688cacaad8bfffce8f971ed22f855872dcee88aff00ce4111d48c874d89842bab4c22a61effa770ff01c844e81b4ebef4ceb5a9aeadaf98914f9346f0a7042361950bf352f50aa7ac050a74cd59cf476fee22732ac5a373e37951bd4d7efb1da1d0b6021ae2d68edcd74b78dd91b172b7c6769a60201c648be1a195b5829d33b14c8792f73d251dcfb43419e92357b5f9c0ff440d889729b86065c770526f5882a2757f80807abd22b1195914057e763d77a0e8effb9eefef4b8333cc474f01e31dca3f96a506b97eca5ba7294bd75e17425c61e26ae254ccdf2ba58b7edd00f5e3451fbd8e9b93cbad13dead64c36c3bcceee339c5c84daa69afd7a99a3baa9c5286af24d4c7a16fce1f457d23988cdb8e47359fa060ae4088d914f90ae7d4e994835c93f8de3bb8a2084e7ff44f1e629fd68ecbc73cfadce6974fdb3af00114303d122a39c82643d428678d7768ffca0bd632659fa33fff10196edc9f8076c26056a07927815125d1b92bd449158209a2f0502a6c1c207db4196d5ea67ffad0409043a4c3cd4e618e8ebc7887c355a87d372b4a3934087f03449e68201c5f43f3fcf25c5eb1a9872c16b0948287a8c88d1b7622813500544bfc2f34663d4ff7b2802a2348029acecf3190abcfeb07d75d6f0a87ee424977b208164276d57e13dddc560c56c6c5612edcba3bb7df8f8665812047a4a8158aad739c6ebaad64b9e35e54dbbf135f22935b6ff0c0da0e66fe52cbefd71333b07d8a550970d5b5d8d20e5122cce8118ca7034d0e9ac99494889a8917a401afbc4dd2509040ff0c6d5af13184aeb8036051b0d9bb8f911fe796f6900255439745e85f326bf263e2533d1892d7317dbf9cd3f8f38199702f0adaf36f6687c2d3d04544ee678169349526f3d341cc4bdc368afa105f7e08f89b6fbd63becd85b97f86de81e8a0289840e41615be6f20f4e6ddae62252d59365a425a01563477b01542248b0970877574556ebbf06b0621b17d309b06e1796bf15f56d1158f6999f283fc3976db54e1e3c3e45d3abd54d40cc28f28251bd30ca56ce6d0ae95b0071f3eea93b0338b0902a2aa2fdb085b0d5982520b14d91715ffdbc63f5c37cd0a89d72651b64290c696bf2ad18519fc56eea80d50796b97ed97c65cf24b6eea22ab9a9044c12bd2a9161eef76952ffed2532d5472b6b7be3681b466b0b07f1b8324872267eb7a7a0b3f624808f75b7d5db3cb4f316ea2b8c70ac81ca19fbe294e6227c3cf5487f16ba97c0c47a5995ee4e01dad5696d0a8c6a7281bbc234d3ee3d680c0bd732e5be9285324141b40ac664c402fd5dd439132f94a09b5e0e366368ad1122f8ce1ca8ad4f6f49bf614909de19ca6a2cc049eeed4e29f49abb3cbf91ab995e5bd48dd74799ab7e6d54c0f7709090b6ddf4329da0da9b28e1e6afaef762df93a82562280e7684841581646147341123b8567516972c8d1e44b58f8abab59b0c82ff5f367245bfa83cf67ee84c2f1a82cbb7f9c01783f28124cc4bfe25afad3ccf0c3ca09c06de4b7829362587aa0052d6c99072cad741d862490fdda32d1da35b14842b83c6e596c05b3a660a8fc264412ea518224aa90778a02e8c1d3d23ff4adc7e3580d9a24e3f7b3bff125779781b26a3396f955e1882326d539c83129005d0ce700be1b687b4d1f0b121229fce5ec30e7293af8075c9aa77a795eaf5e14d7a7acd2146c89b704604de23c0b657c22eef5e0dcf947d804a41ea8d958342a9460c1e0fe98498bcc1c8fb6c5b43da1e2696e68d9c5bc9e82b89394cf487e2088b5660496f0652e8a47bd2dc2c77c0c0fd3e9683ba860fffb5691a8d8bfb470bc5d97cd58345b6abe57f1d8ef36d34c3aa581af1c728e6e070ebd9e613d5eba297e2ba43b4aa8116b29da3c7fdc1e3f7224ed3283dae658d476d9eb4cb1261a352cf307abac455a7db2ba08eb13062285e01cbbe61f7d8f12dfe83284737e2109f14362ea5879ad33e2d99ab29e508d5cc64a25d10f3b5bc092b2b85937ed8a1629d8da06d2c7949fc69c598b5c5d1d6fd27cfb92dcf79fded155840ee2f712f9a1d582c44603467e2d3ad58f8ba22f6c8fda293e9b1969175221b8f7866c3401a52057ffb988115f74613658a33613ecba76f18266cdd5098b946e3ff023009e6b217902d10ed6749f63e4b89a8a7ca9b86ea608790c9e356213fe66510803c36f5efd450fea965d71a06435708d0e7f0dae557750aafcca540bd084dbadd889e5703602c465c200ddb13420971fdceb8acc87b2c99829b1922180c088d75871a0bed0326121d95c382b6d32fe4ee7bf7cd0f05ceaaf90017c82b95aed0cb0ed6af0c710af4688ca6a75882c3361c9e78d6f1362d472f1e74eee4b4a77bacf212c53da72f5770efe1224519b14d9695aeaabcf974ec135f4c559b201ad70c6de968191e0b6430be0ec9aeb5144c8ace2ea623c03a5b25f02c691d7b24c516a567ea77cad5b97513e87dae3b21586141025e70ee0d9dfb242d1889ae96d5934bcf5e9c193b5274f636b417274079b8412b165695be43725d0df14af8f8cc1d0be34098c50e2d8cb027ae2a8c5659b364543505d1e522e5344073df0014a956bcfececa39f3c17f6a239b47d6c937d816684af960c0a595e84799c03474400566137adc3b4d6e5336fd0791a65c19f883bb748a3099f7d3f460d7a756155e1c768ef59125443535cd16cacae8783b38d786f8468a797e83e90bd1d4f0eb95321f148cb62711dc70c34c5938cf851c1aaff5a34a1635d9f1428d1ab1a6488b82d3acfa8b12e530b179ef32fd065eb70cfbf2db49110459e566d79ed29a48e8ebb4dcf41ab00718950b7638efb4e5358b89aef59efb20ff2fdf5b01fb26591e969c9fb16596f5d8b5c3e553c4f421bfdbb00063716dcc9b4fce7c1c0ba70535493b29ddc0709639e55ede989757bdc5d4140b2eca252d50799131a8392a2e14c01920dbeb1ac14bb63313c21e2dca2048ae995bdc6767040bba02fbdea381e96e929174d84f05733f3a874385d3c5a712e43d68e2b768903bb96e006ed16a81d2aaac95e2127b71024ac528b873ca246eceda43f50b9000dc610a04be88f96b55bdb663d6eb15fb93a2d037150be14ef3c011b9b0959affde166fcb56491fcca47241ad5119fc47b686fe759c182af9fa46a5185cd14495bd419eeceaac8eed26eb50354c7496abce25a2c6c63b5e5c28f73e754876320d2d650070ac444e02f3056d4e4dcf5f827c6a4a1283961a0a29cc39093a19858ad729059bc7206a934c0b8d3a9cdb78fd9ceebe7bceab20bf74273017c9c0af917b6df95a37b94696dfe4ecc558521e858e773da1548cb00b9982fd12a83465e866bbb700c110a2de339d327856bbc36d4b4eb72eae0cb21aefa37d0f5b2d980af1e9e60772b2d628bdd8a67400bcb23cd9625edcfb4edbf227a112fd90900faaf3145ed5be5bea9a4d52455fa666ea2a1194b9fc91c8750465f6f239eb28d3c110d15a6d2b857fd9da44b1cf1cb1d567adfdaf77d7482a4c1f830dc297790542280ac47a9c1ebdcb3386e1ad8a6883be4eee7be3cb6f414e890688a3ad0402bb0c39603dccfa6b2f058761f6e06de05a640ed3c1ea4683a4dc7d20efb2b10e7f57dd020922b1900ba3d16d932b5ebedbb8d85cc379cf87175d58aac2e3639af17a797710b6eded5523a28d33326155f7dd19293b6138efae3b4418e93ae6106515d9ce84e34c10b71917bd836fc50a6471b3abdea4f32e8915b2480c86a7cf69842fe1ff1c5308390ce76d1cf9f02126b68d76fd2e0d59e35d13bdbe5f9a55018040e5b2f8caa5731a675c75085c5284f9ab5d2ad4b912f1de42862441a3e8c17b94299bf696291273e41e425221fb80b4f9ace9e8d1251df1beb6c4e39bf5c7b6a05db78072468aa11797e190d31f90a79fd92bce0c5acbeb0c8ccb6906dc651f6c84d9afe5089c55fd07c6518c84c5c650daf06b0d0d2a12dbcb8a420ec4dcec2c6c3db3a3bcb9317a28a3a05397c1faef8f389602372b49d74ebb030dacacefa5208ba5f902a664d35b3155ba8fa3cb8dd8d3e61b9afb6c8042b43fccc6d6d8bd55e1d224f32727d7209f70faaecdeff1af39014df9c77ee4edbd6a5df9d6d600bde36d5f2124b74376b83ec401644edfc23c23ed1cdb969d8ddefee7d92ca1042cc9c73aff2db2347b24c64c41ec83c5d7c77d427b74d7ab74091072ec24cb23f5476ec7e9612c0290caeeb0c153e79c750efa97850bc52a49cf0f8b5e912a162e7e07494260e8609ea812062669dc269d69817d5cf86055f1510bca0b41ee7a077dd599a0d5a401a2cb59b3a1e3f463d8c92e4e75fb52f76f558c8fa6d439bc27f602b2a63c9d051bcde303367f0d506aa00cd09eec236b1d6547ce97e83027887522549694ecf0d616c07dbd9556fa9206fc5a7293ffa6268430f285ba6eb6f27f57e83723b4c7d3d895919dbcbf62a3dc1226dc507885bbed03490f6ab1982c07eeeea7edd40f5d15d2425dbcc7c602a119785e894bc317948580219e8f59a48985e57a62af1660d746a63336d19da11db1ba32a3b57d856d12eefb5a68b343255bc92590b68a18d47d3f0a968d26db7b05253f7e67dbcbf62c7bf76bb26af0fa4963869fbcb4fc2cd0ae00fb9c73aae2927d68fe5219072f68ac7a0a38f3622d33f1cc2ef22be3c6b9f22e1ad7e92ca3a0851d95d6523e666e826886e5f3a18de1b98d055da8cd7fdc77bf9fbbf1b3693cd9986b2220c7aaf621b87e53d200a433b077783a397e804fbc5eeeff4689820acb909b83bd308d70b9c10b0e322ed8d19479861e43b9bd3be2e4dc80bbf03664ed74f010478ceeeb3acb8309bef11ac68a5f3f33e81fe43ea7a1eecb931ac2b45035d8ec936b9ca0db4b27090085669632e5f12863982f4e89e626fcb7ac804b49a7447d327618906032a95552b4c908d7746e4731e3ef24103d509a8dcb8f97279c2bab823dc29e0712c35e1e368ad2fd4f6658af52d2b1a8d858825fa0ac7778ce3901de3ef868a5883f96b99082e625e5d97e1541ec0e83449382f14e4da5200fb978fb7accfd1bd309d7c85f43ff698d167b14e666791da155ea77df73dabb62c7542696fc3fc6bcc1ffcbc7283be7fc11b825808adbf8e5520deacee82e0c634bbddb2323a74eb7758694ec1da438c8099bfbac153b0b40bb0c0eabdc308d036b21a9d991a134cc184a7ee8922eec91c727fcb518a71c57249006a84eec840930b1fe67ec42f24ff07b7c57685f2e5306c39c8783dd3c950e93bd52f8d540bdae2701429c4d988f6c0a7da94ae25ffd6e9bde06c8e0a5d8e1197fcaf31c38b53e30a785cd07f857517d6b15c4fa923c3435b3c3af102720a927c1defde566c1e8cd6cb8d9e0f5343fa8828fd15d5e966ac78b3c50dd6fb00aef35656718e0a03103e9e6514e20ac242c57d261e911d3981043970fcf50a256a6ffde73ac37e102ae4882c9ba3d743a791e786d145f4a9f677d3b2a9762c6a6744f81c28f07c354fafb74856aeeceedea70b695f9fa3687e7462ba913f6bdc7ec079219f74498d53ce44fd570f3f9ebaa290554dfc7d254939bd53202a5bb74bc5b6c3d483041198b08a2dbaf8a806a0465f254479d9782f2ff7d498ed853cb05ab8a41a6d905b5d0d186e84083626fb3955ae97a3bc6bf922640c7f62a84ef422f573bf09feacc53853a3841e487b4b4b6e57249f5224125dc04b8b36c818e02487b096d164eb17330a15cf3c2d300f39c57c29e1b720f40784366e9bee7a050997997aa273a17599884ce70c86ec400130fceaac0a1b4517a314e4b9af5e1f5d53319793502e0c5649056e61b08f203e06bf6c52ec06bcd6deb993e8ab6bd03c37f23e0b4596ce622d48e59bb591f1456d751a481d2c8558d897f7126cb29853edec76d00bef748bf4e7c008de0d9d4e5327d93ec7bc5b3b6cce10eb82ac51b1ba2d7b6fd9ca07712eff2c47607ffd192de1fd38d21d78c08c5798d8e7a082634542271452f3eb205c964a372c82defb9a01852e227114dadd6021e986601dbff8e747c49430f20a07df8ac263e5df0002b846086b343be67b95ea3417c57512dbc97766d3dbb04801f8de7a0c60ec8624ad62b43a9f04ffd6c78538d2062293c0db2fd6c4fe7747ddee901ba721b6a038531b9715a76b4b7f6fb4c08664cc046791393f27799aeccbd32fc755a598df453fe48402140b88b24474475e0dbffa63784987b2561a586a6fe65b4de1464179282f34fdcc8aa46a65e2100ef72e7e3307e697bd68b7d14904e00e7eb497a5c4671351482f29a6334e15ab0009a91316a5339f783527b04dda904bdb308801f0cba6b9f331131a1f08c29ad16f6b4e1bdf5ee7b0e259bc55439114ecf139b3c0d6c18b947c9b467a792fde25a50996ba6031065c21367e769161722538324e9fcb4c12c04ec9f040efcd524edfa6cf3db926866ea5b73f2eb12ac0ad9fb7599d4ed48f129e0e4f751f1977851f6b8d4e797423b7d0ed961485e8fb3c16fc0c7a7d34e86f2b4965d80ab2be8329d910e83b16aefb238e722a32bf9451ce1a475f58da91a458f2e0206b4f26616b57d18ddcb8edfba14f82f9f735bfe31a0545987ee7bc4d51a35238cb0ab1c442e10440fe17f7292ce7153b30d3cba9080e9f272bd2c51f0bf36e09b40c415d44851229475df6489b6db20b868cfcbbd69f1f5ce6a50518d0788ac1be018aeb818b9764ce828593494bd8f4bd1141a4878593ea02de6ea890a4bef04937c4d0845ec2215414405351af4b85a15a46afc81a20b97aab36ef7c0439f9a2d77a542c9cace4f77ae2079f63cd07470392ef2dc98012462fa01390d78f140464794b6db4228b65174e0bc8568772ec7ef0a624ed693d4824e7af131e0f3aa71428803af72187a85850be5d05da6aee37866f16e798a60acbdb68f0ef23f8cb60c00247f7191e54ef9a6134264be15eb485d193c666970f029c2bf5c4680cd621f6b3a3089272230724524e458586e5c22bc46d08cbf3a9156f5a4816277594d585d1de5c84387e50c3a3054fde490b78536cef8cf88f9a28e374be5bf0bb48b1649cfde4c4b5a97696afd7a5c79bb9029fbc219d5c7e2779ce783adfb9aea3afde5122b48678aa144e1bb80b4c8600c72b9c4b9d963ce6ebd576563504799d1ea04925305c28ad70604955f2075add763d301a36c205fad583a2d9623726572e6bce39972a6a3b1985826eb82da22448881e46c2dd9fe66b716c3495201228511f598a95f94dbca470e44c2b3caf5ba9763b7251c4c48890c1457a0bd07acab9fc2ec9d4fc02151509d1eee20f7e116da9048a8b69b0918126520ab89a89a8899270cd50f4727c9dadfa2b1ef2e64552b8de9b42eb8214e5db87170abff617461f65da832dc927c0dcf3ae3b1ccf4ae15c43079fd53cfd8b1d24bda26894a7951f56628462ae617a584f1c5d5355833ecc7cab52b5f49a15891abb0ab695ee4397a3b8b45b8bfc0e8de7a30d14d467b3271fc4a94d779381e09c397d45868f784dba9fa727ebfcd49e515b642ad3d2013fb41736ba1e1aae08350b47c5b897acc66c54ecac45d0d638ec189ac1499983e37eefa5fe719e4e1265a0e28f19cdc7f6f1f610bc74fab5856f6e39d80e75ddb73ff3158330540ca72b57014e30d80ea3a96a713c9df09e918c20c1c754fac104c5a081f4442db1d9135ef75863d08efe7cd114305318fadb51a3ca76554441cb7d63c83b796526ba7a6a98c2ccd1cf6d2b2fedd1591677919abb78a925865a6c513ed83183ffe85b820f622f39f20694151e5d3659edc1eb140ff1748047a928b09997d4d71f95c0b684278c3e79ea7d7bf9aa2b54a623819759c40ef6762ec05e38da94cd4e0351ea29cee70df96c263af629949a5c27f01f978f0e54ea624e1764a3096ab4cd4976b6ae1cf98d7c6dc8e350a4a70cd1dcb4645f19dd014bfba511d8a35a53e3969b84d798cea519aa1e63477dcc5f49b9380a9f0b5cccf2f52c0f3b96b98d6c418a2f6e0e8974082e0269d81a8f361810f8ff0d990d509658484a4aae3575206cfb0b059755cd9ecb3d2c48e501a61f37e61f036700ef974096fe9cad016a4791bd110544e417196a8a98a7ae2fb3728245109daf91f8ac800aee375b0aed53033e233ff7a461d9b0f136799c6feb87ebf69780e221018669de7a72388a08eb7bb3b9631b4dfd5f701bac8df7afff6e2b3085dc6b61cccaf96a2ab725a1797f670cf99a911467c9dee7baf138df096edfa782501cdb0bd6c0e7976e738b568e3109f41a0bc9f1d179071df9cfd239b0577beba215b49095da66936fc780bb9826d7ac68c3c29d2b808d3269894a9016741a35d96e745a0aa2e5e743e9cb2fa080c930b9115eae1d7a8f0d9a9aa31de89a35a8a86cca7b6032c56d2ecb9cb50fbc8ea1bf241e663bc54f57f8d764a2f3762a7d9325a99d271a0a88a33b35b7b8ebc1bd9ac30827da30ab7ec98b3bf651784e1378bc13b2f6c3cfd2b263345346d5e39ffdd63e65d81c57c117433a47a4dccfea1af483168c5a8fa260844d810abafbdeaf18e994375dc54a7d6c64b8a394d343d79f315dfd2b4e6c1cfc2144f172cc94e09608847d9102854e18f53567d64466b9b2a73bdf5d7bedde274fb08779b24e348d91378b35e5043aacab7efb6ab3035ccdaba8a086349b48fea707c25651e64a337d85a17dfc5bf63ca18e70db72363e08bbb122ca2bba6ecd51fa21e2dcca2060b249a24e86b5de37a53d0be8988dd3d226475ae7ecb19c440a9f7a71fc397822adce715524333bbf825bf65c8273b028742dd843b8063b9fe58ca1331cfeb5093dfc45c1bb09b46d204eaccd691c267747b833a6ce1f5efa916886bccfb46ff23103f9bade987089aa6f2be1b2931cd7a441ac44e54df93285ec7d606be2988e3bdfe9094d374de456676dab0ac381c09205f16e629dbb0461fbdb78cfa24ad1942a8909378ab733ab14ace19b0d8d20618a13aa77fb9c24273ac239551",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 48,
+ "comment" : "invalid output size",
+ "flags" : [
+ "SizeTooLarge"
+ ],
+ "ikm" : "b9e48330280338d38dc0d52493d0c83c2f705e73",
+ "salt" : "32aaa81e238e101845eb2698ee271b9bbb832fc5c94f426fb65dbef3fd267dc1",
+ "info" : "8c5bce0a3200271a",
+ "size" : 8161,
+ "okm" : "",
+ "result" : "invalid"
+ },
+ {
+ "tcId" : 49,
+ "comment" : "empty salt",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "8e9dfcf668a8b7e22c8d403c35af78324dafeadf",
+ "salt" : "",
+ "info" : "b4d6ce377ee98d0e1614e3865354cda02dfeb92010ffbade5d1f7e4329f166995a67415d56221128b04de3e8c49437b9e322986b5fe1256c7f8c81021b99ea96ae",
+ "size" : 80,
+ "okm" : "01ed7302f611c098f57fe9ec9b8654974bd707981c2b647753cd586cbdd0d7ea1dbc5c76262fdcbe0c355a965a4287eb86e4c97e60bf0e6be0dc898c997b0e73b2888265e8115073bdc5040365736d73",
+ "result" : "valid"
+ }
+ ]
+ },
+ {
+ "type" : "HkdfTest",
+ "keySize" : 256,
+ "tests" : [
+ {
+ "tcId" : 50,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "7ef7d4f8c11d940471cf9a3048d66b3b3a3d9db9fed5f81419fe75dd50116f4e",
+ "salt" : "",
+ "info" : "",
+ "size" : 20,
+ "okm" : "a370de1c822b8eb00645c18e32ad6a1f4bb17c9b",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 51,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "1b6c7d5da045bf8bd4ac3083e8de2b90904bc7f7830bef876e355b74466cef91",
+ "salt" : "",
+ "info" : "",
+ "size" : 42,
+ "okm" : "50dd5b5adbe96aa216f93c4cbb7d568d5141b3ef7214be885984629b93f07814870db846c3efc8c7db7f",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 52,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "b9da242c02bfe79364aedd7a323692191092edb2094f112675c2609a387c3b21",
+ "salt" : "",
+ "info" : "",
+ "size" : 64,
+ "okm" : "384c0ded57bf066d6665d88355aff9eab8cbd78c1c71af7b8334cde6536f21223aeddd5a84d278d5d73f5b536973575dd2993a4a857289c3b59861643c464c2c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 53,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "23624191960916aad7039c8e9dc2ec4e04ac61a233a02ec6045021598123f0cd",
+ "salt" : "",
+ "info" : "60dd0d1381a014491b34f0af15e4bebb8f64cbd5",
+ "size" : 20,
+ "okm" : "2f94214e5171e40cd7bb601c2fc7fca42c77f227",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 54,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "ad75f83c7fef898ab33a429af351c10caaf39ef27b161a6806d34f1f4f8be229",
+ "salt" : "",
+ "info" : "69546d578a213b7f2af101c8ef532339324d43ea",
+ "size" : 42,
+ "okm" : "b60b7fb09271c6ac0c48d6ccfbc535115075e0060633e5adb502bd964bac2fd120a53be8bfbc9fedc27b",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 55,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "cb55dbea8b91ae1ce0a07b23b1508c2a930560b8fe7255fcc3e37835803661fe",
+ "salt" : "",
+ "info" : "b57d6aaedf30bd8e25867059761a02c5d0478f2e",
+ "size" : 64,
+ "okm" : "d22014f4f0475223eb87d4d462f29f04a33fe93349fe62ff9d4dce9360e5e22bc0a42746abbf44c22bf472c1f6aa608f3c90c088daae7015fb2f9e5aafa2c9a2",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 56,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "583bb04b870b4b176e58257b67ffa3b8d4e339248fb0c38105673fe7097ce47c",
+ "salt" : "aef10b993ba2f9c390d429441bd6612f",
+ "info" : "",
+ "size" : 20,
+ "okm" : "fec774eec32c8af7f44b9f60dd778753a5057d75",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 57,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "fd4e56ade648e1cd9d797b0e341700c637b0fa69d64b9088f187107f22dced5c",
+ "salt" : "d7b1397162d311e603b5214fbea09dd1",
+ "info" : "",
+ "size" : 42,
+ "okm" : "41042aaab89c7f6534737a277565306f90a286a426f5597a6db84bec3f5b0b39a94677d19dec30986b61",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 58,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "9ee52bce034b6c2b86d280a16cd67556de34c38c6fed2166a00f90c13164a435",
+ "salt" : "56aaaea767cb8a0d5178c94d4761459a",
+ "info" : "",
+ "size" : 64,
+ "okm" : "282fe1ea640e79b5f7f967e510fbf3bde0e20672c5bf284dd7230aaf75b7c82472881ce2a0b89692817be18c41fa38f06de284a489068e9af452326bbc10ee5a",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 59,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "cb785e569837f730a147fd2d4f53f6e297453817eb117270e2d5c286bffa691c",
+ "salt" : "545a0de785e5820ec65268b63e543c03",
+ "info" : "63421fe4d31283e2dc3d8d09bbd3f9509bfd7b4b",
+ "size" : 20,
+ "okm" : "2a44ad4a5d904eb5ba74a89adb46c19f3f2321b2",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 60,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "101fe3335e827789564e7ef23a2a0401ae336d646ab15ed4b5edce6801f128f0",
+ "salt" : "317a34d74b046e021493b750d058227d",
+ "info" : "8f9b9f4bb9ed5ebda37ea28f97aee40d533a56c9",
+ "size" : 42,
+ "okm" : "d0927dbd93b0eb6415e3836b47585fbfc49d7d4ea0e4cfa96a4f1195d2156f14141ea700b223d9da9996",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 61,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "62dc1cecc7f444d924e20e9e3cdef183b5120b1f5bf863519826fad284c883d9",
+ "salt" : "1956ce69bc08e45ce86f5dca57d0723a",
+ "info" : "0cf3a7823b830f3542ed7e66b47be87c47e6da99",
+ "size" : 64,
+ "okm" : "6cc96b84592037ab3fc39b6eef90158cc3235d6475b6ed08fea6cd2f0a4c7610caf4afa2ac95ee0d5c73d612b5801a3900395a84147b749bf60d141d888f45b6",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 62,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "2c1fdbf9a2fe9bfddccfd8edd7235551fb50e642500f29e5425ef7f0e78d3905",
+ "salt" : "be744780200ed6f2027fae8b64f2de0da992369a19509e590c36f82d81f3",
+ "info" : "",
+ "size" : 20,
+ "okm" : "886881a9286f26d47cd8fa9634ea951df0b1f906",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 63,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "99e1688fbc1d2f2cab80ab95a86b301be9c6d996aac4f13ff7e707487126bb89",
+ "salt" : "bb869fb1182f74b65154d5e53f45b0fc3a1d8a6eac58eae2c077fb29574c",
+ "info" : "",
+ "size" : 42,
+ "okm" : "100b26ded4ba401c39066019c08758312433b341a35a6803c6913f82ccdfc55d896193511027b29c4aae",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 64,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "d8ba14145c3b749c50e22ff58f552dde9dcbce9fce3c3290ca3a2ca04f3d1eac",
+ "salt" : "026ae3d9c6b5175426c0cd000b06a8eaa9887941820608602a01cd5fd891",
+ "info" : "",
+ "size" : 64,
+ "okm" : "c9980ae8ec2059d307bc86160e8ddc6bcccc540f72b4665f73cee33cfcdc0f43e7023537cf331ec7fd7784967572bb396823d11f107430943af056e0fdcf8715",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 65,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "3933360960bcbb94262644f81fc832b15eb47834f797577fd9fa6c2110ee22d0",
+ "salt" : "f29df8b80352ca0c08109e0fcedd4c24dd0547f4f2c67cf51caf3553e7cc",
+ "info" : "ffbb2b91b560790cef1eb610e013082986b47fdb",
+ "size" : 20,
+ "okm" : "15aa7ebe468eea566917d0346dde6dd78ba626da",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 66,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "5ad1ac7eb76fa7cc05a30a6f6236e25d906bb0160cbf5f89350887523cb3f7fe",
+ "salt" : "91840321a9a3030285df668afec60a46579b7095f3c357bfa3e403eb2080",
+ "info" : "7da7c7a79c9d94bee3b561e532766f8cb329a11e",
+ "size" : 42,
+ "okm" : "117795c01150a56a41584bd27ab42809b8c2fe04bfce60911ee5acaee8a3bd9d45124841a5f92bfd8339",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 67,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "59ee8495dd1744f06cd1009858da52fc81490e1547e0f8b173da0818dcfa0ad3",
+ "salt" : "31a144d8fd2c31ec7d6fd63de0c70e15149ec0f10595ea2d3e4a7db54826",
+ "info" : "4d5ca4ab21d09ad04d3c7a71b5c8a8822f1ec808",
+ "size" : 64,
+ "okm" : "09969e4d7efda0aa43062013b826f5b9953f1ed62a004e8a1b7b2c9dba7ea629b2f0987c8f7f230a117b49fd470074c1934e51e94e3dff2377b703d9eb533db9",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 68,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "26c100db697f01ab998be43afbc294cdd0554e43ad75a6ce5de4c5fa427760dc",
+ "salt" : "80169781fc54f9c49e852e49b7246174b7017e02d2ce71bc7ce851b82151688b34ce1f203930e00b7f6e8d56b51b3d33d688fe24dc17a935332ed32372cad575",
+ "info" : "",
+ "size" : 42,
+ "okm" : "374077f9f4e7fadf8336e499302e2ee425887cfdbd05da552d739e4d1a4d2487cc949b8197662edad9bf",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 69,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "5e4c5e300cd1337f3b833ce4d3a0bc13b5a457577e157a94715b041833882fc2",
+ "salt" : "e365c68a08cc9a36d6044c5e108d784e801da10f66ae266fec614d63c68caf222ba75ac7699befa2e9f303038d0e2d07fe3818fff864068d2b714f1758a5f11d",
+ "info" : "496eb6088ebcfd20d1611bd18ae36ea8b6a6259e",
+ "size" : 42,
+ "okm" : "c176a8a149a593bc9a11f25a0c41ad120ce3a0aa3eb759fbfcee09ade53e4e2992776ffc5a3353a05c4b",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 70,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "974c0ac12b6a9c2b79fed80b1a960c9779b1860fe514ffb251c4ba65ff2dedc2",
+ "salt" : "32049bc0c7f3189651cbcb45491347f83e0e90db281c3633619516da566b1b62",
+ "info" : "923e5c930f457af5",
+ "size" : 32,
+ "okm" : "5f368f29e213be6d5eb3ba540a95f21714134df999abe0b3ea9aae5ac4708fa6",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 71,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "e937b5e7ece235b337cb4fa9ab8f3a747990684399a1c4bed47b02b3a5e47a7b",
+ "salt" : "0b079374c35ce1373bf13f2eda25daa8447e70ec737eff8c88b2e024c83e2181",
+ "info" : "0d723e3bf44be388",
+ "size" : 56,
+ "okm" : "327afc3e82b3a1ef3b1d7ad3727c96f30ad19934986b868cc028b17dcdad0035a3ea767403ade0b3410de8568831afdd30f90f5d669e334e",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 72,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "279d9c928e719274379be30bd6feee738f8c53049e99390004b3d9a8745738b8",
+ "salt" : "9a8080efd34f9d82ae74d750672d2f6d0b055a3af78a4e40888e93466f1641dd",
+ "info" : "efaf2275a9a729c0",
+ "size" : 128,
+ "okm" : "d88cec7b19c6332151244accc7adf1009667abb0dacb358d740ca2101bddc610473bf322674fc50e37650a576e81785002b35fd1be18eca5ebf8ac0bae4f416bf1f00411d8f63d84aa4a2859aa574540e6f24a94acd51bb4b11275602144578b2671df502b2fef6ee21e7a47cc0152e7f24608953287661d10392c6e2dac6351",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 73,
+ "comment" : "maximal output size",
+ "flags" : [
+ "MaximalOutputSize"
+ ],
+ "ikm" : "7a53f6a4fecd584bf9a23eae9eb764b7a65d34bf0cf080f6e505eb450a57d839",
+ "salt" : "f669d51642c7721667cc682d1e425dbf3ee5233a12e406cd1ad1889fc556d117",
+ "info" : "0bb3ed2cb4dd08e7",
+ "size" : 8160,
+ "okm" : "de08a66635e4b8b7cc3d850f8e5d7f861d1f85780b54fde0b77258840092244c486a8d2a9f850ba8786462981779d8e884d57752572f3af9d28fda0b71c5850a2d52f376b349486b53a1da8b66534b4239fc45362d9db3fae87f4278347346542c7d55373c21f161cfbd23a3e9fb864146e2ed311f4ff0e9ac3536e8fc2818f9c87344a57539d48445e19a55a23c12f905d13429dc80d2f91d577014c976623a01e4c75ac6abdd2aca8a4596f8cd349b5e9ac2a1c927801d706e1df6777dabf98d2de6857c44648bd4775466833a17c21eb15247b419dbb9f5e7c46ba51a8d0ca899b0fe4cda569f3a93bd04df77242fe127ce3d6f341508d56529ed7c203fa8a3322b179cb1595d1148d3ac2fa288165bd6d4d30598135edbf1a9b5ae1ebd20aa44f08a376e11a789a61f29c3df194173c142d5e7574f5a698036f82343fe6fc111cb1381861a5590b47227a2124893d03e4879f1f137be5e097b59bc84489a966a6b1e7c6dc3d3352837fea067380d542e18825c98f503a61f6700f5fe4d16e861ea64f1bcdbb69b8013d9e070d2d70fd345a9c71e7d9c997f5ab443e92e178e613d8b8213efc34376adc69099a62773840f653efdd3ac17a490601a4b99c56f755de45415117373e6f408fbb985c4ab10a8f392678ddc3fb6deea5cb147a9ffbef8656d76ccf6764cb088ec84193e6972caa027ecba9fd532c632896786fb1c87115e4e479bceec24f92bac0ec68a9403e90fbb5994b788ad02d1cc6d8e4bb53230988b18f3c1a146b04ae6dfb4f773e1a8469ca11d7558f7b496cc42b417c7a0c8a4349c43184744ba4169d93e86c416cc892dd5de21e10c60f0d475afac2eb6dbbdb92ab30b8becffb9354aea4c8e9a98c57787a424677f34d9fb606829636dbb10326c8a42c49e83b4cacb00ffcfa24a5b775039c82c15ddd7f88d469eecf382fb1e01984abb8d23321f26da82ae70192ae2e43ad4317931f2298cbac224568306cd996c5f8396e3692e4e146c0cf0e0996917c54e3aa69472b35b4078801dccea9696f530df4b246481fbb9e27e535a5ef0dff5f571aec4ce8c80e3adf3e7adb4705104f71b112254eefb6d8daacf5a50895524707ab4683386a7d3cd971204a5300615d0ef5434e47f72ee2d9294d301dff26bff52963c2bb8202a49e84f193b0cc32ceab0dbb0c0d63fb784229a0d679b786c8c1f8d72072961cd4d43a9cc30e5d18af9d7ae0aa360eb24a4bee441f8427278ae6e12fe612743a03013f7082ea6818eb633e863ab4c6cf3830b24e2fc283861ef7347a822c691c8a523a1a107288c8438de427512ae8b5923fe0ba7a1ac98279b0ed27c6bcd26f7d86be9ecfe77e8511a40069f0fe043f7b4d4ec6f5dea3e8946cc03fcd0f87a23be713a07c4e7729207e041eee0c807c1cdc3567da5889e2b9b7e653d3a14d11e16099f626252c4faf01a2fc797ddcfc5a72ecd1fae98ff71ae6c2ab31bdf2fc8f7a594f70df384178040d3cb902543960c1f37cf311375ae412fea507179b6f47dadfc1ad3e1edeb9166e22f159dc0d4bf8f50f86962d15fcf1559ac656e8ba90de1c5ca890a501d5a6e364a4f156894da2a6c44d431ac7284d1ae594f1b93d775615e11f2b9c3477ba4f35922fa17f5bcc4734e23c26018842c0203546d6a400a41fa0bcfa6b97dea5a819e19b1b99f9ab6f31fe3e46488c8b9f57e32048287f6c5f8e6158a214f6de5deec81814d993ffc277091be8fca50a532657bc4e96d184e8de8ebaf4f231afd4a3350d9338c40d7c9e5e2c981b5d95ff87c34142b989bef83e38361049ce4c31f74e4aaff2771ce632cb97d5eb23e1685cf97dd240e6f5cd48c98d059cf89f74f33475ff545ca88bba6c06c649c6593c497ed10b077c6f3001f11e3bd7733122a05a9b7a84740e5e1083e25b383e3ad5628c2e5bd44a9e0ef998d2f7e0c813068eb599e6ce8c6c6a1d96dd2d8ee8fc8a1f20f938157135109258ec41a6b4e42dfaa7c779202ec235350bacc96df95ed0f817e955566cd39056ed5a4e6851aed87c44eaa1d28f730e3473937b856f0b240dfc86b29e3629da53cf61a0ca2150d242bfb1bf48066d3d172bbdfc78a0f2bfbbc3a05399371ab9a3af83a247ee5f9e86697af232b4138d0786dec954e953501be7f5316f832922ae88af2627cdad1f5bf8f9d46f0a328ac5d093e30ef95a69a684841b879788a37fb26f361984a409b49a40b23c8711730eebc124471fd0319883d58f6efb45b6a432b9b25937e6d1149ae8e13fbceaee2a6724e44f12844c9e2135dfb1a78502dc965ccd4cf0c269cadc2b698c3e7ca8275bf2d19297f7ddc3636800f423672b3a6c5b2f5cdedd86535e14149ea2ea98d53b1c39de908bd8b420bc4a6a53ca03be73e3a724f96bd71388c09798bba425c1a2b148d804fff384610865bf30c2624b356ed14522cb159d7178971d00a660f0b1fb59f0197762c4ef102f1f2a7b043507071d1695055bf1fcf4cee16ada8bf14fd4e05112f51d3cc6f71b1b2edea7dc1d5419de5413498ef0660cf61f624ec9a46b03d3800ad6bdb39fdfbe88f605eec119b04a2de73e4e7a95b6bd09834e01af207e281fa1412b3b98054456a1b165818540c52a25144918ac2667712266a5abe1841a576dc536d1a077e08e532537ac468c359d8c7b58c0896e9d5a56c44f6bafcc74b21544eb97f146a89eb4ec5254258b7bbcb8ca5b59df8b83f977079235b4e2de832579fca627ca9cd6e87d0e1404f678497fb0c128f4d5d38a8f7aeed2b360f354cbaf674ed922786bdb56062bf65d70e424721146cb2ad33eb79c29b95944b24b0d0da3eaf2589220d4d6f5a9d903bc16be3d3b6d99ee02f8a3934243275f2bccf9b31a0712d3c5dc919179ab23d8686b02aa44be94b88e769a7dd3a4a0f4adb5ef989ec539bddced4f76e3903d25c7097d7b051d8756d543b168b1467876a3350dabe3fe5e9e7354808867ff64b4d56ff858250f6db13bdf923e389ae36c15a800971ce37c883145139f7fdcd73d0a5a961df5a36e1c704bd5f1901fd9c535fbcb3abaf0cfdc59a8df79d7f36cbac5373beb809a39fc417ed25c162dbb57ce76959a027c0f563e192d6fbdf6935a200d7530012c7af46e5b7ddb54c2520282e4652f630aa4b8a226cada5f907c855e6bb60aee10b1cb3084d4a7ef130f8dfd53ee82277c80f9297adc9e323d3163b08af26b522c4632ecb273a7495aa287f580b11705e89db1163468f00493f2bb8f64afc9e19bd06bc7673b938ec41aebf996395b196f58d48af276a0bf38b44f7f687c1348bd3eb1dd7d001486d097df14ef897edf1f6f4c65eab25640fbe963890324138ef06dbd09129cc2022d3df3aaab83d3dbb129baa12edbd40ba678773fa1e7d16206f682b7953930596596d50f5bf6ab0c775d14211befa08bca58c009e36559e83e4e522af10e100a92dc97757db570a737ca0fa67c2bfeb348e8fa4c0fa93bb6160e7a19ccbfbee57c4b6d7361a1cdbda20d8a4e50bd93da79eeed5ee7fe2a2d0e2c15c4c93dcae100e7a9798d2e1600e4580e0e1fa01dbefd01d091567a341ec3a45b119feed5e264d76d5c2848e393d6357a9bdb7c90063cc5eb5ae7033962e5fe7a09101f54338b19efaa86f127d658c2b567e9b20a819777e39d31db1b1e4de9f9d67887daff6fcad746b94b6ffd46be98720a2e3f0478de44341cfbfa6927ca4c58255b265a012f7693befbfa9643fb80681e055ea0a1e410d337c0947e944cc343801d75db77c48b268c8bf849661ec40906891a00ed1f9a12fdc4e84d31a74fe79cf105ba82b465bc42cdd48a9ab2b3c94ece211495298d3baaa8f767d9ebcae57c5771c985bcc26bd37fa30b70d3a8667b95f85eea5c9768d31af5db58915670548547630df6bd374a7fe1e99c99ee315cc41c0cd6487ce895abba3f6e18ae0bfd8e3656d616500de0fe5a76c9003644919d4366db5f09fd0747a666bd8ed0e68a039a3742817c14db4ec5033fff77723e612edea6306285d61dedc91049f52bf153727bd549c82ece5be6f29d0755d85d13ddbb84e25660acdf01199d93503b946f96625aea64b17c2e09343df30c392d843de18688e3b3b4f1e95a580433bedb86f0f2436f0f26b58e821e215aacbe91764d9af7470e607bce205fd44740466915b61ba04cfb517e3b12dc5b51d4ca629af0cf5dcc2405af85f75933812e2f965cbbd0d1d2dfc5d9f997eb6469ad6e13efe7dfe27b050d583dbe4fc067df79c48d86ee77355f6f354259249acc8b1a61ee52ada3ac195f7be598c04e7e09157f7bc948d49744781695caa1393784266eaab383a536fef684ac6b840c59f1c631449e69f35d44b62b7ee54a1acd8cd516a2dcb4c3b20a6042f131b1eff092208abadc03cb8ecfe2394ab947dc9f5510db72611ac1b72624d6159775d76014b61deb772f694d91a5d1ee0234cda47e9614214413e014b6c3c3f15739ad297302d89d112c5ce157d7cd64eda4b7bb0d93f67e6434d554a44f92608060d4b7a65cbde1cd30a04732e463ba79e65d545e1187f06cb82a1f344499e5c6a507c7ea1cea0df2eb08fe8779da504867dff0f1abfcde6fc3852205afe540b3b35f7245ede3422200ddcc4fde641415acf85ea14b7485fc255f3f927a7eea0101954d3d75952f2c4afd14eebf39730061ec78978788f11534cbe852b902d91ceaa790319fe1cfc8b05b31e8022f81c22a772e59ccdf73cb0fe2ad82b8e359d1e7ff4bc5c87d1b156f469b28202aca02aa26202d44b342f79f9359b5d6dcd6a961be7dc80828650e03fafdafefb13f7d8c7a5a235421936e74bd95734d6e6e981a55a7829bb7e40fc56da187a04976a04f839896f95a7b45e5e19116a70b0cbbbfa85ff6d8fd847fe7a44115a237cca0920807c353f0b53b88007b4d65bcfd1fe6033871edb4b47ec55028303bfdb53145af9dcca24d96da302e26f0c210b6401d8fa59177ea645b04d9f761898fada0d24a2ccf041c6370258642a4213b027e7743d7c5efce76ba3e8674836218607643564210071f253ffd39e174b7cb3e6c6ba40373cd08983ca2a606961e2482dc3a35959af551df411717be1e312cb46dab75e17b612f7893ef2d269afc3090580539984d35f18a692750fd05de178ea55e315384a2c12f7a95940948f5d8c96f8dc4e5384620cdfb6a24411f4fc3e9be7bf8f20a57c6f7df20036202c90d1a1d0e369038ca1d24369eeb067195fbef6512b98bcb0a19188b08b0e02515486a44492578792e79646cee13b03171a93bcb883ee47807069b5c430d7463b25e797863780d8fd32131a2b199cf527fd341c5d9825caed72071f0361054e72c061ddac442a587eaad61bc0c63699f8c31b1f519c3432a46e8ac59308917c6a49cc3ba71c67a861971b86623c6d3fb6fbac81d75954f52ebfea3841c2fc6a75d96b5aeef4bd2becf513934d286d5bef9551fa7bd58df2fa40a80c26a9f5cf68ae2d4ecccd1c95819918ac4707dfcbf7bd8ebb1f3994036693b7388fc3b242fbcf1b25bcfea3ee491c8c26ee85c8306eaa3961aadf8e9fc970175bd457fc081d422e662c8c59d09dd545fa596f38af8af1211168b5e80746a98b31f6177dbfd9c0cc4231bb792d442ff24022482ba211913eb1aa18426efdb26d491256d7bcb0ca56c5f329d08e665360feea602493dedeb5977668129655d4767c545a7d5f8cc6f83d1a47afa3fc879b57649c2391e1bf2940e106b04cb3787f46262668a86d0cbd99ef0cfbec688af371278d78a4e03d60b69245ebaa1e3c4440c3a8a188970d8dc3c1162e89bac3fe3ac3530ec204a4fe9194390632224f60e3b9f13c970c5f3e594a803939c777fb325a1506f19b25b7e801d2d16facf8a14331ccc2aebaaa6db6883cc1748cfb58f5507e0c58405339fdd8b6f3f4efb1916c1da2068ffbbe83736e4c85733505a9d42af9361ddabb1ad583aaa7fe408ef5f58db84472578197ee3c21a2e88c6244b75b6cf63de32bf85aafc52a017ef7afe4ebe16f54cad4edfd5f2d81dcc10f66d715a2da8057e758c9f5fa1f679c66c0b3a38d16ca2e71756271ef22ce94d89c09ff6e000c35983a1446c5f050c3a76c4f88adc9dd098f2171d3abb39e32c7ed6ae9f1d852013f7df6acd531f93a4e276541f4cd426847b70ff4417b28aab73aec4582fd1f1100ea8402faa4337c80116211680c2d543bb50037c3b9a7186ca91e8406f30c5c6025d83a17a2361ea4dd012692306293b274781626f486cf10e37aa16fae99a1042ec2c4abe227bdaa8e7968553d5b333c250b905b34cd8c392dbe13288db956f5673caa7deeb18693e55570a987b48fb24a0e3968db7392b9f6b9ab3c8a9a50bc28a688efc0ac8b924b5405ccdcdb0a20e3f6011eedd0231d31c05324ecf93dde5045eb938f0a9ea393abc921c8ce87935eb6046a59ce6a2954824f50be8edc3f79342d640de18ead692155ce83c6875685906a5d14569bc93c690bec21cfd7e4cd611f1b84fe2a49596ba68369bee309bd30cf2e95c8077212fdbc9d864e3bee732b85d347d5da1b296e9a4db9d4224d4def69f0061e99d5fd3c4d433c7a6bd89ed4d0d867ceb940b30b472d1ee02c3f0e43bc12d16e1fb954fb64520da5d4eace8119235960bbb09082141c46ad9c8cdd1f759f757efe92dadffea02b62e359a4573193c55c9c45b4c02f19ebbcb03210a901c06dac494be39331afaf86a32c8dc4bf9780b14a4551dd799d3ef5efc775dd41ac3aa5960c1aaccf635f4601a32679a9908009a07e045ec4c9b13ca164d631dfd8cda401e80159805ba6bb2531578e628b0ff0dd86accc3b7c444f4ee2010091b2d5a8f049da556d7536cfe572fd3a79db2fd8d3e2ece9bdb9deb7b01a2783ef92cc8c5a1c6a2e722dd5b80622c2761c92bc4b2c85c8cc9d881dbf71975376eaf34e51cc26c55719a2c05e266300b042f783800622a93e3c1734435f507c15bec78123370c5ca0db7b59af5a9f3d1bdd9592b4de8a67226364678c656ba9f95ccdb3e7dc4793c1518665aec95ba1e62cd5e8ca8af74855624c3ab71019508d25bd10872dd20d286251fc31feb2f5cc2553bc1592874ec7e321268ff3b9b836c0c4fa7d2d0ea9a7a55a8454e04878510dbb65219d98a7ecccdb2564a513ea57af1c3956d9051d9e71ce973bcf43876646f1bb164b4119fec2234e41cc88dd910784cfc671b4ae3c110b7d937a6645f47307fe4dd87861b26648dd55297567a4619de45e22eb49fcbf21bae38559b889aaa105e21683947d92afd979a2f087cdfd79524964a6af389375ec392e43b82152212cacaefd9add96b754983c33aeb7e156b6b45d45a7830e36bcda9322c27b4442c9d454030bf4ce57a3d797ff4e23bfb5274c3171f1b4dd5cb28036519e681ddf0c22025fedc77f80877b503f95fa732e30f6311c3a06c2298d68f3470ee1c8eb752266f992ad3ab6299a53d0467d4f113f6d8e6ac6dcb54d3bcca46893ff171929d1ff94e4331cbaefef56351194cd023cab8a33a2188c76dd82c3ccc946c1851f7276e546da9b37c586324b4e8a1bdb3a694153e0baba3a616a70326132a54c452f525b46617a93c3d63bbdcc6d969cf82e57f180e5c818c435b2dc23dbdfe154a3088707e740a3997909d7eda37508823f67421d5f89d03e2e9b8cc953797ce1ec04097f88ec9f3f747ae7859d8858a4939480279a7c0b3a9ac2c18b7076ba1436061545161cd52bf8e46754ac080e4431255b54b8d5e72e19813aecd5ca0fa01a1ce2a3048e2a89ffa1db9f3cb946af3edb925dd7326409383eabb14a1d3ba5579d7c9f6371154bd31ddcef335fad9dc0ff2321d7e5fe97deb6e7e98a9bc458ac547fc1d473bcb8b5e868e929dc931beccf625af0dffd0ffaee633edcf723e89eafff216307c8475f7d29b58224227d3b22e7762c53c6025f272d9aed6cccc4a6159b9e53d627d329532a4e47263e81f664bde69ff8829927ccff6ef33089a67e1a3a55f0d1b9a4f24d1c8bf162ea3c877604fbdcde3b42866c5f8e723c3365b073e5f1d09ff114e4e02c48d3c59c40d14452e982a25ac564a582c5b62cb395c91f7192639216f5a9ae95d4a10e32bd4962c735149731c32bf70dbbbfa13db6dcbb856b9dbee16959348c2c8b4fc0e2b8825a7cd6f0fbd97777cf33fdf4b67f4626f78fa6cbb491c6d35c926788f4298af16b853599075a3bb45834eca245b765f900a49c74c6c5f6a38c9a46be84ad1913ee5302fa73744f8eb3ce03c8daa4936418070623b4162132e249f2c2d0f5555768ce8516b9641bffe0da1bd73a340e30e8bb1356818b78f130778f5dd19ed62f6c1f0bdffd99356b78b00bf04fa0263c61cceb493a83a2b008ef843ed3db4ed75fe0d15235937b5ea54c0e47ce6301b6f287c7ab2565ce2b6d430c720ea9a6cfa89712c33507c9278898316d228d66524079ae3d1dd49992ba8661cc825054776afe80827fd0c3e26da794270a40107a5ef55eec5fefaa5107a6bfd21b6be4dcb3450a182efe99efe2b43380f153f46396cd00479d7b941859139f4e8134ffac790ad74e3240719212a1d8dce4fdd9e325410bffa8444224065fa48549257fca034b1c363b9eba70e1b9b43f80f5ec82d57f9f6fc32c7f24e90f3217195a95e6f400e5b0751acd23f8a7bf909d11439b294fd52156801cca8c058b3c4d45d3e41f69ef6a36f0158b9147891ad8fa6624c7389b1f059eda76b269bd97b3954903879415c30bc983ef12694032ea48625490b0d3aef39f851c0385032d5721c516490139e06dbb3706798873faf0061580a5226dc9f579dcdd5b4b0a031415a584e3aadd6237e6d0f63e04a85805172189341646b6ff85c4446c081801403bf4df59f2613c8494ea3169b1251d9ff41e75b2cb99de1be96d3d9bd9b949fa9e38ad942884d51cbeb97956f4c5b79e14665ce16074fd2b1cba6dbee469c0a53cd05927b66db97d9c6f5ea20bc7205b8d70180693b6a6c756f3d8750ca5d8a427c546141bb456cd251b0836fc8dc99041592cf9b848054b7d83aa17319767ee6d35387842880e4e4cf73c254917807e3c42f7ee0d67d4ed4320cb71aa285e9df38940fc982f91b98021d7ee39109b70d57b16459399ce6bbc72889d84bb237de1698b9408e5c08f38278f1dc0af9d28d36282e73a46b974554d886a98dd94498421870f5955babbdeb60fc20e8d58a71e6e27ddcd2dd6c75aec698d16d5bbde5f785e9ad340dfa0d893e719fdf587c37ffddf16652e869c07becb20d7f76c08c581627c89ebea0271a260a92188aeb0bd825ce801e56afc14a580de40569adef6c8ad8dd798c5cde1e412c374169b22c06c369d241f16a26cba97e89a50696a16a252d00eaad3eea66f96df0d1a883482e767516576fecc1a56d3079da844c15a17fb22262f0f936edf8e2700390b417841ba9a1ee11418eec08059ede8e94605efd9b226b17abd12baab558a680db9dacbe21dbd8645b315f93a7cea5df94ac8290f793864c1b5a46103f9c4bbaaba1f928a092a43f0c2d0583ae3b9ee18c45b25de4ac99ee8a076bd34cb9aab1353612ff28ade6b99755bc2e9beb185fd643db91320695f2f1fa0f72539d91d569d3de9fc3a17f8708db01b2d2984572470cf6046fb3f469699fcd620d1dcda79311f5595444e4d29f263dd2683bac35ad43deee9e382ab45b28ac7ab804fa5998f92f4c50ee9a831a62e64df45d6bff35ed9f1ce1309fb2b1e69dbe77a367a59133f50604afaab0115bf0357c8f96127b7a2229c785f81c7830ba169c3c83de6afad843f0d0b516578855036bdec30985d92994ff79b5ee2a5e2b28b0b150769f4d0e1c8ff1f35f734ac6e29c4155dfc6dff84d6f0136339df5e18dbeeb25048e6aa4955683c96dd6dee3c0ba2495eeae26a62194bb49834425a27e85176bd7e6188ee2127ab7a9ff9d469691b1b2c78e38d7c5d02a6fefc0e2e104950c86cc5af520d5e7ae5a2a170c18cd0d6c25b72e6c3e8b6ed49a5c49ad98b532194752298bff73909d80c6ce3eeb7cc39321050f8c41e659f83c2fe6c7bca0ca74f329bcf55a1ebc1a4a5b16feeb7bc431dfe75f136a5ab3cad298b7f6c1e8fc2a879c2a07976ba1a7bd1e67d69035db93ab6ae6555425a5202b6e2860a131568f225b0aaa8e61f1b3ec1df2cba72951e284faa37c2c5ba2cf6377ebcf47f38f1b8ce4557e6fa6484aef6c65204828b585e977161f3eac4ad6da1a62eef6d3f1bf151edecb4b4a02916945b7be0a3bc906810ca24c4cccb08f4c40c9aa23fa42508efee2f13b92dc522f73badf449a336c43a7bdf9c6aafc1e4be8988df44e0c15304a929d5d4d2b8da5da38755211403f8e75ba472b5fa369a724cd9c7acd4ee4f3c43e4a4eee868477fe4fba1d98dd071606d29c456e314bd8316c35882cca8d978cead72fedb0894d21f721d84a722d3380f9f67dd52210c542c4859de59d5476e624b3ed13192337dfc74284bb0b1372e39196f7a7ea1a1d60189a117f769cae27e1ddd8dd7f5539d14d0112a08983a0a2ef4a1d1d09a5bfea7a57fabad279e37c4e87f099267a58a9d5dafe7bf6699bb7de5a944adcbc4289713601fb29b4de09f1b45a1618db019b2c18e0f6b613bb9ef1ae62520249c28d5857e8a7726feaa23aa9c59d2d74f352cfa346cd7719e19a44283588e23169b0c430a2dbdcfc6fa441824cdba3986ac1ed9655d7ae2ea817d88cc9f08b3b9d37068c67a527ed35e19a596f92510fbd32843430d4a0a667e0c37b7ef99f0cd997297baabd1058cbc74b538e6365a78ae85f1c5254e4bfc8e9e49ed82bc11fcc4a275aa7938a644ae82c95cf5276d873bb044a60fb80566aed859815fee4ca21d8721d86dc927b956312b0305cee0d1bbaddd0e632c18d7dd76485460f0c1546e88cd22fb1a49f100bbc7743fba2955145ad0d720e43b7be769d745fcd05930f244bec9a32a0440b5499ed7d01d1d64b15e3e42b36d719ecf47e94c01a80374a71dc183959febab5385ffe632568701035b5c7626bf29cb1573303e3d69b25d95d3785d52b9e76b970c880706754d469a7aad7602b358ecb1f1d6a7f361d1ab8fe24acf0a5bbfad4ad7195f0e49ce609296304d93a02c4e5d9038abc8fb41010146cdb5aaeb77bd367eeb1aa7e6649a9bd9b615699a42777b668de4cdf1bc6aa8496a2f39cce0d2926acecd87d41875ef37706d2a2f2dd265802b7237404fd85e498213949c20665826e1306aab2314449a476e4f83dc6f0d3b7b05a0b5c475d84abefbe136f36edff1f1b373e2e6ec2a0b6f32972de132e90c03c71cf6045a1707fa9442e82f5a1d87202314740e86e2d3657c83321385218c6d538442a59aa1181751b9a0fa3380de1083a90247a5f15fb8c58ad784dfa1baddb273ad066f2fb65717692b350b4e577d574965da8296b46b6af90073d664f5c8cfebb7d8b3859c4f74bdd9d0f6aa301cab0493a374332f9f8265492d7e0a33977fa408eaf0",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 74,
+ "comment" : "invalid output size",
+ "flags" : [
+ "SizeTooLarge"
+ ],
+ "ikm" : "ec106ebf89b6f25180d59b38861f2ad71b68957dc19098dbccffe888b67eebe6",
+ "salt" : "b1d1b4ab7025f412dd46fedd0b9ae1c82d45796f1d9ec7ed9ae2c5c6cf9adad8",
+ "info" : "37f1b3e4f615a76f",
+ "size" : 8161,
+ "okm" : "",
+ "result" : "invalid"
+ },
+ {
+ "tcId" : 75,
+ "comment" : "empty salt",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "d2ee6859f3e52e456f4b0e19252f3ba453102fb4de685b9823a652acb2f87039",
+ "salt" : "",
+ "info" : "086e8dc0aa05538926dc74e89857232aa7d1fdc3f6ca29dddaba48dd682bcf1cfe08700e2a5a7102d01e57a93bca2668dee95339d5db6b6a2e7e5fa66667b8d5b8",
+ "size" : 80,
+ "okm" : "9270c8f7b8c979c7f537ff820b08ab3b757266a00679070380bba554e30e843710551cf5ae38d6d692749a425b85b4c2fa674ab37e3936feb6089afd60c80d5f2cba1ff9257519a40d2e181ce920d370",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 76,
+ "comment" : "output collision for different salts",
+ "flags" : [
+ "OutputCollision",
+ "EmptySalt"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "f41f703259063d401de67cea9192038ddddc71ede5cdb383aad71894c1a39e8c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 77,
+ "comment" : "output collision for different salts",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "0000000000000000000000000000000000000000000000000000000000000000",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "f41f703259063d401de67cea9192038ddddc71ede5cdb383aad71894c1a39e8c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 78,
+ "comment" : "a salt longer than the block size of the hash is equivalent to the hash of the salt",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "888815e19321fa618f0ce9800b7c2f6d289ed32c23d9816cc8bb36966bbe413e24db80612bd48c8fd8e791732aed62288c3bf97d7c881b8d80dd48fa31b6f5d0cb",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "52a1d834f372578ccc7b57e9149f4c45f98ff754dbdec0bb3a8f931bd14e4bb1",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 79,
+ "comment" : "a salt longer than the block size of the hash is equivalent to the hash of the salt",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "508c49c8298f899aa4f3a956dfe08a58f24944d8366d280f51d11e81136e4ecc",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "52a1d834f372578ccc7b57e9149f4c45f98ff754dbdec0bb3a8f931bd14e4bb1",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 80,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "9962310f7e8c4300",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "909e3925c51ea4b543e30cca4f184452f494b8f20b99f36496e1c8110b48949c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 81,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "9962310f7e8c43000000000000000000",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "909e3925c51ea4b543e30cca4f184452f494b8f20b99f36496e1c8110b48949c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 82,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "9962310f7e8c430000000000000000000000000000000000",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "909e3925c51ea4b543e30cca4f184452f494b8f20b99f36496e1c8110b48949c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 83,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "9962310f7e8c4300000000000000000000000000000000000000000000000000",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "909e3925c51ea4b543e30cca4f184452f494b8f20b99f36496e1c8110b48949c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 84,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "9962310f7e8c43000000000000000000000000000000000000000000000000000000000000000000",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "909e3925c51ea4b543e30cca4f184452f494b8f20b99f36496e1c8110b48949c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 85,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "9962310f7e8c430000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "909e3925c51ea4b543e30cca4f184452f494b8f20b99f36496e1c8110b48949c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 86,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "3ee1fc0d8fac49d494c4a1b8cf6bf290a4a2c19a27c3ab1914d0d21c841577e0",
+ "salt" : "9962310f7e8c4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "info" : "4dc991623624fadef207587e42776cf3e0fdf4e5",
+ "size" : 32,
+ "okm" : "909e3925c51ea4b543e30cca4f184452f494b8f20b99f36496e1c8110b48949c",
+ "result" : "valid"
+ }
+ ]
+ }
+ ]
+}
diff --git a/etc/hkdf_sha512_test.json b/etc/hkdf_sha512_test.json
@@ -0,0 +1,1160 @@
+{
+ "algorithm" : "HKDF-SHA-512",
+ "schema" : "hkdf_test_schema.json",
+ "generatorVersion" : "0.9",
+ "numberOfTests" : 83,
+ "header" : [
+ "Test vector of type HkdfTest are intended for the verification of HKDF."
+ ],
+ "notes" : {
+ "EmptySalt" : {
+ "bugType" : "FUNCTIONALITY",
+ "description" : "An empty salt is a valid input for HKDF. It is equivalent to a salt with n zero bytes, where n is the size of the underlying hash function."
+ },
+ "MaximalOutputSize" : {
+ "bugType" : "EDGE_CASE",
+ "description" : "The test vector contains an output with maximal output size."
+ },
+ "Normal" : {
+ "bugType" : "BASIC",
+ "description" : "The test vector contains a pseudorandomly generated, valid test case. Implementations are expected to pass this test."
+ },
+ "OutputCollision" : {
+ "bugType" : "FUNCTIONALITY",
+ "description" : "HKDF can generate identical output for distinct inputs. This happens because the underlying HMAC extends or hashes some inputs. This test vector contains some HKDF inputs that gives the same output as some other test vector.",
+ "effect" : "HKDF should not be used with variable length user defined salt."
+ },
+ "SizeTooLarge" : {
+ "bugType" : "MISSING_STEP",
+ "description" : "The output size of HKDF is limited to 255*size of the hash digest.",
+ "effect" : "Computing outputs with a size larger than the limit allows to find colliding outputs."
+ }
+ },
+ "testGroups" : [
+ {
+ "type" : "HkdfTest",
+ "keySize" : 128,
+ "tests" : [
+ {
+ "tcId" : 1,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "24aeff2645e3e0f5494a9a102778c43a",
+ "salt" : "",
+ "info" : "",
+ "size" : 20,
+ "okm" : "dd2599840b09699c6200b5cba79002b3aa75c61b",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 2,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "a23632e18ec76b59b1c87008da3f8a7e",
+ "salt" : "",
+ "info" : "",
+ "size" : 42,
+ "okm" : "c4af93d4bae9ca2b45f590cd3d2f539ff5749d7b0864fbe44a438d38a2f8e5afe01641145e389c989766",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 3,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "a4748031a14d3e6aafe42aa20c568f5f",
+ "salt" : "",
+ "info" : "",
+ "size" : 64,
+ "okm" : "62ea97e06051e40b79deb127a4da294f557cafa3d7a90a75c02064571dfbbe4699129bdcec4b39eed7757ce8e3571589f7d8f5523c0dc3fd6a56b099fb4bfd51",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 4,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "06eb26f8ccf28580c8f28d5b4dc47a49",
+ "salt" : "",
+ "info" : "d5f081e81e8cf9ded199f3ae43c80a2dfe3d9cf2",
+ "size" : 20,
+ "okm" : "952b7dfa219f167aa8a86a5f136dfc7aed1848fc",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 5,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "c181696a19ab1a32eb6e81b2925d8990",
+ "salt" : "",
+ "info" : "d8c8de92fe5422c9825996354db1821ba43a81ac",
+ "size" : 42,
+ "okm" : "bd646410b4ef179e10369db6d7e4fe841e7915f8ae793b8f49149c05a0cee691b234c8cbb51c8b038b7a",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 6,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "55fb6dcc7802354e55a45a6e41858c05",
+ "salt" : "",
+ "info" : "dcd590e418b259c64fb9e139b3a1280d5de8400b",
+ "size" : 64,
+ "okm" : "725ac2b568fa0308ea6baeb2175ae9a0d41f8be1af13057f0646ba56389a8f1d8a783da95fc7eee4897a0b1580f7987115e03508feedc335260a293f01afdb98",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 7,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "c27718560fae2515acb17a874991d357",
+ "salt" : "4487f538b65c9058625057b4bbdd93e7",
+ "info" : "",
+ "size" : 20,
+ "okm" : "35f274d31948fc03ce2c06501aaefe1b033655e8",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 8,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "be0df9811ad0bf3b08358a3dc4a05981",
+ "salt" : "c98618bfeb59295f8bf1dd3804b1bf2c",
+ "info" : "",
+ "size" : 42,
+ "okm" : "c5cc73041ea99289bfbc39aaf64595129b461651c69d3de5297d66f844b4d59257be9a82bddf228630c8",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 9,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "529e91a61895f1c4ceb5b6994f48783b",
+ "salt" : "12e4ae515328983bab2d88da3cb32a95",
+ "info" : "",
+ "size" : 64,
+ "okm" : "9c40abb65d7ef9826758a9818668624907b2bc0d9ff6b80d60673d2fdd68418874f48bf1960d75e19c6594d7079b6b019d8e3ec98705a6b4886e122c9eab955e",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 10,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "c360e16084cfd13cb44b0dc02d8665de",
+ "salt" : "685ac7df93701d6c78babd847861bb3c",
+ "info" : "e0ddfaaaa7afb53f59a007a205c7149b5b5a72be",
+ "size" : 20,
+ "okm" : "17408c6f8dd7eb8423758ce39a91b59020f7debe",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 11,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "0cbd136d66d15a4ffefde1303b430821",
+ "salt" : "2614d80275b08a1cf90bae0eb607d4d5",
+ "info" : "ee991de21aeb6baa6a5f683dbb755e6f80db1c1d",
+ "size" : 42,
+ "okm" : "e51c3bfe5f4e9b4fb0d3c3a67bb33a20c288800e03707621cf143e8581d422dfec3fe658ba8fa2e35c2c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 12,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "7a00817689a3d79001825a864c69c120",
+ "salt" : "08bc01c053a6406c7c4a667c9b9b3894",
+ "info" : "967ccd75395be6e96a67759f070487c9e2107791",
+ "size" : 64,
+ "okm" : "aed987bcc5ed33c4feec7b28aa9fe1c16b1181e00ff42c63cf692ec19242f6d4628604b3382db0806d5e61518f83fc651e6f3bd0a9d1322926a76869b98b75d6",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 13,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "d003dd047181bd66420b529c78aaee1b",
+ "salt" : "5a2737f637eb905ba5a480d51a721c012f3ff9701d9c4fa1424f1f5f540f",
+ "info" : "",
+ "size" : 20,
+ "okm" : "16641bfd5d6e5551cae116518a26a1a7de896b4f",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 14,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "75d085427d397b263fb3c6c8e0c40b6f",
+ "salt" : "e2141b0dc65348632396a25c6d7b6ffabf55686532544c351860635b7c86",
+ "info" : "",
+ "size" : 42,
+ "okm" : "28ad85d71323bf7311963124b13a534832cb386ecfb9f3a04c995cdc189816a1034a536c906364b75338",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 15,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "63984079a2540d0bba5d2700642104c6",
+ "salt" : "70b2a476c9a80e52352b503901a7afea41c186bdc872d5053448769299e8",
+ "info" : "",
+ "size" : 64,
+ "okm" : "4505108ef681eb9d39dfcd7e54d3273907fbb06d468d8f3a2d2ccc01cf1792fb4796242051fc770c12a8f782dfe47f3ad0c80248cd5ab28db46c8eb27a2153d1",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 16,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "ef7c6fecad5a8674b65b78c1d696d9a0",
+ "salt" : "ee9d00f7d448d4b3a206bd7e7fb8a9a6564ca80c9e0eb6ef61a4933c157c",
+ "info" : "35054b8177e4ee42e4e51bf60e91c3f56dcbaa12",
+ "size" : 20,
+ "okm" : "55993a8f74405846fbb4e22515088db8cc28096d",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 17,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "f403b6c59bdb751b3f7b9c97fae5226f",
+ "salt" : "9139e549297ee26eae5afea7ee012e683cd7e59b5b8966f55f6d18ded11c",
+ "info" : "27d06c3a2fdb5c97de4506e1bc1311991660c5f5",
+ "size" : 42,
+ "okm" : "1ac0f389936950af705d587295a878693d3496aa81288cccbbb596aeeae678c2e87602beaea14da6e795",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 18,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "d515f58eed428b2bac233c8538580e2f",
+ "salt" : "c2a3ad9db6621fceb7498c0e6287522077acd2d47b55c09d52e114943b37",
+ "info" : "14de8cffd89e49275f69d2e1e6b43fa0c3775451",
+ "size" : 64,
+ "okm" : "04039af015d1b63b0af171e0fc283c06d19a0e4b1093fa5f8c721d85580c52799f13d644543c2249497492f55029ce9cd19a29cd84acbc1488724941a3fc97fc",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 19,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "df27ab960ad87bfe2e173a4659e3546b",
+ "salt" : "1e7ec49981fd4b0b7c20dd4dd5bdfbf2195e707f4d0354611b4893b8a86f61467aca2cf726ccc3ef0b0b4f3240d945ce506197e2be00322b17b48209c312ef9f",
+ "info" : "",
+ "size" : 42,
+ "okm" : "a1cca923d8f07cf98d658b425425a146a6cfea8910dbfee9a28962d0b1a1f40716ebfd19d094a1bba684",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 20,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "24a37db03dbcffbe9e28d582d0d8c60a",
+ "salt" : "4c3d3b4f5436418713fbe2fbc4d647095ce5d5392dcfffd20327187e14fb68360b94c5122203292d8b648a754ab70f6d3d61e0650f06d55c4b5762cba0231e27",
+ "info" : "8cd9e7b786a74bd370bae434e31a559bdf75d65f",
+ "size" : 42,
+ "okm" : "ea18185ff290f27480f625404a39d56582a1bcd8f74f97cfccb898ddf2611833ed57fa46e88e145b604d",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 21,
+ "comment" : "maximal output size",
+ "flags" : [
+ "MaximalOutputSize"
+ ],
+ "ikm" : "83c6fa101a922bf4e0ab38c1853b82f8",
+ "salt" : "7ea9bd3ed65fdbec456e4859209d0e87336b0a04bd342fccede6fa4cb12331789a9af13d3c96e955a74550883aa5a80e055ad7682a26c8b2343088d05f15f80d",
+ "info" : "c893d162bf0036e4",
+ "size" : 16320,
+ "okm" : "c80c2cce5fc294e1e680e665bbd7aac8f4fc270436bf0d016022ef38a2c44790eee8cbbd7215e4a5664ab22c8228fb8eb384d120e1a7fe80eff18e03e8ff41fd3968470ba1cacf52ada34d31fcba1fbb7b6f5e4ed784b20e7b06d943e52cb8e795f4aaf4b4a9011af559d0cc7d7bada79c3c2b24d5bab8ad8608b8ee8f52ddd394e508f5e5de4c04e2f38e3fb6a549acca336a4f280e7b3c51ff63d2008e38fcb8d7a7ce0041c936b42551ce33e37426efb23c648a9933c5941e66457fc4b35b3243757f3b96545c5e143ddf41fce2674c33cb044dc10251e321571c28db9aa0e6cbc84b237881ac4b75b32a8fcaddf1b2e22ce79accf8b7b106700def60046e944a4465db26ef67dbea1c0a152086684f6b00f19c3b714cd4750cabd539d35a408a66f90ba5d3129b2037566b912949144dbe9fd30d4c5aad19dc67957f3c886a0f47e7bb00c131933ff765900b55814546e6f093ca8c74ea7648d1fc2f72d701b087babfebf83b6f599abe5716777ee6ab951ed75fcb9d00d8ecdc851f0727f26a97e90d60e0959da075243a130aa0724d5d63affbf902da38879dc3f82532f0e71596ac29a9aa849f11393cab584ed3664fcfbfaaa11b4cc683685f7145998d08f50254b88235f24e74c9ab2503d1a736bc1c811080bee864c9186067330435939f402bfacbf8ab047741365b2790d78fd75410ad6971b4267ee83668aff63a83cc1c5b333c3afcf240d58172ddd0e2eea97ef58847d534233ae77e8f565b1bda63d71b8c615c44e1e04605d69e9929585db6e426d50791ec3c6040e4d26441f563252b599a543e997250679e816e4b3ebff2f7cd4e421581b3322f7f5a186225908c76eaa864f6ae7dcf19efd0b5ff16e47671c685003042c1e02378265f611d183e0d4ab9d3e2bd3582506335876ba9655af144a2c1aa2c361e4f0812c3c53e657cdc1f01bd30cf222eb8632e852c480422f630d7231e485158981e0fbe59957b60fbdb1a231e9fffbf0108a7f4b0397b4ef937210b5ad6a480a6df096249ae2f9a05b1066e644a1363fba233c0b031d9367c853cab9fe994790cb3618324092948301efb2dd2e70ed55994dac274717eb1296219a9cff564a165bda7207a95af958400561a1c2ca3acc2e2733299b9655c156dd0c6a4ddf7279a106d299e86e671d1e67ffc6d71a2509f67677e87e5c93321edd7037fbb5a9a1900ee423a7162e2109a1f8571396b41bd0fe61f56164f5b12a68e6e3ff48dfa871109fce560fc93b5f50c4d4cb7fdb20d3f8fe1bacba44e5bb9c5f9545b82e932649a5052187c341e161dab48a8dcea992e1f1e5b582e849b4f4b9dc3fd784d0233bb7659b37f32f67cad1fa8465dbd78f8d55632c6cd48d34960fa51c1b29db52ee543c88f64f56df12fafb7ef0a6b14c5f76d565efdbbf00a594a2ba109c4db6123123185b7f7767b0aee6f4ca0c70dd7f461b88b69989fe9d7ef63691899a7e6f9bd9731f34818d3e8d5cc57d85c98e58c78f39fc7a8731b2dc3483537a77c8d1bb8348374988bd29c902fcedf74c17990c964fc263e74e1435eaeb230db42531e806b82a3a0118d9c6fec438f2b6ed3218cc0d483d182e1ed225395a82d78e2b39295dc1c1487f3d941c4470ddd5ed782b1ef75a070bfae771e5a36fc2ae6434396579a226feee1291e15261d8671a49bb6feb68265837dd52635823e788dc8cd3d7c8c0891e16b37f3b5e3220201807f8519746545f1740d7ef11db7944ae8f16eb5adb676ebf87cd3fd78371700f8c6bb546c6658ad20cefe26e738a6a7927685117faaaea0f5b7c61bb45cdfcc4e4c39db522d2db4fb85d5d0687708b40f761a8a2cf91781cf952747ed95463cd75ff10d123bf0d8672b4e8bec7cfd65edbb501e16000b45e0f261c590a40938d087cb0c6ffcf362eadd54240e3e476b010830f286e2e3cdd086da2d5bc7c7591304748d687ae17e2a7169bf5cc6785f77f619145a0396735cbd4a788ac2da850d37ec141405a39b043390d9be2d02790b521475e10e69982c84dccb54231e7e3a1e3be952dfdea3fc2bb9860b8fdf03a101b0bb4fe143eb3b6cdd90e80aba0ac16dd6414212666d18815539c8d7062bdb5077541be9e3c0bb218b35d6e8bd00495aee6b7de848b4ee1f53367704f0685d367ca6bbac7227f1399ac1128af95b2f49b14d758cc55fa3f04f535ffcf929380649439838ec40e92478e8c2735c7d7156ea54b2c8bfcd3f8292fcdf5803cef64dd3a51e92f0be77621b85189fc95abc13e20d5eb97756df889ab6bffb02ddd07b0335cd4f26986d0c50ea0bd30ac525508ce43e0d395dcb22b21caa551e37ef9c8508a3e0e0c2b7d96afbf258b03f515667e74de09372731b373eaeeeaba1456112ec43f349a99a627ed85926454b54c2e5b1d9ddded571561c5d7f4b7d8f7808a97ffaa20252c8de469436003e44839d1ce210c5cd66d9b5cdb79b44681d7fa8c2581609aec13410fbece30ae747f84eb4a6c0121fc1aad00fcf3d6483313bab167ca350308dd67d5d21f42894bef5aa1c3a7e24414e3c1435b22765762b1cc62c2f4cf1ef56a1ce46294c8d3d9f98028ba0d16b03f906d5d7d4766dfd9a7b9ce69480f1e738e12898ac370e729f9b84e4a885a949a26df89016b9b241160094f148890e12deb90a3e4ca6e13579bd020f66dae86f8128a406a71af893e2e278bfc7298923163c5433ed70d717637a52dd1e33824ddfeeb07cfd9198142e73915dfda704ad06e0347f7b43a32c547657d7c6ae4cc1d334543926d1b60813b4189f721003820f99cefa1ed969cb95688ba84ba6e0d284b4cdcbf6cbaef8dffe7df2e1cf64de3873cc445451fbf590f08d7dfdf91f1088578ef944e3b78d3fe2670b7a4721149fc758fc5964f30cf30dcaa5bc493e1973ac31831b09ec2bbdf1201115b3d728805b6e2afd80983f3ce9f50b19dc6c4c375560eef8165f53726c967b6a2a6d8f02b0db1cb3371ad33b759bb51023ef0f0cc9d5f73ffb9764b251b6cb68330d4966a73b6e24dd739c2bbfeea54510aeb23762b7f55aa7d05204d90d88c8fb460a3074b5a9fbdfa760ad56f23d66e0770fc51be994836502d8599ce99e451a7465fb39298ffa0ad469eb05a0d8eb8a85156df500ef0980db4974cd17e7ffe36d77e20674a2492535ef69bab6236f9c8edeab3aa116e159ab6061b2d5c63f247c9c63807828649a3d477c73d7582994afd1ad213035417e1ebfc141e3baac72631f6be0c98c1409dc8b86f37156d17bd31902cecd9684b5dfbdb0b9dc2190c4ba12820a42050bea7ee50f2ae5e01031a81553b3ee5bba96878f8226f48a5df3f46e9d97d7f21b12f9afe22bfb97c52f5012d3f058a839beb613c05be441105c9bccf19a839b747236b413cdb14fa4b7ef6407e0394e32c534fe2d52ea462d3b90b3c18ec687e42551973fb9ec0fedb8a6d98bb5eeaa8ce0020ef391e2a7ef061f677b4b87682de34d6bc7c12dd036db502cb602805172a780b06be0786f1f9559bb6c92a8de4b3f9f18d5f5070668ece9f0f393bf5a3b90c9ef2c0c4f9968b8c85bf5034d74252da8886178d819bb175f4b3d84dd4f3db5ee93a6d8f41e724fc9cac43554570de629cba3c120f709b602a296222cb4d65d0d31644f0386209db0a14830298ce8e0af7792dd281821c4a5de37d0ad3a48dea7480dd977f3930cdbf8ad57f426cd3d4f12974267a4e4b5080b2bcfc72fe41e81d5e6deb77a9d4f127b5618a0192926a39ae09ff0b41463c7c2c5096f9f30cab921c9664bc5f3c9547beeff6774d864b30a5d658e39cd9a52ede1342103aad2cad3e65e8f5820763313277c1a06ed2cbbce4fa382974a852fc1567cb4aa6882a25346c59d376df47ba9d9b9c905d0fa6beeb6d9767adf5ffbab381abf67127314b4db6c45f38e91009cd95dc61ef2c1e4b5b6ad85c16efafcecca14b98f419eaafbf4eb135bc573bf48f6446a4e971d5176795d926c2b22ea3af1029b244fee1cd909a89ad5a4d6213c7272aab8af59ad966af603d272fdfb8d519d8cd2b809db194ef662e6a4d573168cb68eaa673d1fa95a115635ca776a1d96285b5385d5a046150558eea7d29de77c1e1355de55e307ea607c80dd29b6c71d32ca23829d26580f464ae3d38aa5f18f82d1e5097089a8bbb68c1ae3969bb9bbfb5a99d0ca8fa47e0e184dfe69b18af99f1ca5c66d7b980c9c1481bd5099743c3912bc171d44eee0c4e344141a5c8f0a36d473b4174a1632a9202a7c28f4bc63a3e71fbab2807838aa1807dbfecc757c08a19dce0d233524c2f8880df1a56c58c446417715f3d2d50446296e6a71cd48ff00cb17e1f367fd4e30f0b0b9f83319441ef42ec7cf03eb25b03574548c6f9b61f3b9413044c370ee1ab0bcb58dfaed52110e65fc9375f10ef40b01db48d1d73d73213b4c6ac5c08a901e1a813c02023b7e7e3b31bdeb58eefec6832ab906c9363e2c3598f99d2a0553469a4cea4ce8e8e530a9490347b652ada4d4c5e201a6365a988a715b08fb4492b52352efe4ba1334e5f737281c67b71db0097831d81bd6921e9982949af2ca410dfc5076368ee5679257ba1cb44d81665c67a74082c4ff1afbd663d6616c3940fefa522d9aa3573ed3868af411a9acc9cd863636d89075da66161689e2b41b0d57126ba0e7697dbd9ce5c6898357dd0e5fae2b8491c02cde0d081c7487e57adc42a1587298690989bf26ce08642411b3c9b02784e7a766fcb10b6a74715cf24abcb4a98dd0aafd63c2d5233ca316a2595c701062d57be8e5f83c53b6400b3fbd2cd45a6e80630ed8533b0ef5499262a5f6ebb1827d882c1b9c0d0342b368e05d6d6305428d37911433c5582a76dc0ba36d21e3ce20fa689ee687c8841f8de6efba671f5d79c9fadafb4d256db5be66e582b5b08b078097aba3338435a0b5a71b73b39ed03daac668c3b8a3fc98602ecd0c4512b7baca1b4c77180346401560af4d90fcf6ef25bbac7a695d413ab530548799f800d2c047d8390a37ca2438be648abd553f47094b9e7c5eabc9ad1bc2081351ec8b8a5aee3ca6d29e2422ed8b6b8892a41f0757a4a4140dd93658212e39d683cab7fb85ba362f552bffb4767c4e667a579cc90da14fe6c3e69ad785168ac4920628ba0a441e0c357594b8de117d19f52087c387abfc0b8127cf378942f1027fa786d68f9ca1ac0b4d2cd7bae0f0b8e33c9ff92a438c4ae3b343a3899a8aa659accdfe25ce127b4f716defd62c1958bf0f6c522e6e51dee83678edca87b5453aea98a07586d2510af259364ce786cebfa41b1528c87d9b2d371b3481bd213a656ebebeb1915ce582ff9e2376d3bec60b60666ac7af26ad0f443321e01d3d7d6174eadc6ef8e506f99f267aee7b974e15681c390c26b5017dd554272860dfb5926f54a7c4a961b41687121ad925e9e89b24ae9c6b77e988efeac6641f568b31d3e5848d05157887e02bc213e82ee376a6778f3ee5d471a15903993113dddcbc11c30dce0271a8323cab2e8de330d74cd4318c241f337546036220f73b8383731fa41a198090736807058e4fcd8bd35682a835aa0338682274475c97d35f057d45fe91580a990006cc465503a3b680808cc2abb9a911b173894ecf6415ce14c3dc453400b35ec1818d490881a15fdfd43423b6c3e1e8494a35579d85f09e2547b31780e5a7da13c8b1a3419b0f5437485b5b6c2bc3caeb45e6145cc7873c6a0974d386901aed7301dfc6ce6044cfe703c50c1a7e745821c7f2f2fa69f9125f797f76c1bce53e2890f03da5d1f5f5c2d812f97b666fd33c26cad64f68f9b579d711f111f3ddfda01472bb7289e9a6c9ef6181ac237952e649b1c35df39ebaa90557d6fe3898c73299ef7a5516f58c0a7d8bccefa9a990ef7fecb7e160c4b1e2902b4d9b7c90e01c51c0ae42600e57142be6e143b27be602445a8f36e37baad53324a4df6251424f8036e0828ef6ab5cb3519817963fab0f8a5aaec4f68435dcb586cd4c3cab899013b052c6116ae8f09806c69e5feff2804db503e79c56c74550af0bebe3e49149bf826aac574675a60b4e3bdec8d956ac0fc075a0788d12f7fbc6463049f87864ea2448b2275ceb5c220f2f99e9982e1dc380c8bfe201cdd8cf19af84bd3a859d1fc1f2ddd78919bc1c9fd3982df33e62151eb97486c5ac70f1d282df0b995d82bd1f64b1d34a9d5f249293b6aa4bfdea8a6afb3029ca90387b7f506cc127965a96515aecda6ea5e317cd66bde1ed4ef9e71965bf8a19338d49d692d69fd494002d540069e9220ecaa0e0cc42ea6bfd0e52a71262d01125f0634f9d9eef1de0fc4fdaf256472b80f4a214b87fc83f74303228f782cd7138e38d1fc7f0bf4e9391b7cecbecd9cd84e49a9450bccfcbc7cde1be3a8e03ea209726affb0339e6acb80acab9692d3faf1398a69ea38cc83858a5c84515608dc7c33dc4ac4dbc8a3c07bd07fc3ebb2fc73e7530aa9a095745507707befb5dc080eb0622ec30f5589a26497d7005344b07746e8dd62839aa52066350cdaed8733302e6d4b84883a0300b6fbe82a99f87cf371a091a31202775a4d6534b53fedc419dd426b6d407e06afcba98d20ef40c19f20e274c73c0a831ded3ea77c0175e790e4383a034b255dd37e3b0ca2c7af1db79407b555d967fbc5092388bcbac99495d3d6c5b222b3eb9062fd61d2267cd4d90c9505531dac82b2bc68758c31ec1d4a7cc7eaaa4b22d4ae0b5fe44043e82f531ef2e0e195e6897a6fc0b6ad2f9ea871e2758db785870f3375ec66de62d875f300f2ace0da62da8bf982aed42d888d332e6ee906ac854d6dd3be37d82b6e4602918430716bdffba599488a1de044e0ee8f4b247a675cde185ab82b25dc23279f4b289071e43f7dd624be931295d6ab1306528149d284b916b50d0efeb4afa013c7bd58382cf396b0de6ff23b1f94988a5810f26134bbb2df140d1f6728e783b450b6b79f36482986f7c106f50434a16baf4634c9e8e14d186d365baf733f6519d6b55382041a4f9fff02c94ed369aeb9574c373ca4b4e87d794b1bb65061bb85ebfd1944ac29e92861110e29018c41814023b28c0f3327e882a7f77e3eeb44328199ac35cc4163c61a4d0b6688a479e0a83a3d6b18de247d5653bf8cc62adda429093bc8e413c4cca9119372a495b1e6e248f9a00671534c8436ebd0be32965d4a898519269667e4ef4dcf1fec8a159b4b566fa3085017276728141027c0c4a3a62051998f46232ef6aa9367a671dc2144278996fd84aeb81ce7e5ae26b9bce409715746fb85a33c42f38e02f768e38a75f5fdd5bd3d1ecbefcce339f5f7a25e92e7bbdaca12f9f3d971f586d3a596d087862afd23c04d5a252ea33c182d5c328bdaa27862886c31506ec60a3e6cf1192598033e41c00a58491204c094bf9106d89578d9a723e2e7c532843f4676eece77c96ed636582c04ba6f9cd26f061c151cb6a029f8be7e852b25e2b3624d87ee23030948a07a0615af0208fe470d93521ddbb0273bed1f32a0eaf74c52296c4f91e8049409c90aed77ee43517dbfd74810f8942c1b360bc50235f062329b72837a70e77e195821e01a087567010962ed00c24fc932a083b42e373236ad6ee7bf9437c4bf71a43641612b090ad856a8bc153d226ef020527dc63cd91b1bc1cc0b0d4ece08c5b7719a6eb9debc6a05b5c6a8ee33c7af86e9332b72c098a11769f34b61b1e5ebce37a6a9e2fe54f5d0d1b16fc0c90ee70e3d573f362c4de0405b29dd19a24395ca04f0b1e4014103b9480ace52917bbb66b4746fb96b27f5ac521b635e845f5c17692ba4dbde0526cd65fefe565c75e644d73780c757f4da950f1b2521646fa3ebe7b513c081b4b7acf5912d26e410c7f295bcb6ddc4ead5a977a157423ae7034e0d2b5962c4f5201da0c3e4beb3e81975c79155f43b8165e0074dedc91eba01cb10693800911a481cbc1090fd9fe2c09dd587a2c91e36c483638d4af82d79582b02308762bed38618f41fdaca6365dde39e458f993986700329eb4d1929f2de6ff4badce3ceed5845fcf389a82a7cd6ffaaee5170a29e10218f74994ceeab2b5c5777ebd50b3be22f8211e67c0f649dc624531de62243dc7d6360cfd1477f096143d574207c36e1542b4c9eb0f1b9084922bb61c1916a03f27529f3c97e98bbc2d1a88695bebe23d879c69491b697cc94bc676879e84e57aa2a7574c3124cdf0b532031e551937fa6ba352f3378a43a23811ab0c9cba176f0f37b5c868a4e1df6eaca0959cfade329201b41d797ed7d27762d8d1778803ed8883572f2c45ed3e185ed94dc7897aa42e2a1100edc4b3aa7864de1694f5922c00a0102525830c003d5b72cb51dea8f07f96d8498ae058f432f61f657f1e27db8eacbab7c4930e8197b43a40d86441d974243ed45c6e9589750633030efed4d9446790db8fd21061b44708eb5bcc8da1bc261fcbd00d492f5def81a86f758dd4c9080e6e32437d74cd57ca24a9cf96a39259eb937d75e750a64d0d9e102f4420342a11b5ce9d55ee4106233fd1370513ca9039aa35b0f55a060db466f817649b4adf11d09dbbbbb8ce9cd9d1434e187c24de006117203bbf10fa3ece16827b198724a179097f1c1cc1c3f983326acfdfb5be3207f6c38c29808dd72c8e77f0987e24c287a1b9dff7fb66eba6ed41c9e42cb2999691d6d0aede0bfaf7714ff3fd2fdd7e7c3d2cb4f29064514aea88255997f66bfa11fbe1d67b7acbb1211e5ed4d7f1138c78fe41c1b66539e693a05e1e14d7e608e25c667957febe7dedc43a866d4cba4dfeadf207ecc0826cee9c75de9c4f423b305dd6a8696b1e6dcdb7d3e4f9fcbe7749f5ddc0c59980431b0413d9a292778a11686c080ada1a077b028d84dfd917f34743a1e3af84e38fa60e3846c819ce887568c3d0965873b33b1f3f876f7e3912add330f5886e24329e64b9ab7dce8350cde011105c213711e1e363576fa5ebbb32e938a0302da80f38c348f4097fb11e0859a1541f14dd9d9d99e93465ef28d201f29dfdbf008db8e0d43245e7d2041730ae8c0a4ab5d1c9b5e672966d30652637da2c9c79c33a4db45bc22f54323eeebdd28aa9d3cf85d2535cbf8eecfda61e5810348c99a55c94d6a582e58308697e82a8fe0f4f48041a1b9b8ec80c501780b6ca1bf7182a1dba3b942817d3523b3861231bacea2d34304441e68962d10c366c786f26140b1b89bc6de67ed97268e87829acfdfa76ce480906592688699f18a855655ae5cbda7a26533ebb42302ff9bb1d9e436168cbbe09d9b711423cb1bed327ab66321f7ccdccf20e676057a97c7f6d9ae9816ad34c6009c33034f435bbbe749d2b9b1d6ba4f6b28e5a4ba67c0ee48ab8300e386dcbda99e6dc9a30290a6dd862fc6e8273892548df9da9ff9e296688d70f404cd5846823c4a35c4670f4462ad705102cbdc9bd819e57b0c8aa81fd32675a631077734b647367ea6f0f808b0b88b81e985283bab8815d29a016383397908abb72c0b941594bdc5d5af2606e0be9349fc1e02daff58660ba9ca0c1e29c84a3721b76b6be75a8e3a1a07039d15c29cd9982349d611213ead52b582e7cf077b28798ec90b57730613658a5180b57363486bb822406ababe39bc76d1d0a9c77017521231b42f6451a539fa577954238a8a418c4a69eeb8c0806c0c89c1d70de9dae1ac479fee530b13f806baf15dc47a57753895b058cae6c68dfbd92ddd11addb76ba54aef51d178c2647c19ebe8f3d636d0d61e42e36003d619079d9bf21131a60b321ad2a2980905856dc90a53fadb7c4e1bd1811faa5e313b08c5ad85f2f9f8433fd96716c0d6054161346acbe208c5a2aae2788c8d925303ca34f229af621ebb2aa8ea888832030e78634916d1b681b5b1cc3e9250406370d44a83551cc53972fdfbff1f7912ce8a0f602a5b8c9a49f351b9e3b08ecb71431cf591eefd96f40ba8cc535ad24b990d6e01b9e49706e308b205bc314c1fc5810c02afda616f8544e5bd685ed0b28b5ba7a2def1b80d073b228fac1b2e8283458ade9080be5e5c1a099b3e771e99241def3aed7a181ef604a194814ea8a5acf2601c59be00ea06e7d6da43ff3e150b6015075a33409839110325d744f913704f7d876ff2bda73b2f3d9f33443fb9d73412f688dde591bac9f6b2a3c31571206d5cbb211e74738a68672356bad89a0b6538cf64e43232c7d44cc0310d90e39d3a8b1fce334071f343970f75e0ced49843d0c17df64d6b2808111dfe8127a5e1679fa1e966a5107365bcad753436312ec68ff7bb453e8df4b50635a5f5dac0fd011063d7ae70f843b19982be29df909cc899c3f2757e9bb39efb23bf2a02991904619896e5a0afda7d98086bedaa9a991aa7e2102d02c8846cc2cb084c4d56be546361678f0086e5da8da2a685e72a80e0f890ad5f0a1dd60dc289e297192545fe9b8e987b5f2ef72ffb37f873f8db82aff52ee1a06f359de8034178b49cd948e45a8086718eddb5659a3c429ef3dc8fb63bdab08126f083954b6c0d127c17f866d2bdca4ad4883956e8969abe003189d44e90170eae75d477dc3a8eb8767f07ad2c47cf5332af7144f4dcfb14af292c7de41c507a933c25cecb8a0e633d78a65ff33588fd2dc260630f03a3686702428ad97165447ae056cab4bc9f36489f410f252f4109c75a861c8dcbe5d28fafe28967a04868a7aae6c665d018a21f0389ae393eafb1b28adfab008414955db2d8b831666be5e33302c709d8bbffedd8853ef64afc80f6f58b9ea105e6a213e7c7b350ae7aa51dcb48d8a02cb26d7807bf5ce97c6d1f3e4f1c0cf92009b89f2a44ae10956d7905f6b7f78fa2dadb952fc92347eeb6d4393d98f89a2d17eef0891544b42db0af904a91216437d3c8e86e0a26cbd4a6532ff0d22f1941eab4e075cdc33957405be2c53467e538ec91dd4e886f1d1072ea0f59d5c64147a101c5f449d881a19c9a9f6eb579c127ebbd63a095e33381930e79b35cc2830fbd764a07bbd0a3cbcc73a68566d765037526ecc47d0d8c7de071d0f9021845959a38ed281c7a99d5b66ded3fa4ec436ac901a258dbb6e477a5d0d4ce7664df13468cb4bc71971643bf28b749cb76837a0889c315154affa0edc7b23c1d4cd4e89cc92f23bb2d6835489ccb802f8e25a41b5e66f84409aedcab4b7e2571758b685d00973ecc94bf28a31273aebfdb760226f3dffc76d40c8f3ca37a51df3c6c14b398d9b70c5e9d8d6cb5811fab9b8fdb46fd11c74afc5e1fa945f620c7385d9298ca8cc9388ea415fcf9330945c9503b89d84290b35a5dcdee7a1300311a4a20276ceb822bd7d1690b8bdfe11db478d54fec95af47ce40dfd39b3e379b8c47aac4e20abff36e92038dc7c33955848869393e71fd9926cee3eb15e932efd5e79ce6f77b16ded87e8899b7bd293a0d8ea703e768ddb175b69b14971c3c7d4e87d28a994705cfd0b56b0bca5de9bb83b610f489707b696f66d78e2a7b71aa2c6341b93466f51260888682a28d33996104cca3398f18619f12e2c063163b9ce4ac601d72517cd63e0a402cbd0b4be9729852e4e9bd739fbb76efc83ff2b8bfd716eca614c66a2a931e97df933e9699db079546d78c6ed9c8017d55eff236282702b34af889af4ef83ee1c1aaa827ce88e35160cf5d4b6cce8f1fb317b0b3081bdbe83250d324dd2d31dab60815e4d695f26a81286247b63555f1a3b3e25e3ccb5ef46e95f6eecf7180c9101ceafbe1ca435d3e0953fbb7fda80978e255fcd1b2f5932d6effa7aaac7bc49221c9820aced2b6193e4beddf5b4aec0c2edef3434f54d1b63dd5ba1d1ff76dd6e0e68163130c97ce3511ef633d496a28232edd280f8c460c99d64aae3ecb2b8380dbc3144d455310d6a9e07fd0b588bbe73b20c70ac427517f7a126ab28e413cd25ba6a2690d8c9ed505fe3c3c43235e78fe00cb6f57376732707c2f11141964c46a7b6fc40df942b2e74caf37e593ddd5058db9de4c488a099bf6dcf00344f1e01f333b9e960c87a1a45c23d2755ead06ed7365c546b36b09c28d0262e676a8d7d8bfeebec6b490867ff8a1c2a87dcfe21935f3851bd5b4dff9faef34a26f0e37e52e695f45cf6eea72b8b01f6f6b8be1a0a13f1727a47e2414319f117e0c3f41523f48ddeaf897aafcbeb082bb1a36c98370c6b8a44b05513143df85d18aa8f40af20c982d2531035b1fa06a8089e7eeb44e37b161597d3c3a4fdc8bea26e3dd412102d313a2c3732e40d205d4ed466bae2d33962ddf0080ae2e63ed969225432b85f28fa6a0d26e595a0318994da8cd1b1e5ca2105c5fa0bf5e7e16424ff34816df22c2bc6656bd895a98d817e9afce6160a1b872ea0b585cd589ba266955f7c4de9fb5ee6181f26ba4f0e9349afce30c5fb3f05b58a706c3dbf48628ab133904698441c9664bc8be7f8faf352d49f6a422c47624422bcda3899d073ced89d73676408834d782e48ed5e281845797e82038f2c88405027013c5f712a5d14cbfbac675d38845b91ddbff07206fa756bd1220a8593107501689404738b35c2884b3768bf9bfb268b106977ac8f69e003a5dc3459e7f27dc386f624c4c4637f3c0f8f55425331de97a82094c7eb23969b4a4357d01490499dc8a0c05f6198cbc3bfce7c7029de665e794db541b27b165c05332723bb9977f9f4294650e4576287029eb90eceefd52e9e0eb35ed69bd878d8b5881161b509e3cc18086356300e3b1e7c6be1fa153ff2ec036680b3ef0dfafe85c765535e810ebdc27c0873b202966ec2c5ebcfd78d3a6345f67a2895350591f9957b86c6ca1efa0064533f26640895b6e3d1fb2e79bd3aaeac85c699ee5da37df1fd393ab34438b624ef95aeec08ca1ad9a423d56394783cf8f9ffc29502533dd6204d73c12bfd17601564ef2ef38bb2418a68e3cf3b054a289b02ce758b07b20812a1ab9577d90be54d9c1215257129108db10cf9c76d1b454aa65ca9c94111fe39cc6598800b7a6e7fce6852f85b3e9096e34ff264f6ffbc575074dd43472f5ffbd1913cb0c88c49289f40b403395d04dacca483c4744d4f6b6dcfe579dd23295dbbe3d4c35fdcff7c354cb29786fbf41bdfbc92a75c836ce7081218539059fa98de66a3f2d48f87bb120adaf2b22c6792ffecf517faeaa798d6b5f5cfd61fe66ebe60cb6a9aa0fd952c5acdf79557eb19a65ead27e717c2a1f8c974f13e18b590a7995aff2388de981f75ded0a4686b73f6fe78c01d0c9a0434f3756f41e125ba514d081fe0fd3c15c2c283d14b87b384ba8758c7f61835f66dd81956ef28f2267bfe61437e26f4c83982f3c6bfc671489eeceb5df5071277f1efbd53e521b8cbbca4fb09c539514e90954e960a723fba7188d106aa97ff2ca9b8f9e28b2ad7b8e34c559970508796a9d622337c9ccba9665a067fa9433043b4801a391484bdb7ca4fe4a59e38e28eb486af8ea469facb0f8d7451d7be96d622405acdf63eb4703d79f6e8cbc8459c0a5f15c479087672fc86cbdd733bc41fdd78aedf0e60c9c1e1f268945ce4be44cd79390fbb73c113df2b4de3699d6cdace0afbb6d5f4b395b72d16dbc43c50d7cff247e6de4fe268e1b86ab6bf81e730a7af3956ccfa7310620d367fd506d34a557f14d414f71a24074107f33e33ce4d3bcb5debca04e7ebcacffaa8b7733a1698f4d89f72cd79895971af3cf7812d7f29e932b59b69b39c09832ccc35141ce0bfb9db0dc9e28c8e97d0fb3878d4a06c5468f7a00b6a1e7a6f4ea1cf5b9559d407e9929ecae60984a6d245a107fc29d0fd597d935ae306d30844c5f3385cfcbaa2f09ff29202dcc9858e1599e4bc2228e24937381fc22a5d8f9ddb68789f1b2bf30927fa1d3c2238d77d25e8e307f2c2505eb664221b4bb0705ac26fac092ee43353afbb49d37263c084afb70fdacd5f47360b6fbb18109f46e6bfd32b4446b23ff096ed371fd0940a612cf3f84ce034b565cc30a7a944e3068acd4bdd7c686c7f9d50c36b0a5d4ed5390d9a91e48d9c2e8bcad5cbb948676b5ee817625a2f1f28915a4355abc3e1a41228c86a2f4a4587a63db93aa3e293b9bc409dd39d3d7e576801bdfc67f7ec82c367a6241fefb73ffac4722909958371d52fc74d24a45ccf2dfff1da5d3d25db802247cbc5c4145c2479e4a1e7dd6613b011adc2ab3fdf45942cf36db85c1aa85837383243f8b7b767b2e3ff22b079c6bdfc93a8416b20727c3b0989c01ea6b3b9b73ff64f458258f646be12cd24ede68b7e0608a47973a2363aa4393270c3775a22ade83675d55bc44d971347804dd39f7f55fb7ec3c14dea7556ee015b23c9ecf08eae8021263d442999e8c16068c2ab9fbc9a106e009bd7650926e882fb91a248bb3cc4049544fb022ba5e29400986860ecf37ca2019005f224b4146c9e080e9f4fb69632aa9beeca7cd61c214001e2b330b735c71e4c111512b712018fcffb3db7e052fc98b698a4d55a6da15b390a0e87cf4cbd4d4b2d4c1f3e847be4c2bef3a508106bc9aa491eb925a9fab98dd24e29f51a74dddd98725f84c606a6aff8360613f2b9909cb2e71268f283bbcb36b2f64a07c00149dde19f39c0d204bd688b75a066dde11670bef78ac1579bd75759437704e68f5255f5a0180c00ba140e08ffc3001c41c4d1d492e931816070bd9d048252d025dbf079a97ab405b9ccc94dd5cc7cf02bf42df662300dab7e2d087c847ddcec8faf826b743872ae905e14b868f3ff58de4a730589eeaaa9247255a6bdf30cdc6855f4057ecbcffe693321d83bce4badd4ce4214e28dd56b9dd6f750bbd446c89374a050f117b78ec9f5059cd5f9cba4020227bdfeec8cae28e07acee502f65ba6e27655a276ae7adc004243454c23fb1b061600f439a79f9b553976b38a0f13d1127f6661590fbec13fcec5b43d7daa5362dd057c85f6449ba42958ae2a54cd5fd6cf21e1bb90227c84725f0d55aaf383e835c0adce4feb26d322cd548fb7ea7df4f2e1da286ecd02060a63024d83e5efc3cb9bab9237c0d63060716450bf33c15a26e6a8ea22a73d8353d5cc5d11bee90e80d206d5555f75c2386ad459cbf0e767fbdc6aab031eea748aec34a3bb776e128805a494628632ebbfd39210cafc96ab9a15e24dcce9b15f947d8c4e515c0a176882b12e5c4264689b64be334fe36a63534e2143fef9f079474cbaede32c45b742ab949a506f73147dfe1b4e44ee32f7c8cbe3096584be6fccd554b655f4e5db56778a6253963dbc1b92802fcd0457e59efea112261ff937ec8d6bd16d5ac81775cca6fdd608fb404f9ff4fe7ffb6c551a2bf75315fb82708f26c31f3b59a8606864ac575fdffd787e859d562b478080d2b60e951f760aeb8ddd07ddf3e1523cfcef2c7cecac3dced65db2725eea297f1debe26792bb4bd5825e544163281bea068a4f9f4132446ef594238d65332d41ccc0d9451c0c4dc95fb862478521b6a51c351415754bb32cc7859411a894af0152bc780283cb7509b4461281a5b27898cf638d52a7ef69b6d3706935595cccc60175d501be50e9e5425f2c9cc5929fd817e71db7daaa0df8cb3ec45f09727c5a44498d853c543a08bb77f11bff1dfff9d68a586c158102116546d0b3a67dd8669a4fa920a529544b62a4691b091014b4042b24644e048cdf3f2de65e9a2a9096663f1372bb2cd7483d8eeb30a64bbee3cf868236ea8563d1f8a9d0263c71b5a4c346b214d6e8f313c17cbbb80b37ec818dc1476f4ef0c1edf07b91b4e1c76346955224cd8754302d69f24c54989d2e332282d53b867293e0dde497f1796ae699866fb353c99e28b73d91d60bfbc3c7f4f7044675e8e9c7da7eabdd7aa070c39ecf31bb666d2b4fee2ef9c1ba1e3e20674e4cdb068ad52494803ec5a29ba7a89fa960949a41259e529a4864df4ace9a177aec4a076e2aed1924c88e9c20989b0c599fb023caa3f2f21046afd2c07a61375a9cc5b4bb88ea5ec3b38e24febfbc12c3a0bddfb01400045051d3d651391fe867db6a0072621954c00d892afc51c088b0649cb9d065b125be532fdc4704cd587175ff1879d39f38b82dfdd5310656302b1bb2f13768f879be8a0c7ff44a5f5267efb4a241433fe0b6e022ff360cfe54adeb25eaa73b894f1540e200ffe676030a196d883dd991b5f0298b270a196742e231c1f67c985cc15412563d1a58718e1788096d1b19c34191da27b3860fca54c6270c7bbe70b2c8b344e1fab78e68ab40888425a073e8198bcc368f9e36f55bf2567a38d7092b99f131966fd6a726a01db56b3809f8da246bf54aaee5ba9433f944f748429d730fe9ddc131f635210d7e98296bae9c6abf42c4e797f611b8a75e245860147a29aacb63db2c60965d3057d59a3685578f505d90ac2c8f22b47bf1343cd652aaccbe348a96c6b38c4f23d3c32ce12b76c7bea99adb6f196d377e6a1009a10223791a6aaab8561f658caafc30c9feba62412cdd689305c0da758f9dca8a74fcb913c3374b733e998371589c749a48df20a16d89fd718652c111c6c2be8ecc43b83dc102462b63b34fa88f621f1975ed683f5f967dc0a43cdb1b52cab0a89cb5f47ab79be7e69b456772540d3b50dda10a6095e96b204960686d77c2f13b0f7d2a7112f1e91b539d4b02243b7a0d46d1deb1a8fd9cf4ba8e75e266a68d970b5cc9ef2a54f380fa3f57f56f5e8007757fb3ff1c6ea25cbba00d28390a8fb19e457582c85dcb4a0dcaed9743204fddf45f0460e27bd10f74bb62b840b6a30fcb9b01a0ce5ba86115c28433734fa485607a9680b361279c06b5fa71c11b6c9bc015697684770b43b77b65e04fc4b67f351fa9d98397818c26365f1c03f721be979ff2c720378a9c28eab7cd951d8f563c68a31adb101fec2868c1f34dc0325cf750c215ff1c4c948cc7ad10ef518e760424ddb5f30435c3f601e46bd42799f83580147742077b9146a0a70c5dd4aacc19d7ac3564bca108308046b647f17f99c41a699e2245a285d07be4f99c150b4c4e8679dbdf48b5beadef1e85c4c273918e53fad93f9b855c6df26bafe14eab6a90a532d57ca81e842c8426dfcdbc2520671c4b02513dcee9346a16c5ed9366fc60b5a67937ab1c6d15cfc7bc99be2a601ffa80b8701eb6446a1d7397d77db1762bcf98d36a42105e0ccde9cc9a9a875103757a5114ab61599acd59acd3b0ea0671c8bd88adfadb6ac01625319f81e91e6b6e59d99853b671f4b4d91f53c9feb375b17fe240fff25076dad74abbf8e0d25153b13aa729de8d5622c8b02fc4e8543006fba7822e12c11df2ce0d58e03cff0742ad277e2d764529ddaf98624d76bfbedb000dbe1451ba399ac356569dd1fcfbc191871b1262e2c02da9a2a8f35eb788e304f91b5a7e1232df3db3ff8e23bb091a71acccb78abb3ecf50bdb52c87d074424268509f64112dfc1b92afc6ef16d80356b5c8392944e79e5c6d6d3dca7b48d246a19b0903cbe6e11797c61d434ce8e4e0e81f184ff2542c9f6f04e45878dc886285590feaeaaa94b54c14c0f42458c75bdc3d9cf069d38f0614e612753ffafd542178ae2446da23a121d71613a3ba787c9728f1e07d825cf6d8757fe7c18dc5a6626a2d221e481af5b416848ad97ab7e7e4a72ac22697c1ae581e4a09eb5e45c0a74b4208d4a1e3e0be9b92b5e6b8cf65be646f0fc55e3f0ddc5d92316098da12884450d2cedbd2980ba7de271f80bea99e99401ab37a60015702381d498abce2a1a19dac1d9cad76c6f0063d3473b2c511f83193f5fd4cfc35f87c2d12670f6701349850b4eb18b420b2eb62b0b59f230f27e962f164ea0879df231ab06ca5507da4bf6b4c4cdf732fb89c5db7b8360259104e2cb15f5ade28a727724aa55c33bc1fcef9b8c11886cf9c47099d90bff7ece60532c2876c10e73240ca85c5f609931917414bbd13e78f9ade49e5893ea9e2ecb6ce8218dba1e50b4165406bb8fe0367eb013254b3d505051c9d60656af299b8e69f8522ce48a7ab15d2ad6056f9ea7448787de9147c464e5bf0cba26344edb515011499f8cff57bfdc580483dc9d5c5dc9aacdfd1b13e54c247c066a60046bfa109d6060949ae2882107ff5e69106a5bc544c7651f35c87b4d6c88d4c8068bf6c9680619f9bf561e5a3e0f73e9405df42d122b525a16e84424ed4798f9e88126953e6ca71877d73865f6c7241089d2d405dba22bd314a6ca33c7bcdcce2cf5634250c36bff69ef2250bcda28881677b9b38c2744e24dada4d8f67eddcd57f46947e1070cd5bd91fc2729719b47339eece397f5b49ac8f4b1a7c90d32e34a7fa52d647c3335181bad529dd1de162f260b5f26bb9f04bc1710a33b312c1830f12ce9f3ab644fe6e8e2d7b391123379ba2ac84ada7c8817af462392050adf89d730fd4df2a1a8f7c7ea67212c338d9824cbe332d64f7f976c67f0c3521292de4a191ce6b23fcce3282336f34c7619de2b06f5296bd5aee71c7854e862b5caa97c7bd3e5e990e4912dd6a064187543cc0a1426e0b35f8741d2eb7157fa048a15311f23b78f040eed47ef5b04615af98c6f22c1e557c8a1676f2b21f05b1864329b69e1707b960314921a50aa8e801c40182e0cc3805dd982fb8b37426dc1b99adf7df217b8c5669fabcc7da0107a0c544bf456b83fa0412d0aebcca6f3f5a8f0eacd7339aa655e55c80b8828fc5d80ae7cf63b614bb665a0e3dc8ecb9c2dbc8d76c806e99ca7c25fe8b5617be583f5a747d3732345a5efce1161543489492800385cd464b021c661b2f5483b0753f387fddbb33ed82a9555768cafcb519370590c512248ea39fb8fec0a3d0c0b86cfa38c8013ae9531c95a01757449ddd796f9aaf03bf3a815606f4d6d2954d4c332450999616f4ab51bf483313aac2ee17579522d8393ffda0f179cf25a103fd911d5edc6c96e25bc2b71c065e0193c27679ce520153bcbdc37865745ba33376c478d1a6b1766cdbf70ca3bac6bbbc7ced5c522697cf31d97058fc78385acac5f0b1908d15a02a744f3d62909ebe355c955bddd09f0a5d0e77a7e52b11c5bd70ed941757ab100eefa19213a14ffc89e0e597461d42447419da9d9c514f7a3c5667be6511291bcce1bc4215ce8d103cc14548188bd9d00d6bc8d313e9e740fca07be7fd42912b30a0eff8468d45aa61a08294a7f5b4ec8c34fa5dee0b015f75c242c2f342aa5591ece71d7c31d3b37a5601f18b381ae6612e268c442a3ad5493975033ebb191be23067766fd4cbb1bca047a86efac6ec0e3271a7215d839919eac36db290e3ef4ff51d2d542a660c7f5660970a270114cc0344b3e71aee7b56e23aab65eb42076ad70a7d0590bb188f39c71ccb805362c26525c4c2da860cb4f6f4c5f7c834d11cf67567e781189f2c6168d9b60ee7ce79314768d3c5c7c9fd1a822b36b3df8e229c782e8a39628fb3ed727c4afd5b973c4d855b03c2136e3101c51769c7a059335bfda70b718f744a2a7d45889f433d6f4dcc61141d8d865218a93734795a5beb3b665a79208d0114326a494dc8931cf3841317e77961474444601547425a473e72cc334dfa5f7e6b7d653df159b6c2280ff9d4d91d557e043b4c6249471f3b86d7463b4e1b9837aaa225b6efc8e3fb1b16d855c162aa9dbdddbb6742437f0546caded819cb9c4ed1eb87886839b08460c437b13ffa6f491df631dd815a7635307f987dfd61c9e405e6d52bd1d9abdeb1e84a042d4e4e0dbb6bdc6564762f7fc21e01c60f9d08b59b660f9f64614c20fbf1e87b7d92e7c5a0766c5dc670cbe2129e4271c6affac22fe5939268f192bef09e85a6490d5d14b81937d047aca66e00b94aa1e7844cf39fcf50baee9a0e376901d938a0fc5c1c65d57fe12c4fd08c1cd51399981df254bde17ea8bd845ddae21255f3a2be1de1badc67ce83ef9e14cec8bfcd00f2ba52e7872ce611bc122a2132930b1998091df191b666863b2c55974b87b898b2772e2fcd0230886130b46326a5a13e32da22495ed0c5d61af4b6eea1d5acca087671fa896121f6d5b76e6163a23110c96de0b8885d22b60c3a5ddb9ffb25a61e92c03fc915aee0cf129a34f4b3d0c0bb6da2ae5c6b403c0f31bb51fb42d30fc8a6ca521c755a7989628bcaf4d5a490310b5771ec3691a93d9c877e550bf8e7c20fb685074694f773f155321fc9b4c25c618f6b5cb40ed73840fdd2f4f6d9927b2d195d995dcd5dacff3e8aad984ef87f05c7275699f71956f1c5d3bbab56e47a877a46c601e2535bb499369bd53f7bd60f64ee8774be9a3e7a5a30635149597a8ce14ee263d625d5e2169cdced2ada1931d3e25f6f56eb21e19f481d4d1ad2fb41cb748d36ee17430aafd1d1ea3fe28f13476721147ea7652a5b5c15533728645d050e3917679d14c3c5c0cae67e4f5521184c007c3f40623a1dfbd61e60073182dd9f0699d78e7f00c7f6deac5b83de2737aa75287c9830ec6026fbc9b5fdf984527c4483651354c6afe28aa1891dbe51493c843a3a658f73ce42db06b28bfb32677b888ee3a736961725c83fadfa0080e72760d951801d4fd6bad10b3f568f02a8afabe16ce124485ccf003b5db322fdbeb537b9a90071383e2dd84d49693aa8ea51aef99011e20db99877a45c4b241d1dd3b511be7e96cc59804f0ccd5f0aeb839dfde198849996c6614a3ce10ff5a815ef30261101d7575b97f5ea8e1f9ea93e924c7e8079440343d2cbdc40c8c9673aef575bbef27c670b97917393ca002e0e6a47235e3a1c560e0454287aeded12847b702693ae502b8fe8f781acefb337e11e7634e3c149f9b314852ace9131d22a576144adce159875b52bf96227e7b481bfb6985c965597ec06f868642f9fb670d5d00b54cd9dd7f42a700294f8574a0bbba0d511bb643bddb32b4123d541ceed36a8e5ac0e6fcb11e2858d4aaf790d6e5fc510677c4097df66fb3cec79e96383adbcb0215d04a2e621ad68cc2c89133713efea98ca2639723313d539bc8cf2937b2cc19ac5162f8eaa908f62786006860abfaf432057db1b1bdc639e344bc21706e5a16eb78ef7494fa2c19a0824ec3cd3139eec781e21cd01319d23352bfe3d984d0b32c3d17f23d146b3424079fdd90971e2b2c3a7664a5c46ceb59eb45529851a380d02e7f5ab103025370ac1a5152069f1ada9f5c5a96c5b09542d63697da061d3540aff07d78184c6f35c919b3dc4d0adaa18e428980e0e7df8cf48dc5f5d6ae57080fd577a33f222c4efcbeff953fb07c020170a8b27477a98d5d86ed6a83feb6ef21a3ef31329f68afd9db9494e388dce6662a347ca387069f77574ace1d602c4bf0df31cee7e93cc828d9cf31d0d0b82826ac3c2d7f1d02fcb7e5341fad1775e5d004eca2a559dd287bf84864d5fe86cb1af91458d4cc153587005910575398df5a9bb110814f39fe5385f6e283d73cac7da3ded167369c58f43bcc19c2651451a45813f0651c782e4575e0e15c7a6523224bb77109c2b0e17d3483ac262539578e50115d3c2d49d3abb0fc88b8ec81f8698c3a95346d86b00ead0cf41081f06e57b7a7f49badc1ec752ce912e82a286385035e5faf26045c225e9c02568a0174fd0cb47987b174af0286934f0b33936f428244635bda504bf787d2b4ecf36c65dabf1521fd97b1767bdfbfa9326df05425f4b82b9dd8bc21bb80913823a4ddd1f3d9a3c808bc20e49c7f3d64f1a4f6a34b6d3f786d785c2935de30349f6b9030a9a8574e15ff4bdfd7bab47c6968b972667f5abb7804fb029270b4863d71109ed78402b1c38b975c347d752e4b6f793d26b6f3d177668848ebe0c147f5ab38440f2886b9181c239cd460682f32a1eefb43808587791f76ffee415360099bfce0332054a989d581afcf5ccfd708da06156f0ee28874dc4f4a50ce145b4b615a47b6fba86b40e93f6e63dfd2b986965b420650fc9ae93941b16cffe0a2b12665c1c6952de8750619c6cc72cfa1f352ca16dc85f5a1cce20010540e267d847dd8382da7df231ddf4f4f2cd9a5b9af3864e90226fa96f7552e2f8c0cd243cbad8ff8856f5dda56c4433ead4c6c1dcb1174c64934ec5ee0fdf1dc6e1eeb4293b5436249155b643790888cbf9189de3cd62111d7d8031caba6c255bb0665f0a272248fee24e7e73d60a0fbdca8a58188b6cbf3c777043cff767f8ef2470ccbf2f67790c86964127844146103a7aec1f01c277d3a0e2ac64106dd7cf2c839e2d7d9c546b8ec7da99181fd2112eb2024b0c06d7c252fab50fb26d88861550e1ab2f1d7c5372b75af9edff7acae6efdc3b7b6bd0e662c80aedff6563e0221ab23e92efa6576f34e889c3d0434bc51d254742f2e19cf5015c42a23ac02893799ebe131e5289505a4d2be51ef4c51096a34574968f7af8e89a2f717f8e0f8a41fad0646b367983d7d025cd03ad3a3f85d728f0a9764a1fc8f768002955f1033ee11d378c70d279596b8652e0670e75805fd954a008c8c04a05596e835e084264f14afa3db663a4dbb800354bfc0f586caa566c90142ac88c21983ac748a2639c789592b55f044d80af899e40d3e8ed299ade6ddb2ad36471e7002fd174708cb29c3015f6ab5d83698384764c4c2200335b4ce987eb94144deeb76fb98b98a7f833bdc7f469b93cb4db2da6ef1f685a5453675275d64991963f1b2d8bb4087ea6efbe02caee83c6bb8b5b165f1e1a50a33c66309f3e4aaf109d1cc0cff396428be67a8d06290630305b0edc387a9b39738521c402c124f92ecf235aa45e5130efdfa08aa7782f0915d04bc301e529a4d291ab59c62ba26a4752aba1466dafa13513dbae8783597409d906a1badcbf652edd4ff60fcaf4acd4ad44ff453c928c9def00112daa0eb11c0a5bc6cb21657ed32e2b2bfcef20822c2323506b0882ed1018ae08c3aee3927bf1f16874807dd41131ea272606f357d422d527343ec8749dbccf070472cd7b0355afd6a3fd41138b0332cabfd647343ad92214a7ca302f1beefd87d77c2a465200e6109675f3698974d04ccc3790da286dd5bb194f1f4999252d28cc443137c843763e3e5b5d32c59",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 22,
+ "comment" : "invalid output size",
+ "flags" : [
+ "SizeTooLarge"
+ ],
+ "ikm" : "68563b0e902eb3cc65fbf7f115845b12",
+ "salt" : "c4aed79aa346a7914b43668ddc839a249652dcf11b8aa051bcd1796d1ef5e5f766380b4349333359a1177d0c082b1f0de90bdff1fb60646ede4f08a2b1f63786",
+ "info" : "b0aaceb3b0b8c885",
+ "size" : 16321,
+ "okm" : "",
+ "result" : "invalid"
+ },
+ {
+ "tcId" : 23,
+ "comment" : "empty salt",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "d04f44faa4542b34f958d8a863801f2c",
+ "salt" : "",
+ "info" : "ff6b5b655cbf2421a66d2f28408395a2ce57264f76bd60befd51cbfd9474faa47a97a9aa0f0e4338635633023cb36da12a3051f1f369355b687304e74c5218b315",
+ "size" : 80,
+ "okm" : "76ebb3133cbf07afb653393bea4e4ecdab9d8e8fcc5e79e67d5346312ce9e46e937b3393170b811e25f7621923f74e519b604ae2b9884fe2d7202782ee9e20100f95341d8b6ff1f39db23bab7b7edcd6",
+ "result" : "valid"
+ }
+ ]
+ },
+ {
+ "type" : "HkdfTest",
+ "keySize" : 160,
+ "tests" : [
+ {
+ "tcId" : 24,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "fa4f94e9cdbf725c1ee98decddbe42ec06196116",
+ "salt" : "",
+ "info" : "",
+ "size" : 20,
+ "okm" : "1bddead290e98a3726cf4f2df65f1a646790ab88",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 25,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "094db4e2eaae8fc9dca0d9bc14b29387fd476921",
+ "salt" : "",
+ "info" : "",
+ "size" : 42,
+ "okm" : "5d886d50661c06ca236f75993fe6de518625e6538dff9a0d0d2ae9c08a34918df9f383175f8aadc8005a",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 26,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "bfbe4f1edace02b2a3afcaada5f319103996dec9",
+ "salt" : "",
+ "info" : "",
+ "size" : 64,
+ "okm" : "19386d2148e4d4e1095227068d7e0ec5b4576cf04c7005fa9e75cb35e3843593cde6b6a366a496d40616b766ebfc017ae9d07375027c42875570b7a6bddf6720",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 27,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "71220f185f4f2d436fa88b61f7ddf4a10948385e",
+ "salt" : "",
+ "info" : "f392a656590cdd585a06ad4892d2381ad0616a99",
+ "size" : 20,
+ "okm" : "9bb65de816d6a10da2f5485fc068da22b11e0c66",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 28,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "3a0c2c84ea46c152104d794261413412bad2e846",
+ "salt" : "",
+ "info" : "1cf4f37e0cab71a252100a2925a8703231292a7e",
+ "size" : 42,
+ "okm" : "b62402a3fc2cdec80da3f6f3cb82d3384bd432d8c70f9205f3b4afe0f5367dedb49f6d59f16c8148fa5f",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 29,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "59b7fce05176a56f9b086b2e9e526b4491d05d27",
+ "salt" : "",
+ "info" : "d0e410792d888f355baaae8e17288e982032c231",
+ "size" : 64,
+ "okm" : "7900b70b5de87eae6426d1a3f31346b4d3162fe51f24000492ff9e86b301e7652b097f660fcd6a08c52c39b693eea175bf4462810bf05f4bb20c83ca68ea23d4",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 30,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "e1dfecb28787a93133763ba4760a55a2c20ab407",
+ "salt" : "0b86a968f9d45bd38ffc2369a92bc66d",
+ "info" : "",
+ "size" : 20,
+ "okm" : "5f0956ba2c2a5791e79b845f2166a3391a6c192c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 31,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "0941f7af65e6848cc218317a9ec1ecf26d21ae3f",
+ "salt" : "eacad2915534af8106c4abc66970ff0d",
+ "info" : "",
+ "size" : 42,
+ "okm" : "abed3b7823d18c07a478b193461d81dde110a9943d789302ccd65c92fc8c4c2c64efd52861e4b40b1fab",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 32,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "1e242658cbd889dcc0096092311e9311b94c5bf6",
+ "salt" : "7318740eb205a76ee4ed0df45d0dac47",
+ "info" : "",
+ "size" : 64,
+ "okm" : "704f6284acf6cebbfc47d875e65ef8f323719d95e3098a09f7660d67cecceacae02d5e1a06f778f7d82b62d19880b60535601144018e1e912f5f2d053c524d63",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 33,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "163f690d4439dbdf6dc57042fecb79354bd3e7c4",
+ "salt" : "30ea55b5fdc7e509d001d710b3a032c9",
+ "info" : "6a05fa82515f27deb3d27c80fa63d2b6edcbb372",
+ "size" : 20,
+ "okm" : "d4e192b2678b47c9cb35ba4c4039c0b47ed100e4",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 34,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "f7ca016ff5fae1cc11628196efef8ad174c1dcb9",
+ "salt" : "e3519f32e44952385308db5455878cc4",
+ "info" : "53b94ea0d6e0da9145a0ffdb5cf708889b9747fc",
+ "size" : 42,
+ "okm" : "21d2a8acca87a853ff2f1edb90135878cbd29b630f668680a417c00ca73fa8cacb34e84f2948402c1980",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 35,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "1c352e65590b2f763aee9f4404c801e7a04b2a8c",
+ "salt" : "ecd6a227d7ab14c068bb917c861c8ec0",
+ "info" : "3acb9582af1a9019126d09422e715519fd335032",
+ "size" : 64,
+ "okm" : "ccfe347502994a407b1c2bf03db4503948506ee2a99a11d7813ae8dd57eba27b8f0a65e5c4db66402da0e46740feb1794f854c8cf88b3a5aae27565f5880ccbf",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 36,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "2e4a156988235208a93e4aef6143653b55e2ed41",
+ "salt" : "9d5b4c7c1b7537300d4dec31f0395e8da6eb826d7fe38a0abf4b762d696b",
+ "info" : "",
+ "size" : 20,
+ "okm" : "d9a79a3b8fce13e55dc85f0928b7f9b48363243b",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 37,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "61a281d49fc0bd3012e1b7f5dc17e980cf611ea9",
+ "salt" : "80f768a758ec5e45c0f2e3fd349e432347be89d25e00817aaea4a1c510a9",
+ "info" : "",
+ "size" : 42,
+ "okm" : "e440ded004511a14dbe7fcf2609518e4bd6bc614d1c5629c0d082d5ca3e5d1260b46f108af1ea60dc463",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 38,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "e94ac367c6f7ce07a3e7f83a1ea4a0ea264ddcd8",
+ "salt" : "5c139fd7769291e5101cc8c1ba44a356b5c3fe3d13b0a68e69b6c09f28fe",
+ "info" : "",
+ "size" : 64,
+ "okm" : "7eb2c44e2595f2d560198961ccae6669fae385e4b404052320a9994826b36b0724e639d02568539d7b12c2c87d3c5a9be000052bba24ea262b38e80bb72efd54",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 39,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "f5d21e4aac89fa725632c707bd89d100b90e5288",
+ "salt" : "989b8b9b79ab82253703ce669a0540d3cfed69d754c902a9365e03c92236",
+ "info" : "b092e1dd4faff8177a97e86716de72f94beecc4f",
+ "size" : 20,
+ "okm" : "75c3eae1d93d28a6a683a04f441092e56d62ab2d",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 40,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "0d3909b7c4593f4469ddc4484a2082ab2ee18be3",
+ "salt" : "9138ad17dacdd0a2a3a3a37fa782ec243258aec9ecd6b3fb5964b2b3dd91",
+ "info" : "6ee1df3a970b9506a3892b59f1acea5e3ca2cf47",
+ "size" : 42,
+ "okm" : "0ca1876d4f754466b99a957346ba556fbbdbc80afa6e17111922d5480a0b77a238f0bc403ad6c1b75053",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 41,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "611710557b5f54c91ee635c38f16222b00a71533",
+ "salt" : "4f7e27c2efd4e2ae3774fd948d95e30d40a16ff799d31bad27b37eda9bc7",
+ "info" : "f3cfd0fe4090c2927217405f339b450553a51140",
+ "size" : 64,
+ "okm" : "a99a33170d6597f7b7c4125f821bff6cc409f1e28c97fbe0257cbf15abd532bf71e83ee5011e01e80850a028a51ac8aaca76af6f2b824d3d8e3330d03e54d01c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 42,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "8759ccbb7c28d95d8f6cd65c3f5fb517451f3768",
+ "salt" : "bd76fd163a2bea5c840730b4870d168d097cba61ab3aa060a38816a007117dbc245d288c671b6ae1d2d1182a6c6765b13ff2910565660f853d0d871d0baffda3",
+ "info" : "",
+ "size" : 42,
+ "okm" : "3087c97facac2628c25a2cc90193e349bcc58ae6dc435b154141da5aa107f0f00def4314664acda096bf",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 43,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "3b9304bebc8547501091857b81f4e7701218901f",
+ "salt" : "d63f8caf65f43c2b4a5efc56b6f5860450e237cf172552b184b09820784e32967f5ba6400e14315c7e78182c1ed2f5d6964a239d92559c5ddbe16c8e27e62079",
+ "info" : "e239a9e88dad237d5557336ecbd72737122ab752",
+ "size" : 42,
+ "okm" : "c195cdb27740e04343b94d91aba21713d13bbbf9c0a9fec7d94fe13cd0b116ec284c96691f9cccd62b3b",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 44,
+ "comment" : "maximal output size",
+ "flags" : [
+ "MaximalOutputSize"
+ ],
+ "ikm" : "8fd8c1ab246467144381776468aad688c051d242",
+ "salt" : "9e739377045b35bfe45f39e651ddbd4978694e61f94045b54341eb396b8cbbf53a9a4831d854aa787ecaf2950797520f98a2a6ca6816246910f8f7ba07e3d42d",
+ "info" : "20914b65e456ad22",
+ "size" : 16320,
+ "okm" : "f49d993b626a46b0983fa2aadcbc6e8d2e785df272445157240501183631e508df27d09e253a40071a6e21b317f41391c69090c6155115d6bf56812177c88a3b4aa10d83697ca29e6947af2b5bcc78ff75430addc8c8765dcdf1505708de7d61ad96652c06b09e8ed3d67e0fc1a95cbcc861a576a28657fd45b2da2ed7219ae963b715438c0175fcb2d34754f0a5e9cb87f0f7957a8fefa4c80674fcf8d18024c64b8d9200e0ef2ca617329a1bebb2dffcbe9a0205c27f64ecde02191cdce3810cb21eb4c29590d1889378886e1afd9a7f6dc0a7d5611f1eb573735c5951b50f48ecdf61093578a19322ad9ec21d61d08cda8d07519fd265b35e9b84d08193d70e4603c101a2b8c5fcad9a68d93e27a2f5619b1921f6b56c7101f9d8970466dfb3964064aa33d5498e7d0c1da312cf008e5017835478a05f89ac2f48215d5192f9e147526ae346eb12a2b0bb38465417d8a78aa0ea3f11eea7e9eddccc769b3bc9b540d79b7da5d6015c021976bf7daa9d4281cfbdf1ce4e1b0f19a6c8b2f4c76780e54b055959376e27f2f75b15fb9bb4cda8fbcb386cf6e08d8d94bcb141f85f671aa9f04ef231a5b8f2227ce5926017632e7da7458a3245b2fd6fa854ca5f9fa3b90ce430e1926627554a41767370fca1eee48fada19ea8bc125e9a788440d5f3a61fec80f25d1ed6760fd1c1ea97479b047f74db3c261adc8eb6f9376238a3c561e725b41432652f530724a85638b050bda77ca8f108997352d922d9332a7d4224efbf90144339307a5f8975de98463ea243bd95881cce064e40ade5a717d12c663d0f41adf2aee4c52ff4afa63db72ffbbca117fb6130d24a1f4342bd3d93816f1787196215bf7c12e6ca2f2f1dd0bf0a5b1f40c9e36042c4efe4158001f61cab9fbac1bde6c76983760164aa669fcc171a9c0a8c5f076ecd2a267d9cb817aa9251e49968b6880946931579b313628b942311cfc16b81f86d60e1889dd5a7336451df2e175555f7c6c1267b23422552c300832913140f826c2d461ff5dddfbbc4321a7bdcfccebb1d5697fc05ef17b85cac632200591ea9a7287df0da699ba7a39d1cb175ec4bf886a0a25e50c893c2caef9ea13cced4164da1fc80a33b0824555ca69c38f4437fbfd995199e60884a1c1bc61d14fee0ba493f0251780a65294f6d62d6955ad13ac0b67aaed2f1060f6578e4d2e519d058b9e53ab8f873e66cb82b546c43037b56bfe59e171bcd2bd936813fd024c96c571cfdf2751f07779e83387df30ba7e4c45c1662684d458bcae538c268ef4bff75ff624feb364cc8b934dfd0654278cc1bf627123652b1d4c5b189afae9c76f45ac7fb9228fedbcd40bb31e110ac58e6e4055c6370b9108401d7be269352d19e262dcb84d8b68c83a59d7f1d157beeccbf316e94aa08a633f1906df30f5e84aa02e5a4b60d188b387f34da0939969a5e6c3bac6669db59e7d13af1e8d74e0e9ce4e5bc302cbb2919e4e705b6ac047c6e049a7c8030b2a3ba8dfffbf58d08848d7bbaaef740adc912219f5420eb4720e8b6ca95ccdaabcb286a1c62e61ab03477b50585a50cea9aa896adca3efebd5f97a27f095dfa643f00718a2c0bd124a17d4a6876f2c3e7a4b8aaf2d97791b970a7c0633d229e8ad089fe68c3c8a23814e5c5945b91651f9aa2d9f2f6c3b158abe6e13119bc9af7d0634fa13ad508695c62127efb699a191added1949f47f241fb7e1eaef56c23c0334c4f2dc40dbf5e2c6b11871bfbbdf2924ea4f4ab3e5bb4197e1b2d0b438217994b5de597c7fe403cd0de265e5eebf7171805265a00901ffae3f627b800cfe29949195d20a7d16b80ec280920c7b8c9c1552f413140d76c3e92cb02b994c5996c75c2e40b283d1a6bd8a050db5cd1d4c247c9e9f47eb7e08529d63161f0aa383c51b7277d635b123c4e6d55bd6beab38a476632189ef46570d8800964804ae1073fbb8b88ecafd0c0e5c397fe58defb375512135b62eff792b8445fb9ed4dcf13b0539afe184f1368f7b670349a5135af8632a688c8e63d3a840afe68d03b327ff033b948b2b024182f9012e954fd2c484c3fc65faba2691ad59b3f635b91d23a1f5a66162350c9cd002717ba4f902388831ce7a0b6e55f37b0186c4097f4862517d5c40a3ba66e9325101030241eb9f9898f2ca8f407421fd7248f9e28001d0e743716a75a11a52bb5b2e0130554ffcdb5059f2d197d8d019d75e4bb74bb427f5863291a01a911d0c72882d89f4a9003124910bc78d90d11428132fd4b251ce823c18299869e94821ef06922fee3e33461bb9a8e1f90049ea3d7a1b0cff1d7f2ce3b1d9bd622331954f2bddcdb887c54833a0c40d3ff8c23b2725a957493b2f1f17f15639260da918dcb36ee91c102b5bb8ed74fe43e2bc2156f415a0c9608c77d926b51ad66fcaf252eb11c44f67bcae7e04e254861e0a21b6eddef26a98bc69333f694b21dc7f9b60c17164d2dee8e18c21ec31d9b0b54604ad147cccd21899bb8f8bbd87b0970ef336dc4cd5fe49b9414e64f3156d209ae1cecbe4937dfd712374ff062f2db92102b4492b30355f80daac24141396eb4a27e0bb9732e5a1e82b1fb7d232f14f6fdcb8986fff6de2a43ae3fc356a11fc62df9612e1be88c472a5c36c70beabd5bae29f5ed307d3a4877ab128e819025836f13fca1e4d62709a529f016f1cfd5268631c198bfd3c362aae2a818b8de96270b60f9f961aad9afe32de7ea42f6cd077769933c87619720addcaafd4f2375a61674fac8470ea7942081c0d5dc13c159a0ecd6fd8dcb2f6270f6c33dc640b70665213dad1709ca1c4f557e7167d9c027bd361d47c3090a489c817759c46cac500056ac64e31354664368773b6a2a7075cfd3ab0ae7b51310f2a81a112306f8b4ae28689ee60c0ed19ff90bef226dc3917c70545f482ceed2f40b74a2f801cc3fce2545457517f3987679a1d0631e51253b0c4a580f9e9c0347f79bb30a124202898ecb0dd74a2d69a40e2eac7b135c3299d8d0d8ad2e17ea123768710c95b7c4f6df4c7a2357db1961eead425d35a599510ea667aa60197085fc45410c832a79578ec964b7f6d7e92c1b3a22d60fd69a65194ae98fccc5344005a79462e2cd5997e0febe817551bb541d2a63cb915c81b33e385bbee445d60aafa0652fe3bf08221f49673cff1244a8b065874e2ec7b4980c012614d7529968a7e0783e9d42d306e05830ff2ca716714785cac80c84e98f0ec117baec6cf74f3688af213a1320a09b37e64d2ed6ff42813f51afcd21e21a372892c40809bddee793029f3a8fa83792661a90d7ec5d36b880eb61edd6ea8951abe8d2395c4d2db971b0ad3d0cd882f35934e3e2dd18bbe5abfbc42bf32d9c9b3a64a090ca8014f9ee756d27f8c49ab675b973df430ba2bcaccad0a3275ec8234f8b7223ccce0b5ba2660bd4954a6539b15552f27a5ecb71cda26319c655aa621e11a7ebc3008c49c2fb721b1139cda67b55c44b2029ca9113e26de920c52d6ad7dacbddfa45c55568bfa83b9471244e62e35fa03fb56ef3d47d21e3e46732b1f2ba21d6527a06ce8df698f0159c45dc8869490b3bec1470a3c882e8a18a6024c19d305ad153fd77728c75e537d6ca374f4f8dfb2c6b9ec35a464ae2346af25769cb679a650912248e6ac336064306a49c748afd4111014259136009f0428f55912df4549dacc021835e24b939e4fb592ac69635be7655eb0f0fa0d03f1d9bcf6881200462f158daf882a0f97dfe58cf4d291a1f866cdc32b19cd692f88832b49f8b465b500ed4577f7d1af322cc8ed49d763669ec0d7071dd6c54a0bb5babf4f2406818f1f72fabfcab8ad4d53e7ba916506d8202bea08fc95aa14108b41545055c43f8b1d6b31964ef5928f24097cd5ee57a3cf85dcec626ce2c645f3886232bd0f9c297cd859d68c397f5929a429c01c8d9176b7b577d49b358d8d7a8be1c2dd57dd4fac0c94c5d2f057d97f80bbf58b0f8d2b88d2efe581b1de17d3f07fd32e9366baac7f302a232ee35c4ea0894c5d7cd8d78347387989a15f3064e253076d0dc3dcf7c6f3f443f7da70ec1656ed820e68ed73cbc2db807f5cf82f2f718bb388a3b1776b8f346fe453e49062439bb4224a38ac9444c4de57299b701fe99bdabbbde1bab77da80d9dd30a00e8b14d755fe2686e609ec7981e651010b965c48ca38bf42c58468982d0814b4fb4f999ca44240ee6ceaddc1404a14f567e7887420ec081ba8b2e57b4a93314191745219967dc78c2cc2a869623d8ff9e29f38b5b2f5977b00d71d7ea2118b15b5c1627336726d698314eecf49cab26771c631a2da02d40bc6cdfc273fcc7e4ab6def62c0fb271b1e70a1a5f29030c402bace155f3154d48d67a7eb3e58590753c4317811285c1440334d4a433b8cb1e0ef482c6397519c7043cf5d79db579a9f62002d6f30ad48f0dce6e8f2edb30221e3c8ee3ba20945889cc9a4c1c5c147f3565878068f98d89c24ab16c8b1eca47aed6e457223a1d037bbafdd00edd3b4965d01c30326810c44a1ad8f82a4d14ed1677ce871dbe68ef6898bafc9114b6df284786c5791dbd69d29db183f8ba93ef2a923c2e5fb5f3128a40feb2bb4a2a8bcb38fb73fe57e8579a8003cf116f09ab7f46ad6343ae811d6f3b4a685a16c741a03f04aaa8af62a57e13e3cbe2823bb9535efd5004cfb5dfb2a38036503af54d9f4575b9e317bc52dad3dedfc0db2941f93bcad82927f1b38b1c67f07d1f8beecd88ae73da4bad3e29453e285dffc67bd3860103f84818f9250bee664461b0b64dc6fa98a1464fb514bf8e64a122f81797582c8b06955ccc1cfcb178c08b55b312b31f9a8e0bea4b9be09a74e0e624507723175215daf91a24b9b10920d23443744d5981d5d0933eac0adce35a3302246fc60a60bf2eb088e53716f8d0f79826ac628462f6ab9fb8d560b135ed73ccb4f2a2f47d9e8858159e129a8117487833a8a06cda18d892ac27b6c4825bafe41fb802e2df71d277edcdf91ea8673c210f66e302e4ff4e54e62c14350bdd5e641a5b5c83b0d4a251b2dffe895e95f21166cb47dc9fc0ffa7a13fee89ea57ecf2a29a30675542ce2fd97081015a1a8da4331a5e493add409a2de5f8b9550602f61d1c13eee33d45f73891e4fdea2006d80e0204fb9e959df041e65e64956a8e7312c5ac76dca857c43d891f77efa311506f2f4ba18702696d83c321ad8a4c53587eb935c6b16158bccdc198d0a15573a946cf8c972fedbdfcfe6098505b3b82f14c170ff69c65c9a4ef1a2f5e700acedfbb9f2af043643833141041108192f847411735cc0d5ec5b9847ef434e543493085d8c1a95d5c5319df31f69b4d3232fb767b282d933f616d7a273163f6f6d2e6075cd0a0d09ed2937028deb2c01c56fabd110d225614bc42ca4c6454c3fdc99e90130f7c899e2e9540dcb7f8499b4184dbcf4ea852828223c075a015ea8f21282699ea39994fdc5023e131238793a1b72c0908d9b182656594af65f7e7b070e5cb7faf1fd7624df986dc8595784e15c57e1963cf92ca220447f0f26be461dcee90b534c990bb638ba443158cf5ec863c457ac1e792085957b73c3069eb06173d8af192777efa0e65694aced7c3c51d08314b5b01df16d26f1560ab4218ca278e05a792edaad1942fb93c6af2752af68fd9d97fb760322028e189a268ca68bc59f4dc53d84afbc3d8c4ef61fe35c0776b2bdfd7f7f365d228b46527c9ed134f3d03d32728a3e5b490f63061b148dd8909502510365dc1b75a7e44260977965f4804f04657963ce5ba4aeef8d0502885db7d528e3b4d84946ab3290615e1ecabb2fe34d94455a39ee3461a3eb2521f94497677a74790ee9c875cc117eb8a39a270266f48221a51e76c07e08604c4d36f6c1778a500830e8b8f220f85a169bdaeac81ad9f3c8fd2ffc22e3609c9ce0b67cebbbb2af23ca99ab8eaefdc0e2c46d7044bf6fe487c8f881b44718f3647ef98b2d8ca3af4167b3d1309f14b77b1fc42d7265753b54577ac0402f0e56d9ec70cf5b1c2e3053223710bd61da5eb3c7e74ccf89b9b63071a2d6e9d7d059df7f51ab076d4996088fd1dcaff4365e9bb8645464a23d9a2e8e1c4616008212439b1eb3be6f96911f8aceb76941d4e7d01bb280dcfdf98054fc4ac15f8dfb80382b56249e9d843a32528799853edfc1c51b7a8579362fa03f9ec91e684943bf538b689f3b75b903a90774b7a6f27a72179e2b35d7297c17d0977c6b028169f98a4b951f3d7c31102c2ebd723a6f8e8721c069cbb0f99aa15101a84046fdd301cfc5afecc1f3fbd642ff6afd57f774b49e1591b858fb0c1544665be7b731ca41dbc0e16b72d8f80d2f6699f9408ebb24ad5c8f260a4de4549b5a1d4b77fd759e5b9d4dc21e7df94c35b59abaa9fa3db48b58ce8c0a801b0670e1343682ec4c21c76b797f7fa1f9d0be5f011a0a6b4c8c828fb26c526f0b45188e037bea16070596d908e104cd919bacc9f2556c2759f8c919617823d20d9de45560cfe45cd3adffa85bce1f81e9651e4759b82ebc3ad4caecc8cd922d1d9f82cf41ed5ee476454cf9e6aa086b3256ff144c389ad6f9c256b0e2f2e7942f2d3dc8c69797519e318987a37fefd1cee52e79c66a2a2918cd6531f6e4e18c814f6995fe97f48613c12df78004c5f98fc13309825fa8fef226a72a9e25739a6198fe8c43c0856a3ccaba9e4eae6d621dd1c873541c3b3233173b9c714566ed676d2f45b639918bcd12f34bffed75c5871168667e838a6c4486f4bb2e156b30cb509bd8cda8887eb736cf42d160721599695df79d596571eb09b2c48196a33a6022be3d17d30dd08391f2cd2c26dab5796d562ddc539edf5b31cf6a4370d4a04d222958198470adbeaaf06b2cefd3b70f7d7b604a97f274100303c1ecab0ebb5db3021f7593bae3affa20fc69b78976deb09ec44e2be35787af7ce2051a94ee24a263dc466a74abda774f5120453d47369857bad1db80c7aef1ff87da2790cc0ab757ffda5893e1ed1fc5364cc6b62e043333cfaa1d5487b34250a9b64dc3ae7296ffa62bc300988a6cf321773d782d5f1bc6e25c1c7d430376e9cf275201ea0746ccfe65a7938510d47b97b461483044c8bef2bcf6b9260c260288c6d0fc466c5e2746ce890cac6ee88753eb37019739b88215d7d81721fbc81348e2ced38dd2a20f01a01a9222fc57ea43ba399622fdbc70f90ecd7a0be89bd643f948a240ed2c24912aad4a43912c04e3a372b218df666b6791bc90c7a619e9435674b9bfa94084f41fe08f535db441636d56fabca76ce8592ca4c586b024974685bee739f717737e0ecb25833d1aa0ba7f9d234a67bb125145d878f158e52c0477799c63c8b3b2028e1353f0897dbde8520994e7ff8c5f08adb604aaa915ce224d1cb7cca1fa693f675046cb16e8f707f82da85dd3740851cf7cf8099607ef181b01f9147ee69105f3068339f2d49046124bb01fb40f40568971d87160c10fcfcefa2bf3149f516a9c51c524d8709b5e1bc95570de22788a773fba22884c07255513de57605fcc5e829e1a8429972c71a7276e248dab7aa09a5f5de510acd2d3d017bebc2784c8d19801326952bc610098926df07872b546daf75646c638ce41ccbcab91c330579ec11ad38a912d68b80b4064c4735ae1fe25ac925417385a9086e4954bd346eca1b4c36942392ea239ccd3b027475a876e71e79f229663dbb6e2e9208a328a93c40ad919704ca8621557374328f3274487658c30ee91dbba5d5f960373ec85d9fe051f5a832c8747425eb55a8cb8412226f35cfa0125a249a8f3d715c78a5a8c658ff8bfacb34987b542f299e2fee1328d557c01afe92f1be99dc5d594f8501300821f78334ad2eb70a7a7848ca242af082f3ff7489601dad623da2654902c0991e263029c4a2bbe6bcd0004cd2da8803b53df3e58e3000bc7f8483e617b76b1f647f0ea585fb6d5e8d3e5b261d015b4d9b303753943faafc747c0b57c784a7a9f63faa749ae6998c0e2753bc442fa334ad1083efbe25044e2fdee88cdf240ba1bd833e1f837d1d39935049c942b81772eda2a8343c36b5ae56342a2bce0dbe9bc33db7fa3d6fa4ca1a640459fde9a77be5a553a7a2d489c1b25f014e7569055fb25d1e1daa7e979f5abf77b86f22199c139efa887205aa9cbcead45c6e2f8a563e2835bbd1285c82c8756f86beefe052ee32f7219a0dad9de92d85b91b5a15e1b2838f7653cb78acb43784458b1d6e2116b49e1105a270b674ddbcb29b0addebeeac2857ccc9754eebca751e12629ec80a47f4b1d832a93b6283dfdbb970fcced1a3b5e851bf0a9c5fdb524ebd91e8a601ad75d3bcdf9088f0abf9850969d17b8e6869e40961cd643bccf9879cf285398036014813fa8cb8d6df48ec6352bc40d6196c16a3389d53aa3dcf276d1b7a5b4dcd296cd96e2968a9e5f29bdc0431b1dcaa98089eae198afe8f626d2cd39fe732cfc4ab27291a6ab2980a8efcca0b94faa91bf28116bd07627593be78cccf2e92d111663d25f1b68e5d53de9110854b466587e850c74cad68a1716045b980c5c3743cb95f79c60f3d3f19b948b93de994284096b8db75998ad913ef87f269c0fc61234b6472cfe3806bea9a2f416c1b1667534c99711fd1c82c6ec940eb08775a9ff95f71cb0c61ccf951d43e998d01064bebc5f7fd937a80b33e7da940c632af65a39c7ff2f34a22a489b3ed1b2b26e6ee0729f5d020541d30eec106c42e7b81bb0cb4cb8d0427f0493e0284054bc4277bafc44fb6f37ad1695905768c1820eed7ecf574c486b4bfde21b02516c3d6f34ffdd6f6e38a26419a729b7384cc888b03fc0cd0404eed0094e669adbfe6c5b3fe68c33decf94c608f744ea2cfdc998348607d9bd619957a478d872da69196c81ce83a833dc35b5cbdd30d09b8e230975a48bf54f1604f4a88262fed770251315c4d3c07f048e57641fef765f97468834427fe2652359931ae1bdd9270350e0e08988c247dfb8db2857fa7ce1dacf2502a133fe9feefcf627e2e57c98c7aa28e8bcdc7ffd4cb0f8c7bcd18f8a4b1ab98c9b3869efccfdf46f5aaa1fc262081e2da9978450901a09af52151968fbe0deb64d9bed1423ee6c79654dfbfed869f4eee1a8658f4b510a3243728b5935e3439ba81de4fe6b7b4c1524ef25ac03094000c07d691bc4f3536fcb983e2dab982b2aa18921404036b1411334e90672b03573367a40058b80a14055260609b49f7316fef64db42f4e548f38226af714bab30841c7abaf16acdbd315fd12c1260a93d194985685d74fea1307e6f76fd3ff527c9a4f9b9303540f4d27fb9c45e10e5656dd84bf91e012df6f8e8a97d715d3d65199f09dc389ca63a58c25640ab8414751e2a82a82eb962aae73845aa261f2a8c4c14fe6cd80de5880a6bb7e66084b6001f2a9ce59374a323cc359258ad1cbd9e09d08bdd96491d0908cc79561fdd09000da41856c510034db793ae74c835bd7db087b058c334701cee248eb2e3b677904f25436b06617bf806bc6f6a5a28259450dd062b7c7c5570b5f84c187d6d86d324936020eb19fa609d6e76bcd695d92aa238ee585c09124fe757f2c2f80090182ae6b09dcf2156dc9f6df8eed084115c8d7f10aa9e35f4e49b4e6d8e0de9f5fcabca643fe908b97e7cea9313ddc360b817eeaed52754d95a79cf0ce1a79864eb33592045911eea58728861aeb86720eb668f9ba99ca712d64b13d932eb7625536b98a27267596b5d99246be78d174ded19ab0d1016f984a93e93e6ded06db4169a72ef2991578ecd806ce796f018d0c7c3fa01ab652ea5b1a47847d336e10b89fe02c1714cddc6cbaa1bb73ebb8609831b3ee669bc299e8e579e7f2fe08b43dfae216410ccc5dc1f857f227868215075892a8856b98e65ce1adc1c145766caf673008efc89a2b189998c963e2c1f8cf2a400a4634509f569d0878a17a3b08327d744472085be72771590d6dd7309eac33c54bafa49e03348acb810c9675b9794dd0fa3b3689d94e1f4e08a1933b1e051a840a3bb9ab2ddd601275062546115d78f6178e2b97266d6f4be9e83cbdd136e04baf1beafdc2c7b0c4ca4c7d10257f040b3c3afaea2153eaa0f04375ac83b345d21093af06bdce6f1d31626a3e4756c26c92010961938ba00c769c8333bacc98d4d541b6b2684c6d39fed0acbc867ac845cf326ed48d90566c4a334ada92d3cc28f03330800f6df3cef7382cfc0950129cc59a97af39730783f1de9196a0c5c2c1a5f7abfc9afbc64032f62ed227204f4b59fd0fa6a11fdd3c11325aa5a6bdf6ecd977b269109e2f7028eef5cd95539a2f5e22b25a3afb0dd47b923971ed525b9e8b785062b2961ea188beab7bf5ae4abbd94242b8c3fa74bd1efee625b86f5752d320f4066a38fd72acb82338347d0766df99f432f223542918e65448426ac4b52afc78b4b89730e1db682b516b6dff23ef46fe21b6252085f9a4bd8ae3749191260f1e7d4f9edd3e544ac6b461d1aae7fc5f296297e964b63a08444d23c20e7066294a572db05914e9b1da20d76c1ef16701d8ad984eea91ca79dda2973d367acfa1a7a27e95d7c2b881d96cdc7738d278892c386dcb0ea0a137a9a8a3450b521e4c127663550d27229fc7eafb5b3b59c17bc986c26b86485a9c0d6dd40f73ff55a7c09fd83d6c40f9d5e3c3486d22dc5382e0fd69d221a67e1616ef4b7080f259d6fcdcd087c3006e435eb76a690697b4d9994a617a117b4002c01c02d3fe7078ecced3af4cd309d5aeb4eabf03c56bd7543d0e06fb2f48c0114ab0a0d8c9f0d1354f9c312a8d5dfbf688bf4c3257116c526e97b49dc4508cbe8425b01edef62a4fee7b1f9a9c220c9c9674a109206814220fb5c63116af51a14616abef8b82db9785a1ef3b046fbe90920789b5460fae431b98257d831c3592019b75e0eab612f492af843d277994e415d905dd738d8d3d5da9610e332e0e3b37256c48ae2e958bc653a38498bb8bb4c34bfe8b09de66992c6a11f8d9ac7adcc60d0da103d35fb9b75c85bbf5fd720eee4bb6f712ff05a6d89fea3cb94572a29688fa9e13362549d2c9964f3a3404e3dd792b2c22b6f937f3976e9215697fef47d5def8842dffe6781bfd2edabaa3047751c96bdf6a9393976f0b42ea1a5924b90aea4082dc0be14454033c83a4879dfbc80aeb769ba16049b79ed2f83925936df8ff88834b71147517b29ec1f87d6bfcb94b16fe9a29e9238cd7b46a90632bc3f38f9225c8ffb178c91bc23d689a6796942b6bbc23bbd6f233b5100b2654d1addf9e0604270ad4732c4a0461c95c2a94aff0d570515850da1a57ad973721cad9a56ef1dde1e9a0ff6f5ef7ebe4b38b2d2d0cb1c6268c5d34bf82f909102c75f5a169eef623e8f977c00b7b774d4dfaf9788c314968fe839df50afdfc9cac79723040b958cd7f95895429d59dbaa96e0e91a2141e4a139944a4678e43bcd864d87ceee3a3060ce1e66e2c682a48eca674b562a5ae50cda1f7e5e5bac60d1cbdf108020ccd55d7ccf5112c19c05504dd6aff72477d984a23c6720eb32445445604dd7e686fec1e8ba405df25f3670a5b7b1bcb4ac2f5f92ac32f23e9890c80947e727fc9f75cd9c2c2f7f8c8e423bf447a52f1dbd0d2d22578f18ccd19c765363ae06a77b2881de8b03699f3b3d9ed9b912319c26492bed1385684f4b3037fbc85b416f3c9fea91084faa4935eeb6d20e3c63cd935055afacf017d85efafd08f1d7ae6310225e4f77aecaccad5a8f8489f709204962da6c629fce963c56973d1e0dfd494119a18f58fb240923bb1b5219e08e1d4c7aef0565d02eaa854ca83faef44baa2a73b407b8fd618a76f4e65facd4ab6ca575790b0f3c97a057b0cf54f41cb4e5f3c4673a560d562acc75a81d803ce7f693d2c02aff9e0163b7c17d482b22d1d6f4a93089e5a6c16539439659a00261b3b791657406d217ebcdd32a62c28133454e081e62a8a58bfa0604f25b805b5d4ca8fe625ce320785e868cac8768bf48621295c4877e552d0f31d18cefee6381f811ed311af59c55eb513de604c8ded0aebababd793f24ea1c0a767b88a6f637899cef36b168dfda0b53f335cde3176cf839e50aa2889e8c2e3fbedc117a48fe432d9eeb7ad48aa4bc6284cc41834ac85a9c43f268cea9a38617765e0ab69e344702559c12102662dac489bdf615482662e79090e2494d86af23cf60dd36958a6bdd7ea1795aa6019099ccc7d9376a349489446992b1ff7e5754f8c2b7a27107045bc689875a75712836142d07a7cc07e9daeff9dedbd213993a82533241b7b77ed4fb9071e68c36c0ce3ccd937777ee0cb5ea976b0577ba18841ed3bc944a9fe80a03fc3a56c455108d90e99376e70029c8de0efbe8d233fe0fa8d6e59c636f52664a396a0d29a3d34d255e74e246df996456c20eceed25025a08fc646c605cc2f5dfe0a9ed567ac410e1bffebd9271605a21927ee1de353460d0e07cd63a2cc568a290686a3ce45729e7a581680d39d15872fe82e8c4fb1c36cdd6872e3713e63a9d25b5c300b19bef3b54cbb55ec148f11575e2878c0b80c12be89342f48d9d6934d9b6cdd548be92b33550e39d47ecf50f7417056879ae9745f2a1b04daf63ca18783e1f78b224b8c6fbeb56a95bd982249032bb0a2ae8e1f60f5e8818e671c2c147a95b0292d61ff09b30619cd06cf9631acf54b1f005795331cfeb40a64cacf884385f141a56eb8f0e0f68d169319c92a0ab6372cf2d9fc0c9afc86a89d6f013565282f487bc0f18c3f8dc81a6fa25c17c3fe529b7aeaff46618866596ce8e437244b3cdc74d50bb78af60e0d7596bf9015285fb518170c6de936dbe3c70ec5000b1073b1f13b1f79f666a40f79883baaae43a855d18c90e912e9f1f6a9baec6773b9aa1a88e1c068db35711c99234b43f3a95f7ccdc6064aab64710374613f6ef6a980f70958fc2ea7a4271be5ad8c26681b330657e5b3a0f6d37c76581b36b6ed2873868f758e4dd2b9f1c14d72b87608aeadf960c42b93adb632edd134b2fc80ae130aa71e8c556112877775fe807d260c50658e3324adb40cd7d6d3e4f43736f26bceb32c9c5026b1b68d56e1b4a5ca75c8a1673530d439dfef10f03f325ec19991963c4de5abb2284c21038e29fd737d6cc99236b3e4cec3900b0e50074baccfe785fde21aa6f1d132f2972b97ea0ea22bf7dc0cfe1b2846b251c45243d5c610e8ca040de8ba32d0ac9320f963602ff8ec7f7ba0a4fc2e479dd511d072067df04bdf19210e673c8a1d5462a23bc49393557df28ffae1af3ac51d6c8f3482ea959f7edefd2b7c8bf2e36bdac7e470d2bf4fa1f31219a7d1b6e983b20959ad907872e41ff7878e46a07cd05f8b5dd0bd31af7377f32dd9295303947833e0c1ba66ddbff0df43e305b5e72b13452dff1f6c7d3c4d48752ba1fb36f835c44b193859f98d42e821a6c7263e85ae514d8689fae3ded10771ef3e9d6cd6ff15fb4d97c1dee055b7c49f6b1c8fc01b293eec1d1cc7c97c297a128384095cf4282891094cfad40fe46a6342b95914d9291807665f8a2fb7293adff1f2934fb1e1c325e6ebf05e9340058ea1b9e547541712b12fe1a9f22017f6bb488ae11acb8ab18c7af41910b802fca0e7b514e4bca0dcc29f1f12a40059d33f0e63e7d050bb9603ee17b8da2229f064c60863e624424ecafc6631fc3b300632be5de4d60fd9c3a96e2c9cda6e168df75f56aede12c585e14bf7a8dbef53340230211dd230205c060372727d6767692a7b460b35aa4edce630e65e7297ec188a9a77c39007d3ec22a52c5d49d55b01aec804b88559b41289a5271daa4b612db3deee137c9f7c0baf23994c8cc62b05584012f8584277717b7eaaccf2a6185a11294b9db44462d6bf8ead243aafbc0305d8601a9a944fb77bb6f96aa4a5f640943815931beacd80a73c90c82937d395b2265e51d57d99c44c79c84972b1fc625721c01fe09457fd6df11ff5ab924b236d92cfce8ba4e90fed292bbe06a139c2c1026625b4ec216b16f3743e5c71d01881d8e5274e71e64302e3f57066d58eddb82161e42057977ffe24b009ba6500afa2874849d7552c5032ca3aebe625f0c393bf095858aad35e40c3e90e4826b94eae036bdc52041cca6965dac46c21445f2306af824f772c4fa6ae37b2dfe5f6b16c0db14d1931aa0f59ea5a368ee144290c45421e9e35433ac2cde75399ce8081237593a94d4f329e481f9b4874d9e149c9654afcabb184e78514d423d8bc79b4e0525871543361f8e4830246dc3b1749d7a2d1e8d81a52ad3c08195d8c38fd24e08c78c265d87d5b5a1ab348f81b7f47f47492ed98465936e1f7ad5e3a08a07a71a018a3758b9cf1b6264653ba1f1e398bdd1d926def7371f58100af527ce0adfff26a35783a728b81a1578f5fa14cf832d79e78506937abaecf534ae4916dab91d3e5243756c26c5506346cf320addfd1901c0d60d4dc4a43e9f7899e9b0dc5365e620e2b6ec00b90e66e78ad2d63652b1bbffc89016a59df2040239d4a66dba0c02801f59807840812d0b52b57f69a83db71a21cd47d64bd5a013f61e19974e44732287937c01ac677e18ea29adf424e8af846b374cce4092f2783d0f0d6c9bc3e2f85ffa3cb925f8b55a97502feb3f76f74a66bed6acc93e15c5e1387e3b4bb27cb3077e83c61b1275ba6dcc18b03781a147143b90b164a572090ac846402c2e8acb8c6164f86b02db524763d8859aed3caff8e6ac380970b5575bc703c80252fe31b1010d33132eb4d45e0cdd530f84c63248f8ae5cae1b69ac190d24987fa506ae28844a3a6f51dfed4445a449a241d935afcb776e8d92c8de1fef5784536b008d491652632b29dcb5536f27aaebc07f23737dbda2431a140d4eae9b1a1c94f2c03ba3a0cbbf6d21ca7201758ee896b81fd41b98683cf2a984d0c9c38a2b75259022950767c457d133aea6e281685b7c9af4be01af0ae6d8e2838bf0e098de91adf34e9af0334f9f787841af366bfcb991a1b15b5cd7ebc7b4d115a5a999b6d8e8cae4bd897f0756c5ac085c608854743703b1315bfe037cc45945896013cfad64c0770d50d37669f00e8fe28ae9cfc21ffff9388715ccccd61fddd4716112c44e1749299426a097a8edbbff310fe1290d9ae001617bdaff554bb663e9923df09a04d2668e9fc1444229eed9d632737ed7f273bdb6d894a6c76491ffe7f1d785ec718adb93bbfcc20173bd02175cbbef8f192dab8bac06a6601fb9249fc498fb497aa46f050804ca37f80c6137a3218a94157fdc172c8284cf232141efea0f4f55ccb0bebbe257e03d65361ca1771b54617f3e8e487b3cdc3047ba00c2f5e31b1341c2e39a528eb08aa2c105894b30ca9faac1ef36c5fe6be22b460040c3635ba87f51b315c6076d39441a8414ccd457777700ad990d07018476de89e536b54699db78d16c6bfe3c719ceb8b40ddb25fb3b9eb93ca7f8b12c72a6598b11f39c45442242c63090ec45d30b8ddf3a297b38e93bf2aca5d50096badb0c1be86489e6b056d735e5c150f60629f3b315bd5241dd10e134ef52340a4b8d5db4615124d9e05a49451221ea488f9721275b9cc96c0d8e95983f14053f6e78f220f699b41411cf55753f6dfa72195dc300129cbbfed04df2f1e73f1a460edceacedec2625d224daed40c2b0bd8fcf1b8cea5b70f27620c876fadbfdcfb8de7eac21ee46280f0d7a95bb90aabeb5f0a44028522c1595785d11231f4e7ba52e98ae8bec8a3ea766384b2d85d613718047f00ea80119330c08875003b82d448eca7efe7e1bef405f39c424487eb49aecf84662e31a4815b6ff0f4d45178395c114c2313828e5e020898e542375ca9cbc42020c3e02dda6d0e29caaec03a9b3644d22a1f5cb30671cfda0a0965ee222af13947a1596732643ded18b9ae554f82893e9f27cd9cc9731a58d2e7636a10d91719741e690b1f70457516ab173c9ced94ec7af26d12c67612f0a5f8cd91cf52f5ef86ef39fa5609614419d9d37aed94531a517c88f90f57ccae562cc54a5a48ed000da5099956eff5e2d449d46e7c67a10f40dfc2cac66f88b8d557385ca36188180c0deb3c3e01737d55110cda444d1bdf1b556f82a161c11e774b7c56d9810a2d74c3d05115d3c58dd4e6345e5b8be190309a53aac35bd84174e6c2d7805be0e7489926267b4c17b9b37de37234aee026a45e018cc9bf0e2d74fc4f32afa4250e89c68ba33fe52f1c651353641a812db17b79237b36d8919a16d2e4e9ea32ca995b38aefd4f957449c978a8fe4f0a69df16b65899798f292956d1e4ba973fb1459ba63244cc9470e116ce8a224393db2ed11d15bb5c3a6c745dab9be822cd601aa1f2eea14913e68eb8a8056d506fa391ccaf81ebc2aee4a8f1648f814f1743e2de681b254522fd132dd0f24bd7789df02af188be2bb50026cffc0ac83096dd39220188b308e440b733ac8633bd5b384bcb99feb818504889f609ca7c94adb9b41ea2d91e5036e8fc39e5a4e17ee46c3fd050b4b2106932a039699c78b34d056069490c3e6fe78999e881f53c8e3d3ad7e802ece7ae86bb6cd9d1e48af7418ffd51d84f94f5e383b36e802281afb1cdb6dd856aa3264e8f20754c4f4cc7afc2f7e19d10b034061cd4341e976002d7587ee77cd4d9cd07cad3a603efe6d665e57a47006c94cf364157ee1d08ea6367be590d876212851169f010f7b142c79d21ddddc8e4f8946418e14ee12348895fb9d8c879e9bfd1d0fdefa67b39ff09b5110a3dfb3ce96e33be7924ab630af1b3fbebcf0d13c0f1554f8ec2bbde69a6d3fcff1ad237db8424431f98fdf65917252226bc1a2fcb9e910c76545235213b581794b529f3ef60c7e2825dcd5d20c653e547b52bbd0dcaf8deb6ca0d1b91fe4123bca6dbe55f6c8908bcf714bcd23e684de49d73a2bfcb4e60e6ec179ae1dab38d5d80c02ca0d2173112414a208eac9366e68b2d48c2fd924492f5b1a8ee5886ff41a7bc6ccd8027caf6d02c1f24843a2c54db2597e2331d94b796c741245eca0d995beb6f0de5ecd23a4058f27ff47b269594045468f7ff14b9a1e223ad501bab69b4a82355c38a5257eb5c0a9dc2b078d8900aaccad782f069c279991c7698ec4b5e49f252e8df1aab2ea7cd04ed34b002d1b1d50d53f665f1bc0edde7eb432ef58742653e25c315b8de26c9a0272a92410e339b22f19a0884518e0aec78a0fc375a69267c29d66ec57615eaddf05c1489f56bec6f6cd85af0c35f21e4f107bdeab829e70416967313ac1abf3f574f7f7cfbeab11552bb69812e723e579f8b4da92e59c9580b024f050678402b81a6c1f2431e27d07039aa6d039151e03d9a08d65f6c7ce0075bf2b97f856d432ca63500236d4f71542aa783190aa8c9985780aa4fbf78baadd1c04182d82ecab8fa3a05437740c58d3af6f374617228868c4db1a8ae12b769c086dd6cae1d16cafcd55bc8f04e868bd35c86f894abce2a85b3e16ae3a5eb06c29ff62b3e0933dd7a0deb489db142110b8606f45b04746dc2f8e3337c60fd04ef610e8e53330c293daf35e68eb563eceb753c08db5e7058de9ed1ddda1d9c3e10b7205678dd4b7255bf1564a1741071b98e531a5e2100b1b7003cd39a5605fb5f499096576ccc6d3f0dec75894871f8b8bb5ec0e3bf4b72201066a0a426c917c8b925f5422c37e8af54e7af31a20c2dbe8efa530cbc51e469f4c9f35db3013b9a85c96eefea90f97a85034231240e48db6cd867cbb565d3d9f5d3e4297a278af45ced7297807d4bce511126ed824dae359fc15508e4b63ec374a9fd43284b13a4f0b64d0b14250473ad35050d31068a843100e0ccba704fdbf9db9592691d862676215d5f8a57149be8e4c5b92d192f743cb102feac3caa06ea0e543fd589df151b57e1f6b861e7ecf8be18551a8df3dcb0f04f1ccbedd689a9580b9c8eeefd44fbff57b51cf16daab1ee24da0c3933286024e80b8e133c47ea38287e344288b2bea23e675a061bcdf03193a8a46c915152863acca5b73042cb2a5f08987c29ea5ab5bd7c1a0f6f686fbe5b79f18175f23a3825311e9a9e44aed58f01c903ce9645fa22eeea2fb791cc64d1a6b9e21a2ed6c7faba76df9bb7ed77feb325b9d145077918d79947d6fc1712750160eca589bc7ddb34ebca59b8d84a56d3f3da3a6b96cd798c506beedd0cd42d4c43345023bf00da70da0eedfee1e695cd75d5b681b75add74dc305baee5faf84da55c3048ee69e042ec938b00b70c4c1429f4d897e98d08d8c9cff84e6b81e73b95f2848ff330a34c21853deb122dd73b25f39b43acef97d11eda34d546d404770d7542f8752e8b25344deb7819493aaaa21d784fb0dbdf42be63cfb8d328ec1d71b5f80826ea98df028c812264b30afc984894f7d02bf72db73864a243ca9e486551f7c0d1ec6e042677da6dae8e26d4067822214414ce22f3d780f5850c86905e0c1c9aaf4c249d2e23e89c23b9038ffe41ab45c4f41968a1e468ee630f791d7d9ab15e734d19634c1d9856a4d8cf7b976a882dce2fd319cf3c8b11eff0b88cc0f80b80cabf30edf212850e90311aa70b5d979e86ef492a5c7089f98e41935ec5b34c8f25cbaea6713a1c74702f1cac69bfa5ef87aba2b5d4302dee70f8db1d15ec83a585f49311289c78f4df22d1833b279b66733276d24a20037f70aa9664bed1ac96d806393d21c3645b7f69f296b51a378a69221b5852f32fac92e1933910b6fae53c8d002feb77cb7b3466a0b9364c7691b09173e9075434763e11250b58547baba11ac44540dd5f0007c58da6f4cf82adbf98dcdadab52b271302b257e503e610eca4873a7ea389e329de7957a723f55bc823121bb9f93b4955a8fac1f1e9e5c97d44b3aade4000a5883fabf0d9fc8bdeecd8887af5b9a6cbdf926ec14b3c2aa9eddb843552653764632b0901ccde467faed2e0528e6d2b6a2aa06ffa4419f9a5f000a74a68fbeb09179cb9d22e701d9ba9bc83b376b24ddc60f88b5ada800b8bedfc5ea9c1c2211c4b66b1973f9541df1ef8eec49d4135e6c2cfefda6eb01c53b20ebd2121fdb16d9cfb779319ba635f1aefcbde4a07960f565d23749bc418abbb3a274ecb8e9446a694391c3af8845e425ae4d65b36c5c882702414f94853e54cc30d8cbb19e61df744a84c919438345883ba5d4c03a13eefebf84131e5741313af111468725f9728638460ed2de99f105cf2d687a0df8d3f7c04774a079bc2bb50418bc88dd15e86f04caefc56b284d3e802b778e2ef6846aee1c858795fcfb3cfbf6f02ecc1d69cc59e7f9da0409c5ae7fedb54356b8d515fd97bc350b81a690cc7f231c99d6cc398170b6483f32c46ad0a8527aeb840e8307b467787e680003c6a576cd88998eb111e017af90e52545c495a387230dd4ba7ba1b2c92c21a04350b01bca6856533f15f3bd3d04fe0663887c7e939e1e22cb73863c4474f977144703e7c57fe629de62b0ebc2c78438c97e8784c97bfe0276f860c9ce04af63af7cd39635801eba8d3f7f3738127ec3a82f287fb7929086a32552e98c307412fb9fe971ca26e778be59f4b284f64a077d2f66b891c6b53ee85ef44864b50c1e9785873f314e254f50592a9653e9e292aa52800c9800265b0847744857d7608ffff8caca6611bff38a1d86750a2c9741df87bfc897b7c626087832a30a9509c016fb70abb135bb8992e0192c195fef36fdab0235a5119d45e15cb8e2c538ed9ed7fec1f73efdbcfb995ed4e0dea336e8dbee996e6c4491f9c823b3c8a6fbf0e39c0df8839b850fb1e57856c4e0879af050332028d188af37e2df06aaeb3b0ca0c2c26b65351d34f86f5092a2c74079080ce69f5c34657abbde7b0dc54acc5e61bd7cad20eb84505f86e1c828c52db159f82c2a5a4ed38d95bba95efd3cd3df03ecc9ecf5920c9a6f32e89ee2b23a39d824ae5c0f9d92fb3a0957fa7725139f79b59be4a561bdcaf104fd2e3fae104949c06da3a3bbcd1581b948ba8890463326aefe61f31e0e820ea89cb4c2a76dbb1ba479408c6004de7b97f1e6f95e822dc0545edc591a280e2c568245188730c19a2f3543d039b885079b22d218640548dbf65e8ee33eb7f3dbcafbd6840eb1193db9e7cd720c9fc1abe277cbc2695270afba943714ac5ba1a1502c8c10cbdb68ce4bf096e1a413d117529638532a490f3fe1a54de8e1fa187cbcf7676ad2a9f800040cbc4de1f88f1be98f8328762fc1d071db4c976dc5fd3665caa6f505e6965021e0d8daa64111f090773ce5907fb9a19942cb6cec4640f893469b161f5e2a50ca4579fb0c9c6a36a97852c52ced6a4eb01068659cfe59065575ecc5acf97eb07ce7f24d9261c8e282e026bea7ea25aaf74c83f5c965531fea0fceda82d5943d21ba6eabafc814fb201fc673a32f003717c6727074888c61eee622ca09821b10397d73283e19ea29413daa9e257b2065c5392d3b222035bd5cf88af5710e1e86483d19588cd7f9c96417663c848b19e7ccb9e0a96583922bbffd1ebfbc5162ba886e729f362c0d51dbc865b90e5d64fe4984b676da01483855592572bf5d019be26722dbdc9f5d76ece2c800611f984628aaf0483841831ae5872eb32a06463665b59d5a00ea680c16e50bc5f2be46726da3e30b3476e854a25ccd70013939d315c3399f6ce0e265b550b56abcc0718a67d32d8a34ca51ca3ae06737c48189d449ea8f8a123fe2b94c44864090d2dc8290b22dd90f21cf35a374b51b3894051b8013ac20713a24a839c512da94a9e1f0f7e69139a3e7bacaaa4342ec8705777ab3f56806b3626d005fc21f795efdaa1b597b7c6d8ea66a6c471740d5c7c00a5711a29ed65b7f48aa649ddfa29df4cf28b1ca9bb1dbfdf49ea53f4d3fd211cf8552998a548bd97c91851f2ab2dddd7ab475dd4607c3de25ccc5e8ccd004fbd294e1e4b5b464b45684004055bd5ecadc4248af85a6673cde5adc6ee990ab9d1ff8da9f6918362f1d558b7af3fc1e68704548c85b5c86401ac2a0f55af075f5f376f0cf00fdec93a4ca197c06a61b764ad11d6ac368637f3c6f30fdb653db3842faa27b0bb92357301e4aad7cd76e58dc1f7604108be714186ac6d5756d187b903e6f44a17b2b4a7625918b6c37c690b6644d8ca21a93ef27db310df8bca7a03529647df8002e08de5cdf740335874f0c32f2caa25db3702af021bc50e6e42bab994dd6dbfe8c940dcba0372f95375c5149647fee89616de5da56fff67d3900ed1e654a553abb02d9596694efaae5db72ae20f48178fa23223fa2cee490f6dfe050d5e6ee09c24c9870b4238c9700ff36222c210a2d90d5b9fa49430259dbb6c32c3e6f01942109822d64d2b8db780807f902877c3ae0a8a16d23b3637a9b42809f531ddcc70ef6a97320c215127f90925693694de62a5b3d10a0015cc6ba935262a34355787a4d9c67bb92087eba378132d5530f2b7ef38068892b140f3278051a28f76904600e9c7b90980f5dc3ec0be83147b353b514f2caf92a48082363b1ca466d0a7e005cac4e77ef54328bb2cbd48a809b82da12c005f00b49d33db59dc7fd5134c1aa0d51b124c61667b14744b25196207e1c262856cc8e197517e169cfc8e0b8560dcf97d2a60c479118912df30d6ad49a05d488916279ede81e626feacd5cc7a5c5cbb911a0bf98f3a4235990bb2265159c634caab0133cf1d493d8768a6e906d3b83ec9c90c23fc5dc057104e2c44ce93d4e1c6d26a5dfc1b76e3a715df4ae00c3dc8161f07261fe229638407ef10eb09882d0f3908e843716ab100daa3b1bbe8e9bbb93a65ab7a191fc752d0acef711a9265ae5cadcd95458471d209e7b80a5b6d39d15760b4ac6218fa7eaaa3e07c2910212b00c03266ee191579ebf76ff2133e5c15a78ddd1a2c40e877aabd070a2dd14be265f8357ed85827984256ac82d80580809d7b13448ad73c5642cb47547fa03e2785a403a61deb019932085dc68bfe0f41095023e47443494cfe31fe264334ac2c2c982df05eda4185be044831c6c5bce295e301fda686dfc87534466f523f2fb655e47f5e5defb9728ec3e9943999413f02f4376e80f871d88f43ca16917b23d676123597a626358f97c8d1131fd983fda93acf5510b0ca307a7c5288d4082f3fcd89e5330e0b34cd622caee4295b001896cddf40984a12fe942f5f082bf4cdb535154132c3a757a4d6c1d8c35c174555e8105db6ac8a11410f0832f004e7a9c106bfedcf7ee445c3d2573187320b3cd54f1e0edaeb0e33f933deaaa700811481075238ddd1f869f261dd2d5faeed59efb9caf0ad11d670d7d84700966b2671507cd77368fdd35a049ff2d5c6c44688ad83ab84ed79f981e23d4d20e0f22b1223ab30354d53acd8c030ba81d2046ba7e96987943e61be23df345e3c0849ca6b837217ba0cf908da6dc4641d857cd86ae2f64d65fe39da34fd4888e4cd927e3bb6895817e0ff0beabb262e5344b02479e3d3fe34e864d2ec4f2d17af9248c961c63748824804adcc1dcf22e978f6ebe2373426c9d4f95b60b742df72bfbdb550cd437984a8ec7f3da9a56cd7675c7d335f5adbc3ce5cd7ad6bff1fd093221213d7320ddfba15eee075f5ebaf27b510c6a7325c5955d013e0cd68dfc28d560ebb714ac8667a2789046c817ddc3d5ac56280586d88c84b5c7aae3f2cfe24310f4d1888e5ac75448b8bb258fbf4fa2fd144ab4ccbc62ee139c51892a8f1d1408ee4d8149e006f0177591dfb054a6e3a71243f3f96f10ee382949d814b09c0e85e1c6f206468699fdb963bda789127d0b003822062fa3bd178449c48a5348d2368cfa03e85857619e019d08c4d459b918d55f8b7d4419f7c65abae96bae4cd3d2422101632b36debbc8ac48a134844c863c14dec30e59e409739f59859d464c37a9b7a33a3fd3a03b2503577f9731205b912b665da4427690b576f6388a13548c53f3d1349afe0458f84c74c315e77b4b72764527bf5ec9da1a12f2309e79cdf3302ffa32a134c6ab34543dc102972e25bed",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 45,
+ "comment" : "invalid output size",
+ "flags" : [
+ "SizeTooLarge"
+ ],
+ "ikm" : "b20178d1f3663371d5d347d7aded2fbce4a9c17d",
+ "salt" : "4e9cdbfe449915347ce68713d9715cf8d0b255323310b086b9f49cc19c37107aae89cc732ea70cd0d7ab5dbb77fda8f5f6e081de737d8675db5373d8fa34b327",
+ "info" : "02f69f053fbe2102",
+ "size" : 16321,
+ "okm" : "",
+ "result" : "invalid"
+ },
+ {
+ "tcId" : 46,
+ "comment" : "empty salt",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "8e9dfcf668a8b7e22c8d403c35af78324dafeadf",
+ "salt" : "",
+ "info" : "b4d6ce377ee98d0e1614e3865354cda02dfeb92010ffbade5d1f7e4329f166995a67415d56221128b04de3e8c49437b9e322986b5fe1256c7f8c81021b99ea96ae",
+ "size" : 80,
+ "okm" : "dd84d95073c84cc9d3d059855c220d74f288642a9f73cc2f20be70bbaae251b4341a4f20a5a9ee1e79f976124e9e3293f790c489a52a00b64089ba57dc73e0f81fcebbcb7f75c7f9d02f6dd4bc7b5466",
+ "result" : "valid"
+ }
+ ]
+ },
+ {
+ "type" : "HkdfTest",
+ "keySize" : 256,
+ "tests" : [
+ {
+ "tcId" : 47,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "7ef7d4f8c11d940471cf9a3048d66b3b3a3d9db9fed5f81419fe75dd50116f4e",
+ "salt" : "",
+ "info" : "",
+ "size" : 20,
+ "okm" : "df0f763d078a4ca47f4be5cdd0e63bd25c34dd8d",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 48,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "1b6c7d5da045bf8bd4ac3083e8de2b90904bc7f7830bef876e355b74466cef91",
+ "salt" : "",
+ "info" : "",
+ "size" : 42,
+ "okm" : "934066ec4d946c91f2bc57a2f238e9494c09efc3313d0c8af0997e29626dac9c7df450c1340ddddb8ea4",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 49,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "b9da242c02bfe79364aedd7a323692191092edb2094f112675c2609a387c3b21",
+ "salt" : "",
+ "info" : "",
+ "size" : 64,
+ "okm" : "60d935c3680451bef0b22b3f077ad4d709767dc456facbe4d2367a7e2e72d8457dfd8a9f8616d3690598033e07228b3cb8cc36452a6ace25e3eb6bfa55a41167",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 50,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "23624191960916aad7039c8e9dc2ec4e04ac61a233a02ec6045021598123f0cd",
+ "salt" : "",
+ "info" : "60dd0d1381a014491b34f0af15e4bebb8f64cbd5",
+ "size" : 20,
+ "okm" : "4d3bf3440bdef2e8624d89ecbb31ff8c7cea5835",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 51,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "ad75f83c7fef898ab33a429af351c10caaf39ef27b161a6806d34f1f4f8be229",
+ "salt" : "",
+ "info" : "69546d578a213b7f2af101c8ef532339324d43ea",
+ "size" : 42,
+ "okm" : "069b7ee4b0851d49956ee1813bfe1834761fcbf4c26bb706a7cd5b3acda3262cc0ff41c615b659a1aab8",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 52,
+ "comment" : "",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "cb55dbea8b91ae1ce0a07b23b1508c2a930560b8fe7255fcc3e37835803661fe",
+ "salt" : "",
+ "info" : "b57d6aaedf30bd8e25867059761a02c5d0478f2e",
+ "size" : 64,
+ "okm" : "9493505c48e27c8a2b65595fe782c0d91641719a738f125243ef5c5fb70113432e2f66d85ec8de0949c3d2489b7ce538d0ee76c759f63a4cb447db91f4f46fcb",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 53,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "583bb04b870b4b176e58257b67ffa3b8d4e339248fb0c38105673fe7097ce47c",
+ "salt" : "aef10b993ba2f9c390d429441bd6612f",
+ "info" : "",
+ "size" : 20,
+ "okm" : "fae77a235266738861efd6cabef3f1ea1f568acb",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 54,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "fd4e56ade648e1cd9d797b0e341700c637b0fa69d64b9088f187107f22dced5c",
+ "salt" : "d7b1397162d311e603b5214fbea09dd1",
+ "info" : "",
+ "size" : 42,
+ "okm" : "3ecc9f4d6ba3cf4096324c58baf755430b694f29bfa0518e98a0f8a155db1407fe7afa06aa0a95faf0d5",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 55,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "9ee52bce034b6c2b86d280a16cd67556de34c38c6fed2166a00f90c13164a435",
+ "salt" : "56aaaea767cb8a0d5178c94d4761459a",
+ "info" : "",
+ "size" : 64,
+ "okm" : "8ebd1e1aa8fc14ee946444f75b8dc5c2b15f4bfad5044dae9d3c4f68d01ea919414cc4efdb02ad9fcca92d3341e9cae7e3aa9be31814e2dd1d64c72e9a2f3d03",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 56,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "cb785e569837f730a147fd2d4f53f6e297453817eb117270e2d5c286bffa691c",
+ "salt" : "545a0de785e5820ec65268b63e543c03",
+ "info" : "63421fe4d31283e2dc3d8d09bbd3f9509bfd7b4b",
+ "size" : 20,
+ "okm" : "d2ca6d0f5e27362009ad534c873137e643dfb771",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 57,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "101fe3335e827789564e7ef23a2a0401ae336d646ab15ed4b5edce6801f128f0",
+ "salt" : "317a34d74b046e021493b750d058227d",
+ "info" : "8f9b9f4bb9ed5ebda37ea28f97aee40d533a56c9",
+ "size" : 42,
+ "okm" : "22b30c7825570adc130f548a2a16eb50bb088829b76ae7e120e3892cd34c8982c4dd029b011b8bc1b690",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 58,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "62dc1cecc7f444d924e20e9e3cdef183b5120b1f5bf863519826fad284c883d9",
+ "salt" : "1956ce69bc08e45ce86f5dca57d0723a",
+ "info" : "0cf3a7823b830f3542ed7e66b47be87c47e6da99",
+ "size" : 64,
+ "okm" : "351b18c9758fc7f144fd79b81fc9871ee8a330d16a0c26c7f7f745611aeb98ef000244e07ed7b3c14f26b3cf978ec2b6afbf15b76695d3216278d7040f7a80b9",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 59,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "2c1fdbf9a2fe9bfddccfd8edd7235551fb50e642500f29e5425ef7f0e78d3905",
+ "salt" : "be744780200ed6f2027fae8b64f2de0da992369a19509e590c36f82d81f3",
+ "info" : "",
+ "size" : 20,
+ "okm" : "846df795f65545e043cae985af72dd7328252635",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 60,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "99e1688fbc1d2f2cab80ab95a86b301be9c6d996aac4f13ff7e707487126bb89",
+ "salt" : "bb869fb1182f74b65154d5e53f45b0fc3a1d8a6eac58eae2c077fb29574c",
+ "info" : "",
+ "size" : 42,
+ "okm" : "5dcfea7808776747a63e372122404b320721d04d1e93acd720b06b896668f86ecf22081e48c784df714a",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 61,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "d8ba14145c3b749c50e22ff58f552dde9dcbce9fce3c3290ca3a2ca04f3d1eac",
+ "salt" : "026ae3d9c6b5175426c0cd000b06a8eaa9887941820608602a01cd5fd891",
+ "info" : "",
+ "size" : 64,
+ "okm" : "e1823b02928255424f5818f024de3a12537f7d10499549429a661664b8c64aec9f15c1d71b4997ce64483e9ab2bef0ea25e25780a7abd9ca97a3920f45a67c4c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 62,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "3933360960bcbb94262644f81fc832b15eb47834f797577fd9fa6c2110ee22d0",
+ "salt" : "f29df8b80352ca0c08109e0fcedd4c24dd0547f4f2c67cf51caf3553e7cc",
+ "info" : "ffbb2b91b560790cef1eb610e013082986b47fdb",
+ "size" : 20,
+ "okm" : "557efbdc7f49f566abe87dac7a6dee0f0c63279f",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 63,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "5ad1ac7eb76fa7cc05a30a6f6236e25d906bb0160cbf5f89350887523cb3f7fe",
+ "salt" : "91840321a9a3030285df668afec60a46579b7095f3c357bfa3e403eb2080",
+ "info" : "7da7c7a79c9d94bee3b561e532766f8cb329a11e",
+ "size" : 42,
+ "okm" : "ff7f4fe477c7e6ae93291eb19d7dff4e5e7a1e758bc1d916d3975b011143459ca82192cab3e28b5ccc71",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 64,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "59ee8495dd1744f06cd1009858da52fc81490e1547e0f8b173da0818dcfa0ad3",
+ "salt" : "31a144d8fd2c31ec7d6fd63de0c70e15149ec0f10595ea2d3e4a7db54826",
+ "info" : "4d5ca4ab21d09ad04d3c7a71b5c8a8822f1ec808",
+ "size" : 64,
+ "okm" : "9ca5aebd961dc42fc40eea99d12a196f6c34d36aa0f3784157db68f6e1feae71fe45f8ae63248b12f52a96109b03101970f580eaedb7afc29515861c75ce3898",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 65,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "26c100db697f01ab998be43afbc294cdd0554e43ad75a6ce5de4c5fa427760dc",
+ "salt" : "80169781fc54f9c49e852e49b7246174b7017e02d2ce71bc7ce851b82151688b34ce1f203930e00b7f6e8d56b51b3d33d688fe24dc17a935332ed32372cad575",
+ "info" : "",
+ "size" : 42,
+ "okm" : "a048996420f03255db2009764b349859683baad26a5c8fea6c1651c22c5ba0d65ec13e049273c56156ca",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 66,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "5e4c5e300cd1337f3b833ce4d3a0bc13b5a457577e157a94715b041833882fc2",
+ "salt" : "e365c68a08cc9a36d6044c5e108d784e801da10f66ae266fec614d63c68caf222ba75ac7699befa2e9f303038d0e2d07fe3818fff864068d2b714f1758a5f11d",
+ "info" : "496eb6088ebcfd20d1611bd18ae36ea8b6a6259e",
+ "size" : 42,
+ "okm" : "02adb7ffc83257e7f21ad3c493a8cc5d4bb43db68b4defd246e5f85dc9f9eeadd5941e933eedaeb3f795",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 67,
+ "comment" : "maximal output size",
+ "flags" : [
+ "MaximalOutputSize"
+ ],
+ "ikm" : "fcea23ddff28c25422199d3e0d4de6fc9afecb9bcdda2a8b62ab30b7bca18142",
+ "salt" : "c82899e4333cbae3f49dfb3fc147d93b9b4adb2fb7d2483524afd2f879439da75c2d4f20080c66e60f6128e8fb014346b056d6bbf987899c4fab6693cb2eb320",
+ "info" : "270efe720aa828f8",
+ "size" : 16320,
+ "okm" : "da952bcb0e3d17fff877e7839e8cb73789f617f36113112b16e2729b387a8cafb8254c11406214eea8a4f136c5915d15e4441de592365aed3f44811484a95dd6b31a88483d4e685bcc0ab053bb2d44696553a642c605018058c3568b4aac0c0d7fa69d1eabbe91feed7a24ca3cb97cce86d8700892d3663e0e6a154b4126656b861d5169181d294b6661653e036eed7f625cd858c20c4a7a8a4065e82dec7ff6194d968212df0b5834b15871e6c0a0b357b8d30132ecf79f820ef7337259884c54398b3e284299511ee3a9301b1ba34d6074409d7959ab3567dfc8aa51f9a42e8c681d1b04da1f655e3ceae62f4383f931cee6f6effce1503d1071f10de72dfb6af58d3d11a6a3b01506f4e2f6376f6e2e414aa23e4da9513c849248cb25681a43b4ddcc2a942341f63d1626c05257eadcf5b03a020faa1fe4d255cb318a0e627b874f8849d2ffcfad6001bea1d7f3e6fbc267de89c69cda3bf76673f6469969b0c4e51273a949b5d89ae637b28987b3fdc9c691573af81c1a0aa4ae188d64d9704ddfc239d8ee5a3e5aa0d895bc4804634dcf4ce07da49e9f7984a4a23bc5f3b0fcc74276ffbba79c4043916cad7107c5af2d5419b9f0a9640a3e891729f4011964883a2029429d3db34a8ee49f0507c1c2e21e740775e2116d0825dd3a23eb43d77d380bd8cd01ac00cf8185bda78a44f7ac74c95ccdbb9e529cacc6d30a1965434b69eb1990915fb2ef970ac72979bf5038cb3d6d10eb2f64991eddcc5bfc175b430901a713138bb6a3fb3b1ba2e7939b48ac3062c2fb2d0df62c682e31e0f7e62dff36a75dc4b632b4ac92b97b76d0ca1c9159e6ca95e221792fa578fcd673183a2194ab27cb821711f8e42b5fe246b5bb9f2ea4270806384b5a3e0e3327c178fdadc263f6b7adce122805d23c2c0f0eb2fbc444636caefed6c5219d566ef29e060746d727299e19384fd0e3f17e2585a7c014181e9a4a43d16b52765c9a3618a7aa09ee256ad6b2ddbf7cf49839168f26a09ca1f59f03993d88b947f9cfd664d42b5f937deb5b6e94dba270914df118f842dcd1eeeab2c33d73db68ad1f8cede6d642438846adb70a68a8f571fb576f274c155379d41f16338440d344fdaf8e839ba21c2f498e4b8d9d6664c351273331c05718eb1d909cec0c1d5c6fc3d5055b6e8c149c2a49acea05baa970aaf17ac01b8cbe0e106efd1f59d39cd6fed10b23423ab7720cdd908342ecebc82badfbf5f0a5b71c70cca7242c37f26c84b74adf235863f8d96c676665fe0f5b8bf1480b6231e3c78846dee5789c3204a06c867cb40f58694b52a0129073b7edd145bc33809ef0ca00da8174a0bc992730dc811b350ea82972be48f0ae661e4c8d38d7ddc7d97a96b52aa8a3cdcf7661d4903cc883615168d459b3ba6286b3227668ba966436a6cfefc3273034902d0962f569af0bf1ad944c4889ed63aef03d08711250e4c1bbac289e185dc65908b1163b99a5d09cf994de4d1e7428013a5632a0281eb561ff454c3e98859cdf861f2b2c4ab1986c954d014060f6b6aa705ed052066f31e3e42b78cd9588b58f1a2a49a74434de44203ff8eb96f2350a3122cb1275eefba795affab313dfd056dbbd3739adbefbd5f0e963cc09d9bad2753988ae8735783e91c9ec3cef1c4579249e8418dda016046eee9e117d87ca6fa166e6b3c1cdcdd4a333a5a605b85df1b9657bd249dd4c828046ed55fbb25c13a2525b5d2db9c381e445c83428952927eba4808871a23455402c51d36d09a169c41c11e39a27f288269b76cc7c82da97fbf1b67e3762b46363466f74e638161962041067e699283c0493050697c0bdab58ccce4d281535b354c6c180e6497bded48a19dd4ae8135e6662f5db9c22853ee5591fc7e7556f65ccde5b9bd2b1d328490736d367e5ef1d9a1cbd38a1494443bf6eed7150307485468b44a1a2f919d5dd38763c73e282fc02739762c5f1e0f64b84c0e81a128348ada386726b8dcccc1ac8e70a99600d09045245ed1643e978b7f60d5631f9d2b454bc7dbb47d0f15bda5af5311312740dd7e161134e7be29b5fa314b1fb409574bc3fd184ff9cae8a6b54ed97b1e3334ed5b68ccaba99453e4b8a831fc94df4b68749b5fb9799a12385c77578bdefdc346015accf7bcf5ce8335af4224c50cad9878a23a961cfabb7810e6418dd261d5e8e05e32f3546976fc7606b38556336d73e6b8fc4dd02bd4ac4ffd3a48d7d6b9d2cffea2a989e30a287d8a46fb286061574bffdfd18b2381a9c1bb64637f8e9b09fccaa67b4bdaf728fd75358ad8e2c956ae151d8dd9b0f8a521ecaa11a3d0cd1f31e2613bd163a172e9652b1066585ac1ed60b8cfa1e7383201a2ca05a907acae6b7eac57a7efbd817db37df38eba2b3b93cffd775a1a5049eb7314705d8adbf1aee98bf1d593a9995f899dbee47261676a9f023c791325d978e59a523009a1f0972e88076d34a2422d2f8ec449ba05878b0d9daf2bda36d1dd7dcb5820d73c1e6c3867303dcb21ed4468ba6b5181cce8bbf9bef5205cdfb92bad70b5783280e8ec5741045129a1765d7a186fe26e3b38f8169384180f63d6368a46134c6092a45c97431e115907ea940188d1d47e585664e60ea001a71bab4d86a26bb6b2c72115fad12aad09d20b3e143fb92f45e3869cacc81f74b3ae3465e6280c157c087d8b14a47828acb4d7b505686457ee372e7cc99f87f55a7b99142d0a0bf087383dc4bdcd481f1239f011d0a5d9394bea16974edd0b9b0de6f8e7cbc15f10749f6e52e9f5c81de2f556d392e8d2a5e955a19dfe49f53e7c51f6a1bdcb9ffa894f51985c15b1eaa4beeabcdba504e26f68b6491df2cba9c2a4c0a33e9f926201a8a6fee47aa06f554a35b4ff496e0f27d4b77de5c4531e9007b2c8948d63923c6efea95b4b0c272703e498c31a028134bf4b9e03a279c6e4a4ccdf8e4c2690ca41b6585ae2d7fa3140d88fa178bc652052fb3e5d1c3f7e36cbfaf28cfb0ee928109817c41f85d2faa5b8ec8380b91fe6eb8ef58397044c60e344905786f26b63c6bbcfc04d8ef672e33b46ba1278769ba2b32ef562d2c1793a4693d8cc4c974a94b653c8503515bef70c2f38cf5da7e09f82a15987d89a5dba48b53f476b82156acf765a28701526c258cbf6eddb22b73956ad581b84226e65945af14c74766c52da8fc2540916da1273df7da992f90afe860206ff2c09d1dcd264ec86f56e85ef9245bb7f9f169e8c84e10a1c9dc7d71421be46820d511314c4a685cbe8b96819fea4f6297c75f20522c018db8e9b9ce1740eafd955be1800e070572bcbee4f4bba35353b9d044ba7e10cba4575a138a68842f3121c13bcbf4eb23734dfbd9d81799833555d9c742dc4018972bdeff4c6d5766584bb4d163f58a91ebd2c8a11b7a9250fb53fe4aaff23460fd4470f30267c3ef1f9e040c0e26682a089d29c020e8596800eecdb47e31e6ae84e1a8a392bcdb73c0b30f13447c01a69030554c60a6815936a537db4040e0a703b7db09183e5fa39e05ec859e66a1be6cfe53dadc9af8b32eae9dfda8064b17ec96480a52b16e63467c498a4bc31a52b036b25bafb1ffd5fa6f96a12247042afcf9f7af1e897e792ee8073575048a9787a053cc2aa1d9caf37982865cec5e85d36e7e51fd4ea7e6f7b77e16ee1c98826af48fcd6e988e5e2daf4ab3ee74de9554f913ff5ad995b19c8e8d51fdb59a71c31ccc50603f785f6358e7b2da60f33e7a33c1bbceb2922fa659dabf19b44041f243e787dbce183f2d2e3e642454462879ace0e6c87c2a1c69b7134f5a15fa8944a0615163a26af67496b76a25593c11cf49b7fd7208d7dd2f738301ac9e2f5e996b1fbdd8f105a31eba3bbe56030b6f2680e0d96ab07e17890948fb747c89807faf6c02ea1156db50100047e8e75aa50dc3332494a9608f4d2a0d690f6beb43a7cbb3047434d963c1282cd5e719abbbe2fa834a8ac210d4778a41afa23538a3705a8f39e41f0cbe249dcb28a2e758ec82a59ebd0c9f2c576ea1040e7f5de79531b13e9a7027dbd4e3304f771918f5994e62ad463ef3f01303ec926155d2f431b959db55bb1d55df96c3fbef2d26ac68a117efe4dc8458cd17774ac4ecb4a55ff93be013891a7e5600fdfc33f71bad86357db4aea88b10dd8b525d1713493c6c5783be3033d30b00fc3f7a7fca76312593669ca0a1b5eb6f81a5f7943adc14564f2f7b8602b65db0258739e02a239e26b7a84e424c336659fa49d0555d61b3fb3c9995b374dc1e06c1e87fa5631b026060be9c2a1d6f08400bf1a65de5e2307e0c6a5992191c59bad2f7e33c5a9199d13b507ad1dbc1bac4903fce099f63073113f984a23366c4e1d9a5042094fa65d5f68291d4bcd554e90bcc4d193d2c949f3a438344e6fb314c5386fe4da707f1b5fcccf924534b7c05a759cbf197a4ca6c2519ddd654ca065cc0a36e1d36d2d27ef2712ca545e6452b086aece32468a599df9bd59e52eac8f8f9694f20e9c5314364cc7fa033c229e9203f1496871da05e6b06db81683404fb7f71f78931fd49e8d380111fa4ccc39081718075d3e3e799b160666f2f7d03cefd0b7777570277c1c9539b7838bf2b3e0af52826cda71f5fa2283623b4d9f79c2ee9efb63c270a5833c557a27f478bbfe1a3c3eb4bcd8d308f467b1eef21766ea5c92ee804cef0e925d7d0f07a6c2528bbcce8050a28efa572a301ed01afbdcc6187bfe0c900230397651efacf9cd3e9973457b04dba67f0c0a25715be31cf8dd443c8a949ee461f5d0e8bc8871dc11cddfd5ccf7d9d2d96ed4e5f116428e0b64bf9cd74adcd9229de8c0f91cf96aeff891db7d05f47e37db94ed712fd11fc7bb7c224431d613a0adca995205f04fe3c43ee105add0912774fc7dfd10866921b0f5939d6d583baab068642083465bc982301fd29cd786ee498445a142dc786e2d156bd41a3e10fe68e9ba32180f7c82a49e943ecbd62838da86d2db1a10a0d9ad35f1658e5024b5ab11af68b5eba6d1c5d209e1d986844be7bae18b8c4f47297463038754eadea0802b78235d3dc62404b2645dc3e695e222a1a866321f8bd3a63526cc065d97d73854abe078810a3a5914b66597630e27a2aa563381e8a4f17f00ddc5808001284ccd0d820b5881697bfabeaa5965a57de9e8aacb8f101d7b4a69110106ad7b60fe680633c36d0a59126b5c132ce66dca973ddcb600c8ba55f577b716b8e97a8b9d755303b4a014ebfbf5e134e0a764e887b038c064d4c632ba82ad716434565a71277298e41a5056607008e1d5b44d3e10255b449a7bd2f4185f0899d0920de2254ade43abc979971348132c143804fb2954ffb51d538e6d56a94b865d51715da3019a292ceb4c044be8fe24192d8a8a6b5555b40a3d535fcbef5a83132415ba6273e90a377f6a79cfea13e76df55555dec95fecec4101d3742629166c63f437c94c65c42d4a82567b667acf94c26a72293b6179e67c89a31c1428a0392964a40caeac4b2f41a941912ba33caedbec587c272bb87e0957223c5fb780714567c48d8694641193e3999d0b9789e8d6f616195cdb4cf3ddfb2e703deab6993664e64002f35e101ed84f0acea06669bd53d84cd28844ab7095d8b7e52fd8b71897bcfcd63af144ece2e36ab73367cca5517fe103b68aadce74fbb519aadc5cb1484e10ecbc5a6ca76c372a6fd9017f79678374e6f7156582ba737f5bff73c7a808756af003ee91c63ec6286d49610f15d3a989d110e352aef423d5090efa4e000a993a0936a7c782c502725f0975cf991406bd63f0d6abcd68bc20d34af4f100586e0096b70a17e424c111f375551a75e8f6c3178ebeb98168bdaa24dc8bd3bc7c3046632cf2771f8985b3888e887e2b5e25d184064eabb63b77ed9a8aca1e77d32492feb2420769ba40bf74647bbb37495f941e433a1bd80da7a07367d4fc00f107991b37e796c58a68dd0345cc106ccd98a8d0e7316130522ee100e6b6e57fc4e06e0ddd76000943ffd8afe4b093fdc89dc1eb61a609e154be2572c5c15bc95c4bde8d317eae4ea1cfb57ae0f7435ec74220a61f8cf12d059bed017c84c32192f97db40bd393178eadb66b01b739938fb467f884caf5c32cbda52f79ada5091d48ab2433383ccab3d0dbb6969a2eeeea5138df5bac7a7d21cde25017d0bd406ae405b0a446536ab6e67adf4f4e3f8852644624924986d56b0cf2060433d6b2b8361c05eb9281448a2bd2c034f63877462512349527a30b2f59664885ff1c6c302fa435e150a7934a919382567c3734547ddd22f874dcf631c73d104821f88df7fe2e8831ff6e231b930d9321691f03c83a8510a01e798218206e7ef1980638125a14f4d9ab05a94d8ebbf63fa4440b4c258a01989305317c9d3af7529e3aa570eef275b1bf1c08ccd7b132f3bdebc4340a251d875f6bc83d373f1313ad0ba114bcdb5714bb0918c1f3afb51361cd82ac036c6a21a4391da85dae35443cddf8329d1879fd174a073ba5fabb6d669bc5b125601228f743114a6b0a12d406853956ca1fa4900d78f4d448394dede90aef3635fcc61a2eb05e700d7b5e53ce85657e44271d6dd7f13eb0e2a0cdedddfa420413ab9a1d43d159eca7a8fd2220d572d14748e2405061942296ea29d46cad9b8cdfd872bb6e577b11aebaf0937ef7a344bfe65670da72e8769f6680a2e3b1fafd4a4a7165e400c59438fa48e0135be1249bc023f0ddc6408578ed57cfef859fa24e4d9291715b7f7863b82b52b06ee0bc2d75a3f708bc82ee18aa19b6487c37a365d9334acfe161eceb65aa7dc90f49dbc25da2cf6345ad44cd188f0722764db37e616b913b212b2bcae5fe09a66b39c526e9cfb32514c862af2f7dddf190c68885b6691066188cb32f68173818d92c32f53c6405ef6f3a5aee0b010c8c08b9b5906c3f138f53cc95d1b1d15ec3a72f52c73655152f87f40b934370731dde442d51a2477b3fc9aa357796d7126a9dc22c6be364f74adedc35ac525daa39621e9f9b6449dc1446a2178b0373d53c9f177a5487a2054cee847322ec7792c0329886f6fdedcaee410c82d2f5a9f8458d185c196392dbeac63fce18c23c3807013c0b9cf4ff97096ee1d4a7d9f5e182d5e7217e6c9c1d8c23a6b512d27a449f816d6db9ff50dacfce75b91b1322e2d106b6ba46fcbaea5e36b4968eab13c6b5f458ced95de43339040a9090df36c873486a8999778fe879a3030cd5a8f721805f3364eb7fc30cc023897315ea4c638399979f58bfe102c456bc7344e35c5e3e2ffc284574d16e67731232f4914b70fb3158c51fdcf49fd4645a1fefa0af2a7b290e7bbc5564e68606810b217938e6996b938d42a05171df0a3ad1a1cc99af359382442ba2643ae376b30a6c4888f2204354bca1b9e8dd3e309556ecbfc75f00275ed035ac839eee68e61056b182a9aa68affd8e9c5d5653a024f8c826e63a7627dca5388d995afb1473078cf6e2a327552917a20af7b81c6f0b6476b85b94e003049b5619e5150251b353792f3bb8b3824e46f8af9ff992379bc82c7d2dea42c900c2e814600e9946c477973ea7720ac518058f72fff453072ed0f5ac2b724269f9cde6b0ffe3beb2441da789ac2da03897762284da7d12fb019678f550ba79290729a77b3bb6e52ae65530b5c8750b2bea26504978a55c8b67454ecbaefb64c114c59340f1637e63b52d27f80f4ba2583b367cbc930698c7b40c3ab6dd719d5692b638d14b2c37d6786cf6b538d46959e7151728cb96cdb9de8d33337c0fbb10b1fa8d19e16f78b87de7ce4bbae780af45044e523bf82f73eb2eb75b064876ad6da9117d92ab02404d97a55ddbc1621b6664fcb4e8a0fb017cf03a731cc6778aaccc84321acdd83bf70f2958f7ba30ff9e1fc5593114d6097c5a074625ef40adc6dc2a24e865bad210c926071447c59308231a64bb3f13f05e90941b0ab8e8b8673f2f7274de43cdda7aadd0696f054c9c3e7917932e4c556625dbdfc4da01a5b4394b6123f1a06e6ddfc4e072da49bcb207d7013860a4d2cdc6707509c38e71e49034d2f32016ebca6b52976b06c572740aa3a90c0a24c008940752367f0985df701d6b1f91ab2f621a27a58adb4b080a7c2cf039ceb1757a703874d511452880616479a09ec397b83976ce6317c5ff7b76afb946a994b07456a14e9a4d64120d3554ce08eb8f40b9b99899553ee6183d478e4e268f424b0420904b115525e84ba2c5548bbcc7a8a9601d2d0494b5b5c64e2a76c7e0414f14b64edcf4afeca794c0874db8fb12f787579048c208d6e29a5c922b1a5d913ac8edc288da73d472dc80b7a11dfbcd6836d6a95047cb1dc7da951831c22934c487aac86eb79eb15d46fd0a7caeead75789178039a9f810232969b56c49ca1911381cd06c31b63b827829e22085d8a29509c5eb807020cd0ffe9383f619ac5bf3b4046cccf6d15959862e58d386611ddc602baee1bc70a30609f1314a619fc4a12576f88412ad16ffb7dceef23beeda6b5ef2426510af2576489de14f541eb78e0b164524d3a04644c8546100ec8dd0fc65898975d68147d0e0112255cd85cc6773a9b63120690bb33fa8068cd6ad469c35a286872ba8910c2f1d2df56d54e69b20bfc0f66013edd2920c384e90bbf92dbf48497a7ff0b108f7afbefc0c53b114df9abc0fa40436c12f8692af9db4793df1b0858da03423bd4ff300ba005d937f06cafd503741ec0c32f6ee3daf44ea893c8ea8bd746a48bc388ad53562265984ee84ec589fc12b579d8960f382d7e27b5d90936b4e6f120afe68628f1f210d05e7dd7e5ce7bab0be7589a0494fd08002adf0b03fc64605778e7f5079aa370e44d1ae9ff13c1d22a1193248a23c0880703706670bdffbf03a3e2444039ce8113110163fe40be11caf61c52c04c908f182e496ec3ff630c2a80414e6b277ed190edd58baa7897dcb78b8162c02611f4cb4d6805246b18d35939964276775982a98929db651c440c04c9851a8752d158e92988b2a9f6387025ff1e2c6ff921b0ff86834d3beae6736cc2908d4d5048c754ad4b31d56e15d9fb2a4c84725210835e1e1780d67ac39f60fad79ff1c9dde42a2abeda4fea1bdf2b30e143725779c060ee35192cde2b337690e22d80f9b6992fc5450d6eba60c9b2003747832f180b5852e378e7bc53d4d57329cbe00422c405b8b14cb8e61c310c7c7b8e227b9848687323dcbf8b1e0f7b884188d1130b538abb957617bb3b6d587f40511660c42548fb197f0e86e35c6a240ed1486e2a4882303aea8092650180eac9a7d80bce5d8a5526acc6cbe78fb0526be40b0082d3d47152a1e625e0bd0cb479a3b9d6a6d9893fcf55b027a4fc704fc6142fccea1f5fd5b0bdd5f78425f66e7158e211b0b5593fd73ad3ad95947e95663b3757ecef07319cd1596c87c2b853a82384e09d032b2fad3277e30521385a5c1cc8a0a5e12ffd2427f162aaaab37c4ce2690918580e1df0c729c190c0268f0701f26e7f534855805a50df4a4d14c57f693553808e46473e6b6ccf05332aeed8505ce4e0f2f1ce7238ab1f96171d3e880873074b400d0ef6f32df88e134f5c912a21364fb7c9a6548f47f154a8793dcd8ef450e1eafad7d67536e13cb5477339e14b4765eca74e9b95871a1cd1fed17e30f423f0e05781e04d172e19466aede7ed04775594d317e2fbfdb9dd70b70bbb6c8af3c5c12d8aa1671638bbfb699b201b21c544430f2a326fcdbe9f94482c3e4fcd070dc983f843d5c073f47ef3b3744a1622c4bc7f578b3d9cf11ddd88ac77591260facb33ff6fbec6019641652a65ecb9bb0ab1ad2e1cd20b0fbc3dc7be04f1947e4d994aeec888507b61ef0919cc1f0a68ffcdb263c55af9e7bf368522413ff5647708b66087c337539003a2c0aaaef6be1be93804556d5b9665639f3efcf122874d2e4858e10954dab7a75abce5c9128358d4e3046f8dd4597ffe778e4bd071601ba99ef5d2e9f61354af30c95ee82d38449bf52c797a023dcd31a0ab316fad54adc98469fabcc05f0914fde0b0e3cf35377d11a13f81c02571d878fcc4bc849bb0b4a6209f018a51598882bb5728882b2e6501813887a7e4572244c0f1bd9eeb1b38c9a48d98cd8968d62a7a21a48127826adbf8d0af8b0c8a470dd4266fa66d40dca6a7e051b8c2f9fe2868248bfa6e35832d9300305b64a587e9114886149c893c17d828cf328129f1f9765f5ada47cd2b2cc75af7ade1a78876ab806f2dc24d3fa1fe7763e2f07f47dde1c44325384b4f409c899b11a8fabd3998e7ab0dda51602ac0f6ebb213e34bf07f3fc981db483d26df2204b00fabe5816359433651bb65040acb8c57d949e184cebc3e8890f58f7bd9aac04818eeb38c10ab41caeccc5bd245929b6b742e7767bd9e7b0a0b826f1daa29145e745d1dc96d3f00192f0270553bd6052f4c5f52a4a3ba042a70a43570438f96899552b64cb84d6f7edfa2cc9250c5db008ee9745d0ab57515c55b225d72d7de51c405a462e1ee5e3171c81f068a4c37db6f77fe0ba6b5d0a573126cc8781a08427bc0ca2d91df940f67935ca46345e00b0960fc10d717b62caeeb8d3df9dbad610fc0c39db18993d2f16e4cf457e176cdf73d3c906a98a4aa2c72f90e48448fed81359b07b2160e520ffde2589fc7a824da54d5d45a19ea8e804fca15d95743f2509643e0b65e935c9481fdb5c28a98bcd6fe0f76604aff5735b872d82c5c3b2594cf5cc20cdecb697ff5ae00bf9b0e2be9a958ac639c832f683ca5b437c4974bbc85fa58665499620110cc309e32148686db35f4020c01006054f2a2785baa01238a869f646f74fca8a0f949b8f16363038b3320db05f5d66cda22fbbc826e981d9bb7c37f141fa2d201fa5768196c75767366987620060312417b5dbb56b88a937cde9576b2fb607bbfa61197185e52f470364aa96a722a84150fb6fdacac21857eaeb17d5fa70673b1c42289e3c7c111adcc7096fb9c6dbfaee1a72d02783fefdc59eae2d6dcac7bcf93bbd557f635e2ba8cf6760303f2d1315cda7fd50d690f1c506fc4de39a0f1638808d9508f77c27353435e78317f528bf6f283988021eb06d48e42c2a07bb51b89619a9faee438ccede6700165f384e0d1597cc274228fc0d879a51d7d074ce18029d1d6a3c4806ebc99eba8d66e9ee00b7272ce335ad9471c462c0d4bb09f14bb1ee1ac5b89e31beedba915410d936e22ca630ffc4e53081bef662e55785ed287c6ae0797705e19d80e0bc77d9f35fd5b2700ce38f588844c5c895fe308a5168ae2e3a1fc1ad4c4d126adca021ed71e91079d98101eddb37e87d7d191ab28e420328c7ec35cd7a2b08f633d3301ec851012c98350eead48fca4dbb4c8b7bf266cd5f418fd662f33bf699a80fa698a1b3226cab671922bfbecb8486f4d802d0814adb84623926baf2e35e995dab3d9a2848eafbc951ca7e5489aa9983de26806acf57af0109b1a594c1cb0c5c4025ed53d1a2e60f7ef3951933770b2535d6482224a3e4a160f6aaa77215b51440160887d5f920cdd350ee0d354318d7b1639c926fe8e8f199f3496610ed7ffcb6fbdc0ed3e09a57fc077ef5ce55643651009eb83009244d1dc0c868f81c575a296787ec1eed057ef1fcfb4c3ae6a513e001ed61c70b077bc2956e0d92a580f459c390116cbcd7eb5e3904cc0c3b9ba71a4b1a3c29d73d9e8bc66fd30666fc09e6c1d96eff11538b5df079182db0fcf3f6209b5c65bfc439f6d8eb281267c8ef5c71669f8ffcd164afbc35ac08970f639e41eb15c46bd083bc29c2900172e8bb9f11812cecd228dc8608267d546aebb2d269732b59d22124e6a25538b40c9b5f1290209a42c41b1b5dc4fbe1bae7a833fa8dc4392d33b59d9f51ed49aa2e9ce8ab854b84f242cac5e6c54621a0c191afa4878608a5c035dc9b24be21cd4ee01b06d1d71873ee61dc4147e41e02c4de1cf6551d78c38df79d645510454aeedf3c0e0fed02cf6d8cdf3f5f1da5180f04c9a9b3e15a7dbed1e4a03b64b4b6caff6e393e63d37a5295c72f6c18e023f2171bd413966d68ed043c29ec560e486d2b6caaa8b3b12e1e9d5513071f0ab346b3af635f5c42ec8868b32595ec28d8ba79da4d2d122c7ebe657b20ea9c2277e60d632090c3ab0b6cf8f586d2618b5b891c81089666ac474318351e65b5276323bf7430b1f985ec364c907417bd26a210f3da62e85b1e96515c31cccbb23a09d9a7086aae5aca9d02d3f35153edc77baaa515339edc73f538895fa89e8f133d5bdb3f925b5988d35a69d3fb355c07d388b4289cd105cdf615711ff64956d00dfb8f62e9ee2621d2cfd520fd5da4e8aefa4d20a554fc75458963eeaeca68b4bd48b40332d9bc15401efb2065a9af86d30b953a88dd138773afb4a4f46d7ba5612dd16b523ea5132c7dfd6191b75c8af40ef8af5414f08d5a74b7aabab87e1ff372d44f91d4e03c7cc274c824b06b309a772e49efe01374fe2539b0efd0db6e55d838a25d5715aba04e05ec77eaadcace41c82e58d8ef8dab53d6bece142c9b389d0c656ac0850202584c9a5781edd2d4aa199c4dca961c4e34c7bd8592fcfb9fc5097719f4848dbdae4c3147f786b81056e27615388764dbb82a45dc02a3d0d25e79dc80dfb564a38295697d69552ef999572cf70834714eedb89ceeb08661fed9bdfc73a7f15623690530cd8e9ce4270de5516edb5ee18e132be9605574fe4aa3eca74608134873aedf8931280ee9820bc41340ba727f05f35b2ada0911de5d8e93f62a8895ec6c6de42bb862ab836ee6934eaa87c19fa24d695b54241392cdad0dadc3df9251e7ab9a4ad82e4c078e0c3f176df2fbc04147224b26b48b9d08bd2826e33ac66ae03fbc06ded6ea0ee85406163c0832e9c832eb0e282fc1ecd57e1a010ccba8313798cbf32cefcc3473e3ec7bf47b7bd95e355e69d6e7d3c1382e6797a2f4449e357fa885b910d0946168312093f2a0427ab5b517a3a38383299781d1c1346c234639c7a31f85a6dfc57f4b19c24701ce0ee6120381a2d50ebf49a423f75f5ab2a78a5fb542195b83888211b1a11115e815e32385574640bf8b8789931ef43c8bf190e92789e05d6433eee867cd4e1e86ada204b2c1d42e8be00e0b2e4c79264e960a1e77ed08bb60237a8f637dd61aa94300ead31b2d39924aafd7af2699fa6bc3bea21ef0dde1e47c6bf6bc6d36a1585cd48ca0c799f98410c52f0d1502402fb28f38ba4eb3d38e6f38838fa716760cb8b75af795f7839190cd4da3be1af8814ca613fc8798f07847e9a15f5aad0ac8ca86bcd9bf29c60ce08451cd198a1b9b012061deb3ce6c2502cc6b09d2a6014ee6fda300f369b89000b46a7bf98a96f4f34b50118d47523f60286ab4f42eabaa4f55939392d17eb2d59cf8bc0e7968647911eee6e07e1c1b20a290c35fd0bb004ef2113fdaa520eacc181ba4d8699a3f044cb2a05e37489c71db606454fcfb31f3d11a488dd9674d109eef73f42668e92146f02c4ad608b732a98133b6a25cb1dea7482d924dee21422338278acea34600911370d42306c89d7b396a65277c05d50301dfe698d545de3f4b9f5ad4ee4b4bcebd876a327669176de26263b8eecd404b9b4b1b7524d4c45dfff70b8e4024ec5d986f23e69e44fba462efbb5fff5843b3eac226e3795ac08f02a4e1592899a2db6e658163c48ff3c06e6f44adec0bb3f2d4abac3eaaf98688d4e05ca20b3be78506ce797e7671d3162a651c60a72df38a88cdf34ced7349c1c6560df703dfd948572743f31bdc7c9ab179eed9d9f1d478aa511f416551dbf81823b2e452011b963d075a396ec9d752ee085cf9c3925f2b67e071351fc1b1a6be3d1e74aee7ddd2769924aa958ca2f30f2044aaf259a409c90fc6258bdbfce34bee384b1b57625bce62aa426f1c99380a21f7b268f00c0e9ac502d42959cacd173064baf9602abe95da68550c7d7cd94624da442f56261427636dec24c2e8049734ea68629d4c9794177b4289ddc5b52dd409062c71883a9cd41ddea169eca8957b94d591796323adb6b7fc409d986ce0143d519f9da512c52470239742a308fe4ab78c466dafd745221a6b75cfaf1707c6064f7de50b27875ec635aad9066940c485962e939bca1fe65b5ac76230852688152be07fad7b8a048637ff41e4345a9c69d7c88831a11ddad56e8b5aa35eae7fa28306014b8ffdd473176355d19d7e93ee83ce3e21181ad8fe61838fb05de2101c6a6254514a77e0f9b5a4e0a2c11d302ff51a34d5bda77952106e53e49c1ecc5657510f2bb023ec386ba50c1b320cbad497f84affa79ada76114e326875ca111461a46dd00616bf60d7c715ee34b7e4fedb68afa231392eb1586e406fa4391f77128dc45a1f9b8e9351383c63f668774f577529cb7b7345f371427e355c2cc380a4e5f9d584b1e2f81da1cb40722418db1248340b86ec8f7a32c4e528449ad1df38872cafa60b10ceedef33151adc19f54700f5ab0deddb2b20dcd7b53bbc8c96b7131aa14ef775004673123ea9e7822914c4dd80dfc4fc1a4c9f3a3e37df929c5e67d9b5a75107e22e331d492fe1a6c6072d0c7a16a5600690be867d89fd3f87d134ed0c45cc7cf053b69b7c6f1e29514c40d30c8102e27b67c84f8b4a08018375412ae3d8bbac8bb09887454be3565f551b3d20f2b62e73ca9feb3fc3c805f6881da87c8a7310b52b8c6e9f9d2893263bfa190d632fa08dadef449948e019baf1f6452398a256e90806b905bdaa90c86193138c2b7cdc9b567db903ffa30ccb8460a7036eb2562c4185a67ed7dee074c32eb77517b5b7285077b82047beccf346a7e85eaea9442d8707a604c1bae2a5e1b862e3d18c11bb918dc17e223f1ef0f71df52f5ebc2fbb27d7887278e09fc83d03069af56eedae8f4320528264733b1a671762c0fe6f7a1309f20ef4ac34b236ee17462b4a817ba49b99a733b75820e3f5c0b32f55ef7594183a0a4982ba388d399073ae4277fc205a1b50263c584a62f44903f70062244ff76c0c774f22735f3decf85279db2cd5a2bc3dda1be211435ad587f632f35e36699ddaf1fbcceaae50f88175463b71571415e92612978cb4ecf5cf706e2394e5bf947b32d9bce56b57ad98296a29d9c08827e3d6374e7c0dca54e4c260c65569325f3d263bf1a15a455a2051d996cd3883ea028bb64ce3512ded88ec6e7ca39b0680bcaea07d39d8a9709cbbb2a49b2ef66df4e856a2b99ebe99ddd889b6a1397c0ce8121cfa66b47eacd024ce912b8fcb6190e7fab3f6e76f42aee40c116ede149372952694a9d73e02ed948a439ead0641be4aeeab64c03f2f95412fb220475672d9d920adc74776b664e31e5232414f42144e8c71c13528c48140ed019728edf679aec12ffe6ed93fa6b23559103fc0d25824a1f1d2ee4c40e779b66a9abeda4070d1a2139b353aebf014604a73a4892fb32b4959291848602f65ac031041b76320c5d78bf7c779e7d74a376635150a9efb7f5f1e5035a8ef19646c7f73f9f98232031ed1b564bc80ec46e54902bdb32c26a8d2223cd90066b7747ff5e88c5c5b7c8a867570adfec860e074a10730563f6aedc1285cd8d73b7aaa6e4e069ebf683da7a4a3bd356e32bea5cba1a566998b14f7bb6e2ed14bf74470562747e0ac7bb9efa97e6f0d66448ce150a09b152727b4366295b1ca1afcfe61a35b538a76f12062203752219207d0f53532687c20920b1bbc7493a041adc00f0ea9b9a55c316c5e8ee4749317e69ebb0b4c45dcf04d4e917bf503cc2fd7eea0532d9e635345f3550a352138607e92c890460f8fe32a00979b91635961fedaef084d4e3426e0f06a5bef384f32380b0f4f3b9a966580a083138839b9e9d0b65003bc01d6cdfe28a7482f9dacc907ecf989d3c5518398ee3296a3d1b763f0262afedc56b5362fb4d735bc77ced2cf2b864e4d7c2c67ce621e56688fc0efb0784c3b75b748d71347987c7bcbe6203f079b16eb8ad538e6a19f95448f6ff053510447d98bfe2f1e07fde44bfb766c43a5e284a69c69c076b4ea5f28bcfad1ed7c72ec5640ca0927510433789610b806f3cc4e8cc0a354ba9f56b3f0085bbc422bc36e116296808b14cd7a6dde0a59d8058e4a0dc8159093bce2fe7c617a3e9016237e4823dd6444d33432edfc84ae1edbfcd07b24c4134efd265d8b66c525d23e625e6cd0f5eb7382ce5ea6ecdc77080a66d34b2721b5a0a2e307cdc59b931747a8067cf982ff51f8641664edbe1c070ae456154d6cc0c9870f225ff265db267dfa2806d94fab9c7a73ffc1915ee0a3363aa2fc6d6101f7113d34a3111d68c171b2c3d7aa76bb4e44c8083e1b5d685127cf8128efc15049d3e570c056741cdae6b20db3f92682266d580602a8d1b13a5c4f4dd2541023a45620e3c159ba55008242adf63edf1380c1bcafe423d4852ea7ace1a806325056b6209e914b0c99637f7fdf1c8286bda7cb62da0c8ff996205a68971dca25718b7ac25b816e1d4bd0698648dc067155d94627d380018e5196c1e443c16a34f492f3964090d5a9c5c9f0f2ce32ab50cd1d9ba576e5a63ac439d6ab9d6a64cc41fe1fc15fca1c3df7eb1018b5e7296b6e99ffd5dbd65e260412ac0558363119a987edd2b0cc9fd60b41e939502a39696cd73c91b87c88852343e1c1d0a19b2b5f11e65c8e9fc861ee74bde3c5cdc7cb18c82a06126ada073820ad771ef9e2b4775433de8efa6b701301c793400ef5e09bb9498d3ae101841ab423cbc14cea2225e20ff7efa00a955557f98e47c265c1706f275bac6bab89e9207f7f9d33181f1641da0acfeeaaf1e40032f289ac39c4bd80bb89b4292136b4931ab25d8bd5ee6de30004b1028ca9ccdd8bb69c4af12f74e75765202bd4d5513229cb3865f9e0e53d1911bace2d620d5a830cd3020fa771396b5c3e7309197cc84f6644370586fe15fd1b3a9426ce1ef04b477f05e52553de84c58934341121691c866f2a17c2ab4372fd439f22d71af37b7f109ba3f919ae26f8136624b87dc828781b1e75eb1e07ddbd62466b91d3503d479d8cd02c3c8cdbe886137b5184dbb67ea839198a72c2fab3eb1ac656d866b1770211af3373157b8fe79d4fb4d67f1d1098bbf06eb75cfd1816515afecccce23a1193ccbf18ed5a9450c6dfdaf254a71e36de6e4e7823f9c1bc91fc079b08ca8fe4d084c19cf494ebad56e2962d84986fb153f3073a7880313d42bac3daab7a365323b53c22c6438332bf41ad786ad1d6c982c48165bd90ff446be491391969c5b8f7de9409d33bd845bf5b664e2a6847e162a8a1115d321d65b41bc5608c5f3bb3401e1c691a9d474a1c6c83b4599d5038887eff5dbb0532681e5fade53479d38627e65f873559abc5b41059001b2543dfe422ad04b537feb3a2f09d3a00a46729627a19a9383586f0f349886641466d49b4c590759409d4d82eadb542b00282a5650d2c8fcad5c6da6ebc80af1c19c78f307c1087e4843490bf90e2e4903df15164a577d7f2e5c14e34187d08a977d62983052c96bc8a61b4fc4ca078451f05d6f7bab917ca49d55a1f01bbb0730a4e121ad37fce54c1a5f29dd899aa3d09fb6b313d81d98e4206fadb20b4546ca1ebdc53ed307d9751b04c335a84c1931684c2f983299a16e1c4d1c27dd6f9c24d3181011df27840520ed65cd7d9f2dd78aa158ae5e882fdbd79c77c84a3a3123af7ec0eda90facc74878d3224a03c071361067178cdc592a4b5c00714f64fc45c8903196070350a4a5fa916aa063728983a44fee7cb584aeeb66e8efbb876b937e7e5ab98d32efeeb5f9a474accb5702f2e32dfccd19024e00bc5fef51007bc7606d055962075038857076d34536d147c0be15ac7e28119f946b1f3f8dcffa9668ca41a145dafc3651078e31971181054701bf0352a97c40ad76965e8d6c0ad0d4bf6a2ee44cccaf53112478519b2d3470451568e6880b3bb446dd470da019488ba67c1edf8858041d579e501420e593bb7d9f5c926f06ab4387b59dd552f262120d67abea242dfe1f3cc384cc7146e7b6d0c61b8bdffd97b460670c053d9bfb49778aa8bdee7d4401a2ecc01e463a9803bcffcc835f6966bcec9c8e36951e0a86c3866d06659984badc22b1d078423130b981f804b2f3ddaf91e8494c70e038c8ca6c3128fb472bb68ebf56c28116aed43156163f538044633176c4d06b6e6bea44a25d2d432e17536c388718315e3b201b60862326349bce6a649b0a1403dad3a032e66406ef7f8431108864f2e8643d58ac3959403f0dcd2bb4c212849d0d582be2ad047113c8d4dced87d4f3831da7fe33325d8159d8a9e228444ef0ef90d60e8fa5cbec5f0f435fe36142bfeda20b7d12c44bb6fd1a53a8d21ea68ddea69dcc25a0e4b6370f06c434d7c075e7acb075f1a45628a094e9418ff12c8744cc3f0ed3543204c24f900824a660f88f51b077c6de4d31e1f5ea75fda0a6a064a5cf47aa148f8e4f2f696f468d69e18e416e0c11a9e332dd81eca959bfbf8a8b0cefdff1f82ac4e4a46203d0e045785879cdc05d9cdb5c1ef09b87ff2f7c149cf5510f20713ffb32a5115ca0848520af56c9f4d09b27216d8a3e8638c495e18c5d14375e2db66bcbffb69277733bbf20a08f69d96c7fb3eec656d247775701bbdb3dcde0a846280c98af503ca2551bf07ac055850fefbf68eaf11ffbc4da5b3df60c9bcf33c939508505205791aa850ddffcdf54a9312211de500317498a9687f31a34c956789189a83be85d8e56ba912eb90e1e7d7ee8d2e3cee18c75757b86384fc3c46d68b9c0faa947b52f2b6edb64ef71f093c48ea7ac1741602370ebee728299c47ee9e1423727819ac6898fe710ae155162eb739fe4d772a3cecea478f92fb4c797967c1693918d8d15a5f44fd6aaf63edbee37f9b4237ba3e8cef3958f8b6502451b444edf009355f7b463aff97b1979611e8e69c93876a59ba00e495820399ac8e73d88005973f6a5af10e160f0d81e1a63c876510a8937ada632144c9b51435cc0bf7617e18cf4255b3652490808993a4e1adf4a33ce389263d0f815d173b8b6f7442b6818887a0bae03aca89a6055dedd1b58d4566708346f46980a9f6ddea705eb4ad56de85143763c0736a7020b7e9d2787a1af7cc9eea1716bb8b4017f5f9658da6b10b82eccef7565730c09a4e764d98a776d05ab775d1d7533b3e95aadf21e8ca3284ffd403b2ca28adf917c72984a1e2251722b390f6fdc46e4cf080630647260e93b31b7018bd0e5759f6c7b7cc5b5ae5f0f2bd875e29c55b2533a82c0280e5a43abedcb81ab429e3986689fe198fe865691ed36807f8dcd9d4e10cdbb0005e4c1fbe3cd61d9753805527661a51ab3b4b54b2b5f0d0dcc9270c7d5afc13b5ea3102dea0c9999ddf14845113f79e1abc5b521881dd049db118f0a5faccf8a83e0e2dc2c1c438a8fff3d073ac7463e72eebc4053da889d3fdf2ec2c4a3e3f2559a84c45d333bfb3351bd0dd4508b80c43e41d52e6050daafe0d0adeae20f72a08d447e3d0f505d00245c78ceab083438097c6d0b8941ba49e8d413e2b3bfbaea2ab46a19de8371e6c68a8ca5a28185d41cfd365444c18dca076824522154ea11b43084f47788b25f8f37fbea4290a989d7858c1170c35cd8945b0fa32590fcc2bf813f378df5e6d6b48e85bdad17693b61da8faac5b62300017fb33048500df3219ba790fe3eb626de447270a73b8df1f5687eb86814a4c06bbe5cace0ea939ad4d1f7a678963ad0c851184cac615714af790b81ab191df839a39286ac0d144ef38e02d5255d3cc4d5c6512dc4d4de9066cae74e35ebc3ad397dac46b8d5bd7a2804f657eb22229a2771de244f5a9f63318000a140a9521f9d75e1de705112a5fb7a87db8437cb356fbf5cb682ce193d3a5a39a8b03974ddccf195c5562c8cc51d6bf503d87db3bbef4276c010e4126ad7d226d11fe739cac1a01ad83ac09719729290b80c604d9c0a788586b6c3bbed22108d25f906d6309424481cd1beda9cfe49fecfd0887e671521eab773ffdcd6f7e891b87cf17dbb18540d91320b88279e2cd3b567ba8be0b78b74ac4739e6e9bf3e29b36eaf098974f795ad9597d523a966724deac416efc08353c0a2cdf812b3c989e75d478c40aec3914167dac5706f0116cedf8360285d87588e1b62c42fe2e43867ba141ff2921241a1082d54cea0f90b5e22391ad0cebcb8c1ea07a4becf812c4e2f94ecd048303950cff4ec357a20793f919cfd15317874cb46a26db4ec97ba96a1a1860e2bc71cdece08c67da62823deddc5e72298a2abed990cc1f199f672cf4e781554b9771e053686a15339555b5338d21542563c56de04810c558973a21099bee3b945c0c7ab3ed6b964ab3c295701ed79fc613559f1174d563f0832573e47aa77e83a44602d800dd66d2613c621602ed699a21614d7f950178be822c1fad6812d64a98547da9d2713ea54c4e0aa5a2542feeb8d6e7303b59fb223d55a1d17e0ab01f63e7048a071b0f6b69df7c11c65a3703d80dee49ffe5942a720fb3f1dda8ae369f232ca245d8c4e14256802420d983d578289477630809ca683f25b8af1a44b5e7f795e179ae53ef259c4585cec4efdd2dc63576ae840d4013680840dae1482c7c8f001bf95717b238e37e73cc507ada4de275dbed21bdbe61c42b0c6dc7a993ec46f0edb7b9da4a16c39d79bd512acd7c40e667efd58751160bf401e728792fef1625977d3bb3f19915aab8fb5a88eb4df649b7cb5d2bd90313655fb0a93b14a77e176b826237315ed5de306ad699a155de1b636f091c86b3c06c60cc5daba5a2e3f437b7fa304d088b75dfb124c70578249e4a900250f3634694e48ecc90882664ec102ab97df1307e4d4f679371afead2d8b90c1d70d5a9cc767095a2e5064615037192a2ac47489c6010be95d50f34c581ebe6724d2968e405fcf04faa1c77268b4b1fb95e4ec5c144936c7ea4c404817698ad952ef91f2badb2d66261876127ccaea2799622428f0a93db586358172c8bb6aee049b8a6255bc4407d49a53fa052964e778b0fc144a02be2d5c910d13023f4fa4e3ba0243b936b6bc7f387eef6b10711f917731f58715a574fcb2a81f7fa38309a2c9b1a1eaf884f4bf412cdd0b769a168aa4e6f0cf7cc65d1496e3aa51a1a38f1289582b5b6a51312479c07462a05cd0a0c138c1a361de5586a4d1fa64b9253c47c43b3d5f6a620ad79e001592bea713286f8113aba8732ee71d7bc3337a01f0c50f0d71e8a96b6b304f1d038eace6d4d2201ca2c403e440005b72d0446b5e6eef54b3b21575ad012144dbfebd4e863d19779a8da665cef17797d76df88efb80aaa82f8a66a328f0db7b41d3dbd5dc61e03be46cc794af7de26899a821bbde95b0c8e0016deda67a4164fff6104ed7e052852129f05f6e0029b2639fb19a2a39fb8ccde46e04db8a241ddb795537b5c27a3145185d74f64d5417c12ee08cea688439d5214861d855e09b35ee44c4cb7ddecd51809ec610eef1a6a69148ac1064509479bc9e79a4c36a3537d96d0969b31d083c2eb420e58df9239445a2ef48fb331a0da8c1d01b205db1c3636bb8b7290d4ff0f7fd7df035dedac02aa857cecc9deef8140a28ed56790d932c849cbc665a99419b43e5de1c25e0307c4c9d5960a73e305a717b0d0a0de78dc8f24de69d7532f9c27a1c329494a40d2abdb389e52bfab57aef86c9951577601925725b215daea55e1b62670de03179d65e7f8982f9b7c2b01e75479454a3729e74cfad0ffeb9d8244e00d0db88b0bb66f71721709b472633153a923dd85221b19927d53bb6e280dbfc8c4de32ebafe81ee0c64ac0eb44b53ff9c64992cc46a85855e4cf157b562851e6d19f5eadc57a40f70645999f0d91ff9f70cdec8571c700b302efe25aa1341cdcaf72025214e7e79135bc8b15bfc7a2b985f355cec3c72e8cc05f394300580da31abb098ec362bc9397693b62c03512beb2904e5c88621cb25c115bb2bc426b0210a40e4d1eaee60abdf8e39cac20e87f18fad1aa9573e12955887cff237759d55e48097b8b152523ca28a42434ac43bea6f060aa9828712c84be3fe768ffe0b66893212cb4bcd3d9249c4c75e6dd6ee7b529d6207fbb2d97a2f239919189446b0c7cf8e9b60dfa8d8aa999a5fbfbe31275999206d6ac05b2e205d91744e08e000403520253e0bb17d906af992abbee786fd5f8f744f75501cc61f45b1086f81fa446fb7a0183abc353b92087cf93ef2aaf5e108fbe1e51fb50dd6057bf45d5d541c633e581392f22b313678b5c555e88363c4b20655137c5eede9daaa869e864e1bd10d4d2dc622bcaf6a3e40761de47ebf4803e24f70dcf0610e2407d2db801452b3256ae53b4d36532225757d2ae814bd236c2de8404c82df4382b574b8a8ae66e6f4d8152e18cd72da51dafbfbf77db0a9b705f41778c5540f30d12f0d6611f8b0a091ac84c69c207727e6a8076b3d37f2609ea823b405d993cf805e4a65990fc12ca41ada6d2e7773da8c7c79fb9c7f664424f326522f0d0500503786e414a2b7ce87251634fedc4b37a763fd3c8c9437bb447eef783efa736a4450d26355b7dd0f609c53babe3aa276c341a45e4197bc4d7d9491e2dac6551def3d2996204d8783ab8c0732a3a53bf643dd304bd897bc738a404b9f9e9401a19eb47dcaac9936d94210d389d8818f3d29d45584ffcb24776002ecf34608fbc0ae7d95468761e35d30fb13ce08121a4a9aca6ff3c370c3513e7f4d000160a034001b184b5cac6343d1b390fe8c0abbe3453d537c08c39a3c4dd8dce23fe99d103c2261a282430d2d34c4a7cbb57b0a1729e56742a47fe13e71a1a570656d6e7263a9e4d2924e02d54f157a31224bf7438a3ead99f6001964f2fea65ab31c4319eb6c03234edd48b8bda5ff2400afc468ebdf6fd67341818782b0a25fb99689117e6511f6c7e744efb40c2edeb29f71e818c581f82c38c4c2effc544e92d27418847f7062a971aee2b422355d182ba1baa471a007e98ec4f2",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 68,
+ "comment" : "invalid output size",
+ "flags" : [
+ "SizeTooLarge"
+ ],
+ "ikm" : "27d5dad26540e3f65798c7b74b9157fe3593a5ab618648713d7d28df3c7c9c0c",
+ "salt" : "64600a75d1efe1f475218428fe0f93cbb935e5e3023b09a75fb422f5b1ad6865e2bee1d77943583337354e507eb5bb43c532bb4072d88428d73f72d9e5f3e83d",
+ "info" : "3d9732f5268f673d",
+ "size" : 16321,
+ "okm" : "",
+ "result" : "invalid"
+ },
+ {
+ "tcId" : 69,
+ "comment" : "empty salt",
+ "flags" : [
+ "Normal",
+ "EmptySalt"
+ ],
+ "ikm" : "d2ee6859f3e52e456f4b0e19252f3ba453102fb4de685b9823a652acb2f87039",
+ "salt" : "",
+ "info" : "086e8dc0aa05538926dc74e89857232aa7d1fdc3f6ca29dddaba48dd682bcf1cfe08700e2a5a7102d01e57a93bca2668dee95339d5db6b6a2e7e5fa66667b8d5b8",
+ "size" : 80,
+ "okm" : "ee9e8055191498f009d497b5d8e5397a7b602f78bca52b52cb301a9673bbfc07caa9986b9517b70bc015aa5d5491c9231d95cb01c6c54de1f58219ecd275c1c4d9deda42331dd70bbb5d07b03c219a5c",
+ "result" : "valid"
+ }
+ ]
+ },
+ {
+ "type" : "HkdfTest",
+ "keySize" : 512,
+ "tests" : [
+ {
+ "tcId" : 70,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "9fb35c09d3efebdfe522d4875d9adac74ee7eb7b845432f1cb28a9c9a48ffe63bfea2fab94106d96eff39629cf57ef5e7c3e94fb95ff8057f0894c1f352806cd",
+ "salt" : "100d0324664c4c02443fc97e5186e38a256133e825398d387fd6138acc8b47833f660f52c960b74bfeb30c38fba4b6e426c17dbef9d45e582ef2857afba229ae",
+ "info" : "e7bd97cdac7d9e6b",
+ "size" : 64,
+ "okm" : "a50e6839375e2a7eabc5a3610a12225b4e1d6a1cc0b4f600a528cd26ef5fee12336e39c57a001620c8e4cb9414316b11f11861c314c3acef48251867a2327c9d",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 71,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "c132ac861d00e8aa82470baf3be3851c9f77f96b19cc2c3eb5558c20915ad16cb45c50db9b230c5279bf7b38fbf50ce68b60d7b230530f3a5f4016883f217168",
+ "salt" : "4c3582c867fab84ca075da5aef6b78b8db982ee4fe33fb4500294659aad63dd7677f2f256bf719c6796ea8fdf12c46863064875a529aeef9318f344335610f82",
+ "info" : "7573b95f1d8ee5d0",
+ "size" : 120,
+ "okm" : "d93663825963a4a2328a6e56ee7d108de95b7c981c3e62dc8df40105e4995137ca8cfa91cbffb447ffd80b0b901578aaabc6c56b3aa66734fbe98b95c1125990e14533e13d049f025880fb2834c8e5e2bbc8719deb3b207429397c19beb0160f46441f95f8b11ab2ead32c64c12d9f46d6aaa58f9e685771",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 72,
+ "comment" : "",
+ "flags" : [
+ "Normal"
+ ],
+ "ikm" : "908959c6b518c7cc6fdf24ee7d1c05327a1fdacd08b1d66cf7ad554cdeb724e0445a3741ca47d58f5e67a7514f4834107d710bbdb6a8c1e2d37349ffdad7dd2a",
+ "salt" : "d22c064b2b3a63abe1b4348fa38b9f5ad44167a2588a2b1af8fa862f95a11da7a5847a0db68d80815734f8260ed29a9226c678d0a60f7aa3cc39a0f9e9a02513",
+ "info" : "cefa421c2bac0569",
+ "size" : 256,
+ "okm" : "621851c73876e92e257113bcb8e8ddc810f6985910304c5b481ebd50d600a03c1f1a7720d7256aabcd74661559c629571a48cf7647acf50e800d8069814a00ab01c34725bffa515377b9bf26cc3074128e2dc0baa1d765459b92ce5851bff217895c9fa39b708743b0e6be5a80af85eea19f7861dc46e77c1dad0ec89cb7c66b42b7b6eaf7cc02d9711e70284dabbf908636ca4cee1148d094519ea8830e0c7a4bf55bb5756a556bea239f200d4faa5c2991e8e9306c65b3811ceeb881474bc84fec0a9fffa8da7733a51dda2e95c04a3d88ebc5c429b2c700e5a1bad5739f897c671d45e026595e13c3f71abbe37e79befcbe1ea18cfe3b2e33c387a8489659",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 73,
+ "comment" : "output collision for different salts",
+ "flags" : [
+ "OutputCollision",
+ "EmptySalt"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "1a4d9bb4aebb50780a57fe8e922dfbf5ba6018236b2196a0f96d704b063f739e",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 74,
+ "comment" : "output collision for different salts",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "1a4d9bb4aebb50780a57fe8e922dfbf5ba6018236b2196a0f96d704b063f739e",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 75,
+ "comment" : "a salt longer than the block size of the hash is equivalent to the hash of the salt",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "bd37d35e915d6a3431e8ab0fe1f1a3d129d9b6dfcdcb627ae7eb6d15068145cff05fa37e6bca0721e9ae696281759f6f1f6784db7c8d30c4b75342ec6d6a1cc2af",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "54b3b9a5d7f1713194b8e0621d8d33c6f2034b5005d47bbc90e5883d6af9bc42",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 76,
+ "comment" : "a salt longer than the block size of the hash is equivalent to the hash of the salt",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "3b9a27801be4b5d7ae71500e2d0cc887bd1291129859f10278de575843d914dbf11a985fd4fd3ed039117b53fce0674955e9699c22ee3d3c7db05d429201f352",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "c33219807c46e518225d0b37c02eab9032f701f79116ee1d7a4f5472b57c610c",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 77,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "1264271934b6a446",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "a2d9e9a4248a1f7f42ba1f58119012d9bfac2693d8a7a7570bee13221ede1f98",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 78,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "1264271934b6a4460000000000000000",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "a2d9e9a4248a1f7f42ba1f58119012d9bfac2693d8a7a7570bee13221ede1f98",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 79,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "1264271934b6a44600000000000000000000000000000000",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "a2d9e9a4248a1f7f42ba1f58119012d9bfac2693d8a7a7570bee13221ede1f98",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 80,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "1264271934b6a446000000000000000000000000000000000000000000000000",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "a2d9e9a4248a1f7f42ba1f58119012d9bfac2693d8a7a7570bee13221ede1f98",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 81,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "1264271934b6a4460000000000000000000000000000000000000000000000000000000000000000",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "a2d9e9a4248a1f7f42ba1f58119012d9bfac2693d8a7a7570bee13221ede1f98",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 82,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "1264271934b6a44600000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "a2d9e9a4248a1f7f42ba1f58119012d9bfac2693d8a7a7570bee13221ede1f98",
+ "result" : "valid"
+ },
+ {
+ "tcId" : 83,
+ "comment" : "a salt shorter than the block size is padded with zeros.",
+ "flags" : [
+ "OutputCollision"
+ ],
+ "ikm" : "ddba77f227f237c791c07ee7e1ce9d933ecad3614212cc98d4f12afc90a3b21f4c7c3b4c54f44ad7d1e8ce45cd36aad5cb0bbf84e90cb054a1e7dc558690c5fa",
+ "salt" : "1264271934b6a446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "info" : "6b478027231379b6bbed6c61732aad5636b5aab2",
+ "size" : 32,
+ "okm" : "a2d9e9a4248a1f7f42ba1f58119012d9bfac2693d8a7a7570bee13221ede1f98",
+ "result" : "valid"
+ }
+ ]
+ }
+ ]
+}
diff --git a/ppad-hkdf.cabal b/ppad-hkdf.cabal
@@ -34,12 +34,14 @@ test-suite hkdf-tests
default-language: Haskell2010
hs-source-dirs: test
main-is: Main.hs
+ other-modules:
+ Wycheproof
ghc-options:
-rtsopts -Wall -O2
build-depends:
- attoparsec
+ aeson
, base
, base16-bytestring
, bytestring
@@ -48,6 +50,7 @@ test-suite hkdf-tests
, ppad-sha512
, tasty
, tasty-hunit
+ , text
benchmark hkdf-bench
type: exitcode-stdio-1.0
diff --git a/test/Main.hs b/test/Main.hs
@@ -1,5 +1,68 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
module Main where
+import Control.Exception
+import qualified Crypto.Hash.SHA256 as SHA256
+import qualified Crypto.Hash.SHA512 as SHA512
+import qualified Crypto.KDF.HMAC as H
+import qualified Data.ByteString as BS
+import qualified Data.Aeson as A
+import qualified Data.Text.IO as TIO
+import Test.Tasty
+import Test.Tasty.HUnit
+import qualified Wycheproof as W
+
main :: IO ()
-main = pure ()
+main = do
+ wycheproof_sha256 <- TIO.readFile "etc/hkdf_sha256_test.json"
+ wycheproof_sha512 <- TIO.readFile "etc/hkdf_sha512_test.json"
+ let wycheproofs = do
+ a <- A.decodeStrictText wycheproof_sha256 :: Maybe W.Wycheproof
+ b <- A.decodeStrictText wycheproof_sha512 :: Maybe W.Wycheproof
+ pure (a, b)
+ case wycheproofs of
+ Nothing -> error "couldn't parse wycheproof vectors"
+ Just (w256, w512) -> defaultMain $ testGroup "ppad-hkdf" [
+ wycheproof_tests SHA256 w256
+ , wycheproof_tests SHA512 w512
+ ]
+
+data Hash = SHA256 | SHA512
+ deriving Show
+
+wycheproof_tests :: Hash -> W.Wycheproof -> TestTree
+wycheproof_tests h W.Wycheproof {..} =
+ testGroup ("wycheproof vectors (hkdf, " <> show h <> ")") $
+ fmap (execute_group h) wp_testGroups
+
+execute_group :: Hash -> W.HkdfTestGroup -> TestTree
+execute_group h W.HkdfTestGroup {..} =
+ testGroup msg (fmap (execute h) htg_tests)
+ where
+ msg = "keysize " <> show htg_keySize
+
+execute :: Hash -> W.HkdfTest -> TestTree
+execute h W.HkdfTest {..} = testCase t_msg $ do
+ let ikm = ht_ikm
+ sal = ht_salt
+ inf = ht_info
+ siz = ht_size
+ pec = ht_okm
+ if ht_result == "invalid"
+ then do
+ out <- try (pure $! H.hkdf hmac sal inf siz ikm)
+ :: IO (Either ErrorCall BS.ByteString)
+ case out of
+ Left _ -> assertBool "invalid" True
+ Right o -> assertBool "invalid" (pec /= o)
+ else do
+ let out = H.hkdf hmac sal inf siz ikm
+ assertEqual mempty pec out
+ where
+ hmac = case h of
+ SHA256 -> SHA256.hmac
+ SHA512 -> SHA512.hmac
+ t_msg = "test " <> show ht_tcId -- XX embellish
+
diff --git a/test/Wycheproof.hs b/test/Wycheproof.hs
@@ -0,0 +1,64 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Wycheproof (
+ Wycheproof(..)
+ , HkdfTestGroup(..)
+ , HkdfTest(..)
+ ) where
+
+import Data.Aeson ((.:))
+import qualified Data.Aeson as A
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Base16 as B16
+import qualified Data.Text as T
+import qualified Data.Text.Encoding as TE
+import Data.Word (Word64)
+
+data Wycheproof = Wycheproof {
+ wp_numberOfTests :: !Int
+ , wp_testGroups :: ![HkdfTestGroup]
+ } deriving Show
+
+instance A.FromJSON Wycheproof where
+ parseJSON = A.withObject "Wycheproof" $ \m -> Wycheproof
+ <$> m .: "numberOfTests"
+ <*> m .: "testGroups"
+
+data HkdfTestGroup = HkdfTestGroup {
+ htg_keySize :: !Int
+ , htg_type :: !T.Text
+ , htg_tests :: ![HkdfTest]
+ } deriving Show
+
+instance A.FromJSON HkdfTestGroup where
+ parseJSON = A.withObject "HkdfTestGroup" $ \m -> HkdfTestGroup
+ <$> m .: "keySize"
+ <*> m .: "type"
+ <*> m .: "tests"
+
+data HkdfTest = HkdfTest {
+ ht_tcId :: !Int
+ , ht_comment :: !T.Text
+ , ht_ikm :: !BS.ByteString
+ , ht_salt :: !BS.ByteString
+ , ht_info :: !BS.ByteString
+ , ht_size :: !Word64
+ , ht_okm :: !BS.ByteString
+ , ht_result :: !T.Text
+ } deriving Show
+
+decodehex :: T.Text -> BS.ByteString
+decodehex = B16.decodeLenient . TE.encodeUtf8
+
+instance A.FromJSON HkdfTest where
+ parseJSON = A.withObject "HkdfTest" $ \m -> HkdfTest
+ <$> m .: "tcId"
+ <*> m .: "comment"
+ <*> fmap decodehex (m .: "ikm")
+ <*> fmap decodehex (m .: "salt")
+ <*> fmap decodehex (m .: "info")
+ <*> m .: "size"
+ <*> fmap decodehex (m .: "okm")
+ <*> m .: "result"
+
+