symm/poly1305.c, etc.: Convert the Monte-Carlo tests to incremental form.
authorMark Wooding <mdw@distorted.org.uk>
Tue, 29 Oct 2019 23:41:37 +0000 (23:41 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 9 May 2020 19:57:33 +0000 (20:57 +0100)
Similarly to the way 1e4c26653e52aa4c4b06e345617135a6ff271ab5 modified
the X25519 and X448 tests, arrange that each Monte-Carlo test vector
continues from where the previous one left off.  This is considerably
trickier to pull off because there's so much more state to maintain in
these tests, and changes to the processing code was necessary to make it
work.

Again, as in 1e4c2665..., move the very slow high-iteration-count tests
into a separate file, and arrange for it to be distributed.

Note that the outputs are unchanged by all of this.

symm/Makefile.am
symm/poly1305.c
symm/t/poly1305
symm/t/poly1305.slow [new file with mode: 0644]

index 48e5a22..e87d741 100644 (file)
@@ -593,7 +593,7 @@ pkginclude_HEADERS  += poly1305.h
 libsymm_la_SOURCES     += poly1305.c
 TESTS                  += poly1305.t$(EXEEXT)
 TESTS                  += poly1305-p11.t$(EXEEXT)
-EXTRA_DIST             += t/poly1305
+EXTRA_DIST             += t/poly1305 t/poly1305.slow
 
 check_PROGRAMS         += poly1305-p11.t
 poly1305_p11_t_SOURCES  = poly1305.c
index df38939..d59615e 100644 (file)
@@ -956,7 +956,7 @@ static int vrf_cat(dstr v[])
 static int vrf_mct(dstr v[])
 {
   unsigned j, msz;
-  unsigned long i, niter;
+  unsigned long i, start_iter, end_iter;
   rijndael_ecbctx rij;
   poly1305_key key;
   poly1305_ctx mac;
@@ -972,18 +972,22 @@ static int vrf_mct(dstr v[])
   DENSURE(&dm, MSZMAX); m = (octet *)dm.buf; dm.len = MSZMAX;
   memset(m, 0, MSZMAX);
 
-  if (v[0].len != 16) { fprintf(stderr, "AES key len\n"); exit(2); }
-  if (v[1].len != 16) { fprintf(stderr, "poly key len\n"); exit(2); }
-  if (v[2].len != 16) { fprintf(stderr, "nonce len\n"); exit(2); }
-  if (v[4].len != 16) { fprintf(stderr, "result len\n"); exit(2); }
+  if (v[0].len != 16)     { fprintf(stderr, "AES key len\n"); exit(2); }
+  if (v[1].len != 16)     { fprintf(stderr, "poly key len\n"); exit(2); }
+  if (v[2].len != 16)     { fprintf(stderr, "nonce len\n"); exit(2); }
+  if (v[3].len != MSZMAX) { fprintf(stderr, "msgbuf len\n"); exit(2); }
+  if (v[6].len != 16)     { fprintf(stderr, "result len\n"); exit(2); }
   memcpy(k, v[0].buf, 16);
   memcpy(r, v[1].buf, 16);
   memcpy(n, v[2].buf, 16);
-  niter = *(unsigned long *)v[3].buf;
+  memcpy(m, v[3].buf, MSZMAX);
+  start_iter = *(unsigned long *)v[4].buf;
+  end_iter = *(unsigned long *)v[5].buf;
+  if (end_iter < start_iter) { fprintf(stderr, "iter bounds\n"); exit(2); }
 
   rijndael_ecbinit(&rij, k, 16, 0);
   poly1305_keyinit(&key, r, 16);
-  for (i = 0; i < niter; i++) {
+  for (i = start_iter; i < end_iter; i++) {
     msz = 0;
     for (;;) {
       rijndael_ecbencrypt(&rij, n, s, 16);
@@ -1005,14 +1009,20 @@ static int vrf_mct(dstr v[])
     }
   }
 
-  if (MEMCMP(t, !=, v[4].buf, 16)) {
+  if (MEMCMP(t, !=, v[6].buf, 16)) {
     ok = 0;
     fprintf(stderr, "failed...");
     fprintf(stderr, "\n\tinitial k = "); type_hex.dump(&v[0], stderr);
     fprintf(stderr, "\n\tinitial r = "); type_hex.dump(&v[1], stderr);
     fprintf(stderr, "\n\tinitial n = "); type_hex.dump(&v[2], stderr);
-    fprintf(stderr, "\n\titerations = %lu", niter);
-    fprintf(stderr, "\n\texpected = "); type_hex.dump(&v[4], stderr);
+    fprintf(stderr, "\n\tinitial m = "); type_hex.dump(&v[3], stderr);
+    fprintf(stderr, "\n\tstart iter = %lu", start_iter);
+    fprintf(stderr, "\n\tend iter = %lu", end_iter);
+    fprintf(stderr, "\n\tfinal k = "); type_hex.dump(&dk, stderr);
+    fprintf(stderr, "\n\tfinal r = "); type_hex.dump(&dr, stderr);
+    fprintf(stderr, "\n\tfinal n = "); type_hex.dump(&dn, stderr);
+    fprintf(stderr, "\n\tfinal m = "); type_hex.dump(&dm, stderr);
+    fprintf(stderr, "\n\texpected = "); type_hex.dump(&v[6], stderr);
     fprintf(stderr, "\n\tcalculated = "); type_hex.dump(&dt, stderr);
     fputc('\n', stderr);
   }
@@ -1031,7 +1041,8 @@ static const struct test_chunk tests[] = {
   { "poly1305-cat", vrf_cat,
     { &type_hex, &type_hex, &type_hex, &type_hex, &type_hex, &type_hex } },
   { "poly1305-mct", vrf_mct,
-    { &type_hex, &type_hex, &type_hex, &type_ulong, &type_hex } },
+    { &type_hex, &type_hex, &type_hex, &type_hex,
+      &type_ulong, &type_ulong, &type_hex } },
   { 0, 0, { 0 } }
 };
 
index 46eb336..4d23ac6 100644 (file)
@@ -1,3 +1,5 @@
+### Poly1305 tests.
+
 poly1305-hash {
   ## The tests from Daniel J. Bernstein, `The Poly1305-AES message-
   ## authentication code', 2005-03-29, Appendix B,
@@ -90,23 +92,21 @@ poly1305-mct {
   00000000000000000000000000000000
     00000000000000000000000000000000
     00000000000000000000000000000000
-    1 596382b2c34704b87e291250fcb927fd;
-  00000000000000000000000000000000
-    00000000000000000000000000000000
-    00000000000000000000000000000000
-    10 7f1d971da577bdd6fb24437aaac845f5;
-  00000000000000000000000000000000
-    00000000000000000000000000000000
-    00000000000000000000000000000000
-    100 e1cb88ba2c498ade2091ab06cefa24fd;
-  00000000000000000000000000000000
-    00000000000000000000000000000000
-    00000000000000000000000000000000
-    1000 f7064b7217e8a6b74b381c58175d9ff2;
-
-  ## The full test.  This takes aaaaages.
-  ##00000000000000000000000000000000
-  ##  00000000000000000000000000000000
-  ##  00000000000000000000000000000000
-  ##  1000000 df62013a9d388ea6e82cb7295fa706ec;
+    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+    0 1 596382b2c34704b87e291250fcb927fd;
+  87d0ce793cb4cb966c8dd6ad0e6c6799
+    18bf6ee80c6d2d8d11ffe4f5b7214cf2
+    2a3dbb3acef3b4172e5f7045a33bd038
+    66f75c0e0c7a40658629e3392f7f8e3349a02191ffd49f39879a8d9d1d0e23ea3caa4d240bd2ab8a8c4a6bb8d3288d9de4b793f05e97646dd4d98055defc3e0677d956b4c62664bac15962ab15d93ccbbc03aafdbde779162ed93b55361f0f8acaa41d50ef5175927fe79ea316186516eef15001cd04d3524a55e4fa3c5ca479d3aaa8a897c21807f721b6270ffc68b6889d81a116799f6aaa35d8e04c7a7dd5e6da2519e8759f54e906696f5772fee093283bcef7b930aed50323bcbc8c820c67422c1e16bdc022a9c0277c9d95fef0ea4ee11e2b27276da811523c5acb80154989f8a67ee9e3fa30b73b0c1c34bf46e3464d977cd7fcd0ac3b82721080bb0d9b982ee2c77feee983d7ba35da88ce86955002940652ab63bc56fb16f994da2b01d74356509d7d1b6d7956b0e5a557757bd1ced2eef8650bc5b6d426108c1518abcbd0befb6a0d5fd57a3e2dbf31458eab63df66613653d4beae73f5c40eb438fbcfdcf4a4ba46320184b9ca0da4dfae77de7ccc910356caea3243f33a3c81b064b3b7cedc7435c223f664227215715980e6e0bb570d459ba80d7512dbe458c8f0f3f52d659b6e8eef19ee71aea2ced85c7a42ffca6522a62db49a2a46eff72bd7f7e0883acd087183f0627f3537a4d558754ed63358e8182bee196735b361dc9bd64d5e34e1074a855655d2974cc6fa1653754cf40f561d8c7dc526aab2908ec2d2b977cde1a1fb1071e32f40e049ea20f30368ba1592b4fe57fb51595d23acbdace324cdd78060a17187c662368854e915402d9b52fb21e984663e41c26a109437e162cfaf071b53f77e50000a5388ff183b82ce7a1af476c416d7d204157b3633b2f4ec077b699b032816997e37bceded8d4a04976fd7d0c0b029f290794c3be504c5242287ea2f831f11ed5690d92775cd6e863d7731fd4da687ebfb13df4c41dc0fb8aec3d45ef6076ec131cdd55e724bae2931260484b73b12fdf2546d852cf089b64f622809c6ff963010d8aebc14e0cf4d5d06fc92e8e022a2a97dd822329d7bf26baf95f2f25fd2274cb4e10a596b570a97176273053be918c9a0a12ab3f61d83229e403e512b9f1fd89824ec9942ee782ee6972faf4cb5898e4a123c5e9e3f3fb71397d435b4de0f83627475ee6170f55646fc8aa52375fe4aae3711138b550c5f5654106b4ba7bc268ae7f63cf8a2401b2ba6c0894177e3f6696f9086760c3ce4e16844d1780c10b7785dcb3641fb488f077eacb89b8cf5b627a4449224923378dab62b90ef1c2dc7f1f7a196304e1805ee1a13f8cf12aed5526b82f62b5759ff12a573f68b8ccbe2d01d2e5615802edc3ef0a7778a1c565d9a836d770d1f5812e5698af213e398e0357834fffcde35d1cb77c821d21377401341f898475a4df74c58
+    1 10 7f1d971da577bdd6fb24437aaac845f5;
+  9eff9b802b9d43922975aea18a62834a
+    1f22e8534c98f80321384c88d00972d7
+    2b2f5dfbc2aeaead12f8dfaad90d4ec9
+    b84d332e02eda38a6cf2763928ba014bc632a0f2c0266f9093edc731eb2ce1e61c9a10bcb4bbd2b4b69e3f84da37dcc011142fbf8222c68a31f9bc227ead19f629ff4d6d414e95d3e9a3b2998d8e6db6379112f2d1e5edb32294729ad7d1c087b87d1c26a7e3b491f9d4452a2da50df87027d0f52c75e281091e86c86cc15091b0a6459a94e74597f86cd4801b4413f6185a7dd87f5d6bd3dfc8717afabd833c08160428a0fd0c2f9934921e9a7e40d9bf8a4d61781985aa6691cec4f466ab0bd8fe4cce660b31aeedec1cdc8ae76d3b9a01e5b5ca1e5d6932096bef253f427da7e974eab8aca5c0f22c9f0b5f1598e857f28c4a0b313890c718130e6bd18a150e5aa18e2f19bec1cb88adaeade2122ee13193287bbab77b2a334ffd9ba26210d170b6e7c7edd2fb6808d03acac8fe38b87a7523926e04028bc8df5753ced4b1bdf0b8a8d2315d210433417509dc685c660bd97678ef2d470c5845497d7d726e5ffbcc6e4db02d5d1a6a8b4629580ca3fae7392b33a992e73afd9e07c1cdc3576aedf6d2330f8dcf5d148873799e76cd4b8dda4eba698178d5edd6b260ef84af4517fbb68810571cfa7df52e241d8c43d3e035e23684e386c5d57cd0c4755614a6b8fb3529ee54ae2b2393dba3638795ec5c30c84dd3651ad75f96a4675df0b2d7e67329c5eefd62c2b4c378e2212ffcd788690201ba9eadb62395e8b3ca8bdacddc3a96f36456d0f95edb90dd975dd685348ada9658dc0d452cc99288460e12749a433770560281e6cc60a0cc654c664e53ebfa5bbc71c67993418c32ce1eb2643f64e9357b1ecca7805de5b75a3b8b918d719a229662fa8f0100bf6d717823b41b72fb9e91edcc75eaaabb066f7a714bcb0dfecf8d6944295cd40e3e53b041ac373e4dfe54336c9ce2417f297b64b1a5f45223a3b135c2faa6dda33a8128a545fca0dafeec4c1e6d187b336712802abdc8f658e5b3cbfc8961c0324e138cfafe635e3d47537890ccb5557d71e77419da3f7f513d22c6300cd51397c2e9f07d4584cd54081ec5339a43d64d6607159b9227f32e112b48e6644c7543be64d2015bddb8e50093143761a48cacb3376f16a34b86f82f066c9087d74663082549784b44444ee744cf5b62a5efc25aea49238df87dbecb07d9977901b70db24f8d851cb78b50d814be55d91c0775b5b7acb6a5651b260427057f6c86cd9fa709205f1d40431cfef5e3f90bc124637bcf35cdf343e3f52ce4236db25ac29aba0a8c69a9b0f1ae180f5be6e9c2a79fa522078604855624d5ec85a113738ee0a81f2d6ca9be1caa26ba628b0b1429c06b371f5e2801fec0599588417c02d21b6412ba01b904cae803c61e83ddf17e083a9b42564255c49ca91c2f079f8fc9439fe93ae322de7480df086018
+    10 100 e1cb88ba2c498ade2091ab06cefa24fd;
+  0c4ac91a4cbcd2ddec777ed12feaee3b
+    0411d5def6fe88aff66611870f7b83d8
+    5ba282f23cef22af42c21616603b8f25
+    1d630211fdf32fb5c4432d71b34bfd6daa6aac7ef09bd1656e7b710a70166f0e926d61116e29486f407724d581acf140d70b1352195971ed43c0857c2fe1018cb570317da3f5eae2b83e795e3375106bad876f2fd2cec8b972681cd3b0f4f75442694294f3659b0d452c8e39728e73bf402783d9c9ba3bc913473c747f212aa29d5303614869abce329d8c872a0da70f7d3e0d48a99f076117e32f313584d8531de33d8f99fc5379cc4f0dc2fb785bbdc372868d7598d7c2773ec7c6717f45c45a0d1db3f9fe342c809c407b56af8bc5896ecbd27c7c2517884018142a37cc50ad0a754dc5f2fbbcfdc45a8a0f4815c1ab75ea15fb1585e475c6ecd452a75fe4fad2719e5915b044833b67174cd6eaf4106d6e3512c9986e34442da5d46700c68b391f6dd0beb025f0ec3b719cfb643313223dc859c824025dddfb3cef7084c5ae0b139930c51f8f925d4c5cf7e9c8b6af2e43eed9fb2bbead8999e9d629d1e346244f5ef6034a018517954508ea83a1f32a682b927b5814a67bf581980d620e6f2102344121c74f774721d2e24a7fe426fd216ffcd1d7a3abeec214e21e6db6d17b5237ece8ad09e19643e0cbdc1a25e72d1e58c85810900e965e2f42ee1a5d947ea20815c46019cafefbf808264cd151a551607d57295b08b130dcc936c32b9d9c586ecf2d2ae62f353b0fb9c0a9b2eb4dc50a7ac12cb1c782415adfe6a2ef7d58f4c893d2cb501785e5d5fc4439847018ffa0142707474dcb40736a379a408f92bf83e719e9599e35969f0f3ec47c1a1a78b2663468609f818f1b3fe267f2acd2ddcda6068f9b3d2e021f9d63b9c6d922f6a879f763f17c9fa4fc64c18ba9fee1ad1a383e9384b6978595bfddd54a08ec4a1b56fb7dbf7fe9de9b60cf4d8d3082b238864ef23f0336756f4b0e00e30872600f87b76112d6c4b2ec1cd5c234cd4e3062f886040b8e4a6d267edecad7966ee43e92428c44ef294c18434f4ee0317ab1856e8b01acc9a821b7594462da20b7cbca013b9e6ef07434dfba97cf4b41fdd36aadc8ffdfc95bec624b227af1ea06af10cae4fea72ada570f2df547c3e9fd8ddd84283cebb8de338d5e83e454faa25394dad66457f66a3813993888606876d2bec156e29755d251e88af6c1603c3ae0427db9de04bb2e83a85eab1d6180553f35d9d0ee1dca7a3083f47ea6e1c7686fd89910b4f0bb5a768ea7ee97d55ce24c0bb733239074f79f7ccb25ccdcddd0c2d2693e37546cf8237451828b4147a688f2a2a891e2e23108bafd413e512c4a50dfd101c44ec1b27acbf4d68b566a6a544c81d5f67ab7ed5d7b42dcd389d367539b360fbc70eee289699a9000cddff14bc212ec8a6e18ab58c19727c403b99a7b982fc660f3d8f54e096dad2a281308d4f5d50fc6e1
+    100 1000 f7064b7217e8a6b74b381c58175d9ff2;
 }
diff --git a/symm/t/poly1305.slow b/symm/t/poly1305.slow
new file mode 100644 (file)
index 0000000..c2443c0
--- /dev/null
@@ -0,0 +1,46 @@
+### Very slow tests for Poly1305.
+
+poly1305-mct {
+  ## Monte-Carlo test from https://cr.yp.to/mac/test.html, converted from
+  ## the original hash-the-transcript form; see `t/poly1305' for detais.
+
+  ## These are duplicated from the basic `poly1305' set, as a simple smoke
+  ## test.
+  00000000000000000000000000000000
+    00000000000000000000000000000000
+    00000000000000000000000000000000
+    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+    0 1 596382b2c34704b87e291250fcb927fd;
+  87d0ce793cb4cb966c8dd6ad0e6c6799
+    18bf6ee80c6d2d8d11ffe4f5b7214cf2
+    2a3dbb3acef3b4172e5f7045a33bd038
+    66f75c0e0c7a40658629e3392f7f8e3349a02191ffd49f39879a8d9d1d0e23ea3caa4d240bd2ab8a8c4a6bb8d3288d9de4b793f05e97646dd4d98055defc3e0677d956b4c62664bac15962ab15d93ccbbc03aafdbde779162ed93b55361f0f8acaa41d50ef5175927fe79ea316186516eef15001cd04d3524a55e4fa3c5ca479d3aaa8a897c21807f721b6270ffc68b6889d81a116799f6aaa35d8e04c7a7dd5e6da2519e8759f54e906696f5772fee093283bcef7b930aed50323bcbc8c820c67422c1e16bdc022a9c0277c9d95fef0ea4ee11e2b27276da811523c5acb80154989f8a67ee9e3fa30b73b0c1c34bf46e3464d977cd7fcd0ac3b82721080bb0d9b982ee2c77feee983d7ba35da88ce86955002940652ab63bc56fb16f994da2b01d74356509d7d1b6d7956b0e5a557757bd1ced2eef8650bc5b6d426108c1518abcbd0befb6a0d5fd57a3e2dbf31458eab63df66613653d4beae73f5c40eb438fbcfdcf4a4ba46320184b9ca0da4dfae77de7ccc910356caea3243f33a3c81b064b3b7cedc7435c223f664227215715980e6e0bb570d459ba80d7512dbe458c8f0f3f52d659b6e8eef19ee71aea2ced85c7a42ffca6522a62db49a2a46eff72bd7f7e0883acd087183f0627f3537a4d558754ed63358e8182bee196735b361dc9bd64d5e34e1074a855655d2974cc6fa1653754cf40f561d8c7dc526aab2908ec2d2b977cde1a1fb1071e32f40e049ea20f30368ba1592b4fe57fb51595d23acbdace324cdd78060a17187c662368854e915402d9b52fb21e984663e41c26a109437e162cfaf071b53f77e50000a5388ff183b82ce7a1af476c416d7d204157b3633b2f4ec077b699b032816997e37bceded8d4a04976fd7d0c0b029f290794c3be504c5242287ea2f831f11ed5690d92775cd6e863d7731fd4da687ebfb13df4c41dc0fb8aec3d45ef6076ec131cdd55e724bae2931260484b73b12fdf2546d852cf089b64f622809c6ff963010d8aebc14e0cf4d5d06fc92e8e022a2a97dd822329d7bf26baf95f2f25fd2274cb4e10a596b570a97176273053be918c9a0a12ab3f61d83229e403e512b9f1fd89824ec9942ee782ee6972faf4cb5898e4a123c5e9e3f3fb71397d435b4de0f83627475ee6170f55646fc8aa52375fe4aae3711138b550c5f5654106b4ba7bc268ae7f63cf8a2401b2ba6c0894177e3f6696f9086760c3ce4e16844d1780c10b7785dcb3641fb488f077eacb89b8cf5b627a4449224923378dab62b90ef1c2dc7f1f7a196304e1805ee1a13f8cf12aed5526b82f62b5759ff12a573f68b8ccbe2d01d2e5615802edc3ef0a7778a1c565d9a836d770d1f5812e5698af213e398e0357834fffcde35d1cb77c821d21377401341f898475a4df74c58
+    1 10 7f1d971da577bdd6fb24437aaac845f5;
+  9eff9b802b9d43922975aea18a62834a
+    1f22e8534c98f80321384c88d00972d7
+    2b2f5dfbc2aeaead12f8dfaad90d4ec9
+    b84d332e02eda38a6cf2763928ba014bc632a0f2c0266f9093edc731eb2ce1e61c9a10bcb4bbd2b4b69e3f84da37dcc011142fbf8222c68a31f9bc227ead19f629ff4d6d414e95d3e9a3b2998d8e6db6379112f2d1e5edb32294729ad7d1c087b87d1c26a7e3b491f9d4452a2da50df87027d0f52c75e281091e86c86cc15091b0a6459a94e74597f86cd4801b4413f6185a7dd87f5d6bd3dfc8717afabd833c08160428a0fd0c2f9934921e9a7e40d9bf8a4d61781985aa6691cec4f466ab0bd8fe4cce660b31aeedec1cdc8ae76d3b9a01e5b5ca1e5d6932096bef253f427da7e974eab8aca5c0f22c9f0b5f1598e857f28c4a0b313890c718130e6bd18a150e5aa18e2f19bec1cb88adaeade2122ee13193287bbab77b2a334ffd9ba26210d170b6e7c7edd2fb6808d03acac8fe38b87a7523926e04028bc8df5753ced4b1bdf0b8a8d2315d210433417509dc685c660bd97678ef2d470c5845497d7d726e5ffbcc6e4db02d5d1a6a8b4629580ca3fae7392b33a992e73afd9e07c1cdc3576aedf6d2330f8dcf5d148873799e76cd4b8dda4eba698178d5edd6b260ef84af4517fbb68810571cfa7df52e241d8c43d3e035e23684e386c5d57cd0c4755614a6b8fb3529ee54ae2b2393dba3638795ec5c30c84dd3651ad75f96a4675df0b2d7e67329c5eefd62c2b4c378e2212ffcd788690201ba9eadb62395e8b3ca8bdacddc3a96f36456d0f95edb90dd975dd685348ada9658dc0d452cc99288460e12749a433770560281e6cc60a0cc654c664e53ebfa5bbc71c67993418c32ce1eb2643f64e9357b1ecca7805de5b75a3b8b918d719a229662fa8f0100bf6d717823b41b72fb9e91edcc75eaaabb066f7a714bcb0dfecf8d6944295cd40e3e53b041ac373e4dfe54336c9ce2417f297b64b1a5f45223a3b135c2faa6dda33a8128a545fca0dafeec4c1e6d187b336712802abdc8f658e5b3cbfc8961c0324e138cfafe635e3d47537890ccb5557d71e77419da3f7f513d22c6300cd51397c2e9f07d4584cd54081ec5339a43d64d6607159b9227f32e112b48e6644c7543be64d2015bddb8e50093143761a48cacb3376f16a34b86f82f066c9087d74663082549784b44444ee744cf5b62a5efc25aea49238df87dbecb07d9977901b70db24f8d851cb78b50d814be55d91c0775b5b7acb6a5651b260427057f6c86cd9fa709205f1d40431cfef5e3f90bc124637bcf35cdf343e3f52ce4236db25ac29aba0a8c69a9b0f1ae180f5be6e9c2a79fa522078604855624d5ec85a113738ee0a81f2d6ca9be1caa26ba628b0b1429c06b371f5e2801fec0599588417c02d21b6412ba01b904cae803c61e83ddf17e083a9b42564255c49ca91c2f079f8fc9439fe93ae322de7480df086018
+    10 100 e1cb88ba2c498ade2091ab06cefa24fd;
+  0c4ac91a4cbcd2ddec777ed12feaee3b
+    0411d5def6fe88aff66611870f7b83d8
+    5ba282f23cef22af42c21616603b8f25
+    1d630211fdf32fb5c4432d71b34bfd6daa6aac7ef09bd1656e7b710a70166f0e926d61116e29486f407724d581acf140d70b1352195971ed43c0857c2fe1018cb570317da3f5eae2b83e795e3375106bad876f2fd2cec8b972681cd3b0f4f75442694294f3659b0d452c8e39728e73bf402783d9c9ba3bc913473c747f212aa29d5303614869abce329d8c872a0da70f7d3e0d48a99f076117e32f313584d8531de33d8f99fc5379cc4f0dc2fb785bbdc372868d7598d7c2773ec7c6717f45c45a0d1db3f9fe342c809c407b56af8bc5896ecbd27c7c2517884018142a37cc50ad0a754dc5f2fbbcfdc45a8a0f4815c1ab75ea15fb1585e475c6ecd452a75fe4fad2719e5915b044833b67174cd6eaf4106d6e3512c9986e34442da5d46700c68b391f6dd0beb025f0ec3b719cfb643313223dc859c824025dddfb3cef7084c5ae0b139930c51f8f925d4c5cf7e9c8b6af2e43eed9fb2bbead8999e9d629d1e346244f5ef6034a018517954508ea83a1f32a682b927b5814a67bf581980d620e6f2102344121c74f774721d2e24a7fe426fd216ffcd1d7a3abeec214e21e6db6d17b5237ece8ad09e19643e0cbdc1a25e72d1e58c85810900e965e2f42ee1a5d947ea20815c46019cafefbf808264cd151a551607d57295b08b130dcc936c32b9d9c586ecf2d2ae62f353b0fb9c0a9b2eb4dc50a7ac12cb1c782415adfe6a2ef7d58f4c893d2cb501785e5d5fc4439847018ffa0142707474dcb40736a379a408f92bf83e719e9599e35969f0f3ec47c1a1a78b2663468609f818f1b3fe267f2acd2ddcda6068f9b3d2e021f9d63b9c6d922f6a879f763f17c9fa4fc64c18ba9fee1ad1a383e9384b6978595bfddd54a08ec4a1b56fb7dbf7fe9de9b60cf4d8d3082b238864ef23f0336756f4b0e00e30872600f87b76112d6c4b2ec1cd5c234cd4e3062f886040b8e4a6d267edecad7966ee43e92428c44ef294c18434f4ee0317ab1856e8b01acc9a821b7594462da20b7cbca013b9e6ef07434dfba97cf4b41fdd36aadc8ffdfc95bec624b227af1ea06af10cae4fea72ada570f2df547c3e9fd8ddd84283cebb8de338d5e83e454faa25394dad66457f66a3813993888606876d2bec156e29755d251e88af6c1603c3ae0427db9de04bb2e83a85eab1d6180553f35d9d0ee1dca7a3083f47ea6e1c7686fd89910b4f0bb5a768ea7ee97d55ce24c0bb733239074f79f7ccb25ccdcddd0c2d2693e37546cf8237451828b4147a688f2a2a891e2e23108bafd413e512c4a50dfd101c44ec1b27acbf4d68b566a6a544c81d5f67ab7ed5d7b42dcd389d367539b360fbc70eee289699a9000cddff14bc212ec8a6e18ab58c19727c403b99a7b982fc660f3d8f54e096dad2a281308d4f5d50fc6e1
+    100 1000 f7064b7217e8a6b74b381c58175d9ff2;
+
+  ## And the ones which take a long time...
+  e67ee956b65e3e7a221eafc7f0ea01eb
+    0ffbe8b89a03187d5f7214b8d288b467
+    cce953773f0420b28340a8faf43dcebe
+    97cba51fcc9a9854abe0d283981461d28bcbd2864cb1ffbcfee66dbf40e7a45824f0b7557bb3e2b42792aea3a8faecba712922c05fecc559b6ac2297ab5b1d2e308199c205b5a2e5ebcfdc27843e03d391110e79470308d67b03cdfd023493cc946bd635876f42935c89076a577557af4bdba7f1cd397c8b05f159d8207d7a5a8435f1ce996eeef6dd059bac6ea521125a8b972fae3be55d35a7536c441cba26013d9a21fab4c9c94241c7d862146386951d4955fac4916178dff83af45252341659aa2714b710adc9d7953dc06584fb9f34480b6b834e1ab10b138db634130d3cd607ce93722070b16b83aa71559e2d515c3b582b7a630d5b825c5df4faecefd9cd905043a85c4caec7502d238b25c06b4231b8af96aae7f58446c0b21b37b2a8c7af43406d4002eef6e0311358f3dd27d8123032a9bfed32aa916f59e286739760e58bf9e6675a3353b2678c0aa858596199b5116071b0f7f8b6e8683f46cd78f0e69c5879da781dddfa1b92ef3dd187add8deb65c22ffc302866738cb62e38c4c0320cc55a9533067ec6fcdf5d432bbae9d79e1b1c7fe84a52f603ecb4352f5d99bdecbfde786ff8e98b1b4997b28fd5515ce14198a8678595c0b457b174a816989f2df949a21a5b70adef9c04c6b0371c80b2b50d70c7b8fbf122abde9d815927050734b29973038c1413d23a1d2cd282ee6a6c701595f6900728aad1f0a1ff9e00a2e5412c7da0bc20b86e7e5fbe4137838c0dcc8d32b02359b45a85f98fe069b4a32061110d0dc0f6a15eadd409e292b26b9f250b6c6f4e9315320d8f36601fbcbe01163f59a3641e0ccd29f037b93fa6242696f68aaace3fc2882270a7e90dad52a265ca9b26071feafa347fbb79e1cd64141c7eca85e53c4c0b8b51f228596de801f181860bdf0ae48f025152611d92b7f440ca3efd072ddb1daf16bab4ed3b3be38a2b898a0c7e2c691f48ef88ee31711df2e2a2b739367412e44eb21cd56daba191f4b92500e2cc60e9ed77dfe8eacd89b35804070879326a3d732a73850c6ce90d68652be417fd37200888ee0b6f946050d4057613c9dd1e0c4b6923e01bde22735505ffa967311d72931a58be47157a09404ff67116b44c11efb021c39987f1ab9bbba3ae7b20cff80b058de38335f338bf8b2b3abd08d8b21a83c9713e8187ef98a43f811142d2b16c1c9919e242662350069c7dc59f70f499544f4eedea9ce55f8a6cd637d983191960eac0510f6013b21342a76571fcba18c9374d6554009fcbaee3db509f404edd4bc9d6fbaf9cad1b8007beadbe864a7c58eddd25c039dbcf43ed3eb03295d144f9f2186ea704fb065a5e3594364354f5c6720ee4c6f8731235d1f98851f586fee0952ed0e1d201f673e25377111a5212537fb4ff2f69dfcc7
+    1000 10000 526fbba33c160146160ab9abc3514d70;
+  de4b1444f9b3e24182a8f893069985ad
+    662f8dcf37c2537fa4acda7f8588afca
+    0d03c71cccec848e7b613408b41c1ac8
+    37b9a507c7e12a61a6e9248ba6b2c9b09373551a15bf70dee6a24059a9f32cd24519fba4fccb04d91dad2ac4b3f58850d6fc3e3fe7ecc43d2e6a61c4e7f31c3ec0bf91e272c7500e7697695893cdff766e1acfb858d7e78d899c50eb73ed4d7c27e54c1e3f26316d943cbb70ead8605b7fb1f9314f910cd058671069cda3e83085c9e145d1f7834cbf6d3688d9bd485e165567c39b45f70d865be3730b46f4673348250aa0984ba91ae35b911e0ddcb6536c94abc68ce1d040808cda931f0e327ec06face8eff8a84b587b57cead5be8082571cdf60c26c79b6004113659de81e6e59815c0ccbbe4fbff6f451851f406135806292a21ea803c1a64ebaf4274649f07533e6835c4aa8831c30410d05f398f2c6fbe1eff8795cd517bf5d2d96c1e752bf0f8372a4adf538fdcfce1da5d96ecb5aeb1475eead5207d12506f496c9f6c23b87d5dc8499a044a1c667123e1e041c0c821bbb851d049e5f30a37f9578576eb48a663566381793da0df295a127c6492b1eff9592274a38a24816cf6b15cc890465d11e8206dcf1d53bb467d788b277d855008699d8b49ea8019137838de83fed0cce28825e541a02020f426eeff1709370bcabbf99e341a038722dcfb8021914b20df5aae68c36137337ba2467ee5c8fb603c79eda88063215a59097a85eede7b8991aa7dde58c8046f62458cdfab00d648401c124ddd60ca160d8ba15ba9cc44d5077c73a73ace9ccf008e00a17b2d618ed4f935db3a452d37b6736900f017066f8797850c625ff6943ac5969030fe3c53d3126d8f0d8c43b2a229f077e57b4892378bb2aae0501d3c48be841d8daa6ac55a86e901ddc56fcb33c8dc06593719e60f3a54467ad502df248ebed9992bf85e6c61f50cbdd0a9100a9a09e11bf3f422318574dc655ba404650163e9a01f5b70fa789167656211b3a2c844d7ae13580f610b723e99f3efbd6c1c3646468101772d8f9a46e845bde3c4220c53051cdb7181459ced3e0f17091a4d6c3f9adef6f0d4d4bb219d37c6ef8821d1f5bceadffadb2f75d5b0ac1f7bee9be5974c84d6796a5d3f6ea4907808f562e53e9c83565c557eb9556f13955c905c3893c893db2e6ad4cadb79aff4355fb0ae54c80ae4a04820dda1b34d7afd9e324d8a9796ecc581e396f98c6c98188a358e9266b1a3781f9a863771288860c29426d0f17bce970fd39fa43d845f93b574a8b0b267d3c1589b79227e9b95ee0e78705e95ac5758db2c712de4a7b96d60e53b158e378a0f475a3e1c22974c4a90ac222e0f0098cbffcf35777813936764ef9c2574f5edeeeba642163ea08b83a14a1c8dfaaad46b93547c2486addcd7e51178b987b4d6ff365f12785bc7465aacb16d749a823ef81b259c2624addc7d863e42091fb76f5642167e27
+    10000 100000 1beef5f2e126cc3c549276415c17e51b;
+  8404ffcc46b4d0898a8de08bf5eae9b6
+    7bd305dadd4f291f6700c7b48446988b
+    c18d7e08835beed76ae9e82396af49c6
+    bacc8b39ade64cc59369ff39dfd2522c31a603edacdb057ead0d96e9d5ec1662e6d065bc2414852f9e8c67275ce0e82f12645fd458f4e5833461f69dfa92dc2fc77e488539617ec8857707e60fde8dd27364183373bb45b292495b89e74f730fc8bedd6b8e4ad23c464b069f4fbda078584ff1cd06acb21436dfbd3488cd7098981f1c7ef494da47f8367a4d0992a5f08a2d4193770d295cd5fce729c114ed16d7c68f5412b91189182ef8a43462637247e5c269cdf4e4e03334827157c72679617fbbf71bd5c59dc898c937f9a342c0c1a5fa69122b07f396b89ccbc51e17e7062278adb6c7f5b3a023cbfa5dbf076b6bd35cfd65cf9c2e6fa905a597e56fe81639966a0848e7cf1f9690342d5bd25e1cff78d510e407f49d42f9031921fa7757632a2ca344912b646376b67ddba85e47939fbc9f99cf148c57df560a4e84cdd86d7adef2a9d7c9f7862084ac393d92cae3ed1812b1596d4b594be1c7cad3fe7715484ff838285f9c78dfd08e41aac6820ddf4a443202a4ceb0c10225766dc4694ae3c97f9c37d96971c9fabde40d453a50f030ccd633596fea1326a6944952b5d1a7be5afe6c1b79be0a4737abb7771c1b5951fa8a4f2030560ad4756171d6dc91b0d052f39ffc58edb14e89bee46442ad6b0bae8b9a3e9be2af7a10b8136cf832d1335921ed325dca3fe10164888d0969a941206f3a2671186b3aa08ad120a040267548e2975bbd7aee77f9ea0eaed42f3e5f8b6051822fef1461db72a5bb3929719a2b1ca72d350c9986bd3aaef8219c260803258ad97f4cf69b435bf229ecfdda161ddf6efe1f37818301c1e06296555a87f51c340fe02b4eb24ff03f8d0a5d7699f99be34eeaa29d4b0a97971a0f8f5a3834b00031a58d94192b944d9ee460961086eb35d0de5a9dada27022e1c7dfcc5ed6c615c72bc5cdf02f9a98e6f49ed8558ca8cdaa9f610ce93f62568596c913c0f96d55ea593571a9b41e2bd4a48d0be558feaa1c8e30f49fb57be63fbe55c81723e1c4402c2ff085959318079d3c531cd69d2599d2cb321e02a0a850419932a3b522c33b8343653b30ea1a53909fe5384ed977ab3c2c20b60055d1eeb3bc47e7a79489ee69a5d42984f73864f048309c4f7ab0e02d5bba5e7c5fa6ead2f92f456e67878269bc8efd4c398791ffd2e005f9563e17a0872478326ea0a8c0f1277c345e19bee04d23fb1bc5af0f39d3a1b8c2ecc92324ae85e15cdc2315600c456efd341a4ceb1731b3963e3b8dc0d67cc486651915f40668c62b46b93d359d869a0daac341f1ce370372194d4c7636f1b370d3890f69a684bd43641e0541b451e89f780d442ec940c1b573211afaca11dd4294e310e341cd396e711afb00676b6afbebe67a3b5f4eac5b41afef4aed2c370e1ca0bd
+    100000 1000000 df62013a9d388ea6e82cb7295fa706ec;
+}