]> git.codecow.com Git - Monocypher.git/commitdiff
Integrated Wicherproof Ed25519 test vectors
authorLoup Vaillant <loup@loup-vaillant.fr>
Sat, 30 Jun 2018 18:23:55 +0000 (20:23 +0200)
committerLoup Vaillant <loup@loup-vaillant.fr>
Sat, 30 Jun 2018 18:23:55 +0000 (20:23 +0200)
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

tests/gen/makefile
tests/test.c
tests/vectors/ed_25519_check [new file with mode: 0644]

index 07a322cf942bb70f6eeb61742d692b2ea67bfdac..57fa8ee81101e33e25ec16f9b7223cdede95ea44 100644 (file)
@@ -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 $^ > $@
index 7bb5769b997949cc2aab79ce4b05a0a17d0fc22f..1b64a541276a2dd611a5635b887c339b143d8a09 100644 (file)
@@ -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 (file)
index 0000000..d5f9ffe
--- /dev/null
@@ -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: