From: Loup Vaillant Date: Sat, 30 Jun 2018 18:23:55 +0000 (+0200) Subject: Integrated Wicherproof Ed25519 test vectors X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=5fe8cacbc84d66a75d054117dc375190d140ce53;p=Monocypher.git Integrated Wicherproof Ed25519 test vectors Those test vectors assume SHA-512, and thus are only activated with the -DED25519_SHA512 compilation option. Note the omission of malleability test vectors. Monocypher will happily accept signatures even when S is not in canonical form. This is contrary to RFC 8032, which requires implementations to check that S is lower than L. I believe RFC 8032 is wrong. Non-malleability means that someone who only knows the public key, message, and signature, cannot produce another valid signature. It does *not* mean there is only one valid signature. In fact, when we know the private key, we can produce a virtually unlimited number of different, valid, canonical signatures. Like ECDSA, EdDSA uses a nonce. Unlike ECDSA, that nonce doesn't come from a random source, it comes from a hash of the message itself. This determinism prevents nonce reuse, among other problems. However, nothing prevents someone to bypass this rule, and use a random nonce instead. This will naturally produce a different, yet valid, signature. EdDSA signatures are not unique. The difference between this and malleability is subtle enough that advertising non-malleability will lead users to believe in uniqueness, and bake that faulty assumption in their designs, which will then be insecure. Fixes #99 --- diff --git a/tests/gen/makefile b/tests/gen/makefile index 07a322c..57fa8ee 100644 --- a/tests/gen/makefile +++ b/tests/gen/makefile @@ -3,9 +3,9 @@ CFLAGS = -pedantic -Wall -Wextra .PHONY: all clean -VEC = chacha20.vec xchacha20.vec aead_ietf.vec poly1305.vec \ - blake2b.vec sha512.vec argon2i.vec \ - edDSA.vec edDSA_pk.vec ed_25519.vec \ +VEC = chacha20.vec xchacha20.vec aead_ietf.vec poly1305.vec \ + blake2b.vec sha512.vec argon2i.vec \ + edDSA.vec edDSA_pk.vec ed_25519.vec ed_25519_check.vec \ x25519.vec x25519_pk.vec VEC2 = $(patsubst %.vec, %.all.vec, $(VEC)) key_exchange.all.vec HEADERS = $(patsubst %.all.vec, %.h.vec, $(VEC2)) @@ -44,19 +44,20 @@ ed25519.o: ../ed25519-donna/ed25519.c $(wildcard ../ed25519-donna/*.h) vector_to_header.out: ../vector_to_header.c $(CC) $(CFLAGS) $< -o $@ -chacha20.all.vec : chacha20.vec ../vectors/chacha20 -poly1305.all.vec : poly1305.vec ../vectors/poly1305 -x25519.all.vec : x25519.vec ../vectors/x25519 -x25519_pk.all.vec : x25519_pk.vec -xchacha20.all.vec : xchacha20.vec -aead_ietf.all.vec : aead_ietf.vec -blake2b.all.vec : blake2b.vec -sha512.all.vec : sha512.vec -argon2i.all.vec : argon2i.vec ../vectors/argon2i -edDSA.all.vec : edDSA.vec -edDSA_pk.all.vec : edDSA_pk.vec -ed_25519.all.vec : ed_25519.vec -key_exchange.all.vec: ../vectors/key_exchange +chacha20.all.vec : chacha20.vec ../vectors/chacha20 +poly1305.all.vec : poly1305.vec ../vectors/poly1305 +x25519.all.vec : x25519.vec ../vectors/x25519 +x25519_pk.all.vec : x25519_pk.vec +xchacha20.all.vec : xchacha20.vec +aead_ietf.all.vec : aead_ietf.vec +blake2b.all.vec : blake2b.vec +sha512.all.vec : sha512.vec +argon2i.all.vec : argon2i.vec ../vectors/argon2i +edDSA.all.vec : edDSA.vec +edDSA_pk.all.vec : edDSA_pk.vec +ed_25519.all.vec : ed_25519.vec +ed_25519_check.all.vec: ../vectors/ed_25519_check +key_exchange.all.vec : ../vectors/key_exchange $(VEC2): mkdir -p $(@D) cat $^ > $@ diff --git a/tests/test.c b/tests/test.c index 7bb5769..1b64a54 100644 --- a/tests/test.c +++ b/tests/test.c @@ -219,6 +219,19 @@ static void edDSA_pk(const vector in[], vector *out) #ifdef ED25519_SHA512 static void (*ed_25519)(const vector[], vector*) = edDSA; + +static void ed_25519_check(const vector in[], vector *out) +{ + const vector *public_k = in; + const vector *msg = in + 1; + const vector *sig = in + 2; + int corrupt = crypto_check(sig->buf, public_k->buf, msg->buf, msg->size); + out->buf[0] = corrupt; + print_vector(sig->buf , sig->size); + print_vector(public_k->buf, public_k->size); + print_vector(msg->buf , msg->size); + printf(corrupt ? "!\n" : ".\n"); +} #endif static void iterate_x25519(u8 k[32], u8 u[32]) @@ -819,21 +832,22 @@ int main(void) int status = 0; printf("\nTest against vectors"); printf("\n--------------------\n"); - status |= TEST(chacha20 , 4); - status |= TEST(xchacha20 , 4); - status |= TEST(poly1305 , 2); - status |= TEST(aead_ietf , 4); - status |= TEST(blake2b , 2); - status |= TEST(sha512 , 1); - status |= TEST(argon2i , 6); - status |= TEST(x25519 , 2); - status |= TEST(x25519_pk , 1); - status |= TEST(key_exchange, 2); + status |= TEST(chacha20 , 4); + status |= TEST(xchacha20 , 4); + status |= TEST(poly1305 , 2); + status |= TEST(aead_ietf , 4); + status |= TEST(blake2b , 2); + status |= TEST(sha512 , 1); + status |= TEST(argon2i , 6); + status |= TEST(x25519 , 2); + status |= TEST(x25519_pk , 1); + status |= TEST(key_exchange , 2); #ifdef ED25519_SHA512 - status |= TEST(ed_25519 , 3); + status |= TEST(ed_25519 , 3); + status |= TEST(ed_25519_check, 3); #else - status |= TEST(edDSA , 3); - status |= TEST(edDSA_pk , 1); + status |= TEST(edDSA , 3); + status |= TEST(edDSA_pk , 1); #endif status |= test_x25519(); diff --git a/tests/vectors/ed_25519_check b/tests/vectors/ed_25519_check new file mode 100644 index 0000000..d5f9ffe --- /dev/null +++ b/tests/vectors/ed_25519_check @@ -0,0 +1,464 @@ +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +: +d4fbdb52bfa726b44d1786a8c0d171c3e62ca83c9e5bbe63de0bb2483f8fd6cc1429ab72cafc41ab56af02ff8fcc43b99bfe4c7ae940f60f38ebaa9d311c4007: +00: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +78: +d80737358ede548acb173ef7e0399f83392fe8125b2ce877de7975d8b726ef5b1e76632280ee38afad12125ea44b961bf92f1178c9fa819d020869975bcbe109: +00: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +54657374: +7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d: +00: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +48656c6c6f: +1c1ad976cbaae3b31dee07971cf92c928ce2091a85f5899f5e11ecec90fc9f8e93df18c5037ec9b29c07195ad284e63d548cd0a6fe358cc775bd6c1608d2c905: +00: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bf0cf5b3a289976458a1be6277a5055545253b45b07dcc1abd96c8b989c00f301: +00: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +000000000000000000000000: +d46543bfb892f84ec124dcdfc847034c19363bf3fc2fa89b1267833a14856e52e60736918783f950b6f1dd8d40dc343247cd43ce054c2d68ef974f7ed0f3c60f: +00: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161: +879350045543bc14ed2c08939b68c30d22251d83e018cacbaf0c9d7a48db577e80bdf76ce99e5926762bc13b7b3483260a5ef63d07e34b58eb9c14621ac92f00: +00: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60: +7bdc3f9919a05f1d5db4a3ada896094f6871c1f37afc75db82ec3147d84d6f237b7e5ecc26b59cfea0c7eaf1052dc427b0f724615be9c3d3e01356c65b9b5109: +00: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +ffffffffffffffffffffffffffffffff: +5dbd7360e55aa38e855d6ad48c34bd35b7871628508906861a7c4776765ed7d1e13d910faabd689ec8618b78295c8ab8f0e19c8b4b43eb8685778499e943ae04: +00: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +0000000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +0000000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +0000000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +01000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +0100000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +0100000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +0100000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100100000000000000000000000000000000000000000000000000000000000000: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0100000000000000000000000000000000000000000000000000000000000000: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +3f: +edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +54657374: +007c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b3: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +54657374: +7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0007a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b3: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +647c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b1d125e5538f38afbcc1c84e489521083041d24bc6240767029da063271a1ff0c: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +677c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bc108ca4b87a49c9ed2cf383aecad8f54a962b2899da891e12004d7993a627e01: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +617c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b9ce23fc6213ed5b87912e9bbf92f5e2c780eae26d15c50a112d1e97d2ea33c06: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +e57c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bbb3eb51cd98dddb235a5f46f2bded6af184a58d09cce928bda43f41d69118a03: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657d1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcd237dda9a116501f67a5705a854b9adc304f34720803a91b324f2c13e0f5a09: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1592402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b6b167bbdc0d881cc04d28905552c1876f3709851abc5007376940cc8a435c300: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1412402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7fd2ac7da14afffcceeb13f2a0d6b887941cb1a5eb57a52f3cb131a16cce7b0e: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492412ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7373ba13ebbef99cd2a8ead55ce735c987d85a35320925a8e871702dc7c5c40d: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab54e03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bd35bd331c03f0855504ca1cab87b83c36a028425a3cf007ede4f4254c261cb00: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce02e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcb35101f73cf467deac8c1a03b6c3dc35af544132734b7e57ab20c89b2e4750d: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce03e2c3a7f2384d051b9cf3570f1207fc78c1bcc98c281c2bb58d2e8878290bff8d3355fdd4ea381924ee578752354eb6dee678ab4011c301: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce03e2c3a7f0384d851b9cf3570f1207fc78c1bcc98c281c2bb978c866187ffb1cc7b29a0b4045aefc08768df65717194ff0c6e63f4dea0d02: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281d2b0576ecf8eaf675f00f3dfbe19f75b83b7607a6c96414f6821af920a2498d0305: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c289c2be5241a345c7b5428054c74b7c382fa10d4a5f1e8f8b79a71d3fdea2254f1ff0e: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2a63950c85cd6dc96364e768de50ff7732b538f8a0b1615d799190ab600849230e: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c0b543bd3da0a56a8c9c152f59c9fec12f31fa66434d48b817b30d90cb4efa8b501: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c6b8da07efd07a6dafb015ed6a32fe136319a972ffbc341f3a0beae97ccf8136505: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281cab227aedf259f910f0f3a759a335062665217925d019173b88917eae294f75d40f: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +0000000000000000000000000000000000000000000000000000000000000000e0b8e7770d51c7a36375d006c5bffd6af43ff54aaf47e4330dc118c71d61ec02: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff463a1908382e7eb7693acef9884f7cf931a215e0791876be22c631a59881fd0e: +ff: + +7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa: +313233343030: +9a83eb6dbfd54a31fc1d3c580fc7b2fae4630ca8f0edf803873e433673d7e3d40e94254586cb6188c5386c3febed477cb9a6cb29e3979adc4cb27cf5278fb70a: +ff: + +a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c: +: +5056325d2ab440bf30bbf0f7173199aa8b4e6fbc091cf3eb6bc6cf87cd73d992ffc216c85e4ab5b8a0bbc7e9a6e9f8d33b7f6e5ac0ffdc22d9fcaf784af84302: +00: + +a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c: +78: +481fafbf4364d7b682475282f517a3ac0538c9a6b6a562e99a3d8e5afb4f90a559b056b9f07af023905753b02d95eb329a35c77f154b79abbcd291615ce42f02: +00: + +a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c: +54657374: +8a9bb4c465a3863abc9fd0dd35d80bb28f7d33d37d74679802d63f82b20da114b8d765a1206b3e9ad7cf2b2d8d778bb8651f1fa992db293c0039eacb6161480f: +00: + +a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c: +48656c6c6f: +d839c20abfda1fd429531831c64f813f84b913e9928540310cf060b44c3dbf9457d44a7721fdc0d67724ff81cb450dd39b10cfb65db15dda4b8bf09d26bd3801: +00: + +a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c: +313233343030: +9bbb1052dcfa8ad2715c2eb716ae4f1902dea353d42ee09fd4c0b4fcb8b52b5219e2200016e1199d0061891c263e31b0bc3b55673c19610c4e0fa5408004160b: +00: + +a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c: +000000000000000000000000: +f63b5c0667c7897fc283296416f7f60e84bbde9cbd832e56be463ed9f568069702b17a2f7c341ebf590706a6388ac76ac613c1675ec0f2c7118f2573422a500b: +00: + +a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c: +6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161: +1bc44d7001e6b5b9090fef34b2ca480f9786bbefa7d279353e5881e8dfb91b803ccd46500e270ef0109bfd741037558832120bc2a4f20fbe7b5fb3c3aaf23e08: +00: + +a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c: +202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60: +ea8e22143b02372e76e99aece3ed36aec529768a27e2bb49bdc135d44378061e1f62d1ac518f33ebf37b2ee8cc6dde68a4bd7d4a2f4d6cb77f015f71ca9fc30d: +00: + +a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c: +ffffffffffffffffffffffffffffffff: +8acd679e1a914fc45d5fa83d3021f0509c805c8d271df54e52f43cfbd00cb6222bf81d58fe1de2de378df67ee9f453786626961fe50a9b05f12b6f0899ebdd0a: +00: + +d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a: +: +e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b: +00: + +3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c: +72: +92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00: +00: + +fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025: +af82: +6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a: +00: + +278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e: +08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0: +0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03: +00: + +8fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a: +b0729a713593a92e46b56eaa66b9e435f7a09a8e7de03b078f6f282285276635f301e7aaafe42187c45d6f5b13f9f16b11195cc125c05b90d24dfe4c: +7db17557ac470c0eda4eedaabce99197ab62565653cf911f632ee8be0e5ffcfc88fb94276b42e0798fd3aa2f0318be7fc6a29fae75f70c3dcdc414a0ad866601: +00: + +2a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082: +a8546e50ba31cae3234310d32672447be213fad91a227a19669c53d309b959782b0e6b71f8791fdb470043b58122003157d2d96a43a6cbd7d3a8d86bf4c97391883e268d50af80e1e6e12939c2bd50ca746cdadfad4edf1bda875299740724148efb1ebe73fb60088cda890317658627a5f7ab5a0c075d9d8f3f97b6492b35519e50ff6b38377432a7081f9176bb1c29a862deac1336ca20b097a47829cec10a6a7cec178eda2d12f6dc6c87f910454af0123555ba184e68804d9cced60fd5c8c90943e56599c8f0ba59a38491ba5e5a53460682474c07e40ca142983314fd762856bb1093f359da6eb0a756bd93a3160c10dd8feea6b97e7c6a17cb54bd5d7649c05c66d7bdee056671dfdaf689fa3945bb8e29a429f4bd5d355dce9687b06f01d5e33e3999f0e8: +67d84d4c3945aaf06e06d524be63acbfb5dbb1988c4aea96a5ee9f7a9b9eecc29df4f66b8aa1d9e8607a58fb1ef0c2ad69aac005b4f58e34103344a9c8871a09: +00: + +2a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082: +b477b0480bb84642608b908d29a51cf2fce63f24ee95: +28fafbb62b4d688fa79e1ac92851f46e319b161f801d4dc09acc21fdd6780a2c4292b8c1003c61c2bcebe7f3f88ccc4bb26d407387c5f27cb8c94cf6ce810405: +00: + +c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051: +cd2212eddb0706f62c995cef958634f0cb7793444cbf4d30e81c27c41ebea6cb02607510131f9c015692dfd521b148841e9a2d3564d20ac401f6cb8e40f520fe0cafbeaa88840b83013369d879f013463fe52a13267aa0c8c59c45cde9399cd1e6be8cc64cf48315ac2eb31a1c567a4fb7d601746d1f63b5ac020712adbbe07519bded6f: +24087d47f3e20af51b9668ae0a88ce76586802d0ec75d8c0f28fc30962b5e1d1a1d509571a1624ed125a8df92a6e963728d6b5de99200b8e285f70feb6f05207: +00: + +c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051: +27d465bc632743522aefa23c: +c2656951e2a0285585a51ff0eda7e9a23c2dfd2ffa273aee7808f4604e8f9a8c8ea49e9fce4eb2d8d75d36b7238fe6fc13b6c5d9427dd58f8c6615d033c0bd0f: +00: + +32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e: +ec5c7cb078: +d920d421a5956b69bfe1ba834c025e2babb6c7a6d78c97de1d9bb1116dfdd1185147b2887e34e15578172e150774275ea2aad9e02106f7e8ca1caa669a066f0c: +00: + +32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e: +4668c6a76f0e482190a7175b9f3806a5fe4314a004fa69f988373f7a: +4f62daf7f7c162038552ad7d306e195baa37ecf6ca7604142679d7d1128e1f8af52e4cb3545748c44ef1ff1c64e877e4f4d248259b7f6eb56e3ef72097dc8e0c: +00: + +32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e: +5dc9bb87eb11621a93f92abe53515697d2611b2eef73: +deecafb6f2ede73fec91a6f10e45b9c1c61c4b9bfbe6b6147e2de0b1df6938971f7896c3ab83851fb5d9e537037bff0fca0ccb4a3cc38f056f91f7d7a0557e08: +00: + +32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e: +7dcfe60f881e1285676f35b68a1b2dbcdd7be6f719a288ababc28d36e3a42ac3010a1ca54b32760e74: +7f8663cf98cbd39d5ff553f00bcf3d0d520605794f8866ce75714d77cc51e66c91818b657d7b0dae430a68353506edc4a714c345f5ddb5c8b958ba3d035f7a01: +00: + +32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e: +58e456064dff471109def4ca27fa8310a1df32739655b624f27e6418d34b7f007173f3faa5: +6aab49e5c0bc309b783378ee03ffda282f0185cdf94c847701ff307a6ee8d0865411c44e0a8206f6a5f606107451940c2593af790ce1860f4c14ab25b2deae08: +00: + +32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e: +a1: +1a74ed2cbdc7d8f3827014e8e6ecf8fd2698ac8f86833acccdd400df710fe0d6b0543c9cfa00d52bf024ab7ce0d91981944097233ec134d5c7abbd44bfd32d0d: +00: + +32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e: +11cb1eafa4c42a8402c4193c4696f7b2e6d4585e4b42dcf1a8b67a80b2da80bc9d4b649fb2f35eaf1f56c426fd0b: +14ceb2eaf4688d995d482f44852d71ad878cd7c77b41e60b0065fd01a59b054ee74759224187dbde9e59a763a70277c960892ef89fba997aba2576b2c54ba608: +00: + +32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e: +aa365b442d12b7f3c925: +83c40ce13d483cc58ff65844875862d93df4bd367af77efa469ec06a8ed9e6d7905a04879535708ddf225567a815c9b941d405c98e918fd0c151165cea7fb101: +00: + +32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e: +475f: +71a4a06a34075f2fd47bc3abf4714d46db7e97b08cb6180d3f1539ac50b18ce51f8af8ae95ed21d4fa0daab7235925631ecea1fd9d0d8a2ba7a7583fd04b900c: +00: + +c29ec1894e06d27b4e40486b4fa5063d66a746c7f9c323b12203c03b72b8b78a: +0f325ffd87e58131ffa23c05ea4579513b287fdba87b44: +6669acf94667c5b541afe5307bde9476b13ae7e0e6058a772101ac8eb0a94331428eb4db0a2c68a9b6c1763b8624dab259b0876cdcfaeacc17b21a18e3fc010a: +00: + +c29ec1894e06d27b4e40486b4fa5063d66a746c7f9c323b12203c03b72b8b78a: +5ffa: +931e5152fcef078c22cc5d6a3a65f06e396289f6f5f2d1efa6340254a53526ef5dc6874eeddf35c3f50991c53cd02bf06313e37d93ee1f7022128ffa3b8f300b: +00: + +cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10: +ec5c7cb078: +30490c28f806298225df62103521dcee047153912c33ab8ab8bbdd1ffabd70fd4fdb360f05be535b067d1cf4e78c2cb432206bf280aab3bd21aaa1cb894c5b06: +00: + +cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10: +67484059b2490b1a0a4f8dee77979e26: +4cd4f77ed473a6647387f3163541c67a1708a3c3bd1673247cb87f0cb68b3c56f04bfa72970c8a483efe659c87009ab4020b590b6641316b3deddb5450544e02: +00: + +cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10: +a020a4381dc9141f47ee508871ab7a8b5a3648727c4281ae9932376f23a8e1bcda0626b7129197d864178631ec89c4332dbb18: +1e41a24fe732bd7cab14c2a2f5134ee8c87fcbd2e987e60957ed9239e5c32404d56977e1b4282871896cb10625a1937468e4dc266e16a9c1b8e9891177eca802: +00: + +cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10: +a25176b3afea318b2ec11ddacb10caf7179c0b3f8eabbfa2895581138d3c1e0e: +2a833aadecd9f28235cb5896bf3781521dc71f28af2e91dbe1735a61dce3e31ac15ca24b3fc47817a59d386bbbb2ce60a6adc0a2703bb2bdea8f70f91051f706: +00: + +cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10: +a9e6d94870a67a9fe1cf13b1e6f9150cdd407bf6480ec841ea586ae3935e9787163cf419c1: +c97e3190f83bae7729ba473ad46b420b8aad735f0808ea42c0f898ccfe6addd4fd9d9fa3355d5e67ee21ab7e1f805cd07f1fce980e307f4d7ad36cc924eef00c: +00: + +529919c9c780985a841c42ba6c180ff2d67a276ccfbe281080e47ab71a758f56: +e1cbf2d86827825613fb7a85811d: +01abfa4d6bbc726b196928ec84fd03f0c953a4fa2b228249562ff1442a4f63a7150b064f3712b51c2af768d2c2711a71aabf8d186833e941a0301b82f0502905: +00: + +529919c9c780985a841c42ba6c180ff2d67a276ccfbe281080e47ab71a758f56: +25: +e4ae21f7a8f4b3b325c161a8c6e53e2edd7005b9c2f8a2e3b0ac4ba94aa80be6f2ee22ac8d4a96b9a3eb73a825e7bb5aff4a3393bf5b4a38119e9c9b1b041106: +00: + +2252b3d57c74cbf8bc460dc2e082847926bc022f09ab6ae95756362bfd1167c1: +975ef941710071a9e1e6325a0c860becd7c695b5117c3107b686e330e5: +af0fd9dda7e03e12313410d8d8844ebb6fe6b7f65141f22d7bcba5695a25414a9e54326fb44d59fb14707899a8aae70857b23d4080d7ab2c396ef3a36d45ce02: +00: + +2252b3d57c74cbf8bc460dc2e082847926bc022f09ab6ae95756362bfd1167c1: +80fdd6218f29c8c8f6bd820945f9b0854e3a8824: +e097e0bd0370bff5bde359175a11b728ee9639095d5df8eda496395565616edfe079977f7d4dc8c75d6113a83d6a55e6e1676408c0967a2906339b43337dcb01: +00: + +c0a773110f975de3732355bb7ec7f0c41c091c0252966070205516693b992a4a: +: +0280427e713378f49d478df6373c6cac847b622b567daa2376c839e7ac10e22c380ab0fa8617c9dcfe76c4d9db5459b21dc1413726e46cc8f387d359e344f407: +00: + +54cda623245759ad6d43e620a606908befc633d60792bc7798447a0ef38e7311: +27e792b28b2f1702: +14d9b497c19b91d43481c55bb6f5056de252d9ecb637575c807e58e9b4c5eac8b284089d97e2192dc242014363208e2c9a3435edf8928fb1d893553e9be4c703: +00: + +2362bac514d5fad33802642e979a1e82de6eb6f1bcbf6a5b304f2bb02b9e57fe: +eef3bb0f617c17d0420c115c21c28e3762edc7b7fb048529b84a9c2bc6: +242ddb3a5d938d07af690b1b0ef0fa75842c5f9549bf39c8750f75614c712e7cbaf2e37cc0799db38b858d41aec5b9dd2fca6a3c8e082c10408e2cf3932b9d08: +00: