Prechádzať zdrojové kódy

added libtomcrypt-0.92

Tom St Denis 22 rokov pred
rodič
commit
033cec5f75
66 zmenil súbory, kde vykonal 8842 pridanie a 1133 odobranie
  1. 38 7
      aes.c
  2. 18 24
      blowfish.c
  3. 49 11
      cast5.c
  4. 56 0
      changes
  5. 10 5
      config.pl
  6. 15 6
      crypt.c
  7. 27 20
      crypt.out
  8. BIN
      crypt.pdf
  9. 266 8
      crypt.tex
  10. 4 4
      demos/encrypt.c
  11. 1 0
      demos/hashsum.c
  12. 107 2
      demos/test.c
  13. 125 3
      demos/tv_gen.c
  14. 78 12
      demos/x86_prof.c
  15. 11 5
      des.c
  16. 26 25
      dh.c
  17. 32 30
      dh_sys.c
  18. 498 0
      dsa.c
  19. 49 49
      ecc.c
  20. 3 8
      ecc_sys.c
  21. 4 1
      hash.c
  22. 22 15
      hmac.c
  23. 9 7
      makefile
  24. 32 0
      makefile.cygwin_dll
  25. 3 2
      makefile.msvc
  26. 5 1
      makefile.out
  27. 14 4
      md2.c
  28. 18 32
      md4.c
  29. 17 30
      md5.c
  30. 164 194
      mpi.c
  31. 2 2
      mycrypt.h
  32. 1 7
      mycrypt_cfg.h
  33. 18 0
      mycrypt_cipher.h
  34. 4 1
      mycrypt_custom.h
  35. 102 33
      mycrypt_hash.h
  36. 1 2
      mycrypt_misc.h
  37. 26 0
      mycrypt_pk.h
  38. 101 40
      noekeon.c
  39. 1755 0
      notes/cipher_tv.txt
  40. 1605 0
      notes/hash_tv.txt
  41. 1605 0
      notes/hmac_tv.txt
  42. 407 0
      notes/omac_tv.txt
  43. 15 9
      notes/tech0003.txt
  44. 244 0
      omac.c
  45. 32 40
      prime.c
  46. 13 7
      rc2.c
  47. 12 6
      rc5.c
  48. 11 5
      rc6.c
  49. 17 30
      rmd128.c
  50. 17 30
      rmd160.c
  51. 12 5
      rsa.c
  52. 12 5
      safer+.c
  53. 14 2
      safer.c
  54. 19 34
      sha1.c
  55. 82 0
      sha224.c
  56. 38 44
      sha256.c
  57. 7 9
      sha384.c
  58. 16 29
      sha512.c
  59. 279 0
      skipjack.c
  60. 22 0
      strings.c
  61. 15 28
      tiger.c
  62. 50 5
      tommath.h
  63. 85 240
      twofish.c
  64. 477 0
      twofish_tab.c
  65. 7 1
      xtea.c
  66. 18 14
      yarrow.c

+ 38 - 7
aes.c

@@ -47,7 +47,7 @@ const struct _cipher_descriptor aes_desc =
 
 int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_key *skey)
 {
-    int i = 0, j;
+    int i, j;
     ulong32 temp, *rk, *rrk;
     
     _ARGCHK(key != NULL);
@@ -64,6 +64,7 @@ int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_k
     skey->rijndael.Nr = 10 + ((keylen/8)-2)*2;
         
     /* setup the forward key */
+    i                 = 0;
     rk                = skey->rijndael.eK;
     LOAD32H(rk[0], key     );
     LOAD32H(rk[1], key +  4);
@@ -83,7 +84,7 @@ int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_k
             rk[6] = rk[2] ^ rk[5];
             rk[7] = rk[3] ^ rk[6];
             if (++i == 10) {
-                break;
+               break;
             }
             rk += 4;
         }
@@ -233,7 +234,11 @@ int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_k
     return CRYPT_OK;   
 }
 
-void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 
+#ifdef CLEAN_STACK
+static void _rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 
+#else
+void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)
+#endif
 {
     ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk;
     int Nr, r;
@@ -259,8 +264,6 @@ void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_
      */
     r = Nr >> 1;
     for (;;) {
-
-/* Both of these blocks are equivalent except the top is more friendlier for x86 processors */
         t0 =
             Te0[byte(s0, 3)] ^
             Te1[byte(s1, 2)] ^
@@ -350,7 +353,20 @@ void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_
     STORE32H(s3, ct+12);
 }
 
-void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) {
+#ifdef CLEAN_STACK
+void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 
+{
+   _rijndael_ecb_encrypt(pt, ct, skey);
+   burn_stack(sizeof(unsigned long)*8 + sizeof(unsigned long*) + sizeof(int)*2);
+}
+#endif
+
+#ifdef CLEAN_STACK
+static void _rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) 
+#else
+void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey)
+#endif
+{
     ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk;
     int Nr, r;
 
@@ -467,6 +483,15 @@ void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_
     STORE32H(s3, pt+12);
 }
 
+
+#ifdef CLEAN_STACK
+void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) 
+{
+   _rijndael_ecb_decrypt(ct, pt, skey);
+   burn_stack(sizeof(unsigned long)*8 + sizeof(unsigned long*) + sizeof(int)*2);
+}
+#endif
+
 int rijndael_test(void)
 {
  #ifndef LTC_TEST
@@ -508,7 +533,7 @@ int rijndael_test(void)
  
  symmetric_key key;
  unsigned char tmp[2][16];
- int i;
+ int i, y;
  
  for (i = 0; i < (int)(sizeof(tests)/sizeof(tests[0])); i++) {
     zeromem(&key, sizeof(key));
@@ -537,6 +562,12 @@ int rijndael_test(void)
 #endif       
         return CRYPT_FAIL_TESTVECTOR;
     }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 16; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) rijndael_ecb_encrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 1000; y++) rijndael_ecb_decrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 16; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
  }       
  return CRYPT_OK;
  #endif

+ 18 - 24
blowfish.c

@@ -304,7 +304,10 @@ int blowfish_setup(const unsigned char *key, int keylen, int num_rounds,
    for (x = y = 0; x < 18; x++) {
        A = 0;
        for (z = 0; z < 4; z++) {
-           A = (A << 8) | ((ulong32)key[y++ % keylen]);
+           A = (A << 8) | ((ulong32)key[y++] & 255);
+           if (y == (ulong32)keylen) { 
+              y = 0; 
+           }
        }
        skey->blowfish.K[x] = ORIG_P[x] ^ A;
    }
@@ -347,13 +350,6 @@ int blowfish_setup(const unsigned char *key, int keylen, int num_rounds,
    return CRYPT_OK;
 }
 
-#if defined(__GNUC__)
-   #define S1 key->blowfish.S[0]
-   #define S2 key->blowfish.S[1]
-   #define S3 key->blowfish.S[2]
-   #define S4 key->blowfish.S[3]
-#endif   
-
 #define F(x) ((S1[byte(x,3)] + S2[byte(x,2)]) ^ S3[byte(x,1)]) + S4[byte(x,0)]
 
 #ifdef CLEAN_STACK
@@ -364,20 +360,16 @@ void blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_
 {
    ulong32 L, R;
    int r;
-#if !defined(TWOFISH_SMALL) && !defined(__GNUC__)
-    ulong32 *S1, *S2, *S3, *S4;
-#endif    
+   ulong32 *S1, *S2, *S3, *S4;
 
     _ARGCHK(pt != NULL);
     _ARGCHK(ct != NULL);
     _ARGCHK(key != NULL);
-    
-#if !defined(TWOFISH_SMALL) && !defined(__GNUC__)
+
     S1 = key->blowfish.S[0];
     S2 = key->blowfish.S[1];
     S3 = key->blowfish.S[2];
     S4 = key->blowfish.S[3];
-#endif    
 
    /* load it */
    LOAD32H(L, &pt[0]);
@@ -416,20 +408,16 @@ void blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_
 {
    ulong32 L, R;
    int r;
-#if !defined(TWOFISH_SMALL) && !defined(__GNUC__)
-    ulong32 *S1, *S2, *S3, *S4;
-#endif    
+   ulong32 *S1, *S2, *S3, *S4;
 
     _ARGCHK(pt != NULL);
     _ARGCHK(ct != NULL);
     _ARGCHK(key != NULL);
     
-#if !defined(TWOFISH_SMALL) && !defined(__GNUC__)
     S1 = key->blowfish.S[0];
     S2 = key->blowfish.S[1];
     S3 = key->blowfish.S[2];
     S4 = key->blowfish.S[3];
-#endif  
 
    /* load it */
    LOAD32H(R, &ct[0]);
@@ -487,8 +475,8 @@ int blowfish_test(void)
            { 0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2}
        }
    };
-   unsigned char buf[2][8];
-   int x;
+   unsigned char tmp[2][8];
+   int x, y;
 
    for (x = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) {
       /* setup key */
@@ -497,13 +485,19 @@ int blowfish_test(void)
       }
 
       /* encrypt and decrypt */
-      blowfish_ecb_encrypt(tests[x].pt, buf[0], &key);
-      blowfish_ecb_decrypt(buf[0], buf[1], &key);
+      blowfish_ecb_encrypt(tests[x].pt, tmp[0], &key);
+      blowfish_ecb_decrypt(tmp[0], tmp[1], &key);
 
       /* compare */
-      if ((memcmp(buf[0], tests[x].ct, 8) != 0) || (memcmp(buf[1], tests[x].pt, 8) != 0)) {
+      if ((memcmp(tmp[0], tests[x].ct, 8) != 0) || (memcmp(tmp[1], tests[x].pt, 8) != 0)) {
          return CRYPT_FAIL_TESTVECTOR;
       }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 8; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) blowfish_ecb_encrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 1000; y++) blowfish_ecb_decrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 8; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
    }
    return CRYPT_OK;
  #endif

+ 49 - 11
cast5.c

@@ -381,7 +381,11 @@ static const ulong32 S8[256] = {
    #define GB(x, i) (((x[(15-i)>>2])>>(unsigned)(8*((15-i)&3)))&255)
 #endif   
 
+#ifdef CLEAN_STACK
+static int _cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
+#else
 int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
+#endif
 {
    ulong32 x[4], z[4];
    unsigned char buf[16];
@@ -431,7 +435,6 @@ int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_
         skey->cast5.K[i++] = S5[GB(x, 0x5)] ^ S6[GB(x, 0x4)] ^ S7[GB(x, 0xa)] ^ S8[GB(x, 0xb)] ^ S8[GB(x, 0x7)];
 
         /* second half */
-
         z[3] = x[3] ^ S5[GB(x, 0xD)] ^ S6[GB(x, 0xF)] ^ S7[GB(x, 0xC)] ^ S8[GB(x, 0xE)] ^ S7[GB(x, 0x8)];
         z[2] = x[1] ^ S5[GB(z, 0x0)] ^ S6[GB(z, 0x2)] ^ S7[GB(z, 0x1)] ^ S8[GB(z, 0x3)] ^ S8[GB(x, 0xA)];
         z[1] = x[0] ^ S5[GB(z, 0x7)] ^ S6[GB(z, 0x6)] ^ S7[GB(z, 0x5)] ^ S8[GB(z, 0x4)] ^ S5[GB(x, 0x9)];
@@ -462,6 +465,16 @@ int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_
    return CRYPT_OK;
 }
 
+#ifdef CLEAN_STACK
+int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
+{
+   int z;
+   z = _cast5_setup(key, keylen, num_rounds, skey);
+   burn_stack(sizeof(ulong32)*8 + 16 + sizeof(int)*2);
+   return z;
+}
+#endif
+
 #ifdef _MSC_VER
    #define INLINE __inline
 #else
@@ -492,7 +505,11 @@ INLINE static ulong32 FIII(ulong32 R, ulong32 Km, ulong32 Kr)
    return ((S1[byte(I, 3)] + S2[byte(I,2)]) ^ S3[byte(I,1)]) - S4[byte(I,0)];
 }
 
+#ifdef CLEAN_STACK
+static void _cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key)
+#else
 void cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key)
+#endif
 {
    ulong32 R, L;
 
@@ -502,7 +519,6 @@ void cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key
 
    LOAD32H(L,&pt[0]); 
    LOAD32H(R,&pt[4]);
-
    L ^= FI(R, key->cast5.K[0], key->cast5.K[16]);
    R ^= FII(L, key->cast5.K[1], key->cast5.K[17]);
    L ^= FIII(R, key->cast5.K[2], key->cast5.K[18]);
@@ -525,7 +541,20 @@ void cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key
    STORE32H(L,&ct[4]);
 }
 
+
+#ifdef CLEAN_STACK
+void cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key)
+{
+   _cast5_ecb_encrypt(pt,ct,key);
+   burn_stack(sizeof(ulong32)*3);
+}
+#endif
+
+#ifdef CLEAN_STACK
+static void _cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key)
+#else
 void cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key)
+#endif
 {
    ulong32 R, L;
 
@@ -535,14 +564,12 @@ void cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key
 
    LOAD32H(R,&ct[0]); 
    LOAD32H(L,&ct[4]);
-
    if (key->cast5.keylen > 10) {
       R ^= FI(L, key->cast5.K[15], key->cast5.K[31]);
       L ^= FIII(R, key->cast5.K[14], key->cast5.K[30]);
       R ^= FII(L, key->cast5.K[13], key->cast5.K[29]);
       L ^= FI(R, key->cast5.K[12], key->cast5.K[28]);
    }
-
    R ^= FIII(L, key->cast5.K[11], key->cast5.K[27]);
    L ^= FII(R, key->cast5.K[10], key->cast5.K[26]);
    R ^= FI(L, key->cast5.K[9], key->cast5.K[25]);
@@ -555,11 +582,18 @@ void cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key
    L ^= FIII(R, key->cast5.K[2], key->cast5.K[18]);
    R ^= FII(L, key->cast5.K[1], key->cast5.K[17]);
    L ^= FI(R, key->cast5.K[0], key->cast5.K[16]);
-
    STORE32H(L,&pt[0]);
    STORE32H(R,&pt[4]);
 }
 
+#ifdef CLEAN_STACK
+void cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key)
+{
+   _cast5_ecb_decrypt(ct,pt,key);
+   burn_stack(sizeof(ulong32)*3);
+}
+#endif
+
 int cast5_test(void)
 {
  #ifndef LTC_TEST
@@ -587,19 +621,24 @@ int cast5_test(void)
        {0x7A, 0xC8, 0x16, 0xD1, 0x6E, 0x9B, 0x30, 0x2E}
      }
    };
-   int i, err;
+   int i, y, err;
    symmetric_key key;
-   unsigned char buf[8], buf2[8];
+   unsigned char tmp[2][8];
 
    for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
        if ((err = cast5_setup(tests[i].key, tests[i].keylen, 0, &key)) != CRYPT_OK) {
           return err;
        }
-       cast5_ecb_encrypt(tests[i].pt, buf, &key);
-       cast5_ecb_decrypt(buf, buf2, &key);
-       if ((memcmp(buf, tests[i].ct, 8) != 0) || (memcmp(buf2, tests[i].pt, 8) != 0)) {
+       cast5_ecb_encrypt(tests[i].pt, tmp[0], &key);
+       cast5_ecb_decrypt(tmp[0], tmp[1], &key);
+       if ((memcmp(tmp[0], tests[i].ct, 8) != 0) || (memcmp(tmp[1], tests[i].pt, 8) != 0)) {
           return CRYPT_FAIL_TESTVECTOR;
        }
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 8; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) cast5_ecb_encrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 1000; y++) cast5_ecb_decrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 8; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
    
    }
    return CRYPT_OK;
@@ -618,4 +657,3 @@ int cast5_keysize(int *desired_keysize)
 } 
 
 #endif
-

+ 56 - 0
changes

@@ -1,3 +1,59 @@
+Dec 24th, 2003
+v0.92  -- Updated the config.pl script so the options have more details.
+       -- Updated demos/tv_gen to include RIPEMD hashes
+       -- Updated Twofish so when TWOFISH_ALL_TABLES is defined a pre-computed RS table
+          is included [speedup: slight, about 4k cycles on my Athlon].
+       -- Re-wrote the twofish large key generation [the four 8x32 key dependent tables].  Now about twice as fast.
+          With both optimizations [e.g. TWOFISH_ALL_TABLES defined] a 128-bit Twofish key can now be scheduled
+          in 26,000 cycles on my Athlon XP [as opposed to 49,000 before] when optimized for size.
+       -- config.pl has been updated so rmd128.o and rmd160.o are objects included in the build [oops]
+       -- Andrew Mann found a bug in rsa_exptmod() which wouldn't indicate if the wrong type of key was specified
+          (e.g. not PK_PRIVATE or PK_PUBLIC)
+       -- Fixed up demos/x86_prof so it sorts the output now :-)  
+       -- The project is now powered by radioactive rubber pants.
+       -- Fixed dh_encrypt_key() so if you pass it a hash with a smaller output than the input key it 
+          will return CRYPT_INVALID_HASH [to match what ecc_encrypt_key() will do]
+       -- Merge the store/encrypt key part of ecc_encrypt_key() as per dh_encrypt_key() [can you guess what I'm upto?]
+       -- Massive updates to the prime generation code.  I use the LTM random prime functions [and provide a nice 
+          interface between the LTC PRNG's and the LTM generic prng prototype].  I also use a variable number of tests
+          depending on the input size.  This nicely speeds up most prime generation/testing within the library.
+       -- Added SHA-224 to the list of hashes.
+       -- Made HMAC test vectors constant and static [takes ROM space instead of RAM]
+       -- This release was brought to you by the letter P which stands for Patent Infringement.
+       -- Added generic HASH_PROCESS macro to mycrypt_hash.h which simplifies the hash "process" functions
+          I also optimized the compression functions of all but MD2 to not perform input copies when avoidable.
+       -- Removed the division from the Blowfish setup function [dropped 3k cycles on my Athlon]
+       -- Added stack cleaning to rijndael, cast5 so now all ciphers have CLEAN_STACK code.  
+       -- Added Skipjack to the list of ciphers [made appropriate changes to demos/test.c, demos/tv_gen.c and 
+          demos/x86_prof.c]
+       -- Added mechanical testing to cipher test vector routines.  Now it encrypts 1000 times, then decrypts and
+          compares.  Any fault (e.g. bug in code, compiler) in the routines is likely to show through.  Doesn't
+          stress test the key gen though...
+       -- Matt Johnson found a bug in the blowfish.c  apparently I was out of my mind and put twofish defines in there 
+          The code now builds with any config.  Thanks.
+       -- Added OMAC1 Message Authentication Code support to the library.
+       -- Re-prototyped the hash "process" and "done" to prevent buffer overflows [which don't seem easy to exploit].  
+          Updated HMAC code to use them too.  Hazaa!
+       -- Fixed bug in ECC code which wouldn't do an _ARGCHK on stat in ecc_verify_hash().
+       -- Fixed [temp fix] bug in all PK where the OUTPUT_BIGNUM macros would not trap errors on the to_unsigned_bin 
+          conversion [now returns CRYPT_MEM, will fix it up better later]
+       -- Added DSA to the list of supported PK algorithms.  
+       -- Fixed up various ciphers to &255 the input key bytes where required [e.g. where used to index a table] to prevent
+          problems on platforms where CHAR_BIT != 8 
+       -- Merged in LibTomMath v0.28
+       -- Updated demos/x86_prof.c to use Yarrow during the key sched testing [was horribly slow on platforms with blockable
+          /dev/random]. 
+       -- Added OMAC/HMAC tests to demos/tv_gen and I now store the output of this in notes/ 
+       -- Fixed a bug in config.pl that wouldn't have TWOFISH_TABLES defined by default (too many commas on the line)
+       -- Fixed bug in hmac_done().  Apparently FIPS-198 [HMAC] specifies that the output can be truncated.  My code
+          would not support that (does now just like the new OMAC code).
+       -- Removed "hashsize" from hmac_state as it wasn't being used.
+       -- Made demos/test.c stop if OMAC or HMAC tests fail (instead of just printing a failed message and keep going).
+       -- Updated notes/tech0003.txt to take into account the existence of Skipjack [also I fixed a few typos].
+       -- Slight changes to Noekeon, with SMALL_CODE undefined it uses a fully unrolled version.  Dropped +10 cycles/byte
+          on my Athlon (35 cycles per byte or 410.4Mbit/sec at 1795Mhz)
+       -- Added _ARGCHK() calls to is_prime() for the two input pointers.
+
 Sept 25th, 2003
 v0.91  -- HMAC fix of 0.90 was incorrect for keys larger than the block size of the hash.
        -- Added error CRYPT_FILE_NOTFOUND for the file [hmac/hash] routines.

+ 10 - 5
config.pl

@@ -34,12 +34,14 @@
    "SAFER,Include Safer-64 block ciphers,y",
    "RIJNDAEL,Include Rijndael (AES) block cipher,y",
    "XTEA,Include XTEA block cipher,y",
-   "TWOFISH,Include Twofish block cipher,y",
-   "TWOFISH_SMALL,Include Use a low ram variant of Twofish,n",
-   "TWOFISH_TABLES,Include Use precomputed tables to speed up the low-ram variant,y",
+   "TWOFISH,Include Twofish block cipher (default: fast),y",
+   "TWOFISH_SMALL,Use a low ram variant of Twofish (slow cipher+keyschedule!),n",
+   "TWOFISH_TABLES,Use precomputed tables (fast cipher and faster keychedule but adds ~3.3KB to the size),y",
+   "TWOFISH_ALL_TABLES,Speed up the key schedule a little (adds ~8KB ontop of TWOFISH_TABLES to the size),n",
    "DES,Include DES and 3DES block ciphers,y",
    "CAST5,Include CAST5 (aka CAST-128) block cipher,y",
    "NOEKEON,Include Noekeon block cipher,y",
+   "SKIPJACK,Include Skipjack block cipher,y",
 
    "CFB,Include CFB block mode of operation,y",
    "OFB,Include OFB block mode of operation,y",
@@ -50,6 +52,7 @@
    "SHA512,Include SHA512 one-way hash,y",
    "SHA384,Include SHA384 one-way hash (requires SHA512),y",
    "SHA256,Include SHA256 one-way hash,y",
+   "SHA224,Include SHA224 one-way hash (requires SHA256),y",
    "TIGER,Include TIGER one-way hash,y",
    "SHA1,Include SHA1 one-way hash,y",
    "MD5,Include MD5 one-way hash,y",
@@ -58,6 +61,7 @@
    "RIPEMD128,Include RIPEMD-128 one-way hash,y",
    "RIPEMD160,Include RIPEMD-160 one-way hash,y",
    "HMAC,Include Hash based Message Authentication Support,y",
+   "OMAC,Include OMAC1 Message Authentication Support,y",
 
    "BASE64,Include Base64 encoding support,y",
 
@@ -68,6 +72,7 @@
    "TRY_URANDOM_FIRST,Try /dev/urandom before /dev/random?,n",
 
    "MRSA,Include RSA public key support,y",
+   "MDSA,Include DSA public key support,y",
    "MDH,Include Diffie-Hellman (over Z/pZ) public key support,y",
    "MECC,Include Eliptic Curve public key crypto support,y",
    "KR,Include Keyring support (groups all three PK systems),n",
@@ -146,10 +151,10 @@ for (@settings) {
 
 # output objects
 print OUT "\ndefault: library\n\n";
-print OUT "OBJECTS = keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o des.o safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o mpi.o prime.o twofish.o packet.o hmac.o strings.o \n\n";
+print OUT "OBJECTS = keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o des.o safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o mpi.o prime.o twofish.o packet.o hmac.o strings.o rmd128.o rmd160.o skipjack.o omac.o dsa.o\n\n";
 
 # some depends
-print OUT "rsa.o: rsa_sys.c\ndh.o: dh_sys.c\necc.o: ecc_sys.c\n\n";
+print OUT "rsa.o: rsa_sys.c\ndh.o: dh_sys.c\necc.o: ecc_sys.c\naes.o: aes.c aes_tab.c\ntwofish.o: twofish.c twofish_tab.c\nsha512.o: sha384.c sha512.c\nsha256.o: sha256.c sha224.c\n\n";
 
 # targets
 print OUT "library: \$(OBJECTS)\n\t \$(AR) r libtomcrypt.a \$(OBJECTS)\n\t ranlib libtomcrypt.a\n\n";

+ 15 - 6
crypt.c

@@ -110,10 +110,10 @@ struct _prng_descriptor prng_descriptor[TAB_SIZE] = {
 void crypt_argchk(char *v, char *s, int d)
 {
 #ifdef SONY_PS2
- printf("_ARGCHK '%s' failure on line %d of file %s\n", 
+ printf("_ARGCHK '%s' failure on line %d of file %s\n",
          v, d, s);
-#else 
- fprintf(stderr, "_ARGCHK '%s' failure on line %d of file %s\n", 
+#else
+ fprintf(stderr, "_ARGCHK '%s' failure on line %d of file %s\n",
          v, d, s);
 #endif
  (void)raise(SIGABRT);
@@ -345,7 +345,7 @@ int prng_is_valid(int idx)
    return CRYPT_OK;
 }
 
-const char *crypt_build_settings = 
+const char *crypt_build_settings =
    "LibTomCrypt " SCRYPT "\n\n"
    "Endianess: "
 #if defined(ENDIAN_NEUTRAL)
@@ -400,7 +400,7 @@ const char *crypt_build_settings =
    "   Twofish "
    #if defined(TWOFISH_SMALL) && defined(TWOFISH_TABLES)
        "(small, tables)\n"
-   #elif defined(TWOFISH_SMALL) 
+   #elif defined(TWOFISH_SMALL)
        "(small)\n"
    #elif defined(TWOFISH_TABLES)
        "(tables)\n"
@@ -417,6 +417,9 @@ const char *crypt_build_settings =
 #if defined(NOEKEON)
    "   Noekeon\n"
 #endif
+#if defined(SKIPJACK)
+   "   Skipjack\n"
+#endif
 
     "\nHashes built-in:\n"
 #if defined(SHA512)
@@ -428,6 +431,9 @@ const char *crypt_build_settings =
 #if defined(SHA256)
    "   SHA-256\n"
 #endif
+#if defined(SHA224)
+   "   SHA-224\n"
+#endif
 #if defined(TIGER)
    "   TIGER\n"
 #endif
@@ -446,6 +452,9 @@ const char *crypt_build_settings =
 #if defined(RIPEMD128)
    "   RIPEMD128\n"
 #endif
+#if defined(RIPEMD160)
+   "   RIPEMD160\n"
+#endif
 
     "\nBlock Chaining Modes:\n"
 #if defined(CFB)
@@ -524,7 +533,7 @@ const char *crypt_build_settings =
 #endif
 #if defined(LTC_TEST)
     " LTC_TEST "
-#endif    
+#endif
     "\n"
 
     "\n\n\n"

+ 27 - 20
crypt.out

@@ -29,6 +29,7 @@
 \BOOKMARK [1][-]{section.4.2}{Hash Descriptors}{chapter.4}
 \BOOKMARK [2][-]{subsection.4.2.1}{Notice}{section.4.2}
 \BOOKMARK [1][-]{section.4.3}{Hash based Message Authenication Codes}{chapter.4}
+\BOOKMARK [1][-]{section.4.4}{OMAC Support}{chapter.4}
 \BOOKMARK [0][-]{chapter.5}{Pseudo-Random Number Generators}{}
 \BOOKMARK [1][-]{section.5.1}{Core Functions}{chapter.5}
 \BOOKMARK [2][-]{subsection.5.1.1}{Remarks}{section.5.1}
@@ -53,24 +54,30 @@
 \BOOKMARK [1][-]{section.8.2}{Core Functions}{chapter.8}
 \BOOKMARK [1][-]{section.8.3}{ECC Packet}{chapter.8}
 \BOOKMARK [1][-]{section.8.4}{ECC Keysizes}{chapter.8}
-\BOOKMARK [0][-]{chapter.9}{Public Keyrings}{}
+\BOOKMARK [0][-]{chapter.9}{Digital Signature Algorithm}{}
 \BOOKMARK [1][-]{section.9.1}{Introduction}{chapter.9}
-\BOOKMARK [1][-]{section.9.2}{The Keyring API}{chapter.9}
-\BOOKMARK [0][-]{chapter.10}{GF\(2w\) Math Routines}{}
-\BOOKMARK [0][-]{chapter.11}{Miscellaneous}{}
-\BOOKMARK [1][-]{section.11.1}{Base64 Encoding and Decoding}{chapter.11}
-\BOOKMARK [1][-]{section.11.2}{The Multiple Precision Integer Library \(MPI\)}{chapter.11}
-\BOOKMARK [2][-]{subsection.11.2.1}{Binary Forms of ``mp\137int'' Variables}{section.11.2}
-\BOOKMARK [2][-]{subsection.11.2.2}{Primality Testing}{section.11.2}
-\BOOKMARK [0][-]{chapter.12}{Programming Guidelines}{}
-\BOOKMARK [1][-]{section.12.1}{Secure Pseudo Random Number Generators}{chapter.12}
-\BOOKMARK [1][-]{section.12.2}{Preventing Trivial Errors}{chapter.12}
-\BOOKMARK [1][-]{section.12.3}{Registering Your Algorithms}{chapter.12}
-\BOOKMARK [1][-]{section.12.4}{Key Sizes}{chapter.12}
-\BOOKMARK [2][-]{subsection.12.4.1}{Symmetric Ciphers}{section.12.4}
-\BOOKMARK [2][-]{subsection.12.4.2}{Assymetric Ciphers}{section.12.4}
-\BOOKMARK [1][-]{section.12.5}{Thread Safety}{chapter.12}
-\BOOKMARK [0][-]{chapter.13}{Configuring the Library}{}
-\BOOKMARK [1][-]{section.13.1}{Introduction}{chapter.13}
-\BOOKMARK [1][-]{section.13.2}{mycrypt\137cfg.h}{chapter.13}
-\BOOKMARK [1][-]{section.13.3}{The Configure Script}{chapter.13}
+\BOOKMARK [1][-]{section.9.2}{Key Generation}{chapter.9}
+\BOOKMARK [1][-]{section.9.3}{Key Verification}{chapter.9}
+\BOOKMARK [1][-]{section.9.4}{Signatures}{chapter.9}
+\BOOKMARK [1][-]{section.9.5}{Import and Export}{chapter.9}
+\BOOKMARK [0][-]{chapter.10}{Public Keyrings}{}
+\BOOKMARK [1][-]{section.10.1}{Introduction}{chapter.10}
+\BOOKMARK [1][-]{section.10.2}{The Keyring API}{chapter.10}
+\BOOKMARK [0][-]{chapter.11}{GF\(2w\) Math Routines}{}
+\BOOKMARK [0][-]{chapter.12}{Miscellaneous}{}
+\BOOKMARK [1][-]{section.12.1}{Base64 Encoding and Decoding}{chapter.12}
+\BOOKMARK [1][-]{section.12.2}{The Multiple Precision Integer Library \(MPI\)}{chapter.12}
+\BOOKMARK [2][-]{subsection.12.2.1}{Binary Forms of ``mp\137int'' Variables}{section.12.2}
+\BOOKMARK [2][-]{subsection.12.2.2}{Primality Testing}{section.12.2}
+\BOOKMARK [0][-]{chapter.13}{Programming Guidelines}{}
+\BOOKMARK [1][-]{section.13.1}{Secure Pseudo Random Number Generators}{chapter.13}
+\BOOKMARK [1][-]{section.13.2}{Preventing Trivial Errors}{chapter.13}
+\BOOKMARK [1][-]{section.13.3}{Registering Your Algorithms}{chapter.13}
+\BOOKMARK [1][-]{section.13.4}{Key Sizes}{chapter.13}
+\BOOKMARK [2][-]{subsection.13.4.1}{Symmetric Ciphers}{section.13.4}
+\BOOKMARK [2][-]{subsection.13.4.2}{Assymetric Ciphers}{section.13.4}
+\BOOKMARK [1][-]{section.13.5}{Thread Safety}{chapter.13}
+\BOOKMARK [0][-]{chapter.14}{Configuring the Library}{}
+\BOOKMARK [1][-]{section.14.1}{Introduction}{chapter.14}
+\BOOKMARK [1][-]{section.14.2}{mycrypt\137cfg.h}{chapter.14}
+\BOOKMARK [1][-]{section.14.3}{The Configure Script}{chapter.14}

BIN
crypt.pdf


+ 266 - 8
crypt.tex

@@ -1,4 +1,4 @@
-\documentclass{book}
+\documentclass[b5paper]{book}
 \usepackage{hyperref}
 \usepackage{makeidx}
 \usepackage{amssymb}
@@ -47,7 +47,7 @@
 \def\gap{\vspace{0.5ex}}
 \makeindex
 \begin{document}
-\title{A Tiny Crypto Library, \\ LibTomCrypt \\ Version 0.91}
+\title{A Tiny Crypto Library, \\ LibTomCrypt \\ Version 0.92}
 \author{Tom St Denis \\
 Algonquin College \\
 \\
@@ -60,6 +60,19 @@ K2L 1C3 \\
 Canada
 }
 \maketitle
+This text and source code library are both hereby placed in the public domain.  This book has been 
+formatted for B5 [176x250] paper using the \LaTeX{} {\em book} macro package.
+
+\vspace{10cm}
+
+\begin{flushright}Open Source.  Open Academia.  Open Minds.
+
+\mbox{ }
+
+Tom St Denis,
+
+Ontario, Canada
+\end{flushright}
 \newpage
 \tableofcontents
 \chapter{Introduction}
@@ -492,7 +505,7 @@ As of this release the current cipher\_descriptors elements are
 \begin{small}
 \begin{center}
 \begin{tabular}{|c|c|c|c|c|c|}
-     \hline Name & Descriptor Name & Block Size (bytes) & Key Range (bytes) & Rounds \\
+     \hline Name & Descriptor Name & Block Size & Key Range & Rounds \\
      \hline Blowfish & blowfish\_desc & 8 & 8 ... 56 & 16 \\
      \hline X-Tea & xtea\_desc & 8 & 16 & 32 \\
      \hline RC2 & rc2\_desc & 8 & 8 .. 128 & 16 \\
@@ -509,6 +522,7 @@ As of this release the current cipher\_descriptors elements are
      \hline 3DES (EDE mode) & des3\_desc & 8 & 21 & 16 \\
      \hline CAST5 (CAST-128) & cast5\_desc & 8 & 5 .. 16 & 12, 16 \\
      \hline Noekeon & noekeon\_desc & 16 & 16 & 16 \\
+     \hline Skipjack & skipjack\_desc & 8 & 10 & 32 \\
      \hline
 \end{tabular}
 \end{center}
@@ -783,7 +797,7 @@ void XXX_init(hash_state *md);
 This simply sets up the hash to the default state governed by the specifications of the hash.  To add data to the 
 message being hashed call:
 \begin{verbatim}
-void XXX_process(hash_state *md, const unsigned char *in, unsigned long len);
+int XXX_process(hash_state *md, const unsigned char *in, unsigned long len);
 \end{verbatim}
 
 Essentially all hash messages are virtually infinitely\footnote{Most hashes are limited to $2^{64}$ bits or 2,305,843,009,213,693,952 bytes.} long message which 
@@ -801,7 +815,7 @@ md5_process(&md, "hello world", 11);
 
 To finally get the message digest (the hash) call:
 \begin{verbatim}
-void XXX_done(hash_state *md, 
+int XXX_done(hash_state *md, 
               unsigned char *out);
 \end{verbatim}
 
@@ -848,8 +862,8 @@ struct _hash_descriptor {
     unsigned long hashsize;    /* digest output size in bytes  */
     unsigned long blocksize;   /* the block size the hash uses */
     void (*init)   (hash_state *);
-    void (*process)(hash_state *, const unsigned char *, unsigned long);
-    void (*done)   (hash_state *, unsigned char *);
+    int  (*process)(hash_state *, const unsigned char *, unsigned long);
+    int  (*done)   (hash_state *, unsigned char *);
     int  (*test)   (void);
 };
 \end{verbatim}
@@ -966,6 +980,7 @@ The following hashes are provided as of this release:
       \hline SHA-512 & sha512\_desc & 64 \\
       \hline SHA-384 & sha384\_desc & 48 \\
       \hline SHA-256 & sha256\_desc & 32 \\
+      \hline SHA-224 & sha224\_desc & 28 \\
       \hline TIGER-192 & tiger\_desc & 24 \\
       \hline SHA-1 & sha1\_desc & 20 \\
       \hline RIPEMD-160 & rmd160\_desc & 20 \\
@@ -1021,7 +1036,8 @@ int hmac_done(hmac_state *hmac, unsigned char *hashOut,
 \end{verbatim}
 ``hmac'' is the HMAC state you are working with.  ``hashOut'' is the array of octets where the HMAC code should be stored.  You must
 set ``outlen'' to the size of the destination buffer before calling this function.  It is updated with the length of the HMAC code
-produced (depending on which hash was picked)
+produced (depending on which hash was picked).  If ``outlen'' is less than the size of the message digest (and ultimately
+the HMAC code) then the HMAC code is truncated as per FIPS-198 specifications (e.g. take the first ``outlen'' bytes).
 
 There are two  utility functions provided to make using HMACs easier todo.  They accept the key and information about the
 message (file pointer, address in memory) and produce the HMAC result in one shot.  These are useful if you want to avoid
@@ -1099,6 +1115,118 @@ int main(void)
 \end{verbatim}
 \end{small}
 
+\section{OMAC Support}
+OMAC\footnote{\url{http://crypt.cis.ibaraki.ac.jp/omac/omac.html}}, which stands for \textit{One-Key CBC MAC} is an 
+algorithm which produces a Message Authentication Code (MAC) using only a block cipher such as AES.  From an API 
+standpoint the OMAC routines work much like the HMAC routines do.  Instead in this case a cipher is used instead of a hash.  
+
+To start an OMAC state you call
+
+\begin{verbatim}
+int omac_init(omac_state *omac, int cipher, 
+              const unsigned char *key, unsigned long keylen);
+\end{verbatim}
+The ``omac'' variable is the state for the OMAC algorithm.  ``cipher'' is the index into the cipher\_descriptor table
+of the cipher\footnote{The cipher must have a 64 or 128 bit block size.  Such as CAST5, Blowfish, DES, AES, Twofish, etc.} you
+wish to use.  ``key'' and ``keylen'' are the keys used to authenticate the data.
+
+To send data through the algorithm call
+\begin{verbatim}
+int omac_process(omac_state *state, 
+                 const unsigned char *buf, unsigned long len);
+\end{verbatim}
+This will send ``len'' bytes from ``buf'' through the active OMAC state ``state''.  Returns \textbf{CRYPT\_OK} if the 
+function succeeds.  When you are done with the message you can call
+
+\begin{verbatim}
+int omac_done(omac_state *state, 
+              unsigned char *out, unsigned long *outlen);
+\end{verbatim}
+Which will terminate the OMAC and output the \textit{tag} (MAC) to ``out''.  Note that unlike the HMAC and other code 
+``outlen'' can be smaller than the default MAC size (for instance AES would make a 16-byte tag).  Part of the OMAC 
+specification states that the output may be truncated.  So if you pass in $outlen = 5$ and use AES as your cipher than
+the output MAC code will only be five bytes long.  If ``outlen'' is larger than the default size it is set to the default
+size to show how many bytes were actually used.
+
+Similar to the HMAC code the file and memory functions are also provided.  To OMAC a buffer of memory in one shot use the 
+following function.
+
+\begin{verbatim}
+int omac_memory(int cipher, 
+                const unsigned char *key, unsigned long keylen,
+                const unsigned char *msg, unsigned long msglen,
+                unsigned char *out, unsigned long *outlen);
+\end{verbatim}
+This will compute the OMAC of ``msglen'' bytes of ``msg'' using the key ``key'' of length ``keylen'' bytes and the cipher
+specified by the ``cipher'''th entry in the cipher\_descriptor table.  It will store the MAC in ``out'' with the same
+rules as omac\_done.
+
+To OMAC a file use
+\begin{verbatim}
+int omac_file(int cipher, 
+              const unsigned char *key, unsigned long keylen,
+              const char *filename, 
+              unsigned char *out, unsigned long *outlen);
+\end{verbatim}
+
+Which will OMAC the entire contents of the file specified by ``filename'' using the key ``key'' of length ``keylen'' bytes
+and the cipher specified by the ``cipher'''th entry in the cipher\_descriptor table.  It will store the MAC in ``out'' with 
+the same rules as omac\_done.
+
+To test if the OMAC code is working there is the following function:
+\begin{verbatim}
+int omac_test(void);
+\end{verbatim}
+Which returns {\bf CRYPT\_OK} if the code passes otherwise it returns an error code.  Some example code for using the 
+OMAC system is given below.
+
+\begin{small}
+\begin{verbatim}
+#include <mycrypt.h>
+int main(void)
+{
+   int idx, errno;
+   omac_state omac;
+   unsigned char key[16], dst[MAXBLOCKSIZE];
+   unsigned long dstlen;
+
+   /* register Rijndael */
+   if (register_cipher(&rijndael_desc) == -1) {
+      printf("Error registering Rijndael\n");
+      return -1;
+   }
+
+   /* get index of Rijndael in cipher descriptor table */
+   idx = find_cipher("rijndael");
+
+   /* we would make up our symmetric key in "key[]" here */
+
+   /* start the OMAC */
+   if ((errno = omac_init(&omac, idx, key, 16)) != CRYPT_OK) {
+      printf("Error setting up omac: %s\n", error_to_string(errno));
+      return -1;
+   }
+
+   /* process a few octets */
+   if((errno = omac_process(&omac, "hello", 5) != CRYPT_OK) {
+      printf("Error processing omac: %s\n", error_to_string(errno));
+      return -1;
+   }
+
+   /* get result (presumably to use it somehow...) */
+   dstlen = sizeof(dst);
+   if ((errno = omac_done(&omac, dst, &dstlen)) != CRYPT_OK) {
+      printf("Error finishing omac: %s\n", error_to_string(errno));
+      return -1;
+   }
+   printf("The omac is %lu bytes long\n", dstlen);
+  
+   /* return */
+   return 0;
+}
+\end{verbatim}
+\end{small}
+
 \chapter{Pseudo-Random Number Generators}
 \section{Core Functions}
 
@@ -1397,6 +1525,10 @@ This loads the bignum from ``in'' as a big endian word in the format PKCS specif
 in ``out'' and the size of the result in ``outlen''. ``which'' is set to {\bf PK\_PUBLIC} to use ``e'' 
 (i.e. for encryption/verifying) and set to {\bf PK\_PRIVATE} to use ``d'' as the exponent (i.e. for decrypting/signing).
 
+Note that this function does not perform padding on the input (as per PKCS).  So if you send in ``0000001'' you will
+get ``01'' back (when you do the opposite operation).  Make sure you pad properly which usually involves setting the msb to
+a non-zero value.
+
 \section{Packet Routines}
 To encrypt or decrypt a symmetric key using RSA the following functions are provided.  The idea is that you make up
 a random symmetric key and use that to encode your message.  By RSA encrypting the symmetric key you can send it to a
@@ -1819,6 +1951,132 @@ you have 160-bits of security (e.g. as if you signed with SHA-1).
 The library will not warn you if you make this mistake so it is important to check yourself before using the 
 signatures.
 
+\chapter{Digital Signature Algorithm}
+\section{Introduction}
+The Digital Signature Algorithm (or DSA) is a variant of the ElGamal Signature scheme which has been modified to 
+reduce the bandwidth of a signature.  For example, to have ``80-bits of security'' with ElGamal you need a group of 
+order at least 1024-bits.  With DSA you need a group of order at least 160-bits.  By comparison the ElGamal signature
+would require at least 256 bytes where as the DSA signature would require only at least 40 bytes.  
+
+The API for the DSA is essentially the same as the other PK algorithms.  Except in the case of DSA no encryption or
+decryption routines are provided.  
+
+\section{Key Generation}
+To make a DSA key you must call the following function
+\begin{verbatim}
+int dsa_make_key(prng_state *prng, int wprng, 
+                 int group_size, int modulus_size, 
+                 dsa_key *key);
+\end{verbatim}
+The variable ``prng'' is an active PRNG state and ``wprng'' the index to the descriptor.  ``group\_size'' and 
+``modulus\_size'' control the difficulty of forging a signature.  Both parameters are in bytes.  The larger the
+``group\_size'' the more difficult a forgery becomes upto a limit.  The value of $group\_size$ is limited by 
+$15 < group\_size < 1024$ and $modulus\_size - group\_size < 512$.  Suggested values for the pairs are as follows.
+
+\begin{center}
+\begin{tabular}{|c|c|c|}
+\hline \textbf{Bits of Security} & \textbf{group\_size} & \textbf{modulus\_size} \\
+\hline 80  & 20 & 128 \\
+\hline 120 & 30 & 256 \\
+\hline 140 & 35 & 384 \\
+\hline 160 & 40 & 512 \\
+\hline
+\end{tabular}
+\end{center}
+
+When you are finished with a DSA key you can call the following function to free the memory used.
+\begin{verbatim}
+void dsa_free(dsa_key *key);
+\end{verbatim}
+
+\section{Key Verification}
+Each DSA key is composed of the following variables.
+
+\begin{enumerate}
+  \item $q$ a small prime of magnitude $256^{group\_size}$.  
+  \item $p = qr + 1$ a large prime of magnitude $256^{modulus\_size}$ where $r$ is a random even integer.
+  \item $g = h^r \mbox{ (mod }p\mbox{)}$ a generator of order $q$ modulo $p$.  $h$ can be any non-trivial random 
+        value.  For this library they start at $h = 2$ and step until $g$ is not $1$.
+  \item $x$ a random secret (the secret key) in the range $1 < x < q$ 
+  \item $y = g^x \mbox{ (mod }p\mbox{)}$ the public key.
+\end{enumerate}
+
+A DSA key is considered valid if it passes all of the following tests.
+
+\begin{enumerate}
+   \item $q$ must be prime.
+   \item $p$ must be prime.
+   \item $g$ cannot be one of $\lbrace -1, 0, 1 \rbrace$ (modulo $p$).
+   \item $g$ must be less than $p$.
+   \item $(p-1) \equiv 0 \mbox{ (mod }q\mbox{)}$.
+   \item $g^q \equiv 1 \mbox{ (mod }p\mbox{)}$.
+   \item $1 < y < p - 1$
+   \item $y^q \equiv 1 \mbox{ (mod }p\mbox{)}$.
+\end{enumerate}
+
+Tests one and two ensure that the values will at least form a field which is required for the signatures to  
+function.  Tests three and four ensure that the generator $g$ is not set to a trivial value which would make signature
+forgery easier.  Test five ensures that $q$ divides the order of multiplicative sub-group of $\Z/p\Z$. Test six
+ensures that the generator actually generates a prime order group.  Tests seven and eight ensure that the public key
+is within range and belongs to a group of prime order.  Note that test eight does not prove that $g$ generated $y$ only
+that $y$ belongs to a multiplicative sub-group of order $q$. 
+
+The following function will perform these tests.
+
+\begin{verbatim}
+int dsa_verify_key(dsa_key *key, int *stat);
+\end{verbatim}
+
+This will test ``key'' and store the result in ``stat''.  If the result is $stat = 0$ the DSA key failed one of the tests
+and should not be used at all.  If the result is $stat = 1$ the DSA key is valid (as far as valid mathematics are concerned).
+
+
+
+\section{Signatures}
+To generate a DSA signature call the following function
+
+\begin{verbatim}
+int dsa_sign_hash(const unsigned char *in,  unsigned long inlen,
+                        unsigned char *out, unsigned long *outlen,
+                        prng_state *prng, int wprng, dsa_key *key);
+\end{verbatim}
+
+Which will sign the data in ``in'' of length ``inlen'' bytes.  The signature is stored in ``out'' and the size
+of the signature in ``outlen''.  If the signature is longer than the size you initially specify in ``outlen'' nothing
+is stored and the function returns an error code.  The DSA ``key'' must be of the \textbf{PK\_PRIVATE} persuasion.
+
+To verify a hash created with that function use the following function
+
+\begin{verbatim}
+int dsa_verify_hash(const unsigned char *sig, unsigned long siglen,
+                    const unsigned char *hash, unsigned long inlen, 
+                    int *stat, dsa_key *key);
+\end{verbatim}
+Which will verify the data in ``hash'' of length ``inlen'' against the signature stored in ``sig'' of length ``siglen''.  
+It will set ``stat'' to $1$ if the signature is valid, otherwise it sets ``stat'' to $0$.  
+
+\section{Import and Export}
+
+To export a DSA key so that it can be transported use the following function
+\begin{verbatim}
+int dsa_export(unsigned char *out, unsigned long *outlen, 
+               int type, 
+               dsa_key *key);
+\end{verbatim}
+This will export the DSA ``key'' to the buffer ``out'' and set the length in ``outlen'' (which must have been previously
+initialized to the maximum buffer size).  The ``type`` variable may be either \textbf{PK\_PRIVATE} or \textbf{PK\_PUBLIC}
+depending on whether you want to export a private or public copy of the DSA key.
+
+To import an exported DSA key use the following function
+
+\begin{verbatim}
+int dsa_import(const unsigned char *in, unsigned long inlen, 
+               dsa_key *key);
+\end{verbatim}
+
+This will import the DSA key from the buffer ``in'' of length ``inlen'' to the ``key''.  If the process fails the function
+will automatically free all of the heap allocated in the process (you don't have to call dsa\_free()).  
+
 \chapter{Public Keyrings}
 \section{Introduction}
 In order to simplify the usage of the public key algorithms a set of keyring routines have been developed.  They let the 

+ 4 - 4
demos/encrypt.c

@@ -16,14 +16,14 @@ static const struct _cipher_descriptor *ciphers[] = {
    &saferp_desc,     &rijndael_desc,
    &twofish_desc,    &safer_k64_desc,   &safer_sk64_desc,
    &safer_k128_desc, &safer_sk128_desc, &rc2_desc,
-   &des_desc,        &des3_desc,        &cast5_desc, NULL
+   &des_desc,        &des3_desc,        &cast5_desc, &skipjack_desc, NULL
 };
 
-int usage(void) 
+int usage(char *name) 
 {
    int x;
 
-   printf("Usage: ./crypt [-d](ecrypt) cipher infile outfile\nCiphers:\n");
+   printf("Usage: ./%s [-d](ecrypt) cipher infile outfile\nCiphers:\n", name);
    for (x = 0; cipher_descriptor[x].name != NULL; x++) {
       printf("%s\n",cipher_descriptor[x].name);
    }
@@ -73,7 +73,7 @@ int main(int argc, char *argv[])
    register_algs();
 
    if (argc < 4) {
-      return usage();
+      return usage(argv[0]);
    }
 
    if (!strcmp(argv[1], "-d")) {

+ 1 - 0
demos/hashsum.c

@@ -76,4 +76,5 @@ void register_algs(void)
    register_hash(&md2_desc);
    register_hash(&rmd128_desc);
    register_hash(&rmd160_desc);
+   register_hash(&sha224_desc);
 }

+ 107 - 2
demos/test.c

@@ -932,7 +932,7 @@ dh_tests (void)
   }
 
 /* test encrypt_key */
-  dh_make_key (&prng, find_prng ("yarrow"), 96, &usera);
+  dh_make_key (&prng, find_prng ("yarrow"), 128, &usera);
   for (x = 0; x < 16; x++)
     buf[0][x] = x;
   y = sizeof (buf[1]);
@@ -1337,7 +1337,9 @@ register_all_algs (void)
 #ifdef NOEKEON
   register_cipher (&noekeon_desc);
 #endif
-
+#ifdef SKIPJACK
+  register_cipher (&skipjack_desc);
+#endif
   register_cipher (&null_desc);
 
 #ifdef TIGER
@@ -1358,6 +1360,9 @@ register_all_algs (void)
 #ifdef SHA256
   register_hash (&sha256_desc);
 #endif
+#ifdef SHA224
+  register_hash (&sha224_desc);
+#endif
 #ifdef SHA384
   register_hash (&sha384_desc);
 #endif
@@ -1712,6 +1717,97 @@ test_errs (void)
 }
 
 
+void dsa_tests(void)
+{
+   unsigned char msg[16], out[1024], out2[1024];
+   unsigned long x, y;
+   int err, stat1, stat2;
+   dsa_key key, key2;
+
+   /* make a random key */
+   if ((err = dsa_make_key(&prng, find_prng("yarrow"), 20, 128, &key)) != CRYPT_OK) {
+      printf("Error making DSA key: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   printf("DSA Key Made\n");
+
+   /* verify it */
+   if ((err = dsa_verify_key(&key, &stat1)) != CRYPT_OK) {
+      printf("Error verifying DSA key: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   printf("DSA key verification: %s\n", stat1 == 1 ? "passed" : "failed");
+   if (stat1 == 0) exit(-1);     
+
+   /* sign the message */
+   x = sizeof(out);
+   if ((err = dsa_sign_hash(msg, sizeof(msg), out, &x, &prng, find_prng("yarrow"), &key)) != CRYPT_OK) {
+      printf("Error signing with DSA key: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   printf("DSA 160/1024 signature is %lu bytes long\n", x);
+
+   /* verify it once */
+   if ((err = dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key)) != CRYPT_OK) {
+      printf("Error verifying with DSA key 1: %s\n", error_to_string(err));
+      exit(-1);
+   }
+
+   /* Modify and verify again */
+   msg[0] ^= 1;
+   if ((err = dsa_verify_hash(out, x, msg, sizeof(msg), &stat2, &key)) != CRYPT_OK) {
+      printf("Error verifying with DSA key 2: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   msg[0] ^= 1;
+   printf("DSA Verification: %d, %d, %s\n", stat1, stat2, (stat1 == 1 && stat2 == 0) ? "passed" : "failed");
+   if (!(stat1 == 1 && stat2 == 0)) exit(-1);
+
+   /* test exporting it */
+   x = sizeof(out2);
+   if ((err = dsa_export(out2, &x, PK_PRIVATE, &key)) != CRYPT_OK) {
+      printf("Error export PK_PRIVATE DSA key: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   printf("Exported PK_PRIVATE DSA key in %lu bytes\n", x);
+   if ((err = dsa_import(out2, x, &key2)) != CRYPT_OK) {
+      printf("Error importing PK_PRIVATE DSA key: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   /* verify a signature with it */
+   if ((err = dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key2)) != CRYPT_OK) {
+      printf("Error verifying with DSA key 3: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   printf("PRIVATE Import Test: %s\n", stat1 == 1 ? "passed" : "failed");
+   if (stat1 == 0) exit(-1);
+   dsa_free(&key2);
+
+   /* export as public now */
+   x = sizeof(out2);
+   if ((err = dsa_export(out2, &x, PK_PUBLIC, &key)) != CRYPT_OK) {
+      printf("Error export PK_PUBLIC DSA key: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   printf("Exported PK_PUBLIC DSA key in %lu bytes\n", x);
+   if ((err = dsa_import(out2, x, &key2)) != CRYPT_OK) {
+      printf("Error importing PK_PUBLIC DSA key: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   /* verify a signature with it */
+   if ((err = dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key2)) != CRYPT_OK) {
+      printf("Error verifying with DSA key 4: %s\n", error_to_string(err));
+      exit(-1);
+   }
+   printf("PUBLIC Import Test: %s\n", stat1 == 1 ? "passed" : "failed");
+   if (stat1 == 0) exit(-1);
+
+   dsa_free(&key2);
+   dsa_free(&key);
+}
+
+
+
 
 int
 main (void)
@@ -1735,8 +1831,15 @@ main (void)
   printf (crypt_build_settings);
   test_errs ();
 
+
 #ifdef HMAC
   printf ("HMAC: %s\n", hmac_test () == CRYPT_OK ? "passed" : "failed");
+  if (hmac_test() != CRYPT_OK) exit(EXIT_FAILURE);
+#endif
+
+#ifdef HMAC
+  printf ("OMAC: %s\n", omac_test () == CRYPT_OK ? "passed" : "failed");
+  if (omac_test() != CRYPT_OK) exit(EXIT_FAILURE);
 #endif
 
   store_tests ();
@@ -1755,11 +1858,13 @@ main (void)
 #ifdef KR
   kr_test ();
 #endif
+  dsa_tests();
   rsa_test ();
   pad_test ();
   ecc_tests ();
   dh_tests ();
 
+
   gf_tests ();
   base64_test ();
 

+ 125 - 3
demos/tv_gen.c

@@ -42,6 +42,9 @@ void reg_algs(void)
 #ifdef NOEKEON
   register_cipher (&noekeon_desc);
 #endif
+#ifdef SKIPJACK
+  register_cipher (&skipjack_desc);
+#endif
 
 #ifdef TIGER
   register_hash (&tiger_desc);
@@ -58,6 +61,9 @@ void reg_algs(void)
 #ifdef SHA1
   register_hash (&sha1_desc);
 #endif
+#ifdef SHA224
+  register_hash (&sha224_desc);
+#endif
 #ifdef SHA256
   register_hash (&sha256_desc);
 #endif
@@ -67,6 +73,12 @@ void reg_algs(void)
 #ifdef SHA512
   register_hash (&sha512_desc);
 #endif
+#ifdef RIPEMD128
+  register_hash (&rmd128_desc);
+#endif
+#ifdef RIPEMD160
+  register_hash (&rmd160_desc);
+#endif
 }
 
 void hash_gen(void)
@@ -83,7 +95,7 @@ void hash_gen(void)
       
       for (y = 0; y <= (hash_descriptor[x].blocksize * 2); y++) {
          for (z = 0; z < y; z++) {
-            buf[z] = (unsigned char)z;
+            buf[z] = (unsigned char)(z & 255);
          }
          outlen = sizeof(md);
          hash_memory(x, buf, y, md, &outlen);
@@ -108,7 +120,10 @@ void cipher_gen(void)
    
    out = fopen("cipher_tv.txt", "w");
    
-   fprintf(out, "Cipher Test Vectors\n\nThese are test encryptions with key of nn bytes '00 01 02 03 .. (nn-1)' and original PT of the same style.\n\n");
+   fprintf(out, 
+"Cipher Test Vectors\n\nThese are test encryptions with key of nn bytes '00 01 02 03 .. (nn-1)' and original PT of the same style.\n"
+"The output of step N is used as the key and plaintext for step N+1 (key bytes repeated as required to fill the key)\n\n");
+                   
    for (x = 0; cipher_descriptor[x].name != NULL; x++) {
       fprintf(out, "Cipher: %s\n", cipher_descriptor[x].name);
       
@@ -133,13 +148,19 @@ void cipher_gen(void)
          for (z = 0; (int)z < cipher_descriptor[x].block_length; z++) {
             pt[z] = (unsigned char)z;
          }
-         for (w = 0; w < 25; w++) {
+         for (w = 0; w < 50; w++) {
              cipher_descriptor[x].ecb_encrypt(pt, pt, &skey);
              fprintf(out, "%2lu: ", w);
              for (z = 0; (int)z < cipher_descriptor[x].block_length; z++) {
                 fprintf(out, "%02X", pt[z]);
              }
              fprintf(out, "\n");
+
+             /* reschedule a new key */
+             for (z = 0; z < (unsigned long)kl; z++) {
+                 key[z] = pt[z % cipher_descriptor[x].block_length];
+             }
+             cipher_descriptor[x].setup(key, kl, 0, &skey);
          }
          fprintf(out, "\n");
      }
@@ -147,13 +168,114 @@ void cipher_gen(void)
   }
   fclose(out);
 }  
+
+void hmac_gen(void)
+{
+   unsigned char key[MAXBLOCKSIZE], output[MAXBLOCKSIZE], input[MAXBLOCKSIZE*2+2];
+   int x, y, z, kl, err;
+   FILE *out;
+   unsigned long len;
+  
+   out = fopen("hmac_tv.txt", "w");
+
+   fprintf(out, 
+"HMAC Tests.  In these tests messages of N bytes long (00,01,02,...,NN-1) are HMACed.  The initial key is\n"
+"of the same format (the same length as the HASH output size).  The HMAC key in step N+1 is the HMAC output of\n"
+"step N.\n\n");
+
+   for (x = 0; hash_descriptor[x].name != NULL; x++) {
+      fprintf(out, "HMAC-%s\n", hash_descriptor[x].name);
+      
+      /* initial key */
+      for (y = 0; y < (int)hash_descriptor[x].hashsize; y++) {
+          key[y] = (y&255);
+      }
+      
+      for (y = 0; y <= (int)(hash_descriptor[x].blocksize * 2); y++) {
+         for (z = 0; z < y; z++) {
+            input[z] = (unsigned char)(z & 255);
+         }
+         len = sizeof(output);
+         if ((err = hmac_memory(x, key, hash_descriptor[x].hashsize, input, y, output, &len)) != CRYPT_OK) {
+            printf("Error hmacing: %s\n", error_to_string(err));
+            exit(EXIT_FAILURE);
+         }
+         fprintf(out, "%3d: ", y);
+         for (z = 0; z <(int) len; z++) {
+            fprintf(out, "%02X", output[z]);
+         }
+         fprintf(out, "\n");
+
+         /* forward the key */
+         memcpy(key, output, hash_descriptor[x].hashsize);
+      }
+      fprintf(out, "\n");
+   }
+   fclose(out);
+}
    
+void omac_gen(void)
+{
+   unsigned char key[MAXBLOCKSIZE], output[MAXBLOCKSIZE], input[MAXBLOCKSIZE*2+2];
+   int err, x, y, z, kl;
+   FILE *out;
+   unsigned long len;
+  
+   out = fopen("omac_tv.txt", "w");
+
+   fprintf(out, 
+"OMAC Tests.  In these tests messages of N bytes long (00,01,02,...,NN-1) are OMAC'ed.  The initial key is\n"
+"of the same format (length specified per cipher).  The OMAC key in step N+1 is the OMAC output of\n"
+"step N (repeated as required to fill the array).\n\n");
+
+   for (x = 0; cipher_descriptor[x].name != NULL; x++) {
+      kl = cipher_descriptor[x].block_length;
+
+      /* skip ciphers which do not have 64 or 128 bit block sizes */
+      if (kl != 8 && kl != 16) continue;
+
+      if (cipher_descriptor[x].keysize(&kl) != CRYPT_OK) {
+         kl = cipher_descriptor[x].max_key_length;
+      }
+      fprintf(out, "OMAC-%s (%d byte key)\n", cipher_descriptor[x].name, kl);
+      
+      /* initial key/block */
+      for (y = 0; y < kl; y++) {
+          key[y] = (y & 255);
+      }
+      
+      for (y = 0; y <= (int)(cipher_descriptor[x].block_length*2); y++) {
+         for (z = 0; z < y; z++) {
+            input[z] = (unsigned char)(z & 255);
+         }
+         len = sizeof(output);
+         if ((err = omac_memory(x, key, kl, input, y, output, &len)) != CRYPT_OK) {
+            printf("Error omacing: %s\n", error_to_string(err));
+            exit(EXIT_FAILURE);
+         }
+         fprintf(out, "%3d: ", y);
+         for (z = 0; z <(int)len; z++) {
+            fprintf(out, "%02X", output[z]);
+         }
+         fprintf(out, "\n");
+
+         /* forward the key */
+         for (z = 0; z < kl; z++) {
+             key[z] = output[z % len];
+         }
+      }
+      fprintf(out, "\n");
+   }
+   fclose(out);
+}
 
 int main(void)
 {
    reg_algs();
    hash_gen();
    cipher_gen();
+   hmac_gen();
+   omac_gen();
    
    return 0;
 }

+ 78 - 12
demos/x86_prof.c

@@ -3,6 +3,51 @@
 #define KTIMES  25
 #define TIMES   100000
 
+struct list {
+    int id;
+    unsigned long spd1, spd2, avg;
+} results[100];
+
+int no_results;
+
+int sorter(const void *a, const void *b)
+{
+   const struct list *A, *B;
+   A = a;
+   B = b;
+   if (A->avg < B->avg) return -1;
+   if (A->avg > B->avg) return 1;
+   return 0;
+}
+
+void tally_results(int type)
+{
+   int x;
+
+   // qsort the results
+   qsort(results, no_results, sizeof(struct list), &sorter);
+
+   printf("\n");
+   if (type == 0) {
+      for (x = 0; x < no_results; x++) {
+         printf("%-20s: Schedule at %6lu\n", cipher_descriptor[results[x].id].name, (unsigned long)results[x].spd1);
+      } 
+   } else if (type == 1) {
+      for (x = 0; x < no_results; x++) {
+        printf
+          ("%-20s: Encrypt at %5lu, Decrypt at %5lu\n", cipher_descriptor[results[x].id].name, results[x].spd1, results[x].spd2);
+      }
+   } else {
+      for (x = 0; x < no_results; x++) {
+        printf
+          ("%-20s: Process at %5lu\n", hash_descriptor[results[x].id].name, results[x].spd1 / 1000);
+      }
+   }
+}
+
+
+
+
 /* RDTSC from Scott Duplichan */
 static ulong64 rdtsc (void)
    {
@@ -35,6 +80,7 @@ static ulong64 rdtsc (void)
    }
 
 ulong64 timer, skew = 0;
+prng_state prng;
 
 void t_start(void)
 {
@@ -107,6 +153,9 @@ void reg_algs(void)
 #ifdef NOEKEON
   register_cipher (&noekeon_desc);
 #endif
+#ifdef SKIPJACK
+  register_cipher (&skipjack_desc);
+#endif
 
 #ifdef TIGER
   register_hash (&tiger_desc);
@@ -123,6 +172,9 @@ void reg_algs(void)
 #ifdef SHA1
   register_hash (&sha1_desc);
 #endif
+#ifdef SHA224
+  register_hash (&sha224_desc);
+#endif
 #ifdef SHA256
   register_hash (&sha256_desc);
 #endif
@@ -139,6 +191,8 @@ void reg_algs(void)
   register_hash (&rmd160_desc);
 #endif
 
+register_prng(&yarrow_desc);
+rng_make_prng(128, find_prng("yarrow"), &prng, NULL);
 }
 
 int time_keysched(void)
@@ -151,24 +205,28 @@ int time_keysched(void)
   unsigned char key[MAXBLOCKSIZE];
 
   printf ("\n\nKey Schedule Time Trials for the Symmetric Ciphers:\n(Times are cycles per key)\n");
-  for (x = 0; cipher_descriptor[x].name != NULL; x++) {
+  no_results = 0; 
+ for (x = 0; cipher_descriptor[x].name != NULL; x++) {
 #define DO1(k)   func(k, kl, 0, &skey);
 
     func = cipher_descriptor[x].setup;
     kl   = cipher_descriptor[x].min_key_length;
     c1 = (ulong64)-1;
     for (y1 = 0; y1 < KTIMES; y1++) {
-       rng_get_bytes(key, kl, NULL);
+       yarrow_read(key, kl, &prng);
        t_start();
        DO1(key);
        t1 = t_read();
        c1 = (t1 > c1) ? c1 : t1;
     }
     t1 = c1 - skew;
-    printf("%-20s: Schedule at %6lu\n", cipher_descriptor[x].name, (unsigned long)t1);
+    results[no_results].spd1 = results[no_results].avg = t1;
+    results[no_results++].id = x;
+    printf("."); fflush(stdout);
 
 #undef DO1
    }
+   tally_results(0);
 
    return 0;
 }
@@ -183,6 +241,7 @@ int time_cipher(void)
 
 
   printf ("\n\nECB Time Trials for the Symmetric Ciphers:\n");
+  no_results = 0;
   for (x = 0; cipher_descriptor[x].name != NULL; x++) {
     cipher_descriptor[x].setup (key, cipher_descriptor[x].min_key_length, 0,
                 &skey);
@@ -220,13 +279,18 @@ int time_cipher(void)
         c2 = (t2 > c2 ? c2 : t2);
     }
     a2 = c2 - c1 - skew;
-
-    printf
-      ("%-20s: Encrypt at %7.3f, Decrypt at %7.3f\n", cipher_descriptor[x].name, a1/(double)cipher_descriptor[x].block_length, a2/(double)cipher_descriptor[x].block_length);
-
+    
+    results[no_results].id = x;
+    results[no_results].spd1 = a1/cipher_descriptor[x].block_length;
+    results[no_results].spd2 = a2/cipher_descriptor[x].block_length;;
+    results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2;
+    ++no_results;
+    printf("."); fflush(stdout);
+    
 #undef DO2
 #undef DO1
    }
+   tally_results(1);
 
    return 0;
 }
@@ -236,11 +300,12 @@ int time_hash(void)
   unsigned long x, y1, len;
   ulong64 t1, t2, c1, c2;
   hash_state md;
-  void    (*func)(hash_state *, const unsigned char *, unsigned long);
+  int    (*func)(hash_state *, const unsigned char *, unsigned long);
   unsigned char pt[MAXBLOCKSIZE];
 
 
   printf ("\n\nHASH Time Trials for:\n");
+  no_results = 0;
   for (x = 0; hash_descriptor[x].name != NULL; x++) {
     hash_descriptor[x].init(&md);
 
@@ -262,13 +327,14 @@ int time_hash(void)
     }
     t1 = c2 - c1 - skew;
     t1 = ((t1 * CONST64(1000))) / ((ulong64)hash_descriptor[x].blocksize);
-
-    printf
-      ("%-20s: Process at %9.3f\n", hash_descriptor[x].name, t1 / 1000.0);
-
+    results[no_results].id = x;
+    results[no_results].spd1 = results[no_results].avg = t1;
+    ++no_results;
+    printf("."); fflush(stdout);
 #undef DO2
 #undef DO1
    }
+   tally_results(2);
 
    return 0;
 }

+ 11 - 5
des.c

@@ -1713,8 +1713,8 @@ int des_test(void)
             http://www.ecs.soton.ac.uk/~prw99r/ez438/vectors.txt
         ***/
     };
-    int i;
-    unsigned char out[8];
+    int i, y;
+    unsigned char tmp[8];
     symmetric_key des;
 
     for(i=0; i < (int)(sizeof(cases)/sizeof(cases[0])); i++)
@@ -1723,14 +1723,20 @@ int des_test(void)
            return err;
         }
         if (cases[i].mode != 0) { 
-           des_ecb_encrypt(cases[i].txt, out, &des);
+           des_ecb_encrypt(cases[i].txt, tmp, &des);
         } else {
-           des_ecb_decrypt(cases[i].txt, out, &des);
+           des_ecb_decrypt(cases[i].txt, tmp, &des);
         }
 
-        if (memcmp(cases[i].out, out, sizeof out) != 0) {
+        if (memcmp(cases[i].out, tmp, sizeof(tmp)) != 0) {
            return CRYPT_FAIL_TESTVECTOR;
         }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 8; y++) tmp[y] = 0;
+      for (y = 0; y < 1000; y++) des_ecb_encrypt(tmp, tmp, &des);
+      for (y = 0; y < 1000; y++) des_ecb_decrypt(tmp, tmp, &des);
+      for (y = 0; y < 8; y++) if (tmp[y] != 0) return CRYPT_FAIL_TESTVECTOR;
     }
 
     return CRYPT_OK;

+ 26 - 25
dh.c

@@ -149,34 +149,34 @@ int dh_test(void)
     mp_int p, g, tmp;
     int x, res, primality;
 
-    if (mp_init_multi(&p, &g, &tmp, NULL) != MP_OKAY)                 { goto error; }
+    if ((res = mp_init_multi(&p, &g, &tmp, NULL)) != MP_OKAY)                 { goto error; }
 
     for (x = 0; sets[x].size != 0; x++) {
 #if 0
         printf("dh_test():testing size %d-bits\n", sets[x].size * 8);
 #endif
-        if (mp_read_radix(&g,(char *)sets[x].base, 64) != MP_OKAY)   { goto error; }
-        if (mp_read_radix(&p,(char *)sets[x].prime, 64) != MP_OKAY)  { goto error; }
+        if ((res = mp_read_radix(&g,(char *)sets[x].base, 64)) != MP_OKAY)    { goto error; }
+        if ((res = mp_read_radix(&p,(char *)sets[x].prime, 64)) != MP_OKAY)   { goto error; }
 
         /* ensure p is prime */
-        if ((res = is_prime(&p, &primality)) != CRYPT_OK)             { goto done; }
+        if ((res = is_prime(&p, &primality)) != CRYPT_OK)                     { goto done; }
         if (primality == 0) {
            res = CRYPT_FAIL_TESTVECTOR;
            goto done;
         }
 
-        if (mp_sub_d(&p, 1, &tmp) != MP_OKAY)                         { goto error; }
-        if (mp_div_2(&tmp, &tmp) != MP_OKAY)                          { goto error; }
+        if ((res = mp_sub_d(&p, 1, &tmp)) != MP_OKAY)                         { goto error; }
+        if ((res = mp_div_2(&tmp, &tmp)) != MP_OKAY)                          { goto error; }
 
         /* ensure (p-1)/2 is prime */
-        if ((res = is_prime(&tmp, &primality)) != CRYPT_OK)           { goto done; }
+        if ((res = is_prime(&tmp, &primality)) != CRYPT_OK)                   { goto done; }
         if (primality == 0) {
            res = CRYPT_FAIL_TESTVECTOR;
            goto done;
         }
 
         /* now see if g^((p-1)/2) mod p is in fact 1 */
-        if (mp_exptmod(&g, &tmp, &p, &tmp) != MP_OKAY)                { goto error; }
+        if ((res = mp_exptmod(&g, &tmp, &p, &tmp)) != MP_OKAY)                { goto error; }
         if (mp_cmp_d(&tmp, 1)) {
            res = CRYPT_FAIL_TESTVECTOR;
            goto done;
@@ -185,7 +185,7 @@ int dh_test(void)
     res = CRYPT_OK;
     goto done;
 error:
-    res = CRYPT_MEM;
+    res = mpi_to_ltc_error(res);
 done:
     mp_clear_multi(&tmp, &g, &p, NULL);
     return res;
@@ -247,25 +247,25 @@ int dh_make_key(prng_state *prng, int wprng, int keysize, dh_key *key)
    }
 
    /* init parameters */
-   if (mp_init_multi(&g, &p, &key->x, &key->y, NULL) != MP_OKAY) {
-      return CRYPT_MEM;
+   if ((res = mp_init_multi(&g, &p, &key->x, &key->y, NULL)) != MP_OKAY) {
+      return mpi_to_ltc_error(res);
    }
-   if (mp_read_radix(&g, sets[key->idx].base, 64) != MP_OKAY)      { goto error; }
-   if (mp_read_radix(&p, sets[key->idx].prime, 64) != MP_OKAY)     { goto error; }
+   if ((res = mp_read_radix(&g, sets[key->idx].base, 64)) != MP_OKAY)      { goto error; }
+   if ((res = mp_read_radix(&p, sets[key->idx].prime, 64)) != MP_OKAY)     { goto error; }
 
    /* load the x value */
-   if (mp_read_unsigned_bin(&key->x, buf, keysize) != MP_OKAY)     { goto error; }
-   if (mp_exptmod(&g, &key->x, &p, &key->y) != MP_OKAY)            { goto error; }
+   if ((res = mp_read_unsigned_bin(&key->x, buf, keysize)) != MP_OKAY)     { goto error; }
+   if ((res = mp_exptmod(&g, &key->x, &p, &key->y)) != MP_OKAY)            { goto error; }
    key->type = PK_PRIVATE;
 
-   if (mp_shrink(&key->x) != MP_OKAY)                              { goto error; }
-   if (mp_shrink(&key->y) != MP_OKAY)                              { goto error; }
+   if ((res = mp_shrink(&key->x)) != MP_OKAY)                              { goto error; }
+   if ((res = mp_shrink(&key->y)) != MP_OKAY)                              { goto error; }
 
    /* free up ram */
    res = CRYPT_OK;
    goto done2;
 error:
-   res = CRYPT_MEM;
+   res = mpi_to_ltc_error(res);
    mp_clear_multi(&key->x, &key->y, NULL);
 done2:
    mp_clear_multi(&p, &g, NULL);
@@ -284,7 +284,7 @@ void dh_free(dh_key *key)
       z = (unsigned long)mp_unsigned_bin_size(num);           \
       STORE32L(z, buf2+y);                     \
       y += 4;                                  \
-      (void)mp_to_unsigned_bin(num, buf2+y);   \
+      if ((err = mp_to_unsigned_bin(num, buf2+y)) != MP_OKAY) { return mpi_to_ltc_error(err); }   \
       y += z;                                  \
 }
 
@@ -306,13 +306,13 @@ void dh_free(dh_key *key)
      }                                                           \
                                                                  \
      /* load it */                                               \
-     if (mp_read_unsigned_bin(num, (unsigned char *)in+y, (int)x) != MP_OKAY) {\
-        err =  CRYPT_MEM;                                      \
+     if ((err = mp_read_unsigned_bin(num, (unsigned char *)in+y, (int)x)) != MP_OKAY) {\
+        err = mpi_to_ltc_error(err);                                      \
         goto error;                                              \
      }                                                           \
      y += x;                                                     \
-     if (mp_shrink(num) != MP_OKAY) {                            \
-        err = CRYPT_MEM;                                       \
+     if ((err = mp_shrink(num)) != MP_OKAY) {                            \
+        err = mpi_to_ltc_error(err);                                       \
         goto error;                                              \
      }                                                           \
 }
@@ -322,6 +322,7 @@ int dh_export(unsigned char *out, unsigned long *outlen, int type, dh_key *key)
 {
    unsigned char buf2[1536];
    unsigned long y, z;
+   int err;
 
    _ARGCHK(out != NULL);
    _ARGCHK(outlen != NULL);
@@ -387,8 +388,8 @@ int dh_import(const unsigned char *in, unsigned long inlen, dh_key *key)
    }
 
    /* init */
-   if (mp_init_multi(&key->x, &key->y, NULL) != MP_OKAY) {
-      return CRYPT_MEM;
+   if ((err = mp_init_multi(&key->x, &key->y, NULL)) != MP_OKAY) {
+      return mpi_to_ltc_error(err);
    }
 
    /* advance past packet header */

+ 32 - 30
dh_sys.c

@@ -23,7 +23,7 @@ int dh_encrypt_key(const unsigned char *inkey, unsigned long keylen,
     }
 
     if (keylen > hash_descriptor[hash].hashsize)  {
-        return CRYPT_INVALID_ARG;
+        return CRYPT_INVALID_HASH;
     }
 
     /* make a random key and export the public copy */
@@ -250,32 +250,32 @@ int dh_sign_hash(const unsigned char *in,  unsigned long inlen,
    }
 
    /* init bignums */
-   if (mp_init_multi(&a, &b, &k, &m, &p, &g, &p1, &tmp, NULL) != MP_OKAY) { 
-      return CRYPT_MEM;
+   if ((err = mp_init_multi(&a, &b, &k, &m, &p, &g, &p1, &tmp, NULL)) != MP_OKAY) { 
+      return mpi_to_ltc_error(err);
    }
 
    /* load k and m */
-   if (mp_read_unsigned_bin(&m, (unsigned char *)in, inlen) != MP_OKAY)        { goto error; }
+   if ((err = mp_read_unsigned_bin(&m, (unsigned char *)in, inlen)) != MP_OKAY)        { goto error; }
 #ifdef FAST_PK   
-   if (mp_read_unsigned_bin(&k, buf, MIN(32,sets[key->idx].size)) != MP_OKAY)  { goto error; }
+   if ((err = mp_read_unsigned_bin(&k, buf, MIN(32,sets[key->idx].size))) != MP_OKAY)  { goto error; }
 #else   
-   if (mp_read_unsigned_bin(&k, buf, sets[key->idx].size) != MP_OKAY)          { goto error; }
+   if ((err = mp_read_unsigned_bin(&k, buf, sets[key->idx].size)) != MP_OKAY)          { goto error; }
 #endif  
 
    /* load g, p and p1 */
-   if (mp_read_radix(&g, sets[key->idx].base, 64) != MP_OKAY)               { goto error; }
-   if (mp_read_radix(&p, sets[key->idx].prime, 64) != MP_OKAY)              { goto error; }
-   if (mp_sub_d(&p, 1, &p1) != MP_OKAY)                                     { goto error; }
-   if (mp_div_2(&p1, &p1) != MP_OKAY)                                       { goto error; } /* p1 = (p-1)/2 */
+   if ((err = mp_read_radix(&g, sets[key->idx].base, 64)) != MP_OKAY)               { goto error; }
+   if ((err = mp_read_radix(&p, sets[key->idx].prime, 64)) != MP_OKAY)              { goto error; }
+   if ((err = mp_sub_d(&p, 1, &p1)) != MP_OKAY)                                     { goto error; }
+   if ((err = mp_div_2(&p1, &p1)) != MP_OKAY)                                       { goto error; } /* p1 = (p-1)/2 */
 
    /* now get a = g^k mod p */
-   if (mp_exptmod(&g, &k, &p, &a) != MP_OKAY)                               { goto error; }
+   if ((err = mp_exptmod(&g, &k, &p, &a)) != MP_OKAY)                               { goto error; }
 
    /* now find M = xa + kb mod p1 or just b = (M - xa)/k mod p1 */
-   if (mp_invmod(&k, &p1, &k) != MP_OKAY)                                   { goto error; } /* k = 1/k mod p1 */
-   if (mp_mulmod(&a, &key->x, &p1, &tmp) != MP_OKAY)                        { goto error; } /* tmp = xa */
-   if (mp_submod(&m, &tmp, &p1, &tmp) != MP_OKAY)                           { goto error; } /* tmp = M - xa */
-   if (mp_mulmod(&k, &tmp, &p1, &b) != MP_OKAY)                             { goto error; } /* b = (M - xa)/k */
+   if ((err = mp_invmod(&k, &p1, &k)) != MP_OKAY)                                   { goto error; } /* k = 1/k mod p1 */
+   if ((err = mp_mulmod(&a, &key->x, &p1, &tmp)) != MP_OKAY)                        { goto error; } /* tmp = xa */
+   if ((err = mp_submod(&m, &tmp, &p1, &tmp)) != MP_OKAY)                           { goto error; } /* tmp = M - xa */
+   if ((err = mp_mulmod(&k, &tmp, &p1, &b)) != MP_OKAY)                             { goto error; } /* b = (M - xa)/k */
 
    /* store header  */
    y = PACKET_SIZE;
@@ -283,11 +283,13 @@ int dh_sign_hash(const unsigned char *in,  unsigned long inlen,
    /* now store them both (a,b) */
    x = (unsigned long)mp_unsigned_bin_size(&a);
    STORE32L(x, buf+y);  y += 4;
-   mp_to_unsigned_bin(&a, buf+y); y += x;
+   if ((err = mp_to_unsigned_bin(&a, buf+y)) != MP_OKAY)                            { goto error; }
+   y += x;
 
    x = (unsigned long)mp_unsigned_bin_size(&b);
    STORE32L(x, buf+y);  y += 4;
-   mp_to_unsigned_bin(&b, buf+y); y += x;
+   if ((err = mp_to_unsigned_bin(&b, buf+y)) != MP_OKAY)                            { goto error; }
+   y += x;
 
    /* check if size too big */
    if (*outlen < y) {
@@ -308,7 +310,7 @@ int dh_sign_hash(const unsigned char *in,  unsigned long inlen,
    res = CRYPT_OK;
    goto done;
 error:
-   res = CRYPT_MEM;
+   res = mpi_to_ltc_error(err);
 done:
    mp_clear_multi(&tmp, &p1, &g, &p, &m, &k, &b, &a, NULL);
    return res;
@@ -346,8 +348,8 @@ int dh_verify_hash(const unsigned char *sig, unsigned long siglen,
    y = PACKET_SIZE;
 
    /* init all bignums */
-   if (mp_init_multi(&a, &p, &b, &g, &m, &tmp, NULL) != MP_OKAY) { 
-      return CRYPT_MEM;
+   if ((err = mp_init_multi(&a, &p, &b, &g, &m, &tmp, NULL)) != MP_OKAY) { 
+      return mpi_to_ltc_error(err);
    }
 
    /* load a and b */
@@ -359,7 +361,7 @@ int dh_verify_hash(const unsigned char *sig, unsigned long siglen,
    }
    
    y += 4;
-   if (mp_read_unsigned_bin(&a, (unsigned char *)sig+y, x) != MP_OKAY)    { goto error; }
+   if ((err = mp_read_unsigned_bin(&a, (unsigned char *)sig+y, x)) != MP_OKAY)    { goto error; }
    y += x;
 
    LOAD32L(x, sig+y);
@@ -369,23 +371,23 @@ int dh_verify_hash(const unsigned char *sig, unsigned long siglen,
       siglen -= x;
    }
    y += 4;
-   if (mp_read_unsigned_bin(&b, (unsigned char *)sig+y, x) != MP_OKAY)   { goto error; }
+   if ((err = mp_read_unsigned_bin(&b, (unsigned char *)sig+y, x)) != MP_OKAY)   { goto error; }
    y += x;
 
    /* load p and g */
-   if (mp_read_radix(&p, sets[key->idx].prime, 64) != MP_OKAY)           { goto error; }
-   if (mp_read_radix(&g, sets[key->idx].base, 64) != MP_OKAY)            { goto error; }
+   if ((err = mp_read_radix(&p, sets[key->idx].prime, 64)) != MP_OKAY)           { goto error; }
+   if ((err = mp_read_radix(&g, sets[key->idx].base, 64)) != MP_OKAY)            { goto error; }
 
    /* load m */
-   if (mp_read_unsigned_bin(&m, (unsigned char *)hash, hashlen) != MP_OKAY) { goto error; }
+   if ((err = mp_read_unsigned_bin(&m, (unsigned char *)hash, hashlen)) != MP_OKAY) { goto error; }
 
    /* find g^m mod p */
-   if (mp_exptmod(&g, &m, &p, &m) != MP_OKAY)                            { goto error; } /* m = g^m mod p */
+   if ((err = mp_exptmod(&g, &m, &p, &m)) != MP_OKAY)                            { goto error; } /* m = g^m mod p */
 
    /* find y^a * a^b */
-   if (mp_exptmod(&key->y, &a, &p, &tmp) != MP_OKAY)                     { goto error; } /* tmp = y^a mod p */
-   if (mp_exptmod(&a, &b, &p, &a) != MP_OKAY)                            { goto error; } /* a = a^b mod p */
-   if (mp_mulmod(&a, &tmp, &p, &a) != MP_OKAY)                           { goto error; } /* a = y^a * a^b mod p */
+   if ((err = mp_exptmod(&key->y, &a, &p, &tmp)) != MP_OKAY)                     { goto error; } /* tmp = y^a mod p */
+   if ((err = mp_exptmod(&a, &b, &p, &a)) != MP_OKAY)                            { goto error; } /* a = a^b mod p */
+   if ((err = mp_mulmod(&a, &tmp, &p, &a)) != MP_OKAY)                           { goto error; } /* a = y^a * a^b mod p */
 
    /* y^a * a^b == g^m ??? */
    if (mp_cmp(&a, &m) == 0) {
@@ -396,7 +398,7 @@ int dh_verify_hash(const unsigned char *sig, unsigned long siglen,
    res = CRYPT_OK;
    goto done;
 error:
-   res = CRYPT_MEM;
+   res = mpi_to_ltc_error(err);
 done:
    mp_clear_multi(&tmp, &m, &g, &p, &b, &a, NULL);
    return res;

+ 498 - 0
dsa.c

@@ -0,0 +1,498 @@
+#include "mycrypt.h"
+
+#ifdef MDSA
+
+#define DRAW(x) { char __buf[1000]; mp_toradix(x, __buf, 16); printf("\n%s == %s\n", #x, __buf); }
+
+int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key)
+{
+   mp_int tmp, tmp2;
+   int err, res;
+   unsigned char buf[512];
+
+   _ARGCHK(prng != NULL);
+   _ARGCHK(key  != NULL);
+
+   /* check prng */
+   if ((err = prng_is_valid(wprng)) != CRYPT_OK) {
+      return err;
+   }
+
+   /* check size */
+   if (group_size >= 1024 || group_size <= 15 || 
+       group_size >= modulus_size || (modulus_size - group_size) >= (int)sizeof(buf)) {
+      return CRYPT_INVALID_ARG;
+   }
+
+   /* init mp_ints  */
+   if ((err = mp_init_multi(&tmp, &tmp2, &key->g, &key->q, &key->p, &key->x, &key->y, NULL)) != MP_OKAY) {
+      return mpi_to_ltc_error(err);
+   }
+
+   /* make our prime q */
+   if ((err = rand_prime(&key->q, group_size, prng, wprng)) != CRYPT_OK)             { goto error2; }
+
+   /* double q  */
+   if ((err = mp_mul_2(&key->q, &tmp)) != MP_OKAY)                                   { goto error; }
+
+   /* now make a random string and multply it against q */
+   if (prng_descriptor[wprng].read(buf, modulus_size - group_size, prng) != (unsigned long)(modulus_size - group_size)) {
+      err = CRYPT_ERROR_READPRNG;
+      goto error2;
+   }
+
+   /* force magnitude */
+   buf[0] |= 0x80;
+
+   /* force even */
+   buf[modulus_size - group_size - 1] &= ~1;
+
+   if ((err = mp_read_unsigned_bin(&tmp2, buf, modulus_size - group_size)) != MP_OKAY) { goto error; }
+   if ((err = mp_mul(&key->q, &tmp2, &key->p)) != MP_OKAY)                             { goto error; }
+   if ((err = mp_add_d(&key->p, 1, &key->p)) != MP_OKAY)                               { goto error; }
+   
+   /* now loop until p is prime */
+   for (;;) {
+       if ((err = is_prime(&key->p, &res)) != CRYPT_OK)                                { goto error2; }
+       if (res == MP_YES) break;
+
+       /* add 2q to p and 2 to tmp2 */
+       if ((err = mp_add(&tmp, &key->p, &key->p)) != MP_OKAY)                          { goto error; }
+       if ((err = mp_add_d(&tmp2, 2, &tmp2)) != MP_OKAY)                               { goto error; }
+   }
+
+   /* now p = (q * tmp2) + 1 is prime, find a value g for which g^tmp2 != 1 */
+   mp_set(&key->g, 1);
+
+   do {
+      if ((err = mp_add_d(&key->g, 1, &key->g)) != MP_OKAY)                            { goto error; }
+      if ((err = mp_exptmod(&key->g, &tmp2, &key->p, &tmp)) != MP_OKAY)                { goto error; }
+   } while (mp_cmp_d(&tmp, 1) == MP_EQ);
+
+   /* at this point tmp generates a group of order q mod p */
+   mp_exch(&tmp, &key->g);
+
+   /* so now we have our DH structure, generator g, order q, modulus p 
+      Now we need a random exponent [mod q] and it's power g^x mod p 
+    */
+   do {
+      if (prng_descriptor[wprng].read(buf, group_size, prng) != (unsigned long)group_size) {
+         err = CRYPT_ERROR_READPRNG;
+         goto error2;
+      }
+      if ((err = mp_read_unsigned_bin(&key->x, buf, group_size)) != MP_OKAY)              { goto error; }
+   } while (mp_cmp_d(&key->x, 1) != MP_GT);
+   if ((err = mp_exptmod(&key->g, &key->x, &key->p, &key->y)) != MP_OKAY)              { goto error; }
+   
+   key->type = PK_PRIVATE;
+   key->qord = group_size;
+
+   /* shrink the ram required */
+   if ((err = mp_shrink(&key->g)) != MP_OKAY)                                          { goto error; }
+   if ((err = mp_shrink(&key->p)) != MP_OKAY)                                          { goto error; }
+   if ((err = mp_shrink(&key->q)) != MP_OKAY)                                          { goto error; }
+   if ((err = mp_shrink(&key->x)) != MP_OKAY)                                          { goto error; }
+   if ((err = mp_shrink(&key->y)) != MP_OKAY)                                          { goto error; }
+
+   err = CRYPT_OK;
+
+#ifdef CLEAN_STACK
+   zeromem(buf, sizeof(buf));
+#endif
+
+   goto done;
+error : err = mpi_to_ltc_error(err);
+error2: mp_clear_multi(&key->g, &key->q, &key->p, &key->x, &key->y, NULL);
+done  : mp_clear_multi(&tmp, &tmp2, NULL);
+   return err;
+}
+
+void dsa_free(dsa_key *key)
+{
+   _ARGCHK(key != NULL);
+   mp_clear_multi(&key->g, &key->q, &key->p, &key->x, &key->y, NULL);
+}
+
+
+int dsa_sign_hash(const unsigned char *in,  unsigned long inlen,
+                        unsigned char *out, unsigned long *outlen,
+                        prng_state *prng, int wprng, dsa_key *key)
+{
+   mp_int k, kinv, tmp, r, s;
+   unsigned char buf[512];
+   int err, y;
+   unsigned long len;
+
+
+   _ARGCHK(in != NULL);
+   _ARGCHK(out != NULL);
+   _ARGCHK(prng != NULL);
+   _ARGCHK(outlen != NULL);
+   _ARGCHK(key != NULL);
+
+   if ((err = prng_is_valid(wprng)) != CRYPT_OK) {
+      return err;
+   }
+   if (key->type != PK_PRIVATE) {
+      return CRYPT_PK_NOT_PRIVATE;
+   }
+
+   /* check group order size  */
+   if (key->qord >= (int)sizeof(buf)) {
+      return CRYPT_INVALID_ARG;
+   }
+
+   /* Init our temps */
+   if ((err = mp_init_multi(&k, &kinv, &r, &s, &tmp, NULL)) != MP_OKAY)               { goto error; }
+
+retry:
+   /* gen random k */
+   if (prng_descriptor[wprng].read(buf, key->qord, prng) != (unsigned long)key->qord) {
+      err = CRYPT_ERROR_READPRNG;
+      goto done;
+   }
+
+   /* read k */
+   if ((err = mp_read_unsigned_bin(&k, buf, key->qord)) != MP_OKAY)                   { goto error; }
+
+   /* now find 1/k mod q */
+   if ((err = mp_invmod(&k, &key->q, &kinv)) != MP_OKAY)                              { goto error; }
+
+   /* now find r = g^k mod p mod q */
+   if ((err = mp_exptmod(&key->g, &k, &key->p, &r)) != MP_OKAY)                       { goto error; }
+   if ((err = mp_mod(&r, &key->q, &r)) != MP_OKAY)                                    { goto error; }
+
+   if (mp_iszero(&r) == MP_YES)                                                       { goto retry; }
+
+   /* now find s = (in + xr)/k mod q */
+   if ((err = mp_read_unsigned_bin(&tmp, (unsigned char *)in, inlen)) != MP_OKAY)     { goto error; }
+   if ((err = mp_mul(&key->x, &r, &s)) != MP_OKAY)                                    { goto error; }
+   if ((err = mp_add(&s, &tmp, &s)) != MP_OKAY)                                       { goto error; }
+   if ((err = mp_mulmod(&s, &kinv, &key->q, &s)) != MP_OKAY)                          { goto error; }
+
+   if (mp_iszero(&s) == MP_YES)                                                       { goto retry; }
+
+   /* now store em both */
+   
+   /* first check that we have enough room */
+   if (*outlen < (unsigned long)(PACKET_SIZE + 4 + mp_unsigned_bin_size(&s) + mp_unsigned_bin_size(&r))) {
+      err = CRYPT_BUFFER_OVERFLOW;
+      goto done;
+   }
+
+   /* packet header */
+   packet_store_header(out, PACKET_SECT_DSA, PACKET_SUB_SIGNED);
+   y = PACKET_SIZE;
+
+   /* store length of r */
+   len = mp_unsigned_bin_size(&r);
+   out[y++] = (len>>8)&255;
+   out[y++] = (len & 255);
+   
+   /* store r */
+   mp_to_unsigned_bin(&r, out+y);
+   y += len;
+
+   /* store length of s */
+   len = mp_unsigned_bin_size(&s);
+   out[y++] = (len>>8)&255;
+   out[y++] = (len & 255);
+   
+   /* store s */
+   mp_to_unsigned_bin(&s, out+y);
+   y += len;
+
+   /* reset size */
+   *outlen = y;
+
+   err = CRYPT_OK;
+   goto done;
+
+error : err = mpi_to_ltc_error(err);
+done  : mp_clear_multi(&k, &kinv, &r, &s, &tmp, NULL);
+#ifdef CLEAN_STACK
+   zeromem(buf, sizeof(buf));
+#endif
+   return err;
+}
+
+int dsa_verify_hash(const unsigned char *sig, unsigned long siglen,
+                    const unsigned char *hash, unsigned long inlen, 
+                    int *stat, dsa_key *key)
+{
+   mp_int r, s, w, v, u1, u2;
+   unsigned long x, y;
+   int err;
+
+   _ARGCHK(sig != NULL);
+   _ARGCHK(hash != NULL);
+   _ARGCHK(stat != NULL);
+   _ARGCHK(key != NULL);
+
+   /* default to invalid signature */
+   *stat = 0;
+
+   if (siglen < PACKET_SIZE+2+2) {
+      return CRYPT_INVALID_PACKET;
+   } 
+
+   /* is the message format correct? */
+   if ((err = packet_valid_header((unsigned char *)sig, PACKET_SECT_DSA, PACKET_SUB_SIGNED)) != CRYPT_OK) {
+      return err;
+   }
+
+   /* skip over header */
+   y = PACKET_SIZE;
+
+   /* init our variables */
+   if ((err = mp_init_multi(&r, &s, &w, &v, &u1, &u2, NULL)) != MP_OKAY) {
+      return mpi_to_ltc_error(err);
+   }
+
+   /* read in r followed by s */
+   x = ((unsigned)sig[y]<<8)|((unsigned)sig[y+1]);
+   y += 2;
+   if (y + x > siglen) { 
+      err = CRYPT_INVALID_PACKET;
+      goto done;
+   }
+   if ((err = mp_read_unsigned_bin(&r, (unsigned char *)sig+y, x)) != MP_OKAY)             { goto error; }
+   y += x;
+
+   /* load s */
+   x = ((unsigned)sig[y]<<8)|((unsigned)sig[y+1]);
+   y += 2;
+   if (y + x > siglen) { 
+      err = CRYPT_INVALID_PACKET;
+      goto done;
+   }
+   if ((err = mp_read_unsigned_bin(&s, (unsigned char *)sig+y, x)) != MP_OKAY)             { goto error; }
+
+   /* w = 1/s mod q */
+   if ((err = mp_invmod(&s, &key->q, &w)) != MP_OKAY)                                      { goto error; }
+
+   /* u1 = m * w mod q */
+   if ((err = mp_read_unsigned_bin(&u1, (unsigned char *)hash, inlen)) != MP_OKAY)         { goto error; }
+   if ((err = mp_mulmod(&u1, &w, &key->q, &u1)) != MP_OKAY)                                { goto error; }
+
+   /* u2 = r*w mod q */
+   if ((err = mp_mulmod(&r, &w, &key->q, &u2)) != MP_OKAY)                                 { goto error; } 
+
+   /* v = g^u1 * y^u2 mod p mod q */
+   if ((err = mp_exptmod(&key->g, &u1, &key->p, &u1)) != MP_OKAY)                          { goto error; }
+   if ((err = mp_exptmod(&key->y, &u2, &key->p, &u2)) != MP_OKAY)                          { goto error; }
+   if ((err = mp_mulmod(&u1, &u2, &key->p, &v)) != MP_OKAY)                                { goto error; }
+   if ((err = mp_mod(&v, &key->q, &v)) != MP_OKAY)                                         { goto error; }
+
+   /* if r = v then we're set */
+   if (mp_cmp(&r, &v) == MP_EQ) {
+      *stat = 1;
+   }
+
+   err = CRYPT_OK;
+   goto done;
+
+error : err = mpi_to_ltc_error(err);
+done  : mp_clear_multi(&r, &s, &w, &v, &u1, &u2, NULL);
+   return err;
+}
+
+#define OUTPUT_BIGNUM(num, buf2, y, z)         \
+{                                              \
+      z = (unsigned long)mp_unsigned_bin_size(num);  \
+      if ((y + 4 + z) > *outlen) { return CRYPT_BUFFER_OVERFLOW; } \
+      STORE32L(z, out+y);                     \
+      y += 4;                                  \
+      if (mp_to_unsigned_bin(num, out+y) != MP_OKAY) { return CRYPT_MEM; }  \
+      y += z;                                  \
+}
+
+int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key)
+{
+   unsigned long y, z;
+
+   _ARGCHK(out != NULL);
+   _ARGCHK(outlen != NULL);
+   _ARGCHK(key != NULL);
+
+   if (type == PK_PRIVATE && key->type != PK_PRIVATE) {
+      return CRYPT_PK_TYPE_MISMATCH;
+   }
+
+   if (type != PK_PUBLIC && type != PK_PRIVATE) {
+      return CRYPT_INVALID_ARG;
+   }
+
+   /* can we store the static header?  */
+   if (*outlen < (PACKET_SIZE + 1 + 2)) {
+      return CRYPT_BUFFER_OVERFLOW;
+   }
+
+   /* store header */
+   packet_store_header(out, PACKET_SECT_DSA, PACKET_SUB_KEY);
+   y = PACKET_SIZE;
+
+   /* store g, p, q, qord */
+   out[y++] = type;
+   out[y++] = (key->qord>>8)&255;
+   out[y++] = key->qord & 255;
+
+   OUTPUT_BIGNUM(&key->g,out,y,z);
+   OUTPUT_BIGNUM(&key->p,out,y,z);
+   OUTPUT_BIGNUM(&key->q,out,y,z);
+
+   /* public exponent */
+   OUTPUT_BIGNUM(&key->y,out,y,z);
+   
+   if (type == PK_PRIVATE) {
+      OUTPUT_BIGNUM(&key->x,out,y,z);
+   }
+
+   *outlen = y;
+   return CRYPT_OK;
+}
+
+#define INPUT_BIGNUM(num, in, x, y)                              \
+{                                                                \
+     /* load value */                                            \
+     if (y+4 > inlen) {                                          \
+        err = CRYPT_INVALID_PACKET;                              \
+        goto error;                                              \
+     }                                                           \
+     LOAD32L(x, in+y);                                           \
+     y += 4;                                                     \
+                                                                 \
+     /* sanity check... */                                       \
+     if (y+x > inlen) {                                          \
+        err = CRYPT_INVALID_PACKET;                              \
+        goto error;                                              \
+     }                                                           \
+                                                                 \
+     /* load it */                                               \
+     if (mp_read_unsigned_bin(num, (unsigned char *)in+y, (int)x) != MP_OKAY) {\
+        err = CRYPT_MEM;                                         \
+        goto error;                                              \
+     }                                                           \
+     y += x;                                                     \
+     if (mp_shrink(num) != MP_OKAY) {                            \
+        err = CRYPT_MEM;                                         \
+        goto error;                                              \
+     }                                                           \
+}
+
+int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
+{
+   unsigned long x, y;
+   int err;
+
+   _ARGCHK(in != NULL);
+   _ARGCHK(key != NULL);
+
+   /* check length */
+   if ((1+2+PACKET_SIZE) > inlen) {
+      return CRYPT_INVALID_PACKET;
+   }
+
+   /* check type */
+   if ((err = packet_valid_header((unsigned char *)in, PACKET_SECT_DSA, PACKET_SUB_KEY)) != CRYPT_OK) {
+      return err;
+   }
+   y = PACKET_SIZE;
+
+   /* init key */
+   if (mp_init_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL) != MP_OKAY) {
+      return CRYPT_MEM;
+   }
+
+   /* read type/qord */
+   key->type = in[y++];
+   key->qord = ((unsigned)in[y]<<8)|((unsigned)in[y+1]);
+   y += 2;
+
+   /* input publics */
+   INPUT_BIGNUM(&key->g,in,x,y);
+   INPUT_BIGNUM(&key->p,in,x,y);
+   INPUT_BIGNUM(&key->q,in,x,y);
+   INPUT_BIGNUM(&key->y,in,x,y);
+   if (key->type == PK_PRIVATE) {
+      INPUT_BIGNUM(&key->x,in,x,y);
+   }
+
+   return CRYPT_OK;
+error: 
+   mp_clear_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL);
+   return err;
+}
+
+int dsa_verify_key(dsa_key *key, int *stat)
+{
+   mp_int tmp, tmp2;
+   int res, err;
+
+   _ARGCHK(key != NULL);
+   _ARGCHK(stat != NULL);
+
+   *stat = 0;
+
+   /* first make sure key->q and key->p are prime */
+   if ((err = is_prime(&key->q, &res)) != CRYPT_OK) {
+      return err;
+   }
+   if (res == 0) {
+      return CRYPT_OK;
+   }
+
+
+   if ((err = is_prime(&key->p, &res)) != CRYPT_OK) {
+      return err;
+   }
+   if (res == 0) {
+      return CRYPT_OK;
+   }
+
+   /* now make sure that g is not -1, 0 or 1 and <p */
+   if (mp_cmp_d(&key->g, 0) == MP_EQ || mp_cmp_d(&key->g, 1) == MP_EQ) {
+      return CRYPT_OK;
+   }
+   if ((err = mp_init_multi(&tmp, &tmp2, NULL)) != MP_OKAY)               { goto error; }
+   if ((err = mp_sub_d(&key->p, 1, &tmp)) != MP_OKAY)                     { goto error; }
+   if (mp_cmp(&tmp, &key->g) == MP_EQ || mp_cmp(&key->g, &key->p) != MP_LT) {
+      err = CRYPT_OK;
+      goto done;
+   }
+
+   /* 1 < y < p-1 */
+   if (!(mp_cmp_d(&key->y, 1) == MP_GT && mp_cmp(&key->y, &tmp) == MP_LT)) {
+      err = CRYPT_OK;
+      goto done;
+   }
+
+   /* now we have to make sure that g^q = 1, and that p-1/q gives 0 remainder */
+   if ((err = mp_div(&tmp, &key->q, &tmp, &tmp2)) != MP_OKAY)             { goto error; }
+   if (mp_iszero(&tmp2) != MP_YES) {
+      err = CRYPT_OK;
+      goto done;
+   }
+
+   if ((err = mp_exptmod(&key->g, &key->q, &key->p, &tmp)) != MP_OKAY)    { goto error; }
+   if (mp_cmp_d(&tmp, 1) != MP_EQ) {
+      err = CRYPT_OK;
+      goto done;
+   }
+
+   /* now we have to make sure that y^q = 1, this makes sure y \in g^x mod p */
+   if ((err = mp_exptmod(&key->y, &key->q, &key->p, &tmp)) != MP_OKAY)       { goto error; }
+   if (mp_cmp_d(&tmp, 1) != MP_EQ) {
+      err = CRYPT_OK;
+      goto done;
+   }
+
+   /* at this point we are out of tests ;-( */
+   err   = CRYPT_OK;
+   *stat = 1;
+   goto done;
+error: err = mpi_to_ltc_error(err);
+done : mp_clear_multi(&tmp, &tmp2, NULL);
+   return err;
+}
+#endif

+ 49 - 49
ecc.c

@@ -250,39 +250,39 @@ static int dbl_point(ecc_point *P, ecc_point *R, mp_int *modulus, mp_int *mu)
    mp_int s, tmp, tmpx;
    int res;
 
-   if (mp_init_multi(&s, &tmp, &tmpx, NULL) != MP_OKAY) {
-      return CRYPT_MEM;
+   if ((res = mp_init_multi(&s, &tmp, &tmpx, NULL)) != MP_OKAY) {
+      return mpi_to_ltc_error(res);
    }
 
    /* s = (3Xp^2 + a) / (2Yp) */
-   if (mp_mul_2(&P->y, &tmp) != MP_OKAY)                   { goto error; } /* tmp = 2*y */
-   if (mp_invmod(&tmp, modulus, &tmp) != MP_OKAY)          { goto error; } /* tmp = 1/tmp mod modulus */
-   if (mp_sqr(&P->x, &s) != MP_OKAY)                       { goto error; } /* s = x^2  */
-   if (mp_reduce(&s, modulus, mu) != MP_OKAY)              { goto error; }
-   if (mp_mul_d(&s,(mp_digit)3, &s) != MP_OKAY)            { goto error; } /* s = 3*(x^2) */
-   if (mp_sub_d(&s,(mp_digit)3, &s) != MP_OKAY)            { goto error; } /* s = 3*(x^2) - 3 */
+   if ((res = mp_mul_2(&P->y, &tmp)) != MP_OKAY)                   { goto error; } /* tmp = 2*y */
+   if ((res = mp_invmod(&tmp, modulus, &tmp)) != MP_OKAY)          { goto error; } /* tmp = 1/tmp mod modulus */
+   if ((res = mp_sqr(&P->x, &s)) != MP_OKAY)                       { goto error; } /* s = x^2  */
+   if ((res = mp_reduce(&s, modulus, mu)) != MP_OKAY)              { goto error; }
+   if ((res = mp_mul_d(&s,(mp_digit)3, &s)) != MP_OKAY)            { goto error; } /* s = 3*(x^2) */
+   if ((res = mp_sub_d(&s,(mp_digit)3, &s)) != MP_OKAY)            { goto error; } /* s = 3*(x^2) - 3 */
    if (mp_cmp_d(&s, 0) == MP_LT) {                                         /* if s < 0 add modulus */
-      if (mp_add(&s, modulus, &s) != MP_OKAY)              { goto error; }
+      if ((res = mp_add(&s, modulus, &s)) != MP_OKAY)              { goto error; }
    }
-   if (mp_mul(&s, &tmp, &s) != MP_OKAY)                    { goto error; } /* s = tmp * s mod modulus */
-   if (mp_reduce(&s, modulus, mu) != MP_OKAY)              { goto error; }
+   if ((res = mp_mul(&s, &tmp, &s)) != MP_OKAY)                    { goto error; } /* s = tmp * s mod modulus */
+   if ((res = mp_reduce(&s, modulus, mu)) != MP_OKAY)              { goto error; }
 
    /* Xr = s^2 - 2Xp */
-   if (mp_sqr(&s,  &tmpx) != MP_OKAY)                      { goto error; } /* tmpx = s^2  */
-   if (mp_reduce(&tmpx, modulus, mu) != MP_OKAY)           { goto error; } /* tmpx = tmpx mod modulus */
-   if (mp_sub(&tmpx, &P->x, &tmpx) != MP_OKAY)             { goto error; } /* tmpx = tmpx - x */
-   if (mp_submod(&tmpx, &P->x, modulus, &tmpx) != MP_OKAY) { goto error; } /* tmpx = tmpx - x mod modulus */
+   if ((res = mp_sqr(&s,  &tmpx)) != MP_OKAY)                      { goto error; } /* tmpx = s^2  */
+   if ((res = mp_reduce(&tmpx, modulus, mu)) != MP_OKAY)           { goto error; } /* tmpx = tmpx mod modulus */
+   if ((res = mp_sub(&tmpx, &P->x, &tmpx)) != MP_OKAY)             { goto error; } /* tmpx = tmpx - x */
+   if ((res = mp_submod(&tmpx, &P->x, modulus, &tmpx)) != MP_OKAY) { goto error; } /* tmpx = tmpx - x mod modulus */
 
    /* Yr = -Yp + s(Xp - Xr)  */
-   if (mp_sub(&P->x, &tmpx, &tmp) != MP_OKAY)              { goto error; } /* tmp = x - tmpx */
-   if (mp_mul(&tmp, &s, &tmp) != MP_OKAY)                  { goto error; } /* tmp = tmp * s */
-   if (mp_submod(&tmp, &P->y, modulus, &R->y) != MP_OKAY)  { goto error; } /* y = tmp - y mod modulus */
-   if (mp_copy(&tmpx, &R->x) != MP_OKAY)                   { goto error; } /* x = tmpx */
+   if ((res = mp_sub(&P->x, &tmpx, &tmp)) != MP_OKAY)              { goto error; } /* tmp = x - tmpx */
+   if ((res = mp_mul(&tmp, &s, &tmp)) != MP_OKAY)                  { goto error; } /* tmp = tmp * s */
+   if ((res = mp_submod(&tmp, &P->y, modulus, &R->y)) != MP_OKAY)  { goto error; } /* y = tmp - y mod modulus */
+   if ((res = mp_copy(&tmpx, &R->x)) != MP_OKAY)                   { goto error; } /* x = tmpx */
 
    res = CRYPT_OK;
    goto done;
 error:
-   res = CRYPT_MEM;
+   res = mpi_to_ltc_error(res);
 done:
    mp_clear_multi(&tmpx, &tmp, &s, NULL);
    return res;
@@ -294,14 +294,14 @@ static int add_point(ecc_point *P, ecc_point *Q, ecc_point *R, mp_int *modulus,
    mp_int s, tmp, tmpx;
    int res;
 
-   if (mp_init(&tmp) != MP_OKAY) {
-      return CRYPT_MEM;
+   if ((res = mp_init(&tmp)) != MP_OKAY) {
+      return mpi_to_ltc_error(res);
    }
 
    /* is P==Q or P==-Q? */
-   if (mp_neg(&Q->y, &tmp) != MP_OKAY || mp_mod(&tmp, modulus, &tmp) != MP_OKAY) {
+   if (((res = mp_neg(&Q->y, &tmp)) != MP_OKAY) || ((res = mp_mod(&tmp, modulus, &tmp)) != MP_OKAY)) {
       mp_clear(&tmp);
-      return CRYPT_MEM;
+      return mpi_to_ltc_error(res);
    }
 
    if (mp_cmp(&P->x, &Q->x) == MP_EQ)
@@ -310,40 +310,40 @@ static int add_point(ecc_point *P, ecc_point *Q, ecc_point *R, mp_int *modulus,
          return dbl_point(P, R, modulus, mu);
       }
 
-   if (mp_init_multi(&tmpx, &s, NULL) != MP_OKAY) {
+   if ((res = mp_init_multi(&tmpx, &s, NULL)) != MP_OKAY) {
       mp_clear(&tmp);
-      return CRYPT_MEM;
+      return mpi_to_ltc_error(res);
    }
 
    /* get s = (Yp - Yq)/(Xp-Xq) mod p */
-   if (mp_sub(&P->x, &Q->x, &tmp) != MP_OKAY)                 { goto error; } /* tmp = Px - Qx mod modulus */
+   if ((res = mp_sub(&P->x, &Q->x, &tmp)) != MP_OKAY)                 { goto error; } /* tmp = Px - Qx mod modulus */
    if (mp_cmp_d(&tmp, 0) == MP_LT) {                                          /* if tmp<0 add modulus */
-      if (mp_add(&tmp, modulus, &tmp) != MP_OKAY)             { goto error; }
+      if ((res = mp_add(&tmp, modulus, &tmp)) != MP_OKAY)             { goto error; }
    }
-   if (mp_invmod(&tmp, modulus, &tmp) != MP_OKAY)             { goto error; } /* tmp = 1/tmp mod modulus */
-   if (mp_sub(&P->y, &Q->y, &s) != MP_OKAY)                   { goto error; } /* s = Py - Qy mod modulus */
+   if ((res = mp_invmod(&tmp, modulus, &tmp)) != MP_OKAY)             { goto error; } /* tmp = 1/tmp mod modulus */
+   if ((res = mp_sub(&P->y, &Q->y, &s)) != MP_OKAY)                   { goto error; } /* s = Py - Qy mod modulus */
    if (mp_cmp_d(&s, 0) == MP_LT) {                                            /* if s<0 add modulus */
-      if (mp_add(&s, modulus, &s) != MP_OKAY)                 { goto error; }
+      if ((res = mp_add(&s, modulus, &s)) != MP_OKAY)                 { goto error; }
    }
-   if (mp_mul(&s, &tmp, &s) != MP_OKAY)                       { goto error; } /* s = s * tmp mod modulus */
-   if (mp_reduce(&s, modulus, mu) != MP_OKAY)                 { goto error; }
+   if ((res = mp_mul(&s, &tmp, &s)) != MP_OKAY)                       { goto error; } /* s = s * tmp mod modulus */
+   if ((res = mp_reduce(&s, modulus, mu)) != MP_OKAY)                 { goto error; }
 
    /* Xr = s^2 - Xp - Xq */
-   if (mp_sqr(&s, &tmp) != MP_OKAY)                           { goto error; } /* tmp = s^2 mod modulus */
-   if (mp_reduce(&tmp, modulus, mu) != MP_OKAY)               { goto error; }
-   if (mp_sub(&tmp, &P->x, &tmp) != MP_OKAY)                  { goto error; } /* tmp = tmp - Px */
-   if (mp_sub(&tmp, &Q->x, &tmpx) != MP_OKAY)                 { goto error; } /* tmpx = tmp - Qx */
+   if ((res = mp_sqr(&s, &tmp)) != MP_OKAY)                           { goto error; } /* tmp = s^2 mod modulus */
+   if ((res = mp_reduce(&tmp, modulus, mu)) != MP_OKAY)               { goto error; }
+   if ((res = mp_sub(&tmp, &P->x, &tmp)) != MP_OKAY)                  { goto error; } /* tmp = tmp - Px */
+   if ((res = mp_sub(&tmp, &Q->x, &tmpx)) != MP_OKAY)                 { goto error; } /* tmpx = tmp - Qx */
 
    /* Yr = -Yp + s(Xp - Xr) */
-   if (mp_sub(&P->x, &tmpx, &tmp) != MP_OKAY)                 { goto error; } /* tmp = Px - tmpx */
-   if (mp_mul(&tmp, &s, &tmp) != MP_OKAY)                     { goto error; } /* tmp = tmp * s */
-   if (mp_submod(&tmp, &P->y, modulus, &R->y) != MP_OKAY)     { goto error; } /* Ry = tmp - Py mod modulus */
-   if (mp_mod(&tmpx, modulus, &R->x) != MP_OKAY)              { goto error; } /* Rx = tmpx mod modulus */
+   if ((res = mp_sub(&P->x, &tmpx, &tmp)) != MP_OKAY)                 { goto error; } /* tmp = Px - tmpx */
+   if ((res = mp_mul(&tmp, &s, &tmp)) != MP_OKAY)                     { goto error; } /* tmp = tmp * s */
+   if ((res = mp_submod(&tmp, &P->y, modulus, &R->y)) != MP_OKAY)     { goto error; } /* Ry = tmp - Py mod modulus */
+   if ((res = mp_mod(&tmpx, modulus, &R->x)) != MP_OKAY)              { goto error; } /* Rx = tmpx mod modulus */
 
    res = CRYPT_OK;
    goto done;
 error:
-   res = CRYPT_MEM;
+   res = mpi_to_ltc_error(res);
 done:
    mp_clear_multi(&s, &tmpx, &tmp, NULL);
    return res;
@@ -362,12 +362,12 @@ static int ecc_mulmod(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus)
    int     first, bitbuf, bitcpy, bitcnt, mode, digidx;
 
   /* init barrett reduction */
-  if (mp_init(&mu) != MP_OKAY) {
-      return CRYPT_MEM;
+  if ((res = mp_init(&mu)) != MP_OKAY) {
+      return mpi_to_ltc_error(res);
   }
-  if (mp_reduce_setup(&mu, modulus) != MP_OKAY) {
+  if ((res = mp_reduce_setup(&mu, modulus)) != MP_OKAY) {
       mp_clear(&mu);
-      return CRYPT_MEM;
+      return mpi_to_ltc_error(res);
   }
 
   /* alloc ram for window temps */
@@ -748,7 +748,7 @@ done:
       z = (unsigned long)mp_unsigned_bin_size(num);  \
       STORE32L(z, buf2+y);                     \
       y += 4;                                  \
-      (void)mp_to_unsigned_bin(num, buf2+y);   \
+      if (mp_to_unsigned_bin(num, buf2+y) != MP_OKAY) { return CRYPT_MEM; }   \
       y += z;                                  \
 }
 
@@ -771,12 +771,12 @@ done:
                                                                  \
      /* load it */                                               \
      if (mp_read_unsigned_bin(num, (unsigned char *)in+y, (int)x) != MP_OKAY) {\
-        err = CRYPT_MEM;                                       \
+        err = CRYPT_MEM;                                         \
         goto error;                                              \
      }                                                           \
      y += x;                                                     \
      if (mp_shrink(num) != MP_OKAY) {                            \
-        err = CRYPT_MEM;                                       \
+        err = CRYPT_MEM;                                         \
         goto error;                                              \
      }                                                           \
 }

+ 3 - 8
ecc_sys.c

@@ -56,11 +56,6 @@ int ecc_encrypt_key(const unsigned char *inkey, unsigned long keylen,
        return err;
     }
 
-    /* Encrypt the key */
-    for (x = 0; x < keylen; x++) {
-      skey[x] ^= inkey[x];
-    }
-
     /* output header */
     y = PACKET_SIZE;
  
@@ -78,9 +73,9 @@ int ecc_encrypt_key(const unsigned char *inkey, unsigned long keylen,
     STORE32L(keylen, out+y);
     y += 4;
 
-    /* Store the encrypted key */
+    /* Encrypt/Store the encrypted key */
     for (x = 0; x < keylen; x++, y++) {
-      out[y] = skey[x];
+      out[y] = skey[x] ^ inkey[x];
     }
 
     /* store header */
@@ -324,7 +319,7 @@ int ecc_verify_hash(const unsigned char *sig, unsigned long siglen,
 
    _ARGCHK(sig != NULL);
    _ARGCHK(hash != NULL);
-   _ARGCHK(hash != NULL);
+   _ARGCHK(stat != NULL);
    _ARGCHK(key != NULL);
 
    /* default to invalid signature */

+ 4 - 1
hash.c

@@ -82,7 +82,10 @@ int hash_file(int hash, const char *fname, unsigned char *dst, unsigned long *ou
     }
 
     err = hash_filehandle(hash, in, dst, outlen);
-    (void)fclose(in);
+    if (fclose(in) != 0) {
+       return CRYPT_ERROR;
+    }
+
     return err;
 #endif
 }

+ 22 - 15
hmac.c

@@ -45,7 +45,7 @@ int hmac_init(hmac_state *hmac, int hash, const unsigned char *key, unsigned lon
     hmac->hash = hash;
 
     // (1) make sure we have a large enough key
-    hmac->hashsize = hashsize = hash_descriptor[hash].hashsize;
+    hashsize = hash_descriptor[hash].hashsize;
     if(keylen > HMAC_BLOCKSIZE) {
         z = (unsigned long)sizeof(hmac->key);
         if ((err = hash_memory(hash, key, keylen, hmac->key, &z)) != CRYPT_OK) {
@@ -82,8 +82,7 @@ int hmac_process(hmac_state *hmac, const unsigned char *buf, unsigned long len)
     if ((err = hash_is_valid(hmac->hash)) != CRYPT_OK) {
         return err;
     }
-    hash_descriptor[hmac->hash].process(&hmac->md, buf, len);
-    return CRYPT_OK;
+    return hash_descriptor[hmac->hash].process(&hmac->md, buf, len);
 }
 
 int hmac_done(hmac_state *hmac, unsigned char *hashOut, unsigned long *outlen)
@@ -101,15 +100,13 @@ int hmac_done(hmac_state *hmac, unsigned char *hashOut, unsigned long *outlen)
         return err;
     }
 
-    /* ensure the output size is valid */
+    /* get the hash message digest size */
     hashsize = hash_descriptor[hash].hashsize;
-    if (*outlen < hashsize) {
-       return CRYPT_BUFFER_OVERFLOW;
-    }
-    *outlen = hashsize;
 
     // Get the hash of the first HMAC vector plus the data
-    hash_descriptor[hash].done(&hmac->md, isha);
+    if ((err = hash_descriptor[hash].done(&hmac->md, isha)) != CRYPT_OK) {
+       return err;
+    }
 
     // Create the second HMAC vector vector for step (3)
     for(i=0; i < HMAC_BLOCKSIZE; i++) {
@@ -120,12 +117,18 @@ int hmac_done(hmac_state *hmac, unsigned char *hashOut, unsigned long *outlen)
     hash_descriptor[hash].init(&hmac->md);
     hash_descriptor[hash].process(&hmac->md, buf, HMAC_BLOCKSIZE);
     hash_descriptor[hash].process(&hmac->md, isha, hashsize);
-    hash_descriptor[hash].done(&hmac->md, hashOut);
+    hash_descriptor[hash].done(&hmac->md, buf);
+
+    // copy to output 
+    for (i = 0; i < hashsize && i < *outlen; i++) {
+        hashOut[i] = buf[i];
+    }
+    *outlen = i;
 
 #ifdef CLEAN_STACK
     zeromem(isha, sizeof(buf));
     zeromem(buf,  sizeof(isha));
-    zeromem(hmac->key, sizeof(hmac->key));
+    zeromem(hmac, sizeof(*hmac));
 #endif
     return CRYPT_OK;
 }
@@ -193,12 +196,16 @@ int hmac_file(int hash, const char *fname, const unsigned char *key,
    /* process the file contents */
    do {
       x = fread(buf, 1, sizeof(buf), in);
-      if ((err = hmac_process(&hmac, buf, (unsigned long)x)) != CRYPT_OK) { 
-         (void)fclose(in);
+      if ((err = hmac_process(&hmac, buf, (unsigned long)x)) != CRYPT_OK) {
+         /* we don't trap this error since we're already returning an error! */
+         fclose(in);
          return err;
       }
    } while (x == sizeof(buf));
-   (void)fclose(in);
+
+   if (fclose(in) != 0) {
+      return CRYPT_ERROR;
+   }
 
    /* get final hmac */
    if ((err = hmac_done(&hmac, dst, dstlen)) != CRYPT_OK) {
@@ -235,7 +242,7 @@ int hmac_test(void)
     unsigned char digest[MAXBLOCKSIZE];
     int i;
 
-    struct hmac_test_case {
+    static const struct hmac_test_case {
         int num;
         char *algo;
         unsigned char key[128];

+ 9 - 7
makefile

@@ -9,16 +9,16 @@
 # a build. This is easy to remedy though, for those that have problems.
 
 # The version
-VERSION=0.91
+VERSION=0.92
 
 #ch1-01-1
 # Compiler and Linker Names
-CC=gcc
-LD=ld
+#CC=gcc
+#LD=ld
 
 # Archiver [makes .a files]
-AR=ar
-ARFLAGS=r
+#AR=ar
+#ARFLAGS=r
 #ch1-01-1
 
 #ch1-01-3
@@ -66,7 +66,7 @@ OBJECTS=keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o \
 bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o \
 md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o des.o \
 safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o \
-prime.o twofish.o packet.o hmac.o strings.o rmd128.o rmd160.o $(MPIOBJECT)
+prime.o twofish.o packet.o hmac.o strings.o rmd128.o rmd160.o skipjack.o omac.o dsa.o $(MPIOBJECT)
 
 TESTOBJECTS=demos/test.o
 HASHOBJECTS=demos/hashsum.o
@@ -94,7 +94,9 @@ rsa.o: rsa.c rsa_sys.c
 ecc.o: ecc.c ecc_sys.c
 dh.o: dh.c dh_sys.c
 aes.o: aes.c aes_tab.c
+twofish.o: twofish.c twofish_tab.c
 sha512.o: sha512.c sha384.c
+sha256.o: sha256.c sha224.c
 
 #This rule makes the libtomcrypt library.
 library: $(LIBNAME)
@@ -140,7 +142,7 @@ install: library docs
 clean:
 	rm -f $(OBJECTS) $(TESTOBJECTS) $(HASHOBJECTS) $(CRYPTOBJECTS) $(SMALLOBJECTS) $(LEFTOVERS) $(LIBNAME)
 	rm -f $(TEST) $(HASH) $(COMPRESSED) $(PROFS) $(PROF) $(TVS) $(TV)
-	rm -f *stackdump *.lib *.exe *.obj demos/*.obj demos/*.o *.bat hash_tv.txt cipher_tv.txt
+	rm -f *.a *.dll *stackdump *.lib *.exe *.obj demos/*.obj demos/*.o *.bat *.txt
 
 #This builds the crypt.pdf file. Note that the rm -f *.pdf has been removed
 #from the clean command! This is because most people would like to keep the

+ 32 - 0
makefile.cygwin_dll

@@ -0,0 +1,32 @@
+
+
+default: ltc_dll
+
+
+# Compilation flags. Note the += does not write over the user's CFLAGS!
+CFLAGS += -I./ -Wall -Wsign-compare -W -Wno-unused -Wshadow -Werror -mno-cygwin -DWIN32
+
+# optimize for SPEED
+#CFLAGS += -O3 -funroll-loops
+
+#add -fomit-frame-pointer.  v3.2 is buggy for certain platforms!
+#CFLAGS += -fomit-frame-pointer
+
+# optimize for SIZE
+CFLAGS += -Os
+
+#Leave MPI built-in or force developer to link against libtommath?
+MPIOBJECT=mpi.o
+
+OBJECTS=keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o \
+bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o \
+md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o des.o \
+safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o \
+prime.o twofish.o packet.o hmac.o strings.o rmd128.o rmd160.o skipjack.o omac.o dsa.o $(MPIOBJECT)
+
+ltc_dll: $(OBJECTS) $(MPIOBJECT)
+	gcc -mno-cygwin -mdll -o libtomcrypt.dll -Wl,--out-implib=libtomcrypt.dll.a -Wl,--export-all-symbols *.o -ladvapi32
+	ranlib libtomcrypt.dll.a
+
+test: ltc_dll
+	gcc $(CFLAGS) demos/test.c libtomcrypt.dll.a -Wl,--enable-auto-import -o test -s

+ 3 - 2
makefile.msvc

@@ -10,7 +10,8 @@ OBJECTS=keyring.obj gf.obj mem.obj sprng.obj ecc.obj base64.obj dh.obj rsa.obj \
 bits.obj yarrow.obj cfb.obj ofb.obj ecb.obj ctr.obj cbc.obj hash.obj tiger.obj sha1.obj \
 md5.obj md4.obj md2.obj sha256.obj sha512.obj xtea.obj aes.obj des.obj \
 safer_tab.obj safer.obj safer+.obj rc4.obj rc2.obj rc6.obj rc5.obj cast5.obj noekeon.obj \
-blowfish.obj crypt.obj mpi.obj prime.obj twofish.obj packet.obj hmac.obj strings.obj rmd128.obj rmd160.obj
+blowfish.obj crypt.obj mpi.obj prime.obj twofish.obj packet.obj hmac.obj strings.obj rmd128.obj rmd160.obj \
+skipjack.obj omac.obj dsa.obj
 
 library: $(OBJECTS)
 	lib /out:tomcrypt.lib $(OBJECTS)
@@ -28,4 +29,4 @@ tv_gen: demos/tv_gen.c library
 	cl $(CFLAGS) demos/tv_gen.c tomcrypt.lib advapi32.lib 
 
 hashsum: demos/hashsum.c library
-	cl $(CFLAGS) demos/hashsum.c tomcrypt.lib advapi32.lib
+	cl $(CFLAGS) demos/hashsum.c tomcrypt.lib advapi32.lib

+ 5 - 1
makefile.out

@@ -9,11 +9,15 @@ CFLAGS += -Os -Wall -Wsign-compare -W -Wno-unused -Werror -I./
 
 default: library
 
-OBJECTS = keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o des.o safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o mpi.o prime.o twofish.o packet.o hmac.o strings.o 
+OBJECTS = keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o des.o safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o mpi.o prime.o twofish.o packet.o hmac.o strings.o rmd128.o rmd160.o skipjack.o omac.o dsa.o
 
 rsa.o: rsa_sys.c
 dh.o: dh_sys.c
 ecc.o: ecc_sys.c
+aes.o: aes.c aes_tab.c
+twofish.o: twofish.c twofish_tab.c
+sha512.o: sha384.c sha512.c
+sha256.o: sha256.c sha224.c
 
 library: $(OBJECTS)
 	 $(AR) r libtomcrypt.a $(OBJECTS)

+ 14 - 4
md2.c

@@ -47,7 +47,7 @@ static void md2_update_chksum(hash_state *md)
 /* caution, the RFC says its "C[j] = S[M[i*16+j] xor L]" but the reference source code [and test vectors] say 
    otherwise.
 */
-       L = (md->md2.chksum[j] ^= PI_SUBST[(int)(md->md2.buf[j] ^ L)]);
+       L = (md->md2.chksum[j] ^= PI_SUBST[(int)(md->md2.buf[j] ^ L)] & 255);
    }
 }
 
@@ -67,7 +67,7 @@ static void md2_compress(hash_state *md)
    /* do 18 rounds */
    for (j = 0; j < 18; j++) {
        for (k = 0; k < 48; k++) {
-           t = (md->md2.X[k] ^= PI_SUBST[(int)t]);
+           t = (md->md2.X[k] ^= PI_SUBST[(int)(t & 255)]);
        }
        t = (t + (unsigned char)j) & 255;
    }
@@ -84,11 +84,14 @@ void md2_init(hash_state *md)
    md->md2.curlen = 0;
 }
 
-void md2_process(hash_state *md, const unsigned char *buf, unsigned long len)
+int md2_process(hash_state *md, const unsigned char *buf, unsigned long len)
 {
     unsigned long n;
     _ARGCHK(md != NULL);
     _ARGCHK(buf != NULL);
+    if (md-> md2 .curlen > sizeof(md-> md2 .buf)) {                            
+       return CRYPT_INVALID_ARG;                                                           
+    }                                                                                       
     while (len > 0) {
         n = MIN(len, (16 - md->md2.curlen));
         memcpy(md->md2.buf + md->md2.curlen, buf, (size_t)n);
@@ -103,15 +106,21 @@ void md2_process(hash_state *md, const unsigned char *buf, unsigned long len)
             md->md2.curlen = 0;
         }
     }
+    return CRYPT_OK;
 }
 
-void md2_done(hash_state * md, unsigned char *hash)
+int md2_done(hash_state * md, unsigned char *hash)
 {
     unsigned long i, k;
 
     _ARGCHK(md != NULL);
     _ARGCHK(hash != NULL);
 
+    if (md->md2.curlen >= sizeof(md->md2.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
+
     /* pad the message */
     k = 16 - md->md2.curlen;
     for (i = md->md2.curlen; i < 16; i++) {
@@ -132,6 +141,7 @@ void md2_done(hash_state * md, unsigned char *hash)
 #ifdef CLEAN_STACK
     zeromem(md, sizeof(hash_state));
 #endif
+    return CRYPT_OK;
 }
 
 int md2_test(void)

+ 18 - 32
md4.c

@@ -53,12 +53,12 @@ const struct _hash_descriptor md4_desc =
   }
 
 #ifdef CLEAN_STACK
-static void _md4_compress(hash_state *md)
+static void _md4_compress(hash_state *md, unsigned char *buf)
 #else
-static void md4_compress(hash_state *md)
+static void md4_compress(hash_state *md, unsigned char *buf)
 #endif
 {
-    unsigned long x[16], a, b, c, d;
+    ulong32 x[16], a, b, c, d;
     int i;
 
     _ARGCHK(md != NULL);
@@ -71,7 +71,7 @@ static void md4_compress(hash_state *md)
 
     /* copy the state into 512-bits into W[0..15] */
     for (i = 0; i < 16; i++) {
-        LOAD32L(x[i], md->md4.buf + (4*i));
+        LOAD32L(x[i], buf + (4*i));
     }
  
     /* Round 1 */ 
@@ -137,10 +137,10 @@ static void md4_compress(hash_state *md)
 }
 
 #ifdef CLEAN_STACK
-static void md4_compress(hash_state *md)
+static void md4_compress(hash_state *md, unsigned char *buf)
 {
-   _md4_compress(md);
-   burn_stack(sizeof(unsigned long) * 20 + sizeof(int));
+   _md4_compress(md, buf);
+   burn_stack(sizeof(ulong32) * 20 + sizeof(int));
 }
 #endif
 
@@ -152,37 +152,22 @@ void md4_init(hash_state * md)
    md->md4.state[2] = 0x98badcfeUL;
    md->md4.state[3] = 0x10325476UL;
    md->md4.length  = 0;
-   md->md4.curlen = 0;
+   md->md4.curlen  = 0;
 }
 
-void md4_process(hash_state * md, const unsigned char *buf, unsigned long len)
-{
-    unsigned long n;
-    _ARGCHK(md != NULL);
-    _ARGCHK(buf != NULL);
-    while (len > 0) {
-        n = MIN(len, (64 - md->md4.curlen));
-        memcpy(md->md4.buf + md->md4.curlen, buf, (size_t)n);
-        md->md4.curlen += n;
-        buf            += n;
-        len            -= n;
-
-        /* is 64 bytes full? */
-        if (md->md4.curlen == 64) {
-            md4_compress(md);
-            md->md4.length += 512;
-            md->md4.curlen = 0;
-        }
-    }
-}
+HASH_PROCESS(md4_process, md4_compress, md4, 64)
 
-void md4_done(hash_state * md, unsigned char *hash)
+int md4_done(hash_state * md, unsigned char *hash)
 {
     int i;
 
     _ARGCHK(md != NULL);
     _ARGCHK(hash != NULL);
 
+    if (md->md4.curlen >= sizeof(md->md4.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
     /* increase the length of the message */
     md->md4.length += md->md4.curlen * 8;
 
@@ -197,7 +182,7 @@ void md4_done(hash_state * md, unsigned char *hash)
         while (md->md4.curlen < 64) {
             md->md4.buf[md->md4.curlen++] = (unsigned char)0;
         }
-        md4_compress(md);
+        md4_compress(md, md->md4.buf);
         md->md4.curlen = 0;
     }
 
@@ -208,7 +193,7 @@ void md4_done(hash_state * md, unsigned char *hash)
 
     /* store length */
     STORE64L(md->md4.length, md->md4.buf+56);
-    md4_compress(md);
+    md4_compress(md, md->md4.buf);
 
     /* copy output */
     for (i = 0; i < 4; i++) {
@@ -216,7 +201,8 @@ void md4_done(hash_state * md, unsigned char *hash)
     }
 #ifdef CLEAN_STACK
     zeromem(md, sizeof(hash_state));
-#endif
+#endif 
+    return CRYPT_OK;
 }
 
 int md4_test(void)

+ 17 - 30
md5.c

@@ -32,18 +32,18 @@ const struct _hash_descriptor md5_desc =
     a = (a + I(b,c,d) + M + t); a = ROL(a, s) + b;
 
 #ifdef CLEAN_STACK
-static void _md5_compress(hash_state *md)
+static void _md5_compress(hash_state *md, unsigned char *buf)
 #else
-static void md5_compress(hash_state *md)
+static void md5_compress(hash_state *md, unsigned char *buf)
 #endif
 {
-    unsigned long i, W[16], a, b, c, d;
+    ulong32 i, W[16], a, b, c, d;
 
     _ARGCHK(md != NULL);
 
     /* copy the state into 512-bits into W[0..15] */
     for (i = 0; i < 16; i++) {
-        LOAD32L(W[i], md->md5.buf + (4*i));
+        LOAD32L(W[i], buf + (4*i));
     }
  
     /* copy state */
@@ -124,10 +124,10 @@ static void md5_compress(hash_state *md)
 }
 
 #ifdef CLEAN_STACK
-static void md5_compress(hash_state *md)
+static void md5_compress(hash_state *md, unsigned char *buf)
 {
-   _md5_compress(md);
-   burn_stack(sizeof(unsigned long) * 21);
+   _md5_compress(md, buf);
+   burn_stack(sizeof(ulong32) * 21);
 }
 #endif
 
@@ -142,34 +142,20 @@ void md5_init(hash_state * md)
    md->md5.length = 0;
 }
 
-void md5_process(hash_state * md, const unsigned char *buf, unsigned long len)
-{
-    unsigned long n;
-    _ARGCHK(md != NULL);
-    _ARGCHK(buf != NULL);
-    while (len > 0) {
-        n = MIN(len, (64 - md->md5.curlen));
-        memcpy(md->md5.buf + md->md5.curlen, buf, (size_t)n);
-        md->md5.curlen += n;
-        buf            += n;
-        len            -= n;
+HASH_PROCESS(md5_process, md5_compress, md5, 64)
 
-        /* is 64 bytes full? */
-        if (md->md5.curlen == 64) {
-            md5_compress(md);
-            md->md5.length += 512;
-            md->md5.curlen = 0;
-        }
-    }
-}
-
-void md5_done(hash_state * md, unsigned char *hash)
+int md5_done(hash_state * md, unsigned char *hash)
 {
     int i;
 
     _ARGCHK(md != NULL);
     _ARGCHK(hash != NULL);
 
+    if (md->md5.curlen >= sizeof(md->md5.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
+
     /* increase the length of the message */
     md->md5.length += md->md5.curlen * 8;
 
@@ -184,7 +170,7 @@ void md5_done(hash_state * md, unsigned char *hash)
         while (md->md5.curlen < 64) {
             md->md5.buf[md->md5.curlen++] = (unsigned char)0;
         }
-        md5_compress(md);
+        md5_compress(md, md->md5.buf);
         md->md5.curlen = 0;
     }
 
@@ -195,7 +181,7 @@ void md5_done(hash_state * md, unsigned char *hash)
 
     /* store length */
     STORE64L(md->md5.length, md->md5.buf+56);
-    md5_compress(md);
+    md5_compress(md, md->md5.buf);
 
     /* copy output */
     for (i = 0; i < 4; i++) {
@@ -204,6 +190,7 @@ void md5_done(hash_state * md, unsigned char *hash)
 #ifdef CLEAN_STACK
     zeromem(md, sizeof(hash_state));
 #endif
+    return CRYPT_OK;
 }
 
 int  md5_test(void)

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 164 - 194
mpi.c


+ 2 - 2
mycrypt.h

@@ -16,8 +16,8 @@ extern "C" {
 #endif
 
 /* version */
-#define CRYPT   0x0091
-#define SCRYPT  "0.91"
+#define CRYPT   0x0092
+#define SCRYPT  "0.92"
 
 /* max size of either a cipher/hash block or symmetric key [largest of the two] */
 #define MAXBLOCKSIZE           128

+ 1 - 7
mycrypt_cfg.h

@@ -48,12 +48,6 @@ extern clock_t XCLOCK(void);
    #define ENDIAN_NEUTRAL
 #endif
 
-#ifdef SHA384
-   #ifndef SHA512
-      #error The SHA384 hash requires SHA512 to be defined!
-   #endif
-#endif
-
 #ifdef YARROW
    #ifndef CTR
       #error YARROW requires CTR chaining mode to be defined!
@@ -71,7 +65,7 @@ extern clock_t XCLOCK(void);
     #define PACKET_SECT_RSA        0
     #define PACKET_SECT_DH         1
     #define PACKET_SECT_ECC        2
-    #define PACKET_SECT_DSA        4
+    #define PACKET_SECT_DSA        3
 
     /* Subsection Tags for the first three sections */
     #define PACKET_SUB_KEY         0

+ 18 - 0
mycrypt_cipher.h

@@ -95,6 +95,12 @@ struct noekeon_key {
 };
 #endif
 
+#ifdef SKIPJACK 
+struct skipjack_key {
+    unsigned char key[10];
+};
+#endif
+
 typedef union Symmetric_key {
 #ifdef DES
    struct des_key des;
@@ -133,6 +139,9 @@ typedef union Symmetric_key {
 #ifdef NOEKEON
    struct noekeon_key  noekeon;
 #endif   
+#ifdef SKIPJACK
+   struct skipjack_key skipjack;
+#endif
 } symmetric_key;
 
 /* A block cipher ECB structure */
@@ -312,6 +321,15 @@ extern int noekeon_keysize(int *desired_keysize);
 extern const struct _cipher_descriptor noekeon_desc;
 #endif
 
+#ifdef SKIPJACK
+extern int skipjack_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
+extern void skipjack_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
+extern void skipjack_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
+extern int skipjack_test(void);
+extern int skipjack_keysize(int *desired_keysize);
+extern const struct _cipher_descriptor skipjack_desc;
+#endif
+
 #ifdef ECB
 extern int ecb_start(int cipher, const unsigned char *key, 
                      int keylen, int num_rounds, symmetric_ECB *ecb);

+ 4 - 1
mycrypt_custom.h

@@ -16,7 +16,6 @@
 #define XCLOCK clock
 #define XCLOCKS_PER_SEC CLOCKS_PER_SEC
 #define SMALL_CODE
-#define CLEAN_STACK
 #define LTC_TEST
 #define BLOWFISH
 #define RC2
@@ -31,6 +30,7 @@
 #define DES
 #define CAST5
 #define NOEKEON
+#define SKIPJACK
 #define CFB
 #define OFB
 #define ECB
@@ -39,6 +39,7 @@
 #define SHA512
 #define SHA384
 #define SHA256
+#define SHA224
 #define TIGER
 #define SHA1
 #define MD5
@@ -47,12 +48,14 @@
 #define RIPEMD128
 #define RIPEMD160
 #define HMAC
+#define OMAC
 #define BASE64
 #define YARROW
 #define SPRNG
 #define RC4
 #define DEVRANDOM
 #define MRSA
+#define MDSA
 #define MDH
 #define MECC
 #define DH768

+ 102 - 33
mycrypt_hash.h

@@ -10,7 +10,7 @@ struct sha512_state {
 #ifdef SHA256
 struct sha256_state {
     ulong64 length;
-    unsigned long state[8], curlen;
+    ulong32 state[8], curlen;
     unsigned char buf[64];
 };
 #endif
@@ -18,7 +18,7 @@ struct sha256_state {
 #ifdef SHA1
 struct sha1_state {
     ulong64 length;
-    unsigned long state[5], curlen;
+    ulong32 state[5], curlen;
     unsigned char buf[64];
 };
 #endif
@@ -26,7 +26,7 @@ struct sha1_state {
 #ifdef MD5
 struct md5_state {
     ulong64 length;
-    unsigned long state[4], curlen;
+    ulong32 state[4], curlen;
     unsigned char buf[64];
 };
 #endif
@@ -34,7 +34,7 @@ struct md5_state {
 #ifdef MD4
 struct md4_state {
     ulong64 length;
-    unsigned long state[4], curlen;
+    ulong32 state[4], curlen;
     unsigned char buf[64];
 };
 #endif
@@ -58,7 +58,7 @@ struct md2_state {
 struct rmd128_state {
     ulong64 length;
     unsigned char buf[64];
-    unsigned long curlen, state[4];
+    ulong32 curlen, state[4];
 };
 #endif
 
@@ -66,7 +66,7 @@ struct rmd128_state {
 struct rmd160_state {
     ulong64 length;
     unsigned char buf[64];
-    unsigned long curlen, state[5];
+    ulong32 curlen, state[5];
 };
 #endif
 
@@ -106,87 +106,101 @@ extern struct _hash_descriptor {
     unsigned long hashsize;       /* digest output size in bytes  */
     unsigned long blocksize;      /* the block size the hash uses */
     void (*init)(hash_state *);
-    void (*process)(hash_state *, const unsigned char *, unsigned long);
-    void (*done)(hash_state *, unsigned char *);
+    int (*process)(hash_state *, const unsigned char *, unsigned long);
+    int (*done)(hash_state *, unsigned char *);
     int  (*test)(void);
 } hash_descriptor[];
 
 #ifdef SHA512
 extern void sha512_init(hash_state * md);
-extern void sha512_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void sha512_done(hash_state * md, unsigned char *hash);
+extern int sha512_process(hash_state * md, const unsigned char *buf, unsigned long len);
+extern int sha512_done(hash_state * md, unsigned char *hash);
 extern int  sha512_test(void);
 extern const struct _hash_descriptor sha512_desc;
 #endif
 
 #ifdef SHA384
+#ifndef SHA512
+   #error SHA512 is required for SHA384
+#endif
 extern void sha384_init(hash_state * md);
-extern void sha384_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void sha384_done(hash_state * md, unsigned char *hash);
+#define sha384_process sha512_process
+extern int sha384_done(hash_state * md, unsigned char *hash);
 extern int  sha384_test(void);
 extern const struct _hash_descriptor sha384_desc;
 #endif
 
 #ifdef SHA256
 extern void sha256_init(hash_state * md);
-extern void sha256_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void sha256_done(hash_state * md, unsigned char *hash);
+extern int sha256_process(hash_state * md, const unsigned char *buf, unsigned long len);
+extern int sha256_done(hash_state * md, unsigned char *hash);
 extern int  sha256_test(void);
 extern const struct _hash_descriptor sha256_desc;
+
+#ifdef SHA224
+#ifndef SHA256
+   #error SHA256 is required for SHA224
+#endif
+extern void sha224_init(hash_state * md);
+#define sha224_process sha256_process
+extern int sha224_done(hash_state * md, unsigned char *hash);
+extern int  sha224_test(void);
+extern const struct _hash_descriptor sha224_desc;
+#endif
 #endif
 
 #ifdef SHA1
 extern void sha1_init(hash_state * md);
-extern void sha1_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void sha1_done(hash_state * md, unsigned char *hash);
+extern int sha1_process(hash_state * md, const unsigned char *buf, unsigned long len);
+extern int sha1_done(hash_state * md, unsigned char *hash);
 extern int  sha1_test(void);
 extern const struct _hash_descriptor sha1_desc;
 #endif
 
 #ifdef MD5
 extern void md5_init(hash_state * md);
-extern void md5_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void md5_done(hash_state * md, unsigned char *hash);
+extern int md5_process(hash_state * md, const unsigned char *buf, unsigned long len);
+extern int md5_done(hash_state * md, unsigned char *hash);
 extern int  md5_test(void);
 extern const struct _hash_descriptor md5_desc;
 #endif
 
 #ifdef MD4
 extern void md4_init(hash_state * md);
-extern void md4_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void md4_done(hash_state * md, unsigned char *hash);
+extern int md4_process(hash_state * md, const unsigned char *buf, unsigned long len);
+extern int md4_done(hash_state * md, unsigned char *hash);
 extern int  md4_test(void);
 extern const struct _hash_descriptor md4_desc;
 #endif
 
 #ifdef MD2
 extern void md2_init(hash_state * md);
-extern void md2_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void md2_done(hash_state * md, unsigned char *hash);
+extern int md2_process(hash_state * md, const unsigned char *buf, unsigned long len);
+extern int md2_done(hash_state * md, unsigned char *hash);
 extern int  md2_test(void);
 extern const struct _hash_descriptor md2_desc;
 #endif
 
 #ifdef TIGER
 extern void tiger_init(hash_state * md);
-extern void tiger_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void tiger_done(hash_state * md, unsigned char *hash);
+extern int tiger_process(hash_state * md, const unsigned char *buf, unsigned long len);
+extern int tiger_done(hash_state * md, unsigned char *hash);
 extern int  tiger_test(void);
 extern const struct _hash_descriptor tiger_desc;
 #endif
 
 #ifdef RIPEMD128
 extern void rmd128_init(hash_state * md);
-extern void rmd128_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void rmd128_done(hash_state * md, unsigned char *hash);
+extern int rmd128_process(hash_state * md, const unsigned char *buf, unsigned long len);
+extern int rmd128_done(hash_state * md, unsigned char *hash);
 extern int  rmd128_test(void);
 extern const struct _hash_descriptor rmd128_desc;
 #endif
 
 #ifdef RIPEMD160
 extern void rmd160_init(hash_state * md);
-extern void rmd160_process(hash_state * md, const unsigned char *buf, unsigned long len);
-extern void rmd160_done(hash_state * md, unsigned char *hash);
+extern int rmd160_process(hash_state * md, const unsigned char *buf, unsigned long len);
+extern int rmd160_done(hash_state * md, unsigned char *hash);
 extern int  rmd160_test(void);
 extern const struct _hash_descriptor rmd160_desc;
 #endif
@@ -202,13 +216,44 @@ extern int hash_memory(int hash, const unsigned char *data, unsigned long len, u
 extern int hash_filehandle(int hash, FILE *in, unsigned char *dst, unsigned long *outlen);
 extern int hash_file(int hash, const char *fname, unsigned char *dst, unsigned long *outlen);
 
+/* a simple macro for making hash "process" functions */
+#define HASH_PROCESS(func_name, compress_name, state_var, block_size)                       \
+int func_name (hash_state * md, const unsigned char *buf, unsigned long len)               \
+{                                                                                           \
+    unsigned long n;                                                                        \
+    _ARGCHK(md != NULL);                                                                    \
+    _ARGCHK(buf != NULL);                                                                   \
+    if (md-> state_var .curlen > sizeof(md-> state_var .buf)) {                             \
+       return CRYPT_INVALID_ARG;                                                            \
+    }                                                                                       \
+    while (len > 0) {                                                                       \
+        if (md-> state_var .curlen == 0 && len >= block_size) {                             \
+           compress_name (md, (unsigned char *)buf);                                        \
+           md-> state_var .length += block_size * 8;                                        \
+           buf             += block_size;                                                   \
+           len             -= block_size;                                                   \
+        } else {                                                                            \
+           n = MIN(len, (block_size - md-> state_var .curlen));                             \
+           memcpy(md-> state_var .buf + md-> state_var.curlen, buf, (size_t)n);             \
+           md-> state_var .curlen += n;                                                     \
+           buf             += n;                                                            \
+           len             -= n;                                                            \
+           if (md-> state_var .curlen == block_size) {                                      \
+              compress_name (md, md-> state_var .buf);                                      \
+              md-> state_var .length += 8*block_size;                                       \
+              md-> state_var .curlen = 0;                                                   \
+           }                                                                                \
+       }                                                                                    \
+    }                                                                                       \
+    return CRYPT_OK;                                                                        \
+}
+
 #ifdef HMAC
 typedef struct Hmac_state {
-     hash_state md;
-     int hash;
-     unsigned long hashsize; /* here for your reference */
-     hash_state hashstate;
-     unsigned char key[MAXBLOCKSIZE];
+     hash_state     md;
+     int            hash;
+     hash_state     hashstate;
+     unsigned char  key[MAXBLOCKSIZE];
 } hmac_state;
 
 extern int hmac_init(hmac_state *hmac, int hash, const unsigned char *key, unsigned long keylen);
@@ -222,3 +267,27 @@ extern int hmac_file(int hash, const char *fname, const unsigned char *key,
                      unsigned long keylen, 
                      unsigned char *dst, unsigned long *dstlen);
 #endif
+
+#ifdef OMAC
+
+typedef struct {
+   int             cipher_idx, 
+                   buflen,
+                   blklen;
+   unsigned char   block[MAXBLOCKSIZE],
+                   prev[MAXBLOCKSIZE],
+                   Lu[2][MAXBLOCKSIZE];
+   symmetric_key   key;
+} omac_state;
+
+extern int omac_init(omac_state *omac, int cipher, const unsigned char *key, unsigned long keylen);
+extern int omac_process(omac_state *state, const unsigned char *buf, unsigned long len);
+extern int omac_done(omac_state *state, unsigned char *out, unsigned long *outlen);
+extern int omac_memory(int cipher, const unsigned char *key, unsigned long keylen,
+                const unsigned char *msg, unsigned long msglen,
+                unsigned char *out, unsigned long *outlen);
+extern int omac_file(int cipher, const unsigned char *key, unsigned long keylen,
+              const char *filename, unsigned char *out, unsigned long *outlen);
+extern int omac_test(void);
+#endif
+

+ 1 - 2
mycrypt_misc.h

@@ -11,8 +11,7 @@ extern int base64_decode(const unsigned char *in,  unsigned long len,
 extern void zeromem(void *dst, size_t len);
 extern void burn_stack(unsigned long len);
 
-/* ch1-01-1*/
 extern const char *error_to_string(int err);
-/* ch1-01-1*/
+extern int mpi_to_ltc_error(int err);
 
 extern const char *crypt_build_settings;

+ 26 - 0
mycrypt_pk.h

@@ -170,3 +170,29 @@ extern int ecc_verify_hash(const unsigned char *sig,  unsigned long siglen,
                            const unsigned char *hash, unsigned long hashlen, 
                                  int *stat, ecc_key *key);
 #endif
+
+#ifdef MDSA
+
+typedef struct {
+   int type, qord;
+   mp_int g, q, p, x, y;
+} dsa_key;
+
+extern int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key);
+extern void dsa_free(dsa_key *key);
+
+extern int dsa_sign_hash(const unsigned char *in,  unsigned long inlen,
+                        unsigned char *out, unsigned long *outlen,
+                        prng_state *prng, int wprng, dsa_key *key);
+
+extern int dsa_verify_hash(const unsigned char *sig, unsigned long siglen,
+                           const unsigned char *hash, unsigned long inlen, 
+                           int *stat, dsa_key *key);
+
+extern int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key);
+
+extern int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key);
+
+extern int dsa_verify_key(dsa_key *key, int *stat);
+
+#endif

+ 101 - 40
noekeon.c

@@ -24,7 +24,7 @@ static const ulong32 RC[] = {
 };
 
 
-#define kTHETA(a, b, c, d)                               \
+#define kTHETA(a, b, c, d)                                 \
     temp = a^c; temp = temp ^ ROL(temp, 8) ^ ROR(temp, 8); \
     b ^= temp; d ^= temp;                                  \
     temp = b^d; temp = temp ^ ROL(temp, 8) ^ ROR(temp, 8); \
@@ -32,11 +32,9 @@ static const ulong32 RC[] = {
 
 #define THETA(k, a, b, c, d)                               \
     temp = a^c; temp = temp ^ ROL(temp, 8) ^ ROR(temp, 8); \
-    b ^= temp; d ^= temp;                                  \
-    a ^= k[0]; b ^= k[1];                                  \
-    c ^= k[2]; d ^= k[3];                                  \
+    b ^= temp ^ k[1]; d ^= temp ^ k[3];                    \
     temp = b^d; temp = temp ^ ROL(temp, 8) ^ ROR(temp, 8); \
-    a ^= temp; c ^= temp;
+    a ^= temp ^ k[0]; c ^= temp ^ k[2];
     
 #define GAMMA(a, b, c, d)     \
     b ^= ~(d|c);              \
@@ -89,7 +87,9 @@ void noekeon_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_k
 #endif
 {
    ulong32 a,b,c,d,temp;
+#ifdef SMALL_CODE
    int r;
+#endif
 
    _ARGCHK(key != NULL);
    _ARGCHK(pt != NULL);
@@ -98,17 +98,32 @@ void noekeon_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_k
    LOAD32L(a,&pt[0]); LOAD32L(b,&pt[4]);
    LOAD32L(c,&pt[8]); LOAD32L(d,&pt[12]);
    
-#define ROUND(i) \
-       a ^= RC[r+i]; \
+
+#ifdef SMALL_CODE
+#define ROUND \
+       a ^= RC[r]; \
        THETA(key->noekeon.K, a,b,c,d); \
        PI1(a,b,c,d); \
        GAMMA(a,b,c,d); \
        PI2(a,b,c,d);
 
-   for (r = 0; r < 16; r += 2) {
-       ROUND(0);
-       ROUND(1);
+   for (r = 0; r < 16; ++r) {
+       ROUND;
    }
+#else 
+
+#define ROUND(i) \
+       a ^= RC[i]; \
+       THETA(key->noekeon.K, a,b,c,d); \
+       PI1(a,b,c,d); \
+       GAMMA(a,b,c,d); \
+       PI2(a,b,c,d);
+
+   ROUND( 0); ROUND( 1); ROUND( 2); ROUND( 3);
+   ROUND( 4); ROUND( 5); ROUND( 6); ROUND( 7);
+   ROUND( 8); ROUND( 9); ROUND(10); ROUND(11);
+   ROUND(12); ROUND(13); ROUND(14); ROUND(15);
+#endif
 
 #undef ROUND
 
@@ -134,7 +149,9 @@ void noekeon_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_k
 #endif
 {
    ulong32 a,b,c,d, temp;
+#ifdef SMALL_CODE
    int r;
+#endif
 
    _ARGCHK(key != NULL);
    _ARGCHK(pt != NULL);
@@ -143,18 +160,35 @@ void noekeon_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_k
    LOAD32L(a,&ct[0]); LOAD32L(b,&ct[4]);
    LOAD32L(c,&ct[8]); LOAD32L(d,&ct[12]);
    
-#define ROUND(i) \
+
+#ifdef SMALL_CODE
+
+#define ROUND \
        THETA(key->noekeon.dK, a,b,c,d); \
-       a ^= RC[r-i]; \
+       a ^= RC[r]; \
        PI1(a,b,c,d); \
        GAMMA(a,b,c,d); \
        PI2(a,b,c,d); 
-       
 
-   for (r = 16; r > 0; r -= 2) {
-       ROUND(0);
-       ROUND(1);
+   for (r = 16; r > 0; --r) {
+       ROUND;
    }
+
+#else
+
+#define ROUND(i) \
+       THETA(key->noekeon.dK, a,b,c,d); \
+       a ^= RC[i]; \
+       PI1(a,b,c,d); \
+       GAMMA(a,b,c,d); \
+       PI2(a,b,c,d); 
+
+   ROUND(16); ROUND(15); ROUND(14); ROUND(13);
+   ROUND(12); ROUND(11); ROUND(10); ROUND( 9);
+   ROUND( 8); ROUND( 7); ROUND( 6); ROUND( 5);
+   ROUND( 4); ROUND( 3); ROUND( 2); ROUND( 1);
+
+#endif
    
 #undef ROUND
 
@@ -176,31 +210,58 @@ int noekeon_test(void)
 {
  #ifndef LTC_TEST
     return CRYPT_NOP;
- #else    
-   static const unsigned char
-          key[] = 
-             { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
-          pt[] = 
-             { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
-          ct[] = 
-             { 0x57, 0x9a, 0x6c, 0xe8, 0x91, 0x16, 0x52, 0x53,
-               0x32, 0x00, 0xca, 0x0a, 0x17, 0x5d, 0x28, 0x0e };
-   unsigned char tmp[2][16];
-   int err;
-   symmetric_key skey;
-   
-   if ((err = noekeon_setup(key, 16, 0, &skey)) != CRYPT_OK) {
-      return err;
-   }
-   
-   noekeon_ecb_encrypt(pt, tmp[0], &skey);
-   noekeon_ecb_decrypt(tmp[0], tmp[1], &skey);
-   
-   if (memcmp(tmp[0], ct, 16) != 0 || memcmp(tmp[1], pt, 16) != 0) {
-      return CRYPT_FAIL_TESTVECTOR;
+ #else
+ static const struct {
+     int keylen;
+     unsigned char key[16], pt[16], ct[16];
+ } tests[] = {
+   {
+      16,
+      { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
+      { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
+      { 0x57, 0x9a, 0x6c, 0xe8, 0x91, 0x16, 0x52, 0x53,
+               0x32, 0x00, 0xca, 0x0a, 0x17, 0x5d, 0x28, 0x0e }
    }
-   
-   return CRYPT_OK;
+ };
+ symmetric_key key;
+ unsigned char tmp[2][16];
+ int err, i, y;
+ 
+ for (i = 0; i < (int)(sizeof(tests)/sizeof(tests[0])); i++) {
+    zeromem(&key, sizeof(key));
+    if ((err = noekeon_setup(tests[i].key, tests[i].keylen, 0, &key)) != CRYPT_OK) { 
+       return err;
+    }
+  
+    noekeon_ecb_encrypt(tests[i].pt, tmp[0], &key);
+    noekeon_ecb_decrypt(tmp[0], tmp[1], &key);
+    if (memcmp(tmp[0], tests[i].ct, 16) || memcmp(tmp[1], tests[i].pt, 16)) { 
+#if 0
+       printf("\n\nTest %d failed\n", i);
+       if (memcmp(tmp[0], tests[i].ct, 16)) {
+          printf("CT: ");
+          for (i = 0; i < 16; i++) {
+             printf("%02x ", tmp[0][i]);
+          }
+          printf("\n");
+       } else {
+          printf("PT: ");
+          for (i = 0; i < 16; i++) {
+             printf("%02x ", tmp[1][i]);
+          }
+          printf("\n");
+       }
+#endif       
+        return CRYPT_FAIL_TESTVECTOR;
+    }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 16; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) noekeon_ecb_encrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 1000; y++) noekeon_ecb_decrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 16; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
+ }       
+ return CRYPT_OK;
  #endif
 }
 

+ 1755 - 0
notes/cipher_tv.txt

@@ -0,0 +1,1755 @@
+Cipher Test Vectors
+
+These are test encryptions with key of nn bytes '00 01 02 03 .. (nn-1)' and original PT of the same style.
+The output of step N is used as the key and plaintext for step N+1 (key bytes repeated as required to fill the key)
+
+Cipher: aes
+Key Size: 16 bytes
+ 0: 0A940BB5416EF045F1C39458C653EA5A
+ 1: 2B20AF92A928562CF645B1B824F2E6D9
+ 2: FC29C3356937ECC3159D8D6EF5E883A1
+ 3: 4C07B5A2EF31A3229C87AB2E4DE88602
+ 4: 93AFA1147E793FFCC3D852695A62D008
+ 5: D4BCC317DC9AFE0E6C7AD1E76F79DBE9
+ 6: FEDB3371F3C65162AFCCDC6D18C79A65
+ 7: 4AF2A76F93F07C14161C16B5C176E439
+ 8: 00A1A596AF7CF44FD12981FA12CB1515
+ 9: 8013D7006AB38AEBD40D0DC10328751C
+10: 81A077F3A262FA4D00D98EE4D1BEC390
+11: 0CCBC99A3135F26D2BE824D633C0366F
+12: CDBB5568610AD428706408B64DB66E50
+13: CE94461EB0D57C8DB6AEB2BC8E8CE1D2
+14: 06F14868F4298979462595C0FBF33F5A
+15: FE22A7097513246074B7C8DFD57D32B2
+16: 0F2D936610F6D9E32C0E624568BB8E6F
+17: F32BCD92B563D475E98322E5850AC277
+18: 6E6FCB72930D81469F9E05B20FD406C0
+19: 42FF674CBA6C19C4AD84D42816173099
+20: 41C12474A49B6B2B5E7D38E03A4DD4E0
+21: F9E234E3CE3FCED184C775B6140AD733
+22: 7EB5CC6B183D8B3EB4FBA4717CD8838A
+23: CB6C5D78F9721E5BF8E980F0EDCAD4AF
+24: B3F20EF6C26FD9301576D82DA6D50809
+25: F9375037377D86599FB4F241166C43E9
+26: 98BAF9AB7402479C2DA356F5DAE35D5F
+27: 58D1A8E0DC3BC53FD995BB0F60F25FE7
+28: 0A75C0D22D2627C97BA2A7344B9B8C74
+29: 88C299B2F8C9EDAF86A301BBF534BDA7
+30: 755E3A17420281F2C619588A6B521FF9
+31: 0E540DD25C0C147461146E11F832A63D
+32: DC5B58691C6BA5B243036A41301BD7D1
+33: E9299A7336C2D8A51D6C7E2BD1B8F054
+34: 78CA6F682FC649DB289DD62D28D3A22D
+35: 98D96EDA081DE416083650B22BD3869D
+36: E747DE96D122CE1EF6F89BDE0FAE75FF
+37: E48DDF2EDDEB54C861A1E42F5B649EEE
+38: C650C2CF1E903B7F9C8536A2446CA762
+39: CF0BCDCE0F1FE7EB40016C1231FB2962
+40: 37B1C8BE3812147E0D5D115A797663EF
+41: 45DD8184581049C4B28FBC0809690C5D
+42: 11B0D889F96E677EEC2E934E9F7F5398
+43: CEC30BC1128A96CD506E406B5ADFAE19
+44: DE67D5439BF83D5338D53F362FCF79B6
+45: 724FBB2D95CBEABC568AA44941D9B6E5
+46: C63F480DA3C73B2A661F1FBC3E4D1F89
+47: 225CD18789D18FF09C982EF38AEF0AAF
+48: B493DEC7E3D11911DEF8788102453670
+49: 23E0B12A67DF025CB77CBDF9E295FCAF
+
+Key Size: 24 bytes
+ 0: 0060BFFE46834BB8DA5CF9A61FF220AE
+ 1: 597FA00D03EDDC81C2575B4DD6B6AEFD
+ 2: 4881E4EF69005DCB9110BA327CAC8460
+ 3: FC4A968AF65FCFF45E4698455918673D
+ 4: 3079D7B27A3DA5C0805A61CC37109EE0
+ 5: 9B3F2C7C35806276E2C53826EC1B3C84
+ 6: FCDFCB1FD9FCF1B63E1AB6737FC154E8
+ 7: 4A8012AFD410D29CE2CEE0FD195EF9DA
+ 8: 9F4201C4174C71A3AEF8FD6822197D67
+ 9: DE3E5E98DA60E895389A1C17E3D50DA1
+10: 20C9064A076C01D1BC121A5A2A1F913C
+11: BA41A36CD24B515545B8B464B244E5BE
+12: 2CC1DE9DBCAC45269C6DBBC9203095F4
+13: 2ED2499CFEB30203E6305B3E1C329C4D
+14: FD709FC0AB48B204C95B74AD189C8832
+15: 7ED298B472C53A4CB7A3BAE588805E86
+16: CB0C6FE2BA76901F9EDE752634DCC31D
+17: 6C5CA6EFCF7101881507AB8770ACF1DE
+18: DEC3C5209E98BBFAA469C5FE6C02A674
+19: CFAC040C1198C8264679CACEAA7E9DE7
+20: EF990992EBA8ECA7E5F95E3B9D69D3A4
+21: 8FC1B640EB55A96D08D83D1184B77769
+22: E1F3DFB9D055BCB2D6CED6DCB8361BFB
+23: 6621F47057706F2A079819DBC0197B9C
+24: 882611AC68778CBD6A46FB5DD4611A37
+25: F35E1367A283CC641FBCE26512A8F2F1
+26: 5A4A71F69056CFBAB67DDA777F5CD945
+27: C446F2BFAD060A9E9E17F71B05ADABD0
+28: 1F0E50F71A67FAA7D169A7A1017FFD65
+29: A6A38588848915509451A2354D2AAC8E
+30: 4C887574F2C5DB00ED4FBAF814A70302
+31: 1B642944162A049CCA9FD0284D7AB4C3
+32: 431BD9293C5BFD12F948C255C838880B
+33: 32CD23A30039AE2FB80B804B905362B1
+34: EBB30E07E7517580A645CD1B5F664182
+35: 292F2BB28BB172620B05C7621BA347D6
+36: 46C06E1223F392D57B98EFCF4C832C18
+37: 451DFBAD2AA92080204F85432236A42C
+38: 768D6206D2B3DD1B9C26FAA5977A6477
+39: 3705F9CEBFE8F91ECE07F84578C05494
+40: 085EB0DCF360F5403FF1E7402A0F7A03
+41: 2A0D56F2E7C7FCE3095F511BDE4AD9A2
+42: A8AB2F3643A61AF164F99FEFAE2CE1B4
+43: E73FD4B1FAE0E5E6A6A31CCC2AF96386
+44: 578E84FD1AA16FF350374E4FD5FDD529
+45: EEAE301DD57084801DB01F8B9C4036CE
+46: 1C44A93B404298327857F71962E0604C
+47: B5F64CD5835C85A68DC23E26D4B8FF80
+48: 6C6F97850A87088AF195D0500B3F5D78
+49: 0BAB3A60A25CD1A750C2C443AA01C57A
+
+Key Size: 32 bytes
+ 0: 5A6E045708FB7196F02E553D02C3A692
+ 1: 5F7229D6AACF0DAFE3B518C0D4ADBAB4
+ 2: 96477F47C0A6F482AC4036D2C60FAAD8
+ 3: 7F791D54914F12E9F0D92F4416EFBEC0
+ 4: 87DDB19415BEDC42BD361FE380553C5A
+ 5: 8EDB2A09DC8731DB76D9F67A03AC4D9E
+ 6: 269A7C08C28D5E4D9355DDBA161F862E
+ 7: 042A3397BA5029C443DD76755008DB2A
+ 8: 469C82A94BC5F7B2DF57F0CE1716EE74
+ 9: 5A84A93077FA19146078310035F4B7E4
+10: 28CAF1C0D811F86CFD3C5EFC30DF79F9
+11: 05B575D06C2D593B708F7C695CE97571
+12: B7E8CACF0A0BD7F2F5DA0B09CC8B8AEC
+13: 0ADDE90F66F1BCF38CEC63EFBF9DBD46
+14: 9BF99E7F5B8F176DD686AF017D5196E2
+15: ABC189EE80D4A4588B3D54DDACCD9778
+16: A57405378580B1E8A8D877791300374C
+17: D1EF03F72FAB3DB68022FC60A2CEC13D
+18: 3D2406231BA17FF7CC973C5E203872DF
+19: C3E07233BD101502953D6186001838E4
+20: DC281C0CE02A83098C80D6C9463F3449
+21: A923023D2390B2230FCE9217776AAAFC
+22: 92E28E69009959FB84046C5ED1B64D1A
+23: CEF8F684EC64A31C651280CDC942DFC2
+24: 5A954684B22691F9CFC60442A654EF61
+25: 56A38A0D93188BAA50DFAF2CB799A76C
+26: 54503340C5DE26679AA5F35215DE85EA
+27: E74BFAF64946DFD699583FF9C47A1EAF
+28: 01F234F9868B085E9B1A2EC84738E2DB
+29: BBCA3DAEAB24EF25BC7B623F4D9FD680
+30: 3956C880F7F7D94ABC259D3D86157F27
+31: 4672C2149054C839C537BDA1F5BBF8F4
+32: CF1E9ACBEB391062593BD88C7948F64D
+33: CA5B4E867AE9D8BA2D4416C908EB99F1
+34: 36666180C768636CF1708CC5C85A6875
+35: 53E396D2755218675494C7AA515A2310
+36: C2B7D31A59A602A65E155F80353DB83D
+37: 0EBCE19FF6FC03E327A2602F858D835E
+38: E47CC2A5E6C7FEF185806E2CFB304D91
+39: D61F15FF75E0F523FA3872132A09AF42
+40: DCC25495052980986AE30756BA0417DA
+41: 451BF5B7C1F1AED9F3D5E18A391EA4DA
+42: 1B6B105C580083D23F3A8EACE41B7984
+43: 8C2F86CD6C86B67C9EBDCAFC5720E4F8
+44: 41360BDB3E4C6836BE0D15B659CEC5AA
+45: F972104AD851BAE0AD963817A3F03F58
+46: 396095F7C102B5A238110DD3D6D4ADFF
+47: F58391AEB9A5D8BB32A3055B37556E81
+48: A23789B146CE89C876F3C331901261D8
+49: 2684AF345C4B13FA154E93A3E2CD2A90
+
+
+Cipher: blowfish
+Key Size: 8 bytes
+ 0: 84BF44A1442B8217
+ 1: 3981205BDD22C01E
+ 2: 0ACC5CCBA118CD07
+ 3: DF76980D5E089145
+ 4: A8503E8D849C599D
+ 5: 5E56574687038F5F
+ 6: D63296B036996F50
+ 7: FD2FD7A0669A9E7A
+ 8: BC6583720A962585
+ 9: 4B38C2856256103E
+10: 48A4FA354DB3A8A6
+11: EF97C32734BE2A10
+12: A7467E9C729F8123
+13: 04D2507F9C4B5854
+14: 57F76A4D406B22D1
+15: ED0A3B26D842C8F2
+16: 047CB457E9730CD1
+17: 9F13BB1A97BF5E2F
+18: 628CA4F77161C95A
+19: 37C7D8EF718DFD50
+20: 2C9A9C655B839B1E
+21: AB222D66579DBE0D
+22: 57950CDEAD6FAE88
+23: 67AAB3669431E403
+24: 6B35C87144F6B748
+25: 94C2E8A1DBC963C2
+26: ECD68F56EED1F78E
+27: 2E7BE0B866B1D3C7
+28: 6671DCDCB3D8EED4
+29: 8ACBE7A2F77FBB35
+30: 0BF0AC4EAE284F93
+31: 29928AE5DC8A57C6
+32: 84E48C27E21264DF
+33: 4EF0E943E4F48ED3
+34: DA155BEFBFFD2638
+35: 611EC83E0931FFBE
+36: 3BDDEC15BC543A92
+37: D7B9564BBAEE19FC
+38: DE44907E9F0A1F11
+39: C8638C0594D13614
+40: 9E67F1B15418BF14
+41: EDF531A083F72852
+42: 7E5F8F9A72890BB3
+43: 2A0B060E3EDDE9C3
+44: 9B4B0F6FE6511106
+45: 328658F222C7FCE4
+46: F6F1B50B4F9F9C93
+47: A620519E69952F5E
+48: 24DA24DFE96AD818
+49: 226C43435FBDA34A
+
+Key Size: 32 bytes
+ 0: 46CDCC4D4D14BA2E
+ 1: C079641BD6584E5A
+ 2: 38828DF8B4C4920C
+ 3: B4ABCF6B78A721F3
+ 4: 8E7E2914CBBA708C
+ 5: C0EBE7002C888495
+ 6: C60F404DE7CF9B78
+ 7: B29E843E1771EF26
+ 8: 983033386CA6A09B
+ 9: 76F1F89AFDCF7130
+10: BED4E2114F4376FA
+11: 879A2B9D19AFAB87
+12: 366201BC87532AE5
+13: 6F409580FA907A64
+14: F7A202F00A38863E
+15: 98B0A9C79FFC27B1
+16: 1CB68D9BBF8A1A8A
+17: C21A2C54E5471D23
+18: 76A81C3DFC149934
+19: C7A0627412FC323A
+20: A034684D7058E7A6
+21: AC87722F27029BC2
+22: 36A6C2AF10245E3E
+23: 1F85B90D11217EBE
+24: 9C2A0C383A4AB7D5
+25: 11D5C689039CA179
+26: B0B38C7077E1450B
+27: C59C7DCCC3B8A1BB
+28: 9BC539F29208AC24
+29: 8546F17C77C60C05
+30: B189C3E92AF53844
+31: 3C7689163B8D2776
+32: 6AFEB9A0671156A8
+33: 05514E39F2990008
+34: C941E31A2A1F42BF
+35: 87C3777C74A730A0
+36: 2861667755C8B727
+37: AF75A0312433B151
+38: F76939331E9C9792
+39: 819FF8C81FC7C8DC
+40: 31E7B07EB03D170D
+41: 696E5EC1A741170E
+42: 6C5BF0E0BA48FEC3
+43: 6D751BCCDC475797
+44: BB5A91D0CA7E60F4
+45: 7F7EC0531C88B14C
+46: 9F302392529B70E8
+47: CAC9A1A88F09AC1D
+48: 39D56A652E02D5B0
+49: 13641D42BC126517
+
+Key Size: 56 bytes
+ 0: 373C66BBA50EB9CC
+ 1: A4E8C602AE3A2CEB
+ 2: A59F08BA78502F32
+ 3: D0D4968015F4E4FF
+ 4: 0D3C2F291E6C2EE0
+ 5: 3F99F5DADAD5FD2C
+ 6: 5BA41EC1A506396D
+ 7: 0BDE3B5B50591D35
+ 8: 5C4A6AEFA69A115D
+ 9: ADABFE96D6D159E8
+10: F97F0B9C88ACD5C0
+11: 8882A163F0F02BB2
+12: F00556C9F5A56A32
+13: 257615BEC96CC228
+14: D58DAEC547DD8B89
+15: E677F4953EC44097
+16: 20156D066DC37000
+17: 6F18E01C6FDF947E
+18: C8DFF24F12621237
+19: 032F91C5119AE308
+20: 394194AD8BC1E5CF
+21: 6F24E937F3925581
+22: 086A4510D95759F3
+23: 073204BADF0EE942
+24: 5BC8B8E402D90F43
+25: A10B7E9D01DD3809
+26: 22C0B183AFFDA506
+27: 216306AE6DDBAF3F
+28: E275E1F52430A1FD
+29: C3BDB49D588D31BB
+30: B860818C5923B688
+31: BE1BC7A444B0E141
+32: E4C4B67900DBC8DB
+33: 36D7B7ECB6679A9C
+34: C1EAD201EE34BEF7
+35: 9ABBC877CE825B14
+36: 3B211121C0C3C09A
+37: BE3B34FF2E83F5A7
+38: 46C2B3E628A53EAD
+39: B7E7DDE16C7DFF62
+40: 3C9A14C4226EBCC5
+41: C5FD46242DB29704
+42: D45A96723FF62201
+43: BB015D10878CF70D
+44: 71DB021BE398D41A
+45: 06F52D237F06C260
+46: 3552F47E8CCFC73F
+47: 769E33828AD5D88E
+48: 659861DDF080AA67
+49: CF7A13782F317342
+
+
+Cipher: xtea
+Key Size: 16 bytes
+ 0: 256004E1F55BC0C7
+ 1: 2D385C151A691C42
+ 2: F93BFEA758A7DDB4
+ 3: 2A905D97C0CA3E48
+ 4: 12C7C2787B913AE6
+ 5: FB24B1F32549EF59
+ 6: 2A8BFF867FB4FF73
+ 7: 5692243526C6BA77
+ 8: 4CD423ADFCDD1B6C
+ 9: 9B99AFC35EB2FED0
+10: 416B4AA4E07DA7F4
+11: 4DBC9052ABFF9510
+12: 8AF9457F8E599216
+13: BC3CA2B1C7267395
+14: E4BE31DF42282F7A
+15: B344CA8AA57E9E40
+16: 57A1F94CD2F4576D
+17: 96177FCD28BFF1BB
+18: 78A1F63A0EBAAC33
+19: 5F3FCBCD7442B617
+20: D6F7CD5ECA688967
+21: D92EDF70CBDE703F
+22: E2E2C2EE5D18E58E
+23: 4BF00478CB7833C3
+24: F9936D550815FE8F
+25: 19A3B07B3E47D7D8
+26: ACA441F099A7E30C
+27: F70183F199988E3F
+28: 0A41FC22F369310A
+29: ABFAF40853A4A38C
+30: 6B5D29DB1155D96B
+31: 0DD0C08A27561D66
+32: 4C56E22292F17AA3
+33: 3F925ED65613DF4A
+34: 521B4C97081DC901
+35: 2B1EC3E1C8CF84EC
+36: 2A412556F42A48F6
+37: 0A57B8A527DFE507
+38: EB55C9C157E3C922
+39: 6E6D6E9AB925ED92
+40: A4C5C90A0D4A8F16
+41: 7F9F9F658C427D55
+42: 9A5139994FF04C3F
+43: 9054771F027E29BC
+44: 90543E7BAED313BD
+45: 5DEC1EBE6A617D36
+46: 19AB6A708CDB9B2D
+47: BABB97BB5CF9D4E4
+48: 2C2ADC05AF255861
+49: 52266710153E3F7E
+
+
+Cipher: rc5
+Key Size: 8 bytes
+ 0: 04F6B9B18E6828C1
+ 1: BEA50D165E50EA04
+ 2: 6F3728FE19F09B03
+ 3: C682C26278B372FE
+ 4: 78BCC81E144E1B0F
+ 5: B62775716366450F
+ 6: 5BC49690F97CBCFC
+ 7: 359414E9EACDE379
+ 8: D3331D8ECBF684FF
+ 9: 13129FB10EAFC82E
+10: 7F29218421CC4B5A
+11: FC225A4F31A75162
+12: 29BF8BFDA8A15D37
+13: 6854AC5BD98EEE95
+14: DEF05AB6D102E992
+15: 317C3EA6F0600016
+16: D6F3658B2E80B77F
+17: 7C1DF7ED6C92C23D
+18: F8665145BAFE28C5
+19: 9D8059C34B79F0EF
+20: DC8D1617D3EBC7DB
+21: 2D8FF59FCA19BE6C
+22: 5C6956743715EA13
+23: 91160BE1F4F3D4A0
+24: 1D482C2359EC93F5
+25: 9C21D1A3755A7251
+26: E48D1BB926D51E63
+27: 08A054946263F617
+28: 9C900BA37199B7C7
+29: 0C6C58743EC83082
+30: B24197EEB5603D3D
+31: CF5B735F8A492E49
+32: 337C504698BBE553
+33: 3A2BCCC88BE9ED51
+34: F3E9241743203ABF
+35: B67BCC625815C585
+36: F8E96E4EEBC2566C
+37: E27D162006C67C8D
+38: 08CE8C1A5E3C169A
+39: 0CF8AD04125EFCD8
+40: 6712F9F044864FAA
+41: 0FD465AFFD64085E
+42: 6BA8C82B3974391F
+43: A5FFF24CE9659357
+44: 0947F81E1EB4970E
+45: DEA966CA50243067
+46: 1F1BE4866F48E39F
+47: 03A7D7CE793F52C7
+48: A1FADE3F801B414A
+49: DE7DA6D14A50E305
+
+Key Size: 68 bytes
+ 0: C8704ABBDA9624EE
+ 1: C719C645E301FC16
+ 2: 32D82553B0E35EF8
+ 3: C63C77EE6C2A6E36
+ 4: F84EDA1E77ECB5F0
+ 5: 382C1E72AA1FD1BC
+ 6: 6B00939F535F9C83
+ 7: 3CE0825AE10C2B0E
+ 8: 1F9E7738602BDD0A
+ 9: 9273E7933CED0B0A
+10: 4CAB45EEA45C32DC
+11: FD0208C6A89FB519
+12: 520D8E6912E9551D
+13: 5B88684544868BD5
+14: 32AA2A8EE58135D4
+15: 281045702DD38766
+16: 26D68E073C996747
+17: 23DFB9E174D86192
+18: E32FD5AF5101E45C
+19: 3DEFB679670A143C
+20: E616394D859BFE94
+21: 217B9BE0ED47DDAD
+22: 4F7901A5620EA484
+23: 6654C042783F5737
+24: 752AA74BACF9BE65
+25: 2FAEBEB8B325F89B
+26: 6FEA020B058F32CB
+27: 2A32682A36691665
+28: 338C8AB628A30105
+29: DFAE9DD082DFE38C
+30: 51B451C29DBA19C4
+31: A2993DA9B8C1D5FD
+32: 24D92FA331E2F93A
+33: 821A961C0524C89D
+34: A07BF305EE8964D9
+35: 981652361262C5CE
+36: 3DD770C3761B695B
+37: F36359AFE1C8A07C
+38: BEBC629B8938F4A3
+39: 2E31DC53F77898B3
+40: 52E4104C4E8E6901
+41: 75C912DA610525EA
+42: 2F280F70963F82DE
+43: D7E3FCCA75AEE5DF
+44: 8EBC7E825A14A2BB
+45: C1138701F64187DB
+46: 1294E21ED2550DFA
+47: 577820D772BE2C8E
+48: 48CE93C46BFD33CD
+49: 3B50D264382E03BC
+
+Key Size: 128 bytes
+ 0: 236CF0A207576E8E
+ 1: AC12D8F1AE55F057
+ 2: CEC4230F747B547A
+ 3: 61EA1B510D033B26
+ 4: E064F51998E20804
+ 5: 6247797DF02BAEF7
+ 6: D25A766244063A7F
+ 7: 2C2B3FDDA0E07067
+ 8: 04EED646C3F6FF90
+ 9: 05487E7702865E4A
+10: 6C0A92AC23ED07C5
+11: 6E54E768C797F797
+12: A7C53BF7B252A884
+13: 731052795E12C80B
+14: 3E4DAD15A826C43D
+15: 10B1191B4012C2A0
+16: ADD244B33AEAEF7E
+17: F6CC7B5F0885E056
+18: E23489F3B7BE438E
+19: B0C27661692FDE4C
+20: E81CE014DA769F07
+21: 7A8BE0D2D52623A8
+22: 082F444E00D5E127
+23: AE42F684ADD1DAC7
+24: 9061BA686F76A450
+25: 9BEB7141B8F6F5F0
+26: 38CBA9933AEF85E7
+27: C66F4245901CB341
+28: 8659AA47E6B06BC3
+29: 357AB20DCE2DDA3E
+30: 236689C2F36976D9
+31: 331EFD7D5CF7AD50
+32: C373526C2D44DB80
+33: 79F7ACBA770F5C92
+34: 64325C5A67F364F6
+35: DF2F720829FF1694
+36: 9EE17F47ED487BC6
+37: C41067896AF4CFC5
+38: 5776E1E5FBE59933
+39: 07A05B1508B739E0
+40: B19EF72A65B3C035
+41: F8BF5FF4095C0173
+42: 7F1226C6CA7B4072
+43: 8A6C8F26A97DD33B
+44: 62948A9A627E98AD
+45: 9EC58E3F8A477D21
+46: A656F285AE0684B4
+47: 8489690681A53EE5
+48: 940915E733721837
+49: 1221956BCEE0143B
+
+
+Cipher: rc6
+Key Size: 8 bytes
+ 0: 6533F7041D69B9B883A5305180A85520
+ 1: 496683D6356950E8F4AF4582630BE46C
+ 2: CA421828FCFCEF2F042F6D81F14CBE76
+ 3: 92DB67F2F057858FC806E071D239F245
+ 4: 203CDFE0C36434AEDDBE2DA68ADC5EF0
+ 5: 8EB23BDBD58A279C1F3BF75199FC9E34
+ 6: 8FA8BB4E772E09DD1EFBE03090E77FF8
+ 7: 2018803BFD91D157AE20C6E8FF1894B0
+ 8: 267319634294F0684AFA7B26EB612B3C
+ 9: 108745E1F2E80864D9043582CD5550EE
+10: E4F9EFE5A6C426BB719EA17174890D0A
+11: EFFD4CAE649740B3309692AA19ACA227
+12: EB909E6D0789F649538E7EA1686FC0F9
+13: 0216851E23EDAE52D9964939DA0A7493
+14: D6A9CD3429D1679D26A9599EBDE5409A
+15: 5DCDECA6E89A7F0EB40649EFDE6420AF
+16: B74FD556B06C07BA8D9E517348CC66CC
+17: 9A22CB5B73EF1DDE68A5AEF1B1510ECC
+18: 77F78557143E08A7449A75A13098FEF8
+19: 548FE6700BD17D0AE247B07C2F1AB0E7
+20: B7DFD8CB428A36733BBE9A51CF45C072
+21: E7E8B7AA2D93E3DE99C543A473CC6760
+22: 3FA5821248B0F0AEB5CF00EEF7958F5E
+23: 0A655AC6C51DB33849BCDA72DAE106F1
+24: 9EE93EAB01E1A1DC57B698C266469481
+25: A7D398720E0ABA2D0D143D8306FD5AC8
+26: 98A46C94125BD2E5600BD26EEA420F2A
+27: F4789EDC3C50BC4186816F14A86403D1
+28: F8AFBA8EC652EFDC3AF5EA5CFE143E16
+29: CEEEBD4B6724A30E1859A5B4EF9B2B3D
+30: 766715B4C4FA7CD4B365A2A67C79E48A
+31: 92C5EB7BE61155D79DE0A6F55715DA22
+32: 42CF0C9B2BAACB085CB1603688037D0F
+33: 6C4BE816F7B573CCFA8BB6E399EEB17F
+34: B6D7E606CC99D267ECCFDBC006878691
+35: 2048B58B74F9A721B2E33D2EB86F5991
+36: 3E458C1015ECB08CC7B8980135E71893
+37: E4E28A032CF2F3C8262CD4BBE7A4CDF8
+38: 701EAA449AD9E5AF81DF3F436AB25620
+39: D1C3FB7C16F5249503EB389A692B112F
+40: 7012790DB65526DC87F9A2BF0FBB5664
+41: B782A3104FFE65DDB340F713ACFFE25B
+42: A155F033E4536FB1176EBDF9EB5FEC4C
+43: 8898BCC7A008127014850D5529327352
+44: 8F4B3BE150FAA0371CDE69891E52A3C9
+45: D371C8283F68DE983C98D98A7563B934
+46: DEB679915E8F0D0B65B37918BE4596F7
+47: 84D74F7FA199304A47BB37B8AF893CF0
+48: 5367B0187496539F6DF6CCE0965B376D
+49: 4B9C6011D43CF2D8FAFA2E7105D85024
+
+Key Size: 68 bytes
+ 0: 6BBF763FF30876A4BBB68A7E7E290770
+ 1: 59852279E82E98B8B680E5CEE12BB99A
+ 2: F96989565E5B163EA483FF74ACA22DC9
+ 3: 221F7A410F5AD73C1C67DEBA99683E0A
+ 4: 55F058D1D9B8C372E2A28AB6E953A851
+ 5: 24A8F7E07620A55D69CC3981B92E5CCE
+ 6: F4D9DA95BF66FE28BA3A84E77E62822D
+ 7: EE7EAC2BD34DDE6F83E6D4F23C0A49D3
+ 8: 4218AA697FB7C5D897E66EB00A9FB489
+ 9: 55A8CDF8608A3B1A6B14275E2258A096
+10: 18D50743982F5C8A5C528BDB5896CDFC
+11: 391403B889F0CEE865893EBE9F1BF90A
+12: F3CA9C30C163C510432D3207DB6967EA
+13: B14B6574DF53257BE4508DBE78843B47
+14: F52F1E5FD6FB19C1F5466276F9C33A97
+15: 9D5AABA86E8B65E4F633B6EDE17516E8
+16: 9038CF746F722DA1A0C34461359FD378
+17: 398E317E9CC074C2293B59598F72EA64
+18: 9D75D897D487DD2B5BC534B4B223ADD1
+19: 6C6DFF734BFB9700EDD6B3CFC6E311F7
+20: E27591407CA9771F227A5B6B3A77C928
+21: 1618F15FFA8E2692A3B3EF8EB6151427
+22: FA426AC6161F31F0D63FC9DA97A6A393
+23: 1281869E9959DED2CF75F50DA7FAB66A
+24: E8BF17E4B76D6DC5C1D07DC80970665A
+25: 9A869B6C5EEF391C7E7C4585FFD9FF3A
+26: 59564F799AFC984D39A8168D1A30C8C8
+27: 1D3927AA2E2C48E6CFEF88D04ADD30DE
+28: 39BF89DE1365DF15A8ABA86856ED074B
+29: 0CCC4A4DEB36A000E7EB271F5EE54543
+30: 26476623D35A514B8833D868426A2BE9
+31: C3C85993EA15AB2D056D670707851802
+32: BF5F7ED18E1320BAD536DCEDEE1A9AF7
+33: 337BDC5FF0F7AD44E6A3F5D6712BD5DF
+34: 7DBA76B3D9C818D0CE1A530BC79E77D2
+35: 20DF55E617CD2598F18534DA7A22B555
+36: B0A0C1BDF9E81B4F07F47D31A9CC8408
+37: CB9586F4B27F759B9B9C6C7DB01D26A8
+38: 1E79A2894906A64098AC43799CEFED38
+39: 82FA120F237EB0B3A1F8B52379B8346F
+40: 3DB9848603E3B1134585E5C9001D119B
+41: A750875900E244996887EC995131D151
+42: 12133748D3745F77C161470A921F73BD
+43: A265C351694574B44517FDAD8816133F
+44: 5E50CC8281C2A69FD376250D99620DD3
+45: 443ABBC1AD5605A0BA05B8E6ABA5D2A1
+46: 73546A87B39C54F0639EBEC118ADA007
+47: 380244C822817453C75405B727D67C4B
+48: 73F1E23DFF05EFAB5D39E503031C4165
+49: 8030071491490590A8913AE4B5D082CC
+
+Key Size: 128 bytes
+ 0: 24B06811BD97AE9512B3799E3189DCD3
+ 1: 92DBA6269E880F8D8A09143D792A46DE
+ 2: F956F459C333DFBA4C6A309C613DD661
+ 3: C31488EA551CC0FC8885F6817CA696FF
+ 4: F59634FE907F9DF9467BD1059F82DAAC
+ 5: 051AF11DD2FCF742169B58A786128CE7
+ 6: 87326A3A4A98CC15B23DFBFFC5AE16D3
+ 7: 58FCDE2E88A79D5682729ADB4D971142
+ 8: EAA787D68EB68CA79CCC6BFAC3BE9247
+ 9: 8BCF6980AEED36AF38B68A50DD454AF0
+10: 4B0E31AE48E903DFF52939800BB16DC0
+11: 19766AA929B40840715D53D9170C986F
+12: F9CAEB36F03CE7B3BB363AC7EB3ACF99
+13: C8E34A6BDEDA4DB836DF3D863D02A6EB
+14: 370547CEA441FDCBAFD281A8653BE2D4
+15: 77E0F33343158A8C3AC3C6D14FD69431
+16: 7A985B1368F842C644538C654D081FD3
+17: 60E0C8933F43D40003030196E8E881AC
+18: 3473474B58AE6BC7582ADD7AE24711B7
+19: 75936C8D46F6D5AF5C7EE0E8DCEB5AB2
+20: 4A04F619FB0E05F7B07C43F4B9F2E134
+21: FD53A5A7F4F0B9D933E38D9F07AC88CD
+22: F62EE43B20F582AC77879AD7E66FCCAC
+23: 4436AD771624896683D7D29E8879F89F
+24: F88F3C0EF2B9FD0CA997BEF17787DA2F
+25: FF5576F42CE9A0665A1D6A2420A691D0
+26: C077D6AEBA65B61CD1A9AAE17FCFC04D
+27: 84D0D7C52D6DB3979BC3F6F34456CB91
+28: F163121D9EB7569CA7DE3B7619E0BE51
+29: 727D23FB43215467B57DC67A8890CF26
+30: 60BA577F3C6627267D7B33E693FB7BCB
+31: 82C66B23586CCEA2AE1480B469B3F3C3
+32: A65092726D6CF2F77CE00648E2D117B0
+33: EC30662CBA891A3380B846DA6C64024E
+34: CE1B253FBCE36B217ED1EFBAAAD2E783
+35: 9D963CD5E65A9ECD2DAEE93B6C6C1178
+36: 1B8E3D07E7BD4BB4248B6A7DF8935980
+37: DBC3FD5888B80C4CEFC6C5E170E271CE
+38: 307CA8CDDFE5DA152B66E10346BB2E1C
+39: 8858250F933650D978B403A4504EA581
+40: F06005FA6E56E0C0D96988A3FAD359FC
+41: 816CBE37FDE3719804DBFD093E3FD87D
+42: 4878C07B127D696214393DDC66F5EB36
+43: EFBA6045243050C0D8D82046B17008E8
+44: 3D30C3E5892D32BA3C685DC5B186E959
+45: D4A4C41F0E6687E4021FB90D7A8A9F81
+46: FE1057B2013308C4CE839B4186F43B4C
+47: D7333AC65F66ED6D4BB8D069E265020F
+48: 33C262F58BF0D91DF2047E799BAA5F37
+49: B960A18764D7A6E17FA1F88487EFF192
+
+
+Cipher: safer+
+Key Size: 16 bytes
+ 0: 7D42607880B424C27E5A73A34FECE686
+ 1: 1A99D469F1946EA46523083FBAA79CBB
+ 2: 831385E400FD681C8A30AAD9477F1ABB
+ 3: 5C1BB8F259CDEC2C1BE0B803C7D9447F
+ 4: C57C1CBB18D87FCF72A87B247392752D
+ 5: 1625183B0C595A33FE0E8AE0DCE40ADE
+ 6: 4AF3A9D6733DC4FFF3422AA5BE5ADC94
+ 7: 853133894C87A23318DFAD2B247FBFF3
+ 8: 8C7F68E01A8413D19B9A479246E54722
+ 9: 8620898ECD3BF91A47CC54E6D9987FA7
+10: 33F12ABB7CC6A9041543A2073AEDFFA7
+11: A096E46F2834F79C096D0B655EDC9A63
+12: 3DD0D7824A87C9F5D8D25F5AF57E70B7
+13: 6B7C99E5CD29AC1C5A8D66AB460E5AD5
+14: 95A9F6009AB4DD2AC7E8E45F36D91E9C
+15: 60CCEFC6630329C341782B17365995A2
+16: 0276C96A7B1191BC16C8A9C98468DB05
+17: 1F352CB77C21139C058837B8194E3E64
+18: 2DB8E340F58844705F217551782F6B4D
+19: 34E99832E0722C5AE8F0CA1A50E9E7E2
+20: 7E1538DC10C1F56C3723A87BFD127743
+21: 36B9714A8ACDC8B8A17E85E2803A8C88
+22: 11848329B0DB9DC7768C07D95F0CF662
+23: 93ECEDEB4C6369AC56AF1F49345720A6
+24: A3ED7F9D17067C2650728E266B623124
+25: F33574590B435D1DDBBA925F0D0EA8AD
+26: 87E542DBD40DCBD80C4AB52555C264C1
+27: 6D806991AB8E3604C8267AC1EBEC2E21
+28: 4B7333F87EBB46BB2A8ECD392C85A12B
+29: 4FF49ACA62898F558AC065B66CAD0234
+30: 62DE7B2133B09544EDD0DF66DC4F5E2A
+31: 82195B39FF7B8A85D7F0EE52D19E510F
+32: 24FA56176A4F0B37F851CBAB176C9702
+33: 85FA9230D9B93CDCC0752FC738211703
+34: D441132032BDAC6715F4453CBC2434D8
+35: 438AB9BEA8A900368D84EF870EAF7E84
+36: 433BE5BFE1529BFA7C5688CFE3BD4DE5
+37: 2A79FB6F37AA08533445B8BEA5098EA2
+38: B9C986EE45D204B6A1CA152944912C9F
+39: 8289C9F78760D02AA71873FD97E2ECB8
+40: 48B0D1244523165055BE9A5E95CF852E
+41: 471E211E5E784C2AF476DB3CB555CF35
+42: F290CBEB1F1009D250F7B12E044B80C3
+43: 1B9796D80C3976FE3071B1C01154D42E
+44: A80E21A1A1007B69E8BCAE728BBE6A92
+45: 652058EF0FAF8549424F998669660931
+46: 89418FB4740E9801F6DFFEDC593FA32E
+47: 907561A69CFA117F167A52B88777D89C
+48: EA2EB4B1EE739320F99894B476A8A51E
+49: E627E64AAB6E2FF6B99643A7FBB84BFC
+
+Key Size: 24 bytes
+ 0: E8975F94A8B1392FBA78CBDDCC8E8F08
+ 1: 708CEFB68A0281AEA424B3D4698D2F2B
+ 2: 21A0DE56545BC950FCE4DF209C96CE6F
+ 3: F2CA4103B703264D46CBC09E13D5B8EE
+ 4: 2892101077FEE427C434CCFBBAB598B5
+ 5: C2F191CC5C681CBFC098B264C479B2AD
+ 6: 308C3B794C8A7971BBA96FE4C727F48E
+ 7: 8A4F9D4463B5DC4DD461ED0763CDAEA2
+ 8: B7E1BBBE455AEDF18329A6EECD6E222C
+ 9: C80DAAE7FBDF56DE05A897FBDBB53DEC
+10: 6A3D38758BF0390156F22F83C20F0262
+11: CA493DF771E37A93822D6117ED14B60C
+12: 623012748826A08F3C59B71FF3D66327
+13: A283BCB126B9795D306B129035BCC2DC
+14: 3790A6704BB0F119139A0264F7E8B2C8
+15: 9B369BBC095428EBD712517B2C4D06F0
+16: 0F488018162193ADB11E4C39CFDEE0DC
+17: 8AFB7C6FD7D6DD64C2C77DA3A0D91EE2
+18: B8BEFA241BA339BF6F059464C533F9F0
+19: E76141C8CD54200FAB2F8C2B76AF5FEE
+20: 80B4FE57851C0240D81E78DA8200F195
+21: 8BF1C690EF5FCE7ADC74E31C24F83F5E
+22: D30C4F78703BDE91750E0E49FA0E8982
+23: 86C5D1E0B88EF0AF9B899850510000EB
+24: FDE727442BCC0305A7B06E6EE179D836
+25: 0B4A719342F9226FA680796887A98FA5
+26: 980D4BE9AF3E3CF9D4558478D1DD03AB
+27: 03ECD11992D3D5864B8D1987966BA544
+28: 8DBC2931D7D17657BF38E3931F486850
+29: 76AE069E39FA7308BBF507ABE35BC1E8
+30: 9541B59CE18EA255CDC06DFD3FFCD1C1
+31: 5A382748AE3641ABF6D9CA24A35B2002
+32: 9B7A49DCC2CFC5A6078AB41E6F62B4CD
+33: 91B2EAC878E5628DBCC7C876B91B73D1
+34: 31125CFFC41A0D3528FB16BAE761C47A
+35: 916D2A769DA002ADCA8C87F8241BB50D
+36: 681C3F601EE5D82F9B040932F2FB4AEF
+37: 6B6F32E5EAC2F424074C33F7C988D5FE
+38: D15A5FDC2A4956DE61BA6E1C98867242
+39: 0747BCFE1B979E947EED5225FAFCA44F
+40: 133B43C85CCBC360DF8649BBBD2EB45B
+41: 052D943062A6D475D30100EA412C30EE
+42: BD6401C591D585F4A82CDCF678679D5B
+43: F95D1A5E338F56760C425D972D67B57B
+44: 9B1569308608CA00BB1E2BC9E20289A7
+45: B6454C52C64F64D69F1D36D2D224A222
+46: 529B5B013AE3F37E38BE340D1D200A64
+47: 1B65904F177212AC8E9ED4D8DB287810
+48: CD5CAC56236E0B9A25A5D306F12D8C4B
+49: 01DF7E1D0F5F7A5DAA0B379388425126
+
+Key Size: 32 bytes
+ 0: 7FBC212996ECE9CA2C4D5BD88FA0B3D9
+ 1: EA3D788C25CF3BE7F4101EDECF23455B
+ 2: BD0B98481366AE0869ABA11DB18D1E95
+ 3: 53393E2B757C90489EB6B47F67837337
+ 4: E1D350640CCA6C13648C3B57BE00B950
+ 5: 951E1EF99E6DE72744A9D8D9EBFBA94E
+ 6: 433E4D4E64B41818097BD5E2EBA01D8E
+ 7: 8FCBD07E303B381B2935FB82CA0CBF13
+ 8: CF46569005BD968B9310149E892B4D69
+ 9: F1B672657C2657AD53BFFE2BA5DDE1D2
+10: 0035337210703240F9CF2F5A9184FDB7
+11: 773951841F77DCF8A6730109DEDF3E9A
+12: E47DC0FB381DB86EBD208A0D649E7B03
+13: 0D9E34ADB257146EAB95AF14636301D2
+14: AB5D5C106E52AC7662C26F9F27F2CD55
+15: 6938F205DC23C3500B7723281E9F626F
+16: 3CABD52558D7F418CAF6B41CEC334DAD
+17: D2192F1E5AFC3B989C42C396B3764862
+18: 59D32E3A41141C6CAA2A8F44FD587D94
+19: 483CFECF65D71CB2994E1C12A1A7F907
+20: 8F086AD81B1FD5B13195EDB4DAB7DC73
+21: EFEB1328CE7AE6A63E7D8B3ECA9E12B9
+22: 362AAE308B3BBA588DBCFBB7197E693C
+23: B817A136EB30CD127B5015A85A7B6E95
+24: 03796E7F244CC916BE02AF61E5FEC42F
+25: 5854F2889CFF44B0688718C23B0A822D
+26: 0F772AC6E37364AA7B844AEACB33F4A2
+27: B3E95F5195BA646DAF333AA89130451F
+28: 911A32AF7CC44309B37D75E158A4AB18
+29: 232CFE228EB72A949616B307C2BEED15
+30: 7C8989F135B8DE6FD26C7792B8354F35
+31: E79231779BFB9F792BD179C0625280A8
+32: 015F6CCAE8A1275A2E836A207D8254EA
+33: 4EB94709245CE1FBF7C6D9587FA92D40
+34: 63D82005320F974EFDC4C021FB73ABB5
+35: 0F15B2E8E389C2D59289D7DA41ABD07D
+36: CEE7FBBF766540D4E39903D0494DB797
+37: FB564C18A15D53108C1954FCD3518FC1
+38: A67C5F4A4A95AF2BD8E4FC1182B2EEBB
+39: 0D354E664C35B9364E4EE9DB8DE0CA76
+40: 3295826D52F3B980B50EFF3E9317F1CB
+41: BC65592A9C0BADD84F363A175EE6BC54
+42: 58DE762ADA621FE2A7A6A83F68E93213
+43: AD774FC8402F7DDBB881B703EC836057
+44: F1C95AD5E004AF35AE315AE88A2577FA
+45: 968775A2C3485875B024B008D96182EC
+46: 623E736238B5800ACD9B67D76C84D236
+47: 1C5E9F65D43343D743E50C80D0E0F648
+48: A62E4A197E15CF90C2569DC38D9FC915
+49: 165B139BE483A71381B9A8E93D9473DA
+
+
+Cipher: twofish
+Key Size: 16 bytes
+ 0: 9FB63337151BE9C71306D159EA7AFAA4
+ 1: 8CC5A931DEC29B4C7D85595D24FF8405
+ 2: E867FC0E144FDEA24FEA88D22D8776EA
+ 3: B450A2969C67D93E1AE3A4093BA4C48F
+ 4: 7AEA41F9956149F336612E868E42B3C4
+ 5: F201FBB730E6E58CF9E5AD1DC4844C4C
+ 6: 13D8869E66412C6C288B5D7F37F2D94A
+ 7: CD57DDDDB782C0A04C40E47D920799DC
+ 8: 65371C8ABC919EC09004A7D63D9302BF
+ 9: CC31DFD3B7DCCC86866CC79D45A89C3F
+10: 541D548D311714EF8661BFA721568D16
+11: 269F3AA2D2D10DBD3DD3992BFEE23C05
+12: F86DA5D73AFBA94A9D592D02B5855D25
+13: EAD8D785B50E036437E39F3B27DB4657
+14: 2AD0A13C493B9F3EDD259E11A495B205
+15: C05F9D72AA384F05B28A3519AF218CA9
+16: D442072F588D38AC8B9D447762E9FCF3
+17: FDD3BFB91EFD127196FF9F19ADADBF28
+18: F56717661B424E41D7DE1CD13E21DF89
+19: 0F6C952D9BE6CA49B5147EFD44455A92
+20: 6C214935726364F2766BE7B4C2B64362
+21: 5D5316D7E057FF481CCC10C7452D1A17
+22: 56C78DBD802CC9B040446A3EFF3F12AC
+23: A38CEADA8448DBE29C2D11DF2A487715
+24: CB2F786AB8063350F3FAE11EC8C65A5B
+25: F5B7298B6F558E2C4FCC11744AD22653
+26: 01BF89C1B48C5F6918FC6BDC10B12A21
+27: A031F25AAFF294EE79220BC76E73E52E
+28: 42C94B50E12499DA35F14BB6BB6E684D
+29: FD68B6840DC9A271CDE2032EF0200295
+30: A9863C1B04B3FE3945D29966F67B87E2
+31: 6226D4CEEC1E8AEC1B7B3E13D80A83FF
+32: 6100A71B1E3ABBBA48A9ED280DD1617E
+33: 5CE93A26D4EFF0CC7DFA2DD43A511871
+34: 282D165BFBA0F7F229161BE533BFC4D9
+35: E6AC479970891392972B2845C949A068
+36: 4E4A887368F8443BE51FA7CD16CF0B87
+37: 121AFC81AA2750572B35D100BDC34DB5
+38: 7C41FA7E0A18A87E44BE488F331B35E0
+39: C8847D295E1F505C04E2F5CE2CBF5E00
+40: 4686EE8628BC1BBB92CE825F04B1D5E8
+41: 397DFACD19C283B3FC27D3FCBE952254
+42: 815B6C69608B5A379E3C9E67FB1BA15A
+43: A73E72B912EB3AA4929E9EAF73A448BB
+44: 5BC4E2C88512BCD55408CC5AEAD15A91
+45: EF20B2BF297456DED1F4AB7BE0747902
+46: 3D876135E19BB56B98050450C6B0FD06
+47: D68100E1BAD07B438786337C0957471D
+48: CE85A91938049B5E21C983F7C45ECA3E
+49: 9FACEFFB9D08BB65DDC34E3C575B8442
+
+Key Size: 24 bytes
+ 0: 95ACCC625366547617F8BE4373D10CD7
+ 1: 99AEB25CCE73B3796C351A19791ACD52
+ 2: 56B9D6689830275C1A3E4266B3D56D53
+ 3: 2F5F822E11F087BCB8A0F428414855A0
+ 4: 65400F729990FE175AAA894BCFBB1A59
+ 5: 947BA33D20194BBB0D4904023FB32FFB
+ 6: 116B0C6744D215AE98DEB1F9FF1D36C0
+ 7: BA6964C101FA044ED06877E46D540850
+ 8: A36B18526FA0004CF557C99A3AC1423A
+ 9: 573099674B8AFC2DD6424A2E4C581B89
+10: F46169CFE9496A2696A93EEB7EC561FB
+11: 2C64BC052898F3F3A2B78F2591F2BF1E
+12: E8A0D40B08585459199DD6ECC108A490
+13: 47927989BE5EB55B9A0F294C04FF035F
+14: 54A3024E3AD86005A2C44E4B8BDBBEFB
+15: D0AD51D1DADFAD7ED0EBCC756DBCDCC9
+16: 5DE698B7014C34AA6F0099CBB5937A20
+17: 9BA30F49470C6DB9632C5EDE34F8EE73
+18: 0BDF558A2AE9298288E60616442D3408
+19: 25F6DD23BA4E090E1CFFA6EE3487AFA7
+20: DAC5FB99E299D2672F79F0C38E177D83
+21: 58CB113430895C9890D96EA60E3DDC23
+22: 48A0771F0049B776A44AE8877B57EFFB
+23: 2F12B26A4BF7065076417530CDEE14CC
+24: AA6ADCB0176D5324C4C1FFD640D502EE
+25: 384B52A66F4C7A70ED36091BC3FEA09C
+26: 2AFE7ACF071C6B0FD69930A09D6DD5E5
+27: 9A2DB9A5E7712A5BFB095D2C09453CA3
+28: 716C0EF522A13EA05A48F16BAD3FD10A
+29: 44AB46F3CCFD02BDD2C77A332293A4D9
+30: CE6AB27A0F60F410B1B3CACD9AB923A8
+31: 69EAFAFC171C55D1D90ED1C6E1F3A48F
+32: 5EEEB0B7833121AD7D27BCFAF2D4F8ED
+33: 47133445A4EBCC60E27B29FCC160FA75
+34: 9F1BFEB9715A20D5FA7BA3BFF1A27BBC
+35: 516D4615F07756B4DBE7D37EBBF4684E
+36: B88744E53073BDA0F1B115E3DB224E83
+37: 1B77C3D067BBE00420450BA5CD9A83CA
+38: 94B87AC96F8CBFF36B01A68E0651E591
+39: 52ACE87A1A8E46655935536FB3701290
+40: B406BB632D5B7985400EC78D621C8801
+41: 20F9ABCBF97A9917EC6C5DE3CB2C925B
+42: 539A8AF920833F9E81A20A6D10543176
+43: B79AFB8BB39B0351094F37C6EC93F8A9
+44: 5830BD21289FED3F95C3E3740AC6C5BF
+45: 86C4AF5839ECB9860B175642ADA32895
+46: A6427E5E08CEA2A50B8426B063AEE189
+47: 2E872129B5BC5F535BCE2B81F013A103
+48: 2203EB9B2BF51FC2025549D0BF1924A7
+49: 6A5E383A4FC78F6E03B9B276F81195BE
+
+Key Size: 32 bytes
+ 0: 8EF0272C42DB838BCF7B07AF0EC30F38
+ 1: 9F8801E94E41A7DC875665663BFA7912
+ 2: EBE2CA6B45A0BEE83B54402E1A843A3B
+ 3: F6C5A1187AEF4B5A88E97E866CD757A1
+ 4: B3E62CD473E53812EDF9ECE875F39F5B
+ 5: D8C38B1EC23264BB7C42B5589C1300B2
+ 6: BE315EB75B944EC9E51F5EAE65F70BD2
+ 7: D4275409941A44993037364886B60598
+ 8: FC34F1D4E9C4A634C1349F6D4E9AB94E
+ 9: BE712387C59A40A8A35F854333A0302E
+10: 1F1FE164834BABC71DBFDFCCA7D2B4B6
+11: BB2413CCB5347B5157651819E698D988
+12: 6EB5523A968ECE965D9AA4B975D7C2EF
+13: B5DD49AB7E269F9D8516FB57EB47D57D
+14: 74F5D81856F192D49A70B3743945BFC0
+15: 95437BB00D57CD88BD52DE0A66D934C6
+16: AE4804A975D67C6B6F99176F407AAA3C
+17: 5E5B2FB9B2A028A5467B56F8BDBA6980
+18: 8C617FF1F9C50A36BE2EC19A629BA96B
+19: E3401F7CBE177A1D224117894E7EA08A
+20: F8451D9DD31A08BE828FA9AF39708921
+21: 5BE66DD577826804817B85A07BCEDE28
+22: E426227780943AA1A830B7E7D7F7CA0A
+23: B39C7277C3A5CA21897563DBD8DD6D94
+24: FA9992385396F959841D1E0E68CCE00D
+25: E1DE89B1DD5CC31685558A51CC731E6C
+26: 64618455C46C6FF117F19FF300B3B557
+27: 882758C02B3C11D406A21012977D4BF8
+28: F948B62F8038D3A3AFB73041B2F263AE
+29: AE3BF626020D2877052B90B31E70B8A4
+30: F1C6DBBC166985C9EC2E1A3A61BD8E75
+31: 82C343FA36B6D4E9E7AF6D0B7741FB09
+32: 0BFB756EC55AC63BEA71E4A8187C2B10
+33: F1941AD10BE60DAD3FBA33CB899B63A3
+34: 18236A39CD34743DE7B60B2575A9B204
+35: AA37FBC2525F74710D7561D316E8D90B
+36: 413E0F72C2B349FE2691554F77162B5C
+37: 5B9E6F98B2CA0F637E463BE4A6EFD39E
+38: 1B4A4CA36DC60D51BA981392D6070379
+39: B1E26163A90F339E33F86D252EFBAB99
+40: BB98F9F844FA81B25ECC89A8482404BE
+41: CE142F512A42A28F4788847B971AA7E9
+42: C5CE782936F3D28C69C2BD45FD7BC117
+43: 9B6E142582E0A309EDB550DED51238B0
+44: 0D9D80C01612977FF3A2C7A982D0894A
+45: A7630C752B1F787B07C382693334C6AF
+46: 9F24990F270D575881C746481A59C245
+47: C38B5E11479C200B5ACE1D6522FC6B1F
+48: 99118D8114D24B6559CC5D9456F1BEDB
+49: F8B974A4BC134F39BE9B27BD8B2F1129
+
+
+Cipher: safer-k64
+Key Size: 8 bytes
+ 0: 533F0CD7CCC6DDF6
+ 1: C3CD66BB1E5E5C17
+ 2: 079DFD68F6AF9A79
+ 3: 84EB4922264A1204
+ 4: 31F3A7D739C7E42C
+ 5: 381F88FB46E1DCA2
+ 6: CAF4AC443E50EF47
+ 7: 2914E255DA9BDDBB
+ 8: A160A24120E4FECC
+ 9: F748C6009FFBC465
+10: 8B3CB5784846D2B0
+11: 4F98C1621473399B
+12: B486B0BC365ABEE9
+13: 314EAB2B4E9F7840
+14: 613FE3637968A8FE
+15: 28935352361E1239
+16: 0DCB090233B8EB3C
+17: CF0BC7F307586C8B
+18: 64DF354F96CB0781
+19: D2B73C6BAACA7FB1
+20: 638FCEEF49A29743
+21: 204C4E0E0C0A8B63
+22: F041EF6BE046D8AA
+23: 76954D822F5E2C32
+24: 6700C60971A73C9E
+25: 80019293AA929DF2
+26: 8EF4DE13F054ED98
+27: 41DDF9845ABA2B7A
+28: B91834079643850C
+29: 8F44EC823D5D70DC
+30: EC2FF8DE726C84CE
+31: 25DF59DC2EA22CB5
+32: FC1130B511794ABB
+33: ED3259359D2E68D4
+34: D7773C04804033F6
+35: C1A32C114589251C
+36: 51647E61EE32542E
+37: B95A8037457C8425
+38: 4F84B3D483F239EE
+39: 458401C3787BCA5E
+40: F59B5A93FD066F8A
+41: 1450E10189CC4000
+42: 0F758B71804B3AB3
+43: 51B744B271554626
+44: B55ADA1ED1B29F0D
+45: 585DF794461FEBDA
+46: 3790CC4DCA437505
+47: 7F7D46616FF05DFA
+48: 6AE981921DFCFB13
+49: FE89299D55465BC6
+
+
+Cipher: safer-sk64
+Key Size: 8 bytes
+ 0: 14A391FCE1DECD95
+ 1: 16A5418C990D77F4
+ 2: EE33161465F7E2DD
+ 3: AB85A34464D58EC4
+ 4: 3D247C84C1B98737
+ 5: D88D275545132F17
+ 6: 00B45A81780E3441
+ 7: 6830FAE6C4A6D0D3
+ 8: 93DF6918E1975723
+ 9: 15AB9036D02AA290
+10: 0933666F0BA4486E
+11: 93F42DEE726D949C
+12: 756E7BA3A6D4DE2E
+13: 4922DCE8EED38CFD
+14: 8EC07AFBD42DF21C
+15: E82BEBCFB1D7C6B4
+16: B3EDB4CB62B8A9BA
+17: 5521307CA52DD2F3
+18: 54B5D75512E1F8F3
+19: 1A736293F2D460A8
+20: 778C71384545F710
+21: CBC041D3BF742253
+22: 9C47FC0FDA1FE8D9
+23: B84E290D4BF6EE66
+24: FC3E514CE66BB9E3
+25: E8742C92E3640AA8
+26: 4DA275A571BDE1F0
+27: C5698E3F6AC5ED9D
+28: AC3E758DBC7425EA
+29: B1D316FC0C5A59FD
+30: 2861C78CA59069B9
+31: E742B9B6525201CF
+32: 2072746EDF9B32A6
+33: 41EF55A26D66FEBC
+34: EC57905E4EED5AC9
+35: 5854E6D1C2FB2B88
+36: 492D7E4A699EA6D6
+37: D3E6B9298813982C
+38: 65071A860261288B
+39: 401EEF4839AC3C2E
+40: 1025CA9BD9109F1D
+41: 0C28B570A1AE84EA
+42: BFBE239720E4B3C5
+43: 09FB0339ACCEC228
+44: DFF2E0E2631B556D
+45: ECE375020575B084
+46: 1C4C14890D44EB42
+47: EA9062A14D4E1F7F
+48: 82773D9EEFCAB1AB
+49: 516C78FF770B6A2F
+
+
+Cipher: safer-k128
+Key Size: 16 bytes
+ 0: 4D791DB28D724E55
+ 1: 53788205114E1200
+ 2: 4472BCCAF3DDEF59
+ 3: FE9B3640ED11589C
+ 4: 4DDD7859819857D7
+ 5: 6BF901C4B46CC9DB
+ 6: 930DBFC0DE0F5007
+ 7: E89F702158A00D82
+ 8: BEB661953BF46D50
+ 9: 6F0DA64C0FD101F9
+10: 4EBBCE4E5A37BED8
+11: 996EAA0AF92A09AC
+12: AED6BB9522E0B00F
+13: DF9C643624A271B4
+14: 2E5C789DD44EF0CF
+15: 86A5BA1060177330
+16: 2385DBA4DEBEB4A3
+17: 82E2FC765722094D
+18: B3CA2161757695EF
+19: F8A4C6081F3ABC06
+20: 6422316E1BEFFAC8
+21: C178511BFBFF380E
+22: 049B8CBEDE5942A9
+23: 0E181292C1B1DEFC
+24: C347BA0632A49E55
+25: 32FDA46669714F99
+26: 0523743E30C16788
+27: 782BE96A93769ED0
+28: 9F99C9E8BD4A69D8
+29: 104C094F120C926D
+30: 1F7EA3C4654D59E6
+31: 90C263629BC81D53
+32: 1803469BE59FED9E
+33: 1478C7C176B86336
+34: 362FE111601411FF
+35: 6428417432ECC3C8
+36: D74C42FCC6946FC5
+37: 1A8F3A82C78C2BE6
+38: EE22C641DC096375
+39: 59D34A0187C5C021
+40: F68CC96F09686A30
+41: CF8C608BDCC4A7FC
+42: D2896AB16C284A85
+43: 8375C5B139D93189
+44: 0F0462F9D8EBAED0
+45: C3359B7CF78B3963
+46: E4F7233D6F05DCC9
+47: 8533D1062397119B
+48: 4B300915F320DFCE
+49: A050956A4F705DB9
+
+
+Cipher: safer-sk128
+Key Size: 16 bytes
+ 0: 511E4D5D8D70B37E
+ 1: 3C688F629490B796
+ 2: 41CB15571FE700C6
+ 3: F1CBFE79F0AD23C8
+ 4: 0A0DC4AA14C2E8AA
+ 5: 05740CF7CD1CA039
+ 6: 24E886AD6E0C0A67
+ 7: EEF14D7B967066BC
+ 8: 6ABDF6D8AF85EAA0
+ 9: 0EB947521357ED27
+10: BDD2C15957F9EC95
+11: 0989B87A74A2D454
+12: 04C793BA2FAB7462
+13: 3DAD2FACDDFA3C45
+14: D1194935CC4E1BD7
+15: BAC0A2C8248FF782
+16: 7DD5894A82298C64
+17: A59F552A4377C08B
+18: 8DDDE41AB4586151
+19: 7CC4261B38FFA833
+20: E99204D6584158EC
+21: AACC8ED0803CB5C4
+22: C105CA72A7688E79
+23: 3D662FDC35B88C09
+24: A4BCEDC0AE99E30E
+25: EAECF9B6024D353C
+26: 214651A3D34AFF40
+27: 807099325F9D73C2
+28: 45EC21AEB6B90A24
+29: DCED39526687F219
+30: 2CC248E301D3101D
+31: C7F37AB8570BA13C
+32: BB9B31A34A39641B
+33: 5314570844948CAC
+34: 4581F837C02CD4F4
+35: 4E036B1B62303BF3
+36: 7B3B88DE1F5492A4
+37: CEF2865C14875035
+38: 14DE8BEE09A155DE
+39: 3AA284C74867161B
+40: 3616B4607369D597
+41: 07512F57E75EDEF7
+42: 710D1641FCE64DC2
+43: DB2A089E87C867A2
+44: A192D7B392AA2E2F
+45: 8D797A62FBFE6C81
+46: E52CE898E19BF110
+47: 72695C25158CB870
+48: 29F945B733FB498F
+49: 27057037E976F3FB
+
+
+Cipher: rc2
+Key Size: 8 bytes
+ 0: 83B189DE87161805
+ 1: 7DCB9C9E50D15508
+ 2: C724D535853CDE79
+ 3: 113AFD4BA7D3D7E3
+ 4: CFA06CFB93C2280C
+ 5: B3F291C1AAD9CB07
+ 6: 606F74D9AAD4FA71
+ 7: 1CC3F7AD551C5F89
+ 8: 43F8772BA6C6B60D
+ 9: 2F933E12F57689DD
+10: 2BC1AF0D5571D17E
+11: 4123AAFABDB254E5
+12: 413E0AD5C709DCE0
+13: 6B3CF01A7542BD2F
+14: 1E5E2CA0CD605999
+15: D0F7C9DC472A0709
+16: 00482798857A2BB9
+17: EED583440CFA8B48
+18: DFB377FE1EE5E055
+19: 30511C4C565E8F75
+20: F74A72482B43B99E
+21: 1EE4EA7849B0B070
+22: DB7A4ACF022706FD
+23: 2D7EBABC8C8E4DD4
+24: 6F0369BF66A8B637
+25: 59E5D13B247EE0F6
+26: C7BAB430AA89A5FE
+27: AE0F03746D38138B
+28: 942DF0B523D02482
+29: 929CE0963CFA46B1
+30: F8C68A91DC53B7CC
+31: 5735395C63E15094
+32: 7821605C18D83D42
+33: DEC892FD743BA6DC
+34: 77AC80C1177963D3
+35: 3E223EB4EA297456
+36: AF63B231D671D9DC
+37: 665CA287AF32E92C
+38: E451EAB337DC1EB6
+39: 95B179EC950992CA
+40: B8937115492802AE
+41: 355A6E5EDF40A939
+42: 353E77D4A5A28D79
+43: C958FA5903F921B8
+44: C334E296BCB24ABE
+45: 4F37F7F652FE31ED
+46: 77304A655B03ED67
+47: 3548A4209ACB6EE2
+48: 696E712B1911B695
+49: E4B63641D22A3DDD
+
+Key Size: 68 bytes
+ 0: 7ED68E8B30A7D5DA
+ 1: 867E18AE64B783EE
+ 2: 032E554D6AAD7055
+ 3: 26BD785D0DDAD48B
+ 4: FFBD4009ABF53D03
+ 5: A71006E1E30C3855
+ 6: 92638EE741BE65B5
+ 7: FC8C5F28CB38C83D
+ 8: F03F145CBCC4CF80
+ 9: A28A7C63F67DDE7B
+10: 3089486A2247B72A
+11: CDD6E6BA5ED53A8D
+12: B75A2DE8CB96A267
+13: F74D72A2CD68CEF5
+14: 3865AC8D170EEDBA
+15: B1B520CE5FC2BA39
+16: 658DACFDD701B4EA
+17: 6B5C1DA9484FCEDF
+18: E3CDFB5755BDFFC1
+19: 56DAFF7E9A908880
+20: B6F8B970F68BC2BD
+21: 7A00DEE6977A91F2
+22: 6C0CE4FD2D02B36C
+23: 8EDA10D868504648
+24: 76FB106689E66EA7
+25: 67F45BB28A20E110
+26: 5F3207099AF93B07
+27: F5E382F7266AB342
+28: 0E31AC2E4CEFFBDC
+29: 8DBA1B2FC6980FF0
+30: 311368E62EC2A9E2
+31: 50DD1F7A319727EB
+32: F0DE146C9ECF5662
+33: 81CE0842CE223F15
+34: 4C442535A8BC9AD2
+35: 06EE8869DB91EBDA
+36: 4078E7CAC29DCEE7
+37: 115D619FB705F289
+38: 3D3F8A380DCB8FB1
+39: 9044E5AB8049D21A
+40: 66327F00B07CFC76
+41: 811AB23A4AD3F132
+42: D4A507E96BB39BC2
+43: 51C9E4C9318F87D9
+44: D2255C13DBD09E88
+45: ECB76BCB961F812D
+46: 83D7E39727BBBEC5
+47: 415540F0AE34DD65
+48: 232D20F9E188E2C7
+49: EE37261ABA270B22
+
+Key Size: 128 bytes
+ 0: 8A8F8E5C5A04C73B
+ 1: B197CF922883CE71
+ 2: 8AF3F896460CC597
+ 3: 755F313AEB18D3B8
+ 4: F1DB52688BB879A8
+ 5: 29D68EA6456B1CF9
+ 6: BE7C444267A7925D
+ 7: 46A7BF7DED575933
+ 8: E2C7AD7C902E5E15
+ 9: 90A38AE1DD69C2EA
+10: AA95FA050CD3388C
+11: 23822B6AD5B83018
+12: 8FD42F0DBFF3FEE1
+13: 645098BC94FDE21B
+14: 7E43D43EAC50E992
+15: 2F540FC66A9E0F43
+16: 453E52EA7B2D1F92
+17: F6F731E8C5A32C54
+18: B1E89646504E4D7C
+19: AB8168452A7984E1
+20: 044BB0758DB5435B
+21: E9BAE7C99A152BFF
+22: B758F70708B6597E
+23: 23A1EFD0AA925D7E
+24: CA60DD174CBA23DC
+25: 5E916F2DF7B6B3CF
+26: F2723A9BFD82BB62
+27: 2BC381F6C048687E
+28: 573BFD71896A4133
+29: 03DF7250C3D69801
+30: 8639060454669BCB
+31: E31945F0A87221AB
+32: AA39447BBF0A77EA
+33: 174F1B65BF6A34A3
+34: 2712F966022A9589
+35: B6358876D6D56D16
+36: 2A92C131E68B77BE
+37: 040C6935F4CFC43B
+38: F23503C74121C660
+39: EDD120883F1F813D
+40: AFC6500D34BD9D33
+41: 963117444417BDD3
+42: 2FC3A58861B4A58E
+43: CFDB70ED8BCD1173
+44: 91B75760CF38B8D5
+45: 93A59048B78B3415
+46: 7E60C5E75225D45F
+47: D4212C6422878FFA
+48: DDD1B241E0E0EF6E
+49: 20337DB931078078
+
+
+Cipher: des
+Key Size: 8 bytes
+ 0: E1B246E5A7C74CBC
+ 1: 9262AFD8AD571E2E
+ 2: 36D2067D960EB870
+ 3: 319834DC66705192
+ 4: B4508A7C5F012C93
+ 5: CAD1DECDDEE81342
+ 6: AE9E1CBB71C719E6
+ 7: D7FBB1CDAFD5B2C1
+ 8: BE1A70564E3BFB5A
+ 9: 96D9EC1407A1BD34
+10: 05E4B9AF3A4DABB3
+11: 0DC77419E1F12C02
+12: F73E62369190A5E3
+13: 830C1CA7820ABA2D
+14: D2574B6AEED0A4F4
+15: BC08782E293546A1
+16: A35DCC9AAD1EBFB3
+17: 79B2224667B33706
+18: F9462FFD2808233A
+19: D6421CD0D9697DC5
+20: 57CB2173D67E7001
+21: DBE2DB0BDC07644F
+22: 014E72E7E99C969F
+23: 37901B1963D0B29B
+24: 8E12C23929125686
+25: 73AA9E2A60C327A1
+26: 54A19D07D941EAC2
+27: ADB8CBBAEE1848D6
+28: 3997E866119856B5
+29: 4D647526FE7E1E27
+30: D574FE7342104F93
+31: B84383E34A790E11
+32: 322214BE9B93BB6F
+33: D4C8E0B7AA139D68
+34: 2B9747CD280E48C8
+35: F92EB2E3711FEE2C
+36: 5CEE84E124B7882B
+37: 82427488597FF618
+38: B1E8B313D2DC76CF
+39: 03E237CD40D7F214
+40: 8C8DC1299293E15D
+41: D6C7463FE86D4EF8
+42: CF1550CACE647779
+43: B998B3D32B69F00B
+44: 1B94C342C3D91107
+45: ABD4551B27F58BE8
+46: 2B24D978D1BFB3DA
+47: 85361D36950635CB
+48: 448009F38F1DBB4A
+49: 6B901B2B79B6950C
+
+
+Cipher: 3des
+Key Size: 24 bytes
+ 0: 58ED248F77F6B19E
+ 1: DA5C39983FD34F30
+ 2: 0BD322177B935920
+ 3: 9D093F3174EDBAE3
+ 4: 756B1F2CDF02B791
+ 5: 57C31C2A913C1126
+ 6: CF936257517C53FA
+ 7: 5F06305849E5E158
+ 8: 9A85DFD788C59D19
+ 9: 6392279BBE29DC1F
+10: 76B0AF835D79C4E8
+11: 7073F36DB1E31464
+12: 276258605F2CAB3B
+13: 3B69E97811FDA996
+14: 3E6E491D2862A1F3
+15: F8F3F68BDB006520
+16: FD376E66D401A097
+17: CA2FE47825804996
+18: 6F5C256F84FD14AF
+19: D7B07F5C40FF0CDE
+20: 73F2E074F1324496
+21: 0B2A35016F24BD21
+22: B040D2E3B311C193
+23: 3938DEA347112E2E
+24: 9D7C1703CEC0BFAA
+25: A07949F76BDFAF68
+26: 43087EEF52564C4C
+27: 11132B599734AF0E
+28: 62A04C819FDD9A8C
+29: B74F0E5649D33690
+30: 8E77E5009B0AA322
+31: 5174134B9A1889B9
+32: 053E33441D11AE63
+33: 01EF381013F86E4C
+34: BCA358DEF35DFD60
+35: 5908A88513E2E5A0
+36: A3214C8367E04B05
+37: B2CBBE851A54BE9C
+38: B271817F63B3B76A
+39: 08AFBF82ABB97D8A
+40: 2CE02ED014186B86
+41: 63F3011C97F6E990
+42: C392351F432738D9
+43: 0534DDA50E685725
+44: 1509456871F5CC20
+45: 2383029935901342
+46: 8714F1A53CCB213A
+47: 2491B2FD3CE6A7CB
+48: 4BB02399D85BB66E
+49: B8AC2CDFF7AC22C1
+
+
+Cipher: cast5
+Key Size: 5 bytes
+ 0: 9B32EF7653DAB4E6
+ 1: 48AEB06B1BDB2397
+ 2: B530927183622D58
+ 3: 0ECC8F24BA742216
+ 4: F6352F9B6461D82C
+ 5: AF6315AE98E12A71
+ 6: C364D4B506EF28B9
+ 7: 817061BEDF5E0A5D
+ 8: C19DE7B1F2066C04
+ 9: A6E1345E3AA1B79D
+10: 06B036B04785428F
+11: 244DAB3F7223F567
+12: B9CF3791F6C79F4A
+13: 86C5A02AF0517C5E
+14: A16E3198F1317E04
+15: CF72A44C01E36DDD
+16: 199C72ECD5E632ED
+17: 0BC66BF05EB7887A
+18: AE1F696F3D6B7952
+19: 685C92084F600885
+20: DBC1353A95AD2097
+21: F481E98CB36CAB3B
+22: 8F1C06A482C70BB6
+23: EA087739954A9CE5
+24: 6D0AD727D8E4EF9D
+25: 61CA0F7965FEE246
+26: 0D664CA16BA785DA
+27: 2359D363755605B9
+28: 6B6E3A216ABFB55A
+29: 6FBCCF7B0342D3C9
+30: 3431F4572E2CBE57
+31: 36D84FCE6D5D8FE4
+32: C234F6AD41E34E76
+33: 522F12E8D0617263
+34: AD8199B6E94D4E74
+35: 56DEC7C21C83B2AD
+36: 22CDBFBC5B476E69
+37: 70BAD497381F378D
+38: 4584F15DBC0EB7F3
+39: DE0603CEE19BCFCD
+40: EA8D582C1CE62FC9
+41: 4299C28A912CE568
+42: 7208AB000E3FA9D4
+43: 7AAE6CB398D01665
+44: 33A6AA42B6D7949C
+45: 2AEC5640AD535D69
+46: 74D37D9DD7B67248
+47: A5300FFF5CF85833
+48: 834F83398D591C38
+49: 85C787A8B7E519DB
+
+Key Size: 10 bytes
+ 0: 95827CB504BD43C7
+ 1: 8FBF4EBCB8413ABF
+ 2: 5CFF411BECED9971
+ 3: CEE2AEB4415E0A5D
+ 4: BB3A8DF7C54FA88F
+ 5: D508B933EF335111
+ 6: 993745722EF0D8D3
+ 7: 04EFB233AA88E796
+ 8: 478A7DCEAF243F90
+ 9: 269CC3D138ED48E7
+10: 88EBD14D2F999C89
+11: B7441626D4487A20
+12: 46A6E2CE6C66058E
+13: 60687D2D5381757F
+14: 885D05ABBF187B89
+15: 5032A7ECD3D51521
+16: 50BAF36BC5C14A8B
+17: 8E805499569FBB0E
+18: F8359B18AF3E69C5
+19: F24E415CB4D2AA95
+20: 361805D4E45B56B4
+21: 3172336F01E3530C
+22: 333A551E0A03C4A3
+23: E2B991995A2D2962
+24: 067CEEDD8F213B67
+25: FEC3F306851F8616
+26: 4B80DAE6AB11894F
+27: 250C26E21A8273A2
+28: 313F2A505915C909
+29: 42E0DC3D4816B38D
+30: 9FAEEF0510DEE721
+31: 3BB5F5EF74B4CD7E
+32: 0FBC9007F462BEAC
+33: B9D1467B0D7A1043
+34: D9B991C9348DF321
+35: 061D577806C50742
+36: 48AEA67AAAB6FA23
+37: 22F7910383BDA87C
+38: 9987087EDBA56FD8
+39: 2FCC8341B69BAA14
+40: 29DEDB6C2A433F50
+41: E067D2746B99A9CB
+42: A5C9CB975A856D57
+43: AAFEFD3A82D6185B
+44: BBE8952CC93CCCC8
+45: FC08CE0934EF2E25
+46: E44E642DBA7CF3F0
+47: CC26F0E8E85AB372
+48: D95D63B8389082E0
+49: BCA941C921B91E16
+
+Key Size: 16 bytes
+ 0: 20B42D77A79EBAE5
+ 1: 96CF6C91E5183CA2
+ 2: BD87E77A38DDB4E2
+ 3: E7454CA30B69DE2D
+ 4: 888F278D219384EE
+ 5: 972CB887CDE920F8
+ 6: 49BEC1E7913F3CAE
+ 7: 96A81B37FEF63CA5
+ 8: 408DD23A6DA940FC
+ 9: DA86E92BB735755F
+10: 2032F2D972F228BD
+11: 8F9EF7DEEF74EFEA
+12: 547C92025DCAF9F4
+13: 80CD440DFF2EA62A
+14: 7D6141D102E1B941
+15: 307596ABF5C9A6B2
+16: 82E3F1B17EBD52FE
+17: 5917DDD11EDB55A3
+18: 2909F77166F24F9F
+19: 88BDE9D686328942
+20: 8F987B737F6A011A
+21: A74B3D1D6433B9F4
+22: DA8F95DE949482EC
+23: 953BA9B26B9AC476
+24: 76A52FE193CBFAF9
+25: 4BB7D2597A78F2D8
+26: 5C8BE951251F4B1D
+27: 6E8AB32A4A279D84
+28: BB94BC9937B42848
+29: FF0EE686F97BF8DB
+30: 4146656AB1477E13
+31: 1BFCA7053E6DB8AC
+32: 4B9A6A349BFA926E
+33: 3B5F6FDD127B0A87
+34: 53C996E956598599
+35: 62C142E63C28B5EE
+36: BBB71D6548F32693
+37: 107576AA26352455
+38: DE32E31FFE02B6F9
+39: 4C5DB81D1715FF5C
+40: 8E5C706206F493A6
+41: 4BBC51E184A67C92
+42: AAE216B413DE2A06
+43: 77AE26F467233B06
+44: E8680D0E71F6AAD6
+45: 7061DCED4BC94F78
+46: 06772D63818C7E86
+47: EE5B9CFC06CBD639
+48: 5784B3EFCDC28DD4
+49: 4F962107A2EF843C
+
+
+Cipher: noekeon
+Key Size: 16 bytes
+ 0: 579A6CE8911652533200CA0A175D280E
+ 1: 63912A26125657DEA632A0AE4111D4EE
+ 2: 0F25F642860261CDC4474D6CFC6F3D90
+ 3: 5747B5798279426E91FD69C6F471B608
+ 4: 298B7486227A423729EEB0BFD653DCD1
+ 5: 47FFD11C5F6B5638F846FE55F9BCF192
+ 6: BF7F5610C79727BFF3A0E2318F35F92C
+ 7: 418713351CA5800DEFD0976872B6BD5F
+ 8: 46B0BFA8FFCF1B90294AD630CEF353F7
+ 9: 933E10C381138CFA2419D56BFF3DBF24
+10: F47B4FD4B400E3A5CAE5C2E2732AF77D
+11: 7BEAFF8299E5C530A9F0928195798D5D
+12: A254293BCC71E208698AFAA1C5630C29
+13: 6374FEF1DFC16151F31E71BFE476DD2B
+14: 578ADFFE69E5072E5AC617E99C2A890C
+15: DB8EABA030B5B7425A279E397260D385
+16: B886B5150FABE45F81C111317AA8E1FA
+17: 0156DE757EC43054CA2B8BD300B3A43A
+18: FB423A1AD74955E5E937DEFEBC130A96
+19: 4358F88BCA4649A5C12A2E438F7A416F
+20: B8A8B6A336B7A750EC5C8A635A1DE2C4
+21: 2397C77016C8D1FAA5913390EB66B9D1
+22: F458C608E1A35743726EDA8E94F236F6
+23: D91DCCAF1419704CF7C39DD486C48BB0
+24: 551C9932FF89212454061D77E9E58897
+25: 5FB1F24CA23AB487ACC825F900B43DEA
+26: 76DFFAFB4A7F79B5748795BBB687BA11
+27: 70D34BC18EC3DA47F5E7AF716F5E767A
+28: 4E8410F31F869487956CCA4922E4A787
+29: 68519971FD65F6076FBFDE99AE5F5878
+30: 8C1C64C7E1650F5A09822597A3E25E9B
+31: 82EE58A56C050612BC9AD23AB83B2D5F
+32: 741B22347DC979154DC4FF81ACCEB0A1
+33: 79D8A56ACA0EB5A0FD6ABB34DF4EC2AE
+34: CAA1D93E89FFEC73689B642628297342
+35: 529BC07FB15CA79BBD93F63E14899898
+36: 7027D39A8CF02F8FB14D87940ED4EA15
+37: 4CF18E695D534EF04B8C15974FA31A53
+38: 113C632737E908F45DF5238904A88B95
+39: 723A9D4DFCEE39D6A2C1D90C1AFF9FE8
+40: BEA1D634560BF4F2DB05A40B79C13413
+41: D3B75F2568C0F57E13C8A19E4AC192B6
+42: 27CCAFC6BCDFB20344102D2021879828
+43: FE94A00B65DAF91DF1E99FA2784F930D
+44: 24626085EC4C2F85968E4C60CD591E3F
+45: 2612AE4CE03A5E1066AAAEDEF388E8CE
+46: 4B8E6E59642E19874DF38BB66F65F0A5
+47: 47C145C37C2C048E73E7E85F28B2662C
+48: 79D71CD15255964407198165F32C26F4
+49: 8F02BA60E7E3FC32223CDFD308D4C6FC
+
+
+Cipher: skipjack
+Key Size: 10 bytes
+ 0: F62E83484FE30190
+ 1: 03B4DFE5423A117B
+ 2: 8CE4DAA2307CF018
+ 3: 77D8C958DAE4336D
+ 4: 00D367D5C1FC95D8
+ 5: C1F1305A5B01A474
+ 6: C3956225C846F695
+ 7: 2A8977DC186749A3
+ 8: 433AC6B56AE5C200
+ 9: 10489A7E87F803CE
+10: F176DF022D02D136
+11: 1395AE1C0C00AA1B
+12: 0C1C3FF32E93F789
+13: 901EAAD562EE92DF
+14: 59D55D9EE3EA0154
+15: D9135CE0BBF68AC7
+16: 90A8E4A8E76349A3
+17: C04ED52AA69D1ED0
+18: 19E842698B5008A4
+19: 26FCA0FA3AA7718D
+20: 62635FD1A542C7C0
+21: 5A3695398C979E40
+22: 34998BB72108D89F
+23: F889CF892998D689
+24: 2C6A4D61F468F19C
+25: EC70D59FC906349B
+26: B95F11FD098B34A6
+27: 32F86206BB4E525B
+28: E6BE51063B60CB9A
+29: 8964E47BAC22F995
+30: B1C297883819747B
+31: F2AE1F39F55FB6C2
+32: E633EA2DE342767E
+33: AF1F0ECBCA788A28
+34: 6A898F4407696B27
+35: CD9CB5374EA080BD
+36: 15881B0200AE6A42
+37: 579D05E5F5DE7840
+38: 86F8C683D23EB976
+39: FDAC7DC6C8F7777D
+40: 10D6F7641409F027
+41: FCDAA0872D1EC61A
+42: 7A353991A81344DC
+43: 43661187956D3F8D
+44: 5190FDFB904A78F0
+45: EF651E67F65CCD57
+46: 5E539C61748BDE3D
+47: E11E23BA8BEBA42E
+48: BAEF0956173B32AD
+49: 0AAB29DF65861F4C
+
+

+ 1605 - 0
notes/hash_tv.txt

@@ -0,0 +1,1605 @@
+Hash Test Vectors:
+
+These are the hashes of nn bytes '00 01 02 03 .. (nn-1)'
+
+Hash: tiger
+  0: 3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3
+  1: 5D9ED00A030E638BDB753A6A24FB900E5A63B8E73E6C25B6
+  2: 65B0E1EA36CA17EDE2F055E67EAD67B1C282A11A5BA3A8E0
+  3: AB7FB8D21CE3D8D9BB5F1AF1F2FA0D3C277906160DB8D226
+  4: FE2E9D43F74B199D91B9291D73CCFCA0BEA5F068FBA244FF
+  5: 3DF6D672FE9DAAB21523EB04705D8A8B72B78B00AD465D1C
+  6: E05724353FE29957C3E8DEBAA21D0C2DD49CCA22191D5AD3
+  7: 4056DDBF82AE74AB56720DEAF079ACA2F076ED046D044DE5
+  8: 801FB9BE1A9AC7337A81345B3845E4E7C13AF1FBADB73723
+  9: 430156547A82492CA859385304748F65F2D4A7E2664AE2B1
+ 10: FC435137CD652D720A11EDF47ABE4680BA4AD5BD810C9835
+ 11: 20A8143DF47F5715FA0905FE6F9D1D2B5B2D4E26FA98930B
+ 12: E4A2063019FBC034DEB01E2A95296042319CBC039DA69A91
+ 13: B5F0FA570C4CD69A3C68448BE42C865BDF77ED68B93875E7
+ 14: 802BE6EA2CE86A0B371F2354944B19CB3231AF7FB4F00FF8
+ 15: D7C08863B5E5E3D69B5404A116315A698E128EBAF8636B70
+ 16: 5C5288CB0E4E533056BA5293440D9BE6F3C461233BF1ED51
+ 17: 88D3A94F3820E4087DA69D8BBE2CF415466063709C450C4D
+ 18: C07B4B155F9F75805D9D087087FCDD28D08A9D022192447E
+ 19: EE473E569FF3E092CF8996B31CE665EA7D61520D42E27395
+ 20: E13DAE8098139CFCEA755D2060F107E3C7581EDF9F4B3B85
+ 21: B48A9C09F26B379AA28FBC750B50CEF69D0D0EE37FF765F7
+ 22: 574A01456373014F4179CDA14541E2E3C5A1CDDA9F9D071C
+ 23: F2E2831E5BB4AF05914C4BA61BB8D600D1EF071C5DF02269
+ 24: B7808A5B6258CBE718EDA938978C69D3FFC45A222E9DBF4C
+ 25: D8E4E076DDE78950D51EAC9F97D2D1916A0910465D45A55C
+ 26: 4EDECFAAE1DE98B7E056E64CA24003422BBE6F048129B24C
+ 27: 0DE283B5A4953EAAEC6F3FDE50D7875C8EE57FA79BDC70FC
+ 28: ECDD4BA1936DB9E6F83E2BD7F39D23927A1A17B2D52A8649
+ 29: BE11893460E49659F7DF3FB3BD5E3E9A319F85FD3496E26C
+ 30: AEC0DA0F2CC0646325CC03319A0E080F68B46B33F81920D6
+ 31: 8824FD39984F6A52FFFF19016E27C594921452086373F2EE
+ 32: 8B6592AFBB02E227AA451B5CFDC821B84245D34B96BF4F13
+ 33: 960DF9C349EC6619FF37E3F0F4832E19CC6A4E4D68962651
+ 34: F4E2B7AA72BC7D6E0CF6DA1094BEEFAA9C55610327C62900
+ 35: 05FD1B80CA4C7C14FE5BF0ACBD0EA3DAE498DC391DCF2277
+ 36: C5E95F953898C68355B591507BB714F0E5DAB9989D083900
+ 37: B2D4E286CF7EA8AB6ECD650C9E48CA23497EADE55485DB1E
+ 38: 9D51657E11C54FFDF205DBB435097A2BC6F93C4BE8D6180B
+ 39: 3C6AE3911356A343AE3113735F07FCFB5E046ACD47B00FBB
+ 40: 664342CDECC825ED340A7FFE2E57107DD0B5F24C24B2C3F0
+ 41: 4EF7FCA13CE684D81DE4F566D2897CEB407FBB3DDE81FD64
+ 42: 54689FECED63F297B13CD494B85E686680F4F78DE7EC81D5
+ 43: AF434BDBDC7EF90BE03E40A033F16E8A57B41840E1E8AB59
+ 44: A32DB678F44905C18968F5D898CA7992EBE2E4CC3318B96C
+ 45: DEE9D519A12ACFB8A0935A368D6E6C75EEEEE6F2B0D5D191
+ 46: CBC74863472D1C9D23C526F4908BD4D4234E00CBCC99A9E9
+ 47: 6C228A1D4871E802E035C9BB16C5187354841FB6BE3C69B6
+ 48: CAA755C55AA869E633CB3C6D93A561944AC7418154E2B0F0
+ 49: A6835F7C0C6CA8F4A45787BAFA77478AE9ADDBEFBC3052D3
+ 50: E406755957EC21BA6A64B5D3AAF31749CF98DF92F1B1FFE0
+ 51: 0C2D4A44A803DBA99B7A467553C9293B46A538558BD77DD4
+ 52: F04F011B09D275A185528CC040EB719649C8471A87B259B3
+ 53: 3DA8B57FF52FCAE7C32636EC6C80708189CED8113C5CDE1E
+ 54: 6C6C88B8E18DF5CB22EDB61A2D3ED74741A708BC46576FB7
+ 55: 2D48EE2BF85DE234754BECF3C6F5B0E62988B5BF24AEA5BB
+ 56: 0D17702DDCA078ED1CC51B95DF29EA1053CE97F69395C613
+ 57: 9D8C2AD327DE43D5782D5F20881F4A8C433BA19AFC8C15AD
+ 58: 227BA419B760D9D10DBB09585EDD475AC2734FD4539F8275
+ 59: 2F5220A828EF94E327BD51D4DF5C58609F8A93B9FE01FFF6
+ 60: 0EED9F91E1A33A50B8E913DBA0B5E248D263E1FC72C6A449
+ 61: 766B707E999FF3C51EE01168513BA0DCEFEAB222DD1F69F6
+ 62: 85E6710694E7C36A2340DA6A371C0560450F3D44D35AD98C
+ 63: D401F9B13D39C24477C0AE6971C705C63C067F29508C29C9
+ 64: 212DF89C57155270344ACCB19027B0B26B104FA0FBBE0FE4
+ 65: 3BEDE767AA4A7507DBEFF83D1BC33F67EBA9C64945066227
+ 66: 79FED1FB9F17C4980108E8605C10D9E176AC8FE4F6A65064
+ 67: 48D9B7622AB7F8968ED926255F78E8CE461E4C9162FFE8B7
+ 68: 6638C83837297B3F53B0F824C087D9A0B8D9FC6265683B8F
+ 69: 174421CF6D331FF51924F8946E8244555C9020D38E31B6DB
+ 70: 03E42AFB5FFF9B9C3794A3DBEC99FA7E3F7305EF07BD29EF
+ 71: CCAFC68D4B3ED889DC9F28CB9225808A40AA8E0D5CA343FF
+ 72: E824F93B4022011886EFC54539D4D5D51863ADA329FB4E22
+ 73: 7CF0DC01B326687530F42040BA0D0CE93174455E8A990D14
+ 74: 7A8E619479F4F5C418EC041806850E6723CA56AFBC3D32CC
+ 75: 083C5CA90F4B296C42040559C8296149D4EEBAB5EF2CB82D
+ 76: 3581B7AC32FA8A0986FD14F277FB106E112B92D18CD689BD
+ 77: 258E822D9CC1ECA8B55D925BA361BA2D9FC27AF181F138B4
+ 78: A86C1E88A64515FA281A462D467458231494F16E835DF873
+ 79: 76E7F06FE9B8B388DB012F8B4BE2FB343F95913EDDE47A27
+ 80: 00278B4E5690E729EC7118B5BF63C9D1EB1268960893CA75
+ 81: 8DE70E64A31BA1AF4F5C23CF774CCA32FE952D76C3FDD1B7
+ 82: BBEA72C840749BABAF1415FEAC343411B89515B87848A09A
+ 83: C6C3CCAC1B338DF117A61ECF9A280E9BA709784C72B76771
+ 84: AE9813EF4429EAE73EA9FDB5E23D263AF1BB87928CF5F048
+ 85: 68647CD7BFFB8E530D28C86685A8D2F657EE4CD64EDD7E66
+ 86: AA8C35B0E746AF56435F6C711AD0423966EA459087409713
+ 87: AAD5C0D5E980B29BC88985C544717B81F58CDB923A3468E0
+ 88: F60929D14781DE44EA607AAFC0D25FA1B6EF3C6AA0F8B3D7
+ 89: C48087DC75EC43A54A593F24E1B359BB75C581A65C3170D0
+ 90: 11D1372FBDFD9FF514611AB20D31BA62F18856C8D6AE3AD7
+ 91: F2A8076B9017EDADEED41F409C9E32EB3BC090EAE89F855D
+ 92: 702FA47E5BD35E344B5B87C0082106337206CADD3D4D5014
+ 93: B9E03FED752A560C3B0365EDF5BFC4DC7EAC5E4BBB93738D
+ 94: 3C84C52BF51077A5819F56E5A5C1C06209181579393220C7
+ 95: F8ECCA28A525594E138B55C06617A063DF74FE3469D98381
+ 96: 1081C3BAEEC0ADF4980C2EA6593B0906DCBEDE4805754774
+ 97: B5152E39DE0BFE8982D783FC4F0CB7160EB2D69F6F3B3E5B
+ 98: 6A6B760BFB1965C72AC793F9C02FA21B0F1C34BD2640BB6B
+ 99: 1E6DCBFA8BA8D96C29101768A6A39433D5AD5A50E0970730
+100: 733222D3A033351FAFD68C5CE8A4D833BA7420D44103CB6B
+101: E4CD7DA59B215F1DEAA8FBBA850F2C1A7F4C3D495FE6804A
+102: 7BE78C790713545754D4C78A9318ACA4AA058C5C23540131
+103: B71C3809A504BE2F57AE9E25BDCC3921DC665C65289EA55A
+104: 2B8CA39977535EB692EFBF0DECDA8971A8604F7FCBAE75DD
+105: 3CC48B51E4C5DE4F0C2ABE0BE6EE4B63CC564A87C01943CD
+106: 157ACDF7B59FC25966F9783207554364882840E7251ED6C1
+107: DEA1CFAECF18D3611CCD0517131A16DDBC97A12902DD8BAB
+108: 2AD2E990BCF6481284DF44B961632687C2E64DFAE2AE16C2
+109: 838F3A3B28A50A12B5707490A66080DCFA0230E583B6EB14
+110: C8B20315121CDFB3A91BC0EDF11886F283CF6C480F498627
+111: 2B0FB04F100BE9AD51B7D64C76651BAB4B7D31D1D9195711
+112: B6495B6256FF464EC409A4098B622E8BDBB1003411854FD7
+113: 1741A789472E20E1CC89869A2477E4F2807C22182EA5B221
+114: 07ADC82CB3F27389A12B6B9C2B268BDDFD1D9478D9EDA0D7
+115: D9BD6760FB819A8A3CEE75303F8208FCA3E138B517DAB934
+116: 9FCF21A9236C2C12861FD20F1FB15A187CD7EE7821F72BE7
+117: 73D165769B34DA6F151464E61115D0E09A66F8D0FA049726
+118: 74580BFA88EEA03C0EAE722F81997E400D9CC25FA0311DFA
+119: E3C6A369820E267C938D276A858928040C7C25A826501DC7
+120: C20AD90DB0B8BEE0335D069259991060969EEC9F939E4CA7
+121: F3746F4CD6A19CC137C5FCC8F60A4C0A7F56D97190B7A9C2
+122: 63A3B79EAF3DF35180960465059C0ADEE06D45179A56284F
+123: 606AFD833D082628D58672403EE6DB348E6F68D8CD1947F8
+124: 7567EA8E10CBF312F8478B7C51D87B00B6CF3DE82B03DCE7
+125: DBCDC2B9B8589F6C7616B55B059B3B3E38D97A9E6DF1F29A
+126: 15D9909F8D69689E7E78A0DB928194A59623E7253AA9D400
+127: DE39589DCC0C654867943801946B9888B347526279CA15BD
+128: 34FA7C74EE67C1F92C0BE1CFD4B2F46A14FFB999604925F6
+
+Hash: md2
+  0: 8350E5A3E24C153DF2275C9F80692773
+  1: EE8DBAE3BC62BDC94EA63F69C1BC26C9
+  2: 1EAA4F494D81BC570FED4440EF3AC1C3
+  3: 54CDB6D1BF893171E7814DB84DF63A3A
+  4: F71A82F8083CD9ABA3D0D651E2577EDA
+  5: 2F708334DBD1FE8F71CEE77E54B470F9
+  6: E014DF2DF43498495056E7A437476A34
+  7: 9C410644446400B0F2C1B4697C443E19
+  8: 0944DEC40367AC855117012204018C9F
+  9: CE8A6E797AC79D82D2C6D151F740CB33
+ 10: 06DB4C310570268754114F747E1F0946
+ 11: 9F323D5FC6DA86307BEBC0371A733787
+ 12: 3C1C7E741794D3D4022DE17FCE72B283
+ 13: 035D71AA96F782A9EB8D431E431672EE
+ 14: 7ABE4067ED6CA42C79B542829434559C
+ 15: 5E8D0D6F6F8E07C226AE9DD32609035A
+ 16: 2B1632FF487D6C98AA3773B9D3FCD2AB
+ 17: D3D894482F7541BC0948B19842B479D9
+ 18: CFE6B872AC98304524CC6A88B6C45881
+ 19: 1573DD015C8629DE9664CA0721473888
+ 20: ACFE2D3BB3CCAD8AEF6E37D0D8FBD634
+ 21: F5F83499AA172BE8344F7F39BA708AAA
+ 22: 1D1C71FF6321B685D26F7FA620DA6C22
+ 23: 4D7E74B6C8321775A34F7EFF38AAE5DF
+ 24: 351A988C86AC5A10D0AB8E9071795181
+ 25: 970F511C12E9CCD526EFF8574CF1467F
+ 26: 0A68F53A476F7499EF79278A4EE8DAA3
+ 27: D458CF9C8CD0ABA23BD9A8C5ABE495CE
+ 28: C8002E85C3AD9B8B4AFD23378165C54B
+ 29: 0B4788B157ED150A34D0E6E96BB4789C
+ 30: B14F4E31DE09281E07248A17939BE5B9
+ 31: 803EEB99231526D6A33C8D4FCA537A6F
+ 32: 51FE5D6637D2F0F09E48CE2A7F5030EA
+
+Hash: md4
+  0: 31D6CFE0D16AE931B73C59D7E0C089C0
+  1: 47C61A0FA8738BA77308A8A600F88E4B
+  2: 9E7A1DDE4D280E7F389018A5CCC3ABF2
+  3: E9A4DB2923FAF634CBB12CC1F8AC5C66
+  4: DF8FA069C6121801FFC539DADD33FCB9
+  5: 4B3511308F7E71BF6462CF18F1184C61
+  6: 075582A51F87682919E733C84C9FD998
+  7: 20DDA7535A464D13E1763BA61BDC12AC
+  8: 66AE1E305BED186780BB60328D3CCBC5
+  9: 503E90BF2375627262E58D90177220F8
+ 10: AEC6B48C10659E3D6E18A2CDE8F8D3A0
+ 11: 45EFB3704B6684B0750E3DEDBB2BCDA9
+ 12: 7C9443DBCD858138E32604E0D288F7B8
+ 13: 95E5B93F4EA79C082BA1745D3026D70A
+ 14: C913D5DE0BBD1C2F2838E46363732D97
+ 15: ABE357BDC413C82C8BBAA380C39CB5F9
+ 16: 22F840370EBB1DDBEA4FA3A40243391E
+ 17: 0A289FEC69AF967988FA40C47960060B
+ 18: B63D3ADF13B509C95C088F909A0B356E
+ 19: 36E8E07E3202E6F4F7E885853C9735C7
+ 20: 1D363AFD1208A7B8BD486D51AEBFAEB8
+ 21: 75E36A5445AD72CF5BF47301EBED1FDF
+ 22: DA7979688F48A6606D86C762DF0D8850
+ 23: 6ACB325CE624372873CC01A4AA053F8E
+ 24: 94F9BFD6503DBDC58C163E33504B7EDB
+ 25: 3702CB296784290FC46B82445BF7EB17
+ 26: 903510251E7A00415EA21B6AC268A92D
+ 27: 6DF08DB9C33C86CFE8DAF5E5BB865ECE
+ 28: C29C5223D89A6589DE9253AF050D3449
+ 29: 16B935ACC3EC6C016CA1BBF727C272B9
+ 30: 644C01B157A24584B02A32119A424C01
+ 31: 4A3C6C73634759420C419426F7D43E67
+ 32: 7BD627A6B82FF3D797FFF130D8956391
+ 33: 811A69D6A8AFE3C4FE5B4EFD73804F6E
+ 34: 721BE5F4BDDED885BFF842868F62F4ED
+ 35: 76956871B22D5BECAD3E9A459B4A448B
+ 36: 4F2CF372771A13B4C0C1A589F0EDCF87
+ 37: 084AFBAE8D22DF83CC760A61138E560A
+ 38: E1CA123EBA05CC4899731A593833F372
+ 39: 9D9E277FA61993C018C1C61AE09588BC
+ 40: 85E0D0316F0B76578948810039EDE2BA
+ 41: 27736345D0F2B0A1A9576D17C47D0202
+ 42: DC9F788BE7C97BB5E0D2DD49B9F1D2DC
+ 43: 27F1A9A0D166C495493877DF06E9C104
+ 44: D1ACA7951866F58773CD4AFA3D2F5C2E
+ 45: 5204BE3729BD7D318EA8127BED82D5CC
+ 46: 10258B7939D81F5F8E0EA70EE6500B08
+ 47: 4E699952169098ED3084DC2EEE7BC488
+ 48: DF6ED8D604512088FCEAFB21808BF7D0
+ 49: 904D0667C94C9C981D59BE80DEEEE628
+ 50: D83483A47B64D74F9DED5278EE462404
+ 51: 490EC8799A9DE3BDE8708DAF68E6888E
+ 52: 443E4D2D5F800C22D818927A29A38490
+ 53: 48E82AA772E111FCBE393177F3123963
+ 54: B72685D042162D5F30472281278C42F7
+ 55: CC8A7F2BD608E3EEECB7F121D13BEA55
+ 56: B8E94B6408BBFA6EC9805BF21BC05CBD
+ 57: 6AEC85410412FF54078A9FC72A55ACE5
+ 58: 3E69F792BE88478883E46E867F3C93EB
+ 59: 3B057FC41BA700F0E46740B8FF391F52
+ 60: 3E3C6DF9500BFF8404486A3AEFC6F16D
+ 61: F5AD65BA970ACBBB8335F9C0B9D7139F
+ 62: 75D45F8E48406E32ABF94D07FF9B9C84
+ 63: 54BA4472FCD03E99CF28F90EED9F2AE0
+ 64: 2DE6578F0E7898FA17ACD84B79685D3A
+ 65: 3A4F2CA37EEBDF6DC99A6155517B74FC
+ 66: E19DC463C01E1B712B9415202A2B5505
+ 67: 61D8AA0838DEAEEADE2F26156AF58761
+ 68: BE294AFF81BFEA3159564B8B61844EFE
+ 69: BB943319320EE7B3A029D7BCD101F92F
+ 70: 36239791A7BE33AD46F668B51D724481
+ 71: 21DCC9A32031428B7B02F68E1450A0F3
+ 72: 95C1B0832575E21982B17CCCCAF54556
+ 73: 24939E25985A3B5620B19D7889E5E153
+ 74: 3029C8B005386705FE7E4CBAA060E987
+ 75: E8BD97C5C1A0CC9AD1F1BEB3913B22FF
+ 76: 808EBCA0B0E6FD1B30E4BA499C05EF9B
+ 77: 55BD20AB87DE2E536DDE22286D0922D9
+ 78: 2B2E45FA5628F29DA06462378D17DD12
+ 79: B90F1709241EF59F78666AEBB3D5607C
+ 80: 37854275343F079BCE1639C84D74AE1C
+ 81: 444AB5A4F39B765C5D67BB433D4CF0B1
+ 82: 7E30CFA6363F9AC96607783710E151B9
+ 83: 9D9252DFFB2D5023CFE34873EA6C43AE
+ 84: 49A70634AFCED27DC2DF2EB079F7A1E6
+ 85: 4C976C9EF13716CCB468D82BD8C56FE2
+ 86: 4EB382D16DDC18C31E6DBAC6CA83247D
+ 87: B16112D0FF3C6A8ADB19C13DF742F5D1
+ 88: F703DC6100AE23D194E01EAC433CF28B
+ 89: A6527B1B907218063BF196AA91C73F47
+ 90: 61F1A1E947F3F542FCF85AC758BA5D14
+ 91: 12ADDEDCE418E9444AE34A40353ED0EB
+ 92: D1C35142C475D44A52CEB0A8FAEA7AAB
+ 93: 1F89912C1FC59AAB53C983B035661269
+ 94: 2E7E19A4A6635AB5958DDA70B415EB06
+ 95: B700B6739C0AF162D246AF07284A1AE8
+ 96: E2B95AC9F876A38D33CCBBD7FA92D67E
+ 97: AEB4849953750A10BB236BAC8D5AB487
+ 98: 82D738AF18FD4B26FFF61377EE921E62
+ 99: 0E1451640E59CE0461A46934F174E237
+100: AE06EA64074E8C07116563E8E0893BDC
+101: 562DCEB678FBFAB24141E591FFD471B1
+102: 7DD6C3C2884E483E8CA572C471B2D812
+103: 2A4C8E4EC2672C1D54A8DA8F32F04783
+104: 2BFED22E8810A4658060B95B0ADB60BC
+105: 214D8F2DD099BAB68EC17189BFF8A8EF
+106: 98E4EB29797C8E631CD4317AF422FB05
+107: 241A0F826F359A21CA0E6D9154D1E291
+108: A3398C0118A3605E7A7794B8DF7CA152
+109: 5B0A6FC8721F14EB8A03E9A5D87F173B
+110: D93ABEC3EBD5672350C3C36F8FB00E53
+111: 659905751D1F614A78ECBB56D4398D06
+112: 594691B38126E028352DA5B28ADFD416
+113: 7533FBD1FD58C85D54A712EF218A9D53
+114: 654796E7D2F9F2C2D166F23B5AB18812
+115: 5D25B604FB75727AE7EBFF980F54D96A
+116: 426A7709CD61EB6ECF4034EC83E073EC
+117: 62E21CA2F8E39C03BFF56C8265ACB60A
+118: B7C9DAAA89A29F2805DEDE790DCB9575
+119: 9C1067170940CE8F8E4745D362675FAB
+120: C5BB35660E3D0A286A96EA3AA4922B3C
+121: 8F3B6351623A0E482B57525474DC703A
+122: CCC34CC280340681CA5117477DD86AE8
+123: 2F5FB6B41301F87A0490035DE4C1BB99
+124: A16E28DB3F331091E928F9AE3F1ACEB6
+125: 7D2259C98085B9BF7F5E36B29DF8384A
+126: BDDA1266FF3E8FFBA1DE1B2759B58BCC
+127: 2067886DA4BDE10A94B971CD740B0AAB
+128: E1275970EB67D2D996E6E658270AA149
+
+Hash: md5
+  0: D41D8CD98F00B204E9800998ECF8427E
+  1: 93B885ADFE0DA089CDF634904FD59F71
+  2: 441077CC9E57554DD476BDFB8B8B8102
+  3: B95F67F61EBB03619622D798F45FC2D3
+  4: 37B59AFD592725F9305E484A5D7F5168
+  5: D05374DC381D9B52806446A71C8E79B1
+  6: D15AE53931880FD7B724DD7888B4B4ED
+  7: 9AA461E1ECA4086F9230AA49C90B0C61
+  8: 3677509751CCF61539174D2B9635A7BF
+  9: A6E7D3B46FDFAF0BDE2A1F832A00D2DE
+ 10: C56BD5480F6E5413CB62A0AD9666613A
+ 11: 5B86FA8AD8F4357EA417214182177BE8
+ 12: 50A73D7013E9803E3B20888F8FCAFB15
+ 13: B20D4797E23EEA3EA5778970D2E226F3
+ 14: AA541E601B7B9DDD0504D19866350D4E
+ 15: 58B7CE493AC99C66058538DACB1E3C94
+ 16: 1AC1EF01E96CAF1BE0D329331A4FC2A8
+ 17: 1BDD36B0A024C90DB383512607293692
+ 18: 633AB81AEA5942052B794524E1A28477
+ 19: 2D325313EB5DF436C078435FA0F5EFF1
+ 20: 1549D1AAE20214E065AB4B76AAAC89A8
+ 21: 7E437C81824D3982E70C88B5DA8EA94B
+ 22: 2F5F7E7216832AE19C353023618A35A8
+ 23: 6535E52506C27EAA1033891FF4F3A74E
+ 24: 8BD9C8EFBBAC58748951CA5A45CFD386
+ 25: D983C63BF41853056787FE1BB764DBFF
+ 26: B4F24C1219FB00D081C4020C56263451
+ 27: B0AE6708C5E1BE10668F57D3916CF423
+ 28: BA7BB5AD4DBA5BDE028703007969CB25
+ 29: EA880E16EAC1B1488AFF8A25D11D6271
+ 30: C7172F0903C4919EB232F18AB7A30C42
+ 31: E9E77893BA926E732F483282F416FFAC
+ 32: B4FFCB23737CEC315A4A4D1AA2A620CE
+ 33: 5506A276A0A9ACC3093F9169C73CF8C5
+ 34: E5A849897D9CC0B25B286C1F0BFB50E3
+ 35: F54FA30EA7B26D3E11C54D3C8451BCF0
+ 36: 07602FE0229E486957081A49E3F06F83
+ 37: 7C4BBA98253CA834BF9ED43FD8B2F959
+ 38: CF8DF427548BBFDB1E11143FDF008B85
+ 39: 1431A6895A8F435755395F9BA83E76BF
+ 40: 30DD5E4CAE35BA892CC66D7736723980
+ 41: 8EE247A1063931BEDAF4C2FA3E4E261A
+ 42: C32CEEE2D2245DF8589F94FCDA0C9F2C
+ 43: F25FA0E071D1F1CDC6632C6B673BCCD5
+ 44: 370491B643E97577F4F74BD88576D1EC
+ 45: B292BF16E3AAFAF41F19C921068214F8
+ 46: 52921AAE5CCC9B6E8E45853419D0C80F
+ 47: F1375BE31969155EF76F04741CD861D7
+ 48: 04605CA542B2D82B9886A4B4B9ACFB1C
+ 49: FA887BA0FA491FAAACBB82BC5FEFCD5B
+ 50: 06470E932AD7C7CEDF548B5CCB9D4806
+ 51: AD130B245E2DD894267CB0DDC532D169
+ 52: A9EEB95053682248608E97D79E89CA82
+ 53: CC26A3DC608268B98ECD1F3946C4B718
+ 54: 33DD62A2DF6538DAF1CF821D9CDE61F9
+ 55: 6912EE65FFF2D9F9CE2508CDDF8BCDA0
+ 56: 51FDD1ACDA72405DFDFA03FCB85896D7
+ 57: 5320EF4C17EF34A0CF2DB763338D25EB
+ 58: 9F4F41B5CDE885F94CFC0E06E78F929D
+ 59: E39965BC00ECACD90FD875F77EFF499A
+ 60: 63ED72093AE09E2C8553EE069E63D702
+ 61: 0D08FC14AC5BAA37792377355DBAD0AE
+ 62: F3CDFFE2E160A061754A06DAFCFD688B
+ 63: 48A6295221902E8E0938F773A7185E72
+ 64: B2D3F56BC197FD985D5965079B5E7148
+ 65: 8BD7053801C768420FAF816FADBA971C
+ 66: E58B3261A467F02BA51B215C013DF4C3
+ 67: 73062234B55754C3383480D5EF70DCE5
+ 68: F752EBD79A813EF27C35BED69E2EE69F
+ 69: 10907846EB89EF5DC5D4935A09DAD0E7
+ 70: 5F1F5F64B84400FB9AD6D8ECD9C142A0
+ 71: 3157D7BB98A202B50CF0C437AA216C39
+ 72: 70E7ADE70281B0AFCB1D4ED13EFC2E25
+ 73: 0BB96A503B1626C9AB16C1291C663E75
+ 74: 5BED4126B3C973F685FCF92A738D4DAB
+ 75: 7523C240F2A44E86DD22504CA49F098D
+ 76: 6710949ED8AE17C44FB77496BEDCB2AB
+ 77: 4A4C43373B9E40035E6E40CBA227CE0B
+ 78: 91977CBCC32CDEAEC7A0FA24BB948D6A
+ 79: A6A0F1373CF3DBEE116DF2738D6F544D
+ 80: 761F6D007F6E5C64C8D161A5CED4E0AA
+ 81: D44EA4D5A7074B88883A82F2B4CFBE67
+ 82: 3097EDA5666E2B2723E8949FCFF2F244
+ 83: AB247A3D9BC600F594D5A6C50B80583F
+ 84: B229430E3DB2DFDD13AA1DA1BAC14D5C
+ 85: BEFEF62987C6DCDF24FEBD0BB7CD3678
+ 86: BFC3E5C7C461500FF085A66548378E0E
+ 87: A5712194537C75F0DD5A5AB3E9EBAF03
+ 88: 8DAAC097E9044B85B75999D6C3BCCD24
+ 89: B8124DF21129685597C53A3F606FFD28
+ 90: 8FBC4D795C22D958248582A8DF7332ED
+ 91: 36D217135DB136B2BDF1617D7E9C79CE
+ 92: 1B3E6271A3A4B663C509A1255027CA99
+ 93: A25F596574031FF9C34314C1B1F6BF34
+ 94: ACA7017E5BB62BFDD5BBFDED78C8987A
+ 95: 8129E53A694ADD0560B1534B32FE5912
+ 96: DA0E48224106C7535A4CD8DB2AC7B8E3
+ 97: CBD4ACE3D766D8E44F63E0DE8F110F04
+ 98: BDC17A0EF2777512CB402C90E9D13E31
+ 99: 47695AD6AF968D6F1CDD2D8C5C87A466
+100: 7ACEDD1A84A4CFCB6E7A16003242945E
+101: 225489D3D073AC705F7B3AD358EABAB2
+102: 301DA87A7B2EC27514C3A2789D5DBE49
+103: 16222C503718F1420958133C330FE3F8
+104: D778CE7F642AA23355948477DA4CC11C
+105: E873C37F8977E200A594B815E1A87EF3
+106: E8F8F41528D4F855D8FDF4055BBABE2F
+107: CACF3D3D1E7D21C97D265F64D9864B75
+108: 6BF48F161EFF9F7005BD6667F30A5C27
+109: 42E7BB8E780B3B26616ECBCACE81FA1A
+110: 225AFD8EC21F86F66211ADF54AFC2E86
+111: 4FAD3AB7D8546851EC1BB63EA7E6F5A8
+112: D1FEC2AC3715E791CA5F489F300381B3
+113: F62807C995735B44699BB8179100CE87
+114: 54050B090344E3284F390806FF716371
+115: 50482241280543B88F7AF3FC13D65C65
+116: 4C36F27D4786FE2FB8CAAC690B6D62F7
+117: 5A0EDF0B97977EE5AFB3D185B64FB610
+118: 4541055C6675B614D27C537C3BB15675
+119: 1C772251899A7FF007400B888D6B2042
+120: B7BA1EFC6022E9ED272F00B8831E26E6
+121: B0B2D719A838DB877B6D6571A39A1CDC
+122: 800AA956EC16F603ECDBA66C2DC6E4CF
+123: 8827D2778287C58A242ACD4C549BEB31
+124: CFBC5AA0B61103C1A982D8927B26F575
+125: A1F5B691F74F566A2BE1765731084F8A
+126: 80749BE03F5724FA4CA0AEF8909379B7
+127: 8402B21E7BC7906493BAE0DAC017F1F9
+128: 37EFF01866BA3F538421B30B7CBEFCAC
+
+Hash: sha1
+  0: DA39A3EE5E6B4B0D3255BFEF95601890AFD80709
+  1: 5BA93C9DB0CFF93F52B521D7420E43F6EDA2784F
+  2: 3F29546453678B855931C174A97D6C0894B8F546
+  3: 0C7A623FD2BBC05B06423BE359E4021D36E721AD
+  4: A02A05B025B928C039CF1AE7E8EE04E7C190C0DB
+  5: 1CF251472D59F8FADEB3AB258E90999D8491BE19
+  6: 868460D98D09D8BBB93D7B6CDD15CC7FBEC676B9
+  7: 6DC86F11B8CDBE879BF8BA3832499C2F93C729BA
+  8: 67423EBFA8454F19AC6F4686D6C0DC731A3DDD6B
+  9: 63BF60C7105A07A2B125BBF89E61ABDABC6978C2
+ 10: 494179714A6CD627239DFEDEDF2DE9EF994CAF03
+ 11: 2C7E7C384F7829694282B1E3A6216DEF8082D055
+ 12: CFF9611CB9AA422A16D9BEEE3A75319CE5395912
+ 13: E51F9799C4A21BBA255CF473BAF95A89E1B86180
+ 14: F741644BA6E1BCF5FEE6D3C1B6177B78468ECE99
+ 15: FB1D9241F67827CE6DD7AC55F1E3C4E4F50CAA03
+ 16: 56178B86A57FAC22899A9964185C2CC96E7DA589
+ 17: 0A0315EC7B1E22A79FC862EDF79BDA2FC01669E3
+ 18: 32AF8A619C2566222BB0BA0689DABCC480C381D5
+ 19: D35B5AFBC48A696897C084E6E71AAE67C7CD9417
+ 20: 602C63D2F3D13CA3206CDF204CDE24E7D8F4266C
+ 21: A3C6FBE5C13E8B41FADC204C0CF26F3F214189F4
+ 22: 25E480E9E0CA2B610105CD1424B8A35F63FB3981
+ 23: 45412D51D3CA7BCF452D1612720EE88F9D2427C3
+ 24: ED6A95036E3E046931597A457DB7A78B7309C4C0
+ 25: B4FE0256D346700783420E08A4A6F7992B1E36C9
+ 26: 33E1799E98280E5A9ACE5509477A2048607C5537
+ 27: CF193837F6DE43F8E38000ACFCF764FA8D8FDE22
+ 28: 7C8DE247DDA83599AF2EC2EE2D29E20583DAC34B
+ 29: F38A076F70613FC251C4D21E6435AD08341A8A99
+ 30: DCD68E6174BD74BA180DA047A7345E8D111F85FD
+ 31: 43BBACB5F62A0482CBDB564171B04365CA6E27C0
+ 32: AE5BD8EFEA5322C4D9986D06680A781392F9A642
+ 33: EB90BCE364635C4C23B49F493F0043579BC85C17
+ 34: 2942C7AFA65444C43D0592D0DC73CA71DB729205
+ 35: ABF726F5FDA729FB7F3F0484D7C94B3107AA02AE
+ 36: 75DB4F6BCC05A781DDA9D17C46717286DD53654B
+ 37: A82CB42D89DAF5FBC1D4A48476229C495782F98D
+ 38: FC1A69683744AF823CD69E8A1E3F460591714028
+ 39: DC68DB44B48521B0700A864896A00E17777AEA83
+ 40: CC9AD99E917042381B0F99588896CBF236AA8ED3
+ 41: EC7A68484A749C7065C6B746F9C465DCB414F370
+ 42: C627C449DEFF14AE7ED807293D30846F061DA5B8
+ 43: 4782F2A19B6DBB0882D656DE86C3D21A7317F768
+ 44: 02D4EED99E7307BEA39AF5330BF7FB388D48B496
+ 45: B3D99B9D90A69E50FD4365704F5AB2EAB7BC9763
+ 46: 9B1C07176BB227F73E8A4E173071D39302061DE2
+ 47: D79097DDAC552A6E02A52CE7AAF494D2D73B2557
+ 48: DF7F23B160E75B9BAE5EA1E62B43A5A34A260127
+ 49: F598F3780D8C374D97957B9B62D56106E9E0B2D2
+ 50: 0BD98598F9AB29C1359EF5460A206DD1370515E3
+ 51: E6C320834F69D81689E1ECD5ABC808D49D9C4E07
+ 52: FD5EE7588CD129E12B886974621FD29FACC78E19
+ 53: 2A9C28EF61EB536D3BBDA64AD95A132554BE3D6B
+ 54: CFAE6D86A767B9C700B5081A54265FB2FE0F6FD9
+ 55: 8AE2D46729CFE68FF927AF5EEC9C7D1B66D65AC2
+ 56: 636E2EC698DAC903498E648BD2F3AF641D3C88CB
+ 57: 7CB1330F35244B57437539253304EA78A6B7C443
+ 58: 2E780486F64BC91FBFA2785EC1CA5C9E3CC07939
+ 59: 4A7713D44E97D9F09AE1D786199C58AE2BFAF3EB
+ 60: C98714B16F92C8A770E9FC229DF834D1688E282F
+ 61: AACE3DD6F54A2A255ABA920F5FFC8CF04B85A69A
+ 62: CF8563896A3B0A0775985D8289444C4BBC478DA7
+ 63: 6D942DA0C4392B123528F2905C713A3CE28364BD
+ 64: C6138D514FFA2135BFCE0ED0B8FAC65669917EC7
+ 65: 69BD728AD6E13CD76FF19751FDE427B00E395746
+ 66: CE705B7C60D46E7E36FE073DB8822698579CA410
+ 67: C717EBBF6A2BF1BB33DA6257352D5085BEE218B3
+ 68: 86151D140AAFC9A4B5877D3FBB49014FE5906E57
+ 69: 7446B5A6BBCC58BC9662451A0A747D7D031F9A7D
+ 70: C24887924F92ADAC5AE367995D12691C662B7362
+ 71: 5AF83CFD42D61967778889CA911CFB6C14339BA7
+ 72: 587D4F6E6B4E21343423E434679009CBD3D24DCF
+ 73: AC65DD946C5CC432D4D624CAEB53C7363F96B7AF
+ 74: FA71E70750674C0F6B4AA19D0BE717B2936C83FD
+ 75: C9EFE6DD0A019315F73F3962DE38B6C848A1705B
+ 76: D1D05649B952C8F6EB016BE08FE1544AAC5D5925
+ 77: CC3081AC1D695BAE51CFD5B44B9FB3A230733CC3
+ 78: EB9DE332558953792687D9A7F598B5D84BF0A46B
+ 79: 39DE5EFDC92E3D3678F24D2CF545BA4D172D003D
+ 80: 399DBC9F721E44A992A0DEF42D999B32AF449ADC
+ 81: 996A2817C8ACBC667E1C4C27B8F4E9952736DD7A
+ 82: 3EF8189CE1BCC0D65AA182B1A81534635EDFDF2B
+ 83: D676714C6A6FF4E17A60C0511C25AA8B164FA606
+ 84: 4DB6E3381E1B9290267C1539E1053793C8B81FA1
+ 85: 3A34D35B0296FE4D83EDA39B742A9D8F4B13A958
+ 86: 54F3B45304EF1287F54B877FCCE3285E154F9D6C
+ 87: B1EA96216E025377AB5AA845238FC8BC65DD60E1
+ 88: BC6C7488145485DEDE1AE1D43B594F0046BCDA0F
+ 89: 3D9A0619ECF88C84CE86213E9AA91D9A252CBC32
+ 90: 92CCAA0B4CE89E2BD80A61B9BAFD5AC58AB7B588
+ 91: 3EB326B5BF4440FB3A88E3DCB05C1DB5EA01AC5C
+ 92: 989C63E819B13D4CADFB33F8DEAFBC57C1992A12
+ 93: AE944552C20CF16F07A5C357713832C9D72D0C6B
+ 94: 46723E982569A1E2D9EDCED5498FC1F46F7D63FC
+ 95: 3BC5DAE7907C83A0693F87FD8372EFDD1DF53E09
+ 96: 96D281BA44EB21ECFB1663C8AC5752C48686A927
+ 97: FA0EF18178880A72B51C26555C10F5210DAB4390
+ 98: 0C7ECAC32B8ED6D9835D381BF069568722A276E1
+ 99: 649E44ECBA85C0938EC09229CEE4BB69388EC642
+100: 1E6634BFAEBC0348298105923D0F26E47AA33FF5
+101: AF2AF2734BB2BAA288940CB62109F4849DAA347F
+102: 22D14BC045CC9A3794C99BEEE7ABE278BF24D6D8
+103: C3164CCBED75B82ED3F59F4A47FE09B256025549
+104: C27B5BC7CD24DE4913614A769A442E9CC9FB0E08
+105: F44D48D98CAC77522FF6B9E1B9CBB8489E58E588
+106: EA19A71FFBEC9572F6CD65523ACAF865EC05AB52
+107: CDA0EB9D310247BD1E8B3EA10D9B9DEFF6FBABA9
+108: 449DFCE971B9D65D69FBC72940E9A885E8DDE9CE
+109: 96EEBB6B95A9DA99C58190CBD77CD6FBCF638A79
+110: 670F7A869E90CE86E0A18232A9D4B1F97C1C77D0
+111: BC544E24573D592290FDAFF8ECF3F7F2B00CD483
+112: E4CE142D09A84A8645338DD6535CBFAAF800D320
+113: 1C26461E26EB697CCC36A98714EE70CAAA87A84E
+114: 51C5B1C25A71FF00394A84AB48B5733C8955551E
+115: 84803504181C0AE33A511C49AF5015A5B1892BFD
+116: 7CC8BCA120C2635ABFEA82DD203112B5C7E165DA
+117: 44E2519A529D7261F1BEBEDC8ED95E1182CAE0DC
+118: 2A81372DA39C1DF4251539A9922717B7CF5F0334
+119: 41C89D06001BAB4AB78736B44EFE7CE18CE6AE08
+120: D3DBD653BD8597B7475321B60A36891278E6A04A
+121: 3723F8AB857804F89F80970E9FC88CF8F890ADC2
+122: D031C9FB7AF0A461241E539E10DB62ED28F7033B
+123: E0B550438E794B65D89B9EE5C8F836AE737DECF0
+124: FB3998281C31D1A8EEA2EA737AFFD0B4D6AB6AC2
+125: 7A914D8B86A534581AA71EC61912BA3F5B478698
+126: A271F71547442DEA7B2EDF65CD5FBD5C751710AA
+127: 89D7312A903F65CD2B3E34A975E55DBEA9033353
+128: E6434BC401F98603D7EDA504790C98C67385D535
+
+Hash: sha224
+  0: D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F
+  1: FFF9292B4201617BDC4D3053FCE02734166A683D7D858A7F5F59B073
+  2: 00AC60F30E9BD1956F914C8E5125B69DCC31A179734E6A85B3F702BA
+  3: E615202185AABE2ACA924BEC29E5A12384F8339EAE4E64C9CBA9F1DA
+  4: D70DA0705EAE42A5C596D92F331DDA2421B4E14F8B3035FB73B8B700
+  5: 98029CB458A39A16355963922D32DACD9439F90E9FD106D42A0D123C
+  6: 7D92E7F1CAD1818ED1D13AB41F04EBABFE1FEF6BB4CBEEBAC34C29BC
+  7: DDD5BABB1B05D8BCCD644ADC393A9E2303C850DA31922C4DA07574F9
+  8: 4C07070802E21052FB0295AC0571CAEDF219143ADAE0627E2850EDAA
+  9: 5D3CA3BFE738D33F841069ADF6DD79B987351CE580ACA23326B3A7E7
+ 10: 6B5373C535A4FA5D56D6C4953575CE64968031BB019B909F8F2DB904
+ 11: 767D0CDC11079BA8DCA276DF5C4B85507DE67DCE47EDA4CD9196D312
+ 12: 02C513977B6242D2FAAC094CAE3C247C6E2745F8A71494A60535A2EA
+ 13: 1F39482310E2209C10A88C7FD7FC1FD567F36789808C37D30045A82B
+ 14: 55BA81EBA644183AB2460C234BB95ABDA898E980BA976584E2977231
+ 15: 2522E2B35A835436C80A122E4676DE64690C81440D42DBDA40EF2151
+ 16: 529D656A8BC413FEF58DA82E1BF0308DCFE0429DCD80687E69C94633
+ 17: A153F81C68D9FFFD4DE0AB9111C2FA86E8EDCA9B294376083077A135
+ 18: 1EC706AEB2227B263A105EDBE2562E0521C96420DA4558012327661B
+ 19: 4904ADADF19D088911EE0EFD20A9AB511F2786C8FD43F1E5E8BE2AC6
+ 20: 6CE245C296289A32F661986FF1C80E893BBD35EB0B182EDC14AB3A7D
+ 21: 33831C459A43CBF8BEB6DD50039750F1EA3688A7EAEF68CB2F095E16
+ 22: EB4BC2EA1F7146E8274A96E874585C401256FB921FFC7E935DDC7FFF
+ 23: 09A266C98019B6B2A4318FBEDBEA5481AF01F0AD2AD16F09991A3C3A
+ 24: 7AF2814CD6105473EE530F2B3DAE992ABB6C801428F33430501F09A6
+ 25: C5BD6127243049C4D5E9E3B391E12BDA86DC7A9856910A757004486F
+ 26: FCA06DDE2DCD212E6C1C11BB22B18B4F5582202655DFB9B6C9960C57
+ 27: 0851998120F8CE47482DA5B2EB21BADF73C9F145921EEFD33459D49F
+ 28: ED36A2092538C5D4769917953E7355A13072DDAD8A6E5E2AF1DE96F6
+ 29: 2C4A89C05BFD09B7068BAFDA37B0314EFCE02AFAE1B2C25DCE337326
+ 30: 1D552A4D06BB8A0827BFE8DA2B6EE56ADBD17CE4810908D572076F6E
+ 31: 997D180912E0655445B07259278AAAD424633F5FF6BD0AFECD4F15DA
+ 32: 71446EA93381BA091F94AFCDC5B938323290A1A027C22A75E88A04D0
+ 33: F77087D6F4AE34E88C62597CEC06220F4C694D2E0EB704820035AE6A
+ 34: 64EE78B0A6C116380A4C16F24489C1E94A578E558453537A9819A2E6
+ 35: F39C1C862FDC9AB4ACFA50FE283CB7595C608F8C521BB7898CF71D34
+ 36: DB482A26C9488A963359D145914612E34B821CC6CDC11113B73BDE2F
+ 37: C7C45F3AA5EEDE664D6CCD510F628D4DC3C67F93973FE05B0163CA13
+ 38: 7F230E3E597845DB9F8D61B44740968FF55F2DF28CA538A68927F130
+ 39: EA52362A9C66B6A5FF3B642FCFEBBF54F793B088D29E6840D7A5CF56
+ 40: 84B064EF9C13F1ED54AD0B8FC0CC28F9BCE5009500E1CD92CA2BAE04
+ 41: A2702281BD63CA745553CB18693DD70AC9A70CD73C01783727707C97
+ 42: 89231FCFFC7022DF20B1846285FAACE44AFCC677685DA55EE02D94EA
+ 43: 4C5B01C50907D097DDBF0923B885A26B58DFF5761C1AEDFB8D5353F5
+ 44: 84E0CF33A7E1C0EAA46F37E99CE5C8B292E81AD61318796D1A9A90C3
+ 45: 27E59A0B6E7B9125D4CAA658810AE5054CE40A9A0A0FFE6E36435EBC
+ 46: C7F21E2B4C89B2A6E64D92F93FC4146EB5886503C1231EE6924B4E13
+ 47: 653CAFF50E077A855992990F0C5F89C75FA18D1CC147F685AF2EA993
+ 48: 6A7BDEA7E456D5339B7D9C244E246AD65B18BA95E0518E201AAA7889
+ 49: 837ADE7F298F8159E6E2408751B0C480648CB6FD6D26C551983F3176
+ 50: BEEF3F6AC40A9DED345BE41242BB2CF924B457A45CACC68379B1DC4A
+ 51: 6D2908EB3B6C8952346E0B65B9406D949B5A340123DB83B151DF5F81
+ 52: 9E75A1D6B4A4D1A9F5AA6F8A48AFD6F3FD360D2D8723B53DBB63208E
+ 53: 436E3BFE94A39359CDF47D35395D34C0435018C88B4E96E68C22645A
+ 54: C209DF2E99E03D679FBA9E14AAF958AC1B0A22076BB3B532A0D7F092
+ 55: 8991DFBA74284E04DC7581C7C3E4068FF6CB7A63733361429834BB56
+ 56: 2B2CD637C16AD7290BB067AD7D8FD04E204FA43A84366AFC7130F4EF
+ 57: E87F5BC938C3B981C197D4B163C635A5049FAC81C4C6467E1251BE48
+ 58: FD9BDAF5CC288A603D1623651D5BA3B8801D1602B0B9221C0B48435D
+ 59: 87F207D9D870EDD7DA61753473A51FC386E2792A3861F949BEA05CFE
+ 60: C9EFF79F4412CE49296C082DC777118F92C9AC4136D4EB32621E942C
+ 61: DDBC76D25D9819693F3597D6F09044F8D6CCBD12F081156F1090AF7D
+ 62: 6411AD13AA3654302BAC8E2BFD1CE76F37E3B3394014BBE260062CFC
+ 63: 049E8DD7EAB3378CE9F823BFB569E5B270235D4B7F9623606971998F
+ 64: C37B88A3522DBF7AC30D1C68EA397AC11D4773571AED01DDAB73531E
+ 65: 114B5FD665736A96585C5D5837D35250AED73C725252CBF7F8B121F6
+ 66: 7D9B844CAAC9EC93AE2159ED3D336C55396216DAC6AC5DC5DECC11C9
+ 67: E1C799109DEEA117F68DD1826B38B514E1D265F11A8B60B24630FF8E
+ 68: 029A0D024B6C0B63E1586F3D34111727E37D49CA12E7F520FA91A926
+ 69: 2EA94F04A72C770A98E2A495D886EE674B7D0FB987B7B5C2217A8773
+ 70: FAF445688FFCA34ED783F948B8F74578503D4845836CAF69DBD5EB51
+ 71: 91EC59AC7C98F9DFB869E11C80027F8A4D311324597E6FC6135224D3
+ 72: 190DFC9C7BDD954E415E543F99B00B5110ED6A12182BFFDCAA77D8B9
+ 73: 8C3AA805FA75625476F3267C211B1DDA52E1810B058EF804E34BEE58
+ 74: BFD0E517E4A340A4E0EF1AC306EE2C6DD1288C77531EF0FD5ACB73FA
+ 75: C621A18D7E09976296CBC39761B020E7E346042FC735FDF106148F3F
+ 76: 27EE5F7E3FE49EAEC0AE0A93FD971EDF0304A4C0513BCF43424C95A2
+ 77: BD9D42F293DA572219F08D4A38081D203E44F612EEDEF93CE0DAF6D4
+ 78: 374CFB6FB12768717EFED2681718C11B22588C429DB9C71AFB5EB562
+ 79: 1CFB1037FC3943559E9F913183DB71392CD4BC68CDFD47D7DEC9C9AD
+ 80: 2537E015D5945E0541BC48320AE4DFF7FEAB911227AE0D579DA1CD05
+ 81: 012B34E1A530B6889E87863A59645EE4FFEB292A33815D2CE11918EA
+ 82: 5242DD4DFEE389E668D8FF78DA9B2D85AAE12D0C220E8D1BADBBA845
+ 83: 4813D70E1D6BB6232CD9257B5132FDBA05E1A4A858E237C303CFA052
+ 84: 0530BBA43AE6393655F21F7EEA67F8E8E819BA225AED78CA8BDE075F
+ 85: 4F7EAF4A9D0000B0E957DFE46DB304EBB2664A32AF4142EC74BE18D8
+ 86: 68CF23B9DC4DC3430835B484648CBF126940AF6BAE51431A66D7F0E6
+ 87: A093D2119C7076259F194F107077061C61C792DC5326C3A4D3A63BA6
+ 88: F4E883F7FD12ACD36E3891986E4D7FF03F3E150F09CD4FB58A023A04
+ 89: 0816862C59CE35E0D78834A221D3BABE21987FDAA81F20ED61D9DA84
+ 90: F415933677BB364C589722E30B958F2BEF8670A10F1F5082F79FDB4F
+ 91: E40C5632490BB8DAD2283B6DBDCA870F4B5AB4271C61127DE999BDF0
+ 92: B2D4E6CD7AFC35A475620EA1446B9024D767890B8593AB50275F370D
+ 93: 948616FD7828F09E8A57F986589948085D18EC3550E0ADA8E0127665
+ 94: 2B115E930333A355A82F074EF261DE6BB2942D9DD64F98BA12D92DDE
+ 95: 6EEAB864B5AD618CDB1AE79C7B1DE31020966A02350AEF71088E6876
+ 96: 676AD81F213E037F3C9BA2310F49DDDA4D6476C28A8EFC0046D3F55C
+ 97: 03A28C9068BC10A6FD87A1E53F00415F8CE994C968DD9CFF60D6B0A2
+ 98: 01D91D084F400C591EDD750B66EC2482C834CE0E140A37E6E142CFEC
+ 99: BCAD899E7C771764CB91FF60AD79BFD629F4803A05FCBCC24E8F3E79
+100: 6E08215B5470DDEB67E44A494E52E259A9C2C4FBED4AF5DC6DB3E92A
+101: E5C45BED6F8BFC487FF7190B108AF5C5B66F6D55D365B5A1BA156914
+102: 0DB55D83B38D42D229CA42D001B09758B5F3F032109F2F999C553655
+103: AD4DF1AF973A2747568A1B8DEF15E34A350A93F45BA84596580D11F0
+104: D4905849C8C4EA32159A431B52BAAC092F90037093E200A0C46611F9
+105: A936D0AA091B827BAD86644C94603068AB34A5B59E29D1E3BAB13039
+106: 46D214E9FA8C877C2791CC8E6716868713CB5B677CC4D838242C9B18
+107: AE8D3EB227AA3558101D5E5A2BF6C862C9F7297A31A3DF24E4502257
+108: 4462C366B10326D4FEF46E71930BCF93713F7D45FAC9963520FF5FE8
+109: 05EFC35781E413ECBCC763AE13D5A37C159CE5CCEE6EAA1CFF7CA516
+110: CDDBA09D7FE081E7A39C4017B3EDF7A9138D1CB857559BA9AD2C939E
+111: 1AEEF583C448A9AE00FBC931B50BC0DA5BB8323E616B11076CEE8B44
+112: 01E5ABF50619B5C2078E754EDDEDCF4DE8D31185A2219313CB91A8C9
+113: B7FF114CA77757CAD67801E6761AF20F4CBB8328AEF290F77EB612C3
+114: 08F43DF4547732424AC7D0390AD8AB3D4978826462446D13B2B468D6
+115: AC3799ED09E3BD9E770FD3A0073E371FE9A3D4E3D464C3A7023CC72D
+116: 795F160C275FF6B575031D4053BA1D1C32744D09F005B3BF10BDD1F7
+117: D2EFD4AC8ABA33151D0399E2893769A6D8BBFBA7B128388BFA65B841
+118: F85910F64FEE2B8F91DEC8064F75CB97E1FFC895AEE912DD3945F839
+119: 762F18C0DF65C3D0EA64126C8A6E51DB4425E76D4D969ED0F83899BE
+120: D022DEB78772A77E8B91D68F90CA1F636E8FE047AE219434CED18EEF
+121: A802D8B618A503352CDBCC1FBEF04EA36499EA72D0E32D314CAF83E5
+122: 6DE1088DD95C9535849294A8635A44084BA36E4EEF81C6D67B98CE90
+123: 6AA11591302A30EFACF874F40AA017F8545D3D9EA68D479965AC0B3E
+124: 3288A475A4817D2E42830C709C1DC18A4BBD59DBD903B43CA702F275
+125: CCEEE7F6EFA60B2F2CE1090FB929D6068F7EE301E7A84072FD163F7E
+126: A45B0FCFAC3F05279B7E8278AED93E37B225E6A997664F92C7555447
+127: 554C9C3F7E92B80F4121E00CC147535D377EAEB4FB1FA8E25C7F81C1
+128: 67D88DA33FD632D8742424791DFACE672FF59D597FE38B3F2A998386
+
+Hash: sha256
+  0: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+  1: 6E340B9CFFB37A989CA544E6BB780A2C78901D3FB33738768511A30617AFA01D
+  2: B413F47D13EE2FE6C845B2EE141AF81DE858DF4EC549A58B7970BB96645BC8D2
+  3: AE4B3280E56E2FAF83F414A6E3DABE9D5FBE18976544C05FED121ACCB85B53FC
+  4: 054EDEC1D0211F624FED0CBCA9D4F9400B0E491C43742AF2C5B0ABEBF0C990D8
+  5: 08BB5E5D6EAAC1049EDE0893D30ED022B1A4D9B5B48DB414871F51C9CB35283D
+  6: 17E88DB187AFD62C16E5DEBF3E6527CD006BC012BC90B51A810CD80C2D511F43
+  7: 57355AC3303C148F11AEF7CB179456B9232CDE33A818DFDA2C2FCB9325749A6B
+  8: 8A851FF82EE7048AD09EC3847F1DDF44944104D2CBD17EF4E3DB22C6785A0D45
+  9: F8348E0B1DF00833CBBBD08F07ABDECC10C0EFB78829D7828C62A7F36D0CC549
+ 10: 1F825AA2F0020EF7CF91DFA30DA4668D791C5D4824FC8E41354B89EC05795AB3
+ 11: 78A6273103D17C39A0B6126E226CEC70E33337F4BC6A38067401B54A33E78EAD
+ 12: FFF3A9BCDD37363D703C1C4F9512533686157868F0D4F16A0F02D0F1DA24F9A2
+ 13: 86EBA947D50C2C01570FE1BB5CA552958DABBDBB59B0657F0F26E21FF011E5C7
+ 14: AB107F1BD632D3C3F5C724A99D024F7FAA033F33C07696384B604BFE78AC352D
+ 15: 7071FC3188FDE7E7E500D4768F1784BEDE1A22E991648DCAB9DC3219ACFF1D4C
+ 16: BE45CB2605BF36BEBDE684841A28F0FD43C69850A3DCE5FEDBA69928EE3A8991
+ 17: 3E5718FEA51A8F3F5BACA61C77AFAB473C1810F8B9DB330273B4011CE92C787E
+ 18: 7A096CC12702BCFA647EE070D4F3BA4C2D1D715B484B55B825D0EDBA6545803B
+ 19: 5F9A753613D87B8A17302373C4AEE56FAA310D3B24B6AE1862D673AA22E1790F
+ 20: E7AEBF577F60412F0312D442C70A1FA6148C090BF5BAB404CAEC29482AE779E8
+ 21: 75AEE9DCC9FBE7DDC9394F5BC5D38D9F5AD361F0520F7CEAB59616E38F5950B5
+ 22: 22CB4DF00CDDD6067AD5CFA2BBA9857F21A06843E1A6E39AD1A68CB9A45AB8B7
+ 23: F6A954A68555187D88CD9A026940D15AB2A7E24C7517D21CEEB028E93C96F318
+ 24: 1D64ADD2A6388367C9BC2D1F1B384B069A6EF382CDAAA89771DD103E28613A25
+ 25: B729CE724D9A48D3884DBFCBEE1D3793D922B29FA9D639E7290AF4978263772B
+ 26: B858DA80D8A57DC546905FD147612EBDDD3C9188620405D058F9EE5AB1E6BC52
+ 27: D78750726155A89C9131D0ECF2704B973B8710865BF9E831845DE4F2DCBC19DA
+ 28: DC27F8E8EE2D08A2BCCBB2DBD6C8E07FFBA194101FC3458C34DED55F72C0971A
+ 29: D09BEA65DFF48928A14B79741DE3274B646F55AC898B71A66FA3EAE2D9FACD77
+ 30: F2192584B67DA35DFC26F743E5F53BB0376046F899DC6DABD5E7B541AE86C32F
+ 31: 4F23C2CA8C5C962E50CD31E221BFB6D0ADCA19111DCA8E0C62598FF146DD19C4
+ 32: 630DCD2966C4336691125448BBB25B4FF412A49C732DB2C8ABC1B8581BD710DD
+ 33: 5D8FCFEFA9AEEB711FB8ED1E4B7D5C8A9BAFA46E8E76E68AA18ADCE5A10DF6AB
+ 34: 14CDBF171499F86BD18B262243D669067EFBDBB5431A48289CF02F2B5448B3D4
+ 35: F12DD12340CB84E4D0D9958D62BE7C59BB8F7243A7420FD043177AC542A26AAA
+ 36: 5D7E2D9B1DCBC85E7C890036A2CF2F9FE7B66554F2DF08CEC6AA9C0A25C99C21
+ 37: F4D285F47A1E4959A445EA6528E5DF3EFAB041FA15AAD94DB1E2600B3F395518
+ 38: A2FD0E15D72C9D18F383E40016F9DDC706673C54252084285AAA47A812552577
+ 39: 4ABA23AEA5E2A91B7807CF3026CDD10A1C38533CE55332683D4CCB88456E0703
+ 40: 5FAA4EEC3611556812C2D74B437C8C49ADD3F910F10063D801441F7D75CD5E3B
+ 41: 753629A6117F5A25D338DFF10F4DD3D07E63EECC2EAF8EABE773F6399706FE67
+ 42: 40A1ED73B46030C8D7E88682078C5AB1AE5A2E524E066E8C8743C484DE0E21E5
+ 43: C033843682818C475E187D260D5E2EDF0469862DFA3BB0C116F6816A29EDBF60
+ 44: 17619EC4250EF65F083E2314EF30AF796B6F1198D0FDDFBB0F272930BF9BB991
+ 45: A8E960C769A9508D098451E3D74DD5A2AC6C861EB0341AE94E9FC273597278C9
+ 46: 8EBFEB2E3A159E9F39AD7CC040E6678DADE70D4F59A67D529FA76AF301AB2946
+ 47: EF8A7781A95C32FA02EBF511EDA3DC6E273BE59CB0F9E20A4F84D54F41427791
+ 48: 4DBDC2B2B62CB00749785BC84202236DBC3777D74660611B8E58812F0CFDE6C3
+ 49: 7509FE148E2C426ED16C990F22FE8116905C82C561756E723F63223ACE0E147E
+ 50: A622E13829E488422EE72A5FC92CB11D25C3D0F185A1384B8138DF5074C983BF
+ 51: 3309847CEE454B4F99DCFE8FDC5511A7BA168CE0B6E5684EF73F9030D009B8B5
+ 52: C4C6540A15FC140A784056FE6D9E13566FB614ECB2D9AC0331E264C386442ACD
+ 53: 90962CC12AE9CDAE32D7C33C4B93194B11FAC835942EE41B98770C6141C66795
+ 54: 675F28ACC0B90A72D1C3A570FE83AC565555DB358CF01826DC8EEFB2BF7CA0F3
+ 55: 463EB28E72F82E0A96C0A4CC53690C571281131F672AA229E0D45AE59B598B59
+ 56: DA2AE4D6B36748F2A318F23E7AB1DFDF45ACDC9D049BD80E59DE82A60895F562
+ 57: 2FE741AF801CC238602AC0EC6A7B0C3A8A87C7FC7D7F02A3FE03D1C12EAC4D8F
+ 58: E03B18640C635B338A92B82CCE4FF072F9F1ABA9AC5261EE1340F592F35C0499
+ 59: BD2DE8F5DD15C73F68DFD26A614080C2E323B2B51B1B5ED9D7933E535D223BDA
+ 60: 0DDDE28E40838EF6F9853E887F597D6ADB5F40EB35D5763C52E1E64D8BA3BFFF
+ 61: 4B5C2783C91CECCB7C839213BCBB6A902D7FE8C2EC866877A51F433EA17F3E85
+ 62: C89DA82CBCD76DDF220E4E9091019B9866FFDA72BEE30DE1EFFE6C99701A2221
+ 63: 29AF2686FD53374A36B0846694CC342177E428D1647515F078784D69CDB9E488
+ 64: FDEAB9ACF3710362BD2658CDC9A29E8F9C757FCF9811603A8C447CD1D9151108
+ 65: 4BFD2C8B6F1EEC7A2AFEB48B934EE4B2694182027E6D0FC075074F2FABB31781
+ 66: B6DFD259F6E0D07DEB658A88148F8253F9BBBB74DDD6DB3EDBE159A56BC35073
+ 67: 8FA5913B62847D42BB4B464E00A72C612D2AB0DF2AF0B9A96AF8D323FA509077
+ 68: 7DED979C0153EBB9EF28A15A314D0B27B41C4F8EED700B54974B48EB3ECAF91C
+ 69: 1CF3AA651DCF35DBFE296E770AD7EBC4E00BCCCD0224DB296183DC952D0008C9
+ 70: 5767D69A906D4860DB9079EB7E90AB4A543E5CB032FCE846554AEF6CEB600E1D
+ 71: 8189E3D54767D51E8D1942659A9E2905F9EC3AE72860C16A66E75B8CC9BD2087
+ 72: 107DE2BC788E11029F7851F8E1B0B5AFB4E34379C709FC840689EBD3D1F51B5B
+ 73: 169F6F093A9BE82FEBE1A6A4471425697EC25D5040B472C5B1822AEEA2625988
+ 74: 2087EBD358AE3EA2A092FC19C2DFEE57C5F0860296BC7B057C14E1227C5CB9D1
+ 75: 182AB56F7739E43CEE0B9BA1E92C4B2A81B088705516A5243910159744F21BE9
+ 76: 081F6C68899A48A1BE455A55416104921D2FE4BDAE696F4B72F9D9626A47915E
+ 77: 5CE02376CC256861B78F87E34783814BA1AEC6D09AB500D579ED8EE95C8AFCC8
+ 78: B93E407404E3E95F20FD647365E0E7F46AFABE9AF1FF083AF996135E00D54009
+ 79: E81FA832B37BE8ED8F79DA29987AA4D61310DCB14B2859DEDF8FB1DAA2541FD3
+ 80: C56705FEA5B110B8DC63688533CED21167E628017387C885423B835A55EDD5EF
+ 81: C2226285D08A245A17058ED2D24AD095B714F608AE364FDDF119E0A7DF890540
+ 82: F9C270DA8793221A6809AC685FDD4F5387E0FE1EE6AAF01C74F1E0A719621614
+ 83: E69BEFD6EF7F685C36E343AC1702D87AD6A0E4AC8C0D5C521D04AAD4EF0B7458
+ 84: 4E3033562AD74A7D43EB5FF5FC2382622C6307CB10E245AD62DA77C4C63CB178
+ 85: 2EA17629472564A59E5EB845A2CDD04F442DF2FF26BCC866E400F77158D612A1
+ 86: B90223DF74DD49A8A1461F340F2D7A90F96903CCBB5BC3C74EA3658FC8948B20
+ 87: E0209F42B927EC9C0F6D6A76007ED540E9BDD6E427B3368A1EA6C5E7565972DD
+ 88: 10D9BD424114319C0999ADF6288F74060CD8918EF1228827A6269B2BF0F0880C
+ 89: 7D1978A65AC94DBBCDC62E3D81850299FE157DD9B7BD9E01B170156210D2815A
+ 90: E052DFF9E1C94AAA49556F86FAD55029A4875839FDA57F5005F4C4403876B256
+ 91: 58D29459B2130A2E151252D408B95E6DAC424C564062EB911CC76440CB926CA0
+ 92: 4E4530C392316F598E1BD07F32166380A8F712A33A48E9EB4247131EC5DC05D3
+ 93: A09C9D3E42342C7DEA44EDB4AEB48CF6727CACD8032A12CF77A25829FC249D32
+ 94: EB978D0F1AC03CE5C3510B5F4A16073A7A2BDC15C4AB7777DCF01030CC316667
+ 95: 7D1905A3ACE827EA1AC51C4FA08C281ED3BE87E7F4E928D696BFDE35C8F2DC0F
+ 96: 08359B108FA567F5DCF319FA3434DA6ABBC1D595F426372666447F09CC5A87DC
+ 97: A7B3830FFAB0F2BBABBEF6DF0B169A7917008BF238880BBF8C20B8E000077312
+ 98: B4F5D9B1555994C5EBAEBD82918D560A3BF82962A171A1614E7551939E943366
+ 99: 014ECAEA1B378900F1212898C6DDB01565D81AF1D0EF78DF5E28D46E9CAF7CFC
+100: BCE0AFF19CF5AA6A7469A30D61D04E4376E4BBF6381052EE9E7F33925C954D52
+101: 4565D7B898CCEA3139AD260F9273115F806B30079D7683218C4E3ECD43AF3B33
+102: DDADEB660FE8902C9FB2DB9B6CF237C9CE5B31753398085C4367EB5910B9CC13
+103: C15A8928131F6687DD10F3C115DDF8D7C8F2DF7E18D12C08C4FD16F666CE60BA
+104: AE8E3D799B1353A39815F90ECEEBEFA265CC448FE39FAF2008CB20784CB2DF9F
+105: 98545371A3D9981ABE5AB4A32A1D7B2FADD9801D89DA52A94A4F78A42740D21C
+106: 6323DCE2F8B3A04DCEA8D205602348C40403CB200C677EB1A1C0FE37EDB6EB2F
+107: 8150F7C5DA910D709FF02DDF85DD293C6A2672633DE8CDA30F2E0AA58B14B0C4
+108: 44D21DB70716BD7644CB0D819FA6791805EBC526EA32996A60E41DC753FCFAFC
+109: B9B7C375CCA45DB19466EBD0FE7C9E147948CC42C1C90F0579728CFB2651956D
+110: A47A551B01E55AAAA015531A4FA26A666F1EBD4BA4573898DE712B8B5E0CA7E9
+111: 60780E9451BDC43CF4530FFC95CBB0C4EB24DAE2C39F55F334D679E076C08065
+112: 09373F127D34E61DBBAA8BC4499C87074F2DDB10E1B465F506D7D70A15011979
+113: 13AAA9B5FB739CDB0E2AF99D9AC0A409390ADC4D1CB9B41F1EF94F8552060E92
+114: 5B0A32F1219524F5D72B00BA1A1B1C09A05FF10C83BB7A86042E42988F2AFC06
+115: 32796A0A246EA67EB785EDA2E045192B9D6E40B9FE2047B21EF0CEE929039651
+116: DA9AB8930992A9F65ECCEC4C310882CAB428A708E6C899181046A8C73AF00855
+117: 9C94557382C966753C8CAB0957EAEDBE1D737B5FCB35C56C220DDD36F8A2D351
+118: D32AB00929CB935B79D44E74C5A745DB460FF794DEA3B79BE40C1CC5CF5388EF
+119: DA18797ED7C3A777F0847F429724A2D8CD5138E6ED2895C3FA1A6D39D18F7EC6
+120: F52B23DB1FBB6DED89EF42A23CE0C8922C45F25C50B568A93BF1C075420BBB7C
+121: 335A461692B30BBA1D647CC71604E88E676C90E4C22455D0B8C83F4BD7C8AC9B
+122: 3D08C4D7BDDA7EC922B0741DF357DE46E7BD102F9AB7A5C67624AB58DA6D9D75
+123: CC63BE92E3A900CD067DA89473B61B40579B54EF54F8305C2FFCC893743792E9
+124: 865447FC4FAE01471F2FC973BFB448DE00217521EF02E3214D5177EA89C3EF31
+125: 3DAA582F9563601E290F3CD6D304BFF7E25A9EE42A34FFBAC5CF2BF40134E0D4
+126: 5DDA7CB7C2282A55676F8AD5C448092F4A9EBD65338B07ED224FCD7B6C73F5EF
+127: 92CA0FA6651EE2F97B884B7246A562FA71250FEDEFE5EBF270D31C546BFEA976
+128: 471FB943AA23C511F6F72F8D1652D9C880CFA392AD80503120547703E56A2BE5
+
+Hash: sha384
+  0: 38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B
+  1: BEC021B4F368E3069134E012C2B4307083D3A9BDD206E24E5F0D86E13D6636655933EC2B413465966817A9C208A11717
+  2: 5D13BB39A64C4EE16E0E8D2E1C13EC4731FF1AC69652C072D0CDC355EB9E0EC41B08AEF3DD6FE0541E9FA9E3DCC80F7B
+  3: 4F895854C1A4FC5AA2E0456EAF8D0ECAA70C196BD901153861D76B8FA3CD95CEEA29EAB6A279F8B08437703CE0B4B91A
+  4: 80AE432E757826025095CA1FA4F89C06C8BA6754B1D883A8E31A1E65FCFB820BD74ACFACA3D939A574EA408A74162D1D
+  5: 561C16404A1B592406301780C0C2DF6AA0555F504F35BFBEAC810AE36A343B776858C5E0DE56BB79607A34D2F67108F2
+  6: 79F4738706FCE9650AC60266675C3CD07298B09923850D525604D040E6E448ADC7DC22780D7E1B95BFEAA86A678E4552
+  7: E6CE1896C9783A70AC4C90276CC37B37687D7E30C753975762F961AE37118D9A610242716E8359EFC4975AA98C632DCF
+  8: CFB18F81F4BB672B03214F1FEDE456F882A0DE40120212A1FEBA8FDC48F763C86ACBBFB684D34B70F99F4D8D81FE3A28
+  9: D075AE1178210804635AC02C656309311527FC8190835C8AD8196577C3332AF4D87F056023F235DB893C69AA87B0CFB9
+ 10: 182E95266ADFF49059E706C61483478FE0688150C8D08B95FAB5CFDE961F12D903AAF44104AF4CE72BA6A4BF20302B2E
+ 11: 89BFCF569AE4AF718510DA78C67414109F5739BB5C40D51C9C8C50E2B2CEE86F2F80C8B9D68F7C01201A0714572FE602
+ 12: B635441A3721CF190B39D23703C5B77018FF1A56C94F8252EE95C217E3477F093E8EC65C6AE767179A7872C8DB9B2141
+ 13: 48DEBF56626CC86DFA47AD6FDEC73FD182434621DA8BC6DB23AFF067BC36DC8244D3071B1F57DE4B716F63D9820DFB23
+ 14: 58475B7CF93FECCB2C02B588F1552A359E7EE9AC45D9AE50B2D7C22021466677D70EF24EFA5C492515164458E9A24744
+ 15: 0AA75534F0F58756A01E3366F78E7611BC7F432364C649C3F50547F7BCA3E5489531B8AB129495FEAC834FF0A0B45DB6
+ 16: C81DF98D9E6DE9B858A1E6EBA0F1A3A399D98C441E67E1062601806485BB89125EFD54CC78DF5FBCEABC93CD7C7BA13B
+ 17: FDD3C4C0F87EEC0CADD73028A06B01E67696C7E04960936B30C73F004CF6B595D644533F8B473C8E63B02D593A64B041
+ 18: 445E4CCA1A03480D149F38014C14D28DF8288F2C6CFF047F45D4F2580AE85EFFB3BE009C9D2ACC54B51467F83A09FBE2
+ 19: 8305DC56172245B82AEDCE7F9C7DC88C0E62CBF835A2AA133EB579F415FFD15BABBC30BB98E55DFDA0F9E80275C92BC4
+ 20: 8A48240E1C85E80651EDDC88599273444839A952CACA2BEF4400576E65B1EB6C19C47A3067B63AF7CDC4238ADB9A8DAD
+ 21: 8F2F7669C27A7CB1CF7A84A2C4F050D7141852D8B429291956B85E2DB5287741A3104E7E99CA5D23A5EEA59A68A4DDB1
+ 22: 32CF04AE2A4A326FDE2FBB887F47FB7A2C486E56088D85B45F0C7587591F44797FE0A67E36F571809695E05F254884B2
+ 23: 713A04A3A6BA8D2FD821F1CDF9FACAF42795E4247C9A26F0ADC5E0E6AACBAFFD8F4E02563733C6BDF1A863A787949B35
+ 24: 35D8A5AA0DC9AB4C9A4C62B36E0E1013977C198B05CF6B92CEA25C08309DAFD282AA9A4862958593C06BA46919EA8019
+ 25: D3FB60C2E981A5C82F1B1BCB3D4D7AF62C9A32A9F0D87E0532C9D3AAC083D70133EFF63A1E2CCB87360BF032C25FE9E1
+ 26: B119F9AC74E58BD081E24C0CC1E090012C192996EED67A8ECA33794FE7E1920E26C0EFAEB866EB5AB82FCA3188A3B05A
+ 27: 5B29543AB0F76F246B7FDE6E8E5D3DF6017A39342BB08351A4EF609AE00A91ACB7C5D0487B3760B34CEF326F63C84572
+ 28: F8E1FAA657BF829C9D2E4811805238CCCD11F0C1AB7619058241BA5606E7BD5E4816163E6E8E82E62A43CB4943A41006
+ 29: 0855B919786B5E5C87B85A6C17A46C550B2BA81B3724389088E2B54BA89D82B8F9841FF442DA5DB8D54C9B2AC108DC3C
+ 30: 7DEF8CAB7C80CEF90FB38989ABEF6F1A5EC18379681E484A1B4DB6624818D2E486FB9C245C1F0DDD85A846D4268344B1
+ 31: 04AAA180C2CD24F0FB150B1AA360F445344150DCA13E1ABB8117D42E25DF7FE29246D9F00C7473D20CEC32A71E64E1F5
+ 32: E7112491FAEEFD57786DA73F367B25A6F5769F5C98FA7B704D8D37747724A647371989E8B0FE8D3CB23F9EEDD528456B
+ 33: EA27126D0B96E00E428943EA94F4B03FD22D56C4FF4636EED139D027E6D45EF57AB86093A7342B3B3851FD3BFD1DDA23
+ 34: B2BD337A4BDD48D25A5E3FCE3E0948EC67829B835A8E3DD0D9F4881D10C766369B079028C6060B7263603288D8FA4BBA
+ 35: A9E940504AE6B137BB1BC88CE3A9AE53DCB63AFDFE5FA0C652003A921F582C08662425C7FBD5B1E1422E39E645D4A757
+ 36: F033150D7464D49A076C7D4BB9E2A5488132786CB4851A4C81DA5B0FCE66D775D3C1766094AD6CA9482DD9539F28ED9A
+ 37: E64D999E7258ABBB4CFF6F74AF7D6A1E9B044C17E1ACE0FC61B29E7732763755A9C1D3A380B080AD968D2228DB731DE7
+ 38: 9030D47B57ABEA93B51162556FF352DA61FDF501132A9FD94E6CB56690E7A805CDB290FB4ADE36BF90A53F20922C9B6E
+ 39: 4473396BB0461EDB4712880810A3F7252725AD4FD6092021A40559F453A1C63ACFFA8A02C85CC8DB86560323DA0A0FD9
+ 40: 095FDD130278B3C8F574D17283611E4D6199EA63A0F1599E01ED070CD0B115296FE353477582BF279D622355C89A23E4
+ 41: 7EE600CEE8437531C6A5BEC313D53371F9B56425D5662C104624D83D51111E5C9F4B83000B8A3EF150E04AEDCF67C237
+ 42: 676D2BD2500BC527DCB51968FE8742E40D2965047478E69155AAB9201E0C9B0F6BA9BE85C4734B0DD556B5FA7608BE83
+ 43: 09F5FE433D1FB8F62A76E5654B54CB6A9EF505D2465A49DCB9669EAC9A30B2532505E4500F842EC9FBE79A382C8C2F4D
+ 44: 075821CA8C547E66AD94F4C4ADF866A2A7554E08D2B0F0B3576801773EDC85DF76107E6912904E9757EBA753A77CD0FF
+ 45: 2172C22E7E48BD0B4A73FF02803D6FCE776CECBD95DFC43CA0763A0B375D57030000B12E59F9CDE81DE58E17489B2C41
+ 46: B9A15689BA4F41BE46855775B46A5DB9D6826E0CBDBC3B292DA6D57B2A179A3D393A8E1B55DE79438E5221580C604EAD
+ 47: EBFA57C946831E2E370A6B1BE46E27C95C512297499B8BD15722622178E00599DEEADD48F1B4B08EB649A137805CB786
+ 48: 25866C8288F9FA319FA9AA2470B4FC2595DFFA9154E607444EA3247E81D74A2AE0957D6B7E050F8C96AA7577BEDCABB5
+ 49: 3D28682B90022C873CEC78C3A47FD45B5124E49ED07E2F0FB41A112A63AACC9E7614ADBB007D129C0673B08C51210839
+ 50: F76D9B7ED868085905AE806CFC5C6DE994999E379922AC003D53F00B65467AACEF3929392F1F2F56C621D2F552544A22
+ 51: 324951FA2432B63D1765C21F98325BC4AE2FFB25F411047C53ED5A3D550B50E2B8F6E79BBE65F2C686A5132E5B982AC7
+ 52: 320CB033AD533AF8EDB3E664E34BB85B2327AFCFC583CE9202C0B11F16425A58FD895D7435E8953F9506A25DE7BE6EF3
+ 53: 6065D55530ED8339B09D7A4D9CB1919004F69ED9D6B119E78E1C39C7AD2AAC029A3F266F7E48350966B845C4D7D92A72
+ 54: EB6E866BDC0B5089301D89B870B75056ABA6D5FA6C7406A8D6D97CE5175102479647D3F93325A2CB648A3F40CCE38542
+ 55: DCEDB6B590EDB4EFA849C801E6B6490657A5C1E64F69269F5F63C9267F6223DE24CEA7AAA6B267D9BCECC15147B6C875
+ 56: 7B9132D597B8873AD55BBC30F18ED3F2C9F340E7DE69FB5774056C71A06D9BC2B14137E9E1C68B6B645FED28B188249D
+ 57: 0901B1E5B13FCE000486BDA64FBE45C79FCE15F38A4DDD9335A521D98829D267ABCCD84284BEF1EA3C2D4E4687C6D3B8
+ 58: 4A9375DBAA878E2C1C7BFB977989E6D39CC00F890ADC425F7084AE3761BAEFCB9384C8B9EB3ADD4C3C838A6D560DF788
+ 59: 908682C3E0D97A4943063EA9DD0A0F55EFCA203ACA3004010D3D7EF94593592729B523EAAE4160C3EA2241EBA236FD65
+ 60: 24586F75A43A08D6CF116B87B86CC43300FC4132523CC4824B7FBB3F54A5B41C7D598B40639B25A99732D575A5CFD355
+ 61: 7B4CFB73E247E941570E70C7308ACC5166F123187F003B1CAA9BCD17DDA8ED5535ACAE443C9ADE93C5567090EACE29AA
+ 62: E97EF4578822DDC79AF60514A188F8C719E4133B58E5EB134261AA7E89C402EA7219129A06B395E5E1D2738AC23FC876
+ 63: DD66B519F51A925814407A449C60B34C553D7652D41783EE903A810A4C9F833B8181C91C7F12283EACD6A5F8A2639DDF
+ 64: 9F2C9EB7116B3D7A4BA84A74A4D4EFF8A5EFCF54B6D7B662693C38577914C73A214766F0A175339BB0895A863824FC0A
+ 65: 14B0A9FFCE149426BF5045FFC24C057451D2473186DEB4F150117B855911A7641651FB1E15DF406EB373D71151C46F25
+ 66: 286505FF7A9EF81224988A8FF1E423A2AD21F6B339E91B89F7F1540F14CC9A603952564539167465CA70FF0B523BECF9
+ 67: 8CAB08A79BA16F3D7CBEB942C7D8676F8D0295B5FAA01F3C850DC4B5FE913AF00F2E938BE0B442187B135BEF1A36C34C
+ 68: 4D12FFBCE2E770ECA1104BD2F29C65FE95534E390A138C30CB0ECB6436A971116D82C6321D2EA2C0A735AF34E5E3E3B2
+ 69: F8617A35FE9116A719441F82F21C79B8868E5FFFC2EA737FDC821246DB7610E9868D870575F19B29F2FD259D9242A497
+ 70: 932FC435B590B1E1D49C34EB3B627DAD5476216518250B1FBFE772476437872B8DA6CAF6D2F33CE7AF8648D956CF717F
+ 71: 3F63DF48C2D87CEB2168BEFBF6B857A415D8BFB7062251E8E1AB0487483EEBDE5E8E8B8B0E3AD81ED4AB15E81FD5E448
+ 72: 4A71E4E737DE74F78E72ECB9DDB580EA5AC96E5BBD5E52E11D4A41AB3B8303E3AF3458A8AD89B39CD9F4A6D5DB3C9E2A
+ 73: CAC3A81A98103BBF08C440F6C8F61AC010DF8AC05FDA77E2ED8660AB73A978B9428BA0458A5C64DFCE35D87F0DAA2A6F
+ 74: 6E5D162C60A451B6257781FA0E36B3BDD9BC42A7BCFEAEB75C18E541A4DE00967E6BF575CB32374C1E9FE7B36D92048B
+ 75: 04DDFD71893D0F4AD2A0B672A057ED2795D6811AEAFDB7136BC8C20A55DABB3AE4B62B8A2C722C1F53E18FFA5771610F
+ 76: 555D5B51C2EA17659516A67D31CE2CB302979F80BD7056908C1A152403FD902EAEBABDD066AB3F7834E7213A6CE99EEB
+ 77: 44797CE4FEC66B26B52A4249C2B267AF891C912E55221EDB6CAFC4E2F022A40E8231931DF0B19321D5CCB2AB8A4F256A
+ 78: 51D7AC85289FE7E4D9431414B2BF3760BE65FEDD1A0B34BED0E1562A73495EE10971B5141835DB454C865039154BEA15
+ 79: 2E31DAE50A484B7E11E2E621D0552803791E07279752E09EDF4C884EF24C79C33D9572AE0DE6E0B6A20271F1F7AB98FF
+ 80: DDC65ED22CAE4D159D35E129A1602D8FA50D7AA53E209B0D5442BB121DB0D5D102441054B2B321675F3722669FECD06E
+ 81: 200E0BC495311E2FE524A1579490D843011A592E4E9B927DEB0727E5481898C557CB2941F18AF0F2725A1B19DE045BA5
+ 82: 561E1875B31DEAEC4DB2FF5BFA7856A6F0ABE1294CDCCA1DA12CCB1786D9556881A768ABAE50F7243921ACF993AAF18C
+ 83: F6B88007732D5B9F75209F9FE107B9917010D5960184FD239854AB4611CC788D1455B113A5565A87326B3CE6CA190DB8
+ 84: B4E703169169B07AC61E76A75ED4AACEE4115F6A43842BF136B514824A05F5C5ADB68F2E525D8C9E8BDB20D3BCA21155
+ 85: F72E2083B296EB7468C97749D3AA1B08F418EBCD9A2E5CB4117C5A034BBEA5E2004EE1E43E26A98E4F25AD4306AF3A57
+ 86: B1DE9ED0D5E5F7FDCDF530041D7320CA7376A64590F6679971F84061C42AA03F0B07C7EBCB806EC8380D9FF0E182293F
+ 87: 30ACC02AECEA9B91F3C6BB0F4CA8EEA1B84A0BA6BBB8F7749FD29C9BE5C5E28AFAE5A33617DFE3FC28CE3A78D1A19CDD
+ 88: 5B2DABAF662B86DC4B1DF6A2EBDEB5CFF1F63C65ACE5E1237DB507DD3FA2C27FF46517B0FCD6F32F25DCD55ACDC07FA0
+ 89: 33BE80B29355AB16AA0F05A45A8DC15A5EF7F9FEE60BCBE05E106BF6FA0F196BFD9CBB8D79298360F760DA7B05135F83
+ 90: 048C648A525FAB61CF81E087047044130E407B71DDD27293119689C8516B19DDC4F276E3B4E93E6AB80A79BB2700DE68
+ 91: BF18EA9E00E6C2262D802FB66E04FFA21DC5C13640BBF27B2C22592DE4AFE31C18147E6EBD2D45669C36F9432494A000
+ 92: 0A1A114981A785C399E2B21871A532B2A747FC67B4DAA287C14F2F449FC6F7C6925DB5E884E6E041D08BF6BC69295124
+ 93: AC6705C373300FCC09A291CFF1834401FC30FAD512569848A05171AA02426B7034EA2E4777AAC2DDFF48089226A4884C
+ 94: B7B08352FF8988C0FFE3FE0E27278F068BDC88AECBA8D7ACD8919850D7400A2C0A0A8519B264F61102290C9AAAD3C2DD
+ 95: 8F78C56A93B3DC69ECC5827F8D591195FB683A9951175754926A8E19F81FF859DC1904DE12BC8482A760E998552D28E6
+ 96: E606004ECDC6878B5EC15F4554017CCF962E92CC6EAEBE4997BA34EC0E53C67D564C8461C013701A401FE347EC0F721E
+ 97: AB7D7116F436ECB13ED2EC42347DDF902E0FD766EA8978CF93625F56B2164E2E630D6383EB03602A8DF27F28F580E3C7
+ 98: D716BE6974E46F19A606486BE576AC6E250AAE6AC2ACE7CA9A924C874790E6B4C94670FD884A6EF770EC5E5F3F264306
+ 99: 746EEE51375E6695BC4B66190172DC6E86C18E144267C7B0133D6C2ECE05F75B862E4C4EA5F813DD927D60C46E2C554F
+100: 3D20E33BA4D52A8C374878F1A624A907132264D0C831C64FC51ED8E1CDB75D11C3FC78D4C3CFBF99D7F0BEA9829B725C
+101: FE6A6EBBE30EEA13CE04B1C8FA4199331B77566D2AF420D4EACEDCF22C23B3D7AD2313175389A0765AD60A79C0AA85C4
+102: 1806469C58C028D7FBE80F219DD45333D440A824032778DEFC0A89CF704D40745F0F449F7DF82D228E1718391C85F318
+103: 20CD15E37F6371020B78579210FFD7756B42BD01EB829C1320C59AC382781AC4224439F1F820E215EE907091EE4F028B
+104: 7967636E73E440EF1F8751441ADE0F4D169167AC270949A758FE0FFE0B90C2773435623160E4BEA5F23DBE0678E95ED2
+105: 754F6D73A11693E07A2E5F05FBE13514C52F04F904131E0544202354D30917C333DC649FF7C33557005BB19B64DB777D
+106: 358D83F883166A6D2972C63F2A46EF893D2FF0F577A53830B3B8E2CB28D1EFE8405084C145EE4E0BEE5DFA9AEF739263
+107: D74B6FD707BCEC9419F032A9C21A7C79CD38F42D564057CDB956485FC5C2ACAECE9D86BE8E12B9181018EA7871343147
+108: A517359A64226F2D08B65203593F3427DD42852476A7609C7F6423C304FBA6EA83981470B8CF171F71BF02F688BB2448
+109: 62162975F98C8ED1B74ADE5B2325EC3D185F7BF8D9DE6C08BB3AB052E54C28399AABE2BE4295CBE12003A03924D4EE3F
+110: 8F1E4237FBB668D2705FA6964FF50014F54AB6346A7DECC8DBAA282B51803DE20F9090E7AF2E6B40FD8A138AFE25E1BC
+111: F5F9FE110D809D34029DE262A01B208356CAEC6E054C7F926B2591F6C9780579D4B59F5578C6F531A84F158A33660CEF
+112: 33BA080EC0CCB378E4E95FED3B26C23AA1A280476E007519EE47F60CD9C5C8A65D627259A9AA2FD33CA06D3C14EE5548
+113: F14FC73C4192759B70993DC35FBEE193A60A98DBD1F8B2421AFA253DEC63015A0D6B75FB50F9F9A5F7FB8E7241540699
+114: 72B9E34E0E655DCD7D9C288D11839A4FD96292F76F69BFB2E7D4F848E498B842CD4ED6486E77E30C603D218144AEEFB7
+115: D71CBD531B25BA65E319954E5AA670C8055406A595D006F0DCEE11AFAAF735CB1615EBAB4CC98061645FB70F31CDD9AA
+116: 1F4398793AE7B2C4975AB102BC054DCEECB238DE4307B5DC54F6D7C20E066F638A782E33441533276DF9DB1AD0EAA75A
+117: CCD908195016DC596A78C6C10C92EF6F272C6251F3C40B2E7DAD3A4538BF3FF585D4E44035B49EC397D1476E9DD28D02
+118: A8A26DDB23032BBD4432AC857383A5DE280202B21CE173D864E19C4A52984E159BDD006D95605A4682458137FE6B71BF
+119: 0C8D3031D85CEFA23A09E13CE03623F0E648A030E43700C82AA1C8AA7E3EA9CECEF3029A23815AD940CC39ADB7747D2F
+120: 0577AD6090B2A39FFA1C4A25436F9E958890C55A5B23CF8CEE8195A5984316D81D6CF0B5916C0AD8B1F512FB39826C6D
+121: A5E7C31DCDEC53D8898DCB27D52A5C1774115D8DB163543A330AB502FE31D6017FA4BA4C65ADE0CD911972C5A1B7739D
+122: 2785C149B798E41E6ED600DDA5257E2F31484BA4D14D35C8353BA4BB3BFB47F6E2CD9B64C940E3C1F83AA4587DC29CAA
+123: 977756EEF1A7C1D4CA31A8E6936E7B8884968A22F2846F20B38F247345B1CCD47405040F727BBE2E0FFCD159206F5E87
+124: 9E4811F182E5D6734EA097FCBC77892EC48F09DBA138AD5A5ABFE67F2E88AB61B0A3ECB29028B5528180191754231765
+125: E964C5CC45E8356DCE9FFFE715D01AEB3935D644DC9C2603ACD175A04E8924DD84A4D88A1384D6BAA8AB3F7F7D52D122
+126: 764EB963850537E57D0969C9914355C5AA67AA9722644569B7F50E20DA8461CC9C6CA5958ABE10F5469E4DC1ED27619F
+127: D5FCFE2FCF6B3EF375EDE37C8123D9B78065FECC1D55197E2F7721E6E9A93D0BA4D7FD15F9B96DEA2744DF24141BA2EF
+128: CA2385773319124534111A36D0581FC3F00815E907034B90CFF9C3A861E126A741D5DFCFF65A417B6D7296863AC0EC17
+129: EF49AE5B9AD51433D00323528D81EA8D2E4D2B507DBD9F1CB84F952B66249A788B1C89FCDB77A0DB9F1FEB901D47FC73
+130: D9B681BA08EC0D0598DD3A2A37F909D01A231D22DA52216126534402A58A072DB35FDAE555B99159894BC823F9DACFE7
+131: 961E792C94027A091DF880A713ECBCA94E7699FA392CCA3E4B9988CB95DD46C894AB6CFA3DE91236188F7A372B1C60C0
+132: 779C845CED9623B6558577C06C6F22768E4A01CED2A9722CB8788FCCA89E0B5CC6A8925533FD097F635997A9C191D59F
+133: F8A6FA1C730483AE488191E5863AB3DAB4BBDA1722710E519A2B2455273E78A382C60DB0D21E3B497EF9EEB2780AB384
+134: 1DAA34486981474A57029F0B1FF5150A144CEC7939A5D0C3D7DDDC4F471225D98E83E8A0DE880036F1A265E24CA1E674
+135: 769694D69D701764BCF81C053E2899B232344506C08A39DEDE3D838F85870818C3A8CD2DBC8695EDAF8FE34B4A5CC35D
+136: 97E29E4AE7C7E461196C1D698B5D1186822BB66ACA3B3E062A3AE07DB9DD0FED83A345014D3E5AD89E9046606AD2CEE7
+137: 6B57593EE18186573F92273A9B722F9FD77A4A512164FE3756BC2D9F665768016EB2766C46D473A103D7D7090073271F
+138: 35235261C522612958048B7FB8E48F96462D2B8B52AB2455C7C142E442E4CF643B367ED466A30BA97D91C1C8C0070E05
+139: 67004A5E74598981A79984B2662FFF8C8F49F8FD13C8A841F68DBA18DF68015E9C1EF38D6522D44F89DBFEA8AF48D2D0
+140: 8ACD05F9738BBB176E50C7419A05C8200E1BA84B5797032E025ED4B55D7A61CEC4CE3662432A4E0BA938D8C9143D5254
+141: 9963300C0CE5F2D39C2B899E47988BFA914D2EA2DBB972C15B3CBC414E41DF3A2FE793597243D46CFF937F41C0D83136
+142: FBEE0F5E072237D19170999D02BB95F6F8F48FD0596A982A4FA2D1273872226398DF57A63E1ACCCF6343415DF387D89E
+143: 32A65099C47EAE3BCD0F68645845C0171417385B15DB5E5F7BB5AD965F66C98CDC39B7534198AF70AD5739C8A2F2B8DA
+144: E936DBA2CED7F65DE3450BA7ADBE1030D7AEFAFCCE0CBA94E671422790B45B49918319A90FAA7692780CAB4301D9833A
+145: 1E20D13B4D71ACBDBD5D2AA129E98929510C795119EA8A07EC63917114315E2756B45E7AE42E1A44C5E410ECBEFB3661
+146: 02A0571C5C3076CACE7F061BDB108D7CD9C7EA51D0FBF1D00F202A0B5C87F22CE687D1CB15F798ED164CAF1CECF92CF2
+147: EA07C4A1DF1E5CB26DC7A7BC76FE518890FB8C424AF3B1C76B37AB21445D9F7FBAB73C7DB35E85337A8F7A0D55121F34
+148: 7829712876378DF986A63E4616DCA38DBE8833B14760168897AA808B96D8FFA4460CA3C1A9B674A0FC13E0625537C45A
+149: A7CBB3CD50AA663BD2C4520CCEEF123F7D314870806291DA26A59C003D041E46E6B563670F27BECC5F838A273D349AFC
+150: C14E7F70D28E17D3546EB40EE96D239CA5EF7EBBBD0DE64B964C145A5F2980D408A6AC248D651E4583E25093042EA286
+151: 19F87BFFBFF4B1E195612F41E67E1D4CD0393E73FEDAC1C36550C2B1A7323D3E7D747EAAB9844F45F150F8DF0FB72E80
+152: 6BFA3BC29FFF3A92FEC377AF8508D4823F4E87072D6F2F16370B7DD30789A944EE5721EFDA7ABFD47A512EA2D4984BC0
+153: EE10FDDE70EB0A11462DC00860AC4756B21C83BFF0066C431B17BA57CCBB9ED018E8058CB9EA44CC11952C3C9BD15F09
+154: E6A72B9D2A0FFCA41C3122C767A6FD9CFA04CB5B1D1D94B79A0B2C592A584F731CA0523AEA8F2DBA35FDEF74CAF165EC
+155: 59118A53C4479070DC728D94BA36D211F4ED5D35F1B69E4DFC0543F07326F982D2B81DDB020F2CACCAF1E5E9832624E3
+156: 63778B7830A3AB7421912A52B3CE9303A53C2A6655291042F428691A633FB9FF173937A8D8F59B21F72D490F39A9AC06
+157: A702F15D9483BB767FC6BE9C3BFC64732277CE936AEBADE4022B24B4822BD1B0FA1213AACF7B4506BF8F330FB7643955
+158: A3FBEA92041484F7F46B380462C5114B0243A79FEED89ECF8E6D8306D60DBEBDC5FF1578EE7E94B5527EFC5707D2B7D3
+159: 1EAEA2602E0B6B328D008A5325C5D4F9DFF7AB9BB5D36816D3EBFEE733BE664E35170506667BF5A24D00222EBC5DCDCD
+160: 92E4D41594E15628BEF06CA61E644D2A686C113BF8E3F9A8CD2CD8261B11D01B081EF2941D5182E565B70C566D461B23
+161: 2F08DAAA98DE6DB4E85B81E32C651D88075DE18B7F9C3F633BE1F29C89F24968525B1B357DE80C6EA8D9570E003C75DE
+162: 5DF64E7960C755D40BE78F0BB7C1A185DF8E505F0B421BE23563472843E3B5CFC7DA0F40908BF56C6F3A6244581C1DE6
+163: DABB5DCBC32FE7298C811CE22025E9B1C0B87DA5E7931CC3614E3EE39112206DD8422A5504F11599436B806C9108B01B
+164: 31AE27382E330115E009474FB5AC750A278B79EFF63755E323E3478B0761E5E946DA6D2436DC44ADE9F4578A8FBA9896
+165: 6804CF0314E455F499E73BBDF4FAA22CA49020330E74C55B1CF4A2D2F4C57D7149B41916002B2852ECFA0713BA91A094
+166: 7FAD2AB0972D8059D4306F0B63F25D9ACBBD8FD95EC8199CFA89D4E227EEDE6052AF0C53C703C7E319047DC5734C9F4C
+167: 4635E654950B173D3EC81A8212C1E65605C85835CFAD8607C829786855636A660D6C3045FF17663DE465BF2B152879E2
+168: B40764D8F066C897C3A8FE54BF21DA294C6B3F1B35255F68C8AB325AB3B94EE8AE2E5173936C17FDC95C9B7C3D3D3A58
+169: EE7E424C550F79BA82043245C3B7D0AC32A41B876988C322B9997D87F0A0A1FB8263726B953B43B4616285A239994936
+170: 627DCEEACB27F39552AB683330A67A316B2F53842BCE8056FCF3988702955E3BA72FDEEAC2CDB53F13627858C1BBC51F
+171: DD13F3B3E9C79958B20D1986650A79CEE1343F9957FBEEDE18B2FB5E543E3B8839EDF7A57EFD818129C4F00F505D2112
+172: 0A7061C0FBF1EE8CCB0F4A1D0DCAF2F200291AC06830F0E38D05E1CA2429A2BF57DE5BF8DED5A7CECC3A4748FBCB880E
+173: 3635AEA9152337FBFA4C2824C5499B9F3FD32061297C4121FB0A44CDF5D3C8D4C6EFD760A0BF076DBD1801C416949A9C
+174: F9C58AF2259C719B0B852FC68299AC9F17A802B49B34CBF5FBEB85DB3C68767CC34DAE2CCB536FF90BAE49FDDEC0CFE4
+175: 3541EB8602A4C84545F4476749EAD54E4542C4358CC78CA5B7C8B6BCD9E9A3E649CCB243FE0B3D02930CF1CB7A507FFD
+176: 4AA26C2565531A52811D30A1C59152BDE4C61AE2CEAFEF9642E7076EC44C7EBD50F1D1853761B4097D985DFE6878A701
+177: 32F1DD0B4AF205B4891E2F43D772EB5E4A5EA3658106FDC8B8CEEBD2D502F8048B583610A419E1A60020C8C2A5A02FC8
+178: DA7403FE3C3D3139893522C5DC8E4F615D36A0F7B7B8AAF150D1337C8DFE70311544E54880D1C575D664E9AF979984D9
+179: 39F8450D4A946ABC6FCA804AE11935CDE846D999BCFF3091F1E6944EAEAD504F77139A919F915D34DACC13757CCE0157
+180: 45CC03085CC3278B8337096BEDFE6F1D645994690660F23A358C4EC728EBAFD6966C487B9492DE217C17823B16589852
+181: A2150F3BA3349E3AA0ED97B1A02A58F31EB5731012393EC68846D95465F3B787C272852B6945B1CC0FC2B3BE999E0E46
+182: BF9392B085B3C5FFBDE70A3FB64AAB36E39BDE4816F1C9B2A608269336906303F7DFC15F4701D3FAFA5D7A8BFE316A1B
+183: 21BDA179D5B80FA6B9444AB1D1F7E06F89F670DA4A038E7E83E8A63CEDD44AB6C1D069D12C6F538B45022EF3160D396D
+184: B4216CDE6BC1C27A5C1EA9AC79E85776740F93440AE438D4D9CF51BE8A83AD44565586FBFB58DD743782724A440218E8
+185: 5C3D5C00381BCCF77FC2103C262F373592FE34C2B2895F54BCFD1F9B3C87026288130822B2B451D716FA9D4D7FCC93F5
+186: B927E3777D4BE05FA85D0CB707FB00F08C576777840634531795CD3D6818F192789977AD6425018025E10F5892FFE708
+187: 9C6976E1EDFAEDC32378C8D2758D1B0C5B287C500442EC5D19560BC87C75FD2A7379A3E64ADC1421B7410D1ADD6456BB
+188: 9C20482AB71BBD8E985D7891499DB526BCAAE11D2A42DD72FFED664D7BF7F254C2F8DDA2E340690FB83E1F5C58378B72
+189: 7899D5AF410188A3D0D0B12D52437313D786CE7959FC4D194D6A3ACA85729B60ABBDC58AC40731B9E833505156BEFE24
+190: 4F958FD1841D2B790A199EE3358F4DCEEC64CB34D0886EA91AA5E38F8600FBE13DEE4D6A55AC1273B3730CC62A3611B7
+191: 66572F61FE6C34B440AC00C8D3992B9CDE3FC465FCBB193CB7716B53E8032C743718D4F8245D94A22A9AE125795589E0
+192: E7AD49861960D1460A77F4F363341ADC2207E205302957250612C7E903802AF5C9423414C52F4C1AD55CC1C8B2922EF8
+193: 62BE3AA3A9D08CB41F2CA3ABCCB96E2E91A248E569FF58F58C8BECDDA5B4B25FF46BB30EB37999E6131D944CF3253302
+194: 3E082F7DBDF5BBA5F52CC870F2C6E9C63DFCD5D547B183F3FFBE392BF0A1F8F4970CA21E5B9B4306792C138D6B2056C3
+195: 5CC36277225DA2EDCC6CB603EDE9C629E5DA823E6D233AB7833F70FEA2878B2F8D08F361BD5B4C7609577329784D87DD
+196: 9555EEEE1EE60EE981CED3FB6BF74699E5383436ACC283BDA0F9F6FFE20561ECE75ECE2C5A82C0A158C071A3BA59CF58
+197: 0B975D2ABD0551BA987680C4890F80DF93AF2292FDD1E47322560B0AD3BDD38A67D3A78497D78B3C38DA597846C5159D
+198: 016CE0B8AD1628C7FBA358EEBB7C3667FA93566086B99F20EA6F87FBACB320E7BCEEBABF0008550A59AC1E6C3B4478DD
+199: 3D138114480946A2AA1E2B78948B6BFEA95F53BD8BED81ECCE166062A67FD111933A696E6FFFBFCBDDF71041955C98A0
+200: 7EA4BB2534C67036F49DE7BEB5FE8A2478DF04FF3FEF40A9CD4923999A590E9912DF1297217CE1A021AA2FB1013498B8
+201: 80C399C975ADDAB12FA20B3C3D04F25218DFEB678B5A87F9963A462F5474732C7C5FAFE0EBBBAA94662789CC10C9AACB
+202: C27E28A5B6C7BFBC7ED372B5BD2555EF1370FD96043753015B3FB9AF31D41E7189D4FA8860B183703560A298D90B6E75
+203: B792B021B3FA904B5948AFB4E56BD4C40119AC79E57EB24C32A7BF0A1A889313D816997E35F2CA192B34D2FF9B05ED9A
+204: 7828C6235E2B8AC46E4BCD7F7C7554EA81B5BFC046133EEFA0C4E64AAAAD7115B04EE09E33CB4EA1FF476960C64D9A36
+205: 06678F9A2F238953A8D6646F859FCC3BB0C29BABA669D7F891142C2C3A0BAC1220200B4EFF8C17F5D79E261128C58248
+206: 0FD4448A47B6620FE90551A9AA06DD991AB13DBD2AF18A4F17AE4A9A24D9A83E7653D5F5A2C54633C42ACCB0E5915A35
+207: AABBB8857DE60BDBB21742DE7ACF7EB8D9180D5D0AED23B7F708F09006C6FC56CE85DB87D9642CB909038E70C15C1574
+208: E1BF933A4F32AF56C929911284F9B05B79F0216EF3A150483D74B2D4DCD78885190EB1601A320150C860168221C6BA49
+209: 9074B187372B0535738D4606AA0478BECB5251EAEC961699C2795FC028D641D60230532C8F6A096FEF419A46B0DB87FC
+210: A63532A684A1851050E2861F7AB94296D131F768A94AB0019A941734E13842EBE8AB1F42DB4D0A84E261CB4707C74290
+211: DDFD64103308F0537ABD8D4F2209D8920CB42FA9ECBC93318D438C1493FE11B6134DDFF95DBE3FC6B8AA31F833E305A6
+212: 044ED56EF3129D29243665545A59FDC12412E137E1F55A543AACE511F9F86CD3202E3D24807B0FC878BA76223EDC6F42
+213: 2E470AB58A76690755AE6643D615039E767B84AE9E68480DD937913C44AC2350A27FDB45D6FADC242BD5F84809D59E2A
+214: EC0ABAC477B5AD5F6B11DB4B699283FD4668D84C2BA7F8DF90A5BF83C0E1E224623F0D2BB3F2DC6EAAC5E41436035D58
+215: 9FEBB6C1604914837F6D00F9AE23A3459DEDCFD81EF755B96A3CC1F63E4CD2E67F5AC2605E594DCD2610F4962EA6C277
+216: 3873BF1A102F1609A624F1A096E420CC459C02590600808F7DA5E3FD49F5B491269C1116A2AC74185A3105B5E9606126
+217: CD7E8C16B59BCEE5888DC7FFC28E65B72570B26F3A0C85885BBCE81E5A6B63D781F953E497399DCB506E8C4F5E237169
+218: 3D24BC91A4932BF6D631EB7698549B03E7F3930662B8527EC122FC2C7AA41E330862102557F480273864FF9B06628BB2
+219: F0B21BC919A3C6089BE3CB7CE10B55D76E31552E759F0465086A89D1FA435E2671928AC329ED7B3D7C1D7121C158BABE
+220: B32F9A1FD8A97E6E8E701371BF1A017078B26C3F4C58E342ED455B2557BDA16EAFAC00AEAC1ED7328C65D7C1E227FB83
+221: 5468F1B9192244C738EC20FA979F746CF6929FC48F69C79F43E46859AA022CC42E65203CE7CF77A039402093A1552EC0
+222: A58151FE3211C27651693B55E67CDE0E886BB0D8F2B6D9066615124CF1DA403DFA014C6F19C1B10DE7D3BBDBD0AB9880
+223: FE73FD3276463D27AE6A9F54877CD9BD3410C4A40381D25F5A915194538CA8C4F4B6154ECB9CE8B1B7E23953DC64F664
+224: 0D4EA680BA7CCBB9D88C09F6DAA6BC655BDB0B2A1C8C3DE0BE895328027794E223A45969AE594C7A21FABD5C92BA6530
+225: E6DC0E64DC804FEF91563B550A83BE7ABD50F51D3BFFA785A428EF9436775DD7E3A589793CB2717DC6BAD8B531CFC922
+226: DE168B8F03C0CE8143FD14BD2D294476FBE8DA85B09BF26C5D846E2D19957F87D6FE150B278EA4B3BCD36AE52D251FE5
+227: F34472A4DF2D3B529CE56E9D2A721A839DB05DB7B66BE8AB7202B024DEFD46ACF493973DD1FE88D8EF6E70673914DAA9
+228: 1F5E8FFB4678B3889E7FEB2288358A5F1377A97F76674A8D3E5EF39D185D02F6A1FB60E43BCC79C31E6974B37E74E50F
+229: 190AFF1D363C413BEE16C78C544AFD20678C7B1141D3917B6942E4D1486EDBCEE90EDE8A50E441219ED3B11BEFA09F18
+230: 66BB67FC2BDC1D5E8E4366958804F459AA689E04D5FCAFA8CA222656D568B23E976086E2BBAD979EA0973AAA1FADEB8A
+231: 0E14C70C02205AA29303D24D6491CC84B648EEB80AE9CC2A0997B7BB646ED32C69D2AE41C0DC007AFCEC514D7B04BCD6
+232: E38C413F3FC12764415F39A9F3638AA1204D3E818A43CF2EDD9F2CE01936D36C6720CF5BE8ABA362F92AEC81386A4800
+233: C3ED0B3697A84B388AA83DFF8EAA65F5BB12EF00315AD462F1F6D85D410D021BC32E77ADC763A254F7D9F1FB6EEEF1F3
+234: 8DC2C3F8C13C43709AAEBD408A679CEC524DA8C8F4157DA4BE551EFD687A395B33577728EB73EB498ECD0AD2487058E8
+235: 8AE817F2056903661E4EBF37D7293200D8BEE7AE0CADEA671E4987624A43712FD2C392E37C17D8E81EAEEBEE8E96653F
+236: 9A622BC18F3A09C8BC1C8603B55260BADF32AE7ABD8DCB6CDD980C5E7A5B8A38C6D287A63FE88567BB9B0481743C06D9
+237: B74C6303DDF9F0AD7CBEE923F7F7F1C7FA52C84EF609F2BBCC07B9911C12F3D1A9BD818A9F36EBB40D4B400AA4D0FDC1
+238: 5B1AD3420ED592FA3D593435CA6EBC700583AC5E3CA2876887E5F190EC2109A1E6DD06AFC6C9D7ED0E8B0272B7F9114E
+239: 2556CF077A788C49BB6D600F4A3CEE635C4443832D169F761537AFEE2980742B9F34AFBC87F598DD0AEDC4A826ED6A73
+240: D64769AD58F5A338669B935F3431E5BEF31667D0A2437BFF78F1E5275075F434FFF675F9833EA04AC4E5C2E2C2C99B8C
+241: 3264CAD70D24B53CEC95269B980DAB85A30D24CF8BDBD68F0FF8A45C6208F05723A4B3270CD095FB8B2D9A4167FB3D3B
+242: 4D564117E87700C69AFE5A4D90FF50DEF8A54A9BF19382E4290290D2BEE101355EBB2DFB2A9D6D044A6D12D6DDF7BDBE
+243: 6AAD71FA5D5D7B63FEA64D94E211155B01F8C9E4B3D86C3B9C014CA4BB6C668037C4739A082F37B2EC5FF6D85F0A58FF
+244: B36D529E55B5CF0FD3273F204F798E21DF533BE466AD1AF35EF80082132640493FD89A6CF41CA68AED066E93181A9EEA
+245: 78814E883A27D6ED3A5B122260059CC00D31B8A0E933F3C377BB99EF33F47B13B6AD825B740784BEBDD9917879C2DAEF
+246: A7978D0C79070B208F070241867476AE622EA887D26B0F6703FA8A455F411649D8919E6E12C540C59DF60CA9C05684CC
+247: BDC3E02D31DB1EB7F04CD9FB8876AA9C7CB1852BD3BD62F56E062E216BE648A34FD327B84E3B6339F44697470711F661
+248: 9135E6D4B1E2356C3DE16A85E4AF57243CF6861DFB6C53CA13D9481371AEE285B75DCCAFC1A64499F1B2CBE4A3CD82C8
+249: D1F9BAA4007BAD437509DB6F6DCA22086CB786026553244A6F480C3A6488F7E26C416C6AE85874477BB5563BA0AECF2E
+250: 49E5B7521794B6C73004BADF3D039F4185BE9BF8499FB08B9C8FDA2186B6C4BCD280AE2D2051C6775C19ECF1C776ACF6
+251: A7534C1716B59AB1C7AF3DF0AE32F22CD02A1823F61B318F36DFB536B8EF4515116A099F8DED19B00EE7B2D243539960
+252: 0F01FB323FADD9380A5E4EE6371E8BDF6FFB1F70C4D4A1B5E8BC9B281582AE0531AB354EA9F58A96568826F6172FC75C
+253: 145C9D3926904D8418B75C8D645D43AF651684AE7FAD885AB46141B9EAD2D9727731F44D5AAA0204395E020D1B52DA96
+254: F663682EF7FA3F300DFF0B4D9C0D2D126F2BBC164F3B88C8A2207C3799464ED2086CDD324C1E88DAA6EF2D53CF7C190B
+255: 98D7AC796C4CFB5D98A1C323656A4BE8AFAAAD168E5EE72B6B7A3FA3260461A043E27243120D41584B58F1AE4463121A
+256: FFDAEBFF65ED05CF400F0221C4CCFB4B2104FB6A51F87E40BE6C4309386BFDEC2892E9179B34632331A59592737DB5C5
+
+Hash: sha512
+  0: CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E
+  1: B8244D028981D693AF7B456AF8EFA4CAD63D282E19FF14942C246E50D9351D22704A802A71C3580B6370DE4CEB293C324A8423342557D4E5C38438F0E36910EE
+  2: 80536C6170DD8626DC081AF148D39EC2FD5D090CC578A76647E7903FD34BD02E4333ECE57B0E24FF116F43429B6FF541834BD40EF0C8D3563ACEF5ED0FD254B8
+  3: 8081DA5F9C1E3D0E1AA16F604D5E5064543CFF5D7BACE2BB312252461E151B3FE0F034EA8DC1DACFF3361A892D625FBE1B614CDA265F87A473C24B0FA1D91DFD
+  4: 4EC54B09E2B209DDB9A678522BB451740C513F488CB27A0883630718571745141920036AEBDB78C0B4CD783A4A6EECC937A40C6104E427512D709A634B412F60
+  5: B7B70A0B14D7FA213C6CCD3CBFFC8BB8F8E11A85F1113B0EB26A00208F2B9B3A1DD4AAF39962861E16AB062274342A1CE1F9DBA3654F36FC338245589F296C28
+  6: 2F3831BCCC94CF061BCFA5F8C23C1429D26E3BC6B76EDAD93D9025CB91C903AF6CF9C935DC37193C04C2C66E7D9DE17C358284418218AFEA2160147AAA912F4C
+  7: B7C0B47F42F7202BF7D28D6834BEE365FC01CE3F0C8C8DF24B4D940406C2E9C230BA88854E946EBCD786C18C748969FDF012362B7C96400604B6058950FEAAD4
+  8: 8A414C5860CF1BE7BC8531442F69A65EF2ECF0B7CAD9994BCB407097EB74CCB92E93AABD24BDE60331123B4D900684CA7BE6027099D4946BF537F4D6C6DF3D82
+  9: 8B5E5E7FB6530CCE1BFFFD1B1AA338D3282E8483319BF028BB674BB6AEB8200DA389647E3D8631503DC5C487BBFA7D074584493615B036849E0242610EA4758F
+ 10: 0F89EE1FCB7B0A4F7809D1267A029719004C5A5E5EC323A7C3523A20974F9A3F202F56FADBA4CD9E8D654AB9F2E96DC5C795EA176FA20EDE8D854C342F903533
+ 11: 8FFAEE0CCCC162851FAF051AE38667EEFD423C0164C50055F8ADE00AFC3705E3CDEB9900004B0E426CA66AB63AA3B99B075273F44FD37C22A3555C6FD1F37CCB
+ 12: BA51B2A9DA2F26FE81FC3EE11524255937EC6BEC48835EB437C598C55674E15AA50F88922DE7584332A5E4D24787090CB14DFC3ABDB39C55AEDF6EE108F95354
+ 13: B6E30A4016029486F9205C5D141344F885B3DE2468EDFB0B870545F1775CE82597C2A40462F385C957790C20822D9E920EF1AE230878D6B23F221B0182879CCC
+ 14: 79D76024A31CDBE54CA951D264C46E78F6F5AC5DCD018BAF89AA586333BE82B2D5CA2BC64B99CA2A99D95A984F2DC0D6C07E7C96059DD346BB3296ADE3AA33C0
+ 15: 4236736D08F26244E75B51614091CC2C2907D5DD162F8497B14D58D0D954A777C8397549BEE468F30E480252D9B893175DF7D2BF415A128CCC79407D9D5FA536
+ 16: DAA295BEED4E2EE94C24015B56AF626B4F21EF9F44F2B3D40FC41C90900A6BF1B4867C43C57CDA54D1B6FD4869B3F23CED5E0BA3C05D0B1680DF4EC7D0762403
+ 17: 7B9AE840AAB8BEE45B038CE398D15A8679DB92D0BA46FA67D1B8177986E41EACDE915C6552FC2AF8678425B8BE81B57E0F7EEADCC93B56C58DFC38B4D33BF25D
+ 18: 0EF6A8C19E19A466DBA3139E2A401175BEB9EE01FB56A8FC11A3E53B345F2327959F6DAACF0CE6121987D2491251DCF550C95F6026F93A1D96A0F4164CB1C642
+ 19: D6221AACC88CE14EB7DE0F15F2260EBF4294D9AC3D75B87465EF7AF9570C959077860EBBC5C8153000507CE1E39AED5D007F2286210EFFD26A118966ED15C143
+ 20: C9AC4561A7503FAB9C6B71C843AF6911438550BCDF4881EEC18DDA06E4D8B820CCA9521DFA9EF47298CCF6308FE4C4F2F5E34DFEC2ACB78FBDC04D2EF0A5A09E
+ 21: 73C5D58B05E1E6FCE4299F8D9294681416BC3785F51E402DCEDC0E30C0671DD48321A0248CCC13389A012B52513F1B5BBF820E91EB4F616928183485B4F1EB22
+ 22: AB1725C57427DDF93B34AAC62C26F3FF1E49CAD30DD41AE7B5FCE23894245E7E889E0FCA5EC076F247DC7E929D72FB965B45688E57D8CD54212714A17480BE0E
+ 23: 456F6757A82F0589040996BF88F28E61317C358135A9AB6E96E22F5CA68E2A6438D13D176B01157ACA1FEEDCE3C1A6D5C3A9B1D5A471691917392FB94D0834F7
+ 24: 5330241E6F01A49B21AB0D01A9C76AD662E97A325BF8E24C4EB82C6F3B7D2538ADD98F62307F36F900F3934861B80FC9844B761BE15460A1B102C26CF0410E83
+ 25: D8DDA603DC21C20A6DD3C6A4F380C297679F035D27BBA82554D02E1F95ECA2EB20496164F96DC4B84B9BB0942B96A3796AFF6125BB9E8711E2674B440176E91A
+ 26: 81E5A3AF460DD2881353D006AF37478C58AFFF16022441226FB04439783DA920D09FD03E19F45BC82F82735FBF4F2E5F588F11AFDB87B69DB91123CBF05F7F2F
+ 27: 25AECF7D241EE54E668DDD345582DB777F9F631B9D2432CE4D32119BEA3968D9FA3E184B135364DF62247AB74BA7B86AC3542F63D9F18653D86B9B47944AB96A
+ 28: 8A372F722A922E29CF5CB22BDABC6D284364F376DA355CA65BE36DAE2FA6F0335744CEFA9089DE55D331AE64E9B2F1037E73608B03B978758A20A012924AB235
+ 29: D57C54ABB87AD2D518790B81230DA336F551A0D89A57D0A3CFE2F4ACC55B4B210261CD1482BC436F62D3FC96D1536B82A2E93E9A3DB5CD0F1822EEACF307460C
+ 30: 6092F1E76F04A5926F6FCD149B18DC9DBE8581BDE6D2A1468145280463472B636C711FF61F5CCA84FD2F044697BD1DD18340B3ED0A131F4BBA35F839A2DD9E0B
+ 31: 0674A3CDF5F7C18C1B7524C87C36037F3D0267512D11E052F453DBC097CFD52BC331950880CF904656C70758B2E25E21FE2C7E0462E861112A2DC9D0636BBAFC
+ 32: 3D94EEA49C580AEF816935762BE049559D6D1440DEDE12E6A125F1841FFF8E6FA9D71862A3E5746B571BE3D187B0041046F52EBD850C7CBD5FDE8EE38473B649
+ 33: 301F1CD7B25B097AE4C79A97E92BCE359D1289F6754E76B71E7617A06E7783A3CC30F5290209BDA3E6AF239D0DC0F3D1CD4C5E866F4C5C3209EABBD7AAFB8058
+ 34: A8C7114B292CC6F46D73824CB073CAEB23EB1ED5EBB37F064A0A76AD452D936D1DF41433FFA337C3F7CD53F5CC00658ED0633252B69DE192E61D9F002B0F133D
+ 35: D2F92068E07C9AD0572693CF546FE75070E574807C02F5483A31B8CB2105CA55CC6AADAAFE74977F581CE90F43E2AB48260BD7E273D4A83C442EC4871CD88AAC
+ 36: 1A4133CDFA6CC518387D392814029744D6FA71122EBDFB70059512B89469CDB9D9B5E45900E99E67DBA54B4708036298A94835751EF583149F06AB272B2BA355
+ 37: D30DE790B4905717C956A95F60D9ED5948F9E509BA27607E1C5C8FFE35ACD83F719AE04D63364C0BCB72BA529AC79C321ADDFBF7AECF7CA3CAC840A372E6F6CB
+ 38: A25F5D4BFFBC5F0E3D5CACC3A91870866D8C2D22573556C9B9FA0D24E1D68C55EB42726B1895DF8E5E870DA33755DDBBAC130AF2D96D84DD0D57761D25FDB64F
+ 39: F44001A74D0B087AF2A143B778DCDEC1554BCE5992C9672E3D0F6704D022CA1E78F087543569CB99D249B820E683138A2DDC5DC178D585167FDD269D17396A89
+ 40: 692F36EB114060FD04CD38555025251DF985DDF681A0636FBD290EFEA6FCAC5226859373F3E10E8CB07AB5343547EB0A543C18420D70527D2BBD90040F8DAA52
+ 41: 4B1CEF875A025624398CD06DB876EF9AB34FDB1B6A75A07CCB591D9B20EA66E24BAF323911B5CE8B67904945A36C28630B36129939D23D26218610CB049D7AED
+ 42: DB3E80F11517AB797265829371F245A7A0A384E36A8D43E72852C8D47F8CE37A178475EEF44CE8BDEE5AB054F47EED502E76D49B9F4A5AA392077ED1E6F43EC1
+ 43: BD08551AEA7759911B37E9D45748219B47C4EC17A2D2A306D9B8FDF982A9E3106BDC1ACF3F47D383B6D16E85910BBA08128E35EE578E7C55F2E9B9B59F611298
+ 44: 3BD8A709DB9A4E0B874B113564B11EAF8270AD1DA3A9236DBB16F58F43285070344962394C2231B3917401924A3F688150B9A9ED3B410547DE3F56450739592C
+ 45: D0206C8577202C617592B47AE178DA867AC7DAAE4E65B912C771C5FB09585FBD10C36782064E83ACE749BE27045508D544532B628F67DF00A6B7DBA9775D3E06
+ 46: 745083E5994158A0FEE4D849012F43A822D19F068AFB327B372A7A8BFE8347E579DD29424EC95319BF75A24B4DB4280D9C16CEBFF5D930D61D34909061A478AE
+ 47: 3527A5E1E5E5953EC57F309C6513C34405531603372BA0DFD5725E68B9510E5090CC6B317B2E7359D2ABD5ADD353AE1435B85535EB5B0B8F2E09D4DD1BAF3C8B
+ 48: 622BE417916F1B0E9CE8C952171B11B6D2E2932D6197CC17431B9FFDF03FD0ADB69B08DEDAEBDD0F94812BC2C670C894D65165B31D2F2879532F2C14453E6A0E
+ 49: C2EBDADE0368F1DEBE44F8E1B77E66BC1C25E7F0FCED7784D615811E2C01192DBC21253E10709D0BEEE746DE6EF93CF65AA39BA29551E11F602ADDD27B196019
+ 50: 5ACE0640F0DCB25871E1925F96BAB48162D692BA134C9C7052A37FDFA4895B90AC56C7FB0E7FAF155D147A467839500D980E9D4ED1CC96661177ACF0BA8D4167
+ 51: 5D43600C04E52BF6524CDCB9DAD89B1C7563912E7C7E2CA3D34B27B3C1D07D85D35EBB7A65AF0434155AFA3102A580AD557468CC23EEA1E151BFD4EA817FC5B2
+ 52: 38D7538AC3E51DDFB6724F57B29A5E46D15A8C08FB29D15FB0681A4315B03FD6747B85D0EB2B9E5FCEC709F365DE08D61A1EB363094BF292B5154671D15D61DA
+ 53: 2DCE13E5882A31F7396D970AE72E89FB59270D78BF7B4579D0855C4E8BA231D23E5566B77E79CCDC1146762DAAA74F49D82F9EFC0D4FCA891E78F9FF86C61300
+ 54: 6D7644DB575C5C238DA02CC4259996CF163A3A3B5ECCC4FC62442DDF01AA05EF0C4EDBE3E6D220DF189C984AA55726A4922EFE004832F2D8887F0B8A9267DB40
+ 55: 6856647F269C2EE3D8128F0B25427659D880641EF343300DD3CD4679168F58D6527FDA70B4EBC854E2065E172B7D58C1536992C0810599259BA84A2B40C65414
+ 56: 8B12B2F6FE400A51D29656E2B8C42A1BBFE6FCF3E425DA430DB05D1A2DDA14790DEE20FA8B22D8762AFFFE4988A5C98A4430D22A17E41E23D90FA61AB75671A9
+ 57: 92CB9F2E4EEE07C7B32B06CF4917FBE54365F55247CC9B5BC4478D9FADA52B07D1C302B3959D0CA9A75A629653EA7C245A8FBBA2A265CDA4EA70AC5A860A6F3D
+ 58: 23417F93C499DF9EAAF1BFD6A62AADBC711BFE56682943DE5D94E0DAC32F732B763BE28C32AD5F01CB95E5B322AEFF8494B111D7CD8BAB50E7C602695EA6FE42
+ 59: 4ADFA8837BB499605D38716F8305FD50255DEA2EC4BF3EEB07560B3C93B5E3725C5A598277A32502CD5C8AF6C88D55756DEB03B69CFC278FFE2BFB3CA202B0F6
+ 60: 981A245B249111B4CDCD565AE60C9DEB69FDB552B10C932E8D0635685904203C37CC65D674292405DF24A589682B8AA69BD0E16F666652290BD79AC10E3A9B37
+ 61: 15DDF1E434A88F27DEDB8435ED837FE4F1F3BFC5B6FD387A98E93D1C83493D326467C7C53EFEEF158F6B9CC2081267D9761A32A5094399754C0FD62F4C72371A
+ 62: E08026874830E0B911F5CC51B81599A4DC21204F5C9381CB5A0DA8F452EE99D9FF7590B798805C2743822572E6D2E47C2C1F2D428EF3C28D05297BEDC5CAC4EF
+ 63: 9DC9C5598E55DC42955695320839788E353F1D7F6BA74DF74C80A8A52F463C0697F57F68835D1418F4CE9B6530CD79BD0F4C6F7E13C93FEB1218C0B65C2C0561
+ 64: EE4320EBAF3FDB4F2C832B137200C08E235E0FA7BBD0EB1740C7063BA8A0D151DA77E003398E1714A955D475B05E3E950B639503B452EC185DE4229BC4873949
+ 65: 02856CEF735F9ACEC6B9E33F0FBC8F9804D2AA54187F382B8AE842E5D3696C07459AAD2A5AED25EA5E117EB1C7BA35DA6A7A8ADCE9E6AFE3AD79E9FA42D5BBA8
+ 66: 371DDB96ED5BE6521379457AE8ADD707A866732B629EE00074904D73858F3FAE827D84E503F3779073490B274E29D644D76154FAB18945222289BCA798BA6438
+ 67: 96A693A22256D39A0596802319CB7AF997DB4BFE311577E38F8423DE81C567A96775D063471438F0982EFAA6B75B4AB173D9D3B3D4762030B522FA70DCF3B27A
+ 68: 7D8AB6155AB31F29740042D82788A69E880FC642E600BEDFC89098B9D2F4F98BC11141FD420870958810295100DE66F50C96E1E4F6489DE98F9BF2D4A9AA2237
+ 69: CE561F8F679B4EEB1DC97DB0F72632B9DA1C5B5C0292CBF0662CAD981374BF8C9A0BE1355657FB18196F980E6685D52FE601DD45C6B0FBDE7AA5C9D52E7E5973
+ 70: 10164CFD162CABC44C56D76D369096D759954074B0547FA7310C3388F0FB6BB2AA295FAF1E22C44CF59959A37EFE317698BC29AA718D57EBC831A14144F4E48F
+ 71: 658B337A8FA873C73AE4D19992BBAAD10E1325AFB4DC8B5733F870761429B4243A7982AB375E529C1FBE6339A48F9FB9E8FD6A568F9CAFE640E102B9F398A330
+ 72: 4EBDFA0E60E1A3E7FEFB8DB424A5C3A52365F325EC7F51389A4955EE3453BBFC94692DEAC3FF6A4E94105C27D632DF26250FF37314C882FDEB65D53534F8A961
+ 73: DFE9D2A6B0AD5DA802D695B3B91745852C97B0283D9A033F04D79D2CAD4FDE50048AC7D82BCF8C402B109E785D39FC9FA0203F7CFC620EE43577688BCF3E69BF
+ 74: F21869E1EAC3774F3878570AF0DB9A94F464373C1A92E097D180A331C9028A18A68BF4624D8E620B2216B03709F03FB6CD10004F77433ED605B0F771161145C5
+ 75: F1F928D322E6852301AD6FC901E91F2156A3CEEFA204044DDA3B4B76A63692DAAC479FFC6D83EEE3BE028A1F651D3520758DD395A1B251E6C261B7CCE86D0481
+ 76: 37954BB11B0AAA67F803973DDD2709A73B947D0A5FF8DC46C2D3C6918C87069AD0DF907589F3026A94B071E0F00230F00CF74AFE8010C24E489CC8AF9B8BD646
+ 77: 140DB04BF46A194E44F07F6ACEE8326573AA0591F8370A79DF320093C45764A2ABAE531E5A742F496544657FADFEDB7F04D4BD74C347AAE237B5EE59921BA87D
+ 78: 6D0D30BE796B6E1039739BF24CE26D8DB954D25813F8D7F7444617816F93FC7488B71C69D96D77C65007EF6A2BA313AE0739302395F3D9EAB0244E372AB96961
+ 79: 2B92E0D915BC7D56215651BC9F769544C55E2A27080EE726AB14FAC0A43AC51CD378EEA356DFA70EEC3C9146E08E98358C61FFFA3D477CCAC35FD6724A44C23C
+ 80: 2CED9E743D84F8EC5664A99C6DE2238464E61129B3C856A7FD2CE08B185F4D447A829F287870AC5428114A7234E41A78801C19EA5C6246FEFF961DC6A9B55835
+ 81: 4462303D052C70DE76296234B72BFF1AF173E7B63D1CC0E26C518D103BF3BA78D9AF4BA88013192CBADAD83801B8FC29D0838A144AA3CB721AC859EEABF019C0
+ 82: 880FEF79B74C109F030F3FA6FCB82DCA034528CCA68A23ED1EE4133C10B3E443434A37C436F079F3F3A922A8547549A39854120723791519DBC166936C239AA3
+ 83: 12DE996C9DCE152C83BE6C0E69C66633FC4244B412066A5FE7CEAE27BD4A109FEC95332C60E87DF08A1C714D9D2ECF28A8A81F1CDF8BB3CD2CEF71011BF5A5DC
+ 84: 748405D18FC05F0AF7F61E0CCDDEFD8055D86826038C77F2AB230F7D97C89D0EF09CE82C4352A7491729C9FD704B279449D0DD7D86CD2FA52EB3B5A582DC2057
+ 85: 746653CDC44B4C86B29DE5B28254BE9198C0271249F0690615B05F23AC0456DD66CDDD13D2F22924DF530C78FDFD3699E38E29A550E2739A803FD1FFBEB29E59
+ 86: CED0B3E4011A6DA0415C51E37996EBBC5041861FD1584E3D948E1D4DBD7F8673EF93910A10797490DD5C62245EE7EC03D7CE8B8C38FAE21EFAC1AE6056AED143
+ 87: FD4BE7DCAC6984196FABA1D88D0FFA9F33CAA29FBAB3E38CD3DDA7FBD94866C944F91B405B3EC613044E4AF11BE7187B15D5AFB4067C54FA09215C3BAC4FF080
+ 88: 46836D5A579D5158B9F49D6EBE9A43C9F4A55C768869C3D542BB615FDBAEC8DD34FFCC40288567F8C5E9363852EFF44FEF0EFC0904BE178D3F78EA1B61B9E98A
+ 89: C05B8745D68BB9647E411E5AA1F924C2C9B96E7DDE71D190A3B8709ACC2856ABFF3C2DBD7093B25F81C6B9883D377E721968632FA4D566F7F72E1109BDEF2D74
+ 90: 647A0E15CC4BB5EB3333919CC828D68C5352F1FCACE6964F23FCEB46D0D2408AE896D3319B202EC687F3F9E55126C05705FDB909CD8CAC88304A61B69ABCF65C
+ 91: 2DD1C321E3CFB58C2E883F5DC3D87F01936ABAB3F1F27648B6AE563333E3852BCCBBCBF4822230E8F0A0DFE32AB6D8DE92A2B8B2271E17DEBEEBF00D83046B75
+ 92: 38122D8324807E25DC8A74012CA9C0292222604303CE8B66D7329FEA394D85B7BFBE0F656895EBFD26BD60A3B553A6E3E4003276157B31B3A47779E1633D89D9
+ 93: 27FFBA5DD09485E141B659E218D2924AB0392163CDE296D4109F3AEFCDB02241CF0952F0A38E2680D5CFA35363391A324E12519B58C04E8ADF0E9C7A8B6E1712
+ 94: 69DA55F3BDBB1C7397CB382B7E8075F615794F6F8453313C0933D33656A3BAB07C42FF977850625B11CA302494497B0EF3A51F3D2EC2E4AECD24BBBC661C6513
+ 95: EE1270F6FE6223C19AD4814F0549B54C11AE7B43A8F3418B0F7BAC42BB5B093024DD4F3AB0C9AF5FD2025D50D5B8DC3505D8F754F98AC3237344A7C14FA50815
+ 96: AD8ED48E056378B1AFCDC0B3D5D3936AC825F96ABE0953E9BB85B00EC16084A4F0BF12A2B0B73F0A29ECB9841A1DC7F003456016203E891ABA1BEE13FFD19BF0
+ 97: F6EB6972CB5FB156FA20A93D8695AE1D9DA8BBDECCADBA81123E7ECBE917596B51E4A6CF9E1458D882B76B33AEA8F3286CC7CA1085F09EB3DB9B9263095339A5
+ 98: 40C54D468FE760A7094726B9EF12A98A1F0FE5E7112137ECFB3A88DB04B0758EC581603EFDE3610B1D76AA879EC31933CB6AAFA2DFC559C59BA31425B091FFB1
+ 99: DD0324C4DCFF798F024A32A13063A05AF673CB5F8F03E08A0D931406C868A86B5071BA711F6DA80D7FD2F7D3CEE1B7DC12EA456A1EBE4CBCB25ABFB27492390E
+100: AF216A7122D29D6A7DC7B89C8B41C111E7C9A00781D4A867A1D75110B48A5A9C92A15D1DC2AEABB53B83BCFFC50F44CFDCAE29DC9984C8C84FEBD0189322BE25
+101: 1FD96E1905B024D5FA883B3BF76C00A0235EE6386EABAE4D9602B5C5E5EA81FE3A1DD0D81BFB0F904ABD4DA7FC71EF7A2BBD0DC6A766902021CEB03D2578B204
+102: 31B75B047B1214B915EC56983E284D14C214D567F149EB467A1A324080AA0D80264ED771E2F91104B2642E9A8312C0C001652CF4E55308A870A77ACFA088D7C0
+103: 59B8D11078C8B65C5DF4F39D1C532BDB9C6E8F2EF121B97DC5BBC29CAF76774A7DDCDCE0F3BCCFFD4779E57D9B23102EF596B8B940480079355CDCF7EC52D47C
+104: 3F1702458BA7F28460E84A032BA160430126221AB5320AE028387B60AC53DEBC42FD169A23714AAC3009D52BF9F9485C0878C06A98BB42D1568E7D038234AD23
+105: C8DA7ABB93D370CE8BA6F2B58F91ABBF1302F96799544CCABF52D5D1EAC3318AD4EC853EDC99CF86DF9341D6D794B57B68CD1FBC5E37C03AA10297F9828D5D0B
+106: E1680FAF315911FB7588AA2F02D5F96A3FB02F60DC3C93117B97E4F00E2CE6862DB06117A6627B14B11B9E4C61BBEEF09134E1684599A370C61721A3B086942B
+107: BAEE728FD37CBE1DAB3FD5A922E58111BFBA9BB47E107909FBDEECCB1812DE27D2D87003FC6F9F67977ED592EBFC734470CD1E907858F555F21EAFD6E64F060D
+108: 891AFA38F3094E487BADAEBA012F11D3109EF19B858394EECA4C7F0C2E8FFBB3B88A7105C7D73E7252E67BBA518ABB6A312A7B8A11742D31BF53267CF3B09E5B
+109: 6E6E3BE3956224A97F813DE55B3594EC5E2F4A43BAB873D902025699AE58FB43DB71DE1DC159E83F7A7EFFC19CA5A03C1EFFD27B026EE9AAAD92D1D58104D3DC
+110: 51F2BA331C24541EFEC042CC66398D388348C4FEDC3F77A4DDFDA39752AE2880C68E0465C15B07ABFD93E16BA635AE7CA7D7E144018ADE57607DE8643992F50B
+111: A1A111449B198D9B1F538BAD7F3FC1022B3A5B1A5E90A0BC860DE8512746CBC31599E6C834DE3A3235327AF0B51FF57BF7ACF1974A73014D9C3953812EDC7C8D
+112: C5FBD731D19D2AE1180F001BE72C2C1AABA1D7B094B3748880E24593B8E117A750E11C1BD867CC2F96DACE8C8B74ABD2D5C4F236BE444E77D30D1916174070B9
+113: 61B2E77DB697DFE5571FFF3ED06BD60C41E1E7B7C08A80DE01CB16526D9A9A52D690DFBE792278A60F6E2B4C57A97C729773F26E258D2393890C985D645F6715
+114: C02CCA2EE8BED9B4AC74438D4E8B39619347922DDA5CAD2BC3EB9E4CFD4FAF7CC7EB9F6B21ECCA2C55CB60D11EC450390EBCFBA18312E49598D2BC52020DA9F4
+115: E528ABD6C315EADE09A981E4861F6148C9DD4F2FCE0EA54CD3E9796F17033A3751FE9A223AA23CDE0E051A10C2BC27C0298BE97CB87C7110667A115B6D30657C
+116: 1B0BF23602D272A06BEC3E86FC675E16DFB067B2AB662181315C45733D191137454BA22713B51478B096DC51D3FC7E9730504324655AE8B7BDFC184118933D36
+117: 12D5EBC3016C77ADCD01F1DE3F792C4230DE67C0B50102E03FBF3B6B80BF913CB66C3E72530C644719003DB2FCB15196803812D89761E0B781E8AFED7268A35D
+118: A3527C4E62349394274FB15B30BD95FAC27472E1E521514775D2E667A5480C5367DA6EE526AAC8D0D1226C33EDA1358091C93EC6B1B8464739D25AC4795EF175
+119: 43E497279C2CE805903A33B54B746EA92D607F7C4807986C849823B81097A9099B5896AC7CC66DF3A93EDC8A91B6F3971D6C7F5688DAF635737760BD080E27B3
+120: 9636708964C5FF6600510319E07BF3FCFCB1F4058FEC278EFB677964BA1E140C1632505452F802E99BCF09DA3D456DC3868D149A0788A730E49D239CE7415145
+121: D5D17F592D401CB111FA7C34CF5035BC08EF6B2E0D3E64DDAB08430DEEFC8B9C09C20EB4E8F98D8EBCAC6F09AA2C1DBB7C1B3B2EFE792377CA6600F703643700
+122: 0EA053BBE2E72264AE4F54512C621C733120F777D3CF8FCD8A7CC1ABCAECFB9BE93EE821A15D19467D249A27961E474ABFC433B8C7132321198789D5C2A50896
+123: C64291C217E37E754F6F57C1316FCD8A7C2AC2426E86786FFB69797C0645848CAC41DE345FF90B72FCDE918B7CFAEA4D661687E6F737A088E9296EEF4C3B4F31
+124: DEF8A3CD4921127815F4D1650FBF8B3EF16EF724A38045133749B7359FA68BDE3EEBC9CB5190FB6720EE3D24473286FC046DE0646C6C0042EA1968B48FB6BFBD
+125: 6F3581DF30AF789E44C7459356E1C248749B4A5A389759DFF37826BD278D293BA2264BB808A71C453E22A2962DD33A9C03338AD060B3783713EBA8CC8B43E2C2
+126: 2681BF910DDFA680B7204037294D00D0FCAEE84A3747F6E302A16704B3B08EFBDA0E57DBB8E61E92348C8D5FC5A59EAB74C77949A74C7740C30412A9FC65BF34
+127: EAB89674FEAA34E27AEBEEFF3C0A4D70070BB872D5E9F186CF1DBBDEE517B6E35724D629FF025A5B07185E911ADA7E3C8ACF830AA0E4F71777BD2D44F504F7F0
+128: 1DFFD5E3ADB71D45D2245939665521AE001A317A03720A45732BA1900CA3B8351FC5C9B4CA513EBA6F80BC7B1D1FDAD4ABD13491CB824D61B08D8C0E1561B3F7
+129: 1D9DA57FBBDAB09AFB3506AB2D223D06109D65C1C8AD197F50138F714BC4C3F2FE5787922639C680ACAD1C651F955990425954CE2CBA0C5CC83F2667D878EB0F
+130: 90272B89212C81B9700897F611F13AC1D291C33A437000C1423336B4D962DD39CE23413160F023963E12F4CCF90D2762B31BFC6818EF865E8A7CBF918A94C1DB
+131: 325638D30C9F63D7CDBAA689B7AF8D23826BFE8593B361C7042D3293926146C65C2D6092F20DB5068262359860B3E3D502B6034B9EC8E7253A1FBE4B2007B77C
+132: A3FEEC20C69CDAF1936795AEB9052DC525A26F5559045FE458D4B24697E260BDAA45BE8C940A06AE39FDC1F9365F32BAD7DE824FE7722A444E469C7BC198B7C1
+133: 3F80B7BFBFC9D45073FDC2ED93F7C19F01E4D49CB912BD2568F248561F9C9ED1B6762270033D9F421C977F8BB8B4A73F9A99D580C0245DD4F64AD35D68C9847E
+134: C292EF04844CD7C3E477C2C2FDDEF46FCEF97E5DEA7955FD4F418C7B4114BA0CA2CA230D0F73A585EAAAEA9277D72B83DB74AC5E887439A225C105B0BFB5A38D
+135: 9F0DDAB7986DA54E65EF6B536BB4F7BFF468E0F310803DE28D3908492343E4CAA855B8CAC7409E3A8928E63B9C5D1CAEA7A408ED061809DBAE1AB1A67BA1B926
+136: C58867D309CA48AF74B4D7E49ECED514C89FD433F9DD842F9B50FFAA6C7810BEF35348D00D26DCBE28122BA1CE33D4CD00D09BA76F982A598B8F65790368AE59
+137: C8B1D6B4778932BC21EDDBBE4E48F7711D7E97ED5354DCF11BE98E3110510FB007948C288FD2F7AA71B2E41C86330DBBCA2ED472D15B444828C6DF4282815879
+138: F1C0C057C974E4C27E497EEF52A02963D5957EA02C7E1CFE06423048799AAF74475732A7352220A914BF32EBA6A0B6FF28C77D25CC3CA1AFBDA89870F4EB55D7
+139: 092E121F2C7A2621AA36AA9B040EFE4435DD649E3F336BA82788D57B9B164184F5B5BA644DB4076B46FF9F3A6B9F58D775CE94FEB648A372D960471A663B74E1
+140: 406A5382E9A563E60FDE5CC47F52C6DB86CEE271BD3974AC6E274A1B8C5A7EB369A9B7CD312C301F891D4E3A601A80B9CA06303C53CABD5D3B7834DBC5108470
+141: B2D3EFC2390CF7A1093B93C52B76D0DD74BC277F3D67A85F41635F89E923AEBC960B2BDF8A13860CF3083AC3FBA13D4FE5E426F144FC988554E89ED7A0324748
+142: F1F7100636AEEEC8AE93A2CAF1F4852F192E1EC1AF13697765CACE58FB40B9D9AFC3BBE7E52EDCE649F53C1BAF653CA20E75D3E4AD549D05EB33A68DD11E1898
+143: DB604416DFD0A7DC509DBD2C83D5FEDE5E31D641EE6C14390CF599CDC7D841660AC700D3DE4BE35E07006B724B7DD1BAA21EFC3CA6D346B3B858384FF691F913
+144: 87AE00E496649511C3BF947A65805ADB5D237AE8486CBFF01EBE52D5D5062A99DB3434EC22A37DFDB4CBA1A59AF1FA5825EE3DB2A8524BDEAE07F3264989B85A
+145: F442BB697D498F2026FA2A5FFFF9AC5ACA0052F6D200E10805104D91BDFC71A3764CE0277009229B9E7C945222BD7C9085163987E4CED02ACC7420A96B0F9587
+146: 1061588877909CAABFA37D4915EEBD6E517B8D3EFD5660F872019050B3C1465F11FC9B44E72610219F3F5F21772933F101D9D58B5C5F79FD7457F95749BF11D5
+147: FBB4C9BD6821A04CF154DCC7A7507A2C655739F3636B69E8183418E2C33D951DE6BFDF2C3CA603694C44DE44057665EA4835281A2773CB8A84965BE02DF1F3E2
+148: 08D54B05F901FE95EA5B56BA19DF9120C66AD004F98BF8FCBDA9DA0874E64978EFC34877B8224A024DE12D7B926B5D83068E8A704EEF0F738A5061E5F8462F54
+149: B79F53A5117503B5A0316F801B8D448079F38CB90CC39BAFD4DFE169E3C931D622AF7E26835C9AD4DB25C0D6A684E7DAC4B88B475663E05601A99EE9FC8922EC
+150: 2209CF6BA43F61D7E579651EBBA0890686A9CDC1E045255494DB0BC732C9512ACBF72158D5738FF63B500AADCCBA000D25A521D41AB4EE6D92D38E8077B79C07
+151: 8236F7CFFA68B49BE5C38A7A1BB67B745430D1511A08EF347383C32AAE1EF4AB2E7F63A20C9D8E5CF2198B32B7BC79B470D36BDF12E7263D669FA4AB8605B75F
+152: 228BEFE5788090066D493CF87F75C666BC3C75E0B7BC63E80D38340CF9176251C6E185992B244D4A5B1CECFA42128DAE6EC3ED535AFF039769E364048C442DCF
+153: 59171D498BF80731E2E35D0A32DA356419E69B8BAA5B1195D690CD8A5B11542087A007D8DE3FD000BFB03A0408C08E92A0C7712924373FD67A65218E4A4E0F68
+154: 4F94A8F6A136E49069C88DFDEA9361B34D68FFC25724F836CCB021BDB74E0AEE9DDFE80B938A5C12B01F0F1CC49C500FE7709C2090F809D9E0256FC93D93122F
+155: DE5E17A668F75866262BBB2089C9DD86775100C77974161DF46BE02A9578855E7C81C77263105C473FD1A2D55483063970C0F643CB25AA4B4AB45A40888F61FB
+156: 3314001C825DFD2CD1CE08C746F0BE5C451027F0FAA401431AC84FAEA51553EFD9E0646FB7E9B94CBC672DC98FE9870467C176AA648EC72BF61334B13E479E4E
+157: 3EE80B1422E3572B46F7CE5841998BD2B6DF3B591FB5E46851B4D54BF572A17DB5963A04EC6AB98BA07C943475AC088B4D201AFD684F30F45C8037400A7C9510
+158: 3743FE18BD6AEF36887EAB7BEBCE36D5D3B69DFC306B58B1E8C6241E81A9D38425BA991A29C3B07D4F4B9C5CC762B2563C9E5A05B199CEA5833D9FA0062D161A
+159: 7F9F71B086CC6D6B63052767CCD6D0349C076289F63483241CE105076B7549B3187897D45D7B5FB2147E54F056530347A1F9265E6F37953B5941272A29E2FAC6
+160: E09CBBFD3DDBB24755CBE8E51C8BFF1BFF36E571EE72E6C99DDA6D507AFE3C562D437E8612B50859AD5CD608424DBE625E0162E6CB7B838F20E7B2F93F40ED91
+161: 2E2F91BD5FEB5C79E98ED97C513E17D2D97B02A844780A0190264773C3040A2CF07FCB0E6424B7A0E88C221BA3824C1906FC1647AB40DC13E2D0CC507CBB6BCE
+162: 8D4E87F66B3418105CD5583A92A2D2EBE8824E1F9150CB872FD3DA9C93D382C08065C818E1AF9B25875B142E70676D9A525D901EA2142E42D813A221D21EAEF5
+163: 0518E420BB5680B74367F8CFCF7DD32F3AAE009A0067FEC22456CEAD0832BDC2A60D8AA7B0A2FDCB9072C0F1171772BB665C0B28CD184609F63AD53F89597F9C
+164: 247197FBCBEE77B8EAF6358F71A49D784CB43FB44D99910B0599E69B29E31C4019E830F322D5A7117A996BDB4D91E5CF323DB354E902E4DAEE8057B3F78ED5B7
+165: 35A7D806AF0C8167D1505B25EDB565E931864C453BF60AD7B6695035D7584E7714E21F377B35A5F3A69878835617B951977C209F5F3C5967B7DD9BEAA75A7CAB
+166: CA9B60EA8DA2D0BBF46742E31AE882F5355688B071883F690AE775C4D949DED8077170F26E89A18CFC251662EA8D1FF43F5A5F28E3FB41ADD741AD2E28341A79
+167: A861DC64C745B0F5D3EFB2773C51981A836024BC420B1FCC564E03006163B491126AD8633FADB6DFCB25C2EF92FD82823FE2C7F1161A78C7766B5E21F96BACB8
+168: 1EE6CA0866F227B27678326FEDA4CBF59934AB0EA2E874E9EA233AA5C67141A05C1B4C950044BB6C9B9D146520C2E3779AE44187BE0DC1CC41FA7F72500B249E
+169: DA1032057A25DA7EF987A2D7CF28B927D3DBD956979679F5A6BF4EA20FE1080BD8AF2DC8B1C7E236E7601BD82CFD64DFCA7D03A03087475ADD57EADFFEC2CA85
+170: 22E41325474C7C7EE980314D7738947E9CE3A970B2D28BCD69D545D5E795ED50A5A1839021645D000CD4779E181A65974171C15B9B08B349205B87C150688839
+171: 5FC5AD1B8B7622C4D17CCE23679FC7E0CCEBA00C1FD7178245206F866A6BB198F26A05A3D429E2C508DAAC6D0F698FAE6C0DE7FF971EACEEE84813110672F3AB
+172: 2264F674AFC9743A46180CE4E4AA6A2BB33D6BF2F62AA14648179400806D718DEE8FE57DA48D88DF5D57B42087BB2FA62F833BFF87B6678606C6336CBCF34B3F
+173: 65E9D1187801C74FC23C4F19698F6B93405C681B93A80D23D427D9F2CBFE63F7E2959B2AAD6CD7EF6E987A5FFD585E1BE8E314A1D502FAE80215C5331F8FFC2B
+174: E0436B17C2BB096B08698F4CB448287D69322C34814776E0B1B21486A2D5B6906889A5B198FDDF699AB285BDF58783DE7913075F86ADA977DD35FD09AF336E21
+175: 857BE6485722B4BE445B72C7A15A1D0BEE6C7FB2AD541C2B4F0035DFA1EEAA10D4F0BA5A124F985DEFA53D0A0554BB258B2832BC2CB5B7787D812E96A55A93DC
+176: 7B2298654B95CD00307D8D983A0079CCCFD89E5788180CAF352B6C965B9BB5153C9DE25C4A0CBB5E578859660696C887280EA378A2E02B7C7F9E6CC635509EBD
+177: C7ADECC928EF065C263A97A273CE8CB30485BFC035F2FC02C78AE2AC6B7F7ED20E93897C0994CAB8D584EEF9DD475AA1613159A0C862FF179C67120F6B4C72C7
+178: 041A03CCE6696653ED5F367749AE1AF3C2654E8A9C0E70E467261E60023876C7271CAE545D114C32D38DA75389525CF0CF1FC0FA9A481ECF43FA0B1F61B868F7
+179: E652E4A88EC1A9C4678F8CFDBFB1D758774600255165E2B4DC15F61C18B9ADE14C5ACE7E8AE72D3062B7F1787583C55B14B347F642344E71D6E00FD6F4C56808
+180: 903675FD8C70BEBE9FD0DADAB17A638A2DD8089AE63114E36D28F4C75D951D75B0BCAB5247803551862720713AB45A932DBE141E48E9BF3ED9E76201577DDD43
+181: 6E61016D474D2AC2984E4EAD44ED82B7129B0B7FF0B9AAF5F45CA68B0529A736B846626CEBCAB9E7CE374D744E7A09C51BBBC746D989806F1A00703A002542FA
+182: 20085D4717A204E896F10C5F7E1FD429C9AF848FFF608A2C46D3738EE4FFB944381880A7A455FEC6A1A21754D9ECCF3F1390EA22EC17FCFECE2B86E361784045
+183: 37216CA069259BA3244DE3933A3AD5F35712F0AB7B9C81D64000F0B91DD4232B53748B704E7ED0DD682A77D84BAC1B943D2FF7A3DBF5FE33DF455DDB10D11632
+184: 1F2467A57006D96FDC75A8BDAF98907AE72AD330C0418B06513C33D86DDB800AB6A51738DBFDF1C44676038C094EB5F309B5B590EAAADA4DB09FE7590FF04888
+185: C45893F92AC3E3AA3BC86A9ED659797A7C7DB949A66552ABD046DA2AA7DA9E52FF8BA2673CB44B2CB0481D599EC70020B6D5079296F2C19DB162DC8CCD64BAFD
+186: 9919574ADE9B8640BB0EF45F98D1DB6FB7242C433D86CF6D4BD67AD14FF15D74A13F796429E312BAC581552E6597BAD2792F31B2488ED300C6118891ADEE9FB1
+187: 034A92D00A172A5F0CE717FC38AB8D68019F500493899401B563845EB604ABE0907749AA830F91B53AA7C89DFFF86664F8B123AFF4721D790A58CC22F36A560C
+188: 54714E69859C60B07C7FE34859C855A37A82204D723F1A695F78D7765CE906D109FA6144EBA9E7E7A7D8343A99495E72D160DD468BEFB794D97659B8E2D8F1CE
+189: D6CA476F7E68095DFCEF4338BD6466FCA90DF78A17DE9E29111D4645B0DAA0C6E98F156C0EBF9134BC28EF9E0EA67E6D839027DD5CB084E9EBA899DD3413E222
+190: 86EB8C026D6BF090636F01F623CD98B960D08E521E44697F364BC1AE1655B9AD6FC3EA38C929AC9A244D18E697342594F3E7DFE605954579AE4042CA69E65AC3
+191: 1F63EE615E9B809E3661C77B5029C78A92DC4BE3CC4DFD8BBE78DC7B7D990BC717238004969A8B854CBA04B4D9B30AA1A1964264C47F23D9BCDF45C74FFFD918
+192: 0351F475C711D068BE7B0395D65343B5E249FEAA3C3F3B6B87100C50306EF0340F60EF36233F0E6287057EF7BE8634BFC4D46B49E4A8F2CC4839F42F486A16FB
+193: 16645F9C0ABBDA602B7436DE3B1C55AAFD1E844057D51EF80A96CBC2FAFF6E3B2706B45069C90A52D779E101793EAF4C9AE85CAD0A5A394164F0BF34C189A2A0
+194: 821E46199F4FEBD9C118D49B1CE9FFE953113EB6E4E33DA9E39C676399A0B3F792C2990A9F75D729E58EF750857C07336526631CBAA5EE0643699C8E7B7EEA13
+195: 64CB83ABF2BB0A94451F2B9C3EDD76E4A15F9D1F9EE32C0607F5E0951084377E484A8259B3C64428293396F78E6674CC3C027CED1BE12F5671D328D131740770
+196: CCC1A68114DF54BF467EC49CB15CE381EBA7E6FF06A93EFC88F442F8A35827D5DC6494A4F39E8423167CC1C3269A3EE6AE68825FE3E2E40EAFB75C8D878FF88B
+197: 94D38693F1B1A8F1013544419C5B3BA0CD79B72478A91CF3AD325E4C3CDCE092AB667572233A4F8DFF132401968BC74C553AEEE96D530CA4E5F6D427F9D2C422
+198: EB080E256FA9A5D51C3DF577509B877563958704C0F1DB645F75CE24005D3B12503BDC26FD3A66E8F6882D3491428A4932EED6F5F58532FEAF521BA5FE05B70C
+199: 9A43D7D0C42D7B5409963339C9D9805BA59ED8A63DB144165A3C759EB9F5D756E6288308DD2FE460CC50DE26E1A1C1747AA165FE6C8A1FD5B0F7CB1373E28CAC
+200: 986058E9895E2C2AB8F9E8CBDF801DB12A44842A56A91D5A4E87B1FC98B293722C4664142E42C3C551FF898646268CD92B84ED230B8C94BED7798D4F27CD7465
+201: 9FCCC4EEF7571A2BEEE06981856228CEDAF3BD412E777F4AE8524B81C373FDBC210795C1E788EE7081BA42EC3FAFACCF2F386A9096AC719E6565B4E384E390E2
+202: E4E8BF0BF40249236FB88C442E6668E3067ED6001189053A3A81EB755798911258E25CACF7282811DD5E5147811844C4B5BF52FC24A6862BCAF9407F2E38EF5D
+203: 317ECED703044C1BCE944DDA7114DD1E36244DF6A533790FAADBD0B8DDF1AC0D198B593F0479A038198F4B94AA6ED294168FE0EE800C02E769EE78ED45249945
+204: F5FA1EDDE359173067E463107FCDF00EF227CBBA0EC5EA02EBBABE2C79B12E793B98FD3A90A72BC26240D994F53DED65FE22C6FE87EAFD01B8478D1E8569A882
+205: 6323E2A8E380CE86433D5B8FCC5E02FABA4ED7F9CE5BD194F7CBFA36F65844B61A7BDF8F131CB4B28C56ACFDB99CD84830557C571FD369650B4608376BBE4FDC
+206: DC6BDB69D1C6111E280F993635BB59CD6E7B189166DE593B71E194C5F218D67B00EBE0D028E944976D6538DE410C4D86A2B6F272BB94FFA590208C644F99240F
+207: 2428590D2043634FB10268435EA90ABD082D45317D2C54D065529F15E180438AB18FE4CCC9129584804EB04EA1CFF646FA881878520BC01AFF392B6D7D9C0369
+208: 1A29341BEF679E5351911809DA190BAB8E665A9375BC2D477742176A70A6BE8ACE4A35645BF8DB97AB9BBAF1F0313004AF8B4CF10ADB26AC0198AB1D45D05C46
+209: 0EF4FCF3B2010921C58056B2BA367B4C09F5325E6AE9AD732AB277281D4BA797A847B1C6A74D81523DEA163AB0E556FB5102C14E8CD94AFBAC0AB0A921BF1A25
+210: 73C65AF2A53E8860BEE63AF0BD8A457B0AC8D3C5D243FBB1BC3D67624727CC175F3CA133B26342C3401D75DCDDDAD9A692D9A2B1264E90CFFD4BB9E6E775DE15
+211: 18D3DE049396E2EA541E15C31C0EF0E0BD90CCC6CA35663856B94F6F18160D616667C55F3ADC1B33E749F60BE50514A4F3BE48ABE2E18FCA10F85ED0266972D5
+212: 34DED45ED26FE224E0C5A66A193C11A2CC0786E61D421034B3BB16175019C95453F20BDE865DEEAC5C2BB5C86544641482B51C4E61D9DDACC238D050CFC35776
+213: 025D211B55974BAF086B139D8FA1AEA75B627CE1AB894D52F8769874557BE5944D27FD4BA3606266BC7F50D1734436C53D4555A1D2DE0DD2AC51D7F2FA373867
+214: 08CD521B1F13440D57001F30BDA0029FD8AA17FF26AFECEFA2CB7EE1812FC79A694ACD0BDA98184154B72FB7CE305FF4897F466CBB3972B4863FC88B3DA52C28
+215: BA3BF464071BDF124034CD122451D3374AACFBBC916C858B93E191006235F4D741564BA1DE70372269C122D360121DD3D427853BA76C6B450BB46F4156EA7524
+216: CB0B3250639B4ED947BE0C83EEF67D370DE76AB901F607F68FBF1BF8ADA15984DDA7BECAA4D7FDD55FBFE479EEE3F5ECC9CDA7BAEDC9DB7D35DC227411DCF20E
+217: 8AFA4024BD96BD50323AFDCF92A7F3E7BFB4C927108CF81C01FD378F61C55D850020DBEB88C6528B8FC141C37EA4852481C14902878AFDE51A7F1EA1612D0324
+218: 27057269EEB73333A1A8059D6C9D6FD5AC89EC26500F6F9838CACEC20E93F1713CF5569E820BD80969547D77E56AB0CBF57F03182EF45AC8BDDE114470C6DDEA
+219: C79C3D4A4608C7CB4A3D0C14B28CBB96364F44DD8651F36D908AE502E547AD7AD5DFC10DA26CA26C6D9E51CD40F6D7F1BEA0A03358967D867A97333DA8ADF3AF
+220: 9DC3B1EF11D85FF8A57330FDF91D5B5AB142FB89A72D880DAE476E020755C2F3B4CA58C9ED36239E8807C059BD66F826EC517B7A44187E7216E48B683B567076
+221: D11A97FB7B967E90C2D39EF42EBE49327CD58EA6977C84275B01698E322DD97024A40FC3EEDD96207310708F737E81B79659A6C7202E96BE7AA34D18D4026F63
+222: C9BD62C0FCE47736ADCD9275B46845E4ECA23B73678693FEB8E21909EB8405D4B057AF2AFFD7E667E047A07E6ACCADC2A58D7360C17689769DB009F0A7795560
+223: 7FAFE6ABE7CB8C109B18A14BC4FC2E4FFEADD55A43AE7DFC58D89B9CCEBB4467FE4CC163FF6EB16C8C71B8EFF12E7891D11D3DA2C6DFA8152DEC52B232267B6B
+224: AEC37B2A1157708142BDACFE77E5204174F539D86A12730BBEF6386FCA098AFF2A5C31EA1AB21D3B4537531DDEB27CA9DAEA22F5CC8C9956B2F2595F53BB931C
+225: 6B005CC923D9AFF56334CFC7A5E3ECD70E97C4247EB372A3180E7DC5BEBE676E72E2FDFACB74277B70E15D871819626F46661285DB04B3F825C49EEF42391B5E
+226: 509B5C993CDF61F8F507A84BBD7D6D7AB090970927400043D39E5F47DC23AC289F5BBF9D3246EDB174D9C5D72BA7A066DC13171EC15FF9508911464F8730D395
+227: 00A05302C3A60E58C4C52847F47379212A918060931A72BC660D88E7BF5599DF6C38DE92452B4823B4725BA3EEE866235CCF4D5903E91714CAA230C6D6EEBE45
+228: C4FA5EFAA31CA205A732FCD5DEBED53C09A4F30C5BD9ADF27F8C1DCD4B2730925BB6AF176E2E680B2BE325F7DDEFBC9EE6C1CBC4F0426ADCB5CBF18D1437EE6C
+229: D125006B8107FA63C375A79AAA0EBE82017372B7CC65C3157CE078DDBDAEE8C569BB84FD8490F2D66D15FE73C6881245761AB2B1D4F056637ECA70641745CDA4
+230: 01C7D098DCE4E40A69DE14682587FF2A40BAF9833BDCC6413AB54DB0E64262F290D584CD5B21C6558682C50E1E27BF53A18A16D72ABDE878C3522156C9F04DE3
+231: E863DA51CAE09500F589BE05CAAD5788587E2017907444D76F547D6F30632AC658EEB8585733BBB815D2E19EA046369ED3B81AA773FBFFAC316162389E015A71
+232: FD8232F7B79BDF9CC52FF0D5DE1C565E9D659BF19769096895D182A88028C1CDB7387DD240128A7ECFD2708EBA7E9E3C676D6E2A036E1B993940F5CCDF1A736A
+233: 3BF8572CDC7B825CE7F3222A3DB87F1C52FBD1A8229B957ACFEF2047C560567483C479603A3C0B0F1B2DD265BEC257D1A32C651508D7A4DF501BC015657DCAC0
+234: 23FC530B031136A17B8B2FCB55046DE7271312EE3E77851FBDB05F78A294815CB2169079168E07647A2BD5D05C1BC2B1EF1B64B929DAA1F9CE723D448C936FEC
+235: 83D10057C7FB494FAAD289B4FE5F093DB2A0C7D79A298173DA735CD5063232BF9E5327A7B4AA795C99F323045790B554476F37EB9D04FE3DF40C047E4113A720
+236: 0AA201EDF4124F421D4515554A1A642E3B9D18C70E09E83A886D6F0CAB0750D9BA1FFEB9C587F3ACAB0D8B9C1D83D789102F0E2A6CFF885C50F485929DF4602D
+237: B85CC52981751513B917F58305AFFDDC7D901CB3BB1D1BF5DAB058DEC9B8CDCD2DAE543D73EC6AE0889C9D785F9178D207059D994E1C80706EB28AE65AAA100C
+238: 068FED72E55444AE108EEFBDD59A96DA4AEA3D81A6642742C38BBD4EAAEDA6EE21FB8702C2F95152F1F997A5F40F06C54619481F2EC343AD33400913D6FDB4FB
+239: CB4C7FD522756D5781AD3A4F590A1D862906B960E7720136CB3FB36B563CAA1EA5689134291FA79C80CCC2B4092B41DF32EBDCB36DBE79DB483440228C1622A8
+240: 6C48466C9F6C07E4AB762C696B7EEB35CFE236FCA73683E5FAB873AC3489B4D2EB3D7AFCCE7E8165DBBF37ADED3B5B0C889C0B7E0F1790A8330D8677429D91A5
+241: 4F663484EFCA758D670147758A5D4D9E5933FE22C0A1DC01F954738FF8310A6515B3EC42094449075ED678C55EE001A4FB91B1081DFAE6AB83860B7B4CC7B4AB
+242: 81A70404857420638D72672A2DF5A49D52B9F9F38B385D8C5129D6A2B82A682CFEAFE6509266E4B00F6B6A07341C2F64E4D4F2152583ED143E3DCFB14C1C216F
+243: 31F655A1334E1A45584F12A22E03B09E3C69ED0E1D0FD573AD0D56F9C86862299E333ABE78590E97EEAA5C2FB14DC9F34FEF6DDAF6E7A9BFBF68CA6631195CE5
+244: B62C5102F97E5C4D7554790A4CF53A58D3EF44C83142D6E009BD1F6FC8F3A19AA1B89DA8DD9BD1310827A5BF662BE7CAC750C48E6ED91313E940D7D9E5EB9C22
+245: 380023C0BAC4C9524FF6778BE80CDF195E36FCF460E8CF1BF04E5C2FE08E38C35F183FBCDC3726FF26423F351C507279F6258F2319EA1403B6C8A3DCB384AC7F
+246: 473FC167C7C4BC40B17DA039EE09FF3DE884879557E40C52C1981AC419CE021A090BBAE014822D05714077008988D74FF151C927AA43E88CD63FF2CCD2012AF4
+247: 006086E61959B1D66C72E754427EAD5E1D6C02D8409F5C32B2F5AE448F54682B504A1ABC0346CCF39BF66A8C7B69081E886B47A7D0B02291462391C95351EE40
+248: 3828B2ED548CFD0B74BB34A1FEAE030E267222198D7E387E7FE3ED503905A25D4C3301A9A47E78372F685B05847062476C507708CDD75580ADB579E4CDC79AA0
+249: C26A7D5BB103EDFEAE2F1201BE58AAC127F69AE378DB04156074E991745D4AA5AAB3BA064407DFDA8D34E573B7EC1F9F37CEF01ADC17FAF393C262A09F2C4736
+250: DCF82307195035A668097514FF1A10E0BF0E802B4945A702D2E17AF6DE1D3D9BA49616DFD16D802054B5219CA37884385E87A713B4EF5C7FCB69661C7F56D5E3
+251: 46049EA0DFA5C49429E15626AF4AF2CE0A9DD2F308B99BA6E6E3F3088250A146870FD0B53228D5A1F1BF9859480E1B7A3D3DA180AEF4D5D41BD2951C4E19426C
+252: C0A1FB6C0A65A0D1AF46A5FE86C8A88E8A86F83E36317F435542927C98E74833C887CA3AB5E792CE5E3E21CC6C6AF437349F5A66FAFC4DA79742491C643901F9
+253: DCDD20CD47B7C7D011E9DF7855B08336BD5007C4435208BD3B914D7E503B8399164A155697E68A1B88A0600BDCF847A114D98FB773C81FEC817B92057A6998A9
+254: E2DA07644DAA73B66C1B6FBCDAE7FF28E3B9024F0BC5408FE02C18E3744CF9BD6DD54EA7BFA1F6F3A81C8560FB938FDFF9A38A29853A3A819B58D10213A290EC
+255: 15025C9D135861FF5A549DF0BFD6C398FD126613496D4E97627651E68B7B1F80407F187D7978464F0F78BFEEA787600FAAEBBE991EDDB60671CD0CE874F0A744
+256: 1E7B80BC8EDC552C8FEEB2780E111477E5BC70465FAC1A77B29B35980C3F0CE4A036A6C9462036824BD56801E62AF7E9FEBA5C22ED8A5AF877BF7DE117DCAC6D
+
+Hash: rmd128
+  0: CDF26213A150DC3ECB610F18F6B38B46
+  1: F069A435C14A8D4B02A7BBAEE02D0BC3
+  2: 48456EA1CD4C51DD8E1130F625DA4F8D
+  3: 6E41F2AE95605779C74CB5ACDFB361CC
+  4: 0C7A6C73E99A5C65B12D3EF47ECA9D2B
+  5: 3B80361C079D1B67933455D00AB1428E
+  6: 0F74C4BFBFC740A027B1D5BB9CAAAFA8
+  7: AA54ED5DA34CE9205B64D138538C0C1F
+  8: 08445C3C3E71434DE375CC2071430EBE
+  9: 1FE0AE641DEC6F8C172F0E27E9E73B9E
+ 10: 4E8152B7EA8F7A31D8649A51389260F9
+ 11: 0F851C98C2B997C2459B34CCB209E481
+ 12: 52D27461FD7E095EE3C6ED43BC24EF23
+ 13: E9F3489135F3D90EBBADF9F916C34920
+ 14: 36D527B693D6531A5E4E15BDE9E4A670
+ 15: 57433A07CC200953B7FD440253D5E476
+ 16: 4A91FFF90756026A90A83927066EC911
+ 17: 5A247C26BB1BABDF1009B6B4951FD76E
+ 18: 002DA29AC9F51F065A1E371660BB67BE
+ 19: CFFED09ACF01DEC9D3891033C0973953
+ 20: B78F28AD3460C99D428AF24E2787EFE7
+ 21: 5E203157AB6BAC57660F3D25FF615C95
+ 22: F128F5DEC3A24AF34AD3E7F3883C8051
+ 23: 2E05AF10A6CE9AD1E0C0FBCBF69B1C9E
+ 24: 67FAFD9A5CEA5D41863D03AF2932C5CF
+ 25: 5ED7E86651AC4BD0EEA718C773812977
+ 26: 6BC74F78256A98761981882C3CF7AAEB
+ 27: 44CC573B964002D877E79B75E4433E41
+ 28: FC02FF53665B52B58DE38784E2C28E92
+ 29: BC4D69312DFD24EEA219F29FF2AB2072
+ 30: 0355E82F130341EFDD997EBDF4469221
+ 31: 453D500D997FC85F6AE16365D83ACC05
+ 32: 42DF4C5A3844F00F77ED84E125237113
+ 33: E782D7162BB54E735F7B9FDD75A3F14E
+ 34: 78993013EEEA7B14999DDD3979191D74
+ 35: 27BFCEF540F0782E9A28328E8DBEE59B
+ 36: DCF00356DCD264B7E359F02D7D2CDBB3
+ 37: 9EE0BD7F55EBD844A8D114F83B3E8FC3
+ 38: 01EF8F3154BA9B9B817AE717FEA00A68
+ 39: 4DCBC2AA56D785CE7249761791442BBB
+ 40: 10282C07B870BCCE0C8DF9E68B4C5DAD
+ 41: 0757B359AB2D1D121BA01BB345A12A87
+ 42: 450AEDEE570A2E9B1A19D5B4747B2AC9
+ 43: 2C45713898BD259B10E2352BECFD6DE8
+ 44: 3E92731175E510FCD07D28AD47DDA0CE
+ 45: 6A8E5690AD4AA2180966AC1503A81A18
+ 46: 820BE195E2AE85C115BFE3C341567030
+ 47: 9C97E1F0E7DA29A0527AC4F59D520100
+ 48: E1257842EA15216543BFE84521B9FDC3
+ 49: 42BA484CB70A58EB3EB5DA43F1D5D5D1
+ 50: 2C674397A81CA35EDF1FE77B442BADD3
+ 51: A3E07C012A7C67D2B6557F4A8B4DD031
+ 52: F01789A2E0379CE16D87EEDE671171CB
+ 53: FFF1657EC846507BDECD2DD829DECDA2
+ 54: 1673DCE23D430948AB818D47E83BB5CD
+ 55: 37CEC696967031AB2122155998A07F51
+ 56: 320B7D4DE17A731B9BA5CBB48956D605
+ 57: 1EB07088E5F563DBC5DD988ACB84B048
+ 58: E4DFE704E4C25D06224D2560B4650467
+ 59: 6C072AD491BEC80667A6D71D9C8F2FF8
+ 60: 53DA8AE3F36FA8F85072A89962F39B76
+ 61: 40210D1C7A728A27E1B5F92057DA4765
+ 62: A4C4E5F271F3BDD74C560787718E8816
+ 63: 4466033447F1E1C9BB107D152BF06051
+ 64: 406C6EC2643CCEF38F964864D12C9191
+ 65: 19F725CB43B171DFE18EDCB90A9DD900
+ 66: EFAC3C9FBF1AB0C0F3601C18FE3F0212
+ 67: 9B9BCD32F735EE353D33A657C2292475
+ 68: 68F4A4294C640BBE4B1E90FF107E05AC
+ 69: 3630FD1C9542A56C851140A7D76C0D00
+ 70: 21AFDFAACDD8FAB91027A61F8DAB6C91
+ 71: 2C7AAC93B6CD1F8E23AAFD49F04C69DF
+ 72: AE4C5124059CFFB3B823E68FAC8CFB33
+ 73: 79E95CB7E752863AA87A7693D0677D89
+ 74: 1B491E33A96D9838398A4F624E773DAF
+ 75: 1F3986FC593D8A8E927C82DFE1F538F8
+ 76: CE64F09024A907E76726E29E1364E606
+ 77: AC98817981B59789E7C7E9CB9F70FDC3
+ 78: 3827B4B077493B289C25EC3E91B36D26
+ 79: 75295EED68F750E506C60A780B7F0285
+ 80: 4FA47F32992EE6C96C3B96B6A69A6656
+ 81: C52E142B7838D731FC036517003FA73E
+ 82: 3451812871ECD1C09E4A95CDC80369B2
+ 83: CB5261A793A55DB33016ED27A35A20F5
+ 84: 2D06368ED98E266E81A3C6491BC24890
+ 85: 677F6509BDB3D44BCFB088A81BFD96D8
+ 86: 6990256193FB0697862AB5A45FFF082E
+ 87: C88D698EAF83E446C025EA915998EA01
+ 88: DB8F672EE8129BF4BCE25704DD57BFA6
+ 89: 807F491456D7E28A36AD6E934B053EA8
+ 90: BBFD55A483CBD0F9DFE18FEC5070A166
+ 91: DF7735106411CC29535664D85ED81603
+ 92: 24FE3535DFCC295C2F34F3F88CACDC88
+ 93: B80CDE220C4199DE303BC97FEE125048
+ 94: 8C252310E9A71C7BC40C3D2011E24EA6
+ 95: BBDB705F5660C50C5B0C87CD812B76FD
+ 96: BD517928591240C7E63C8D9F957F6A4A
+ 97: 78A534AA0F4250EE83D752F3E6940148
+ 98: 3346EDA882F00D6073D133CE609D3B83
+ 99: 51EB1D3235CD35A2386E314F815588C1
+100: B4860192E79C1233A08FE595C084315F
+101: 79EDBE3E80887B4F741199295347117E
+102: A2793EA5F25492D32D315B3923E945D3
+103: E398223EBEFC56D3437AA5FBC5345CA5
+104: D3E6593D69B24069AF0374671E466930
+105: 12D63F5AC48F99BD59EC863B61952C1C
+106: CC99A81A22B62A0FCAB4AE889112A8DC
+107: CCC82CA5D35A421FFF313F90B9D1A675
+108: 5B4A2912071CC36CEA626F9AAD34F257
+109: D21FC82D78AC98C5DA436388AC9AC6BE
+110: C2F22C7C16DD2E1BBFDD2BE7915B869D
+111: 2B5AE5D14DC053558A1702959367760B
+112: 7A6A3A6553B2C3387BEBE119E80CFB2B
+113: 7E2206BCF666B89341CD7615D0291E3E
+114: 93D87A658259C7E9FDD0BCDF93A24356
+115: BDBC0B062FA3D743C1B070F2AB43D180
+116: EE0A575AFFC966F58B91BB66CC1E6B6A
+117: CC24CF8DF0798ED2CCED077B06AF1BAF
+118: CBAE264BB4AE635A15D8FDCF7F9A6852
+119: B879B9BBF61B6F291A8E4645B70EE06D
+120: A6F88AD4A16F789A58F178799279B40E
+121: 3DCB6B1674608B11F496F45C9828F90C
+122: FF34A1C7748C5B5F2F014ADF57241C43
+123: 1A77E2B20ADE5F286705251495AF04BC
+124: FD47EE73738626733CC63327D4F5EB7E
+125: B9438B50CC80CCE0303244713853A0DA
+126: 040BC7876B31E22590F5898068B19859
+127: 16ED82C338495D067BBE1D4AE73345FB
+128: FBE1AC0EECF0AA2671A6F25733E9711B
+
+Hash: rmd160
+  0: 9C1185A5C5E9FC54612808977EE8F548B2258D31
+  1: C81B94933420221A7AC004A90242D8B1D3E5070D
+  2: C0C355CA556CFE356ABC0A5595BAB1364BD86444
+  3: 6D8D360567AC2CC8C4EC11DEEDE0ADCACDDA388A
+  4: 04DE53FED2BBFA80FA79698B4C5627536FB620A7
+  5: 9538F24F7432E952F030BBA82C9F744365035197
+  6: 817ABE77EBB7EA159AF7BA7DE1EBBF034FE6CAFE
+  7: 340835AD791316DE50DDB59838F3EB13F5521228
+  8: 64B7269FA971B162612265C73B9911F53EF43B63
+  9: AFDD1E7F8E39C63DEE7104014AD9EB32B855E0F0
+ 10: CD2E472470BE8FD70A306DAEC5C59F485EA43929
+ 11: 550844206034AA74E37D813FF29973D3000C1DBF
+ 12: DC24FD5F309A7BEB9A7CFA7A354F2DB2CBC15AFF
+ 13: A814B4CBFAD24B7B92AF0E16794A793DC16D10A2
+ 14: 6C316617808A930BD29972B1142C0AEC89EF00AC
+ 15: 3286BABC7C4635FEC52F67CEFF1471E122D50258
+ 16: 696C7528A3545E25BEC296E0D39B5F898BEC97F7
+ 17: C87DA6F87A65CBCBC4B02BFD6D01E26F8047B5C4
+ 18: F1AC2E0951EA5875B71723BA1A2158DB49EE073D
+ 19: 091A39765126ED406254E7F810F02E0A6124C6A3
+ 20: 4002C0305550C5A726705DCF8D3880C54FED0453
+ 21: 2B59904E1585334B1298AAE6EAB06526CAE5A232
+ 22: 0EF94DF816593728611664F4ED6A0C4DA28C5AA9
+ 23: FE7AB8A5B0CA3C86B6524E3333490D0430E9A4A0
+ 24: E748023DDA7E4B77DE8A4424744331EBC62A6590
+ 25: 96147FE511BC64D9493C795ADE8FC71A78FA8C23
+ 26: D81D7D3B46D5BA875EC2604814616230D7A075A1
+ 27: E8245E6537FEF146A2CF6AF9BC54472BEE6213F5
+ 28: 231CAE27B96A78767A0915A529ADB6B72A8006B6
+ 29: 4D6BE5BB6D29A15A259C8B7BD4827EA82F514425
+ 30: 3B00599329120E535A5D1A46F35AD03CCA27F9D8
+ 31: 2AF4160DADBB84707F7355177A4644E4CF577DFA
+ 32: E6BABB9619D7A81272711FC546A16B211DD93957
+ 33: 1E374AB924A652FA36B395D654D226BF901B6A04
+ 34: 67281E2EFADF2EA6211B549426D3A598B5E1F291
+ 35: 993464E56DC035716064577245BCE99ED175356B
+ 36: 298D2CEC0A3887C93501307B51F75BFD5CF0AFEE
+ 37: 2A0A02BF4D63CC09978EAF3B3B85A4DE8470B025
+ 38: 6236F6FE25D5157BA95BF49EEBA8987A6A301D2C
+ 39: B4DD7121567E8A428F16BBD5A8832FB2EE68BC0A
+ 40: 5FBE6037F8D8EFAA9A315C070CE3373080244496
+ 41: 04D5E112C47EA03BB60CBCEB9FC8ED7D92A68C0A
+ 42: 658797C7756256C98E04E6718D9F8952F90DA672
+ 43: 6A27ECD40BDA4CC81C599DE94D0D2904716FD457
+ 44: EF5AC5B8E7A00560E79DB54AAD4B97E996D2745E
+ 45: E67EE5275910B48F7D248A8B844DBC041257D695
+ 46: FFD256BCBBF0F3BB4DF615B4236C147FD09F4F1B
+ 47: E83A4B18C347F188301DD3AA78265AD3AB3C0311
+ 48: 13968583BC017CF0C5043364A42EC0D97E923711
+ 49: 39C33EA7C4F393C4DD4B882F73FDDAC2D7FE1EDA
+ 50: 50B0068D46AA025615053132BB53F88DC062DB2D
+ 51: 434198200766DB6CF48C993906FEAC2B47224A3F
+ 52: 004FBC3820002357434D6B8ADCF79BFA6F9E3DD7
+ 53: 13F7A8CDDDE021BCA6227EFF1A71DE19AF399B66
+ 54: ECAB85CA0C2AABF18F5359F94AAD7578A08AB5EF
+ 55: 3C86963B3FF646A65AE42996E9664C747CC7E5E6
+ 56: EBDD79CFD4FD9949EF8089673D2620427F487CFB
+ 57: 635B0D05BE254D82503A9E1DB7647DD1B5D5D6BF
+ 58: BE314B818A657DDEF92DF123FCC17C1DAA851C04
+ 59: DCFBF0575A2B3F64B24DC203BDCB46290B21791E
+ 60: ADA425E87A8DACF9C28B67E8BE4B204A31960004
+ 61: 35691DD184E08A80230467ADC6E68599B7295A51
+ 62: AD1CAEFC7ABDC90E7877D376957532B7D91D7434
+ 63: 6D31D3D634B4A7AA15914C239576EB1956F2D9A4
+ 64: 2581F5E9F957B44B0FA24D31996DE47409DD1E0F
+ 65: 109949B95341EEEA7365E8AC4D0D3883D98F709A
+ 66: AC745186C82DF8697458326051A6CE7E4E9C1C1A
+ 67: 5DE50BBB11C62ABE22E7EDC288B7D1B6A1CFCC60
+ 68: 7DD54CC4E8C70A4AC55F4C0485A4DFE139253757
+ 69: A5E0EFB95E6162F9637D58D3E4836F9661D6A34A
+ 70: 6C77DE7607A361D22852385E663171148C0499BD
+ 71: 3467662275B136AF096D84258B17CA5F23BD6397
+ 72: 1C56A69A826F95B8971635AA709978A441E75836
+ 73: 9094727596F086BA28956A6BB69CCBF3B2B29FA6
+ 74: 8C0B6183C33E902C22F17D81D18144ACB7B66FB2
+ 75: 24ECF7598894FFBBC7D30FB1EA47092F03C398CA
+ 76: 6A02FE0041D98AB7AA6916A5245BFBBCF6635C2D
+ 77: F3021EDB24459533488660512660DDFF7F451C3C
+ 78: FBB7561C0065C90D7B8182018EAE73A18288E968
+ 79: 32784F0E354A20688359B6EE7FD3874714C48677
+ 80: 8BFBA0972D36739EA808C37C07F2E320ACB4114D
+ 81: 74EADA88C8ED0B649FCCC36DE338CB538242FE10
+ 82: ED812B77C12856DB371E6F7DDF15A59FEBDD6962
+ 83: 27021F491E923CF0B191E13ABCADDAA72586B769
+ 84: 47664874218C135C09ED40DFAC26E06733AD02CE
+ 85: B39E492616FDAF2480F13D6E46CEBECC1FF5CBA5
+ 86: DE967F65BF6DF26150AF866FADCA58C45DDC337B
+ 87: 8F2E2D23CC6A2B52B904032119CE68649406033A
+ 88: 247FB8B2BD1BDC35D0C07EA10FD9686A19E4723B
+ 89: 9D1E80D5695569D0DE28587D37103BBB0701E462
+ 90: FA5C338E7506AC5418C4FC2C04AA933588892D4A
+ 91: D6BC93880FEC0163E3F223C8A64BA0879BBB0AED
+ 92: 8F27EE9C8A923C9698584786B5227CF17F0F557E
+ 93: 4C10ACF2F404236E2DABED0BB48DDC6D00AC4B16
+ 94: D5166CC6B779EB2D45AB3222181064D05FFB5E23
+ 95: 13042EB8245A8C5DED69CFCC1F1DB264889CF5CF
+ 96: 07136FE8CC1A03673891BC614E29BE79EA02D627
+ 97: 73C50B2751C502572492C801C28B02C7E9F61B76
+ 98: 8BE4B71D50C2D2895B9CA359ECB69F90CDCB1DD5
+ 99: 36A669D7C1DA8E23D07B29BD6769DC324EB6D6B3
+100: 8AE5D2E6B1F3A514257F2469B637454931844AEB
+101: F16396E005FE5ACC34EB53E6086F477415794BF2
+102: 907CD2922CA5F62F79E17B28AF389A38066E2C9C
+103: 62C9351A21A50F2150367F25D4C166C63E771C32
+104: 8809CB529232A0CB22D384B70462B64D93B0EC1A
+105: A85E4B4260A836BF0DA50B83BE1080D98CEF8A17
+106: 21D2A0D78435B2590B2C6366439939B9B15246E7
+107: 204FFDFDFCA5D46CCEC5FA96A778BFCBEA70BCE9
+108: 01DC05D6006E12D2F63A8F061B00D18CCA135D41
+109: 30E67D3FC0A0A6D2F257AE24EA8C168A4B0E0F5B
+110: 9B9454E2B42908E57403871A64EA5E930F35B70A
+111: 9F72DB053BC5370C786E34013FB8DA5958000D5A
+112: C1BFA4009BFEAA30ADA4D940FC40F97FFEA3FC39
+113: 26FC30BF64087DC3FA4CA394637D15F73B7687FD
+114: 36106E0DF24B7DEF46E9AEAB7CE0D784FE619D9D
+115: 0D82262E443C3C56565EE35776F95978E16F1757
+116: B19E6C73E94401020B14ABBF19A15A6F0C9061AF
+117: 68ECB5552C7B7B26940A82B6A67B0F4C62EEB871
+118: A834797B79DBB564AE587003EC4B74914A1580C5
+119: AD430B4283203A7B7F338B9D252DFDBF807402BF
+120: B89CDC109009F1982C8B34FCA446953584D3F6C4
+121: 8030CC5A4F55566958A5BFCA97CB6F40B9C19279
+122: D0CBD1EA711E2D405DA5ECC2905DD8A3A3E83C37
+123: ACCDC924549D314019C4FD1AAC6AE3CDFB81BC84
+124: 312933643FCAAEBA4DB9BDE6EF7D6EFA70E37399
+125: 47F11AE47E2E693EDC0B06351E935C9B5DA42A35
+126: E4C6AA211767C15E90935DF552E4EEB89F23AD50
+127: 2BE8E565E24A87171F0700ECAFA3C2942C97023E
+128: 7C4D36070C1E1176B2960A1B0DD2319D547CF8EB
+

+ 1605 - 0
notes/hmac_tv.txt

@@ -0,0 +1,1605 @@
+HMAC Tests.  In these tests messages of N bytes long (00,01,02,...,NN-1) are HMACed.  The initial key is
+of the same format (the same length as the HASH output size).  The HMAC key in step N+1 is the HMAC output of
+step N.
+
+HMAC-tiger
+  0: 2EF793765716EE48A671BDB5F002103C43734304C8717C85
+  1: AE61B56C82BE9FF96DCFBC20DD02B4BEA4FC6B6D5F4EC412
+  2: B54ADBFB404457E6C5AFCCEC27199D1F259EE1994FFFE99F
+  3: 08AEEC38E88403BB854935EB6F1464CE95B044F4B4202524
+  4: 4C9DAEDC1929E22128F2A7ED5F3556D8A6D3A8315A7B556A
+  5: 764794ED9EE1F94891835CC3A361FE75C600C7951A07F450
+  6: 1A4C447A0FB8826A0881ED2E7BD89499EACA4B6C49F96060
+  7: 1396A21D8B465C6B898511DF94846588EE8E35C0095AD90A
+  8: 7552EB03CE26A8F079AC96B42F556FEAEB756014B8FDE622
+  9: 835B7CCA9D9F13BA2A36CBD746E5C92D5B2D123CA2EC848E
+ 10: 7CF4EA88FF8B9A5A57E5ABB6B35278EE9D8653F624D662FE
+ 11: D588D953C6F438D077A1E302F84E25EF31AD99B9C5FC9DB4
+ 12: 86EC62CF1A08CEA9171AC742E8E615B3F0C7B6FBC95DC3C8
+ 13: 6EE7C51E26187F86370A26811C75136E28B0C39A113D80F8
+ 14: E1326D54123BC26CF41B30F9F2BA2E732203836AF8A74273
+ 15: F211E4C46862E3AC8B8E69976A705582CF6D1B34A6D342B7
+ 16: 0C6160FEFE70C81C71B7465F42F070F30808CDAE448D1974
+ 17: 492FC6BC091489F926F0F54CBF3E3F6C8CEC6ED14DF2DF8C
+ 18: FD166027ABD1BD9DBA13E3908D16C403E1691FF173328CA4
+ 19: 28D99C64CDFFAC1E6F7B33C8E675E49749CE835A177A1C63
+ 20: FD7BD55BC2A684F4875C811143A2997356AA87A300345843
+ 21: DB8968E787BF65C00992ED9DDE974EA71BA947395111FFB3
+ 22: 4C31B2FA4E6F7F40DECA589F85BB69BFAD1815A73CF9EB23
+ 23: B4D8D7FCB314942F171F85EA0953F7816DA9F07D72AF48B5
+ 24: 9A6A70BAD76203A7A1F64D1EE34375EC8BCB21810ECE0B68
+ 25: D21D7E5EF6F1579C84428AB5D574468933BA037C9B0C34B6
+ 26: 3C5292C87B24626241693F0EBE20A96800905691C5945E65
+ 27: 350BEEC075258BA7FE0314E6803152B021570F067AE0D4D4
+ 28: 6881F892886F9D66E68B937BB3A71FF5CB064611C722996E
+ 29: 07831F1B2D00108386339F192729687B2F57B9DAB2B1210B
+ 30: 38DE8DE8398EEC32939A239BC0198B0CFB18D12E4F2A3023
+ 31: 5B683578F81867054089AE2E1B20E02B3BD92334CBB01FA9
+ 32: E30A80BE07651BA17E2DF0D43A583A9DB268DFF3AB7393ED
+ 33: 42341B1EC4F61E90571188F5599FBA9ACF884B1E15694921
+ 34: 7D98297D65F5FEA85CB967F22AE0707E03F305BF1D2249DD
+ 35: BC8EE5CE0FA8F9E6694406009EC9358BC420B7E5DE07B6F8
+ 36: B8095DE6770CB4CC2127FA672F93F39CA4AF0CCBB9805DDB
+ 37: 20C0E981DF1B763B6BB47D43F66765AD434127C1FC55F829
+ 38: 59795328D40D2CE6CFDED8DD5089F2D5B796C9438E7646CA
+ 39: 0789CAB229AD54416C82CA5A2E667EC7CE66019FCACF766D
+ 40: F7C81B1AE705019FF9A9905972AFD72484A70E11FB81B278
+ 41: E72F52644BF5EE59BE87DF692EF0070D095115B7664BB53A
+ 42: B9A5DD984358D0B0F3C2781BA60E9BD3473C1C89C7982F23
+ 43: F7BA22269249759F1A87AEA0A125D4DF9B58E93714449008
+ 44: 5D2257317F8978576CD7D2CCD346E861A59FE949F74A3D82
+ 45: 199D8D5B0B5C5B61E046F50E0E389DA6F19CB3A7A37C8588
+ 46: F489CC6CB2D3E9F741D6C9008265CCA97E7E54D62F5EB85F
+ 47: A5E7CB0787EB7E62A9CFD8486390A6628C9876654B9E85E4
+ 48: 22FA78EA17F0D29E16276C70A564D234BC4ECA7302301528
+ 49: 4422534FB9EEC601CE7662345D6B6FF932E54BB0483C2F62
+ 50: 5D2E2B90B460D393F36BF32B2F491E224EF388FA72A48501
+ 51: EA5287BCBB856BF04FC785541079087CE24783E9310F3090
+ 52: DEDA3920899FA69F913AE50A4F0D7119C9D3CE8F4E6D5BB2
+ 53: B2F55D8EA64C9842BFEA4FADFE616664CD44C57D53998C58
+ 54: 3D2C72F26188E1EF5C0F0FC8B541224066C4DF455FEE78FF
+ 55: 50BB36BD8A8D97E4D6CA78DDCDAD0690FBBC93DC9A66BF18
+ 56: 48140E192FF8AB74FC22676AAAA186C1A7E2FA0166E986AC
+ 57: 40AFD540C40EE7E598D26AE3FE5A47939299B5DD46B0B4FE
+ 58: CEBBBD763B077342BA16D4B20412C9EDE0F0508ABCE3501B
+ 59: 0FE4DFE539160F5924C324B8B43DACB4F220195D286C6FA1
+ 60: A06D135075F943CEE74AAB1B8DE08B772055551B1E73ED48
+ 61: D4E1B5EBBDA5CDA5040DD697BB96DD702C6730CFCC012992
+ 62: BD5E77B67B42C507C4912130C8880A9DBD66431DCA0C0038
+ 63: D81F583A9B4DD1F48028CA602CC0F131D60561FA34F7B3B4
+ 64: A41F0481EE52842CDF676177F8E43BC1F1B00A5682C63E15
+ 65: CDB29E274ABEB20EECC8378D5BD806997502E4271AB56708
+ 66: B8366ABD45565BB3D26CE46B6F419F74B34851863FF4C336
+ 67: 5AD2C193D6D51C9C7E56C5BFF55C1D61E045366B51E7F619
+ 68: 9948E3AB7D121B15A6CA8DFDF4EE5377C957F0DE891C3575
+ 69: 095676D61096853635128A80570BD1CE803AC7249C0A0F57
+ 70: 354F4CCC1E5112770B2AB035AE07200A6CDC0280AD088AFB
+ 71: A8723395E80BED25DFE8F9ACEDA942A77D225D00440302D2
+ 72: 0D2BCE0F8CF396FD8277C8BD9B19D54965308D3ED04D2F27
+ 73: 54B1939E9944F499798B3DCE3479AC315F2C42A1EF231984
+ 74: 5CFF726EE4B2596240E6CBBC66D7C737A4D12A702B40E81E
+ 75: 82996D7F3F27B473BDA647BBBA7230DF217288F2D1A38B99
+ 76: CB95F63E0E7A2EC4F26E94B81A3C8C757E04EEEAB35A8C2A
+ 77: 057DEDF45207EA885A0BAC5B64240DD21CB9D99CD8F38FEA
+ 78: 27DCDD1ABA459506EF98E5C8D567692264C4153F91FDB269
+ 79: 911C83660F7EE8CFB5F54890AE98CCA36C4C12B8CC771DF8
+ 80: 67CD07209988C517FAEE01E64AC4B5CF261B6035069508FA
+ 81: D9A40C407E2BA852684770A5EB08D8502DFD264F2DE5A5FC
+ 82: 9AAC50A2BCFD74BE3DF85237478AAA833484FA3DF912A3AC
+ 83: 38078488F6183B5A94B655F24212FC9769450D93986C9208
+ 84: 2EFFCBFA4CCCAFCA66BF8B368FB1FEFAC280C20416BB90EC
+ 85: D626FD6D285C49F20E99B88B9F82640D93D9E765CA55B5B0
+ 86: B1DD178943B26AA241D34031D3128344C6955F6A942CC5D3
+ 87: DA0C850E2067F9FDAE433C1230E0F629700FC8896ADDBDE9
+ 88: 58E393E353BD7DF75A591904AA99526E94FA45C98D095E21
+ 89: 323D0E04D239BD70192B2ACCB9ACF06E2F8C3B07565893AE
+ 90: F9C4147C6921640C097534BB08020540B420AD569D03665B
+ 91: 5171DB964AC815B3A6D058419FD47833DDAED71039966E6D
+ 92: E7DC7C574AFC2C9A59E46CB8ADBD03330A5321B237DF7899
+ 93: 97074CDA9FF8D40B0501E9F632ED7335D6A7926101A34C0C
+ 94: BDDCD4D007DE39680B80F9AF9803A9F21C836EA971250CD4
+ 95: 0DBFF45E3155098D4B4C13815FB461D3C4BE41E9E1A68757
+ 96: FC16CB95478E4D23A7AD15CCAE3C24BBB3D0FBDC8A00A144
+ 97: 93A7CB506481D6A72EAB14A2BA544F8631542B55903CCAAE
+ 98: 9CC1FFA19736AB6EB36EB4A2C1624FCB6913B255D2346795
+ 99: CE3526A088FFEDEA4345AB221707848823B16DADD19AB487
+100: 1E1D790323586DB8A306EDCCAC8C64A6F29A36F772B8D61D
+101: 8C403515F2B9014E9519EC04769ACCF23E522D3E22DE7F41
+102: 6B6A634607634804988301240CA5AB029A9E86E51281D64E
+103: C7C3483CC8E6B58520B554259EB08866AA7980B53FFB6B86
+104: 96E429611C9E411321947469E2095CD9B0EF29578030E40F
+105: 5C5A7F2B7F1F9BCE730BE2779304A443188FD3B31DD2BF19
+106: 70933F999325353277E0AA1F543B5CBED3F28DAF4FC70A57
+107: 5CD6D136FDDF4AE9CE42F008301FB6647096D5007E79973F
+108: 1162BA742AD199AC17FC707285301A82BA9CB12C09BA229D
+109: C36615F6D5E29E6CABB7EBC44A6D3F7B024DAFBD338FEFFA
+110: C29FEF051D1606CEFCE3417BD571CB9188BBF0FA8AB98679
+111: F925144EDDD27244E19E4B6E433F312C6CDE43EF4F9B84B5
+112: C4230A59E54A34D0709F3F1DB02C18EC8AA270078DE424D5
+113: EB1699CAEC36681CCF8A9144DFB5050566042977D15FD1F9
+114: 9FBF0D9B2DD9A6E87240E538590E9799B76E22604D22AB75
+115: 2657EA06D69A78A5895A9169F849B3DE111B31E5673A8E17
+116: D1F9E1BA4F4E52CDAAFC388FA4C366EF4BD5F440608D86B0
+117: 049196BFFD9F77175FA936066C3119293EAB79D1E0028C8F
+118: 9CC1BD2CADDEC1D82FFAFA7031F2E5C9B6765CF1727A0ACB
+119: ED00438670D68A70CE2E0729997CC9648947EEA35809B8C7
+120: A520A0089BC16C84CB8E05425B330C6D261108EE3049FACF
+121: A55B470483E547D2752EDC3C4FDCF3B4C48A1990AD857941
+122: 46A78E772C533EC8EDA60EB4A127FCEBD35E7D0E7F183241
+123: 5EB9A774124D571FCCC83D1F36C603D9C387390DFB3928B2
+124: E904066FC77F73CA41166297A8FC631FF59634B659F0AED0
+125: B85B66AEF7D9904356F1CAA5583757D1D69EEBB8AB1D1420
+126: 6639F85214BC798D71B757FCD480CB78D325881781A3A073
+127: C5B72BBE80917B55036A9AD6908D59293C49373F0BDD104B
+128: C0BD695F6B9B42DAB543C31BA73C9497A6AA6419A007A9F6
+
+HMAC-md2
+  0: D39AD9DDE006587A8BE949B11B9288F8
+  1: FCB21B5348C95E8A8DCBEE50A80302CA
+  2: 2F26B6ACCD0E03FE9B21A1B0E75FF665
+  3: 17CF85D985D0D85F545897CD42C6EFE5
+  4: 1537A6943B4F5AC1272E4161225D987B
+  5: 83E17165D62CA6E4B9ED67DF1E599954
+  6: 7A3195C863DFF86A98968F254E128E61
+  7: BD05057AEBFCB92FA4B07456085EC6C2
+  8: 23AC0D307BFC2E87760F8BDB21851DF8
+  9: 2CD26A2F2994106A375BEB0433575BDE
+ 10: 1F63BFC44FDBE9A966CD90DF82265EFD
+ 11: 72735FAADC3819CC24CFCE1D589BA311
+ 12: 28B589C3C8078B8FFEF1C8297E33C1E6
+ 13: 70A6DC014CAD2752931A47C0879D2371
+ 14: 81694317A37FFBA816504974F38B4829
+ 15: 72F26208B3051F1B938EA7E03DD8C107
+ 16: F945F57FE0696A4C81EC59AE69384FAB
+ 17: 54D8DFCEE33969486956698495B4BFD0
+ 18: 508B82F88A234E753A9E305E15A14D82
+ 19: 527D77D2AB25131693B02F653ACBD90E
+ 20: 4868AC540FCC3A896D5A89F7A0444D36
+ 21: 6189807C5FDDDD68D20356ADF3B90DC2
+ 22: 0356362F2BC4206F2B930C4282213758
+ 23: 2F59956F19B3CAD687C66C4EC3CC916D
+ 24: E30CEFBDA3FA1A8EDDE3B72614ADDEDF
+ 25: 33E0E6BFCBC9581BBCDF13F4D3F26724
+ 26: B11C6476F9775219A9F18B5E88857790
+ 27: 49C7A9D7F56344BD405E53BE927E3A58
+ 28: 99A06874B0F0CA45C9F29E05D213195F
+ 29: D21A60A18F061FC453AD5AC2A519071A
+ 30: 2F735E82090144C036E3D12DEF2E0030
+ 31: F9539EAC81BBCD0069A31E2A3C43769D
+ 32: EDCAA9C85A614AB6A620B25AF955D66A
+
+HMAC-md4
+  0: 752E874F35085E497D5032112CC65131
+  1: 6B2CAAEE210F970AB481D6D8EE753114
+  2: 2162A41522C2DB0B8AF1F0C712C19A22
+  3: 7C2106C3CB687F35FE2658BEEFB497A5
+  4: 3715333CA3EB74A15B4B1802A1A78921
+  5: 403D9A691A130AFFFB81A655AAE1D956
+  6: E697C3CB42716CA1973DE0D15486068E
+  7: 99676F34E42C61E396F0E76BCB77BEAB
+  8: A2B2CE8CF8AC151C5556A36D58894C61
+  9: B8614BFF1DAAEA90BF319F333024976C
+ 10: B8759E8B97DFCBB2DB94D8CBE2C96B20
+ 11: CFFE6119EB0C649831459339C1B0C82A
+ 12: B2FC0DBA9C4830CA66423728599D3660
+ 13: 454749F1DE579F1918FF046FC1CAE7F6
+ 14: CC625178FEFD46481B7D02618AF6194E
+ 15: C26D523EFCC42C4AF7EEC2EA4B45B719
+ 16: C352DA2D077FA3F493A5CE0E9A79CB87
+ 17: 570DDE9FD220F59867F17484605D2061
+ 18: FF5954A163CBA61CD3C8424CC71682C8
+ 19: 1240D12E3D6C07F6FE1CD595C847C038
+ 20: E87A4D7958C43CA71791B13E16301036
+ 21: B2CEDE4A15F8D64C53D243F8C5763C05
+ 22: 54A9E9EAE155E7AFA6FC8A7E05D7FA9B
+ 23: DF0E79F27CE25E56ABCFF5E74D1212CA
+ 24: D9BE454A95E5D9127990577F7EB7183E
+ 25: 26F9221A8B854767861BF0281303B89E
+ 26: 92BD4CC81A673B254A4AB493864BB014
+ 27: EBC3851E0AD28BE9876BEFD6B0A88B44
+ 28: 1134BC8A40E1D2FB038B67548AC2040B
+ 29: 954700135C4E7F232337C84130B43360
+ 30: 8C3EF2D8F896C8D252851A1543F72493
+ 31: 52817E79D2B0B3A37DC08D18D3519F92
+ 32: DA661A428B9659DD59545E3B09162F8F
+ 33: 3FF5BB67B48F87B4B642DACCD2E4001E
+ 34: C674F95BB622D7B8281FFF34E9EF3E7B
+ 35: 3A4D25E3BCABAD8CD4918CE650EF00E9
+ 36: 2D91248C51837A8B80898E2CE42CBCB4
+ 37: C0B3BD2B36493F0EAF9AAFEFDC37064F
+ 38: 9B4723B091102B480B2B59069317F292
+ 39: 0F8EABB489254491FE19AD0E328A483C
+ 40: 25469BD482E1405E51AA021752394C4C
+ 41: DF1DF50EF9D95892D08DFEFB79D6552B
+ 42: 707A546964CB22710482C478E58C2E0F
+ 43: D1E243DB14E2F946D650C811030ADE9A
+ 44: 11A1AEA678E98A65420747DD6CF9293F
+ 45: 66E735F658BD689A9F1BA0B526827CF9
+ 46: 98170734E67F576CCC3D01D83965A6C9
+ 47: 399D99CB7979E80F6D3B5D5BBA5871CA
+ 48: C26651C32EABC76289CD0843D3BCDD92
+ 49: AE0F50954C90E8897BCF504592D0626C
+ 50: EA3AB701136862428EC326D2551F8AC8
+ 51: 4AE98E5A1E6B1BA8CEAE844E34934039
+ 52: 7C9826187053186DDC2760AE6FB56DC7
+ 53: FE0F555B851CAD830BAC9FBB40705671
+ 54: 221BB509584BCC7E10F3B4FAB2AEB1F3
+ 55: DD93EAFE25EE27C6FDC2CCDE7D273267
+ 56: 535472E1ECD49FAA75CC6621BE7E6210
+ 57: DA4554FF7D5B289A03D195F94154AF47
+ 58: F15A3F547B5A3844BFF713CBCEF701A1
+ 59: 279DE06FD5644C520BADD3B97D96274D
+ 60: B933E929073492EC1E2AEB78071C7B83
+ 61: D1DA2335654AB4CEBAE5C2E78CF27553
+ 62: 06FC50285F4BA5C8B5A478E9C02D6434
+ 63: DB66A5D55224DDB50337B7FEF9A808A7
+ 64: ECFCD0385FB49553EC89DD94AB084D23
+ 65: 4187B0B79E6CB916F747B857AB2F75D3
+ 66: E03E14F5E00B2DFC0614308608B929B9
+ 67: 5F61FC3005167EB3256DB549DA8BA562
+ 68: 21A4D14DF8E934A858569D8BA7F151E8
+ 69: 5955DDA4CEF16ABADE2B551841C69B8B
+ 70: 8E77066A973B60DF64C27DBB93EF204A
+ 71: 2101EE9DC8221FF17D9D887FC39F41BA
+ 72: 6574A9DE32B7A673B5BA20FF18EF8C93
+ 73: F571B14C9F5C5C1858D48AA944A13050
+ 74: 0BA4BE0A5E853D07F79B2D29BCF046B5
+ 75: F240C8C38D71131F510369D79FA32208
+ 76: 920C294DE37C28803FF3C49A4135CD65
+ 77: 38796D25822AD8F2AB4D64E4A65626A0
+ 78: 65A203170FDF794397FD1090E318C5DA
+ 79: 965A767FE4A75BEECE26BAA79D816AD7
+ 80: 0F4B30947B790C47924657648FA1D88C
+ 81: 74B05F7B7D006F7DDAB31DAE251C3BB3
+ 82: 61B0366B57A8F46C2F6C16F935DA768F
+ 83: D4CB13CA922B542980F854C9780A1951
+ 84: 039B2F23A1CE410FF4696D9C35C40C08
+ 85: 2D734E28F995C2AA2A7AE2412EB99A10
+ 86: 1A55FE47703ECDBE446033F492412812
+ 87: 6AF4CED86D0181D6E99EE6AE57F295EC
+ 88: 69C239A875E0352D20BCFBCF8D5CA19F
+ 89: 62723FBBF0AC6F397438589AF06625A1
+ 90: 424EC9353901795251AEF7D7BCFEB8BE
+ 91: 9BBE4ED6C8BD14F85BA86E553B1B8152
+ 92: D7840AA82F788B7D58712E29003D1239
+ 93: 4AA55512DCAF770FE4D9428FB318B0B0
+ 94: D040BA08BEDFFB20D2C499FEB35EE12A
+ 95: 0F295EDEFC85546547860B7F7CDFB1AE
+ 96: 720FCD871B7D8824EE6A7DE9FF1A62BE
+ 97: 2FE3AD14E24C441C36186673A0D60767
+ 98: 943FD502136B66D0313951198680F746
+ 99: 4EE6829F3EFFD0A87115512ED28C85BA
+100: 6EE1AC28A320246CA5C37F981E22D294
+101: 36BC623D6573C3ADB164F8A6F02315AB
+102: 08B3AAED34FB0A0F99C4B22714B9CEAD
+103: BDCD10B66096AB992DEC5539773EAF23
+104: 6DA36A53A79FA2C68E5060C0D2D43E13
+105: A3E886199532C025074D4646113F9C23
+106: 00D67A1D2ADCA77A20441CBF593FDEE5
+107: 2E4399F5FB44FF5573B73D01C5B248E2
+108: ED22A18A8824A30B68EE0EF9907B2B91
+109: 36166824634304417BECCC9519899CDD
+110: 0757DB01193BEEE90617AA8CAD0360A8
+111: F7691CBEF4ED2E9FE4EB992CB3939970
+112: 09DC2FA975CBE8CE828919957D110EC2
+113: 7DDB74DEC57AE8C318AA5CCFB53872F6
+114: A26B7DD0AA30EAAF1F4F8314AB7DF16A
+115: 088855527BEBCDB67A40FEA4FDDCC061
+116: D0F8ECC0C32B7060CB6128279F57FD80
+117: DF5B79D3671CA5E5B44CD395F6FFA551
+118: DA8999EA059C463D5F05D04020EE867D
+119: C0EE404DD8447AA70D3725D5634E2B53
+120: D19D1A725F5E9F0DF21871B31900CA73
+121: EC202984BE149C93CC1D440CF6D29E1F
+122: 422DB7C21B1348983B75498E270FE6C1
+123: EF136334BC30C92DB9082A9654B391E4
+124: 0B3526430AE734054873B14DD696CB3E
+125: 3BEB77C0F85F8C6F21790ADF30EBB812
+126: 4376F8C8EAF5A94871822DBDFBB5F88D
+127: F7DEAF52378FF735B2D171B17EF573D8
+128: B4FA8DFD3AD4C88EABC8505D4901B057
+
+HMAC-md5
+  0: C91E40247251F39BDFE6A7B72A5857F9
+  1: 00FF2644D0E3699F677F58ECDF57082F
+  2: 1B6C2DB6819A4F023FFE21B91E284E93
+  3: 04B0ED3E73FBB9A94444FDFFAA530695
+  4: 1557A22261110DFB31ACE25936BDE45D
+  5: 54C5A67A9CB4544CA66BBDA1A2B8479E
+  6: F803D9E43C934545AF078FFBB34BC30B
+  7: 32F56EA655DF36D845E430D637C85D17
+  8: 14BD2095F4A478C10EEBFF379DE76DD3
+  9: AAF6867B3FA01DD26312B0DFD6371A2A
+ 10: 0FA2A6FEFEBE7CE3C31A38400F8AB260
+ 11: 54C37BE13B7333287D0E74AA9D9227F6
+ 12: 385D75A58B0C95E5CDC059DB168BD1D2
+ 13: E73003103ED65C08E62D46AE1E1B771A
+ 14: 278ED4A4EBEA1FFA5EEC874F198C0CC0
+ 15: F65CE9EEA7FDB90B9CC603329D3FB9A9
+ 16: 8640836944EE0009B2CC6FDC3F5C39E1
+ 17: 7819A99F82BABDF060AA51AE109629DB
+ 18: EF26336668486C76921D1DAB67ED5673
+ 19: 13ED7BC140F1496E09AD29C644586957
+ 20: 5FDD337CE9C4AC8D910833FCC2BD837E
+ 21: E9470246ABF7CF4D37FD378738D8F763
+ 22: 384A75C33EFFA12EB69187BB80DF843B
+ 23: 63866A5406B9EA0341032FCFD0244A4B
+ 24: 8042F8572C8A9B88E135ACB83EF1FD39
+ 25: BD1BE6AF2D022F966F612569E191F0E9
+ 26: 9F70C839533EE4C7B3CF20C6FB65C94C
+ 27: 800A5CE92CA4FEE6F1D353F496113873
+ 28: C35E93E1E54C84C4389D2DE71E1B9846
+ 29: A130EF5F91465F5A56999F450E63F4F9
+ 30: 5F16564E05285A099F628245DF9A3C2A
+ 31: A34F7E3DF06DD84CC67E8A922240D60B
+ 32: 945E50753B6E6C920183822D5F280F10
+ 33: 2DDD269DBCDF5C21A1C3FD540FF4ABA9
+ 34: 212FE3E2CEF7DF74FC01CC2CC83119B8
+ 35: D98B2930011649F16C08BC8C0178D838
+ 36: E39E21026111C1EFB0C491C0FDFA841D
+ 37: AE46DE06C3B0D2CEC35352C95A1003F0
+ 38: 5550EE50BF88C9DE5ADA34567FE044C7
+ 39: 6BC486627760373EACFF508F7032BF31
+ 40: AE6E0B8DBCFDCCA4B3449B57647D5AE5
+ 41: 6BE5A0F140DFC4B75439630E6F9A36EE
+ 42: E3E4E735BFE79397D4653A6243DF1925
+ 43: 68C1D9E8973A3F6B92B588469D68A2A5
+ 44: 956132D512118D5F446C8CB912B924D9
+ 45: DF5C2AD650B3CA7A89EBF92EE618C845
+ 46: 14D375CF7E4294ED99135E4237414F01
+ 47: DB966D40B447692E2D13CC0C09C1B495
+ 48: 53DADCF1C6B99BD403052A1CE1ED0D14
+ 49: DEC4A3C1DB8F6AA4515C512C9299C4DC
+ 50: 3B3A51DD83AB1DC56A7F0CBE1C71923F
+ 51: 03C73353B3203EF9CDB95F9DB8750AF1
+ 52: ED9E15FD86D66DA2D546D2BFC55041AD
+ 53: 81B649338F9DB1C6E592427D38221C7C
+ 54: 92E170E13BF40FF65E3B4C665F222DD5
+ 55: 00D5E23F5F829B21D454C4445851AB53
+ 56: 39057029AF0B3F4391A7BDC6DDCE4D07
+ 57: 2DEACEFA698F9CCAD5198C4E17E69A93
+ 58: AD35FD52EA199E26948009DF3546D3A2
+ 59: 4C42CF2CFD4D8FD9A06E3F73D02FE818
+ 60: 4D7C893E4313FFF72103854463414277
+ 61: 3F04E8B32AB56EAF216503E46BD7AEBE
+ 62: F015DDC3EEF41ECC93E944FA3577DB52
+ 63: 31F77A50A2ED96ED8E4A3CE04B9DAA23
+ 64: FBF481373481756E0C88978F7E0809A2
+ 65: 7D8D793B287C04E7D2896D76EAA5CA15
+ 66: DAC74AEBECC2385DD9D0C3147CCA1F78
+ 67: F6DDE50D37B460FF5E8B4C03A0854BD5
+ 68: 5710D6A54A2124E06A6DADBE9BF76119
+ 69: 19DB5D13A53E57184759F33976537AA5
+ 70: 848DD8D32130626FBD11B0133C2A29E3
+ 71: 4F75BE04BF2F6DD85D048DB82F19C38C
+ 72: 4AE9436540ED24BCB5EC62977AC90789
+ 73: 859D1A9FC2B795AD60F24A37EB9EF890
+ 74: CD45865317FD17B652DE9F9EBBBA16B6
+ 75: 52313319D395F453BA2C0A0159CF180B
+ 76: A7B190C0EECACCA4DFC5B45DFB324718
+ 77: 23E85CAE85B50F45F7F48EE0F22FDE85
+ 78: 6A80DBFF139A5345235EF76586CFCBC7
+ 79: 850E638FCE5A2F3B1D1FE9C28F05EF49
+ 80: 797CDC3F7E271FC9A3D0566A905D1CFE
+ 81: 030CE97A9A0B1D5403E253D883FCAF12
+ 82: 648FFFF44E416D9DE606BA0DDB751194
+ 83: FE15098E0DAC65FA8EE45CAC67121CC9
+ 84: 17C90ECD390A8B41046B4C7FA0354E4F
+ 85: 7D149DFF5F6379B7DBF5C401DB6D2976
+ 86: 8D055A4701DD51CB9D1AF8E2AE59BD21
+ 87: F3481CB07B034EB4A023D00D4FDA9A86
+ 88: FEB22562FFAAA9CCE5CDDA34C29E55C3
+ 89: A620AA447216709D8CE5C5F23474ECF8
+ 90: F25FCBB2BF7440C5E3C5B53092B8C828
+ 91: DBBAE1CF60BBCA0B05EDEA0B362F0A33
+ 92: E18E85BCB4633A797FAF7975CEF44B84
+ 93: 1BE27EEC72C2EDE151978705C7C7DED2
+ 94: A15D36C5C5BED77699838832FC225DD8
+ 95: 08F31E68BFBBB420742F80B20B69BE8C
+ 96: 5E9B4B5B3228F533BA8EFC3C0B9AAD3D
+ 97: 1239BA6D941D1D8AD2ED561BF517D4B4
+ 98: 5233F50218E0D097EFCC68F1536F30AE
+ 99: 340B47C78B003272EAA4B9D22C3B0542
+100: E7F11759FE8A897364C21767570885BB
+101: 054BD6ACBFD5421C0290B0839C0A0ACC
+102: CC0748F7B2CC921CF5FA019F955066C9
+103: A4DF167697949B1AEDBBA3226A334BAA
+104: 29893B9776BA5E750A9FCEA37B0116AE
+105: 2DC25C935F006F7965FAB3256D77004D
+106: 24089811FFF2189FB9AF38651F43977D
+107: 0E048569D634BF652CD8EBF859C9B69A
+108: 00386B569DAB73844A708BA5B48BBAA8
+109: 8033E1AFFBE1218F81C8331343FBE5B5
+110: 9B82008A34F3847C1204ACA89F3D57D1
+111: BE1A529F88AA05A42AFC40F663E97849
+112: 5237637AA645E83B0E56A1361AB80643
+113: 15BC4405E891ADAF48FA56D4356705D5
+114: 0820087438832B63AADC479CFC88BDBF
+115: B1E3BA7E96605D5FF614B1BEC1F57AC1
+116: 838A096D64E6C0DDB069DC89E4C3F839
+117: 934BCE159F3959A933C87AB497CA8D42
+118: CA501F1DE619A570DC38FDCB8B3F7722
+119: 033B27D5994A6F5D5F6800539B69E876
+120: B447FC68FEF4E3CF9290B06EB6AECAA3
+121: DD3D3F72F0F1FBCD030D839DCFEE457A
+122: EE73C4C996E0150D93B3144F20FB2C1B
+123: 5AF9679D2441542391C6A903FD8C1626
+124: 2BD84B87230511DAE7256B62A46AA45E
+125: EB159E5694C191F7708951EBC0AAF135
+126: 60F02EFE1DAFAACF65F6664A2321B153
+127: 14E5A0E90D4420E765C4324B68174F46
+128: 09F1503BCD00E3A1B965B66B9609E998
+
+HMAC-sha1
+  0: 06E8AD50FC1035823661D979E2968968CECD03D9
+  1: 0CE34DEAAD5CF1131D9528FAB8E46E12F8FE3052
+  2: 23924849643D03BBEAC71755A878A83BD83F5280
+  3: 6119DD9A7024A23F293A3B67EFA2BF1D82EC0220
+  4: 379DC76AC2D322FD8E5117CCA765391BC0E10942
+  5: 7897CC86CFF17A3F95C7AF02CCA03546F5CC2368
+  6: 1FA1EF3980E86B8DF2C8E744309381727ED10E8E
+  7: 03B2B726D71DAC6A2BEE63EAA09631DA78F5958B
+  8: B8CAC4C104997A547374803B5898057B3F8110A9
+  9: E165E07F8D542FB288C7D367198D0618DE3C9917
+ 10: 18125F046C675F434B3C53A28C301FB2D91B5D34
+ 11: FAAB993F2FEAE442D28FDBB613D2C768ED13342D
+ 12: B657E7EE3A65C6484D007E21484813D9AED1264C
+ 13: EEEC2BB7BAC158742711ED13090FA20462A5E5C0
+ 14: 12367F3A4E1501D32D1731B39CD2DB2C5DF5D011
+ 15: 57DD9DA36E7A4E567A2C5AE9F6230CF661855D90
+ 16: E37110DDD295D93990C4531D95564E74C0EBE264
+ 17: B2115C4E923EC640E5B4B507F7BC97FE700E12DD
+ 18: ED20C67345867AB07E9171B06C9B3B2928F43188
+ 19: 6CA7DFC9F8F432DED42E4EFE9F2D70D82507802D
+ 20: B39EB4D2C190E0CE8FA2C994E92D18CFBCD8F736
+ 21: 91BE5ABF1B35F6227772E36337F258420CF51314
+ 22: EB957199EF666C6D0EACC64FC4261D11C715BB23
+ 23: 2A18D8D4AB1F8C528C9D368BF5A7CFFC2168D067
+ 24: D4DC370D482D82932701DF8CEAC9337682C2551B
+ 25: DB9665A6A26DBDE20238F04E9F1A368D26564E4F
+ 26: D5AE212C9E543F2656699B59DEED54CAACA9A071
+ 27: BE8890F9DEC6A02AE2848D8505B6408E884E6D1A
+ 28: E8D9DD9FAA3080560B0EDE798B745FEE2A1E5479
+ 29: E219219D2CB8C363C2687F578446ADE1C0404287
+ 30: E8E7767B35ED8D0965F68272ACE61924CB044262
+ 31: 1B26689C1EF55448A61DFAEF98B6E7206A9675EA
+ 32: FE850390864E98A17FC43C3C871383169741B46D
+ 33: 3F63068D536A282C53E5C003BCEEC96646CF7455
+ 34: 2962C292CE247F11ACB7E1F981447C51E9BBE63C
+ 35: B28909A2B7B2E0E13FDCB1124B0BDC31D7D2FEDE
+ 36: 8DA0FC30C8322DABD67D61E82FC92351894789AC
+ 37: 543DAC6D449FE2DDC3201927D08695F68F832905
+ 38: 371540F3092F77867F0CA9DA69318C7673F68388
+ 39: 7EAF32204EA5993C87E9A12C67ADA4C85D253281
+ 40: FC4994BAA05F592901085ED7DA188EC3A9BF36E3
+ 41: EBFE77592EF34E81BDA05305876411484DC0744F
+ 42: 25F64E8F076305D6F5741EA58232F68B725B8F6E
+ 43: 5DBA03F7E4B4226666F0D8D5BF49FEE77951D121
+ 44: 98E1D56D723DCACF227D2AC67BF2D6E7FD013497
+ 45: 53550BC55A367D87416FFA25261362E7D4618DA2
+ 46: B18434BCCCC5F08B35397C1A6684D60F4F3A452F
+ 47: FF2BF38DFC6909B46A01E055D173F67A7E456341
+ 48: DAFA445432ED37FEC99059DB8A0BC528E788E95D
+ 49: 7FF823C570F8B4C0E483165C076AEA7B5E727632
+ 50: BC4FC948AB621FE1419CF6006DC04E7D7B32FA23
+ 51: 1678AFCC3FBD1063E7C82CACAD5B6A933A93091A
+ 52: 97DC2F9F56738FDAFFD555BF09274153FC2FD009
+ 53: 74F5CB4F0900441B7AFFC278C01A3038DF3D60C8
+ 54: 021F66143270C9D58F26AB193DBA81A811917CBC
+ 55: F486D1C8127813FEEEA8A693C4B8ECB5BB53C3A2
+ 56: 8397CAB8EED5B2164FEC6BE688971DFA2138934E
+ 57: E4477CE9BF8CC5A4CCDE039B4E3000F1A0F4153A
+ 58: D6D2D1E3EE4D643AC4B38836AE54E846F99B376D
+ 59: 9545B2C6279371D4D928AEE24328121D43DE1E5E
+ 60: 947ED38EC087C4E53F417E8216408863A8EBFCB2
+ 61: 32518A2326ACDE1E962B3D0D2BF950F318894E83
+ 62: 5D21D368FB9D879ADC27B341D608BCF860AB14F4
+ 63: E2BEDD94D565A51915B1EC6FA9DE18C62D12533A
+ 64: 15ABF657DB6473C9E2F017C7A2F4DBA3CE7F33DD
+ 65: 0C9DAF8D959DAE3B66FF8A21A94BAFC523ABC462
+ 66: A36BE72B501D435CB627C4555A426C4ADAF3D666
+ 67: 1C171979D67A014A0422D6C3561C817A354CF67D
+ 68: B75485B08ED052A1F4C3BACCE3C563DF4BA82418
+ 69: 17297624219C5955B3AF81E5ED61C6A5D05BD54D
+ 70: 38A9AC8544F0EF24A623433C05E7F068430DA13E
+ 71: 1E9EEEAD73E736D7B4F5ABB87BA0FABA623FB2E5
+ 72: 4B9D59879EAC80E4DAB3537E9CA9A877F7FAE669
+ 73: 7F76F2F875B2674B826C18B118942FBF1E75BE55
+ 74: 1716A7804A9A5ABC9E737BDF5189F2784CE4F54B
+ 75: 168027EDF2A2641F364AF5DF1CB277A6E944EA32
+ 76: FBC67DED8C1A1BEBBBC974E4787D2BA3205F2B1B
+ 77: 33DD26C53F3914FECF26D287E70E85D6971C3C41
+ 78: 97906268286CD38E9C7A2FAF68A973143D389B2F
+ 79: 45C55948D3E062F8612EC98FEE91143AB17BCFC8
+ 80: AE1337C129DF65513480E57E2A82B595096BF50F
+ 81: CEC4B5351F038EBCFDA4787B5DE44ED8DA30CD36
+ 82: 6156A6742D90A212A02E3A7D4D7496B11ABCFC3C
+ 83: 3040F072DF33EBF813DA5760C6EB433270F33E8E
+ 84: EE1B015C16F91442BAD83E1F5138BD5AF1EB68E7
+ 85: A929C6B8FD5599D1E20D6A0865C12793FD4E19E0
+ 86: C0BFB5D2D75FB9FE0231EA1FCE7BD1FDAF337EE0
+ 87: AB5F421A2210B263154D4DABB8DB51F61F8047DB
+ 88: 1B8F5346E3F0573E9C0C9294DD55E37B999D9630
+ 89: 09DAA959E5A00EDC10121F2453892117DD3963AF
+ 90: ACB6DA427617B5CD69C5B74599D0503B46FC9E44
+ 91: 9E1BB68B50BD441FB4340DA570055BBF056F77A2
+ 92: D3E0C8E0C30BCB9017E76F96EEC709BF5F269760
+ 93: BE61BB1BC00A6BE1CF7EFE59C1B9467D414CF643
+ 94: 19D693B52266A2833ECA2BB929FBF4FCE691A5C9
+ 95: B99816886D9FE43313358D6815231E50C3B62B05
+ 96: 7A73EE3F1CF18B5E2006A20BB9E098E98B6513CA
+ 97: DEC620F008EF65A790A7D1139ACE6E8B8EFCCA5E
+ 98: B6BA0EBD215CF1B35742A41EB81A269ACB67C9A4
+ 99: 3A0FAAD14D3B64BE4EDB9D5109DC05DFFA7680E2
+100: 12E62CE53283B5422D3EA5D8D00BC7F0AE8A127C
+101: AA36F0CC6B50AB30286BA52BCB9BB5C1BD672D62
+102: 55120C68B419FE5E12DB526D4ABFC84871E5DEC9
+103: 372BF92A9A2507509C3D3932B32444B7BE1C9BAC
+104: 7AB4B04EEC091F4ADA0807DDD743609BCD898404
+105: 20CB412425E88482E7D184EFEF79577BE97BAFDA
+106: DEB91399A7BFB8323BC8E6A5F4045125277C1335
+107: 6769F41624E553B3092F5E6390E4D983B851C98C
+108: 716760E4F99B59E90A4F914E1FB72A6D2C4B607A
+109: DA0AA5548B5C0AF0CC494F34CAB662A30372DD11
+110: 17A0E2CA5EF666EB34E2ED9C10EBC5DDCD0D9BBB
+111: 1B3614AF749EE359F64F3BE3650210CC3C3498ED
+112: 346E604622CF8D6B7D03B9FE74E7A684AECCA999
+113: 629E46882D214F9BD78418C2A97900B2049F1C83
+114: 765F86114E942214E099E684E76E94F95E279568
+115: 002ED578F79094B3D7E28CC3B06CD230163F1586
+116: 52CC9748778AF5C8E8B41F9B948ABCECF446BE91
+117: 9326190BF3A15A060B106B1602C7A159E287FD4C
+118: 18A5DFBAE6E7C9418973D18905A8915DCEF7B95B
+119: 6D25BF1E8F1244ACB6998AA7B1CB09F36662F733
+120: 5F9806C0C1A82CEA6646503F634A698100A6685D
+121: C3362CE612139290492225D96AB33B2ADFF7AF1E
+122: 3D42A5C1EAFC725FF0907B600443EEF70E9B827E
+123: 7FF97FFC5D4F40650D7A7E857E03C5D76EDD6767
+124: 3A92F2A18E8F593E6A8287921E15E2914DF651EF
+125: CDE6F2F58166285390B71640A19BD83CA605C942
+126: 21A227A8DA7A9F5D15C41354196D79FE524DE6F0
+127: EBE93AB44146621BAAB492823A74210D3E9FD35C
+128: 6560BD2CDE7403083527E597C60988BB1EB21FF1
+
+HMAC-sha224
+  0: 6E99E862E532E8936D78B5F02909B130AB09806B2AF02F7CB9D39D12
+  1: 1D1D08669FC34CDC5FE5621A524E7181CD5B5BAFCA3DA56D2E15FCD9
+  2: 014A21F82D0CAAD15EB74DD892187D7AD93F2BEB549A596DFF2C9AA9
+  3: 5F600F19EDED821AEED09781792F9435458A32A60FFC1B678FE2C905
+  4: 8D933E18052E7FD1F98E5E7D02384DA60F3E743801032256282AE2CA
+  5: 21362A65B49C33568251CD1366EB13A4E683359855C00F3AD6710896
+  6: 1E1814B72BFB185265AF94FA622E4A1A70826C06F2BE2EFD96E4E168
+  7: 118F2E1C2F1AB8AF2BD17842FCBFAC966F5B21A81996E3CBADF76442
+  8: 2C6C72703E33A20EA0333629503EBCC41B64DB829064A5C7897C465B
+  9: 794046ABC3BD8165D12C2453FFA3FC518D1A6498A48C91053BEA2966
+ 10: E6C3B6E2DC215702960633C976B86B8378D7780FF884910454032C7E
+ 11: DE7CFF6E85D9411FBD58B28FACF72DFDAFA115614BEF3119F6527104
+ 12: 11CF7495ADC07EC29EAA7B3464F772D49999A5E1832F71FCE18CF7F1
+ 13: A7541E63945FCAD62D2570B015079DF0422E96075986B45772860F38
+ 14: AFD3EB7EBFBA79CC68E4F6F6A2D758969B5C5C014FFB53CFF21C2841
+ 15: 28D942E37CB92EDE2E6F994E9EEE2BA01077D099F3562FEF97A8CAC6
+ 16: 34C7562962548AC9661759B4FC347D6A82CD47991EA06E855571CDE1
+ 17: DA76FA12D69D1FDBA5E544495BBE45F620BE147B73D6AA64D3B3C298
+ 18: FBF1911FA019CB7ACA20E3F93ECC0D5E8D60DCA0A1A7420C63BA1864
+ 19: 565FEDE0EE20842B82D59644929C2A1A426E397B38FAA772781FE018
+ 20: 7B9C2BA77B2989904F194021D308089E23F00954275AE9AD87306A31
+ 21: 66CBF93ED8071FFA36B61F3AABFDBFE714C3C055B2FBDCD3CF369025
+ 22: D96F10ECBFAD7FDDDF60BF1511E94869ED1D992051539E50D5F32831
+ 23: 5473F93F0D979D77C3C6B9CEEB2F3DC1058D81401669EF4AEAFA17E7
+ 24: 5B5A75A7D99C1B40961533C345B95FBF0AFA916D6E133967FCAA15F2
+ 25: 2A1E50E18C37AB7BD928AE14C206FAC9B3E869173CA337FB9374565D
+ 26: BF2B241659C96007ADC25D9567947BAA740555D066636731EEAE3C97
+ 27: 6E1E7B64A70B190BEEBDB9DA82C8E4B160CC73B8FFA224A6B92180B3
+ 28: BE36A5F8DAE9294B3995D278CBE9273E66F04D46890B44EC55028C3B
+ 29: 9983C289CE2F806F41182752A753E0A890217DAF3778B3AD2ED6685E
+ 30: 8B0F08EDF2CBE25E8F9EE4D2948BA6BF81672BF4F509530328A8BAA2
+ 31: B65FB77E6CB86E5F409EAC2F1B5A05E1910213563F816121AFA8CF14
+ 32: 5D15E17C8C159EA5DF5F126B12ACE777EAB36A0082C57DF71E4D9609
+ 33: DCCB3D17C8756F2546B3E5B24B1678438959D83A56524415666DAE05
+ 34: D28DAB7CA715AC86BF4469D743A0005AEE0101F339350661D46A1684
+ 35: E7A1CCC4B2B300457DCC64534152119390B69610C7FF9DD3A683439A
+ 36: 29380148DA403AD5911C7BD52C783EA97EC306F2B32BC426C4D7FD35
+ 37: 56DF59CD635F025925A968591E60DF2CBAB22F98B67C78122F3CE868
+ 38: C20EF10AE9CD99CBB54C94C971780E0487899D7A810FA51A6553DCF5
+ 39: 5B78837F366097CAB6D31624C06B099BDC71286E3AD8873509ABF4CE
+ 40: 8DA09589C44E710B9F84014FE553074E72E0A86C9418EFBBE420D2C8
+ 41: EEE18FA2BB5A5CD16017B4621ACC4211EF7CD60613A8C879B0AFC0D0
+ 42: AD9670FCD043E6F91CE986E6F55905337248B72E7B8551AE72ED32BF
+ 43: 97FA4FBA4815DA49F6127C96C969574AA9543B338F93BF9171D2547E
+ 44: 838D5AC81EA6BACB827327E8EFE96CC2B14D92C55B40CE58F4DA181E
+ 45: CA99480DC8480FA07784EF02074453664DBC92257366514060F07C93
+ 46: 93B0E493D272470F9F274DFE4B9DDF183B26011090E15861FA21CAF2
+ 47: 770CAE487AE5890DC0B931EC17623293EFA5B22EE1ED496A37EB9FCE
+ 48: 6F1D5CA0446E7B82DA02847ED1761CF02D646E56FB0CAB9B120E5282
+ 49: 2A8A1254F6CCC3D656397A5F2D64C266412FC5207866B073B77DBDEF
+ 50: E8CB788AAA965ED87FF2C7B5F3107684326DCBB0E667217E0EA62C51
+ 51: 85BDB6D1486F27827D5870812BEEE2C3976E0DED4BD2F994BBEC12AA
+ 52: A14E0343FAD6BD78E0A8E3BCD6D0B6C83B1220FE6C89F57F44BC805C
+ 53: 2C60D71F2D4BEC90CF10804DCEDB9311637B34D62E9CB68B8503162A
+ 54: 36397D66B434BA744174DA541F080CF6582F10322C7FB1869A100141
+ 55: F612E4EA307F56447112CAB5D2EBEA7D12C7C4427D9155D4085687FD
+ 56: 9798B420980748993BC78E3601B8AEEE2D2CF6E59799C7B07B88435E
+ 57: 50BED37F1EE78FAE16D178FECEC2EBE4776C8E5FC738F9506E8AF676
+ 58: 2755438A9AC457B81999D9E1E479C36DD9AE1F920F5BE6D109ED7431
+ 59: F3DC2238B13BA706A048253F86B79045B72EF767CF25DC62F96DAEA0
+ 60: 11900A3154C4DFC49B941258A134C9201DFD280728BDB3F8BC7903F8
+ 61: FC584202454DD7C9258F72A6258E42F3C2669FD138FD7AEE6200C4CB
+ 62: 185355C13E146EA89387C332225DF31CF114AEC0BA3A5A5B53667709
+ 63: 8194DABD2F7A02DDDD7B752AB5669821519640EE3B0059FD333F3401
+ 64: 2CD6946C6DB676ED1EC272AE34735A0546AFB8D996323272C39A814C
+ 65: B7A344BC5EFFEA97AC49894A85B96F9B570E680DFBB28C76F7F9A180
+ 66: 9011B80655A9CC7964CBC4BEE1CC03074003CCCFF5DA553B289ECF6A
+ 67: 6BDE25371B7EA9ABE31A524E49CAAE40DB220E405463D93FC7F66904
+ 68: 35694194E10D0EBCA6758099D09C99C3CAB37AFA52FC4F4361C510F3
+ 69: 4E7A79F362D7AE5B1680F30E6770CA46FE6264C9FCA566718C01EF67
+ 70: 9DD18D21E413AE12112AFBE16684BFD4FAED7467A2FD5904EF0B493C
+ 71: 7532D374B66B1E5B17EB49810DC3C04264553E4C36F4550D1E860B70
+ 72: 35EB09C82A624B1E3ECD965ED8522E9572EBF26791EFA667B4DB952C
+ 73: B9C17DF6F2A6506FB1DFCF1A9089974C45760A438330AE7547DFE685
+ 74: A7DD0267C15B36D8BD1879F879E894FB9F33F254556B87BFFEDD71A0
+ 75: 68A354D120CD63A5D34EEE84B7E5E5BC1E5DF6E021F712BD4270B781
+ 76: 441DC4884130D48BA134E2FBA86AF643C8EB79CD1AA4688F82E0D3DC
+ 77: 17A3F16DEAFDBC1DA00BD14D9C24497BE765F41E2EC79578421ED8B9
+ 78: 8756A267D0CAD54BFC848FCC4D6B6C94D39CAF07831EE35324DCD35F
+ 79: 004EBADA70F19BAB48E6072E2090941DEDB5CC0A7B624E4BBB671382
+ 80: B7F8D35CB865977423710FA1E0F939808E68ABB54BD7EB0427DA03DE
+ 81: F3D0AAA2F912FF95251D3CF51EBF79B940DB56839DEA8BA5872D1FDE
+ 82: 0835B2DC376BEAE873F1FA337D75C72FD1BF0F72A81669AA891F2722
+ 83: 7CF9A7D57CADEC3F013D4BD87C00B420CBFF73670A9CBB072D18EBEB
+ 84: 68AC0A34930329F5AA40137987208481E34D8B9C08EF7A85AE3AB38B
+ 85: 00492F706D84B903D5355FDC0B68C2C33B484A95A173FDC4AC945028
+ 86: 6F6C509CDCC84CE1C36AB76C9BF30E4422C90C869C164C64696AB5B7
+ 87: 4C0A35D512BD0DB15915DE08FEA8E6027063A1780C104F6273CAD5C7
+ 88: 27087F6425878D64A56BD5ACCC0E303F803B7208F20AEFEF75501F03
+ 89: 4EF78140430EF60F3CA12AAF8132674B0DDB154F495029B4051C2A36
+ 90: BCCA3153EF93AAF21CA02D235A23D3013976295E704223CB37E860BA
+ 91: 20CC8D4C64E09B00ABF23864BD7EDE542F5BE480AFC4B9551B301EBA
+ 92: ECA3F86DA00098D91F866C58558BB7B00C9E4239CF83C5A3E76291B3
+ 93: 7AD9AB198858820D20373C45173D76AF8D68F829D9A250ECADEE0DA1
+ 94: 3E1C202F2D589BDAB015306AD063784E5BEA48AE8D1DAF45D571D2FD
+ 95: 990C44330D56EBC9EDD951F8CB92D5847F4BD3C6442906F57A828FA9
+ 96: C92F9FCC6220EDEF52B6F842635A83914B236862F6CCBED16F4899DE
+ 97: 0E41C85D5C6D625E1884EF7438DD9EBAC818AB50CC265A73165928D0
+ 98: AE087D57F9CDBCDF4DD68A3E8D5BDFEC709A532A4A646CB31785506C
+ 99: 4CB03AEFD24C833B5350996EB261E803F6DB698FB81F37F8A5C3D891
+100: E680BD218AE972999BECDC905F4D39251ECF49B29CF0A13AF5FB09A1
+101: 64326D6B692B0A17045434BFF13282ACB91E7B690339F7FCEBCC9AE6
+102: 20CD91504AB04E2D3CD849808F2362943BECB310F4A0BF6E3BD47751
+103: 80F607E2D79E1EFB0458E47C8E5726CDB8387BC05F42D6EAE3239A20
+104: F83C023D6F539967AB24309DD28321599782ACFCFC76B77186307300
+105: 70164A250799DBE6C5BD3EDCDEDB16D2516A9FC1BBA294C49F753824
+106: 1883397C9C4C9D33FB9E1E03325EDCEA1606D7ABF86C4387DABC449E
+107: 1355DFA06822CC1F216C131F2BAA92A10BBF109BA3E648419A35C0F3
+108: 9E35B9B307990B7D664B9EB7F06EFDD23037F859ACB6B96A5287A846
+109: CCCA26C8F8405FF62421558255F2DA06F73F17D1AE1763A0BF8430DB
+110: B4FAE909368405206333491674559B9094DA4C48913D9EACA28AD75D
+111: 3A5E7D9273F91E10545FE6861D4FC223A5EB0F7B4FBFBC9931634C25
+112: 96553CF0C5C6F6A17FEED04024FCE1D292C392E60B3595FF53007AD9
+113: CA9B79F403412F71FBC10E094B35088576EB3F7F8B5D08757D89F45B
+114: CF60CC5B1822E4A12EEB3E1E5F4AA79E345D8C8FCC546D57DCC7C784
+115: 807D65C33E74DA0E2D5E3788084C61AE3E8771FDFE643D1269A7901A
+116: A5418DBCA94A1F9692FFDB3F7AEED75806CD9FD47171A6B67921C0A8
+117: C2B880C9E9D78B0C397D72C8B6684276E8C22A7F4D6821DB7C998775
+118: EA447EA731673E5DEAB57012CC9E0D3A7B2443165B665822963FD6B5
+119: 0F6D50C04357DF9240802977779D7F2214FBDBAE95B6D8F59B414964
+120: A3B24B29B29BBF32A01F21FFF13F44FCAA5FED50718803AC3BAAC548
+121: E31E36C38A7F2525ECADECA047533830A9C46D609E297142AB3DACAA
+122: 592FF0C399A6CC1606FA3F404DA4BF8618A4DF159CBB7E05DCD30BEB
+123: EEDD6A5902091ADB8EF491F820613740DA73A160D825121912613DDB
+124: 3A2FCBFCB007F45CB0EEDBDD5A765EA0CB7A142CE3C024114D6D61DC
+125: 5D29E1732898854AF468BBFA5B87065BB811AF8F55C91E82E888E842
+126: FD1F646D021EF31F634EF5FB0506620686B9F7D9B5C672734CA10FDF
+127: 5E43945BA9DE62C364E34CC1361FFFEE9BE8974D7CF5D2E06428916B
+128: 0FF4DA564729A0E9984E15BC69B00FA2E54711573BEE3AD608F511B5
+
+HMAC-sha256
+  0: D38B42096D80F45F826B44A9D5607DE72496A415D3F4A1A8C88E3BB9DA8DC1CB
+  1: 12B06C3218C858558CAD1DA6FE409898C31014D66CBE4ECD47C910EC975E104D
+  2: EDBEF6AA747C951F25AB6AAA0D874648CF18FFECC4C9159F8FC71E971FAC6D21
+  3: 03436338A166E9051599AB268CD74867C6159378069A9FF46FC07CAE375EDA68
+  4: 634758DF0774A587F3AC6AD7988D0965524DE24EBE4DFF07EF622BCB8DA71ACD
+  5: 0C08E52C7CFF8B5F70781197069DC8F209552D241687BA0D24661CCCC28D3937
+  6: 749F473E0D934694AB9917569A61591CA50BEF18CABDED51666DF243DE879D53
+  7: B1E12CFE0273F5D27192D1A4B70EEC4DDC714B66C8BB1921C63381F78CEC5219
+  8: 1C60F13A1C539788E989BAC2EBD4F8E126EE6ED82C2E25817C63B2B633FABD33
+  9: 5643F445B2C0656A49BB3DB5088C9E2E4B2082C2B611BBA0DAE5791F2FAA5D43
+ 10: C467F47251DAD4694C9C7A6758E54CEBD68FC933C7C57458020774A2A2B4288B
+ 11: 85C90CF2719BEBF40EF8D501FDA20C342BC406E728551BC0275ADA1747BD981F
+ 12: 06B72DAC895B008DA249B7B1D8A5133F09D86BF82DE2C4251BFA6C3D8C4CF03F
+ 13: 49EDB6714A556DF324E41A3CE5B57006E38FD7CA8B90FEEA2ACAB429204747BE
+ 14: 7411921D759DA0B491D6D4CC372DB79CC163F146C345B4A73D93EEB4C262A1DF
+ 15: 5C37FFBD1F0512AF443265B2F3E8B6D01AD9B45FF6F373D2CD0A7C6E48D03E26
+ 16: 773165FD16D51E51CD8A958E548902B47BBD0A6E156C31B6FEA036F6D8C4A90C
+ 17: 5B4BE909754EBC8ECBBB8B5DA6298B8341B35D92E17CE7281909EBA1EF568347
+ 18: C6EEF2D12F54815561EEED3426D7AA7E671E26D42384B9478D91FC6B14CC76F8
+ 19: 4C9FA0575CD96BB1DEF6EA79F5EC7A1F0478E86352812F690C2C2BDB70028BCC
+ 20: 7F87BA45FC41EC30E76F61E4EADEC013CE2B4C49CA6FE6D2FA525F6BBD45E103
+ 21: 9B8CA1D70339A0894E16CE4E76F6655ADDD3EEB598F3DD80FECC5EEEF3F638C3
+ 22: E4608AEA430A638799991B748BB858C91AF58F56B226E1901D28336B30498279
+ 23: AF4F9C52079B28546FBB44EEBA20C7AF0BF493D34EF6967B07CA32FC4DE25ADB
+ 24: FE51F3A9313EEDAAA991350AB4D1D7045D42AACF3AC7155DA3AD9A2F1DE3A73E
+ 25: C1F5AED9D77F85404A4B308A139D33F351B20C91A738E698BD8182F124D96C82
+ 26: 3CAC12A252B93B7D724AF9119FD3C18E85E88401F93BFF42AA05711B9833B1F6
+ 27: E61D4E94C212324A64B1A0C04B2237A9A1C5CC003D83EA80BCEB45452DCB42F2
+ 28: D01BA47DABCE4704B6820EC0ECDBEF137B9C4ACB80DC99B7C9220CFD9F9CE363
+ 29: AED502C53A8B2C76F671376CDDBD0596376B3664B917CD9C9ADBC489543D4721
+ 30: 3405AFD96584C5E5963362948D112A70155877BE3B5EFD479F226B73351ABAF0
+ 31: 5FA0290DC68B72B1FA27DBAF157923C706B3F52CDE9C4EE38CDA31D376B0BC0D
+ 32: C1391C694C985CCBA707A8C78AD05E2180AF6B4DA5BB877AAC5E2AB33B4890E2
+ 33: B018E7B15F92DBEC58F767633BCA3BD0D84B6D5B9443784DC1757166D7AA1C16
+ 34: 8D9E2C84967004E3957DF59D502BC11CF8C8959368117EC5DB56AC958A3E791B
+ 35: B0EAF9C0E869D7A304DDB30061A73C580B0A6F9D49E15442ECFBB3B5A851855B
+ 36: 0B48B0D8C3ACF7B4F9ECF8E46563C921B1B6720B6C650D72DD1126B6763CD595
+ 37: 8879D239EDB09F6606957D96A1F4BF37EAC0F3419881EEA79E8BF1364FB3FF6D
+ 38: CC663E436DE42E32EA110F9D90EB990D9151C9F06D51243D2076B0CC45361736
+ 39: 732DC3B1F809E55C498C53FC75A23966CAEA16BE984F795CB1BC94D026FAB30E
+ 40: F1F0EEC77D97A0234D0F19B2FB12A96B6E2FF8626F79A74D4AF26CDE1344D838
+ 41: 75C9D8C7344668C478D8AE6D9E2C41E336E7A2504CDD43B73CCBF78B4C05EEB1
+ 42: 4B149BCA6429408B242E76C52C4D3A0A5F5437EC0AB6D24D71EB1AC5496D75BA
+ 43: EDB65EBEBC0411B4FDAF186033E306AD500711CCB80E770E99523BB2672A237A
+ 44: D1BBFF5A48346A0DFD5CFFAA7A2AF08C27F3FC2908D7A5D2F575E07CA9E72474
+ 45: E8EFB6373DD3457610E57750738358A50026D2C6704A98148CDD69BFF7B70551
+ 46: 8E3733B729CEB97444BCCA405044B98F45FC59BBA86444A3FC0F4DF4854B5C4D
+ 47: 868F3EE8F4D4DFEDC3FFAEEE1FA069F5FBB2CB818E63C28151C1566634189234
+ 48: 3F5396115DC7F17AAB19A3A9779CFFCCA57DE7A7C1A42F748FEC49B7D8C2B82D
+ 49: DC2A5E3E176A693AD8CAE551A505729B78FBDE778B526E28953BC1A56B54840E
+ 50: DC91FD745E9A7A9D0B41C79B3B3939B84BDF78BEB007F9AAF8FF82084759223A
+ 51: E73DCF5413F17D4ECCEC813DC060EF907C2E952AF92DD247A0AE2BE798E6A40B
+ 52: 696B5EE4C1E1D8B60B0015EEA2389C9A35088022FFF10034D0D09FA722A2A3E6
+ 53: F86C07265389512B2CE240A89EA29D61C6C79C2738FACA157B0DE43294485682
+ 54: DB31CBBFD28D6F8564219911EFB748A5663E482DBA26E38634E8E27E3CF65707
+ 55: 2F9675313AAB7A940AE77CA906D0342A448FDBA3F7589D14B1344D586EA157DE
+ 56: 7D829FD994258EF2AFDEF22C8CD5CC1D29A9A55B62847B3B6F5DB630421CF999
+ 57: A6CDB9BC9AF75EA4680E895E8EDDCE76F536F7CCA571D62781A06DDB3424FA50
+ 58: 1B4186A34EB07F5B3127F2BE0F3943610679DB0F6BABC7DA03B416FA577D36E2
+ 59: 7B5DFF3459DC10B9B7AA2B2829094F97706DB5B2F133B8BF9F48D90253D68359
+ 60: 2ABB68160300028BBF3B5A414970D11DF4FD6F4B4A35029DEF8492ADFB19A480
+ 61: B1B13ABF9D20C42E755D63EC63C016126259C8A6C3F9AB3F0F6AC5D0BD44ECA2
+ 62: 9ADDD17E5CF407CDBB12E5E52A50CE134F1B48A2A2AF90D7308344FB5A70485F
+ 63: 6A4C06DF40BA515C56476471D4A94F87A2B91EAFF6C66510892F2F20A342B736
+ 64: 555D424206C003BAD0B08BEEA76DFC81B307C79BBB6E4F15325B2ECD37E04423
+ 65: 8A58733E0B990D0D82F93F77DF36E30DCFD03B3181B73C544BB097A3A73B6AC9
+ 66: 6FCCCCA4172E30A281A702E36E7BCA07370D4B57272385077A44D5F7933DD2FC
+ 67: 3B1A91E49AF88B1832F8E91109C7CC5DBEE2847D9ACD2A57404DBB565480AC75
+ 68: 69584075C278763CB0B09D4C9E15E9300A191BF99907049F14EC8DE24D86C121
+ 69: 2EE24340D13E68B10B95C3F77D55027F98BDE6BA5328D0C02CF89965687C062B
+ 70: C04B37F5932F427D40E21EEAB7C9594B16BFCF4F5FE2BF175CD63C62F2CEEAA2
+ 71: 058E1AC8971ADD2617A4BF7D02B46A8B74A4D52B25643DF9729A1E7DF6CCC86F
+ 72: 18001F246ABC760197482E25F3AC64B14A795E55B41B505D6027261BFDE7C52C
+ 73: 4AEAAED524B173E08E54A83E2D9A8B8824E6E2F1B89203D698E9BCE7C3242F8F
+ 74: 7D82CFB1D7427302889CADBA23A99154CBAC0C9ADEC94EAF29EB07DC86B0B7E2
+ 75: 18D42E92BA532A409CEDA8E3A07E751B430800827F5A9F14D93E3ED231BA08AF
+ 76: 8CFBA378D8595372DCE5D9A6E726C23512F84C0C1EC3C66ADF6B6C55DF63936A
+ 77: DE1A6E280A9054C91B826785928F37A16E1D2A9A3CEC831185B26D2B8EDE158C
+ 78: 920C40B4204C7F3D4775176BD245BA0276604C568B3C29943C9AEF1A1C93428A
+ 79: 935BB39E5FBCE5C4A15AC2A854475578CF80308E531CA86818DABE69BED8824A
+ 80: D608E561471CC09EC0865C826242CA26AA1C90BDF1625E1A38B96E3EE0CC5F04
+ 81: EFE2A8D806A1A71596A05A2F5F48D18CFD4A742247B04E8089FAB27291A8DD50
+ 82: 80235BE35DDEA5D49F124D8BE3D143F87CCBA7D0608C7E2CABBAAB01BB95E477
+ 83: E9410E0DC14F3BE36A49A5CA673C12E18CBE4F0817E0C1CBD2069349F8A09BBB
+ 84: B2042A81A36F27B4CB96DBB52A61F701A815869FF5AA0CDCAD0327E1ED1C2F22
+ 85: E9E5A9501B24952DCFBB9D59CF95A9A9E6A27FB7315EB472D1E2B7F523D06D42
+ 86: 99193B4FAFEFFC932B261EF169250B96901ABF877424FF667CC0DA0154C50498
+ 87: 1D9C7F7E681D20E1E0324EFE71C8B6913FE8CA87EE52E443335115AB2C458E7F
+ 88: 7308DB7E2591D2342109C5084B1174F07D289FBE91472FB2D8C06DF39F826B84
+ 89: 90F06ADC29070DC50A23D3F093007E273E783491A70A2F0AD6BA40E34F02518D
+ 90: E676DEEDC972019F10FEC24B4AEAC0A97870E924F7B1D6D3ECF91EF38A2AC544
+ 91: B5DA3B40FBF373795E67A6338F9AC3AD742741F34048930D9336D429D02EE78F
+ 92: 6FDE20988863CE157042EE52065EEDA233BB2E6EC0464B9DCF2AAC1F3A18971F
+ 93: 428D4CFF477F0F0379F634D1E7C15E4CE6DA067ADC45221A860C9C3AC4235753
+ 94: 9EC80B57E921DA3F81D13B65AA851F5971E4074C96E0D8B64E50A7F5089C1FC8
+ 95: 9088151BEF766D0896A48EB6DCC8A09D151C3396FBF3A9FE193C5E7BF9030B01
+ 96: 86D853024A762536666316F363BB867EFE25FBD03BDD28EA7522973A1A1BD95C
+ 97: 007104BD935B532BA4702A78C505D67B41358A61DB8069585B91B1445DC346B5
+ 98: 5C5709F6202948E805FAC25C454ECFADFAC693955864494E511F0CD1FC9CFDCF
+ 99: 0B010F71C5323CC96D3B8DF71170968096E44969EA55B4C3DAC632D30D81D529
+100: 54621EC4F31CC7F6273601D81674612B44726B5CC4A76EAD2BBC3D32DBF62A9D
+101: 28EFE1AB745BE64E5DD7286C97360FF2D287F862ADBE44380F85E1388008079F
+102: 831BFA684C25542676AD52819249A10D9EF9C2505D69CC1397D0D39D08B39E5D
+103: EF7922C40CD96A47C5E7AE4D958B495F1D6954EDC20596E303CFBA43190A9EFA
+104: 3A0262EBC746A7C044C1DB043951F7EAC645C40F554898D3D7B2B7AAC4EBD396
+105: 1F2CFBA7275639A12DA7CD1986F920C47850DE3FE13C931618C0FAC765820ED5
+106: 7AC8913C0975101E187FDADDAC5B5EC467A25869C4E630EADBB42DD2DFE4958A
+107: D386591F326C91D274FE625A667B6F9F6F7D99CF56ACB365A218F1CF8E167A70
+108: 66286CB1B61156B005CBFC94C2CAB1A6694D7F123411B8A123F2ACD821C291F2
+109: 844D1038E710690050DA737D56FD6B17C261C7BE512713E62033384B53C40902
+110: 7EF970C40080F554851277F4E950C6F378B0A3DA3CD1BE250D976162F8A4EE79
+111: 9BC20A2B67566688BCAC77FCF30259F11D9B2FD2277D033E6AAE19E36058A353
+112: 796C72D95BBA1A4341C6B0397E165DD21CFBEF55555B35C717CE33B6C6ADE490
+113: 1E6A9C1F78AFF266EF8FB25C32C1FDFB4A0F64AFFD046D257470BF6DAEF61D6D
+114: 0E1AD927AD658C5E0321333AF8AE4ED69903B4F22C5DFF90AC93268507A7C86B
+115: 07B7A778E2931704E7FECA284FF3B14071E255A2B824AD0A2272D21448579CEE
+116: A8D810DF06368A0E825D6DB4394916E43E217BEE9303AD4096A8E1CAD37B8703
+117: 6A9C7D302CCA1EE170366F355D8F40AE3A20D28BFCB2BA163DCB68E08DACB748
+118: 40C3A8B08FF9F767491E4243D1808572FDAF1D8CD21AB47115849531513D0750
+119: F26EA6760AA80360398371855783815BCD34431E0CCEC58A34A67997ACE43CEF
+120: EEA78D68A509988ED6D7E3F27FC22F3EBCD570EF0FE242A0251457EAC4C3C1F4
+121: AF977819B87F2E63C0E131DFA2A31C555AD831ADCA6DE0FC1BE48D21A1E7E666
+122: 846A75DF3691B2BF224FB0E66E360A2E8BB1DA32422190F2B319B73E6900AD42
+123: FFA997FCFABC9FCAD4B58B0EF848890FB23B974CD57FA07223037450C371B116
+124: 0028C776965A0AE5E9E70D9B833BF328BDBCD06C5A12A2F1C510911E60AA304A
+125: 7FA234C59957C214A7BE8D1B909C540B48E54414EE5FD1081B4C339FD2204515
+126: A840BEEBF2C2E80AF2E4830BB26F71AEE48A9C65DE4A9425DA9F98FA3A37DD84
+127: A95332415EA29A8CA6FDB0F771E3F2262C6907DC45B0AC8BC229F6009323C3A9
+128: 8B185702392BC1E061414539546904553A62510BC2E9E045892D64DAA6B32A76
+
+HMAC-sha384
+  0: 44BE81C415D283AB7A62A45188E5DAFBCB97DA606BD5B16C92C1FC36F198C0B3A714921848D5E03DF1C4849BB8310C66
+  1: C1E1E68D864F758941B87E30C262348B373F167CE4629E4117FBA208773CCC2E6C7797AE5D6BBE2ABE6BAD4DE2E1052E
+  2: BB27A0F06A1BAED5AC4FC2267C36EAB663E11EC5F0FCC0BDC09B9B0E803B0ACAA2F39D2AC73DE489FC7C9AD6DE3FC9C5
+  3: 70A273A2E9E5092EF8D4C58E99734A911B7CADD48954FD518305313B0B682CFCE192018D4847375D7E311470D05D97D9
+  4: B4FAF12B325B486B67E38A855D18B45D1BF6CC60E4D00AAA6E58268F524CC1121AD3EDB64D6E0FA524F11C0F139D0BBD
+  5: B509A325F561CDDC539A3A4680380759747709D428B77E69C4CFE926F65B147D92D2C83692F526EBB5CF606AD162559E
+  6: 9A1E678A743BA285CE154ADBB555CFD097F5839EEB2DE4147986464C1BF032BA0D80473293467ED0A0AC59BEAE736598
+  7: 1DF214529464666002C1AF094BB36F0FB14A4923031B108C21825E8C55BF6A0BB34C9AD7D5030B2FC7C83A2CD4C79C1A
+  8: 86D8BEE44CAC35CD3946321796599F20F3A41BE28F161FDA062E4440CCC16E88BC7FFC714D525A6420CDBEBDF6AE9E12
+  9: 92417595F9974B44BB11EB9200B7560FEA3382CDCB8BA4C2CC5CFDD019C2B5956D3E78D5B186633ACB765E822B3D4E90
+ 10: 2E87CF886036B7A66AE6581BA0DBB9AC2A39E1C7C7594319184FF3B612A165DC02B3A7133E3AB3D29634B1CD5305A46C
+ 11: A5CEDD2B54657832F946BFBA14ED5106E8EB5937EAC6C5405BE5CBE7C58053514E784E3F6668C20466A242D25A44462D
+ 12: 74475D913659C2C304BA49DD2B39B0C7AD7D537BB2240D8611876CF5955B347694525396C43CA73951E711DA38C6976A
+ 13: B0AEE82D70411F1A79DD7012421BAC1202D7C3BAFFA15B4D8B868A3E6F92B513F6B026E2E8FEE45DB2AE70C15E11D19F
+ 14: 7D06EA64FF5B9139662FCF9318589E8FF1F783754A9116E090B0B7A981A9EF1D4C1BF582C8EF5E71A49DEA2834447287
+ 15: 8F52BB9B0A2B1066AB67603C552C17E983D15114C3B9776C548D747F7E24AC782253812802EC456914444DD67C0CDD46
+ 16: 9DE6587211FE4A232F01D6D20554102D24D98EC140A05303C1893F232BAA2C07C81A10C25A95A50B38E87898900BBE1F
+ 17: E0175EB9DB2649801EC2EEA9DE2C1E950C129CA249C14326614E0BB8C32AEE67DF1DFC6320439DAE4FCDB4B037A53868
+ 18: 0606A848086DDA50D031A585103478EED0259A9167959657050F8D7DD21B4D6B62B93AEB0009B1E878EDADEFAE9B2ADB
+ 19: D4A45DD1A6B613E3D2D72B35E6030E1531D75AF7C3F100934CF27EE9D0E0F0C236581EC8EE74FF759D7A19C5AA6DA9E9
+ 20: 3E0FD11AE4933665EF30E10035B0E686DCA837F6D6FE2D5A10B4EC30F183EDDF3558309905F028DB93323D09A3A2F3E9
+ 21: DA2A204C7908FD27A29415CAE3BD16A0488FA1D42CCFA2E2F5A1EFD6F99583EC6B3B36762060F547C629B9A332585355
+ 22: FFE8FFED47933CC941A8E9233C037080B9465B4F9C25DBAC790825C013545D2344930E953187C77466437BE226962F80
+ 23: 69FE734D5C69F34366E5CA6B095DE91CD4DEA29AD70BEF06AFE9BB232162E6BBB1349263087212AE3AE5D74A3B060F50
+ 24: EFCF1B825AF87FA5199FB3C76783CCD1769E7DC77BCF145DB76FDC622BFA2425CFFAA40E6376086B2DBF6F5D9D97A534
+ 25: 98C3DC50FC08D2A87ABE3FC16871ECB820D530B453C41F83FD304D51660FD29BEC6A7D1C63E3E12B6E80E8C58CB129CC
+ 26: 945047CD723EF4F25AAAC4A19FDEED463EB04CCB78EA318989143298DFA70D793391BB7FCEA6BE0D79187543426AADFC
+ 27: 2718D89F835037C94CD6378A3806614B85365A888B48FFD08C09F0B93360C04E43B7E7A19C79BCDC5DB9F5944579AB79
+ 28: F714F16238075796DD43960E17AE0EDF9990132D690F44957C3DE9EEC2773683172FDCC44ED2104320726BAA7DBDA1A7
+ 29: A87A96ED8FF0E7FD1F235F070CB5F14B41B2C4438A6D7A0A39D038C74008FE9C52497CC506498414835AEA1192439379
+ 30: 31B029DFA85DF545B752506E80675E617549A6725A658CA8123D8C837FB71D8C9961BBC2460D7CCE0CABBDEDACB56C37
+ 31: 0B1A9DD308E5E6E65E4C60861D42B628FBDB2C2280370EFFAB736A77A8004C5ACD5269D090B652B1D8F146C1D518D288
+ 32: 2A160E0B2EC7BC927FFF813A2B56AE61301AA14933C659B3398C7A0B3CA506DD00FA6F1DE9C6D47AB0FB2BF2E7B4B83F
+ 33: 6893C0205F3F4ACE906F2FACC97E2B1624D40997370419E5981E6041D5CF34C77EF5ABDB1AA0D3C8C3740100C2711555
+ 34: 95BC8C72DC8C70ADB7CD38311292ADEB9D7BDEC6A9580EF4E11A18317CB65667D344D8D6603C044454E67F97F4DDFF40
+ 35: 3DD892A4E724376814DD5A4CBE96E4317AA8AF72478D53379247E77C35461BB92CF493851FF1FCF57A6704923099DFEE
+ 36: 3A5DEAF967BFA3EECA3F259307991F7DBFCEC1F354DF385CF0EE8D93291721553EA954E9D6593506E9F3E330E0A02574
+ 37: E00A883DCB5460AAD611603614C7214EC4A566E0580FCAB1CA4ECF1386A42DCDA746D3AE1B0D54E0B9AC1FA336FE787B
+ 38: F437CDEA425E7A70CB4D197C0CA01562532A7C51FFB8462B4796A4FD0A7EC880CB0E5EDDD5F703ADC179374416592256
+ 39: CE69E40F5B5F2F25E0B53281BE76ECB0E5B4558292A1C1A5EC56F2CF11B01BEEB1F0BA01E6A9B3D03BEB69AE0511F320
+ 40: 41AA84D15342CD0675C8C0312C024352E99914C3E01C98F969AD04CB5705E9184F3821CFC6A22D43A77C928F6DB79D8D
+ 41: 74001D972353BB45FF3F7F405FC727CB5D0B00431BC76A57EAF17862BD52949AF884403ED6B2A002D618EA33523DE200
+ 42: 968BC28223799F1EB92F1432B6AAF5CF6953491C3F959977B065BDB800AA438CC8AA7EE1304C18999CB5ED709431CFFE
+ 43: D067EC03F14D2D639C4423A311EC86B3DDC3693A2CF43C259BD0358F8D0D68F41950CB705249A59072A2CE7DF155F5C0
+ 44: F41EB77179934884DDB56DCF83DC90C606D0226DDF94135FF8E1E0AA56C9A90881C4C380CC0AD3BD0DA45A6352BACC05
+ 45: 27BF9A98F9E2732972FE2F35ABC80AE2E5A2BC1D238B9B1D9CE605A89144EE9766987384EBDCD63533E64BEE094E4503
+ 46: 166892E106BBD9D16819D9BDD3601D24C0C11860DB13799F0797F204D07DBE914A7BD286B380EFAC34DFE3C940CDD3BE
+ 47: 2D85DBCFC431A94F8F50132DC8C10B25001EA10AA9DF7C53AEE9E8383EAADFCECC21202EFBCA556BB4E33CC68156B190
+ 48: 086007E2874E779A5EDF0E176AC1A11D241F4AD8D02AA99DF2BC1AE3E5CC4775AAA92ADFE772CEEE89D4FDF1B601D05A
+ 49: 2ECA3144F4F9EA0F37C2CA5943F458590A1D4D19C0ECEA6A55CDCA648C99CD457DC57EAA995042D7FBFAB598B8AFEEDF
+ 50: 9C1F31F5D3A589631D8B7EF89A507011736BFC328071513D64E5432D24B1BCF47EB10139B6410A3103145AF67B5B6C46
+ 51: E0645EDA004D9005399A2C072ED9959E4F8905D15C57992553202A3B53BCFEA0098E6B28BE047A4B29EED7B57602C0E3
+ 52: 6CE5CA92F0B1E84D7578DDB86C96A10924601A3680BAFEE5A0B27D8390B59752205EA483832ED3E9343DE7175601C03A
+ 53: 47F50844C897FD910C5C228DEA1EAF456882C1115AB71DB15E6832D96607CB79C8B7AD1CDDE01966FCDDAA0B0BA9F264
+ 54: C0A7EFA24590833E4788BB117D3AB3CE00C84CB4820AD9FD7F03CF1CE1A8983F9906BDD138E1943D75ECD9B98D5AD8D3
+ 55: D056E9F831B6DBE97FC751453B1C52C8C6C4D18A00050F5AF2427C1123706375A918656D6755A4C950F4E5B5C318CEBC
+ 56: 462650CE3981EDD13D0FD2E5FDEA93A9A18CF8FA74CD6142DF4707E604D1F72745D7EE08AB13AFF3A9F8D166EA90CE3E
+ 57: 2BA5249841412584B161063087AF9F5BAEEFD97989BF8A0455E65C94B0663410F0E1BB22EA6402E59CBC5A23F24ABBFD
+ 58: C3B1E4B05A7593CC315AE15F63CE8D91C4B30E0D846A97B7D8F01FAA1B6BD7C9234EB153372F6CC7799A035E22A77EF6
+ 59: 1E652653B9A3CE862DBBAF2C919E86891C5C03F54ED5970E8028F8D5EFB533B9C111DFD88ACBBDE516F0D4D636F5E821
+ 60: DA773D5AAC336B6266D27A03AFDF3A151FAB302E894CC1D09B6E4ECD07C4AF4BE06A2D28D01669C7557FAE8E513D01D5
+ 61: 8C8FE648A29D4BA78B3E0B944597E392A31E28F98B15280E1EC0A721C9ED5E3639A6A457744CC5AABFB3600501F5054D
+ 62: B443DECF40A5693F67B5BF5580A665DF6EB98FA9F14A661CD50D6635E0F78FB2943731AF363839FE6DFC0B4C49F9E849
+ 63: B22EC4AFEE3EA69364701E5621E453A0C3988C1E2FDA54FDB99353F285327A534F7162BC54D701652744413B9A5D4CBB
+ 64: 40A22B7881AE8139941540540FB37C9AF27BCB164B6D1A3BEC709730BBBB413D1F2FD6BA4A7B7EA747FF45F3ED3336C3
+ 65: 246E426C57E414575DF312223272819B0F49FF94953DCB94665FFF74FEAB049AF15160706AC5F702AF66478CF2BBA5BD
+ 66: 184E6E6D5FB55454EEB6DBE323BF28DB8CE60C271DD0ECC8BD4D3F1C2339B7828C1515F030058FF37BD53568FEA81378
+ 67: 10B23FE1616AD5609F6F6C1D9266F702C1B5E6F7FA0B3A81406B5A766E2179D082854687701318A7B46E21FA67D2404F
+ 68: DFCC1280C5206F99A555E291AA1DE6F0A3AE4B49916FEED4337582B91D7EF094159556B01AC87BF7A8E84F9F53595938
+ 69: 91BA9A641616449084A57221647369E2E69525A30B274EE5403FE95A43D0A7C2B301B61929D89222A3A03303550521B4
+ 70: 94F59A7F5E68B942A5D66D3C642A78685F3BB400F4FF971BA576DECE94A353455277632B70D06EAE38329CC2298ED792
+ 71: 21A9F5C4B1290D95A1F3F051A0158F7DD8A879E7861B61CC757FB5C729FE9A8BD46BC6DCE595D20649092B31AD27433D
+ 72: E4246F7DE67C3A08F18852F6159F5DC9FA4C0129A9F894EB610C10F1FB8B61B1C9947D742A418F03A00A7E11ADF436F3
+ 73: 8D2CE8209B8362311D99D68DC2AAE6BE4CC8E52C03A97D99D0C5C15D8E24F1D3B51738BD27BEB6E773472CD22A1225C6
+ 74: 7EAAB124A3C900F33DE06B84E7831FE327FD638C4E68DC8648EB619E3C7E5736A26BCDCFD3AA6AF34EB137C6A210746A
+ 75: 8B60F61A1AC2C6528C8DB07B6874F19B8D474859F98AF03503B115EEB8082E19D53F63D397647BC2D4278B8C2B741D19
+ 76: A48D92BA646DAFF7D0F8CBCB1D574E9C19D396A30573A7404F6196FBD7E226731C8AB05138F7B1936986DE6C1F1F7B52
+ 77: 2C3ECCA6E7AF0F9587E5A03D462C98F18B8C13C039D02D2D29E06B5309EDC82052EF72C94E0A5EB7FD35827665CA2F92
+ 78: C9B659AFAAEAA8778E9E4E3B725F758768963C55151A54BD9DC191E1302ABA1F1F085D5443C46441793682A8047211E1
+ 79: 9A76E83A301C14AC6AB8CFB29D2CE39E0E86B335F2B20C3C889651B4E0B94C5218E910B1DAD28474251D06D12D47072A
+ 80: A526CFAA2EE981A9A4D0EF12A6FA363F562057BB75A218F4645BC5E9BE7CFE7EADFD87386AAE1C607D812772498ABBF6
+ 81: B747819B54CDFEAA751FB9F5C22FB269151028BFBC6650BC518692944C5F4195D26AEC45C9B4C987ECF4076B3871C5CF
+ 82: D45968D452B5349CA43A0FDEFE4A5379381625825A27259AD9BF5A80C46CB07BF1C919FB3ACC250D73238B11C3A07D90
+ 83: C0B8AB0F8C497ED9562C65091DF1D80C32C57A018B00957BF53C41DF81A2F6371FCFE82624B2E84859114152B36B6AAD
+ 84: 30D2BF3DA80C0F37807F042FE7B878851E0BC4093D987438FC2B993F4CC4AF6F704669938B9E30E59BF8999883639F64
+ 85: BB782ACEE42930922A98F65F319089E9B4F5D2DD2374DD76035E3178DB4468A3C04F5EF878ECF9ED757DF14DD89BDD49
+ 86: 157424F30A10748940BBFAFB6D99B1B06A897E7DAA4F03387E5ED03F02D39AF59F96A20E4E9F3A4C5C07C20A8FADC8D0
+ 87: B9ADED711B1E1537A35AF882F1F868D964B5898E85B07F5677DBF183232F36C14AF4D9959C2108D9313F8BFB14830B02
+ 88: 7C4563BAC3C05444C3682039EAF9F9EC79B96F0CD36245F584647BC444B81734D7ED4380CC1F0A2BA876020E55660BE0
+ 89: 9811A4A45CB28A780C063047EC6CF94328102DEED9971DB99E11C6FBCFC046EE38C1A00F290FF64356B9A304DC0F340F
+ 90: 09A69D3255EB08E9B3CF7CFA73D86944CCC91DEEEFC04214F8982836726CAF006A3FD83F8FB75600CBD060ECD639C388
+ 91: 52D6D0943728CD2EED671736B6B3BE801B811410992E4A3BB50AB4269EB21AB945F6A9F7036DA654A7F2785869335395
+ 92: 8C0E1052EF2B06C0C20F67D92E51DFBADF3655FC6475935426AE1C88F3096628EAB9858E5470FB98A546EB11C7B752DD
+ 93: B21351AF8400B9756F104599BA4BB78C2904959E2B24AC3E15FD0398627E6C8D57A7F9FEED63D8638A206BC1683794A3
+ 94: B9F7CFE97C79568D62B07F1EF887C4391B48CAA669AA8495B71A326B120FA49652F02EC0D53441DABA1E104AF091E0E4
+ 95: 69D2D1773208CE3BF02B38A7F14910187F3476817ADCC7A1D9830C9F25F112E604AEBB95D0237AC8795DCB23ECF52927
+ 96: 57A9FA7CA61FA2FDBF0BC3E3E6463901B3B26E5D9AD79DFC0CC77F79EF3AA1AE3949E7D71CF794E067D2E38E7038EDEC
+ 97: FEE9196A0A1199DA8697D00AC8084D6CA1F867D105EE928FFEE14E5E36BEBEDE5C79509CA5BA05E36C3F0BAFDC9A755B
+ 98: 0E8DAF8BA4ED614B38808B4E468CDF88EC9B148017C6BE3FE593410D37D9B50ADF0913B7844FFDCC2F1917A27A58B352
+ 99: C7FD40463E26D6A21373EAE14BCB7403B127A1E23E4583B2AC727106B07B849F74C0907804AA799C05D9FF324D04B182
+100: 16E899F4850512FF3DB0FCC58FEA960831364E5FB077CD8DA3F5B3F0F50AC626601917E8355E4847A00E0A5166E786D8
+101: AF2DADB17605DB3CC471C00D63C42F75F815594C1B49D9396BCFE7ED4D4FBB1CF15B542675DE8C9FF50EF81B72FF72CE
+102: 1699A1EA2CAC707205A6BFAD8DFDAF09C8D6FCDDF2BC14A9678453463AC80054627F2C39B713861734B0974F442D707D
+103: 186DA71D7E913DA49D8D97101882B1282841D41CA12F514C1B2DD61543E330B751E9F97490E18A4A37FF1853EFDD757E
+104: D82050038E6DF6EAE9D2D4019827025A25BC8CB15812E0ACF4B676C799A3D80ACAE5706C0FB1FF72B2C4851DC9232B7C
+105: 1657C99506EC8B28AFC1684C4A9EE4970F8F426E4BB0C3FC2795CFBA82913B453C87D84AE9B32897A4CE26FF4320CF23
+106: 9834E936482592BAC2373AA64806FE0D5C8FA92143070C61E594004F0D3B8516C2A5B0244F273124E83B20FE9A2CF5D3
+107: 5C4856A82C8E6E49BB81E89C26E355AFB75EF921E579EC4B97868BE2CFB4B1D93195ABA0500D774C5365C2269FF333A7
+108: 67B88FAD5085C8BAB8E194DF73153A5B1D334431227DFC619D5CA5D5605EDC7BC95DE33512B2F5B714F46F54E1E61B0A
+109: 90C6A8F36D42C5F21A89417AA04D822A53110DF1D062E0C1A6FD9AE59C6588CC1C78469B94578B6D7C05EFFAF7FEC26A
+110: 817C0E7ACD548BD3733792F4F8D845D7E4B3CAA0F0EA943B51235EB82DA7C8B77A733D756E86D57EA303F34BD97BA1CE
+111: 7FF397FB43DD909AB80BC381EAA4BD50B7278DBF10F39FE718B421D6C07324F398BA5B1DBAAC64137267DE2C62F19F7F
+112: FAC12B732122E18DFBCF8DC7382AB1B55353134F07E07723608825C907DB05B4FDE40FE550878D971F8B0B0953C88C54
+113: 4DB0FA3C105D64A9CAE84C0B5D7AF0955F6F58717F68366935FF9F478E94D3969B1264B1F37F8F5538BF116DE29438AE
+114: BA6E693A6C3C5B048FB7F232CC5E12CA71662332EBF689AD75F6F2C54715A689CB1F75525313FB8B2713909EC13EE0D3
+115: 00BA656BEA25DBA36861B92B356C3DEE0DB1C86D4503C7FEB0A88A3541A7018EA456C95224EFC46AA31CB625421BC811
+116: 812622078CA3B4F59141569A0E125B36F7CC471F76B7B65FEAA1F1F656BAB6A3CD61A4D2456E2F5109274B2090C1F4CB
+117: DBDAD8926A811DD0295C31D55AE0D41672C7F22B5CAEABFDA2C1505B084AD01440E9B8FFDA4DFCFBE281222AFD547E29
+118: A32EBC13D689B31617D24E6AC03CE6FD7B1AAA2BA78CAE2E24C36A8CA7BC74ED9BD4CF6C74E3C96DEFF048FE3964F0A0
+119: 095D2C8DCF88F69DA4CC49C64B03B2A1D2C6922CE0C6EDA12642480AE0DF35152B4E4A9AB08D6642DDC313C0FA01444C
+120: 578A4BFC0CA83F1B38A0D2EABE2C7D3D67436B559624B92E4FBD9241B2CA8C1AB679B503A754D5029314AAC3AF225F38
+121: 25E321E63E4AC8994FA464B3E2B687150007D83ED8D6E1B217E86B0CA0D163B0B9686E4FA2F26C1839F2D778EDCED86D
+122: C761BA17FAC3CCCAF2CACE92283DC5E5B8A6571958FC59D0070FB21CABC88A80A40DCD56318988F3AEDF38AEFBB84EB2
+123: 5EDF5D71D2CF85E7ADF9C7E964FD628ACF304C4DE3483F672666A583E3D9B1D86E9E096541ADA237D69A140571F5B3B9
+124: 401702CD847ECA2BC9208F52F27D84D07B37A86CCA5C3A877F24366CDB9719DE63670E850F02CD02C6227B7214D5DDA7
+125: 362C899156DF70FA189A66DAB6DBB3CBF80B629D1E90D9ABEB007C3C5010277EA589C4D73009C81F94AFF3FFACBFCB1F
+126: CA43387C71B8245B822D3085CF029004E18CEBDFC9F78C276F3559D962635601957B6D2287089AD43F3179D077F37686
+127: 4CE8504297E21812C901E77C6680529103A017553F095913CFF06AF20E3D6DE7EFE911B636DCB5791B292C60147F6473
+128: 2AC71958C77E39D4DE4DACE92FBB6A093EABD191320A5ADA7114BD201DD026567D2B799EAC78C1F084BA9FAEC2FC8BD4
+129: 87487060C273FE18A2CF1DFF222658E1B50C3BC5A3F1F4575B3A4A6EA2F42238DEB68B3A2EC6A325E3FCA504B2E20E26
+130: 4A79A1C3C798D9F26D54715108279948EAB246086EBFDF0EAC9152216C0BA3A77AADF82A230AA84A7C884063960419AA
+131: DB0BA43960FA6B763202B8BDF3FE4ADA0BAD78EBB3E6E8E57C2D5640D1ED4CFB4AC18ADB1B9770DB49A4252CDD25A369
+132: EECE296E258EA3583FBCAD1CDF2B91F4D2AD1FCC1AA339D8F591F89C7ECB5EA2FA644954006F0A58F2F3BEEA1AEAF7F8
+133: 7AFD95C86517BB6050D04BF3BB1448A0608411B612A7C2A939BB44B984E361C40569E5E57AD7DACB018689C2B8E2B3A7
+134: 7FCE7894C8E8D1FB187CC35CF5758269E286427A63A522F4BC45F814B316C1DAEF981917642C50EC693F3EF4DB8E66E3
+135: F67F56C98221892F64E2AE4325CCB80C2846A43E1629D40BB50845184E9C3B66480B3E9F792389983F2FC48FD2508F09
+136: 1CD915561856936AFCC75530DFF151F49A34D0DD0030766FBC1BE47D611F10502BE86C97B91D0E8767D4F38913EEDC1A
+137: 80D9CC8B1B2B883C4735B3C0C19AEDAB78A0771753EBB4688A7E584BE7366B3C181C8532FB3A8BFC484C9CB0BBC1B4F1
+138: 8ADE2B8527C994EAB0807A89CABD5B075CACFEF42381DA3CC3D702316842E25151C65A22E80885E5CD5FB5870FCE501C
+139: 2B403F2188D086327C92169871FD5A7B432D2EB999FFB0F2369B2B766E799AFDC1463CF4D9941F828FE42591D6B966EE
+140: 4A0C18CECC0641C28C4136D42FABD0BC27FEC27C2587FE8A57CE0D279ADAD70F80C1E812E01B26F2BF3ECDC7673C349B
+141: 8906762B63651DD5948C98DBB1B39BD6095C1438B2E4CA4B5A581D451AD3EF76C8A0FADEC9C0B0036A833D8F5C13F1C3
+142: A363BF2A479F67F949AFC151C36B052062CC2CE840974BE2F5E79C0BFD7BA29008A6BFDB55B46527D17F61531C953081
+143: 4E2AC5D6EE56567902CC1E02F119E33974762C03885EB7DFF7C58ADE22E56BC384FE74BD491EFDB2E6CF4021E3016E81
+144: BDF0AFDF17F7B014A61ECE257F8C7E0B52384EB7DEF60ADE785F273851D645E5D3B4D9534C0E6097A12C3CFF5C11D42A
+145: 0CDC61FF0B3D8510C319020B82C1C5AA12C7B6F257D7D4F118A5EC3CCE03C63FFD38710F8A3C621DD8D66D8BF3790B63
+146: 19E35E1E785C7A41C523F88CDCD919EDC45F63783330D9033768546CF59D10AEBC77F013057C0E41D6FD0FE77DBF914D
+147: 8AFA5DF52F6581794FF014A2E1ABCB05781C7F44AE6F37112B363AB13FF01FE1E8074F14466A365374C29FEB048C5B9E
+148: BC9ECD12706BE5ADBA04DCE84AD53AE1B324F99C1F5937774DFE19C5EB4D6A20982E97B8F8E4E02EED13B25B8B13E64B
+149: 8D02A1E318DA1EBFD1CDDBB7280F3603AF3AFA21B3D4E0727C7CFC576F55640B7A978B179EECDB8FBE896AD38E82F12B
+150: 196929CF0849022CCE9CBE4EB2DAF6E5D8014C5A25E119EFF799A82053035BFDB8B05F6C125B1DBDD4E7B393C684FB5D
+151: 58808D04067FAD72BBEEE4F6A355E80A2FF76EDBB5366CA43FF358A842FBFA2F9E1AF5FF266BD2E2DAB1D286AF5BBF92
+152: 4A548031093ABA730D8D99A2C1C6EC2A986A94167CF8C1EBE83D52B34BC2068A4C95665988FA93F5246D0FBACDF85FE2
+153: ED949965036F16A0B5856EA4CF69CEDA35C653BB56FD0F0B397E73FF4884B3E679ECCB19B07D6A93504E82A1613CB87C
+154: DBA644B20B01E4AC5CD0A325CB063EEF53AD77E5A9E7095C1BE0EB0E6B7CFE60BF25F38CD57F2AC055D327EB6AECC7D6
+155: CEFD6165F70D9019866374AD7AF9C73F3041B932D61A41734E39AE8AA9C7A4FBF1DCBAE9B2A4E979C64352E3CD4E1B95
+156: 732C3B457F78DED89390BC461380760FBEF3CFCB9BF42A6C86ECF120C821CAC79D4D51C71A955309E33724742FE2FA0D
+157: 54803568BAE2DB4F143C78FF53B85E6A9D42EC3894FCFB39BED8EE611B36BBCBED834D366A1F797B626DFF3D83CE963C
+158: 35A1858E567FC8A11B92737E369069B12502ED3F44DB50434506F2E540FE643655CBF806C06F15CF2428FB408A65C04B
+159: D1F9E930418D10043D0E83096CF717B79C1C9234C741C59436F42737AC73BD39B3F4B6D6439375E0D44260131B25FDE9
+160: D5B56A1A70C47A3F88C519668097B54C989E119EE9DD5B8B34F0DBC092FE7108C9D396CFC62C9322563EE72A0E324010
+161: 1578BB76F87DB309A5D3A2229A2B346DE39ADB623836EF0561348ACA7E315C16C6E31328BC70DD0B0D7D9B7ECE076CE6
+162: F8DF4C71F3623ED00EDF8EFC4E0EC154644E21E78B06C9C5ACB980480732E17E92ACFA059BDF299BB6C8351C6CC6AFF2
+163: 090DCE25595D7770753B78C410F10E830140B23D779E0F52FC451582CDE7511A390450F8B65D7BDA77A18CD95EE3DD38
+164: 5D3A56D23BEF1324B1EAE33B8255F904F7DDF131517200A505031D41A2EC3F2AB03912DEFF6BCECBFEDCB8B948CDACA2
+165: EF712AC1E6859F70D0D2CACE7AEE120A666DF9F210512F5C94AA7FB388F1DDD913A12FF92CCD2537675EAEC870203411
+166: A0E6443505B193D89595A51BCBD47A46E1B5AEB239D68B8B18A119E5C9EA1EB8863B373F91B9F22FA944C29365406A79
+167: D97DACBF80BCC76335C187DA29FF33F6D35EA8A8925709322EF3C0F6FE35D128D9D423F911EE31F1C38E1DF36046E507
+168: 67FFCF0A9F88F84B3EE85000B2DE0B7DC12A06160FCBBB57BA291DC04E14B6DBB3CDB81A40C2EE1859956DAD097C1EE1
+169: 7AE82196B46DE3E6948D7FBC7383A6F080903D6BE6E357700A87F82A964581D375006DE35169446B447537B4F11C5702
+170: 502E0A4CF125EC0640DC7E7264D9E47300814B00D4322F2F62BC1D5F1D0D77173B0E7C2874CD59FD8E056B8F38F78D99
+171: 74FDBC4532534DBF24230ED5677A920B12E328E3D073364498D80F0CEAFBEC774EB53F28F0934F787C56AB794B60BE31
+172: 3C9BF5EEC652F40AA0ECB82A834C836E495E841D337E1299AAFC067A2049C540AABE92CAEAE02F099BC4D3A383D541B5
+173: 105AC61F2D4E586E376524C488C33521C4D49D1F95B752D27F49ACD7181E8FBBCA2E0F0B543EFC0CBD32A5EED2CC08A2
+174: 5CA49D8B554D70B3FC467604661DF8FA51D9987F2A77B13DE44D7809FE2956D21485B36F1D17B59F2261B1B40553FBE3
+175: 1DD075C696DB9B07510A0D276F8BAD12225E00515D19E3B85583BF97CF82B5FE3F685502F64D91F4FEEE1848BCD0502B
+176: 11A018C4B213BC67C09370C8A3D0B720428BE71C01C6EE9EF6C9C9DA8B2E1FBAEEE42FA44EE54D0F526DCDCD3C2BB2FD
+177: E188EC519C6E0B8A89DE68A7648DAC6D9F84FDAA678B431794EB4BFE077901C95FAE25CA3D39D48EA0292F3F6C35FF73
+178: FABEE0B0A02BA622931A5EB82CD63656B47A20D3C0E703D5A69AFDB92C0A7EC5CF6944D9D7A141C1255D60FF9532B089
+179: 3C8E0BB55E099CA9F6E436BB3CA39D511AB9CE5674469DF8BEA4A20193084AF8561D5130FDFFBE62193A712D7C2D4B48
+180: 914BE8F0A58082B877AF0DC077ED146CCD8245339A170B4099B146476B0A580749D01F83FB52834A033A3822D12041B9
+181: A1B31ECBF451571437DE10330A6E9AB4484576AADC4DEE0B31D9C3AFE59FC6DE028275126D7882A2C225EDFE491305E4
+182: E4DD2E805A5BDE3DCD329ED9D35CAEC2D5A97082966186118DC46BCA7AEB1EF52E0C6007CA28131790838DD8C00E96FB
+183: 785B81A972DFC6A4982E0BB76F90F26DBB7BCD2D06E872304CCF6AB2D639CAD85FB29124ACE411EA4742468A6663EB2A
+184: EEC3CBB5AA129C7206A32A176482C9BA24FE60E71B46F7C3C11FEF8EB57682A3732680E6541D5878CD6A715A48D75F12
+185: 254E279B7C4F17B911712BF7138E2C6933815BAB18661CB47388FEEBDCCDFFFB6AE8B4B88072B90074704EB7EC567843
+186: 9A8CC3FF0D9637220CF2B4AFC9A8A6CBA4D0ABEA6A0BAEBF151380848E92DFED8C0F0E57B6D05095EEAB0A58DFBAED13
+187: 349966E1D59BC9B32E1BEDB050354177868FC07257A3A1800F0E711AD00AE388746DB1E4591E3ABBAD8F418E1AE627DD
+188: 84ED950BE54768557475E6B1A256C30F444E12340C29485832439BBB9CBD219050D184624D6282728D4AFBB98CE4BCD6
+189: 2A7CA4EF1A9356E853329D336B6E7E033F2CA13677BEA67CA669EB7C78DBDDE67F9E7D9099C68F34E07B96DE4155AFF2
+190: 7C7020B0528F1B3F76BA258836A89BD27429110F0AB730FD741FE9EA2714AF827E71B731AFD53A293328788292ACFE23
+191: 91400ABC089F8888DCB22880B87A380FEFDAF81F237D424F057E5C4C8E3C8EE4E423930C1D3D9E16199ED82996BE4232
+192: 412979E13B3D143270BB41FEBC12196B981E99BFD6687B780812F409C78A5E2DB7AE828994B60D26CA4A1F7A3A44C64B
+193: 02BDD417852D9B03A37338549DFB6D765EC4CFE4C2385002848BA4D46F88053FAD2A39DFF615ECFAE0D41F02E5877251
+194: 77845BA2210971E362DC117B1BB13D7DFBA62F81EEEC7068D3CB9CD093DF535448CC357ADBF0C2394351EFB07C3E7DE7
+195: 0F43AA1739359C14BC5702322F193AF89335887F9175289933B2BB3F00A777D1D1DA74F5D45FC43AA90C9FFBB0CD580E
+196: D1D9A7B995B9BFF09252566D2079121AB12B0A5ED06014994464FA1AA18CB1BD8E7D5E07E1C71E2EED9CF081A537F28B
+197: 67DFFE8A168B7408B7DDBD10BDF14F4F2244FC904DEC5850F5D8302FE35AD1752BAD2DE50449F9C12182A2AAB8FBC9F6
+198: 030B5E833F6D8703BD0C5E36354387AF833F466AC812D4E1FAB6CDCD3146FFE3B0E56722D671FB85EAB22CA5CB0309BB
+199: CB992B3785E51EF3A32DE88073586DB045F356F18A09329E82943E29A12B2D1490B386D8CEBF7D90FB492966989A73BE
+200: A1D337D363A0BD8A0F2342351519C62318A120FAF88F9B90330845DA682261C64627B67D2F533FC48D2BE394DF8F4F61
+201: 319DF6326160C7277A3D3C65995BFB729A69B71B40C149DB1241C0B2376B4205837B5770805C86104677917EE5E5912C
+202: EBABE3BCAD828A9A3D5EE05C5EBA9605A67E1ACE73AE69F20BF435C3A14AC63E43B61021CDF3FC2245A14FC14A7AB32B
+203: 1723D844C0558D58EB3EEE3286C48C133C5F6C1D8CA512F2BAF1FAD7884D4FD5C3000A6756DD1E34E83DD066AD2BEBE2
+204: B048BED188BFFB8FF1B14CAA0BACE82605AEB1C666283FB7A6FDF216742F9F64A89C50B9852B8119B5FAEFE64615C241
+205: 7FC6E8633CB9B16F553ECA3C75C0C0F7B610010853EFC94AC330D36977EA8722B970DC264D5FC4D69F39105E7AA0EE3C
+206: BBC6F0E0158B6DD549C5BADE0FDFE415747F1FA2D2A85CC9DB758F34998FBC8C8D99D573CD948EC768540B363D67C4F0
+207: 5073FA9E162BE773AF5BA1CE5E6FC21F2F0F902C80F09BBC3AECAA6CB1867DAE4DC011D1DB987642949E8095909CB984
+208: A641BB0E1D20D5DB0C5CB33D35B73ED83216F2F5DDD5234A0BAA3B209A39E015B7245C40F9F372E618EC73450487B54C
+209: 948806B7335EDCC7C4BBE751844DF5717457B223C7A3B81B57AB3A949D0A726BAACFBA228BF6C2CF94E942F9B2F1A7AA
+210: 0451CD5EEA206D50A7897F495D648425CA333158C126C4DBA44ADC06447A51D3C7BF2D4D81779535CAE29792C7FE5650
+211: B4227FEE0A32009D60C9C30033C12B7143D4C7A1C25F39F3E4A076BC4943992AD299DEB2C15E27DF867BF948DA27C009
+212: DAAEA18FA433CF3E117F2D43303139D3F1D8C3BB8AE8EFB30B44B9D5D4BD4E553B9B6EB9019CC4E1AE5D0DBB6C23A102
+213: 4434C818BCCFD92189A3A466D2757AE2655BF0D6CD954706C85220A33B95B184EB560FF3CDDCC4DF557E427E60F9FBFC
+214: 6AA3B44FA507B6D704A66B4D7F26CBAAB2B400C6BE0A8B61B50EE617A16C2C09CB36E72FC309C6E4DB24961B1785CE3B
+215: 63AE9C02B96B4BC456FE5CB9BA35366DD69E78DC9CEEC376C6780703883D609333D45CA577A982A177515674B975B658
+216: 3B5DD4CCBE8CDF32009CE29FEE4F6EC7CCB1471A3F8E9BC9A35E8CC37F6C56957B757DA4C3204F9014977B93F9E30DCB
+217: 04A6528CDE6BB9F425132CCD4AEA1EC6CEA482249E5F3782B000FB071A4EB2434597A7FCE2A364A9BC9E0643A8403DDD
+218: 69275CA1F9F102925165A568C1F152D25DF8820A6F34595C4359159070052FED260C55FFFAEA2116AEE7A63DDBAA0160
+219: 584697C23C63904709BEA89F055AC592DF48034F908C9F06C706A51C3F6BE5F0F2A5B953AC2119FBC0855B785326C06D
+220: 04221F0A6C4799F9CEA3C1D9E65B9F77F77C613FD114135DB019D8C497B8899513AA4B499E720CC11AECADD1AC071DBC
+221: C7B878613C2F2ED10C8EA413970B124838F11F0414AEC89A3825DDC588629A8049E82B461A23F25C4F93E5BD11C184AC
+222: 1891E7A51768E05BB1D03A1EC1B844C7C8EF77C433F700175998B2D8E2EEEEC4618F00003793C5873655E093048B674E
+223: ADD2B81466BC727AC85DBE258B566C4DB56F6F7D81D7A4E43F86C125F2AB2E08C648E628B9CFE440F8BC06FD5D861D3C
+224: B3684BEBA86D275745CEAF0922473CA581CEB7371C5747EB87B407468006BA50D69F9BD8BB7F214185CD0D0C548C5432
+225: 0C783882FC826917619C07FD03FFC46DE6CD87BDFA87F1FB872989489C32FE74E8C5660748E1E8E9AE19C68B075B0EBA
+226: DF52553B4F7BD148574BB47F61BF8F7B2FDBE5B6963E29CD559F236BAAFC3DFD6A7EB5EC9968E0C2B3A453F982F16AAC
+227: 45102671440B04027B1F9966C1013AA351CAA3F3CF42C4D98F5B2D030FF37836E9F5865421D7DC8B037644FE53C6B280
+228: 247396BF60C0FBA27B245CFCA061D1F6EC50CB87CEE54E8C4A7186A07745D255E4EF9457C0A329AC9E3FC913DF86A4CA
+229: ACC5998C464A26C1719E9B17E1B8F5E3657FF0364C46FE87154DCD1C95A84734214D2B81CEA8DDBA501975281EF4EA9D
+230: 163F5AE385500C1A6EA212D6925E48CE2189DB1DD47F7F2D2D889272D17449A1C33EB3970A5982EF2FE5F1255367C33E
+231: E8BBFF2C5CDA88CB60BEADB8D04B88795B0CCD89057CEFF1FF588A169363AD453564FE7528D1FB7148845363C3E17824
+232: 5F8671B7C62A5EE9717FF80EC2AA0A03E557A2840C0FD0B59027AFC834C051CC9B7BEFFDEE3478165DB9CA303E2D874C
+233: E0E4DE22993E4A6B4884163C678A23AD6349DCD4C16B9041D01F8B3FAB1E8D8B07DA78BFEB57F8C235C173B2D238C4B7
+234: AD6F58BFA15FD0DF1191171F86F2B4C8729FE407128ADB4FAC3404E15C04752F2A4B5F4BDD488378C56FF8D85A38E583
+235: 90C5A75642A1811D8FC1ECB84AF4904C6D9E613353C1B9ED0FCA37D20974CC2425052E2300738824BECFDB981AFF06FD
+236: EF73A9E6D23CE43508400163CE6F3E8F7076CEFB94E549EB6116C2557F740D66A1727AD51CA645A7F9022912058FD262
+237: 99FA424E413A57DB2B1B851098FAB1B6D3337AC7FA85709121F0BBDAFB3EE291F44092EA7EB28E9BF0EA0691AA531BFC
+238: A1E0A088A279E750CEC429D0AE320B638ECBF9EE387C65C66D2231C884D844DCD438D4D4E052B8D76998A444E0666629
+239: 0657FBA0E7A73F7525505235120C44AAC6D37CE974FF23F52872D6ADA50DA022D417D8DAE40E80336846E8CE211D5AC5
+240: A72ED7917F0F9D0DD888DAB10AF9091A380F518D5DAFC005D1EBF0013F57A7452AEBA98913F509509A02665F332EE255
+241: 74CC959DC6CFB31CFBBE9CE8ABF32D1629E0F578F9199B9A2E90889A2F032919923142AB32E1DEE0A53ADAFAEFE0EBF2
+242: 9E4D463D2E3DC2B98CBA40EF84B022A76D01926D8DE6AC05F995C07C5F07D01742C5410B240240459280D7D278E8BFEC
+243: 0D74C427EE654E4790C7118272998C131337D0D0555B68F488AC7CB8DE3CFB461B0248E78340D74B828C80CA28ADF478
+244: 952F274ECBC66B68EA74CC8534A5D7EDB219B755C91266E5A779EC22F52DD2EFA9C447DD311E71C90E1419B4B2F3DAE0
+245: B845B0A56AFEC2FB399559FA77C4835D2BC4C3F8D62BEB1C45462BAC661D2E553B43D0A86073F0BA5AB85B129ED20B1C
+246: E65B931E25101224A6933FAAE7DFCF22FE84759937F5F3BDAA90D9C8E8ECD0BFA1777B99A77E3232E38917F9432CCBFC
+247: 4F69FE2CB97E9233BC873D153ED9D61B88C20FA333BD4137A532F4F703A323FAC6F8675D8B44EF5FAD2314894F7D60B6
+248: B36F43A6DD2917A1AA0C6B566599C274701BDF03A5B7DC65E5E9F0ACF882786F07989B106A50D0D89629136EA0E26EB1
+249: 8DB7B80635C53DAEF891B777850487E72B67F57576EB05F708786F7665F1FDC2A78F441636569D1E84058A43F0243A1A
+250: 14A43F1882AE0214F56819F4AE9276499D39DB4A4A939275DDDCDDD80CB6B70999E6178C4EF295E69A807EE5FDBF9AFD
+251: E5AA44CEA67F0821D4ECBC981F258837A243FD901653D484BE5C24EB7F08E0BF33525EE3DDF9A89E1263A853485B5A02
+252: 0191F0505CE5512FA08500BDC090570F0C430161595894528FE7AE5DAD8726E110B0676181A228A7A90E21B7B055361A
+253: 76FA1230972E771661485546D6CE556FCDA23B6DC0FFE94DD3BF7FF13FE9B46DCBC8D8FFC617F35687903B972FA7EA43
+254: FE280E1191D21CAE12EA3B53D77E03EA4D96108D35555CBFA9B156253A011ED91B857B82D644BB94BAC8E4FC4E0142B5
+255: BEDDC3C0E168A4B14B023DFC1AE07BE9A418678494C2399695EA9B17843D373077A708F8C82F37657BDC101950FED664
+256: AA5D7EA1126BF16DA2897AE036E94D1F96875AD306B19910EFE3F17B7A98F9A4163E4032EFD17DDBF78FE3321047509C
+
+HMAC-sha512
+  0: D29B9E3F87809686F34109FBC718D6ABBB09C278CF05A206ADF21463E1170362122E58272A31679720B254CBD63A7C6D696BF9283F9C6897E7D792483BB0388C
+  1: 5EC18FCA20788348244720D58E9532B4B699E78D48CF7D7BDD1A4E5C61CD09C075EA7F112DE379FBE953332C6A7D6273B3F6360BC07203A5175FAE618E4A2F55
+  2: 293D275FDD5021716117D2B85E6D38F8D60D4984BC73E2D8D7EF5942CF1287B65C0675E566794786FEA18AED1192A024FC4B3E0505D91E1F91833B210590BFDF
+  3: 8D9E222D6B16C58B3862D6BFA556BDFC2A4A152BB2574C2294D5381F6E38FB681500A6A19D55525B337A467A2FC30DD1684832FFF92AD071EEF05BC4F4399FE9
+  4: 71E7028F8C4CE9C1EAEFE459771528D26993E180E616D68355B9C618153AFF2C0E9620B151C8F733E71180EB87BD773A512B945AA353029A8F807FB2A8FF2264
+  5: 589F462D37095693ED0C1F3E0DCB892BD19086FE033718911931509EF6195AD17C79939A87665889EFA6DC19A69BEC6E7058531552832CCBBC06F1BEC70D1736
+  6: D94FC6BDAB3613271522BA05C998A6D1C57CAF0E6EE929651762F257E7EEBC07F5CC7CD3D4064A2755E408B347939B3927434556B4ED49CA406C21D1024E6D80
+  7: 4D8A886A89E9C60EDA3BF0BC512A295196C3F62018936DDB24BE9F6AEC7AA9511B33CBEC8A22309B6389417F4E7FB0489981CACF03DFECF7D9FE5B91D62BB719
+  8: D0E00955F0FFF98ABE885970EE44F1B5D4C23C205C64B681381FA13C543106B2AB4E762FD71F47008B4C429C39ED3D66B3EAEA946674F08684AC99F957F50416
+  9: 4F623E52B5FA2D556D25754FD00BB8429356FD75FE2EC57EB4BA4E25CE03C5332D3A632179C9FCFFF140E6B443A4285F4A7CE881E6D3EEC4FB0DB26C0E2DCDC1
+ 10: 5196EE8D442E5308F9D8911C87050DD3C4842D0CDCF55AC554412CF096EDA94BE1A251743AD5BC5F8AC902A38B66D7D57C90C29200984572D57C04F64166B803
+ 11: EF77019B0F93B1598E38D3B1B703B52660192547353E7FCD5A7C8525DBB516970D3A6F2A94729D90A5A34CEA255F310C1F46546C2A08975AF477DA2F3689F17E
+ 12: 0A77531D7081095AC0D0ADF2B379D3F820DD20CD89610917E287FF57BCA5DEABA750E1E075DAACA9CC4DDC74732E6F7BCCCD3671B6DD27503CA855EACC63FFB1
+ 13: F1E04B1F7B09DA270A44B62DBAD2FC0160BA1D144D7721010D77ED250A00986932CB6652D95B4A977494F11AF7E7FC82A70DFDACFA11232D653B1A052820185A
+ 14: 7BE1855550A49FF66D6D395DA7DEBDEAF674F1AB192DF82D74F6BAE8088F83EF1471F413CE00A404486213E41B42CF6C4F7FF1BFA17A1E28928B7179F0A966EE
+ 15: DFF2CDE8856D811494F559E9F4159065A50B1E82961628E95F04D595F670249A2B71C2625CC1CC2B1F85829255DA007F0374363EB749E935BB72BDA24B8A3F70
+ 16: D2F7FE57D9583EC1AA733403527DFBB118DFE07B2A60C43039FB238A7205A053E0496AD0F3C1896090AEAB3088283C8FAF272D1D53B5F9F88281E0A53FE7F8DB
+ 17: 963F629ED8F0E7D6D4CA4DC8A8B57C825F726380D0BA9A9857459491BA82F64A929EC4ABFCF79374CA68BA812E3A83A643D05454E146E9F4103D17E20B8350F5
+ 18: 1FDAE69CA4A9FAACDDF30A56B23F14768EB7D5616F6666B6F01FE5E216825CD4201A69CE3D2D1D2C3D03246BA7D32ADCAAA4A7D03B9AE6AF4CFBB474E1717BCA
+ 19: 2532E98B6D91D8D658BC1A1FE41AC719D648D47BACB423C031A8E2E9C25CC6650D3E5DF8046BC3532875F0C8DADB38AA911F216E6741E9FAD700D31269EE5D46
+ 20: C81E6E9F4B75A4EB2B903C4DE28CC437CD87BF789F6BE60EF521491CC7E44AF26E9EFAC55961135F79B3591F5F7B92ECDC9917641BDC34943C6759AAD9437498
+ 21: C0C2B9478F956800B64FA408BB0E077FEF48DE4B146926B3C577C00688829FFA6540AD7C211A807286C546F7D146F95989E77B62F5E14D62FE0C77C85FCB6CC3
+ 22: 980D06C1B27EB2EB15069566BD1BD838FD3DA453751BEC564C05941C9BFB9EE8443EECF84CBF8AA7DECAA294C7D1A3FA4A39C20A4659DF332CAFFCB2863A769B
+ 23: 70FB10E482AD19447CFAF10EB9FCFEE67F9DF7164B2647F19CB220E7D83BF892AB7B5C5ABB73B779522012BFD464D9D1B18C37C3F6CB70EC4106FA94F8CEFECC
+ 24: 7AB19BF67380012D3A53B93AC15E353D477FDD1E2E8851CD5AB5F36EA0C8B128D3193934F837D23D232F44009AC60DDD358AFC8D3A201BED3EAEEF74C03617A0
+ 25: AAFC1227AC42CC27BBF78FE26B3FACBB7B15360891C8EAA8C737AD42C00971D02B3A07CA751774D02F402F7E76BE08E2C1241EB66242DB5E11B342C22AAB9FEB
+ 26: D8CC3BE5B48C7BEE8522BD8872419932907B78392B7F2546788477C858D0C7BD772985C0B0D202AB7E69AB5F4E1A0BC848A512FDD79EC29F19BC4BA6D28DEB07
+ 27: 6133D836D68C82658F6263F794073CAD9029F20CC11D0A6CF589335B023CFD66D708F09136546C6C08769139363AE5CB4CC2CC86EC6911237ACBFD8B0423E377
+ 28: 833DAC9CFFBD62FF0749391A42324E2848670913890754E24ECC29D4738AF00A78134660A20078FE59C66113787F4A3E6C0E783740B2F2B2BC8D36FE4EDE39ED
+ 29: A2F3BC0DF058506805DCF5CC3006CC4FC4085FD846C7A7A7DD3A06CD6DF635359F4FBE90A676DABD7F9AAF42577C8E3B07B63B9CEC8A9AD05B38D16F56214E8F
+ 30: A49C3BB487C561E5AADA4FBA2D9F5B42681486AE2DF56087DD65B3D5E03C625F709299C84C64A68D87C92A4CC90246D608E692D1FFCE2C099348CD0A19407C2B
+ 31: C8D7B7A7FFAEDE88963B09A09ECCCB4CAE77DF9D8D242BA19F6485BC7775308E5D11C78FE9C46E609F3AF070F3DA8ED929C103DA1F25BE7867FD4D3E4F2757C9
+ 32: AD4627AFB02DECFF956E612537F011E82CB0C202A5A11AB7AFF55A201016C02CD21EFB4EB197BC2D13D272C6A830FD77F534E800B0AF1E79FCFB626ED6A0D6B8
+ 33: 8D4E232D9614EA1194E60748496CFD32A4AC249BB8F08E55A7C9DFDA708DE90D067FC433EB9DA2A6833D43BBA8E8DBF31137A3C9B26903060EF9217471E9F945
+ 34: 4CE5E4055F10F1D2182A7892F98206D9A120FBDA3251036B7EFEC835C95B4D1FE0BE3892E2363087D01948AA426AA403ABE1CD79F0AA851E2D1195511C7A85AC
+ 35: ABD65F8E9A2B39BFEF6EFC9A9EDEF6572489AE82034EF3BF2AE5F380026FF4CC40AF093F0408445735C0E6EBEF5D7E7ECC13C98B59807AE01FFE1BAB040FD14D
+ 36: E8C687D7AF785B1E547307875682ACD82FB58A8259551D81F309C923C2B1FBAF5935EE059B89070B8420F71EEE3BE7B1E3B55B196872F06DD1FB890F6FED11CA
+ 37: A344BE73E6585E0CC31525BD6D4EC3345D7780CF180D0D5C2D5FBDEDCBEA050A958FEB13C21924E311F57FD6A498756146AAC58412B98E4D2A3B29D9B77A9F53
+ 38: F0A088CC818F76A1FD6B5D707B114BDE24245CD55E48611ACC6AA497A0CEF93768501B5F280AC518CEE48C15373118BE7B72F8ABB2E9FD3526DD1C18D9CB2545
+ 39: 4D56D5C9222BB78E04DC9346FA9C4ADC27AE08DA3E34F490A13F674264896E58F9E9839715F633C7195B40DF722441275C84AEF162B513E673809F7874E7A124
+ 40: C4B3C9E8140F0D5589E326916462354827E491F3444E0C361512E6E761F5E24AE1873B238B73F32F6BF8F1D1D8FF9437A01DACCB749282E776FF66151A4F7E19
+ 41: 7B4E07BAF338DF6479E169EB6CC64CFF88167958D44C5CB6606964B7F9ECF5F3F1B1F695C63F2BD66354722F81EE4BC90B9FCF5345642E264C66F6950CC8C481
+ 42: 8571A8F76A1D5DAA0900A03E236FE965D085BE6035B7C0601EAD338106BE7DAFAEC82F7C3D8AD346FF749B6DAFC69901A6072CA089B7A5724C75CB0818640F7D
+ 43: DF516D84392E571C3FE39F4A0BA5D16D866553644B4C4627D3513F0A1C60D22FC5AA4276A71CB37BD6D6AD05A12BF812A2D5388A606583B78372B84DC567431E
+ 44: 535AF3C73B479B61B8B70E590E335DC4C1E22DCA656454213E1FDD46D026B6D36133BDD372FBFBB27B6DCA8E487F4A54BDA8C5F67B37C871653C656DDE9524EA
+ 45: DBFA27964DC6A80FF76112FC6CC02C87811DF1ECA3A8620A5030C600561032FC374A6B060FEBE0ED67421D9217D2719F5A55621736FFFC6F4F26DD4C6049FC09
+ 46: 6F69BFD2C60AB1554023A6A2094D30CA78D364501F7813A2CB73DEA94AD4B94A0EDF3A3698D6A30C8A5E764B81F51CD0CAEF0F996B8C685A345AA630CD10570A
+ 47: 2769DDB3AF3DD650BC381D7B10CBC4353699A2A352E57FA5D5CC4FB610E498767F49104ED0F4E06E2BD563F7F8045212F5B9C49CBE050A1662F2262BAC4053CE
+ 48: E50169B15772017CD9FF93D1B46AF273B375A39D174E3B8621EAC8EF968BD967E1448DC3B2C72A667EFAEBF2B90D4E6640698CB866075E95817719E0EE61DF30
+ 49: 4212648E8F9ACBDC16D48CD7B355884E0817A95DB03BD9B8AC5B28BE6371D8AF83546DC82550B8B23DC77F6D06211E3AF3B25528BE686CCA1672C91117DF9762
+ 50: 33C71EECDBE503A6AF72EBA8D2B9AA7AB8FA8DE536C87643ABF1BC3EDA535BBA64A8A7F4BAC90ADB7D8C926DCAB1D7DCE15D356C5074BB3EBC7B17516671EC8F
+ 51: C8EE9E57EFA859DC5553D03402AE80B84B1E0032CE3F2CAC43F8422A80E3EF59126AE7AB4893735F9C948CD9FA8793571E4582908DA19FC723A93C7C36F79F9C
+ 52: 7CABE0F83E90CF9A497DCE45F14F9926DC714DEEF05A1A0603F6436E134FC7C8346A19CB92DCDE69D794B38FB22233577BA3905C94A7020841224DA888B9BE1F
+ 53: FDC20554A15B71BA62F896DDC4F8B354E5D2434B0AF719CCA7DC56FBC9BD280B0F80136C4336D605C7C26208649F38C1DD0004C6E0E787A91FAA6075051FFDCF
+ 54: 87387F89646B4068038E011D7E02C353BD5649F6DA1C4C46CD9F7D69EB3A2F6EE84DD42D25B67BB81666CE8F92A5B1A0F3EA58D4F0B5B6E59EDEC86B43BA0CA6
+ 55: 6D0210417671B66D59B8F28CA0EAFDB493C30A7D7329DF29194C53887F05EDC2C3F35853898ED77394CCC650E8D350F69598E3AEF3DDF540DACCED5BBCBAF6AA
+ 56: F14085036C69398BC7E0CD8A9D4451A10B080E7CEDA5582ED396E5D54441125EB3EF6EDE4534E788DFE6DD3DAAA204814097987981EC8BD8E39E8E8B35AD8FAA
+ 57: BA67FB4D7D137531D3F4CD3D91975255FCF8EABBEB97EF0FC7C21C4E25FD034658C63881B0AEBEECD2B7D15357C14542D26EBA3ACCA944EB4C4D7E44E9899D42
+ 58: 4546585669E343AD40792308AB456DF623A6A23CCBE64B26B953D6C461460BBA7A3FB444481BDB3F7FC8D5E825F2527D2DFF193356CB3171CFBB56C679AD1BB9
+ 59: 210F8AD68FCD10BDB8773194FE57EFF566C7E65BCD82BE6196DECB40BF39774691AC6BA718E4B5FF0DDCF2C0510182B9A114C6F0117A0BB0E1AD585C69D38D0B
+ 60: 29003A048ECAC0613CFAE8EC8757F5E5CF80E9B0BBF538D7460765FE2D6B56D6251ABCFD42B56D64B56D8F219868DEB42B968E88D3F3BE3A161DCB43EA98349A
+ 61: A308F9E2B60D0093A7278B0645A471408F58B45B3683531179F34931D06A15F4A502F2F7E1DF8B47830F65387BB9F102646058AB456045267F2DC403A1D9A6DD
+ 62: AD484DDC270FE74E68620AEC882E86320D0D0753E713D9D5C9C7FEEB894DD3FD5FDF4995DDEF87B1126B36E92618331126F5852AA8C0D44404BF9F77B780595D
+ 63: B4BA7B2F08BC0FC901188B50493FD165F659D3226227E2E9892BD70B02312C12D195A73AED3A4009618E6E74799DB158D9AC27FCCA9BC682B09ECF53BD368C46
+ 64: 0AF65ED93646AE826C79BB6E8CD193D5246BD00B0BABF8425ACE03C845B9AEE428045D5F8267F3EA86C433F1A9DBF4AD1883AF164EAFE02C07CE43079668A248
+ 65: 65F899BE2C5E9879F6A3BF7B60E62591B5DC5398283229E4FADB1EE78FFBF962295C427BA0D50BBCB9E2F1DD9694BD36CA598BAE7C2EF1F4D0700DC95BB66C37
+ 66: FA9ACC46F0841962D6DDCBF5D47BBEC43A0E1E9B2A8F8B7970E2E73C06612FD95044B8BEB58C71B19AF4169B7E6500500445490F80EA4E305B6BB00C7181810D
+ 67: E9AEA6E12F881A7AEC3AAF428BBF0DA3138EBF69C6B8E52621609AD340D6537E4A03E2B099B735FA82A3D300F782606EF58598683D4ACB0870D5130B4B3142FB
+ 68: 3558ADBFD411DB8436A1A8B40420EE9C274FA153AEF891290F79DE5714130A50C70EB87E8A901D540ADCFC37E40EF44592822F6ADBBE8E5CB4EC89909633DD7C
+ 69: AF3852A0B4E846B59A4EAEB7A7A451311B1E8F554042CEB2D253F10FCB3067F9CA927C7DA3E57BC9C99E4E7997856B35DAB0645C194AE9F1FA0A92BC218CC9BC
+ 70: 6BD90F0F8FFA39C2A483E8349D2A29A96AA7F3CB4B4C1325FE5162988C9DEE849B8E56BF1423B6905ED3FC6A82A067F850372414E2A4A7E5CA379AB80F1C4F23
+ 71: 6433885A8A39F2E4CBB36191A038EC3E3227BDDDAEAE24FD396481332A9AD7BECCC4E9BDEA0C8A7F33180ECB1EC1DB49218D17C4325B661967ADCBA25B341649
+ 72: C3235054A1FDFF2C0D218C3B54EE6A58FA5AE99040A64A90B9C8DE601B80A7C130168FE7484CE1FD9FBE22E6E794161826730B63DE794EC4ED1D653E40B27F7A
+ 73: 89F4DF5AC626665D9791A1E1C30D1F206D89C4B0C59916DA295931539B0A607A1261B4EF022CCDA6ECE02E99449E252EAFC8929F5074866C3FF59CC58268E2B8
+ 74: 3F1AC15A90C38AA964518F176016FDC73A85B096EFD1FCDCCF38F3EC692635BD4E610F1B3314E068164D02168F73A307AD549E1E7EF07DD374F9697DB6A17447
+ 75: 4FE16A3BF0534DD2E4DACC43E221179C9B61D7D50DAEDA4DA9C45CCFDC76D6FA96EB3CC1C184DD5DDF7DAAA413D05B2FE518117E2C9A880726148C7AE6052160
+ 76: 1EA870E13B7E59B97045F662682F29DAEC4413566DA341468CC9F5CAB733D1897BBAD8E9520B85C43DE33B9B70880AB774EA636248CD0A1626C9CDFEC3F1835F
+ 77: 37AE3A9828B08A055B2E47A613D25A8D43D5A456BF741E7964C0DF4AEC6D8E5F3EF874F2B20606A38AFCBD307C104DFA5BF40BFBB3078771436276E777F645DF
+ 78: 48CB9B779D37299162D2674CE2C2595B2422071917C28AB48781DED5060E76EDABA56E7C538C3182F9D960DC21928E6B3069D510046608C976D7A113DE54DCEB
+ 79: A565459CED6C996C04A21FF0DA10A7F24B1DE22EEAD7FA7FD2CEEAF522A42E29395F771140573D684C94F61F19C771DF68FF8EA0FF727C55294C70E701C8E426
+ 80: 3A0ADB5479E65BE1F00462E60C8F7F74FF5C996680A2A4CF787B5DF65BB2E82264004E396AD7EAFCF8A201E03AA950D42B9A26EF2D24FD2AD7CF57CBD08AFFAC
+ 81: 6FFC799781B2E9F3F573651EB2DCB0771073DA1875CCC3D2B4C6C06F43161195610617007CA9A943B1F2B001E62518EBABD4542E73CA131E20A167FA6E8CAE44
+ 82: 79C9E349F1216FCB295FFFE5771EF54A024306CED9CA111DA3DC629722DF7FA5F0927152E4401E0358BDC16D9ABFA02C709B1C21F6D86905B0CF0D6EC9FD1952
+ 83: 6876CC513300CC83BAFCAAE5DFE4C4A0CB962079523ED475B19568243A63B208301335BDDE10CEC90CA816960013E08271F02111BD18FD03C1B941543FF4A579
+ 84: FB5392BCB60C1329D3FBEDB4DE1131E7B89326A34F34BB099A7EBEE42B985682F52412D3F0628AA72A8C2C46BA3FEA08D5765264E48DDDBB96CB598C9C0BA93C
+ 85: FAE655D7CC2FDB54349870B199FA54CF47BEF2AD98021FA27B968AD4C3AE477C6B2DFA9A10C75FE275D5A32C5E9FA06B03D4C908184F49FCF15ABC409106E951
+ 86: 9B15DD192392017E2F4DDFCD30B7AE58546AB71EC44DB94EE66CA3419D580AA05B5F10E5D36D9E60465FB8F56665366824B5B6E9A63A13F6E83A026F5A8E0911
+ 87: 1A0EC6F024130D24D9740E8037C78A176D9C5933C4073DE3C6B0536E9F7CD20E0E89705953DAC9CD44C85EA059ADC496A7A0EFC40F187DF676D2BC83F80BE983
+ 88: 5E9683BD68FA16BE904FF617510AE99249ED3477276A0B410B269EB2E03A3505EDF653C725811AD9DCD7FCCF6F2411980784F4BE7407D68C02CF6ACD21FA1B52
+ 89: 47CE3079037E396A5B5A1A3FFFC3C60A138AA2C6BF4FFF26D846C7E1E84E31A26270AAC5C688DA7A29DED589018BC349E3247B073B765FDBA4C8BB271CC6E233
+ 90: 280FE2B5B0B72FEFA48A9B6A1B0A3529CAC9D6338E2083816930B14FEA5B21088B1009DE147D81FC7F29B00BADAB32B57E15322A6180D713411F559658FAC715
+ 91: 527C2E33018CE9895C3F84BA5C072055730AAF767DC82AE236F1F7C5511FBF2CFCBE32AAEEFEADE38EED4C0895290D0EAAB38E3A5CF7B2462675D1E6B26CE814
+ 92: 8C0E22F5BE099CEE31C816A0F5DCF9A548B0EAB55AE7CC127D172AA5243A5C73B5BD3AFD77C89370D51460CB7E84F1DD15774D1B8442C07AD21A3B128688E1E0
+ 93: 6CF00F05A9DD7EBA5F1A755987F5678F80AAAF9B5FC44D6199100C062DB50D2DA89096389DB94A6D68BD8337640BAB60AFC8793E1A909624A4E149AECBE415C5
+ 94: 8452FD4AAEB1AF4ACA8192DD59926E7B0D7B295B8FE18DF4DD21E7C7ABE8F4ADE7391753E533EDA2EFA13CBCD96948ACF26B658F1E72390BBCD7C1BDCE8FD650
+ 95: C4DBE8DC875D00FFAE2AAEB3E0BF1F01529A364454D56D329FD493D327287F3E34DBDF2AD54C5BAC5E6059F5897D18157C7DC846F15F2CDA1B2F0A6EEAAE58D5
+ 96: 6C88BBBAD961E9DD1418E9F8EC69FEB443176108F56FA2B0B686E93B0E5F505E56302994FB190787EBA7CED5EAB69DD24CEC39BD566D18ABE337A31414991735
+ 97: 439ACC720E8CD0C4A119B9C318FBC543CB7B35FF12DA190D82A951970248BB47D0DA2171A7BF850A881E8767FBCD542039E483974F18532FDB57DF23CD18B1D3
+ 98: D71EF6284984442D05E8B6B1AB636E0BA013A8D70029F9F1B9BA7927A582D5AC6899B9C8EB990CA93B49E460AE140564D40467A1368FB4A9EFFED4A467E174CD
+ 99: 8B5AD2DDB4F8C044AFE2B0216B7E7D830EBDD285E4D992CA022CA2F59644806D8B7599CEC51DC73786D98B7B6F7C10C3BB7D4CEE3740FA42DB21BB51A1269611
+100: 28CA7AF155E9E7E1F5EB64F211F254D624C6C42935E27A91745F2AF2EECFDCF1DBD5896F60520A527499432DD3D0F3981F0E5BA72EF113231A0319467BF5271A
+101: 45B69480A77AEE3D83D39A38717EC1CAE1634D2D50D05FD78F70309DDA566DFC160FDA967EA6ADEA8BF45B74557DBCAE4D6187DE1BB82A053CF84B4217F9CCA6
+102: BF46E03CEAE3211FEAED2147B3F2909D406A767005F9C8A5CE6139133D41C2812D3225123B3BF0792288E4BB5C8B5ECE9BDFE0F8FF097DD64FB2CCB964FC9862
+103: 3CA25AE24E0D847D9552FD74E1D6FAAF91736603DEE98E51922A2923630D7CF35917916A1DB23A758E7F067F26A5DE9135871B3DE508CE4ECFEBCBBA1A958C78
+104: 2C4380BB9F29041388A0F8292D97482E1E96429B79162A19F01918DBC2DF0B36244ED9E7D015A20290877ACC4D2FFB14D236CE7FC92ED16C7C57012B0CF6DF70
+105: A0020193ADA7F57DA648C1474731F145E6A8E9E7F9550ECE1A841E2D735B18769738AEA78E7AABB8ABB51EF08A34C187478B4C5AB5BFF4932E97F4E246C60C6A
+106: 60E81090C365DA5E69E2FC12256131F134F561C7A411F51F72B7649727C9D7E99795D18D1AA54D09F6B2DD7FC556512F49D582BA6006D951D474039095F3ED07
+107: B213DA3FB3ABD16B1CF5CA81574D78649382A6CFEBA5A88C0B8DD40B1C6E18520F145968C342DB13A2B4B2659F4F865E8CF50BCF2138A7B09A1FC190676E1895
+108: 6862BF8F73054DEF42EF38C4A362ECC8F13BE7E705573D8E9AC6B347EFE6A218950A5AB5ACAC3607C0C94301E0A085BFAE7DAD5E1863D469C113B790C234A947
+109: 2D7D3040A495F8C089C67FEE236A07C7D3361D35271B4DFEA5F17C7E80B888EA339B936C4475194BBE35DD9AF3BE112201AC21C9F5858E4F4C39A0FCFF0EB31C
+110: 1F995515755C98C5EB95818DAF0C55B51192BD8D752FA35EBBF51176F05ADFDC32E2FA845C1821B6110F7EC1F1D1EA963433194BB978285CA4344A5F989113EF
+111: 3F5855B07A4288497533924165E7EAD3D91A16F5E832FB341F5373C118D5ED7E0EF8D837FEF594C2039F08A7870EC1C2770B7C4E7185246908976B62A416DE5B
+112: 1541B5A9C84B684BBDB543F77CF384473D007992F37498F07709EE68033E41829E29109E7C77E252C241C78AF41C790E40696206D58B2FDEE768E5B321362F4E
+113: 6DA9AC8390F4264064947684F53A1ADB49314E0619509298CFFEA1729A944990BE2D4C0988BD6E8BD1062D574879218ED8FC4801877D637ED3B5383C069A29D9
+114: BA0A194D5078019B21910C37AFB81A890C4FECE7B1F4E722CF855A6F2F8B82E4EAD37B7B58C07ACEF1EA2B76B146811732EBE1BC0F76A146207B8213802DFB28
+115: 20631BF1D6555C7BA761B0581BBCDCA5A7B1BAACA1B3D3E5B4D70D0C9B0A279BAF00DE093AB1334ED5994FC17386D0B2BE9E0FB67AC1038704891769AE530BB6
+116: F31F66E176DF632694A6F7E16ED8F15CE88908EF1D1F0067CC8A5C805370B9CACE0BDC78B1CEF06630012B3A35D129C4E2AA4F7302E1A122C7E53C51DA7F795D
+117: 18B5417DC4CEE4387338C63156C34BBAFF19A2BB962E4248B1A1AFF1FF145BA47D84C6C8570D072BBC57D912C8048E0ED50060CA33408A00722A65C194178387
+118: 2AE09DC52D7BB9E692822A6FB3D582B805E5ECD2C1C4813F94F555BA2210429B615A2301B3EB7C491153D68AE33AD9D28F2FC11B6C61700D79BC7DDB251BD15F
+119: 534390ED2DA55D45402F828D6035819C4528768DBFFAE1039CF0D18F89BEAA867589F78871FBC746E43B59E7886FDF734364DEC4193AABF56E8BEDD801E60D89
+120: 231597B2B71E6BE567C86DFE31ADD7B31332BEDA930C4921C4817B7DEBB0282A12D23B076F4783EA840D890F6C571760E70E143F8565561062877D95BD0FF941
+121: D60A1481686AB8F889EACF2E9F66BC32271E70E3E04B91ACA6CFB90375860E0BFC5AD9A627BA0C763CD7576811CDE2921E9A63C0F0A7A26E763F7EC7902308E7
+122: BA65BE7D1EF697281736B3AFA97FF675CD776C125CB01028EC2894EC2EFB9908835A3882E5E57BD44ACA09DC3B0580145EB2265E1724DA6F01AF5F93022D5774
+123: 0DEE2EBEBAA770891C14346A26834CF40212531EDDD64A21EF9FBD62F4728A16E18C673DC8CE3883156F51854A0ACC341DDEE6A0B71C4CBF797CD5327056AAD9
+124: 0717C9EDCC2FAEE525A684EAAB79653DD83BF46ECB285E6B154DFCB8A0C9F8D4B28FA200A6C224B4620CB0AB5B33B9C8BE77B2B5A04DB1A3EF8A5951EC46607C
+125: BADCAAE4F76006290B9090AC81B807E7251EAC041E6CB10A2C5B58C4F4B2386E065E6D55C46CD888396C86606FACC82DE2F3F88904E15D549101AC7FFBA057D3
+126: 751F6366EFC97218AC2E0675E7F375444C8D82AE7A139E78305E14148E07100F5B7EF93B576DCE546A7BAFCE24FE148B248BE072031F89B6AE7BA9CC559E9C9B
+127: EC0FCB3E124C482CC8D86BA2CDDE931E521F0B6F3E7F333C4388E7448A7F196D95766CEB8A49A90E46B592958BB85BD7495747E71508877975EB1454A4EBD57E
+128: CDEEE6EC4D67DD8698B72C13735657EE9F78BB0E1DD37D0CF06063717DA9DCD617C5F4FF7656AA48CB3F697E36B3904F496136A2B04E19726DEF9D3406F8A84A
+129: 81BB692EAF7F5176B6A0E5F2DFC01A045A917649D0B23B22C180BD78672F37F8E562FD006A00AF2D7AF0AFE15C8D191339AE28FF2797E64A3809400E2E73A785
+130: 04A8456D131499586CF7B9FC45C2EC96859F3F4BB8240ECD93E439EFD5DDE1DE7B67B688B583598D7FD50CB179D318D4C05EDE04F6FA318AA1E9DD7D4E279307
+131: E5C9D55B686DD9D7B1819A6144F6272B1FB5BB3B3034AB9D1BF34391283BA614D57894925C3D589A7FAC0CA1B1E98A12E9DFDDC2BCD85D1E7F2980709EF25719
+132: 2C6EF2E1C179BFA8295197371C474081790A63AFAA194E459CDC27AD4453B3A8C0110F9229BBDD4BBA5D6E80F2CEA71059334A97EA34F96810A2EBFCC3B177B8
+133: AAD54FE02E67080851DC84E20F7661E42ADB610D0B105B3EA6EB6654DAF64458B7E0F756392196AE2B40626CC2B0D82E47D74D3C50A607F4402C6C6A62999324
+134: CF210EE9A800943EAAF4EFE15DB7DEB696233A4DD62206D46BD9C84A7EB13B5EA43FF3CE15ADD8FC4BCFF022196197D1D097B7A893A79C6640135929FCEF10F6
+135: C81761EBF3235F4D56697B19F62B4F7445C8FDCE3D7999F3249493D50C19CA57C5FC84CD35CF794F58DDB6AC86E8BD53350BA9676AB63B88214162C8E11C16AF
+136: 8E56EB131EFA286A92078F5A3667BC6669D6A7FD9746CA5F208EE38D5265CF27076C1624ED0F98D486C55C28A4FB89C7B667AAC505CA1CFE1E841184615B7602
+137: B6CAF44F87688E9E3651C2C98E840264464DE9DFE1F3E4CE5C1BEAD46C7D9D747DFFE282D775E101591A7254112C2DFD543E44B41E72EFEE30B032E5E015150A
+138: 8E7851F56585595ABD2B3EBA5AE713672093A3120798506ADD1ACAA3ADD92D737F9AE155B8A5166C0F047801A93731D4B807DFE15F08D67DEF31A7B808601D6E
+139: B36B6689A5F391688DA3A0756A15AF15E6E66701E2132CF6F06326AE9C91A0BBAA35664B28BC5B936D2BF1E6653848C5DB57654685124A08C79FD03ACC0681D1
+140: 24A23CE3A90C8EC3D10330EBDA47763B1B03035F9E4AAE0AD336169A2F464E067B026D94ED4B9723E969C8AAE7F404F7B4481C48EF7545EAAE4E648525A68751
+141: C7ADE61F21133886EE0E0B14438F070DA398B3A5387CABF98B0802662F3BD3AAA8738D36CCC0D3EA25BBE9DD3B59062BDF4BE2740482BF6D4C21D0E0FD7B0679
+142: 17EEAD5930DB3A1F8E123AD2E72C38209824F977674A52F380843442F0A5C82B55F8A362527BF5324124401648BEF5E9E26E08050B1FE80886E3856F98AC1EF8
+143: 9DE4F43CA8F7E528FFF9F4EF5897652323AEB95DF80049AFBA189C3D142CFF55AE340358A71B01797A8B72F478276E6353421E1C0C22EBDEA0C044EA60865784
+144: E259BE34C467B471C94B612EA6BD99A3F7EDE58E237DABA6A6656F7F7EB5466DAF908B7759027C277BD9234ECBB23C5C62DD2C9D248C1AE52865D66B5C256756
+145: E49099FC970994F8293E71467BFB1D241FE99322075795FCACFDBFAB396392E37BA09E66BF492684642FF2A03F8CF92E0ACF4677C21AC1C236DDCA103F0B5A69
+146: 4338E438D419D8694FC40383EB1045FD9DFEBC6F18A9A03B4914687A8639322E3B050F48E872BB7E2AD9013D374D68BDBBDD0B177024C1185320D04598515ADF
+147: A36238A5C795B23F42D0833A5152770A4B0094BC19DFA72C935D32D02FAF5D136BF55D92B022D01949FF04B78507FB203302833AA7103729771A112E4FD1584F
+148: 47180F9E838B129A7732A8DAD763B8CC5437BAEF77EFD34D3B33C63C09F6314B87B3A1436C6866614C3B3A693BC7926E9AE876C7BDE9D712FB5198D6417FCEF6
+149: A87064FF5DA177F3651488A139E568F6C75722ECF97507316BDAC36393724525291682776843B8563A6B014646F6B19F040B17B62BEE4A0711A7B06A67DF75C3
+150: F358321DC6A376ED500A2DABA60096B817D13B59AA02B56C1F51E2C6804F5D2DE2028409964D5755BFC6424287504994C7605749A5E5D9D802BB42922F444D76
+151: AC4A9999133546B8452047EE31B398F623E01DCACED7BAE4CB0B4DF0DD53B8E4921109308DE53C0924E0006361BC8A480AACF798D6B403F338357E8DB676AFBA
+152: 0E73ABBEB68982F163257C1145FA2E465FD6E720EEAF5E532DDD1ACCC690B37A8FAEFF8D7D41564A9C86C2F185E0FBD0FCE75259D34A5E96B8C514EC83CA1382
+153: 094503A1B90D71960F83C91D76754BA6B05D670EC6A8EEE1D3CDC652DA6E52B196E155F3BCB62A9E4EF8C507F377AC1321C4C0D7A03F7D8A5286C0019C358E92
+154: 12803349F15FCBD53F2FE11B67DABCF3F470B8E3AFE8A855D7A918E611A2D5F4DAE8FE847ED1FAF834BB3678C6253111636100A991A80C1EAD0D35E28DB3AC85
+155: F489665F4D8A4AAA679D5E5A1B7C501DECE2E0B228630AEEAA1F5643FC4BCCB9E2F018FC2D7C44ABC4AC0861EBA8B7700A49B42486DD13263D978F8A7C9CA306
+156: D9DFBC3DBF0E3D247C95E16D376E7098A92EC59A54FAB482C330139EC6E06ED514D5C74F9604D1171A127502811A16D1D3039BD03C4DBED20BB765EFD34C5F0F
+157: BA56A64D01FCF392A6E2F73D791D6C5A57AB40A376E73388CECBFDB910402043B4DB2F2D2B86E3510986CF1DEC3880E3C739175D5C0AA1DCEA18959135E2CF48
+158: F4B07B0A063AB240E5A64F1C494FCD9839276FD9689AA6720A94B83E579EF1044997F6506C1AD82C2CABB9384CEEA0B77D3970C1B7E13F8DE98AFA869F1F4D2A
+159: CB4F232024B2D0C48E415D73193CD83C1A6BB9806CA336AC4F3B8FF7BF992B200504ED5E539CAAE68B1E47D4D8ACFD2E6B4BBC1B518689BBB5BB4311C96FE06A
+160: 1E67E36D2EC5D0591C0171E7426A88919EA5A17470DA305CBA7BAEE90002E23043FAE1F4BE003EDDC2520A404E639B03880E3CCC68243C60E243A0E7A02E2CA0
+161: 40E46A8F257265A1E57A09B43890FEEFA57F56BB47551BAB38BE2BA8D143C176749484ADEB2D833EC9D6B70FBE872FA53618E64CF0AED24D51BA982D29E730C8
+162: F399712E5EFBA3FDF6B7D04600C16F69260179AB79545F44EF5849308E6FA589721CF7E6FE384461D05EF02BE51E50FA93C5FEEE9279A953C57EC07CFBE53E1D
+163: 58DEEE13BF73ADD8B49EBBA90A8EDCE7030C17D6E6C449726D094F90A35A07759A3BEA031EEAF963C4753522EBBED1482789833D15D6EED7F5214E1AB93C174B
+164: 13B2F766E6B796C44429A747CB46D99A9866115C78D2E94DAB52BBC9269B6584D26676CFECC2A9F026AE8E0162B6BB8DCB2242659EDA67CF793BF66963C69021
+165: 992B995865F57633665483C7C3ACD34BD108B5DDF151CED97C0D7AD134A8D9250CA8DC17C5C2A76C1C07989228F8B474814FB116C98D25D8F291D10CE259570E
+166: 1C5D5E9C29DD91877E279DB679ACF0EFD8464B0A58EC9A3036EDB2621E8106FCF2A81719FDD1B89F13FCBD20960387754DD0F12876DAA911E793DF8F1991C043
+167: FE7F98A1D7839BB417CFF65A45E2DE806C74ADF2636385FEB16A34C890B524A75452EC096849EF0F905FFB38A0319D31A886DD840FE2FA66E16AC7C68B0D7FCC
+168: EC67530458F01366BE95049FCFBF65465CEC9AD7D12332CF898DD72ED4D275F9C9EE96AD02603E8032F9B3B12615329CF0FEA564D278B1DC3B47EF304BF901B7
+169: 77BB3F5E58AF174DED0B31627648A1C7B5B8092C829020A6FE4CFD42CB51143E9DE20E3D827FB070DEDDA94D39BD0D330604DCB190E7252B12B03F48072B7E27
+170: CF33E5358E518807B70D6DCFBFB1CBAFBA7B2BDD20931B2A3B08BF8C6755367AB3BBB2FDCAE305F04812460FAD37E9AF70F1905D2F0D3E7628DD1FA453E5AE63
+171: 0739D32112107994BF3E6EC3A107AE3BDB9E2BBDA1D7C10D9AD6AE32952649007F68D28BA0DDD1F1C45F7128C1D3C42EBFDB1975A143A42949C7D97D9F9D3BA1
+172: A4F0B775988038E50429428C8526793AD8B6EC1F0F3AB7F6B33F716C61B7DFC49E254EAA01FFA422A31D30A8268E1BE99D385907479C7E2E0492681B6851DE1B
+173: D2472E93989E1F29BE0DCF991A65BFE0E772CE77850A2F96FC6114EBCD78252DFC17712AF193FC5ECBA371B8FD27B0DAC44AFF6140923885F403904F1664AAD4
+174: 6696E09A153B0077D3586705E4A19FA6B3B2DD8621F5D13D7003017A0C569B7483C8CD9218ED1A252EB160C3620FE96A00E267DA0FA8996B417F64DD4A22153B
+175: 2337E38B460CDDB026CB81B59B99572D45BCA4A43949440AA5C9F2502DBD8906453FEE23AC0AE47AB77214E52E7CF06ACE73DD8565BDD315F49A460996E08DE9
+176: 068CAEDFA329C1FB00BA02C80877E0E2B1CB6127FA2224BD14FAE5AD0AAE6FBAE052A145F5A8340B446F54AC9BB2108CF6582AFA0FADE91CD3568B604F68F470
+177: EBD69C96F4F2DB05350B74A475CA8C1FDC671B018A47072A11A8DC082C418EB20466720AF12E113C2D507F02596CB022D2BECC4EF8486CB54260020EB6C36481
+178: DB0770922005DE66FBC2B05B1F863ADA569B76DA9B8CA433C99C2F2B4AD60BD28B19A5B3820C0D8B6B2E443CF54A942B961E5EF1D53BAC4CA379964D701070D3
+179: D435D7240B8C6A6AABCB026EA53BB8DE58C5DB471EDD8173AE30C81BEFA9CCDE8E30758CBD7DED822410576115C2415D9DA7FD8A83CBEAE337E5908A012AE1E7
+180: 838AFEF97BBCFF7692C731D55442140D58CABFBE81BE76D41652106E215AF4E934691DC20F181C2123CF091B6D7552115F59937E165F1645CE0E14DEDB864B11
+181: 771815708A3D7BBE5E00FD677E4EB76B2B9A03A09412284A236401E7FCB19B340782C81D1A49371609DDCD7E38F9448FA657533D53280B3D6B492984E9C9CBC3
+182: 649EAB3244AEDAA18CF0A1FFF6619D63BBB66955C5D58E3A592E53F537FA74C60616B9E4483BCBB08AD7D1F5B6B91ED3176E89C03C224F94E5D3893FB6D01CFB
+183: B4B6C653D90EDFEC3BEA0FE1FD766D5736DAFA184C360C8B036B7CC842E8C76BECFBAA7046AF087831E322FFC181073C19360A269851FF4DFFB4712E68560C3A
+184: B0C0061EC50BBC67DA4765FEBD4033B8A204260177F9CFD451E97B93F19736D4B0B7478E29FBE76BE17AA6B0DFE9C4CB9C6E4734DCC8AA5EA825F101E5C9B02C
+185: 54EB4D2C9B26B8B17818AD702E065407A19A711E22C8E66163E7311D8ECFA54448453890194C3EE892A599125AAFE1CB230C6EA268ED68ACD86DBBD17432352C
+186: C049743F49D57D9226AFD26B94BFE9165BE5A8CEA9DCCD101F837F29C63A4201B1D4478EB5C4CE9D8F5D6E91BF89D09E6A0D918EE7A6D58CCD0A46D36963BCAB
+187: F11AED8EC2B1C003B8E35F8F2A05861D9DD6B7DED02E28EFA4EDBB0BDA0DAA76EAD810CF1C78F50668D50DBE2AE65009C2E12504DFCE9F9BFA9A14969E1D0622
+188: 1CEB4106BC700F76F4825E6790959CC6EC85AD93D6FBB9783098E367E5C9676AA0D6B8CF9A7DCC67565284E71205551650557D556870B421273772524463245B
+189: 9711275100A787D9678CEB38981A2246112C2FB1F0EEC1F844DF1703DE5B0FAD995FAC983526E7E3336B8CDC9DCE56FD66B73811201A2DA6783309AB6B9C0546
+190: 81E9DC0CBF71797104A44E72841FAF7F9CCF35C18EFEEF873450A25AE56564B0E9DA98598C527D5629EEF7F0571D9AD929BAB87A27539CE9898ABF4C57C9EBB5
+191: 28F4214D1C8C5B9291F2E1F7FCE732C3290A691432A65A01F7EAB1A313B83936DC98A3B39B5F7712DDEEB8968001C93A102C7FCFB8AD7D49B29661C9A9867109
+192: 78C7A025ADB85145CA8C6E417C4E68A9DB83FA78A23D0CC3DF20AD1409B936686FF756EB51BD8901157B1D031DE6848D97DC2E0F137BCA1D49EE3FB2D5A5E83F
+193: E2C25FC61AFC794F65AA57DCCC4111D4B15331842493F93E9500AF01E2017CB226444E208BA9C841DF6D7ED28955B318511335F842AF3C2C0573227AFD790739
+194: 50D768C744CDD318B950986E305BF74B77396FDABCAF63AB786893B5F4104C2525F2F69905955A35234BD6BD85DB17B94AE7008F2E2C368E9639ABE8BAFEE4CA
+195: C4F1BF6C56C494351A880172B9CBB59BB0D1A5955352E10A868D3C33BFEA0484EDF6ADDD009A20C8D7B59B7ABD5115D595B026CCA6442921038D9BE860C44CBE
+196: C782CE6A141EF9E6CAA61853588B8C75B3A39CE191C161F43D7C5F88FB77BD5055B21F37D4A49D65CCDBD0E6BFD98193FC0092A34C21D5ED0CAA5F129D462073
+197: 1B2F68D7DC7563C286612B3D708AA725923FC9A2FEDCD4B1F1E2557CC70F3BF65944A2BAD9705303207B00F6DBCCE245C6E653C38EA0896DEF4150DA118A699E
+198: C1248D0A6B75BEFFFD70EF17F2D0F3CE3628BCFB6A634C93E8F0ED97BBFDB48F6E5608511AD7091D7B062B795EBEDEC67696679EA092F7B84A64C99BB224D387
+199: 20A3D3F3676947173C7FB824B40069A202ED3A5637DB41C97ABFE9E7036D6C009BDDD5BFFF97FE80EBC40355A535D7D3A4B2FDC09B809D3BAE2DC31803413B27
+200: B85500CB777B14592A4562A26B13AF3F08CE74E03372D9622E29C1FB7988A86B8C00DDB2049C1395B43B17CD5C415A5AEDD71E05CC0980EB9520D4CAABBD6FDC
+201: DB553A36A3EAABF7BE6FAF85DB96D3D0F207EA1E5B55DE589A116DB80C21AE5B1826A5FF3BB9D84C26A403A1E5C00BC7D2F6DE3F6A9661899D6D75373ED76B71
+202: 5580422E6393475B7C1F5010FA7F4395B969E190AEA056ECC88783A8B5FAB8ACF130DFF39DC0175E9BA8B63B4FABA7E4A36FC55FA1504468727086B2D26B5818
+203: 1CA3DD194E7BCA2591AD1B95D0CD4CF7938334C95A1EBE2C8C1A9B75E6A85F534C094E652248048923CBAB97CB1581E9A2D1AB8375C506159B724F74447A3201
+204: DC525D0EC1E62EA68C013470D77B61377398EDCA82A91C1C3E4D7E5D910A9D556B3AC810FB1457BDD70A18B063523C39BD806A2227C7E057CC6B018DDABFF73E
+205: 2F0B9523725B27245D2A1B635DB5A3A3800099546ABFDD95C8E86C67C378D91E4711AD1927E90CC9B50A1A7BE3D60414E487E72445936FD0FA2BBF541F1394EC
+206: AB6EB21BC802EB0854F61346F7BFCFFF738EA39829AB2785976D869830DBAC367D59D50C3873B960AC5185F3DBCEABD4E4E594C5C2916A8DC304207E887473C5
+207: 8E1C160A334D41F08918EC084BE12872DE79D00473D1B6ACADABD67E2A6827FB1DDDACAD9BFCF27430AA84F3F7A0D6CF2FFC91E7758F471F2739D51B60125D46
+208: C135532CFE84849FE9F40799E1F2CA05568868C0D44E6832A05C29ED17C5F6D0FB844485CBAE5E50A67F2319C30526DB444F4B45CDAE01A9D0542427731DC175
+209: B1FBEE68843D42FB558D1D9E0B759C168D6F84D07B2E90B646F45F1708B0D6AFF7BA8959EBB6AE4D5DF9A9951D139C81BBE602671CFDC618AA1EB63288DAD72D
+210: DC11C3D993F59473F64F16F87D5F085E834306FC1C40D12CE7D6E44C59C31318C694282B0FE53B4B60E1E5DB546D930AB741A8DAAB8ED67C3D87E8E76B8C025C
+211: 85BFAE07EEA80F939D52CB18C970C8ED9D4035B57391739C44D7973223C51344B9BE28C16EA29B35AF74A2F8F7581C766D61525DE5922A83A1BB600D97F7A3F2
+212: 26E52AFEE0F11DD79061EA3E4F97205729E6B61E50B69CC2894CABB08CFD3A10C41662CA6F6FEC9B5B80ACACBF968C5B75BB8CFA31D06C82D9CFE97F6E1F43FD
+213: 74F18E92D85D9AE79BD62C4B8FFB2116DA8157E17A6927BE2B2D0D79CA101F7CAD6A25CD623C8756D49B9CBB903477B9CAC67734F84F0915ACA9025A9D5C6DD2
+214: A51B45BC09382F85334EA58CF7E7747457B517118042D53D773C66668CD6D5059B9997DB183B1C0F2900AC9949028D8F76DD8B7259149388FBF340834A3BF4FA
+215: 59DC88A518FE44A7FD0F316BC8B5C865D370A8BC82533037C9872B24390F7969ECA530911463520218D00B415409AFA90A63F88EE729A252F1B747C414414091
+216: 146FBF362ACCEB8DF79A761285A0653484C38585817E26A7B8906FBBEAD70031160C7B924D3BD3A9ACE28A5712ED0E6E89CE4E71493B27F87BF73BF592D80600
+217: 74B6738B2F0904FD59F3A680CFBFE4E466FB5094037AA1942DB3A0017260D75AC5916E044CAC6BD0E25D176FDA267542B2C7EA201F7237E18B9D00723E98A239
+218: E821A4033FAF0FEFE525115109D0B836A22C287E3B157EC302768BEF7989AACE853218E5AF7DEE9F6E234AD50ABCC8A9658A0EE4D9FE050235341C94308D7A4D
+219: C3EDD652D2F831B1C783CE1B8BB8CEF9453FC71F519A4800EC2362ECDBE9EC142F768185D55E322A32AF421DC84EF84615F7F3DBE6BC6E702B4BC8625CEB5BF3
+220: 6A3CA0B5A43EF42A1D6526C2F1507785248374C7D2602079A923C841F775A652724C29E788695B52387778CF2E2BBE2213B2FE212D729E3718D946238FF0E57E
+221: C425148335AF813E36D072DC64C7EF6782D7DB981C5142B5D32D6D4338E06AC64363E86E88DF018968FD659DBF50A4B77BE2A02E71B243D65024B36CD71C1796
+222: B796D1F5AB11389EC7EC8DD4D1D5AAF17262C8522A4AACF454B44A7ED71E20F7028169F3164AABEE4C716B38271D72D7ACA3E54B30B9E05616AC51594995F61D
+223: 113A56E96ED6F8613705B5CCA6CC4F2138204D7BC0C8965162597C1FD2F6E8143F57FF1160F4B482F7430536A349D20918064AAD2BB38A9D4403C16977B9616D
+224: 9590A3BD7A0613381159E1E26342C150DD9B0A937855BF78FBF625648448B540158196A2855E7FCB967F22F5AE927D60E97D0C1C17A01E8D07284FF985F54B8A
+225: 74B11968CC7CD925E21037DF011F1C93B2EC34C34A3224AA281ACE7D6F1B10F2A755DD6DDF33F1A4630123BC1CF875894FBD8D8B70AC05F8C3C1076E346A45B6
+226: 85A08D6993B7E5C014C3CA957D6B53EC1B8A5CEADD5060BBCC350915D3278F28E238425DA3A95AEF725A23B1BBD43E5D8832382BF76603F7E2E4FF711D540980
+227: BEFB08F621281473943AF153124256386570261916E5238FAFE44A72801D7C204A974B38696C102748CD1DF65BE3EA8C45A40021C28C7E4BB143800A3F38A93F
+228: AFB97494318F31A4C6813246D125217242247D4EB6CF884B244E59655DF866B2820A8E1A7123DCCDE98ECBDF1F6125EC5B95A0D9F85F05CB09537B3FCFC2CF3D
+229: E8C2E1D342E6503D77328A2C1336F95939B0E8855F75CFC61D4B03F4AF2305AB57C7DB383055A51E61AFB75494C222B01967BC74B4574B8208FC337E09E57075
+230: 0B396D0F15F49E60994DF4FB1E7E526A272A5B41FAB67EB8A41547CA6CE5B7F3FCE404B6A46BE79AAE37B4DF2C2EF68EAB71F39D5908760FB2124C7C83B0AAFA
+231: FE86580438E8EE3459A62E73AF0E14F00F4F0FAD0447921FAEB2B77A0D8786784659B1F6D3044538300C759EBEF7066F9218F9386FF6C8099E6C71B5EC6B721B
+232: C7E45B1737EBCA62C87A8F0C46F661BF7D3FC020C3B4B91988FC36C38BBC8DE05A22D4BF148F96D31115605D7B04D4CC8AB3F8738B652E933D76CD6966604CAE
+233: 2C43F84381FB618512EDA0278FD382AABBA41FCF5546312DA565F4503CACB86B8A704B3B49C0C86B2207E4641F71FB5E72654B0AEE705C52ECB2E8FAF109FDF0
+234: ABC4EED8635DDFFD9900F5DF8C6246CAF12D8CD9333F38647255DCC52A20B6DE8D4109957CBCC2F48F52346579E008091628FD7CAFA092F2568828F424EABF26
+235: 14672F19BEEF8896F751B0BCF40FEED78A8093AA4DCB590D7AA588DDEB3170460381FDEF3CFB608D55F9E8A295A36DD64DE058C9EFF30B1D1F1A3671388B0AB8
+236: DB87424F975B03F925D8B99A1DD0967D2283E408B6B0155851DCFD53C0C00B05A42CFE14B10408E0F5985809813D35D7AA7C70C1A7BC852C7F254F0303103628
+237: 095D34066A6E202C896EF29F3481EFACBBFA622676F58E90FCD5A0591124E489BE3804AFA9BD3E4C92A9653EBE878A88B275BF9B5C8EF8EA0F01C89CF40E5FE0
+238: BB5BC80C718B85BB3C3DCE95D186711D5B90827B2097DE63C647E5B6C14B4766BF8EE8ED395103030F72ADF0C8992AE836086571908DB4A6258616EDB4BDA878
+239: 9A18D6DD0F97B7407DB0F17896DB2A2751B76C69B6F91E821A0DD717DFDEF630EEC1427C2D190C095DDB07601DC0EC8687B7411D735A9A6EF0EEB84A60948BAC
+240: 60A614BC40A7DE580B6ADD05279A68DDCAE79EC3DDDD2C6FFF7B77BE9DD0260DA5241660982B77BA9C4B904075F39612F514BC86DF6F68E189FAE2C84A32CCE7
+241: 5CFCD44DECBE3D74708C620C70DA807C5AD58072F7558D950F519691FC96F98B760B02897C3A85F68EE37B2735931660106670C4DC7FA98EE2E18B6DED532A9F
+242: AFBE6D9871AFFE6D201E2E61435703856424301ADD5152DC745D96D1BAA3ADD4C78F2D7C5057F1AE8B21FB91879562050C84144A2042AB2CD273025FA03839F5
+243: CE9C1B19D0E0FFD3085D28C5B2176A741A3034C1B76C54740AAC3470C1C8C6E77BA765AC4D6D90D4DAB0A89AFB17A8863A2917674F5A189A5CBF721C14F5D637
+244: F2F065927839C22DF56960845E27868BA8F272A464619EFFD9AEBAF1E40A72DDA81CFC67DEE13C351736C407F59DAE8EE6F2BDA17521CF66F10C73566B7DA891
+245: 24CD3AFA2218863437C5518021D1B96E0A80EBD14EBF2FA161A5E7032FD985BF71EA59DC5E35DEDE5EEE3098EAF6A16698F5BD5903C4ED218868D1E96E4B8096
+246: 1C6AC311730640FE427C1F23B60E817C25E1318109643A8AB51DA74995FFC3F156F098AEF97F37CD9746002DAD22FBED1A1F222511B92AB5F39DA9B53BD62AF2
+247: 37609371EB63AEF0CA6EACED8388D187203A88C379F24970434D87950C9B7DF9A68B618E9E83E3EB10376504F8FEE2505830EFE3FFBD23EFBE081325AA171482
+248: F0C06F6A2C7AC3F0EE428D7D1BA893E73D4D2F417999043BEFBB3CED51F95F7EA3CA882B9E8C1C973DD8A7F450CD60BB5A0B30D44A574E43E71D2533EFAEC6B5
+249: 3A9D1BD43CB3B7D3E9364F05987DF4CD99D573C036BF1337988751658EAF2896244DF5E4DD8984DD494709E587A75EA8AFF93681787AD738A95C5E98616115F6
+250: D42E2D57B36095F0CFE8F771A9B198C7B7E0433763341D35033F32D21C638CD948D8DBE75F533391347C440F208D17F20614309DBF1091DCA10801E16F5D03B5
+251: FBB964B7865A889433E99C4B61D3CD069DEB99E44673068771030EB1B8F1FD3B3ECAED1DCE8ADFA44F9A625472CD4D987EC7ED7FDA0DA912C8AFF5B20BED7F04
+252: 13F67CAD96C3304FF3C2E45D71A2D69301695516EA384F6001850A46A7F93CB74C5A4CBC1C56544166ABB6C9BBF90B9559320F5F75ABBBDE34C7B8B45C783BC1
+253: 78A609196BB40EEEBEBC04A8794C840A6F831680864D65FAAB093A499A3CF152EAC96865747ACA28392E9F102962C49247E0EDA424A345C4AC6F4B60CC3D2597
+254: F199515CF806EA25237EB93D658BEDC994E61EF70F5665CC2F230E7A40EADA14BFA00D56C1249F2E5C8920977A6C85017F8663BE9422762CF88487B76EE7EF9B
+255: E8702ADD4B9034BCA0590FF897C10022C56D08FC4EEE0A43BA85E9E9C2086616B1BE7B6F928A3C53755506ED2D9D62DF5BA4A1862FBCDBA20683931A2244AFBE
+256: 6E6A3CDE12F2CB3A42EC8A5D21B435C4DA4DF6CA7E41537D361D8169158287BF1D2241581DE07F88FE92F5AE4E96EB9C489FC3B258EA3842EA2D511CE883883E
+
+HMAC-rmd128
+  0: E9BF401EB338AE9ECE9F2DE9CC104A5C
+  1: 9536B19B029E60F979B3A6B3052685BE
+  2: B52F90B48846959EF56051CB6ED21588
+  3: 0811D2108413D9B64ADFA78B05EDF1C8
+  4: E06414189CCE13B61A2FC3CE9BC11938
+  5: 8BA02647A4914BF4248F6C799055ABA8
+  6: A3D5D44CBE30E23D20643E865F28B7CF
+  7: 459DC8A812BBB840CA10A49E10F240E8
+  8: 26131CE4DEA7D66E5B3E6ECB1DDA4329
+  9: 5EB41B6A8F140E49BB4EBCB76EFAA0A4
+ 10: C5E076890071C872B071E2D068EAD1E3
+ 11: 476474365DEBAFE39DE7830A0BC3ADCE
+ 12: 3E9E0D4B41D740310572562E5F7F0CFF
+ 13: 9BA99B782F7B79C9C19D40EB27033941
+ 14: 8E9931A75435B113C7E17E94E22D0B7C
+ 15: 1977BEFFFBF378633AD22D9E489FFB90
+ 16: 9CA06536713225F3A5F67CB6510FB165
+ 17: F46F54B012982621E33BA13A871F82F8
+ 18: 73F925BD50E603A66B17D8D926CAD1FF
+ 19: AC74EC692DDBEF86570044E1B5F31EF2
+ 20: 4F4F95BC7487A8F07B23C11F700F9C4A
+ 21: 02CE78131B27AB77474CFAE5EEA37055
+ 22: 1D66BAD41487BA6C238BDAFC04E9963F
+ 23: 79058EE7D70C9D19058BE2E1D5383F39
+ 24: 773EB9C677055286C84B39D2344C43FE
+ 25: 414A4816C124BB62DBA3BF65B6276208
+ 26: 350DE5DF46801BAF8B12D4516E82EF43
+ 27: F31C58CD73A3D8AC050BFFA5FDB6200C
+ 28: 5D7489AAD6537DB3DC27D43F698F6E79
+ 29: EEF7FC37DCF2AB96328E62B8097203B6
+ 30: 8FD428368B9B52F25C47E74C0327DA52
+ 31: 923B6ECABD0337E39E6D068CC98F71A8
+ 32: ECF2239FC767105FC69F46FDA5BA37CB
+ 33: EAEEFEDEC3B1E74A029683FC21F03B40
+ 34: 9620C4913123F3A718D61C956673FB23
+ 35: 59283EDEA3804ECD6471EA41EAF89A8E
+ 36: FB5B60685DC1DAF0C6557325DBBB32C4
+ 37: DB71D12AA3B97C421FCBE45F8232F3E7
+ 38: B0849EE5F1F9484514F5512BD928148C
+ 39: C73A777E20CC49AD33DBCBB16DC59A84
+ 40: 600BF6FB779EA2F7108D1F7B8FE89F45
+ 41: 0BD76F07D4C433E5BB9FC98B7FE49A2C
+ 42: 209E2124DAAAB3B5C6D2DD9A79A36E4F
+ 43: 907E4E2540A6794D6526A44FA08CAAC3
+ 44: BA1BCEBA60F32ABD0EED0A1A56748248
+ 45: 31F8527CCDD022CB9439F8B39ED70D11
+ 46: 05F429D6AA9FBB1723D81AB268F95963
+ 47: 7B91D5409357FF13F9B92ED2C6D63B66
+ 48: 30AA88DDC6D49AEF0D4058616EEFD9D9
+ 49: 16C0B4F46936AD501EEB5BEC8C699EB3
+ 50: 782DDC3AA9B3E498767AA310D7C32CDB
+ 51: FABED92C454544588965E4CBBBDCDAC5
+ 52: 7B04EC847F160BE26FB4A7C6B111EF91
+ 53: C20AC6220BD352F8D53F0DEDBCA97862
+ 54: 2EB8A89C854AD2412E5E2DB8638550C1
+ 55: 390DC3D1C6EA4CD7A381BDD9F0B505A5
+ 56: 1D86B9AAE5246182EF76456E9A8F2CC3
+ 57: 1759BE8033CD082D771127CC81435696
+ 58: 4F230D4174BBB11231ABD4AB58D6FB80
+ 59: 9FA21699DE8CDE39FE4C9DF25271A87C
+ 60: 7658883C002D62D33EA21AC43E26C355
+ 61: ED1CD4C63C40453677804FD66BE3E068
+ 62: D715E8E09CF4C5A34793FCFF0A7EF0F9
+ 63: 86C450794C4F920138A8CF2DD9221826
+ 64: 2AE1A808F63CF7AFF39FE9595BE540EC
+ 65: C8E550F520B0662100FF767FC0FC38E4
+ 66: 1A4CA5249BA8BF8E4AF50BD01B89C13C
+ 67: 25A3566CEE5E0921857048F4A54BF745
+ 68: 4D76448CE2C08EBCF6C21FD304973DB1
+ 69: 83BBC6D82633974D76A1B0994DD8891E
+ 70: 9F322885EB927B8C4F93AAC081C7F378
+ 71: 7E0DFB22C9433A0A66A673ABB3E81B4A
+ 72: FD3DE62829CCF2AC389581D9932E1B94
+ 73: CADF66BDE69903E9E3117DFE75EB1C6C
+ 74: 71DD9BF191A5A1A0311BA19BF0568727
+ 75: EEC05781AEED255A8DA730399ABE8929
+ 76: 07E7E6E57A239F659A6B17B695161878
+ 77: 6E7DC67642EB72C295EC12C009902577
+ 78: F6AD3BF571AEC27B2C99AAD4A22B9654
+ 79: 0F38A5596BC9BFA1ABB7318A35E5841A
+ 80: 987BA29276694A84DF6F3448D2FA36B1
+ 81: 3661D8F157DCBA761D1292FC2FB332C5
+ 82: 81834820599DE6624EC116A651FFA2A4
+ 83: 59E556C023829D31F76ECB5D2D5050FC
+ 84: 9389597634228E243808C1CCCC71627D
+ 85: FFD30A17850DB17BBDE7C3EBC8482A95
+ 86: 0297895965B8C96F95A77E6A1BEB5FA5
+ 87: 46185FBA371A282AD8251A8DA93E7A10
+ 88: 34940377228A73C2CDA178635B8A4827
+ 89: 0737C31BEFDE68780EB3A5504F295809
+ 90: 3DEE2B38EAF96BC620785551C926E9AF
+ 91: 719B32410E625DC65AB4E422E24C8663
+ 92: 5B9AEA802EFFE00D19E746E0684993CC
+ 93: EE96F9B8F8FFC084C0EF8C28ED0EEC4C
+ 94: C6575E5F4CDEE50C0C2F41ECC33BC9E0
+ 95: 000DCE0FA82C1422ABF37EF1971B4B1F
+ 96: 83D1C6EBEF52D1B9DFA3F439BF8DCE25
+ 97: 657AFE5CA6D54F9083F02C257CE7E3DB
+ 98: 9E65239503BEAB92716D5B504358352A
+ 99: D8375320E32FAE3BBABD4620B1231315
+100: CC8914472A9B5862287D695AD0A88BE6
+101: B0E0D8EDA1BDBEBCD0A78678AD7D6A64
+102: C8EBE9364129E651BD4FB491FE035433
+103: 2A6DF032E0D615DB3BE890B0B6D3349D
+104: 975F0E184517902F1C239684EBC06314
+105: 5A86E403AD3D0B9EE5CF87C32482C6FA
+106: D3E986B5231A204C88D7C2FD1ECA40C5
+107: 891ABD274D024F8B04143DE588A02AC7
+108: EA619405003DD17F13ED5BFB29587568
+109: EF5CD5EF1164A2E5BBC2D96360E55B87
+110: 07C74397955571A7E4025BB9EC555846
+111: B5F20FB0AC1C1DAA0DEF8EF78A9BDDB5
+112: 88D91C18A4AD272B4C1E2C76BE217BFA
+113: AC548888F0E5E559777568ECE71E2007
+114: 816071E2B807CE6EF526E423BBA252D5
+115: 0585A675BADFDD749ECADE66BFFD0546
+116: 964CA97939664EE55B8B973D044D7695
+117: BB8FAACCE9D3238714C3934E6FEE2386
+118: 2BB26CD61B24CB5CB9E2C5FF40C51A00
+119: F5332DEBA64EB35CE3B5C7134C4C8495
+120: ADE7A5C99757D216D10E1F13E3A91F1F
+121: AE98C3C4FD874CE0B8501FE4C428282A
+122: 04D7625B67AC3F9D117AA45FEF6C6AC1
+123: A05D3C933DC8C8A1CF48290A5D52644E
+124: 078F882264317B0C00383FBA7E079301
+125: 44023F3B109763A53FDEFF1822488855
+126: CA535702BAAB858D5FB5B79895E0E1E0
+127: FE1C2C02B7665895DBD2F4D2C22A7232
+128: 75A182DB4FD99599022F5A03F1427289
+
+HMAC-rmd160
+  0: 33528FDB4FD0640B4C4363CEF1DE795719EBC7EE
+  1: 514DF566C6204373EEE6020054AE7DDE2B0934DB
+  2: CC8A5C8D2EBA02BF4474A4CC05CC2D863F1AA392
+  3: 27D731E218C369A32BE4B2BB29D2F1A0988BA583
+  4: 091245BFADF5C6635298702F233ECB3265E85460
+  5: BD2C07FA2197201DCA309063881F2EAC9D925A21
+  6: 480886856354E6FF34B3AFAF9E63FB794BAC4521
+  7: 258D58532BEB5EAD28E9BCA52AA4C0444CC2467A
+  8: DB7513F824B42A9E1FFC1369F22F61054A3EB7F0
+  9: 3A4A258F23675EE02E1AC1F72197D1A11F32DE21
+ 10: 9315ACAAAA8DC91A9AAF8DDD4CD000AE04F70E1D
+ 11: 57D60D77E1D78D23D3F184740D9DE392FC6C3C40
+ 12: 950395C815A3D1A4A8BB25322333FECA15445BFB
+ 13: F8201A01C30F3B569B7497B5191AE16D1705085D
+ 14: 08DEA1A0CD4BD6C9031C84FD2005F15810FF088B
+ 15: CF41D88EB3921FA137F0203C2CB8BC5200FDE7BE
+ 16: A07100AAACF5253501A6643452D07C7DE2EA824E
+ 17: 19DE22082D1F4535A733F16262A135358D651737
+ 18: D50BD92902AE0127AC8DD85E9A81ADB7EF3F1E64
+ 19: 3FA34A3C02E06DE451794AB87C4FCE6877458CDA
+ 20: 5928329E4D830E8B2F7608A4ED46DCCFD5798425
+ 21: 2825DBD7989A8978904A654E6AF125608B0BEBC1
+ 22: 9C812424417D47ED7C78C7A049D4E6CB906DCF3C
+ 23: 9518A473A902DB6BB56F7A767ABA13C8DF306D37
+ 24: 439C444C7AB4395C4DBA32E4F8CF4F76207E5BB4
+ 25: 9021FCB087269457ABAA8105D4DAD8DF8904A2F6
+ 26: 8B7B686199BC73A175940686BD57F45B2329D895
+ 27: 0F50FB7AA9425975BFBB6AD65CF96284F768BB75
+ 28: BAA1B7749A9CCAD7105E9ADEE499058A7BE4BA70
+ 29: FBD3413CE89DFFE2F0A869036F5C4265D5B14743
+ 30: 7CDB257E051ED0EFB761A5A044ECE5B0C1F12033
+ 31: BB1E5D495074594534AD523987D8438CF1632425
+ 32: CE6D7BEAD1496190F0F0E99B0B0C9BECFB7D9173
+ 33: F8BE617A3256EB1C4BFC04CD386EB7FA46603926
+ 34: D1A1F489434C458344239A75DA4241A3A94BEBA2
+ 35: BEDD951DC98BD5C4138C1F8531D8288BA3C51B87
+ 36: 9C2357E832CE87A227F6919B50A0A9D3A29B7CAF
+ 37: C9FCBB9A1AC48B71B2AA20AC992821531F1141EF
+ 38: 0B58D56923F9620BCD072703FBA71EC2172EEAD2
+ 39: D97480E09FA6473AF9AAFA14FA9589AF65E62328
+ 40: 4D5C56D0EB0BAD64FD0B0FB7F87D05EB551951CE
+ 41: B7EC2D13EDD3603D1BBC8CD29F32B43AEAF6EB4E
+ 42: 9BD5300B02C9432F686842E7900F3D2A085C5008
+ 43: 7E8787C8780C64009216324802958E1D845332FB
+ 44: 1A3BC1AE95380D609571B01D8C3458B2566B74A5
+ 45: 9672BD12EBBB12F398CEFA089BD3282A2D2892FB
+ 46: D5D3CAD705E2B0B6E0CBFBB0E8C22CD8EB1DC4C5
+ 47: 408D84FE0B28A3B3CF16F60D6207A94B36219F81
+ 48: 0B7E3D35C292D295797E3ED1F3D8BD5FD92A71BF
+ 49: 18AC1EA3406D69CD9E9C801F471AEA3A31C69D51
+ 50: 98E40CE293ABE4ACFADE7D81371FA92AFA69248C
+ 51: D95E38F2D0C5ADB478A9BFF9F8E7B10064455C31
+ 52: 6246C69FF502D453950BFEB5DBEF68CE76D70F12
+ 53: 9D788F02EEE675F47AB4498B1337C6D83A37F64A
+ 54: 139387D749674D0E84F3C2BFBAFB3F0CDC4CA273
+ 55: 09406CEDC1C37D275EBFE02CC707229244086CA2
+ 56: BACA138E6EB6E5BEF150083CE0EFC64FB163EBF4
+ 57: 87CF4CC4500A691934C2C6607F3296A0BEC980F6
+ 58: F8E4DB4FE6879870E9F47BA29F0DA843342953CE
+ 59: 52DDF305014F1C68A34ED514B10FAE3B1B91F383
+ 60: 0D568164C300BB14A4571A73493C02E4165383E4
+ 61: E1DD806961D718F8C085CEA11A140900FE8064A4
+ 62: 6470CBC7FE079B684D108550698B7C5D265736D4
+ 63: DAF83273B2F16DCC69FD55DC84835931E75FF5D8
+ 64: 47F4D7724BF49DE885D23D84D582EA3A00E1C2DE
+ 65: DBD6BD40F804E38963EBD2E81CE5196F6E69AC48
+ 66: BD96E9391148957BE64FE6DA89CBDFF45233FBCE
+ 67: 20975680C2E31D61D7F303215A25CFAB4479F646
+ 68: FFC321ED45ECC1A9FCDBC28ABAE0DA1FD27A628A
+ 69: 99F90008F139FA442C152706E522CEB349EABB00
+ 70: 288C57DAD9D1174F4EBA92F7815B93C0916E8157
+ 71: 8380FD083E742776CC32971B9E088B894A6A0071
+ 72: B0F44C66552ECE94502597B6B100CC64561E6F1F
+ 73: AA0465458FA1F285F5A4530035F84F844D545A75
+ 74: C90EE3BAC92FA4986C850DED11D728A78BE85543
+ 75: 3E525BBEB158B246A3F4918B6D634CE8EBE4503A
+ 76: 7B42675AAE1D0DA5A84623E47C618744249384E5
+ 77: F50AC31B43BC93D1BE2A4D9C40FC4D3593F2551C
+ 78: A31AE398E0D6668A52DAFE37D019F7571E0F681B
+ 79: BF10B29B4DC7C848C5192631E59E0EED32B8D81C
+ 80: 77B214EB3617C372C191D1D284FCED04F5AE17BF
+ 81: 1B17DC33F5966621F4BFA93961B1A8FFEE1AC820
+ 82: 5A07D9861EDA6D8698E12FE5250CCAD882628B44
+ 83: 176F46FF2202307828D7F62D39330444D688FDAD
+ 84: 59E94CFA3AC2BE8DC6098840E888306764308DE2
+ 85: 679F243847C647FCC3F4589CF87972558350DC98
+ 86: DB97F5EF492C7380472E16E3B055567DAB630153
+ 87: 359CF9515F6B2192BF0E85EDBBC81D51232210B7
+ 88: 30B59B3CBFFC08DA7D9514AE7627460BBBDED722
+ 89: F31D5E2866D9726051B6E5AC9B846DB36EB705FD
+ 90: 860A58DDB6119261646907E251D60760099CAA07
+ 91: 22EA0278EA053175C2F12BA4ED172FB0B518F3BA
+ 92: EC68297334F421AB3F2EF3518684E8E1B548BF56
+ 93: 5C1405CC33D9025DA265FF4F25942853721489E2
+ 94: 8AEA8E9EAFBF3BA597B65BBCCEE59013C8E6AC8B
+ 95: ABF7CCD01374D5DDAD6EFFB19412EE772E663DE2
+ 96: F7F28E05FAB93A3D089BBFF56D4E462F0BEDA41A
+ 97: B6C4199D504E72793EEB49611E28A82DF5CD7905
+ 98: 0B0916C89F1D9F1134E9106FEBAF4169DC49F752
+ 99: 4F18AA0E88A01ED162D08F35300B1C3FCE1FE8B8
+100: 5D4F3C473D5859C16F70C1566F9800B3DBBBC643
+101: 02C1A5F34232B8900E6C7DF2BED957BCAE529784
+102: CDD46E434331D7869A27EA096CAEBF586D93CC2E
+103: 492C04E69F0204F150B63022C7DBD28116458F97
+104: CDDAB90168E934E69E942B1F1EC0D0AD7BFB5B43
+105: F433642FA8091FB2517F3357DD30308B4A2AEF53
+106: 537B2118792B6A419C438E58CBB6C5BA887AE257
+107: 753728CB39813C27498033A07DEC03D1FA720FE9
+108: 119A6C5BF3EA8F7A78DA9ED2DE7ED9AE3942964A
+109: A501EB611542A2A2CCC68AE754D2EAC17942BD8D
+110: 158FB54E37C7DF54B29928B5DFA53A560DC09A5A
+111: 15F5380252E23B5C37EE7E8D1F5963FBF8788577
+112: 735F2C3CF7680C63F33AE2D4F3569FA8EB45EB93
+113: 67AFC501C6582DF2A9DBD713F206041E5F3E1DEB
+114: 7CAEFEC1C6E8232BCB90E3FE3523EE06496F36A3
+115: CC90ADFCF3F9AE777B30EAA6206A34EF54F74C02
+116: 974E0E85B47CCB870A511810DDEFE81CB85B28D3
+117: 516D6BA01E0186CB7D796FCD9DD169C45B63A93E
+118: A1CE534BDD6591AF4EBF61ED75636C7BFF670658
+119: 1E4B241D6EADD77E046BDCCD25F70AAC969262D3
+120: 7F2F1B4B77C3170A9E015DF4E8C6EDFE736DFFC3
+121: 89A3BF181EF195464DBEF9576873CA2DF7D16268
+122: E1F96A7C9115E3DBF28E10D62F2D6EC89415B6D7
+123: D75C1081B3C2720D030EC5DE13093357A0EE6E51
+124: C11603CDAD8DF271093CACDFB5AA4E113A270EA5
+125: 39A9E659DFFDC2ABC88ADA2B6A7445090C7EFBF7
+126: 4132330C5E3344818AF5C054AD55309FF7B767A2
+127: B107A8B0C7B68581969A0F6DB95DB2F790098F1D
+128: AD090CC9A6B381C0B3D87035274FBC056012A4E6
+

+ 407 - 0
notes/omac_tv.txt

@@ -0,0 +1,407 @@
+OMAC Tests.  In these tests messages of N bytes long (00,01,02,...,NN-1) are OMAC'ed.  The initial key is
+of the same format (length specified per cipher).  The OMAC key in step N+1 is the OMAC output of
+step N (repeated as required to fill the array).
+
+OMAC-aes (16 byte key)
+  0: 97DD6E5A882CBD564C39AE7D1C5A31AA
+  1: F69346EEB9A76553172FC20E9DB18C63
+  2: 996B17202E2EDEBD63F414DD5E84F3AF
+  3: D00D7DA967A2873589A7496503B3DBAB
+  4: B43C24C0A82DAA12D328395C2ABD7CAE
+  5: 9B902B6663B5FEDC6F9DCE74B35B91F2
+  6: 06A9678C65D7CE225E082ECA31788335
+  7: 7D67866CDB313DF65DED113DB02D6362
+  8: 259E28CF3E578AC47A21A77BA9EA8261
+  9: 32F23C8F93EA301C6D3FE0840CA8DB4B
+ 10: C2B06388AD6F8C43D19FE4F6A8ED21AE
+ 11: FA8622485DB2F62F84FF46E532A1A141
+ 12: F312D9B2E6272578F406B66C79F30A0E
+ 13: 7A5DE06B2BFB75ADA665E96F680AC098
+ 14: C3B00380F0BD8E2F5C9DD9945E0F36EE
+ 15: DDD87974A5FB2E7A4514241E94526B5B
+ 16: AD24FC47A0FEA84C54696DE997A94F4B
+ 17: 7538713D8AA2AE3726307EFF087BBF5E
+ 18: 7619A52B4C34A98440812F5F28F8DC4F
+ 19: 7E797B8846554888622CC5E400B2FA44
+ 20: 61E8DD3E09145F5657DB4B8F7BD2D7D8
+ 21: FDAE2A3FE60DDF1871C2613A293AB6F1
+ 22: A186D6EFD10DFFD2C088480B0A784185
+ 23: 3119D337865618CDA55C06FB992427CF
+ 24: 413E3EAD7E3F169A37C49F9CA92E235E
+ 25: 37A55AF22373B9A1E2F8368B2FB992CA
+ 26: 4941F604C40EEEE1A16CFE073C12D1FE
+ 27: 3E8F4A0876BF12A2DCA87157F15DC884
+ 28: 5DFAE292D8EEB13D8FE5725E5D169742
+ 29: 59160455E0C0B35D950BA67C77F9FB05
+ 30: 5AC0D736A06A7DD146B137ADEE78EE06
+ 31: 0CA1178F28B953045EE76E2E760036CA
+ 32: 025616215F870D1EF838AD1D2AE0C649
+
+OMAC-blowfish (8 byte key)
+  0: 2CFB5DE451FFE8CC
+  1: A5AC339DB44D020C
+  2: A3CE0CF62249444D
+  3: 3076B7129CE3F6A1
+  4: 9E091A637DDF70E3
+  5: 275199AB20A5F09C
+  6: CDEDA8D16A401E62
+  7: FC980516CF5C9E30
+  8: 659D0B31D21B622B
+  9: 8306847B5E72E018
+ 10: 7AD029BBF1D2919F
+ 11: 133181425C6808C9
+ 12: FC5AC60E367F413A
+ 13: E0DF8BCCF0AD01D9
+ 14: AC5015398FA64A85
+ 15: 1F068F22AFFECEE1
+ 16: 8E6831D5370678EF
+
+OMAC-xtea (16 byte key)
+  0: 4A0B6160602E6C69
+  1: 1B797D5E14237F21
+  2: 938300C83B99D0AC
+  3: F989B99B3DE563C6
+  4: F65DEA2A6AD45D1E
+  5: 1DB329F0239E162E
+  6: C0C148C4EE8B4E1F
+  7: D82B387D5DFFE1FB
+  8: 1D027A4493898DF2
+  9: 196369F6B0AF971A
+ 10: 2A37A2655191D10A
+ 11: BD514BE32718EB4A
+ 12: B4DBC978F8EE74ED
+ 13: 8ACCAD35C3D436AE
+ 14: 73ABDC1956630C9B
+ 15: 73410D3D169373CE
+ 16: 23D797B3C7919374
+
+OMAC-rc5 (8 byte key)
+  0: E374E40562C3CB23
+  1: B46D83F69233E236
+  2: 7CB72B1D335F04B0
+  3: 94457CBC97B31328
+  4: 543D0EDFCDCD7C76
+  5: 5164EFA8412EAA5D
+  6: 13CA0717EF95F9A7
+  7: 2AA49A7AA7719700
+  8: C9E7C56125C3D90F
+  9: 2BE3E15FE58648AA
+ 10: 77D0B90372D6D0FD
+ 11: 17408F62ECD62F57
+ 12: 7864EFFA59DC059B
+ 13: 3212E76E25E5DEA8
+ 14: E2424C083CDE5A6A
+ 15: DE86FFDBDA65D138
+ 16: 85482C24D61B8950
+
+OMAC-rc6 (16 byte key)
+  0: E103BD8BA47B7C1C010E1561712E6722
+  1: E51AEECFED3AF40443B3A1C011407736
+  2: FA6506C5ABE03381B045D28D1D828966
+  3: FAC4237FFE7772E2299D3D983BB130DD
+  4: 3A7E24D41121A5D4F96FCECF0C2A4A10
+  5: AA44291E5500C1C8E1A14CB56E4F979A
+  6: 4B8FDA6DA6B3266E39111F403C31754E
+  7: 4DF5F1A1C8EBC7F56D0D12EEB63FF585
+  8: 46A6DDE419355EDE14D31045FCA1BA35
+  9: 71756D4D3DF59578B7F93FD4B5C08187
+ 10: ADA292A19F8636A03A8BC58C26D65B0D
+ 11: 703190DAF17F8D08A67A11FDF0C2A622
+ 12: D2B94CAD1AFC5CD012575964D1425BE6
+ 13: 45FD0069FCA6F72E23E4DB41AA543091
+ 14: 36F652600F5C9F226721400A7199E2BA
+ 15: E8CC6389ECF8EF1DBB90A0FD051B7570
+ 16: 8125446B975DBDA742A903340D6B96C7
+ 17: 00B55E4399EB930E592F507F896BF3DC
+ 18: 33E58F42A47C9543A851D6CA9324FEE0
+ 19: 9F28FDEA3EC7F515128F5D0C0EB684C5
+ 20: AC1DAF6C01AA28BCC0A819189FA949D7
+ 21: D0532B5F54A179444D052A4D2AD6E4F9
+ 22: 58B80A66549404C7B9F64D5AE3F798AB
+ 23: D0D6D586477F92311DDF667E0749D338
+ 24: 0DFC0FAA67FF114398CE94D0688AE146
+ 25: E163B8C00CF5CC9FA23ACACD62B53D64
+ 26: ACE9270456AF9BD388BA72E98825CFE8
+ 27: 4302EED9BAA19C7A296585E23A066A44
+ 28: B3EEABEFAB25C7478419265564715387
+ 29: 9F0630ADE9C74AB2981D63F3B69E85BF
+ 30: 1215A9446A275CCE2714F94F3C213BB7
+ 31: AF43D7F748DE0E3458DB970BAC37E98D
+ 32: BF871AC9E892CE0DCD7C8C7ADDD854C6
+
+OMAC-safer+ (16 byte key)
+  0: A2C8C7FEA5529D01C3FF4E9359EF74F4
+  1: EAB87021118FF24FE79B69ABCCB14A8F
+  2: 789566F467BAA68F4CC3C4B61901D6D4
+  3: 369F41EEAF7D628F9E0D77BE43BFC1D2
+  4: DC46A20E1F36F45006ED5B43BEC20DA6
+  5: 8F150CE34F57BBA2E6CE3431B78E4ACD
+  6: 61CD154478BE20F33B26CD8FC58091A5
+  7: 4E6DAA575CF28F1F48B256262B7D558C
+  8: D21FA4F1859571DB91E92767C5487AA2
+  9: E3D009DC7E71FBBB030B8FF0B544A2C9
+ 10: 094C236EA48ABF7DBAE5A88AA3DE07D7
+ 11: 00C401996F8224359566660AC1CEDAA1
+ 12: D580EC60F712558D875F01643D96653F
+ 13: 8482298027C7B4D5969787A1DB1B1F2F
+ 14: AB726AE3DA95CB242E63EF876A4BC446
+ 15: D668ED4919003F5E45590663FAED41DA
+ 16: E4CFFD7E0E7B176867C386001849FD6F
+ 17: 37B3C6DEFC5573879006D15F982A397C
+ 18: 0AB8847EE6A41A0E960080EF0D1BF1C5
+ 19: 2C94FCA2A685F276A65ED286AE12FD9F
+ 20: 23383032032D7B5165A31ECA156DBD23
+ 21: E1EECFB3D671DF694FFB05AE4305AD4C
+ 22: A0F6CA99B96CD1EDD04C52828C8A4D74
+ 23: 12D6B7053417AF3E407EFD6EE1CC38FE
+ 24: A566D1C39AE7A1A0A77D5A1F56C5FAAB
+ 25: 81C9FAECEAEA326140AFCD569668F669
+ 26: 6A00BF1D0DC893868378E4347CB4A1B9
+ 27: 98842956DBE7AFB1BF49C46497BD54C7
+ 28: 88EFCD5A1644B75BB0B3F5DD338849CE
+ 29: 77EC62C278C61163B1BEC595A11F047A
+ 30: 147424E817DC69413CC657E0CB292F7F
+ 31: A2946CBB910743EF62D8A3C7391B9B9B
+ 32: 00EEDA55520B8A5B88B76487E80EB6E1
+
+OMAC-twofish (16 byte key)
+  0: 0158EB365FCCFDD94EBA6BE42B6659C4
+  1: 17DA580917D147D10CB73DB6800B0E59
+  2: 3F185CC15EF3328D3E075665308C07C8
+  3: 5712A97ACC9D08FE9D2087D0CA16B0AD
+  4: 90425A8CC1C026DDD896FC2131AF654B
+  5: 30A43D4FEAE71F5396308C16DA081B4A
+  6: 6839FEF605704D49F1A379A9E9595E6F
+  7: 56A8F06DFEE543971B351B07430E2026
+  8: 36DD0E4B55C5314F9F2753D7EB6F0849
+  9: 8E319249A3CD456460F410F518F8CEDB
+ 10: 463978BE2A063C22E71DC71520723517
+ 11: 1B735E45FD3DF636E0A6104D4A2E9CB8
+ 12: 628A82213148AD9791153D5AAFBDDFDC
+ 13: 21AFDF08A36ADB6659B656C8EA0800E5
+ 14: E5C3E58803DDBE174E0D4C2B8171AEF0
+ 15: FC6981F2B4359BA05988D61822C0FA88
+ 16: 7B03498FAFB04A6542248852225F9DAE
+ 17: 9B173E91E59A940186E57BB867B8307B
+ 18: 470BF2EE614C8423AA3FDF323F1C103E
+ 19: 6E664AFDFD8306547BBEDA036D267B79
+ 20: F61AEC1144C3DD646169E16073700AC6
+ 21: AE503B139707AFA494F7F2DE933EE81A
+ 22: A0A8BDD4ED0DCAE4A8E1DCEE56368FF0
+ 23: 460B8207930DA434AE6AFECC305D9A26
+ 24: 7F03F8C7BA5365CC65F7864A42693BC8
+ 25: 31448849D6190484192F29A221700011
+ 26: BDA941019C75551D858F70FB1362EB23
+ 27: 2880CB3E62447AE8EACA76C17971BB18
+ 28: FC8D710FA3990B56357E61C2A302EB84
+ 29: 793CD15348D7DFF301C47BC6E6235E22
+ 30: 6FB0CE69A15A3B6A933324A480077D35
+ 31: C24FCA5DD4AE0DF2BFF17364D17D6743
+ 32: DC6738080478AF9AF7CA833295031E06
+
+OMAC-safer-k64 (8 byte key)
+  0: 726FE2DD40A43924
+  1: 2A138B65EB352621
+  2: 9588A1B53E29616C
+  3: C025DEFDE1A59850
+  4: 73D062F1B6D8E003
+  5: 944598A2FC8A2D76
+  6: B176C25D8CAFFC98
+  7: 14F05014DE6A090A
+  8: A7B9847B2CE22D0F
+  9: FCD71310CBAA3A62
+ 10: BFF00CE5D4A20331
+ 11: BEE12A2171333ED5
+ 12: 333FD849BEB4A64A
+ 13: D048EC7E93B90435
+ 14: F04960356689CFEF
+ 15: 9E63D9744BF1B61A
+ 16: 7C744982F32F8889
+
+OMAC-safer-sk64 (8 byte key)
+  0: E96711BA37D53743
+  1: 7DCFF26A03509FE1
+  2: 0A20EF19C8EE9BF2
+  3: FE2883748A6963CF
+  4: 557060195B820A18
+  5: 771A7931FBBE5C0F
+  6: 6BDBCE5F96CF91D8
+  7: F3B924CCE8724595
+  8: EC7191286D83C2C3
+  9: 94F55B19BB7A8AC1
+ 10: 2189F4F2B06A8CA4
+ 11: 99853DAEBCA33A46
+ 12: 66EAC37A033802D7
+ 13: 845D7AA866F8A8AD
+ 14: 33A874DFECAC22AC
+ 15: 63DD9F7A7F3683DF
+ 16: EAC277D951676C44
+
+OMAC-safer-k128 (16 byte key)
+  0: 8037B89AF193F129
+  1: FF2314E87BA6AFE1
+  2: C3243DF896B61D85
+  3: 0F61C715CE821AB8
+  4: EBFDC6A9CFD2F5A4
+  5: AB6497D7AF2C7FFF
+  6: C920CEEB7C1819C2
+  7: 3E186951B545A7E5
+  8: 5EA36A93C94AF4AC
+  9: 6A2C59FAE33709BE
+ 10: BF1BAFAF9FC39C19
+ 11: 69EB6EF046677B7C
+ 12: CDDCEE6B20453094
+ 13: A3833BD3FED6895C
+ 14: B6C05E51F01E049B
+ 15: 90A2D0EAB739D39B
+ 16: 07BF607A161D0A66
+
+OMAC-safer-sk128 (16 byte key)
+  0: 5E8B137A3946A557
+  1: 0228FA66B13F3C7E
+  2: A6F9BBAFF050DCDD
+  3: F75880F684A796CE
+  4: E0AEFB8E32040EBD
+  5: 9F65D658B86D310F
+  6: 3FA52804FB46CCAA
+  7: 2F6D12D199FCD2FB
+  8: CB56AF60AFB4D2BB
+  9: 8E6F0FF6FDD262FD
+ 10: 490245BE3CCCEDE2
+ 11: EFD319AE46C73005
+ 12: 43E00E545C848995
+ 13: 10444B41ECA15EBE
+ 14: 521775C389D5BE71
+ 15: 9B683EF8B097FEBA
+ 16: 3C5D746EED09530A
+
+OMAC-rc2 (8 byte key)
+  0: F001FE9BBC3A97B0
+  1: 8F8DC9C952897FBD
+  2: EC82EAD195AAC38C
+  3: 53DD52269B19E9A4
+  4: 9B86F64BF72A0647
+  5: 664A88A29F2898C6
+  6: AFEC3F71C1415666
+  7: 9BA1F2C1A2E765F9
+  8: 402A12120908B436
+  9: 03ECCD4C6AF44144
+ 10: E8CA3529B5D9D6FC
+ 11: 951EE10779CC585D
+ 12: B9083CA88E7E819B
+ 13: AFFB9E884DACC5B7
+ 14: E942E8BC241343D6
+ 15: 9B190489091344FB
+ 16: 9330A9E05554A15A
+
+OMAC-des (8 byte key)
+  0: C9085E99D74DF01D
+  1: FAC84F0EFBEF8630
+  2: C37C5FECE671CF16
+  3: 45B2CBEE8701A5B1
+  4: 53665E1F024EB001
+  5: 357123CEDFC9FF61
+  6: BD2CFD33FB1F832B
+  7: 1AAA9D8C9120BDBF
+  8: EB9F589AE9D4E78F
+  9: C8F9D2ACE691922D
+ 10: 81ED6F3611DDC0FD
+ 11: 2965ABEAC46839EE
+ 12: 2208B1E095F7AE2E
+ 13: C0414FE41800113E
+ 14: 653A24119CF43D97
+ 15: 7FB7CE0862958B37
+ 16: 55097816B10C549B
+
+OMAC-3des (24 byte key)
+  0: 7F07A9EA8ECEDF9E
+  1: 4E2A652EB5FBF5F8
+  2: 4F84E3779ACCB9F5
+  3: 7134AB3463115DC6
+  4: 82327BE8EA2D7E0B
+  5: 24950B9C14D87CD9
+  6: B25A097BB7E0E18A
+  7: ED51BAE55ED925E7
+  8: 56B79E7644556975
+  9: A65BD98E4D4E31E2
+ 10: 11145BB51514482D
+ 11: 397486787E676BA6
+ 12: BD1F6DEBAF6D9AEF
+ 13: 5CC3921F7DB815CF
+ 14: B0C0E60DA5F727F3
+ 15: F8637AEEFF10F470
+ 16: 0EA19531D42706EA
+
+OMAC-cast5 (8 byte key)
+  0: 7413DCDB9F0C3100
+  1: 423799EDF1472B79
+  2: 03856F0CB4F11606
+  3: F152AE6360813DE0
+  4: 853998BD980AD146
+  5: AE6C3D667DB8B414
+  6: B5A4986A34BDE20F
+  7: E5ABE5B979798942
+  8: BEE8DFED4555F405
+  9: 6B5339E952AF61BE
+ 10: 5E867CF34D9C1149
+ 11: F9C55CB3BC655E08
+ 12: EA09A2929AC7D915
+ 13: CE8EB0E4370E1933
+ 14: 749A424B2AA91B98
+ 15: 8DDA93C2B814D5D1
+ 16: E8B0B219D4CB699B
+
+OMAC-noekeon (16 byte key)
+  0: 897F93D42DF43E4FDACB0E19A27D0CF5
+  1: 3FAB4FD1A374C36E80D0535ADA81583A
+  2: 209F1B04BD823B068BC19CEF40B875DB
+  3: E8FC96A2D8EB9BDA9E8A4EA8F6FE611A
+  4: 35DE59C345C4AF97924187A6EA73F556
+  5: 59793AB3D84D614D8AEE6E233B3DE755
+  6: 64DCB7E74485DF98F4DC70B14DD26107
+  7: 42E87ABB43E4504DB362B59A9BBC28DC
+  8: 98EC0C30C1AFBF4BC9A2DF421AC446E4
+  9: 8B3B59B481B7AFDB6BC593E2BB2A80B2
+ 10: 0F60392A9518682015F43B8109E3A773
+ 11: A99BEC6BB467B5949EC4819B8FB47874
+ 12: 8E15ED270998CD1D7226B2BB9B5A8BC8
+ 13: B4D637277DE68E507DD95E6EC495B364
+ 14: DCCF001FA3A9AB5C58213CEB90B341E7
+ 15: 508C01FDA50B06DDC1AF9CD78F0FD2C7
+ 16: 3DB78001DE8115BE9E0B884AE4243926
+ 17: 165951DF3F7D28AD6A2FE56DC32A0F60
+ 18: 155944AEA14A6E08283421E8F19FE6F3
+ 19: 151BEE5BC94004DFD407A0EFE51F8D9A
+ 20: 081C3192C00D7BACB147FDDA5C460A4A
+ 21: BEEB181DB90F5B3B1DD5BCFFC87C66DE
+ 22: D83B9F8AFD912D8424C85AB0FBDD4751
+ 23: A3BAF0E00DEBFB9C3A7B65A5AFCEE670
+ 24: D03695C35C7D36C05FD26ADBF070E559
+ 25: 5BFAA49199ABCE1CFBA626D30FA6AB0F
+ 26: 9C3601196AD328AADBE62C730ECCC888
+ 27: 75D79E48C5797963EBAF466BC0E1639E
+ 28: 968DF7D963E6D023EC8421C7B2787E7B
+ 29: 5E315EB6B6E583E7D8CF78A3A81D28C9
+ 30: 322E00FC522FA7B41A6564E37F3D9DDC
+ 31: AAB04CB0B25A7A7951C75592BA7CB360
+ 32: CD5B1ED284EDCD493EFE133ECEA0F822
+
+OMAC-skipjack (10 byte key)
+  0: 84EDFA769040603C
+  1: 7DA58A4CBD642627
+  2: 118F60115CFC8229
+  3: A7F7346D34DB2F0E
+  4: 35615CCD526CD57F
+  5: DE471601A3660844
+  6: 15FCCE6D6D883D1F
+  7: C6F694861233151B
+  8: 3B762B397F16E807
+  9: 976C6AB59FB3AB12
+ 10: 6810791F2C595961
+ 11: 7FA3478286917F17
+ 12: 73DEE44A51C6B610
+ 13: 89EE8B253B1ACE81
+ 14: CDF2586A56C8A0B5
+ 15: ED91F98DA98F42C4
+ 16: D8D0FA5CE96B08BF
+

+ 15 - 9
notes/tech0003.txt

@@ -12,28 +12,29 @@ and no heap.
 To save space all of the symmetric key scheduled keys are stored in a union called "symmetric_key".  This means the 
 size of a symmetric_key is the size of the largest scheduled key.  By removing the ciphers you don't use from
 the build you can minimize the size of this structure.  For instance, by removing both Twofish and Blowfish the
-size reduces to 528 bytes from the 4,256 bytes it would have been (on a 32-bit platform).  Or if you remove
-Blowfish and use Twofish with TWOFISH_SMALL defined its still 528 bytes.  Even at its largest the structure is only 
+size reduces to 768 bytes from the 4,256 bytes it would have been (on a 32-bit platform).  Or if you remove
+Blowfish and use Twofish with TWOFISH_SMALL defined its still 768 bytes.  Even at its largest the structure is only 
 4KB which is normally not a problem for any platform.  
 
 
 Cipher Name | Size of scheduled key (bytes) |
 ------------+-------------------------------|
+Twofish     | 4,256                         |
 Blowfish    | 4,168                         |
-RC5         | 204                           |
-RC6         | 176                           |
+3DES        | 768                           |
 SAFER+      | 532                           |
 Serpent     | 528                           |
 Rijndael    | 516                           |
+RC5         | 204                           |
 XTEA        | 256                           |
-Twofish     | 4,256                         |
-Twofish [*] | 193                           |
-SAFER [#]   | 217                           |
 RC2         | 256                           |
 DES         | 256                           |
-3DES        | 768                           |
+SAFER [#]   | 217                           |
+Twofish [*] | 193                           |
+RC6         | 176                           |
 CAST5       | 132                           |
 Noekeon     | 32                            |
+Skipjack    | 10                            |
 ------------+-------------------------------/
 Memory used per cipher on a 32-bit platform.
 
@@ -43,4 +44,9 @@ Memory used per cipher on a 32-bit platform.
 Noekeon is a fairly fast cipher and uses very little memory.  Ideally in low-ram platforms all other ciphers should be
 left undefined and Noekeon should remain.  While Noekeon is generally considered a secure block cipher (it is insecure
 as a hash) CAST5 is perhaps a "runner-up" choice.  CAST5 has been around longer (it is also known as CAST-128) and is 
-fairly fast as well.  
+fairly fast as well.
+
+You can easily accomplish this via the "config.pl" script. Simply answer "n" to all of the ciphers except the one you want
+and then rebuild the library.  [or you can hand edit mycrypt_custom.h]
+
+

+ 244 - 0
omac.c

@@ -0,0 +1,244 @@
+/* OMAC1 Support by Tom St Denis (for 64 and 128 bit block ciphers only) */
+#include "mycrypt.h"
+
+#ifdef OMAC
+
+int omac_init(omac_state *omac, int cipher, const unsigned char *key, unsigned long keylen)
+{
+   int err, x, y, mask, msb, len;
+
+   _ARGCHK(omac != NULL);
+   _ARGCHK(key  != NULL);
+
+   /* schedule the key */
+   if ((err = cipher_is_valid(cipher)) != CRYPT_OK) {
+      return err;
+   }
+
+   if ((err = cipher_descriptor[cipher].setup(key, keylen, 0, &omac->key)) != CRYPT_OK) {
+      return err;
+   }
+
+   /* ok now we need Lu and Lu^2 [calc one from the other] */
+
+   /* first calc L which is Ek(0) */
+   zeromem(omac->Lu[0], cipher_descriptor[cipher].block_length);
+   cipher_descriptor[cipher].ecb_encrypt(omac->Lu[0], omac->Lu[0], &omac->key);
+
+   /* now setup the system */
+   switch (cipher_descriptor[cipher].block_length) {
+       case 8:  mask = 0x1B;
+                len  = 8;
+                break;
+       case 16: mask = 0x87;
+                len  = 16;
+                break;
+       default: return CRYPT_INVALID_ARG;
+   }
+
+   /* now do the mults, whoopy! */
+   for (x = 0; x < 2; x++) {
+       /* if msb(L * u^(x+1)) = 0 then just shift, otherwise shift and xor constant mask */
+       msb = omac->Lu[x][0] >> 7;
+
+       /* shift left */
+       for (y = 0; y < (len - 1); y++) {
+           omac->Lu[x][y] = ((omac->Lu[x][y] << 1) | (omac->Lu[x][y+1] >> 7)) & 255;
+       }
+       omac->Lu[x][len - 1] = ((omac->Lu[x][len - 1] << 1) ^ (msb ? mask : 0)) & 255;
+ 
+       /* copy up as require */
+       if (x == 0) {
+          memcpy(omac->Lu[1], omac->Lu[0], sizeof(omac->Lu[0]));
+       }
+   }
+
+   /* setup state */
+   omac->cipher_idx = cipher;
+   omac->buflen     = 0;
+   omac->blklen     = len;
+   zeromem(omac->prev, sizeof(omac->prev));
+   zeromem(omac->block, sizeof(omac->block));
+
+   return CRYPT_OK;
+}
+
+int omac_process(omac_state *state, const unsigned char *buf, unsigned long len)
+{
+   int err, n, x;
+
+   _ARGCHK(state != NULL);
+   _ARGCHK(buf   != NULL);
+   if ((err = cipher_is_valid(state->cipher_idx)) != CRYPT_OK) {
+      return err;
+   }
+
+   if ((state->buflen > (int)sizeof(state->block)) || (state->buflen < 0) ||
+       (state->blklen > (int)sizeof(state->block)) || (state->buflen > state->blklen)) {
+      return CRYPT_INVALID_ARG;
+   }
+
+   while (len != 0) { 
+       /* ok if the block is full we xor in prev, encrypt and replace prev */
+       if (state->buflen == state->blklen) {
+          for (x = 0; x < state->blklen; x++) {
+              state->block[x] ^= state->prev[x];
+          }
+          cipher_descriptor[state->cipher_idx].ecb_encrypt(state->block, state->prev, &state->key);
+          state->buflen = 0;
+       }
+
+       /* add bytes */
+       n = MIN(len, (unsigned long)(state->blklen - state->buflen));
+       memcpy(state->block + state->buflen, buf, n);
+       state->buflen += n;
+       len           -= n;
+       buf           += n;
+   }
+
+   return CRYPT_OK;
+}
+
+int omac_done(omac_state *state, unsigned char *out, unsigned long *outlen)
+{
+   int err, mode, x;
+
+   _ARGCHK(state != NULL);
+   _ARGCHK(out   != NULL);
+   if ((err = cipher_is_valid(state->cipher_idx)) != CRYPT_OK) {
+      return err;
+   }
+
+   if ((state->buflen > (int)sizeof(state->block)) || (state->buflen < 0) ||
+       (state->blklen > (int)sizeof(state->block)) || (state->buflen > state->blklen)) {
+      return CRYPT_INVALID_ARG;
+   }
+
+   /* figure out mode */
+   if (state->buflen != state->blklen) {
+      /* add the 0x80 byte */
+      state->block[state->buflen++] = 0x80;
+
+      /* pad with 0x00 */
+      while (state->buflen < state->blklen) {
+         state->block[state->buflen++] = 0x00;
+      }
+      mode = 1;
+   } else {
+      mode = 0;
+   }
+
+   /* now xor prev + Lu[mode] */
+   for (x = 0; x < state->blklen; x++) {
+       state->block[x] ^= state->prev[x] ^ state->Lu[mode][x];
+   }
+
+   /* encrypt it */
+   cipher_descriptor[state->cipher_idx].ecb_encrypt(state->block, state->block, &state->key);
+ 
+   /* output it */
+   for (x = 0; x < state->blklen && (unsigned long)x < *outlen; x++) {
+       out[x] = state->block[x];
+   }
+   *outlen = x;
+
+#ifdef CLEAN_STACK
+   zeromem(state, sizeof(*state));
+#endif
+   return CRYPT_OK;
+}
+
+int omac_memory(int cipher, const unsigned char *key, unsigned long keylen,
+                const unsigned char *msg, unsigned long msglen,
+                unsigned char *out, unsigned long *outlen)
+{
+   int err;
+   omac_state omac;
+
+   if ((err = omac_init(&omac, cipher, key, keylen)) != CRYPT_OK) {
+      return err;
+   }
+   if ((err = omac_process(&omac, msg, msglen)) != CRYPT_OK) {
+      return err;
+   }
+   if ((err = omac_done(&omac, out, outlen)) != CRYPT_OK) {
+      return err;
+   }
+   return CRYPT_OK;
+}
+
+int omac_file(int cipher, const unsigned char *key, unsigned long keylen,
+              const char *filename, unsigned char *out, unsigned long *outlen)
+{
+#ifdef NO_FILE
+   return CRYPT_NOP;
+#else
+   int err, x;
+   omac_state omac;
+   FILE *in;
+   unsigned char buf[512];
+
+   in = fopen(filename, "rb");
+   if (in == NULL) {
+      return CRYPT_FILE_NOTFOUND;
+   }
+
+   if ((err = omac_init(&omac, cipher, key, keylen)) != CRYPT_OK) {
+      fclose(in);
+      return err;
+   }
+
+   do {
+      x = fread(buf, 1, sizeof(buf), in);
+      if ((err = omac_process(&omac, buf, x)) != CRYPT_OK) {
+         fclose(in);
+         return err;
+      }
+   } while (x == sizeof(buf));
+   fclose(in);
+
+   if ((err = omac_done(&omac, out, outlen)) != CRYPT_OK) {
+      return err;
+   }
+   return CRYPT_OK;
+#endif
+}
+
+int omac_test(void)
+{
+#if !defined(LTC_TEST)
+    return CRYPT_NOP;
+#else
+    static const unsigned char key[] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 
+                                         0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c };
+    static const unsigned char pt[]  = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+                                         0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
+                                         0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 
+                                         0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
+                                         0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11 };
+    static const unsigned char tag[] = { 0xdf, 0xa6, 0x67, 0x47, 0xde, 0x9a, 0xe6, 0x30,
+                                         0x30, 0xca, 0x32, 0x61, 0x14, 0x97, 0xc8, 0x27 };
+    unsigned char out[16];
+    int err, idx;
+    unsigned long len;
+
+
+    /* AES can be under rijndael or aes... try to find it */ 
+    if ((idx = find_cipher("aes")) == -1) {
+       if ((idx = find_cipher("rijndael")) == -1) {
+          return CRYPT_NOP;
+       }
+    }
+    len = sizeof(out);
+    if ((err = omac_memory(idx, key, 16, pt, 40, out, &len)) != CRYPT_OK) {
+       return err;
+    }
+
+    if (memcmp(out, tag, 16) != 0) {
+       return CRYPT_FAIL_TESTVECTOR;
+    }
+    return CRYPT_OK;
+#endif
+}   
+
+#endif

+ 32 - 40
prime.c

@@ -2,75 +2,67 @@
 
 #ifdef MPI
 
+struct rng_data {
+   prng_state *prng;
+   int         wprng;
+};
+
+
 #define UPPER_LIMIT    PRIME_SIZE
 
 /* figures out if a number is prime (MR test) */
 int is_prime(mp_int *N, int *result)
 {
    int err;
-   if ((err = mp_prime_is_prime(N, 8, result)) != MP_OKAY) {
-      return CRYPT_MEM;
+   _ARGCHK(N != NULL);
+   _ARGCHK(result != NULL);
+   if ((err = mp_prime_is_prime(N, mp_prime_rabin_miller_trials(mp_count_bits(N)), result)) != MP_OKAY) {
+      return mpi_to_ltc_error(err);
    }
    return CRYPT_OK;
 }
 
+static int rand_prime_helper(unsigned char *dst, int len, void *dat)
+{
+   return (int)prng_descriptor[((struct rng_data *)dat)->wprng].read(dst, len, ((struct rng_data *)dat)->prng);
+}
+
 int rand_prime(mp_int *N, long len, prng_state *prng, int wprng)
 {
-   unsigned char buf[260];
-   int err, step, ormask;
+   struct rng_data rng;
+   int             type, err;
 
    _ARGCHK(N != NULL);
 
-   /* pass a negative size if you want a prime congruent to 3 mod 4 */
-   if (len < 0) {
-      step = 1;
-      ormask = 3;
-      len = -len;
-   } else {
-      step = 0;
-      ormask = 1;
-   }
-
    /* allow sizes between 2 and 256 bytes for a prime size */
    if (len < 2 || len > 256) { 
       return CRYPT_INVALID_PRIME_SIZE;
    }
    
-   /* valid PRNG? */
+   /* valid PRNG? Better be! */
    if ((err = prng_is_valid(wprng)) != CRYPT_OK) {
       return err; 
    }
 
-   /* read the prng */
-   if (prng_descriptor[wprng].read(buf+2, (unsigned long)len, prng) != (unsigned long)len) { 
-      return CRYPT_ERROR_READPRNG; 
-   }
-
-   /* set sign byte to zero */
-   buf[0] = (unsigned char)0;
-
-   /* Set the top byte to 0x01 which makes the number a len*8 bit number */
-   buf[1] = (unsigned char)0x01;
+   /* setup our callback data, then world domination! */
+   rng.prng  = prng;
+   rng.wprng = wprng;
 
-   /* set the LSB to the desired settings 
-    * (1 for any prime, 3 for primes congruent to 3 mod 4) 
-    */
-   buf[len+1] |= (unsigned char)ormask;
-
-   /* read the number in */
-   if (mp_read_raw(N, buf, 2+len) != MP_OKAY) { 
-      return CRYPT_MEM; 
+   /* get type */
+   if (len < 0) {
+      type = 1;
+      len = -len;
+   } else {
+      type = 0;
    }
 
-   /* Find the next prime after N */
-   if (mp_prime_next_prime(N, 8, step) != MP_OKAY) {
-      return CRYPT_MEM;
+   /* New prime generation makes the code even more cryptoish-insane.  Do you know what this means!!!
+      -- Gir:  Yeah, oh wait, er, no.
+    */
+   if ((err = mp_prime_random(N, mp_prime_rabin_miller_trials(len*8), len, type, rand_prime_helper, &rng)) != MP_OKAY) {
+      return mpi_to_ltc_error(err);
    }
 
-#ifdef CLEAN_STACK   
-   zeromem(buf, sizeof(buf));
-#endif
-
    return CRYPT_OK;
 }
       

+ 13 - 7
rc2.c

@@ -71,7 +71,7 @@ int rc2_setup(const unsigned char *key, int keylen, int rounds, symmetric_key *s
    }
 
    for (i = 0; i < keylen; i++) {
-       tmp[i] = key[i];
+       tmp[i] = key[i] & 255;
    }
 
     /* Phase 1: Expand input key to 128 bytes */
@@ -261,22 +261,28 @@ int rc2_test(void)
      { 0x22, 0x69, 0x55, 0x2a, 0xb0, 0xf8, 0x5c, 0xa6 }
    }
   };
-    int x, err;
+    int x, y, err;
     symmetric_key skey;
-    unsigned char buf[2][8];
+    unsigned char tmp[2][8];
 
     for (x = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) {
-        zeromem(buf, sizeof(buf));
+        zeromem(tmp, sizeof(tmp));
         if ((err = rc2_setup(tests[x].key, tests[x].keylen, 0, &skey)) != CRYPT_OK) {
            return err;
         }
         
-        rc2_ecb_encrypt(tests[x].pt, buf[0], &skey);
-        rc2_ecb_decrypt(buf[0], buf[1], &skey);
+        rc2_ecb_encrypt(tests[x].pt, tmp[0], &skey);
+        rc2_ecb_decrypt(tmp[0], tmp[1], &skey);
         
-        if (memcmp(buf[0], tests[x].ct, 8) != 0 || memcmp(buf[1], tests[x].pt, 8) != 0) {
+        if (memcmp(tmp[0], tests[x].ct, 8) != 0 || memcmp(tmp[1], tests[x].pt, 8) != 0) {
            return CRYPT_FAIL_TESTVECTOR;
         }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 8; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) rc2_ecb_encrypt(tmp[0], tmp[0], &skey);
+      for (y = 0; y < 1000; y++) rc2_ecb_decrypt(tmp[0], tmp[0], &skey);
+      for (y = 0; y < 8; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
     }
     return CRYPT_OK;
    #endif

+ 12 - 6
rc5.c

@@ -69,7 +69,7 @@ int rc5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_ke
 
     /* setup the S array */
     t = (ulong32)(2 * (num_rounds + 1));
-    memcpy(S, stab, t * sizeof(stab[0]));
+    memcpy(S, stab, t * sizeof(*S));
 
     /* mix buffer */
     s = 3 * MAX(t, j);
@@ -211,8 +211,8 @@ int rc5_test(void)
        { 0x65, 0xc1, 0x78, 0xb2, 0x84, 0xd1, 0x97, 0xcc }
    }
    };
-   unsigned char buf[2][8];
-   int x, err;
+   unsigned char tmp[2][8];
+   int x, y, err;
    symmetric_key key;
 
    for (x = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) {
@@ -222,13 +222,19 @@ int rc5_test(void)
       }
 
       /* encrypt and decrypt */
-      rc5_ecb_encrypt(tests[x].pt, buf[0], &key);
-      rc5_ecb_decrypt(buf[0], buf[1], &key);
+      rc5_ecb_encrypt(tests[x].pt, tmp[0], &key);
+      rc5_ecb_decrypt(tmp[0], tmp[1], &key);
 
       /* compare */
-      if (memcmp(buf[0], tests[x].ct, 8) != 0 || memcmp(buf[1], tests[x].pt, 8) != 0) {
+      if (memcmp(tmp[0], tests[x].ct, 8) != 0 || memcmp(tmp[1], tests[x].pt, 8) != 0) {
          return CRYPT_FAIL_TESTVECTOR;
       }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 8; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) rc5_ecb_encrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 1000; y++) rc5_ecb_decrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 8; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
    }
    return CRYPT_OK;
   #endif

+ 11 - 5
rc6.c

@@ -224,8 +224,8 @@ int rc6_test(void)
          0x20, 0xad, 0x16, 0xa1, 0x67, 0x4e, 0x5d, 0x48 }
    }
    };
-   unsigned char buf[2][16];
-   int x, err;
+   unsigned char tmp[2][16];
+   int x, y, err;
    symmetric_key key;
 
    for (x  = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) {
@@ -235,13 +235,19 @@ int rc6_test(void)
       }
 
       /* encrypt and decrypt */
-      rc6_ecb_encrypt(tests[x].pt, buf[0], &key);
-      rc6_ecb_decrypt(buf[0], buf[1], &key);
+      rc6_ecb_encrypt(tests[x].pt, tmp[0], &key);
+      rc6_ecb_decrypt(tmp[0], tmp[1], &key);
 
       /* compare */
-      if (memcmp(buf[0], tests[x].ct, 16) || memcmp(buf[1], tests[x].pt, 16)) {
+      if (memcmp(tmp[0], tests[x].ct, 16) || memcmp(tmp[1], tests[x].pt, 16)) {
          return CRYPT_FAIL_TESTVECTOR;
       }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 16; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) rc6_ecb_encrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 1000; y++) rc6_ecb_decrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 16; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
    }
    return CRYPT_OK;
   #endif

+ 17 - 30
rmd128.c

@@ -59,17 +59,17 @@ const struct _hash_descriptor rmd128_desc =
       (a) = ROL((a), (s));
 
 #ifdef CLEAN_STACK
-static void _rmd128_compress(hash_state *md)
+static void _rmd128_compress(hash_state *md, unsigned char *buf)
 #else
-static void rmd128_compress(hash_state *md)
+static void rmd128_compress(hash_state *md, unsigned char *buf)
 #endif
 {
-   unsigned long aa,bb,cc,dd,aaa,bbb,ccc,ddd,X[16];
+   ulong32 aa,bb,cc,dd,aaa,bbb,ccc,ddd,X[16];
    int i;
 
    /* load words X */
    for (i = 0; i < 16; i++){
-      LOAD32L(X[i], md->rmd128.buf + (4 * i));
+      LOAD32L(X[i], buf + (4 * i));
    }
 
    /* load state */
@@ -231,10 +231,10 @@ static void rmd128_compress(hash_state *md)
 }
 
 #ifdef CLEAN_STACK
-static void rmd128_compress(hash_state *md)
+static void rmd128_compress(hash_state *md, unsigned char *buf)
 {
-   _rmd128_compress(md);
-   burn_stack(sizeof(unsigned long) * 24 + sizeof(int));
+   _rmd128_compress(md, buf);
+   burn_stack(sizeof(ulong32) * 24 + sizeof(int));
 }
 #endif
 
@@ -249,34 +249,20 @@ void rmd128_init(hash_state * md)
    md->rmd128.length   = 0;
 }
 
-void rmd128_process(hash_state * md, const unsigned char *buf, unsigned long len)
-{
-    unsigned long n;
-    _ARGCHK(md != NULL);
-    _ARGCHK(buf != NULL);
-    while (len > 0) {
-        n = MIN(len, (64 - md->rmd128.curlen));
-        memcpy(md->rmd128.buf + md->rmd128.curlen, buf, (size_t)n);
-        md->rmd128.curlen += n;
-        buf               += n;
-        len               -= n;
-
-        /* is 64 bytes full? */
-        if (md->rmd128.curlen == 64) {
-            rmd128_compress(md);
-            md->rmd128.length += 512;
-            md->rmd128.curlen = 0;
-        }
-    }
-}
+HASH_PROCESS(rmd128_process, rmd128_compress, rmd128, 64)
 
-void rmd128_done(hash_state * md, unsigned char *hash)
+int rmd128_done(hash_state * md, unsigned char *hash)
 {
     int i;
 
     _ARGCHK(md != NULL);
     _ARGCHK(hash != NULL);
 
+    if (md->rmd128.curlen >= sizeof(md->rmd128.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
+
     /* increase the length of the message */
     md->rmd128.length += md->rmd128.curlen * 8;
 
@@ -291,7 +277,7 @@ void rmd128_done(hash_state * md, unsigned char *hash)
         while (md->rmd128.curlen < 64) {
             md->rmd128.buf[md->rmd128.curlen++] = (unsigned char)0;
         }
-        rmd128_compress(md);
+        rmd128_compress(md, md->rmd128.buf);
         md->rmd128.curlen = 0;
     }
 
@@ -302,7 +288,7 @@ void rmd128_done(hash_state * md, unsigned char *hash)
 
     /* store length */
     STORE64L(md->rmd128.length, md->rmd128.buf+56);
-    rmd128_compress(md);
+    rmd128_compress(md, md->rmd128.buf);
 
     /* copy output */
     for (i = 0; i < 4; i++) {
@@ -311,6 +297,7 @@ void rmd128_done(hash_state * md, unsigned char *hash)
 #ifdef CLEAN_STACK
     zeromem(md, sizeof(hash_state));
 #endif
+   return CRYPT_OK;  
 }
 
 int rmd128_test(void)

+ 17 - 30
rmd160.c

@@ -79,17 +79,17 @@ const struct _hash_descriptor rmd160_desc =
 
 
 #ifdef CLEAN_STACK
-static void _rmd160_compress(hash_state *md)
+static void _rmd160_compress(hash_state *md, unsigned char *buf)
 #else
-static void rmd160_compress(hash_state *md)
+static void rmd160_compress(hash_state *md, unsigned char *buf)
 #endif
 {
-   unsigned long aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,X[16];
+   ulong32 aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,X[16];
    int i;
 
    /* load words X */
    for (i = 0; i < 16; i++){
-      LOAD32L(X[i], md->rmd160.buf + (4 * i));
+      LOAD32L(X[i], buf + (4 * i));
    }
 
    /* load state */
@@ -289,10 +289,10 @@ static void rmd160_compress(hash_state *md)
 }
 
 #ifdef CLEAN_STACK
-static void rmd160_compress(hash_state *md)
+static void rmd160_compress(hash_state *md, unsigned char *buf)
 {
-   _rmd160_compress(md);
-   burn_stack(sizeof(unsigned long) * 26 + sizeof(int));
+   _rmd160_compress(md, buf);
+   burn_stack(sizeof(ulong32) * 26 + sizeof(int));
 }
 #endif
 
@@ -308,34 +308,20 @@ void rmd160_init(hash_state * md)
    md->rmd160.length   = 0;
 }
 
-void rmd160_process(hash_state * md, const unsigned char *buf, unsigned long len)
-{
-    unsigned long n;
-    _ARGCHK(md != NULL);
-    _ARGCHK(buf != NULL);
-    while (len > 0) {
-        n = MIN(len, (64 - md->rmd160.curlen));
-        memcpy(md->rmd160.buf + md->rmd160.curlen, buf, (size_t)n);
-        md->rmd160.curlen += n;
-        buf               += n;
-        len               -= n;
-
-        /* is 64 bytes full? */
-        if (md->rmd160.curlen == 64) {
-            rmd160_compress(md);
-            md->rmd160.length += 512;
-            md->rmd160.curlen = 0;
-        }
-    }
-}
+HASH_PROCESS(rmd160_process, rmd160_compress, rmd160, 64)
 
-void rmd160_done(hash_state * md, unsigned char *hash)
+int rmd160_done(hash_state * md, unsigned char *hash)
 {
     int i;
 
     _ARGCHK(md != NULL);
     _ARGCHK(hash != NULL);
 
+    if (md->rmd160.curlen >= sizeof(md->rmd160.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
+
     /* increase the length of the message */
     md->rmd160.length += md->rmd160.curlen * 8;
 
@@ -350,7 +336,7 @@ void rmd160_done(hash_state * md, unsigned char *hash)
         while (md->rmd160.curlen < 64) {
             md->rmd160.buf[md->rmd160.curlen++] = (unsigned char)0;
         }
-        rmd160_compress(md);
+        rmd160_compress(md, md->rmd160.buf);
         md->rmd160.curlen = 0;
     }
 
@@ -361,7 +347,7 @@ void rmd160_done(hash_state * md, unsigned char *hash)
 
     /* store length */
     STORE64L(md->rmd160.length, md->rmd160.buf+56);
-    rmd160_compress(md);
+    rmd160_compress(md, md->rmd160.buf);
 
     /* copy output */
     for (i = 0; i < 5; i++) {
@@ -370,6 +356,7 @@ void rmd160_done(hash_state * md, unsigned char *hash)
 #ifdef CLEAN_STACK
     zeromem(md, sizeof(hash_state));
 #endif
+    return CRYPT_OK;
 }
 
 int rmd160_test(void)

+ 12 - 5
rsa.c

@@ -122,9 +122,14 @@ int rsa_exptmod(const unsigned char *in,  unsigned long inlen,
       return CRYPT_PK_NOT_PRIVATE;
    }
 
+   /* must be a private or public operation */
+   if (which != PK_PRIVATE && which != PK_PUBLIC) {
+      return CRYPT_PK_INVALID_TYPE;
+   }
+
    /* init and copy into tmp */
-   if (mp_init_multi(&tmp, &tmpa, &tmpb, NULL) != MP_OKAY)                { goto error; }
-   if (mp_read_unsigned_bin(&tmp, (unsigned char *)in, (int)inlen) != MP_OKAY) { goto error; }
+   if (mp_init_multi(&tmp, &tmpa, &tmpb, NULL) != MP_OKAY)                          { goto error; }
+   if (mp_read_unsigned_bin(&tmp, (unsigned char *)in, (int)inlen) != MP_OKAY)      { goto error; }
 
    /* sanity check on the input */
    if (mp_cmp(&key->N, &tmp) == MP_LT) {
@@ -277,8 +282,9 @@ int rsa_signdepad(const unsigned char *in,  unsigned long inlen,
           return CRYPT_INVALID_PACKET;
        }
    }
-   for (x = 0; x < inlen/3; x++)
+   for (x = 0; x < inlen/3; x++) {
        out[x] = in[x+(inlen/3)];
+   }
    *outlen = inlen/3;
    return CRYPT_OK;
 }
@@ -295,8 +301,9 @@ int rsa_depad(const unsigned char *in,  unsigned long inlen,
    if (*outlen < inlen/3) {
       return CRYPT_BUFFER_OVERFLOW;
    }
-   for (x = 0; x < inlen/3; x++)
+   for (x = 0; x < inlen/3; x++) {
        out[x] = in[x+(inlen/3)];
+   }
    *outlen = inlen/3;
    return CRYPT_OK;
 }
@@ -306,7 +313,7 @@ int rsa_depad(const unsigned char *in,  unsigned long inlen,
       z = (unsigned long)mp_unsigned_bin_size(num);  \
       STORE32L(z, buf2+y);                     \
       y += 4;                                  \
-      (void)mp_to_unsigned_bin(num, buf2+y);   \
+      if (mp_to_unsigned_bin(num, buf2+y) != MP_OKAY) { return CRYPT_MEM; }    \
       y += z;                                  \
 }
 

+ 12 - 5
safer+.c

@@ -1,3 +1,4 @@
+/* SAFER+ Implementation by Tom St Denis */
 #include "mycrypt.h"
 
 #ifdef SAFERP
@@ -450,21 +451,27 @@ int saferp_test(void)
        }
     };       
 
-   unsigned char buf[2][16];
+   unsigned char tmp[2][16];
    symmetric_key skey;
-   int err, i;
+   int err, i, y;
 
    for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
       if ((err = saferp_setup(tests[i].key, tests[i].keylen, 0, &skey)) != CRYPT_OK)  {
          return err;
       }
-      saferp_ecb_encrypt(tests[i].pt, buf[0], &skey);
-      saferp_ecb_decrypt(buf[0], buf[1], &skey);
+      saferp_ecb_encrypt(tests[i].pt, tmp[0], &skey);
+      saferp_ecb_decrypt(tmp[0], tmp[1], &skey);
 
       /* compare */
-      if (memcmp(buf[0], tests[i].ct, 16) || memcmp(buf[1], tests[i].pt, 16)) { 
+      if (memcmp(tmp[0], tests[i].ct, 16) || memcmp(tmp[1], tests[i].pt, 16)) { 
          return CRYPT_FAIL_TESTVECTOR;
       }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 16; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) saferp_ecb_encrypt(tmp[0], tmp[0], &skey);
+      for (y = 0; y < 1000; y++) saferp_ecb_decrypt(tmp[0], tmp[0], &skey);
+      for (y = 0; y < 16; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
    }
 
    return CRYPT_OK;

+ 14 - 2
safer.c

@@ -393,7 +393,7 @@ int safer_sk64_test(void)
 
    symmetric_key skey;
    unsigned char buf[2][8];
-   int err;
+   int err, y;
 
    /* test SK64 */
    if ((err = safer_sk64_setup(sk64_key, 8, 6, &skey)) != CRYPT_OK) {
@@ -407,6 +407,12 @@ int safer_sk64_test(void)
       return CRYPT_FAIL_TESTVECTOR;
    }
 
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 8; y++) buf[0][y] = 0;
+      for (y = 0; y < 1000; y++) safer_ecb_encrypt(buf[0], buf[0], &skey);
+      for (y = 0; y < 1000; y++) safer_ecb_decrypt(buf[0], buf[0], &skey);
+      for (y = 0; y < 8; y++) if (buf[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
+
    return CRYPT_OK;
   #endif
 }
@@ -423,7 +429,7 @@ int safer_sk128_test(void)
 
    symmetric_key skey;
    unsigned char buf[2][8];
-   int err;
+   int err, y;
 
    /* test SK128 */
    if ((err = safer_sk128_setup(sk128_key, 16, 0, &skey)) != CRYPT_OK) {
@@ -435,6 +441,12 @@ int safer_sk128_test(void)
    if (memcmp(buf[0], sk128_ct, 8) != 0 || memcmp(buf[1], sk128_pt, 8) != 0) {
       return CRYPT_FAIL_TESTVECTOR;
    }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 8; y++) buf[0][y] = 0;
+      for (y = 0; y < 1000; y++) safer_ecb_encrypt(buf[0], buf[0], &skey);
+      for (y = 0; y < 1000; y++) safer_ecb_decrypt(buf[0], buf[0], &skey);
+      for (y = 0; y < 8; y++) if (buf[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
   return CRYPT_OK;
  #endif
 }

+ 19 - 34
sha1.c

@@ -20,18 +20,18 @@ const struct _hash_descriptor sha1_desc =
 #define F3(x,y,z)  (x ^ y ^ z)
 
 #ifdef CLEAN_STACK
-static void _sha1_compress(hash_state *md)
+static void _sha1_compress(hash_state *md, unsigned char *buf)
 #else
-static void sha1_compress(hash_state *md)
+static void sha1_compress(hash_state *md, unsigned char *buf)
 #endif
 {
-    unsigned long a,b,c,d,e,W[80],i;
+    ulong32 a,b,c,d,e,W[80],i;
 
     _ARGCHK(md != NULL);
 
     /* copy the state into 512-bits into W[0..15] */
     for (i = 0; i < 16; i++) {
-        LOAD32H(W[i], md->sha1.buf + (4*i));
+        LOAD32H(W[i], buf + (4*i));
     }
 
     /* copy state */
@@ -62,7 +62,7 @@ static void sha1_compress(hash_state *md)
     }
 
     /* round two */
-    for (i = 20; i < 40; )  { 
+    for (; i < 40; )  { 
        FF1(a,b,c,d,e,i++);
        FF1(e,a,b,c,d,i++);
        FF1(d,e,a,b,c,i++);
@@ -71,7 +71,7 @@ static void sha1_compress(hash_state *md)
     }
 
     /* round three */
-    for (i = 40; i < 60; )  { 
+    for (; i < 60; )  { 
        FF2(a,b,c,d,e,i++);
        FF2(e,a,b,c,d,i++);
        FF2(d,e,a,b,c,i++);
@@ -80,7 +80,7 @@ static void sha1_compress(hash_state *md)
     }
 
     /* round four */
-    for (i = 60; i < 80; )  { 
+    for (; i < 80; )  { 
        FF3(a,b,c,d,e,i++);
        FF3(e,a,b,c,d,i++);
        FF3(d,e,a,b,c,i++);
@@ -102,10 +102,10 @@ static void sha1_compress(hash_state *md)
 }
 
 #ifdef CLEAN_STACK
-static void sha1_compress(hash_state *md)
+static void sha1_compress(hash_state *md, unsigned char *buf)
 {
-   _sha1_compress(md);
-   burn_stack(sizeof(unsigned long) * 87);
+   _sha1_compress(md, buf);
+   burn_stack(sizeof(ulong32) * 87);
 }
 #endif
 
@@ -121,35 +121,19 @@ void sha1_init(hash_state * md)
    md->sha1.length = 0;
 }
 
-void sha1_process(hash_state * md, const unsigned char *buf, unsigned long len)
-{
-    unsigned long n;
-    _ARGCHK(md != NULL);
-    _ARGCHK(buf != NULL);
-
-    while (len > 0) {
-        n = MIN(len, (64 - md->sha1.curlen));
-        memcpy(md->sha1.buf + md->sha1.curlen, buf, (size_t)n);
-        md->sha1.curlen += n;
-        buf             += n;
-        len             -= n;
-
-        /* is 64 bytes full? */
-        if (md->sha1.curlen == 64) {
-            sha1_compress(md);
-            md->sha1.length += 512;
-            md->sha1.curlen = 0;
-        }
-    }
-}
+HASH_PROCESS(sha1_process, sha1_compress, sha1, 64)
 
-void sha1_done(hash_state * md, unsigned char *hash)
+int sha1_done(hash_state * md, unsigned char *hash)
 {
     int i;
 
     _ARGCHK(md != NULL);
     _ARGCHK(hash != NULL);
 
+    if (md->sha1.curlen >= sizeof(md->sha1.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
     /* increase the length of the message */
     md->sha1.length += md->sha1.curlen * 8;
 
@@ -164,7 +148,7 @@ void sha1_done(hash_state * md, unsigned char *hash)
         while (md->sha1.curlen < 64) {
             md->sha1.buf[md->sha1.curlen++] = (unsigned char)0;
         }
-        sha1_compress(md);
+        sha1_compress(md, md->sha1.buf);
         md->sha1.curlen = 0;
     }
 
@@ -175,7 +159,7 @@ void sha1_done(hash_state * md, unsigned char *hash)
 
     /* store length */
     STORE64H(md->sha1.length, md->sha1.buf+56);
-    sha1_compress(md);
+    sha1_compress(md, md->sha1.buf);
 
     /* copy output */
     for (i = 0; i < 5; i++) {
@@ -184,6 +168,7 @@ void sha1_done(hash_state * md, unsigned char *hash)
 #ifdef CLEAN_STACK
     zeromem(md, sizeof(hash_state));
 #endif
+    return CRYPT_OK;
 }
 
 int  sha1_test(void)

+ 82 - 0
sha224.c

@@ -0,0 +1,82 @@
+/* SHA-224 new NIST standard based off of SHA-256 truncated to 224 bits */
+const struct _hash_descriptor sha224_desc =
+{
+    "sha224",
+    10,
+    28,
+    64,
+    &sha224_init,
+    &sha256_process,
+    &sha224_done,
+    &sha224_test
+};
+
+/* init the sha256 er... sha224 state ;-) */
+void sha224_init(hash_state * md)
+{
+    _ARGCHK(md != NULL);
+
+    md->sha256.curlen = 0;
+    md->sha256.length = 0;
+    md->sha256.state[0] = 0xc1059ed8UL;
+    md->sha256.state[1] = 0x367cd507UL;
+    md->sha256.state[2] = 0x3070dd17UL;
+    md->sha256.state[3] = 0xf70e5939UL;
+    md->sha256.state[4] = 0xffc00b31UL;
+    md->sha256.state[5] = 0x68581511UL;
+    md->sha256.state[6] = 0x64f98fa7UL;
+    md->sha256.state[7] = 0xbefa4fa4UL;
+}
+
+int sha224_done(hash_state * md, unsigned char *hash)
+{
+    unsigned char buf[32];
+    int err;
+
+    err = sha256_done(md, buf);
+    memcpy(hash, buf, 28);
+#ifdef CLEAN_STACK
+    zeromem(buf, sizeof(buf));
+#endif 
+    return err;
+}
+
+int  sha224_test(void)
+{
+ #ifndef LTC_TEST
+    return CRYPT_NOP;
+ #else    
+  static const struct {
+      char *msg;
+      unsigned char hash[28];
+  } tests[] = {
+    { "abc",
+      { 0x23, 0x09, 0x7d, 0x22, 0x34, 0x05, 0xd8,
+        0x22, 0x86, 0x42, 0xa4, 0x77, 0xbd, 0xa2,
+        0x55, 0xb3, 0x2a, 0xad, 0xbc, 0xe4, 0xbd,
+        0xa0, 0xb3, 0xf7, 0xe3, 0x6c, 0x9d, 0xa7 }
+    },
+    { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+      { 0x75, 0x38, 0x8b, 0x16, 0x51, 0x27, 0x76,
+	0xcc, 0x5d, 0xba, 0x5d, 0xa1, 0xfd, 0x89,
+        0x01, 0x50, 0xb0, 0xc6, 0x45, 0x5c, 0xb4,
+        0xf5, 0x8b, 0x19, 0x52, 0x52, 0x25, 0x25 }
+    },
+  };
+
+  int i;
+  unsigned char tmp[28];
+  hash_state md;
+
+  for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
+      sha224_init(&md);
+      sha224_process(&md, (unsigned char*)tests[i].msg, (unsigned long)strlen(tests[i].msg));
+      sha224_done(&md, tmp);
+      if (memcmp(tmp, tests[i].hash, 28) != 0) {
+         return CRYPT_FAIL_TESTVECTOR;
+      }
+  }
+  return CRYPT_OK;
+ #endif
+}
+

+ 38 - 44
sha256.c

@@ -43,12 +43,12 @@ static const unsigned long K[64] = {
 
 /* compress 512-bits */
 #ifdef CLEAN_STACK
-static void _sha256_compress(hash_state * md)
+static void _sha256_compress(hash_state * md, unsigned char *buf)
 #else
-static void sha256_compress(hash_state * md)
+static void sha256_compress(hash_state * md, unsigned char *buf)
 #endif
 {
-    unsigned long S[8], W[64], t0, t1;
+    ulong32 S[8], W[64], t0, t1;
     int i;
 
     _ARGCHK(md != NULL);
@@ -60,7 +60,7 @@ static void sha256_compress(hash_state * md)
 
     /* copy the state into 512-bits into W[0..15] */
     for (i = 0; i < 16; i++) {
-        LOAD32H(W[i], md->sha256.buf + (4*i));
+        LOAD32H(W[i], buf + (4*i));
     }
 
     /* fill W[16..63] */
@@ -70,18 +70,22 @@ static void sha256_compress(hash_state * md)
 
     /* Compress */
 #ifdef SMALL_CODE   
-    for (i = 0; i < 64; i++) {
-        t0 = S[7] + Sigma1(S[4]) + Ch(S[4], S[5], S[6]) + K[i] + W[i];
-        t1 = Sigma0(S[0]) + Maj(S[0], S[1], S[2]);
-        S[7] = S[6];
-        S[6] = S[5];
-        S[5] = S[4];
-        S[4] = S[3] + t0;
-        S[3] = S[2];
-        S[2] = S[1];
-        S[1] = S[0];
-        S[0] = t0 + t1;
-    }
+#define RND(a,b,c,d,e,f,g,h,i)                    \
+     t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i];   \
+     t1 = Sigma0(a) + Maj(a, b, c);                  \
+     d += t0;                                        \
+     h  = t0 + t1;
+
+     for (i = 0; i < 64; i += 8) {
+         RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0);
+         RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1);
+         RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2);
+         RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3);
+         RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4);
+         RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5);
+         RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6);
+         RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7);
+     }  
 #else 
 #define RND(a,b,c,d,e,f,g,h,i,ki)                    \
      t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i];   \
@@ -166,10 +170,10 @@ static void sha256_compress(hash_state * md)
 }
 
 #ifdef CLEAN_STACK
-static void sha256_compress(hash_state * md)
+static void sha256_compress(hash_state * md, unsigned char *buf)
 {
-    _sha256_compress(md);
-    burn_stack(sizeof(unsigned long) * 74);
+    _sha256_compress(md, buf);
+    burn_stack(sizeof(ulong32) * 74);
 }
 #endif
 
@@ -190,35 +194,20 @@ void sha256_init(hash_state * md)
     md->sha256.state[7] = 0x5BE0CD19UL;
 }
 
-void sha256_process(hash_state * md, const unsigned char *buf, unsigned long len)
-{
-    unsigned long n;
-    _ARGCHK(md != NULL);
-    _ARGCHK(buf != NULL);
-
-    while (len > 0) {
-        n = MIN(len, (64 - md->sha256.curlen));
-        memcpy(md->sha256.buf + md->sha256.curlen, buf, (size_t)n);
-        md->sha256.curlen += n;
-        buf            += n;
-        len            -= n;
-
-        /* is 64 bytes full? */
-        if (md->sha256.curlen == 64) {
-            sha256_compress(md);
-            md->sha256.length += 512;
-            md->sha256.curlen = 0;
-        }
-    }
-}
+HASH_PROCESS(sha256_process, sha256_compress, sha256, 64)
 
-void sha256_done(hash_state * md, unsigned char *hash)
+int sha256_done(hash_state * md, unsigned char *hash)
 {
     int i;
 
     _ARGCHK(md != NULL);
     _ARGCHK(hash != NULL);
 
+    if (md->sha256.curlen >= sizeof(md->sha256.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
+
     /* increase the length of the message */
     md->sha256.length += md->sha256.curlen * 8;
 
@@ -233,7 +222,7 @@ void sha256_done(hash_state * md, unsigned char *hash)
         while (md->sha256.curlen < 64) {
             md->sha256.buf[md->sha256.curlen++] = (unsigned char)0;
         }
-        sha256_compress(md);
+        sha256_compress(md, md->sha256.buf);
         md->sha256.curlen = 0;
     }
 
@@ -244,7 +233,7 @@ void sha256_done(hash_state * md, unsigned char *hash)
 
     /* store length */
     STORE64H(md->sha256.length, md->sha256.buf+56);
-    sha256_compress(md);
+    sha256_compress(md, md->sha256.buf);
 
     /* copy output */
     for (i = 0; i < 8; i++) {
@@ -253,6 +242,7 @@ void sha256_done(hash_state * md, unsigned char *hash)
 #ifdef CLEAN_STACK
     zeromem(md, sizeof(hash_state));
 #endif
+    return CRYPT_OK;
 }
 
 int  sha256_test(void)
@@ -261,7 +251,7 @@ int  sha256_test(void)
     return CRYPT_NOP;
  #else    
   static const struct {
-       char *msg;
+      char *msg;
       unsigned char hash[32];
   } tests[] = {
     { "abc",
@@ -294,6 +284,10 @@ int  sha256_test(void)
  #endif
 }
 
+#ifdef SHA224
+#include "sha224.c"
+#endif
+
 #endif
 
 

+ 7 - 9
sha384.c

@@ -7,7 +7,7 @@ const struct _hash_descriptor sha384_desc =
     48,
     128,
     &sha384_init,
-    &sha384_process,
+    &sha512_process,
     &sha384_done,
     &sha384_test
 };
@@ -28,25 +28,23 @@ void sha384_init(hash_state * md)
     md->sha512.state[7] = CONST64(0x47b5481dbefa4fa4);
 }
 
-void sha384_process(hash_state * md, const unsigned char *buf, unsigned long len)
-{
-   _ARGCHK(md != NULL);
-   _ARGCHK(buf != NULL);
-   sha512_process(md, buf, len);
-}
-
-void sha384_done(hash_state * md, unsigned char *hash)
+int sha384_done(hash_state * md, unsigned char *hash)
 {
    unsigned char buf[64];
 
    _ARGCHK(md != NULL);
    _ARGCHK(hash != NULL);
 
+    if (md->sha512.curlen >= sizeof(md->sha512.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
    sha512_done(md, buf);
    memcpy(hash, buf, 48);
 #ifdef CLEAN_STACK
    zeromem(buf, sizeof(buf));
 #endif
+   return CRYPT_OK;
 }
 
 int  sha384_test(void)

+ 16 - 29
sha512.c

@@ -70,9 +70,9 @@ CONST64(0x5fcb6fab3ad6faec), CONST64(0x6c44198c4a475817)
 
 /* compress 1024-bits */
 #ifdef CLEAN_STACK
-static void _sha512_compress(hash_state * md)
+static void _sha512_compress(hash_state * md, unsigned char *buf)
 #else
-static void sha512_compress(hash_state * md)
+static void sha512_compress(hash_state * md, unsigned char *buf)
 #endif
 {
     ulong64 S[8], W[80], t0, t1;
@@ -81,12 +81,13 @@ static void sha512_compress(hash_state * md)
     _ARGCHK(md != NULL);
 
     /* copy state into S */
-    for (i = 0; i < 8; i++)
+    for (i = 0; i < 8; i++) {
         S[i] = md->sha512.state[i];
+    }
 
     /* copy the state into 1024-bits into W[0..15] */
     for (i = 0; i < 16; i++) {
-        LOAD64H(W[i], md->sha512.buf + (8*i));
+        LOAD64H(W[i], buf + (8*i));
     }
 
     /* fill W[16..79] */
@@ -136,9 +137,9 @@ static void sha512_compress(hash_state * md)
 
 /* compress 1024-bits */
 #ifdef CLEAN_STACK
-static void sha512_compress(hash_state * md)
+static void sha512_compress(hash_state * md, unsigned char *buf)
 {
-    _sha512_compress(md);
+    _sha512_compress(md, buf);
     burn_stack(sizeof(ulong64) * 90 + sizeof(int));
 }
 #endif
@@ -160,34 +161,19 @@ void sha512_init(hash_state * md)
     md->sha512.state[7] = CONST64(0x5be0cd19137e2179);
 }
 
-void sha512_process(hash_state * md, const unsigned char *buf, unsigned long len)
-{
-    unsigned long n;
-    _ARGCHK(md != NULL);
-    _ARGCHK(buf != NULL);
-    while (len > 0) {
-        n = MIN(len, (128 - md->sha512.curlen));
-        memcpy(md->sha512.buf + md->sha512.curlen, buf, (size_t)n);
-        md->sha512.curlen += n;
-        buf               += n;
-        len               -= n;
-
-        /* is 128 bytes full? */
-        if (md->sha512.curlen == 128) {
-            sha512_compress(md);
-            md->sha512.length += 1024;
-            md->sha512.curlen = 0;
-        }
-    }
-}
+HASH_PROCESS(sha512_process, sha512_compress, sha512, 128)
 
-void sha512_done(hash_state * md, unsigned char *hash)
+int sha512_done(hash_state * md, unsigned char *hash)
 {
     int i;
 
     _ARGCHK(md != NULL);
     _ARGCHK(hash != NULL);
 
+    if (md->sha512.curlen >= sizeof(md->sha512.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
     /* increase the length of the message */
     md->sha512.length += md->sha512.curlen * CONST64(8);
 
@@ -202,7 +188,7 @@ void sha512_done(hash_state * md, unsigned char *hash)
         while (md->sha512.curlen < 128) {
             md->sha512.buf[md->sha512.curlen++] = (unsigned char)0;
         }
-        sha512_compress(md);
+        sha512_compress(md, md->sha512.buf);
         md->sha512.curlen = 0;
     }
 
@@ -216,7 +202,7 @@ void sha512_done(hash_state * md, unsigned char *hash)
 
     /* store length */
     STORE64H(md->sha512.length, md->sha512.buf+120);
-    sha512_compress(md);
+    sha512_compress(md, md->sha512.buf);
 
     /* copy output */
     for (i = 0; i < 8; i++) {
@@ -225,6 +211,7 @@ void sha512_done(hash_state * md, unsigned char *hash)
 #ifdef CLEAN_STACK
     zeromem(md, sizeof(hash_state));
 #endif
+    return CRYPT_OK;
 }
 
 int  sha512_test(void)

+ 279 - 0
skipjack.c

@@ -0,0 +1,279 @@
+/* Skipjack Implementation by Tom St Denis */
+#include "mycrypt.h"
+
+#ifdef SKIPJACK
+
+const struct _cipher_descriptor skipjack_desc =
+{
+    "skipjack",
+    17,
+    10, 10, 8, 32,
+    &skipjack_setup,
+    &skipjack_ecb_encrypt,
+    &skipjack_ecb_decrypt,
+    &skipjack_test,
+    &skipjack_keysize
+};
+
+static const unsigned char sbox[256] = {
+	0xa3,0xd7,0x09,0x83,0xf8,0x48,0xf6,0xf4,0xb3,0x21,0x15,0x78,0x99,0xb1,0xaf,0xf9,
+	0xe7,0x2d,0x4d,0x8a,0xce,0x4c,0xca,0x2e,0x52,0x95,0xd9,0x1e,0x4e,0x38,0x44,0x28,
+	0x0a,0xdf,0x02,0xa0,0x17,0xf1,0x60,0x68,0x12,0xb7,0x7a,0xc3,0xe9,0xfa,0x3d,0x53,
+	0x96,0x84,0x6b,0xba,0xf2,0x63,0x9a,0x19,0x7c,0xae,0xe5,0xf5,0xf7,0x16,0x6a,0xa2,
+	0x39,0xb6,0x7b,0x0f,0xc1,0x93,0x81,0x1b,0xee,0xb4,0x1a,0xea,0xd0,0x91,0x2f,0xb8,
+	0x55,0xb9,0xda,0x85,0x3f,0x41,0xbf,0xe0,0x5a,0x58,0x80,0x5f,0x66,0x0b,0xd8,0x90,
+	0x35,0xd5,0xc0,0xa7,0x33,0x06,0x65,0x69,0x45,0x00,0x94,0x56,0x6d,0x98,0x9b,0x76,
+	0x97,0xfc,0xb2,0xc2,0xb0,0xfe,0xdb,0x20,0xe1,0xeb,0xd6,0xe4,0xdd,0x47,0x4a,0x1d,
+	0x42,0xed,0x9e,0x6e,0x49,0x3c,0xcd,0x43,0x27,0xd2,0x07,0xd4,0xde,0xc7,0x67,0x18,
+	0x89,0xcb,0x30,0x1f,0x8d,0xc6,0x8f,0xaa,0xc8,0x74,0xdc,0xc9,0x5d,0x5c,0x31,0xa4,
+	0x70,0x88,0x61,0x2c,0x9f,0x0d,0x2b,0x87,0x50,0x82,0x54,0x64,0x26,0x7d,0x03,0x40,
+	0x34,0x4b,0x1c,0x73,0xd1,0xc4,0xfd,0x3b,0xcc,0xfb,0x7f,0xab,0xe6,0x3e,0x5b,0xa5,
+	0xad,0x04,0x23,0x9c,0x14,0x51,0x22,0xf0,0x29,0x79,0x71,0x7e,0xff,0x8c,0x0e,0xe2,
+	0x0c,0xef,0xbc,0x72,0x75,0x6f,0x37,0xa1,0xec,0xd3,0x8e,0x62,0x8b,0x86,0x10,0xe8,
+	0x08,0x77,0x11,0xbe,0x92,0x4f,0x24,0xc5,0x32,0x36,0x9d,0xcf,0xf3,0xa6,0xbb,0xac,
+	0x5e,0x6c,0xa9,0x13,0x57,0x25,0xb5,0xe3,0xbd,0xa8,0x3a,0x01,0x05,0x59,0x2a,0x46
+};
+
+/* simple x + 1 (mod 10) in one step. */
+static const int keystep[] =  { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
+
+/* simple x - 1 (mod 10) in one step */
+static const int ikeystep[] = { 9, 0, 1, 2, 3, 4, 5, 6, 7, 8 };
+
+int skipjack_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
+{
+   int x;
+
+   _ARGCHK(key != NULL);
+   _ARGCHK(skey != NULL);
+
+   if (keylen != 10) {
+      return CRYPT_INVALID_KEYSIZE;
+   }
+
+   if (num_rounds != 32 && num_rounds != 0) { 
+      return CRYPT_INVALID_ROUNDS;
+   }
+
+   /* make sure the key is in range for platforms where CHAR_BIT != 8 */
+   for (x = 0; x < 10; x++) {
+       skey->skipjack.key[x] = key[x] & 255;
+   }
+
+   return CRYPT_OK;
+}
+
+#define RULE_A \
+   tmp = g_func(w1, &kp, key->skipjack.key);      \
+   w1  = tmp ^ w4 ^ x;                            \
+   w4  = w3; w3 = w2;                             \
+   w2  = tmp;
+
+#define RULE_B \
+   tmp  = g_func(w1, &kp, key->skipjack.key);     \
+   tmp1 = w4; w4  = w3;                           \
+   w3   = w1 ^ w2 ^ x;                            \
+   w1   = tmp1; w2 = tmp;
+
+#define RULE_A1 \
+   tmp = w1 ^ w2 ^ x;                             \
+   w1  = ig_func(w2, &kp, key->skipjack.key);     \
+   w2  = w3; w3 = w4; w4 = tmp;
+
+#define RULE_B1 \
+   tmp = ig_func(w2, &kp, key->skipjack.key);     \
+   w2  = tmp ^ w3 ^ x;                            \
+   w3  = w4; w4 = w1; w1 = tmp;
+   
+static unsigned g_func(unsigned w, int *kp, unsigned char *key)
+{
+   unsigned char g1,g2;
+
+   g1 = (w >> 8) & 255; g2 = w & 255;
+   g1 ^= sbox[g2^key[*kp]]; *kp = keystep[*kp];
+   g2 ^= sbox[g1^key[*kp]]; *kp = keystep[*kp];
+   g1 ^= sbox[g2^key[*kp]]; *kp = keystep[*kp];
+   g2 ^= sbox[g1^key[*kp]]; *kp = keystep[*kp];
+   return ((unsigned)g1<<8)|(unsigned)g2;
+}
+
+static unsigned ig_func(unsigned w, int *kp, unsigned char *key)
+{
+   unsigned char g1,g2;
+
+   g1 = (w >> 8) & 255; g2 = w & 255;
+   *kp = ikeystep[*kp]; g2 ^= sbox[g1^key[*kp]];
+   *kp = ikeystep[*kp]; g1 ^= sbox[g2^key[*kp]];
+   *kp = ikeystep[*kp]; g2 ^= sbox[g1^key[*kp]];
+   *kp = ikeystep[*kp]; g1 ^= sbox[g2^key[*kp]];
+   return ((unsigned)g1<<8)|(unsigned)g2;
+}
+
+#ifdef CLEAN_STACK
+static void _skipjack_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key)
+#else
+void skipjack_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key)
+#endif
+{
+   unsigned w1,w2,w3,w4,tmp,tmp1;
+   int x, kp;
+
+   _ARGCHK(pt != NULL);
+   _ARGCHK(ct != NULL);
+   _ARGCHK(key != NULL);
+
+   /* load block */
+   w1 = ((unsigned)pt[0]<<8)|pt[1];
+   w2 = ((unsigned)pt[2]<<8)|pt[3];
+   w3 = ((unsigned)pt[4]<<8)|pt[5];
+   w4 = ((unsigned)pt[6]<<8)|pt[7];
+
+   /* 8 rounds of RULE A */
+   for (x = 1, kp = 0; x < 9; x++) {
+       RULE_A;
+   }
+
+   /* 8 rounds of RULE B */
+   for (; x < 17; x++) {
+       RULE_B;
+   }
+
+   /* 8 rounds of RULE A */
+   for (; x < 25; x++) {
+       RULE_A;
+   }
+
+   /* 8 rounds of RULE B */
+   for (; x < 33; x++) {
+       RULE_B;
+   }
+
+   /* store block */
+   ct[0] = (w1>>8)&255; ct[1] = w1&255;
+   ct[2] = (w2>>8)&255; ct[3] = w2&255;
+   ct[4] = (w3>>8)&255; ct[5] = w3&255;
+   ct[6] = (w4>>8)&255; ct[7] = w4&255;
+}
+
+#ifdef CLEAN_STACK
+void skipjack_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key)
+{
+   _skipjack_ecb_encrypt(pt, ct, key);
+   burn_stack(sizeof(unsigned) * 8 + sizeof(int) * 2);
+}
+#endif
+
+#ifdef CLEAN_STACK
+static void _skipjack_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key)
+#else
+void skipjack_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key)
+#endif
+{
+   unsigned w1,w2,w3,w4,tmp;
+   int x, kp;
+
+   _ARGCHK(pt != NULL);
+   _ARGCHK(ct != NULL);
+   _ARGCHK(key != NULL);
+
+   /* load block */
+   w1 = ((unsigned)ct[0]<<8)|ct[1];
+   w2 = ((unsigned)ct[2]<<8)|ct[3];
+   w3 = ((unsigned)ct[4]<<8)|ct[5];
+   w4 = ((unsigned)ct[6]<<8)|ct[7];
+
+   /* 8 rounds of RULE B^-1 
+
+      Note the value "kp = 8" comes from "kp = (32 * 4) mod 10" where 32*4 is 128 which mod 10 is 8
+    */
+   for (x = 32, kp = 8; x > 24; x--) {
+       RULE_B1;
+   }
+
+   /* 8 rounds of RULE A^-1 */
+   for (; x > 16; x--) {
+       RULE_A1;
+   }
+
+
+   /* 8 rounds of RULE B^-1 */
+   for (; x > 8; x--) {
+       RULE_B1;
+   }
+
+   /* 8 rounds of RULE A^-1 */
+   for (; x > 0; x--) {
+       RULE_A1;
+   }
+
+   /* store block */
+   pt[0] = (w1>>8)&255; pt[1] = w1&255;
+   pt[2] = (w2>>8)&255; pt[3] = w2&255;
+   pt[4] = (w3>>8)&255; pt[5] = w3&255;
+   pt[6] = (w4>>8)&255; pt[7] = w4&255;
+}
+
+#ifdef CLEAN_STACK
+void skipjack_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key)
+{
+   _skipjack_ecb_decrypt(ct, pt, key);
+   burn_stack(sizeof(unsigned) * 7 + sizeof(int) * 2);
+}
+#endif
+
+int skipjack_test(void)
+{
+ #ifndef LTC_TEST
+    return CRYPT_NOP;
+ #else    
+   static const struct {
+       unsigned char key[10], pt[8], ct[8];
+   } tests[] = {
+   {
+       { 0x00, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 },
+       { 0x33, 0x22, 0x11, 0x00, 0xdd, 0xcc, 0xbb, 0xaa },
+       { 0x25, 0x87, 0xca, 0xe2, 0x7a, 0x12, 0xd3, 0x00 }
+   }
+   };
+   unsigned char buf[2][8];
+   int x, y, err;
+   symmetric_key key;
+
+   for (x = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) {
+      /* setup key */
+      if ((err = skipjack_setup(tests[x].key, 10, 0, &key)) != CRYPT_OK) {
+         return err;
+      }
+
+      /* encrypt and decrypt */
+      skipjack_ecb_encrypt(tests[x].pt, buf[0], &key);
+      skipjack_ecb_decrypt(buf[0], buf[1], &key);
+
+      /* compare */
+      if (memcmp(buf[0], tests[x].ct, 8) != 0 || memcmp(buf[1], tests[x].pt, 8) != 0) {
+         return CRYPT_FAIL_TESTVECTOR;
+      }
+
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 8; y++) buf[0][y] = 0;
+      for (y = 0; y < 1000; y++) skipjack_ecb_encrypt(buf[0], buf[0], &key);
+      for (y = 0; y < 1000; y++) skipjack_ecb_decrypt(buf[0], buf[0], &key);
+      for (y = 0; y < 8; y++) if (buf[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
+   }
+
+   return CRYPT_OK;
+  #endif
+}
+
+int skipjack_keysize(int *desired_keysize)
+{
+   _ARGCHK(desired_keysize != NULL);
+   if (*desired_keysize < 10) {
+      return CRYPT_INVALID_KEYSIZE;
+   } else if (*desired_keysize > 10) {
+      *desired_keysize = 10;
+   }
+   return CRYPT_OK;
+}
+
+#endif

+ 22 - 0
strings.c

@@ -39,6 +39,14 @@ static const char *err_2_str[] =
 
 };
 
+static const struct {
+    int mpi_code, ltc_code;
+} mpi_to_ltc_codes[] = {
+   { MP_OKAY ,  CRYPT_OK},
+   { MP_MEM  ,  CRYPT_MEM},
+   { MP_VAL  ,  CRYPT_INVALID_ARG},
+};
+
 const char *error_to_string(int err)
 {
    if (err < 0 || err >= (int)(sizeof(err_2_str)/sizeof(err_2_str[0]))) {
@@ -48,3 +56,17 @@ const char *error_to_string(int err)
    }   
 }
 
+/* convert a MPI error to a LTC error (Possibly the most powerful function ever!  Oh wait... no) */
+int mpi_to_ltc_error(int err)
+{
+   int x;
+
+   for (x = 0; x < (int)(sizeof(mpi_to_ltc_codes)/sizeof(mpi_to_ltc_codes[0])); x++) {
+       if (err == mpi_to_ltc_codes[x].mpi_code) { 
+          return mpi_to_ltc_codes[x].ltc_code;
+       }
+   }
+   return CRYPT_ERROR;
+}
+
+

+ 15 - 28
tiger.c

@@ -587,9 +587,9 @@ static void key_schedule(ulong64 *x) {
 }    
 
 #ifdef CLEAN_STACK
-static void _tiger_compress(hash_state *md)
+static void _tiger_compress(hash_state *md, unsigned char *buf)
 #else
-static void tiger_compress(hash_state *md)
+static void tiger_compress(hash_state *md, unsigned char *buf)
 #endif
 {
     ulong64 a, b, c, x[8];
@@ -599,7 +599,7 @@ static void tiger_compress(hash_state *md)
 
     /* load words */
     for (i = 0; i < 8; i++) {
-        LOAD64L(x[i],&md->tiger.buf[8*i]);
+        LOAD64L(x[i],&buf[8*i]);
     }
     a = md->tiger.state[0];
     b = md->tiger.state[1];
@@ -618,9 +618,9 @@ static void tiger_compress(hash_state *md)
 }
 
 #ifdef CLEAN_STACK
-static void tiger_compress(hash_state *md)
+static void tiger_compress(hash_state *md, unsigned char *buf)
 {
-   _tiger_compress(md);
+   _tiger_compress(md, buf);
    burn_stack(sizeof(ulong64) * 11 + sizeof(unsigned long));
 }
 #endif
@@ -635,32 +635,17 @@ void tiger_init(hash_state *md)
     md->tiger.length = 0;
 }
 
-void tiger_process(hash_state * md, const unsigned char *buf, unsigned long len)
-{
-    unsigned long n;
-    _ARGCHK(md != NULL);
-    _ARGCHK(buf != NULL);
-    while (len > 0) {
-        n = MIN(len, (64 - md->tiger.curlen));
-        memcpy(md->tiger.buf + md->tiger.curlen, buf, (size_t)n);
-        md->tiger.curlen += n;
-        buf            += n;
-        len            -= n;
-
-        /* is 64 bytes full? */
-        if (md->tiger.curlen == 64) {
-            tiger_compress(md);
-            md->tiger.length += 512;    /* add the number of bits not bytes */
-            md->tiger.curlen = 0;
-        }
-    }
-}
+HASH_PROCESS(tiger_process, tiger_compress, tiger, 64)
 
-void tiger_done(hash_state * md, unsigned char *hash)
+int tiger_done(hash_state * md, unsigned char *hash)
 {
     _ARGCHK(md != NULL);
     _ARGCHK(hash != NULL);
 
+    if (md->tiger.curlen >= sizeof(md->tiger.buf)) {
+       return CRYPT_INVALID_ARG;
+    }
+
     /* increase the length of the message */
     md->tiger.length += md->tiger.curlen * 8;
 
@@ -674,7 +659,7 @@ void tiger_done(hash_state * md, unsigned char *hash)
         while (md->tiger.curlen < 64) {
             md->tiger.buf[md->tiger.curlen++] = (unsigned char)0;
         }
-        tiger_compress(md);
+        tiger_compress(md, md->tiger.buf);
         md->tiger.curlen = 0;
     }
 
@@ -685,7 +670,7 @@ void tiger_done(hash_state * md, unsigned char *hash)
 
     /* store length */
     STORE64L(md->tiger.length, md->tiger.buf+56);
-    tiger_compress(md);
+    tiger_compress(md, md->tiger.buf);
 
     /* copy output */
     STORE64L(md->tiger.state[0], &hash[0]);
@@ -694,6 +679,8 @@ void tiger_done(hash_state * md, unsigned char *hash)
 #ifdef CLEAN_STACK
     zeromem(md, sizeof(hash_state));
 #endif
+
+    return CRYPT_OK;
 }
 
 int  tiger_test(void)

+ 50 - 5
tommath.h

@@ -91,6 +91,24 @@ extern "C" {
 #endif   
 #endif
 
+/* define heap macros */
+#ifndef CRYPT
+   /* default to libc stuff */
+   #ifndef XMALLOC 
+       #define XMALLOC  malloc
+       #define XFREE    free
+       #define XREALLOC realloc
+       #define XCALLOC  calloc
+   #endif
+
+   /* prototypes for our heap functions */
+   extern void *XMALLOC(size_t n);
+   extern void *REALLOC(void *p, size_t n);
+   extern void *XCALLOC(size_t n, size_t s);
+   extern void XFREE(void *p);
+#endif
+
+
 /* otherwise the bits per digit is calculated automatically from the size of a mp_digit */
 #ifndef DIGIT_BIT
    #define DIGIT_BIT     ((int)((CHAR_BIT * sizeof(mp_digit) - 1)))  /* bits per digit */
@@ -113,6 +131,9 @@ extern "C" {
 #define MP_VAL        -3  /* invalid input */
 #define MP_RANGE      MP_VAL
 
+#define MP_YES        1   /* yes response */
+#define MP_NO         0   /* no response */
+
 typedef int           mp_err;
 
 /* you'll have to tune these... */
@@ -130,11 +151,16 @@ extern int KARATSUBA_MUL_CUTOFF,
 /* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */
 #define MP_WARRAY               (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1))
 
+/* the infamous mp_int structure */
 typedef struct  {
     int used, alloc, sign;
     mp_digit *dp;
 } mp_int;
 
+/* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */
+typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat);
+
+
 #define USED(m)    ((m)->used)
 #define DIGIT(m,k) ((m)->dp[(k)])
 #define SIGN(m)    ((m)->sign)
@@ -168,9 +194,9 @@ int mp_grow(mp_int *a, int size);
 int mp_init_size(mp_int *a, int size);
 
 /* ---> Basic Manipulations <--- */
-#define mp_iszero(a) (((a)->used == 0) ? 1 : 0)
-#define mp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? 1 : 0)
-#define mp_isodd(a)  (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? 1 : 0)
+#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
+#define mp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO)
+#define mp_isodd(a)  (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO)
 
 /* set to zero */
 void mp_zero(mp_int *a);
@@ -179,7 +205,7 @@ void mp_zero(mp_int *a);
 void mp_set(mp_int *a, mp_digit b);
 
 /* set a 32-bit const */
-int mp_set_int(mp_int *a, unsigned int b);
+int mp_set_int(mp_int *a, unsigned long b);
 
 /* copy, b = a */
 int mp_copy(mp_int *a, mp_int *b);
@@ -219,6 +245,8 @@ int mp_2expt(mp_int *a, int b);
 /* Counts the number of lsbs which are zero before the first zero bit */
 int mp_cnt_lsb(mp_int *a);
 
+/* I Love Earth! */
+
 /* makes a pseudo-random int of a given size */
 int mp_rand(mp_int *a, int digits);
 
@@ -392,6 +420,11 @@ int mp_prime_fermat(mp_int *a, mp_int *b, int *result);
  */
 int mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result);
 
+/* This gives [for a given bit size] the number of trials required
+ * such that Miller-Rabin gives a prob of failure lower than 2^-96 
+ */
+int mp_prime_rabin_miller_trials(int size);
+
 /* performs t rounds of Miller-Rabin on "a" using the first
  * t prime bases.  Also performs an initial sieve of trial
  * division.  Determines if "a" is prime with probability
@@ -408,6 +441,18 @@ int mp_prime_is_prime(mp_int *a, int t, int *result);
  */
 int mp_prime_next_prime(mp_int *a, int t, int bbs_style);
 
+/* makes a truly random prime of a given size (bytes),
+ * call with bbs = 1 if you want it to be congruent to 3 mod 4 
+ *
+ * You have to supply a callback which fills in a buffer with random bytes.  "dat" is a parameter you can
+ * have passed to the callback (e.g. a state or something).  This function doesn't use "dat" itself
+ * so it can be NULL
+ *
+ * The prime generated will be larger than 2^(8*size).
+ */
+int mp_prime_random(mp_int *a, int t, int size, int bbs, ltm_prime_callback cb, void *dat);
+
+
 /* ---> radix conversion <--- */
 int mp_count_bits(mp_int *a);
 
@@ -464,5 +509,5 @@ extern const char *mp_s_rmap;
    }
 #endif
 
-#endif /* ?BN_H_ */
+#endif
 

+ 85 - 240
twofish.c

@@ -3,6 +3,13 @@
 
 #ifdef TWOFISH
 
+/* first TWOFISH_ALL_TABLES must ensure TWOFISH_TABLES is defined */
+#ifdef TWOFISH_ALL_TABLES
+#ifndef TWOFISH_TABLES
+#define TWOFISH_TABLES
+#endif
+#endif
+
 const struct _cipher_descriptor twofish_desc =
 {
     "twofish",
@@ -44,213 +51,21 @@ static const unsigned char qord[4][5] = {
 };
 
 #ifdef TWOFISH_TABLES
-static const unsigned char SBOX[2][256] = {
-{
- 0xa9, 0x67, 0xb3, 0xe8, 0x04, 0xfd, 0xa3, 0x76, 0x9a, 0x92, 
- 0x80, 0x78, 0xe4, 0xdd, 0xd1, 0x38, 0x0d, 0xc6, 0x35, 0x98, 
- 0x18, 0xf7, 0xec, 0x6c, 0x43, 0x75, 0x37, 0x26, 0xfa, 0x13, 
- 0x94, 0x48, 0xf2, 0xd0, 0x8b, 0x30, 0x84, 0x54, 0xdf, 0x23, 
- 0x19, 0x5b, 0x3d, 0x59, 0xf3, 0xae, 0xa2, 0x82, 0x63, 0x01, 
- 0x83, 0x2e, 0xd9, 0x51, 0x9b, 0x7c, 0xa6, 0xeb, 0xa5, 0xbe, 
- 0x16, 0x0c, 0xe3, 0x61, 0xc0, 0x8c, 0x3a, 0xf5, 0x73, 0x2c, 
- 0x25, 0x0b, 0xbb, 0x4e, 0x89, 0x6b, 0x53, 0x6a, 0xb4, 0xf1, 
- 0xe1, 0xe6, 0xbd, 0x45, 0xe2, 0xf4, 0xb6, 0x66, 0xcc, 0x95,
- 0x03, 0x56, 0xd4, 0x1c, 0x1e, 0xd7, 0xfb, 0xc3, 0x8e, 0xb5, 
- 0xe9, 0xcf, 0xbf, 0xba, 0xea, 0x77, 0x39, 0xaf, 0x33, 0xc9, 
- 0x62, 0x71, 0x81, 0x79, 0x09, 0xad, 0x24, 0xcd, 0xf9, 0xd8, 
- 0xe5, 0xc5, 0xb9, 0x4d, 0x44, 0x08, 0x86, 0xe7, 0xa1, 0x1d, 
- 0xaa, 0xed, 0x06, 0x70, 0xb2, 0xd2, 0x41, 0x7b, 0xa0, 0x11, 
- 0x31, 0xc2, 0x27, 0x90, 0x20, 0xf6, 0x60, 0xff, 0x96, 0x5c, 
- 0xb1, 0xab, 0x9e, 0x9c, 0x52, 0x1b, 0x5f, 0x93, 0x0a, 0xef, 
- 0x91, 0x85, 0x49, 0xee, 0x2d, 0x4f, 0x8f, 0x3b, 0x47, 0x87, 
- 0x6d, 0x46, 0xd6, 0x3e, 0x69, 0x64, 0x2a, 0xce, 0xcb, 0x2f, 
- 0xfc, 0x97, 0x05, 0x7a, 0xac, 0x7f, 0xd5, 0x1a, 0x4b, 0x0e, 
- 0xa7, 0x5a, 0x28, 0x14, 0x3f, 0x29, 0x88, 0x3c, 0x4c, 0x02, 
- 0xb8, 0xda, 0xb0, 0x17, 0x55, 0x1f, 0x8a, 0x7d, 0x57, 0xc7, 
- 0x8d, 0x74, 0xb7, 0xc4, 0x9f, 0x72, 0x7e, 0x15, 0x22, 0x12, 
- 0x58, 0x07, 0x99, 0x34, 0x6e, 0x50, 0xde, 0x68, 0x65, 0xbc, 
- 0xdb, 0xf8, 0xc8, 0xa8, 0x2b, 0x40, 0xdc, 0xfe, 0x32, 0xa4, 
- 0xca, 0x10, 0x21, 0xf0, 0xd3, 0x5d, 0x0f, 0x00, 0x6f, 0x9d, 
- 0x36, 0x42, 0x4a, 0x5e, 0xc1, 0xe0},
-{
- 0x75, 0xf3, 0xc6, 0xf4, 0xdb, 0x7b, 0xfb, 0xc8, 0x4a, 0xd3, 
- 0xe6, 0x6b, 0x45, 0x7d, 0xe8, 0x4b, 0xd6, 0x32, 0xd8, 0xfd,
- 0x37, 0x71, 0xf1, 0xe1, 0x30, 0x0f, 0xf8, 0x1b, 0x87, 0xfa, 
- 0x06, 0x3f, 0x5e, 0xba, 0xae, 0x5b, 0x8a, 0x00, 0xbc, 0x9d, 
- 0x6d, 0xc1, 0xb1, 0x0e, 0x80, 0x5d, 0xd2, 0xd5, 0xa0, 0x84, 
- 0x07, 0x14, 0xb5, 0x90, 0x2c, 0xa3, 0xb2, 0x73, 0x4c, 0x54, 
- 0x92, 0x74, 0x36, 0x51, 0x38, 0xb0, 0xbd, 0x5a, 0xfc, 0x60, 
- 0x62, 0x96, 0x6c, 0x42, 0xf7, 0x10, 0x7c, 0x28, 0x27, 0x8c, 
- 0x13, 0x95, 0x9c, 0xc7, 0x24, 0x46, 0x3b, 0x70, 0xca, 0xe3, 
- 0x85, 0xcb, 0x11, 0xd0, 0x93, 0xb8, 0xa6, 0x83, 0x20, 0xff,
- 0x9f, 0x77, 0xc3, 0xcc, 0x03, 0x6f, 0x08, 0xbf, 0x40, 0xe7, 
- 0x2b, 0xe2, 0x79, 0x0c, 0xaa, 0x82, 0x41, 0x3a, 0xea, 0xb9, 
- 0xe4, 0x9a, 0xa4, 0x97, 0x7e, 0xda, 0x7a, 0x17, 0x66, 0x94, 
- 0xa1, 0x1d, 0x3d, 0xf0, 0xde, 0xb3, 0x0b, 0x72, 0xa7, 0x1c, 
- 0xef, 0xd1, 0x53, 0x3e, 0x8f, 0x33, 0x26, 0x5f, 0xec, 0x76, 
- 0x2a, 0x49, 0x81, 0x88, 0xee, 0x21, 0xc4, 0x1a, 0xeb, 0xd9, 
- 0xc5, 0x39, 0x99, 0xcd, 0xad, 0x31, 0x8b, 0x01, 0x18, 0x23, 
- 0xdd, 0x1f, 0x4e, 0x2d, 0xf9, 0x48, 0x4f, 0xf2, 0x65, 0x8e, 
- 0x78, 0x5c, 0x58, 0x19, 0x8d, 0xe5, 0x98, 0x57, 0x67, 0x7f, 
- 0x05, 0x64, 0xaf, 0x63, 0xb6, 0xfe, 0xf5, 0xb7, 0x3c, 0xa5, 
- 0xce, 0xe9, 0x68, 0x44, 0xe0, 0x4d, 0x43, 0x69, 0x29, 0x2e, 
- 0xac, 0x15, 0x59, 0xa8, 0x0a, 0x9e, 0x6e, 0x47, 0xdf, 0x34, 
- 0x35, 0x6a, 0xcf, 0xdc, 0x22, 0xc9, 0xc0, 0x9b, 0x89, 0xd4, 
- 0xed, 0xab, 0x12, 0xa2, 0x0d, 0x52, 0xbb, 0x02, 0x2f, 0xa9, 
- 0xd7, 0x61, 0x1e, 0xb4, 0x50, 0x04, 0xf6, 0xc2, 0x16, 0x25, 
- 0x86, 0x56, 0x55, 0x09, 0xbe, 0x91}
-};
 
-static const ulong32 mds_tab[4][256] = {
-{
-0x00000000UL, 0xefef5b01UL, 0xb7b7b602UL, 0x5858ed03UL, 0x07070504UL, 0xe8e85e05UL, 0xb0b0b306UL, 0x5f5fe807UL, 
-0x0e0e0a08UL, 0xe1e15109UL, 0xb9b9bc0aUL, 0x5656e70bUL, 0x09090f0cUL, 0xe6e6540dUL, 0xbebeb90eUL, 0x5151e20fUL, 
-0x1c1c1410UL, 0xf3f34f11UL, 0xababa212UL, 0x4444f913UL, 0x1b1b1114UL, 0xf4f44a15UL, 0xacaca716UL, 0x4343fc17UL, 
-0x12121e18UL, 0xfdfd4519UL, 0xa5a5a81aUL, 0x4a4af31bUL, 0x15151b1cUL, 0xfafa401dUL, 0xa2a2ad1eUL, 0x4d4df61fUL, 
-0x38382820UL, 0xd7d77321UL, 0x8f8f9e22UL, 0x6060c523UL, 0x3f3f2d24UL, 0xd0d07625UL, 0x88889b26UL, 0x6767c027UL, 
-0x36362228UL, 0xd9d97929UL, 0x8181942aUL, 0x6e6ecf2bUL, 0x3131272cUL, 0xdede7c2dUL, 0x8686912eUL, 0x6969ca2fUL, 
-0x24243c30UL, 0xcbcb6731UL, 0x93938a32UL, 0x7c7cd133UL, 0x23233934UL, 0xcccc6235UL, 0x94948f36UL, 0x7b7bd437UL, 
-0x2a2a3638UL, 0xc5c56d39UL, 0x9d9d803aUL, 0x7272db3bUL, 0x2d2d333cUL, 0xc2c2683dUL, 0x9a9a853eUL, 0x7575de3fUL, 
-0x70705040UL, 0x9f9f0b41UL, 0xc7c7e642UL, 0x2828bd43UL, 0x77775544UL, 0x98980e45UL, 0xc0c0e346UL, 0x2f2fb847UL,
-0x7e7e5a48UL, 0x91910149UL, 0xc9c9ec4aUL, 0x2626b74bUL, 0x79795f4cUL, 0x9696044dUL, 0xcecee94eUL, 0x2121b24fUL, 
-0x6c6c4450UL, 0x83831f51UL, 0xdbdbf252UL, 0x3434a953UL, 0x6b6b4154UL, 0x84841a55UL, 0xdcdcf756UL, 0x3333ac57UL, 
-0x62624e58UL, 0x8d8d1559UL, 0xd5d5f85aUL, 0x3a3aa35bUL, 0x65654b5cUL, 0x8a8a105dUL, 0xd2d2fd5eUL, 0x3d3da65fUL, 
-0x48487860UL, 0xa7a72361UL, 0xffffce62UL, 0x10109563UL, 0x4f4f7d64UL, 0xa0a02665UL, 0xf8f8cb66UL, 0x17179067UL, 
-0x46467268UL, 0xa9a92969UL, 0xf1f1c46aUL, 0x1e1e9f6bUL, 0x4141776cUL, 0xaeae2c6dUL, 0xf6f6c16eUL, 0x19199a6fUL, 
-0x54546c70UL, 0xbbbb3771UL, 0xe3e3da72UL, 0x0c0c8173UL, 0x53536974UL, 0xbcbc3275UL, 0xe4e4df76UL, 0x0b0b8477UL, 
-0x5a5a6678UL, 0xb5b53d79UL, 0xededd07aUL, 0x02028b7bUL, 0x5d5d637cUL, 0xb2b2387dUL, 0xeaead57eUL, 0x05058e7fUL, 
-0xe0e0a080UL, 0x0f0ffb81UL, 0x57571682UL, 0xb8b84d83UL, 0xe7e7a584UL, 0x0808fe85UL, 0x50501386UL, 0xbfbf4887UL, 
-0xeeeeaa88UL, 0x0101f189UL, 0x59591c8aUL, 0xb6b6478bUL, 0xe9e9af8cUL, 0x0606f48dUL, 0x5e5e198eUL, 0xb1b1428fUL, 
-0xfcfcb490UL, 0x1313ef91UL, 0x4b4b0292UL, 0xa4a45993UL, 0xfbfbb194UL, 0x1414ea95UL, 0x4c4c0796UL, 0xa3a35c97UL, 
-0xf2f2be98UL, 0x1d1de599UL, 0x4545089aUL, 0xaaaa539bUL, 0xf5f5bb9cUL, 0x1a1ae09dUL, 0x42420d9eUL, 0xadad569fUL, 
-0xd8d888a0UL, 0x3737d3a1UL, 0x6f6f3ea2UL, 0x808065a3UL, 0xdfdf8da4UL, 0x3030d6a5UL, 0x68683ba6UL, 0x878760a7UL, 
-0xd6d682a8UL, 0x3939d9a9UL, 0x616134aaUL, 0x8e8e6fabUL, 0xd1d187acUL, 0x3e3edcadUL, 0x666631aeUL, 0x89896aafUL, 
-0xc4c49cb0UL, 0x2b2bc7b1UL, 0x73732ab2UL, 0x9c9c71b3UL, 0xc3c399b4UL, 0x2c2cc2b5UL, 0x74742fb6UL, 0x9b9b74b7UL, 
-0xcaca96b8UL, 0x2525cdb9UL, 0x7d7d20baUL, 0x92927bbbUL, 0xcdcd93bcUL, 0x2222c8bdUL, 0x7a7a25beUL, 0x95957ebfUL, 
-0x9090f0c0UL, 0x7f7fabc1UL, 0x272746c2UL, 0xc8c81dc3UL, 0x9797f5c4UL, 0x7878aec5UL, 0x202043c6UL, 0xcfcf18c7UL, 
-0x9e9efac8UL, 0x7171a1c9UL, 0x29294ccaUL, 0xc6c617cbUL, 0x9999ffccUL, 0x7676a4cdUL, 0x2e2e49ceUL, 0xc1c112cfUL, 
-0x8c8ce4d0UL, 0x6363bfd1UL, 0x3b3b52d2UL, 0xd4d409d3UL, 0x8b8be1d4UL, 0x6464bad5UL, 0x3c3c57d6UL, 0xd3d30cd7UL, 
-0x8282eed8UL, 0x6d6db5d9UL, 0x353558daUL, 0xdada03dbUL, 0x8585ebdcUL, 0x6a6ab0ddUL, 0x32325ddeUL, 0xdddd06dfUL, 
-0xa8a8d8e0UL, 0x474783e1UL, 0x1f1f6ee2UL, 0xf0f035e3UL, 0xafafdde4UL, 0x404086e5UL, 0x18186be6UL, 0xf7f730e7UL, 
-0xa6a6d2e8UL, 0x494989e9UL, 0x111164eaUL, 0xfefe3febUL, 0xa1a1d7ecUL, 0x4e4e8cedUL, 0x161661eeUL, 0xf9f93aefUL, 
-0xb4b4ccf0UL, 0x5b5b97f1UL, 0x03037af2UL, 0xecec21f3UL, 0xb3b3c9f4UL, 0x5c5c92f5UL, 0x04047ff6UL, 0xebeb24f7UL, 
-0xbabac6f8UL, 0x55559df9UL, 0x0d0d70faUL, 0xe2e22bfbUL, 0xbdbdc3fcUL, 0x525298fdUL, 0x0a0a75feUL, 0xe5e52effUL
-}, 
-{
-0x00000000UL, 0x015befefUL, 0x02b6b7b7UL, 0x03ed5858UL, 0x04050707UL, 0x055ee8e8UL, 0x06b3b0b0UL, 0x07e85f5fUL, 
-0x080a0e0eUL, 0x0951e1e1UL, 0x0abcb9b9UL, 0x0be75656UL, 0x0c0f0909UL, 0x0d54e6e6UL, 0x0eb9bebeUL, 0x0fe25151UL, 
-0x10141c1cUL, 0x114ff3f3UL, 0x12a2ababUL, 0x13f94444UL, 0x14111b1bUL, 0x154af4f4UL, 0x16a7acacUL, 0x17fc4343UL, 
-0x181e1212UL, 0x1945fdfdUL, 0x1aa8a5a5UL, 0x1bf34a4aUL, 0x1c1b1515UL, 0x1d40fafaUL, 0x1eada2a2UL, 0x1ff64d4dUL, 
-0x20283838UL, 0x2173d7d7UL, 0x229e8f8fUL, 0x23c56060UL, 0x242d3f3fUL, 0x2576d0d0UL, 0x269b8888UL, 0x27c06767UL, 
-0x28223636UL, 0x2979d9d9UL, 0x2a948181UL, 0x2bcf6e6eUL, 0x2c273131UL, 0x2d7cdedeUL, 0x2e918686UL, 0x2fca6969UL, 
-0x303c2424UL, 0x3167cbcbUL, 0x328a9393UL, 0x33d17c7cUL, 0x34392323UL, 0x3562ccccUL, 0x368f9494UL, 0x37d47b7bUL, 
-0x38362a2aUL, 0x396dc5c5UL, 0x3a809d9dUL, 0x3bdb7272UL, 0x3c332d2dUL, 0x3d68c2c2UL, 0x3e859a9aUL, 0x3fde7575UL, 
-0x40507070UL, 0x410b9f9fUL, 0x42e6c7c7UL, 0x43bd2828UL, 0x44557777UL, 0x450e9898UL, 0x46e3c0c0UL, 0x47b82f2fUL, 
-0x485a7e7eUL, 0x49019191UL, 0x4aecc9c9UL, 0x4bb72626UL, 0x4c5f7979UL, 0x4d049696UL, 0x4ee9ceceUL, 0x4fb22121UL, 
-0x50446c6cUL, 0x511f8383UL, 0x52f2dbdbUL, 0x53a93434UL, 0x54416b6bUL, 0x551a8484UL, 0x56f7dcdcUL, 0x57ac3333UL, 
-0x584e6262UL, 0x59158d8dUL, 0x5af8d5d5UL, 0x5ba33a3aUL, 0x5c4b6565UL, 0x5d108a8aUL, 0x5efdd2d2UL, 0x5fa63d3dUL,
-0x60784848UL, 0x6123a7a7UL, 0x62ceffffUL, 0x63951010UL, 0x647d4f4fUL, 0x6526a0a0UL, 0x66cbf8f8UL, 0x67901717UL, 
-0x68724646UL, 0x6929a9a9UL, 0x6ac4f1f1UL, 0x6b9f1e1eUL, 0x6c774141UL, 0x6d2caeaeUL, 0x6ec1f6f6UL, 0x6f9a1919UL, 
-0x706c5454UL, 0x7137bbbbUL, 0x72dae3e3UL, 0x73810c0cUL, 0x74695353UL, 0x7532bcbcUL, 0x76dfe4e4UL, 0x77840b0bUL, 
-0x78665a5aUL, 0x793db5b5UL, 0x7ad0ededUL, 0x7b8b0202UL, 0x7c635d5dUL, 0x7d38b2b2UL, 0x7ed5eaeaUL, 0x7f8e0505UL, 
-0x80a0e0e0UL, 0x81fb0f0fUL, 0x82165757UL, 0x834db8b8UL, 0x84a5e7e7UL, 0x85fe0808UL, 0x86135050UL, 0x8748bfbfUL, 
-0x88aaeeeeUL, 0x89f10101UL, 0x8a1c5959UL, 0x8b47b6b6UL, 0x8cafe9e9UL, 0x8df40606UL, 0x8e195e5eUL, 0x8f42b1b1UL, 
-0x90b4fcfcUL, 0x91ef1313UL, 0x92024b4bUL, 0x9359a4a4UL, 0x94b1fbfbUL, 0x95ea1414UL, 0x96074c4cUL, 0x975ca3a3UL, 
-0x98bef2f2UL, 0x99e51d1dUL, 0x9a084545UL, 0x9b53aaaaUL, 0x9cbbf5f5UL, 0x9de01a1aUL, 0x9e0d4242UL, 0x9f56adadUL, 
-0xa088d8d8UL, 0xa1d33737UL, 0xa23e6f6fUL, 0xa3658080UL, 0xa48ddfdfUL, 0xa5d63030UL, 0xa63b6868UL, 0xa7608787UL, 
-0xa882d6d6UL, 0xa9d93939UL, 0xaa346161UL, 0xab6f8e8eUL, 0xac87d1d1UL, 0xaddc3e3eUL, 0xae316666UL, 0xaf6a8989UL, 
-0xb09cc4c4UL, 0xb1c72b2bUL, 0xb22a7373UL, 0xb3719c9cUL, 0xb499c3c3UL, 0xb5c22c2cUL, 0xb62f7474UL, 0xb7749b9bUL, 
-0xb896cacaUL, 0xb9cd2525UL, 0xba207d7dUL, 0xbb7b9292UL, 0xbc93cdcdUL, 0xbdc82222UL, 0xbe257a7aUL, 0xbf7e9595UL, 
-0xc0f09090UL, 0xc1ab7f7fUL, 0xc2462727UL, 0xc31dc8c8UL, 0xc4f59797UL, 0xc5ae7878UL, 0xc6432020UL, 0xc718cfcfUL, 
-0xc8fa9e9eUL, 0xc9a17171UL, 0xca4c2929UL, 0xcb17c6c6UL, 0xccff9999UL, 0xcda47676UL, 0xce492e2eUL, 0xcf12c1c1UL, 
-0xd0e48c8cUL, 0xd1bf6363UL, 0xd2523b3bUL, 0xd309d4d4UL, 0xd4e18b8bUL, 0xd5ba6464UL, 0xd6573c3cUL, 0xd70cd3d3UL, 
-0xd8ee8282UL, 0xd9b56d6dUL, 0xda583535UL, 0xdb03dadaUL, 0xdceb8585UL, 0xddb06a6aUL, 0xde5d3232UL, 0xdf06ddddUL, 
-0xe0d8a8a8UL, 0xe1834747UL, 0xe26e1f1fUL, 0xe335f0f0UL, 0xe4ddafafUL, 0xe5864040UL, 0xe66b1818UL, 0xe730f7f7UL, 
-0xe8d2a6a6UL, 0xe9894949UL, 0xea641111UL, 0xeb3ffefeUL, 0xecd7a1a1UL, 0xed8c4e4eUL, 0xee611616UL, 0xef3af9f9UL, 
-0xf0ccb4b4UL, 0xf1975b5bUL, 0xf27a0303UL, 0xf321ececUL, 0xf4c9b3b3UL, 0xf5925c5cUL, 0xf67f0404UL, 0xf724ebebUL, 
-0xf8c6babaUL, 0xf99d5555UL, 0xfa700d0dUL, 0xfb2be2e2UL, 0xfcc3bdbdUL, 0xfd985252UL, 0xfe750a0aUL, 0xff2ee5e5UL
-}, 
-{
-0x00000000UL, 0xef01ef5bUL, 0xb702b7b6UL, 0x580358edUL, 0x07040705UL, 0xe805e85eUL, 0xb006b0b3UL, 0x5f075fe8UL, 
-0x0e080e0aUL, 0xe109e151UL, 0xb90ab9bcUL, 0x560b56e7UL, 0x090c090fUL, 0xe60de654UL, 0xbe0ebeb9UL, 0x510f51e2UL, 
-0x1c101c14UL, 0xf311f34fUL, 0xab12aba2UL, 0x441344f9UL, 0x1b141b11UL, 0xf415f44aUL, 0xac16aca7UL, 0x431743fcUL, 
-0x1218121eUL, 0xfd19fd45UL, 0xa51aa5a8UL, 0x4a1b4af3UL, 0x151c151bUL, 0xfa1dfa40UL, 0xa21ea2adUL, 0x4d1f4df6UL, 
-0x38203828UL, 0xd721d773UL, 0x8f228f9eUL, 0x602360c5UL, 0x3f243f2dUL, 0xd025d076UL, 0x8826889bUL, 0x672767c0UL, 
-0x36283622UL, 0xd929d979UL, 0x812a8194UL, 0x6e2b6ecfUL, 0x312c3127UL, 0xde2dde7cUL, 0x862e8691UL, 0x692f69caUL, 
-0x2430243cUL, 0xcb31cb67UL, 0x9332938aUL, 0x7c337cd1UL, 0x23342339UL, 0xcc35cc62UL, 0x9436948fUL, 0x7b377bd4UL, 
-0x2a382a36UL, 0xc539c56dUL, 0x9d3a9d80UL, 0x723b72dbUL, 0x2d3c2d33UL, 0xc23dc268UL, 0x9a3e9a85UL, 0x753f75deUL, 
-0x70407050UL, 0x9f419f0bUL, 0xc742c7e6UL, 0x284328bdUL, 0x77447755UL, 0x9845980eUL, 0xc046c0e3UL, 0x2f472fb8UL, 
-0x7e487e5aUL, 0x91499101UL, 0xc94ac9ecUL, 0x264b26b7UL, 0x794c795fUL, 0x964d9604UL, 0xce4ecee9UL, 0x214f21b2UL, 
-0x6c506c44UL, 0x8351831fUL, 0xdb52dbf2UL, 0x345334a9UL, 0x6b546b41UL, 0x8455841aUL, 0xdc56dcf7UL, 0x335733acUL, 
-0x6258624eUL, 0x8d598d15UL, 0xd55ad5f8UL, 0x3a5b3aa3UL, 0x655c654bUL, 0x8a5d8a10UL, 0xd25ed2fdUL, 0x3d5f3da6UL, 
-0x48604878UL, 0xa761a723UL, 0xff62ffceUL, 0x10631095UL, 0x4f644f7dUL, 0xa065a026UL, 0xf866f8cbUL, 0x17671790UL, 
-0x46684672UL, 0xa969a929UL, 0xf16af1c4UL, 0x1e6b1e9fUL, 0x416c4177UL, 0xae6dae2cUL, 0xf66ef6c1UL, 0x196f199aUL, 
-0x5470546cUL, 0xbb71bb37UL, 0xe372e3daUL, 0x0c730c81UL, 0x53745369UL, 0xbc75bc32UL, 0xe476e4dfUL, 0x0b770b84UL,
-0x5a785a66UL, 0xb579b53dUL, 0xed7aedd0UL, 0x027b028bUL, 0x5d7c5d63UL, 0xb27db238UL, 0xea7eead5UL, 0x057f058eUL, 
-0xe080e0a0UL, 0x0f810ffbUL, 0x57825716UL, 0xb883b84dUL, 0xe784e7a5UL, 0x088508feUL, 0x50865013UL, 0xbf87bf48UL, 
-0xee88eeaaUL, 0x018901f1UL, 0x598a591cUL, 0xb68bb647UL, 0xe98ce9afUL, 0x068d06f4UL, 0x5e8e5e19UL, 0xb18fb142UL, 
-0xfc90fcb4UL, 0x139113efUL, 0x4b924b02UL, 0xa493a459UL, 0xfb94fbb1UL, 0x149514eaUL, 0x4c964c07UL, 0xa397a35cUL, 
-0xf298f2beUL, 0x1d991de5UL, 0x459a4508UL, 0xaa9baa53UL, 0xf59cf5bbUL, 0x1a9d1ae0UL, 0x429e420dUL, 0xad9fad56UL, 
-0xd8a0d888UL, 0x37a137d3UL, 0x6fa26f3eUL, 0x80a38065UL, 0xdfa4df8dUL, 0x30a530d6UL, 0x68a6683bUL, 0x87a78760UL, 
-0xd6a8d682UL, 0x39a939d9UL, 0x61aa6134UL, 0x8eab8e6fUL, 0xd1acd187UL, 0x3ead3edcUL, 0x66ae6631UL, 0x89af896aUL, 
-0xc4b0c49cUL, 0x2bb12bc7UL, 0x73b2732aUL, 0x9cb39c71UL, 0xc3b4c399UL, 0x2cb52cc2UL, 0x74b6742fUL, 0x9bb79b74UL, 
-0xcab8ca96UL, 0x25b925cdUL, 0x7dba7d20UL, 0x92bb927bUL, 0xcdbccd93UL, 0x22bd22c8UL, 0x7abe7a25UL, 0x95bf957eUL, 
-0x90c090f0UL, 0x7fc17fabUL, 0x27c22746UL, 0xc8c3c81dUL, 0x97c497f5UL, 0x78c578aeUL, 0x20c62043UL, 0xcfc7cf18UL, 
-0x9ec89efaUL, 0x71c971a1UL, 0x29ca294cUL, 0xc6cbc617UL, 0x99cc99ffUL, 0x76cd76a4UL, 0x2ece2e49UL, 0xc1cfc112UL, 
-0x8cd08ce4UL, 0x63d163bfUL, 0x3bd23b52UL, 0xd4d3d409UL, 0x8bd48be1UL, 0x64d564baUL, 0x3cd63c57UL, 0xd3d7d30cUL, 
-0x82d882eeUL, 0x6dd96db5UL, 0x35da3558UL, 0xdadbda03UL, 0x85dc85ebUL, 0x6add6ab0UL, 0x32de325dUL, 0xdddfdd06UL, 
-0xa8e0a8d8UL, 0x47e14783UL, 0x1fe21f6eUL, 0xf0e3f035UL, 0xafe4afddUL, 0x40e54086UL, 0x18e6186bUL, 0xf7e7f730UL, 
-0xa6e8a6d2UL, 0x49e94989UL, 0x11ea1164UL, 0xfeebfe3fUL, 0xa1eca1d7UL, 0x4eed4e8cUL, 0x16ee1661UL, 0xf9eff93aUL, 
-0xb4f0b4ccUL, 0x5bf15b97UL, 0x03f2037aUL, 0xecf3ec21UL, 0xb3f4b3c9UL, 0x5cf55c92UL, 0x04f6047fUL, 0xebf7eb24UL, 
-0xbaf8bac6UL, 0x55f9559dUL, 0x0dfa0d70UL, 0xe2fbe22bUL, 0xbdfcbdc3UL, 0x52fd5298UL, 0x0afe0a75UL, 0xe5ffe52eUL
-}, 
-{
-0x00000000UL, 0x5bef015bUL, 0xb6b702b6UL, 0xed5803edUL, 0x05070405UL, 0x5ee8055eUL, 0xb3b006b3UL, 0xe85f07e8UL, 
-0x0a0e080aUL, 0x51e10951UL, 0xbcb90abcUL, 0xe7560be7UL, 0x0f090c0fUL, 0x54e60d54UL, 0xb9be0eb9UL, 0xe2510fe2UL, 
-0x141c1014UL, 0x4ff3114fUL, 0xa2ab12a2UL, 0xf94413f9UL, 0x111b1411UL, 0x4af4154aUL, 0xa7ac16a7UL, 0xfc4317fcUL, 
-0x1e12181eUL, 0x45fd1945UL, 0xa8a51aa8UL, 0xf34a1bf3UL, 0x1b151c1bUL, 0x40fa1d40UL, 0xada21eadUL, 0xf64d1ff6UL, 
-0x28382028UL, 0x73d72173UL, 0x9e8f229eUL, 0xc56023c5UL, 0x2d3f242dUL, 0x76d02576UL, 0x9b88269bUL, 0xc06727c0UL, 
-0x22362822UL, 0x79d92979UL, 0x94812a94UL, 0xcf6e2bcfUL, 0x27312c27UL, 0x7cde2d7cUL, 0x91862e91UL, 0xca692fcaUL, 
-0x3c24303cUL, 0x67cb3167UL, 0x8a93328aUL, 0xd17c33d1UL, 0x39233439UL, 0x62cc3562UL, 0x8f94368fUL, 0xd47b37d4UL, 
-0x362a3836UL, 0x6dc5396dUL, 0x809d3a80UL, 0xdb723bdbUL, 0x332d3c33UL, 0x68c23d68UL, 0x859a3e85UL, 0xde753fdeUL, 
-0x50704050UL, 0x0b9f410bUL, 0xe6c742e6UL, 0xbd2843bdUL, 0x55774455UL, 0x0e98450eUL, 0xe3c046e3UL, 0xb82f47b8UL, 
-0x5a7e485aUL, 0x01914901UL, 0xecc94aecUL, 0xb7264bb7UL, 0x5f794c5fUL, 0x04964d04UL, 0xe9ce4ee9UL, 0xb2214fb2UL, 
-0x446c5044UL, 0x1f83511fUL, 0xf2db52f2UL, 0xa93453a9UL, 0x416b5441UL, 0x1a84551aUL, 0xf7dc56f7UL, 0xac3357acUL, 
-0x4e62584eUL, 0x158d5915UL, 0xf8d55af8UL, 0xa33a5ba3UL, 0x4b655c4bUL, 0x108a5d10UL, 0xfdd25efdUL, 0xa63d5fa6UL, 
-0x78486078UL, 0x23a76123UL, 0xceff62ceUL, 0x95106395UL, 0x7d4f647dUL, 0x26a06526UL, 0xcbf866cbUL, 0x90176790UL, 
-0x72466872UL, 0x29a96929UL, 0xc4f16ac4UL, 0x9f1e6b9fUL, 0x77416c77UL, 0x2cae6d2cUL, 0xc1f66ec1UL, 0x9a196f9aUL, 
-0x6c54706cUL, 0x37bb7137UL, 0xdae372daUL, 0x810c7381UL, 0x69537469UL, 0x32bc7532UL, 0xdfe476dfUL, 0x840b7784UL, 
-0x665a7866UL, 0x3db5793dUL, 0xd0ed7ad0UL, 0x8b027b8bUL, 0x635d7c63UL, 0x38b27d38UL, 0xd5ea7ed5UL, 0x8e057f8eUL, 
-0xa0e080a0UL, 0xfb0f81fbUL, 0x16578216UL, 0x4db8834dUL, 0xa5e784a5UL, 0xfe0885feUL, 0x13508613UL, 0x48bf8748UL, 
-0xaaee88aaUL, 0xf10189f1UL, 0x1c598a1cUL, 0x47b68b47UL, 0xafe98cafUL, 0xf4068df4UL, 0x195e8e19UL, 0x42b18f42UL,
-0xb4fc90b4UL, 0xef1391efUL, 0x024b9202UL, 0x59a49359UL, 0xb1fb94b1UL, 0xea1495eaUL, 0x074c9607UL, 0x5ca3975cUL, 
-0xbef298beUL, 0xe51d99e5UL, 0x08459a08UL, 0x53aa9b53UL, 0xbbf59cbbUL, 0xe01a9de0UL, 0x0d429e0dUL, 0x56ad9f56UL, 
-0x88d8a088UL, 0xd337a1d3UL, 0x3e6fa23eUL, 0x6580a365UL, 0x8ddfa48dUL, 0xd630a5d6UL, 0x3b68a63bUL, 0x6087a760UL, 
-0x82d6a882UL, 0xd939a9d9UL, 0x3461aa34UL, 0x6f8eab6fUL, 0x87d1ac87UL, 0xdc3eaddcUL, 0x3166ae31UL, 0x6a89af6aUL, 
-0x9cc4b09cUL, 0xc72bb1c7UL, 0x2a73b22aUL, 0x719cb371UL, 0x99c3b499UL, 0xc22cb5c2UL, 0x2f74b62fUL, 0x749bb774UL, 
-0x96cab896UL, 0xcd25b9cdUL, 0x207dba20UL, 0x7b92bb7bUL, 0x93cdbc93UL, 0xc822bdc8UL, 0x257abe25UL, 0x7e95bf7eUL, 
-0xf090c0f0UL, 0xab7fc1abUL, 0x4627c246UL, 0x1dc8c31dUL, 0xf597c4f5UL, 0xae78c5aeUL, 0x4320c643UL, 0x18cfc718UL, 
-0xfa9ec8faUL, 0xa171c9a1UL, 0x4c29ca4cUL, 0x17c6cb17UL, 0xff99ccffUL, 0xa476cda4UL, 0x492ece49UL, 0x12c1cf12UL, 
-0xe48cd0e4UL, 0xbf63d1bfUL, 0x523bd252UL, 0x09d4d309UL, 0xe18bd4e1UL, 0xba64d5baUL, 0x573cd657UL, 0x0cd3d70cUL, 
-0xee82d8eeUL, 0xb56dd9b5UL, 0x5835da58UL, 0x03dadb03UL, 0xeb85dcebUL, 0xb06addb0UL, 0x5d32de5dUL, 0x06dddf06UL, 
-0xd8a8e0d8UL, 0x8347e183UL, 0x6e1fe26eUL, 0x35f0e335UL, 0xddafe4ddUL, 0x8640e586UL, 0x6b18e66bUL, 0x30f7e730UL, 
-0xd2a6e8d2UL, 0x8949e989UL, 0x6411ea64UL, 0x3ffeeb3fUL, 0xd7a1ecd7UL, 0x8c4eed8cUL, 0x6116ee61UL, 0x3af9ef3aUL, 
-0xccb4f0ccUL, 0x975bf197UL, 0x7a03f27aUL, 0x21ecf321UL, 0xc9b3f4c9UL, 0x925cf592UL, 0x7f04f67fUL, 0x24ebf724UL, 
-0xc6baf8c6UL, 0x9d55f99dUL, 0x700dfa70UL, 0x2be2fb2bUL, 0xc3bdfcc3UL, 0x9852fd98UL, 0x750afe75UL, 0x2ee5ff2eUL
-}};
+#include "twofish_tab.c"
 
 #define sbox(i, x) ((ulong32)SBOX[i][(x)&255])
 
 #else
 
 /* The Q-box tables */
-static const unsigned char qbox[2][4][16] = { 
+static const unsigned char qbox[2][4][16] = {
 {
    { 0x8, 0x1, 0x7, 0xD, 0x6, 0xF, 0x3, 0x2, 0x0, 0xB, 0x5, 0x9, 0xE, 0xC, 0xA, 0x4 },
    { 0xE, 0XC, 0XB, 0X8, 0X1, 0X2, 0X3, 0X5, 0XF, 0X4, 0XA, 0X6, 0X7, 0X0, 0X9, 0XD },
    { 0XB, 0XA, 0X5, 0XE, 0X6, 0XD, 0X9, 0X0, 0XC, 0X8, 0XF, 0X3, 0X2, 0X4, 0X7, 0X1 },
    { 0XD, 0X7, 0XF, 0X4, 0X1, 0X2, 0X6, 0XE, 0X9, 0XB, 0X3, 0X0, 0X8, 0X5, 0XC, 0XA }
-}, 
+},
 {
    { 0X2, 0X8, 0XB, 0XD, 0XF, 0X7, 0X6, 0XE, 0X3, 0X1, 0X9, 0X4, 0X0, 0XA, 0XC, 0X5 },
    { 0X1, 0XE, 0X2, 0XB, 0X4, 0XC, 0X3, 0X7, 0X6, 0XD, 0XA, 0X5, 0XF, 0X9, 0X0, 0X8 },
@@ -314,11 +129,11 @@ static ulong32 sbox(int i, ulong32 x)
 /* computes ab mod p */
 static ulong32 gf_mult(ulong32 a, ulong32 b, ulong32 p)
 {
-   ulong32 result = 0, B[2], P[2];
-   
+   ulong32 result, B[2], P[2];
+
    P[1] = p;
    B[1] = b;
-   P[0] = B[0] = 0;  
+   result = P[0] = B[0] = 0;
 
    /* unrolled branchless GF multiplier */
    result ^= B[a&1]; a >>= 1;  B[1] = P[B[1]>>7] ^ (B[1] << 1); 
@@ -369,7 +184,7 @@ static ulong32 mds_column_mult(unsigned char in, int col)
    return 0;
 }
 
-#else /* TWOFISH_TABLES */
+#else /* !TWOFISH_TABLES */
 
 #define mds_column_mult(x, i) mds_tab[i][x]
 
@@ -386,25 +201,40 @@ static void mds_mult(const unsigned char *in, unsigned char *out)
   STORE32L(tmp, out);
 }
 
+#ifdef TWOFISH_ALL_TABLES
+/* computes [y0 y1 y2 y3] = RS . [x0 x1 x2 x3 x4 x5 x6 x7] */
+static void rs_mult(const unsigned char *in, unsigned char *out)
+{
+   ulong32 tmp;
+   tmp = rs_tab0[in[0]] ^ rs_tab1[in[1]] ^ rs_tab2[in[2]] ^ rs_tab3[in[3]] ^
+         rs_tab4[in[4]] ^ rs_tab5[in[5]] ^ rs_tab6[in[6]] ^ rs_tab7[in[7]];
+   STORE32L(tmp, out);
+}
+
+#else /* !TWOFISH_ALL_TABLES */
+
 /* computes [y0 y1 y2 y3] = RS . [x0 x1 x2 x3 x4 x5 x6 x7] */
 static void rs_mult(const unsigned char *in, unsigned char *out)
 {
   int x, y;
   for (x = 0; x < 4; x++) {
       out[x] = 0;
-      for (y = 0; y < 8; y++)
+      for (y = 0; y < 8; y++) {
           out[x] ^= gf_mult(in[y], RS[x][y], RS_POLY);
+      }
   }
 }
 
+#endif
+
 /* computes h(x) */
 static void h_func(const unsigned char *in, unsigned char *out, unsigned char *M, int k, int offset)
 {
   int x;
   unsigned char y[4];
-  for (x = 0; x < 4; x++)
+  for (x = 0; x < 4; x++) {
       y[x] = in[x];
-
+ }
   switch (k) {
      case 4:
             y[0] = (unsigned char)(sbox(1, (ulong32)y[0]) ^ M[4 * (6 + offset) + 0]);
@@ -493,11 +323,9 @@ int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetri
 #endif
 {
 #ifndef TWOFISH_SMALL
-   ulong32 g;
-   int z, i;
-   unsigned char S[4*4];
+   unsigned char S[4*4], tmpx0, tmpx1;
 #endif
-   int k, x, y, start;
+   int k, x, y;
    unsigned char tmp[4], tmp2[4], M[8*4];
    ulong32 A, B;
 
@@ -517,29 +345,34 @@ int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetri
    k = keylen / 8;
 
    /* copy the key into M */
-   for (x = 0; x < keylen; x++)
-       M[x] = key[x];
+   for (x = 0; x < keylen; x++) {
+       M[x] = key[x] & 255;
+   }
 
    /* create the S[..] words */
 #ifndef TWOFISH_SMALL
-   for (x = 0; x < k; x++)
+   for (x = 0; x < k; x++) {
        rs_mult(M+(x*8), S+(x*4));
+   }
 #else
-   for (x = 0; x < k; x++)
+   for (x = 0; x < k; x++) {
        rs_mult(M+(x*8), skey->twofish.S+(x*4));
+   }
 #endif
 
    /* make subkeys */
    for (x = 0; x < 20; x++) {
        /* A = h(p * 2x, Me) */
-       for (y = 0; y < 4; y++)
+       for (y = 0; y < 4; y++) {
            tmp[y] = x+x;
+       }
        h_func(tmp, tmp2, M, k, 0);
        LOAD32L(A, tmp2);
 
        /* B = ROL(h(p * (2x + 1), Mo), 8) */
-       for (y = 0; y < 4; y++)
+       for (y = 0; y < 4; y++) {
            tmp[y] = (unsigned char)(x+x+1);
+       }
        h_func(tmp, tmp2, M, k, 1);
        LOAD32L(B, tmp2);
        B = ROL(B, 8);
@@ -551,37 +384,44 @@ int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetri
        skey->twofish.K[x+x+1] = ROL(B + B + A, 9);
    }
 
-   /* where to start in the sbox layers */
-   switch (k) {
-         case 4 : start = 0; break;
-         case 3 : start = 1; break; 
-         default: start = 2; break;
-   }
-
 #ifndef TWOFISH_SMALL
    /* make the sboxes (large ram variant) */
-   for (y = 0; y < 4; y++) {
-       for (x = 0; x < 256; x++) {
-           z = start;
-
-           /* do unkeyed substitution */
-           g = sbox((int)qord[y][z++], x);
-
-           /* first subkey */
-           i = 0;
-
-           /* do key mixing+sbox until z==5 */
-           while (z != 5) {
-               g = sbox((int)qord[y][z++], g ^ S[4*i++ + y]);
-           }
-           
-           /* multiply g by a column of the MDS */
-           skey->twofish.S[y][x] = mds_column_mult((unsigned char)g, y);
-       }
+   if (k == 2) {
+        for (x = 0; x < 256; x++) {
+           tmpx0 = sbox(0, x);
+           tmpx1 = sbox(1, x);
+           skey->twofish.S[0][x] = mds_column_mult(sbox(1, (sbox(0, tmpx0 ^ S[0]) ^ S[4])),0);
+           skey->twofish.S[1][x] = mds_column_mult(sbox(0, (sbox(0, tmpx1 ^ S[1]) ^ S[5])),1);
+           skey->twofish.S[2][x] = mds_column_mult(sbox(1, (sbox(1, tmpx0 ^ S[2]) ^ S[6])),2);
+           skey->twofish.S[3][x] = mds_column_mult(sbox(0, (sbox(1, tmpx1 ^ S[3]) ^ S[7])),3);
+        }
+   } else if (k == 3) {
+        for (x = 0; x < 256; x++) {
+           tmpx0 = sbox(0, x);
+           tmpx1 = sbox(1, x);
+           skey->twofish.S[0][x] = mds_column_mult(sbox(1, (sbox(0, sbox(0, tmpx1 ^ S[0]) ^ S[4]) ^ S[8])),0);
+           skey->twofish.S[1][x] = mds_column_mult(sbox(0, (sbox(0, sbox(1, tmpx1 ^ S[1]) ^ S[5]) ^ S[9])),1);
+           skey->twofish.S[2][x] = mds_column_mult(sbox(1, (sbox(1, sbox(0, tmpx0 ^ S[2]) ^ S[6]) ^ S[10])),2);
+           skey->twofish.S[3][x] = mds_column_mult(sbox(0, (sbox(1, sbox(1, tmpx0 ^ S[3]) ^ S[7]) ^ S[11])),3);
+        }
+   } else {
+        for (x = 0; x < 256; x++) {
+           tmpx0 = sbox(0, x);
+           tmpx1 = sbox(1, x);
+           skey->twofish.S[0][x] = mds_column_mult(sbox(1, (sbox(0, sbox(0, sbox(1, tmpx1 ^ S[0]) ^ S[4]) ^ S[8]) ^ S[12])),0);
+           skey->twofish.S[1][x] = mds_column_mult(sbox(0, (sbox(0, sbox(1, sbox(1, tmpx0 ^ S[1]) ^ S[5]) ^ S[9]) ^ S[13])),1);
+           skey->twofish.S[2][x] = mds_column_mult(sbox(1, (sbox(1, sbox(0, sbox(0, tmpx0 ^ S[2]) ^ S[6]) ^ S[10]) ^ S[14])),2);
+           skey->twofish.S[3][x] = mds_column_mult(sbox(0, (sbox(1, sbox(1, sbox(0, tmpx1 ^ S[3]) ^ S[7]) ^ S[11]) ^ S[15])),3);
+        }
    }
 #else
+   /* where to start in the sbox layers */
    /* small ram variant */
-   skey->twofish.start = start;
+   switch (k) {
+         case 4 : skey->twofish.start = 0; break;
+         case 3 : skey->twofish.start = 1; break; 
+         default: skey->twofish.start = 2; break;
+   }
 #endif
    return CRYPT_OK;
 }
@@ -639,7 +479,7 @@ void twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_k
         a  = ROR(a ^ (t1 + t2 + k[0]), 1);
         b  = ROL(b, 1) ^ (t2 + t2 + t1 + k[1]);
         k += 2;
-    }
+   }
 
     /* output with "undo last swap" */
     ta = c ^ key->twofish.K[4];
@@ -768,7 +608,7 @@ int twofish_test(void)
 
  symmetric_key key;
  unsigned char tmp[2][16];
- int err, i;
+ int err, i, y;
  
  for (i = 0; i < (int)(sizeof(tests)/sizeof(tests[0])); i++) {
     if ((err = twofish_setup(tests[i].key, tests[i].keylen, 0, &key)) != CRYPT_OK) {
@@ -779,6 +619,11 @@ int twofish_test(void)
     if (memcmp(tmp[0], tests[i].ct, 16) != 0 || memcmp(tmp[1], tests[i].pt, 16) != 0) {
        return CRYPT_FAIL_TESTVECTOR;
     }
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 16; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) twofish_ecb_encrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 1000; y++) twofish_ecb_decrypt(tmp[0], tmp[0], &key);
+      for (y = 0; y < 16; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
  }    
  return CRYPT_OK;
 #endif 

+ 477 - 0
twofish_tab.c

@@ -0,0 +1,477 @@
+#ifdef TWOFISH_TABLES
+
+/* pre generated 8x8 tables from the four 4x4s */
+static const unsigned char SBOX[2][256] = {
+{
+ 0xa9, 0x67, 0xb3, 0xe8, 0x04, 0xfd, 0xa3, 0x76, 0x9a, 0x92, 
+ 0x80, 0x78, 0xe4, 0xdd, 0xd1, 0x38, 0x0d, 0xc6, 0x35, 0x98, 
+ 0x18, 0xf7, 0xec, 0x6c, 0x43, 0x75, 0x37, 0x26, 0xfa, 0x13, 
+ 0x94, 0x48, 0xf2, 0xd0, 0x8b, 0x30, 0x84, 0x54, 0xdf, 0x23, 
+ 0x19, 0x5b, 0x3d, 0x59, 0xf3, 0xae, 0xa2, 0x82, 0x63, 0x01, 
+ 0x83, 0x2e, 0xd9, 0x51, 0x9b, 0x7c, 0xa6, 0xeb, 0xa5, 0xbe, 
+ 0x16, 0x0c, 0xe3, 0x61, 0xc0, 0x8c, 0x3a, 0xf5, 0x73, 0x2c, 
+ 0x25, 0x0b, 0xbb, 0x4e, 0x89, 0x6b, 0x53, 0x6a, 0xb4, 0xf1, 
+ 0xe1, 0xe6, 0xbd, 0x45, 0xe2, 0xf4, 0xb6, 0x66, 0xcc, 0x95,
+ 0x03, 0x56, 0xd4, 0x1c, 0x1e, 0xd7, 0xfb, 0xc3, 0x8e, 0xb5, 
+ 0xe9, 0xcf, 0xbf, 0xba, 0xea, 0x77, 0x39, 0xaf, 0x33, 0xc9, 
+ 0x62, 0x71, 0x81, 0x79, 0x09, 0xad, 0x24, 0xcd, 0xf9, 0xd8, 
+ 0xe5, 0xc5, 0xb9, 0x4d, 0x44, 0x08, 0x86, 0xe7, 0xa1, 0x1d, 
+ 0xaa, 0xed, 0x06, 0x70, 0xb2, 0xd2, 0x41, 0x7b, 0xa0, 0x11, 
+ 0x31, 0xc2, 0x27, 0x90, 0x20, 0xf6, 0x60, 0xff, 0x96, 0x5c,
+ 0xb1, 0xab, 0x9e, 0x9c, 0x52, 0x1b, 0x5f, 0x93, 0x0a, 0xef, 
+ 0x91, 0x85, 0x49, 0xee, 0x2d, 0x4f, 0x8f, 0x3b, 0x47, 0x87, 
+ 0x6d, 0x46, 0xd6, 0x3e, 0x69, 0x64, 0x2a, 0xce, 0xcb, 0x2f, 
+ 0xfc, 0x97, 0x05, 0x7a, 0xac, 0x7f, 0xd5, 0x1a, 0x4b, 0x0e, 
+ 0xa7, 0x5a, 0x28, 0x14, 0x3f, 0x29, 0x88, 0x3c, 0x4c, 0x02, 
+ 0xb8, 0xda, 0xb0, 0x17, 0x55, 0x1f, 0x8a, 0x7d, 0x57, 0xc7, 
+ 0x8d, 0x74, 0xb7, 0xc4, 0x9f, 0x72, 0x7e, 0x15, 0x22, 0x12, 
+ 0x58, 0x07, 0x99, 0x34, 0x6e, 0x50, 0xde, 0x68, 0x65, 0xbc, 
+ 0xdb, 0xf8, 0xc8, 0xa8, 0x2b, 0x40, 0xdc, 0xfe, 0x32, 0xa4, 
+ 0xca, 0x10, 0x21, 0xf0, 0xd3, 0x5d, 0x0f, 0x00, 0x6f, 0x9d, 
+ 0x36, 0x42, 0x4a, 0x5e, 0xc1, 0xe0},
+{
+ 0x75, 0xf3, 0xc6, 0xf4, 0xdb, 0x7b, 0xfb, 0xc8, 0x4a, 0xd3, 
+ 0xe6, 0x6b, 0x45, 0x7d, 0xe8, 0x4b, 0xd6, 0x32, 0xd8, 0xfd,
+ 0x37, 0x71, 0xf1, 0xe1, 0x30, 0x0f, 0xf8, 0x1b, 0x87, 0xfa,
+ 0x06, 0x3f, 0x5e, 0xba, 0xae, 0x5b, 0x8a, 0x00, 0xbc, 0x9d,
+ 0x6d, 0xc1, 0xb1, 0x0e, 0x80, 0x5d, 0xd2, 0xd5, 0xa0, 0x84, 
+ 0x07, 0x14, 0xb5, 0x90, 0x2c, 0xa3, 0xb2, 0x73, 0x4c, 0x54, 
+ 0x92, 0x74, 0x36, 0x51, 0x38, 0xb0, 0xbd, 0x5a, 0xfc, 0x60, 
+ 0x62, 0x96, 0x6c, 0x42, 0xf7, 0x10, 0x7c, 0x28, 0x27, 0x8c, 
+ 0x13, 0x95, 0x9c, 0xc7, 0x24, 0x46, 0x3b, 0x70, 0xca, 0xe3, 
+ 0x85, 0xcb, 0x11, 0xd0, 0x93, 0xb8, 0xa6, 0x83, 0x20, 0xff,
+ 0x9f, 0x77, 0xc3, 0xcc, 0x03, 0x6f, 0x08, 0xbf, 0x40, 0xe7, 
+ 0x2b, 0xe2, 0x79, 0x0c, 0xaa, 0x82, 0x41, 0x3a, 0xea, 0xb9, 
+ 0xe4, 0x9a, 0xa4, 0x97, 0x7e, 0xda, 0x7a, 0x17, 0x66, 0x94, 
+ 0xa1, 0x1d, 0x3d, 0xf0, 0xde, 0xb3, 0x0b, 0x72, 0xa7, 0x1c, 
+ 0xef, 0xd1, 0x53, 0x3e, 0x8f, 0x33, 0x26, 0x5f, 0xec, 0x76, 
+ 0x2a, 0x49, 0x81, 0x88, 0xee, 0x21, 0xc4, 0x1a, 0xeb, 0xd9, 
+ 0xc5, 0x39, 0x99, 0xcd, 0xad, 0x31, 0x8b, 0x01, 0x18, 0x23, 
+ 0xdd, 0x1f, 0x4e, 0x2d, 0xf9, 0x48, 0x4f, 0xf2, 0x65, 0x8e, 
+ 0x78, 0x5c, 0x58, 0x19, 0x8d, 0xe5, 0x98, 0x57, 0x67, 0x7f, 
+ 0x05, 0x64, 0xaf, 0x63, 0xb6, 0xfe, 0xf5, 0xb7, 0x3c, 0xa5, 
+ 0xce, 0xe9, 0x68, 0x44, 0xe0, 0x4d, 0x43, 0x69, 0x29, 0x2e, 
+ 0xac, 0x15, 0x59, 0xa8, 0x0a, 0x9e, 0x6e, 0x47, 0xdf, 0x34, 
+ 0x35, 0x6a, 0xcf, 0xdc, 0x22, 0xc9, 0xc0, 0x9b, 0x89, 0xd4, 
+ 0xed, 0xab, 0x12, 0xa2, 0x0d, 0x52, 0xbb, 0x02, 0x2f, 0xa9, 
+ 0xd7, 0x61, 0x1e, 0xb4, 0x50, 0x04, 0xf6, 0xc2, 0x16, 0x25, 
+ 0x86, 0x56, 0x55, 0x09, 0xbe, 0x91}
+};
+
+/* the 4x4 MDS in a nicer format */
+static const ulong32 mds_tab[4][256] = {
+{
+0x00000000UL, 0xefef5b01UL, 0xb7b7b602UL, 0x5858ed03UL, 0x07070504UL, 0xe8e85e05UL, 0xb0b0b306UL, 0x5f5fe807UL, 
+0x0e0e0a08UL, 0xe1e15109UL, 0xb9b9bc0aUL, 0x5656e70bUL, 0x09090f0cUL, 0xe6e6540dUL, 0xbebeb90eUL, 0x5151e20fUL, 
+0x1c1c1410UL, 0xf3f34f11UL, 0xababa212UL, 0x4444f913UL, 0x1b1b1114UL, 0xf4f44a15UL, 0xacaca716UL, 0x4343fc17UL, 
+0x12121e18UL, 0xfdfd4519UL, 0xa5a5a81aUL, 0x4a4af31bUL, 0x15151b1cUL, 0xfafa401dUL, 0xa2a2ad1eUL, 0x4d4df61fUL, 
+0x38382820UL, 0xd7d77321UL, 0x8f8f9e22UL, 0x6060c523UL, 0x3f3f2d24UL, 0xd0d07625UL, 0x88889b26UL, 0x6767c027UL, 
+0x36362228UL, 0xd9d97929UL, 0x8181942aUL, 0x6e6ecf2bUL, 0x3131272cUL, 0xdede7c2dUL, 0x8686912eUL, 0x6969ca2fUL, 
+0x24243c30UL, 0xcbcb6731UL, 0x93938a32UL, 0x7c7cd133UL, 0x23233934UL, 0xcccc6235UL, 0x94948f36UL, 0x7b7bd437UL, 
+0x2a2a3638UL, 0xc5c56d39UL, 0x9d9d803aUL, 0x7272db3bUL, 0x2d2d333cUL, 0xc2c2683dUL, 0x9a9a853eUL, 0x7575de3fUL, 
+0x70705040UL, 0x9f9f0b41UL, 0xc7c7e642UL, 0x2828bd43UL, 0x77775544UL, 0x98980e45UL, 0xc0c0e346UL, 0x2f2fb847UL,
+0x7e7e5a48UL, 0x91910149UL, 0xc9c9ec4aUL, 0x2626b74bUL, 0x79795f4cUL, 0x9696044dUL, 0xcecee94eUL, 0x2121b24fUL, 
+0x6c6c4450UL, 0x83831f51UL, 0xdbdbf252UL, 0x3434a953UL, 0x6b6b4154UL, 0x84841a55UL, 0xdcdcf756UL, 0x3333ac57UL, 
+0x62624e58UL, 0x8d8d1559UL, 0xd5d5f85aUL, 0x3a3aa35bUL, 0x65654b5cUL, 0x8a8a105dUL, 0xd2d2fd5eUL, 0x3d3da65fUL, 
+0x48487860UL, 0xa7a72361UL, 0xffffce62UL, 0x10109563UL, 0x4f4f7d64UL, 0xa0a02665UL, 0xf8f8cb66UL, 0x17179067UL, 
+0x46467268UL, 0xa9a92969UL, 0xf1f1c46aUL, 0x1e1e9f6bUL, 0x4141776cUL, 0xaeae2c6dUL, 0xf6f6c16eUL, 0x19199a6fUL,
+0x54546c70UL, 0xbbbb3771UL, 0xe3e3da72UL, 0x0c0c8173UL, 0x53536974UL, 0xbcbc3275UL, 0xe4e4df76UL, 0x0b0b8477UL, 
+0x5a5a6678UL, 0xb5b53d79UL, 0xededd07aUL, 0x02028b7bUL, 0x5d5d637cUL, 0xb2b2387dUL, 0xeaead57eUL, 0x05058e7fUL, 
+0xe0e0a080UL, 0x0f0ffb81UL, 0x57571682UL, 0xb8b84d83UL, 0xe7e7a584UL, 0x0808fe85UL, 0x50501386UL, 0xbfbf4887UL, 
+0xeeeeaa88UL, 0x0101f189UL, 0x59591c8aUL, 0xb6b6478bUL, 0xe9e9af8cUL, 0x0606f48dUL, 0x5e5e198eUL, 0xb1b1428fUL, 
+0xfcfcb490UL, 0x1313ef91UL, 0x4b4b0292UL, 0xa4a45993UL, 0xfbfbb194UL, 0x1414ea95UL, 0x4c4c0796UL, 0xa3a35c97UL, 
+0xf2f2be98UL, 0x1d1de599UL, 0x4545089aUL, 0xaaaa539bUL, 0xf5f5bb9cUL, 0x1a1ae09dUL, 0x42420d9eUL, 0xadad569fUL, 
+0xd8d888a0UL, 0x3737d3a1UL, 0x6f6f3ea2UL, 0x808065a3UL, 0xdfdf8da4UL, 0x3030d6a5UL, 0x68683ba6UL, 0x878760a7UL, 
+0xd6d682a8UL, 0x3939d9a9UL, 0x616134aaUL, 0x8e8e6fabUL, 0xd1d187acUL, 0x3e3edcadUL, 0x666631aeUL, 0x89896aafUL, 
+0xc4c49cb0UL, 0x2b2bc7b1UL, 0x73732ab2UL, 0x9c9c71b3UL, 0xc3c399b4UL, 0x2c2cc2b5UL, 0x74742fb6UL, 0x9b9b74b7UL, 
+0xcaca96b8UL, 0x2525cdb9UL, 0x7d7d20baUL, 0x92927bbbUL, 0xcdcd93bcUL, 0x2222c8bdUL, 0x7a7a25beUL, 0x95957ebfUL, 
+0x9090f0c0UL, 0x7f7fabc1UL, 0x272746c2UL, 0xc8c81dc3UL, 0x9797f5c4UL, 0x7878aec5UL, 0x202043c6UL, 0xcfcf18c7UL, 
+0x9e9efac8UL, 0x7171a1c9UL, 0x29294ccaUL, 0xc6c617cbUL, 0x9999ffccUL, 0x7676a4cdUL, 0x2e2e49ceUL, 0xc1c112cfUL, 
+0x8c8ce4d0UL, 0x6363bfd1UL, 0x3b3b52d2UL, 0xd4d409d3UL, 0x8b8be1d4UL, 0x6464bad5UL, 0x3c3c57d6UL, 0xd3d30cd7UL, 
+0x8282eed8UL, 0x6d6db5d9UL, 0x353558daUL, 0xdada03dbUL, 0x8585ebdcUL, 0x6a6ab0ddUL, 0x32325ddeUL, 0xdddd06dfUL, 
+0xa8a8d8e0UL, 0x474783e1UL, 0x1f1f6ee2UL, 0xf0f035e3UL, 0xafafdde4UL, 0x404086e5UL, 0x18186be6UL, 0xf7f730e7UL,
+0xa6a6d2e8UL, 0x494989e9UL, 0x111164eaUL, 0xfefe3febUL, 0xa1a1d7ecUL, 0x4e4e8cedUL, 0x161661eeUL, 0xf9f93aefUL,
+0xb4b4ccf0UL, 0x5b5b97f1UL, 0x03037af2UL, 0xecec21f3UL, 0xb3b3c9f4UL, 0x5c5c92f5UL, 0x04047ff6UL, 0xebeb24f7UL, 
+0xbabac6f8UL, 0x55559df9UL, 0x0d0d70faUL, 0xe2e22bfbUL, 0xbdbdc3fcUL, 0x525298fdUL, 0x0a0a75feUL, 0xe5e52effUL
+}, 
+{
+0x00000000UL, 0x015befefUL, 0x02b6b7b7UL, 0x03ed5858UL, 0x04050707UL, 0x055ee8e8UL, 0x06b3b0b0UL, 0x07e85f5fUL, 
+0x080a0e0eUL, 0x0951e1e1UL, 0x0abcb9b9UL, 0x0be75656UL, 0x0c0f0909UL, 0x0d54e6e6UL, 0x0eb9bebeUL, 0x0fe25151UL, 
+0x10141c1cUL, 0x114ff3f3UL, 0x12a2ababUL, 0x13f94444UL, 0x14111b1bUL, 0x154af4f4UL, 0x16a7acacUL, 0x17fc4343UL, 
+0x181e1212UL, 0x1945fdfdUL, 0x1aa8a5a5UL, 0x1bf34a4aUL, 0x1c1b1515UL, 0x1d40fafaUL, 0x1eada2a2UL, 0x1ff64d4dUL, 
+0x20283838UL, 0x2173d7d7UL, 0x229e8f8fUL, 0x23c56060UL, 0x242d3f3fUL, 0x2576d0d0UL, 0x269b8888UL, 0x27c06767UL, 
+0x28223636UL, 0x2979d9d9UL, 0x2a948181UL, 0x2bcf6e6eUL, 0x2c273131UL, 0x2d7cdedeUL, 0x2e918686UL, 0x2fca6969UL, 
+0x303c2424UL, 0x3167cbcbUL, 0x328a9393UL, 0x33d17c7cUL, 0x34392323UL, 0x3562ccccUL, 0x368f9494UL, 0x37d47b7bUL, 
+0x38362a2aUL, 0x396dc5c5UL, 0x3a809d9dUL, 0x3bdb7272UL, 0x3c332d2dUL, 0x3d68c2c2UL, 0x3e859a9aUL, 0x3fde7575UL, 
+0x40507070UL, 0x410b9f9fUL, 0x42e6c7c7UL, 0x43bd2828UL, 0x44557777UL, 0x450e9898UL, 0x46e3c0c0UL, 0x47b82f2fUL, 
+0x485a7e7eUL, 0x49019191UL, 0x4aecc9c9UL, 0x4bb72626UL, 0x4c5f7979UL, 0x4d049696UL, 0x4ee9ceceUL, 0x4fb22121UL, 
+0x50446c6cUL, 0x511f8383UL, 0x52f2dbdbUL, 0x53a93434UL, 0x54416b6bUL, 0x551a8484UL, 0x56f7dcdcUL, 0x57ac3333UL, 
+0x584e6262UL, 0x59158d8dUL, 0x5af8d5d5UL, 0x5ba33a3aUL, 0x5c4b6565UL, 0x5d108a8aUL, 0x5efdd2d2UL, 0x5fa63d3dUL,
+0x60784848UL, 0x6123a7a7UL, 0x62ceffffUL, 0x63951010UL, 0x647d4f4fUL, 0x6526a0a0UL, 0x66cbf8f8UL, 0x67901717UL, 
+0x68724646UL, 0x6929a9a9UL, 0x6ac4f1f1UL, 0x6b9f1e1eUL, 0x6c774141UL, 0x6d2caeaeUL, 0x6ec1f6f6UL, 0x6f9a1919UL, 
+0x706c5454UL, 0x7137bbbbUL, 0x72dae3e3UL, 0x73810c0cUL, 0x74695353UL, 0x7532bcbcUL, 0x76dfe4e4UL, 0x77840b0bUL, 
+0x78665a5aUL, 0x793db5b5UL, 0x7ad0ededUL, 0x7b8b0202UL, 0x7c635d5dUL, 0x7d38b2b2UL, 0x7ed5eaeaUL, 0x7f8e0505UL, 
+0x80a0e0e0UL, 0x81fb0f0fUL, 0x82165757UL, 0x834db8b8UL, 0x84a5e7e7UL, 0x85fe0808UL, 0x86135050UL, 0x8748bfbfUL, 
+0x88aaeeeeUL, 0x89f10101UL, 0x8a1c5959UL, 0x8b47b6b6UL, 0x8cafe9e9UL, 0x8df40606UL, 0x8e195e5eUL, 0x8f42b1b1UL, 
+0x90b4fcfcUL, 0x91ef1313UL, 0x92024b4bUL, 0x9359a4a4UL, 0x94b1fbfbUL, 0x95ea1414UL, 0x96074c4cUL, 0x975ca3a3UL, 
+0x98bef2f2UL, 0x99e51d1dUL, 0x9a084545UL, 0x9b53aaaaUL, 0x9cbbf5f5UL, 0x9de01a1aUL, 0x9e0d4242UL, 0x9f56adadUL,
+0xa088d8d8UL, 0xa1d33737UL, 0xa23e6f6fUL, 0xa3658080UL, 0xa48ddfdfUL, 0xa5d63030UL, 0xa63b6868UL, 0xa7608787UL, 
+0xa882d6d6UL, 0xa9d93939UL, 0xaa346161UL, 0xab6f8e8eUL, 0xac87d1d1UL, 0xaddc3e3eUL, 0xae316666UL, 0xaf6a8989UL, 
+0xb09cc4c4UL, 0xb1c72b2bUL, 0xb22a7373UL, 0xb3719c9cUL, 0xb499c3c3UL, 0xb5c22c2cUL, 0xb62f7474UL, 0xb7749b9bUL, 
+0xb896cacaUL, 0xb9cd2525UL, 0xba207d7dUL, 0xbb7b9292UL, 0xbc93cdcdUL, 0xbdc82222UL, 0xbe257a7aUL, 0xbf7e9595UL, 
+0xc0f09090UL, 0xc1ab7f7fUL, 0xc2462727UL, 0xc31dc8c8UL, 0xc4f59797UL, 0xc5ae7878UL, 0xc6432020UL, 0xc718cfcfUL, 
+0xc8fa9e9eUL, 0xc9a17171UL, 0xca4c2929UL, 0xcb17c6c6UL, 0xccff9999UL, 0xcda47676UL, 0xce492e2eUL, 0xcf12c1c1UL, 
+0xd0e48c8cUL, 0xd1bf6363UL, 0xd2523b3bUL, 0xd309d4d4UL, 0xd4e18b8bUL, 0xd5ba6464UL, 0xd6573c3cUL, 0xd70cd3d3UL, 
+0xd8ee8282UL, 0xd9b56d6dUL, 0xda583535UL, 0xdb03dadaUL, 0xdceb8585UL, 0xddb06a6aUL, 0xde5d3232UL, 0xdf06ddddUL, 
+0xe0d8a8a8UL, 0xe1834747UL, 0xe26e1f1fUL, 0xe335f0f0UL, 0xe4ddafafUL, 0xe5864040UL, 0xe66b1818UL, 0xe730f7f7UL, 
+0xe8d2a6a6UL, 0xe9894949UL, 0xea641111UL, 0xeb3ffefeUL, 0xecd7a1a1UL, 0xed8c4e4eUL, 0xee611616UL, 0xef3af9f9UL, 
+0xf0ccb4b4UL, 0xf1975b5bUL, 0xf27a0303UL, 0xf321ececUL, 0xf4c9b3b3UL, 0xf5925c5cUL, 0xf67f0404UL, 0xf724ebebUL, 
+0xf8c6babaUL, 0xf99d5555UL, 0xfa700d0dUL, 0xfb2be2e2UL, 0xfcc3bdbdUL, 0xfd985252UL, 0xfe750a0aUL, 0xff2ee5e5UL
+}, 
+{
+0x00000000UL, 0xef01ef5bUL, 0xb702b7b6UL, 0x580358edUL, 0x07040705UL, 0xe805e85eUL, 0xb006b0b3UL, 0x5f075fe8UL, 
+0x0e080e0aUL, 0xe109e151UL, 0xb90ab9bcUL, 0x560b56e7UL, 0x090c090fUL, 0xe60de654UL, 0xbe0ebeb9UL, 0x510f51e2UL,
+0x1c101c14UL, 0xf311f34fUL, 0xab12aba2UL, 0x441344f9UL, 0x1b141b11UL, 0xf415f44aUL, 0xac16aca7UL, 0x431743fcUL, 
+0x1218121eUL, 0xfd19fd45UL, 0xa51aa5a8UL, 0x4a1b4af3UL, 0x151c151bUL, 0xfa1dfa40UL, 0xa21ea2adUL, 0x4d1f4df6UL, 
+0x38203828UL, 0xd721d773UL, 0x8f228f9eUL, 0x602360c5UL, 0x3f243f2dUL, 0xd025d076UL, 0x8826889bUL, 0x672767c0UL, 
+0x36283622UL, 0xd929d979UL, 0x812a8194UL, 0x6e2b6ecfUL, 0x312c3127UL, 0xde2dde7cUL, 0x862e8691UL, 0x692f69caUL, 
+0x2430243cUL, 0xcb31cb67UL, 0x9332938aUL, 0x7c337cd1UL, 0x23342339UL, 0xcc35cc62UL, 0x9436948fUL, 0x7b377bd4UL, 
+0x2a382a36UL, 0xc539c56dUL, 0x9d3a9d80UL, 0x723b72dbUL, 0x2d3c2d33UL, 0xc23dc268UL, 0x9a3e9a85UL, 0x753f75deUL,
+0x70407050UL, 0x9f419f0bUL, 0xc742c7e6UL, 0x284328bdUL, 0x77447755UL, 0x9845980eUL, 0xc046c0e3UL, 0x2f472fb8UL, 
+0x7e487e5aUL, 0x91499101UL, 0xc94ac9ecUL, 0x264b26b7UL, 0x794c795fUL, 0x964d9604UL, 0xce4ecee9UL, 0x214f21b2UL, 
+0x6c506c44UL, 0x8351831fUL, 0xdb52dbf2UL, 0x345334a9UL, 0x6b546b41UL, 0x8455841aUL, 0xdc56dcf7UL, 0x335733acUL,
+0x6258624eUL, 0x8d598d15UL, 0xd55ad5f8UL, 0x3a5b3aa3UL, 0x655c654bUL, 0x8a5d8a10UL, 0xd25ed2fdUL, 0x3d5f3da6UL, 
+0x48604878UL, 0xa761a723UL, 0xff62ffceUL, 0x10631095UL, 0x4f644f7dUL, 0xa065a026UL, 0xf866f8cbUL, 0x17671790UL, 
+0x46684672UL, 0xa969a929UL, 0xf16af1c4UL, 0x1e6b1e9fUL, 0x416c4177UL, 0xae6dae2cUL, 0xf66ef6c1UL, 0x196f199aUL, 
+0x5470546cUL, 0xbb71bb37UL, 0xe372e3daUL, 0x0c730c81UL, 0x53745369UL, 0xbc75bc32UL, 0xe476e4dfUL, 0x0b770b84UL,
+0x5a785a66UL, 0xb579b53dUL, 0xed7aedd0UL, 0x027b028bUL, 0x5d7c5d63UL, 0xb27db238UL, 0xea7eead5UL, 0x057f058eUL, 
+0xe080e0a0UL, 0x0f810ffbUL, 0x57825716UL, 0xb883b84dUL, 0xe784e7a5UL, 0x088508feUL, 0x50865013UL, 0xbf87bf48UL,
+0xee88eeaaUL, 0x018901f1UL, 0x598a591cUL, 0xb68bb647UL, 0xe98ce9afUL, 0x068d06f4UL, 0x5e8e5e19UL, 0xb18fb142UL,
+0xfc90fcb4UL, 0x139113efUL, 0x4b924b02UL, 0xa493a459UL, 0xfb94fbb1UL, 0x149514eaUL, 0x4c964c07UL, 0xa397a35cUL, 
+0xf298f2beUL, 0x1d991de5UL, 0x459a4508UL, 0xaa9baa53UL, 0xf59cf5bbUL, 0x1a9d1ae0UL, 0x429e420dUL, 0xad9fad56UL, 
+0xd8a0d888UL, 0x37a137d3UL, 0x6fa26f3eUL, 0x80a38065UL, 0xdfa4df8dUL, 0x30a530d6UL, 0x68a6683bUL, 0x87a78760UL, 
+0xd6a8d682UL, 0x39a939d9UL, 0x61aa6134UL, 0x8eab8e6fUL, 0xd1acd187UL, 0x3ead3edcUL, 0x66ae6631UL, 0x89af896aUL, 
+0xc4b0c49cUL, 0x2bb12bc7UL, 0x73b2732aUL, 0x9cb39c71UL, 0xc3b4c399UL, 0x2cb52cc2UL, 0x74b6742fUL, 0x9bb79b74UL, 
+0xcab8ca96UL, 0x25b925cdUL, 0x7dba7d20UL, 0x92bb927bUL, 0xcdbccd93UL, 0x22bd22c8UL, 0x7abe7a25UL, 0x95bf957eUL, 
+0x90c090f0UL, 0x7fc17fabUL, 0x27c22746UL, 0xc8c3c81dUL, 0x97c497f5UL, 0x78c578aeUL, 0x20c62043UL, 0xcfc7cf18UL, 
+0x9ec89efaUL, 0x71c971a1UL, 0x29ca294cUL, 0xc6cbc617UL, 0x99cc99ffUL, 0x76cd76a4UL, 0x2ece2e49UL, 0xc1cfc112UL, 
+0x8cd08ce4UL, 0x63d163bfUL, 0x3bd23b52UL, 0xd4d3d409UL, 0x8bd48be1UL, 0x64d564baUL, 0x3cd63c57UL, 0xd3d7d30cUL, 
+0x82d882eeUL, 0x6dd96db5UL, 0x35da3558UL, 0xdadbda03UL, 0x85dc85ebUL, 0x6add6ab0UL, 0x32de325dUL, 0xdddfdd06UL, 
+0xa8e0a8d8UL, 0x47e14783UL, 0x1fe21f6eUL, 0xf0e3f035UL, 0xafe4afddUL, 0x40e54086UL, 0x18e6186bUL, 0xf7e7f730UL, 
+0xa6e8a6d2UL, 0x49e94989UL, 0x11ea1164UL, 0xfeebfe3fUL, 0xa1eca1d7UL, 0x4eed4e8cUL, 0x16ee1661UL, 0xf9eff93aUL, 
+0xb4f0b4ccUL, 0x5bf15b97UL, 0x03f2037aUL, 0xecf3ec21UL, 0xb3f4b3c9UL, 0x5cf55c92UL, 0x04f6047fUL, 0xebf7eb24UL, 
+0xbaf8bac6UL, 0x55f9559dUL, 0x0dfa0d70UL, 0xe2fbe22bUL, 0xbdfcbdc3UL, 0x52fd5298UL, 0x0afe0a75UL, 0xe5ffe52eUL
+}, 
+{
+0x00000000UL, 0x5bef015bUL, 0xb6b702b6UL, 0xed5803edUL, 0x05070405UL, 0x5ee8055eUL, 0xb3b006b3UL, 0xe85f07e8UL, 
+0x0a0e080aUL, 0x51e10951UL, 0xbcb90abcUL, 0xe7560be7UL, 0x0f090c0fUL, 0x54e60d54UL, 0xb9be0eb9UL, 0xe2510fe2UL, 
+0x141c1014UL, 0x4ff3114fUL, 0xa2ab12a2UL, 0xf94413f9UL, 0x111b1411UL, 0x4af4154aUL, 0xa7ac16a7UL, 0xfc4317fcUL, 
+0x1e12181eUL, 0x45fd1945UL, 0xa8a51aa8UL, 0xf34a1bf3UL, 0x1b151c1bUL, 0x40fa1d40UL, 0xada21eadUL, 0xf64d1ff6UL, 
+0x28382028UL, 0x73d72173UL, 0x9e8f229eUL, 0xc56023c5UL, 0x2d3f242dUL, 0x76d02576UL, 0x9b88269bUL, 0xc06727c0UL, 
+0x22362822UL, 0x79d92979UL, 0x94812a94UL, 0xcf6e2bcfUL, 0x27312c27UL, 0x7cde2d7cUL, 0x91862e91UL, 0xca692fcaUL, 
+0x3c24303cUL, 0x67cb3167UL, 0x8a93328aUL, 0xd17c33d1UL, 0x39233439UL, 0x62cc3562UL, 0x8f94368fUL, 0xd47b37d4UL, 
+0x362a3836UL, 0x6dc5396dUL, 0x809d3a80UL, 0xdb723bdbUL, 0x332d3c33UL, 0x68c23d68UL, 0x859a3e85UL, 0xde753fdeUL,
+0x50704050UL, 0x0b9f410bUL, 0xe6c742e6UL, 0xbd2843bdUL, 0x55774455UL, 0x0e98450eUL, 0xe3c046e3UL, 0xb82f47b8UL, 
+0x5a7e485aUL, 0x01914901UL, 0xecc94aecUL, 0xb7264bb7UL, 0x5f794c5fUL, 0x04964d04UL, 0xe9ce4ee9UL, 0xb2214fb2UL, 
+0x446c5044UL, 0x1f83511fUL, 0xf2db52f2UL, 0xa93453a9UL, 0x416b5441UL, 0x1a84551aUL, 0xf7dc56f7UL, 0xac3357acUL, 
+0x4e62584eUL, 0x158d5915UL, 0xf8d55af8UL, 0xa33a5ba3UL, 0x4b655c4bUL, 0x108a5d10UL, 0xfdd25efdUL, 0xa63d5fa6UL, 
+0x78486078UL, 0x23a76123UL, 0xceff62ceUL, 0x95106395UL, 0x7d4f647dUL, 0x26a06526UL, 0xcbf866cbUL, 0x90176790UL, 
+0x72466872UL, 0x29a96929UL, 0xc4f16ac4UL, 0x9f1e6b9fUL, 0x77416c77UL, 0x2cae6d2cUL, 0xc1f66ec1UL, 0x9a196f9aUL, 
+0x6c54706cUL, 0x37bb7137UL, 0xdae372daUL, 0x810c7381UL, 0x69537469UL, 0x32bc7532UL, 0xdfe476dfUL, 0x840b7784UL, 
+0x665a7866UL, 0x3db5793dUL, 0xd0ed7ad0UL, 0x8b027b8bUL, 0x635d7c63UL, 0x38b27d38UL, 0xd5ea7ed5UL, 0x8e057f8eUL, 
+0xa0e080a0UL, 0xfb0f81fbUL, 0x16578216UL, 0x4db8834dUL, 0xa5e784a5UL, 0xfe0885feUL, 0x13508613UL, 0x48bf8748UL, 
+0xaaee88aaUL, 0xf10189f1UL, 0x1c598a1cUL, 0x47b68b47UL, 0xafe98cafUL, 0xf4068df4UL, 0x195e8e19UL, 0x42b18f42UL,
+0xb4fc90b4UL, 0xef1391efUL, 0x024b9202UL, 0x59a49359UL, 0xb1fb94b1UL, 0xea1495eaUL, 0x074c9607UL, 0x5ca3975cUL, 
+0xbef298beUL, 0xe51d99e5UL, 0x08459a08UL, 0x53aa9b53UL, 0xbbf59cbbUL, 0xe01a9de0UL, 0x0d429e0dUL, 0x56ad9f56UL, 
+0x88d8a088UL, 0xd337a1d3UL, 0x3e6fa23eUL, 0x6580a365UL, 0x8ddfa48dUL, 0xd630a5d6UL, 0x3b68a63bUL, 0x6087a760UL, 
+0x82d6a882UL, 0xd939a9d9UL, 0x3461aa34UL, 0x6f8eab6fUL, 0x87d1ac87UL, 0xdc3eaddcUL, 0x3166ae31UL, 0x6a89af6aUL, 
+0x9cc4b09cUL, 0xc72bb1c7UL, 0x2a73b22aUL, 0x719cb371UL, 0x99c3b499UL, 0xc22cb5c2UL, 0x2f74b62fUL, 0x749bb774UL, 
+0x96cab896UL, 0xcd25b9cdUL, 0x207dba20UL, 0x7b92bb7bUL, 0x93cdbc93UL, 0xc822bdc8UL, 0x257abe25UL, 0x7e95bf7eUL,
+0xf090c0f0UL, 0xab7fc1abUL, 0x4627c246UL, 0x1dc8c31dUL, 0xf597c4f5UL, 0xae78c5aeUL, 0x4320c643UL, 0x18cfc718UL, 
+0xfa9ec8faUL, 0xa171c9a1UL, 0x4c29ca4cUL, 0x17c6cb17UL, 0xff99ccffUL, 0xa476cda4UL, 0x492ece49UL, 0x12c1cf12UL, 
+0xe48cd0e4UL, 0xbf63d1bfUL, 0x523bd252UL, 0x09d4d309UL, 0xe18bd4e1UL, 0xba64d5baUL, 0x573cd657UL, 0x0cd3d70cUL, 
+0xee82d8eeUL, 0xb56dd9b5UL, 0x5835da58UL, 0x03dadb03UL, 0xeb85dcebUL, 0xb06addb0UL, 0x5d32de5dUL, 0x06dddf06UL, 
+0xd8a8e0d8UL, 0x8347e183UL, 0x6e1fe26eUL, 0x35f0e335UL, 0xddafe4ddUL, 0x8640e586UL, 0x6b18e66bUL, 0x30f7e730UL, 
+0xd2a6e8d2UL, 0x8949e989UL, 0x6411ea64UL, 0x3ffeeb3fUL, 0xd7a1ecd7UL, 0x8c4eed8cUL, 0x6116ee61UL, 0x3af9ef3aUL,
+0xccb4f0ccUL, 0x975bf197UL, 0x7a03f27aUL, 0x21ecf321UL, 0xc9b3f4c9UL, 0x925cf592UL, 0x7f04f67fUL, 0x24ebf724UL, 
+0xc6baf8c6UL, 0x9d55f99dUL, 0x700dfa70UL, 0x2be2fb2bUL, 0xc3bdfcc3UL, 0x9852fd98UL, 0x750afe75UL, 0x2ee5ff2eUL
+}};
+
+#ifdef TWOFISH_ALL_TABLES
+
+/* the 4x8 RS transform */
+static const ulong32 rs_tab0[256] = {
+0x00000000LU, 0xa402a401LU, 0x05040502LU, 0xa106a103LU, 0x0a080a04LU, 0xae0aae05LU, 0x0f0c0f06LU, 0xab0eab07LU, 
+0x14101408LU, 0xb012b009LU, 0x1114110aLU, 0xb516b50bLU, 0x1e181e0cLU, 0xba1aba0dLU, 0x1b1c1b0eLU, 0xbf1ebf0fLU, 
+0x28202810LU, 0x8c228c11LU, 0x2d242d12LU, 0x89268913LU, 0x22282214LU, 0x862a8615LU, 0x272c2716LU, 0x832e8317LU, 
+0x3c303c18LU, 0x98329819LU, 0x3934391aLU, 0x9d369d1bLU, 0x3638361cLU, 0x923a921dLU, 0x333c331eLU, 0x973e971fLU, 
+0x50405020LU, 0xf442f421LU, 0x55445522LU, 0xf146f123LU, 0x5a485a24LU, 0xfe4afe25LU, 0x5f4c5f26LU, 0xfb4efb27LU, 
+0x44504428LU, 0xe052e029LU, 0x4154412aLU, 0xe556e52bLU, 0x4e584e2cLU, 0xea5aea2dLU, 0x4b5c4b2eLU, 0xef5eef2fLU, 
+0x78607830LU, 0xdc62dc31LU, 0x7d647d32LU, 0xd966d933LU, 0x72687234LU, 0xd66ad635LU, 0x776c7736LU, 0xd36ed337LU, 
+0x6c706c38LU, 0xc872c839LU, 0x6974693aLU, 0xcd76cd3bLU, 0x6678663cLU, 0xc27ac23dLU, 0x637c633eLU, 0xc77ec73fLU, 
+0xa080a040LU, 0x04820441LU, 0xa584a542LU, 0x01860143LU, 0xaa88aa44LU, 0x0e8a0e45LU, 0xaf8caf46LU, 0x0b8e0b47LU, 
+0xb490b448LU, 0x10921049LU, 0xb194b14aLU, 0x1596154bLU, 0xbe98be4cLU, 0x1a9a1a4dLU, 0xbb9cbb4eLU, 0x1f9e1f4fLU, 
+0x88a08850LU, 0x2ca22c51LU, 0x8da48d52LU, 0x29a62953LU, 0x82a88254LU, 0x26aa2655LU, 0x87ac8756LU, 0x23ae2357LU, 
+0x9cb09c58LU, 0x38b23859LU, 0x99b4995aLU, 0x3db63d5bLU, 0x96b8965cLU, 0x32ba325dLU, 0x93bc935eLU, 0x37be375fLU, 
+0xf0c0f060LU, 0x54c25461LU, 0xf5c4f562LU, 0x51c65163LU, 0xfac8fa64LU, 0x5eca5e65LU, 0xffccff66LU, 0x5bce5b67LU, 
+0xe4d0e468LU, 0x40d24069LU, 0xe1d4e16aLU, 0x45d6456bLU, 0xeed8ee6cLU, 0x4ada4a6dLU, 0xebdceb6eLU, 0x4fde4f6fLU, 
+0xd8e0d870LU, 0x7ce27c71LU, 0xdde4dd72LU, 0x79e67973LU, 0xd2e8d274LU, 0x76ea7675LU, 0xd7ecd776LU, 0x73ee7377LU, 
+0xccf0cc78LU, 0x68f26879LU, 0xc9f4c97aLU, 0x6df66d7bLU, 0xc6f8c67cLU, 0x62fa627dLU, 0xc3fcc37eLU, 0x67fe677fLU, 
+0x0d4d0d80LU, 0xa94fa981LU, 0x08490882LU, 0xac4bac83LU, 0x07450784LU, 0xa347a385LU, 0x02410286LU, 0xa643a687LU, 
+0x195d1988LU, 0xbd5fbd89LU, 0x1c591c8aLU, 0xb85bb88bLU, 0x1355138cLU, 0xb757b78dLU, 0x1651168eLU, 0xb253b28fLU, 
+0x256d2590LU, 0x816f8191LU, 0x20692092LU, 0x846b8493LU, 0x2f652f94LU, 0x8b678b95LU, 0x2a612a96LU, 0x8e638e97LU, 
+0x317d3198LU, 0x957f9599LU, 0x3479349aLU, 0x907b909bLU, 0x3b753b9cLU, 0x9f779f9dLU, 0x3e713e9eLU, 0x9a739a9fLU, 
+0x5d0d5da0LU, 0xf90ff9a1LU, 0x580958a2LU, 0xfc0bfca3LU, 0x570557a4LU, 0xf307f3a5LU, 0x520152a6LU, 0xf603f6a7LU, 
+0x491d49a8LU, 0xed1feda9LU, 0x4c194caaLU, 0xe81be8abLU, 0x431543acLU, 0xe717e7adLU, 0x461146aeLU, 0xe213e2afLU, 
+0x752d75b0LU, 0xd12fd1b1LU, 0x702970b2LU, 0xd42bd4b3LU, 0x7f257fb4LU, 0xdb27dbb5LU, 0x7a217ab6LU, 0xde23deb7LU, 
+0x613d61b8LU, 0xc53fc5b9LU, 0x643964baLU, 0xc03bc0bbLU, 0x6b356bbcLU, 0xcf37cfbdLU, 0x6e316ebeLU, 0xca33cabfLU, 
+0xadcdadc0LU, 0x09cf09c1LU, 0xa8c9a8c2LU, 0x0ccb0cc3LU, 0xa7c5a7c4LU, 0x03c703c5LU, 0xa2c1a2c6LU, 0x06c306c7LU, 
+0xb9ddb9c8LU, 0x1ddf1dc9LU, 0xbcd9bccaLU, 0x18db18cbLU, 0xb3d5b3ccLU, 0x17d717cdLU, 0xb6d1b6ceLU, 0x12d312cfLU, 
+0x85ed85d0LU, 0x21ef21d1LU, 0x80e980d2LU, 0x24eb24d3LU, 0x8fe58fd4LU, 0x2be72bd5LU, 0x8ae18ad6LU, 0x2ee32ed7LU, 
+0x91fd91d8LU, 0x35ff35d9LU, 0x94f994daLU, 0x30fb30dbLU, 0x9bf59bdcLU, 0x3ff73fddLU, 0x9ef19edeLU, 0x3af33adfLU, 
+0xfd8dfde0LU, 0x598f59e1LU, 0xf889f8e2LU, 0x5c8b5ce3LU, 0xf785f7e4LU, 0x538753e5LU, 0xf281f2e6LU, 0x568356e7LU, 
+0xe99de9e8LU, 0x4d9f4de9LU, 0xec99eceaLU, 0x489b48ebLU, 0xe395e3ecLU, 0x479747edLU, 0xe691e6eeLU, 0x429342efLU, 
+0xd5add5f0LU, 0x71af71f1LU, 0xd0a9d0f2LU, 0x74ab74f3LU, 0xdfa5dff4LU, 0x7ba77bf5LU, 0xdaa1daf6LU, 0x7ea37ef7LU, 
+0xc1bdc1f8LU, 0x65bf65f9LU, 0xc4b9c4faLU, 0x60bb60fbLU, 0xcbb5cbfcLU, 0x6fb76ffdLU, 0xceb1cefeLU, 0x6ab36affLU }; 
+
+static const ulong32 rs_tab1[256] = {
+0x00000000LU, 0x55a156a4LU, 0xaa0fac05LU, 0xffaefaa1LU, 0x191e150aLU, 0x4cbf43aeLU, 0xb311b90fLU, 0xe6b0efabLU, 
+0x323c2a14LU, 0x679d7cb0LU, 0x98338611LU, 0xcd92d0b5LU, 0x2b223f1eLU, 0x7e8369baLU, 0x812d931bLU, 0xd48cc5bfLU, 
+0x64785428LU, 0x31d9028cLU, 0xce77f82dLU, 0x9bd6ae89LU, 0x7d664122LU, 0x28c71786LU, 0xd769ed27LU, 0x82c8bb83LU, 
+0x56447e3cLU, 0x03e52898LU, 0xfc4bd239LU, 0xa9ea849dLU, 0x4f5a6b36LU, 0x1afb3d92LU, 0xe555c733LU, 0xb0f49197LU, 
+0xc8f0a850LU, 0x9d51fef4LU, 0x62ff0455LU, 0x375e52f1LU, 0xd1eebd5aLU, 0x844febfeLU, 0x7be1115fLU, 0x2e4047fbLU, 
+0xfacc8244LU, 0xaf6dd4e0LU, 0x50c32e41LU, 0x056278e5LU, 0xe3d2974eLU, 0xb673c1eaLU, 0x49dd3b4bLU, 0x1c7c6defLU, 
+0xac88fc78LU, 0xf929aadcLU, 0x0687507dLU, 0x532606d9LU, 0xb596e972LU, 0xe037bfd6LU, 0x1f994577LU, 0x4a3813d3LU, 
+0x9eb4d66cLU, 0xcb1580c8LU, 0x34bb7a69LU, 0x611a2ccdLU, 0x87aac366LU, 0xd20b95c2LU, 0x2da56f63LU, 0x780439c7LU, 
+0xddad1da0LU, 0x880c4b04LU, 0x77a2b1a5LU, 0x2203e701LU, 0xc4b308aaLU, 0x91125e0eLU, 0x6ebca4afLU, 0x3b1df20bLU, 
+0xef9137b4LU, 0xba306110LU, 0x459e9bb1LU, 0x103fcd15LU, 0xf68f22beLU, 0xa32e741aLU, 0x5c808ebbLU, 0x0921d81fLU, 
+0xb9d54988LU, 0xec741f2cLU, 0x13dae58dLU, 0x467bb329LU, 0xa0cb5c82LU, 0xf56a0a26LU, 0x0ac4f087LU, 0x5f65a623LU, 
+0x8be9639cLU, 0xde483538LU, 0x21e6cf99LU, 0x7447993dLU, 0x92f77696LU, 0xc7562032LU, 0x38f8da93LU, 0x6d598c37LU, 
+0x155db5f0LU, 0x40fce354LU, 0xbf5219f5LU, 0xeaf34f51LU, 0x0c43a0faLU, 0x59e2f65eLU, 0xa64c0cffLU, 0xf3ed5a5bLU, 
+0x27619fe4LU, 0x72c0c940LU, 0x8d6e33e1LU, 0xd8cf6545LU, 0x3e7f8aeeLU, 0x6bdedc4aLU, 0x947026ebLU, 0xc1d1704fLU, 
+0x7125e1d8LU, 0x2484b77cLU, 0xdb2a4dddLU, 0x8e8b1b79LU, 0x683bf4d2LU, 0x3d9aa276LU, 0xc23458d7LU, 0x97950e73LU, 
+0x4319cbccLU, 0x16b89d68LU, 0xe91667c9LU, 0xbcb7316dLU, 0x5a07dec6LU, 0x0fa68862LU, 0xf00872c3LU, 0xa5a92467LU,
+0xf7173a0dLU, 0xa2b66ca9LU, 0x5d189608LU, 0x08b9c0acLU, 0xee092f07LU, 0xbba879a3LU, 0x44068302LU, 0x11a7d5a6LU, 
+0xc52b1019LU, 0x908a46bdLU, 0x6f24bc1cLU, 0x3a85eab8LU, 0xdc350513LU, 0x899453b7LU, 0x763aa916LU, 0x239bffb2LU, 
+0x936f6e25LU, 0xc6ce3881LU, 0x3960c220LU, 0x6cc19484LU, 0x8a717b2fLU, 0xdfd02d8bLU, 0x207ed72aLU, 0x75df818eLU, 
+0xa1534431LU, 0xf4f21295LU, 0x0b5ce834LU, 0x5efdbe90LU, 0xb84d513bLU, 0xedec079fLU, 0x1242fd3eLU, 0x47e3ab9aLU,
+0x3fe7925dLU, 0x6a46c4f9LU, 0x95e83e58LU, 0xc04968fcLU, 0x26f98757LU, 0x7358d1f3LU, 0x8cf62b52LU, 0xd9577df6LU, 
+0x0ddbb849LU, 0x587aeeedLU, 0xa7d4144cLU, 0xf27542e8LU, 0x14c5ad43LU, 0x4164fbe7LU, 0xbeca0146LU, 0xeb6b57e2LU,
+0x5b9fc675LU, 0x0e3e90d1LU, 0xf1906a70LU, 0xa4313cd4LU, 0x4281d37fLU, 0x172085dbLU, 0xe88e7f7aLU, 0xbd2f29deLU, 
+0x69a3ec61LU, 0x3c02bac5LU, 0xc3ac4064LU, 0x960d16c0LU, 0x70bdf96bLU, 0x251cafcfLU, 0xdab2556eLU, 0x8f1303caLU, 
+0x2aba27adLU, 0x7f1b7109LU, 0x80b58ba8LU, 0xd514dd0cLU, 0x33a432a7LU, 0x66056403LU, 0x99ab9ea2LU, 0xcc0ac806LU, 
+0x18860db9LU, 0x4d275b1dLU, 0xb289a1bcLU, 0xe728f718LU, 0x019818b3LU, 0x54394e17LU, 0xab97b4b6LU, 0xfe36e212LU, 
+0x4ec27385LU, 0x1b632521LU, 0xe4cddf80LU, 0xb16c8924LU, 0x57dc668fLU, 0x027d302bLU, 0xfdd3ca8aLU, 0xa8729c2eLU, 
+0x7cfe5991LU, 0x295f0f35LU, 0xd6f1f594LU, 0x8350a330LU, 0x65e04c9bLU, 0x30411a3fLU, 0xcfefe09eLU, 0x9a4eb63aLU, 
+0xe24a8ffdLU, 0xb7ebd959LU, 0x484523f8LU, 0x1de4755cLU, 0xfb549af7LU, 0xaef5cc53LU, 0x515b36f2LU, 0x04fa6056LU, 
+0xd076a5e9LU, 0x85d7f34dLU, 0x7a7909ecLU, 0x2fd85f48LU, 0xc968b0e3LU, 0x9cc9e647LU, 0x63671ce6LU, 0x36c64a42LU, 
+0x8632dbd5LU, 0xd3938d71LU, 0x2c3d77d0LU, 0x799c2174LU, 0x9f2ccedfLU, 0xca8d987bLU, 0x352362daLU, 0x6082347eLU, 
+0xb40ef1c1LU, 0xe1afa765LU, 0x1e015dc4LU, 0x4ba00b60LU, 0xad10e4cbLU, 0xf8b1b26fLU, 0x071f48ceLU, 0x52be1e6aLU }; 
+
+static const ulong32 rs_tab2[256] = {
+0x00000000LU, 0x87fc8255LU, 0x43b549aaLU, 0xc449cbffLU, 0x86279219LU, 0x01db104cLU, 0xc592dbb3LU, 0x426e59e6LU, 
+0x414e6932LU, 0xc6b2eb67LU, 0x02fb2098LU, 0x8507a2cdLU, 0xc769fb2bLU, 0x4095797eLU, 0x84dcb281LU, 0x032030d4LU, 
+0x829cd264LU, 0x05605031LU, 0xc1299bceLU, 0x46d5199bLU, 0x04bb407dLU, 0x8347c228LU, 0x470e09d7LU, 0xc0f28b82LU, 
+0xc3d2bb56LU, 0x442e3903LU, 0x8067f2fcLU, 0x079b70a9LU, 0x45f5294fLU, 0xc209ab1aLU, 0x064060e5LU, 0x81bce2b0LU, 
+0x4975e9c8LU, 0xce896b9dLU, 0x0ac0a062LU, 0x8d3c2237LU, 0xcf527bd1LU, 0x48aef984LU, 0x8ce7327bLU, 0x0b1bb02eLU, 
+0x083b80faLU, 0x8fc702afLU, 0x4b8ec950LU, 0xcc724b05LU, 0x8e1c12e3LU, 0x09e090b6LU, 0xcda95b49LU, 0x4a55d91cLU, 
+0xcbe93bacLU, 0x4c15b9f9LU, 0x885c7206LU, 0x0fa0f053LU, 0x4dcea9b5LU, 0xca322be0LU, 0x0e7be01fLU, 0x8987624aLU, 
+0x8aa7529eLU, 0x0d5bd0cbLU, 0xc9121b34LU, 0x4eee9961LU, 0x0c80c087LU, 0x8b7c42d2LU, 0x4f35892dLU, 0xc8c90b78LU, 
+0x92ea9fddLU, 0x15161d88LU, 0xd15fd677LU, 0x56a35422LU, 0x14cd0dc4LU, 0x93318f91LU, 0x5778446eLU, 0xd084c63bLU, 
+0xd3a4f6efLU, 0x545874baLU, 0x9011bf45LU, 0x17ed3d10LU, 0x558364f6LU, 0xd27fe6a3LU, 0x16362d5cLU, 0x91caaf09LU, 
+0x10764db9LU, 0x978acfecLU, 0x53c30413LU, 0xd43f8646LU, 0x9651dfa0LU, 0x11ad5df5LU, 0xd5e4960aLU, 0x5218145fLU, 
+0x5138248bLU, 0xd6c4a6deLU, 0x128d6d21LU, 0x9571ef74LU, 0xd71fb692LU, 0x50e334c7LU, 0x94aaff38LU, 0x13567d6dLU, 
+0xdb9f7615LU, 0x5c63f440LU, 0x982a3fbfLU, 0x1fd6bdeaLU, 0x5db8e40cLU, 0xda446659LU, 0x1e0dada6LU, 0x99f12ff3LU, 
+0x9ad11f27LU, 0x1d2d9d72LU, 0xd964568dLU, 0x5e98d4d8LU, 0x1cf68d3eLU, 0x9b0a0f6bLU, 0x5f43c494LU, 0xd8bf46c1LU, 
+0x5903a471LU, 0xdeff2624LU, 0x1ab6eddbLU, 0x9d4a6f8eLU, 0xdf243668LU, 0x58d8b43dLU, 0x9c917fc2LU, 0x1b6dfd97LU, 
+0x184dcd43LU, 0x9fb14f16LU, 0x5bf884e9LU, 0xdc0406bcLU, 0x9e6a5f5aLU, 0x1996dd0fLU, 0xdddf16f0LU, 0x5a2394a5LU, 
+0x699973f7LU, 0xee65f1a2LU, 0x2a2c3a5dLU, 0xadd0b808LU, 0xefbee1eeLU, 0x684263bbLU, 0xac0ba844LU, 0x2bf72a11LU, 
+0x28d71ac5LU, 0xaf2b9890LU, 0x6b62536fLU, 0xec9ed13aLU, 0xaef088dcLU, 0x290c0a89LU, 0xed45c176LU, 0x6ab94323LU, 
+0xeb05a193LU, 0x6cf923c6LU, 0xa8b0e839LU, 0x2f4c6a6cLU, 0x6d22338aLU, 0xeadeb1dfLU, 0x2e977a20LU, 0xa96bf875LU, 
+0xaa4bc8a1LU, 0x2db74af4LU, 0xe9fe810bLU, 0x6e02035eLU, 0x2c6c5ab8LU, 0xab90d8edLU, 0x6fd91312LU, 0xe8259147LU, 
+0x20ec9a3fLU, 0xa710186aLU, 0x6359d395LU, 0xe4a551c0LU, 0xa6cb0826LU, 0x21378a73LU, 0xe57e418cLU, 0x6282c3d9LU, 
+0x61a2f30dLU, 0xe65e7158LU, 0x2217baa7LU, 0xa5eb38f2LU, 0xe7856114LU, 0x6079e341LU, 0xa43028beLU, 0x23ccaaebLU, 
+0xa270485bLU, 0x258cca0eLU, 0xe1c501f1LU, 0x663983a4LU, 0x2457da42LU, 0xa3ab5817LU, 0x67e293e8LU, 0xe01e11bdLU, 
+0xe33e2169LU, 0x64c2a33cLU, 0xa08b68c3LU, 0x2777ea96LU, 0x6519b370LU, 0xe2e53125LU, 0x26acfadaLU, 0xa150788fLU, 
+0xfb73ec2aLU, 0x7c8f6e7fLU, 0xb8c6a580LU, 0x3f3a27d5LU, 0x7d547e33LU, 0xfaa8fc66LU, 0x3ee13799LU, 0xb91db5ccLU, 
+0xba3d8518LU, 0x3dc1074dLU, 0xf988ccb2LU, 0x7e744ee7LU, 0x3c1a1701LU, 0xbbe69554LU, 0x7faf5eabLU, 0xf853dcfeLU, 
+0x79ef3e4eLU, 0xfe13bc1bLU, 0x3a5a77e4LU, 0xbda6f5b1LU, 0xffc8ac57LU, 0x78342e02LU, 0xbc7de5fdLU, 0x3b8167a8LU, 
+0x38a1577cLU, 0xbf5dd529LU, 0x7b141ed6LU, 0xfce89c83LU, 0xbe86c565LU, 0x397a4730LU, 0xfd338ccfLU, 0x7acf0e9aLU, 
+0xb20605e2LU, 0x35fa87b7LU, 0xf1b34c48LU, 0x764fce1dLU, 0x342197fbLU, 0xb3dd15aeLU, 0x7794de51LU, 0xf0685c04LU, 
+0xf3486cd0LU, 0x74b4ee85LU, 0xb0fd257aLU, 0x3701a72fLU, 0x756ffec9LU, 0xf2937c9cLU, 0x36dab763LU, 0xb1263536LU, 
+0x309ad786LU, 0xb76655d3LU, 0x732f9e2cLU, 0xf4d31c79LU, 0xb6bd459fLU, 0x3141c7caLU, 0xf5080c35LU, 0x72f48e60LU, 
+0x71d4beb4LU, 0xf6283ce1LU, 0x3261f71eLU, 0xb59d754bLU, 0xf7f32cadLU, 0x700faef8LU, 0xb4466507LU, 0x33bae752LU }; 
+
+static const ulong32 rs_tab3[256] = {
+0x00000000LU, 0x5ac1f387LU, 0xb4cfab43LU, 0xee0e58c4LU, 0x25d31b86LU, 0x7f12e801LU, 0x911cb0c5LU, 0xcbdd4342LU, 
+0x4aeb3641LU, 0x102ac5c6LU, 0xfe249d02LU, 0xa4e56e85LU, 0x6f382dc7LU, 0x35f9de40LU, 0xdbf78684LU, 0x81367503LU, 
+0x949b6c82LU, 0xce5a9f05LU, 0x2054c7c1LU, 0x7a953446LU, 0xb1487704LU, 0xeb898483LU, 0x0587dc47LU, 0x5f462fc0LU, 
+0xde705ac3LU, 0x84b1a944LU, 0x6abff180LU, 0x307e0207LU, 0xfba34145LU, 0xa162b2c2LU, 0x4f6cea06LU, 0x15ad1981LU,
+0x657bd849LU, 0x3fba2bceLU, 0xd1b4730aLU, 0x8b75808dLU, 0x40a8c3cfLU, 0x1a693048LU, 0xf467688cLU, 0xaea69b0bLU, 
+0x2f90ee08LU, 0x75511d8fLU, 0x9b5f454bLU, 0xc19eb6ccLU, 0x0a43f58eLU, 0x50820609LU, 0xbe8c5ecdLU, 0xe44dad4aLU, 
+0xf1e0b4cbLU, 0xab21474cLU, 0x452f1f88LU, 0x1feeec0fLU, 0xd433af4dLU, 0x8ef25ccaLU, 0x60fc040eLU, 0x3a3df789LU, 
+0xbb0b828aLU, 0xe1ca710dLU, 0x0fc429c9LU, 0x5505da4eLU, 0x9ed8990cLU, 0xc4196a8bLU, 0x2a17324fLU, 0x70d6c1c8LU, 
+0xcaf6fd92LU, 0x90370e15LU, 0x7e3956d1LU, 0x24f8a556LU, 0xef25e614LU, 0xb5e41593LU, 0x5bea4d57LU, 0x012bbed0LU, 
+0x801dcbd3LU, 0xdadc3854LU, 0x34d26090LU, 0x6e139317LU, 0xa5ced055LU, 0xff0f23d2LU, 0x11017b16LU, 0x4bc08891LU,
+0x5e6d9110LU, 0x04ac6297LU, 0xeaa23a53LU, 0xb063c9d4LU, 0x7bbe8a96LU, 0x217f7911LU, 0xcf7121d5LU, 0x95b0d252LU, 
+0x1486a751LU, 0x4e4754d6LU, 0xa0490c12LU, 0xfa88ff95LU, 0x3155bcd7LU, 0x6b944f50LU, 0x859a1794LU, 0xdf5be413LU, 
+0xaf8d25dbLU, 0xf54cd65cLU, 0x1b428e98LU, 0x41837d1fLU, 0x8a5e3e5dLU, 0xd09fcddaLU, 0x3e91951eLU, 0x64506699LU,
+0xe566139aLU, 0xbfa7e01dLU, 0x51a9b8d9LU, 0x0b684b5eLU, 0xc0b5081cLU, 0x9a74fb9bLU, 0x747aa35fLU, 0x2ebb50d8LU, 
+0x3b164959LU, 0x61d7badeLU, 0x8fd9e21aLU, 0xd518119dLU, 0x1ec552dfLU, 0x4404a158LU, 0xaa0af99cLU, 0xf0cb0a1bLU, 
+0x71fd7f18LU, 0x2b3c8c9fLU, 0xc532d45bLU, 0x9ff327dcLU, 0x542e649eLU, 0x0eef9719LU, 0xe0e1cfddLU, 0xba203c5aLU, 
+0xd9a1b769LU, 0x836044eeLU, 0x6d6e1c2aLU, 0x37afefadLU, 0xfc72acefLU, 0xa6b35f68LU, 0x48bd07acLU, 0x127cf42bLU, 
+0x934a8128LU, 0xc98b72afLU, 0x27852a6bLU, 0x7d44d9ecLU, 0xb6999aaeLU, 0xec586929LU, 0x025631edLU, 0x5897c26aLU, 
+0x4d3adbebLU, 0x17fb286cLU, 0xf9f570a8LU, 0xa334832fLU, 0x68e9c06dLU, 0x322833eaLU, 0xdc266b2eLU, 0x86e798a9LU, 
+0x07d1edaaLU, 0x5d101e2dLU, 0xb31e46e9LU, 0xe9dfb56eLU, 0x2202f62cLU, 0x78c305abLU, 0x96cd5d6fLU, 0xcc0caee8LU, 
+0xbcda6f20LU, 0xe61b9ca7LU, 0x0815c463LU, 0x52d437e4LU, 0x990974a6LU, 0xc3c88721LU, 0x2dc6dfe5LU, 0x77072c62LU, 
+0xf6315961LU, 0xacf0aae6LU, 0x42fef222LU, 0x183f01a5LU, 0xd3e242e7LU, 0x8923b160LU, 0x672de9a4LU, 0x3dec1a23LU, 
+0x284103a2LU, 0x7280f025LU, 0x9c8ea8e1LU, 0xc64f5b66LU, 0x0d921824LU, 0x5753eba3LU, 0xb95db367LU, 0xe39c40e0LU, 
+0x62aa35e3LU, 0x386bc664LU, 0xd6659ea0LU, 0x8ca46d27LU, 0x47792e65LU, 0x1db8dde2LU, 0xf3b68526LU, 0xa97776a1LU, 
+0x13574afbLU, 0x4996b97cLU, 0xa798e1b8LU, 0xfd59123fLU, 0x3684517dLU, 0x6c45a2faLU, 0x824bfa3eLU, 0xd88a09b9LU, 
+0x59bc7cbaLU, 0x037d8f3dLU, 0xed73d7f9LU, 0xb7b2247eLU, 0x7c6f673cLU, 0x26ae94bbLU, 0xc8a0cc7fLU, 0x92613ff8LU, 
+0x87cc2679LU, 0xdd0dd5feLU, 0x33038d3aLU, 0x69c27ebdLU, 0xa21f3dffLU, 0xf8dece78LU, 0x16d096bcLU, 0x4c11653bLU, 
+0xcd271038LU, 0x97e6e3bfLU, 0x79e8bb7bLU, 0x232948fcLU, 0xe8f40bbeLU, 0xb235f839LU, 0x5c3ba0fdLU, 0x06fa537aLU, 
+0x762c92b2LU, 0x2ced6135LU, 0xc2e339f1LU, 0x9822ca76LU, 0x53ff8934LU, 0x093e7ab3LU, 0xe7302277LU, 0xbdf1d1f0LU, 
+0x3cc7a4f3LU, 0x66065774LU, 0x88080fb0LU, 0xd2c9fc37LU, 0x1914bf75LU, 0x43d54cf2LU, 0xaddb1436LU, 0xf71ae7b1LU, 
+0xe2b7fe30LU, 0xb8760db7LU, 0x56785573LU, 0x0cb9a6f4LU, 0xc764e5b6LU, 0x9da51631LU, 0x73ab4ef5LU, 0x296abd72LU, 
+0xa85cc871LU, 0xf29d3bf6LU, 0x1c936332LU, 0x465290b5LU, 0x8d8fd3f7LU, 0xd74e2070LU, 0x394078b4LU, 0x63818b33LU }; 
+
+static const ulong32 rs_tab4[256] = {
+0x00000000LU, 0x58471e5aLU, 0xb08e3cb4LU, 0xe8c922eeLU, 0x2d517825LU, 0x7516667fLU, 0x9ddf4491LU, 0xc5985acbLU, 
+0x5aa2f04aLU, 0x02e5ee10LU, 0xea2cccfeLU, 0xb26bd2a4LU, 0x77f3886fLU, 0x2fb49635LU, 0xc77db4dbLU, 0x9f3aaa81LU, 
+0xb409ad94LU, 0xec4eb3ceLU, 0x04879120LU, 0x5cc08f7aLU, 0x9958d5b1LU, 0xc11fcbebLU, 0x29d6e905LU, 0x7191f75fLU, 
+0xeeab5ddeLU, 0xb6ec4384LU, 0x5e25616aLU, 0x06627f30LU, 0xc3fa25fbLU, 0x9bbd3ba1LU, 0x7374194fLU, 0x2b330715LU, 
+0x25121765LU, 0x7d55093fLU, 0x959c2bd1LU, 0xcddb358bLU, 0x08436f40LU, 0x5004711aLU, 0xb8cd53f4LU, 0xe08a4daeLU, 
+0x7fb0e72fLU, 0x27f7f975LU, 0xcf3edb9bLU, 0x9779c5c1LU, 0x52e19f0aLU, 0x0aa68150LU, 0xe26fa3beLU, 0xba28bde4LU, 
+0x911bbaf1LU, 0xc95ca4abLU, 0x21958645LU, 0x79d2981fLU, 0xbc4ac2d4LU, 0xe40ddc8eLU, 0x0cc4fe60LU, 0x5483e03aLU, 
+0xcbb94abbLU, 0x93fe54e1LU, 0x7b37760fLU, 0x23706855LU, 0xe6e8329eLU, 0xbeaf2cc4LU, 0x56660e2aLU, 0x0e211070LU, 
+0x4a242ecaLU, 0x12633090LU, 0xfaaa127eLU, 0xa2ed0c24LU, 0x677556efLU, 0x3f3248b5LU, 0xd7fb6a5bLU, 0x8fbc7401LU, 
+0x1086de80LU, 0x48c1c0daLU, 0xa008e234LU, 0xf84ffc6eLU, 0x3dd7a6a5LU, 0x6590b8ffLU, 0x8d599a11LU, 0xd51e844bLU, 
+0xfe2d835eLU, 0xa66a9d04LU, 0x4ea3bfeaLU, 0x16e4a1b0LU, 0xd37cfb7bLU, 0x8b3be521LU, 0x63f2c7cfLU, 0x3bb5d995LU, 
+0xa48f7314LU, 0xfcc86d4eLU, 0x14014fa0LU, 0x4c4651faLU, 0x89de0b31LU, 0xd199156bLU, 0x39503785LU, 0x611729dfLU, 
+0x6f3639afLU, 0x377127f5LU, 0xdfb8051bLU, 0x87ff1b41LU, 0x4267418aLU, 0x1a205fd0LU, 0xf2e97d3eLU, 0xaaae6364LU, 
+0x3594c9e5LU, 0x6dd3d7bfLU, 0x851af551LU, 0xdd5deb0bLU, 0x18c5b1c0LU, 0x4082af9aLU, 0xa84b8d74LU, 0xf00c932eLU, 
+0xdb3f943bLU, 0x83788a61LU, 0x6bb1a88fLU, 0x33f6b6d5LU, 0xf66eec1eLU, 0xae29f244LU, 0x46e0d0aaLU, 0x1ea7cef0LU, 
+0x819d6471LU, 0xd9da7a2bLU, 0x311358c5LU, 0x6954469fLU, 0xaccc1c54LU, 0xf48b020eLU, 0x1c4220e0LU, 0x44053ebaLU, 
+0x94485cd9LU, 0xcc0f4283LU, 0x24c6606dLU, 0x7c817e37LU, 0xb91924fcLU, 0xe15e3aa6LU, 0x09971848LU, 0x51d00612LU, 
+0xceeaac93LU, 0x96adb2c9LU, 0x7e649027LU, 0x26238e7dLU, 0xe3bbd4b6LU, 0xbbfccaecLU, 0x5335e802LU, 0x0b72f658LU, 
+0x2041f14dLU, 0x7806ef17LU, 0x90cfcdf9LU, 0xc888d3a3LU, 0x0d108968LU, 0x55579732LU, 0xbd9eb5dcLU, 0xe5d9ab86LU, 
+0x7ae30107LU, 0x22a41f5dLU, 0xca6d3db3LU, 0x922a23e9LU, 0x57b27922LU, 0x0ff56778LU, 0xe73c4596LU, 0xbf7b5bccLU, 
+0xb15a4bbcLU, 0xe91d55e6LU, 0x01d47708LU, 0x59936952LU, 0x9c0b3399LU, 0xc44c2dc3LU, 0x2c850f2dLU, 0x74c21177LU, 
+0xebf8bbf6LU, 0xb3bfa5acLU, 0x5b768742LU, 0x03319918LU, 0xc6a9c3d3LU, 0x9eeedd89LU, 0x7627ff67LU, 0x2e60e13dLU, 
+0x0553e628LU, 0x5d14f872LU, 0xb5ddda9cLU, 0xed9ac4c6LU, 0x28029e0dLU, 0x70458057LU, 0x988ca2b9LU, 0xc0cbbce3LU, 
+0x5ff11662LU, 0x07b60838LU, 0xef7f2ad6LU, 0xb738348cLU, 0x72a06e47LU, 0x2ae7701dLU, 0xc22e52f3LU, 0x9a694ca9LU, 
+0xde6c7213LU, 0x862b6c49LU, 0x6ee24ea7LU, 0x36a550fdLU, 0xf33d0a36LU, 0xab7a146cLU, 0x43b33682LU, 0x1bf428d8LU, 
+0x84ce8259LU, 0xdc899c03LU, 0x3440beedLU, 0x6c07a0b7LU, 0xa99ffa7cLU, 0xf1d8e426LU, 0x1911c6c8LU, 0x4156d892LU,
+0x6a65df87LU, 0x3222c1ddLU, 0xdaebe333LU, 0x82acfd69LU, 0x4734a7a2LU, 0x1f73b9f8LU, 0xf7ba9b16LU, 0xaffd854cLU, 
+0x30c72fcdLU, 0x68803197LU, 0x80491379LU, 0xd80e0d23LU, 0x1d9657e8LU, 0x45d149b2LU, 0xad186b5cLU, 0xf55f7506LU, 
+0xfb7e6576LU, 0xa3397b2cLU, 0x4bf059c2LU, 0x13b74798LU, 0xd62f1d53LU, 0x8e680309LU, 0x66a121e7LU, 0x3ee63fbdLU, 
+0xa1dc953cLU, 0xf99b8b66LU, 0x1152a988LU, 0x4915b7d2LU, 0x8c8ded19LU, 0xd4caf343LU, 0x3c03d1adLU, 0x6444cff7LU, 
+0x4f77c8e2LU, 0x1730d6b8LU, 0xfff9f456LU, 0xa7beea0cLU, 0x6226b0c7LU, 0x3a61ae9dLU, 0xd2a88c73LU, 0x8aef9229LU, 
+0x15d538a8LU, 0x4d9226f2LU, 0xa55b041cLU, 0xfd1c1a46LU, 0x3884408dLU, 0x60c35ed7LU, 0x880a7c39LU, 0xd04d6263LU };
+
+static const ulong32 rs_tab5[256] = {
+0x00000000LU, 0xdbaec658LU, 0xfb11c1b0LU, 0x20bf07e8LU, 0xbb22cf2dLU, 0x608c0975LU, 0x40330e9dLU, 0x9b9dc8c5LU, 
+0x3b44d35aLU, 0xe0ea1502LU, 0xc05512eaLU, 0x1bfbd4b2LU, 0x80661c77LU, 0x5bc8da2fLU, 0x7b77ddc7LU, 0xa0d91b9fLU, 
+0x7688ebb4LU, 0xad262decLU, 0x8d992a04LU, 0x5637ec5cLU, 0xcdaa2499LU, 0x1604e2c1LU, 0x36bbe529LU, 0xed152371LU, 
+0x4dcc38eeLU, 0x9662feb6LU, 0xb6ddf95eLU, 0x6d733f06LU, 0xf6eef7c3LU, 0x2d40319bLU, 0x0dff3673LU, 0xd651f02bLU, 
+0xec5d9b25LU, 0x37f35d7dLU, 0x174c5a95LU, 0xcce29ccdLU, 0x577f5408LU, 0x8cd19250LU, 0xac6e95b8LU, 0x77c053e0LU, 
+0xd719487fLU, 0x0cb78e27LU, 0x2c0889cfLU, 0xf7a64f97LU, 0x6c3b8752LU, 0xb795410aLU, 0x972a46e2LU, 0x4c8480baLU, 
+0x9ad57091LU, 0x417bb6c9LU, 0x61c4b121LU, 0xba6a7779LU, 0x21f7bfbcLU, 0xfa5979e4LU, 0xdae67e0cLU, 0x0148b854LU, 
+0xa191a3cbLU, 0x7a3f6593LU, 0x5a80627bLU, 0x812ea423LU, 0x1ab36ce6LU, 0xc11daabeLU, 0xe1a2ad56LU, 0x3a0c6b0eLU, 
+0x95ba7b4aLU, 0x4e14bd12LU, 0x6eabbafaLU, 0xb5057ca2LU, 0x2e98b467LU, 0xf536723fLU, 0xd58975d7LU, 0x0e27b38fLU, 
+0xaefea810LU, 0x75506e48LU, 0x55ef69a0LU, 0x8e41aff8LU, 0x15dc673dLU, 0xce72a165LU, 0xeecda68dLU, 0x356360d5LU, 
+0xe33290feLU, 0x389c56a6LU, 0x1823514eLU, 0xc38d9716LU, 0x58105fd3LU, 0x83be998bLU, 0xa3019e63LU, 0x78af583bLU, 
+0xd87643a4LU, 0x03d885fcLU, 0x23678214LU, 0xf8c9444cLU, 0x63548c89LU, 0xb8fa4ad1LU, 0x98454d39LU, 0x43eb8b61LU, 
+0x79e7e06fLU, 0xa2492637LU, 0x82f621dfLU, 0x5958e787LU, 0xc2c52f42LU, 0x196be91aLU, 0x39d4eef2LU, 0xe27a28aaLU, 
+0x42a33335LU, 0x990df56dLU, 0xb9b2f285LU, 0x621c34ddLU, 0xf981fc18LU, 0x222f3a40LU, 0x02903da8LU, 0xd93efbf0LU, 
+0x0f6f0bdbLU, 0xd4c1cd83LU, 0xf47eca6bLU, 0x2fd00c33LU, 0xb44dc4f6LU, 0x6fe302aeLU, 0x4f5c0546LU, 0x94f2c31eLU, 
+0x342bd881LU, 0xef851ed9LU, 0xcf3a1931LU, 0x1494df69LU, 0x8f0917acLU, 0x54a7d1f4LU, 0x7418d61cLU, 0xafb61044LU, 
+0x6739f694LU, 0xbc9730ccLU, 0x9c283724LU, 0x4786f17cLU, 0xdc1b39b9LU, 0x07b5ffe1LU, 0x270af809LU, 0xfca43e51LU, 
+0x5c7d25ceLU, 0x87d3e396LU, 0xa76ce47eLU, 0x7cc22226LU, 0xe75feae3LU, 0x3cf12cbbLU, 0x1c4e2b53LU, 0xc7e0ed0bLU, 
+0x11b11d20LU, 0xca1fdb78LU, 0xeaa0dc90LU, 0x310e1ac8LU, 0xaa93d20dLU, 0x713d1455LU, 0x518213bdLU, 0x8a2cd5e5LU, 
+0x2af5ce7aLU, 0xf15b0822LU, 0xd1e40fcaLU, 0x0a4ac992LU, 0x91d70157LU, 0x4a79c70fLU, 0x6ac6c0e7LU, 0xb16806bfLU, 
+0x8b646db1LU, 0x50caabe9LU, 0x7075ac01LU, 0xabdb6a59LU, 0x3046a29cLU, 0xebe864c4LU, 0xcb57632cLU, 0x10f9a574LU, 
+0xb020beebLU, 0x6b8e78b3LU, 0x4b317f5bLU, 0x909fb903LU, 0x0b0271c6LU, 0xd0acb79eLU, 0xf013b076LU, 0x2bbd762eLU, 
+0xfdec8605LU, 0x2642405dLU, 0x06fd47b5LU, 0xdd5381edLU, 0x46ce4928LU, 0x9d608f70LU, 0xbddf8898LU, 0x66714ec0LU, 
+0xc6a8555fLU, 0x1d069307LU, 0x3db994efLU, 0xe61752b7LU, 0x7d8a9a72LU, 0xa6245c2aLU, 0x869b5bc2LU, 0x5d359d9aLU, 
+0xf2838ddeLU, 0x292d4b86LU, 0x09924c6eLU, 0xd23c8a36LU, 0x49a142f3LU, 0x920f84abLU, 0xb2b08343LU, 0x691e451bLU, 
+0xc9c75e84LU, 0x126998dcLU, 0x32d69f34LU, 0xe978596cLU, 0x72e591a9LU, 0xa94b57f1LU, 0x89f45019LU, 0x525a9641LU, 
+0x840b666aLU, 0x5fa5a032LU, 0x7f1aa7daLU, 0xa4b46182LU, 0x3f29a947LU, 0xe4876f1fLU, 0xc43868f7LU, 0x1f96aeafLU, 
+0xbf4fb530LU, 0x64e17368LU, 0x445e7480LU, 0x9ff0b2d8LU, 0x046d7a1dLU, 0xdfc3bc45LU, 0xff7cbbadLU, 0x24d27df5LU, 
+0x1ede16fbLU, 0xc570d0a3LU, 0xe5cfd74bLU, 0x3e611113LU, 0xa5fcd9d6LU, 0x7e521f8eLU, 0x5eed1866LU, 0x8543de3eLU, 
+0x259ac5a1LU, 0xfe3403f9LU, 0xde8b0411LU, 0x0525c249LU, 0x9eb80a8cLU, 0x4516ccd4LU, 0x65a9cb3cLU, 0xbe070d64LU, 
+0x6856fd4fLU, 0xb3f83b17LU, 0x93473cffLU, 0x48e9faa7LU, 0xd3743262LU, 0x08daf43aLU, 0x2865f3d2LU, 0xf3cb358aLU, 
+0x53122e15LU, 0x88bce84dLU, 0xa803efa5LU, 0x73ad29fdLU, 0xe830e138LU, 0x339e2760LU, 0x13212088LU, 0xc88fe6d0LU }; 
+
+static const ulong32 rs_tab6[256] = {
+0x00000000LU, 0x9e3d68dbLU, 0x717ad0fbLU, 0xef47b820LU, 0xe2f4edbbLU, 0x7cc98560LU, 0x938e3d40LU, 0x0db3559bLU, 
+0x89a5973bLU, 0x1798ffe0LU, 0xf8df47c0LU, 0x66e22f1bLU, 0x6b517a80LU, 0xf56c125bLU, 0x1a2baa7bLU, 0x8416c2a0LU, 
+0x5f076376LU, 0xc13a0badLU, 0x2e7db38dLU, 0xb040db56LU, 0xbdf38ecdLU, 0x23cee616LU, 0xcc895e36LU, 0x52b436edLU, 
+0xd6a2f44dLU, 0x489f9c96LU, 0xa7d824b6LU, 0x39e54c6dLU, 0x345619f6LU, 0xaa6b712dLU, 0x452cc90dLU, 0xdb11a1d6LU, 
+0xbe0ec6ecLU, 0x2033ae37LU, 0xcf741617LU, 0x51497eccLU, 0x5cfa2b57LU, 0xc2c7438cLU, 0x2d80fbacLU, 0xb3bd9377LU, 
+0x37ab51d7LU, 0xa996390cLU, 0x46d1812cLU, 0xd8ece9f7LU, 0xd55fbc6cLU, 0x4b62d4b7LU, 0xa4256c97LU, 0x3a18044cLU, 
+0xe109a59aLU, 0x7f34cd41LU, 0x90737561LU, 0x0e4e1dbaLU, 0x03fd4821LU, 0x9dc020faLU, 0x728798daLU, 0xecbaf001LU, 
+0x68ac32a1LU, 0xf6915a7aLU, 0x19d6e25aLU, 0x87eb8a81LU, 0x8a58df1aLU, 0x1465b7c1LU, 0xfb220fe1LU, 0x651f673aLU, 
+0x311cc195LU, 0xaf21a94eLU, 0x4066116eLU, 0xde5b79b5LU, 0xd3e82c2eLU, 0x4dd544f5LU, 0xa292fcd5LU, 0x3caf940eLU, 
+0xb8b956aeLU, 0x26843e75LU, 0xc9c38655LU, 0x57feee8eLU, 0x5a4dbb15LU, 0xc470d3ceLU, 0x2b376beeLU, 0xb50a0335LU, 
+0x6e1ba2e3LU, 0xf026ca38LU, 0x1f617218LU, 0x815c1ac3LU, 0x8cef4f58LU, 0x12d22783LU, 0xfd959fa3LU, 0x63a8f778LU, 
+0xe7be35d8LU, 0x79835d03LU, 0x96c4e523LU, 0x08f98df8LU, 0x054ad863LU, 0x9b77b0b8LU, 0x74300898LU, 0xea0d6043LU, 
+0x8f120779LU, 0x112f6fa2LU, 0xfe68d782LU, 0x6055bf59LU, 0x6de6eac2LU, 0xf3db8219LU, 0x1c9c3a39LU, 0x82a152e2LU, 
+0x06b79042LU, 0x988af899LU, 0x77cd40b9LU, 0xe9f02862LU, 0xe4437df9LU, 0x7a7e1522LU, 0x9539ad02LU, 0x0b04c5d9LU,
+0xd015640fLU, 0x4e280cd4LU, 0xa16fb4f4LU, 0x3f52dc2fLU, 0x32e189b4LU, 0xacdce16fLU, 0x439b594fLU, 0xdda63194LU, 
+0x59b0f334LU, 0xc78d9befLU, 0x28ca23cfLU, 0xb6f74b14LU, 0xbb441e8fLU, 0x25797654LU, 0xca3ece74LU, 0x5403a6afLU, 
+0x6238cf67LU, 0xfc05a7bcLU, 0x13421f9cLU, 0x8d7f7747LU, 0x80cc22dcLU, 0x1ef14a07LU, 0xf1b6f227LU, 0x6f8b9afcLU, 
+0xeb9d585cLU, 0x75a03087LU, 0x9ae788a7LU, 0x04dae07cLU, 0x0969b5e7LU, 0x9754dd3cLU, 0x7813651cLU, 0xe62e0dc7LU, 
+0x3d3fac11LU, 0xa302c4caLU, 0x4c457ceaLU, 0xd2781431LU, 0xdfcb41aaLU, 0x41f62971LU, 0xaeb19151LU, 0x308cf98aLU, 
+0xb49a3b2aLU, 0x2aa753f1LU, 0xc5e0ebd1LU, 0x5bdd830aLU, 0x566ed691LU, 0xc853be4aLU, 0x2714066aLU, 0xb9296eb1LU,
+0xdc36098bLU, 0x420b6150LU, 0xad4cd970LU, 0x3371b1abLU, 0x3ec2e430LU, 0xa0ff8cebLU, 0x4fb834cbLU, 0xd1855c10LU, 
+0x55939eb0LU, 0xcbaef66bLU, 0x24e94e4bLU, 0xbad42690LU, 0xb767730bLU, 0x295a1bd0LU, 0xc61da3f0LU, 0x5820cb2bLU, 
+0x83316afdLU, 0x1d0c0226LU, 0xf24bba06LU, 0x6c76d2ddLU, 0x61c58746LU, 0xfff8ef9dLU, 0x10bf57bdLU, 0x8e823f66LU, 
+0x0a94fdc6LU, 0x94a9951dLU, 0x7bee2d3dLU, 0xe5d345e6LU, 0xe860107dLU, 0x765d78a6LU, 0x991ac086LU, 0x0727a85dLU, 
+0x53240ef2LU, 0xcd196629LU, 0x225ede09LU, 0xbc63b6d2LU, 0xb1d0e349LU, 0x2fed8b92LU, 0xc0aa33b2LU, 0x5e975b69LU, 
+0xda8199c9LU, 0x44bcf112LU, 0xabfb4932LU, 0x35c621e9LU, 0x38757472LU, 0xa6481ca9LU, 0x490fa489LU, 0xd732cc52LU, 
+0x0c236d84LU, 0x921e055fLU, 0x7d59bd7fLU, 0xe364d5a4LU, 0xeed7803fLU, 0x70eae8e4LU, 0x9fad50c4LU, 0x0190381fLU, 
+0x8586fabfLU, 0x1bbb9264LU, 0xf4fc2a44LU, 0x6ac1429fLU, 0x67721704LU, 0xf94f7fdfLU, 0x1608c7ffLU, 0x8835af24LU, 
+0xed2ac81eLU, 0x7317a0c5LU, 0x9c5018e5LU, 0x026d703eLU, 0x0fde25a5LU, 0x91e34d7eLU, 0x7ea4f55eLU, 0xe0999d85LU, 
+0x648f5f25LU, 0xfab237feLU, 0x15f58fdeLU, 0x8bc8e705LU, 0x867bb29eLU, 0x1846da45LU, 0xf7016265LU, 0x693c0abeLU, 
+0xb22dab68LU, 0x2c10c3b3LU, 0xc3577b93LU, 0x5d6a1348LU, 0x50d946d3LU, 0xcee42e08LU, 0x21a39628LU, 0xbf9efef3LU, 
+0x3b883c53LU, 0xa5b55488LU, 0x4af2eca8LU, 0xd4cf8473LU, 0xd97cd1e8LU, 0x4741b933LU, 0xa8060113LU, 0x363b69c8LU }; 
+
+static const ulong32 rs_tab7[256] = {
+0x00000000LU, 0x0319e59eLU, 0x06328771LU, 0x052b62efLU, 0x0c6443e2LU, 0x0f7da67cLU, 0x0a56c493LU, 0x094f210dLU, 
+0x18c88689LU, 0x1bd16317LU, 0x1efa01f8LU, 0x1de3e466LU, 0x14acc56bLU, 0x17b520f5LU, 0x129e421aLU, 0x1187a784LU, 
+0x30dd415fLU, 0x33c4a4c1LU, 0x36efc62eLU, 0x35f623b0LU, 0x3cb902bdLU, 0x3fa0e723LU, 0x3a8b85ccLU, 0x39926052LU, 
+0x2815c7d6LU, 0x2b0c2248LU, 0x2e2740a7LU, 0x2d3ea539LU, 0x24718434LU, 0x276861aaLU, 0x22430345LU, 0x215ae6dbLU, 
+0x60f782beLU, 0x63ee6720LU, 0x66c505cfLU, 0x65dce051LU, 0x6c93c15cLU, 0x6f8a24c2LU, 0x6aa1462dLU, 0x69b8a3b3LU, 
+0x783f0437LU, 0x7b26e1a9LU, 0x7e0d8346LU, 0x7d1466d8LU, 0x745b47d5LU, 0x7742a24bLU, 0x7269c0a4LU, 0x7170253aLU, 
+0x502ac3e1LU, 0x5333267fLU, 0x56184490LU, 0x5501a10eLU, 0x5c4e8003LU, 0x5f57659dLU, 0x5a7c0772LU, 0x5965e2ecLU, 
+0x48e24568LU, 0x4bfba0f6LU, 0x4ed0c219LU, 0x4dc92787LU, 0x4486068aLU, 0x479fe314LU, 0x42b481fbLU, 0x41ad6465LU, 
+0xc0a34931LU, 0xc3baacafLU, 0xc691ce40LU, 0xc5882bdeLU, 0xccc70ad3LU, 0xcfdeef4dLU, 0xcaf58da2LU, 0xc9ec683cLU, 
+0xd86bcfb8LU, 0xdb722a26LU, 0xde5948c9LU, 0xdd40ad57LU, 0xd40f8c5aLU, 0xd71669c4LU, 0xd23d0b2bLU, 0xd124eeb5LU, 
+0xf07e086eLU, 0xf367edf0LU, 0xf64c8f1fLU, 0xf5556a81LU, 0xfc1a4b8cLU, 0xff03ae12LU, 0xfa28ccfdLU, 0xf9312963LU, 
+0xe8b68ee7LU, 0xebaf6b79LU, 0xee840996LU, 0xed9dec08LU, 0xe4d2cd05LU, 0xe7cb289bLU, 0xe2e04a74LU, 0xe1f9afeaLU, 
+0xa054cb8fLU, 0xa34d2e11LU, 0xa6664cfeLU, 0xa57fa960LU, 0xac30886dLU, 0xaf296df3LU, 0xaa020f1cLU, 0xa91bea82LU, 
+0xb89c4d06LU, 0xbb85a898LU, 0xbeaeca77LU, 0xbdb72fe9LU, 0xb4f80ee4LU, 0xb7e1eb7aLU, 0xb2ca8995LU, 0xb1d36c0bLU, 
+0x90898ad0LU, 0x93906f4eLU, 0x96bb0da1LU, 0x95a2e83fLU, 0x9cedc932LU, 0x9ff42cacLU, 0x9adf4e43LU, 0x99c6abddLU, 
+0x88410c59LU, 0x8b58e9c7LU, 0x8e738b28LU, 0x8d6a6eb6LU, 0x84254fbbLU, 0x873caa25LU, 0x8217c8caLU, 0x810e2d54LU, 
+0xcd0b9262LU, 0xce1277fcLU, 0xcb391513LU, 0xc820f08dLU, 0xc16fd180LU, 0xc276341eLU, 0xc75d56f1LU, 0xc444b36fLU, 
+0xd5c314ebLU, 0xd6daf175LU, 0xd3f1939aLU, 0xd0e87604LU, 0xd9a75709LU, 0xdabeb297LU, 0xdf95d078LU, 0xdc8c35e6LU, 
+0xfdd6d33dLU, 0xfecf36a3LU, 0xfbe4544cLU, 0xf8fdb1d2LU, 0xf1b290dfLU, 0xf2ab7541LU, 0xf78017aeLU, 0xf499f230LU, 
+0xe51e55b4LU, 0xe607b02aLU, 0xe32cd2c5LU, 0xe035375bLU, 0xe97a1656LU, 0xea63f3c8LU, 0xef489127LU, 0xec5174b9LU, 
+0xadfc10dcLU, 0xaee5f542LU, 0xabce97adLU, 0xa8d77233LU, 0xa198533eLU, 0xa281b6a0LU, 0xa7aad44fLU, 0xa4b331d1LU, 
+0xb5349655LU, 0xb62d73cbLU, 0xb3061124LU, 0xb01ff4baLU, 0xb950d5b7LU, 0xba493029LU, 0xbf6252c6LU, 0xbc7bb758LU, 
+0x9d215183LU, 0x9e38b41dLU, 0x9b13d6f2LU, 0x980a336cLU, 0x91451261LU, 0x925cf7ffLU, 0x97779510LU, 0x946e708eLU, 
+0x85e9d70aLU, 0x86f03294LU, 0x83db507bLU, 0x80c2b5e5LU, 0x898d94e8LU, 0x8a947176LU, 0x8fbf1399LU, 0x8ca6f607LU, 
+0x0da8db53LU, 0x0eb13ecdLU, 0x0b9a5c22LU, 0x0883b9bcLU, 0x01cc98b1LU, 0x02d57d2fLU, 0x07fe1fc0LU, 0x04e7fa5eLU, 
+0x15605ddaLU, 0x1679b844LU, 0x1352daabLU, 0x104b3f35LU, 0x19041e38LU, 0x1a1dfba6LU, 0x1f369949LU, 0x1c2f7cd7LU, 
+0x3d759a0cLU, 0x3e6c7f92LU, 0x3b471d7dLU, 0x385ef8e3LU, 0x3111d9eeLU, 0x32083c70LU, 0x37235e9fLU, 0x343abb01LU, 
+0x25bd1c85LU, 0x26a4f91bLU, 0x238f9bf4LU, 0x20967e6aLU, 0x29d95f67LU, 0x2ac0baf9LU, 0x2febd816LU, 0x2cf23d88LU, 
+0x6d5f59edLU, 0x6e46bc73LU, 0x6b6dde9cLU, 0x68743b02LU, 0x613b1a0fLU, 0x6222ff91LU, 0x67099d7eLU, 0x641078e0LU, 
+0x7597df64LU, 0x768e3afaLU, 0x73a55815LU, 0x70bcbd8bLU, 0x79f39c86LU, 0x7aea7918LU, 0x7fc11bf7LU, 0x7cd8fe69LU, 
+0x5d8218b2LU, 0x5e9bfd2cLU, 0x5bb09fc3LU, 0x58a97a5dLU, 0x51e65b50LU, 0x52ffbeceLU, 0x57d4dc21LU, 0x54cd39bfLU, 
+0x454a9e3bLU, 0x46537ba5LU, 0x4378194aLU, 0x4061fcd4LU, 0x492eddd9LU, 0x4a373847LU, 0x4f1c5aa8LU, 0x4c05bf36LU };
+
+#endif /* TWOFISH_ALL_TABLES */
+
+#endif

+ 7 - 1
xtea.c

@@ -119,7 +119,7 @@ int xtea_test(void)
       { 0x75, 0xd7, 0xc5, 0xbf, 0xcf, 0x58, 0xc9, 0x3f };
    unsigned char tmp[2][8];
    symmetric_key skey;
-   int err;
+   int err, y;
 
    if ((err = xtea_setup(key, 16, 0, &skey)) != CRYPT_OK)  {
       return err;
@@ -131,6 +131,12 @@ int xtea_test(void)
       return CRYPT_FAIL_TESTVECTOR;
    }
 
+      /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
+      for (y = 0; y < 8; y++) tmp[0][y] = 0;
+      for (y = 0; y < 1000; y++) xtea_ecb_encrypt(tmp[0], tmp[0], &skey);
+      for (y = 0; y < 1000; y++) xtea_ecb_decrypt(tmp[0], tmp[0], &skey);
+      for (y = 0; y < 8; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
+
    return CRYPT_OK;
  #endif
 }

+ 18 - 14
yarrow.c

@@ -20,24 +20,26 @@ int yarrow_start(prng_state *prng)
    /* these are the default hash/cipher combo used */
 #ifdef RIJNDAEL
    prng->yarrow.cipher = register_cipher(&rijndael_desc);
-#elif defined(NOEKEON)   
-   prng->yarrow.cipher = register_cipher(&noekeon_desc);
 #elif defined(BLOWFISH)
    prng->yarrow.cipher = register_cipher(&blowfish_desc);
 #elif defined(TWOFISH)
    prng->yarrow.cipher = register_cipher(&twofish_desc);
-#elif defined(CAST5)
-   prng->yarrow.cipher = register_cipher(&cast5_desc);
-#elif defined(SAFER)
-   prng->yarrow.cipher = register_cipher(&saferp_desc);
-#elif defined(RC5)
-   prng->yarrow.cipher = register_cipher(&rc5_desc);
 #elif defined(RC6)
    prng->yarrow.cipher = register_cipher(&rc6_desc);
-#elif defined(XTEA)
-   prng->yarrow.cipher = register_cipher(&xtea_desc);
+#elif defined(RC5)
+   prng->yarrow.cipher = register_cipher(&rc5_desc);
+#elif defined(SAFERP)
+   prng->yarrow.cipher = register_cipher(&saferp_desc);
 #elif defined(RC2)
    prng->yarrow.cipher = register_cipher(&rc2_desc);
+#elif defined(NOEKEON)   
+   prng->yarrow.cipher = register_cipher(&noekeon_desc);
+#elif defined(CAST5)
+   prng->yarrow.cipher = register_cipher(&cast5_desc);
+#elif defined(XTEA)
+   prng->yarrow.cipher = register_cipher(&xtea_desc);
+#elif defined(SAFER)
+   prng->yarrow.cipher = register_cipher(&safer_sk128_desc);
 #elif defined(DES)
    prng->yarrow.cipher = register_cipher(&des3_desc);
 #elif
@@ -51,12 +53,14 @@ int yarrow_start(prng_state *prng)
    prng->yarrow.hash   = register_hash(&sha256_desc);
 #elif defined(SHA512)
    prng->yarrow.hash   = register_hash(&sha512_desc);
-#elif defined(SHA384)
-   prng->yarrow.hash   = register_hash(&sha384_desc);
-#elif defined(SHA1)
-   prng->yarrow.hash   = register_hash(&sha1_desc);
 #elif defined(TIGER)
    prng->yarrow.hash   = register_hash(&tiger_desc);
+#elif defined(SHA1)
+   prng->yarrow.hash   = register_hash(&sha1_desc);
+#elif defined(RIPEMD160)
+   prng->yarrow.hash   = register_hash(&rmd160_desc);
+#elif defined(RIPEMD128)
+   prng->yarrow.hash   = register_hash(&rmd128_desc);
 #elif defined(MD5)
    prng->yarrow.hash   = register_hash(&md5_desc);
 #elif defined(MD4)

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov