FIPS 186-2 fixes
authorjhurst <jhurst@cinecert.com>
Thu, 8 Oct 2009 15:58:16 +0000 (15:58 +0000)
committerjhurst <>
Thu, 8 Oct 2009 15:58:16 +0000 (15:58 +0000)
src/AS_DCP_AES.cpp
src/KM_prng.cpp
src/KM_tai.h
src/KM_util.cpp
src/KM_util.h
src/fips-186-rng-test.cpp
src/fips-186-test-harness.pl

index fbb19908ca5b4e11bb7191ee03e28134b438b298..6c81cade5fa207f5d7a3c844d7f8a160e5b1bea6 100755 (executable)
@@ -281,6 +281,9 @@ public:
   {
     byte_t rng_buf[SHA_DIGEST_LENGTH*2];
     Kumu::Gen_FIPS_186_Value(key, KeyLen, rng_buf, SHA_DIGEST_LENGTH*2);
+
+    // rng_buf contains two rounds, x0 and x1 (each 160 bits).
+    // Use x1 per SMPTE 430-6-2006 Sec. 7.10
     memcpy(m_key, rng_buf+SHA_DIGEST_LENGTH, KeyLen);
     Reset();
   }
index 1ae5679478a69958b9105450ea93a642d250c3cb..031cb3546eb099a604edc2ad98c3460c354c4964 100755 (executable)
@@ -199,28 +199,36 @@ void
 Kumu::Gen_FIPS_186_Value(const byte_t* key, ui32_t key_size, byte_t* out_buf, ui32_t out_buf_len)
 {
   byte_t sha_buf[SHA_DIGEST_LENGTH];
-  const ui32_t key_buf_len = 64;
-  byte_t key_buf[key_buf_len];
-  SHA_CTX SHA;
+  ui32_t const xkey_len = 64; // 512/8
+  byte_t xkey[xkey_len];
   BN_CTX* ctx1 = BN_CTX_new(); // used by BN_* functions
   assert(ctx1);
 
+  if ( key_size > xkey_len )
+    DefaultLogSink().Warn("Key too large for FIPS 186 seed, truncating to 64 bytes.\n");
+
   // init key
-  memset(key_buf, 0, key_buf_len);
-  memcpy(key_buf, key, xmin<ui32_t>(key_buf_len, key_size));
+  memset(xkey, 0, xkey_len);
+  memcpy(xkey, key, xmin<ui32_t>(key_size, xkey_len));
+
+  if ( key_size < SHA_DIGEST_LENGTH )
+    key_size = SHA_DIGEST_LENGTH; // pad short key ( b < 160 )
 
-  // create the 2^160 constant
-  BIGNUM c_2powb, c_2, c_160;
-  BN_init(&c_2powb);  BN_init(&c_2);  BN_init(&c_160);
+  // create the 2^b constant
+  BIGNUM c_2powb, c_2, c_b;
+  BN_init(&c_2powb);  BN_init(&c_2);  BN_init(&c_b);
   BN_set_word(&c_2, 2);
-  BN_set_word(&c_160, 160);
-  BN_exp(&c_2powb, &c_2, &c_160, ctx1);
+  BN_set_word(&c_b, key_size * 8);
+  BN_exp(&c_2powb, &c_2, &c_b, ctx1);
 
   for (;;)
     {
+      SHA_CTX SHA;
+
       // step c -- x = G(t,xkey)
-      SHA1_Init(&SHA);
-      SHA1_Update(&SHA, key_buf, key_buf_len);
+      SHA1_Init(&SHA); // set t
+      SHA1_Update(&SHA, xkey, xkey_len);
+
       ui32_t* buf_p = (ui32_t*)sha_buf;
       *buf_p++ = KM_i32_BE(SHA.h0);
       *buf_p++ = KM_i32_BE(SHA.h1);
@@ -235,20 +243,20 @@ Kumu::Gen_FIPS_186_Value(const byte_t* key, ui32_t key_size, byte_t* out_buf, ui
       out_buf_len -= SHA_DIGEST_LENGTH;
       out_buf += SHA_DIGEST_LENGTH;
 
-      // step d ...
-      BIGNUM xkey1, xkey_buf, x0;
-      BN_init(&xkey1);  BN_init(&xkey_buf);    BN_init(&x0);
+      // step d -- XKEY = (1 + XKEY + x) mod 2^b
+      BIGNUM bn_tmp, bn_xkey, bn_x_n;
+      BN_init(&bn_tmp);  BN_init(&bn_xkey);    BN_init(&bn_x_n);
 
-      BN_bin2bn(key_buf, SHA_DIGEST_LENGTH, &xkey1);
-      BN_bin2bn(sha_buf, SHA_DIGEST_LENGTH, &x0);
-      BN_add_word(&xkey1, 1);            // xkey += 1
-      BN_add(&xkey_buf, &xkey1, &x0);       // xkey += x
-      BN_mod(&xkey1, &xkey_buf, &c_2powb, ctx1);  // xkey = xkey mod (2^160)
+      BN_bin2bn(xkey, key_size, &bn_xkey);
+      BN_bin2bn(sha_buf, SHA_DIGEST_LENGTH, &bn_x_n);
+      BN_add_word(&bn_xkey, 1);            // xkey += 1
+      BN_add(&bn_tmp, &bn_xkey, &bn_x_n);       // xkey += x
+      BN_mod(&bn_xkey, &bn_tmp, &c_2powb, ctx1);  // xkey = xkey mod (2^b)
 
-      ui32_t bn_buf_len = BN_num_bytes(&xkey1);
-      assert(bn_buf_len < SHA_DIGEST_LENGTH+1);
-      memset(key_buf, 0, key_buf_len);
-      BN_bn2bin(&xkey1, key_buf);
+      memset(xkey, 0, xkey_len);
+      ui32_t bn_buf_len = BN_num_bytes(&bn_xkey);
+      ui32_t idx = ( bn_buf_len < key_size ) ? key_size - bn_buf_len : 0;
+      BN_bn2bin(&bn_xkey, &xkey[idx]);
     }
 
   BN_CTX_free(ctx1);
index 09c85d21dd51826f2ecc9e1aeeb6e53250b0af3b..ee3b66611205aef1317d8754ae44055337ab5f6e 100644 (file)
@@ -64,6 +64,7 @@ namespace Kumu
     struct tai
     {
       ui64_t x;
+      inline void add_seconds(i32_t s)  { x += s * 1; }
       inline void add_minutes(i32_t m) { x += m * 60; }
       inline void add_hours(i32_t h) { x += h * 3600; }
       inline void add_days(i32_t d) { x += d * 86400; }
index 7fcd6e34b54a16636d59b5897b157341f3720e80..b155362f61f4251752a73c9eb13a01632c7ae365 100755 (executable)
@@ -774,6 +774,26 @@ Kumu::Timestamp::AddMinutes(i32_t minutes)
     }
 }
 
+//
+void
+Kumu::Timestamp::AddSeconds(i32_t seconds)
+{
+  SYSTEMTIME current_st;
+  FILETIME current_ft;
+  ULARGE_INTEGER current_ul;
+
+  if ( minutes != 0 )
+    {
+      TIMESTAMP_TO_SYSTIME(*this, &current_st);
+      SystemTimeToFileTime(&current_st, &current_ft);
+      memcpy(&current_ul, &current_ft, sizeof(current_ul));
+      current_ul.QuadPart += ( seconds_to_ns100(1) * (i64_t)seconds );
+      memcpy(&current_ft, &current_ul, sizeof(current_ft));
+      FileTimeToSystemTime(&current_ft, &current_st);
+      SYSTIME_TO_TIMESTAMP(&current_st, *this);
+    }
+}
+
 #else // KM_WIN32
 
 #include <time.h>
@@ -889,6 +909,23 @@ Kumu::Timestamp::AddMinutes(i32_t minutes)
     }
 }
 
+//
+void
+Kumu::Timestamp::AddSeconds(i32_t seconds)
+{
+  Kumu::TAI::caltime ct;
+  Kumu::TAI::tai t;
+
+  if ( seconds != 0 )
+    {
+      TIMESTAMP_TO_CALTIME(*this, &ct)
+      t = ct;
+      t.add_seconds(seconds);
+      ct = t;
+      CALTIME_TO_TIMESTAMP(&ct, *this)
+    }
+}
+
 #endif // KM_WIN32
 
 
index 9ba6dc54c9f7083056ce0c18af1f7f70e3fb687c..0f2af46faada351878d2eee58c179cd9f34b667a 100755 (executable)
@@ -402,11 +402,12 @@ namespace Kumu
       // decode and set value from string formatted by EncodeString
       bool        DecodeString(const char* datestr);
 
-      // Add the given number of days, hours, or minutes to the timestamp value.
+      // Add the given number of days, hours, minutes, or seconds to the timestamp value.
       // Values less than zero will cause the timestamp to decrease
       void AddDays(i32_t);
       void AddHours(i32_t);
       void AddMinutes(i32_t);
+      void AddSeconds(i32_t);
 
       // Read and write the timestamp value as a byte string having
       // the following format:
index b0a677b27e2f8a820191d5dbd6df83b70d032540..08a166597afad49bf32f4d54cb6ab29629b59520 100755 (executable)
@@ -39,47 +39,52 @@ using namespace Kumu;
 int
 main(int argc, const char** argv)
 {
-  if ( argc != 3 )
+  if ( argc != 5 )
     {
-      fprintf(stderr, "USAGE: fips-186-test <XKey-hex> <X-hex>\n");
+      fprintf(stderr, "USAGE: fips-186-test <rounds> <b> <XKey-hex> <X-hex>\n");
       return 2;
     }
 
-  byte_t XKey_buf[SHA_DIGEST_LENGTH];
-  byte_t X_test_buf[SHA_DIGEST_LENGTH*2];
-  byte_t X_buf[SHA_DIGEST_LENGTH*2];
+  ui32_t const X_buf_len = 1024;
+  byte_t XKey_buf[X_buf_len];
+  byte_t X_test_buf[X_buf_len];
   ui32_t char_count;
 
-  if ( hex2bin(argv[1], XKey_buf, SHA_DIGEST_LENGTH, &char_count) != 0 )
+  char* end = 0;
+  ui32_t rounds = strtol(argv[1], &end, 10);
+  ui32_t B = strtol(argv[2], &end, 10) / 8;
+
+  if ( hex2bin(argv[3], XKey_buf, X_buf_len, &char_count) != 0 )
     {
       fprintf(stderr, "Error parsing <XKey-hex> value\n");
       return 3;
     }
 
-  if ( char_count != SHA_DIGEST_LENGTH )
+  if ( char_count != B )
     {
-      fprintf(stderr, "Incorrect length for <XKey-hex> value (expecting 40 hexadecimal characters)\n");
+      fprintf(stderr, "Incorrect length for <XKey-hex> value (expecting %d decoded bytes)\n", B);
       return 3;
     }
 
-  if ( hex2bin(argv[2], X_test_buf, SHA_DIGEST_LENGTH*2, &char_count) != 0 )
+  if ( hex2bin(argv[4], X_test_buf, X_buf_len, &char_count) != 0 )
     {
-      fprintf(stderr, "Error parsing <XKey-hex> value\n");
+      fprintf(stderr, "Error parsing <X-hex> value\n");
       return 3;
     }
 
-  if ( char_count != (SHA_DIGEST_LENGTH * 2) )
-    {
-      fprintf(stderr, "Incorrect length for <X-hex> value (expecting 80 hexadecimal characters)\n");
-      return 3;
-    }
+  ui32_t const meg = 1024*1024;
+  ui32_t out_size = char_count;
+  byte_t X_buf[meg];
+  ui32_t fill_size = rounds * 20;
+  assert(fill_size < meg);
+  Gen_FIPS_186_Value(XKey_buf, B, X_buf, fill_size);
 
-  Gen_FIPS_186_Value(XKey_buf, SHA_DIGEST_LENGTH, X_buf, SHA_DIGEST_LENGTH*2);
+  byte_t* test_key = &X_buf[fill_size - out_size];
 
-  if ( memcmp(X_buf, X_test_buf, SHA_DIGEST_LENGTH*2) != 0 )
+  if ( memcmp(test_key, X_test_buf, char_count) != 0 )
     {
       fprintf(stderr, "Test vector value does not match:\n");
-      hexdump(X_buf, SHA_DIGEST_LENGTH*2);
+      hexdump(test_key, char_count);
       return 4;
     }
 
index 517cce141d16c74a105623a257bc179296161cee..622615969252d8d98dd90f4ceece2c4f2786eb4d 100755 (executable)
@@ -38,19 +38,36 @@ my $rng_prog = $ARGV[0];
 die "Expecting RNG program name as argument" unless ( -x $rng_prog );
 
 my $test_count = 0;
+my $rounds = 2;
+my $i = 0;
 
 while ( my $line = <DATA> ) {
-    if ( $line =~ /^XKey = (\w{40})/ ) {
-       my $XKey = $1;
-       my $XSeed = <DATA>;
-       my $Xval = <DATA>;
-       die if ( $Xval !~ /^X = (\w{80})/ );
-       $Xval = $1;
-       system("$rng_prog $XKey $Xval");
-       die "Test vector failure at test $test_count: $XKey $ Xval\n" if ( $? != 0 );
-       print STDERR '.';
-       $test_count++;
-    }
+  if ( $line =~ /^<MCT>/ ) {
+    $rounds = 10000;
+    next;
+  }
+
+#  next if ($rounds == 2);
+
+  if ( $line =~ /^b = (\d+)/ ) {
+    my $vlen = $1;
+
+    my $XKey = <DATA>;
+    die if ( $XKey !~ /^XKey = (\w+)/ );
+    $XKey = $1;
+
+    my $XSeed = <DATA>;
+
+    my $Xval = <DATA>;
+    die if ( $Xval !~ /^X = (\w+)/ );
+    $Xval = $1;
+
+    system("$rng_prog $rounds $vlen $XKey $Xval");
+    my $ret = $?;
+    die "\nTest vector failure at test $test_count: r=$rounds b=$vlen k=$XKey v=$Xval ($ret)\n" if ( $ret != 0 );
+    print STDERR '.';
+    $test_count++;
+  }
 }
 
 print STDERR "\nfound $test_count test cases\n"
@@ -1020,3 +1037,282 @@ XKey = ffffffffffffffffffffffffffffffffffffffff
 XSeed = 0000000000000000000000000000000000000000
 X = ce8dd97eb53de8b8997d71af15eed31ffc822deb269cb566a0a9645811a3d9c977c5d8fbe8ddf6bb
 
+#  CAVS 5.0
+#  "FIPS 186 - General Purpose" information for "rngtestvalues"
+#  Generators selected: Xorg Xchange
+#  G-Functions selected: SHA-1 DES
+#  Generated on Wed Feb 08 15:20:53 2006
+
+<MCT>
+[Xorg - SHA1]
+
+COUNT = 0
+b = 160
+XKey = 1c670cfd3b421f21fdb0f3885a204eb659ca9740
+XSeed = 0000000000000000000000000000000000000000
+X = e5121116d1a99e62902ffd279261500e0e16b0f3
+
+COUNT = 1
+b = 168
+XKey = d87f639afea75ba44bbc6bd0fb5ac84a12c2c6ed95
+XSeed = 000000000000000000000000000000000000000000
+X = 09328f082e48135784d39f9f0ec67911ef708788
+
+COUNT = 2
+b = 176
+XKey = f0ecfa38f93823dcf6c918432d1d72731f02d74cbafa
+XSeed = 00000000000000000000000000000000000000000000
+X = 1675536299b8a05236cc460944e691e952adbb80
+
+COUNT = 3
+b = 184
+XKey = 574508895ccfdcf4a1ad8284ad94eb3321f5d1a4a6244b
+XSeed = 0000000000000000000000000000000000000000000000
+X = f90c11ae695df29ae707a187a2eeeea92dcbd84b
+
+COUNT = 4
+b = 192
+XKey = 6e9d90254b9534d3ae680c9ab38d434114a58715fd00758b
+XSeed = 000000000000000000000000000000000000000000000000
+X = d562e8d50a86de701d6fb076a378282bae721849
+
+COUNT = 5
+b = 200
+XKey = 3477f6949b5278183169e9decf0010e683be87afe3b1b357a1
+XSeed = 00000000000000000000000000000000000000000000000000
+X = d954bc9c0537484f8ec13f4dde1905e3441dbac0
+
+COUNT = 6
+b = 208
+XKey = 533acb38c61100b152c326c7b4ea027df73b07c94309ca3cf60a
+XSeed = 0000000000000000000000000000000000000000000000000000
+X = 14b266d8c1fd4871104dd4f91c6d6d15c8e76c37
+
+COUNT = 7
+b = 216
+XKey = 21392b55c4e3af82523cdf81eaf1868055bd3e3ea18236c30b9833
+XSeed = 000000000000000000000000000000000000000000000000000000
+X = 7318576beb22084349f749d7ca615f1333f6bff4
+
+COUNT = 8
+b = 224
+XKey = b33ba749e3057b7a8aa61f3c78771655710157323bc1fecef62842d5
+XSeed = 00000000000000000000000000000000000000000000000000000000
+X = a24fa133c2e5ae5a2378af37e6097e1b5f503dd0
+
+COUNT = 9
+b = 232
+XKey = 2c685c7482c85777d9de02ee550fc2f5aa0e0f76319f27043ba10407a5
+XSeed = 0000000000000000000000000000000000000000000000000000000000
+X = fceae60fcdda5782a43916d23c133d4aa59588f9
+
+COUNT = 10
+b = 240
+XKey = aaa6e9a6525a0dbebf306a487f168bb31411ac5b3d761e5b775deda2c253
+XSeed = 000000000000000000000000000000000000000000000000000000000000
+X = c87d4f6f1dfff1c7c0517a3ba478ea3db40c915d
+
+COUNT = 11
+b = 248
+XKey = 5061d23eb06b7844fcad7e0b55d6abd6455775cca2bc0cf1b53d9a559c90c9
+XSeed = 00000000000000000000000000000000000000000000000000000000000000
+X = 96116ca45240c44249b8265d736572a3555d4bd8
+
+COUNT = 12
+b = 256
+XKey = b436c1e06d76015c85d145cfb2f513f2dbffa7682b3ea09f6539f8f777f33926
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000
+X = 8123d23bdb6379a8383a25fda023af25ec0dd8d0
+
+COUNT = 13
+b = 264
+XKey = b6fb9e128dc5985f3a49ab84ee0336f8954318a9b681bbef9bf052beb3555e2134
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000
+X = dcbd4dc592d2eadff08c532614ae28c030e9b60c
+
+COUNT = 14
+b = 272
+XKey = fe9e57d121e2bd431c41f1f757d2bd5b141c98daa47e795fdbcfed15c14168728a8b
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000
+X = 1945ac66fd792852da50b72e33bac69ed3ce9bbd
+
+COUNT = 15
+b = 280
+XKey = 635debc0f6a35bea4b6de3db176b06600370d9840375feb1e3e1d6172308f35104f1cc
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000
+X = 72b363e7676288180c41d42a0934714c745bdbb0
+
+COUNT = 16
+b = 288
+XKey = 66682eeb3ba396a7654d5e3e1230376d9c8d710f00bb13e493112a92f00661e93597d26b
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000
+X = 1d7d5a287a2198fc2ed407838521c6be1d7cd11d
+
+COUNT = 17
+b = 296
+XKey = 575289a193c212b874e690bf22d807b568c63a66b9eaccf871bca5c05e66975a7f7841f80b
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000
+X = 5c9f11ba4939c6ce67bdc0c35aaa418151b0b9d0
+
+COUNT = 18
+b = 304
+XKey = 6df2a963884ec9a615e398d010cc91026060845b01c0de2362ac2b490c9bd910850a3f057414
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 6a244d9944384feb512d4e080d308096ddfe8066
+
+COUNT = 19
+b = 312
+XKey = 2c4b6df63cb790996f0c032657e608a76b2af9d9ff30df77732841bbaab63a23bde0ce71f12a7e
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = f2c6c8fe88d73a1940d0de419ffebc5b2070c5c7
+
+COUNT = 20
+b = 320
+XKey = dfb6bfe8d24fd6395c811928a7953aee1a2de5d6e484f69fd9f7e9227ec591355f130dcea933f96c
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 54c4809627894c7be99d752be77a41a71e1177bc
+
+COUNT = 21
+b = 328
+XKey = 5ae22f47f7301856ada0553c6191977adfb39b64791df5d4f19a0d1f9a446748b95527743139d49e60
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 44ed62cc4a46740532b1178c75919e55598a3094
+
+COUNT = 22
+b = 336
+XKey = ee2ef8ae409bc544bda6637166568b93721db4d7a9b194ac0e17e378c000628922591c4e3a1eebc7576f
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 98e18826178499f6b5e9f7dbbc7fbb5ea8ece400
+
+COUNT = 23
+b = 344
+XKey = d071c39a5d2e9a2aaf716f1ad84c16ba74411d3597615dcd04b6cf68a0dfa14c26fa89271bc75a520509d5
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 5f8264026559da35e0bea1fdab8bc967079b1fd9
+
+COUNT = 24
+b = 352
+XKey = 369b80c1a1c6fb9d69a01c727cece3547371544418631d4a252079c44f1d54fd831fb00170ae47b045c67212
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 148e0ecee150cb59b1ee70586e0f493b74dda65d
+
+COUNT = 25
+b = 360
+XKey = d0a014bda380b171255b36e40f20a69821957dae52eff01229a077f36b708976f6cfa6abed699bc015fc02747f
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 1a67a8bcdffd0e07606288fb0bb0726b36b259bf
+
+COUNT = 26
+b = 368
+XKey = aae6ae0f2eb856f812733764e7ec1cfc7d49e92e61703738a5c03f83dffef933749285fc17f3c9378c605c35b2d1
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 10b3ebf6cd54131ce1e902829a0ab251f193eb24
+
+COUNT = 27
+b = 376
+XKey = f36b395eb02579985875f6183210e452b91c20bd58e4172772d1e44ba596b8a550aa7f8552fbc06315e1c572cc50fd
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 110bb9281f2e1ffac8252473be9f1ef2629513f0
+
+COUNT = 28
+b = 384
+XKey = 7af1449287ffbf7428814dd6217aee8695d7f463760a121e40f6b642e70b98720db293f279ebb56ac53492e656aedd20
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 08ea8feab6b529788d904bdbd43b9db583c95b3c
+
+COUNT = 29
+b = 392
+XKey = 94a62f890e754bda69b6d2a71a9c7cda337b99902d80f76ee4a00638e3ce3a9fe271b15b8d15167a8760c5f8af482f8fa2
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = c65ba4525e3bb1f083ac1bd971d952d8fb4ea820
+
+COUNT = 30
+b = 400
+XKey = 417891bdbf562d87c93ca9c53aac522161c793e8a762bcbe725b0391492dc9cb38c31ecc768a869745cafdcb1a363ad6fec2
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 09ffcbaca867d86fb5a90e44ad5d60b96b52e090
+
+COUNT = 31
+b = 408
+XKey = 999a1eeca775bdbe61f3772f6cfc28ff95f13745ac35100e95ecd4479c024edd096f2a22f4ba61735bbcf81872a7ea6b3a4763
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = f2fef1651d92847c0facc14799153aac54289afc
+
+COUNT = 32
+b = 416
+XKey = 41f80eca8e883ceb6a772453131c922d542749c2a93248a4a4994c2c8f8c96275362eecd9930e8f32e9b6681acea5e255760de49
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = e750fd8a3815189e7b1ffba65760c6896773195f
+
+COUNT = 33
+b = 424
+XKey = 7eae482dcfa5e02acf05e105db48283f440640439a24ca3b2a482228c58f3f32c383db3c4847d4bcc615d3cac3eb2b77dd80045f0b
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 26e00f1ea68d5bde0c820837c18f564347507dc9
+
+COUNT = 34
+b = 432
+XKey = d8143b6190d098d8c0b9af5c175344b602e6d086732e6b96e054ef688e1d5b110f62754a0ac0b4c53a905cbdb919ebd17f05b4122512
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 60ac25c92a8c7da14edfebde25a97646474c9009
+
+COUNT = 35
+b = 440
+XKey = 6f54f8051f7c172493f282be71942d4a65285560bca1b61b2f9effc1fc3483a63ced314d7010c6d15d2341831aaf97d56743a97740bb73
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 1130c281c88ecad60736ac5bf6c9db4fc2e8334a
+
+COUNT = 36
+b = 448
+XKey = ca82c17fc3ac423e00c8b7c6f48bd0976d9e60c973f460fe735c37959d5239208a1b6d18221193d0bd3b65a888201e832bdd397ba8767bd3
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 8da6754cadeb3f9121239381de1ff40061abe07e
+
+COUNT = 37
+b = 456
+XKey = 058f0d2e2a8b17581ab00d8b7ed2fef2e21dfaa60b120fd28acc771591880f2706640bc0d667e8b58cc2a3642255295316750e14c1ed816ce5
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 5fd13163fb1fe4417fe96d7fb13ef2577f5868b2
+
+COUNT = 38
+b = 464
+XKey = a8806c3e36700c4b8b45555dc9679bcb036fa3924fe85a3d1d57c708c77a3f4469ced8fdf25320db7b930e46d8e138cd6ddf47c94343a83d5cda
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 5704c42642beaa28896816eb196d2cf6b3de61f6
+
+COUNT = 39
+b = 472
+XKey = 1a02d007f03b34ed427631283eb614db4d521f555136e7e42b4cfbee8134c63dbe3bb79b5a8b9f9f5b9f5ac61cfab1c54d197f1e3ba613f251eed6
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = f6f672ba423d82f4e86d1c7a41b4547972e859de
+
+COUNT = 40
+b = 480
+XKey = 28c1adb2742ac3b9c15d22f737ac5ffd34d0e5d79ee6ea3677b7a2cfb13cb2fe4462e7af7f0a287e9b54a91d961d62f63fc6c0128d379a3a3424665c
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 4596045105a7e36296b9ad7353723ba306353004
+
+COUNT = 41
+b = 488
+XKey = 195adc728e0ec4f0b210b57658b448860e219231ad9d56812e0b7815bfb1b50b163f9223060d922050a5ac72bb81fc136716b9af5e1167076ce04e9731
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 3e573f2a097c3568c9cf52f20eb141e63f9f776e
+
+COUNT = 42
+b = 496
+XKey = 866db552cf4745908fdf35d4c0967428d56039b1f223df315c61f2d12f178a1e4fe5d751a06efed37a022300577bc72ccf6455e3c761f775e5caaeb2479a
+XSeed = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 0077207b39f67aa80cb2ea90818440d4e5ccc414
+
+COUNT = 43
+b = 504
+XKey = 641846ce2ba4396a391651179231d553c9061c6619bd4545b29228b6511e8bb513d89a168bdb916d12eabc2b5eb1a109574d7caa250feb7b8e7debdf7f9a03
+XSeed = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = 2166c4e99be5dc0cdc747c7c6d27105a8e115ba5
+
+COUNT = 44
+b = 512
+XKey = 5cbb6d193c13bd62f5658ed4304774c6b1faf5b3dce432487840cabab415fb5d67640a739ca6e5414e760869708a9d7331e7e7ad7d55e035c711215406c3030d
+XSeed = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+X = a2322c754fe789af3afae00b9fbbbd613076ea9f
+